diff --git a/convert2xkt.js b/convert2xkt.js index 73bba28..6ded68a 100755 --- a/convert2xkt.js +++ b/convert2xkt.js @@ -69,7 +69,7 @@ function log(msg) { } function getFileExtension(fileName) { - let ext = path.extname(source); + let ext = path.extname(fileName); if (ext.charAt(0) === ".") { ext = ext.substring(1); } diff --git a/dist/convert2xkt.cjs.js b/dist/convert2xkt.cjs.js index 70a746d..a171041 100644 --- a/dist/convert2xkt.cjs.js +++ b/dist/convert2xkt.cjs.js @@ -26768,7 +26768,7 @@ function convert2xkt({ stats.aabb = null; function getFileExtension(fileName) { - let ext = path.extname(source); + let ext = path.extname(fileName); if (ext.charAt(0) === ".") { ext = ext.substring(1); } @@ -26803,7 +26803,7 @@ function convert2xkt({ const startTime = new Date(); const sourceConfigs = configs.sourceConfigs || {}; - const ext = sourceFormat || getFileExtension(); + const ext = sourceFormat || getFileExtension(source); log(`Input file extension: "${ext}"`); diff --git a/dist/xeokit-convert.cjs.js b/dist/xeokit-convert.cjs.js index 1d9de8c..3e1fe7c 100644 --- a/dist/xeokit-convert.cjs.js +++ b/dist/xeokit-convert.cjs.js @@ -1,3 +1,3 @@ /*! For license information please see xeokit-convert.cjs.js.LICENSE.txt */ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.convert2xkt=t():e.convert2xkt=t()}(global,(()=>(()=>{"use strict";var e={231:e=>{e.exports=require("fs")},423:e=>{e.exports=require("path")}},t={};function r(n){var i=t[n];if(void 0!==i)return i.exports;var o=t[n]={exports:{}};return e[n](o,o.exports,r),o.exports}r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var n={};return(()=>{r.r(n),r.d(n,{ClampToEdgeWrapping:()=>p,GIFMediaType:()=>O,JPEGMediaType:()=>P,LinearFilter:()=>M,LinearMipMapLinearFilter:()=>A,LinearMipMapNearestFilter:()=>I,LinearMipmapLinearFilter:()=>S,LinearMipmapNearestFilter:()=>T,MirroredRepeatWrapping:()=>m,NearestFilter:()=>y,NearestMipMapLinearFilter:()=>w,NearestMipMapNearestFilter:()=>g,NearestMipmapLinearFilter:()=>b,NearestMipmapNearestFilter:()=>x,PNGMediaType:()=>L,RepeatWrapping:()=>d,XKTModel:()=>He,XKT_INFO:()=>f,buildBoxGeometry:()=>zr,buildBoxLinesGeometry:()=>Ur,buildCylinderGeometry:()=>Xr,buildGridGeometry:()=>Rr,buildPlaneGeometry:()=>Kr,buildSphereGeometry:()=>qr,buildTorusGeometry:()=>Zr,buildVectorTextGeometry:()=>Wr,convert2xkt:()=>$r,parseCityJSONIntoXKTModel:()=>Nt,parseGLTFIntoXKTModel:()=>Wt,parseGLTFJSONIntoXKTModel:()=>ar,parseIFCIntoXKTModel:()=>mr,parseLASIntoXKTModel:()=>wr,parseMetaModelIntoXKTModel:()=>Mr,parsePCDIntoXKTModel:()=>Tr,parsePLYIntoXKTModel:()=>Pr,parseSTLIntoXKTModel:()=>Gr,writeXKTModelToArrayBuffer:()=>nt});const e=require("@loaders.gl/polyfills");var t,i,o,a,s,u,c,l,h,f={xktVersion:10},d=1e3,p=1001,m=1002,y=1003,g=1004,x=1004,b=1005,w=1005,M=1006,T=1007,I=1007,S=1008,A=1008,O=1e4,P=10001,L=10002,j=Float64Array,E=new j(16),D=new j(16),G=new j(4),k={MIN_DOUBLE:-Number.MAX_SAFE_INTEGER,MAX_DOUBLE:Number.MAX_SAFE_INTEGER,DEGTORAD:.0174532925,RADTODEG:57.295779513,vec2:function(e){return new j(e||2)},vec3:function(e){return new j(e||3)},vec4:function(e){return new j(e||4)},mat3:function(e){return new j(e||9)},mat3ToMat4:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:new j(16);return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=0,t[4]=e[3],t[5]=e[4],t[6]=e[5],t[7]=0,t[8]=e[6],t[9]=e[7],t[10]=e[8],t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},mat4:function(e){return new j(e||16)},mat4ToMat3:function(e,t){},createUUID:function(){for(var e=[],t=0;t<256;t++)e[t]=(t<16?"0":"")+t.toString(16);return function(){var t=4294967295*Math.random()|0,r=4294967295*Math.random()|0,n=4294967295*Math.random()|0,i=4294967295*Math.random()|0;return"".concat(e[255&t]+e[t>>8&255]+e[t>>16&255]+e[t>>24&255],"-").concat(e[255&r]).concat(e[r>>8&255],"-").concat(e[r>>16&15|64]).concat(e[r>>24&255],"-").concat(e[63&n|128]).concat(e[n>>8&255],"-").concat(e[n>>16&255]).concat(e[n>>24&255]).concat(e[255&i]).concat(e[i>>8&255]).concat(e[i>>16&255]).concat(e[i>>24&255])}}(),clamp:function(e,t,r){return Math.max(t,Math.min(r,e))},fmod:function(e,t){if(e1?1:r,Math.acos(r)},vec3FromMat4Scale:(u=new j(3),function(e,t){return u[0]=e[0],u[1]=e[1],u[2]=e[2],t[0]=k.lenVec3(u),u[0]=e[4],u[1]=e[5],u[2]=e[6],t[1]=k.lenVec3(u),u[0]=e[8],u[1]=e[9],u[2]=e[10],t[2]=k.lenVec3(u),t}),vecToArray:function(){function e(e){return Math.round(1e5*e)/1e5}return function(t){for(var r=0,n=(t=Array.prototype.slice.call(t)).length;r0&&void 0!==arguments[0]?arguments[0]:new j(16);return e[0]=1,e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=1,e[6]=0,e[7]=0,e[8]=0,e[9]=0,e[10]=1,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e},identityMat3:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:new j(9);return e[0]=1,e[1]=0,e[2]=0,e[3]=0,e[4]=1,e[5]=0,e[6]=0,e[7]=0,e[8]=1,e},isIdentityMat4:function(e){return 1===e[0]&&0===e[1]&&0===e[2]&&0===e[3]&&0===e[4]&&1===e[5]&&0===e[6]&&0===e[7]&&0===e[8]&&0===e[9]&&1===e[10]&&0===e[11]&&0===e[12]&&0===e[13]&&0===e[14]&&1===e[15]},negateMat4:function(e,t){return t||(t=e),t[0]=-e[0],t[1]=-e[1],t[2]=-e[2],t[3]=-e[3],t[4]=-e[4],t[5]=-e[5],t[6]=-e[6],t[7]=-e[7],t[8]=-e[8],t[9]=-e[9],t[10]=-e[10],t[11]=-e[11],t[12]=-e[12],t[13]=-e[13],t[14]=-e[14],t[15]=-e[15],t},addMat4:function(e,t,r){return r||(r=e),r[0]=e[0]+t[0],r[1]=e[1]+t[1],r[2]=e[2]+t[2],r[3]=e[3]+t[3],r[4]=e[4]+t[4],r[5]=e[5]+t[5],r[6]=e[6]+t[6],r[7]=e[7]+t[7],r[8]=e[8]+t[8],r[9]=e[9]+t[9],r[10]=e[10]+t[10],r[11]=e[11]+t[11],r[12]=e[12]+t[12],r[13]=e[13]+t[13],r[14]=e[14]+t[14],r[15]=e[15]+t[15],r},addMat4Scalar:function(e,t,r){return r||(r=e),r[0]=e[0]+t,r[1]=e[1]+t,r[2]=e[2]+t,r[3]=e[3]+t,r[4]=e[4]+t,r[5]=e[5]+t,r[6]=e[6]+t,r[7]=e[7]+t,r[8]=e[8]+t,r[9]=e[9]+t,r[10]=e[10]+t,r[11]=e[11]+t,r[12]=e[12]+t,r[13]=e[13]+t,r[14]=e[14]+t,r[15]=e[15]+t,r},addScalarMat4:function(e,t,r){return k.addMat4Scalar(t,e,r)},subMat4:function(e,t,r){return r||(r=e),r[0]=e[0]-t[0],r[1]=e[1]-t[1],r[2]=e[2]-t[2],r[3]=e[3]-t[3],r[4]=e[4]-t[4],r[5]=e[5]-t[5],r[6]=e[6]-t[6],r[7]=e[7]-t[7],r[8]=e[8]-t[8],r[9]=e[9]-t[9],r[10]=e[10]-t[10],r[11]=e[11]-t[11],r[12]=e[12]-t[12],r[13]=e[13]-t[13],r[14]=e[14]-t[14],r[15]=e[15]-t[15],r},subMat4Scalar:function(e,t,r){return r||(r=e),r[0]=e[0]-t,r[1]=e[1]-t,r[2]=e[2]-t,r[3]=e[3]-t,r[4]=e[4]-t,r[5]=e[5]-t,r[6]=e[6]-t,r[7]=e[7]-t,r[8]=e[8]-t,r[9]=e[9]-t,r[10]=e[10]-t,r[11]=e[11]-t,r[12]=e[12]-t,r[13]=e[13]-t,r[14]=e[14]-t,r[15]=e[15]-t,r},subScalarMat4:function(e,t,r){return r||(r=t),r[0]=e-t[0],r[1]=e-t[1],r[2]=e-t[2],r[3]=e-t[3],r[4]=e-t[4],r[5]=e-t[5],r[6]=e-t[6],r[7]=e-t[7],r[8]=e-t[8],r[9]=e-t[9],r[10]=e-t[10],r[11]=e-t[11],r[12]=e-t[12],r[13]=e-t[13],r[14]=e-t[14],r[15]=e-t[15],r},mulMat4:function(e,t,r){r||(r=e);var n=e[0],i=e[1],o=e[2],a=e[3],s=e[4],u=e[5],c=e[6],l=e[7],h=e[8],f=e[9],d=e[10],p=e[11],m=e[12],v=e[13],y=e[14],g=e[15],x=t[0],b=t[1],w=t[2],M=t[3],T=t[4],I=t[5],S=t[6],A=t[7],O=t[8],P=t[9],L=t[10],j=t[11],E=t[12],D=t[13],G=t[14],k=t[15];return r[0]=x*n+b*s+w*h+M*m,r[1]=x*i+b*u+w*f+M*v,r[2]=x*o+b*c+w*d+M*y,r[3]=x*a+b*l+w*p+M*g,r[4]=T*n+I*s+S*h+A*m,r[5]=T*i+I*u+S*f+A*v,r[6]=T*o+I*c+S*d+A*y,r[7]=T*a+I*l+S*p+A*g,r[8]=O*n+P*s+L*h+j*m,r[9]=O*i+P*u+L*f+j*v,r[10]=O*o+P*c+L*d+j*y,r[11]=O*a+P*l+L*p+j*g,r[12]=E*n+D*s+G*h+k*m,r[13]=E*i+D*u+G*f+k*v,r[14]=E*o+D*c+G*d+k*y,r[15]=E*a+D*l+G*p+k*g,r},mulMat3:function(e,t,r){r||(r=new j(9));var n=e[0],i=e[3],o=e[6],a=e[1],s=e[4],u=e[7],c=e[2],l=e[5],h=e[8],f=t[0],d=t[3],p=t[6],m=t[1],v=t[4],y=t[7],g=t[2],x=t[5],b=t[8];return r[0]=n*f+i*m+o*g,r[3]=n*d+i*v+o*x,r[6]=n*p+i*y+o*b,r[1]=a*f+s*m+u*g,r[4]=a*d+s*v+u*x,r[7]=a*p+s*y+u*b,r[2]=c*f+l*m+h*g,r[5]=c*d+l*v+h*x,r[8]=c*p+l*y+h*b,r},mulMat4Scalar:function(e,t,r){return r||(r=e),r[0]=e[0]*t,r[1]=e[1]*t,r[2]=e[2]*t,r[3]=e[3]*t,r[4]=e[4]*t,r[5]=e[5]*t,r[6]=e[6]*t,r[7]=e[7]*t,r[8]=e[8]*t,r[9]=e[9]*t,r[10]=e[10]*t,r[11]=e[11]*t,r[12]=e[12]*t,r[13]=e[13]*t,r[14]=e[14]*t,r[15]=e[15]*t,r},mulMat4v4:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:k.vec4(),n=t[0],i=t[1],o=t[2],a=t[3];return r[0]=e[0]*n+e[4]*i+e[8]*o+e[12]*a,r[1]=e[1]*n+e[5]*i+e[9]*o+e[13]*a,r[2]=e[2]*n+e[6]*i+e[10]*o+e[14]*a,r[3]=e[3]*n+e[7]*i+e[11]*o+e[15]*a,r},transposeMat4:function(e,t){var r=e[4],n=e[14],i=e[8],o=e[13],a=e[12],s=e[9];if(!t||e===t){var u=e[1],c=e[2],l=e[3],h=e[6],f=e[7],d=e[11];return e[1]=r,e[2]=i,e[3]=a,e[4]=u,e[6]=s,e[7]=o,e[8]=c,e[9]=h,e[11]=n,e[12]=l,e[13]=f,e[14]=d,e}return t[0]=e[0],t[1]=r,t[2]=i,t[3]=a,t[4]=e[1],t[5]=e[5],t[6]=s,t[7]=o,t[8]=e[2],t[9]=e[6],t[10]=e[10],t[11]=n,t[12]=e[3],t[13]=e[7],t[14]=e[11],t[15]=e[15],t},transposeMat3:function(e,t){if(t===e){var r=e[1],n=e[2],i=e[5];t[1]=e[3],t[2]=e[6],t[3]=r,t[5]=e[7],t[6]=n,t[7]=i}else t[0]=e[0],t[1]=e[3],t[2]=e[6],t[3]=e[1],t[4]=e[4],t[5]=e[7],t[6]=e[2],t[7]=e[5],t[8]=e[8];return t},determinantMat4:function(e){var t=e[0],r=e[1],n=e[2],i=e[3],o=e[4],a=e[5],s=e[6],u=e[7],c=e[8],l=e[9],h=e[10],f=e[11],d=e[12],p=e[13],m=e[14],v=e[15];return d*l*s*i-c*p*s*i-d*a*h*i+o*p*h*i+c*a*m*i-o*l*m*i-d*l*n*u+c*p*n*u+d*r*h*u-t*p*h*u-c*r*m*u+t*l*m*u+d*a*n*f-o*p*n*f-d*r*s*f+t*p*s*f+o*r*m*f-t*a*m*f-c*a*n*v+o*l*n*v+c*r*s*v-t*l*s*v-o*r*h*v+t*a*h*v},inverseMat4:function(e,t){t||(t=e);var r=e[0],n=e[1],i=e[2],o=e[3],a=e[4],s=e[5],u=e[6],c=e[7],l=e[8],h=e[9],f=e[10],d=e[11],p=e[12],m=e[13],v=e[14],y=e[15],g=r*s-n*a,x=r*u-i*a,b=r*c-o*a,w=n*u-i*s,M=n*c-o*s,T=i*c-o*u,I=l*m-h*p,S=l*v-f*p,A=l*y-d*p,O=h*v-f*m,P=h*y-d*m,L=f*y-d*v,j=1/(g*L-x*P+b*O+w*A-M*S+T*I);return t[0]=(s*L-u*P+c*O)*j,t[1]=(-n*L+i*P-o*O)*j,t[2]=(m*T-v*M+y*w)*j,t[3]=(-h*T+f*M-d*w)*j,t[4]=(-a*L+u*A-c*S)*j,t[5]=(r*L-i*A+o*S)*j,t[6]=(-p*T+v*b-y*x)*j,t[7]=(l*T-f*b+d*x)*j,t[8]=(a*P-s*A+c*I)*j,t[9]=(-r*P+n*A-o*I)*j,t[10]=(p*M-m*b+y*g)*j,t[11]=(-l*M+h*b-d*g)*j,t[12]=(-a*O+s*S-u*I)*j,t[13]=(r*O-n*S+i*I)*j,t[14]=(-p*w+m*x-v*g)*j,t[15]=(l*w-h*x+f*g)*j,t},traceMat4:function(e){return e[0]+e[5]+e[10]+e[15]},translationMat4v:function(e,t){var r=t||k.identityMat4();return r[12]=e[0],r[13]=e[1],r[14]=e[2],r},translationMat3v:function(e,t){var r=t||k.identityMat3();return r[6]=e[0],r[7]=e[1],r},translationMat4c:(s=new j(3),function(e,t,r,n){return s[0]=e,s[1]=t,s[2]=r,k.translationMat4v(s,n)}),translationMat4s:function(e,t){return k.translationMat4c(e,e,e,t)},translateMat4v:function(e,t){return k.translateMat4c(e[0],e[1],e[2],t)},OLDtranslateMat4c:function(e,t,r,n){var i=n[12];n[0]+=i*e,n[4]+=i*t,n[8]+=i*r;var o=n[13];n[1]+=o*e,n[5]+=o*t,n[9]+=o*r;var a=n[14];n[2]+=a*e,n[6]+=a*t,n[10]+=a*r;var s=n[15];return n[3]+=s*e,n[7]+=s*t,n[11]+=s*r,n},translateMat4c:function(e,t,r,n){var i=n[3];n[0]+=i*e,n[1]+=i*t,n[2]+=i*r;var o=n[7];n[4]+=o*e,n[5]+=o*t,n[6]+=o*r;var a=n[11];n[8]+=a*e,n[9]+=a*t,n[10]+=a*r;var s=n[15];return n[12]+=s*e,n[13]+=s*t,n[14]+=s*r,n},rotationMat4v:function(e,t,r){var n,i,o,a,s,u,c=k.normalizeVec4([t[0],t[1],t[2],0],[]),l=Math.sin(e),h=Math.cos(e),f=1-h,d=c[0],p=c[1],m=c[2];return n=d*p,i=p*m,o=m*d,a=d*l,s=p*l,u=m*l,(r=r||k.mat4())[0]=f*d*d+h,r[1]=f*n+u,r[2]=f*o-s,r[3]=0,r[4]=f*n-u,r[5]=f*p*p+h,r[6]=f*i+a,r[7]=0,r[8]=f*o+s,r[9]=f*i-a,r[10]=f*m*m+h,r[11]=0,r[12]=0,r[13]=0,r[14]=0,r[15]=1,r},rotationMat4c:function(e,t,r,n,i){return k.rotationMat4v(e,[t,r,n],i)},scalingMat4v:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:k.identityMat4();return t[0]=e[0],t[5]=e[1],t[10]=e[2],t},scalingMat3v:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:k.identityMat3();return t[0]=e[0],t[4]=e[1],t},scalingMat4c:function(){var e=new j(3);return function(t,r,n,i){return e[0]=t,e[1]=r,e[2]=n,k.scalingMat4v(e,i)}}(),scaleMat4c:function(e,t,r,n){return n[0]*=e,n[4]*=t,n[8]*=r,n[1]*=e,n[5]*=t,n[9]*=r,n[2]*=e,n[6]*=t,n[10]*=r,n[3]*=e,n[7]*=t,n[11]*=r,n},scaleMat4v:function(e,t){var r=e[0],n=e[1],i=e[2];return t[0]*=r,t[4]*=n,t[8]*=i,t[1]*=r,t[5]*=n,t[9]*=i,t[2]*=r,t[6]*=n,t[10]*=i,t[3]*=r,t[7]*=n,t[11]*=i,t},scalingMat4s:function(e){return k.scalingMat4c(e,e,e)},rotationTranslationMat4:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:k.mat4(),n=e[0],i=e[1],o=e[2],a=e[3],s=n+n,u=i+i,c=o+o,l=n*s,h=n*u,f=n*c,d=i*u,p=i*c,m=o*c,v=a*s,y=a*u,g=a*c;return r[0]=1-(d+m),r[1]=h+g,r[2]=f-y,r[3]=0,r[4]=h-g,r[5]=1-(l+m),r[6]=p+v,r[7]=0,r[8]=f+y,r[9]=p-v,r[10]=1-(l+d),r[11]=0,r[12]=t[0],r[13]=t[1],r[14]=t[2],r[15]=1,r},mat4ToEuler:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:k.vec4(),n=k.clamp,i=e[0],o=e[4],a=e[8],s=e[1],u=e[5],c=e[9],l=e[2],h=e[6],f=e[10];return"XYZ"===t?(r[1]=Math.asin(n(a,-1,1)),Math.abs(a)<.99999?(r[0]=Math.atan2(-c,f),r[2]=Math.atan2(-o,i)):(r[0]=Math.atan2(h,u),r[2]=0)):"YXZ"===t?(r[0]=Math.asin(-n(c,-1,1)),Math.abs(c)<.99999?(r[1]=Math.atan2(a,f),r[2]=Math.atan2(s,u)):(r[1]=Math.atan2(-l,i),r[2]=0)):"ZXY"===t?(r[0]=Math.asin(n(h,-1,1)),Math.abs(h)<.99999?(r[1]=Math.atan2(-l,f),r[2]=Math.atan2(-o,u)):(r[1]=0,r[2]=Math.atan2(s,i))):"ZYX"===t?(r[1]=Math.asin(-n(l,-1,1)),Math.abs(l)<.99999?(r[0]=Math.atan2(h,f),r[2]=Math.atan2(s,i)):(r[0]=0,r[2]=Math.atan2(-o,u))):"YZX"===t?(r[2]=Math.asin(n(s,-1,1)),Math.abs(s)<.99999?(r[0]=Math.atan2(-c,u),r[1]=Math.atan2(-l,i)):(r[0]=0,r[1]=Math.atan2(a,f))):"XZY"===t&&(r[2]=Math.asin(-n(o,-1,1)),Math.abs(o)<.99999?(r[0]=Math.atan2(h,u),r[1]=Math.atan2(a,i)):(r[0]=Math.atan2(-c,f),r[1]=0)),r},composeMat4:function(e,t,r){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:k.mat4();return k.quaternionToRotationMat4(t,n),k.scaleMat4v(r,n),k.translateMat4v(e,n),n},decomposeMat4:function(){var e=new j(3),t=new j(16);return function(r,n,i,o){e[0]=r[0],e[1]=r[1],e[2]=r[2];var a=k.lenVec3(e);e[0]=r[4],e[1]=r[5],e[2]=r[6];var s=k.lenVec3(e);e[8]=r[8],e[9]=r[9],e[10]=r[10];var u=k.lenVec3(e);k.determinantMat4(r)<0&&(a=-a),n[0]=r[12],n[1]=r[13],n[2]=r[14],t.set(r);var c=1/a,l=1/s,h=1/u;return t[0]*=c,t[1]*=c,t[2]*=c,t[4]*=l,t[5]*=l,t[6]*=l,t[8]*=h,t[9]*=h,t[10]*=h,k.mat4ToQuaternion(t,i),o[0]=a,o[1]=s,o[2]=u,this}}(),lookAtMat4v:function(e,t,r,n){n||(n=k.mat4());var i,o,a,s,u,c,l,h,f,d,p=e[0],m=e[1],v=e[2],y=r[0],g=r[1],x=r[2],b=t[0],w=t[1],M=t[2];return p===b&&m===w&&v===M?k.identityMat4():(i=p-b,o=m-w,a=v-M,s=g*(a*=d=1/Math.sqrt(i*i+o*o+a*a))-x*(o*=d),u=x*(i*=d)-y*a,c=y*o-g*i,(d=Math.sqrt(s*s+u*u+c*c))?(s*=d=1/d,u*=d,c*=d):(s=0,u=0,c=0),l=o*c-a*u,h=a*s-i*c,f=i*u-o*s,(d=Math.sqrt(l*l+h*h+f*f))?(l*=d=1/d,h*=d,f*=d):(l=0,h=0,f=0),n[0]=s,n[1]=l,n[2]=i,n[3]=0,n[4]=u,n[5]=h,n[6]=o,n[7]=0,n[8]=c,n[9]=f,n[10]=a,n[11]=0,n[12]=-(s*p+u*m+c*v),n[13]=-(l*p+h*m+f*v),n[14]=-(i*p+o*m+a*v),n[15]=1,n)},lookAtMat4c:function(e,t,r,n,i,o,a,s,u){return k.lookAtMat4v([e,t,r],[n,i,o],[a,s,u],[])},orthoMat4c:function(e,t,r,n,i,o,a){a||(a=k.mat4());var s=t-e,u=n-r,c=o-i;return a[0]=2/s,a[1]=0,a[2]=0,a[3]=0,a[4]=0,a[5]=2/u,a[6]=0,a[7]=0,a[8]=0,a[9]=0,a[10]=-2/c,a[11]=0,a[12]=-(e+t)/s,a[13]=-(n+r)/u,a[14]=-(o+i)/c,a[15]=1,a},frustumMat4v:function(e,t,r){r||(r=k.mat4());var n=[e[0],e[1],e[2],0],i=[t[0],t[1],t[2],0];k.addVec4(i,n,E),k.subVec4(i,n,D);var o=2*n[2],a=D[0],s=D[1],u=D[2];return r[0]=o/a,r[1]=0,r[2]=0,r[3]=0,r[4]=0,r[5]=o/s,r[6]=0,r[7]=0,r[8]=E[0]/a,r[9]=E[1]/s,r[10]=-E[2]/u,r[11]=-1,r[12]=0,r[13]=0,r[14]=-o*i[2]/u,r[15]=0,r},frustumMat4:function(e,t,r,n,i,o,a){a||(a=k.mat4());var s=t-e,u=n-r,c=o-i;return a[0]=2*i/s,a[1]=0,a[2]=0,a[3]=0,a[4]=0,a[5]=2*i/u,a[6]=0,a[7]=0,a[8]=(t+e)/s,a[9]=(n+r)/u,a[10]=-(o+i)/c,a[11]=-1,a[12]=0,a[13]=0,a[14]=-o*i*2/c,a[15]=0,a},perspectiveMat4:function(e,t,r,n,i){var o=[],a=[];return o[2]=r,a[2]=n,a[1]=o[2]*Math.tan(e/2),o[1]=-a[1],a[0]=a[1]*t,o[0]=-a[0],k.frustumMat4v(o,a,i)},transformPoint3:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:k.vec3(),n=t[0],i=t[1],o=t[2];return r[0]=e[0]*n+e[4]*i+e[8]*o+e[12],r[1]=e[1]*n+e[5]*i+e[9]*o+e[13],r[2]=e[2]*n+e[6]*i+e[10]*o+e[14],r},transformPoint4:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:k.vec4();return r[0]=e[0]*t[0]+e[4]*t[1]+e[8]*t[2]+e[12]*t[3],r[1]=e[1]*t[0]+e[5]*t[1]+e[9]*t[2]+e[13]*t[3],r[2]=e[2]*t[0]+e[6]*t[1]+e[10]*t[2]+e[14]*t[3],r[3]=e[3]*t[0]+e[7]*t[1]+e[11]*t[2]+e[15]*t[3],r},transformPoints3:function(e,t,r){for(var n,i,o,a,s,u=r||[],c=t.length,l=e[0],h=e[1],f=e[2],d=e[3],p=e[4],m=e[5],v=e[6],y=e[7],g=e[8],x=e[9],b=e[10],w=e[11],M=e[12],T=e[13],I=e[14],S=e[15],A=0;A2&&void 0!==arguments[2]?arguments[2]:t,s=t.length,u=e[0],c=e[1],l=e[2],h=e[3],f=e[4],d=e[5],p=e[6],m=e[7],v=e[8],y=e[9],g=e[10],x=e[11],b=e[12],w=e[13],M=e[14],T=e[15];for(r=0;r2&&void 0!==arguments[2]?arguments[2]:t,s=t.length,u=e[0],c=e[1],l=e[2],h=e[3],f=e[4],d=e[5],p=e[6],m=e[7],v=e[8],y=e[9],g=e[10],x=e[11],b=e[12],w=e[13],M=e[14],T=e[15];for(r=0;r0&&void 0!==arguments[0]?arguments[0]:k.vec4();return e[0]=0,e[1]=0,e[2]=0,e[3]=1,e},eulerToQuaternion:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:k.vec4(),n=e[0]*k.DEGTORAD/2,i=e[1]*k.DEGTORAD/2,o=e[2]*k.DEGTORAD/2,a=Math.cos(n),s=Math.cos(i),u=Math.cos(o),c=Math.sin(n),l=Math.sin(i),h=Math.sin(o);return"XYZ"===t?(r[0]=c*s*u+a*l*h,r[1]=a*l*u-c*s*h,r[2]=a*s*h+c*l*u,r[3]=a*s*u-c*l*h):"YXZ"===t?(r[0]=c*s*u+a*l*h,r[1]=a*l*u-c*s*h,r[2]=a*s*h-c*l*u,r[3]=a*s*u+c*l*h):"ZXY"===t?(r[0]=c*s*u-a*l*h,r[1]=a*l*u+c*s*h,r[2]=a*s*h+c*l*u,r[3]=a*s*u-c*l*h):"ZYX"===t?(r[0]=c*s*u-a*l*h,r[1]=a*l*u+c*s*h,r[2]=a*s*h-c*l*u,r[3]=a*s*u+c*l*h):"YZX"===t?(r[0]=c*s*u+a*l*h,r[1]=a*l*u+c*s*h,r[2]=a*s*h-c*l*u,r[3]=a*s*u-c*l*h):"XZY"===t&&(r[0]=c*s*u-a*l*h,r[1]=a*l*u-c*s*h,r[2]=a*s*h+c*l*u,r[3]=a*s*u+c*l*h),r},mat4ToQuaternion:function(e){var t,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:k.vec4(),n=e[0],i=e[4],o=e[8],a=e[1],s=e[5],u=e[9],c=e[2],l=e[6],h=e[10],f=n+s+h;return f>0?(t=.5/Math.sqrt(f+1),r[3]=.25/t,r[0]=(l-u)*t,r[1]=(o-c)*t,r[2]=(a-i)*t):n>s&&n>h?(t=2*Math.sqrt(1+n-s-h),r[3]=(l-u)/t,r[0]=.25*t,r[1]=(i+a)/t,r[2]=(o+c)/t):s>h?(t=2*Math.sqrt(1+s-n-h),r[3]=(o-c)/t,r[0]=(i+a)/t,r[1]=.25*t,r[2]=(u+l)/t):(t=2*Math.sqrt(1+h-n-s),r[3]=(a-i)/t,r[0]=(o+c)/t,r[1]=(u+l)/t,r[2]=.25*t),r},vec3PairToQuaternion:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:k.vec4(),n=Math.sqrt(k.dotVec3(e,e)*k.dotVec3(t,t)),i=n+k.dotVec3(e,t);return i<1e-8*n?(i=0,Math.abs(e[0])>Math.abs(e[2])?(r[0]=-e[1],r[1]=e[0],r[2]=0):(r[0]=0,r[1]=-e[2],r[2]=e[1])):k.cross3Vec3(e,t,r),r[3]=i,k.normalizeQuaternion(r)},angleAxisToQuaternion:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:k.vec4(),r=e[3]/2,n=Math.sin(r);return t[0]=n*e[0],t[1]=n*e[1],t[2]=n*e[2],t[3]=Math.cos(r),t},quaternionToEuler:function(){var e=new j(16);return function(t,r,n){return n=n||k.vec3(),k.quaternionToRotationMat4(t,e),k.mat4ToEuler(e,r,n),n}}(),mulQuaternions:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:k.vec4(),n=e[0],i=e[1],o=e[2],a=e[3],s=t[0],u=t[1],c=t[2],l=t[3];return r[0]=a*s+n*l+i*c-o*u,r[1]=a*u+i*l+o*s-n*c,r[2]=a*c+o*l+n*u-i*s,r[3]=a*l-n*s-i*u-o*c,r},vec3ApplyQuaternion:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:k.vec3(),n=t[0],i=t[1],o=t[2],a=e[0],s=e[1],u=e[2],c=e[3],l=c*n+s*o-u*i,h=c*i+u*n-a*o,f=c*o+a*i-s*n,d=-a*n-s*i-u*o;return r[0]=l*c+d*-a+h*-u-f*-s,r[1]=h*c+d*-s+f*-a-l*-u,r[2]=f*c+d*-u+l*-s-h*-a,r},quaternionToMat4:function(e,t){t=k.identityMat4(t);var r=e[0],n=e[1],i=e[2],o=e[3],a=2*r,s=2*n,u=2*i,c=a*o,l=s*o,h=u*o,f=a*r,d=s*r,p=u*r,m=s*n,v=u*n,y=u*i;return t[0]=1-(m+y),t[1]=d+h,t[2]=p-l,t[4]=d-h,t[5]=1-(f+y),t[6]=v+c,t[8]=p+l,t[9]=v-c,t[10]=1-(f+m),t},quaternionToRotationMat4:function(e,t){var r=e[0],n=e[1],i=e[2],o=e[3],a=r+r,s=n+n,u=i+i,c=r*a,l=r*s,h=r*u,f=n*s,d=n*u,p=i*u,m=o*a,v=o*s,y=o*u;return t[0]=1-(f+p),t[4]=l-y,t[8]=h+v,t[1]=l+y,t[5]=1-(c+p),t[9]=d-m,t[2]=h-v,t[6]=d+m,t[10]=1-(c+f),t[3]=0,t[7]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},normalizeQuaternion:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:e,r=k.lenVec4([e[0],e[1],e[2],e[3]]);return t[0]=e[0]/r,t[1]=e[1]/r,t[2]=e[2]/r,t[3]=e[3]/r,t},conjugateQuaternion:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:e;return t[0]=-e[0],t[1]=-e[1],t[2]=-e[2],t[3]=e[3],t},inverseQuaternion:function(e,t){return k.normalizeQuaternion(k.conjugateQuaternion(e,t))},quaternionToAngleAxis:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:k.vec4(),r=(e=k.normalizeQuaternion(e,G))[3],n=2*Math.acos(r),i=Math.sqrt(1-r*r);return i<.001?(t[0]=e[0],t[1]=e[1],t[2]=e[2]):(t[0]=e[0]/i,t[1]=e[1]/i,t[2]=e[2]/i),t[3]=n,t},AABB3:function(e){return new j(e||6)},AABB2:function(e){return new j(e||4)},OBB3:function(e){return new j(e||32)},OBB2:function(e){return new j(e||16)},Sphere3:function(e,t,r,n){return new j([e,t,r,n])},transformOBB3:function(e,t){var r,n,i,o,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t,s=t.length,u=e[0],c=e[1],l=e[2],h=e[3],f=e[4],d=e[5],p=e[6],m=e[7],v=e[8],y=e[9],g=e[10],x=e[11],b=e[12],w=e[13],M=e[14],T=e[15];for(r=0;rs?a:s,o[1]+=u>c?u:c,o[2]+=l>h?l:h,Math.abs(k.lenVec3(o))}}(),getAABB3Center:function(e,t){var r=t||k.vec3();return r[0]=(e[0]+e[3])/2,r[1]=(e[1]+e[4])/2,r[2]=(e[2]+e[5])/2,r},getAABB2Center:function(e,t){var r=t||k.vec2();return r[0]=(e[2]+e[0])/2,r[1]=(e[3]+e[1])/2,r},collapseAABB3:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:k.AABB3();return e[0]=k.MAX_DOUBLE,e[1]=k.MAX_DOUBLE,e[2]=k.MAX_DOUBLE,e[3]=-k.MAX_DOUBLE,e[4]=-k.MAX_DOUBLE,e[5]=-k.MAX_DOUBLE,e},AABB3ToOBB3:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:k.OBB3();return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=1,t[4]=e[3],t[5]=e[1],t[6]=e[2],t[7]=1,t[8]=e[3],t[9]=e[4],t[10]=e[2],t[11]=1,t[12]=e[0],t[13]=e[4],t[14]=e[2],t[15]=1,t[16]=e[0],t[17]=e[1],t[18]=e[5],t[19]=1,t[20]=e[3],t[21]=e[1],t[22]=e[5],t[23]=1,t[24]=e[3],t[25]=e[4],t[26]=e[5],t[27]=1,t[28]=e[0],t[29]=e[4],t[30]=e[5],t[31]=1,t},positions3ToAABB3:(t=new j(3),function(e,r,n){r=r||k.AABB3();for(var i,o,a,s=k.MAX_DOUBLE,u=k.MAX_DOUBLE,c=k.MAX_DOUBLE,l=-k.MAX_DOUBLE,h=-k.MAX_DOUBLE,f=-k.MAX_DOUBLE,d=0,p=e.length;dl&&(l=i),o>h&&(h=o),a>f&&(f=a);return r[0]=s,r[1]=u,r[2]=c,r[3]=l,r[4]=h,r[5]=f,r}),OBB3ToAABB3:function(e){for(var t,r,n,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:k.AABB3(),o=k.MAX_DOUBLE,a=k.MAX_DOUBLE,s=k.MAX_DOUBLE,u=-k.MAX_DOUBLE,c=-k.MAX_DOUBLE,l=-k.MAX_DOUBLE,h=0,f=e.length;hu&&(u=t),r>c&&(c=r),n>l&&(l=n);return i[0]=o,i[1]=a,i[2]=s,i[3]=u,i[4]=c,i[5]=l,i},points3ToAABB3:function(e){for(var t,r,n,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:k.AABB3(),o=k.MAX_DOUBLE,a=k.MAX_DOUBLE,s=k.MAX_DOUBLE,u=-k.MAX_DOUBLE,c=-k.MAX_DOUBLE,l=-k.MAX_DOUBLE,h=0,f=e.length;hu&&(u=t),r>c&&(c=r),n>l&&(l=n);return i[0]=o,i[1]=a,i[2]=s,i[3]=u,i[4]=c,i[5]=l,i},points3ToSphere3:function(){var e=new j(3);return function(t,r){r=r||k.vec4();var n,i=0,o=0,a=0,s=t.length;for(n=0;nc&&(c=u);return r[3]=c,r}}(),positions3ToSphere3:function(){var e=new j(3),t=new j(3);return function(r,n){n=n||k.vec4();var i,o=0,a=0,s=0,u=r.length,c=0;for(i=0;ic&&(c=l);return n[3]=c,n}}(),OBB3ToSphere3:function(){var e=new j(3),t=new j(3);return function(r,n){n=n||k.vec4();var i,o=0,a=0,s=0,u=r.length,c=u/4;for(i=0;ih&&(h=l);return n[3]=h,n}}(),getSphere3Center:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:k.vec3();return t[0]=e[0],t[1]=e[1],t[2]=e[2],t},expandAABB3:function(e,t){return e[0]>t[0]&&(e[0]=t[0]),e[1]>t[1]&&(e[1]=t[1]),e[2]>t[2]&&(e[2]=t[2]),e[3]t[0]&&(e[0]=t[0]),e[1]>t[1]&&(e[1]=t[1]),e[2]>t[2]&&(e[2]=t[2]),e[3]3&&void 0!==arguments[3]?arguments[3]:k.vec3(),i=t[0]-e[0],o=t[1]-e[1],a=t[2]-e[2],s=r[0]-e[0],u=r[1]-e[1],c=r[2]-e[2],l=o*c-a*u,h=a*s-i*c,f=i*u-o*s,d=Math.sqrt(l*l+h*h+f*f);return 0===d?(n[0]=0,n[1]=0,n[2]=0):(n[0]=l/d,n[1]=h/d,n[2]=f/d),n}};function _(e,t,r,n){var i=e[t]/(Math.abs(e[t])+Math.abs(e[t+1])+Math.abs(e[t+2])),o=e[t+1]/(Math.abs(e[t])+Math.abs(e[t+1])+Math.abs(e[t+2]));if(e[t+2]<0){var a=(1-Math.abs(o))*(i>=0?1:-1),s=(1-Math.abs(i))*(o>=0?1:-1);i=a,o=s}return new Int8Array([Math[r](127.5*i+(i<0?-1:0)),Math[n](127.5*o+(o<0?-1:0))])}function F(e){var t=e[0],r=e[1];t/=t<0?127:128,r/=r<0?127:128;var n=1-Math.abs(t)-Math.abs(r);n<0&&(t=(1-Math.abs(r))*(t>=0?1:-1),r=(1-Math.abs(t))*(r>=0?1:-1));var i=Math.sqrt(t*t+r*r+n*n);return[t/i,r/i,n/i]}function N(e,t,r){return e[t]*r[0]+e[t+1]*r[1]+e[t+2]*r[2]}var V,C,B,z,U,X,R,K,q,Z,Y,W,Q,J,H,$,ee,te={quantizePositions:function(e,t,r,n){for(var i=r[0],o=r[1],a=r[2],s=65535,u=s/(r[3]-i),c=s/(r[4]-o),l=s/(r[5]-a),h=function(e){return e>=0?e:0},f=0;fu&&(a=o,u=s),(s=N(h,0,F(o=_(h,0,"floor","ceil"))))>u&&(a=o,u=s),(s=N(h,0,F(o=_(h,0,"ceil","ceil"))))>u&&(a=o,u=s),n[i+c+0]=a[0],n[i+c+1]=a[1],n[i+c+2]=0;return i+r},octEncodeNormals:function(e,t,r,n){for(var i,o,a,s,u=0;us&&(o=i,s=a),(a=N(e,u,F(i=_(e,u,"floor","ceil"))))>s&&(o=i,s=a),(a=N(e,u,F(i=_(e,u,"ceil","ceil"))))>s&&(o=i,s=a),r[n+u+0]=o[0],r[n+u+1]=o[1],r[n+u+2]=0;return n+t}},re=(V=[],C=[],B=[],z=[],U=[],X=0,R=new Uint16Array(3),K=new Uint16Array(3),q=new Uint16Array(3),Z=k.vec3(),Y=k.vec3(),W=k.vec3(),Q=k.vec3(),J=k.vec3(),H=k.vec3(),$=k.vec3(),ee=k.vec3(),function(e,t,r,n){!function(e,t){var r,n,i,o,a,s,u={},c=Math.pow(10,4),l=0;for(a=0,s=e.length;av&&T>v)continue}d=B[c.index1],p=B[c.index2],(!g&&d>65535||p>65535)&&(g=!0),m.push(d),m.push(p)}return g?new Uint32Array(m):new Uint16Array(m)}),ne=function(e,t,r,n){function i(e,r){for(var n,i,o=0;o<3;o++)if((n=t[3*e+o])!==(i=t[3*r+o]))return i-n;return 0}for(var o=e.slice().sort(i),a=null,s=0,u=o.length;sf&&h>d?f>d?(p=h,m=f,v=d):(p=h,m=d,v=f):f>h&&f>d?h>d?(p=f,m=h,v=d):(p=f,m=d,v=h):d>h&&d>f&&(h>f?(p=d,m=h,v=f):(p=d,m=f,v=h)),n[c+0]=[p,m],n[c+1]=[m,v],p>v){var y=v;v=p,p=y}n[c+2]=[v,p]}function g(e,t){for(var r,n,i=0;i<2;i++)if(r=e[i],(n=t[i])!==r)return n-r;return 0}(n=n.slice(0,e.length)).sort(g);for(var x=0,b=0;b0&&2!==x)};function ie(e){return ie="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},ie(e)}function oe(e,t){for(var r=0;r1}}])&&ce(t.prototype,r),Object.defineProperty(t,"prototype",{writable:!1}),e}();function he(e){return he="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},he(e)}function fe(e,t){for(var r=0;r=0;--i){var o=this.tryEntries[i],a=o.completion;if("root"===o.tryLoc)return n("end");if(o.tryLoc<=this.prev){var s=r.call(o,"catchLoc"),u=r.call(o,"finallyLoc");if(s&&u){if(this.prev=0;--n){var i=this.tryEntries[n];if(i.tryLoc<=this.prev&&r.call(i,"finallyLoc")&&this.prev=0;--t){var r=this.tryEntries[t];if(r.finallyLoc===e)return this.complete(r.completion,r.afterLoc),I(r),h}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.tryLoc===e){var n=r.completion;if("throw"===n.type){var i=n.arg;I(r)}return i}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,r){return this.delegate={iterator:A(e),resultName:t,nextLoc:r},"next"===this.method&&(this.arg=void 0),h}},e}function Re(e,t,r,n,i,o,a){try{var s=e[o](a),u=s.value}catch(e){return void r(e)}s.done?t(u):Promise.resolve(u).then(n,i)}function Ke(e,t){for(var r=0;r0&&void 0!==arguments[0]?arguments[0]:{};!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.modelId=t.modelId||"default",this.projectId=t.projectId||"",this.revisionId=t.revisionId||"",this.author=t.author||"",this.createdAt=t.createdAt||"",this.creatingApplication=t.creatingApplication||"",this.schema=t.schema||"",this.xktVersion=f.xktVersion,this.edgeThreshold=t.edgeThreshold||10,this.minTileSize=t.minTileSize||500,this.modelAABB=t.modelAABB,this.propertySets={},this.propertySetsList=[],this.metaObjects={},this.metaObjectsList=[],this.reusedGeometriesDecodeMatrix=new Float32Array(16),this.geometries={},this.geometriesList=[],this.textures={},this.texturesList=[],this.textureSets={},this.textureSetsList=[],this.meshes={},this.meshesList=[],this.entities={},this.entitiesList=[],this.tilesList=[],this.aabb=k.AABB3(),this.finalized=!1}var t,r,n,i;return t=e,r=[{key:"createPropertySet",value:function(e){if(!e)throw"Parameters expected: params";if(null===e.propertySetId||void 0===e.propertySetId)throw"Parameter expected: params.propertySetId";if(null===e.properties||void 0===e.properties)throw"Parameter expected: params.properties";if(this.finalized)console.error("XKTModel has been finalized, can't add more property sets");else if(!this.propertySets[e.propertySetId]){var t=e.propertySetId,r=e.propertySetType||"Default",n=e.propertySetName||e.propertySetId,i=e.properties||[],o=new je(t,r,n,i);return this.propertySets[t]=o,this.propertySetsList.push(o),o}}},{key:"createMetaObject",value:function(e){if(!e)throw"Parameters expected: params";if(null===e.metaObjectId||void 0===e.metaObjectId)throw"Parameter expected: params.metaObjectId";if(this.finalized)console.error("XKTModel has been finalized, can't add more meta objects");else if(!this.metaObjects[e.metaObjectId]){var t=e.metaObjectId,r=e.propertySetIds,n=e.metaObjectType||"Default",i=e.metaObjectName||e.metaObjectId,o=e.parentMetaObjectId,a=new Ae(t,r,n,i,o);return this.metaObjects[t]=a,this.metaObjectsList.push(a),o||this._rootMetaObject||(this._rootMetaObject=a),a}}},{key:"createTexture",value:function(e){if(!e)throw"Parameters expected: params";if(null===e.textureId||void 0===e.textureId)throw"Parameter expected: params.textureId";if(!e.imageData&&!e.src)throw"Parameter expected: params.imageData or params.src";if(this.finalized)console.error("XKTModel has been finalized, can't add more textures");else{if(!this.textures[e.textureId]){if(e.src){var t=e.src.split(".").pop();if("jpg"!==t&&"jpeg"!==t&&"png"!==t)return void console.error("XKTModel does not support image files with extension '".concat(t,"' - won't create texture '").concat(e.textureId))}var r=e.textureId,n=new ke({textureId:r,imageData:e.imageData,mediaType:e.mediaType,minFilter:e.minFilter,magFilter:e.magFilter,wrapS:e.wrapS,wrapT:e.wrapT,wrapR:e.wrapR,width:e.width,height:e.height,compressed:!1!==e.compressed,src:e.src});return this.textures[r]=n,this.texturesList.push(n),n}console.error("XKTTexture already exists with this ID: "+e.textureId)}}},{key:"createTextureSet",value:function(e){if(!e)throw"Parameters expected: params";if(null===e.textureSetId||void 0===e.textureSetId)throw"Parameter expected: params.textureSetId";if(this.finalized)console.error("XKTModel has been finalized, can't add more textureSets");else{if(!this.textureSets[e.textureSetId]){var t,r,n,i,o;if(void 0!==e.colorTextureId&&null!==e.colorTextureId){if(!(t=this.textures[e.colorTextureId]))return void console.error("Texture not found: ".concat(e.colorTextureId," - ensure that you create it first with createTexture()"));t.channel=0}if(void 0!==e.metallicRoughnessTextureId&&null!==e.metallicRoughnessTextureId){if(!(r=this.textures[e.metallicRoughnessTextureId]))return void console.error("Texture not found: ".concat(e.metallicRoughnessTextureId," - ensure that you create it first with createTexture()"));r.channel=1}if(void 0!==e.normalsTextureId&&null!==e.normalsTextureId){if(!(n=this.textures[e.normalsTextureId]))return void console.error("Texture not found: ".concat(e.normalsTextureId," - ensure that you create it first with createTexture()"));n.channel=2}if(void 0!==e.emissiveTextureId&&null!==e.emissiveTextureId){if(!(i=this.textures[e.emissiveTextureId]))return void console.error("Texture not found: ".concat(e.emissiveTextureId," - ensure that you create it first with createTexture()"));i.channel=3}if(void 0!==e.occlusionTextureId&&null!==e.occlusionTextureId){if(!(o=this.textures[e.occlusionTextureId]))return void console.error("Texture not found: ".concat(e.occlusionTextureId," - ensure that you create it first with createTexture()"));o.channel=4}var a=new Ve({textureSetId:e.textureSetId,textureSetIndex:this.textureSetsList.length,colorTexture:t,metallicRoughnessTexture:r,normalsTexture:n,emissiveTexture:i,occlusionTexture:o});return this.textureSets[e.textureSetId]=a,this.textureSetsList.push(a),a}console.error("XKTTextureSet already exists with this ID: "+e.textureSetId)}}},{key:"createGeometry",value:function(e){if(!e)throw"Parameters expected: params";if(null===e.geometryId||void 0===e.geometryId)throw"Parameter expected: params.geometryId";if(!e.primitiveType)throw"Parameter expected: params.primitiveType";if(!e.positions)throw"Parameter expected: params.positions";var t="triangles"===e.primitiveType,r="points"===e.primitiveType,n="lines"===e.primitiveType,i="line-strip"===e.primitiveType;if(e.primitiveType,e.primitiveType,!(t||r||n||i))throw"Unsupported value for params.primitiveType: "+e.primitiveType+"' - supported values are 'triangles', 'points', 'lines', 'line-strip', 'triangle-strip' and 'triangle-fan";if(t&&!e.indices)throw e.indices=this._createDefaultIndices(),"Parameter expected for 'triangles' primitive: params.indices";if(r&&!e.colors&&!e.colorsCompressed)throw"Parameter expected for 'points' primitive: params.colors or params.colorsCompressed";if(n&&!e.indices)throw"Parameter expected for 'lines' primitive: params.indices";if(this.finalized)console.error("XKTModel has been finalized, can't add more geometries");else{if(!this.geometries[e.geometryId]){var o=e.geometryId,a=e.primitiveType,s=new Float64Array(e.positions),u={geometryId:o,geometryIndex:this.geometriesList.length,primitiveType:a,positions:s,uvs:e.uvs||e.uv};if(t&&(e.normals&&(u.normals=new Float32Array(e.normals)),e.indices?u.indices=e.indices:u.indices=this._createDefaultIndices(s.length/3)),r)if(e.colorsCompressed)u.colorsCompressed=new Uint8Array(e.colorsCompressed);else{for(var c=e.colors,l=new Uint8Array(c.length),h=0,f=c.length;h1)te.octEncodeNormals(n.normals,n.normals.length,n.normalsOctEncoded,0);else{var i=k.inverseMat4(k.transposeMat4(r.matrix,Ye),We);te.transformAndOctEncodeNormals(i,n.normals,n.normals.length,n.normalsOctEncoded,0)}}}},{key:"_createEntityAABBs",value:function(){for(var e=0,t=this.entitiesList.length;e1)for(var l=u.positions,h=0,f=l.length;hQe[i]&&(i=1),Qe[2]>Qe[i]&&(i=2),!e.left){var o=r.slice();if(o[i+3]=(r[i]+r[i+3])/2,e.left=new Me(o),k.containsAABB3(o,n))return void this._insertEntityIntoKDTree(e.left,t)}if(!e.right){var a=r.slice();if(a[i]=(r[i]+r[i+3])/2,e.right=new Me(a),k.containsAABB3(a,n))return void this._insertEntityIntoKDTree(e.right,t)}e.entities=e.entities||[],e.entities.push(t),k.expandAABB3(r,n)}}},{key:"_createTilesFromKDTree",value:function(e){this._createTilesFromKDNode(e)}},{key:"_createTilesFromKDNode",value:function(e){e.entities&&e.entities.length>0&&this._createTileFromEntities(e),e.left&&this._createTilesFromKDNode(e.left),e.right&&this._createTilesFromKDNode(e.right)}},{key:"_createTileFromEntities",value:function(e){var t=e.aabb,r=e.entities,n=k.getAABB3Center(t),i=k.mulVec3Scalar(n,-1,k.vec3()),o=k.AABB3();o[0]=t[0]-n[0],o[1]=t[1]-n[1],o[2]=t[2]-n[2],o[3]=t[3]-n[0],o[4]=t[4]-n[1],o[5]=t[5]-n[2];for(var a=0;a0){te.createPositionsDecodeMatrix(t,this.reusedGeometriesDecodeMatrix);for(var c=0,l=this.geometriesList.length;ce&&(e=i.positionsQuantized.length),i.indices.length>t&&(t=i.indices.length))}for(var o=new Array(e/3),a=new Array(t),s=0,u=this.geometriesList.length;s1&&(S+=16);var D={metadata:{},textureData:new Uint8Array(A),eachTextureDataPortion:new Uint32Array(p),eachTextureAttributes:new Uint16Array(p*tt),positions:new Uint16Array(x),normals:new Int8Array(b),colors:new Uint8Array(w),uvs:new Float32Array(M),indices:new Uint32Array(T),edgeIndices:new Uint32Array(I),eachTextureSetTextures:new Int32Array(5*m),matrices:new Float32Array(S),reusedGeometriesDecodeMatrix:new Float32Array(e.reusedGeometriesDecodeMatrix),eachGeometryPrimitiveType:new Uint8Array(d),eachGeometryPositionsPortion:new Uint32Array(d),eachGeometryNormalsPortion:new Uint32Array(d),eachGeometryColorsPortion:new Uint32Array(d),eachGeometryUVsPortion:new Uint32Array(d),eachGeometryIndicesPortion:new Uint32Array(d),eachGeometryEdgeIndicesPortion:new Uint32Array(d),eachMeshGeometriesPortion:new Uint32Array(v),eachMeshMatricesPortion:new Uint32Array(v),eachMeshTextureSet:new Int32Array(v),eachMeshMaterialAttributes:new Uint8Array(v*rt),eachEntityId:[],eachEntityMeshesPortion:new Uint32Array(y),eachTileAABB:new Float64Array(6*g),eachTileEntitiesPortion:new Uint32Array(g)},G=0,k=0,_=0,F=0,N=0,V=0;D.metadata={id:e.modelId,projectId:e.projectId,revisionId:e.revisionId,author:e.author,createdAt:e.createdAt,creatingApplication:e.creatingApplication,schema:e.schema,propertySets:[],metaObjects:[]};for(var C=0;C0&&(R.propertySetIds=X.propertySetIds),X.external&&(R.external=X.external),D.metadata.metaObjects.push(R)}for(var K=0;K1&&(D.matrices.set(xe.matrix,se),D.eachMeshMatricesPortion[ue]=se,se+=16),D.eachMeshTextureSet[ue]=xe.textureSet?xe.textureSet.textureSetIndex:-1,D.eachMeshMaterialAttributes[ae++]=255*xe.color[0],D.eachMeshMaterialAttributes[ae++]=255*xe.color[1],D.eachMeshMaterialAttributes[ae++]=255*xe.color[2],D.eachMeshMaterialAttributes[ae++]=255*xe.opacity,D.eachMeshMaterialAttributes[ae++]=255*xe.metallic,D.eachMeshMaterialAttributes[ae++]=255*xe.roughness,ue++}D.eachEntityId[ie]=me.entityId,D.eachEntityMeshesPortion[ie]=oe,ie++,oe+=ye}var we=6*ce;D.eachTileAABB.set(de,we)}}return D}(e,t,r),o=function(e,t,r){function n(e){return!1!==r.zip?$e.deflate(e):e}return{metadata:n(it(t||e.metadata)),textureData:n(e.textureData.buffer),eachTextureDataPortion:n(e.eachTextureDataPortion.buffer),eachTextureAttributes:n(e.eachTextureAttributes.buffer),positions:n(e.positions.buffer),normals:n(e.normals.buffer),colors:n(e.colors.buffer),uvs:n(e.uvs.buffer),indices:n(e.indices.buffer),edgeIndices:n(e.edgeIndices.buffer),eachTextureSetTextures:n(e.eachTextureSetTextures.buffer),matrices:n(e.matrices.buffer),reusedGeometriesDecodeMatrix:n(e.reusedGeometriesDecodeMatrix.buffer),eachGeometryPrimitiveType:n(e.eachGeometryPrimitiveType.buffer),eachGeometryPositionsPortion:n(e.eachGeometryPositionsPortion.buffer),eachGeometryNormalsPortion:n(e.eachGeometryNormalsPortion.buffer),eachGeometryColorsPortion:n(e.eachGeometryColorsPortion.buffer),eachGeometryUVsPortion:n(e.eachGeometryUVsPortion.buffer),eachGeometryIndicesPortion:n(e.eachGeometryIndicesPortion.buffer),eachGeometryEdgeIndicesPortion:n(e.eachGeometryEdgeIndicesPortion.buffer),eachMeshGeometriesPortion:n(e.eachMeshGeometriesPortion.buffer),eachMeshMatricesPortion:n(e.eachMeshMatricesPortion.buffer),eachMeshTextureSet:n(e.eachMeshTextureSet.buffer),eachMeshMaterialAttributes:n(e.eachMeshMaterialAttributes.buffer),eachEntityId:n(JSON.stringify(e.eachEntityId).replace(/[\u007F-\uFFFF]/g,(function(e){return"\\u"+("0000"+e.charCodeAt(0).toString(16)).substr(-4)}))),eachEntityMeshesPortion:n(e.eachEntityMeshesPortion.buffer),eachTileAABB:n(e.eachTileAABB.buffer),eachTileEntitiesPortion:n(e.eachTileEntitiesPortion.buffer)}}(i,t,n);r.texturesSize+=o.textureData.byteLength;var a=function(e){return function(e){var t=new Uint32Array(e.length+2);t[0]=et,t[1]=e.length;for(var r=0,n=0,i=e.length;n80*r){n=o=e[0],i=a=e[1];for(var p=r;po&&(o=s),u>a&&(a=u);c=0!==(c=Math.max(o-n,a-i))?1/c:0}return ut(f,d,r,n,i,c),d}function at(e,t,r,n,i){var o,a;if(i===jt(e,t,r,n)>0)for(o=t;o=t;o-=n)a=Ot(o,e[o],e[o+1],a);return a&&wt(a,a.next)&&(Pt(a),a=a.next),a}function st(e,t){if(!e)return e;t||(t=e);var r,n=e;do{if(r=!1,n.steiner||!wt(n,n.next)&&0!==bt(n.prev,n,n.next))n=n.next;else{if(Pt(n),(n=t=n.prev)===n.next)break;r=!0}}while(r||n!==t);return t}function ut(e,t,r,n,i,o,a){if(e){!a&&o&&function(e,t,r,n){var i=e;do{null===i.z&&(i.z=vt(i.x,i.y,t,r,n)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next}while(i!==e);i.prevZ.nextZ=null,i.prevZ=null,function(e){var t,r,n,i,o,a,s,u,c=1;do{for(r=e,e=null,o=null,a=0;r;){for(a++,n=r,s=0,t=0;t0||u>0&&n;)0!==s&&(0===u||!n||r.z<=n.z)?(i=r,r=r.nextZ,s--):(i=n,n=n.nextZ,u--),o?o.nextZ=i:e=i,i.prevZ=o,o=i;r=n}o.nextZ=null,c*=2}while(a>1)}(i)}(e,n,i,o);for(var s,u,c=e;e.prev!==e.next;)if(s=e.prev,u=e.next,o?lt(e,n,i,o):ct(e))t.push(s.i/r),t.push(e.i/r),t.push(u.i/r),Pt(e),e=u.next,c=u.next;else if((e=u)===c){a?1===a?ut(e=ht(st(e),t,r),t,r,n,i,o,2):2===a&&ft(e,t,r,n,i,o):ut(st(e),t,r,n,i,o,1);break}}}function ct(e){var t=e.prev,r=e,n=e.next;if(bt(t,r,n)>=0)return!1;for(var i=e.next.next;i!==e.prev;){if(gt(t.x,t.y,r.x,r.y,n.x,n.y,i.x,i.y)&&bt(i.prev,i,i.next)>=0)return!1;i=i.next}return!0}function lt(e,t,r,n){var i=e.prev,o=e,a=e.next;if(bt(i,o,a)>=0)return!1;for(var s=i.xo.x?i.x>a.x?i.x:a.x:o.x>a.x?o.x:a.x,l=i.y>o.y?i.y>a.y?i.y:a.y:o.y>a.y?o.y:a.y,h=vt(s,u,t,r,n),f=vt(c,l,t,r,n),d=e.prevZ,p=e.nextZ;d&&d.z>=h&&p&&p.z<=f;){if(d!==e.prev&&d!==e.next&>(i.x,i.y,o.x,o.y,a.x,a.y,d.x,d.y)&&bt(d.prev,d,d.next)>=0)return!1;if(d=d.prevZ,p!==e.prev&&p!==e.next&>(i.x,i.y,o.x,o.y,a.x,a.y,p.x,p.y)&&bt(p.prev,p,p.next)>=0)return!1;p=p.nextZ}for(;d&&d.z>=h;){if(d!==e.prev&&d!==e.next&>(i.x,i.y,o.x,o.y,a.x,a.y,d.x,d.y)&&bt(d.prev,d,d.next)>=0)return!1;d=d.prevZ}for(;p&&p.z<=f;){if(p!==e.prev&&p!==e.next&>(i.x,i.y,o.x,o.y,a.x,a.y,p.x,p.y)&&bt(p.prev,p,p.next)>=0)return!1;p=p.nextZ}return!0}function ht(e,t,r){var n=e;do{var i=n.prev,o=n.next.next;!wt(i,o)&&Mt(i,n,n.next,o)&&St(i,o)&&St(o,i)&&(t.push(i.i/r),t.push(n.i/r),t.push(o.i/r),Pt(n),Pt(n.next),n=e=o),n=n.next}while(n!==e);return st(n)}function ft(e,t,r,n,i,o){var a=e;do{for(var s=a.next.next;s!==a.prev;){if(a.i!==s.i&&xt(a,s)){var u=At(a,s);return a=st(a,a.next),u=st(u,u.next),ut(a,t,r,n,i,o),void ut(u,t,r,n,i,o)}s=s.next}a=a.next}while(a!==e)}function dt(e,t){return e.x-t.x}function pt(e,t){if(t=function(e,t){var r,n=t,i=e.x,o=e.y,a=-1/0;do{if(o<=n.y&&o>=n.next.y&&n.next.y!==n.y){var s=n.x+(o-n.y)*(n.next.x-n.x)/(n.next.y-n.y);if(s<=i&&s>a){if(a=s,s===i){if(o===n.y)return n;if(o===n.next.y)return n.next}r=n.x=n.x&&n.x>=l&&i!==n.x&>(or.x||n.x===r.x&&mt(r,n)))&&(r=n,f=u)),n=n.next}while(n!==c);return r}(e,t),t){var r=At(t,e);st(t,t.next),st(r,r.next)}}function mt(e,t){return bt(e.prev,e,t.prev)<0&&bt(t.next,e,e.next)<0}function vt(e,t,r,n,i){return(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=32767*(e-r)*i)|e<<8))|e<<4))|e<<2))|e<<1))|(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=32767*(t-n)*i)|t<<8))|t<<4))|t<<2))|t<<1))<<1}function yt(e){var t=e,r=e;do{(t.x=0&&(e-a)*(n-s)-(r-a)*(t-s)>=0&&(r-a)*(o-s)-(i-a)*(n-s)>=0}function xt(e,t){return e.next.i!==t.i&&e.prev.i!==t.i&&!function(e,t){var r=e;do{if(r.i!==e.i&&r.next.i!==e.i&&r.i!==t.i&&r.next.i!==t.i&&Mt(r,r.next,e,t))return!0;r=r.next}while(r!==e);return!1}(e,t)&&(St(e,t)&&St(t,e)&&function(e,t){var r=e,n=!1,i=(e.x+t.x)/2,o=(e.y+t.y)/2;do{r.y>o!=r.next.y>o&&r.next.y!==r.y&&i<(r.next.x-r.x)*(o-r.y)/(r.next.y-r.y)+r.x&&(n=!n),r=r.next}while(r!==e);return n}(e,t)&&(bt(e.prev,e,t.prev)||bt(e,t.prev,t))||wt(e,t)&&bt(e.prev,e,e.next)>0&&bt(t.prev,t,t.next)>0)}function bt(e,t,r){return(t.y-e.y)*(r.x-t.x)-(t.x-e.x)*(r.y-t.y)}function wt(e,t){return e.x===t.x&&e.y===t.y}function Mt(e,t,r,n){var i=It(bt(e,t,r)),o=It(bt(e,t,n)),a=It(bt(r,n,e)),s=It(bt(r,n,t));return i!==o&&a!==s||!(0!==i||!Tt(e,r,t))||!(0!==o||!Tt(e,n,t))||!(0!==a||!Tt(r,e,n))||!(0!==s||!Tt(r,t,n))}function Tt(e,t,r){return t.x<=Math.max(e.x,r.x)&&t.x>=Math.min(e.x,r.x)&&t.y<=Math.max(e.y,r.y)&&t.y>=Math.min(e.y,r.y)}function It(e){return e>0?1:e<0?-1:0}function St(e,t){return bt(e.prev,e,e.next)<0?bt(e,t,e.next)>=0&&bt(e,e.prev,t)>=0:bt(e,t,e.prev)<0||bt(e,e.next,t)<0}function At(e,t){var r=new Lt(e.i,e.x,e.y),n=new Lt(t.i,t.x,t.y),i=e.next,o=t.prev;return e.next=t,t.prev=e,r.next=i,i.prev=r,n.next=r,r.prev=n,o.next=n,n.prev=o,n}function Ot(e,t,r,n){var i=new Lt(e,t,r);return n?(i.next=n.next,i.prev=n,n.next.prev=i,n.next=i):(i.prev=i,i.next=i),i}function Pt(e){e.next.prev=e.prev,e.prev.next=e.next,e.prevZ&&(e.prevZ.nextZ=e.nextZ),e.nextZ&&(e.nextZ.prevZ=e.prevZ)}function Lt(e,t,r){this.i=e,this.x=t,this.y=r,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}function jt(e,t,r,n){for(var i=0,o=t,a=r-n;oe.length)&&(t=e.length);for(var r=0,n=new Array(t);r0&&(n+=e[i-1].length,r.holes.push(n))}return r};var Gt=k.vec2(),kt=k.vec3(),_t=k.vec3(),Ft=k.vec3();function Nt(e){var t=e.data,r=e.xktModel,n=e.center,i=void 0!==n&&n,o=e.transform,a=void 0===o?null:o,s=e.stats,u=void 0===s?{}:s,c=e.log;return new Promise((function(e,n){if(t)if("CityJSON"===t.type)if(r){var o;c("Using parser: parseCityJSONIntoXKTModel"),c("center: ".concat(i)),a&&c("transform: [".concat(a,"]")),t.transform||i||a?(o=function(e){for(var t=[],r=0,n=0;r0){for(var c=[],l=0,h=t.geometry.length;l0){var x=y[g[0]];if(void 0!==x.value)d=v[x.value];else{var b=x.values;if(b){p=[];for(var w=0,M=b.length;w0&&(n.createEntity({entityId:r,meshIds:c}),e.stats.numObjects++)}}function Bt(e,t,r,n){switch(t.type){case"MultiPoint":case"MultiLineString":case"GeometryInstance":break;case"MultiSurface":case"CompositeSurface":zt(e,r,t.boundaries,n);break;case"Solid":for(var i=t.boundaries,o=0;o0&&l.push(c.length);var p=Rt(e,s[d],h,f);c.push.apply(c,Et(p))}if(3===c.length)f.indices.push(c[0]),f.indices.push(c[1]),f.indices.push(c[2]);else if(c.length>3){for(var m=[],v=0;v0&&s.push(a.length);var c=Rt(e,t[o][u],r,n);a.push.apply(a,Et(c))}if(3===a.length)n.indices.push(a[0]),n.indices.push(a[1]),n.indices.push(a[2]);else if(a.length>3){for(var l=[],h=0;h0)for(var u=0;u0){null==g&&e.log("Warning: 'name' properties not found on glTF scene nodes - will randomly-generate object IDs in XKT");var x=g;for(x&&o.entities[x]&&e.log("Warning: Two or more glTF nodes found with same 'name' attribute: '".concat(g," - will randomly-generating an object ID in XKT"));!x||o.entities[x];)x="entity-"+e.nextId++;if(e.metaModelCorrections){var b=e.metaModelCorrections.eachChildRoot[x];if(b){var w=e.metaModelCorrections.eachRootStats[b.id];w.countChildren++,w.countChildren>=w.numChildren&&(o.createEntity({entityId:b.id,meshIds:tr}),e.stats.numObjects++,tr.length=0)}else e.metaModelCorrections.metaObjectsMap[x]&&(o.createEntity({entityId:x,meshIds:tr}),e.stats.numObjects++,tr.length=0)}else o.createEntity({entityId:x,meshIds:tr}),e.stats.numObjects++,tr.length=0}}var nr="undefined"!=typeof atob?atob:function(e){return Buffer.from(e,"base64").toString("binary")},ir={5120:Int8Array,5121:Uint8Array,5122:Int16Array,5123:Uint16Array,5125:Uint32Array,5126:Float32Array},or={SCALAR:1,VEC2:2,VEC3:3,VEC4:4,MAT2:4,MAT3:9,MAT4:16};function ar(e){var t=e.data,r=e.xktModel,n=e.metaModelData,i=e.includeNormals,o=e.reuseGeometries,a=e.getAttachment,s=e.stats,u=void 0===s?{}:s,c=e.log;return c&&c("Using parser: parseGLTFJSONIntoXKTModel"),new Promise((function(e,s){if(t)if(r){u.sourceFormat="glTF",u.schemaVersion="2.0",u.title="",u.author="",u.created="",u.numTriangles=0,u.numVertices=0,u.numNormals=0,u.numObjects=0,u.numGeometries=0;var l={gltf:t,metaModelCorrections:n?sr(n):null,getAttachment:a||function(){throw new Error("You must define getAttachment() method to convert glTF with external resources")},log:c||function(e){},xktModel:r,includeNormals:i,createXKTGeometryIds:{},nextMeshId:0,reuseGeometries:!1!==o,stats:u};l.log("Parsing normals: ".concat(l.includeNormals?"enabled":"disabled")),function(e){var t=e.gltf.buffers;return t?Promise.all(t.map((function(t){return function(e,t){return new Promise((function(r,n){if(t._arrayBuffer)return t._buffer=t._arrayBuffer,void r(t);var i=t.uri;i?function(e,t){return new Promise((function(r,n){var i=t.match(/^data:(.*?)(;base64)?,(.*)$/);if(i){var o=!!i[2],a=i[3];a=decodeURIComponent(a),o&&(a=nr(a));for(var s=new ArrayBuffer(a.length),u=new Uint8Array(s),c=0;c0)for(var l=0;l0){null==E&&e.log("[parseGLTFJSONIntoXKTModel] Warning: 'name' properties not found on glTF scene nodes - will randomly-generate object IDs in XKT");var D=E;if(null==D)for(a.entities[D]&&e.error("Two or more glTF nodes found with same 'name' attribute: '"+E+"'");!D||a.entities[D];)D="entity-"+e.nextId++;if(e.metaModelCorrections){var G=e.metaModelCorrections.eachChildRoot[D];if(G){var _=e.metaModelCorrections.eachRootStats[G.id];_.countChildren++,_.countChildren>=_.numChildren&&(a.createEntity({entityId:G.id,meshIds:lr}),e.stats.numObjects++,lr=[])}else e.metaModelCorrections.metaObjectsMap[D]&&(a.createEntity({entityId:D,meshIds:lr}),e.stats.numObjects++,lr=[])}else a.createEntity({entityId:D,meshIds:lr}),e.stats.numObjects++,lr=[]}}function fr(e){if(!e.attributes)return"empty";var t=e.mode,r=(e.material,e.indices),n=e.attributes.POSITION,i=e.attributes.NORMAL,o=e.attributes.COLOR_0,a=e.attributes.TEXCOORD_0;return[t,null!=r?r:"-",null!=n?n:"-",null!=i?i:"-",null!=o?o:"-",null!=a?a:"-"].join(";")}function dr(e,t,r){var n=t.attributes;if(n){switch(t.mode){case 0:r.primitive="points";break;case 1:case 2:case 3:r.primitive="lines";break;case 4:default:r.primitive="triangles";break;case 5:console.log("TRIANGLE_STRIP"),r.primitive="triangles";break;case 6:console.log("TRIANGLE_FAN"),r.primitive="triangles"}var i=e.gltf.accessors,o=t.indices;if(null!=o){var a=i[o];r.indices=pr(e,a)}var s=n.POSITION;if(null!=s){var u=i[s];r.positions=pr(e,u)}var c=n.NORMAL;if(null!=c){var l=i[c];r.normals=pr(e,l)}var h=n.COLOR_0;if(null!=h){var f=i[h];r.colors=pr(e,f)}}}function pr(e,t){var r=e.gltf.bufferViews[t.bufferView],n=or[t.type],i=ir[t.componentType],o=i.BYTES_PER_ELEMENT*n;if(t.byteStride&&t.byteStride!==o)throw new Error("interleaved buffer!");return new i(r._buffer,t.byteOffset||0,t.count*n)}function mr(e){var t=e.WebIFC,r=e.data,n=e.xktModel,i=e.autoNormals,o=void 0===i||i,a=e.includeTypes,s=e.excludeTypes,u=e.wasmPath,c=e.stats,l=void 0===c?{}:c,h=e.log;return h&&h("Using parser: parseIFCIntoXKTModel"),new Promise((function(e,i){if(r)if(n)if(u){var c=new t.IfcAPI;u&&c.SetWasmPath(u),c.Init().then((function(){var i=new Uint8Array(r),u=c.OpenModel(i);l.sourceFormat="IFC",l.schemaVersion="",l.title="",l.author="",l.created="",l.numMetaObjects=0,l.numPropertySets=0,l.numObjects=0,l.numGeometries=0,l.numTriangles=0,l.numVertices=0;var f={WebIFC:t,modelID:u,ifcAPI:c,xktModel:n,autoNormals:o,log:h||function(e){},nextId:0,stats:l};if(a){f.includeTypes={};for(var d=0,p=a.length;d0){for(var d=o.Name.value,p=[],m=0,v=f.length;m0&&(e.xktModel.createEntity({entityId:o,meshIds:i}),e.stats.numObjects++)}else console.log("excluding: "+a)}const xr=require("@loaders.gl/las");var br=5e5;function wr(e){var t=e.data,r=e.xktModel,n=e.center,i=void 0!==n&&n,o=e.transform,a=void 0===o?null:o,s=e.colorDepth,u=void 0===s?"auto":s,c=e.fp64,l=void 0!==c&&c,h=e.skip,f=void 0===h?1:h,d=e.stats,p=e.log,m=void 0===p?function(){}:p;return m&&m("Using parser: parseLASIntoXKTModel"),new Promise((function(e,n){t?r?(m("Converting LAZ/LAS"),m("center: ".concat(i)),a&&m("transform: [".concat(a,"]")),m("colorDepth: ".concat(u)),m("fp64: ".concat(l)),m("skip: ".concat(f)),(0,Ce.parse)(t,xr.LASLoader,{las:{colorDepth:u,fp64:l}}).then((function(t){var n=t.attributes,o=t.loaderData,s=void 0!==o.pointsFormatId?o.pointsFormatId:-1;if(n.POSITION){var u={};switch(s){case 0:if(!n.intensity)return void m("No intensities found in file (expected for LAS point format 0)");u=y(n.POSITION,n.intensity);break;case 1:if(!n.intensity)return void m("No intensities found in file (expected for LAS point format 1)");u=y(n.POSITION,n.intensity);break;case 2:if(!n.intensity)return void m("No intensities found in file (expected for LAS point format 2)");u=v(n.POSITION,n.COLOR_0,n.intensity);break;case 3:if(!n.intensity)return void m("No intensities found in file (expected for LAS point format 3)");u=v(n.POSITION,n.COLOR_0,n.intensity)}for(var c=g(function(e){if(e){if(i){for(var t=k.vec3(),r=e.length,n=0,o=e.length;n=e.length)return[e];for(var r=[],n=0;n0?P:null}),M++}}o&&o("Converted meta objects: "+M),e()}))}function Tr(e){var t=e.data,r=e.xktModel,n=e.littleEndian,i=void 0===n||n,o=e.stats,a=e.log;return a&&a("Using parser: parsePCDIntoXKTModel"),new Promise((function(e,n){var s=function(e){if("undefined"!=typeof TextDecoder)return(new TextDecoder).decode(e);for(var t="",r=0,n=e.length;r>16&255,g=v>>8&255,x=v>>0&255;l.push(y,g,x,255)}else l.push(255),l.push(255),l.push(255)}if("binary_compressed"===u.data)for(var b=new Uint32Array(t.slice(u.headerLen,u.headerLen+8)),w=b[0],M=b[1],T=function(e,t){var r,n,i,o=e.length,a=new Uint8Array(t),s=0,u=0;do{if((r=e[s++])<32){if(u+ ++r>t)throw new Error("Output buffer is not large enough");if(s+r>o)throw new Error("Invalid compressed data");do{a[u++]=e[s++]}while(--r)}else{if(n=r>>5,i=u-((31&r)<<8)-1,s>=o)throw new Error("Invalid compressed data");if(7===n&&(n+=e[s++],s>=o))throw new Error("Invalid compressed data");if(i-=e[s++],u+n+2>t)throw new Error("Output buffer is not large enough");if(i<0)throw new Error("Invalid compressed data");if(i>=u)throw new Error("Invalid compressed data");do{a[u++]=a[i++]}while(2+--n)}}while(s0?l:null}),r.createMesh({meshId:"pointsMesh",geometryId:"pointsGeometry"}),r.createEntity({entityId:"geometries",meshIds:["pointsMesh"]}),a&&(a("Converted drawable objects: 1"),a("Converted geometries: 1"),a("Converted vertices: "+c.length/3)),o&&(o.sourceFormat="PCD",o.schemaVersion="",o.title="",o.author="",o.created="",o.numObjects=1,o.numGeometries=1,o.numVertices=c.length/3),e()}))}const Ir=require("@loaders.gl/ply");function Sr(e){return Sr="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Sr(e)}function Ar(){Ar=function(){return e};var e={},t=Object.prototype,r=t.hasOwnProperty,n=Object.defineProperty||function(e,t,r){e[t]=r.value},i="function"==typeof Symbol?Symbol:{},o=i.iterator||"@@iterator",a=i.asyncIterator||"@@asyncIterator",s=i.toStringTag||"@@toStringTag";function u(e,t,r){return Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{u({},"")}catch(e){u=function(e,t,r){return e[t]=r}}function c(e,t,r,i){var o=t&&t.prototype instanceof f?t:f,a=Object.create(o.prototype),s=new S(i||[]);return n(a,"_invoke",{value:w(e,r,s)}),a}function l(e,t,r){try{return{type:"normal",arg:e.call(t,r)}}catch(e){return{type:"throw",arg:e}}}e.wrap=c;var h={};function f(){}function d(){}function p(){}var m={};u(m,o,(function(){return this}));var v=Object.getPrototypeOf,y=v&&v(v(A([])));y&&y!==t&&r.call(y,o)&&(m=y);var g=p.prototype=f.prototype=Object.create(m);function x(e){["next","throw","return"].forEach((function(t){u(e,t,(function(e){return this._invoke(t,e)}))}))}function b(e,t){function i(n,o,a,s){var u=l(e[n],e,o);if("throw"!==u.type){var c=u.arg,h=c.value;return h&&"object"==Sr(h)&&r.call(h,"__await")?t.resolve(h.__await).then((function(e){i("next",e,a,s)}),(function(e){i("throw",e,a,s)})):t.resolve(h).then((function(e){c.value=e,a(c)}),(function(e){return i("throw",e,a,s)}))}s(u.arg)}var o;n(this,"_invoke",{value:function(e,r){function n(){return new t((function(t,n){i(e,r,t,n)}))}return o=o?o.then(n,n):n()}})}function w(e,t,r){var n="suspendedStart";return function(i,o){if("executing"===n)throw new Error("Generator is already running");if("completed"===n){if("throw"===i)throw o;return{value:void 0,done:!0}}for(r.method=i,r.arg=o;;){var a=r.delegate;if(a){var s=M(a,r);if(s){if(s===h)continue;return s}}if("next"===r.method)r.sent=r._sent=r.arg;else if("throw"===r.method){if("suspendedStart"===n)throw n="completed",r.arg;r.dispatchException(r.arg)}else"return"===r.method&&r.abrupt("return",r.arg);n="executing";var u=l(e,t,r);if("normal"===u.type){if(n=r.done?"completed":"suspendedYield",u.arg===h)continue;return{value:u.arg,done:r.done}}"throw"===u.type&&(n="completed",r.method="throw",r.arg=u.arg)}}}function M(e,t){var r=t.method,n=e.iterator[r];if(void 0===n)return t.delegate=null,"throw"===r&&e.iterator.return&&(t.method="return",t.arg=void 0,M(e,t),"throw"===t.method)||"return"!==r&&(t.method="throw",t.arg=new TypeError("The iterator does not provide a '"+r+"' method")),h;var i=l(n,e.iterator,t.arg);if("throw"===i.type)return t.method="throw",t.arg=i.arg,t.delegate=null,h;var o=i.arg;return o?o.done?(t[e.resultName]=o.value,t.next=e.nextLoc,"return"!==t.method&&(t.method="next",t.arg=void 0),t.delegate=null,h):o:(t.method="throw",t.arg=new TypeError("iterator result is not an object"),t.delegate=null,h)}function T(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function I(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function S(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(T,this),this.reset(!0)}function A(e){if(e){var t=e[o];if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var n=-1,i=function t(){for(;++n=0;--i){var o=this.tryEntries[i],a=o.completion;if("root"===o.tryLoc)return n("end");if(o.tryLoc<=this.prev){var s=r.call(o,"catchLoc"),u=r.call(o,"finallyLoc");if(s&&u){if(this.prev=0;--n){var i=this.tryEntries[n];if(i.tryLoc<=this.prev&&r.call(i,"finallyLoc")&&this.prev=0;--t){var r=this.tryEntries[t];if(r.finallyLoc===e)return this.complete(r.completion,r.afterLoc),I(r),h}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.tryLoc===e){var n=r.completion;if("throw"===n.type){var i=n.arg;I(r)}return i}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,r){return this.delegate={iterator:A(e),resultName:t,nextLoc:r},"next"===this.method&&(this.arg=void 0),h}},e}function Or(e,t,r,n,i,o,a){try{var s=e[o](a),u=s.value}catch(e){return void r(e)}s.done?t(u):Promise.resolve(u).then(n,i)}function Pr(e){return Lr.apply(this,arguments)}function Lr(){var e;return e=Ar().mark((function e(t){var r,n,i,o,a,s,u,c,l,h,f;return Ar().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(r=t.data,n=t.xktModel,i=t.stats,(o=t.log)&&o("Using parser: parsePLYIntoXKTModel"),r){e.next=4;break}throw"Argument expected: data";case 4:if(n){e.next=6;break}throw"Argument expected: xktModel";case 6:return e.prev=6,e.next=9,(0,Ce.parse)(r,Ir.PLYLoader);case 9:a=e.sent,e.next=16;break;case 12:return e.prev=12,e.t0=e.catch(6),o&&o("Error: "+e.t0),e.abrupt("return");case 16:if(s=a.attributes,u=!!s.COLOR_0){for(c=u?s.COLOR_0.value:null,l=[],h=0,f=c.length;h=0;--i){var o=this.tryEntries[i],a=o.completion;if("root"===o.tryLoc)return n("end");if(o.tryLoc<=this.prev){var s=r.call(o,"catchLoc"),u=r.call(o,"finallyLoc");if(s&&u){if(this.prev=0;--n){var i=this.tryEntries[n];if(i.tryLoc<=this.prev&&r.call(i,"finallyLoc")&&this.prev=0;--t){var r=this.tryEntries[t];if(r.finallyLoc===e)return this.complete(r.completion,r.afterLoc),I(r),h}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.tryLoc===e){var n=r.completion;if("throw"===n.type){var i=n.arg;I(r)}return i}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,r){return this.delegate={iterator:A(e),resultName:t,nextLoc:r},"next"===this.method&&(this.arg=void 0),h}},e}function Dr(e,t,r,n,i,o,a){try{var s=e[o](a),u=s.value}catch(e){return void r(e)}s.done?t(u):Promise.resolve(u).then(n,i)}function Gr(e){return kr.apply(this,arguments)}function kr(){var e;return e=Er().mark((function e(t){var r,n,i,o,a,s,u,c;return Er().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=t.data,n=t.splitMeshes,i=t.autoNormals,o=t.smoothNormals,a=t.smoothNormalsAngleThreshold,s=t.xktModel,u=t.stats,(c=t.log)&&c("Using parser: parseSTLIntoXKTModel"),e.abrupt("return",new Promise((function(e,t){if(r)if(s){var l=k.createUUID(),h=s.createMetaObject({metaObjectId:l,metaObjectType:"Model",metaObjectName:"Model"}),f={data:r,splitMeshes:n,autoNormals:i,smoothNormals:o,smoothNormalsAngleThreshold:a,xktModel:s,rootMetaObject:h,nextId:0,log:c||function(e){},stats:{numObjects:0,numGeometries:0,numTriangles:0,numVertices:0}},d=Br(r);_r(d)?Fr(f,d):Nr(f,"string"!=typeof(p=r)?function(e){if("undefined"!=typeof TextDecoder)return(new TextDecoder).decode(e);for(var t="",r=0,n=e.length;r>5&31)/31,i=(S>>10&31)/31):(r=a,n=s,i=u),(x&&r!==f||n!==d||i!==p)&&(null!==f&&(m=!0),f=r,d=n,p=i)}for(var A=1;A<=3;A++){var O=w+12*A;y.push(c.getFloat32(O,!0)),y.push(c.getFloat32(O+4,!0)),y.push(c.getFloat32(O+8,!0)),e.autoNormals||g.push(M,T,I),h&&o.push(r,n,i,1)}x&&m&&(Cr(e,y,g,o),y=[],g=[],o=o?[]:null,m=!1)}y.length>0&&Cr(e,y,g,o)}function Nr(e,t){for(var r,n,i,o,a,s,u,c=/facet([\s\S]*?)endfacet/g,l=0,h=/[\s]+([+-]?(?:\d+.\d+|\d+.|\d+|.\d+)(?:[eE][+-]?\d+)?)/.source,f=new RegExp("vertex"+h+h+h,"g"),d=new RegExp("normal"+h+h+h,"g"),p=[],m=[];null!==(o=c.exec(t));){for(a=0,s=0,u=o[0];null!==(o=d.exec(u));)r=parseFloat(o[1]),n=parseFloat(o[2]),i=parseFloat(o[3]),s++;for(;null!==(o=f.exec(u));)p.push(parseFloat(o[1]),parseFloat(o[2]),parseFloat(o[3])),m.push(r,n,i),a++;if(1!==s)return e.log("Error in normal of face "+l),-1;if(3!==a)return e.log("Error in positions of face "+l),-1;l++}Cr(e,p,m,null)}var Vr=0;function Cr(e,t,r,n){for(var i=new Int32Array(t.length/3),o=0,a=i.length;o0?r:null,n=n&&n.length>0?n:null,!e.autoNormals&&e.smoothNormals&&function(e,t){var r,n,i,o,a,s,u,c,l,h,f,d=(arguments.length>2&&void 0!==arguments[2]?arguments[2]:{}).smoothNormalsAngleThreshold||20,p={},m=[],v={},y=Math.pow(10,4);for(u=0,l=e.length;u0&&void 0!==arguments[0]?arguments[0]:{},t=e.xSize||1;t<0&&(console.error("negative xSize not allowed - will invert"),t*=-1);var r=e.ySize||1;r<0&&(console.error("negative ySize not allowed - will invert"),r*=-1);var n=e.zSize||1;n<0&&(console.error("negative zSize not allowed - will invert"),n*=-1);var i=e.center,o=i?i[0]:0,a=i?i[1]:0,s=i?i[2]:0,u=-t+o,c=-r+a,l=-n+s,h=t+o,f=r+a,d=n+s;return{primitiveType:"triangles",positions:[h,f,d,u,f,d,u,c,d,h,c,d,h,f,d,h,c,d,h,c,l,h,f,l,h,f,d,h,f,l,u,f,l,u,f,d,u,f,d,u,f,l,u,c,l,u,c,d,u,c,l,h,c,l,h,c,d,u,c,d,h,c,l,u,c,l,u,f,l,h,f,l],normals:[0,0,1,0,0,1,0,0,1,0,0,1,1,0,0,1,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1],uv:[1,0,0,0,0,1,1,1,0,0,0,1,1,1,1,0,1,1,1,0,0,0,0,1,1,0,0,0,0,1,1,1,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0],indices:[0,1,2,0,2,3,4,5,6,4,6,7,8,9,10,8,10,11,12,13,14,12,14,15,16,17,18,16,18,19,20,21,22,20,22,23]}}function Ur(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.xSize||1;t<0&&(console.error("negative xSize not allowed - will invert"),t*=-1);var r=e.ySize||1;r<0&&(console.error("negative ySize not allowed - will invert"),r*=-1);var n=e.zSize||1;n<0&&(console.error("negative zSize not allowed - will invert"),n*=-1);var i=e.center,o=i?i[0]:0,a=i?i[1]:0,s=i?i[2]:0,u=-t+o,c=-r+a,l=-n+s,h=t+o,f=r+a,d=n+s;return{primitiveType:"lines",positions:[u,c,l,u,c,d,u,f,l,u,f,d,h,c,l,h,c,d,h,f,l,h,f,d],indices:[0,1,1,3,3,2,2,0,4,5,5,7,7,6,6,4,0,4,1,5,2,6,3,7]}}function Xr(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.radiusTop||1;t<0&&(console.error("negative radiusTop not allowed - will invert"),t*=-1);var r=e.radiusBottom||1;r<0&&(console.error("negative radiusBottom not allowed - will invert"),r*=-1);var n=e.height||1;n<0&&(console.error("negative height not allowed - will invert"),n*=-1);var i=e.radialSegments||32;i<0&&(console.error("negative radialSegments not allowed - will invert"),i*=-1),i<3&&(i=3);var o=e.heightSegments||1;o<0&&(console.error("negative heightSegments not allowed - will invert"),o*=-1),o<1&&(o=1);var a,s,u,c,l,h,f,d,p,m,v,y=!!e.openEnded,g=e.center,x=g?g[0]:0,b=g?g[1]:0,w=g?g[2]:0,M=n/2,T=n/o,I=2*Math.PI/i,S=1/i,A=(t-r)/o,O=[],P=[],L=[],j=[],E=(90-180*Math.atan(n/(r-t))/Math.PI)/90;for(a=0;a<=o;a++)for(l=t-a*A,h=M-a*T,s=0;s<=i;s++)u=Math.sin(s*I),c=Math.cos(s*I),P.push(l*u),P.push(E),P.push(l*c),L.push(s*S),L.push(1*a/o),O.push(l*u+x),O.push(h+b),O.push(l*c+w);for(a=0;a0){for(p=O.length/3,P.push(0),P.push(1),P.push(0),L.push(.5),L.push(.5),O.push(0+x),O.push(M+b),O.push(0+w),s=0;s<=i;s++)u=Math.sin(s*I),c=Math.cos(s*I),m=.5*Math.sin(s*I)+.5,v=.5*Math.cos(s*I)+.5,P.push(t*u),P.push(1),P.push(t*c),L.push(m),L.push(v),O.push(t*u+x),O.push(M+b),O.push(t*c+w);for(s=0;s0){for(p=O.length/3,P.push(0),P.push(-1),P.push(0),L.push(.5),L.push(.5),O.push(0+x),O.push(0-M+b),O.push(0+w),s=0;s<=i;s++)u=Math.sin(s*I),c=Math.cos(s*I),m=.5*Math.sin(s*I)+.5,v=.5*Math.cos(s*I)+.5,P.push(r*u),P.push(-1),P.push(r*c),L.push(m),L.push(v),O.push(r*u+x),O.push(0-M+b),O.push(r*c+w);for(s=0;s0&&void 0!==arguments[0]?arguments[0]:{},t=e.size||1;t<0&&(console.error("negative size not allowed - will invert"),t*=-1);var r=e.divisions||1;r<0&&(console.error("negative divisions not allowed - will invert"),r*=-1),r<1&&(r=1);for(var n=(t=t||10)/(r=r||10),i=t/2,o=[],a=[],s=0,u=0,c=-i;u<=r;u++,c+=n)o.push(-i),o.push(0),o.push(c),o.push(i),o.push(0),o.push(c),o.push(c),o.push(0),o.push(-i),o.push(c),o.push(0),o.push(i),a.push(s++),a.push(s++),a.push(s++),a.push(s++);return{primitiveType:"lines",positions:o,indices:a}}function Kr(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.xSize||1;t<0&&(console.error("negative xSize not allowed - will invert"),t*=-1);var r=e.zSize||1;r<0&&(console.error("negative zSize not allowed - will invert"),r*=-1);var n=e.xSegments||1;n<0&&(console.error("negative xSegments not allowed - will invert"),n*=-1),n<1&&(n=1);var i=e.xSegments||1;i<0&&(console.error("negative zSegments not allowed - will invert"),i*=-1),i<1&&(i=1);var o,a,s,u,c,l,h,f=e.center,d=f?f[0]:0,p=f?f[1]:0,m=f?f[2]:0,v=t/2,y=r/2,g=Math.floor(n)||1,x=Math.floor(i)||1,b=g+1,w=x+1,M=t/g,T=r/x,I=new Float32Array(b*w*3),S=new Float32Array(b*w*3),A=new Float32Array(b*w*2),O=0,P=0;for(o=0;o65535?Uint32Array:Uint16Array)(g*x*6);for(o=0;o0&&void 0!==arguments[0]?arguments[0]:{},t=e.lod||1,r=e.center?e.center[0]:0,n=e.center?e.center[1]:0,i=e.center?e.center[2]:0,o=e.radius||1;o<0&&(console.error("negative radius not allowed - will invert"),o*=-1);var a=e.heightSegments||18;a<0&&(console.error("negative heightSegments not allowed - will invert"),a*=-1),(a=Math.floor(t*a))<18&&(a=18);var s=e.widthSegments||18;s<0&&(console.error("negative widthSegments not allowed - will invert"),s*=-1),(s=Math.floor(t*s))<18&&(s=18);var u,c,l,h,f,d,p,m,v,y,g,x,b,w,M=[],T=[],I=[],S=[];for(u=0;u<=a;u++)for(l=u*Math.PI/a,h=Math.sin(l),f=Math.cos(l),c=0;c<=s;c++)d=2*c*Math.PI/s,p=Math.sin(d),m=Math.cos(d)*h,v=f,y=p*h,g=1-c/s,x=u/a,T.push(m),T.push(v),T.push(y),I.push(g),I.push(x),M.push(r+o*m),M.push(n+o*v),M.push(i+o*y);for(u=0;u0&&void 0!==arguments[0]?arguments[0]:{},t=e.radius||1;t<0&&(console.error("negative radius not allowed - will invert"),t*=-1),t*=.5;var r=e.tube||.3;r<0&&(console.error("negative tube not allowed - will invert"),r*=-1);var n=e.radialSegments||32;n<0&&(console.error("negative radialSegments not allowed - will invert"),n*=-1),n<4&&(n=4);var i=e.tubeSegments||24;i<0&&(console.error("negative tubeSegments not allowed - will invert"),i*=-1),i<4&&(i=4);var o=e.arc||2*Math.PI;o<0&&(console.warn("negative arc not allowed - will invert"),o*=-1),o>360&&(o=360);var a,s,u,c,l,h,f,d,p,m,v,y,g=e.center,x=g?g[0]:0,b=g?g[1]:0,w=g?g[2]:0,M=[],T=[],I=[],S=[];for(d=0;d<=i;d++)for(f=0;f<=n;f++)a=f/n*o,s=.785398+d/i*Math.PI*2,x=t*Math.cos(a),b=t*Math.sin(a),u=(t+r*Math.cos(s))*Math.cos(a),c=(t+r*Math.cos(s))*Math.sin(a),l=r*Math.sin(s),M.push(u+x),M.push(c+b),M.push(l+w),I.push(1-f/n),I.push(d/i),h=k.normalizeVec3(k.subVec3([u,c,l],[x,b,w],[]),[]),T.push(h[0]),T.push(h[1]),T.push(h[2]);for(d=1;d<=i;d++)for(f=1;f<=n;f++)p=(n+1)*d+f-1,m=(n+1)*(d-1)+f-1,v=(n+1)*(d-1)+f,y=(n+1)*d+f,S.push(p),S.push(m),S.push(v),S.push(v),S.push(y),S.push(p);return{primitiveType:"triangles",positions:M,normals:T,uv:I,uvs:I,indices:S}}var Yr={" ":{width:16,points:[]},"!":{width:10,points:[[5,21],[5,7],[-1,-1],[5,2],[4,1],[5,0],[6,1],[5,2]]},'"':{width:16,points:[[4,21],[4,14],[-1,-1],[12,21],[12,14]]},"#":{width:21,points:[[11,25],[4,-7],[-1,-1],[17,25],[10,-7],[-1,-1],[4,12],[18,12],[-1,-1],[3,6],[17,6]]},$:{width:20,points:[[8,25],[8,-4],[-1,-1],[12,25],[12,-4],[-1,-1],[17,18],[15,20],[12,21],[8,21],[5,20],[3,18],[3,16],[4,14],[5,13],[7,12],[13,10],[15,9],[16,8],[17,6],[17,3],[15,1],[12,0],[8,0],[5,1],[3,3]]},"%":{width:24,points:[[21,21],[3,0],[-1,-1],[8,21],[10,19],[10,17],[9,15],[7,14],[5,14],[3,16],[3,18],[4,20],[6,21],[8,21],[10,20],[13,19],[16,19],[19,20],[21,21],[-1,-1],[17,7],[15,6],[14,4],[14,2],[16,0],[18,0],[20,1],[21,3],[21,5],[19,7],[17,7]]},"&":{width:26,points:[[23,12],[23,13],[22,14],[21,14],[20,13],[19,11],[17,6],[15,3],[13,1],[11,0],[7,0],[5,1],[4,2],[3,4],[3,6],[4,8],[5,9],[12,13],[13,14],[14,16],[14,18],[13,20],[11,21],[9,20],[8,18],[8,16],[9,13],[11,10],[16,3],[18,1],[20,0],[22,0],[23,1],[23,2]]},"'":{width:10,points:[[5,19],[4,20],[5,21],[6,20],[6,18],[5,16],[4,15]]},"(":{width:14,points:[[11,25],[9,23],[7,20],[5,16],[4,11],[4,7],[5,2],[7,-2],[9,-5],[11,-7]]},")":{width:14,points:[[3,25],[5,23],[7,20],[9,16],[10,11],[10,7],[9,2],[7,-2],[5,-5],[3,-7]]},"*":{width:16,points:[[8,21],[8,9],[-1,-1],[3,18],[13,12],[-1,-1],[13,18],[3,12]]},"+":{width:26,points:[[13,18],[13,0],[-1,-1],[4,9],[22,9]]},",":{width:10,points:[[6,1],[5,0],[4,1],[5,2],[6,1],[6,-1],[5,-3],[4,-4]]},"-":{width:26,points:[[4,9],[22,9]]},".":{width:10,points:[[5,2],[4,1],[5,0],[6,1],[5,2]]},"/":{width:22,points:[[20,25],[2,-7]]},0:{width:20,points:[[9,21],[6,20],[4,17],[3,12],[3,9],[4,4],[6,1],[9,0],[11,0],[14,1],[16,4],[17,9],[17,12],[16,17],[14,20],[11,21],[9,21]]},1:{width:20,points:[[6,17],[8,18],[11,21],[11,0]]},2:{width:20,points:[[4,16],[4,17],[5,19],[6,20],[8,21],[12,21],[14,20],[15,19],[16,17],[16,15],[15,13],[13,10],[3,0],[17,0]]},3:{width:20,points:[[5,21],[16,21],[10,13],[13,13],[15,12],[16,11],[17,8],[17,6],[16,3],[14,1],[11,0],[8,0],[5,1],[4,2],[3,4]]},4:{width:20,points:[[13,21],[3,7],[18,7],[-1,-1],[13,21],[13,0]]},5:{width:20,points:[[15,21],[5,21],[4,12],[5,13],[8,14],[11,14],[14,13],[16,11],[17,8],[17,6],[16,3],[14,1],[11,0],[8,0],[5,1],[4,2],[3,4]]},6:{width:20,points:[[16,18],[15,20],[12,21],[10,21],[7,20],[5,17],[4,12],[4,7],[5,3],[7,1],[10,0],[11,0],[14,1],[16,3],[17,6],[17,7],[16,10],[14,12],[11,13],[10,13],[7,12],[5,10],[4,7]]},7:{width:20,points:[[17,21],[7,0],[-1,-1],[3,21],[17,21]]},8:{width:20,points:[[8,21],[5,20],[4,18],[4,16],[5,14],[7,13],[11,12],[14,11],[16,9],[17,7],[17,4],[16,2],[15,1],[12,0],[8,0],[5,1],[4,2],[3,4],[3,7],[4,9],[6,11],[9,12],[13,13],[15,14],[16,16],[16,18],[15,20],[12,21],[8,21]]},9:{width:20,points:[[16,14],[15,11],[13,9],[10,8],[9,8],[6,9],[4,11],[3,14],[3,15],[4,18],[6,20],[9,21],[10,21],[13,20],[15,18],[16,14],[16,9],[15,4],[13,1],[10,0],[8,0],[5,1],[4,3]]},":":{width:10,points:[[5,14],[4,13],[5,12],[6,13],[5,14],[-1,-1],[5,2],[4,1],[5,0],[6,1],[5,2]]},";":{width:10,points:[[5,14],[4,13],[5,12],[6,13],[5,14],[-1,-1],[6,1],[5,0],[4,1],[5,2],[6,1],[6,-1],[5,-3],[4,-4]]},"<":{width:24,points:[[20,18],[4,9],[20,0]]},"=":{width:26,points:[[4,12],[22,12],[-1,-1],[4,6],[22,6]]},">":{width:24,points:[[4,18],[20,9],[4,0]]},"?":{width:18,points:[[3,16],[3,17],[4,19],[5,20],[7,21],[11,21],[13,20],[14,19],[15,17],[15,15],[14,13],[13,12],[9,10],[9,7],[-1,-1],[9,2],[8,1],[9,0],[10,1],[9,2]]},"@":{width:27,points:[[18,13],[17,15],[15,16],[12,16],[10,15],[9,14],[8,11],[8,8],[9,6],[11,5],[14,5],[16,6],[17,8],[-1,-1],[12,16],[10,14],[9,11],[9,8],[10,6],[11,5],[-1,-1],[18,16],[17,8],[17,6],[19,5],[21,5],[23,7],[24,10],[24,12],[23,15],[22,17],[20,19],[18,20],[15,21],[12,21],[9,20],[7,19],[5,17],[4,15],[3,12],[3,9],[4,6],[5,4],[7,2],[9,1],[12,0],[15,0],[18,1],[20,2],[21,3],[-1,-1],[19,16],[18,8],[18,6],[19,5]]},A:{width:18,points:[[9,21],[1,0],[-1,-1],[9,21],[17,0],[-1,-1],[4,7],[14,7]]},B:{width:21,points:[[4,21],[4,0],[-1,-1],[4,21],[13,21],[16,20],[17,19],[18,17],[18,15],[17,13],[16,12],[13,11],[-1,-1],[4,11],[13,11],[16,10],[17,9],[18,7],[18,4],[17,2],[16,1],[13,0],[4,0]]},C:{width:21,points:[[18,16],[17,18],[15,20],[13,21],[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5]]},D:{width:21,points:[[4,21],[4,0],[-1,-1],[4,21],[11,21],[14,20],[16,18],[17,16],[18,13],[18,8],[17,5],[16,3],[14,1],[11,0],[4,0]]},E:{width:19,points:[[4,21],[4,0],[-1,-1],[4,21],[17,21],[-1,-1],[4,11],[12,11],[-1,-1],[4,0],[17,0]]},F:{width:18,points:[[4,21],[4,0],[-1,-1],[4,21],[17,21],[-1,-1],[4,11],[12,11]]},G:{width:21,points:[[18,16],[17,18],[15,20],[13,21],[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5],[18,8],[-1,-1],[13,8],[18,8]]},H:{width:22,points:[[4,21],[4,0],[-1,-1],[18,21],[18,0],[-1,-1],[4,11],[18,11]]},I:{width:8,points:[[4,21],[4,0]]},J:{width:16,points:[[12,21],[12,5],[11,2],[10,1],[8,0],[6,0],[4,1],[3,2],[2,5],[2,7]]},K:{width:21,points:[[4,21],[4,0],[-1,-1],[18,21],[4,7],[-1,-1],[9,12],[18,0]]},L:{width:17,points:[[4,21],[4,0],[-1,-1],[4,0],[16,0]]},M:{width:24,points:[[4,21],[4,0],[-1,-1],[4,21],[12,0],[-1,-1],[20,21],[12,0],[-1,-1],[20,21],[20,0]]},N:{width:22,points:[[4,21],[4,0],[-1,-1],[4,21],[18,0],[-1,-1],[18,21],[18,0]]},O:{width:22,points:[[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5],[19,8],[19,13],[18,16],[17,18],[15,20],[13,21],[9,21]]},P:{width:21,points:[[4,21],[4,0],[-1,-1],[4,21],[13,21],[16,20],[17,19],[18,17],[18,14],[17,12],[16,11],[13,10],[4,10]]},Q:{width:22,points:[[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5],[19,8],[19,13],[18,16],[17,18],[15,20],[13,21],[9,21],[-1,-1],[12,4],[18,-2]]},R:{width:21,points:[[4,21],[4,0],[-1,-1],[4,21],[13,21],[16,20],[17,19],[18,17],[18,15],[17,13],[16,12],[13,11],[4,11],[-1,-1],[11,11],[18,0]]},S:{width:20,points:[[17,18],[15,20],[12,21],[8,21],[5,20],[3,18],[3,16],[4,14],[5,13],[7,12],[13,10],[15,9],[16,8],[17,6],[17,3],[15,1],[12,0],[8,0],[5,1],[3,3]]},T:{width:16,points:[[8,21],[8,0],[-1,-1],[1,21],[15,21]]},U:{width:22,points:[[4,21],[4,6],[5,3],[7,1],[10,0],[12,0],[15,1],[17,3],[18,6],[18,21]]},V:{width:18,points:[[1,21],[9,0],[-1,-1],[17,21],[9,0]]},W:{width:24,points:[[2,21],[7,0],[-1,-1],[12,21],[7,0],[-1,-1],[12,21],[17,0],[-1,-1],[22,21],[17,0]]},X:{width:20,points:[[3,21],[17,0],[-1,-1],[17,21],[3,0]]},Y:{width:18,points:[[1,21],[9,11],[9,0],[-1,-1],[17,21],[9,11]]},Z:{width:20,points:[[17,21],[3,0],[-1,-1],[3,21],[17,21],[-1,-1],[3,0],[17,0]]},"[":{width:14,points:[[4,25],[4,-7],[-1,-1],[5,25],[5,-7],[-1,-1],[4,25],[11,25],[-1,-1],[4,-7],[11,-7]]},"\\":{width:14,points:[[0,21],[14,-3]]},"]":{width:14,points:[[9,25],[9,-7],[-1,-1],[10,25],[10,-7],[-1,-1],[3,25],[10,25],[-1,-1],[3,-7],[10,-7]]},"^":{width:16,points:[[6,15],[8,18],[10,15],[-1,-1],[3,12],[8,17],[13,12],[-1,-1],[8,17],[8,0]]},_:{width:16,points:[[0,-2],[16,-2]]},"`":{width:10,points:[[6,21],[5,20],[4,18],[4,16],[5,15],[6,16],[5,17]]},a:{width:19,points:[[15,14],[15,0],[-1,-1],[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]]},b:{width:19,points:[[4,21],[4,0],[-1,-1],[4,11],[6,13],[8,14],[11,14],[13,13],[15,11],[16,8],[16,6],[15,3],[13,1],[11,0],[8,0],[6,1],[4,3]]},c:{width:18,points:[[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]]},d:{width:19,points:[[15,21],[15,0],[-1,-1],[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]]},e:{width:18,points:[[3,8],[15,8],[15,10],[14,12],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]]},f:{width:12,points:[[10,21],[8,21],[6,20],[5,17],[5,0],[-1,-1],[2,14],[9,14]]},g:{width:19,points:[[15,14],[15,-2],[14,-5],[13,-6],[11,-7],[8,-7],[6,-6],[-1,-1],[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]]},h:{width:19,points:[[4,21],[4,0],[-1,-1],[4,10],[7,13],[9,14],[12,14],[14,13],[15,10],[15,0]]},i:{width:8,points:[[3,21],[4,20],[5,21],[4,22],[3,21],[-1,-1],[4,14],[4,0]]},j:{width:10,points:[[5,21],[6,20],[7,21],[6,22],[5,21],[-1,-1],[6,14],[6,-3],[5,-6],[3,-7],[1,-7]]},k:{width:17,points:[[4,21],[4,0],[-1,-1],[14,14],[4,4],[-1,-1],[8,8],[15,0]]},l:{width:8,points:[[4,21],[4,0]]},m:{width:30,points:[[4,14],[4,0],[-1,-1],[4,10],[7,13],[9,14],[12,14],[14,13],[15,10],[15,0],[-1,-1],[15,10],[18,13],[20,14],[23,14],[25,13],[26,10],[26,0]]},n:{width:19,points:[[4,14],[4,0],[-1,-1],[4,10],[7,13],[9,14],[12,14],[14,13],[15,10],[15,0]]},o:{width:19,points:[[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3],[16,6],[16,8],[15,11],[13,13],[11,14],[8,14]]},p:{width:19,points:[[4,14],[4,-7],[-1,-1],[4,11],[6,13],[8,14],[11,14],[13,13],[15,11],[16,8],[16,6],[15,3],[13,1],[11,0],[8,0],[6,1],[4,3]]},q:{width:19,points:[[15,14],[15,-7],[-1,-1],[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]]},r:{width:13,points:[[4,14],[4,0],[-1,-1],[4,8],[5,11],[7,13],[9,14],[12,14]]},s:{width:17,points:[[14,11],[13,13],[10,14],[7,14],[4,13],[3,11],[4,9],[6,8],[11,7],[13,6],[14,4],[14,3],[13,1],[10,0],[7,0],[4,1],[3,3]]},t:{width:12,points:[[5,21],[5,4],[6,1],[8,0],[10,0],[-1,-1],[2,14],[9,14]]},u:{width:19,points:[[4,14],[4,4],[5,1],[7,0],[10,0],[12,1],[15,4],[-1,-1],[15,14],[15,0]]},v:{width:16,points:[[2,14],[8,0],[-1,-1],[14,14],[8,0]]},w:{width:22,points:[[3,14],[7,0],[-1,-1],[11,14],[7,0],[-1,-1],[11,14],[15,0],[-1,-1],[19,14],[15,0]]},x:{width:17,points:[[3,14],[14,0],[-1,-1],[14,14],[3,0]]},y:{width:16,points:[[2,14],[8,0],[-1,-1],[14,14],[8,0],[6,-4],[4,-6],[2,-7],[1,-7]]},z:{width:17,points:[[14,14],[3,0],[-1,-1],[3,14],[14,14],[-1,-1],[3,0],[14,0]]},"{":{width:14,points:[[9,25],[7,24],[6,23],[5,21],[5,19],[6,17],[7,16],[8,14],[8,12],[6,10],[-1,-1],[7,24],[6,22],[6,20],[7,18],[8,17],[9,15],[9,13],[8,11],[4,9],[8,7],[9,5],[9,3],[8,1],[7,0],[6,-2],[6,-4],[7,-6],[-1,-1],[6,8],[8,6],[8,4],[7,2],[6,1],[5,-1],[5,-3],[6,-5],[7,-6],[9,-7]]},"|":{width:8,points:[[4,25],[4,-7]]},"}":{width:14,points:[[5,25],[7,24],[8,23],[9,21],[9,19],[8,17],[7,16],[6,14],[6,12],[8,10],[-1,-1],[7,24],[8,22],[8,20],[7,18],[6,17],[5,15],[5,13],[6,11],[10,9],[6,7],[5,5],[5,3],[6,1],[7,0],[8,-2],[8,-4],[7,-6],[-1,-1],[8,8],[6,6],[6,4],[7,2],[8,1],[9,-1],[9,-3],[8,-5],[7,-6],[5,-7]]},"~":{width:24,points:[[3,6],[3,8],[4,11],[6,12],[8,12],[10,11],[14,8],[16,7],[18,7],[20,8],[21,10],[-1,-1],[3,8],[4,10],[6,11],[8,11],[10,10],[14,7],[16,6],[18,6],[20,7],[21,10],[21,12]]}};function Wr(){for(var e,t,r,n,i,o,a,s,u,c=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},l=c.origin||[0,0,0],h=l[0],f=l[1],d=l[2],p=c.size||1,m=[],v=[],y=((""+c.text).trim()||"").split("\n"),g=0,x=0,b=.04,w=0;w(()=>{"use strict";var e={231:e=>{e.exports=require("fs")},423:e=>{e.exports=require("path")}},t={};function r(n){var i=t[n];if(void 0!==i)return i.exports;var o=t[n]={exports:{}};return e[n](o,o.exports,r),o.exports}r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var n={};return(()=>{r.r(n),r.d(n,{ClampToEdgeWrapping:()=>p,GIFMediaType:()=>O,JPEGMediaType:()=>P,LinearFilter:()=>M,LinearMipMapLinearFilter:()=>A,LinearMipMapNearestFilter:()=>I,LinearMipmapLinearFilter:()=>S,LinearMipmapNearestFilter:()=>T,MirroredRepeatWrapping:()=>m,NearestFilter:()=>y,NearestMipMapLinearFilter:()=>w,NearestMipMapNearestFilter:()=>g,NearestMipmapLinearFilter:()=>b,NearestMipmapNearestFilter:()=>x,PNGMediaType:()=>L,RepeatWrapping:()=>d,XKTModel:()=>He,XKT_INFO:()=>f,buildBoxGeometry:()=>zr,buildBoxLinesGeometry:()=>Ur,buildCylinderGeometry:()=>Xr,buildGridGeometry:()=>Rr,buildPlaneGeometry:()=>Kr,buildSphereGeometry:()=>qr,buildTorusGeometry:()=>Zr,buildVectorTextGeometry:()=>Wr,convert2xkt:()=>$r,parseCityJSONIntoXKTModel:()=>Nt,parseGLTFIntoXKTModel:()=>Wt,parseGLTFJSONIntoXKTModel:()=>ar,parseIFCIntoXKTModel:()=>mr,parseLASIntoXKTModel:()=>wr,parseMetaModelIntoXKTModel:()=>Mr,parsePCDIntoXKTModel:()=>Tr,parsePLYIntoXKTModel:()=>Pr,parseSTLIntoXKTModel:()=>Gr,writeXKTModelToArrayBuffer:()=>nt});const e=require("@loaders.gl/polyfills");var t,i,o,a,s,u,c,l,h,f={xktVersion:10},d=1e3,p=1001,m=1002,y=1003,g=1004,x=1004,b=1005,w=1005,M=1006,T=1007,I=1007,S=1008,A=1008,O=1e4,P=10001,L=10002,j=Float64Array,E=new j(16),D=new j(16),G=new j(4),k={MIN_DOUBLE:-Number.MAX_SAFE_INTEGER,MAX_DOUBLE:Number.MAX_SAFE_INTEGER,DEGTORAD:.0174532925,RADTODEG:57.295779513,vec2:function(e){return new j(e||2)},vec3:function(e){return new j(e||3)},vec4:function(e){return new j(e||4)},mat3:function(e){return new j(e||9)},mat3ToMat4:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:new j(16);return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=0,t[4]=e[3],t[5]=e[4],t[6]=e[5],t[7]=0,t[8]=e[6],t[9]=e[7],t[10]=e[8],t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},mat4:function(e){return new j(e||16)},mat4ToMat3:function(e,t){},createUUID:function(){for(var e=[],t=0;t<256;t++)e[t]=(t<16?"0":"")+t.toString(16);return function(){var t=4294967295*Math.random()|0,r=4294967295*Math.random()|0,n=4294967295*Math.random()|0,i=4294967295*Math.random()|0;return"".concat(e[255&t]+e[t>>8&255]+e[t>>16&255]+e[t>>24&255],"-").concat(e[255&r]).concat(e[r>>8&255],"-").concat(e[r>>16&15|64]).concat(e[r>>24&255],"-").concat(e[63&n|128]).concat(e[n>>8&255],"-").concat(e[n>>16&255]).concat(e[n>>24&255]).concat(e[255&i]).concat(e[i>>8&255]).concat(e[i>>16&255]).concat(e[i>>24&255])}}(),clamp:function(e,t,r){return Math.max(t,Math.min(r,e))},fmod:function(e,t){if(e1?1:r,Math.acos(r)},vec3FromMat4Scale:(u=new j(3),function(e,t){return u[0]=e[0],u[1]=e[1],u[2]=e[2],t[0]=k.lenVec3(u),u[0]=e[4],u[1]=e[5],u[2]=e[6],t[1]=k.lenVec3(u),u[0]=e[8],u[1]=e[9],u[2]=e[10],t[2]=k.lenVec3(u),t}),vecToArray:function(){function e(e){return Math.round(1e5*e)/1e5}return function(t){for(var r=0,n=(t=Array.prototype.slice.call(t)).length;r0&&void 0!==arguments[0]?arguments[0]:new j(16);return e[0]=1,e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=1,e[6]=0,e[7]=0,e[8]=0,e[9]=0,e[10]=1,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e},identityMat3:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:new j(9);return e[0]=1,e[1]=0,e[2]=0,e[3]=0,e[4]=1,e[5]=0,e[6]=0,e[7]=0,e[8]=1,e},isIdentityMat4:function(e){return 1===e[0]&&0===e[1]&&0===e[2]&&0===e[3]&&0===e[4]&&1===e[5]&&0===e[6]&&0===e[7]&&0===e[8]&&0===e[9]&&1===e[10]&&0===e[11]&&0===e[12]&&0===e[13]&&0===e[14]&&1===e[15]},negateMat4:function(e,t){return t||(t=e),t[0]=-e[0],t[1]=-e[1],t[2]=-e[2],t[3]=-e[3],t[4]=-e[4],t[5]=-e[5],t[6]=-e[6],t[7]=-e[7],t[8]=-e[8],t[9]=-e[9],t[10]=-e[10],t[11]=-e[11],t[12]=-e[12],t[13]=-e[13],t[14]=-e[14],t[15]=-e[15],t},addMat4:function(e,t,r){return r||(r=e),r[0]=e[0]+t[0],r[1]=e[1]+t[1],r[2]=e[2]+t[2],r[3]=e[3]+t[3],r[4]=e[4]+t[4],r[5]=e[5]+t[5],r[6]=e[6]+t[6],r[7]=e[7]+t[7],r[8]=e[8]+t[8],r[9]=e[9]+t[9],r[10]=e[10]+t[10],r[11]=e[11]+t[11],r[12]=e[12]+t[12],r[13]=e[13]+t[13],r[14]=e[14]+t[14],r[15]=e[15]+t[15],r},addMat4Scalar:function(e,t,r){return r||(r=e),r[0]=e[0]+t,r[1]=e[1]+t,r[2]=e[2]+t,r[3]=e[3]+t,r[4]=e[4]+t,r[5]=e[5]+t,r[6]=e[6]+t,r[7]=e[7]+t,r[8]=e[8]+t,r[9]=e[9]+t,r[10]=e[10]+t,r[11]=e[11]+t,r[12]=e[12]+t,r[13]=e[13]+t,r[14]=e[14]+t,r[15]=e[15]+t,r},addScalarMat4:function(e,t,r){return k.addMat4Scalar(t,e,r)},subMat4:function(e,t,r){return r||(r=e),r[0]=e[0]-t[0],r[1]=e[1]-t[1],r[2]=e[2]-t[2],r[3]=e[3]-t[3],r[4]=e[4]-t[4],r[5]=e[5]-t[5],r[6]=e[6]-t[6],r[7]=e[7]-t[7],r[8]=e[8]-t[8],r[9]=e[9]-t[9],r[10]=e[10]-t[10],r[11]=e[11]-t[11],r[12]=e[12]-t[12],r[13]=e[13]-t[13],r[14]=e[14]-t[14],r[15]=e[15]-t[15],r},subMat4Scalar:function(e,t,r){return r||(r=e),r[0]=e[0]-t,r[1]=e[1]-t,r[2]=e[2]-t,r[3]=e[3]-t,r[4]=e[4]-t,r[5]=e[5]-t,r[6]=e[6]-t,r[7]=e[7]-t,r[8]=e[8]-t,r[9]=e[9]-t,r[10]=e[10]-t,r[11]=e[11]-t,r[12]=e[12]-t,r[13]=e[13]-t,r[14]=e[14]-t,r[15]=e[15]-t,r},subScalarMat4:function(e,t,r){return r||(r=t),r[0]=e-t[0],r[1]=e-t[1],r[2]=e-t[2],r[3]=e-t[3],r[4]=e-t[4],r[5]=e-t[5],r[6]=e-t[6],r[7]=e-t[7],r[8]=e-t[8],r[9]=e-t[9],r[10]=e-t[10],r[11]=e-t[11],r[12]=e-t[12],r[13]=e-t[13],r[14]=e-t[14],r[15]=e-t[15],r},mulMat4:function(e,t,r){r||(r=e);var n=e[0],i=e[1],o=e[2],a=e[3],s=e[4],u=e[5],c=e[6],l=e[7],h=e[8],f=e[9],d=e[10],p=e[11],m=e[12],v=e[13],y=e[14],g=e[15],x=t[0],b=t[1],w=t[2],M=t[3],T=t[4],I=t[5],S=t[6],A=t[7],O=t[8],P=t[9],L=t[10],j=t[11],E=t[12],D=t[13],G=t[14],k=t[15];return r[0]=x*n+b*s+w*h+M*m,r[1]=x*i+b*u+w*f+M*v,r[2]=x*o+b*c+w*d+M*y,r[3]=x*a+b*l+w*p+M*g,r[4]=T*n+I*s+S*h+A*m,r[5]=T*i+I*u+S*f+A*v,r[6]=T*o+I*c+S*d+A*y,r[7]=T*a+I*l+S*p+A*g,r[8]=O*n+P*s+L*h+j*m,r[9]=O*i+P*u+L*f+j*v,r[10]=O*o+P*c+L*d+j*y,r[11]=O*a+P*l+L*p+j*g,r[12]=E*n+D*s+G*h+k*m,r[13]=E*i+D*u+G*f+k*v,r[14]=E*o+D*c+G*d+k*y,r[15]=E*a+D*l+G*p+k*g,r},mulMat3:function(e,t,r){r||(r=new j(9));var n=e[0],i=e[3],o=e[6],a=e[1],s=e[4],u=e[7],c=e[2],l=e[5],h=e[8],f=t[0],d=t[3],p=t[6],m=t[1],v=t[4],y=t[7],g=t[2],x=t[5],b=t[8];return r[0]=n*f+i*m+o*g,r[3]=n*d+i*v+o*x,r[6]=n*p+i*y+o*b,r[1]=a*f+s*m+u*g,r[4]=a*d+s*v+u*x,r[7]=a*p+s*y+u*b,r[2]=c*f+l*m+h*g,r[5]=c*d+l*v+h*x,r[8]=c*p+l*y+h*b,r},mulMat4Scalar:function(e,t,r){return r||(r=e),r[0]=e[0]*t,r[1]=e[1]*t,r[2]=e[2]*t,r[3]=e[3]*t,r[4]=e[4]*t,r[5]=e[5]*t,r[6]=e[6]*t,r[7]=e[7]*t,r[8]=e[8]*t,r[9]=e[9]*t,r[10]=e[10]*t,r[11]=e[11]*t,r[12]=e[12]*t,r[13]=e[13]*t,r[14]=e[14]*t,r[15]=e[15]*t,r},mulMat4v4:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:k.vec4(),n=t[0],i=t[1],o=t[2],a=t[3];return r[0]=e[0]*n+e[4]*i+e[8]*o+e[12]*a,r[1]=e[1]*n+e[5]*i+e[9]*o+e[13]*a,r[2]=e[2]*n+e[6]*i+e[10]*o+e[14]*a,r[3]=e[3]*n+e[7]*i+e[11]*o+e[15]*a,r},transposeMat4:function(e,t){var r=e[4],n=e[14],i=e[8],o=e[13],a=e[12],s=e[9];if(!t||e===t){var u=e[1],c=e[2],l=e[3],h=e[6],f=e[7],d=e[11];return e[1]=r,e[2]=i,e[3]=a,e[4]=u,e[6]=s,e[7]=o,e[8]=c,e[9]=h,e[11]=n,e[12]=l,e[13]=f,e[14]=d,e}return t[0]=e[0],t[1]=r,t[2]=i,t[3]=a,t[4]=e[1],t[5]=e[5],t[6]=s,t[7]=o,t[8]=e[2],t[9]=e[6],t[10]=e[10],t[11]=n,t[12]=e[3],t[13]=e[7],t[14]=e[11],t[15]=e[15],t},transposeMat3:function(e,t){if(t===e){var r=e[1],n=e[2],i=e[5];t[1]=e[3],t[2]=e[6],t[3]=r,t[5]=e[7],t[6]=n,t[7]=i}else t[0]=e[0],t[1]=e[3],t[2]=e[6],t[3]=e[1],t[4]=e[4],t[5]=e[7],t[6]=e[2],t[7]=e[5],t[8]=e[8];return t},determinantMat4:function(e){var t=e[0],r=e[1],n=e[2],i=e[3],o=e[4],a=e[5],s=e[6],u=e[7],c=e[8],l=e[9],h=e[10],f=e[11],d=e[12],p=e[13],m=e[14],v=e[15];return d*l*s*i-c*p*s*i-d*a*h*i+o*p*h*i+c*a*m*i-o*l*m*i-d*l*n*u+c*p*n*u+d*r*h*u-t*p*h*u-c*r*m*u+t*l*m*u+d*a*n*f-o*p*n*f-d*r*s*f+t*p*s*f+o*r*m*f-t*a*m*f-c*a*n*v+o*l*n*v+c*r*s*v-t*l*s*v-o*r*h*v+t*a*h*v},inverseMat4:function(e,t){t||(t=e);var r=e[0],n=e[1],i=e[2],o=e[3],a=e[4],s=e[5],u=e[6],c=e[7],l=e[8],h=e[9],f=e[10],d=e[11],p=e[12],m=e[13],v=e[14],y=e[15],g=r*s-n*a,x=r*u-i*a,b=r*c-o*a,w=n*u-i*s,M=n*c-o*s,T=i*c-o*u,I=l*m-h*p,S=l*v-f*p,A=l*y-d*p,O=h*v-f*m,P=h*y-d*m,L=f*y-d*v,j=1/(g*L-x*P+b*O+w*A-M*S+T*I);return t[0]=(s*L-u*P+c*O)*j,t[1]=(-n*L+i*P-o*O)*j,t[2]=(m*T-v*M+y*w)*j,t[3]=(-h*T+f*M-d*w)*j,t[4]=(-a*L+u*A-c*S)*j,t[5]=(r*L-i*A+o*S)*j,t[6]=(-p*T+v*b-y*x)*j,t[7]=(l*T-f*b+d*x)*j,t[8]=(a*P-s*A+c*I)*j,t[9]=(-r*P+n*A-o*I)*j,t[10]=(p*M-m*b+y*g)*j,t[11]=(-l*M+h*b-d*g)*j,t[12]=(-a*O+s*S-u*I)*j,t[13]=(r*O-n*S+i*I)*j,t[14]=(-p*w+m*x-v*g)*j,t[15]=(l*w-h*x+f*g)*j,t},traceMat4:function(e){return e[0]+e[5]+e[10]+e[15]},translationMat4v:function(e,t){var r=t||k.identityMat4();return r[12]=e[0],r[13]=e[1],r[14]=e[2],r},translationMat3v:function(e,t){var r=t||k.identityMat3();return r[6]=e[0],r[7]=e[1],r},translationMat4c:(s=new j(3),function(e,t,r,n){return s[0]=e,s[1]=t,s[2]=r,k.translationMat4v(s,n)}),translationMat4s:function(e,t){return k.translationMat4c(e,e,e,t)},translateMat4v:function(e,t){return k.translateMat4c(e[0],e[1],e[2],t)},OLDtranslateMat4c:function(e,t,r,n){var i=n[12];n[0]+=i*e,n[4]+=i*t,n[8]+=i*r;var o=n[13];n[1]+=o*e,n[5]+=o*t,n[9]+=o*r;var a=n[14];n[2]+=a*e,n[6]+=a*t,n[10]+=a*r;var s=n[15];return n[3]+=s*e,n[7]+=s*t,n[11]+=s*r,n},translateMat4c:function(e,t,r,n){var i=n[3];n[0]+=i*e,n[1]+=i*t,n[2]+=i*r;var o=n[7];n[4]+=o*e,n[5]+=o*t,n[6]+=o*r;var a=n[11];n[8]+=a*e,n[9]+=a*t,n[10]+=a*r;var s=n[15];return n[12]+=s*e,n[13]+=s*t,n[14]+=s*r,n},rotationMat4v:function(e,t,r){var n,i,o,a,s,u,c=k.normalizeVec4([t[0],t[1],t[2],0],[]),l=Math.sin(e),h=Math.cos(e),f=1-h,d=c[0],p=c[1],m=c[2];return n=d*p,i=p*m,o=m*d,a=d*l,s=p*l,u=m*l,(r=r||k.mat4())[0]=f*d*d+h,r[1]=f*n+u,r[2]=f*o-s,r[3]=0,r[4]=f*n-u,r[5]=f*p*p+h,r[6]=f*i+a,r[7]=0,r[8]=f*o+s,r[9]=f*i-a,r[10]=f*m*m+h,r[11]=0,r[12]=0,r[13]=0,r[14]=0,r[15]=1,r},rotationMat4c:function(e,t,r,n,i){return k.rotationMat4v(e,[t,r,n],i)},scalingMat4v:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:k.identityMat4();return t[0]=e[0],t[5]=e[1],t[10]=e[2],t},scalingMat3v:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:k.identityMat3();return t[0]=e[0],t[4]=e[1],t},scalingMat4c:function(){var e=new j(3);return function(t,r,n,i){return e[0]=t,e[1]=r,e[2]=n,k.scalingMat4v(e,i)}}(),scaleMat4c:function(e,t,r,n){return n[0]*=e,n[4]*=t,n[8]*=r,n[1]*=e,n[5]*=t,n[9]*=r,n[2]*=e,n[6]*=t,n[10]*=r,n[3]*=e,n[7]*=t,n[11]*=r,n},scaleMat4v:function(e,t){var r=e[0],n=e[1],i=e[2];return t[0]*=r,t[4]*=n,t[8]*=i,t[1]*=r,t[5]*=n,t[9]*=i,t[2]*=r,t[6]*=n,t[10]*=i,t[3]*=r,t[7]*=n,t[11]*=i,t},scalingMat4s:function(e){return k.scalingMat4c(e,e,e)},rotationTranslationMat4:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:k.mat4(),n=e[0],i=e[1],o=e[2],a=e[3],s=n+n,u=i+i,c=o+o,l=n*s,h=n*u,f=n*c,d=i*u,p=i*c,m=o*c,v=a*s,y=a*u,g=a*c;return r[0]=1-(d+m),r[1]=h+g,r[2]=f-y,r[3]=0,r[4]=h-g,r[5]=1-(l+m),r[6]=p+v,r[7]=0,r[8]=f+y,r[9]=p-v,r[10]=1-(l+d),r[11]=0,r[12]=t[0],r[13]=t[1],r[14]=t[2],r[15]=1,r},mat4ToEuler:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:k.vec4(),n=k.clamp,i=e[0],o=e[4],a=e[8],s=e[1],u=e[5],c=e[9],l=e[2],h=e[6],f=e[10];return"XYZ"===t?(r[1]=Math.asin(n(a,-1,1)),Math.abs(a)<.99999?(r[0]=Math.atan2(-c,f),r[2]=Math.atan2(-o,i)):(r[0]=Math.atan2(h,u),r[2]=0)):"YXZ"===t?(r[0]=Math.asin(-n(c,-1,1)),Math.abs(c)<.99999?(r[1]=Math.atan2(a,f),r[2]=Math.atan2(s,u)):(r[1]=Math.atan2(-l,i),r[2]=0)):"ZXY"===t?(r[0]=Math.asin(n(h,-1,1)),Math.abs(h)<.99999?(r[1]=Math.atan2(-l,f),r[2]=Math.atan2(-o,u)):(r[1]=0,r[2]=Math.atan2(s,i))):"ZYX"===t?(r[1]=Math.asin(-n(l,-1,1)),Math.abs(l)<.99999?(r[0]=Math.atan2(h,f),r[2]=Math.atan2(s,i)):(r[0]=0,r[2]=Math.atan2(-o,u))):"YZX"===t?(r[2]=Math.asin(n(s,-1,1)),Math.abs(s)<.99999?(r[0]=Math.atan2(-c,u),r[1]=Math.atan2(-l,i)):(r[0]=0,r[1]=Math.atan2(a,f))):"XZY"===t&&(r[2]=Math.asin(-n(o,-1,1)),Math.abs(o)<.99999?(r[0]=Math.atan2(h,u),r[1]=Math.atan2(a,i)):(r[0]=Math.atan2(-c,f),r[1]=0)),r},composeMat4:function(e,t,r){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:k.mat4();return k.quaternionToRotationMat4(t,n),k.scaleMat4v(r,n),k.translateMat4v(e,n),n},decomposeMat4:function(){var e=new j(3),t=new j(16);return function(r,n,i,o){e[0]=r[0],e[1]=r[1],e[2]=r[2];var a=k.lenVec3(e);e[0]=r[4],e[1]=r[5],e[2]=r[6];var s=k.lenVec3(e);e[8]=r[8],e[9]=r[9],e[10]=r[10];var u=k.lenVec3(e);k.determinantMat4(r)<0&&(a=-a),n[0]=r[12],n[1]=r[13],n[2]=r[14],t.set(r);var c=1/a,l=1/s,h=1/u;return t[0]*=c,t[1]*=c,t[2]*=c,t[4]*=l,t[5]*=l,t[6]*=l,t[8]*=h,t[9]*=h,t[10]*=h,k.mat4ToQuaternion(t,i),o[0]=a,o[1]=s,o[2]=u,this}}(),lookAtMat4v:function(e,t,r,n){n||(n=k.mat4());var i,o,a,s,u,c,l,h,f,d,p=e[0],m=e[1],v=e[2],y=r[0],g=r[1],x=r[2],b=t[0],w=t[1],M=t[2];return p===b&&m===w&&v===M?k.identityMat4():(i=p-b,o=m-w,a=v-M,s=g*(a*=d=1/Math.sqrt(i*i+o*o+a*a))-x*(o*=d),u=x*(i*=d)-y*a,c=y*o-g*i,(d=Math.sqrt(s*s+u*u+c*c))?(s*=d=1/d,u*=d,c*=d):(s=0,u=0,c=0),l=o*c-a*u,h=a*s-i*c,f=i*u-o*s,(d=Math.sqrt(l*l+h*h+f*f))?(l*=d=1/d,h*=d,f*=d):(l=0,h=0,f=0),n[0]=s,n[1]=l,n[2]=i,n[3]=0,n[4]=u,n[5]=h,n[6]=o,n[7]=0,n[8]=c,n[9]=f,n[10]=a,n[11]=0,n[12]=-(s*p+u*m+c*v),n[13]=-(l*p+h*m+f*v),n[14]=-(i*p+o*m+a*v),n[15]=1,n)},lookAtMat4c:function(e,t,r,n,i,o,a,s,u){return k.lookAtMat4v([e,t,r],[n,i,o],[a,s,u],[])},orthoMat4c:function(e,t,r,n,i,o,a){a||(a=k.mat4());var s=t-e,u=n-r,c=o-i;return a[0]=2/s,a[1]=0,a[2]=0,a[3]=0,a[4]=0,a[5]=2/u,a[6]=0,a[7]=0,a[8]=0,a[9]=0,a[10]=-2/c,a[11]=0,a[12]=-(e+t)/s,a[13]=-(n+r)/u,a[14]=-(o+i)/c,a[15]=1,a},frustumMat4v:function(e,t,r){r||(r=k.mat4());var n=[e[0],e[1],e[2],0],i=[t[0],t[1],t[2],0];k.addVec4(i,n,E),k.subVec4(i,n,D);var o=2*n[2],a=D[0],s=D[1],u=D[2];return r[0]=o/a,r[1]=0,r[2]=0,r[3]=0,r[4]=0,r[5]=o/s,r[6]=0,r[7]=0,r[8]=E[0]/a,r[9]=E[1]/s,r[10]=-E[2]/u,r[11]=-1,r[12]=0,r[13]=0,r[14]=-o*i[2]/u,r[15]=0,r},frustumMat4:function(e,t,r,n,i,o,a){a||(a=k.mat4());var s=t-e,u=n-r,c=o-i;return a[0]=2*i/s,a[1]=0,a[2]=0,a[3]=0,a[4]=0,a[5]=2*i/u,a[6]=0,a[7]=0,a[8]=(t+e)/s,a[9]=(n+r)/u,a[10]=-(o+i)/c,a[11]=-1,a[12]=0,a[13]=0,a[14]=-o*i*2/c,a[15]=0,a},perspectiveMat4:function(e,t,r,n,i){var o=[],a=[];return o[2]=r,a[2]=n,a[1]=o[2]*Math.tan(e/2),o[1]=-a[1],a[0]=a[1]*t,o[0]=-a[0],k.frustumMat4v(o,a,i)},transformPoint3:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:k.vec3(),n=t[0],i=t[1],o=t[2];return r[0]=e[0]*n+e[4]*i+e[8]*o+e[12],r[1]=e[1]*n+e[5]*i+e[9]*o+e[13],r[2]=e[2]*n+e[6]*i+e[10]*o+e[14],r},transformPoint4:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:k.vec4();return r[0]=e[0]*t[0]+e[4]*t[1]+e[8]*t[2]+e[12]*t[3],r[1]=e[1]*t[0]+e[5]*t[1]+e[9]*t[2]+e[13]*t[3],r[2]=e[2]*t[0]+e[6]*t[1]+e[10]*t[2]+e[14]*t[3],r[3]=e[3]*t[0]+e[7]*t[1]+e[11]*t[2]+e[15]*t[3],r},transformPoints3:function(e,t,r){for(var n,i,o,a,s,u=r||[],c=t.length,l=e[0],h=e[1],f=e[2],d=e[3],p=e[4],m=e[5],v=e[6],y=e[7],g=e[8],x=e[9],b=e[10],w=e[11],M=e[12],T=e[13],I=e[14],S=e[15],A=0;A2&&void 0!==arguments[2]?arguments[2]:t,s=t.length,u=e[0],c=e[1],l=e[2],h=e[3],f=e[4],d=e[5],p=e[6],m=e[7],v=e[8],y=e[9],g=e[10],x=e[11],b=e[12],w=e[13],M=e[14],T=e[15];for(r=0;r2&&void 0!==arguments[2]?arguments[2]:t,s=t.length,u=e[0],c=e[1],l=e[2],h=e[3],f=e[4],d=e[5],p=e[6],m=e[7],v=e[8],y=e[9],g=e[10],x=e[11],b=e[12],w=e[13],M=e[14],T=e[15];for(r=0;r0&&void 0!==arguments[0]?arguments[0]:k.vec4();return e[0]=0,e[1]=0,e[2]=0,e[3]=1,e},eulerToQuaternion:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:k.vec4(),n=e[0]*k.DEGTORAD/2,i=e[1]*k.DEGTORAD/2,o=e[2]*k.DEGTORAD/2,a=Math.cos(n),s=Math.cos(i),u=Math.cos(o),c=Math.sin(n),l=Math.sin(i),h=Math.sin(o);return"XYZ"===t?(r[0]=c*s*u+a*l*h,r[1]=a*l*u-c*s*h,r[2]=a*s*h+c*l*u,r[3]=a*s*u-c*l*h):"YXZ"===t?(r[0]=c*s*u+a*l*h,r[1]=a*l*u-c*s*h,r[2]=a*s*h-c*l*u,r[3]=a*s*u+c*l*h):"ZXY"===t?(r[0]=c*s*u-a*l*h,r[1]=a*l*u+c*s*h,r[2]=a*s*h+c*l*u,r[3]=a*s*u-c*l*h):"ZYX"===t?(r[0]=c*s*u-a*l*h,r[1]=a*l*u+c*s*h,r[2]=a*s*h-c*l*u,r[3]=a*s*u+c*l*h):"YZX"===t?(r[0]=c*s*u+a*l*h,r[1]=a*l*u+c*s*h,r[2]=a*s*h-c*l*u,r[3]=a*s*u-c*l*h):"XZY"===t&&(r[0]=c*s*u-a*l*h,r[1]=a*l*u-c*s*h,r[2]=a*s*h+c*l*u,r[3]=a*s*u+c*l*h),r},mat4ToQuaternion:function(e){var t,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:k.vec4(),n=e[0],i=e[4],o=e[8],a=e[1],s=e[5],u=e[9],c=e[2],l=e[6],h=e[10],f=n+s+h;return f>0?(t=.5/Math.sqrt(f+1),r[3]=.25/t,r[0]=(l-u)*t,r[1]=(o-c)*t,r[2]=(a-i)*t):n>s&&n>h?(t=2*Math.sqrt(1+n-s-h),r[3]=(l-u)/t,r[0]=.25*t,r[1]=(i+a)/t,r[2]=(o+c)/t):s>h?(t=2*Math.sqrt(1+s-n-h),r[3]=(o-c)/t,r[0]=(i+a)/t,r[1]=.25*t,r[2]=(u+l)/t):(t=2*Math.sqrt(1+h-n-s),r[3]=(a-i)/t,r[0]=(o+c)/t,r[1]=(u+l)/t,r[2]=.25*t),r},vec3PairToQuaternion:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:k.vec4(),n=Math.sqrt(k.dotVec3(e,e)*k.dotVec3(t,t)),i=n+k.dotVec3(e,t);return i<1e-8*n?(i=0,Math.abs(e[0])>Math.abs(e[2])?(r[0]=-e[1],r[1]=e[0],r[2]=0):(r[0]=0,r[1]=-e[2],r[2]=e[1])):k.cross3Vec3(e,t,r),r[3]=i,k.normalizeQuaternion(r)},angleAxisToQuaternion:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:k.vec4(),r=e[3]/2,n=Math.sin(r);return t[0]=n*e[0],t[1]=n*e[1],t[2]=n*e[2],t[3]=Math.cos(r),t},quaternionToEuler:function(){var e=new j(16);return function(t,r,n){return n=n||k.vec3(),k.quaternionToRotationMat4(t,e),k.mat4ToEuler(e,r,n),n}}(),mulQuaternions:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:k.vec4(),n=e[0],i=e[1],o=e[2],a=e[3],s=t[0],u=t[1],c=t[2],l=t[3];return r[0]=a*s+n*l+i*c-o*u,r[1]=a*u+i*l+o*s-n*c,r[2]=a*c+o*l+n*u-i*s,r[3]=a*l-n*s-i*u-o*c,r},vec3ApplyQuaternion:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:k.vec3(),n=t[0],i=t[1],o=t[2],a=e[0],s=e[1],u=e[2],c=e[3],l=c*n+s*o-u*i,h=c*i+u*n-a*o,f=c*o+a*i-s*n,d=-a*n-s*i-u*o;return r[0]=l*c+d*-a+h*-u-f*-s,r[1]=h*c+d*-s+f*-a-l*-u,r[2]=f*c+d*-u+l*-s-h*-a,r},quaternionToMat4:function(e,t){t=k.identityMat4(t);var r=e[0],n=e[1],i=e[2],o=e[3],a=2*r,s=2*n,u=2*i,c=a*o,l=s*o,h=u*o,f=a*r,d=s*r,p=u*r,m=s*n,v=u*n,y=u*i;return t[0]=1-(m+y),t[1]=d+h,t[2]=p-l,t[4]=d-h,t[5]=1-(f+y),t[6]=v+c,t[8]=p+l,t[9]=v-c,t[10]=1-(f+m),t},quaternionToRotationMat4:function(e,t){var r=e[0],n=e[1],i=e[2],o=e[3],a=r+r,s=n+n,u=i+i,c=r*a,l=r*s,h=r*u,f=n*s,d=n*u,p=i*u,m=o*a,v=o*s,y=o*u;return t[0]=1-(f+p),t[4]=l-y,t[8]=h+v,t[1]=l+y,t[5]=1-(c+p),t[9]=d-m,t[2]=h-v,t[6]=d+m,t[10]=1-(c+f),t[3]=0,t[7]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},normalizeQuaternion:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:e,r=k.lenVec4([e[0],e[1],e[2],e[3]]);return t[0]=e[0]/r,t[1]=e[1]/r,t[2]=e[2]/r,t[3]=e[3]/r,t},conjugateQuaternion:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:e;return t[0]=-e[0],t[1]=-e[1],t[2]=-e[2],t[3]=e[3],t},inverseQuaternion:function(e,t){return k.normalizeQuaternion(k.conjugateQuaternion(e,t))},quaternionToAngleAxis:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:k.vec4(),r=(e=k.normalizeQuaternion(e,G))[3],n=2*Math.acos(r),i=Math.sqrt(1-r*r);return i<.001?(t[0]=e[0],t[1]=e[1],t[2]=e[2]):(t[0]=e[0]/i,t[1]=e[1]/i,t[2]=e[2]/i),t[3]=n,t},AABB3:function(e){return new j(e||6)},AABB2:function(e){return new j(e||4)},OBB3:function(e){return new j(e||32)},OBB2:function(e){return new j(e||16)},Sphere3:function(e,t,r,n){return new j([e,t,r,n])},transformOBB3:function(e,t){var r,n,i,o,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t,s=t.length,u=e[0],c=e[1],l=e[2],h=e[3],f=e[4],d=e[5],p=e[6],m=e[7],v=e[8],y=e[9],g=e[10],x=e[11],b=e[12],w=e[13],M=e[14],T=e[15];for(r=0;rs?a:s,o[1]+=u>c?u:c,o[2]+=l>h?l:h,Math.abs(k.lenVec3(o))}}(),getAABB3Center:function(e,t){var r=t||k.vec3();return r[0]=(e[0]+e[3])/2,r[1]=(e[1]+e[4])/2,r[2]=(e[2]+e[5])/2,r},getAABB2Center:function(e,t){var r=t||k.vec2();return r[0]=(e[2]+e[0])/2,r[1]=(e[3]+e[1])/2,r},collapseAABB3:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:k.AABB3();return e[0]=k.MAX_DOUBLE,e[1]=k.MAX_DOUBLE,e[2]=k.MAX_DOUBLE,e[3]=-k.MAX_DOUBLE,e[4]=-k.MAX_DOUBLE,e[5]=-k.MAX_DOUBLE,e},AABB3ToOBB3:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:k.OBB3();return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=1,t[4]=e[3],t[5]=e[1],t[6]=e[2],t[7]=1,t[8]=e[3],t[9]=e[4],t[10]=e[2],t[11]=1,t[12]=e[0],t[13]=e[4],t[14]=e[2],t[15]=1,t[16]=e[0],t[17]=e[1],t[18]=e[5],t[19]=1,t[20]=e[3],t[21]=e[1],t[22]=e[5],t[23]=1,t[24]=e[3],t[25]=e[4],t[26]=e[5],t[27]=1,t[28]=e[0],t[29]=e[4],t[30]=e[5],t[31]=1,t},positions3ToAABB3:(t=new j(3),function(e,r,n){r=r||k.AABB3();for(var i,o,a,s=k.MAX_DOUBLE,u=k.MAX_DOUBLE,c=k.MAX_DOUBLE,l=-k.MAX_DOUBLE,h=-k.MAX_DOUBLE,f=-k.MAX_DOUBLE,d=0,p=e.length;dl&&(l=i),o>h&&(h=o),a>f&&(f=a);return r[0]=s,r[1]=u,r[2]=c,r[3]=l,r[4]=h,r[5]=f,r}),OBB3ToAABB3:function(e){for(var t,r,n,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:k.AABB3(),o=k.MAX_DOUBLE,a=k.MAX_DOUBLE,s=k.MAX_DOUBLE,u=-k.MAX_DOUBLE,c=-k.MAX_DOUBLE,l=-k.MAX_DOUBLE,h=0,f=e.length;hu&&(u=t),r>c&&(c=r),n>l&&(l=n);return i[0]=o,i[1]=a,i[2]=s,i[3]=u,i[4]=c,i[5]=l,i},points3ToAABB3:function(e){for(var t,r,n,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:k.AABB3(),o=k.MAX_DOUBLE,a=k.MAX_DOUBLE,s=k.MAX_DOUBLE,u=-k.MAX_DOUBLE,c=-k.MAX_DOUBLE,l=-k.MAX_DOUBLE,h=0,f=e.length;hu&&(u=t),r>c&&(c=r),n>l&&(l=n);return i[0]=o,i[1]=a,i[2]=s,i[3]=u,i[4]=c,i[5]=l,i},points3ToSphere3:function(){var e=new j(3);return function(t,r){r=r||k.vec4();var n,i=0,o=0,a=0,s=t.length;for(n=0;nc&&(c=u);return r[3]=c,r}}(),positions3ToSphere3:function(){var e=new j(3),t=new j(3);return function(r,n){n=n||k.vec4();var i,o=0,a=0,s=0,u=r.length,c=0;for(i=0;ic&&(c=l);return n[3]=c,n}}(),OBB3ToSphere3:function(){var e=new j(3),t=new j(3);return function(r,n){n=n||k.vec4();var i,o=0,a=0,s=0,u=r.length,c=u/4;for(i=0;ih&&(h=l);return n[3]=h,n}}(),getSphere3Center:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:k.vec3();return t[0]=e[0],t[1]=e[1],t[2]=e[2],t},expandAABB3:function(e,t){return e[0]>t[0]&&(e[0]=t[0]),e[1]>t[1]&&(e[1]=t[1]),e[2]>t[2]&&(e[2]=t[2]),e[3]t[0]&&(e[0]=t[0]),e[1]>t[1]&&(e[1]=t[1]),e[2]>t[2]&&(e[2]=t[2]),e[3]3&&void 0!==arguments[3]?arguments[3]:k.vec3(),i=t[0]-e[0],o=t[1]-e[1],a=t[2]-e[2],s=r[0]-e[0],u=r[1]-e[1],c=r[2]-e[2],l=o*c-a*u,h=a*s-i*c,f=i*u-o*s,d=Math.sqrt(l*l+h*h+f*f);return 0===d?(n[0]=0,n[1]=0,n[2]=0):(n[0]=l/d,n[1]=h/d,n[2]=f/d),n}};function _(e,t,r,n){var i=e[t]/(Math.abs(e[t])+Math.abs(e[t+1])+Math.abs(e[t+2])),o=e[t+1]/(Math.abs(e[t])+Math.abs(e[t+1])+Math.abs(e[t+2]));if(e[t+2]<0){var a=(1-Math.abs(o))*(i>=0?1:-1),s=(1-Math.abs(i))*(o>=0?1:-1);i=a,o=s}return new Int8Array([Math[r](127.5*i+(i<0?-1:0)),Math[n](127.5*o+(o<0?-1:0))])}function F(e){var t=e[0],r=e[1];t/=t<0?127:128,r/=r<0?127:128;var n=1-Math.abs(t)-Math.abs(r);n<0&&(t=(1-Math.abs(r))*(t>=0?1:-1),r=(1-Math.abs(t))*(r>=0?1:-1));var i=Math.sqrt(t*t+r*r+n*n);return[t/i,r/i,n/i]}function N(e,t,r){return e[t]*r[0]+e[t+1]*r[1]+e[t+2]*r[2]}var V,C,B,z,U,X,R,K,q,Z,Y,W,Q,J,H,$,ee,te={quantizePositions:function(e,t,r,n){for(var i=r[0],o=r[1],a=r[2],s=65535,u=s/(r[3]-i),c=s/(r[4]-o),l=s/(r[5]-a),h=function(e){return e>=0?e:0},f=0;fu&&(a=o,u=s),(s=N(h,0,F(o=_(h,0,"floor","ceil"))))>u&&(a=o,u=s),(s=N(h,0,F(o=_(h,0,"ceil","ceil"))))>u&&(a=o,u=s),n[i+c+0]=a[0],n[i+c+1]=a[1],n[i+c+2]=0;return i+r},octEncodeNormals:function(e,t,r,n){for(var i,o,a,s,u=0;us&&(o=i,s=a),(a=N(e,u,F(i=_(e,u,"floor","ceil"))))>s&&(o=i,s=a),(a=N(e,u,F(i=_(e,u,"ceil","ceil"))))>s&&(o=i,s=a),r[n+u+0]=o[0],r[n+u+1]=o[1],r[n+u+2]=0;return n+t}},re=(V=[],C=[],B=[],z=[],U=[],X=0,R=new Uint16Array(3),K=new Uint16Array(3),q=new Uint16Array(3),Z=k.vec3(),Y=k.vec3(),W=k.vec3(),Q=k.vec3(),J=k.vec3(),H=k.vec3(),$=k.vec3(),ee=k.vec3(),function(e,t,r,n){!function(e,t){var r,n,i,o,a,s,u={},c=Math.pow(10,4),l=0;for(a=0,s=e.length;av&&T>v)continue}d=B[c.index1],p=B[c.index2],(!g&&d>65535||p>65535)&&(g=!0),m.push(d),m.push(p)}return g?new Uint32Array(m):new Uint16Array(m)}),ne=function(e,t,r,n){function i(e,r){for(var n,i,o=0;o<3;o++)if((n=t[3*e+o])!==(i=t[3*r+o]))return i-n;return 0}for(var o=e.slice().sort(i),a=null,s=0,u=o.length;sf&&h>d?f>d?(p=h,m=f,v=d):(p=h,m=d,v=f):f>h&&f>d?h>d?(p=f,m=h,v=d):(p=f,m=d,v=h):d>h&&d>f&&(h>f?(p=d,m=h,v=f):(p=d,m=f,v=h)),n[c+0]=[p,m],n[c+1]=[m,v],p>v){var y=v;v=p,p=y}n[c+2]=[v,p]}function g(e,t){for(var r,n,i=0;i<2;i++)if(r=e[i],(n=t[i])!==r)return n-r;return 0}(n=n.slice(0,e.length)).sort(g);for(var x=0,b=0;b0&&2!==x)};function ie(e){return ie="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},ie(e)}function oe(e,t){for(var r=0;r1}}])&&ce(t.prototype,r),Object.defineProperty(t,"prototype",{writable:!1}),e}();function he(e){return he="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},he(e)}function fe(e,t){for(var r=0;r=0;--i){var o=this.tryEntries[i],a=o.completion;if("root"===o.tryLoc)return n("end");if(o.tryLoc<=this.prev){var s=r.call(o,"catchLoc"),u=r.call(o,"finallyLoc");if(s&&u){if(this.prev=0;--n){var i=this.tryEntries[n];if(i.tryLoc<=this.prev&&r.call(i,"finallyLoc")&&this.prev=0;--t){var r=this.tryEntries[t];if(r.finallyLoc===e)return this.complete(r.completion,r.afterLoc),I(r),h}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.tryLoc===e){var n=r.completion;if("throw"===n.type){var i=n.arg;I(r)}return i}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,r){return this.delegate={iterator:A(e),resultName:t,nextLoc:r},"next"===this.method&&(this.arg=void 0),h}},e}function Re(e,t,r,n,i,o,a){try{var s=e[o](a),u=s.value}catch(e){return void r(e)}s.done?t(u):Promise.resolve(u).then(n,i)}function Ke(e,t){for(var r=0;r0&&void 0!==arguments[0]?arguments[0]:{};!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.modelId=t.modelId||"default",this.projectId=t.projectId||"",this.revisionId=t.revisionId||"",this.author=t.author||"",this.createdAt=t.createdAt||"",this.creatingApplication=t.creatingApplication||"",this.schema=t.schema||"",this.xktVersion=f.xktVersion,this.edgeThreshold=t.edgeThreshold||10,this.minTileSize=t.minTileSize||500,this.modelAABB=t.modelAABB,this.propertySets={},this.propertySetsList=[],this.metaObjects={},this.metaObjectsList=[],this.reusedGeometriesDecodeMatrix=new Float32Array(16),this.geometries={},this.geometriesList=[],this.textures={},this.texturesList=[],this.textureSets={},this.textureSetsList=[],this.meshes={},this.meshesList=[],this.entities={},this.entitiesList=[],this.tilesList=[],this.aabb=k.AABB3(),this.finalized=!1}var t,r,n,i;return t=e,r=[{key:"createPropertySet",value:function(e){if(!e)throw"Parameters expected: params";if(null===e.propertySetId||void 0===e.propertySetId)throw"Parameter expected: params.propertySetId";if(null===e.properties||void 0===e.properties)throw"Parameter expected: params.properties";if(this.finalized)console.error("XKTModel has been finalized, can't add more property sets");else if(!this.propertySets[e.propertySetId]){var t=e.propertySetId,r=e.propertySetType||"Default",n=e.propertySetName||e.propertySetId,i=e.properties||[],o=new je(t,r,n,i);return this.propertySets[t]=o,this.propertySetsList.push(o),o}}},{key:"createMetaObject",value:function(e){if(!e)throw"Parameters expected: params";if(null===e.metaObjectId||void 0===e.metaObjectId)throw"Parameter expected: params.metaObjectId";if(this.finalized)console.error("XKTModel has been finalized, can't add more meta objects");else if(!this.metaObjects[e.metaObjectId]){var t=e.metaObjectId,r=e.propertySetIds,n=e.metaObjectType||"Default",i=e.metaObjectName||e.metaObjectId,o=e.parentMetaObjectId,a=new Ae(t,r,n,i,o);return this.metaObjects[t]=a,this.metaObjectsList.push(a),o||this._rootMetaObject||(this._rootMetaObject=a),a}}},{key:"createTexture",value:function(e){if(!e)throw"Parameters expected: params";if(null===e.textureId||void 0===e.textureId)throw"Parameter expected: params.textureId";if(!e.imageData&&!e.src)throw"Parameter expected: params.imageData or params.src";if(this.finalized)console.error("XKTModel has been finalized, can't add more textures");else{if(!this.textures[e.textureId]){if(e.src){var t=e.src.split(".").pop();if("jpg"!==t&&"jpeg"!==t&&"png"!==t)return void console.error("XKTModel does not support image files with extension '".concat(t,"' - won't create texture '").concat(e.textureId))}var r=e.textureId,n=new ke({textureId:r,imageData:e.imageData,mediaType:e.mediaType,minFilter:e.minFilter,magFilter:e.magFilter,wrapS:e.wrapS,wrapT:e.wrapT,wrapR:e.wrapR,width:e.width,height:e.height,compressed:!1!==e.compressed,src:e.src});return this.textures[r]=n,this.texturesList.push(n),n}console.error("XKTTexture already exists with this ID: "+e.textureId)}}},{key:"createTextureSet",value:function(e){if(!e)throw"Parameters expected: params";if(null===e.textureSetId||void 0===e.textureSetId)throw"Parameter expected: params.textureSetId";if(this.finalized)console.error("XKTModel has been finalized, can't add more textureSets");else{if(!this.textureSets[e.textureSetId]){var t,r,n,i,o;if(void 0!==e.colorTextureId&&null!==e.colorTextureId){if(!(t=this.textures[e.colorTextureId]))return void console.error("Texture not found: ".concat(e.colorTextureId," - ensure that you create it first with createTexture()"));t.channel=0}if(void 0!==e.metallicRoughnessTextureId&&null!==e.metallicRoughnessTextureId){if(!(r=this.textures[e.metallicRoughnessTextureId]))return void console.error("Texture not found: ".concat(e.metallicRoughnessTextureId," - ensure that you create it first with createTexture()"));r.channel=1}if(void 0!==e.normalsTextureId&&null!==e.normalsTextureId){if(!(n=this.textures[e.normalsTextureId]))return void console.error("Texture not found: ".concat(e.normalsTextureId," - ensure that you create it first with createTexture()"));n.channel=2}if(void 0!==e.emissiveTextureId&&null!==e.emissiveTextureId){if(!(i=this.textures[e.emissiveTextureId]))return void console.error("Texture not found: ".concat(e.emissiveTextureId," - ensure that you create it first with createTexture()"));i.channel=3}if(void 0!==e.occlusionTextureId&&null!==e.occlusionTextureId){if(!(o=this.textures[e.occlusionTextureId]))return void console.error("Texture not found: ".concat(e.occlusionTextureId," - ensure that you create it first with createTexture()"));o.channel=4}var a=new Ve({textureSetId:e.textureSetId,textureSetIndex:this.textureSetsList.length,colorTexture:t,metallicRoughnessTexture:r,normalsTexture:n,emissiveTexture:i,occlusionTexture:o});return this.textureSets[e.textureSetId]=a,this.textureSetsList.push(a),a}console.error("XKTTextureSet already exists with this ID: "+e.textureSetId)}}},{key:"createGeometry",value:function(e){if(!e)throw"Parameters expected: params";if(null===e.geometryId||void 0===e.geometryId)throw"Parameter expected: params.geometryId";if(!e.primitiveType)throw"Parameter expected: params.primitiveType";if(!e.positions)throw"Parameter expected: params.positions";var t="triangles"===e.primitiveType,r="points"===e.primitiveType,n="lines"===e.primitiveType,i="line-strip"===e.primitiveType;if(e.primitiveType,e.primitiveType,!(t||r||n||i))throw"Unsupported value for params.primitiveType: "+e.primitiveType+"' - supported values are 'triangles', 'points', 'lines', 'line-strip', 'triangle-strip' and 'triangle-fan";if(t&&!e.indices)throw e.indices=this._createDefaultIndices(),"Parameter expected for 'triangles' primitive: params.indices";if(r&&!e.colors&&!e.colorsCompressed)throw"Parameter expected for 'points' primitive: params.colors or params.colorsCompressed";if(n&&!e.indices)throw"Parameter expected for 'lines' primitive: params.indices";if(this.finalized)console.error("XKTModel has been finalized, can't add more geometries");else{if(!this.geometries[e.geometryId]){var o=e.geometryId,a=e.primitiveType,s=new Float64Array(e.positions),u={geometryId:o,geometryIndex:this.geometriesList.length,primitiveType:a,positions:s,uvs:e.uvs||e.uv};if(t&&(e.normals&&(u.normals=new Float32Array(e.normals)),e.indices?u.indices=e.indices:u.indices=this._createDefaultIndices(s.length/3)),r)if(e.colorsCompressed)u.colorsCompressed=new Uint8Array(e.colorsCompressed);else{for(var c=e.colors,l=new Uint8Array(c.length),h=0,f=c.length;h1)te.octEncodeNormals(n.normals,n.normals.length,n.normalsOctEncoded,0);else{var i=k.inverseMat4(k.transposeMat4(r.matrix,Ye),We);te.transformAndOctEncodeNormals(i,n.normals,n.normals.length,n.normalsOctEncoded,0)}}}},{key:"_createEntityAABBs",value:function(){for(var e=0,t=this.entitiesList.length;e1)for(var l=u.positions,h=0,f=l.length;hQe[i]&&(i=1),Qe[2]>Qe[i]&&(i=2),!e.left){var o=r.slice();if(o[i+3]=(r[i]+r[i+3])/2,e.left=new Me(o),k.containsAABB3(o,n))return void this._insertEntityIntoKDTree(e.left,t)}if(!e.right){var a=r.slice();if(a[i]=(r[i]+r[i+3])/2,e.right=new Me(a),k.containsAABB3(a,n))return void this._insertEntityIntoKDTree(e.right,t)}e.entities=e.entities||[],e.entities.push(t),k.expandAABB3(r,n)}}},{key:"_createTilesFromKDTree",value:function(e){this._createTilesFromKDNode(e)}},{key:"_createTilesFromKDNode",value:function(e){e.entities&&e.entities.length>0&&this._createTileFromEntities(e),e.left&&this._createTilesFromKDNode(e.left),e.right&&this._createTilesFromKDNode(e.right)}},{key:"_createTileFromEntities",value:function(e){var t=e.aabb,r=e.entities,n=k.getAABB3Center(t),i=k.mulVec3Scalar(n,-1,k.vec3()),o=k.AABB3();o[0]=t[0]-n[0],o[1]=t[1]-n[1],o[2]=t[2]-n[2],o[3]=t[3]-n[0],o[4]=t[4]-n[1],o[5]=t[5]-n[2];for(var a=0;a0){te.createPositionsDecodeMatrix(t,this.reusedGeometriesDecodeMatrix);for(var c=0,l=this.geometriesList.length;ce&&(e=i.positionsQuantized.length),i.indices.length>t&&(t=i.indices.length))}for(var o=new Array(e/3),a=new Array(t),s=0,u=this.geometriesList.length;s1&&(S+=16);var D={metadata:{},textureData:new Uint8Array(A),eachTextureDataPortion:new Uint32Array(p),eachTextureAttributes:new Uint16Array(p*tt),positions:new Uint16Array(x),normals:new Int8Array(b),colors:new Uint8Array(w),uvs:new Float32Array(M),indices:new Uint32Array(T),edgeIndices:new Uint32Array(I),eachTextureSetTextures:new Int32Array(5*m),matrices:new Float32Array(S),reusedGeometriesDecodeMatrix:new Float32Array(e.reusedGeometriesDecodeMatrix),eachGeometryPrimitiveType:new Uint8Array(d),eachGeometryPositionsPortion:new Uint32Array(d),eachGeometryNormalsPortion:new Uint32Array(d),eachGeometryColorsPortion:new Uint32Array(d),eachGeometryUVsPortion:new Uint32Array(d),eachGeometryIndicesPortion:new Uint32Array(d),eachGeometryEdgeIndicesPortion:new Uint32Array(d),eachMeshGeometriesPortion:new Uint32Array(v),eachMeshMatricesPortion:new Uint32Array(v),eachMeshTextureSet:new Int32Array(v),eachMeshMaterialAttributes:new Uint8Array(v*rt),eachEntityId:[],eachEntityMeshesPortion:new Uint32Array(y),eachTileAABB:new Float64Array(6*g),eachTileEntitiesPortion:new Uint32Array(g)},G=0,k=0,_=0,F=0,N=0,V=0;D.metadata={id:e.modelId,projectId:e.projectId,revisionId:e.revisionId,author:e.author,createdAt:e.createdAt,creatingApplication:e.creatingApplication,schema:e.schema,propertySets:[],metaObjects:[]};for(var C=0;C0&&(R.propertySetIds=X.propertySetIds),X.external&&(R.external=X.external),D.metadata.metaObjects.push(R)}for(var K=0;K1&&(D.matrices.set(xe.matrix,se),D.eachMeshMatricesPortion[ue]=se,se+=16),D.eachMeshTextureSet[ue]=xe.textureSet?xe.textureSet.textureSetIndex:-1,D.eachMeshMaterialAttributes[ae++]=255*xe.color[0],D.eachMeshMaterialAttributes[ae++]=255*xe.color[1],D.eachMeshMaterialAttributes[ae++]=255*xe.color[2],D.eachMeshMaterialAttributes[ae++]=255*xe.opacity,D.eachMeshMaterialAttributes[ae++]=255*xe.metallic,D.eachMeshMaterialAttributes[ae++]=255*xe.roughness,ue++}D.eachEntityId[ie]=me.entityId,D.eachEntityMeshesPortion[ie]=oe,ie++,oe+=ye}var we=6*ce;D.eachTileAABB.set(de,we)}}return D}(e,t,r),o=function(e,t,r){function n(e){return!1!==r.zip?$e.deflate(e):e}return{metadata:n(it(t||e.metadata)),textureData:n(e.textureData.buffer),eachTextureDataPortion:n(e.eachTextureDataPortion.buffer),eachTextureAttributes:n(e.eachTextureAttributes.buffer),positions:n(e.positions.buffer),normals:n(e.normals.buffer),colors:n(e.colors.buffer),uvs:n(e.uvs.buffer),indices:n(e.indices.buffer),edgeIndices:n(e.edgeIndices.buffer),eachTextureSetTextures:n(e.eachTextureSetTextures.buffer),matrices:n(e.matrices.buffer),reusedGeometriesDecodeMatrix:n(e.reusedGeometriesDecodeMatrix.buffer),eachGeometryPrimitiveType:n(e.eachGeometryPrimitiveType.buffer),eachGeometryPositionsPortion:n(e.eachGeometryPositionsPortion.buffer),eachGeometryNormalsPortion:n(e.eachGeometryNormalsPortion.buffer),eachGeometryColorsPortion:n(e.eachGeometryColorsPortion.buffer),eachGeometryUVsPortion:n(e.eachGeometryUVsPortion.buffer),eachGeometryIndicesPortion:n(e.eachGeometryIndicesPortion.buffer),eachGeometryEdgeIndicesPortion:n(e.eachGeometryEdgeIndicesPortion.buffer),eachMeshGeometriesPortion:n(e.eachMeshGeometriesPortion.buffer),eachMeshMatricesPortion:n(e.eachMeshMatricesPortion.buffer),eachMeshTextureSet:n(e.eachMeshTextureSet.buffer),eachMeshMaterialAttributes:n(e.eachMeshMaterialAttributes.buffer),eachEntityId:n(JSON.stringify(e.eachEntityId).replace(/[\u007F-\uFFFF]/g,(function(e){return"\\u"+("0000"+e.charCodeAt(0).toString(16)).substr(-4)}))),eachEntityMeshesPortion:n(e.eachEntityMeshesPortion.buffer),eachTileAABB:n(e.eachTileAABB.buffer),eachTileEntitiesPortion:n(e.eachTileEntitiesPortion.buffer)}}(i,t,n);r.texturesSize+=o.textureData.byteLength;var a=function(e){return function(e){var t=new Uint32Array(e.length+2);t[0]=et,t[1]=e.length;for(var r=0,n=0,i=e.length;n80*r){n=o=e[0],i=a=e[1];for(var p=r;po&&(o=s),u>a&&(a=u);c=0!==(c=Math.max(o-n,a-i))?1/c:0}return ut(f,d,r,n,i,c),d}function at(e,t,r,n,i){var o,a;if(i===jt(e,t,r,n)>0)for(o=t;o=t;o-=n)a=Ot(o,e[o],e[o+1],a);return a&&wt(a,a.next)&&(Pt(a),a=a.next),a}function st(e,t){if(!e)return e;t||(t=e);var r,n=e;do{if(r=!1,n.steiner||!wt(n,n.next)&&0!==bt(n.prev,n,n.next))n=n.next;else{if(Pt(n),(n=t=n.prev)===n.next)break;r=!0}}while(r||n!==t);return t}function ut(e,t,r,n,i,o,a){if(e){!a&&o&&function(e,t,r,n){var i=e;do{null===i.z&&(i.z=vt(i.x,i.y,t,r,n)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next}while(i!==e);i.prevZ.nextZ=null,i.prevZ=null,function(e){var t,r,n,i,o,a,s,u,c=1;do{for(r=e,e=null,o=null,a=0;r;){for(a++,n=r,s=0,t=0;t0||u>0&&n;)0!==s&&(0===u||!n||r.z<=n.z)?(i=r,r=r.nextZ,s--):(i=n,n=n.nextZ,u--),o?o.nextZ=i:e=i,i.prevZ=o,o=i;r=n}o.nextZ=null,c*=2}while(a>1)}(i)}(e,n,i,o);for(var s,u,c=e;e.prev!==e.next;)if(s=e.prev,u=e.next,o?lt(e,n,i,o):ct(e))t.push(s.i/r),t.push(e.i/r),t.push(u.i/r),Pt(e),e=u.next,c=u.next;else if((e=u)===c){a?1===a?ut(e=ht(st(e),t,r),t,r,n,i,o,2):2===a&&ft(e,t,r,n,i,o):ut(st(e),t,r,n,i,o,1);break}}}function ct(e){var t=e.prev,r=e,n=e.next;if(bt(t,r,n)>=0)return!1;for(var i=e.next.next;i!==e.prev;){if(gt(t.x,t.y,r.x,r.y,n.x,n.y,i.x,i.y)&&bt(i.prev,i,i.next)>=0)return!1;i=i.next}return!0}function lt(e,t,r,n){var i=e.prev,o=e,a=e.next;if(bt(i,o,a)>=0)return!1;for(var s=i.xo.x?i.x>a.x?i.x:a.x:o.x>a.x?o.x:a.x,l=i.y>o.y?i.y>a.y?i.y:a.y:o.y>a.y?o.y:a.y,h=vt(s,u,t,r,n),f=vt(c,l,t,r,n),d=e.prevZ,p=e.nextZ;d&&d.z>=h&&p&&p.z<=f;){if(d!==e.prev&&d!==e.next&>(i.x,i.y,o.x,o.y,a.x,a.y,d.x,d.y)&&bt(d.prev,d,d.next)>=0)return!1;if(d=d.prevZ,p!==e.prev&&p!==e.next&>(i.x,i.y,o.x,o.y,a.x,a.y,p.x,p.y)&&bt(p.prev,p,p.next)>=0)return!1;p=p.nextZ}for(;d&&d.z>=h;){if(d!==e.prev&&d!==e.next&>(i.x,i.y,o.x,o.y,a.x,a.y,d.x,d.y)&&bt(d.prev,d,d.next)>=0)return!1;d=d.prevZ}for(;p&&p.z<=f;){if(p!==e.prev&&p!==e.next&>(i.x,i.y,o.x,o.y,a.x,a.y,p.x,p.y)&&bt(p.prev,p,p.next)>=0)return!1;p=p.nextZ}return!0}function ht(e,t,r){var n=e;do{var i=n.prev,o=n.next.next;!wt(i,o)&&Mt(i,n,n.next,o)&&St(i,o)&&St(o,i)&&(t.push(i.i/r),t.push(n.i/r),t.push(o.i/r),Pt(n),Pt(n.next),n=e=o),n=n.next}while(n!==e);return st(n)}function ft(e,t,r,n,i,o){var a=e;do{for(var s=a.next.next;s!==a.prev;){if(a.i!==s.i&&xt(a,s)){var u=At(a,s);return a=st(a,a.next),u=st(u,u.next),ut(a,t,r,n,i,o),void ut(u,t,r,n,i,o)}s=s.next}a=a.next}while(a!==e)}function dt(e,t){return e.x-t.x}function pt(e,t){if(t=function(e,t){var r,n=t,i=e.x,o=e.y,a=-1/0;do{if(o<=n.y&&o>=n.next.y&&n.next.y!==n.y){var s=n.x+(o-n.y)*(n.next.x-n.x)/(n.next.y-n.y);if(s<=i&&s>a){if(a=s,s===i){if(o===n.y)return n;if(o===n.next.y)return n.next}r=n.x=n.x&&n.x>=l&&i!==n.x&>(or.x||n.x===r.x&&mt(r,n)))&&(r=n,f=u)),n=n.next}while(n!==c);return r}(e,t),t){var r=At(t,e);st(t,t.next),st(r,r.next)}}function mt(e,t){return bt(e.prev,e,t.prev)<0&&bt(t.next,e,e.next)<0}function vt(e,t,r,n,i){return(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=32767*(e-r)*i)|e<<8))|e<<4))|e<<2))|e<<1))|(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=32767*(t-n)*i)|t<<8))|t<<4))|t<<2))|t<<1))<<1}function yt(e){var t=e,r=e;do{(t.x=0&&(e-a)*(n-s)-(r-a)*(t-s)>=0&&(r-a)*(o-s)-(i-a)*(n-s)>=0}function xt(e,t){return e.next.i!==t.i&&e.prev.i!==t.i&&!function(e,t){var r=e;do{if(r.i!==e.i&&r.next.i!==e.i&&r.i!==t.i&&r.next.i!==t.i&&Mt(r,r.next,e,t))return!0;r=r.next}while(r!==e);return!1}(e,t)&&(St(e,t)&&St(t,e)&&function(e,t){var r=e,n=!1,i=(e.x+t.x)/2,o=(e.y+t.y)/2;do{r.y>o!=r.next.y>o&&r.next.y!==r.y&&i<(r.next.x-r.x)*(o-r.y)/(r.next.y-r.y)+r.x&&(n=!n),r=r.next}while(r!==e);return n}(e,t)&&(bt(e.prev,e,t.prev)||bt(e,t.prev,t))||wt(e,t)&&bt(e.prev,e,e.next)>0&&bt(t.prev,t,t.next)>0)}function bt(e,t,r){return(t.y-e.y)*(r.x-t.x)-(t.x-e.x)*(r.y-t.y)}function wt(e,t){return e.x===t.x&&e.y===t.y}function Mt(e,t,r,n){var i=It(bt(e,t,r)),o=It(bt(e,t,n)),a=It(bt(r,n,e)),s=It(bt(r,n,t));return i!==o&&a!==s||!(0!==i||!Tt(e,r,t))||!(0!==o||!Tt(e,n,t))||!(0!==a||!Tt(r,e,n))||!(0!==s||!Tt(r,t,n))}function Tt(e,t,r){return t.x<=Math.max(e.x,r.x)&&t.x>=Math.min(e.x,r.x)&&t.y<=Math.max(e.y,r.y)&&t.y>=Math.min(e.y,r.y)}function It(e){return e>0?1:e<0?-1:0}function St(e,t){return bt(e.prev,e,e.next)<0?bt(e,t,e.next)>=0&&bt(e,e.prev,t)>=0:bt(e,t,e.prev)<0||bt(e,e.next,t)<0}function At(e,t){var r=new Lt(e.i,e.x,e.y),n=new Lt(t.i,t.x,t.y),i=e.next,o=t.prev;return e.next=t,t.prev=e,r.next=i,i.prev=r,n.next=r,r.prev=n,o.next=n,n.prev=o,n}function Ot(e,t,r,n){var i=new Lt(e,t,r);return n?(i.next=n.next,i.prev=n,n.next.prev=i,n.next=i):(i.prev=i,i.next=i),i}function Pt(e){e.next.prev=e.prev,e.prev.next=e.next,e.prevZ&&(e.prevZ.nextZ=e.nextZ),e.nextZ&&(e.nextZ.prevZ=e.prevZ)}function Lt(e,t,r){this.i=e,this.x=t,this.y=r,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}function jt(e,t,r,n){for(var i=0,o=t,a=r-n;oe.length)&&(t=e.length);for(var r=0,n=new Array(t);r0&&(n+=e[i-1].length,r.holes.push(n))}return r};var Gt=k.vec2(),kt=k.vec3(),_t=k.vec3(),Ft=k.vec3();function Nt(e){var t=e.data,r=e.xktModel,n=e.center,i=void 0!==n&&n,o=e.transform,a=void 0===o?null:o,s=e.stats,u=void 0===s?{}:s,c=e.log;return new Promise((function(e,n){if(t)if("CityJSON"===t.type)if(r){var o;c("Using parser: parseCityJSONIntoXKTModel"),c("center: ".concat(i)),a&&c("transform: [".concat(a,"]")),t.transform||i||a?(o=function(e){for(var t=[],r=0,n=0;r0){for(var c=[],l=0,h=t.geometry.length;l0){var x=y[g[0]];if(void 0!==x.value)d=v[x.value];else{var b=x.values;if(b){p=[];for(var w=0,M=b.length;w0&&(n.createEntity({entityId:r,meshIds:c}),e.stats.numObjects++)}}function Bt(e,t,r,n){switch(t.type){case"MultiPoint":case"MultiLineString":case"GeometryInstance":break;case"MultiSurface":case"CompositeSurface":zt(e,r,t.boundaries,n);break;case"Solid":for(var i=t.boundaries,o=0;o0&&l.push(c.length);var p=Rt(e,s[d],h,f);c.push.apply(c,Et(p))}if(3===c.length)f.indices.push(c[0]),f.indices.push(c[1]),f.indices.push(c[2]);else if(c.length>3){for(var m=[],v=0;v0&&s.push(a.length);var c=Rt(e,t[o][u],r,n);a.push.apply(a,Et(c))}if(3===a.length)n.indices.push(a[0]),n.indices.push(a[1]),n.indices.push(a[2]);else if(a.length>3){for(var l=[],h=0;h0)for(var u=0;u0){null==g&&e.log("Warning: 'name' properties not found on glTF scene nodes - will randomly-generate object IDs in XKT");var x=g;for(x&&o.entities[x]&&e.log("Warning: Two or more glTF nodes found with same 'name' attribute: '".concat(g," - will randomly-generating an object ID in XKT"));!x||o.entities[x];)x="entity-"+e.nextId++;if(e.metaModelCorrections){var b=e.metaModelCorrections.eachChildRoot[x];if(b){var w=e.metaModelCorrections.eachRootStats[b.id];w.countChildren++,w.countChildren>=w.numChildren&&(o.createEntity({entityId:b.id,meshIds:tr}),e.stats.numObjects++,tr.length=0)}else e.metaModelCorrections.metaObjectsMap[x]&&(o.createEntity({entityId:x,meshIds:tr}),e.stats.numObjects++,tr.length=0)}else o.createEntity({entityId:x,meshIds:tr}),e.stats.numObjects++,tr.length=0}}var nr="undefined"!=typeof atob?atob:function(e){return Buffer.from(e,"base64").toString("binary")},ir={5120:Int8Array,5121:Uint8Array,5122:Int16Array,5123:Uint16Array,5125:Uint32Array,5126:Float32Array},or={SCALAR:1,VEC2:2,VEC3:3,VEC4:4,MAT2:4,MAT3:9,MAT4:16};function ar(e){var t=e.data,r=e.xktModel,n=e.metaModelData,i=e.includeNormals,o=e.reuseGeometries,a=e.getAttachment,s=e.stats,u=void 0===s?{}:s,c=e.log;return c&&c("Using parser: parseGLTFJSONIntoXKTModel"),new Promise((function(e,s){if(t)if(r){u.sourceFormat="glTF",u.schemaVersion="2.0",u.title="",u.author="",u.created="",u.numTriangles=0,u.numVertices=0,u.numNormals=0,u.numObjects=0,u.numGeometries=0;var l={gltf:t,metaModelCorrections:n?sr(n):null,getAttachment:a||function(){throw new Error("You must define getAttachment() method to convert glTF with external resources")},log:c||function(e){},xktModel:r,includeNormals:i,createXKTGeometryIds:{},nextMeshId:0,reuseGeometries:!1!==o,stats:u};l.log("Parsing normals: ".concat(l.includeNormals?"enabled":"disabled")),function(e){var t=e.gltf.buffers;return t?Promise.all(t.map((function(t){return function(e,t){return new Promise((function(r,n){if(t._arrayBuffer)return t._buffer=t._arrayBuffer,void r(t);var i=t.uri;i?function(e,t){return new Promise((function(r,n){var i=t.match(/^data:(.*?)(;base64)?,(.*)$/);if(i){var o=!!i[2],a=i[3];a=decodeURIComponent(a),o&&(a=nr(a));for(var s=new ArrayBuffer(a.length),u=new Uint8Array(s),c=0;c0)for(var l=0;l0){null==E&&e.log("[parseGLTFJSONIntoXKTModel] Warning: 'name' properties not found on glTF scene nodes - will randomly-generate object IDs in XKT");var D=E;if(null==D)for(a.entities[D]&&e.error("Two or more glTF nodes found with same 'name' attribute: '"+E+"'");!D||a.entities[D];)D="entity-"+e.nextId++;if(e.metaModelCorrections){var G=e.metaModelCorrections.eachChildRoot[D];if(G){var _=e.metaModelCorrections.eachRootStats[G.id];_.countChildren++,_.countChildren>=_.numChildren&&(a.createEntity({entityId:G.id,meshIds:lr}),e.stats.numObjects++,lr=[])}else e.metaModelCorrections.metaObjectsMap[D]&&(a.createEntity({entityId:D,meshIds:lr}),e.stats.numObjects++,lr=[])}else a.createEntity({entityId:D,meshIds:lr}),e.stats.numObjects++,lr=[]}}function fr(e){if(!e.attributes)return"empty";var t=e.mode,r=(e.material,e.indices),n=e.attributes.POSITION,i=e.attributes.NORMAL,o=e.attributes.COLOR_0,a=e.attributes.TEXCOORD_0;return[t,null!=r?r:"-",null!=n?n:"-",null!=i?i:"-",null!=o?o:"-",null!=a?a:"-"].join(";")}function dr(e,t,r){var n=t.attributes;if(n){switch(t.mode){case 0:r.primitive="points";break;case 1:case 2:case 3:r.primitive="lines";break;case 4:default:r.primitive="triangles";break;case 5:console.log("TRIANGLE_STRIP"),r.primitive="triangles";break;case 6:console.log("TRIANGLE_FAN"),r.primitive="triangles"}var i=e.gltf.accessors,o=t.indices;if(null!=o){var a=i[o];r.indices=pr(e,a)}var s=n.POSITION;if(null!=s){var u=i[s];r.positions=pr(e,u)}var c=n.NORMAL;if(null!=c){var l=i[c];r.normals=pr(e,l)}var h=n.COLOR_0;if(null!=h){var f=i[h];r.colors=pr(e,f)}}}function pr(e,t){var r=e.gltf.bufferViews[t.bufferView],n=or[t.type],i=ir[t.componentType],o=i.BYTES_PER_ELEMENT*n;if(t.byteStride&&t.byteStride!==o)throw new Error("interleaved buffer!");return new i(r._buffer,t.byteOffset||0,t.count*n)}function mr(e){var t=e.WebIFC,r=e.data,n=e.xktModel,i=e.autoNormals,o=void 0===i||i,a=e.includeTypes,s=e.excludeTypes,u=e.wasmPath,c=e.stats,l=void 0===c?{}:c,h=e.log;return h&&h("Using parser: parseIFCIntoXKTModel"),new Promise((function(e,i){if(r)if(n)if(u){var c=new t.IfcAPI;u&&c.SetWasmPath(u),c.Init().then((function(){var i=new Uint8Array(r),u=c.OpenModel(i);l.sourceFormat="IFC",l.schemaVersion="",l.title="",l.author="",l.created="",l.numMetaObjects=0,l.numPropertySets=0,l.numObjects=0,l.numGeometries=0,l.numTriangles=0,l.numVertices=0;var f={WebIFC:t,modelID:u,ifcAPI:c,xktModel:n,autoNormals:o,log:h||function(e){},nextId:0,stats:l};if(a){f.includeTypes={};for(var d=0,p=a.length;d0){for(var d=o.Name.value,p=[],m=0,v=f.length;m0&&(e.xktModel.createEntity({entityId:o,meshIds:i}),e.stats.numObjects++)}else console.log("excluding: "+a)}const xr=require("@loaders.gl/las");var br=5e5;function wr(e){var t=e.data,r=e.xktModel,n=e.center,i=void 0!==n&&n,o=e.transform,a=void 0===o?null:o,s=e.colorDepth,u=void 0===s?"auto":s,c=e.fp64,l=void 0!==c&&c,h=e.skip,f=void 0===h?1:h,d=e.stats,p=e.log,m=void 0===p?function(){}:p;return m&&m("Using parser: parseLASIntoXKTModel"),new Promise((function(e,n){t?r?(m("Converting LAZ/LAS"),m("center: ".concat(i)),a&&m("transform: [".concat(a,"]")),m("colorDepth: ".concat(u)),m("fp64: ".concat(l)),m("skip: ".concat(f)),(0,Ce.parse)(t,xr.LASLoader,{las:{colorDepth:u,fp64:l}}).then((function(t){var n=t.attributes,o=t.loaderData,s=void 0!==o.pointsFormatId?o.pointsFormatId:-1;if(n.POSITION){var u={};switch(s){case 0:if(!n.intensity)return void m("No intensities found in file (expected for LAS point format 0)");u=y(n.POSITION,n.intensity);break;case 1:if(!n.intensity)return void m("No intensities found in file (expected for LAS point format 1)");u=y(n.POSITION,n.intensity);break;case 2:if(!n.intensity)return void m("No intensities found in file (expected for LAS point format 2)");u=v(n.POSITION,n.COLOR_0,n.intensity);break;case 3:if(!n.intensity)return void m("No intensities found in file (expected for LAS point format 3)");u=v(n.POSITION,n.COLOR_0,n.intensity)}for(var c=g(function(e){if(e){if(i){for(var t=k.vec3(),r=e.length,n=0,o=e.length;n=e.length)return[e];for(var r=[],n=0;n0?P:null}),M++}}o&&o("Converted meta objects: "+M),e()}))}function Tr(e){var t=e.data,r=e.xktModel,n=e.littleEndian,i=void 0===n||n,o=e.stats,a=e.log;return a&&a("Using parser: parsePCDIntoXKTModel"),new Promise((function(e,n){var s=function(e){if("undefined"!=typeof TextDecoder)return(new TextDecoder).decode(e);for(var t="",r=0,n=e.length;r>16&255,g=v>>8&255,x=v>>0&255;l.push(y,g,x,255)}else l.push(255),l.push(255),l.push(255)}if("binary_compressed"===u.data)for(var b=new Uint32Array(t.slice(u.headerLen,u.headerLen+8)),w=b[0],M=b[1],T=function(e,t){var r,n,i,o=e.length,a=new Uint8Array(t),s=0,u=0;do{if((r=e[s++])<32){if(u+ ++r>t)throw new Error("Output buffer is not large enough");if(s+r>o)throw new Error("Invalid compressed data");do{a[u++]=e[s++]}while(--r)}else{if(n=r>>5,i=u-((31&r)<<8)-1,s>=o)throw new Error("Invalid compressed data");if(7===n&&(n+=e[s++],s>=o))throw new Error("Invalid compressed data");if(i-=e[s++],u+n+2>t)throw new Error("Output buffer is not large enough");if(i<0)throw new Error("Invalid compressed data");if(i>=u)throw new Error("Invalid compressed data");do{a[u++]=a[i++]}while(2+--n)}}while(s0?l:null}),r.createMesh({meshId:"pointsMesh",geometryId:"pointsGeometry"}),r.createEntity({entityId:"geometries",meshIds:["pointsMesh"]}),a&&(a("Converted drawable objects: 1"),a("Converted geometries: 1"),a("Converted vertices: "+c.length/3)),o&&(o.sourceFormat="PCD",o.schemaVersion="",o.title="",o.author="",o.created="",o.numObjects=1,o.numGeometries=1,o.numVertices=c.length/3),e()}))}const Ir=require("@loaders.gl/ply");function Sr(e){return Sr="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Sr(e)}function Ar(){Ar=function(){return e};var e={},t=Object.prototype,r=t.hasOwnProperty,n=Object.defineProperty||function(e,t,r){e[t]=r.value},i="function"==typeof Symbol?Symbol:{},o=i.iterator||"@@iterator",a=i.asyncIterator||"@@asyncIterator",s=i.toStringTag||"@@toStringTag";function u(e,t,r){return Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{u({},"")}catch(e){u=function(e,t,r){return e[t]=r}}function c(e,t,r,i){var o=t&&t.prototype instanceof f?t:f,a=Object.create(o.prototype),s=new S(i||[]);return n(a,"_invoke",{value:w(e,r,s)}),a}function l(e,t,r){try{return{type:"normal",arg:e.call(t,r)}}catch(e){return{type:"throw",arg:e}}}e.wrap=c;var h={};function f(){}function d(){}function p(){}var m={};u(m,o,(function(){return this}));var v=Object.getPrototypeOf,y=v&&v(v(A([])));y&&y!==t&&r.call(y,o)&&(m=y);var g=p.prototype=f.prototype=Object.create(m);function x(e){["next","throw","return"].forEach((function(t){u(e,t,(function(e){return this._invoke(t,e)}))}))}function b(e,t){function i(n,o,a,s){var u=l(e[n],e,o);if("throw"!==u.type){var c=u.arg,h=c.value;return h&&"object"==Sr(h)&&r.call(h,"__await")?t.resolve(h.__await).then((function(e){i("next",e,a,s)}),(function(e){i("throw",e,a,s)})):t.resolve(h).then((function(e){c.value=e,a(c)}),(function(e){return i("throw",e,a,s)}))}s(u.arg)}var o;n(this,"_invoke",{value:function(e,r){function n(){return new t((function(t,n){i(e,r,t,n)}))}return o=o?o.then(n,n):n()}})}function w(e,t,r){var n="suspendedStart";return function(i,o){if("executing"===n)throw new Error("Generator is already running");if("completed"===n){if("throw"===i)throw o;return{value:void 0,done:!0}}for(r.method=i,r.arg=o;;){var a=r.delegate;if(a){var s=M(a,r);if(s){if(s===h)continue;return s}}if("next"===r.method)r.sent=r._sent=r.arg;else if("throw"===r.method){if("suspendedStart"===n)throw n="completed",r.arg;r.dispatchException(r.arg)}else"return"===r.method&&r.abrupt("return",r.arg);n="executing";var u=l(e,t,r);if("normal"===u.type){if(n=r.done?"completed":"suspendedYield",u.arg===h)continue;return{value:u.arg,done:r.done}}"throw"===u.type&&(n="completed",r.method="throw",r.arg=u.arg)}}}function M(e,t){var r=t.method,n=e.iterator[r];if(void 0===n)return t.delegate=null,"throw"===r&&e.iterator.return&&(t.method="return",t.arg=void 0,M(e,t),"throw"===t.method)||"return"!==r&&(t.method="throw",t.arg=new TypeError("The iterator does not provide a '"+r+"' method")),h;var i=l(n,e.iterator,t.arg);if("throw"===i.type)return t.method="throw",t.arg=i.arg,t.delegate=null,h;var o=i.arg;return o?o.done?(t[e.resultName]=o.value,t.next=e.nextLoc,"return"!==t.method&&(t.method="next",t.arg=void 0),t.delegate=null,h):o:(t.method="throw",t.arg=new TypeError("iterator result is not an object"),t.delegate=null,h)}function T(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function I(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function S(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(T,this),this.reset(!0)}function A(e){if(e){var t=e[o];if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var n=-1,i=function t(){for(;++n=0;--i){var o=this.tryEntries[i],a=o.completion;if("root"===o.tryLoc)return n("end");if(o.tryLoc<=this.prev){var s=r.call(o,"catchLoc"),u=r.call(o,"finallyLoc");if(s&&u){if(this.prev=0;--n){var i=this.tryEntries[n];if(i.tryLoc<=this.prev&&r.call(i,"finallyLoc")&&this.prev=0;--t){var r=this.tryEntries[t];if(r.finallyLoc===e)return this.complete(r.completion,r.afterLoc),I(r),h}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.tryLoc===e){var n=r.completion;if("throw"===n.type){var i=n.arg;I(r)}return i}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,r){return this.delegate={iterator:A(e),resultName:t,nextLoc:r},"next"===this.method&&(this.arg=void 0),h}},e}function Or(e,t,r,n,i,o,a){try{var s=e[o](a),u=s.value}catch(e){return void r(e)}s.done?t(u):Promise.resolve(u).then(n,i)}function Pr(e){return Lr.apply(this,arguments)}function Lr(){var e;return e=Ar().mark((function e(t){var r,n,i,o,a,s,u,c,l,h,f;return Ar().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(r=t.data,n=t.xktModel,i=t.stats,(o=t.log)&&o("Using parser: parsePLYIntoXKTModel"),r){e.next=4;break}throw"Argument expected: data";case 4:if(n){e.next=6;break}throw"Argument expected: xktModel";case 6:return e.prev=6,e.next=9,(0,Ce.parse)(r,Ir.PLYLoader);case 9:a=e.sent,e.next=16;break;case 12:return e.prev=12,e.t0=e.catch(6),o&&o("Error: "+e.t0),e.abrupt("return");case 16:if(s=a.attributes,u=!!s.COLOR_0){for(c=u?s.COLOR_0.value:null,l=[],h=0,f=c.length;h=0;--i){var o=this.tryEntries[i],a=o.completion;if("root"===o.tryLoc)return n("end");if(o.tryLoc<=this.prev){var s=r.call(o,"catchLoc"),u=r.call(o,"finallyLoc");if(s&&u){if(this.prev=0;--n){var i=this.tryEntries[n];if(i.tryLoc<=this.prev&&r.call(i,"finallyLoc")&&this.prev=0;--t){var r=this.tryEntries[t];if(r.finallyLoc===e)return this.complete(r.completion,r.afterLoc),I(r),h}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.tryLoc===e){var n=r.completion;if("throw"===n.type){var i=n.arg;I(r)}return i}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,r){return this.delegate={iterator:A(e),resultName:t,nextLoc:r},"next"===this.method&&(this.arg=void 0),h}},e}function Dr(e,t,r,n,i,o,a){try{var s=e[o](a),u=s.value}catch(e){return void r(e)}s.done?t(u):Promise.resolve(u).then(n,i)}function Gr(e){return kr.apply(this,arguments)}function kr(){var e;return e=Er().mark((function e(t){var r,n,i,o,a,s,u,c;return Er().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=t.data,n=t.splitMeshes,i=t.autoNormals,o=t.smoothNormals,a=t.smoothNormalsAngleThreshold,s=t.xktModel,u=t.stats,(c=t.log)&&c("Using parser: parseSTLIntoXKTModel"),e.abrupt("return",new Promise((function(e,t){if(r)if(s){var l=k.createUUID(),h=s.createMetaObject({metaObjectId:l,metaObjectType:"Model",metaObjectName:"Model"}),f={data:r,splitMeshes:n,autoNormals:i,smoothNormals:o,smoothNormalsAngleThreshold:a,xktModel:s,rootMetaObject:h,nextId:0,log:c||function(e){},stats:{numObjects:0,numGeometries:0,numTriangles:0,numVertices:0}},d=Br(r);_r(d)?Fr(f,d):Nr(f,"string"!=typeof(p=r)?function(e){if("undefined"!=typeof TextDecoder)return(new TextDecoder).decode(e);for(var t="",r=0,n=e.length;r>5&31)/31,i=(S>>10&31)/31):(r=a,n=s,i=u),(x&&r!==f||n!==d||i!==p)&&(null!==f&&(m=!0),f=r,d=n,p=i)}for(var A=1;A<=3;A++){var O=w+12*A;y.push(c.getFloat32(O,!0)),y.push(c.getFloat32(O+4,!0)),y.push(c.getFloat32(O+8,!0)),e.autoNormals||g.push(M,T,I),h&&o.push(r,n,i,1)}x&&m&&(Cr(e,y,g,o),y=[],g=[],o=o?[]:null,m=!1)}y.length>0&&Cr(e,y,g,o)}function Nr(e,t){for(var r,n,i,o,a,s,u,c=/facet([\s\S]*?)endfacet/g,l=0,h=/[\s]+([+-]?(?:\d+.\d+|\d+.|\d+|.\d+)(?:[eE][+-]?\d+)?)/.source,f=new RegExp("vertex"+h+h+h,"g"),d=new RegExp("normal"+h+h+h,"g"),p=[],m=[];null!==(o=c.exec(t));){for(a=0,s=0,u=o[0];null!==(o=d.exec(u));)r=parseFloat(o[1]),n=parseFloat(o[2]),i=parseFloat(o[3]),s++;for(;null!==(o=f.exec(u));)p.push(parseFloat(o[1]),parseFloat(o[2]),parseFloat(o[3])),m.push(r,n,i),a++;if(1!==s)return e.log("Error in normal of face "+l),-1;if(3!==a)return e.log("Error in positions of face "+l),-1;l++}Cr(e,p,m,null)}var Vr=0;function Cr(e,t,r,n){for(var i=new Int32Array(t.length/3),o=0,a=i.length;o0?r:null,n=n&&n.length>0?n:null,!e.autoNormals&&e.smoothNormals&&function(e,t){var r,n,i,o,a,s,u,c,l,h,f,d=(arguments.length>2&&void 0!==arguments[2]?arguments[2]:{}).smoothNormalsAngleThreshold||20,p={},m=[],v={},y=Math.pow(10,4);for(u=0,l=e.length;u0&&void 0!==arguments[0]?arguments[0]:{},t=e.xSize||1;t<0&&(console.error("negative xSize not allowed - will invert"),t*=-1);var r=e.ySize||1;r<0&&(console.error("negative ySize not allowed - will invert"),r*=-1);var n=e.zSize||1;n<0&&(console.error("negative zSize not allowed - will invert"),n*=-1);var i=e.center,o=i?i[0]:0,a=i?i[1]:0,s=i?i[2]:0,u=-t+o,c=-r+a,l=-n+s,h=t+o,f=r+a,d=n+s;return{primitiveType:"triangles",positions:[h,f,d,u,f,d,u,c,d,h,c,d,h,f,d,h,c,d,h,c,l,h,f,l,h,f,d,h,f,l,u,f,l,u,f,d,u,f,d,u,f,l,u,c,l,u,c,d,u,c,l,h,c,l,h,c,d,u,c,d,h,c,l,u,c,l,u,f,l,h,f,l],normals:[0,0,1,0,0,1,0,0,1,0,0,1,1,0,0,1,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1],uv:[1,0,0,0,0,1,1,1,0,0,0,1,1,1,1,0,1,1,1,0,0,0,0,1,1,0,0,0,0,1,1,1,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0],indices:[0,1,2,0,2,3,4,5,6,4,6,7,8,9,10,8,10,11,12,13,14,12,14,15,16,17,18,16,18,19,20,21,22,20,22,23]}}function Ur(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.xSize||1;t<0&&(console.error("negative xSize not allowed - will invert"),t*=-1);var r=e.ySize||1;r<0&&(console.error("negative ySize not allowed - will invert"),r*=-1);var n=e.zSize||1;n<0&&(console.error("negative zSize not allowed - will invert"),n*=-1);var i=e.center,o=i?i[0]:0,a=i?i[1]:0,s=i?i[2]:0,u=-t+o,c=-r+a,l=-n+s,h=t+o,f=r+a,d=n+s;return{primitiveType:"lines",positions:[u,c,l,u,c,d,u,f,l,u,f,d,h,c,l,h,c,d,h,f,l,h,f,d],indices:[0,1,1,3,3,2,2,0,4,5,5,7,7,6,6,4,0,4,1,5,2,6,3,7]}}function Xr(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.radiusTop||1;t<0&&(console.error("negative radiusTop not allowed - will invert"),t*=-1);var r=e.radiusBottom||1;r<0&&(console.error("negative radiusBottom not allowed - will invert"),r*=-1);var n=e.height||1;n<0&&(console.error("negative height not allowed - will invert"),n*=-1);var i=e.radialSegments||32;i<0&&(console.error("negative radialSegments not allowed - will invert"),i*=-1),i<3&&(i=3);var o=e.heightSegments||1;o<0&&(console.error("negative heightSegments not allowed - will invert"),o*=-1),o<1&&(o=1);var a,s,u,c,l,h,f,d,p,m,v,y=!!e.openEnded,g=e.center,x=g?g[0]:0,b=g?g[1]:0,w=g?g[2]:0,M=n/2,T=n/o,I=2*Math.PI/i,S=1/i,A=(t-r)/o,O=[],P=[],L=[],j=[],E=(90-180*Math.atan(n/(r-t))/Math.PI)/90;for(a=0;a<=o;a++)for(l=t-a*A,h=M-a*T,s=0;s<=i;s++)u=Math.sin(s*I),c=Math.cos(s*I),P.push(l*u),P.push(E),P.push(l*c),L.push(s*S),L.push(1*a/o),O.push(l*u+x),O.push(h+b),O.push(l*c+w);for(a=0;a0){for(p=O.length/3,P.push(0),P.push(1),P.push(0),L.push(.5),L.push(.5),O.push(0+x),O.push(M+b),O.push(0+w),s=0;s<=i;s++)u=Math.sin(s*I),c=Math.cos(s*I),m=.5*Math.sin(s*I)+.5,v=.5*Math.cos(s*I)+.5,P.push(t*u),P.push(1),P.push(t*c),L.push(m),L.push(v),O.push(t*u+x),O.push(M+b),O.push(t*c+w);for(s=0;s0){for(p=O.length/3,P.push(0),P.push(-1),P.push(0),L.push(.5),L.push(.5),O.push(0+x),O.push(0-M+b),O.push(0+w),s=0;s<=i;s++)u=Math.sin(s*I),c=Math.cos(s*I),m=.5*Math.sin(s*I)+.5,v=.5*Math.cos(s*I)+.5,P.push(r*u),P.push(-1),P.push(r*c),L.push(m),L.push(v),O.push(r*u+x),O.push(0-M+b),O.push(r*c+w);for(s=0;s0&&void 0!==arguments[0]?arguments[0]:{},t=e.size||1;t<0&&(console.error("negative size not allowed - will invert"),t*=-1);var r=e.divisions||1;r<0&&(console.error("negative divisions not allowed - will invert"),r*=-1),r<1&&(r=1);for(var n=(t=t||10)/(r=r||10),i=t/2,o=[],a=[],s=0,u=0,c=-i;u<=r;u++,c+=n)o.push(-i),o.push(0),o.push(c),o.push(i),o.push(0),o.push(c),o.push(c),o.push(0),o.push(-i),o.push(c),o.push(0),o.push(i),a.push(s++),a.push(s++),a.push(s++),a.push(s++);return{primitiveType:"lines",positions:o,indices:a}}function Kr(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.xSize||1;t<0&&(console.error("negative xSize not allowed - will invert"),t*=-1);var r=e.zSize||1;r<0&&(console.error("negative zSize not allowed - will invert"),r*=-1);var n=e.xSegments||1;n<0&&(console.error("negative xSegments not allowed - will invert"),n*=-1),n<1&&(n=1);var i=e.xSegments||1;i<0&&(console.error("negative zSegments not allowed - will invert"),i*=-1),i<1&&(i=1);var o,a,s,u,c,l,h,f=e.center,d=f?f[0]:0,p=f?f[1]:0,m=f?f[2]:0,v=t/2,y=r/2,g=Math.floor(n)||1,x=Math.floor(i)||1,b=g+1,w=x+1,M=t/g,T=r/x,I=new Float32Array(b*w*3),S=new Float32Array(b*w*3),A=new Float32Array(b*w*2),O=0,P=0;for(o=0;o65535?Uint32Array:Uint16Array)(g*x*6);for(o=0;o0&&void 0!==arguments[0]?arguments[0]:{},t=e.lod||1,r=e.center?e.center[0]:0,n=e.center?e.center[1]:0,i=e.center?e.center[2]:0,o=e.radius||1;o<0&&(console.error("negative radius not allowed - will invert"),o*=-1);var a=e.heightSegments||18;a<0&&(console.error("negative heightSegments not allowed - will invert"),a*=-1),(a=Math.floor(t*a))<18&&(a=18);var s=e.widthSegments||18;s<0&&(console.error("negative widthSegments not allowed - will invert"),s*=-1),(s=Math.floor(t*s))<18&&(s=18);var u,c,l,h,f,d,p,m,v,y,g,x,b,w,M=[],T=[],I=[],S=[];for(u=0;u<=a;u++)for(l=u*Math.PI/a,h=Math.sin(l),f=Math.cos(l),c=0;c<=s;c++)d=2*c*Math.PI/s,p=Math.sin(d),m=Math.cos(d)*h,v=f,y=p*h,g=1-c/s,x=u/a,T.push(m),T.push(v),T.push(y),I.push(g),I.push(x),M.push(r+o*m),M.push(n+o*v),M.push(i+o*y);for(u=0;u0&&void 0!==arguments[0]?arguments[0]:{},t=e.radius||1;t<0&&(console.error("negative radius not allowed - will invert"),t*=-1),t*=.5;var r=e.tube||.3;r<0&&(console.error("negative tube not allowed - will invert"),r*=-1);var n=e.radialSegments||32;n<0&&(console.error("negative radialSegments not allowed - will invert"),n*=-1),n<4&&(n=4);var i=e.tubeSegments||24;i<0&&(console.error("negative tubeSegments not allowed - will invert"),i*=-1),i<4&&(i=4);var o=e.arc||2*Math.PI;o<0&&(console.warn("negative arc not allowed - will invert"),o*=-1),o>360&&(o=360);var a,s,u,c,l,h,f,d,p,m,v,y,g=e.center,x=g?g[0]:0,b=g?g[1]:0,w=g?g[2]:0,M=[],T=[],I=[],S=[];for(d=0;d<=i;d++)for(f=0;f<=n;f++)a=f/n*o,s=.785398+d/i*Math.PI*2,x=t*Math.cos(a),b=t*Math.sin(a),u=(t+r*Math.cos(s))*Math.cos(a),c=(t+r*Math.cos(s))*Math.sin(a),l=r*Math.sin(s),M.push(u+x),M.push(c+b),M.push(l+w),I.push(1-f/n),I.push(d/i),h=k.normalizeVec3(k.subVec3([u,c,l],[x,b,w],[]),[]),T.push(h[0]),T.push(h[1]),T.push(h[2]);for(d=1;d<=i;d++)for(f=1;f<=n;f++)p=(n+1)*d+f-1,m=(n+1)*(d-1)+f-1,v=(n+1)*(d-1)+f,y=(n+1)*d+f,S.push(p),S.push(m),S.push(v),S.push(v),S.push(y),S.push(p);return{primitiveType:"triangles",positions:M,normals:T,uv:I,uvs:I,indices:S}}var Yr={" ":{width:16,points:[]},"!":{width:10,points:[[5,21],[5,7],[-1,-1],[5,2],[4,1],[5,0],[6,1],[5,2]]},'"':{width:16,points:[[4,21],[4,14],[-1,-1],[12,21],[12,14]]},"#":{width:21,points:[[11,25],[4,-7],[-1,-1],[17,25],[10,-7],[-1,-1],[4,12],[18,12],[-1,-1],[3,6],[17,6]]},$:{width:20,points:[[8,25],[8,-4],[-1,-1],[12,25],[12,-4],[-1,-1],[17,18],[15,20],[12,21],[8,21],[5,20],[3,18],[3,16],[4,14],[5,13],[7,12],[13,10],[15,9],[16,8],[17,6],[17,3],[15,1],[12,0],[8,0],[5,1],[3,3]]},"%":{width:24,points:[[21,21],[3,0],[-1,-1],[8,21],[10,19],[10,17],[9,15],[7,14],[5,14],[3,16],[3,18],[4,20],[6,21],[8,21],[10,20],[13,19],[16,19],[19,20],[21,21],[-1,-1],[17,7],[15,6],[14,4],[14,2],[16,0],[18,0],[20,1],[21,3],[21,5],[19,7],[17,7]]},"&":{width:26,points:[[23,12],[23,13],[22,14],[21,14],[20,13],[19,11],[17,6],[15,3],[13,1],[11,0],[7,0],[5,1],[4,2],[3,4],[3,6],[4,8],[5,9],[12,13],[13,14],[14,16],[14,18],[13,20],[11,21],[9,20],[8,18],[8,16],[9,13],[11,10],[16,3],[18,1],[20,0],[22,0],[23,1],[23,2]]},"'":{width:10,points:[[5,19],[4,20],[5,21],[6,20],[6,18],[5,16],[4,15]]},"(":{width:14,points:[[11,25],[9,23],[7,20],[5,16],[4,11],[4,7],[5,2],[7,-2],[9,-5],[11,-7]]},")":{width:14,points:[[3,25],[5,23],[7,20],[9,16],[10,11],[10,7],[9,2],[7,-2],[5,-5],[3,-7]]},"*":{width:16,points:[[8,21],[8,9],[-1,-1],[3,18],[13,12],[-1,-1],[13,18],[3,12]]},"+":{width:26,points:[[13,18],[13,0],[-1,-1],[4,9],[22,9]]},",":{width:10,points:[[6,1],[5,0],[4,1],[5,2],[6,1],[6,-1],[5,-3],[4,-4]]},"-":{width:26,points:[[4,9],[22,9]]},".":{width:10,points:[[5,2],[4,1],[5,0],[6,1],[5,2]]},"/":{width:22,points:[[20,25],[2,-7]]},0:{width:20,points:[[9,21],[6,20],[4,17],[3,12],[3,9],[4,4],[6,1],[9,0],[11,0],[14,1],[16,4],[17,9],[17,12],[16,17],[14,20],[11,21],[9,21]]},1:{width:20,points:[[6,17],[8,18],[11,21],[11,0]]},2:{width:20,points:[[4,16],[4,17],[5,19],[6,20],[8,21],[12,21],[14,20],[15,19],[16,17],[16,15],[15,13],[13,10],[3,0],[17,0]]},3:{width:20,points:[[5,21],[16,21],[10,13],[13,13],[15,12],[16,11],[17,8],[17,6],[16,3],[14,1],[11,0],[8,0],[5,1],[4,2],[3,4]]},4:{width:20,points:[[13,21],[3,7],[18,7],[-1,-1],[13,21],[13,0]]},5:{width:20,points:[[15,21],[5,21],[4,12],[5,13],[8,14],[11,14],[14,13],[16,11],[17,8],[17,6],[16,3],[14,1],[11,0],[8,0],[5,1],[4,2],[3,4]]},6:{width:20,points:[[16,18],[15,20],[12,21],[10,21],[7,20],[5,17],[4,12],[4,7],[5,3],[7,1],[10,0],[11,0],[14,1],[16,3],[17,6],[17,7],[16,10],[14,12],[11,13],[10,13],[7,12],[5,10],[4,7]]},7:{width:20,points:[[17,21],[7,0],[-1,-1],[3,21],[17,21]]},8:{width:20,points:[[8,21],[5,20],[4,18],[4,16],[5,14],[7,13],[11,12],[14,11],[16,9],[17,7],[17,4],[16,2],[15,1],[12,0],[8,0],[5,1],[4,2],[3,4],[3,7],[4,9],[6,11],[9,12],[13,13],[15,14],[16,16],[16,18],[15,20],[12,21],[8,21]]},9:{width:20,points:[[16,14],[15,11],[13,9],[10,8],[9,8],[6,9],[4,11],[3,14],[3,15],[4,18],[6,20],[9,21],[10,21],[13,20],[15,18],[16,14],[16,9],[15,4],[13,1],[10,0],[8,0],[5,1],[4,3]]},":":{width:10,points:[[5,14],[4,13],[5,12],[6,13],[5,14],[-1,-1],[5,2],[4,1],[5,0],[6,1],[5,2]]},";":{width:10,points:[[5,14],[4,13],[5,12],[6,13],[5,14],[-1,-1],[6,1],[5,0],[4,1],[5,2],[6,1],[6,-1],[5,-3],[4,-4]]},"<":{width:24,points:[[20,18],[4,9],[20,0]]},"=":{width:26,points:[[4,12],[22,12],[-1,-1],[4,6],[22,6]]},">":{width:24,points:[[4,18],[20,9],[4,0]]},"?":{width:18,points:[[3,16],[3,17],[4,19],[5,20],[7,21],[11,21],[13,20],[14,19],[15,17],[15,15],[14,13],[13,12],[9,10],[9,7],[-1,-1],[9,2],[8,1],[9,0],[10,1],[9,2]]},"@":{width:27,points:[[18,13],[17,15],[15,16],[12,16],[10,15],[9,14],[8,11],[8,8],[9,6],[11,5],[14,5],[16,6],[17,8],[-1,-1],[12,16],[10,14],[9,11],[9,8],[10,6],[11,5],[-1,-1],[18,16],[17,8],[17,6],[19,5],[21,5],[23,7],[24,10],[24,12],[23,15],[22,17],[20,19],[18,20],[15,21],[12,21],[9,20],[7,19],[5,17],[4,15],[3,12],[3,9],[4,6],[5,4],[7,2],[9,1],[12,0],[15,0],[18,1],[20,2],[21,3],[-1,-1],[19,16],[18,8],[18,6],[19,5]]},A:{width:18,points:[[9,21],[1,0],[-1,-1],[9,21],[17,0],[-1,-1],[4,7],[14,7]]},B:{width:21,points:[[4,21],[4,0],[-1,-1],[4,21],[13,21],[16,20],[17,19],[18,17],[18,15],[17,13],[16,12],[13,11],[-1,-1],[4,11],[13,11],[16,10],[17,9],[18,7],[18,4],[17,2],[16,1],[13,0],[4,0]]},C:{width:21,points:[[18,16],[17,18],[15,20],[13,21],[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5]]},D:{width:21,points:[[4,21],[4,0],[-1,-1],[4,21],[11,21],[14,20],[16,18],[17,16],[18,13],[18,8],[17,5],[16,3],[14,1],[11,0],[4,0]]},E:{width:19,points:[[4,21],[4,0],[-1,-1],[4,21],[17,21],[-1,-1],[4,11],[12,11],[-1,-1],[4,0],[17,0]]},F:{width:18,points:[[4,21],[4,0],[-1,-1],[4,21],[17,21],[-1,-1],[4,11],[12,11]]},G:{width:21,points:[[18,16],[17,18],[15,20],[13,21],[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5],[18,8],[-1,-1],[13,8],[18,8]]},H:{width:22,points:[[4,21],[4,0],[-1,-1],[18,21],[18,0],[-1,-1],[4,11],[18,11]]},I:{width:8,points:[[4,21],[4,0]]},J:{width:16,points:[[12,21],[12,5],[11,2],[10,1],[8,0],[6,0],[4,1],[3,2],[2,5],[2,7]]},K:{width:21,points:[[4,21],[4,0],[-1,-1],[18,21],[4,7],[-1,-1],[9,12],[18,0]]},L:{width:17,points:[[4,21],[4,0],[-1,-1],[4,0],[16,0]]},M:{width:24,points:[[4,21],[4,0],[-1,-1],[4,21],[12,0],[-1,-1],[20,21],[12,0],[-1,-1],[20,21],[20,0]]},N:{width:22,points:[[4,21],[4,0],[-1,-1],[4,21],[18,0],[-1,-1],[18,21],[18,0]]},O:{width:22,points:[[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5],[19,8],[19,13],[18,16],[17,18],[15,20],[13,21],[9,21]]},P:{width:21,points:[[4,21],[4,0],[-1,-1],[4,21],[13,21],[16,20],[17,19],[18,17],[18,14],[17,12],[16,11],[13,10],[4,10]]},Q:{width:22,points:[[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5],[19,8],[19,13],[18,16],[17,18],[15,20],[13,21],[9,21],[-1,-1],[12,4],[18,-2]]},R:{width:21,points:[[4,21],[4,0],[-1,-1],[4,21],[13,21],[16,20],[17,19],[18,17],[18,15],[17,13],[16,12],[13,11],[4,11],[-1,-1],[11,11],[18,0]]},S:{width:20,points:[[17,18],[15,20],[12,21],[8,21],[5,20],[3,18],[3,16],[4,14],[5,13],[7,12],[13,10],[15,9],[16,8],[17,6],[17,3],[15,1],[12,0],[8,0],[5,1],[3,3]]},T:{width:16,points:[[8,21],[8,0],[-1,-1],[1,21],[15,21]]},U:{width:22,points:[[4,21],[4,6],[5,3],[7,1],[10,0],[12,0],[15,1],[17,3],[18,6],[18,21]]},V:{width:18,points:[[1,21],[9,0],[-1,-1],[17,21],[9,0]]},W:{width:24,points:[[2,21],[7,0],[-1,-1],[12,21],[7,0],[-1,-1],[12,21],[17,0],[-1,-1],[22,21],[17,0]]},X:{width:20,points:[[3,21],[17,0],[-1,-1],[17,21],[3,0]]},Y:{width:18,points:[[1,21],[9,11],[9,0],[-1,-1],[17,21],[9,11]]},Z:{width:20,points:[[17,21],[3,0],[-1,-1],[3,21],[17,21],[-1,-1],[3,0],[17,0]]},"[":{width:14,points:[[4,25],[4,-7],[-1,-1],[5,25],[5,-7],[-1,-1],[4,25],[11,25],[-1,-1],[4,-7],[11,-7]]},"\\":{width:14,points:[[0,21],[14,-3]]},"]":{width:14,points:[[9,25],[9,-7],[-1,-1],[10,25],[10,-7],[-1,-1],[3,25],[10,25],[-1,-1],[3,-7],[10,-7]]},"^":{width:16,points:[[6,15],[8,18],[10,15],[-1,-1],[3,12],[8,17],[13,12],[-1,-1],[8,17],[8,0]]},_:{width:16,points:[[0,-2],[16,-2]]},"`":{width:10,points:[[6,21],[5,20],[4,18],[4,16],[5,15],[6,16],[5,17]]},a:{width:19,points:[[15,14],[15,0],[-1,-1],[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]]},b:{width:19,points:[[4,21],[4,0],[-1,-1],[4,11],[6,13],[8,14],[11,14],[13,13],[15,11],[16,8],[16,6],[15,3],[13,1],[11,0],[8,0],[6,1],[4,3]]},c:{width:18,points:[[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]]},d:{width:19,points:[[15,21],[15,0],[-1,-1],[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]]},e:{width:18,points:[[3,8],[15,8],[15,10],[14,12],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]]},f:{width:12,points:[[10,21],[8,21],[6,20],[5,17],[5,0],[-1,-1],[2,14],[9,14]]},g:{width:19,points:[[15,14],[15,-2],[14,-5],[13,-6],[11,-7],[8,-7],[6,-6],[-1,-1],[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]]},h:{width:19,points:[[4,21],[4,0],[-1,-1],[4,10],[7,13],[9,14],[12,14],[14,13],[15,10],[15,0]]},i:{width:8,points:[[3,21],[4,20],[5,21],[4,22],[3,21],[-1,-1],[4,14],[4,0]]},j:{width:10,points:[[5,21],[6,20],[7,21],[6,22],[5,21],[-1,-1],[6,14],[6,-3],[5,-6],[3,-7],[1,-7]]},k:{width:17,points:[[4,21],[4,0],[-1,-1],[14,14],[4,4],[-1,-1],[8,8],[15,0]]},l:{width:8,points:[[4,21],[4,0]]},m:{width:30,points:[[4,14],[4,0],[-1,-1],[4,10],[7,13],[9,14],[12,14],[14,13],[15,10],[15,0],[-1,-1],[15,10],[18,13],[20,14],[23,14],[25,13],[26,10],[26,0]]},n:{width:19,points:[[4,14],[4,0],[-1,-1],[4,10],[7,13],[9,14],[12,14],[14,13],[15,10],[15,0]]},o:{width:19,points:[[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3],[16,6],[16,8],[15,11],[13,13],[11,14],[8,14]]},p:{width:19,points:[[4,14],[4,-7],[-1,-1],[4,11],[6,13],[8,14],[11,14],[13,13],[15,11],[16,8],[16,6],[15,3],[13,1],[11,0],[8,0],[6,1],[4,3]]},q:{width:19,points:[[15,14],[15,-7],[-1,-1],[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]]},r:{width:13,points:[[4,14],[4,0],[-1,-1],[4,8],[5,11],[7,13],[9,14],[12,14]]},s:{width:17,points:[[14,11],[13,13],[10,14],[7,14],[4,13],[3,11],[4,9],[6,8],[11,7],[13,6],[14,4],[14,3],[13,1],[10,0],[7,0],[4,1],[3,3]]},t:{width:12,points:[[5,21],[5,4],[6,1],[8,0],[10,0],[-1,-1],[2,14],[9,14]]},u:{width:19,points:[[4,14],[4,4],[5,1],[7,0],[10,0],[12,1],[15,4],[-1,-1],[15,14],[15,0]]},v:{width:16,points:[[2,14],[8,0],[-1,-1],[14,14],[8,0]]},w:{width:22,points:[[3,14],[7,0],[-1,-1],[11,14],[7,0],[-1,-1],[11,14],[15,0],[-1,-1],[19,14],[15,0]]},x:{width:17,points:[[3,14],[14,0],[-1,-1],[14,14],[3,0]]},y:{width:16,points:[[2,14],[8,0],[-1,-1],[14,14],[8,0],[6,-4],[4,-6],[2,-7],[1,-7]]},z:{width:17,points:[[14,14],[3,0],[-1,-1],[3,14],[14,14],[-1,-1],[3,0],[14,0]]},"{":{width:14,points:[[9,25],[7,24],[6,23],[5,21],[5,19],[6,17],[7,16],[8,14],[8,12],[6,10],[-1,-1],[7,24],[6,22],[6,20],[7,18],[8,17],[9,15],[9,13],[8,11],[4,9],[8,7],[9,5],[9,3],[8,1],[7,0],[6,-2],[6,-4],[7,-6],[-1,-1],[6,8],[8,6],[8,4],[7,2],[6,1],[5,-1],[5,-3],[6,-5],[7,-6],[9,-7]]},"|":{width:8,points:[[4,25],[4,-7]]},"}":{width:14,points:[[5,25],[7,24],[8,23],[9,21],[9,19],[8,17],[7,16],[6,14],[6,12],[8,10],[-1,-1],[7,24],[8,22],[8,20],[7,18],[6,17],[5,15],[5,13],[6,11],[10,9],[6,7],[5,5],[5,3],[6,1],[7,0],[8,-2],[8,-4],[7,-6],[-1,-1],[8,8],[6,6],[6,4],[7,2],[8,1],[9,-1],[9,-3],[8,-5],[7,-6],[5,-7]]},"~":{width:24,points:[[3,6],[3,8],[4,11],[6,12],[8,12],[10,11],[14,8],[16,7],[18,7],[20,8],[21,10],[-1,-1],[3,8],[4,10],[6,11],[8,11],[10,10],[14,7],[16,6],[18,6],[20,7],[21,10],[21,12]]}};function Wr(){for(var e,t,r,n,i,o,a,s,u,c=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},l=c.origin||[0,0,0],h=l[0],f=l[1],d=l[2],p=c.size||1,m=[],v=[],y=((""+c.text).trim()||"").split("\n"),g=0,x=0,b=.04,w=0;w {\nreturn ","module.exports = require(\"fs\");","module.exports = require(\"path\");","// 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\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.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","// 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};","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@loaders.gl/polyfills\");","/**\n * @desc Provides info on the XKT generated by xeokit-convert.\n */\nconst XKT_INFO = {\n\n /**\n * The XKT version generated by xeokit-convert.\n *\n * This is the XKT version that's modeled by {@link XKTModel}, serialized\n * by {@link writeXKTModelToArrayBuffer}, and written by {@link convert2xkt}.\n *\n * * Current XKT version: **10**\n * * [XKT format specs](https://github.com/xeokit/xeokit-convert/blob/main/specs/index.md)\n *\n * @property xktVersion\n * @type {number}\n */\n xktVersion: 10\n};\n\nexport {XKT_INFO};","// Some temporary vars to help avoid garbage collection\n\nconst doublePrecision = true;\nconst FloatArrayType = doublePrecision ? Float64Array : Float32Array;\n\nconst tempMat1 = new FloatArrayType(16);\nconst tempMat2 = new FloatArrayType(16);\nconst tempVec4 = new FloatArrayType(4);\n\n/**\n * @private\n */\nconst math = {\n\n MIN_DOUBLE: -Number.MAX_SAFE_INTEGER,\n MAX_DOUBLE: Number.MAX_SAFE_INTEGER,\n\n /**\n * The number of radiians in a degree (0.0174532925).\n * @property DEGTORAD\n * @type {Number}\n */\n DEGTORAD: 0.0174532925,\n\n /**\n * The number of degrees in a radian.\n * @property RADTODEG\n * @type {Number}\n */\n RADTODEG: 57.295779513,\n\n /**\n * Returns a new, uninitialized two-element vector.\n * @method vec2\n * @param [values] Initial values.\n * @static\n * @returns {Number[]}\n */\n vec2(values) {\n return new FloatArrayType(values || 2);\n },\n\n /**\n * Returns a new, uninitialized three-element vector.\n * @method vec3\n * @param [values] Initial values.\n * @static\n * @returns {Number[]}\n */\n vec3(values) {\n return new FloatArrayType(values || 3);\n },\n\n /**\n * Returns a new, uninitialized four-element vector.\n * @method vec4\n * @param [values] Initial values.\n * @static\n * @returns {Number[]}\n */\n vec4(values) {\n return new FloatArrayType(values || 4);\n },\n\n /**\n * Returns a new, uninitialized 3x3 matrix.\n * @method mat3\n * @param [values] Initial values.\n * @static\n * @returns {Number[]}\n */\n mat3(values) {\n return new FloatArrayType(values || 9);\n },\n\n /**\n * Converts a 3x3 matrix to 4x4\n * @method mat3ToMat4\n * @param mat3 3x3 matrix.\n * @param mat4 4x4 matrix\n * @static\n * @returns {Number[]}\n */\n mat3ToMat4(mat3, mat4 = new FloatArrayType(16)) {\n mat4[0] = mat3[0];\n mat4[1] = mat3[1];\n mat4[2] = mat3[2];\n mat4[3] = 0;\n mat4[4] = mat3[3];\n mat4[5] = mat3[4];\n mat4[6] = mat3[5];\n mat4[7] = 0;\n mat4[8] = mat3[6];\n mat4[9] = mat3[7];\n mat4[10] = mat3[8];\n mat4[11] = 0;\n mat4[12] = 0;\n mat4[13] = 0;\n mat4[14] = 0;\n mat4[15] = 1;\n return mat4;\n },\n\n /**\n * Returns a new, uninitialized 4x4 matrix.\n * @method mat4\n * @param [values] Initial values.\n * @static\n * @returns {Number[]}\n */\n mat4(values) {\n return new FloatArrayType(values || 16);\n },\n\n /**\n * Converts a 4x4 matrix to 3x3\n * @method mat4ToMat3\n * @param mat4 4x4 matrix.\n * @param mat3 3x3 matrix\n * @static\n * @returns {Number[]}\n */\n mat4ToMat3(mat4, mat3) { // TODO\n //return new FloatArrayType(values || 9);\n },\n\n /**\n * Returns a new UUID.\n * @method createUUID\n * @static\n * @return string The new UUID\n */\n createUUID: ((() => {\n const self = {};\n const lut = [];\n for (let i = 0; i < 256; i++) {\n lut[i] = (i < 16 ? '0' : '') + (i).toString(16);\n }\n return () => {\n const d0 = Math.random() * 0xffffffff | 0;\n const d1 = Math.random() * 0xffffffff | 0;\n const d2 = Math.random() * 0xffffffff | 0;\n const d3 = Math.random() * 0xffffffff | 0;\n return `${lut[d0 & 0xff] + lut[d0 >> 8 & 0xff] + lut[d0 >> 16 & 0xff] + lut[d0 >> 24 & 0xff]}-${lut[d1 & 0xff]}${lut[d1 >> 8 & 0xff]}-${lut[d1 >> 16 & 0x0f | 0x40]}${lut[d1 >> 24 & 0xff]}-${lut[d2 & 0x3f | 0x80]}${lut[d2 >> 8 & 0xff]}-${lut[d2 >> 16 & 0xff]}${lut[d2 >> 24 & 0xff]}${lut[d3 & 0xff]}${lut[d3 >> 8 & 0xff]}${lut[d3 >> 16 & 0xff]}${lut[d3 >> 24 & 0xff]}`;\n };\n }))(),\n\n /**\n * Clamps a value to the given range.\n * @param {Number} value Value to clamp.\n * @param {Number} min Lower bound.\n * @param {Number} max Upper bound.\n * @returns {Number} Clamped result.\n */\n clamp(value, min, max) {\n return Math.max(min, Math.min(max, value));\n },\n\n /**\n * Floating-point modulus\n * @method fmod\n * @static\n * @param {Number} a\n * @param {Number} b\n * @returns {*}\n */\n fmod(a, b) {\n if (a < b) {\n console.error(\"math.fmod : Attempting to find modulus within negative range - would be infinite loop - ignoring\");\n return a;\n }\n while (b <= a) {\n a -= b;\n }\n return a;\n },\n\n /**\n * Negates a four-element vector.\n * @method negateVec4\n * @static\n * @param {Array(Number)} v Vector to negate\n * @param {Array(Number)} [dest] Destination vector\n * @return {Array(Number)} dest if specified, v otherwise\n */\n negateVec4(v, dest) {\n if (!dest) {\n dest = v;\n }\n dest[0] = -v[0];\n dest[1] = -v[1];\n dest[2] = -v[2];\n dest[3] = -v[3];\n return dest;\n },\n\n /**\n * Adds one four-element vector to another.\n * @method addVec4\n * @static\n * @param {Array(Number)} u First vector\n * @param {Array(Number)} v Second vector\n * @param {Array(Number)} [dest] Destination vector\n * @return {Array(Number)} dest if specified, u otherwise\n */\n addVec4(u, v, dest) {\n if (!dest) {\n dest = u;\n }\n dest[0] = u[0] + v[0];\n dest[1] = u[1] + v[1];\n dest[2] = u[2] + v[2];\n dest[3] = u[3] + v[3];\n return dest;\n },\n\n /**\n * Adds a scalar value to each element of a four-element vector.\n * @method addVec4Scalar\n * @static\n * @param {Array(Number)} v The vector\n * @param {Number} s The scalar\n * @param {Array(Number)} [dest] Destination vector\n * @return {Array(Number)} dest if specified, v otherwise\n */\n addVec4Scalar(v, s, dest) {\n if (!dest) {\n dest = v;\n }\n dest[0] = v[0] + s;\n dest[1] = v[1] + s;\n dest[2] = v[2] + s;\n dest[3] = v[3] + s;\n return dest;\n },\n\n /**\n * Adds one three-element vector to another.\n * @method addVec3\n * @static\n * @param {Array(Number)} u First vector\n * @param {Array(Number)} v Second vector\n * @param {Array(Number)} [dest] Destination vector\n * @return {Array(Number)} dest if specified, u otherwise\n */\n addVec3(u, v, dest) {\n if (!dest) {\n dest = u;\n }\n dest[0] = u[0] + v[0];\n dest[1] = u[1] + v[1];\n dest[2] = u[2] + v[2];\n return dest;\n },\n\n /**\n * Adds a scalar value to each element of a three-element vector.\n * @method addVec4Scalar\n * @static\n * @param {Array(Number)} v The vector\n * @param {Number} s The scalar\n * @param {Array(Number)} [dest] Destination vector\n * @return {Array(Number)} dest if specified, v otherwise\n */\n addVec3Scalar(v, s, dest) {\n if (!dest) {\n dest = v;\n }\n dest[0] = v[0] + s;\n dest[1] = v[1] + s;\n dest[2] = v[2] + s;\n return dest;\n },\n\n /**\n * Subtracts one four-element vector from another.\n * @method subVec4\n * @static\n * @param {Array(Number)} u First vector\n * @param {Array(Number)} v Vector to subtract\n * @param {Array(Number)} [dest] Destination vector\n * @return {Array(Number)} dest if specified, u otherwise\n */\n subVec4(u, v, dest) {\n if (!dest) {\n dest = u;\n }\n dest[0] = u[0] - v[0];\n dest[1] = u[1] - v[1];\n dest[2] = u[2] - v[2];\n dest[3] = u[3] - v[3];\n return dest;\n },\n\n /**\n * Subtracts one three-element vector from another.\n * @method subVec3\n * @static\n * @param {Array(Number)} u First vector\n * @param {Array(Number)} v Vector to subtract\n * @param {Array(Number)} [dest] Destination vector\n * @return {Array(Number)} dest if specified, u otherwise\n */\n subVec3(u, v, dest) {\n if (!dest) {\n dest = u;\n }\n dest[0] = u[0] - v[0];\n dest[1] = u[1] - v[1];\n dest[2] = u[2] - v[2];\n return dest;\n },\n\n /**\n * Subtracts one two-element vector from another.\n * @method subVec2\n * @static\n * @param {Array(Number)} u First vector\n * @param {Array(Number)} v Vector to subtract\n * @param {Array(Number)} [dest] Destination vector\n * @return {Array(Number)} dest if specified, u otherwise\n */\n subVec2(u, v, dest) {\n if (!dest) {\n dest = u;\n }\n dest[0] = u[0] - v[0];\n dest[1] = u[1] - v[1];\n return dest;\n },\n\n /**\n * Subtracts a scalar value from each element of a four-element vector.\n * @method subVec4Scalar\n * @static\n * @param {Array(Number)} v The vector\n * @param {Number} s The scalar\n * @param {Array(Number)} [dest] Destination vector\n * @return {Array(Number)} dest if specified, v otherwise\n */\n subVec4Scalar(v, s, dest) {\n if (!dest) {\n dest = v;\n }\n dest[0] = v[0] - s;\n dest[1] = v[1] - s;\n dest[2] = v[2] - s;\n dest[3] = v[3] - s;\n return dest;\n },\n\n /**\n * Sets each element of a 4-element vector to a scalar value minus the value of that element.\n * @method subScalarVec4\n * @static\n * @param {Array(Number)} v The vector\n * @param {Number} s The scalar\n * @param {Array(Number)} [dest] Destination vector\n * @return {Array(Number)} dest if specified, v otherwise\n */\n subScalarVec4(v, s, dest) {\n if (!dest) {\n dest = v;\n }\n dest[0] = s - v[0];\n dest[1] = s - v[1];\n dest[2] = s - v[2];\n dest[3] = s - v[3];\n return dest;\n },\n\n /**\n * Multiplies one three-element vector by another.\n * @method mulVec3\n * @static\n * @param {Array(Number)} u First vector\n * @param {Array(Number)} v Second vector\n * @param {Array(Number)} [dest] Destination vector\n * @return {Array(Number)} dest if specified, u otherwise\n */\n mulVec4(u, v, dest) {\n if (!dest) {\n dest = u;\n }\n dest[0] = u[0] * v[0];\n dest[1] = u[1] * v[1];\n dest[2] = u[2] * v[2];\n dest[3] = u[3] * v[3];\n return dest;\n },\n\n /**\n * Multiplies each element of a four-element vector by a scalar.\n * @method mulVec34calar\n * @static\n * @param {Array(Number)} v The vector\n * @param {Number} s The scalar\n * @param {Array(Number)} [dest] Destination vector\n * @return {Array(Number)} dest if specified, v otherwise\n */\n mulVec4Scalar(v, s, dest) {\n if (!dest) {\n dest = v;\n }\n dest[0] = v[0] * s;\n dest[1] = v[1] * s;\n dest[2] = v[2] * s;\n dest[3] = v[3] * s;\n return dest;\n },\n\n /**\n * Multiplies each element of a three-element vector by a scalar.\n * @method mulVec3Scalar\n * @static\n * @param {Array(Number)} v The vector\n * @param {Number} s The scalar\n * @param {Array(Number)} [dest] Destination vector\n * @return {Array(Number)} dest if specified, v otherwise\n */\n mulVec3Scalar(v, s, dest) {\n if (!dest) {\n dest = v;\n }\n dest[0] = v[0] * s;\n dest[1] = v[1] * s;\n dest[2] = v[2] * s;\n return dest;\n },\n\n /**\n * Multiplies each element of a two-element vector by a scalar.\n * @method mulVec2Scalar\n * @static\n * @param {Array(Number)} v The vector\n * @param {Number} s The scalar\n * @param {Array(Number)} [dest] Destination vector\n * @return {Array(Number)} dest if specified, v otherwise\n */\n mulVec2Scalar(v, s, dest) {\n if (!dest) {\n dest = v;\n }\n dest[0] = v[0] * s;\n dest[1] = v[1] * s;\n return dest;\n },\n\n /**\n * Divides one three-element vector by another.\n * @method divVec3\n * @static\n * @param {Array(Number)} u First vector\n * @param {Array(Number)} v Second vector\n * @param {Array(Number)} [dest] Destination vector\n * @return {Array(Number)} dest if specified, u otherwise\n */\n divVec3(u, v, dest) {\n if (!dest) {\n dest = u;\n }\n dest[0] = u[0] / v[0];\n dest[1] = u[1] / v[1];\n dest[2] = u[2] / v[2];\n return dest;\n },\n\n /**\n * Divides one four-element vector by another.\n * @method divVec4\n * @static\n * @param {Array(Number)} u First vector\n * @param {Array(Number)} v Second vector\n * @param {Array(Number)} [dest] Destination vector\n * @return {Array(Number)} dest if specified, u otherwise\n */\n divVec4(u, v, dest) {\n if (!dest) {\n dest = u;\n }\n dest[0] = u[0] / v[0];\n dest[1] = u[1] / v[1];\n dest[2] = u[2] / v[2];\n dest[3] = u[3] / v[3];\n return dest;\n },\n\n /**\n * Divides a scalar by a three-element vector, returning a new vector.\n * @method divScalarVec3\n * @static\n * @param v vec3\n * @param s scalar\n * @param dest vec3 - optional destination\n * @return [] dest if specified, v otherwise\n */\n divScalarVec3(s, v, dest) {\n if (!dest) {\n dest = v;\n }\n dest[0] = s / v[0];\n dest[1] = s / v[1];\n dest[2] = s / v[2];\n return dest;\n },\n\n /**\n * Divides a three-element vector by a scalar.\n * @method divVec3Scalar\n * @static\n * @param v vec3\n * @param s scalar\n * @param dest vec3 - optional destination\n * @return [] dest if specified, v otherwise\n */\n divVec3Scalar(v, s, dest) {\n if (!dest) {\n dest = v;\n }\n dest[0] = v[0] / s;\n dest[1] = v[1] / s;\n dest[2] = v[2] / s;\n return dest;\n },\n\n /**\n * Divides a four-element vector by a scalar.\n * @method divVec4Scalar\n * @static\n * @param v vec4\n * @param s scalar\n * @param dest vec4 - optional destination\n * @return [] dest if specified, v otherwise\n */\n divVec4Scalar(v, s, dest) {\n if (!dest) {\n dest = v;\n }\n dest[0] = v[0] / s;\n dest[1] = v[1] / s;\n dest[2] = v[2] / s;\n dest[3] = v[3] / s;\n return dest;\n },\n\n\n /**\n * Divides a scalar by a four-element vector, returning a new vector.\n * @method divScalarVec4\n * @static\n * @param s scalar\n * @param v vec4\n * @param dest vec4 - optional destination\n * @return [] dest if specified, v otherwise\n */\n divScalarVec4(s, v, dest) {\n if (!dest) {\n dest = v;\n }\n dest[0] = s / v[0];\n dest[1] = s / v[1];\n dest[2] = s / v[2];\n dest[3] = s / v[3];\n return dest;\n },\n\n /**\n * Returns the dot product of two four-element vectors.\n * @method dotVec4\n * @static\n * @param {Array(Number)} u First vector\n * @param {Array(Number)} v Second vector\n * @return The dot product\n */\n dotVec4(u, v) {\n return (u[0] * v[0] + u[1] * v[1] + u[2] * v[2] + u[3] * v[3]);\n },\n\n /**\n * Returns the cross product of two four-element vectors.\n * @method cross3Vec4\n * @static\n * @param {Array(Number)} u First vector\n * @param {Array(Number)} v Second vector\n * @return The cross product\n */\n cross3Vec4(u, v) {\n const u0 = u[0];\n const u1 = u[1];\n const u2 = u[2];\n const v0 = v[0];\n const v1 = v[1];\n const v2 = v[2];\n return [\n u1 * v2 - u2 * v1,\n u2 * v0 - u0 * v2,\n u0 * v1 - u1 * v0,\n 0.0];\n },\n\n /**\n * Returns the cross product of two three-element vectors.\n * @method cross3Vec3\n * @static\n * @param {Array(Number)} u First vector\n * @param {Array(Number)} v Second vector\n * @return The cross product\n */\n cross3Vec3(u, v, dest) {\n if (!dest) {\n dest = u;\n }\n const x = u[0];\n const y = u[1];\n const z = u[2];\n const x2 = v[0];\n const y2 = v[1];\n const z2 = v[2];\n dest[0] = y * z2 - z * y2;\n dest[1] = z * x2 - x * z2;\n dest[2] = x * y2 - y * x2;\n return dest;\n },\n\n\n sqLenVec4(v) { // TODO\n return math.dotVec4(v, v);\n },\n\n /**\n * Returns the length of a four-element vector.\n * @method lenVec4\n * @static\n * @param {Array(Number)} v The vector\n * @return The length\n */\n lenVec4(v) {\n return Math.sqrt(math.sqLenVec4(v));\n },\n\n /**\n * Returns the dot product of two three-element vectors.\n * @method dotVec3\n * @static\n * @param {Array(Number)} u First vector\n * @param {Array(Number)} v Second vector\n * @return The dot product\n */\n dotVec3(u, v) {\n return (u[0] * v[0] + u[1] * v[1] + u[2] * v[2]);\n },\n\n /**\n * Returns the dot product of two two-element vectors.\n * @method dotVec4\n * @static\n * @param {Array(Number)} u First vector\n * @param {Array(Number)} v Second vector\n * @return The dot product\n */\n dotVec2(u, v) {\n return (u[0] * v[0] + u[1] * v[1]);\n },\n\n\n sqLenVec3(v) {\n return math.dotVec3(v, v);\n },\n\n\n sqLenVec2(v) {\n return math.dotVec2(v, v);\n },\n\n /**\n * Returns the length of a three-element vector.\n * @method lenVec3\n * @static\n * @param {Array(Number)} v The vector\n * @return The length\n */\n lenVec3(v) {\n return Math.sqrt(math.sqLenVec3(v));\n },\n\n distVec3: ((() => {\n const vec = new FloatArrayType(3);\n return (v, w) => math.lenVec3(math.subVec3(v, w, vec));\n }))(),\n\n /**\n * Returns the length of a two-element vector.\n * @method lenVec2\n * @static\n * @param {Array(Number)} v The vector\n * @return The length\n */\n lenVec2(v) {\n return Math.sqrt(math.sqLenVec2(v));\n },\n\n distVec2: ((() => {\n const vec = new FloatArrayType(2);\n return (v, w) => math.lenVec2(math.subVec2(v, w, vec));\n }))(),\n\n /**\n * @method rcpVec3\n * @static\n * @param v vec3\n * @param dest vec3 - optional destination\n * @return [] dest if specified, v otherwise\n *\n */\n rcpVec3(v, dest) {\n return math.divScalarVec3(1.0, v, dest);\n },\n\n /**\n * Normalizes a four-element vector\n * @method normalizeVec4\n * @static\n * @param v vec4\n * @param dest vec4 - optional destination\n * @return [] dest if specified, v otherwise\n *\n */\n normalizeVec4(v, dest) {\n const f = 1.0 / math.lenVec4(v);\n return math.mulVec4Scalar(v, f, dest);\n },\n\n /**\n * Normalizes a three-element vector\n * @method normalizeVec4\n * @static\n */\n normalizeVec3(v, dest) {\n const f = 1.0 / math.lenVec3(v);\n return math.mulVec3Scalar(v, f, dest);\n },\n\n /**\n * Normalizes a two-element vector\n * @method normalizeVec2\n * @static\n */\n normalizeVec2(v, dest) {\n const f = 1.0 / math.lenVec2(v);\n return math.mulVec2Scalar(v, f, dest);\n },\n\n /**\n * Gets the angle between two vectors\n * @method angleVec3\n * @param v\n * @param w\n * @returns {number}\n */\n angleVec3(v, w) {\n let theta = math.dotVec3(v, w) / (Math.sqrt(math.sqLenVec3(v) * math.sqLenVec3(w)));\n theta = theta < -1 ? -1 : (theta > 1 ? 1 : theta); // Clamp to handle numerical problems\n return Math.acos(theta);\n },\n\n /**\n * Creates a three-element vector from the rotation part of a sixteen-element matrix.\n * @param m\n * @param dest\n */\n vec3FromMat4Scale: ((() => {\n\n const tempVec3 = new FloatArrayType(3);\n\n return (m, dest) => {\n\n tempVec3[0] = m[0];\n tempVec3[1] = m[1];\n tempVec3[2] = m[2];\n\n dest[0] = math.lenVec3(tempVec3);\n\n tempVec3[0] = m[4];\n tempVec3[1] = m[5];\n tempVec3[2] = m[6];\n\n dest[1] = math.lenVec3(tempVec3);\n\n tempVec3[0] = m[8];\n tempVec3[1] = m[9];\n tempVec3[2] = m[10];\n\n dest[2] = math.lenVec3(tempVec3);\n\n return dest;\n };\n }))(),\n\n /**\n * Converts an n-element vector to a JSON-serializable\n * array with values rounded to two decimal places.\n */\n vecToArray: ((() => {\n function trunc(v) {\n return Math.round(v * 100000) / 100000\n }\n\n return v => {\n v = Array.prototype.slice.call(v);\n for (let i = 0, len = v.length; i < len; i++) {\n v[i] = trunc(v[i]);\n }\n return v;\n };\n }))(),\n\n /**\n * Converts a 3-element vector from an array to an object of the form ````{x:999, y:999, z:999}````.\n * @param arr\n * @returns {{x: *, y: *, z: *}}\n */\n xyzArrayToObject(arr) {\n return {\"x\": arr[0], \"y\": arr[1], \"z\": arr[2]};\n },\n\n /**\n * Converts a 3-element vector object of the form ````{x:999, y:999, z:999}```` to an array.\n * @param xyz\n * @param [arry]\n * @returns {*[]}\n */\n xyzObjectToArray(xyz, arry) {\n arry = arry || new FloatArrayType(3);\n arry[0] = xyz.x;\n arry[1] = xyz.y;\n arry[2] = xyz.z;\n return arry;\n },\n\n /**\n * Duplicates a 4x4 identity matrix.\n * @method dupMat4\n * @static\n */\n dupMat4(m) {\n return m.slice(0, 16);\n },\n\n /**\n * Extracts a 3x3 matrix from a 4x4 matrix.\n * @method mat4To3\n * @static\n */\n mat4To3(m) {\n return [\n m[0], m[1], m[2],\n m[4], m[5], m[6],\n m[8], m[9], m[10]\n ];\n },\n\n /**\n * Returns a 4x4 matrix with each element set to the given scalar value.\n * @method m4s\n * @static\n */\n m4s(s) {\n return [\n s, s, s, s,\n s, s, s, s,\n s, s, s, s,\n s, s, s, s\n ];\n },\n\n /**\n * Returns a 4x4 matrix with each element set to zero.\n * @method setMat4ToZeroes\n * @static\n */\n setMat4ToZeroes() {\n return math.m4s(0.0);\n },\n\n /**\n * Returns a 4x4 matrix with each element set to 1.0.\n * @method setMat4ToOnes\n * @static\n */\n setMat4ToOnes() {\n return math.m4s(1.0);\n },\n\n /**\n * Returns a 4x4 matrix with each element set to 1.0.\n * @method setMat4ToOnes\n * @static\n */\n diagonalMat4v(v) {\n return new FloatArrayType([\n v[0], 0.0, 0.0, 0.0,\n 0.0, v[1], 0.0, 0.0,\n 0.0, 0.0, v[2], 0.0,\n 0.0, 0.0, 0.0, v[3]\n ]);\n },\n\n /**\n * Returns a 4x4 matrix with diagonal elements set to the given vector.\n * @method diagonalMat4c\n * @static\n */\n diagonalMat4c(x, y, z, w) {\n return math.diagonalMat4v([x, y, z, w]);\n },\n\n /**\n * Returns a 4x4 matrix with diagonal elements set to the given scalar.\n * @method diagonalMat4s\n * @static\n */\n diagonalMat4s(s) {\n return math.diagonalMat4c(s, s, s, s);\n },\n\n /**\n * Returns a 4x4 identity matrix.\n * @method identityMat4\n * @static\n */\n identityMat4(mat = new FloatArrayType(16)) {\n mat[0] = 1.0;\n mat[1] = 0.0;\n mat[2] = 0.0;\n mat[3] = 0.0;\n\n mat[4] = 0.0;\n mat[5] = 1.0;\n mat[6] = 0.0;\n mat[7] = 0.0;\n\n mat[8] = 0.0;\n mat[9] = 0.0;\n mat[10] = 1.0;\n mat[11] = 0.0;\n\n mat[12] = 0.0;\n mat[13] = 0.0;\n mat[14] = 0.0;\n mat[15] = 1.0;\n\n return mat;\n },\n\n /**\n * Returns a 3x3 identity matrix.\n * @method identityMat3\n * @static\n */\n identityMat3(mat = new FloatArrayType(9)) {\n mat[0] = 1.0;\n mat[1] = 0.0;\n mat[2] = 0.0;\n\n mat[3] = 0.0;\n mat[4] = 1.0;\n mat[5] = 0.0;\n\n mat[6] = 0.0;\n mat[7] = 0.0;\n mat[8] = 1.0;\n\n return mat;\n },\n\n /**\n * Tests if the given 4x4 matrix is the identity matrix.\n * @method isIdentityMat4\n * @static\n */\n isIdentityMat4(m) {\n if (m[0] !== 1.0 || m[1] !== 0.0 || m[2] !== 0.0 || m[3] !== 0.0 ||\n m[4] !== 0.0 || m[5] !== 1.0 || m[6] !== 0.0 || m[7] !== 0.0 ||\n m[8] !== 0.0 || m[9] !== 0.0 || m[10] !== 1.0 || m[11] !== 0.0 ||\n m[12] !== 0.0 || m[13] !== 0.0 || m[14] !== 0.0 || m[15] !== 1.0) {\n return false;\n }\n return true;\n },\n\n /**\n * Negates the given 4x4 matrix.\n * @method negateMat4\n * @static\n */\n negateMat4(m, dest) {\n if (!dest) {\n dest = m;\n }\n dest[0] = -m[0];\n dest[1] = -m[1];\n dest[2] = -m[2];\n dest[3] = -m[3];\n dest[4] = -m[4];\n dest[5] = -m[5];\n dest[6] = -m[6];\n dest[7] = -m[7];\n dest[8] = -m[8];\n dest[9] = -m[9];\n dest[10] = -m[10];\n dest[11] = -m[11];\n dest[12] = -m[12];\n dest[13] = -m[13];\n dest[14] = -m[14];\n dest[15] = -m[15];\n return dest;\n },\n\n /**\n * Adds the given 4x4 matrices together.\n * @method addMat4\n * @static\n */\n addMat4(a, b, dest) {\n if (!dest) {\n dest = a;\n }\n dest[0] = a[0] + b[0];\n dest[1] = a[1] + b[1];\n dest[2] = a[2] + b[2];\n dest[3] = a[3] + b[3];\n dest[4] = a[4] + b[4];\n dest[5] = a[5] + b[5];\n dest[6] = a[6] + b[6];\n dest[7] = a[7] + b[7];\n dest[8] = a[8] + b[8];\n dest[9] = a[9] + b[9];\n dest[10] = a[10] + b[10];\n dest[11] = a[11] + b[11];\n dest[12] = a[12] + b[12];\n dest[13] = a[13] + b[13];\n dest[14] = a[14] + b[14];\n dest[15] = a[15] + b[15];\n return dest;\n },\n\n /**\n * Adds the given scalar to each element of the given 4x4 matrix.\n * @method addMat4Scalar\n * @static\n */\n addMat4Scalar(m, s, dest) {\n if (!dest) {\n dest = m;\n }\n dest[0] = m[0] + s;\n dest[1] = m[1] + s;\n dest[2] = m[2] + s;\n dest[3] = m[3] + s;\n dest[4] = m[4] + s;\n dest[5] = m[5] + s;\n dest[6] = m[6] + s;\n dest[7] = m[7] + s;\n dest[8] = m[8] + s;\n dest[9] = m[9] + s;\n dest[10] = m[10] + s;\n dest[11] = m[11] + s;\n dest[12] = m[12] + s;\n dest[13] = m[13] + s;\n dest[14] = m[14] + s;\n dest[15] = m[15] + s;\n return dest;\n },\n\n /**\n * Adds the given scalar to each element of the given 4x4 matrix.\n * @method addScalarMat4\n * @static\n */\n addScalarMat4(s, m, dest) {\n return math.addMat4Scalar(m, s, dest);\n },\n\n /**\n * Subtracts the second 4x4 matrix from the first.\n * @method subMat4\n * @static\n */\n subMat4(a, b, dest) {\n if (!dest) {\n dest = a;\n }\n dest[0] = a[0] - b[0];\n dest[1] = a[1] - b[1];\n dest[2] = a[2] - b[2];\n dest[3] = a[3] - b[3];\n dest[4] = a[4] - b[4];\n dest[5] = a[5] - b[5];\n dest[6] = a[6] - b[6];\n dest[7] = a[7] - b[7];\n dest[8] = a[8] - b[8];\n dest[9] = a[9] - b[9];\n dest[10] = a[10] - b[10];\n dest[11] = a[11] - b[11];\n dest[12] = a[12] - b[12];\n dest[13] = a[13] - b[13];\n dest[14] = a[14] - b[14];\n dest[15] = a[15] - b[15];\n return dest;\n },\n\n /**\n * Subtracts the given scalar from each element of the given 4x4 matrix.\n * @method subMat4Scalar\n * @static\n */\n subMat4Scalar(m, s, dest) {\n if (!dest) {\n dest = m;\n }\n dest[0] = m[0] - s;\n dest[1] = m[1] - s;\n dest[2] = m[2] - s;\n dest[3] = m[3] - s;\n dest[4] = m[4] - s;\n dest[5] = m[5] - s;\n dest[6] = m[6] - s;\n dest[7] = m[7] - s;\n dest[8] = m[8] - s;\n dest[9] = m[9] - s;\n dest[10] = m[10] - s;\n dest[11] = m[11] - s;\n dest[12] = m[12] - s;\n dest[13] = m[13] - s;\n dest[14] = m[14] - s;\n dest[15] = m[15] - s;\n return dest;\n },\n\n /**\n * Subtracts the given scalar from each element of the given 4x4 matrix.\n * @method subScalarMat4\n * @static\n */\n subScalarMat4(s, m, dest) {\n if (!dest) {\n dest = m;\n }\n dest[0] = s - m[0];\n dest[1] = s - m[1];\n dest[2] = s - m[2];\n dest[3] = s - m[3];\n dest[4] = s - m[4];\n dest[5] = s - m[5];\n dest[6] = s - m[6];\n dest[7] = s - m[7];\n dest[8] = s - m[8];\n dest[9] = s - m[9];\n dest[10] = s - m[10];\n dest[11] = s - m[11];\n dest[12] = s - m[12];\n dest[13] = s - m[13];\n dest[14] = s - m[14];\n dest[15] = s - m[15];\n return dest;\n },\n\n /**\n * Multiplies the two given 4x4 matrix by each other.\n * @method mulMat4\n * @static\n */\n mulMat4(a, b, dest) {\n if (!dest) {\n dest = a;\n }\n\n // Cache the matrix values (makes for huge speed increases!)\n const a00 = a[0];\n\n const a01 = a[1];\n const a02 = a[2];\n const a03 = a[3];\n const a10 = a[4];\n const a11 = a[5];\n const a12 = a[6];\n const a13 = a[7];\n const a20 = a[8];\n const a21 = a[9];\n const a22 = a[10];\n const a23 = a[11];\n const a30 = a[12];\n const a31 = a[13];\n const a32 = a[14];\n const a33 = a[15];\n const b00 = b[0];\n const b01 = b[1];\n const b02 = b[2];\n const b03 = b[3];\n const b10 = b[4];\n const b11 = b[5];\n const b12 = b[6];\n const b13 = b[7];\n const b20 = b[8];\n const b21 = b[9];\n const b22 = b[10];\n const b23 = b[11];\n const b30 = b[12];\n const b31 = b[13];\n const b32 = b[14];\n const b33 = b[15];\n\n dest[0] = b00 * a00 + b01 * a10 + b02 * a20 + b03 * a30;\n dest[1] = b00 * a01 + b01 * a11 + b02 * a21 + b03 * a31;\n dest[2] = b00 * a02 + b01 * a12 + b02 * a22 + b03 * a32;\n dest[3] = b00 * a03 + b01 * a13 + b02 * a23 + b03 * a33;\n dest[4] = b10 * a00 + b11 * a10 + b12 * a20 + b13 * a30;\n dest[5] = b10 * a01 + b11 * a11 + b12 * a21 + b13 * a31;\n dest[6] = b10 * a02 + b11 * a12 + b12 * a22 + b13 * a32;\n dest[7] = b10 * a03 + b11 * a13 + b12 * a23 + b13 * a33;\n dest[8] = b20 * a00 + b21 * a10 + b22 * a20 + b23 * a30;\n dest[9] = b20 * a01 + b21 * a11 + b22 * a21 + b23 * a31;\n dest[10] = b20 * a02 + b21 * a12 + b22 * a22 + b23 * a32;\n dest[11] = b20 * a03 + b21 * a13 + b22 * a23 + b23 * a33;\n dest[12] = b30 * a00 + b31 * a10 + b32 * a20 + b33 * a30;\n dest[13] = b30 * a01 + b31 * a11 + b32 * a21 + b33 * a31;\n dest[14] = b30 * a02 + b31 * a12 + b32 * a22 + b33 * a32;\n dest[15] = b30 * a03 + b31 * a13 + b32 * a23 + b33 * a33;\n\n return dest;\n },\n\n /**\n * Multiplies the two given 3x3 matrices by each other.\n * @method mulMat4\n * @static\n */\n mulMat3(a, b, dest) {\n if (!dest) {\n dest = new FloatArrayType(9);\n }\n\n const a11 = a[0];\n const a12 = a[3];\n const a13 = a[6];\n const a21 = a[1];\n const a22 = a[4];\n const a23 = a[7];\n const a31 = a[2];\n const a32 = a[5];\n const a33 = a[8];\n const b11 = b[0];\n const b12 = b[3];\n const b13 = b[6];\n const b21 = b[1];\n const b22 = b[4];\n const b23 = b[7];\n const b31 = b[2];\n const b32 = b[5];\n const b33 = b[8];\n\n dest[0] = a11 * b11 + a12 * b21 + a13 * b31;\n dest[3] = a11 * b12 + a12 * b22 + a13 * b32;\n dest[6] = a11 * b13 + a12 * b23 + a13 * b33;\n\n dest[1] = a21 * b11 + a22 * b21 + a23 * b31;\n dest[4] = a21 * b12 + a22 * b22 + a23 * b32;\n dest[7] = a21 * b13 + a22 * b23 + a23 * b33;\n\n dest[2] = a31 * b11 + a32 * b21 + a33 * b31;\n dest[5] = a31 * b12 + a32 * b22 + a33 * b32;\n dest[8] = a31 * b13 + a32 * b23 + a33 * b33;\n\n return dest;\n },\n\n /**\n * Multiplies each element of the given 4x4 matrix by the given scalar.\n * @method mulMat4Scalar\n * @static\n */\n mulMat4Scalar(m, s, dest) {\n if (!dest) {\n dest = m;\n }\n dest[0] = m[0] * s;\n dest[1] = m[1] * s;\n dest[2] = m[2] * s;\n dest[3] = m[3] * s;\n dest[4] = m[4] * s;\n dest[5] = m[5] * s;\n dest[6] = m[6] * s;\n dest[7] = m[7] * s;\n dest[8] = m[8] * s;\n dest[9] = m[9] * s;\n dest[10] = m[10] * s;\n dest[11] = m[11] * s;\n dest[12] = m[12] * s;\n dest[13] = m[13] * s;\n dest[14] = m[14] * s;\n dest[15] = m[15] * s;\n return dest;\n },\n\n /**\n * Multiplies the given 4x4 matrix by the given four-element vector.\n * @method mulMat4v4\n * @static\n */\n mulMat4v4(m, v, dest = math.vec4()) {\n const v0 = v[0];\n const v1 = v[1];\n const v2 = v[2];\n const v3 = v[3];\n dest[0] = m[0] * v0 + m[4] * v1 + m[8] * v2 + m[12] * v3;\n dest[1] = m[1] * v0 + m[5] * v1 + m[9] * v2 + m[13] * v3;\n dest[2] = m[2] * v0 + m[6] * v1 + m[10] * v2 + m[14] * v3;\n dest[3] = m[3] * v0 + m[7] * v1 + m[11] * v2 + m[15] * v3;\n return dest;\n },\n\n /**\n * Transposes the given 4x4 matrix.\n * @method transposeMat4\n * @static\n */\n transposeMat4(mat, dest) {\n // If we are transposing ourselves we can skip a few steps but have to cache some values\n const m4 = mat[4];\n\n const m14 = mat[14];\n const m8 = mat[8];\n const m13 = mat[13];\n const m12 = mat[12];\n const m9 = mat[9];\n if (!dest || mat === dest) {\n const a01 = mat[1];\n const a02 = mat[2];\n const a03 = mat[3];\n const a12 = mat[6];\n const a13 = mat[7];\n const a23 = mat[11];\n mat[1] = m4;\n mat[2] = m8;\n mat[3] = m12;\n mat[4] = a01;\n mat[6] = m9;\n mat[7] = m13;\n mat[8] = a02;\n mat[9] = a12;\n mat[11] = m14;\n mat[12] = a03;\n mat[13] = a13;\n mat[14] = a23;\n return mat;\n }\n dest[0] = mat[0];\n dest[1] = m4;\n dest[2] = m8;\n dest[3] = m12;\n dest[4] = mat[1];\n dest[5] = mat[5];\n dest[6] = m9;\n dest[7] = m13;\n dest[8] = mat[2];\n dest[9] = mat[6];\n dest[10] = mat[10];\n dest[11] = m14;\n dest[12] = mat[3];\n dest[13] = mat[7];\n dest[14] = mat[11];\n dest[15] = mat[15];\n return dest;\n },\n\n /**\n * Transposes the given 3x3 matrix.\n *\n * @method transposeMat3\n * @static\n */\n transposeMat3(mat, dest) {\n if (dest === mat) {\n const a01 = mat[1];\n const a02 = mat[2];\n const a12 = mat[5];\n dest[1] = mat[3];\n dest[2] = mat[6];\n dest[3] = a01;\n dest[5] = mat[7];\n dest[6] = a02;\n dest[7] = a12;\n } else {\n dest[0] = mat[0];\n dest[1] = mat[3];\n dest[2] = mat[6];\n dest[3] = mat[1];\n dest[4] = mat[4];\n dest[5] = mat[7];\n dest[6] = mat[2];\n dest[7] = mat[5];\n dest[8] = mat[8];\n }\n return dest;\n },\n\n /**\n * Returns the determinant of the given 4x4 matrix.\n * @method determinantMat4\n * @static\n */\n determinantMat4(mat) {\n // Cache the matrix values (makes for huge speed increases!)\n const a00 = mat[0];\n\n const a01 = mat[1];\n const a02 = mat[2];\n const a03 = mat[3];\n const a10 = mat[4];\n const a11 = mat[5];\n const a12 = mat[6];\n const a13 = mat[7];\n const a20 = mat[8];\n const a21 = mat[9];\n const a22 = mat[10];\n const a23 = mat[11];\n const a30 = mat[12];\n const a31 = mat[13];\n const a32 = mat[14];\n const a33 = mat[15];\n return a30 * a21 * a12 * a03 - a20 * a31 * a12 * a03 - a30 * a11 * a22 * a03 + a10 * a31 * a22 * a03 +\n a20 * a11 * a32 * a03 - a10 * a21 * a32 * a03 - a30 * a21 * a02 * a13 + a20 * a31 * a02 * a13 +\n a30 * a01 * a22 * a13 - a00 * a31 * a22 * a13 - a20 * a01 * a32 * a13 + a00 * a21 * a32 * a13 +\n a30 * a11 * a02 * a23 - a10 * a31 * a02 * a23 - a30 * a01 * a12 * a23 + a00 * a31 * a12 * a23 +\n a10 * a01 * a32 * a23 - a00 * a11 * a32 * a23 - a20 * a11 * a02 * a33 + a10 * a21 * a02 * a33 +\n a20 * a01 * a12 * a33 - a00 * a21 * a12 * a33 - a10 * a01 * a22 * a33 + a00 * a11 * a22 * a33;\n },\n\n /**\n * Returns the inverse of the given 4x4 matrix.\n * @method inverseMat4\n * @static\n */\n inverseMat4(mat, dest) {\n if (!dest) {\n dest = mat;\n }\n\n // Cache the matrix values (makes for huge speed increases!)\n const a00 = mat[0];\n\n const a01 = mat[1];\n const a02 = mat[2];\n const a03 = mat[3];\n const a10 = mat[4];\n const a11 = mat[5];\n const a12 = mat[6];\n const a13 = mat[7];\n const a20 = mat[8];\n const a21 = mat[9];\n const a22 = mat[10];\n const a23 = mat[11];\n const a30 = mat[12];\n const a31 = mat[13];\n const a32 = mat[14];\n const a33 = mat[15];\n const b00 = a00 * a11 - a01 * a10;\n const b01 = a00 * a12 - a02 * a10;\n const b02 = a00 * a13 - a03 * a10;\n const b03 = a01 * a12 - a02 * a11;\n const b04 = a01 * a13 - a03 * a11;\n const b05 = a02 * a13 - a03 * a12;\n const b06 = a20 * a31 - a21 * a30;\n const b07 = a20 * a32 - a22 * a30;\n const b08 = a20 * a33 - a23 * a30;\n const b09 = a21 * a32 - a22 * a31;\n const b10 = a21 * a33 - a23 * a31;\n const b11 = a22 * a33 - a23 * a32;\n\n // Calculate the determinant (inlined to avoid double-caching)\n const invDet = 1 / (b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06);\n\n dest[0] = (a11 * b11 - a12 * b10 + a13 * b09) * invDet;\n dest[1] = (-a01 * b11 + a02 * b10 - a03 * b09) * invDet;\n dest[2] = (a31 * b05 - a32 * b04 + a33 * b03) * invDet;\n dest[3] = (-a21 * b05 + a22 * b04 - a23 * b03) * invDet;\n dest[4] = (-a10 * b11 + a12 * b08 - a13 * b07) * invDet;\n dest[5] = (a00 * b11 - a02 * b08 + a03 * b07) * invDet;\n dest[6] = (-a30 * b05 + a32 * b02 - a33 * b01) * invDet;\n dest[7] = (a20 * b05 - a22 * b02 + a23 * b01) * invDet;\n dest[8] = (a10 * b10 - a11 * b08 + a13 * b06) * invDet;\n dest[9] = (-a00 * b10 + a01 * b08 - a03 * b06) * invDet;\n dest[10] = (a30 * b04 - a31 * b02 + a33 * b00) * invDet;\n dest[11] = (-a20 * b04 + a21 * b02 - a23 * b00) * invDet;\n dest[12] = (-a10 * b09 + a11 * b07 - a12 * b06) * invDet;\n dest[13] = (a00 * b09 - a01 * b07 + a02 * b06) * invDet;\n dest[14] = (-a30 * b03 + a31 * b01 - a32 * b00) * invDet;\n dest[15] = (a20 * b03 - a21 * b01 + a22 * b00) * invDet;\n\n return dest;\n },\n\n /**\n * Returns the trace of the given 4x4 matrix.\n * @method traceMat4\n * @static\n */\n traceMat4(m) {\n return (m[0] + m[5] + m[10] + m[15]);\n },\n\n /**\n * Returns 4x4 translation matrix.\n * @method translationMat4\n * @static\n */\n translationMat4v(v, dest) {\n const m = dest || math.identityMat4();\n m[12] = v[0];\n m[13] = v[1];\n m[14] = v[2];\n return m;\n },\n\n /**\n * Returns 3x3 translation matrix.\n * @method translationMat3\n * @static\n */\n translationMat3v(v, dest) {\n const m = dest || math.identityMat3();\n m[6] = v[0];\n m[7] = v[1];\n return m;\n },\n\n /**\n * Returns 4x4 translation matrix.\n * @method translationMat4c\n * @static\n */\n translationMat4c: ((() => {\n const xyz = new FloatArrayType(3);\n return (x, y, z, dest) => {\n xyz[0] = x;\n xyz[1] = y;\n xyz[2] = z;\n return math.translationMat4v(xyz, dest);\n };\n }))(),\n\n /**\n * Returns 4x4 translation matrix.\n * @method translationMat4s\n * @static\n */\n translationMat4s(s, dest) {\n return math.translationMat4c(s, s, s, dest);\n },\n\n /**\n * Efficiently post-concatenates a translation to the given matrix.\n * @param v\n * @param m\n */\n translateMat4v(xyz, m) {\n return math.translateMat4c(xyz[0], xyz[1], xyz[2], m);\n },\n\n /**\n * Efficiently post-concatenates a translation to the given matrix.\n * @param x\n * @param y\n * @param z\n * @param m\n */\n OLDtranslateMat4c(x, y, z, m) {\n\n const m12 = m[12];\n m[0] += m12 * x;\n m[4] += m12 * y;\n m[8] += m12 * z;\n\n const m13 = m[13];\n m[1] += m13 * x;\n m[5] += m13 * y;\n m[9] += m13 * z;\n\n const m14 = m[14];\n m[2] += m14 * x;\n m[6] += m14 * y;\n m[10] += m14 * z;\n\n const m15 = m[15];\n m[3] += m15 * x;\n m[7] += m15 * y;\n m[11] += m15 * z;\n\n return m;\n },\n\n translateMat4c(x, y, z, m) {\n\n const m3 = m[3];\n m[0] += m3 * x;\n m[1] += m3 * y;\n m[2] += m3 * z;\n\n const m7 = m[7];\n m[4] += m7 * x;\n m[5] += m7 * y;\n m[6] += m7 * z;\n\n const m11 = m[11];\n m[8] += m11 * x;\n m[9] += m11 * y;\n m[10] += m11 * z;\n\n const m15 = m[15];\n m[12] += m15 * x;\n m[13] += m15 * y;\n m[14] += m15 * z;\n\n return m;\n },\n /**\n * Returns 4x4 rotation matrix.\n * @method rotationMat4v\n * @static\n */\n rotationMat4v(anglerad, axis, m) {\n const ax = math.normalizeVec4([axis[0], axis[1], axis[2], 0.0], []);\n const s = Math.sin(anglerad);\n const c = Math.cos(anglerad);\n const q = 1.0 - c;\n\n const x = ax[0];\n const y = ax[1];\n const z = ax[2];\n\n let xy;\n let yz;\n let zx;\n let xs;\n let ys;\n let zs;\n\n //xx = x * x; used once\n //yy = y * y; used once\n //zz = z * z; used once\n xy = x * y;\n yz = y * z;\n zx = z * x;\n xs = x * s;\n ys = y * s;\n zs = z * s;\n\n m = m || math.mat4();\n\n m[0] = (q * x * x) + c;\n m[1] = (q * xy) + zs;\n m[2] = (q * zx) - ys;\n m[3] = 0.0;\n\n m[4] = (q * xy) - zs;\n m[5] = (q * y * y) + c;\n m[6] = (q * yz) + xs;\n m[7] = 0.0;\n\n m[8] = (q * zx) + ys;\n m[9] = (q * yz) - xs;\n m[10] = (q * z * z) + c;\n m[11] = 0.0;\n\n m[12] = 0.0;\n m[13] = 0.0;\n m[14] = 0.0;\n m[15] = 1.0;\n\n return m;\n },\n\n /**\n * Returns 4x4 rotation matrix.\n * @method rotationMat4c\n * @static\n */\n rotationMat4c(anglerad, x, y, z, mat) {\n return math.rotationMat4v(anglerad, [x, y, z], mat);\n },\n\n /**\n * Returns 4x4 scale matrix.\n * @method scalingMat4v\n * @static\n */\n scalingMat4v(v, m = math.identityMat4()) {\n m[0] = v[0];\n m[5] = v[1];\n m[10] = v[2];\n return m;\n },\n\n /**\n * Returns 3x3 scale matrix.\n * @method scalingMat3v\n * @static\n */\n scalingMat3v(v, m = math.identityMat3()) {\n m[0] = v[0];\n m[4] = v[1];\n return m;\n },\n\n /**\n * Returns 4x4 scale matrix.\n * @method scalingMat4c\n * @static\n */\n scalingMat4c: ((() => {\n const xyz = new FloatArrayType(3);\n return (x, y, z, dest) => {\n xyz[0] = x;\n xyz[1] = y;\n xyz[2] = z;\n return math.scalingMat4v(xyz, dest);\n };\n }))(),\n\n /**\n * Efficiently post-concatenates a scaling to the given matrix.\n * @method scaleMat4c\n * @param x\n * @param y\n * @param z\n * @param m\n */\n scaleMat4c(x, y, z, m) {\n\n m[0] *= x;\n m[4] *= y;\n m[8] *= z;\n\n m[1] *= x;\n m[5] *= y;\n m[9] *= z;\n\n m[2] *= x;\n m[6] *= y;\n m[10] *= z;\n\n m[3] *= x;\n m[7] *= y;\n m[11] *= z;\n return m;\n },\n\n /**\n * Efficiently post-concatenates a scaling to the given matrix.\n * @method scaleMat4c\n * @param xyz\n * @param m\n */\n scaleMat4v(xyz, m) {\n\n const x = xyz[0];\n const y = xyz[1];\n const z = xyz[2];\n\n m[0] *= x;\n m[4] *= y;\n m[8] *= z;\n m[1] *= x;\n m[5] *= y;\n m[9] *= z;\n m[2] *= x;\n m[6] *= y;\n m[10] *= z;\n m[3] *= x;\n m[7] *= y;\n m[11] *= z;\n\n return m;\n },\n\n /**\n * Returns 4x4 scale matrix.\n * @method scalingMat4s\n * @static\n */\n scalingMat4s(s) {\n return math.scalingMat4c(s, s, s);\n },\n\n /**\n * Creates a matrix from a quaternion rotation and vector translation\n *\n * @param {Number[]} q Rotation quaternion\n * @param {Number[]} v Translation vector\n * @param {Number[]} dest Destination matrix\n * @returns {Number[]} dest\n */\n rotationTranslationMat4(q, v, dest = math.mat4()) {\n const x = q[0];\n const y = q[1];\n const z = q[2];\n const w = q[3];\n\n const x2 = x + x;\n const y2 = y + y;\n const z2 = z + z;\n const xx = x * x2;\n const xy = x * y2;\n const xz = x * z2;\n const yy = y * y2;\n const yz = y * z2;\n const zz = z * z2;\n const wx = w * x2;\n const wy = w * y2;\n const wz = w * z2;\n\n dest[0] = 1 - (yy + zz);\n dest[1] = xy + wz;\n dest[2] = xz - wy;\n dest[3] = 0;\n dest[4] = xy - wz;\n dest[5] = 1 - (xx + zz);\n dest[6] = yz + wx;\n dest[7] = 0;\n dest[8] = xz + wy;\n dest[9] = yz - wx;\n dest[10] = 1 - (xx + yy);\n dest[11] = 0;\n dest[12] = v[0];\n dest[13] = v[1];\n dest[14] = v[2];\n dest[15] = 1;\n\n return dest;\n },\n\n /**\n * Gets Euler angles from a 4x4 matrix.\n *\n * @param {Number[]} mat The 4x4 matrix.\n * @param {String} order Desired Euler angle order: \"XYZ\", \"YXZ\", \"ZXY\" etc.\n * @param {Number[]} [dest] Destination Euler angles, created by default.\n * @returns {Number[]} The Euler angles.\n */\n mat4ToEuler(mat, order, dest = math.vec4()) {\n const clamp = math.clamp;\n\n // Assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n const m11 = mat[0];\n\n const m12 = mat[4];\n const m13 = mat[8];\n const m21 = mat[1];\n const m22 = mat[5];\n const m23 = mat[9];\n const m31 = mat[2];\n const m32 = mat[6];\n const m33 = mat[10];\n\n if (order === 'XYZ') {\n\n dest[1] = Math.asin(clamp(m13, -1, 1));\n\n if (Math.abs(m13) < 0.99999) {\n dest[0] = Math.atan2(-m23, m33);\n dest[2] = Math.atan2(-m12, m11);\n } else {\n dest[0] = Math.atan2(m32, m22);\n dest[2] = 0;\n\n }\n\n } else if (order === 'YXZ') {\n\n dest[0] = Math.asin(-clamp(m23, -1, 1));\n\n if (Math.abs(m23) < 0.99999) {\n dest[1] = Math.atan2(m13, m33);\n dest[2] = Math.atan2(m21, m22);\n } else {\n dest[1] = Math.atan2(-m31, m11);\n dest[2] = 0;\n }\n\n } else if (order === 'ZXY') {\n\n dest[0] = Math.asin(clamp(m32, -1, 1));\n\n if (Math.abs(m32) < 0.99999) {\n dest[1] = Math.atan2(-m31, m33);\n dest[2] = Math.atan2(-m12, m22);\n } else {\n dest[1] = 0;\n dest[2] = Math.atan2(m21, m11);\n }\n\n } else if (order === 'ZYX') {\n\n dest[1] = Math.asin(-clamp(m31, -1, 1));\n\n if (Math.abs(m31) < 0.99999) {\n dest[0] = Math.atan2(m32, m33);\n dest[2] = Math.atan2(m21, m11);\n } else {\n dest[0] = 0;\n dest[2] = Math.atan2(-m12, m22);\n }\n\n } else if (order === 'YZX') {\n\n dest[2] = Math.asin(clamp(m21, -1, 1));\n\n if (Math.abs(m21) < 0.99999) {\n dest[0] = Math.atan2(-m23, m22);\n dest[1] = Math.atan2(-m31, m11);\n } else {\n dest[0] = 0;\n dest[1] = Math.atan2(m13, m33);\n }\n\n } else if (order === 'XZY') {\n\n dest[2] = Math.asin(-clamp(m12, -1, 1));\n\n if (Math.abs(m12) < 0.99999) {\n dest[0] = Math.atan2(m32, m22);\n dest[1] = Math.atan2(m13, m11);\n } else {\n dest[0] = Math.atan2(-m23, m33);\n dest[1] = 0;\n }\n }\n\n return dest;\n },\n\n composeMat4(position, quaternion, scale, mat = math.mat4()) {\n math.quaternionToRotationMat4(quaternion, mat);\n math.scaleMat4v(scale, mat);\n math.translateMat4v(position, mat);\n\n return mat;\n },\n\n decomposeMat4: (() => {\n\n const vec = new FloatArrayType(3);\n const matrix = new FloatArrayType(16);\n\n return function decompose(mat, position, quaternion, scale) {\n\n vec[0] = mat[0];\n vec[1] = mat[1];\n vec[2] = mat[2];\n\n let sx = math.lenVec3(vec);\n\n vec[0] = mat[4];\n vec[1] = mat[5];\n vec[2] = mat[6];\n\n const sy = math.lenVec3(vec);\n\n vec[8] = mat[8];\n vec[9] = mat[9];\n vec[10] = mat[10];\n\n const sz = math.lenVec3(vec);\n\n // if determine is negative, we need to invert one scale\n const det = math.determinantMat4(mat);\n\n if (det < 0) {\n sx = -sx;\n }\n\n position[0] = mat[12];\n position[1] = mat[13];\n position[2] = mat[14];\n\n // scale the rotation part\n matrix.set(mat);\n\n const invSX = 1 / sx;\n const invSY = 1 / sy;\n const invSZ = 1 / sz;\n\n matrix[0] *= invSX;\n matrix[1] *= invSX;\n matrix[2] *= invSX;\n\n matrix[4] *= invSY;\n matrix[5] *= invSY;\n matrix[6] *= invSY;\n\n matrix[8] *= invSZ;\n matrix[9] *= invSZ;\n matrix[10] *= invSZ;\n\n math.mat4ToQuaternion(matrix, quaternion);\n\n scale[0] = sx;\n scale[1] = sy;\n scale[2] = sz;\n\n return this;\n\n };\n\n })(),\n\n /**\n * Returns a 4x4 'lookat' viewing transform matrix.\n * @method lookAtMat4v\n * @param pos vec3 position of the viewer\n * @param target vec3 point the viewer is looking at\n * @param up vec3 pointing \"up\"\n * @param dest mat4 Optional, mat4 matrix will be written into\n *\n * @return {mat4} dest if specified, a new mat4 otherwise\n */\n lookAtMat4v(pos, target, up, dest) {\n if (!dest) {\n dest = math.mat4();\n }\n\n const posx = pos[0];\n const posy = pos[1];\n const posz = pos[2];\n const upx = up[0];\n const upy = up[1];\n const upz = up[2];\n const targetx = target[0];\n const targety = target[1];\n const targetz = target[2];\n\n if (posx === targetx && posy === targety && posz === targetz) {\n return math.identityMat4();\n }\n\n let z0;\n let z1;\n let z2;\n let x0;\n let x1;\n let x2;\n let y0;\n let y1;\n let y2;\n let len;\n\n //vec3.direction(eye, center, z);\n z0 = posx - targetx;\n z1 = posy - targety;\n z2 = posz - targetz;\n\n // normalize (no check needed for 0 because of early return)\n len = 1 / Math.sqrt(z0 * z0 + z1 * z1 + z2 * z2);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n\n //vec3.normalize(vec3.cross(up, z, x));\n x0 = upy * z2 - upz * z1;\n x1 = upz * z0 - upx * z2;\n x2 = upx * z1 - upy * z0;\n len = Math.sqrt(x0 * x0 + x1 * x1 + x2 * x2);\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 //vec3.normalize(vec3.cross(z, x, y));\n y0 = z1 * x2 - z2 * x1;\n y1 = z2 * x0 - z0 * x2;\n y2 = z0 * x1 - z1 * x0;\n\n len = Math.sqrt(y0 * y0 + y1 * y1 + y2 * y2);\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 dest[0] = x0;\n dest[1] = y0;\n dest[2] = z0;\n dest[3] = 0;\n dest[4] = x1;\n dest[5] = y1;\n dest[6] = z1;\n dest[7] = 0;\n dest[8] = x2;\n dest[9] = y2;\n dest[10] = z2;\n dest[11] = 0;\n dest[12] = -(x0 * posx + x1 * posy + x2 * posz);\n dest[13] = -(y0 * posx + y1 * posy + y2 * posz);\n dest[14] = -(z0 * posx + z1 * posy + z2 * posz);\n dest[15] = 1;\n\n return dest;\n },\n\n /**\n * Returns a 4x4 'lookat' viewing transform matrix.\n * @method lookAtMat4c\n * @static\n */\n lookAtMat4c(posx, posy, posz, targetx, targety, targetz, upx, upy, upz) {\n return math.lookAtMat4v([posx, posy, posz], [targetx, targety, targetz], [upx, upy, upz], []);\n },\n\n /**\n * Returns a 4x4 orthographic projection matrix.\n * @method orthoMat4c\n * @static\n */\n orthoMat4c(left, right, bottom, top, near, far, dest) {\n if (!dest) {\n dest = math.mat4();\n }\n const rl = (right - left);\n const tb = (top - bottom);\n const fn = (far - near);\n\n dest[0] = 2.0 / rl;\n dest[1] = 0.0;\n dest[2] = 0.0;\n dest[3] = 0.0;\n\n dest[4] = 0.0;\n dest[5] = 2.0 / tb;\n dest[6] = 0.0;\n dest[7] = 0.0;\n\n dest[8] = 0.0;\n dest[9] = 0.0;\n dest[10] = -2.0 / fn;\n dest[11] = 0.0;\n\n dest[12] = -(left + right) / rl;\n dest[13] = -(top + bottom) / tb;\n dest[14] = -(far + near) / fn;\n dest[15] = 1.0;\n\n return dest;\n },\n\n /**\n * Returns a 4x4 perspective projection matrix.\n * @method frustumMat4v\n * @static\n */\n frustumMat4v(fmin, fmax, m) {\n if (!m) {\n m = math.mat4();\n }\n\n const fmin4 = [fmin[0], fmin[1], fmin[2], 0.0];\n const fmax4 = [fmax[0], fmax[1], fmax[2], 0.0];\n\n math.addVec4(fmax4, fmin4, tempMat1);\n math.subVec4(fmax4, fmin4, tempMat2);\n\n const t = 2.0 * fmin4[2];\n\n const tempMat20 = tempMat2[0];\n const tempMat21 = tempMat2[1];\n const tempMat22 = tempMat2[2];\n\n m[0] = t / tempMat20;\n m[1] = 0.0;\n m[2] = 0.0;\n m[3] = 0.0;\n\n m[4] = 0.0;\n m[5] = t / tempMat21;\n m[6] = 0.0;\n m[7] = 0.0;\n\n m[8] = tempMat1[0] / tempMat20;\n m[9] = tempMat1[1] / tempMat21;\n m[10] = -tempMat1[2] / tempMat22;\n m[11] = -1.0;\n\n m[12] = 0.0;\n m[13] = 0.0;\n m[14] = -t * fmax4[2] / tempMat22;\n m[15] = 0.0;\n\n return m;\n },\n\n /**\n * Returns a 4x4 perspective projection matrix.\n * @method frustumMat4v\n * @static\n */\n frustumMat4(left, right, bottom, top, near, far, dest) {\n if (!dest) {\n dest = math.mat4();\n }\n const rl = (right - left);\n const tb = (top - bottom);\n const fn = (far - near);\n dest[0] = (near * 2) / rl;\n dest[1] = 0;\n dest[2] = 0;\n dest[3] = 0;\n dest[4] = 0;\n dest[5] = (near * 2) / tb;\n dest[6] = 0;\n dest[7] = 0;\n dest[8] = (right + left) / rl;\n dest[9] = (top + bottom) / tb;\n dest[10] = -(far + near) / fn;\n dest[11] = -1;\n dest[12] = 0;\n dest[13] = 0;\n dest[14] = -(far * near * 2) / fn;\n dest[15] = 0;\n return dest;\n },\n\n /**\n * Returns a 4x4 perspective projection matrix.\n * @method perspectiveMat4v\n * @static\n */\n perspectiveMat4(fovyrad, aspectratio, znear, zfar, m) {\n const pmin = [];\n const pmax = [];\n\n pmin[2] = znear;\n pmax[2] = zfar;\n\n pmax[1] = pmin[2] * Math.tan(fovyrad / 2.0);\n pmin[1] = -pmax[1];\n\n pmax[0] = pmax[1] * aspectratio;\n pmin[0] = -pmax[0];\n\n return math.frustumMat4v(pmin, pmax, m);\n },\n\n /**\n * Transforms a three-element position by a 4x4 matrix.\n * @method transformPoint3\n * @static\n */\n transformPoint3(m, p, dest = math.vec3()) {\n\n const x = p[0];\n const y = p[1];\n const z = p[2];\n\n dest[0] = (m[0] * x) + (m[4] * y) + (m[8] * z) + m[12];\n dest[1] = (m[1] * x) + (m[5] * y) + (m[9] * z) + m[13];\n dest[2] = (m[2] * x) + (m[6] * y) + (m[10] * z) + m[14];\n\n return dest;\n },\n\n /**\n * Transforms a homogeneous coordinate by a 4x4 matrix.\n * @method transformPoint3\n * @static\n */\n transformPoint4(m, v, dest = math.vec4()) {\n dest[0] = m[0] * v[0] + m[4] * v[1] + m[8] * v[2] + m[12] * v[3];\n dest[1] = m[1] * v[0] + m[5] * v[1] + m[9] * v[2] + m[13] * v[3];\n dest[2] = m[2] * v[0] + m[6] * v[1] + m[10] * v[2] + m[14] * v[3];\n dest[3] = m[3] * v[0] + m[7] * v[1] + m[11] * v[2] + m[15] * v[3];\n\n return dest;\n },\n\n\n /**\n * Transforms an array of three-element positions by a 4x4 matrix.\n * @method transformPoints3\n * @static\n */\n transformPoints3(m, points, points2) {\n const result = points2 || [];\n const len = points.length;\n let p0;\n let p1;\n let p2;\n let pi;\n\n // cache values\n const m0 = m[0];\n\n const m1 = m[1];\n const m2 = m[2];\n const m3 = m[3];\n const m4 = m[4];\n const m5 = m[5];\n const m6 = m[6];\n const m7 = m[7];\n const m8 = m[8];\n const m9 = m[9];\n const m10 = m[10];\n const m11 = m[11];\n const m12 = m[12];\n const m13 = m[13];\n const m14 = m[14];\n const m15 = m[15];\n\n let r;\n\n for (let i = 0; i < len; ++i) {\n\n // cache values\n pi = points[i];\n\n p0 = pi[0];\n p1 = pi[1];\n p2 = pi[2];\n\n r = result[i] || (result[i] = [0, 0, 0]);\n\n r[0] = (m0 * p0) + (m4 * p1) + (m8 * p2) + m12;\n r[1] = (m1 * p0) + (m5 * p1) + (m9 * p2) + m13;\n r[2] = (m2 * p0) + (m6 * p1) + (m10 * p2) + m14;\n r[3] = (m3 * p0) + (m7 * p1) + (m11 * p2) + m15;\n }\n\n result.length = len;\n\n return result;\n },\n\n /**\n * Transforms an array of positions by a 4x4 matrix.\n * @method transformPositions3\n * @static\n */\n transformPositions3(m, p, p2 = p) {\n let i;\n const len = p.length;\n\n let x;\n let y;\n let z;\n\n const m0 = m[0];\n const m1 = m[1];\n const m2 = m[2];\n const m3 = m[3];\n const m4 = m[4];\n const m5 = m[5];\n const m6 = m[6];\n const m7 = m[7];\n const m8 = m[8];\n const m9 = m[9];\n const m10 = m[10];\n const m11 = m[11];\n const m12 = m[12];\n const m13 = m[13];\n const m14 = m[14];\n const m15 = m[15];\n\n for (i = 0; i < len; i += 3) {\n\n x = p[i + 0];\n y = p[i + 1];\n z = p[i + 2];\n\n p2[i + 0] = (m0 * x) + (m4 * y) + (m8 * z) + m12;\n p2[i + 1] = (m1 * x) + (m5 * y) + (m9 * z) + m13;\n p2[i + 2] = (m2 * x) + (m6 * y) + (m10 * z) + m14;\n p2[i + 3] = (m3 * x) + (m7 * y) + (m11 * z) + m15;\n }\n\n return p2;\n },\n\n /**\n * Transforms an array of positions by a 4x4 matrix.\n * @method transformPositions4\n * @static\n */\n transformPositions4(m, p, p2 = p) {\n let i;\n const len = p.length;\n\n let x;\n let y;\n let z;\n\n const m0 = m[0];\n const m1 = m[1];\n const m2 = m[2];\n const m3 = m[3];\n const m4 = m[4];\n const m5 = m[5];\n const m6 = m[6];\n const m7 = m[7];\n const m8 = m[8];\n const m9 = m[9];\n const m10 = m[10];\n const m11 = m[11];\n const m12 = m[12];\n const m13 = m[13];\n const m14 = m[14];\n const m15 = m[15];\n\n for (i = 0; i < len; i += 4) {\n\n x = p[i + 0];\n y = p[i + 1];\n z = p[i + 2];\n\n p2[i + 0] = (m0 * x) + (m4 * y) + (m8 * z) + m12;\n p2[i + 1] = (m1 * x) + (m5 * y) + (m9 * z) + m13;\n p2[i + 2] = (m2 * x) + (m6 * y) + (m10 * z) + m14;\n p2[i + 3] = (m3 * x) + (m7 * y) + (m11 * z) + m15;\n }\n\n return p2;\n },\n\n /**\n * Transforms a three-element vector by a 4x4 matrix.\n * @method transformVec3\n * @static\n */\n transformVec3(m, v, dest) {\n const v0 = v[0];\n const v1 = v[1];\n const v2 = v[2];\n dest = dest || this.vec3();\n dest[0] = (m[0] * v0) + (m[4] * v1) + (m[8] * v2);\n dest[1] = (m[1] * v0) + (m[5] * v1) + (m[9] * v2);\n dest[2] = (m[2] * v0) + (m[6] * v1) + (m[10] * v2);\n return dest;\n },\n\n /**\n * Transforms a four-element vector by a 4x4 matrix.\n * @method transformVec4\n * @static\n */\n transformVec4(m, v, dest) {\n const v0 = v[0];\n const v1 = v[1];\n const v2 = v[2];\n const v3 = v[3];\n dest = dest || math.vec4();\n dest[0] = m[0] * v0 + m[4] * v1 + m[8] * v2 + m[12] * v3;\n dest[1] = m[1] * v0 + m[5] * v1 + m[9] * v2 + m[13] * v3;\n dest[2] = m[2] * v0 + m[6] * v1 + m[10] * v2 + m[14] * v3;\n dest[3] = m[3] * v0 + m[7] * v1 + m[11] * v2 + m[15] * v3;\n return dest;\n },\n\n /**\n * Rotate a 3D vector around the x-axis\n *\n * @method rotateVec3X\n * @param {Number[]} a The vec3 point to rotate\n * @param {Number[]} b The origin of the rotation\n * @param {Number} c The angle of rotation\n * @param {Number[]} dest The receiving vec3\n * @returns {Number[]} dest\n * @static\n */\n rotateVec3X(a, b, c, dest) {\n const p = [];\n const r = [];\n\n //Translate point to the origin\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2];\n\n //perform rotation\n r[0] = p[0];\n r[1] = p[1] * Math.cos(c) - p[2] * Math.sin(c);\n r[2] = p[1] * Math.sin(c) + p[2] * Math.cos(c);\n\n //translate to correct position\n dest[0] = r[0] + b[0];\n dest[1] = r[1] + b[1];\n dest[2] = r[2] + b[2];\n\n return dest;\n },\n\n /**\n * Rotate a 3D vector around the y-axis\n *\n * @method rotateVec3Y\n * @param {Number[]} a The vec3 point to rotate\n * @param {Number[]} b The origin of the rotation\n * @param {Number} c The angle of rotation\n * @param {Number[]} dest The receiving vec3\n * @returns {Number[]} dest\n * @static\n */\n rotateVec3Y(a, b, c, dest) {\n const p = [];\n const r = [];\n\n //Translate point to the origin\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2];\n\n //perform rotation\n r[0] = p[2] * Math.sin(c) + p[0] * Math.cos(c);\n r[1] = p[1];\n r[2] = p[2] * Math.cos(c) - p[0] * Math.sin(c);\n\n //translate to correct position\n dest[0] = r[0] + b[0];\n dest[1] = r[1] + b[1];\n dest[2] = r[2] + b[2];\n\n return dest;\n },\n\n /**\n * Rotate a 3D vector around the z-axis\n *\n * @method rotateVec3Z\n * @param {Number[]} a The vec3 point to rotate\n * @param {Number[]} b The origin of the rotation\n * @param {Number} c The angle of rotation\n * @param {Number[]} dest The receiving vec3\n * @returns {Number[]} dest\n * @static\n */\n rotateVec3Z(a, b, c, dest) {\n const p = [];\n const r = [];\n\n //Translate point to the origin\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2];\n\n //perform rotation\n r[0] = p[0] * Math.cos(c) - p[1] * Math.sin(c);\n r[1] = p[0] * Math.sin(c) + p[1] * Math.cos(c);\n r[2] = p[2];\n\n //translate to correct position\n dest[0] = r[0] + b[0];\n dest[1] = r[1] + b[1];\n dest[2] = r[2] + b[2];\n\n return dest;\n },\n\n /**\n * Transforms a four-element vector by a 4x4 projection matrix.\n *\n * @method projectVec4\n * @param {Number[]} p 3D View-space coordinate\n * @param {Number[]} q 2D Projected coordinate\n * @returns {Number[]} 2D Projected coordinate\n * @static\n */\n projectVec4(p, q) {\n const f = 1.0 / p[3];\n q = q || math.vec2();\n q[0] = v[0] * f;\n q[1] = v[1] * f;\n return q;\n },\n\n /**\n * Unprojects a three-element vector.\n *\n * @method unprojectVec3\n * @param {Number[]} p 3D Projected coordinate\n * @param {Number[]} viewMat View matrix\n * @returns {Number[]} projMat Projection matrix\n * @static\n */\n unprojectVec3: ((() => {\n const mat = new FloatArrayType(16);\n const mat2 = new FloatArrayType(16);\n const mat3 = new FloatArrayType(16);\n return function (p, viewMat, projMat, q) {\n return this.transformVec3(this.mulMat4(this.inverseMat4(viewMat, mat), this.inverseMat4(projMat, mat2), mat3), p, q)\n };\n }))(),\n\n /**\n * Linearly interpolates between two 3D vectors.\n * @method lerpVec3\n * @static\n */\n lerpVec3(t, t1, t2, p1, p2, dest) {\n const result = dest || math.vec3();\n const f = (t - t1) / (t2 - t1);\n result[0] = p1[0] + (f * (p2[0] - p1[0]));\n result[1] = p1[1] + (f * (p2[1] - p1[1]));\n result[2] = p1[2] + (f * (p2[2] - p1[2]));\n return result;\n },\n\n\n /**\n * Flattens a two-dimensional array into a one-dimensional array.\n *\n * @method flatten\n * @static\n * @param {Array of Arrays} a A 2D array\n * @returns Flattened 1D array\n */\n flatten(a) {\n\n const result = [];\n\n let i;\n let leni;\n let j;\n let lenj;\n let item;\n\n for (i = 0, leni = a.length; i < leni; i++) {\n item = a[i];\n for (j = 0, lenj = item.length; j < lenj; j++) {\n result.push(item[j]);\n }\n }\n\n return result;\n },\n\n\n identityQuaternion(dest = math.vec4()) {\n dest[0] = 0.0;\n dest[1] = 0.0;\n dest[2] = 0.0;\n dest[3] = 1.0;\n return dest;\n },\n\n /**\n * Initializes a quaternion from Euler angles.\n *\n * @param {Number[]} euler The Euler angles.\n * @param {String} order Euler angle order: \"XYZ\", \"YXZ\", \"ZXY\" etc.\n * @param {Number[]} [dest] Destination quaternion, created by default.\n * @returns {Number[]} The quaternion.\n */\n eulerToQuaternion(euler, order, dest = math.vec4()) {\n // http://www.mathworks.com/matlabcentral/fileexchange/\n // \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n //\tcontent/SpinCalc.m\n\n const a = (euler[0] * math.DEGTORAD) / 2;\n const b = (euler[1] * math.DEGTORAD) / 2;\n const c = (euler[2] * math.DEGTORAD) / 2;\n\n const c1 = Math.cos(a);\n const c2 = Math.cos(b);\n const c3 = Math.cos(c);\n const s1 = Math.sin(a);\n const s2 = Math.sin(b);\n const s3 = Math.sin(c);\n\n if (order === 'XYZ') {\n\n dest[0] = s1 * c2 * c3 + c1 * s2 * s3;\n dest[1] = c1 * s2 * c3 - s1 * c2 * s3;\n dest[2] = c1 * c2 * s3 + s1 * s2 * c3;\n dest[3] = c1 * c2 * c3 - s1 * s2 * s3;\n\n } else if (order === 'YXZ') {\n\n dest[0] = s1 * c2 * c3 + c1 * s2 * s3;\n dest[1] = c1 * s2 * c3 - s1 * c2 * s3;\n dest[2] = c1 * c2 * s3 - s1 * s2 * c3;\n dest[3] = c1 * c2 * c3 + s1 * s2 * s3;\n\n } else if (order === 'ZXY') {\n\n dest[0] = s1 * c2 * c3 - c1 * s2 * s3;\n dest[1] = c1 * s2 * c3 + s1 * c2 * s3;\n dest[2] = c1 * c2 * s3 + s1 * s2 * c3;\n dest[3] = c1 * c2 * c3 - s1 * s2 * s3;\n\n } else if (order === 'ZYX') {\n\n dest[0] = s1 * c2 * c3 - c1 * s2 * s3;\n dest[1] = c1 * s2 * c3 + s1 * c2 * s3;\n dest[2] = c1 * c2 * s3 - s1 * s2 * c3;\n dest[3] = c1 * c2 * c3 + s1 * s2 * s3;\n\n } else if (order === 'YZX') {\n\n dest[0] = s1 * c2 * c3 + c1 * s2 * s3;\n dest[1] = c1 * s2 * c3 + s1 * c2 * s3;\n dest[2] = c1 * c2 * s3 - s1 * s2 * c3;\n dest[3] = c1 * c2 * c3 - s1 * s2 * s3;\n\n } else if (order === 'XZY') {\n\n dest[0] = s1 * c2 * c3 - c1 * s2 * s3;\n dest[1] = c1 * s2 * c3 - s1 * c2 * s3;\n dest[2] = c1 * c2 * s3 + s1 * s2 * c3;\n dest[3] = c1 * c2 * c3 + s1 * s2 * s3;\n }\n\n return dest;\n },\n\n mat4ToQuaternion(m, dest = math.vec4()) {\n // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n\n // Assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n const m11 = m[0];\n const m12 = m[4];\n const m13 = m[8];\n const m21 = m[1];\n const m22 = m[5];\n const m23 = m[9];\n const m31 = m[2];\n const m32 = m[6];\n const m33 = m[10];\n let s;\n\n const trace = m11 + m22 + m33;\n\n if (trace > 0) {\n\n s = 0.5 / Math.sqrt(trace + 1.0);\n\n dest[3] = 0.25 / s;\n dest[0] = (m32 - m23) * s;\n dest[1] = (m13 - m31) * s;\n dest[2] = (m21 - m12) * s;\n\n } else if (m11 > m22 && m11 > m33) {\n\n s = 2.0 * Math.sqrt(1.0 + m11 - m22 - m33);\n\n dest[3] = (m32 - m23) / s;\n dest[0] = 0.25 * s;\n dest[1] = (m12 + m21) / s;\n dest[2] = (m13 + m31) / s;\n\n } else if (m22 > m33) {\n\n s = 2.0 * Math.sqrt(1.0 + m22 - m11 - m33);\n\n dest[3] = (m13 - m31) / s;\n dest[0] = (m12 + m21) / s;\n dest[1] = 0.25 * s;\n dest[2] = (m23 + m32) / s;\n\n } else {\n\n s = 2.0 * Math.sqrt(1.0 + m33 - m11 - m22);\n\n dest[3] = (m21 - m12) / s;\n dest[0] = (m13 + m31) / s;\n dest[1] = (m23 + m32) / s;\n dest[2] = 0.25 * s;\n }\n\n return dest;\n },\n\n vec3PairToQuaternion(u, v, dest = math.vec4()) {\n const norm_u_norm_v = Math.sqrt(math.dotVec3(u, u) * math.dotVec3(v, v));\n let real_part = norm_u_norm_v + math.dotVec3(u, v);\n\n if (real_part < 0.00000001 * norm_u_norm_v) {\n\n // If u and v are exactly opposite, rotate 180 degrees\n // around an arbitrary orthogonal axis. Axis normalisation\n // can happen later, when we normalise the quaternion.\n\n real_part = 0.0;\n\n if (Math.abs(u[0]) > Math.abs(u[2])) {\n\n dest[0] = -u[1];\n dest[1] = u[0];\n dest[2] = 0;\n\n } else {\n dest[0] = 0;\n dest[1] = -u[2];\n dest[2] = u[1]\n }\n\n } else {\n\n // Otherwise, build quaternion the standard way.\n math.cross3Vec3(u, v, dest);\n }\n\n dest[3] = real_part;\n\n return math.normalizeQuaternion(dest);\n },\n\n angleAxisToQuaternion(angleAxis, dest = math.vec4()) {\n const halfAngle = angleAxis[3] / 2.0;\n const fsin = Math.sin(halfAngle);\n dest[0] = fsin * angleAxis[0];\n dest[1] = fsin * angleAxis[1];\n dest[2] = fsin * angleAxis[2];\n dest[3] = Math.cos(halfAngle);\n return dest;\n },\n\n quaternionToEuler: ((() => {\n const mat = new FloatArrayType(16);\n return (q, order, dest) => {\n dest = dest || math.vec3();\n math.quaternionToRotationMat4(q, mat);\n math.mat4ToEuler(mat, order, dest);\n return dest;\n };\n }))(),\n\n mulQuaternions(p, q, dest = math.vec4()) {\n const p0 = p[0];\n const p1 = p[1];\n const p2 = p[2];\n const p3 = p[3];\n const q0 = q[0];\n const q1 = q[1];\n const q2 = q[2];\n const q3 = q[3];\n dest[0] = p3 * q0 + p0 * q3 + p1 * q2 - p2 * q1;\n dest[1] = p3 * q1 + p1 * q3 + p2 * q0 - p0 * q2;\n dest[2] = p3 * q2 + p2 * q3 + p0 * q1 - p1 * q0;\n dest[3] = p3 * q3 - p0 * q0 - p1 * q1 - p2 * q2;\n return dest;\n },\n\n vec3ApplyQuaternion(q, vec, dest = math.vec3()) {\n const x = vec[0];\n const y = vec[1];\n const z = vec[2];\n\n const qx = q[0];\n const qy = q[1];\n const qz = q[2];\n const qw = q[3];\n\n // calculate quat * vector\n\n const ix = qw * x + qy * z - qz * y;\n const iy = qw * y + qz * x - qx * z;\n const iz = qw * z + qx * y - qy * x;\n const iw = -qx * x - qy * y - qz * z;\n\n // calculate result * inverse quat\n\n dest[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n dest[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n dest[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n\n return dest;\n },\n\n quaternionToMat4(q, dest) {\n\n dest = math.identityMat4(dest);\n\n const q0 = q[0]; //x\n const q1 = q[1]; //y\n const q2 = q[2]; //z\n const q3 = q[3]; //w\n\n const tx = 2.0 * q0;\n const ty = 2.0 * q1;\n const tz = 2.0 * q2;\n\n const twx = tx * q3;\n const twy = ty * q3;\n const twz = tz * q3;\n\n const txx = tx * q0;\n const txy = ty * q0;\n const txz = tz * q0;\n\n const tyy = ty * q1;\n const tyz = tz * q1;\n const tzz = tz * q2;\n\n dest[0] = 1.0 - (tyy + tzz);\n dest[1] = txy + twz;\n dest[2] = txz - twy;\n\n dest[4] = txy - twz;\n dest[5] = 1.0 - (txx + tzz);\n dest[6] = tyz + twx;\n\n dest[8] = txz + twy;\n dest[9] = tyz - twx;\n\n dest[10] = 1.0 - (txx + tyy);\n\n return dest;\n },\n\n quaternionToRotationMat4(q, m) {\n const x = q[0];\n const y = q[1];\n const z = q[2];\n const w = q[3];\n\n const x2 = x + x;\n const y2 = y + y;\n const z2 = z + z;\n const xx = x * x2;\n const xy = x * y2;\n const xz = x * z2;\n const yy = y * y2;\n const yz = y * z2;\n const zz = z * z2;\n const wx = w * x2;\n const wy = w * y2;\n const wz = w * z2;\n\n m[0] = 1 - (yy + zz);\n m[4] = xy - wz;\n m[8] = xz + wy;\n\n m[1] = xy + wz;\n m[5] = 1 - (xx + zz);\n m[9] = yz - wx;\n\n m[2] = xz - wy;\n m[6] = yz + wx;\n m[10] = 1 - (xx + yy);\n\n // last column\n m[3] = 0;\n m[7] = 0;\n m[11] = 0;\n\n // bottom row\n m[12] = 0;\n m[13] = 0;\n m[14] = 0;\n m[15] = 1;\n\n return m;\n },\n\n normalizeQuaternion(q, dest = q) {\n const len = math.lenVec4([q[0], q[1], q[2], q[3]]);\n dest[0] = q[0] / len;\n dest[1] = q[1] / len;\n dest[2] = q[2] / len;\n dest[3] = q[3] / len;\n return dest;\n },\n\n conjugateQuaternion(q, dest = q) {\n dest[0] = -q[0];\n dest[1] = -q[1];\n dest[2] = -q[2];\n dest[3] = q[3];\n return dest;\n },\n\n inverseQuaternion(q, dest) {\n return math.normalizeQuaternion(math.conjugateQuaternion(q, dest));\n },\n\n quaternionToAngleAxis(q, angleAxis = math.vec4()) {\n q = math.normalizeQuaternion(q, tempVec4);\n const q3 = q[3];\n const angle = 2 * Math.acos(q3);\n const s = Math.sqrt(1 - q3 * q3);\n if (s < 0.001) { // test to avoid divide by zero, s is always positive due to sqrt\n angleAxis[0] = q[0];\n angleAxis[1] = q[1];\n angleAxis[2] = q[2];\n } else {\n angleAxis[0] = q[0] / s;\n angleAxis[1] = q[1] / s;\n angleAxis[2] = q[2] / s;\n }\n angleAxis[3] = angle; // * 57.295779579;\n return angleAxis;\n },\n\n //------------------------------------------------------------------------------------------------------------------\n // Boundaries\n //------------------------------------------------------------------------------------------------------------------\n\n /**\n * Returns a new, uninitialized 3D axis-aligned bounding box.\n *\n * @private\n */\n AABB3(values) {\n return new FloatArrayType(values || 6);\n },\n\n /**\n * Returns a new, uninitialized 2D axis-aligned bounding box.\n *\n * @private\n */\n AABB2(values) {\n return new FloatArrayType(values || 4);\n },\n\n /**\n * Returns a new, uninitialized 3D oriented bounding box (OBB).\n *\n * @private\n */\n OBB3(values) {\n return new FloatArrayType(values || 32);\n },\n\n /**\n * Returns a new, uninitialized 2D oriented bounding box (OBB).\n *\n * @private\n */\n OBB2(values) {\n return new FloatArrayType(values || 16);\n },\n\n /** Returns a new 3D bounding sphere */\n Sphere3(x, y, z, r) {\n return new FloatArrayType([x, y, z, r]);\n },\n\n /**\n * Transforms an OBB3 by a 4x4 matrix.\n *\n * @private\n */\n transformOBB3(m, p, p2 = p) {\n let i;\n const len = p.length;\n\n let x;\n let y;\n let z;\n\n const m0 = m[0];\n const m1 = m[1];\n const m2 = m[2];\n const m3 = m[3];\n const m4 = m[4];\n const m5 = m[5];\n const m6 = m[6];\n const m7 = m[7];\n const m8 = m[8];\n const m9 = m[9];\n const m10 = m[10];\n const m11 = m[11];\n const m12 = m[12];\n const m13 = m[13];\n const m14 = m[14];\n const m15 = m[15];\n\n for (i = 0; i < len; i += 4) {\n\n x = p[i + 0];\n y = p[i + 1];\n z = p[i + 2];\n\n p2[i + 0] = (m0 * x) + (m4 * y) + (m8 * z) + m12;\n p2[i + 1] = (m1 * x) + (m5 * y) + (m9 * z) + m13;\n p2[i + 2] = (m2 * x) + (m6 * y) + (m10 * z) + m14;\n p2[i + 3] = (m3 * x) + (m7 * y) + (m11 * z) + m15;\n }\n\n return p2;\n },\n\n /** Returns true if the first AABB contains the second AABB.\n * @param aabb1\n * @param aabb2\n * @returns {boolean}\n */\n containsAABB3: function (aabb1, aabb2) {\n const result = (\n aabb1[0] <= aabb2[0] && aabb2[3] <= aabb1[3] &&\n aabb1[1] <= aabb2[1] && aabb2[4] <= aabb1[4] &&\n aabb1[2] <= aabb2[2] && aabb2[5] <= aabb1[5]);\n return result;\n },\n\n /**\n * Gets the diagonal size of an AABB3 given as minima and maxima.\n *\n * @private\n */\n getAABB3Diag: ((() => {\n\n const min = new FloatArrayType(3);\n const max = new FloatArrayType(3);\n const tempVec3 = new FloatArrayType(3);\n\n return aabb => {\n\n min[0] = aabb[0];\n min[1] = aabb[1];\n min[2] = aabb[2];\n\n max[0] = aabb[3];\n max[1] = aabb[4];\n max[2] = aabb[5];\n\n math.subVec3(max, min, tempVec3);\n\n return Math.abs(math.lenVec3(tempVec3));\n };\n }))(),\n\n /**\n * Get a diagonal boundary size that is symmetrical about the given point.\n *\n * @private\n */\n getAABB3DiagPoint: ((() => {\n\n const min = new FloatArrayType(3);\n const max = new FloatArrayType(3);\n const tempVec3 = new FloatArrayType(3);\n\n return (aabb, p) => {\n\n min[0] = aabb[0];\n min[1] = aabb[1];\n min[2] = aabb[2];\n\n max[0] = aabb[3];\n max[1] = aabb[4];\n max[2] = aabb[5];\n\n const diagVec = math.subVec3(max, min, tempVec3);\n\n const xneg = p[0] - aabb[0];\n const xpos = aabb[3] - p[0];\n const yneg = p[1] - aabb[1];\n const ypos = aabb[4] - p[1];\n const zneg = p[2] - aabb[2];\n const zpos = aabb[5] - p[2];\n\n diagVec[0] += (xneg > xpos) ? xneg : xpos;\n diagVec[1] += (yneg > ypos) ? yneg : ypos;\n diagVec[2] += (zneg > zpos) ? zneg : zpos;\n\n return Math.abs(math.lenVec3(diagVec));\n };\n }))(),\n\n /**\n * Gets the center of an AABB.\n *\n * @private\n */\n getAABB3Center(aabb, dest) {\n const r = dest || math.vec3();\n\n r[0] = (aabb[0] + aabb[3]) / 2;\n r[1] = (aabb[1] + aabb[4]) / 2;\n r[2] = (aabb[2] + aabb[5]) / 2;\n\n return r;\n },\n\n /**\n * Gets the center of a 2D AABB.\n *\n * @private\n */\n getAABB2Center(aabb, dest) {\n const r = dest || math.vec2();\n\n r[0] = (aabb[2] + aabb[0]) / 2;\n r[1] = (aabb[3] + aabb[1]) / 2;\n\n return r;\n },\n\n /**\n * Collapses a 3D axis-aligned boundary, ready to expand to fit 3D points.\n * Creates new AABB if none supplied.\n *\n * @private\n */\n collapseAABB3(aabb = math.AABB3()) {\n aabb[0] = math.MAX_DOUBLE;\n aabb[1] = math.MAX_DOUBLE;\n aabb[2] = math.MAX_DOUBLE;\n aabb[3] = -math.MAX_DOUBLE;\n aabb[4] = -math.MAX_DOUBLE;\n aabb[5] = -math.MAX_DOUBLE;\n\n return aabb;\n },\n\n /**\n * Converts an axis-aligned 3D boundary into an oriented boundary consisting of\n * an array of eight 3D positions, one for each corner of the boundary.\n *\n * @private\n */\n AABB3ToOBB3(aabb, obb = math.OBB3()) {\n obb[0] = aabb[0];\n obb[1] = aabb[1];\n obb[2] = aabb[2];\n obb[3] = 1;\n\n obb[4] = aabb[3];\n obb[5] = aabb[1];\n obb[6] = aabb[2];\n obb[7] = 1;\n\n obb[8] = aabb[3];\n obb[9] = aabb[4];\n obb[10] = aabb[2];\n obb[11] = 1;\n\n obb[12] = aabb[0];\n obb[13] = aabb[4];\n obb[14] = aabb[2];\n obb[15] = 1;\n\n obb[16] = aabb[0];\n obb[17] = aabb[1];\n obb[18] = aabb[5];\n obb[19] = 1;\n\n obb[20] = aabb[3];\n obb[21] = aabb[1];\n obb[22] = aabb[5];\n obb[23] = 1;\n\n obb[24] = aabb[3];\n obb[25] = aabb[4];\n obb[26] = aabb[5];\n obb[27] = 1;\n\n obb[28] = aabb[0];\n obb[29] = aabb[4];\n obb[30] = aabb[5];\n obb[31] = 1;\n\n return obb;\n },\n\n /**\n * Finds the minimum axis-aligned 3D boundary enclosing the homogeneous 3D points (x,y,z,w) given in a flattened array.\n *\n * @private\n */\n positions3ToAABB3: ((() => {\n\n const p = new FloatArrayType(3);\n\n return (positions, aabb, positionsDecodeMatrix) => {\n aabb = aabb || math.AABB3();\n\n let xmin = math.MAX_DOUBLE;\n let ymin = math.MAX_DOUBLE;\n let zmin = math.MAX_DOUBLE;\n let xmax = -math.MAX_DOUBLE;\n let ymax = -math.MAX_DOUBLE;\n let zmax = -math.MAX_DOUBLE;\n\n let x;\n let y;\n let z;\n\n for (let i = 0, len = positions.length; i < len; i += 3) {\n\n if (positionsDecodeMatrix) {\n\n p[0] = positions[i + 0];\n p[1] = positions[i + 1];\n p[2] = positions[i + 2];\n\n math.decompressPosition(p, positionsDecodeMatrix, p);\n\n x = p[0];\n y = p[1];\n z = p[2];\n\n } else {\n x = positions[i + 0];\n y = positions[i + 1];\n z = positions[i + 2];\n }\n\n if (x < xmin) {\n xmin = x;\n }\n\n if (y < ymin) {\n ymin = y;\n }\n\n if (z < zmin) {\n zmin = z;\n }\n\n if (x > xmax) {\n xmax = x;\n }\n\n if (y > ymax) {\n ymax = y;\n }\n\n if (z > zmax) {\n zmax = z;\n }\n }\n\n aabb[0] = xmin;\n aabb[1] = ymin;\n aabb[2] = zmin;\n aabb[3] = xmax;\n aabb[4] = ymax;\n aabb[5] = zmax;\n\n return aabb;\n };\n }))(),\n\n /**\n * Finds the minimum axis-aligned 3D boundary enclosing the homogeneous 3D points (x,y,z,w) given in a flattened array.\n *\n * @private\n */\n OBB3ToAABB3(obb, aabb = math.AABB3()) {\n let xmin = math.MAX_DOUBLE;\n let ymin = math.MAX_DOUBLE;\n let zmin = math.MAX_DOUBLE;\n let xmax = -math.MAX_DOUBLE;\n let ymax = -math.MAX_DOUBLE;\n let zmax = -math.MAX_DOUBLE;\n\n let x;\n let y;\n let z;\n\n for (let i = 0, len = obb.length; i < len; i += 4) {\n\n x = obb[i + 0];\n y = obb[i + 1];\n z = obb[i + 2];\n\n if (x < xmin) {\n xmin = x;\n }\n\n if (y < ymin) {\n ymin = y;\n }\n\n if (z < zmin) {\n zmin = z;\n }\n\n if (x > xmax) {\n xmax = x;\n }\n\n if (y > ymax) {\n ymax = y;\n }\n\n if (z > zmax) {\n zmax = z;\n }\n }\n\n aabb[0] = xmin;\n aabb[1] = ymin;\n aabb[2] = zmin;\n aabb[3] = xmax;\n aabb[4] = ymax;\n aabb[5] = zmax;\n\n return aabb;\n },\n\n /**\n * Finds the minimum axis-aligned 3D boundary enclosing the given 3D points.\n *\n * @private\n */\n points3ToAABB3(points, aabb = math.AABB3()) {\n let xmin = math.MAX_DOUBLE;\n let ymin = math.MAX_DOUBLE;\n let zmin = math.MAX_DOUBLE;\n let xmax = -math.MAX_DOUBLE;\n let ymax = -math.MAX_DOUBLE;\n let zmax = -math.MAX_DOUBLE;\n\n let x;\n let y;\n let z;\n\n for (let i = 0, len = points.length; i < len; i++) {\n\n x = points[i][0];\n y = points[i][1];\n z = points[i][2];\n\n if (x < xmin) {\n xmin = x;\n }\n\n if (y < ymin) {\n ymin = y;\n }\n\n if (z < zmin) {\n zmin = z;\n }\n\n if (x > xmax) {\n xmax = x;\n }\n\n if (y > ymax) {\n ymax = y;\n }\n\n if (z > zmax) {\n zmax = z;\n }\n }\n\n aabb[0] = xmin;\n aabb[1] = ymin;\n aabb[2] = zmin;\n aabb[3] = xmax;\n aabb[4] = ymax;\n aabb[5] = zmax;\n\n return aabb;\n },\n\n /**\n * Finds the minimum boundary sphere enclosing the given 3D points.\n *\n * @private\n */\n points3ToSphere3: ((() => {\n\n const tempVec3 = new FloatArrayType(3);\n\n return (points, sphere) => {\n\n sphere = sphere || math.vec4();\n\n let x = 0;\n let y = 0;\n let z = 0;\n\n let i;\n const numPoints = points.length;\n\n for (i = 0; i < numPoints; i++) {\n x += points[i][0];\n y += points[i][1];\n z += points[i][2];\n }\n\n sphere[0] = x / numPoints;\n sphere[1] = y / numPoints;\n sphere[2] = z / numPoints;\n\n let radius = 0;\n let dist;\n\n for (i = 0; i < numPoints; i++) {\n\n dist = Math.abs(math.lenVec3(math.subVec3(points[i], sphere, tempVec3)));\n\n if (dist > radius) {\n radius = dist;\n }\n }\n\n sphere[3] = radius;\n\n return sphere;\n };\n }))(),\n\n /**\n * Finds the minimum boundary sphere enclosing the given 3D positions.\n *\n * @private\n */\n positions3ToSphere3: ((() => {\n\n const tempVec3a = new FloatArrayType(3);\n const tempVec3b = new FloatArrayType(3);\n\n return (positions, sphere) => {\n\n sphere = sphere || math.vec4();\n\n let x = 0;\n let y = 0;\n let z = 0;\n\n let i;\n const lenPositions = positions.length;\n let radius = 0;\n\n for (i = 0; i < lenPositions; i += 3) {\n x += positions[i];\n y += positions[i + 1];\n z += positions[i + 2];\n }\n\n const numPositions = lenPositions / 3;\n\n sphere[0] = x / numPositions;\n sphere[1] = y / numPositions;\n sphere[2] = z / numPositions;\n\n let dist;\n\n for (i = 0; i < lenPositions; i += 3) {\n\n tempVec3a[0] = positions[i];\n tempVec3a[1] = positions[i + 1];\n tempVec3a[2] = positions[i + 2];\n\n dist = Math.abs(math.lenVec3(math.subVec3(tempVec3a, sphere, tempVec3b)));\n\n if (dist > radius) {\n radius = dist;\n }\n }\n\n sphere[3] = radius;\n\n return sphere;\n };\n }))(),\n\n /**\n * Finds the minimum boundary sphere enclosing the given 3D points.\n *\n * @private\n */\n OBB3ToSphere3: ((() => {\n\n const point = new FloatArrayType(3);\n const tempVec3 = new FloatArrayType(3);\n\n return (points, sphere) => {\n\n sphere = sphere || math.vec4();\n\n let x = 0;\n let y = 0;\n let z = 0;\n\n let i;\n const lenPoints = points.length;\n const numPoints = lenPoints / 4;\n\n for (i = 0; i < lenPoints; i += 4) {\n x += points[i + 0];\n y += points[i + 1];\n z += points[i + 2];\n }\n\n sphere[0] = x / numPoints;\n sphere[1] = y / numPoints;\n sphere[2] = z / numPoints;\n\n let radius = 0;\n let dist;\n\n for (i = 0; i < lenPoints; i += 4) {\n\n point[0] = points[i + 0];\n point[1] = points[i + 1];\n point[2] = points[i + 2];\n\n dist = Math.abs(math.lenVec3(math.subVec3(point, sphere, tempVec3)));\n\n if (dist > radius) {\n radius = dist;\n }\n }\n\n sphere[3] = radius;\n\n return sphere;\n };\n }))(),\n\n /**\n * Gets the center of a bounding sphere.\n *\n * @private\n */\n getSphere3Center(sphere, dest = math.vec3()) {\n dest[0] = sphere[0];\n dest[1] = sphere[1];\n dest[2] = sphere[2];\n\n return dest;\n },\n\n /**\n * Expands the first axis-aligned 3D boundary to enclose the second, if required.\n *\n * @private\n */\n expandAABB3(aabb1, aabb2) {\n\n if (aabb1[0] > aabb2[0]) {\n aabb1[0] = aabb2[0];\n }\n\n if (aabb1[1] > aabb2[1]) {\n aabb1[1] = aabb2[1];\n }\n\n if (aabb1[2] > aabb2[2]) {\n aabb1[2] = aabb2[2];\n }\n\n if (aabb1[3] < aabb2[3]) {\n aabb1[3] = aabb2[3];\n }\n\n if (aabb1[4] < aabb2[4]) {\n aabb1[4] = aabb2[4];\n }\n\n if (aabb1[5] < aabb2[5]) {\n aabb1[5] = aabb2[5];\n }\n\n return aabb1;\n },\n\n /**\n * Expands an axis-aligned 3D boundary to enclose the given point, if needed.\n *\n * @private\n */\n expandAABB3Point3(aabb, p) {\n\n if (aabb[0] > p[0]) {\n aabb[0] = p[0];\n }\n\n if (aabb[1] > p[1]) {\n aabb[1] = p[1];\n }\n\n if (aabb[2] > p[2]) {\n aabb[2] = p[2];\n }\n\n if (aabb[3] < p[0]) {\n aabb[3] = p[0];\n }\n\n if (aabb[4] < p[1]) {\n aabb[4] = p[1];\n }\n\n if (aabb[5] < p[2]) {\n aabb[5] = p[2];\n }\n\n return aabb;\n },\n\n /**\n * Calculates the normal vector of a triangle.\n *\n * @private\n */\n triangleNormal(a, b, c, normal = math.vec3()) {\n const p1x = b[0] - a[0];\n const p1y = b[1] - a[1];\n const p1z = b[2] - a[2];\n\n const p2x = c[0] - a[0];\n const p2y = c[1] - a[1];\n const p2z = c[2] - a[2];\n\n const p3x = p1y * p2z - p1z * p2y;\n const p3y = p1z * p2x - p1x * p2z;\n const p3z = p1x * p2y - p1y * p2x;\n\n const mag = Math.sqrt(p3x * p3x + p3y * p3y + p3z * p3z);\n if (mag === 0) {\n normal[0] = 0;\n normal[1] = 0;\n normal[2] = 0;\n } else {\n normal[0] = p3x / mag;\n normal[1] = p3y / mag;\n normal[2] = p3z / mag;\n }\n\n return normal\n }\n};\n\nexport {math};","import {math} from \"../../lib/math.js\";\n\nfunction quantizePositions (positions, lenPositions, aabb, quantizedPositions) {\n const xmin = aabb[0];\n const ymin = aabb[1];\n const zmin = aabb[2];\n const xwid = aabb[3] - xmin;\n const ywid = aabb[4] - ymin;\n const zwid = aabb[5] - zmin;\n const maxInt = 65535;\n const xMultiplier = maxInt / xwid;\n const yMultiplier = maxInt / ywid;\n const zMultiplier = maxInt / zwid;\n const verify = (num) => num >= 0 ? num : 0;\n for (let i = 0; i < lenPositions; i += 3) {\n quantizedPositions[i + 0] = Math.max(0, Math.min(65535,Math.floor(verify(positions[i + 0] - xmin) * xMultiplier)));\n quantizedPositions[i + 1] = Math.max(0, Math.min(65535,Math.floor(verify(positions[i + 1] - ymin) * yMultiplier)));\n quantizedPositions[i + 2] = Math.max(0, Math.min(65535,Math.floor(verify(positions[i + 2] - zmin) * zMultiplier)));\n }\n}\n\nfunction compressPosition(p, aabb, q) {\n const multiplier = new Float32Array([\n aabb[3] !== aabb[0] ? 65535 / (aabb[3] - aabb[0]) : 0,\n aabb[4] !== aabb[1] ? 65535 / (aabb[4] - aabb[1]) : 0,\n aabb[5] !== aabb[2] ? 65535 / (aabb[5] - aabb[2]) : 0\n ]);\n q[0] = Math.max(0, Math.min(65535, Math.floor((p[0] - aabb[0]) * multiplier[0])));\n q[1] = Math.max(0, Math.min(65535, Math.floor((p[1] - aabb[1]) * multiplier[1])));\n q[2] = Math.max(0, Math.min(65535, Math.floor((p[2] - aabb[2]) * multiplier[2])));\n}\n\nvar createPositionsDecodeMatrix = (function () {\n const translate = math.mat4();\n const scale = math.mat4();\n return function (aabb, positionsDecodeMatrix) {\n positionsDecodeMatrix = positionsDecodeMatrix || math.mat4();\n const xmin = aabb[0];\n const ymin = aabb[1];\n const zmin = aabb[2];\n const xwid = aabb[3] - xmin;\n const ywid = aabb[4] - ymin;\n const zwid = aabb[5] - zmin;\n const maxInt = 65535;\n math.identityMat4(translate);\n math.translationMat4v(aabb, translate);\n math.identityMat4(scale);\n math.scalingMat4v([xwid / maxInt, ywid / maxInt, zwid / maxInt], scale);\n math.mulMat4(translate, scale, positionsDecodeMatrix);\n return positionsDecodeMatrix;\n };\n})();\n\nfunction transformAndOctEncodeNormals(modelNormalMatrix, normals, lenNormals, compressedNormals, lenCompressedNormals) {\n // http://jcgt.org/published/0003/02/01/\n let oct, dec, best, currentCos, bestCos;\n let i, ei;\n let localNormal = math.vec3();\n let worldNormal = math.vec3();\n for (i = 0; i < lenNormals; i += 3) {\n localNormal[0] = normals[i];\n localNormal[1] = normals[i + 1];\n localNormal[2] = normals[i + 2];\n\n math.transformVec3(modelNormalMatrix, localNormal, worldNormal);\n math.normalizeVec3(worldNormal, worldNormal);\n\n // Test various combinations of ceil and floor to minimize rounding errors\n best = oct = octEncodeVec3(worldNormal, 0, \"floor\", \"floor\");\n dec = octDecodeVec2(oct);\n currentCos = bestCos = dot(worldNormal, 0, dec);\n oct = octEncodeVec3(worldNormal, 0, \"ceil\", \"floor\");\n dec = octDecodeVec2(oct);\n currentCos = dot(worldNormal, 0, dec);\n if (currentCos > bestCos) {\n best = oct;\n bestCos = currentCos;\n }\n oct = octEncodeVec3(worldNormal, 0, \"floor\", \"ceil\");\n dec = octDecodeVec2(oct);\n currentCos = dot(worldNormal, 0, dec);\n if (currentCos > bestCos) {\n best = oct;\n bestCos = currentCos;\n }\n oct = octEncodeVec3(worldNormal, 0, \"ceil\", \"ceil\");\n dec = octDecodeVec2(oct);\n currentCos = dot(worldNormal, 0, dec);\n if (currentCos > bestCos) {\n best = oct;\n bestCos = currentCos;\n }\n compressedNormals[lenCompressedNormals + i + 0] = best[0];\n compressedNormals[lenCompressedNormals + i + 1] = best[1];\n compressedNormals[lenCompressedNormals + i + 2] = 0.0; // Unused\n }\n lenCompressedNormals += lenNormals;\n return lenCompressedNormals;\n}\n\nfunction octEncodeNormals(normals, lenNormals, compressedNormals, lenCompressedNormals) { // http://jcgt.org/published/0003/02/01/\n let oct, dec, best, currentCos, bestCos;\n for (let i = 0; i < lenNormals; i += 3) {\n // Test various combinations of ceil and floor to minimize rounding errors\n best = oct = octEncodeVec3(normals, i, \"floor\", \"floor\");\n dec = octDecodeVec2(oct);\n currentCos = bestCos = dot(normals, i, dec);\n oct = octEncodeVec3(normals, i, \"ceil\", \"floor\");\n dec = octDecodeVec2(oct);\n currentCos = dot(normals, i, dec);\n if (currentCos > bestCos) {\n best = oct;\n bestCos = currentCos;\n }\n oct = octEncodeVec3(normals, i, \"floor\", \"ceil\");\n dec = octDecodeVec2(oct);\n currentCos = dot(normals, i, dec);\n if (currentCos > bestCos) {\n best = oct;\n bestCos = currentCos;\n }\n oct = octEncodeVec3(normals, i, \"ceil\", \"ceil\");\n dec = octDecodeVec2(oct);\n currentCos = dot(normals, i, dec);\n if (currentCos > bestCos) {\n best = oct;\n bestCos = currentCos;\n }\n compressedNormals[lenCompressedNormals + i + 0] = best[0];\n compressedNormals[lenCompressedNormals + i + 1] = best[1];\n compressedNormals[lenCompressedNormals + i + 2] = 0.0; // Unused\n }\n lenCompressedNormals += lenNormals;\n return lenCompressedNormals;\n}\n\n/**\n * @private\n */\nfunction octEncodeVec3(array, i, xfunc, yfunc) { // Oct-encode single normal vector in 2 bytes\n let x = array[i] / (Math.abs(array[i]) + Math.abs(array[i + 1]) + Math.abs(array[i + 2]));\n let y = array[i + 1] / (Math.abs(array[i]) + Math.abs(array[i + 1]) + Math.abs(array[i + 2]));\n if (array[i + 2] < 0) {\n let tempx = (1 - Math.abs(y)) * (x >= 0 ? 1 : -1);\n let tempy = (1 - Math.abs(x)) * (y >= 0 ? 1 : -1);\n x = tempx;\n y = tempy;\n }\n return new Int8Array([\n Math[xfunc](x * 127.5 + (x < 0 ? -1 : 0)),\n Math[yfunc](y * 127.5 + (y < 0 ? -1 : 0))\n ]);\n}\n\n/**\n * Decode an oct-encoded normal\n */\nfunction octDecodeVec2(oct) {\n let x = oct[0];\n let y = oct[1];\n x /= x < 0 ? 127 : 128;\n y /= y < 0 ? 127 : 128;\n const z = 1 - Math.abs(x) - Math.abs(y);\n if (z < 0) {\n x = (1 - Math.abs(y)) * (x >= 0 ? 1 : -1);\n y = (1 - Math.abs(x)) * (y >= 0 ? 1 : -1);\n }\n const length = Math.sqrt(x * x + y * y + z * z);\n return [\n x / length,\n y / length,\n z / length\n ];\n}\n\n/**\n * Dot product of a normal in an array against a candidate decoding\n * @private\n */\nfunction dot(array, i, vec3) {\n return array[i] * vec3[0] + array[i + 1] * vec3[1] + array[i + 2] * vec3[2];\n}\n\n/**\n * @private\n */\nconst geometryCompression = {\n quantizePositions,\n compressPosition,\n createPositionsDecodeMatrix,\n transformAndOctEncodeNormals,\n octEncodeNormals,\n};\n\nexport {geometryCompression}","/*----------------------------------------------------------------------------------------------------------------------\n * NOTE: The values of these constants must match those within xeokit-sdk\n *--------------------------------------------------------------------------------------------------------------------*/\n\n/**\n * Texture wrapping mode in which the texture repeats to infinity.\n */\nexport const RepeatWrapping = 1000;\n\n/**\n * Texture wrapping mode in which the last pixel of the texture stretches to the edge of the mesh.\n */\nexport const ClampToEdgeWrapping = 1001;\n\n/**\n * Texture wrapping mode in which the texture repeats to infinity, mirroring on each repeat.\n */\nexport const MirroredRepeatWrapping = 1002;\n\n/**\n * Texture magnification and minification filter that returns the nearest texel to the given sample coordinates.\n */\nexport const NearestFilter = 1003;\n\n/**\n * Texture minification filter that chooses the mipmap that most closely matches the size of the pixel being textured and returns the nearest texel to the given sample coordinates.\n */\nexport const NearestMipMapNearestFilter = 1004;\n\n/**\n * Texture minification filter that chooses the mipmap that most closely matches the size of the pixel being textured\n * and returns the nearest texel to the given sample coordinates.\n */\nexport const NearestMipmapNearestFilter = 1004;\n\n/**\n * Texture minification filter that chooses two mipmaps that most closely match the size of the pixel being textured\n * and returns the nearest texel to the center of the pixel at the given sample coordinates.\n */\nexport const NearestMipmapLinearFilter = 1005;\n\n/**\n * Texture minification filter that chooses two mipmaps that most closely match the size of the pixel being textured\n * and returns the nearest texel to the center of the pixel at the given sample coordinates.\n */\nexport const NearestMipMapLinearFilter = 1005;\n\n/**\n * Texture magnification and minification filter that returns the weighted average of the four nearest texels to the given sample coordinates.\n */\nexport const LinearFilter = 1006;\n\n/**\n * Texture minification filter that chooses the mipmap that most closely matches the size of the pixel being textured and\n * returns the weighted average of the four nearest texels to the given sample coordinates.\n */\nexport const LinearMipmapNearestFilter = 1007;\n\n/**\n * Texture minification filter that chooses the mipmap that most closely matches the size of the pixel being textured and\n * returns the weighted average of the four nearest texels to the given sample coordinates.\n */\nexport const LinearMipMapNearestFilter = 1007;\n\n/**\n * Texture minification filter that chooses two mipmaps that most closely match the size of the pixel being textured,\n * finds within each mipmap the weighted average of the nearest texel to the center of the pixel, then returns the\n * weighted average of those two values.\n */\nexport const LinearMipmapLinearFilter = 1008;\n\n/**\n * Texture minification filter that chooses two mipmaps that most closely match the size of the pixel being textured,\n * finds within each mipmap the weighted average of the nearest texel to the center of the pixel, then returns the\n * weighted average of those two values.\n */\nexport const LinearMipMapLinearFilter = 1008;\n\n/**\n * Media type for GIF images.\n */\nexport const GIFMediaType = 10000;\n\n/**\n * Media type for JPEG images.\n */\nexport const JPEGMediaType = 10001;\n\n/**\n * Media type for PNG images.\n */\nexport const PNGMediaType = 10002;","import {math} from \"../../lib/math.js\";\n\n/**\n * @private\n */\nconst buildEdgeIndices = (function () {\n\n const uniquePositions = [];\n const indicesLookup = [];\n const indicesReverseLookup = [];\n const weldedIndices = [];\n\n// TODO: Optimize with caching, but need to cater to both compressed and uncompressed positions\n\n const faces = [];\n let numFaces = 0;\n const compa = new Uint16Array(3);\n const compb = new Uint16Array(3);\n const compc = new Uint16Array(3);\n const a = math.vec3();\n const b = math.vec3();\n const c = math.vec3();\n const cb = math.vec3();\n const ab = math.vec3();\n const cross = math.vec3();\n const normal = math.vec3();\n const inverseNormal = math.vec3();\n\n function weldVertices(positions, indices) {\n const positionsMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique)\n let vx;\n let vy;\n let vz;\n let key;\n const precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001\n const precision = Math.pow(10, precisionPoints);\n let i;\n let len;\n let lenUniquePositions = 0;\n for (i = 0, len = positions.length; i < len; i += 3) {\n vx = positions[i];\n vy = positions[i + 1];\n vz = positions[i + 2];\n key = Math.round(vx * precision) + '_' + Math.round(vy * precision) + '_' + Math.round(vz * precision);\n if (positionsMap[key] === undefined) {\n positionsMap[key] = lenUniquePositions / 3;\n uniquePositions[lenUniquePositions++] = vx;\n uniquePositions[lenUniquePositions++] = vy;\n uniquePositions[lenUniquePositions++] = vz;\n }\n indicesLookup[i / 3] = positionsMap[key];\n }\n for (i = 0, len = indices.length; i < len; i++) {\n weldedIndices[i] = indicesLookup[indices[i]];\n indicesReverseLookup[weldedIndices[i]] = indices[i];\n }\n }\n\n function buildFaces(numIndices, positionsDecodeMatrix) {\n numFaces = 0;\n for (let i = 0, len = numIndices; i < len; i += 3) {\n const ia = ((weldedIndices[i]) * 3);\n const ib = ((weldedIndices[i + 1]) * 3);\n const ic = ((weldedIndices[i + 2]) * 3);\n if (positionsDecodeMatrix) {\n compa[0] = uniquePositions[ia];\n compa[1] = uniquePositions[ia + 1];\n compa[2] = uniquePositions[ia + 2];\n compb[0] = uniquePositions[ib];\n compb[1] = uniquePositions[ib + 1];\n compb[2] = uniquePositions[ib + 2];\n compc[0] = uniquePositions[ic];\n compc[1] = uniquePositions[ic + 1];\n compc[2] = uniquePositions[ic + 2];\n // Decode\n math.decompressPosition(compa, positionsDecodeMatrix, a);\n math.decompressPosition(compb, positionsDecodeMatrix, b);\n math.decompressPosition(compc, positionsDecodeMatrix, c);\n } else {\n a[0] = uniquePositions[ia];\n a[1] = uniquePositions[ia + 1];\n a[2] = uniquePositions[ia + 2];\n b[0] = uniquePositions[ib];\n b[1] = uniquePositions[ib + 1];\n b[2] = uniquePositions[ib + 2];\n c[0] = uniquePositions[ic];\n c[1] = uniquePositions[ic + 1];\n c[2] = uniquePositions[ic + 2];\n }\n math.subVec3(c, b, cb);\n math.subVec3(a, b, ab);\n math.cross3Vec3(cb, ab, cross);\n math.normalizeVec3(cross, normal);\n const face = faces[numFaces] || (faces[numFaces] = {normal: math.vec3()});\n face.normal[0] = normal[0];\n face.normal[1] = normal[1];\n face.normal[2] = normal[2];\n numFaces++;\n }\n }\n\n return function (positions, indices, positionsDecodeMatrix, edgeThreshold) {\n weldVertices(positions, indices);\n buildFaces(indices.length, positionsDecodeMatrix);\n const edgeIndices = [];\n const thresholdDot = Math.cos(math.DEGTORAD * edgeThreshold);\n const edges = {};\n let edge1;\n let edge2;\n let index1;\n let index2;\n let key;\n let largeIndex = false;\n let edge;\n let normal1;\n let normal2;\n let dot;\n let ia;\n let ib;\n for (let i = 0, len = indices.length; i < len; i += 3) {\n const faceIndex = i / 3;\n for (let j = 0; j < 3; j++) {\n edge1 = weldedIndices[i + j];\n edge2 = weldedIndices[i + ((j + 1) % 3)];\n index1 = Math.min(edge1, edge2);\n index2 = Math.max(edge1, edge2);\n key = index1 + ',' + index2;\n if (edges[key] === undefined) {\n edges[key] = {\n index1: index1,\n index2: index2,\n face1: faceIndex,\n face2: undefined,\n };\n } else {\n edges[key].face2 = faceIndex;\n }\n }\n }\n for (key in edges) {\n edge = edges[key];\n // an edge is only rendered if the angle (in degrees) between the face normals of the adjoining faces exceeds this value. default = 1 degree.\n if (edge.face2 !== undefined) {\n normal1 = faces[edge.face1].normal;\n normal2 = faces[edge.face2].normal;\n inverseNormal[0] = -normal2[0];\n inverseNormal[1] = -normal2[1];\n inverseNormal[2] = -normal2[2];\n dot = Math.abs(math.dotVec3(normal1, normal2));\n const dot2 = Math.abs(math.dotVec3(normal1, inverseNormal));\n if (dot > thresholdDot && dot2 > thresholdDot) {\n continue;\n }\n }\n ia = indicesReverseLookup[edge.index1];\n ib = indicesReverseLookup[edge.index2];\n if (!largeIndex && ia > 65535 || ib > 65535) {\n largeIndex = true;\n }\n edgeIndices.push(ia);\n edgeIndices.push(ib);\n }\n return (largeIndex) ? new Uint32Array(edgeIndices) : new Uint16Array(edgeIndices);\n };\n})();\n\n\nexport {buildEdgeIndices};","/**\n * Uses edge adjacency counts to identify if the given triangle mesh can be rendered with backface culling enabled.\n *\n * If all edges are connected to exactly two triangles, then the mesh will likely be a closed solid, and we can safely\n * render it with backface culling enabled.\n *\n * Otherwise, the mesh is a surface, and we must render it with backface culling disabled.\n *\n * @private\n */\nconst isTriangleMeshSolid = (indices, positions, vertexIndexMapping, edges) => {\n\n function compareIndexPositions(a, b)\n {\n let posA, posB;\n\n for (let i = 0; i < 3; i++) {\n posA = positions [a*3+i];\n posB = positions [b*3+i];\n\n if (posA !== posB) {\n return posB - posA;\n }\n }\n\n return 0;\n };\n\n // Group together indices corresponding to same position coordinates\n let newIndices = indices.slice ().sort (compareIndexPositions);\n\n // Calculate the mapping:\n // - from original index in indices array\n // - to indices-for-unique-positions\n let uniqueVertexIndex = null;\n\n for (let i = 0, len = newIndices.length; i < len; i++) {\n if (i == 0 || 0 != compareIndexPositions (\n newIndices[i],\n newIndices[i-1],\n )) {\n // different position\n uniqueVertexIndex = newIndices [i];\n }\n\n vertexIndexMapping [\n newIndices[i]\n ] = uniqueVertexIndex;\n }\n\n // Generate the list of edges\n for (let i = 0, len = indices.length; i < len; i += 3) {\n\n const a = vertexIndexMapping[indices[i]];\n const b = vertexIndexMapping[indices[i+1]];\n const c = vertexIndexMapping[indices[i+2]];\n\n let a2 = a;\n let b2 = b;\n let c2 = c;\n\n if (a > b && a > c) {\n if (b > c) {\n a2 = a;\n b2 = b;\n c2 = c;\n } else {\n a2 = a;\n b2 = c;\n c2 = b;\n }\n } else if (b > a && b > c) {\n if (a > c) {\n a2 = b;\n b2 = a;\n c2 = c;\n } else {\n a2 = b;\n b2 = c;\n c2 = a;\n }\n } else if (c > a && c > b) {\n if (a > b) {\n a2 = c;\n b2 = a;\n c2 = b;\n } else {\n a2 = c;\n b2 = b;\n c2 = a;\n }\n }\n\n edges[i+0] = [\n a2, b2\n ];\n edges[i+1] = [\n b2, c2\n ];\n\n if (a2 > c2) {\n const temp = c2;\n c2 = a2;\n a2 = temp;\n }\n\n edges[i+2] = [\n c2, a2\n ];\n }\n\n // Group semantically equivalent edgdes together\n function compareEdges (e1, e2) {\n let a, b;\n\n for (let i = 0; i < 2; i++) {\n a = e1[i];\n b = e2[i];\n\n if (b !== a) {\n return b - a;\n }\n }\n\n return 0;\n }\n\n edges = edges.slice(0, indices.length);\n\n edges.sort (compareEdges);\n\n // Make sure each edge is used exactly twice\n let sameEdgeCount = 0;\n\n for (let i = 0; i < edges.length; i++)\n {\n if (i === 0 || 0 !== compareEdges (\n edges[i], edges[i-1]\n )) {\n // different edge\n if (0 !== i && sameEdgeCount !== 2)\n {\n return false;\n }\n\n sameEdgeCount = 1;\n }\n else\n {\n // same edge\n sameEdgeCount++;\n }\n }\n\n if (edges.length > 0 && sameEdgeCount !== 2)\n {\n return false;\n }\n\n // Each edge is used exactly twice, this is a\n // watertight surface and hence a solid geometry.\n return true;\n};\n\nexport {isTriangleMeshSolid};","/**\n * Represents the usage of a {@link XKTGeometry} by an {@link XKTEntity}.\n *\n * * Created by {@link XKTModel#createEntity}\n * * Stored in {@link XKTEntity#meshes} and {@link XKTModel#meshesList}\n * * Has an {@link XKTGeometry}, and an optional {@link XKTTextureSet}, both of which it can share with other {@link XKTMesh}es\n * * Has {@link XKTMesh#color}, {@link XKTMesh#opacity}, {@link XKTMesh#metallic} and {@link XKTMesh#roughness} PBR attributes\n * @class XKTMesh\n */\nclass XKTMesh {\n\n /**\n * @private\n */\n constructor(cfg) {\n\n /**\n * Unique ID of this XKTMesh in {@link XKTModel#meshes}.\n *\n * @type {Number}\n */\n this.meshId = cfg.meshId;\n\n /**\n * Index of this XKTMesh in {@link XKTModel#meshesList};\n *\n * @type {Number}\n */\n this.meshIndex = cfg.meshIndex;\n\n /**\n * The 4x4 modeling transform matrix.\n *\n * Transform is relative to the center of the {@link XKTTile} that contains this XKTMesh's {@link XKTEntity},\n * which is given in {@link XKTMesh#entity}.\n *\n * When the ````XKTEntity```` shares its {@link XKTGeometry}s with other ````XKTEntity````s, this matrix is used\n * to transform this XKTMesh's XKTGeometry into World-space. When this XKTMesh does not share its ````XKTGeometry````,\n * then this matrix is ignored.\n *\n * @type {Number[]}\n */\n this.matrix = cfg.matrix;\n\n /**\n * The instanced {@link XKTGeometry}.\n *\n * @type {XKTGeometry}\n */\n this.geometry = cfg.geometry;\n\n /**\n * RGB color of this XKTMesh.\n *\n * @type {Float32Array}\n */\n this.color = cfg.color || new Float32Array([1, 1, 1]);\n\n /**\n * PBR metallness of this XKTMesh.\n *\n * @type {Number}\n */\n this.metallic = (cfg.metallic !== null && cfg.metallic !== undefined) ? cfg.metallic : 0;\n\n /**\n * PBR roughness of this XKTMesh.\n * The {@link XKTTextureSet} that defines the appearance of this XKTMesh.\n *\n * @type {Number}\n * @type {XKTTextureSet}\n */\n this.roughness = (cfg.roughness !== null && cfg.roughness !== undefined) ? cfg.roughness : 1;\n\n /**\n * Opacity of this XKTMesh.\n *\n * @type {Number}\n */\n this.opacity = (cfg.opacity !== undefined && cfg.opacity !== null) ? cfg.opacity : 1.0;\n\n /**\n * The {@link XKTTextureSet} that defines the appearance of this XKTMesh.\n *\n * @type {XKTTextureSet}\n */\n this.textureSet = cfg.textureSet;\n\n /**\n * The owner {@link XKTEntity}.\n *\n * Set by {@link XKTModel#createEntity}.\n *\n * @type {XKTEntity}\n */\n this.entity = null; // Set after instantiation, when the Entity is known\n }\n}\n\nexport {XKTMesh};","/**\n * An element of reusable geometry within an {@link XKTModel}.\n *\n * * Created by {@link XKTModel#createGeometry}\n * * Stored in {@link XKTModel#geometries} and {@link XKTModel#geometriesList}\n * * Referenced by {@link XKTMesh}s, which belong to {@link XKTEntity}s\n *\n * @class XKTGeometry\n */\nclass XKTGeometry {\n\n /**\n * @private\n * @param {*} cfg Configuration for the XKTGeometry.\n * @param {Number} cfg.geometryId Unique ID of the geometry in {@link XKTModel#geometries}.\n * @param {String} cfg.primitiveType Type of this geometry - \"triangles\", \"points\" or \"lines\" so far.\n * @param {Number} cfg.geometryIndex Index of this XKTGeometry in {@link XKTModel#geometriesList}.\n * @param {Float64Array} cfg.positions Non-quantized 3D vertex positions.\n * @param {Float32Array} cfg.normals Non-compressed vertex normals.\n * @param {Uint8Array} cfg.colorsCompressed Unsigned 8-bit integer RGBA vertex colors.\n * @param {Float32Array} cfg.uvs Non-compressed vertex UV coordinates.\n * @param {Uint32Array} cfg.indices Indices to organize the vertex positions and normals into triangles.\n * @param {Uint32Array} cfg.edgeIndices Indices to organize the vertex positions into edges.\n */\n constructor(cfg) {\n\n /**\n * Unique ID of this XKTGeometry in {@link XKTModel#geometries}.\n *\n * @type {Number}\n */\n this.geometryId = cfg.geometryId;\n\n /**\n * The type of primitive - \"triangles\" | \"points\" | \"lines\".\n *\n * @type {String}\n */\n this.primitiveType = cfg.primitiveType;\n\n /**\n * Index of this XKTGeometry in {@link XKTModel#geometriesList}.\n *\n * @type {Number}\n */\n this.geometryIndex = cfg.geometryIndex;\n\n /**\n * The number of {@link XKTMesh}s that reference this XKTGeometry.\n *\n * @type {Number}\n */\n this.numInstances = 0;\n\n /**\n * Non-quantized 3D vertex positions.\n *\n * Defined for all primitive types.\n *\n * @type {Float64Array}\n */\n this.positions = cfg.positions;\n\n /**\n * Quantized vertex positions.\n *\n * Defined for all primitive types.\n *\n * This array is later created from {@link XKTGeometry#positions} by {@link XKTModel#finalize}.\n *\n * @type {Uint16Array}\n */\n this.positionsQuantized = new Uint16Array(cfg.positions.length);\n\n /**\n * Non-compressed 3D vertex normals.\n *\n * Defined only for triangle primitives. Can be null if we want xeokit to auto-generate them. Ignored for points and lines.\n *\n * @type {Float32Array}\n */\n this.normals = cfg.normals;\n\n /**\n * Compressed vertex normals.\n *\n * Defined only for triangle primitives. Ignored for points and lines.\n *\n * This array is later created from {@link XKTGeometry#normals} by {@link XKTModel#finalize}.\n *\n * Will be null if {@link XKTGeometry#normals} is also null.\n *\n * @type {Int8Array}\n */\n this.normalsOctEncoded = null;\n\n /**\n * Compressed RGBA vertex colors.\n *\n * Defined only for point primitives. Ignored for triangles and lines.\n *\n * @type {Uint8Array}\n */\n this.colorsCompressed = cfg.colorsCompressed;\n\n /**\n * Non-compressed vertex UVs.\n *\n * @type {Float32Array}\n */\n this.uvs = cfg.uvs;\n\n /**\n * Compressed vertex UVs.\n *\n * @type {Uint16Array}\n */\n this.uvsCompressed = cfg.uvsCompressed;\n\n /**\n * Indices that organize the vertex positions and normals as triangles.\n *\n * Defined only for triangle and lines primitives. Ignored for points.\n *\n * @type {Uint32Array}\n */\n this.indices = cfg.indices;\n\n /**\n * Indices that organize the vertex positions as edges.\n *\n * Defined only for triangle primitives. Ignored for points and lines.\n *\n * @type {Uint32Array}\n */\n this.edgeIndices = cfg.edgeIndices;\n\n /**\n * When {@link XKTGeometry#primitiveType} is \"triangles\", this is ````true```` when this geometry is a watertight mesh.\n *\n * Defined only for triangle primitives. Ignored for points and lines.\n *\n * Set by {@link XKTModel#finalize}.\n *\n * @type {boolean}\n */\n this.solid = false;\n }\n\n /**\n * Convenience property that is ````true```` when {@link XKTGeometry#numInstances} is greater that one.\n * @returns {boolean}\n */\n get reused() {\n return (this.numInstances > 1);\n }\n}\n\nexport {XKTGeometry};","import {math} from \"../lib/math.js\";\n\n/**\n * An object within an {@link XKTModel}.\n *\n * * Created by {@link XKTModel#createEntity}\n * * Stored in {@link XKTModel#entities} and {@link XKTModel#entitiesList}\n * * Has one or more {@link XKTMesh}s, each having an {@link XKTGeometry}\n *\n * @class XKTEntity\n */\nclass XKTEntity {\n\n /**\n * @private\n * @param entityId\n * @param meshes\n */\n constructor(entityId, meshes) {\n\n /**\n * Unique ID of this ````XKTEntity```` in {@link XKTModel#entities}.\n *\n * For a BIM model, this will be an IFC product ID.\n *\n * We can also use {@link XKTModel#createMetaObject} to create an {@link XKTMetaObject} to specify metadata for\n * this ````XKTEntity````. To associate the {@link XKTMetaObject} with our {@link XKTEntity}, we give\n * {@link XKTMetaObject#metaObjectId} the same value as {@link XKTEntity#entityId}.\n *\n * @type {String}\n */\n this.entityId = entityId;\n\n /**\n * Index of this ````XKTEntity```` in {@link XKTModel#entitiesList}.\n *\n * Set by {@link XKTModel#finalize}.\n *\n * @type {Number}\n */\n this.entityIndex = null;\n\n /**\n * A list of {@link XKTMesh}s that indicate which {@link XKTGeometry}s are used by this Entity.\n *\n * @type {XKTMesh[]}\n */\n this.meshes = meshes;\n\n /**\n * World-space axis-aligned bounding box (AABB) that encloses the {@link XKTGeometry#positions} of\n * the {@link XKTGeometry}s that are used by this ````XKTEntity````.\n *\n * Set by {@link XKTModel#finalize}.\n *\n * @type {Float32Array}\n */\n this.aabb = math.AABB3();\n\n /**\n * Indicates if this ````XKTEntity```` shares {@link XKTGeometry}s with other {@link XKTEntity}'s.\n *\n * Set by {@link XKTModel#finalize}.\n *\n * Note that when an ````XKTEntity```` shares ````XKTGeometrys````, it shares **all** of its ````XKTGeometrys````. An ````XKTEntity````\n * never shares only some of its ````XKTGeometrys```` - it always shares either the whole set or none at all.\n *\n * @type {Boolean}\n */\n this.hasReusedGeometries = false;\n }\n}\n\nexport {XKTEntity};","/**\n * @desc A box-shaped 3D region within an {@link XKTModel} that contains {@link XKTEntity}s.\n *\n * * Created by {@link XKTModel#finalize}\n * * Stored in {@link XKTModel#tilesList}\n *\n * @class XKTTile\n */\nclass XKTTile {\n\n /**\n * Creates a new XKTTile.\n *\n * @private\n * @param aabb\n * @param entities\n */\n constructor(aabb, entities) {\n\n /**\n * Axis-aligned World-space bounding box that encloses the {@link XKTEntity}'s within this Tile.\n *\n * @type {Float64Array}\n */\n this.aabb = aabb;\n\n /**\n * The {@link XKTEntity}'s within this XKTTile.\n *\n * @type {XKTEntity[]}\n */\n this.entities = entities;\n }\n}\n\nexport {XKTTile};","/**\n * A kd-Tree node, used internally by {@link XKTModel}.\n *\n * @private\n */\nclass KDNode {\n\n /**\n * Create a KDNode with an axis-aligned 3D World-space boundary.\n */\n constructor(aabb) {\n\n /**\n * The axis-aligned 3D World-space boundary of this KDNode.\n *\n * @type {Float64Array}\n */\n this.aabb = aabb;\n\n /**\n * The {@link XKTEntity}s within this KDNode.\n */\n this.entities = null;\n\n /**\n * The left child KDNode.\n */\n this.left = null;\n\n /**\n * The right child KDNode.\n */\n this.right = null;\n }\n}\n\nexport {KDNode};","/**\n * A meta object within an {@link XKTModel}.\n *\n * These are plugged together into a parent-child hierarchy to represent structural\n * metadata for the {@link XKTModel}.\n *\n * The leaf XKTMetaObjects are usually associated with\n * an {@link XKTEntity}, which they do so by sharing the same ID,\n * ie. where {@link XKTMetaObject#metaObjectId} == {@link XKTEntity#entityId}.\n *\n * * Created by {@link XKTModel#createMetaObject}\n * * Stored in {@link XKTModel#metaObjects} and {@link XKTModel#metaObjectsList}\n * * Has an ID, a type, and a human-readable name\n * * May have a parent {@link XKTMetaObject}\n * * When no children, is usually associated with an {@link XKTEntity}\n *\n * @class XKTMetaObject\n */\nclass XKTMetaObject {\n\n /**\n * @private\n * @param metaObjectId\n * @param propertySetIds\n * @param metaObjectType\n * @param metaObjectName\n * @param parentMetaObjectId\n */\n constructor(metaObjectId, propertySetIds, metaObjectType, metaObjectName, parentMetaObjectId) {\n\n /**\n * Unique ID of this ````XKTMetaObject```` in {@link XKTModel#metaObjects}.\n *\n * For a BIM model, this will be an IFC product ID.\n *\n * If this is a leaf XKTMetaObject, where it is not a parent to any other XKTMetaObject,\n * then this will be equal to the ID of an {@link XKTEntity} in {@link XKTModel#entities},\n * ie. where {@link XKTMetaObject#metaObjectId} == {@link XKTEntity#entityId}.\n *\n * @type {String}\n */\n this.metaObjectId = metaObjectId;\n\n /**\n * Unique ID of one or more property sets that contains additional metadata about this\n * {@link XKTMetaObject}. The property sets can be stored in an external system, or\n * within the {@link XKTModel}, as {@link XKTPropertySet}s within {@link XKTModel#propertySets}.\n *\n * @type {String[]}\n */\n this.propertySetIds = propertySetIds;\n\n /**\n * Indicates the XKTMetaObject meta object type.\n *\n * This defaults to \"default\".\n *\n * @type {string}\n */\n this.metaObjectType = metaObjectType;\n\n /**\n * Indicates the XKTMetaObject meta object name.\n *\n * This defaults to {@link XKTMetaObject#metaObjectId}.\n *\n * @type {string}\n */\n this.metaObjectName = metaObjectName;\n\n /**\n * The parent XKTMetaObject, if any.\n *\n * Will be null if there is no parent.\n *\n * @type {String}\n */\n this.parentMetaObjectId = parentMetaObjectId;\n }\n}\n\nexport {XKTMetaObject};","/**\n * A property set within an {@link XKTModel}.\n *\n * These are shared among {@link XKTMetaObject}s.\n *\n * * Created by {@link XKTModel#createPropertySet}\n * * Stored in {@link XKTModel#propertySets} and {@link XKTModel#propertySetsList}\n * * Has an ID, a type, and a human-readable name\n *\n * @class XKTPropertySet\n */\nclass XKTPropertySet {\n\n /**\n * @private\n */\n constructor(propertySetId, propertySetType, propertySetName, properties) {\n\n /**\n * Unique ID of this ````XKTPropertySet```` in {@link XKTModel#propertySets}.\n *\n * @type {String}\n */\n this.propertySetId = propertySetId;\n\n /**\n * Indicates the ````XKTPropertySet````'s type.\n *\n * This defaults to \"default\".\n *\n * @type {string}\n */\n this.propertySetType = propertySetType;\n\n /**\n * Indicates the XKTPropertySet meta object name.\n *\n * This defaults to {@link XKTPropertySet#propertySetId}.\n *\n * @type {string}\n */\n this.propertySetName = propertySetName;\n\n /**\n * The properties within this ````XKTPropertySet````.\n *\n * @type {*[]}\n */\n this.properties = properties;\n }\n}\n\nexport {XKTPropertySet};","/**\n * A texture shared by {@link XKTTextureSet}s.\n *\n * * Created by {@link XKTModel#createTexture}\n * * Stored in {@link XKTTextureSet#textures}, {@link XKTModel#textures} and {@link XKTModel#texturesList}\n *\n * @class XKTTexture\n */\nimport {RepeatWrapping, LinearMipMapNearestFilter} from \"../constants\";\n\nclass XKTTexture {\n\n /**\n * @private\n */\n constructor(cfg) {\n\n /**\n * Unique ID of this XKTTexture in {@link XKTModel#textures}.\n *\n * @type {Number}\n */\n this.textureId = cfg.textureId;\n\n /**\n * Index of this XKTTexture in {@link XKTModel#texturesList};\n *\n * @type {Number}\n */\n this.textureIndex = cfg.textureIndex;\n\n /**\n * Texture image data.\n *\n * @type {Buffer}\n */\n this.imageData = cfg.imageData;\n\n /**\n * Which material channel this texture is applied to, as determined by its {@link XKTTextureSet}s.\n *\n * @type {Number}\n */\n this.channel = null;\n\n /**\n * Width of this XKTTexture.\n *\n * @type {Number}\n */\n this.width = cfg.width;\n\n /**\n * Height of this XKTTexture.\n *\n * @type {Number}\n */\n this.height = cfg.height;\n\n /**\n * Texture file source.\n *\n * @type {String}\n */\n this.src = cfg.src;\n\n /**\n * Whether this XKTTexture is to be compressed.\n *\n * @type {Boolean}\n */\n this.compressed = (!!cfg.compressed);\n\n /**\n * Media type of this XKTTexture.\n *\n * Supported values are {@link GIFMediaType}, {@link PNGMediaType} and {@link JPEGMediaType}.\n *\n * Ignored for compressed textures.\n *\n * @type {Number}\n */\n this.mediaType = cfg.mediaType;\n\n /**\n * How the texture is sampled when a texel covers less than one pixel. Supported values\n * are {@link LinearMipmapLinearFilter}, {@link LinearMipMapNearestFilter},\n * {@link NearestMipMapNearestFilter}, {@link NearestMipMapLinearFilter}\n * and {@link LinearMipMapLinearFilter}.\n *\n * Ignored for compressed textures.\n *\n * @type {Number}\n */\n this.minFilter = cfg.minFilter || LinearMipMapNearestFilter;\n\n /**\n * How the texture is sampled when a texel covers more than one pixel. Supported values\n * are {@link LinearFilter} and {@link NearestFilter}.\n *\n * Ignored for compressed textures.\n *\n * @type {Number}\n */\n this.magFilter = cfg.magFilter || LinearMipMapNearestFilter;\n\n /**\n * S wrapping mode.\n *\n * Supported values are {@link ClampToEdgeWrapping},\n * {@link MirroredRepeatWrapping} and {@link RepeatWrapping}.\n *\n * Ignored for compressed textures.\n *\n * @type {Number}\n */\n this.wrapS = cfg.wrapS || RepeatWrapping;\n\n /**\n * T wrapping mode.\n *\n * Supported values are {@link ClampToEdgeWrapping},\n * {@link MirroredRepeatWrapping} and {@link RepeatWrapping}.\n *\n * Ignored for compressed textures.\n *\n * @type {Number}\n */\n this.wrapT = cfg.wrapT || RepeatWrapping;\n\n /**\n * R wrapping mode.\n *\n * Ignored for compressed textures.\n *\n * Supported values are {@link ClampToEdgeWrapping},\n * {@link MirroredRepeatWrapping} and {@link RepeatWrapping}.\n *\n * @type {*|number}\n */\n this.wrapR = cfg.wrapR || RepeatWrapping\n }\n}\n\nexport {XKTTexture};","/**\n * A set of textures shared by {@link XKTMesh}es.\n *\n * * Created by {@link XKTModel#createTextureSet}\n * * Registered in {@link XKTMesh#material}, {@link XKTModel#materials} and {@link XKTModel#.textureSetsList}\n *\n * @class XKTMetalRoughMaterial\n */\nclass XKTTextureSet {\n\n /**\n * @private\n */\n constructor(cfg) {\n\n /**\n * Unique ID of this XKTTextureSet in {@link XKTModel#materials}.\n *\n * @type {Number}\n */\n this.textureSetId = cfg.textureSetId;\n\n /**\n * Index of this XKTTexture in {@link XKTModel#texturesList};\n *\n * @type {Number}\n */\n this.textureSetIndex = cfg.textureSetIndex;\n\n /**\n * Identifies the material type.\n *\n * @type {Number}\n */\n this.materialType = cfg.materialType;\n\n /**\n * Index of this XKTTextureSet in {@link XKTModel#meshesList};\n *\n * @type {Number}\n */\n this.materialIndex = cfg.materialIndex;\n\n /**\n * The number of {@link XKTMesh}s that reference this XKTTextureSet.\n *\n * @type {Number}\n */\n this.numInstances = 0;\n\n /**\n * RGBA {@link XKTTexture} containing base color in RGB and opacity in A.\n *\n * @type {XKTTexture}\n */\n this.colorTexture = cfg.colorTexture;\n\n /**\n * RGBA {@link XKTTexture} containing metallic and roughness factors in R and G.\n *\n * @type {XKTTexture}\n */\n this.metallicRoughnessTexture = cfg.metallicRoughnessTexture;\n\n /**\n * RGBA {@link XKTTexture} with surface normals in RGB.\n *\n * @type {XKTTexture}\n */\n this.normalsTexture = cfg.normalsTexture;\n\n /**\n * RGBA {@link XKTTexture} with emissive color in RGB.\n *\n * @type {XKTTexture}\n */\n this.emissiveTexture = cfg.emissiveTexture;\n\n /**\n * RGBA {@link XKTTexture} with ambient occlusion factors in RGB.\n *\n * @type {XKTTexture}\n */\n this.occlusionTexture = cfg.occlusionTexture;\n }\n}\n\nexport {XKTTextureSet};","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@loaders.gl/core\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@loaders.gl/textures\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@loaders.gl/images\");","import {math} from \"../lib/math.js\";\nimport {geometryCompression} from \"./lib/geometryCompression.js\";\nimport {buildEdgeIndices} from \"./lib/buildEdgeIndices.js\";\nimport {isTriangleMeshSolid} from \"./lib/isTriangleMeshSolid.js\";\n\nimport {XKTMesh} from './XKTMesh.js';\nimport {XKTGeometry} from './XKTGeometry.js';\nimport {XKTEntity} from './XKTEntity.js';\nimport {XKTTile} from './XKTTile.js';\nimport {KDNode} from \"./KDNode.js\";\nimport {XKTMetaObject} from \"./XKTMetaObject.js\";\nimport {XKTPropertySet} from \"./XKTPropertySet.js\";\nimport {mergeVertices} from \"../lib/mergeVertices.js\";\nimport {XKT_INFO} from \"../XKT_INFO.js\";\nimport {XKTTexture} from \"./XKTTexture\";\nimport {XKTTextureSet} from \"./XKTTextureSet\";\nimport {encode, load} from \"@loaders.gl/core\";\nimport {KTX2BasisWriter} from \"@loaders.gl/textures\";\nimport {ImageLoader} from '@loaders.gl/images';\n\nconst tempVec4a = math.vec4([0, 0, 0, 1]);\nconst tempVec4b = math.vec4([0, 0, 0, 1]);\n\nconst tempMat4 = math.mat4();\nconst tempMat4b = math.mat4();\n\nconst kdTreeDimLength = new Float64Array(3);\n\n// XKT texture types\n\nconst COLOR_TEXTURE = 0;\nconst METALLIC_ROUGHNESS_TEXTURE = 1;\nconst NORMALS_TEXTURE = 2;\nconst EMISSIVE_TEXTURE = 3;\nconst OCCLUSION_TEXTURE = 4;\n\n// KTX2 encoding options for each texture type\n\nconst TEXTURE_ENCODING_OPTIONS = {}\nTEXTURE_ENCODING_OPTIONS[COLOR_TEXTURE] = {\n useSRGB: true,\n qualityLevel: 50,\n encodeUASTC: true,\n mipmaps: true\n};\nTEXTURE_ENCODING_OPTIONS[EMISSIVE_TEXTURE] = {\n useSRGB: true,\n encodeUASTC: true,\n qualityLevel: 10,\n mipmaps: false\n};\nTEXTURE_ENCODING_OPTIONS[METALLIC_ROUGHNESS_TEXTURE] = {\n useSRGB: false,\n encodeUASTC: true,\n qualityLevel: 50,\n mipmaps: true // Needed for GGX roughness shading\n};\nTEXTURE_ENCODING_OPTIONS[NORMALS_TEXTURE] = {\n useSRGB: false,\n encodeUASTC: true,\n qualityLevel: 10,\n mipmaps: false\n};\nTEXTURE_ENCODING_OPTIONS[OCCLUSION_TEXTURE] = {\n useSRGB: false,\n encodeUASTC: true,\n qualityLevel: 10,\n mipmaps: false\n};\n\n/**\n * A document model that represents the contents of an .XKT file.\n *\n * * An XKTModel contains {@link XKTTile}s, which spatially subdivide the model into axis-aligned, box-shaped regions.\n * * Each {@link XKTTile} contains {@link XKTEntity}s, which represent the objects within its region.\n * * Each {@link XKTEntity} has {@link XKTMesh}s, which each have a {@link XKTGeometry}. Each {@link XKTGeometry} can be shared by multiple {@link XKTMesh}s.\n * * Import models into an XKTModel using {@link parseGLTFJSONIntoXKTModel}, {@link parseIFCIntoXKTModel}, {@link parseCityJSONIntoXKTModel} etc.\n * * Build an XKTModel programmatically using {@link XKTModel#createGeometry}, {@link XKTModel#createMesh} and {@link XKTModel#createEntity}.\n * * Serialize an XKTModel to an ArrayBuffer using {@link writeXKTModelToArrayBuffer}.\n *\n * ## Usage\n *\n * See [main docs page](/docs/#javascript-api) for usage examples.\n *\n * @class XKTModel\n */\nclass XKTModel {\n\n /**\n * Constructs a new XKTModel.\n *\n * @param {*} [cfg] Configuration\n * @param {Number} [cfg.edgeThreshold=10]\n * @param {Number} [cfg.minTileSize=500]\n */\n constructor(cfg = {}) {\n\n /**\n * The model's ID, if available.\n *\n * Will be \"default\" by default.\n *\n * @type {String}\n */\n this.modelId = cfg.modelId || \"default\";\n\n /**\n * The project ID, if available.\n *\n * Will be an empty string by default.\n *\n * @type {String}\n */\n this.projectId = cfg.projectId || \"\";\n\n /**\n * The revision ID, if available.\n *\n * Will be an empty string by default.\n *\n * @type {String}\n */\n this.revisionId = cfg.revisionId || \"\";\n\n /**\n * The model author, if available.\n *\n * Will be an empty string by default.\n *\n * @property author\n * @type {String}\n */\n this.author = cfg.author || \"\";\n\n /**\n * The date the model was created, if available.\n *\n * Will be an empty string by default.\n *\n * @property createdAt\n * @type {String}\n */\n this.createdAt = cfg.createdAt || \"\";\n\n /**\n * The application that created the model, if available.\n *\n * Will be an empty string by default.\n *\n * @property creatingApplication\n * @type {String}\n */\n this.creatingApplication = cfg.creatingApplication || \"\";\n\n /**\n * The model schema version, if available.\n *\n * In the case of IFC, this could be \"IFC2x3\" or \"IFC4\", for example.\n *\n * Will be an empty string by default.\n *\n * @property schema\n * @type {String}\n */\n this.schema = cfg.schema || \"\";\n\n /**\n * The XKT format version.\n *\n * @property xktVersion;\n * @type {number}\n */\n this.xktVersion = XKT_INFO.xktVersion;\n\n /**\n *\n * @type {Number|number}\n */\n this.edgeThreshold = cfg.edgeThreshold || 10;\n\n /**\n * Minimum diagonal size of the boundary of an {@link XKTTile}.\n *\n * @type {Number|number}\n */\n this.minTileSize = cfg.minTileSize || 500;\n\n /**\n * Optional overall AABB that contains all the {@link XKTEntity}s we'll create in this model, if previously known.\n *\n * This is the AABB of a complete set of input files that are provided as a split-model set for conversion.\n *\n * This is used to help the {@link XKTTile.aabb}s within split models align neatly with each other, as we\n * build them with a k-d tree in {@link XKTModel#finalize}. Without this, the AABBs of the different parts\n * tend to misalign slightly, resulting in excess number of {@link XKTTile}s, which degrades memory and rendering\n * performance when the XKT is viewer in the xeokit Viewer.\n */\n this.modelAABB = cfg.modelAABB;\n\n /**\n * Map of {@link XKTPropertySet}s within this XKTModel, each mapped to {@link XKTPropertySet#propertySetId}.\n *\n * Created by {@link XKTModel#createPropertySet}.\n *\n * @type {{String:XKTPropertySet}}\n */\n this.propertySets = {};\n\n /**\n * {@link XKTPropertySet}s within this XKTModel.\n *\n * Each XKTPropertySet holds its position in this list in {@link XKTPropertySet#propertySetIndex}.\n *\n * Created by {@link XKTModel#finalize}.\n *\n * @type {XKTPropertySet[]}\n */\n this.propertySetsList = [];\n\n /**\n * Map of {@link XKTMetaObject}s within this XKTModel, each mapped to {@link XKTMetaObject#metaObjectId}.\n *\n * Created by {@link XKTModel#createMetaObject}.\n *\n * @type {{String:XKTMetaObject}}\n */\n this.metaObjects = {};\n\n /**\n * {@link XKTMetaObject}s within this XKTModel.\n *\n * Each XKTMetaObject holds its position in this list in {@link XKTMetaObject#metaObjectIndex}.\n *\n * Created by {@link XKTModel#finalize}.\n *\n * @type {XKTMetaObject[]}\n */\n this.metaObjectsList = [];\n\n /**\n * The positions of all shared {@link XKTGeometry}s are de-quantized using this singular\n * de-quantization matrix.\n *\n * This de-quantization matrix is generated from the collective Local-space boundary of the\n * positions of all shared {@link XKTGeometry}s.\n *\n * @type {Float32Array}\n */\n this.reusedGeometriesDecodeMatrix = new Float32Array(16);\n\n /**\n * Map of {@link XKTGeometry}s within this XKTModel, each mapped to {@link XKTGeometry#geometryId}.\n *\n * Created by {@link XKTModel#createGeometry}.\n *\n * @type {{Number:XKTGeometry}}\n */\n this.geometries = {};\n\n /**\n * List of {@link XKTGeometry}s within this XKTModel, in the order they were created.\n *\n * Each XKTGeometry holds its position in this list in {@link XKTGeometry#geometryIndex}.\n *\n * Created by {@link XKTModel#finalize}.\n *\n * @type {XKTGeometry[]}\n */\n this.geometriesList = [];\n\n /**\n * Map of {@link XKTTexture}s within this XKTModel, each mapped to {@link XKTTexture#textureId}.\n *\n * Created by {@link XKTModel#createTexture}.\n *\n * @type {{Number:XKTTexture}}\n */\n this.textures = {};\n\n /**\n * List of {@link XKTTexture}s within this XKTModel, in the order they were created.\n *\n * Each XKTTexture holds its position in this list in {@link XKTTexture#textureIndex}.\n *\n * Created by {@link XKTModel#finalize}.\n *\n * @type {XKTTexture[]}\n */\n this.texturesList = [];\n\n /**\n * Map of {@link XKTTextureSet}s within this XKTModel, each mapped to {@link XKTTextureSet#textureSetId}.\n *\n * Created by {@link XKTModel#createTextureSet}.\n *\n * @type {{Number:XKTTextureSet}}\n */\n this.textureSets = {};\n\n /**\n * List of {@link XKTTextureSet}s within this XKTModel, in the order they were created.\n *\n * Each XKTTextureSet holds its position in this list in {@link XKTTextureSet#textureSetIndex}.\n *\n * Created by {@link XKTModel#finalize}.\n *\n * @type {XKTTextureSet[]}\n */\n this.textureSetsList = [];\n\n /**\n * Map of {@link XKTMesh}s within this XKTModel, each mapped to {@link XKTMesh#meshId}.\n *\n * Created by {@link XKTModel#createMesh}.\n *\n * @type {{Number:XKTMesh}}\n */\n this.meshes = {};\n\n /**\n * List of {@link XKTMesh}s within this XKTModel, in the order they were created.\n *\n * Each XKTMesh holds its position in this list in {@link XKTMesh#meshIndex}.\n *\n * Created by {@link XKTModel#finalize}.\n *\n * @type {XKTMesh[]}\n */\n this.meshesList = [];\n\n /**\n * Map of {@link XKTEntity}s within this XKTModel, each mapped to {@link XKTEntity#entityId}.\n *\n * Created by {@link XKTModel#createEntity}.\n *\n * @type {{String:XKTEntity}}\n */\n this.entities = {};\n\n /**\n * {@link XKTEntity}s within this XKTModel.\n *\n * Each XKTEntity holds its position in this list in {@link XKTEntity#entityIndex}.\n *\n * Created by {@link XKTModel#finalize}.\n *\n * @type {XKTEntity[]}\n */\n this.entitiesList = [];\n\n /**\n * {@link XKTTile}s within this XKTModel.\n *\n * Created by {@link XKTModel#finalize}.\n *\n * @type {XKTTile[]}\n */\n this.tilesList = [];\n\n /**\n * The axis-aligned 3D World-space boundary of this XKTModel.\n *\n * Created by {@link XKTModel#finalize}.\n *\n * @type {Float64Array}\n */\n this.aabb = math.AABB3();\n\n /**\n * Indicates if this XKTModel has been finalized.\n *\n * Set ````true```` by {@link XKTModel#finalize}.\n *\n * @type {boolean}\n */\n this.finalized = false;\n }\n\n /**\n * Creates an {@link XKTPropertySet} within this XKTModel.\n *\n * Logs error and does nothing if this XKTModel has been finalized (see {@link XKTModel#finalized}).\n *\n * @param {*} params Method parameters.\n * @param {String} params.propertySetId Unique ID for the {@link XKTPropertySet}.\n * @param {String} [params.propertySetType=\"default\"] A meta type for the {@link XKTPropertySet}.\n * @param {String} [params.propertySetName] Human-readable name for the {@link XKTPropertySet}. Defaults to the ````propertySetId```` parameter.\n * @param {String[]} params.properties Properties for the {@link XKTPropertySet}.\n * @returns {XKTPropertySet} The new {@link XKTPropertySet}.\n */\n createPropertySet(params) {\n\n if (!params) {\n throw \"Parameters expected: params\";\n }\n\n if (params.propertySetId === null || params.propertySetId === undefined) {\n throw \"Parameter expected: params.propertySetId\";\n }\n\n if (params.properties === null || params.properties === undefined) {\n throw \"Parameter expected: params.properties\";\n }\n\n if (this.finalized) {\n console.error(\"XKTModel has been finalized, can't add more property sets\");\n return;\n }\n\n if (this.propertySets[params.propertySetId]) {\n // console.error(\"XKTPropertySet already exists with this ID: \" + params.propertySetId);\n return;\n }\n\n const propertySetId = params.propertySetId;\n const propertySetType = params.propertySetType || \"Default\";\n const propertySetName = params.propertySetName || params.propertySetId;\n const properties = params.properties || [];\n\n const propertySet = new XKTPropertySet(propertySetId, propertySetType, propertySetName, properties);\n\n this.propertySets[propertySetId] = propertySet;\n this.propertySetsList.push(propertySet);\n\n return propertySet;\n }\n\n /**\n * Creates an {@link XKTMetaObject} within this XKTModel.\n *\n * Logs error and does nothing if this XKTModel has been finalized (see {@link XKTModel#finalized}).\n *\n * @param {*} params Method parameters.\n * @param {String} params.metaObjectId Unique ID for the {@link XKTMetaObject}.\n * @param {String} params.propertySetIds ID of one or more property sets that contains additional metadata about\n * this {@link XKTMetaObject}. The property sets could be stored externally (ie not managed at all by the XKT file),\n * or could be {@link XKTPropertySet}s within {@link XKTModel#propertySets}.\n * @param {String} [params.metaObjectType=\"default\"] A meta type for the {@link XKTMetaObject}. Can be anything,\n * but is usually an IFC type, such as \"IfcSite\" or \"IfcWall\".\n * @param {String} [params.metaObjectName] Human-readable name for the {@link XKTMetaObject}. Defaults to the ````metaObjectId```` parameter.\n * @param {String} [params.parentMetaObjectId] ID of the parent {@link XKTMetaObject}, if any. Defaults to the ````metaObjectId```` parameter.\n * @returns {XKTMetaObject} The new {@link XKTMetaObject}.\n */\n createMetaObject(params) {\n\n if (!params) {\n throw \"Parameters expected: params\";\n }\n\n if (params.metaObjectId === null || params.metaObjectId === undefined) {\n throw \"Parameter expected: params.metaObjectId\";\n }\n\n if (this.finalized) {\n console.error(\"XKTModel has been finalized, can't add more meta objects\");\n return;\n }\n\n if (this.metaObjects[params.metaObjectId]) {\n // console.error(\"XKTMetaObject already exists with this ID: \" + params.metaObjectId);\n return;\n }\n\n const metaObjectId = params.metaObjectId;\n const propertySetIds = params.propertySetIds;\n const metaObjectType = params.metaObjectType || \"Default\";\n const metaObjectName = params.metaObjectName || params.metaObjectId;\n const parentMetaObjectId = params.parentMetaObjectId;\n\n const metaObject = new XKTMetaObject(metaObjectId, propertySetIds, metaObjectType, metaObjectName, parentMetaObjectId);\n\n this.metaObjects[metaObjectId] = metaObject;\n this.metaObjectsList.push(metaObject);\n\n if (!parentMetaObjectId) {\n if (!this._rootMetaObject) {\n this._rootMetaObject = metaObject;\n }\n }\n\n return metaObject;\n }\n\n /**\n * Creates an {@link XKTTexture} within this XKTModel.\n *\n * Registers the new {@link XKTTexture} in {@link XKTModel#textures} and {@link XKTModel#texturesList}.\n *\n * Logs error and does nothing if this XKTModel has been finalized (see {@link XKTModel#finalized}).\n *\n * @param {*} params Method parameters.\n * @param {Number} params.textureId Unique ID for the {@link XKTTexture}.\n * @param {String} [params.src] Source of an image file for the texture.\n * @param {Buffer} [params.imageData] Image data for the texture.\n * @param {Number} [params.mediaType] Media type (ie. MIME type) of ````imageData````. Supported values are {@link GIFMediaType}, {@link PNGMediaType} and {@link JPEGMediaType}.\n * @param {Number} [params.width] Texture width, used with ````imageData````. Ignored for compressed textures.\n * @param {Number} [params.height] Texture height, used with ````imageData````. Ignored for compressed textures.\n * @param {Boolean} [params.compressed=true] Whether to compress the texture.\n * @param {Number} [params.minFilter=LinearMipMapNearestFilter] How the texture is sampled when a texel covers less than one pixel. Supported\n * values are {@link LinearMipmapLinearFilter}, {@link LinearMipMapNearestFilter}, {@link NearestMipMapNearestFilter},\n * {@link NearestMipMapLinearFilter} and {@link LinearMipMapLinearFilter}. Ignored for compressed textures.\n * @param {Number} [params.magFilter=LinearMipMapNearestFilter] How the texture is sampled when a texel covers more than one pixel. Supported values\n * are {@link LinearFilter} and {@link NearestFilter}. Ignored for compressed textures.\n * @param {Number} [params.wrapS=RepeatWrapping] Wrap parameter for texture coordinate *S*. Supported values are {@link ClampToEdgeWrapping},\n * {@link MirroredRepeatWrapping} and {@link RepeatWrapping}. Ignored for compressed textures.\n * @param {Number} [params.wrapT=RepeatWrapping] Wrap parameter for texture coordinate *T*. Supported values are {@link ClampToEdgeWrapping},\n * {@link MirroredRepeatWrapping} and {@link RepeatWrapping}. Ignored for compressed textures.\n * {@param {Number} [params.wrapR=RepeatWrapping] Wrap parameter for texture coordinate *R*. Supported values are {@link ClampToEdgeWrapping},\n * {@link MirroredRepeatWrapping} and {@link RepeatWrapping}. Ignored for compressed textures.\n * @returns {XKTTexture} The new {@link XKTTexture}.\n */\n createTexture(params) {\n\n if (!params) {\n throw \"Parameters expected: params\";\n }\n\n if (params.textureId === null || params.textureId === undefined) {\n throw \"Parameter expected: params.textureId\";\n }\n\n if (!params.imageData && !params.src) {\n throw \"Parameter expected: params.imageData or params.src\";\n }\n\n if (this.finalized) {\n console.error(\"XKTModel has been finalized, can't add more textures\");\n return;\n }\n\n if (this.textures[params.textureId]) {\n console.error(\"XKTTexture already exists with this ID: \" + params.textureId);\n return;\n }\n\n if (params.src) {\n const fileExt = params.src.split('.').pop();\n if (fileExt !== \"jpg\" && fileExt !== \"jpeg\" && fileExt !== \"png\") {\n console.error(`XKTModel does not support image files with extension '${fileExt}' - won't create texture '${params.textureId}`);\n return;\n }\n }\n\n const textureId = params.textureId;\n\n const texture = new XKTTexture({\n textureId,\n imageData: params.imageData,\n mediaType: params.mediaType,\n minFilter: params.minFilter,\n magFilter: params.magFilter,\n wrapS: params.wrapS,\n wrapT: params.wrapT,\n wrapR: params.wrapR,\n width: params.width,\n height: params.height,\n compressed: (params.compressed !== false),\n src: params.src\n });\n\n this.textures[textureId] = texture;\n this.texturesList.push(texture);\n\n return texture;\n }\n\n /**\n * Creates an {@link XKTTextureSet} within this XKTModel.\n *\n * Registers the new {@link XKTTextureSet} in {@link XKTModel#textureSets} and {@link XKTModel#.textureSetsList}.\n *\n * Logs error and does nothing if this XKTModel has been finalized (see {@link XKTModel#finalized}).\n *\n * @param {*} params Method parameters.\n * @param {Number} params.textureSetId Unique ID for the {@link XKTTextureSet}.\n * @param {*} [params.colorTextureId] ID of *RGBA* base color {@link XKTTexture}, with color in *RGB* and alpha in *A*.\n * @param {*} [params.metallicRoughnessTextureId] ID of *RGBA* metal-roughness {@link XKTTexture}, with the metallic factor in *R*, and roughness factor in *G*.\n * @param {*} [params.normalsTextureId] ID of *RGBA* normal {@link XKTTexture}, with normal map vectors in *RGB*.\n * @param {*} [params.emissiveTextureId] ID of *RGBA* emissive {@link XKTTexture}, with emissive color in *RGB*.\n * @param {*} [params.occlusionTextureId] ID of *RGBA* occlusion {@link XKTTexture}, with occlusion factor in *R*.\n * @returns {XKTTextureSet} The new {@link XKTTextureSet}.\n */\n createTextureSet(params) {\n\n if (!params) {\n throw \"Parameters expected: params\";\n }\n\n if (params.textureSetId === null || params.textureSetId === undefined) {\n throw \"Parameter expected: params.textureSetId\";\n }\n\n if (this.finalized) {\n console.error(\"XKTModel has been finalized, can't add more textureSets\");\n return;\n }\n\n if (this.textureSets[params.textureSetId]) {\n console.error(\"XKTTextureSet already exists with this ID: \" + params.textureSetId);\n return;\n }\n\n let colorTexture;\n if (params.colorTextureId !== undefined && params.colorTextureId !== null) {\n colorTexture = this.textures[params.colorTextureId];\n if (!colorTexture) {\n console.error(`Texture not found: ${params.colorTextureId} - ensure that you create it first with createTexture()`);\n return;\n }\n colorTexture.channel = COLOR_TEXTURE;\n }\n\n let metallicRoughnessTexture;\n if (params.metallicRoughnessTextureId !== undefined && params.metallicRoughnessTextureId !== null) {\n metallicRoughnessTexture = this.textures[params.metallicRoughnessTextureId];\n if (!metallicRoughnessTexture) {\n console.error(`Texture not found: ${params.metallicRoughnessTextureId} - ensure that you create it first with createTexture()`);\n return;\n }\n metallicRoughnessTexture.channel = METALLIC_ROUGHNESS_TEXTURE;\n }\n\n let normalsTexture;\n if (params.normalsTextureId !== undefined && params.normalsTextureId !== null) {\n normalsTexture = this.textures[params.normalsTextureId];\n if (!normalsTexture) {\n console.error(`Texture not found: ${params.normalsTextureId} - ensure that you create it first with createTexture()`);\n return;\n }\n normalsTexture.channel = NORMALS_TEXTURE;\n }\n\n let emissiveTexture;\n if (params.emissiveTextureId !== undefined && params.emissiveTextureId !== null) {\n emissiveTexture = this.textures[params.emissiveTextureId];\n if (!emissiveTexture) {\n console.error(`Texture not found: ${params.emissiveTextureId} - ensure that you create it first with createTexture()`);\n return;\n }\n emissiveTexture.channel = EMISSIVE_TEXTURE;\n }\n\n let occlusionTexture;\n if (params.occlusionTextureId !== undefined && params.occlusionTextureId !== null) {\n occlusionTexture = this.textures[params.occlusionTextureId];\n if (!occlusionTexture) {\n console.error(`Texture not found: ${params.occlusionTextureId} - ensure that you create it first with createTexture()`);\n return;\n }\n occlusionTexture.channel = OCCLUSION_TEXTURE;\n }\n\n const textureSet = new XKTTextureSet({\n textureSetId: params.textureSetId,\n textureSetIndex: this.textureSetsList.length,\n colorTexture,\n metallicRoughnessTexture,\n normalsTexture,\n emissiveTexture,\n occlusionTexture\n });\n\n this.textureSets[params.textureSetId] = textureSet;\n this.textureSetsList.push(textureSet);\n\n return textureSet;\n }\n\n /**\n * Creates an {@link XKTGeometry} within this XKTModel.\n *\n * Registers the new {@link XKTGeometry} in {@link XKTModel#geometries} and {@link XKTModel#geometriesList}.\n *\n * Logs error and does nothing if this XKTModel has been finalized (see {@link XKTModel#finalized}).\n *\n * @param {*} params Method parameters.\n * @param {Number} params.geometryId Unique ID for the {@link XKTGeometry}.\n * @param {String} params.primitiveType The type of {@link XKTGeometry}: \"triangles\", \"lines\" or \"points\".\n * @param {Float64Array} params.positions Floating-point Local-space vertex positions for the {@link XKTGeometry}. Required for all primitive types.\n * @param {Number[]} [params.normals] Floating-point vertex normals for the {@link XKTGeometry}. Only used with triangles primitives. Ignored for points and lines.\n * @param {Number[]} [params.colors] Floating-point RGBA vertex colors for the {@link XKTGeometry}. Required for points primitives. Ignored for lines and triangles.\n * @param {Number[]} [params.colorsCompressed] Integer RGBA vertex colors for the {@link XKTGeometry}. Required for points primitives. Ignored for lines and triangles.\n * @param {Number[]} [params.uvs] Floating-point vertex UV coordinates for the {@link XKTGeometry}. Alias for ````uv````.\n * @param {Number[]} [params.uv] Floating-point vertex UV coordinates for the {@link XKTGeometry}. Alias for ````uvs````.\n * @param {Number[]} [params.colorsCompressed] Integer RGBA vertex colors for the {@link XKTGeometry}. Required for points primitives. Ignored for lines and triangles.\n * @param {Uint32Array} [params.indices] Indices for the {@link XKTGeometry}. Required for triangles and lines primitives. Ignored for points.\n * @param {Number} [params.edgeThreshold=10]\n * @returns {XKTGeometry} The new {@link XKTGeometry}.\n */\n createGeometry(params) {\n\n if (!params) {\n throw \"Parameters expected: params\";\n }\n\n if (params.geometryId === null || params.geometryId === undefined) {\n throw \"Parameter expected: params.geometryId\";\n }\n\n if (!params.primitiveType) {\n throw \"Parameter expected: params.primitiveType\";\n }\n\n if (!params.positions) {\n throw \"Parameter expected: params.positions\";\n }\n\n const triangles = params.primitiveType === \"triangles\";\n const points = params.primitiveType === \"points\";\n const lines = params.primitiveType === \"lines\";\n const line_strip = params.primitiveType === \"line-strip\";\n const triangle_strip = params.primitiveType === \"triangle-strip\";\n const triangle_fan = params.primitiveType === \"triangle-fan\";\n\n if (!triangles && !points && !lines && !line_strip) {\n throw \"Unsupported value for params.primitiveType: \"\n + params.primitiveType\n + \"' - supported values are 'triangles', 'points', 'lines', 'line-strip', 'triangle-strip' and 'triangle-fan\";\n }\n\n if (triangles) {\n if (!params.indices) {\n params.indices = this._createDefaultIndices()\n throw \"Parameter expected for 'triangles' primitive: params.indices\";\n }\n }\n\n if (points) {\n if (!params.colors && !params.colorsCompressed) {\n throw \"Parameter expected for 'points' primitive: params.colors or params.colorsCompressed\";\n }\n }\n\n if (lines) {\n if (!params.indices) {\n throw \"Parameter expected for 'lines' primitive: params.indices\";\n }\n }\n\n if (this.finalized) {\n console.error(\"XKTModel has been finalized, can't add more geometries\");\n return;\n }\n\n if (this.geometries[params.geometryId]) {\n console.error(\"XKTGeometry already exists with this ID: \" + params.geometryId);\n return;\n }\n\n const geometryId = params.geometryId;\n const primitiveType = params.primitiveType;\n const positions = new Float64Array(params.positions); // May modify in #finalize\n\n const xktGeometryCfg = {\n geometryId: geometryId,\n geometryIndex: this.geometriesList.length,\n primitiveType: primitiveType,\n positions: positions,\n uvs: params.uvs || params.uv\n }\n\n if (triangles) {\n if (params.normals) {\n xktGeometryCfg.normals = new Float32Array(params.normals);\n }\n if (params.indices) {\n xktGeometryCfg.indices = params.indices;\n } else {\n xktGeometryCfg.indices = this._createDefaultIndices(positions.length / 3);\n }\n }\n\n if (points) {\n if (params.colorsCompressed) {\n xktGeometryCfg.colorsCompressed = new Uint8Array(params.colorsCompressed);\n\n } else {\n const colors = params.colors;\n const colorsCompressed = new Uint8Array(colors.length);\n for (let i = 0, len = colors.length; i < len; i++) {\n colorsCompressed[i] = Math.floor(colors[i] * 255);\n }\n xktGeometryCfg.colorsCompressed = colorsCompressed;\n }\n }\n\n if (lines) {\n xktGeometryCfg.indices = params.indices;\n }\n\n if (triangles) {\n\n if (!params.normals && !params.uv && !params.uvs) {\n\n // Building models often duplicate positions to allow face-aligned vertex normals; when we're not\n // providing normals for a geometry, it becomes possible to merge duplicate vertex positions within it.\n\n // TODO: Make vertex merging also merge normals?\n\n const mergedPositions = [];\n const mergedIndices = [];\n mergeVertices(xktGeometryCfg.positions, xktGeometryCfg.indices, mergedPositions, mergedIndices);\n xktGeometryCfg.positions = new Float64Array(mergedPositions);\n xktGeometryCfg.indices = mergedIndices;\n }\n\n xktGeometryCfg.edgeIndices = buildEdgeIndices(xktGeometryCfg.positions, xktGeometryCfg.indices, null, params.edgeThreshold || this.edgeThreshold || 10);\n }\n\n const geometry = new XKTGeometry(xktGeometryCfg);\n\n this.geometries[geometryId] = geometry;\n this.geometriesList.push(geometry);\n\n return geometry;\n }\n\n _createDefaultIndices(numIndices) {\n const indices = [];\n for (let i = 0; i < numIndices; i++) {\n indices.push(i);\n }\n return indices;\n }\n\n /**\n * Creates an {@link XKTMesh} within this XKTModel.\n *\n * An {@link XKTMesh} can be owned by one {@link XKTEntity}, which can own multiple {@link XKTMesh}es.\n *\n * Registers the new {@link XKTMesh} in {@link XKTModel#meshes} and {@link XKTModel#meshesList}.\n *\n * @param {*} params Method parameters.\n * @param {Number} params.meshId Unique ID for the {@link XKTMesh}.\n * @param {Number} params.geometryId ID of an existing {@link XKTGeometry} in {@link XKTModel#geometries}.\n * @param {Number} [params.textureSetId] Unique ID of an {@link XKTTextureSet} in {@link XKTModel#textureSets}.\n * @param {Float32Array} params.color RGB color for the {@link XKTMesh}, with each color component in range [0..1].\n * @param {Number} [params.metallic=0] How metallic the {@link XKTMesh} is, in range [0..1]. A value of ````0```` indicates fully dielectric material, while ````1```` indicates fully metallic.\n * @param {Number} [params.roughness=1] How rough the {@link XKTMesh} is, in range [0..1]. A value of ````0```` indicates fully smooth, while ````1```` indicates fully rough.\n * @param {Number} params.opacity Opacity factor for the {@link XKTMesh}, in range [0..1].\n * @param {Float64Array} [params.matrix] Modeling matrix for the {@link XKTMesh}. Overrides ````position````, ````scale```` and ````rotation```` parameters.\n * @param {Number[]} [params.position=[0,0,0]] Position of the {@link XKTMesh}. Overridden by the ````matrix```` parameter.\n * @param {Number[]} [params.scale=[1,1,1]] Scale of the {@link XKTMesh}. Overridden by the ````matrix```` parameter.\n * @param {Number[]} [params.rotation=[0,0,0]] Rotation of the {@link XKTMesh} as Euler angles given in degrees, for each of the X, Y and Z axis. Overridden by the ````matrix```` parameter.\n * @returns {XKTMesh} The new {@link XKTMesh}.\n */\n createMesh(params) {\n\n if (params.meshId === null || params.meshId === undefined) {\n throw \"Parameter expected: params.meshId\";\n }\n\n if (params.geometryId === null || params.geometryId === undefined) {\n throw \"Parameter expected: params.geometryId\";\n }\n\n if (this.finalized) {\n throw \"XKTModel has been finalized, can't add more meshes\";\n }\n\n if (this.meshes[params.meshId]) {\n console.error(\"XKTMesh already exists with this ID: \" + params.meshId);\n return;\n }\n\n const geometry = this.geometries[params.geometryId];\n\n if (!geometry) {\n console.error(\"XKTGeometry not found: \" + params.geometryId);\n return;\n }\n\n geometry.numInstances++;\n\n let textureSet = null;\n if (params.textureSetId) {\n textureSet = this.textureSets[params.textureSetId];\n if (!textureSet) {\n console.error(\"XKTTextureSet not found: \" + params.textureSetId);\n return;\n }\n textureSet.numInstances++;\n }\n\n let matrix = params.matrix;\n\n if (!matrix) {\n\n const position = params.position;\n const scale = params.scale;\n const rotation = params.rotation;\n\n if (position || scale || rotation) {\n matrix = math.identityMat4();\n const quaternion = math.eulerToQuaternion(rotation || [0, 0, 0], \"XYZ\", math.identityQuaternion());\n math.composeMat4(position || [0, 0, 0], quaternion, scale || [1, 1, 1], matrix)\n\n } else {\n matrix = math.identityMat4();\n }\n }\n\n const meshIndex = this.meshesList.length;\n\n const mesh = new XKTMesh({\n meshId: params.meshId,\n meshIndex,\n matrix,\n geometry,\n color: params.color,\n metallic: params.metallic,\n roughness: params.roughness,\n opacity: params.opacity,\n textureSet\n });\n\n this.meshes[mesh.meshId] = mesh;\n this.meshesList.push(mesh);\n\n return mesh;\n }\n\n /**\n * Creates an {@link XKTEntity} within this XKTModel.\n *\n * Registers the new {@link XKTEntity} in {@link XKTModel#entities} and {@link XKTModel#entitiesList}.\n *\n * Logs error and does nothing if this XKTModel has been finalized (see {@link XKTModel#finalized}).\n *\n * @param {*} params Method parameters.\n * @param {String} params.entityId Unique ID for the {@link XKTEntity}.\n * @param {String[]} params.meshIds IDs of {@link XKTMesh}es used by the {@link XKTEntity}. Note that each {@link XKTMesh} can only be used by one {@link XKTEntity}.\n * @returns {XKTEntity} The new {@link XKTEntity}.\n */\n createEntity(params) {\n\n if (!params) {\n throw \"Parameters expected: params\";\n }\n\n if (params.entityId === null || params.entityId === undefined) {\n throw \"Parameter expected: params.entityId\";\n }\n\n if (!params.meshIds) {\n throw \"Parameter expected: params.meshIds\";\n }\n\n if (this.finalized) {\n console.error(\"XKTModel has been finalized, can't add more entities\");\n return;\n }\n\n if (params.meshIds.length === 0) {\n console.warn(\"XKTEntity has no meshes - won't create: \" + params.entityId);\n return;\n }\n\n let entityId = params.entityId;\n\n if (this.entities[entityId]) {\n while (this.entities[entityId]) {\n entityId = math.createUUID();\n }\n console.error(\"XKTEntity already exists with this ID: \" + params.entityId + \" - substituting random ID instead: \" + entityId);\n }\n\n const meshIds = params.meshIds;\n const meshes = [];\n\n for (let meshIdIdx = 0, meshIdLen = meshIds.length; meshIdIdx < meshIdLen; meshIdIdx++) {\n\n const meshId = meshIds[meshIdIdx];\n const mesh = this.meshes[meshId];\n\n if (!mesh) {\n console.error(\"XKTMesh found: \" + meshId);\n continue;\n }\n\n if (mesh.entity) {\n console.error(\"XKTMesh \" + meshId + \" already used by XKTEntity \" + mesh.entity.entityId);\n continue;\n }\n\n meshes.push(mesh);\n }\n\n const entity = new XKTEntity(entityId, meshes);\n\n for (let i = 0, len = meshes.length; i < len; i++) {\n const mesh = meshes[i];\n mesh.entity = entity;\n }\n\n this.entities[entityId] = entity;\n this.entitiesList.push(entity);\n\n return entity;\n }\n\n /**\n * Creates a default {@link XKTMetaObject} for each {@link XKTEntity} that does not already have one.\n */\n createDefaultMetaObjects() {\n\n for (let i = 0, len = this.entitiesList.length; i < len; i++) {\n\n const entity = this.entitiesList[i];\n const metaObjectId = entity.entityId;\n const metaObject = this.metaObjects[metaObjectId];\n\n if (!metaObject) {\n\n if (!this._rootMetaObject) {\n this._rootMetaObject = this.createMetaObject({\n metaObjectId: this.modelId,\n metaObjectType: \"Default\",\n metaObjectName: this.modelId\n });\n }\n\n this.createMetaObject({\n metaObjectId: metaObjectId,\n metaObjectType: \"Default\",\n metaObjectName: \"\" + metaObjectId,\n parentMetaObjectId: this._rootMetaObject.metaObjectId\n });\n }\n }\n }\n\n /**\n * Finalizes this XKTModel.\n *\n * After finalizing, we may then serialize the model to an array buffer using {@link writeXKTModelToArrayBuffer}.\n *\n * Logs error and does nothing if this XKTModel has already been finalized.\n *\n * Internally, this method:\n *\n * * for each {@link XKTEntity} that doesn't already have a {@link XKTMetaObject}, creates one with {@link XKTMetaObject#metaObjectType} set to \"default\"\n * * sets each {@link XKTEntity}'s {@link XKTEntity#hasReusedGeometries} true if it shares its {@link XKTGeometry}s with other {@link XKTEntity}s,\n * * creates each {@link XKTEntity}'s {@link XKTEntity#aabb},\n * * creates {@link XKTTile}s in {@link XKTModel#tilesList}, and\n * * sets {@link XKTModel#finalized} ````true````.\n */\n async finalize() {\n\n if (this.finalized) {\n console.log(\"XKTModel already finalized\");\n return;\n }\n\n this._removeUnusedTextures();\n\n await this._compressTextures();\n\n this._bakeSingleUseGeometryPositions();\n\n this._bakeAndOctEncodeNormals();\n\n this._createEntityAABBs();\n\n const rootKDNode = this._createKDTree();\n\n this.entitiesList = [];\n\n this._createTilesFromKDTree(rootKDNode);\n\n this._createReusedGeometriesDecodeMatrix();\n\n this._flagSolidGeometries();\n\n this.aabb.set(rootKDNode.aabb);\n\n this.finalized = true;\n }\n\n _removeUnusedTextures() {\n let texturesList = [];\n const textures = {};\n for (let i = 0, leni = this.texturesList.length; i < leni; i++) {\n const texture = this.texturesList[i];\n if (texture.channel !== null) {\n texture.textureIndex = texturesList.length;\n texturesList.push(texture);\n textures[texture.textureId] = texture;\n }\n }\n this.texturesList = texturesList;\n this.textures = textures;\n }\n\n _compressTextures() {\n let countTextures = this.texturesList.length;\n return new Promise((resolve) => {\n if (countTextures === 0) {\n resolve();\n return;\n }\n for (let i = 0, leni = this.texturesList.length; i < leni; i++) {\n const texture = this.texturesList[i];\n const encodingOptions = TEXTURE_ENCODING_OPTIONS[texture.channel] || {};\n\n if (texture.src) {\n\n // XKTTexture created with XKTModel#createTexture({ src: ... })\n\n const src = texture.src;\n const fileExt = src.split('.').pop();\n switch (fileExt) {\n case \"jpeg\":\n case \"jpg\":\n case \"png\":\n load(src, ImageLoader, {\n image: {\n type: \"data\"\n }\n }).then((imageData) => {\n if (texture.compressed) {\n encode(imageData, KTX2BasisWriter, encodingOptions).then((encodedData) => {\n const encodedImageData = new Uint8Array(encodedData);\n texture.imageData = encodedImageData;\n if (--countTextures <= 0) {\n resolve();\n }\n }).catch((err) => {\n console.error(\"[XKTModel.finalize] Failed to encode image: \" + err);\n if (--countTextures <= 0) {\n resolve();\n }\n });\n } else {\n texture.imageData = new Uint8Array(1);\n if (--countTextures <= 0) {\n resolve();\n }\n }\n }).catch((err) => {\n console.error(\"[XKTModel.finalize] Failed to load image: \" + err);\n if (--countTextures <= 0) {\n resolve();\n }\n });\n break;\n default:\n if (--countTextures <= 0) {\n resolve();\n }\n break;\n }\n }\n\n if (texture.imageData) {\n\n // XKTTexture created with XKTModel#createTexture({ imageData: ... })\n\n if (texture.compressed) {\n encode(texture.imageData, KTX2BasisWriter, encodingOptions)\n .then((encodedImageData) => {\n texture.imageData = new Uint8Array(encodedImageData);\n if (--countTextures <= 0) {\n resolve();\n }\n }).catch((err) => {\n console.error(\"[XKTModel.finalize] Failed to encode image: \" + err);\n if (--countTextures <= 0) {\n resolve();\n }\n });\n } else {\n texture.imageData = new Uint8Array(1);\n if (--countTextures <= 0) {\n resolve();\n }\n }\n }\n }\n });\n }\n\n _bakeSingleUseGeometryPositions() {\n\n for (let j = 0, lenj = this.meshesList.length; j < lenj; j++) {\n\n const mesh = this.meshesList[j];\n\n const geometry = mesh.geometry;\n\n if (geometry.numInstances === 1) {\n\n const matrix = mesh.matrix;\n\n if (matrix && (!math.isIdentityMat4(matrix))) {\n\n const positions = geometry.positions;\n\n for (let i = 0, len = positions.length; i < len; i += 3) {\n\n tempVec4a[0] = positions[i + 0];\n tempVec4a[1] = positions[i + 1];\n tempVec4a[2] = positions[i + 2];\n tempVec4a[3] = 1;\n\n math.transformPoint4(matrix, tempVec4a, tempVec4b);\n\n positions[i + 0] = tempVec4b[0];\n positions[i + 1] = tempVec4b[1];\n positions[i + 2] = tempVec4b[2];\n }\n }\n }\n }\n }\n\n _bakeAndOctEncodeNormals() {\n\n for (let i = 0, len = this.meshesList.length; i < len; i++) {\n\n const mesh = this.meshesList[i];\n const geometry = mesh.geometry;\n\n if (geometry.normals && !geometry.normalsOctEncoded) {\n\n geometry.normalsOctEncoded = new Int8Array(geometry.normals.length);\n\n if (geometry.numInstances > 1) {\n geometryCompression.octEncodeNormals(geometry.normals, geometry.normals.length, geometry.normalsOctEncoded, 0);\n\n } else {\n const modelNormalMatrix = math.inverseMat4(math.transposeMat4(mesh.matrix, tempMat4), tempMat4b);\n geometryCompression.transformAndOctEncodeNormals(modelNormalMatrix, geometry.normals, geometry.normals.length, geometry.normalsOctEncoded, 0);\n }\n }\n }\n }\n\n _createEntityAABBs() {\n\n for (let i = 0, len = this.entitiesList.length; i < len; i++) {\n\n const entity = this.entitiesList[i];\n const entityAABB = entity.aabb;\n const meshes = entity.meshes;\n\n math.collapseAABB3(entityAABB);\n\n for (let j = 0, lenj = meshes.length; j < lenj; j++) {\n\n const mesh = meshes[j];\n const geometry = mesh.geometry;\n const matrix = mesh.matrix;\n\n if (geometry.numInstances > 1) {\n\n const positions = geometry.positions;\n for (let i = 0, len = positions.length; i < len; i += 3) {\n tempVec4a[0] = positions[i + 0];\n tempVec4a[1] = positions[i + 1];\n tempVec4a[2] = positions[i + 2];\n tempVec4a[3] = 1;\n math.transformPoint4(matrix, tempVec4a, tempVec4b);\n math.expandAABB3Point3(entityAABB, tempVec4b);\n }\n\n } else {\n\n const positions = geometry.positions;\n for (let i = 0, len = positions.length; i < len; i += 3) {\n tempVec4a[0] = positions[i + 0];\n tempVec4a[1] = positions[i + 1];\n tempVec4a[2] = positions[i + 2];\n math.expandAABB3Point3(entityAABB, tempVec4a);\n }\n }\n }\n }\n }\n\n _createKDTree() {\n\n let aabb;\n if (this.modelAABB) {\n aabb = this.modelAABB; // Pre-known uber AABB\n } else {\n aabb = math.collapseAABB3();\n for (let i = 0, len = this.entitiesList.length; i < len; i++) {\n const entity = this.entitiesList[i];\n math.expandAABB3(aabb, entity.aabb);\n }\n }\n\n const rootKDNode = new KDNode(aabb);\n\n for (let i = 0, len = this.entitiesList.length; i < len; i++) {\n const entity = this.entitiesList[i];\n this._insertEntityIntoKDTree(rootKDNode, entity);\n }\n\n return rootKDNode;\n }\n\n _insertEntityIntoKDTree(kdNode, entity) {\n\n const nodeAABB = kdNode.aabb;\n const entityAABB = entity.aabb;\n\n const nodeAABBDiag = math.getAABB3Diag(nodeAABB);\n\n if (nodeAABBDiag < this.minTileSize) {\n kdNode.entities = kdNode.entities || [];\n kdNode.entities.push(entity);\n math.expandAABB3(nodeAABB, entityAABB);\n return;\n }\n\n if (kdNode.left) {\n if (math.containsAABB3(kdNode.left.aabb, entityAABB)) {\n this._insertEntityIntoKDTree(kdNode.left, entity);\n return;\n }\n }\n\n if (kdNode.right) {\n if (math.containsAABB3(kdNode.right.aabb, entityAABB)) {\n this._insertEntityIntoKDTree(kdNode.right, entity);\n return;\n }\n }\n\n kdTreeDimLength[0] = nodeAABB[3] - nodeAABB[0];\n kdTreeDimLength[1] = nodeAABB[4] - nodeAABB[1];\n kdTreeDimLength[2] = nodeAABB[5] - nodeAABB[2];\n\n let dim = 0;\n\n if (kdTreeDimLength[1] > kdTreeDimLength[dim]) {\n dim = 1;\n }\n\n if (kdTreeDimLength[2] > kdTreeDimLength[dim]) {\n dim = 2;\n }\n\n if (!kdNode.left) {\n const aabbLeft = nodeAABB.slice();\n aabbLeft[dim + 3] = ((nodeAABB[dim] + nodeAABB[dim + 3]) / 2.0);\n kdNode.left = new KDNode(aabbLeft);\n if (math.containsAABB3(aabbLeft, entityAABB)) {\n this._insertEntityIntoKDTree(kdNode.left, entity);\n return;\n }\n }\n\n if (!kdNode.right) {\n const aabbRight = nodeAABB.slice();\n aabbRight[dim] = ((nodeAABB[dim] + nodeAABB[dim + 3]) / 2.0);\n kdNode.right = new KDNode(aabbRight);\n if (math.containsAABB3(aabbRight, entityAABB)) {\n this._insertEntityIntoKDTree(kdNode.right, entity);\n return;\n }\n }\n\n kdNode.entities = kdNode.entities || [];\n kdNode.entities.push(entity);\n\n math.expandAABB3(nodeAABB, entityAABB);\n }\n\n _createTilesFromKDTree(rootKDNode) {\n this._createTilesFromKDNode(rootKDNode);\n }\n\n _createTilesFromKDNode(kdNode) {\n if (kdNode.entities && kdNode.entities.length > 0) {\n this._createTileFromEntities(kdNode);\n }\n if (kdNode.left) {\n this._createTilesFromKDNode(kdNode.left);\n }\n if (kdNode.right) {\n this._createTilesFromKDNode(kdNode.right);\n }\n }\n\n /**\n * Creates a tile from the given entities.\n *\n * For each single-use {@link XKTGeometry}, this method centers {@link XKTGeometry#positions} to make them relative to the\n * tile's center, then quantizes the positions to unsigned 16-bit integers, relative to the tile's boundary.\n *\n * @param kdNode\n */\n _createTileFromEntities(kdNode) {\n\n const tileAABB = kdNode.aabb;\n const entities = kdNode.entities;\n\n const tileCenter = math.getAABB3Center(tileAABB);\n const tileCenterNeg = math.mulVec3Scalar(tileCenter, -1, math.vec3());\n\n const rtcAABB = math.AABB3(); // AABB centered at the RTC origin\n\n rtcAABB[0] = tileAABB[0] - tileCenter[0];\n rtcAABB[1] = tileAABB[1] - tileCenter[1];\n rtcAABB[2] = tileAABB[2] - tileCenter[2];\n rtcAABB[3] = tileAABB[3] - tileCenter[0];\n rtcAABB[4] = tileAABB[4] - tileCenter[1];\n rtcAABB[5] = tileAABB[5] - tileCenter[2];\n\n for (let i = 0; i < entities.length; i++) {\n\n const entity = entities [i];\n\n const meshes = entity.meshes;\n\n for (let j = 0, lenj = meshes.length; j < lenj; j++) {\n\n const mesh = meshes[j];\n const geometry = mesh.geometry;\n\n if (!geometry.reused) { // Batched geometry\n\n const positions = geometry.positions;\n\n // Center positions relative to their tile's World-space center\n\n for (let k = 0, lenk = positions.length; k < lenk; k += 3) {\n\n positions[k + 0] -= tileCenter[0];\n positions[k + 1] -= tileCenter[1];\n positions[k + 2] -= tileCenter[2];\n }\n\n // Quantize positions relative to tile's RTC-space boundary\n\n geometryCompression.quantizePositions(positions, positions.length, rtcAABB, geometry.positionsQuantized);\n\n } else { // Instanced geometry\n\n // Post-multiply a translation to the mesh's modeling matrix\n // to center the entity's geometry instances to the tile RTC center\n\n //////////////////////////////\n // Why do we do this?\n // Seems to break various models\n /////////////////////////////////\n\n math.translateMat4v(tileCenterNeg, mesh.matrix);\n }\n }\n\n entity.entityIndex = this.entitiesList.length;\n\n this.entitiesList.push(entity);\n }\n\n const tile = new XKTTile(tileAABB, entities);\n\n this.tilesList.push(tile);\n }\n\n _createReusedGeometriesDecodeMatrix() {\n\n const tempVec3a = math.vec3();\n const reusedGeometriesAABB = math.collapseAABB3(math.AABB3());\n let countReusedGeometries = 0;\n\n for (let geometryIndex = 0, numGeometries = this.geometriesList.length; geometryIndex < numGeometries; geometryIndex++) {\n\n const geometry = this.geometriesList [geometryIndex];\n\n if (geometry.reused) { // Instanced geometry\n\n const positions = geometry.positions;\n\n for (let i = 0, len = positions.length; i < len; i += 3) {\n\n tempVec3a[0] = positions[i];\n tempVec3a[1] = positions[i + 1];\n tempVec3a[2] = positions[i + 2];\n\n math.expandAABB3Point3(reusedGeometriesAABB, tempVec3a);\n }\n\n countReusedGeometries++;\n }\n }\n\n if (countReusedGeometries > 0) {\n\n geometryCompression.createPositionsDecodeMatrix(reusedGeometriesAABB, this.reusedGeometriesDecodeMatrix);\n\n for (let geometryIndex = 0, numGeometries = this.geometriesList.length; geometryIndex < numGeometries; geometryIndex++) {\n\n const geometry = this.geometriesList [geometryIndex];\n\n if (geometry.reused) {\n geometryCompression.quantizePositions(geometry.positions, geometry.positions.length, reusedGeometriesAABB, geometry.positionsQuantized);\n }\n }\n\n } else {\n math.identityMat4(this.reusedGeometriesDecodeMatrix); // No need for this matrix, but we'll be tidy and set it to identity\n }\n }\n\n _flagSolidGeometries() {\n let maxNumPositions = 0;\n let maxNumIndices = 0;\n for (let i = 0, len = this.geometriesList.length; i < len; i++) {\n const geometry = this.geometriesList[i];\n if (geometry.primitiveType === \"triangles\") {\n if (geometry.positionsQuantized.length > maxNumPositions) {\n maxNumPositions = geometry.positionsQuantized.length;\n }\n if (geometry.indices.length > maxNumIndices) {\n maxNumIndices = geometry.indices.length;\n }\n }\n }\n let vertexIndexMapping = new Array(maxNumPositions / 3);\n let edges = new Array(maxNumIndices);\n for (let i = 0, len = this.geometriesList.length; i < len; i++) {\n const geometry = this.geometriesList[i];\n if (geometry.primitiveType === \"triangles\") {\n geometry.solid = isTriangleMeshSolid(geometry.indices, geometry.positionsQuantized, vertexIndexMapping, edges);\n }\n }\n }\n}\n\nexport {\n XKTModel\n}","/**\n * Given geometry defined as an array of positions, optional normals, option uv and an array of indices, returns\n * modified arrays that have duplicate vertices removed.\n *\n * @private\n */\nfunction mergeVertices(positions, indices, mergedPositions, mergedIndices) {\n const positionsMap = {};\n const indicesLookup = [];\n const precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001\n const precision = 10 ** precisionPoints;\n let uvi = 0;\n for (let i = 0, len = positions.length; i < len; i += 3) {\n const vx = positions[i];\n const vy = positions[i + 1];\n const vz = positions[i + 2];\n const key = `${Math.round(vx * precision)}_${Math.round(vy * precision)}_${Math.round(vz * precision)}`;\n if (positionsMap[key] === undefined) {\n positionsMap[key] = mergedPositions.length / 3;\n mergedPositions.push(vx);\n mergedPositions.push(vy);\n mergedPositions.push(vz);\n }\n indicesLookup[i / 3] = positionsMap[key];\n uvi += 2;\n }\n for (let i = 0, len = indices.length; i < len; i++) {\n mergedIndices[i] = indicesLookup[indices[i]];\n }\n}\n\nexport {mergeVertices};","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"pako\");","import {XKT_INFO} from \"../XKT_INFO.js\";\nimport * as pako from 'pako';\n\nconst XKT_VERSION = XKT_INFO.xktVersion;\nconst NUM_TEXTURE_ATTRIBUTES = 9;\nconst NUM_MATERIAL_ATTRIBUTES = 6;\n\n/**\n * Writes an {@link XKTModel} to an {@link ArrayBuffer}.\n *\n * @param {XKTModel} xktModel The {@link XKTModel}.\n * @param {String} metaModelJSON The metamodel JSON in a string.\n * @param {Object} [stats] Collects statistics.\n * @param {Object} options Options for how the XKT is written.\n * @param {Boolean} [options.zip=true] ZIP the contents?\n * @returns {ArrayBuffer} The {@link ArrayBuffer}.\n */\nfunction writeXKTModelToArrayBuffer(xktModel, metaModelJSON, stats, options) {\n const data = getModelData(xktModel, metaModelJSON, stats);\n const deflatedData = deflateData(data, metaModelJSON, options);\n stats.texturesSize += deflatedData.textureData.byteLength;\n const arrayBuffer = createArrayBuffer(deflatedData);\n return arrayBuffer;\n}\n\nfunction getModelData(xktModel, metaModelDataStr, stats) {\n\n //------------------------------------------------------------------------------------------------------------------\n // Allocate data\n //------------------------------------------------------------------------------------------------------------------\n\n const propertySetsList = xktModel.propertySetsList;\n const metaObjectsList = xktModel.metaObjectsList;\n const geometriesList = xktModel.geometriesList;\n const texturesList = xktModel.texturesList;\n const textureSetsList = xktModel.textureSetsList;\n const meshesList = xktModel.meshesList;\n const entitiesList = xktModel.entitiesList;\n const tilesList = xktModel.tilesList;\n\n const numPropertySets = propertySetsList.length;\n const numMetaObjects = metaObjectsList.length;\n const numGeometries = geometriesList.length;\n const numTextures = texturesList.length;\n const numTextureSets = textureSetsList.length;\n const numMeshes = meshesList.length;\n const numEntities = entitiesList.length;\n const numTiles = tilesList.length;\n\n let lenPositions = 0;\n let lenNormals = 0;\n let lenColors = 0;\n let lenUVs = 0;\n let lenIndices = 0;\n let lenEdgeIndices = 0;\n let lenMatrices = 0;\n let lenTextures = 0;\n\n for (let geometryIndex = 0; geometryIndex < numGeometries; geometryIndex++) {\n const geometry = geometriesList [geometryIndex];\n if (geometry.positionsQuantized) {\n lenPositions += geometry.positionsQuantized.length;\n }\n if (geometry.normalsOctEncoded) {\n lenNormals += geometry.normalsOctEncoded.length;\n }\n if (geometry.colorsCompressed) {\n lenColors += geometry.colorsCompressed.length;\n }\n if (geometry.uvs) {\n lenUVs += geometry.uvs.length;\n }\n if (geometry.indices) {\n lenIndices += geometry.indices.length;\n }\n if (geometry.edgeIndices) {\n lenEdgeIndices += geometry.edgeIndices.length;\n }\n }\n\n for (let textureIndex = 0; textureIndex < numTextures; textureIndex++) {\n const xktTexture = texturesList[textureIndex];\n const imageData = xktTexture.imageData;\n lenTextures += imageData.byteLength;\n\n if (xktTexture.compressed) {\n stats.numCompressedTextures++;\n }\n }\n\n for (let meshIndex = 0; meshIndex < numMeshes; meshIndex++) {\n const mesh = meshesList[meshIndex];\n if (mesh.geometry.numInstances > 1) {\n lenMatrices += 16;\n }\n }\n\n const data = {\n metadata: {},\n textureData: new Uint8Array(lenTextures), // All textures\n eachTextureDataPortion: new Uint32Array(numTextures), // For each texture, an index to its first element in textureData\n eachTextureAttributes: new Uint16Array(numTextures * NUM_TEXTURE_ATTRIBUTES),\n positions: new Uint16Array(lenPositions), // All geometry arrays\n normals: new Int8Array(lenNormals),\n colors: new Uint8Array(lenColors),\n uvs: new Float32Array(lenUVs),\n indices: new Uint32Array(lenIndices),\n edgeIndices: new Uint32Array(lenEdgeIndices),\n eachTextureSetTextures: new Int32Array(numTextureSets * 5), // For each texture set, a set of five Texture indices [color, metal/roughness,normals,emissive,occlusion]; each index has value -1 if no texture\n matrices: new Float32Array(lenMatrices), // Modeling matrices for entities that share geometries. Each entity either shares all it's geometries, or owns all its geometries exclusively. Exclusively-owned geometries are pre-transformed into World-space, and so their entities don't have modeling matrices in this array.\n reusedGeometriesDecodeMatrix: new Float32Array(xktModel.reusedGeometriesDecodeMatrix), // A single, global vertex position de-quantization matrix for all reused geometries. Reused geometries are quantized to their collective Local-space AABB, and this matrix is derived from that AABB.\n eachGeometryPrimitiveType: new Uint8Array(numGeometries), // Primitive type for each geometry (0=solid triangles, 1=surface triangles, 2=lines, 3=points, 4=line-strip)\n eachGeometryPositionsPortion: new Uint32Array(numGeometries), // For each geometry, an index to its first element in data.positions. Every primitive type has positions.\n eachGeometryNormalsPortion: new Uint32Array(numGeometries), // For each geometry, an index to its first element in data.normals. If the next geometry has the same index, then this geometry has no normals.\n eachGeometryColorsPortion: new Uint32Array(numGeometries), // For each geometry, an index to its first element in data.colors. If the next geometry has the same index, then this geometry has no colors.\n eachGeometryUVsPortion: new Uint32Array(numGeometries), // For each geometry, an index to its first element in data.uvs. If the next geometry has the same index, then this geometry has no UVs.\n eachGeometryIndicesPortion: new Uint32Array(numGeometries), // For each geometry, an index to its first element in data.indices. If the next geometry has the same index, then this geometry has no indices.\n eachGeometryEdgeIndicesPortion: new Uint32Array(numGeometries), // For each geometry, an index to its first element in data.edgeIndices. If the next geometry has the same index, then this geometry has no edge indices.\n eachMeshGeometriesPortion: new Uint32Array(numMeshes), // For each mesh, an index into the eachGeometry* arrays\n eachMeshMatricesPortion: new Uint32Array(numMeshes), // For each mesh that shares its geometry, an index to its first element in data.matrices, to indicate the modeling matrix that transforms the shared geometry Local-space vertex positions. This is ignored for meshes that don't share geometries, because the vertex positions of non-shared geometries are pre-transformed into World-space.\n eachMeshTextureSet: new Int32Array(numMeshes), // For each mesh, the index of its texture set in data.eachTextureSetTextures; this array contains signed integers so that we can use -1 to indicate when a mesh has no texture set\n eachMeshMaterialAttributes: new Uint8Array(numMeshes * NUM_MATERIAL_ATTRIBUTES), // For each mesh, an RGBA integer color of format [0..255, 0..255, 0..255, 0..255], and PBR metallic and roughness factors, of format [0..255, 0..255]\n eachEntityId: [], // For each entity, an ID string\n eachEntityMeshesPortion: new Uint32Array(numEntities), // For each entity, the index of the first element of meshes used by the entity\n eachTileAABB: new Float64Array(numTiles * 6), // For each tile, an axis-aligned bounding box\n eachTileEntitiesPortion: new Uint32Array(numTiles) // For each tile, the index of the first element of eachEntityId, eachEntityMeshesPortion and eachEntityMatricesPortion used by the tile\n };\n\n let countPositions = 0;\n let countNormals = 0;\n let countColors = 0;\n let countUVs = 0;\n let countIndices = 0;\n let countEdgeIndices = 0;\n\n // Metadata\n\n data.metadata = {\n id: xktModel.modelId,\n projectId: xktModel.projectId,\n revisionId: xktModel.revisionId,\n author: xktModel.author,\n createdAt: xktModel.createdAt,\n creatingApplication: xktModel.creatingApplication,\n schema: xktModel.schema,\n propertySets: [],\n metaObjects: []\n };\n\n // Property sets\n\n for (let propertySetsIndex = 0; propertySetsIndex < numPropertySets; propertySetsIndex++) {\n const propertySet = propertySetsList[propertySetsIndex];\n const propertySetJSON = {\n id: \"\" + propertySet.propertySetId,\n name: propertySet.propertySetName,\n type: propertySet.propertySetType,\n properties: propertySet.properties\n };\n data.metadata.propertySets.push(propertySetJSON);\n }\n\n // Metaobjects\n\n if (!metaModelDataStr) {\n for (let metaObjectsIndex = 0; metaObjectsIndex < numMetaObjects; metaObjectsIndex++) {\n const metaObject = metaObjectsList[metaObjectsIndex];\n const metaObjectJSON = {\n name: metaObject.metaObjectName,\n type: metaObject.metaObjectType,\n id: \"\" + metaObject.metaObjectId\n };\n if (metaObject.parentMetaObjectId !== undefined && metaObject.parentMetaObjectId !== null) {\n metaObjectJSON.parent = \"\" + metaObject.parentMetaObjectId;\n }\n if (metaObject.propertySetIds && metaObject.propertySetIds.length > 0) {\n metaObjectJSON.propertySetIds = metaObject.propertySetIds;\n }\n if (metaObject.external) {\n metaObjectJSON.external = metaObject.external;\n }\n data.metadata.metaObjects.push(metaObjectJSON);\n }\n }\n\n // Geometries\n\n for (let geometryIndex = 0; geometryIndex < numGeometries; geometryIndex++) {\n const geometry = geometriesList [geometryIndex];\n let primitiveType = 1;\n switch (geometry.primitiveType) {\n case \"triangles\":\n primitiveType = geometry.solid ? 0 : 1;\n break;\n case \"points\":\n primitiveType = 2;\n break;\n case \"lines\":\n primitiveType = 3;\n break;\n case \"line-strip\":\n primitiveType = 4;\n break;\n case \"triangle-strip\":\n primitiveType = 5;\n break;\n case \"triangle-fan\":\n primitiveType = 6;\n break;\n default:\n primitiveType = 1\n }\n data.eachGeometryPrimitiveType [geometryIndex] = primitiveType;\n data.eachGeometryPositionsPortion [geometryIndex] = countPositions;\n data.eachGeometryNormalsPortion [geometryIndex] = countNormals;\n data.eachGeometryColorsPortion [geometryIndex] = countColors;\n data.eachGeometryUVsPortion [geometryIndex] = countUVs;\n data.eachGeometryIndicesPortion [geometryIndex] = countIndices;\n data.eachGeometryEdgeIndicesPortion [geometryIndex] = countEdgeIndices;\n if (geometry.positionsQuantized) {\n data.positions.set(geometry.positionsQuantized, countPositions);\n countPositions += geometry.positionsQuantized.length;\n }\n if (geometry.normalsOctEncoded) {\n data.normals.set(geometry.normalsOctEncoded, countNormals);\n countNormals += geometry.normalsOctEncoded.length;\n }\n if (geometry.colorsCompressed) {\n data.colors.set(geometry.colorsCompressed, countColors);\n countColors += geometry.colorsCompressed.length;\n }\n if (geometry.uvs) {\n data.uvs.set(geometry.uvs, countUVs);\n countUVs += geometry.uvs.length;\n }\n if (geometry.indices) {\n data.indices.set(geometry.indices, countIndices);\n countIndices += geometry.indices.length;\n }\n if (geometry.edgeIndices) {\n data.edgeIndices.set(geometry.edgeIndices, countEdgeIndices);\n countEdgeIndices += geometry.edgeIndices.length;\n }\n }\n\n // Textures\n\n for (let textureIndex = 0, numTextures = xktModel.texturesList.length, portionIdx = 0; textureIndex < numTextures; textureIndex++) {\n const xktTexture = xktModel.texturesList[textureIndex];\n const imageData = xktTexture.imageData;\n data.textureData.set(imageData, portionIdx);\n data.eachTextureDataPortion[textureIndex] = portionIdx;\n\n portionIdx += imageData.byteLength;\n\n let textureAttrIdx = textureIndex * NUM_TEXTURE_ATTRIBUTES;\n data.eachTextureAttributes[textureAttrIdx++] = xktTexture.compressed ? 1 : 0;\n data.eachTextureAttributes[textureAttrIdx++] = xktTexture.mediaType; // GIFMediaType | PNGMediaType | JPEGMediaType\n data.eachTextureAttributes[textureAttrIdx++] = xktTexture.width;\n data.eachTextureAttributes[textureAttrIdx++] = xktTexture.height;\n data.eachTextureAttributes[textureAttrIdx++] = xktTexture.minFilter; // LinearMipmapLinearFilter | LinearMipMapNearestFilter | NearestMipMapNearestFilter | NearestMipMapLinearFilter | LinearMipMapLinearFilter\n data.eachTextureAttributes[textureAttrIdx++] = xktTexture.magFilter; // LinearFilter | NearestFilter\n data.eachTextureAttributes[textureAttrIdx++] = xktTexture.wrapS; // ClampToEdgeWrapping | MirroredRepeatWrapping | RepeatWrapping\n data.eachTextureAttributes[textureAttrIdx++] = xktTexture.wrapT; // ClampToEdgeWrapping | MirroredRepeatWrapping | RepeatWrapping\n data.eachTextureAttributes[textureAttrIdx++] = xktTexture.wrapR; // ClampToEdgeWrapping | MirroredRepeatWrapping | RepeatWrapping\n }\n\n // Texture sets\n\n for (let textureSetIndex = 0, numTextureSets = xktModel.textureSetsList.length, eachTextureSetTexturesIndex = 0; textureSetIndex < numTextureSets; textureSetIndex++) {\n const textureSet = textureSetsList[textureSetIndex];\n data.eachTextureSetTextures[eachTextureSetTexturesIndex++] = textureSet.colorTexture ? textureSet.colorTexture.textureIndex : -1; // Color map\n data.eachTextureSetTextures[eachTextureSetTexturesIndex++] = textureSet.metallicRoughnessTexture ? textureSet.metallicRoughnessTexture.textureIndex : -1; // Metal/rough map\n data.eachTextureSetTextures[eachTextureSetTexturesIndex++] = textureSet.normalsTexture ? textureSet.normalsTexture.textureIndex : -1; // Normal map\n data.eachTextureSetTextures[eachTextureSetTexturesIndex++] = textureSet.emissiveTexture ? textureSet.emissiveTexture.textureIndex : -1; // Emissive map\n data.eachTextureSetTextures[eachTextureSetTexturesIndex++] = textureSet.occlusionTexture ? textureSet.occlusionTexture.textureIndex : -1; // Occlusion map\n }\n\n // Tiles -> Entities -> Meshes\n\n let entityIndex = 0;\n let countEntityMeshesPortion = 0;\n let eachMeshMaterialAttributesIndex = 0;\n let matricesIndex = 0;\n let meshIndex = 0;\n\n for (let tileIndex = 0; tileIndex < numTiles; tileIndex++) {\n\n const tile = tilesList [tileIndex];\n const tileEntities = tile.entities;\n const numTileEntities = tileEntities.length;\n\n if (numTileEntities === 0) {\n continue;\n }\n\n data.eachTileEntitiesPortion[tileIndex] = entityIndex;\n\n const tileAABB = tile.aabb;\n\n for (let j = 0; j < numTileEntities; j++) {\n\n const entity = tileEntities[j];\n const entityMeshes = entity.meshes;\n const numEntityMeshes = entityMeshes.length;\n\n for (let k = 0; k < numEntityMeshes; k++) {\n\n const mesh = entityMeshes[k];\n const geometry = mesh.geometry;\n const geometryIndex = geometry.geometryIndex;\n\n data.eachMeshGeometriesPortion [countEntityMeshesPortion + k] = geometryIndex;\n\n if (mesh.geometry.numInstances > 1) {\n data.matrices.set(mesh.matrix, matricesIndex);\n data.eachMeshMatricesPortion [meshIndex] = matricesIndex;\n matricesIndex += 16;\n }\n\n data.eachMeshTextureSet[meshIndex] = mesh.textureSet ? mesh.textureSet.textureSetIndex : -1;\n\n data.eachMeshMaterialAttributes[eachMeshMaterialAttributesIndex++] = (mesh.color[0] * 255); // Color RGB\n data.eachMeshMaterialAttributes[eachMeshMaterialAttributesIndex++] = (mesh.color[1] * 255);\n data.eachMeshMaterialAttributes[eachMeshMaterialAttributesIndex++] = (mesh.color[2] * 255);\n data.eachMeshMaterialAttributes[eachMeshMaterialAttributesIndex++] = (mesh.opacity * 255); // Opacity\n data.eachMeshMaterialAttributes[eachMeshMaterialAttributesIndex++] = (mesh.metallic * 255); // Metallic\n data.eachMeshMaterialAttributes[eachMeshMaterialAttributesIndex++] = (mesh.roughness * 255); // Roughness\n\n meshIndex++;\n }\n\n data.eachEntityId [entityIndex] = entity.entityId;\n data.eachEntityMeshesPortion[entityIndex] = countEntityMeshesPortion; // <<<<<<<<<<<<<<<<<<<< Error here? Order/value of countEntityMeshesPortion correct?\n\n entityIndex++;\n countEntityMeshesPortion += numEntityMeshes;\n }\n\n const tileAABBIndex = tileIndex * 6;\n\n data.eachTileAABB.set(tileAABB, tileAABBIndex);\n }\n\n return data;\n}\n\nfunction deflateData(data, metaModelJSON, options) {\n\n function deflate(buffer) {\n return (options.zip !== false) ? pako.deflate(buffer) : buffer;\n }\n\n let metaModelBytes;\n if (metaModelJSON) {\n const deflatedJSON = deflateJSON(metaModelJSON);\n metaModelBytes = deflate(deflatedJSON)\n } else {\n const deflatedJSON = deflateJSON(data.metadata);\n metaModelBytes = deflate(deflatedJSON)\n }\n\n return {\n metadata: metaModelBytes,\n textureData: deflate(data.textureData.buffer),\n eachTextureDataPortion: deflate(data.eachTextureDataPortion.buffer),\n eachTextureAttributes: deflate(data.eachTextureAttributes.buffer),\n positions: deflate(data.positions.buffer),\n normals: deflate(data.normals.buffer),\n colors: deflate(data.colors.buffer),\n uvs: deflate(data.uvs.buffer),\n indices: deflate(data.indices.buffer),\n edgeIndices: deflate(data.edgeIndices.buffer),\n eachTextureSetTextures: deflate(data.eachTextureSetTextures.buffer),\n matrices: deflate(data.matrices.buffer),\n reusedGeometriesDecodeMatrix: deflate(data.reusedGeometriesDecodeMatrix.buffer),\n eachGeometryPrimitiveType: deflate(data.eachGeometryPrimitiveType.buffer),\n eachGeometryPositionsPortion: deflate(data.eachGeometryPositionsPortion.buffer),\n eachGeometryNormalsPortion: deflate(data.eachGeometryNormalsPortion.buffer),\n eachGeometryColorsPortion: deflate(data.eachGeometryColorsPortion.buffer),\n eachGeometryUVsPortion: deflate(data.eachGeometryUVsPortion.buffer),\n eachGeometryIndicesPortion: deflate(data.eachGeometryIndicesPortion.buffer),\n eachGeometryEdgeIndicesPortion: deflate(data.eachGeometryEdgeIndicesPortion.buffer),\n eachMeshGeometriesPortion: deflate(data.eachMeshGeometriesPortion.buffer),\n eachMeshMatricesPortion: deflate(data.eachMeshMatricesPortion.buffer),\n eachMeshTextureSet: deflate(data.eachMeshTextureSet.buffer),\n eachMeshMaterialAttributes: deflate(data.eachMeshMaterialAttributes.buffer),\n eachEntityId: deflate(JSON.stringify(data.eachEntityId)\n .replace(/[\\u007F-\\uFFFF]/g, function (chr) { // Produce only ASCII-chars, so that the data can be inflated later\n return \"\\\\u\" + (\"0000\" + chr.charCodeAt(0).toString(16)).substr(-4)\n })),\n eachEntityMeshesPortion: deflate(data.eachEntityMeshesPortion.buffer),\n eachTileAABB: deflate(data.eachTileAABB.buffer),\n eachTileEntitiesPortion: deflate(data.eachTileEntitiesPortion.buffer)\n };\n}\n\nfunction deflateJSON(strings) {\n return JSON.stringify(strings)\n .replace(/[\\u007F-\\uFFFF]/g, function (chr) { // Produce only ASCII-chars, so that the data can be inflated later\n return \"\\\\u\" + (\"0000\" + chr.charCodeAt(0).toString(16)).substr(-4)\n });\n}\n\nfunction createArrayBuffer(deflatedData) {\n return toArrayBuffer([\n deflatedData.metadata,\n deflatedData.textureData,\n deflatedData.eachTextureDataPortion,\n deflatedData.eachTextureAttributes,\n deflatedData.positions,\n deflatedData.normals,\n deflatedData.colors,\n deflatedData.uvs,\n deflatedData.indices,\n deflatedData.edgeIndices,\n deflatedData.eachTextureSetTextures,\n deflatedData.matrices,\n deflatedData.reusedGeometriesDecodeMatrix,\n deflatedData.eachGeometryPrimitiveType,\n deflatedData.eachGeometryPositionsPortion,\n deflatedData.eachGeometryNormalsPortion,\n deflatedData.eachGeometryColorsPortion,\n deflatedData.eachGeometryUVsPortion,\n deflatedData.eachGeometryIndicesPortion,\n deflatedData.eachGeometryEdgeIndicesPortion,\n deflatedData.eachMeshGeometriesPortion,\n deflatedData.eachMeshMatricesPortion,\n deflatedData.eachMeshTextureSet,\n deflatedData.eachMeshMaterialAttributes,\n deflatedData.eachEntityId,\n deflatedData.eachEntityMeshesPortion,\n deflatedData.eachTileAABB,\n deflatedData.eachTileEntitiesPortion\n ]);\n}\n\nfunction toArrayBuffer(elements) {\n const indexData = new Uint32Array(elements.length + 2);\n indexData[0] = XKT_VERSION;\n indexData [1] = elements.length; // Stored Data 1.1: number of stored elements\n let dataLen = 0; // Stored Data 1.2: length of stored elements\n for (let i = 0, len = elements.length; i < len; i++) {\n const element = elements[i];\n const elementsize = element.length;\n indexData[i + 2] = elementsize;\n dataLen += elementsize;\n }\n const indexBuf = new Uint8Array(indexData.buffer);\n const dataArray = new Uint8Array(indexBuf.length + dataLen);\n dataArray.set(indexBuf);\n let offset = indexBuf.length;\n for (let i = 0, len = elements.length; i < len; i++) { // Stored Data 2: the elements themselves\n const element = elements[i];\n dataArray.set(element, offset);\n offset += element.length;\n }\n return dataArray.buffer;\n}\n\nexport {writeXKTModelToArrayBuffer};","/** @private */\nfunction earcut(data, holeIndices, dim) {\n\n dim = dim || 2;\n\n var hasHoles = holeIndices && holeIndices.length,\n outerLen = hasHoles ? holeIndices[0] * dim : data.length,\n outerNode = linkedList(data, 0, outerLen, dim, true),\n triangles = [];\n\n if (!outerNode || outerNode.next === outerNode.prev) return triangles;\n\n var minX, minY, maxX, maxY, x, y, invSize;\n\n if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);\n\n // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n if (data.length > 80 * dim) {\n minX = maxX = data[0];\n minY = maxY = data[1];\n\n for (var i = dim; i < outerLen; i += dim) {\n x = data[i];\n y = data[i + 1];\n if (x < minX) minX = x;\n if (y < minY) minY = y;\n if (x > maxX) maxX = x;\n if (y > maxY) maxY = y;\n }\n\n // minX, minY and invSize are later used to transform coords into integers for z-order calculation\n invSize = Math.max(maxX - minX, maxY - minY);\n invSize = invSize !== 0 ? 1 / invSize : 0;\n }\n\n earcutLinked(outerNode, triangles, dim, minX, minY, invSize);\n\n return triangles;\n}\n\n// create a circular doubly linked list from polygon points in the specified winding order\nfunction linkedList(data, start, end, dim, clockwise) {\n var i, last;\n\n if (clockwise === (signedArea(data, start, end, dim) > 0)) {\n for (i = start; i < end; i += dim) last = insertNode(i, data[i], data[i + 1], last);\n } else {\n for (i = end - dim; i >= start; i -= dim) last = insertNode(i, data[i], data[i + 1], last);\n }\n\n if (last && equals(last, last.next)) {\n removeNode(last);\n last = last.next;\n }\n\n return last;\n}\n\n// eliminate colinear or duplicate points\nfunction filterPoints(start, end) {\n if (!start) return start;\n if (!end) end = start;\n\n var p = start,\n again;\n do {\n again = false;\n\n if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {\n removeNode(p);\n p = end = p.prev;\n if (p === p.next) break;\n again = true;\n\n } else {\n p = p.next;\n }\n } while (again || p !== end);\n\n return end;\n}\n\n// main ear slicing loop which triangulates a polygon (given as a linked list)\nfunction earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) {\n if (!ear) return;\n\n // interlink polygon nodes in z-order\n if (!pass && invSize) indexCurve(ear, minX, minY, invSize);\n\n var stop = ear,\n prev, next;\n\n // iterate through ears, slicing them one by one\n while (ear.prev !== ear.next) {\n prev = ear.prev;\n next = ear.next;\n\n if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) {\n // cut off the triangle\n triangles.push(prev.i / dim);\n triangles.push(ear.i / dim);\n triangles.push(next.i / dim);\n\n removeNode(ear);\n\n // skipping the next vertex leads to less sliver triangles\n ear = next.next;\n stop = next.next;\n\n continue;\n }\n\n ear = next;\n\n // if we looped through the whole remaining polygon and can't find any more ears\n if (ear === stop) {\n // try filtering points and slicing again\n if (!pass) {\n earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1);\n\n // if this didn't work, try curing all small self-intersections locally\n } else if (pass === 1) {\n ear = cureLocalIntersections(filterPoints(ear), triangles, dim);\n earcutLinked(ear, triangles, dim, minX, minY, invSize, 2);\n\n // as a last resort, try splitting the remaining polygon into two\n } else if (pass === 2) {\n splitEarcut(ear, triangles, dim, minX, minY, invSize);\n }\n\n break;\n }\n }\n}\n\n// check whether a polygon node forms a valid ear with adjacent nodes\nfunction isEar(ear) {\n var a = ear.prev,\n b = ear,\n c = ear.next;\n\n if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n // now make sure we don't have other points inside the potential ear\n var p = ear.next.next;\n\n while (p !== ear.prev) {\n if (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n area(p.prev, p, p.next) >= 0) return false;\n p = p.next;\n }\n\n return true;\n}\n\nfunction isEarHashed(ear, minX, minY, invSize) {\n var a = ear.prev,\n b = ear,\n c = ear.next;\n\n if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n // triangle bbox; min & max are calculated like this for speed\n var minTX = a.x < b.x ? (a.x < c.x ? a.x : c.x) : (b.x < c.x ? b.x : c.x),\n minTY = a.y < b.y ? (a.y < c.y ? a.y : c.y) : (b.y < c.y ? b.y : c.y),\n maxTX = a.x > b.x ? (a.x > c.x ? a.x : c.x) : (b.x > c.x ? b.x : c.x),\n maxTY = a.y > b.y ? (a.y > c.y ? a.y : c.y) : (b.y > c.y ? b.y : c.y);\n\n // z-order range for the current triangle bbox;\n var minZ = zOrder(minTX, minTY, minX, minY, invSize),\n maxZ = zOrder(maxTX, maxTY, minX, minY, invSize);\n\n var p = ear.prevZ,\n n = ear.nextZ;\n\n // look for points inside the triangle in both directions\n while (p && p.z >= minZ && n && n.z <= maxZ) {\n if (p !== ear.prev && p !== ear.next &&\n pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n area(p.prev, p, p.next) >= 0) return false;\n p = p.prevZ;\n\n if (n !== ear.prev && n !== ear.next &&\n pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) &&\n area(n.prev, n, n.next) >= 0) return false;\n n = n.nextZ;\n }\n\n // look for remaining points in decreasing z-order\n while (p && p.z >= minZ) {\n if (p !== ear.prev && p !== ear.next &&\n pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n area(p.prev, p, p.next) >= 0) return false;\n p = p.prevZ;\n }\n\n // look for remaining points in increasing z-order\n while (n && n.z <= maxZ) {\n if (n !== ear.prev && n !== ear.next &&\n pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) &&\n area(n.prev, n, n.next) >= 0) return false;\n n = n.nextZ;\n }\n\n return true;\n}\n\n// go through all polygon nodes and cure small local self-intersections\nfunction cureLocalIntersections(start, triangles, dim) {\n var p = start;\n do {\n var a = p.prev,\n b = p.next.next;\n\n if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {\n\n triangles.push(a.i / dim);\n triangles.push(p.i / dim);\n triangles.push(b.i / dim);\n\n // remove two nodes involved\n removeNode(p);\n removeNode(p.next);\n\n p = start = b;\n }\n p = p.next;\n } while (p !== start);\n\n return filterPoints(p);\n}\n\n// try splitting polygon into two and triangulate them independently\nfunction splitEarcut(start, triangles, dim, minX, minY, invSize) {\n // look for a valid diagonal that divides the polygon into two\n var a = start;\n do {\n var b = a.next.next;\n while (b !== a.prev) {\n if (a.i !== b.i && isValidDiagonal(a, b)) {\n // split the polygon in two by the diagonal\n var c = splitPolygon(a, b);\n\n // filter colinear points around the cuts\n a = filterPoints(a, a.next);\n c = filterPoints(c, c.next);\n\n // run earcut on each half\n earcutLinked(a, triangles, dim, minX, minY, invSize);\n earcutLinked(c, triangles, dim, minX, minY, invSize);\n return;\n }\n b = b.next;\n }\n a = a.next;\n } while (a !== start);\n}\n\n// link every hole into the outer loop, producing a single-ring polygon without holes\nfunction eliminateHoles(data, holeIndices, outerNode, dim) {\n var queue = [],\n i, len, start, end, list;\n\n for (i = 0, len = holeIndices.length; i < len; i++) {\n start = holeIndices[i] * dim;\n end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n list = linkedList(data, start, end, dim, false);\n if (list === list.next) list.steiner = true;\n queue.push(getLeftmost(list));\n }\n\n queue.sort(compareX);\n\n // process holes from left to right\n for (i = 0; i < queue.length; i++) {\n eliminateHole(queue[i], outerNode);\n outerNode = filterPoints(outerNode, outerNode.next);\n }\n\n return outerNode;\n}\n\nfunction compareX(a, b) {\n return a.x - b.x;\n}\n\n// find a bridge between vertices that connects hole with an outer ring and and link it\nfunction eliminateHole(hole, outerNode) {\n outerNode = findHoleBridge(hole, outerNode);\n if (outerNode) {\n var b = splitPolygon(outerNode, hole);\n\n // filter collinear points around the cuts\n filterPoints(outerNode, outerNode.next);\n filterPoints(b, b.next);\n }\n}\n\n// David Eberly's algorithm for finding a bridge between hole and outer polygon\nfunction findHoleBridge(hole, outerNode) {\n var p = outerNode,\n hx = hole.x,\n hy = hole.y,\n qx = -Infinity,\n m;\n\n // find a segment intersected by a ray from the hole's leftmost point to the left;\n // segment's endpoint with lesser x will be potential connection point\n do {\n if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {\n var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);\n if (x <= hx && x > qx) {\n qx = x;\n if (x === hx) {\n if (hy === p.y) return p;\n if (hy === p.next.y) return p.next;\n }\n m = p.x < p.next.x ? p : p.next;\n }\n }\n p = p.next;\n } while (p !== outerNode);\n\n if (!m) return null;\n\n if (hx === qx) return m; // hole touches outer segment; pick leftmost endpoint\n\n // look for points inside the triangle of hole point, segment intersection and endpoint;\n // if there are no points found, we have a valid connection;\n // otherwise choose the point of the minimum angle with the ray as connection point\n\n var stop = m,\n mx = m.x,\n my = m.y,\n tanMin = Infinity,\n tan;\n\n p = m;\n\n do {\n if (hx >= p.x && p.x >= mx && hx !== p.x &&\n pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {\n\n tan = Math.abs(hy - p.y) / (hx - p.x); // tangential\n\n if (locallyInside(p, hole) &&\n (tan < tanMin || (tan === tanMin && (p.x > m.x || (p.x === m.x && sectorContainsSector(m, p)))))) {\n m = p;\n tanMin = tan;\n }\n }\n\n p = p.next;\n } while (p !== stop);\n\n return m;\n}\n\n// whether sector in vertex m contains sector in vertex p in the same coordinates\nfunction sectorContainsSector(m, p) {\n return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0;\n}\n\n// interlink polygon nodes in z-order\nfunction indexCurve(start, minX, minY, invSize) {\n var p = start;\n do {\n if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, invSize);\n p.prevZ = p.prev;\n p.nextZ = p.next;\n p = p.next;\n } while (p !== start);\n\n p.prevZ.nextZ = null;\n p.prevZ = null;\n\n sortLinked(p);\n}\n\n// Simon Tatham's linked list merge sort algorithm\n// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\nfunction sortLinked(list) {\n var i, p, q, e, tail, numMerges, pSize, qSize,\n inSize = 1;\n\n do {\n p = list;\n list = null;\n tail = null;\n numMerges = 0;\n\n while (p) {\n numMerges++;\n q = p;\n pSize = 0;\n for (i = 0; i < inSize; i++) {\n pSize++;\n q = q.nextZ;\n if (!q) break;\n }\n qSize = inSize;\n\n while (pSize > 0 || (qSize > 0 && q)) {\n\n if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {\n e = p;\n p = p.nextZ;\n pSize--;\n } else {\n e = q;\n q = q.nextZ;\n qSize--;\n }\n\n if (tail) tail.nextZ = e;\n else list = e;\n\n e.prevZ = tail;\n tail = e;\n }\n\n p = q;\n }\n\n tail.nextZ = null;\n inSize *= 2;\n\n } while (numMerges > 1);\n\n return list;\n}\n\n// z-order of a point given coords and inverse of the longer side of data bbox\nfunction zOrder(x, y, minX, minY, invSize) {\n // coords are transformed into non-negative 15-bit integer range\n x = 32767 * (x - minX) * invSize;\n y = 32767 * (y - minY) * invSize;\n\n x = (x | (x << 8)) & 0x00FF00FF;\n x = (x | (x << 4)) & 0x0F0F0F0F;\n x = (x | (x << 2)) & 0x33333333;\n x = (x | (x << 1)) & 0x55555555;\n\n y = (y | (y << 8)) & 0x00FF00FF;\n y = (y | (y << 4)) & 0x0F0F0F0F;\n y = (y | (y << 2)) & 0x33333333;\n y = (y | (y << 1)) & 0x55555555;\n\n return x | (y << 1);\n}\n\n// find the leftmost node of a polygon ring\nfunction getLeftmost(start) {\n var p = start,\n leftmost = start;\n do {\n if (p.x < leftmost.x || (p.x === leftmost.x && p.y < leftmost.y)) leftmost = p;\n p = p.next;\n } while (p !== start);\n\n return leftmost;\n}\n\n// check if a point lies within a convex triangle\nfunction pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {\n return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 &&\n (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 &&\n (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0;\n}\n\n// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\nfunction isValidDiagonal(a, b) {\n return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && // dones't intersect other edges\n (locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && // locally visible\n (area(a.prev, a, b.prev) || area(a, b.prev, b)) || // does not create opposite-facing sectors\n equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); // special zero-length case\n}\n\n// signed area of a triangle\nfunction area(p, q, r) {\n return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);\n}\n\n// check if two points are equal\nfunction equals(p1, p2) {\n return p1.x === p2.x && p1.y === p2.y;\n}\n\n// check if two segments intersect\nfunction intersects(p1, q1, p2, q2) {\n var o1 = sign(area(p1, q1, p2));\n var o2 = sign(area(p1, q1, q2));\n var o3 = sign(area(p2, q2, p1));\n var o4 = sign(area(p2, q2, q1));\n\n if (o1 !== o2 && o3 !== o4) return true; // general case\n\n if (o1 === 0 && onSegment(p1, p2, q1)) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1\n if (o2 === 0 && onSegment(p1, q2, q1)) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1\n if (o3 === 0 && onSegment(p2, p1, q2)) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2\n if (o4 === 0 && onSegment(p2, q1, q2)) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2\n\n return false;\n}\n\n// for collinear points p, q, r, check if point q lies on segment pr\nfunction onSegment(p, q, r) {\n return q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y);\n}\n\nfunction sign(num) {\n return num > 0 ? 1 : num < 0 ? -1 : 0;\n}\n\n// check if a polygon diagonal intersects any polygon segments\nfunction intersectsPolygon(a, b) {\n var p = a;\n do {\n if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&\n intersects(p, p.next, a, b)) return true;\n p = p.next;\n } while (p !== a);\n\n return false;\n}\n\n// check if a polygon diagonal is locally inside the polygon\nfunction locallyInside(a, b) {\n return area(a.prev, a, a.next) < 0 ?\n area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 :\n area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;\n}\n\n// check if the middle point of a polygon diagonal is inside the polygon\nfunction middleInside(a, b) {\n var p = a,\n inside = false,\n px = (a.x + b.x) / 2,\n py = (a.y + b.y) / 2;\n do {\n if (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y &&\n (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x))\n inside = !inside;\n p = p.next;\n } while (p !== a);\n\n return inside;\n}\n\n// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\n// if one belongs to the outer ring and another to a hole, it merges it into a single ring\nfunction splitPolygon(a, b) {\n var a2 = new Node(a.i, a.x, a.y),\n b2 = new Node(b.i, b.x, b.y),\n an = a.next,\n bp = b.prev;\n\n a.next = b;\n b.prev = a;\n\n a2.next = an;\n an.prev = a2;\n\n b2.next = a2;\n a2.prev = b2;\n\n bp.next = b2;\n b2.prev = bp;\n\n return b2;\n}\n\n// create a node and optionally link it with previous one (in a circular doubly linked list)\nfunction insertNode(i, x, y, last) {\n var p = new Node(i, x, y);\n\n if (!last) {\n p.prev = p;\n p.next = p;\n\n } else {\n p.next = last.next;\n p.prev = last;\n last.next.prev = p;\n last.next = p;\n }\n return p;\n}\n\nfunction removeNode(p) {\n p.next.prev = p.prev;\n p.prev.next = p.next;\n\n if (p.prevZ) p.prevZ.nextZ = p.nextZ;\n if (p.nextZ) p.nextZ.prevZ = p.prevZ;\n}\n\nfunction Node(i, x, y) {\n // vertex index in coordinates array\n this.i = i;\n\n // vertex coordinates\n this.x = x;\n this.y = y;\n\n // previous and next vertex nodes in a polygon ring\n this.prev = null;\n this.next = null;\n\n // z-order curve value\n this.z = null;\n\n // previous and next nodes in z-order\n this.prevZ = null;\n this.nextZ = null;\n\n // indicates whether this is a steiner point\n this.steiner = false;\n}\n\n// return a percentage difference between the polygon area and its triangulation area;\n// used to verify correctness of triangulation\nearcut.deviation = function (data, holeIndices, dim, triangles) {\n var hasHoles = holeIndices && holeIndices.length;\n var outerLen = hasHoles ? holeIndices[0] * dim : data.length;\n\n var polygonArea = Math.abs(signedArea(data, 0, outerLen, dim));\n if (hasHoles) {\n for (var i = 0, len = holeIndices.length; i < len; i++) {\n var start = holeIndices[i] * dim;\n var end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n polygonArea -= Math.abs(signedArea(data, start, end, dim));\n }\n }\n\n var trianglesArea = 0;\n for (i = 0; i < triangles.length; i += 3) {\n var a = triangles[i] * dim;\n var b = triangles[i + 1] * dim;\n var c = triangles[i + 2] * dim;\n trianglesArea += Math.abs(\n (data[a] - data[c]) * (data[b + 1] - data[a + 1]) -\n (data[a] - data[b]) * (data[c + 1] - data[a + 1]));\n }\n\n return polygonArea === 0 && trianglesArea === 0 ? 0 :\n Math.abs((trianglesArea - polygonArea) / polygonArea);\n};\n\nfunction signedArea(data, start, end, dim) {\n var sum = 0;\n for (var i = start, j = end - dim; i < end; i += dim) {\n sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);\n j = i;\n }\n return sum;\n}\n\n// turn a polygon in a multi-dimensional array form (e.g. as in GeoJSON) into a form Earcut accepts\nearcut.flatten = function (data) {\n var dim = data[0][0].length,\n result = {vertices: [], holes: [], dimensions: dim},\n holeIndex = 0;\n\n for (var i = 0; i < data.length; i++) {\n for (var j = 0; j < data[i].length; j++) {\n for (var d = 0; d < dim; d++) result.vertices.push(data[i][j][d]);\n }\n if (i > 0) {\n holeIndex += data[i - 1].length;\n result.holes.push(holeIndex);\n }\n }\n return result;\n};\n\nexport {earcut};","import {earcut} from './../lib/earcut';\nimport {math} from \"./../lib/math.js\";\n\nconst tempVec2a = math.vec2();\nconst tempVec3a = math.vec3();\nconst tempVec3b = math.vec3();\nconst tempVec3c = math.vec3();\n\n/**\n * @desc Parses a CityJSON model into an {@link XKTModel}.\n *\n * [CityJSON](https://www.cityjson.org) is a JSON-based encoding for a subset of the CityGML data model (version 2.0.0),\n * which is an open standardised data model and exchange format to store digital 3D models of cities and\n * landscapes. CityGML is an official standard of the [Open Geospatial Consortium](https://www.ogc.org/).\n *\n * This converter function supports most of the [CityJSON 1.0.2 Specification](https://www.cityjson.org/specs/1.0.2),\n * with the following limitations:\n *\n * * Does not (yet) support CityJSON semantics for geometry primitives.\n * * Does not (yet) support textured geometries.\n * * Does not (yet) support geometry templates.\n * * When the CityJSON file provides multiple *themes* for a geometry, then we parse only the first of the provided themes for that geometry.\n *\n * ## Usage\n *\n * In the example below we'll create an {@link XKTModel}, then load a CityJSON model into it.\n *\n * ````javascript\n * utils.loadJSON(\"./models/cityjson/DenHaag.json\", async (data) => {\n *\n * const xktModel = new XKTModel();\n *\n * parseCityJSONIntoXKTModel({\n * data,\n * xktModel,\n * log: (msg) => { console.log(msg); }\n * }).then(()=>{\n * xktModel.finalize();\n * },\n * (msg) => {\n * console.error(msg);\n * });\n * });\n * ````\n *\n * @param {Object} params Parsing params.\n * @param {Object} params.data CityJSON data.\n * @param {XKTModel} params.xktModel XKTModel to parse into.\n * @param {boolean} [params.center=false] Set true to center the CityJSON vertex positions to [0,0,0]. This is applied before the transformation matrix, if specified.\n * @param {Boolean} [params.transform] 4x4 transformation matrix to transform CityJSON vertex positions. Use this to rotate, translate and scale them if neccessary.\n * @param {Object} [params.stats] Collects statistics.\n * @param {function} [params.log] Logging callback.\n @returns {Promise} Resolves when CityJSON has been parsed.\n */\nfunction parseCityJSONIntoXKTModel({\n data,\n xktModel,\n center = false,\n transform = null,\n stats = {}, log\n }) {\n\n return new Promise(function (resolve, reject) {\n\n if (!data) {\n reject(\"Argument expected: data\");\n return;\n }\n\n if (data.type !== \"CityJSON\") {\n reject(\"Invalid argument: data is not a CityJSON file\");\n return;\n }\n\n if (!xktModel) {\n reject(\"Argument expected: xktModel\");\n return;\n }\n\n let vertices;\n\n log(\"Using parser: parseCityJSONIntoXKTModel\");\n\n log(`center: ${center}`);\n if (transform) {\n log(`transform: [${transform}]`);\n }\n\n if (data.transform || center || transform) {\n vertices = copyVertices(data.vertices);\n if (data.transform) {\n transformVertices(vertices, data.transform)\n }\n if (center) {\n centerVertices(vertices);\n }\n if (transform) {\n customTransformVertices(vertices, transform);\n }\n } else {\n vertices = data.vertices;\n }\n\n stats.sourceFormat = data.type || \"\";\n stats.schemaVersion = data.version || \"\";\n stats.title = \"\";\n stats.author = \"\";\n stats.created = \"\";\n stats.numMetaObjects = 0;\n stats.numPropertySets = 0;\n stats.numTriangles = 0;\n stats.numVertices = 0;\n stats.numObjects = 0;\n stats.numGeometries = 0;\n\n const rootMetaObjectId = math.createUUID();\n\n xktModel.createMetaObject({\n metaObjectId: rootMetaObjectId,\n metaObjectType: \"Model\",\n metaObjectName: \"Model\"\n });\n\n stats.numMetaObjects++;\n\n const modelMetaObjectId = math.createUUID();\n\n xktModel.createMetaObject({\n metaObjectId: modelMetaObjectId,\n metaObjectType: \"CityJSON\",\n metaObjectName: \"CityJSON\",\n parentMetaObjectId: rootMetaObjectId\n });\n\n stats.numMetaObjects++;\n\n const ctx = {\n data,\n vertices,\n xktModel,\n rootMetaObjectId: modelMetaObjectId,\n log: (log || function (msg) {\n }),\n nextId: 0,\n stats\n };\n\n ctx.xktModel.schema = data.type + \" \" + data.version;\n\n ctx.log(\"Converting \" + ctx.xktModel.schema);\n\n parseCityJSON(ctx);\n\n resolve();\n });\n}\n\nfunction copyVertices(vertices) {\n const vertices2 = [];\n for (let i = 0, j = 0; i < vertices.length; i++, j += 3) {\n const x = vertices[i][0];\n const y = vertices[i][1];\n const z = vertices[i][2];\n vertices2.push([x, y, z]);\n }\n return vertices2;\n}\n\nfunction transformVertices(vertices, cityJSONTransform) {\n const scale = cityJSONTransform.scale || math.vec3([1, 1, 1]);\n const translate = cityJSONTransform.translate || math.vec3([0, 0, 0]);\n for (let i = 0; i < vertices.length; i++) {\n const vertex = vertices[i];\n vertex[0] = (vertex[0] * scale[0]) + translate[0];\n vertex[1] = (vertex[1] * scale[1]) + translate[1];\n vertex[2] = (vertex[2] * scale[2]) + translate[2];\n }\n}\n\nfunction centerVertices(vertices) {\n if (center) {\n const centerPos = math.vec3();\n const numPoints = vertices.length;\n for (let i = 0, len = vertices.length; i < len; i++) {\n const vertex = vertices[i];\n centerPos[0] += vertex[0];\n centerPos[1] += vertex[1];\n centerPos[2] += vertex[2];\n }\n centerPos[0] /= numPoints;\n centerPos[1] /= numPoints;\n centerPos[2] /= numPoints;\n for (let i = 0, len = vertices.length; i < len; i++) {\n const vertex = vertices[i];\n vertex[0] -= centerPos[0];\n vertex[1] -= centerPos[1];\n vertex[2] -= centerPos[2];\n }\n }\n}\n\nfunction customTransformVertices(vertices, transform) {\n if (transform) {\n const mat = math.mat4(transform);\n for (let i = 0, len = vertices.length; i < len; i++) {\n const vertex = vertices[i];\n math.transformPoint3(mat, vertex, vertex);\n }\n }\n}\n\nfunction parseCityJSON(ctx) {\n\n const data = ctx.data;\n const cityObjects = data.CityObjects;\n\n for (const objectId in cityObjects) {\n if (cityObjects.hasOwnProperty(objectId)) {\n const cityObject = cityObjects[objectId];\n parseCityObject(ctx, cityObject, objectId);\n }\n }\n}\n\nfunction parseCityObject(ctx, cityObject, objectId) {\n\n const xktModel = ctx.xktModel;\n const data = ctx.data;\n const metaObjectId = objectId;\n const metaObjectType = cityObject.type;\n const metaObjectName = metaObjectType + \" : \" + objectId;\n\n const parentMetaObjectId = cityObject.parents ? cityObject.parents[0] : ctx.rootMetaObjectId;\n\n xktModel.createMetaObject({\n metaObjectId,\n metaObjectName,\n metaObjectType,\n parentMetaObjectId\n });\n\n ctx.stats.numMetaObjects++;\n\n if (!(cityObject.geometry && cityObject.geometry.length > 0)) {\n return;\n }\n\n const meshIds = [];\n\n for (let i = 0, len = cityObject.geometry.length; i < len; i++) {\n\n const geometry = cityObject.geometry[i];\n\n let objectMaterial;\n let surfaceMaterials;\n\n const appearance = data.appearance;\n if (appearance) {\n const materials = appearance.materials;\n if (materials) {\n const geometryMaterial = geometry.material;\n if (geometryMaterial) {\n const themeIds = Object.keys(geometryMaterial);\n if (themeIds.length > 0) {\n const themeId = themeIds[0];\n const theme = geometryMaterial[themeId];\n if (theme.value !== undefined) {\n objectMaterial = materials[theme.value];\n } else {\n const values = theme.values;\n if (values) {\n surfaceMaterials = [];\n for (let j = 0, lenj = values.length; j < lenj; j++) {\n const value = values[i];\n const surfaceMaterial = materials[value];\n surfaceMaterials.push(surfaceMaterial);\n }\n }\n }\n }\n }\n }\n }\n\n if (surfaceMaterials) {\n parseGeometrySurfacesWithOwnMaterials(ctx, geometry, surfaceMaterials, meshIds);\n\n } else {\n parseGeometrySurfacesWithSharedMaterial(ctx, geometry, objectMaterial, meshIds);\n }\n }\n\n if (meshIds.length > 0) {\n xktModel.createEntity({\n entityId: objectId,\n meshIds: meshIds\n });\n\n ctx.stats.numObjects++;\n }\n}\n\nfunction parseGeometrySurfacesWithOwnMaterials(ctx, geometry, surfaceMaterials, meshIds) {\n\n const geomType = geometry.type;\n\n switch (geomType) {\n\n case \"MultiPoint\":\n break;\n\n case \"MultiLineString\":\n break;\n\n case \"MultiSurface\":\n\n case \"CompositeSurface\":\n const surfaces = geometry.boundaries;\n parseSurfacesWithOwnMaterials(ctx, surfaceMaterials, surfaces, meshIds);\n break;\n\n case \"Solid\":\n const shells = geometry.boundaries;\n for (let j = 0; j < shells.length; j++) {\n const surfaces = shells[j];\n parseSurfacesWithOwnMaterials(ctx, surfaceMaterials, surfaces, meshIds);\n }\n break;\n\n case \"MultiSolid\":\n\n case \"CompositeSolid\":\n const solids = geometry.boundaries;\n for (let j = 0; j < solids.length; j++) {\n for (let k = 0; k < solids[j].length; k++) {\n const surfaces = solids[j][k];\n parseSurfacesWithOwnMaterials(ctx, surfaceMaterials, surfaces, meshIds);\n }\n }\n break;\n\n case \"GeometryInstance\":\n break;\n }\n}\n\nfunction parseSurfacesWithOwnMaterials(ctx, surfaceMaterials, surfaces, meshIds) {\n\n const vertices = ctx.vertices;\n const xktModel = ctx.xktModel;\n\n for (let i = 0; i < surfaces.length; i++) {\n\n const surface = surfaces[i];\n const surfaceMaterial = surfaceMaterials[i] || {diffuseColor: [0.8, 0.8, 0.8], transparency: 1.0};\n\n const face = [];\n const holes = [];\n\n const sharedIndices = [];\n\n const geometryCfg = {\n positions: [],\n indices: []\n };\n\n for (let j = 0; j < surface.length; j++) {\n\n if (face.length > 0) {\n holes.push(face.length);\n }\n\n const newFace = extractLocalIndices(ctx, surface[j], sharedIndices, geometryCfg);\n\n face.push(...newFace);\n }\n\n if (face.length === 3) { // Triangle\n\n geometryCfg.indices.push(face[0]);\n geometryCfg.indices.push(face[1]);\n geometryCfg.indices.push(face[2]);\n\n } else if (face.length > 3) { // Polygon\n\n // Prepare to triangulate\n\n const pList = [];\n\n for (let k = 0; k < face.length; k++) {\n pList.push({\n x: vertices[sharedIndices[face[k]]][0],\n y: vertices[sharedIndices[face[k]]][1],\n z: vertices[sharedIndices[face[k]]][2]\n });\n }\n\n const normal = getNormalOfPositions(pList, math.vec3());\n\n // Convert to 2D\n\n let pv = [];\n\n for (let k = 0; k < pList.length; k++) {\n\n to2D(pList[k], normal, tempVec2a);\n\n pv.unshift(tempVec2a[0]);\n pv.unshift(tempVec2a[1]);\n }\n\n // Triangulate\n\n const tr = earcut(pv, holes, 2);\n\n // Create triangles\n\n for (let k = 0; k < tr.length; k += 3) {\n geometryCfg.indices.unshift(face[tr[k]]);\n geometryCfg.indices.unshift(face[tr[k + 1]]);\n geometryCfg.indices.unshift(face[tr[k + 2]]);\n }\n }\n\n const geometryId = \"\" + ctx.nextId++;\n const meshId = \"\" + ctx.nextId++;\n\n xktModel.createGeometry({\n geometryId: geometryId,\n primitiveType: \"triangles\",\n positions: geometryCfg.positions,\n indices: geometryCfg.indices\n });\n\n xktModel.createMesh({\n meshId: meshId,\n geometryId: geometryId,\n color: (surfaceMaterial && surfaceMaterial.diffuseColor) ? surfaceMaterial.diffuseColor : [0.8, 0.8, 0.8],\n opacity: 1.0\n //opacity: (surfaceMaterial && surfaceMaterial.transparency !== undefined) ? (1.0 - surfaceMaterial.transparency) : 1.0\n });\n\n meshIds.push(meshId);\n\n ctx.stats.numGeometries++;\n ctx.stats.numVertices += geometryCfg.positions.length / 3;\n ctx.stats.numTriangles += geometryCfg.indices.length / 3;\n }\n}\n\nfunction parseGeometrySurfacesWithSharedMaterial(ctx, geometry, objectMaterial, meshIds) {\n\n const xktModel = ctx.xktModel;\n const sharedIndices = [];\n const geometryCfg = {\n positions: [],\n indices: []\n };\n\n const geomType = geometry.type;\n\n switch (geomType) {\n case \"MultiPoint\":\n break;\n\n case \"MultiLineString\":\n break;\n\n case \"MultiSurface\":\n case \"CompositeSurface\":\n const surfaces = geometry.boundaries;\n parseSurfacesWithSharedMaterial(ctx, surfaces, sharedIndices, geometryCfg);\n break;\n\n case \"Solid\":\n const shells = geometry.boundaries;\n for (let j = 0; j < shells.length; j++) {\n const surfaces = shells[j];\n parseSurfacesWithSharedMaterial(ctx, surfaces, sharedIndices, geometryCfg);\n }\n break;\n\n case \"MultiSolid\":\n case \"CompositeSolid\":\n const solids = geometry.boundaries;\n for (let j = 0; j < solids.length; j++) {\n for (let k = 0; k < solids[j].length; k++) {\n const surfaces = solids[j][k];\n parseSurfacesWithSharedMaterial(ctx, surfaces, sharedIndices, geometryCfg);\n }\n }\n break;\n\n case \"GeometryInstance\":\n break;\n }\n\n const geometryId = \"\" + ctx.nextId++;\n const meshId = \"\" + ctx.nextId++;\n\n xktModel.createGeometry({\n geometryId: geometryId,\n primitiveType: \"triangles\",\n positions: geometryCfg.positions,\n indices: geometryCfg.indices\n });\n\n xktModel.createMesh({\n meshId: meshId,\n geometryId: geometryId,\n color: (objectMaterial && objectMaterial.diffuseColor) ? objectMaterial.diffuseColor : [0.8, 0.8, 0.8],\n opacity: 1.0\n //opacity: (objectMaterial && objectMaterial.transparency !== undefined) ? (1.0 - objectMaterial.transparency) : 1.0\n });\n\n meshIds.push(meshId);\n\n ctx.stats.numGeometries++;\n ctx.stats.numVertices += geometryCfg.positions.length / 3;\n ctx.stats.numTriangles += geometryCfg.indices.length / 3;\n}\n\nfunction parseSurfacesWithSharedMaterial(ctx, surfaces, sharedIndices, primitiveCfg) {\n\n const vertices = ctx.vertices;\n\n for (let i = 0; i < surfaces.length; i++) {\n\n let boundary = [];\n let holes = [];\n\n for (let j = 0; j < surfaces[i].length; j++) {\n if (boundary.length > 0) {\n holes.push(boundary.length);\n }\n const newBoundary = extractLocalIndices(ctx, surfaces[i][j], sharedIndices, primitiveCfg);\n boundary.push(...newBoundary);\n }\n\n if (boundary.length === 3) { // Triangle\n\n primitiveCfg.indices.push(boundary[0]);\n primitiveCfg.indices.push(boundary[1]);\n primitiveCfg.indices.push(boundary[2]);\n\n } else if (boundary.length > 3) { // Polygon\n\n let pList = [];\n\n for (let k = 0; k < boundary.length; k++) {\n pList.push({\n x: vertices[sharedIndices[boundary[k]]][0],\n y: vertices[sharedIndices[boundary[k]]][1],\n z: vertices[sharedIndices[boundary[k]]][2]\n });\n }\n\n const normal = getNormalOfPositions(pList, math.vec3());\n let pv = [];\n\n for (let k = 0; k < pList.length; k++) {\n to2D(pList[k], normal, tempVec2a);\n pv.unshift(tempVec2a[0]);\n pv.unshift(tempVec2a[1]);\n }\n\n const tr = earcut(pv, holes, 2);\n\n for (let k = 0; k < tr.length; k += 3) {\n primitiveCfg.indices.unshift(boundary[tr[k]]);\n primitiveCfg.indices.unshift(boundary[tr[k + 1]]);\n primitiveCfg.indices.unshift(boundary[tr[k + 2]]);\n }\n }\n }\n}\n\nfunction extractLocalIndices(ctx, boundary, sharedIndices, geometryCfg) {\n\n const vertices = ctx.vertices;\n const newBoundary = []\n\n for (let i = 0, len = boundary.length; i < len; i++) {\n\n const index = boundary[i];\n\n if (sharedIndices.includes(index)) {\n const vertexIndex = sharedIndices.indexOf(index);\n newBoundary.push(vertexIndex);\n\n } else {\n geometryCfg.positions.push(vertices[index][0]);\n geometryCfg.positions.push(vertices[index][1]);\n geometryCfg.positions.push(vertices[index][2]);\n\n newBoundary.push(sharedIndices.length);\n\n sharedIndices.push(index);\n }\n }\n\n return newBoundary\n}\n\nfunction getNormalOfPositions(positions, normal) {\n\n for (let i = 0; i < positions.length; i++) {\n\n let nexti = i + 1;\n if (nexti === positions.length) {\n nexti = 0;\n }\n\n normal[0] += ((positions[i].y - positions[nexti].y) * (positions[i].z + positions[nexti].z));\n normal[1] += ((positions[i].z - positions[nexti].z) * (positions[i].x + positions[nexti].x));\n normal[2] += ((positions[i].x - positions[nexti].x) * (positions[i].y + positions[nexti].y));\n }\n\n return math.normalizeVec3(normal);\n}\n\nfunction to2D(_p, _n, re) {\n\n const p = tempVec3a;\n const n = tempVec3b;\n const x3 = tempVec3c;\n\n p[0] = _p.x;\n p[1] = _p.y;\n p[2] = _p.z;\n\n n[0] = _n.x;\n n[1] = _n.y;\n n[2] = _n.z;\n\n x3[0] = 1.1;\n x3[1] = 1.1;\n x3[2] = 1.1;\n\n const dist = math.lenVec3(math.subVec3(x3, n));\n\n if (dist < 0.01) {\n x3[0] += 1.0;\n x3[1] += 2.0;\n x3[2] += 3.0;\n }\n\n const dot = math.dotVec3(x3, n);\n const tmp2 = math.mulVec3Scalar(n, dot, math.vec3());\n\n x3[0] -= tmp2[0];\n x3[1] -= tmp2[1];\n x3[2] -= tmp2[2];\n\n math.normalizeVec3(x3);\n\n const y3 = math.cross3Vec3(n, x3, math.vec3());\n const x = math.dotVec3(p, x3);\n const y = math.dotVec3(p, y3);\n\n re[0] = x;\n re[1] = y;\n}\n\nexport {parseCityJSONIntoXKTModel};","function isString(value) {\n return (typeof value === 'string' || value instanceof String);\n}\n\nfunction apply(o, o2) {\n for (const name in o) {\n if (o.hasOwnProperty(name)) {\n o2[name] = o[name];\n }\n }\n return o2;\n}\n\n/**\n * @private\n */\nconst utils = {\n isString,\n apply\n};\n\nexport {utils};\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@loaders.gl/gltf\");","import {utils} from \"../XKTModel/lib/utils.js\";\nimport {math} from \"../lib/math.js\";\n\nimport {parse} from '@loaders.gl/core';\nimport {GLTFLoader} from '@loaders.gl/gltf';\nimport {\n ClampToEdgeWrapping,\n LinearFilter,\n LinearMipMapLinearFilter,\n LinearMipMapNearestFilter,\n MirroredRepeatWrapping,\n NearestFilter,\n NearestMipMapLinearFilter,\n NearestMipMapNearestFilter,\n RepeatWrapping\n} from \"../constants.js\";\n\n/**\n * @desc Parses glTF into an {@link XKTModel}, supporting ````.glb```` and textures.\n *\n * * Supports ````.glb```` and textures\n * * For a lightweight glTF JSON parser that ignores textures, see {@link parseGLTFJSONIntoXKTModel}.\n *\n * ## Usage\n *\n * In the example below we'll create an {@link XKTModel}, then load a binary glTF model into it.\n *\n * ````javascript\n * utils.loadArraybuffer(\"../assets/models/gltf/HousePlan/glTF-Binary/HousePlan.glb\", async (data) => {\n *\n * const xktModel = new XKTModel();\n *\n * parseGLTFIntoXKTModel({\n * data,\n * xktModel,\n * log: (msg) => { console.log(msg); }\n * }).then(()=>{\n * xktModel.finalize();\n * },\n * (msg) => {\n * console.error(msg);\n * });\n * });\n * ````\n *\n * @param {Object} params Parsing parameters.\n * @param {ArrayBuffer} params.data The glTF.\n * @param {String} [params.baseUri] The base URI used to load this glTF, if any. For resolving relative uris to linked resources.\n * @param {Object} [params.metaModelData] Metamodel JSON. If this is provided, then parsing is able to ensure that the XKTObjects it creates will fit the metadata properly.\n * @param {XKTModel} params.xktModel XKTModel to parse into.\n * @param {Boolean} [params.includeTextures=true] Whether to parse textures.\n * @param {Boolean} [params.includeNormals=true] Whether to parse normals. When false, the parser will ignore the glTF\n * geometry normals, and the glTF data will rely on the xeokit ````Viewer```` to automatically generate them. This has\n * the limitation that the normals will be face-aligned, and therefore the ````Viewer```` will only be able to render\n * a flat-shaded non-PBR representation of the glTF.\n * @param {Object} [params.stats] Collects statistics.\n * @param {function} [params.log] Logging callback.\n @returns {Promise} Resolves when glTF has been parsed.\n */\nfunction parseGLTFIntoXKTModel({\n data,\n baseUri,\n xktModel,\n metaModelData,\n includeTextures = true,\n includeNormals = true,\n getAttachment,\n stats = {},\n log\n }) {\n\n return new Promise(function (resolve, reject) {\n\n if (!data) {\n reject(\"Argument expected: data\");\n return;\n }\n\n if (!xktModel) {\n reject(\"Argument expected: xktModel\");\n return;\n }\n\n stats.sourceFormat = \"glTF\";\n stats.schemaVersion = \"2.0\";\n stats.title = \"\";\n stats.author = \"\";\n stats.created = \"\";\n stats.numTriangles = 0;\n stats.numVertices = 0;\n stats.numNormals = 0;\n stats.numUVs = 0;\n stats.numTextures = 0;\n stats.numObjects = 0;\n stats.numGeometries = 0;\n\n parse(data, GLTFLoader, {\n baseUri\n }).then((gltfData) => {\n\n const ctx = {\n gltfData,\n metaModelCorrections: metaModelData ? getMetaModelCorrections(metaModelData) : null,\n getAttachment: getAttachment || (() => {\n throw new Error('You must define getAttachment() method to convert glTF with external resources')\n }),\n log: (log || function (msg) {\n }),\n error: function (msg) {\n console.error(msg);\n },\n xktModel,\n includeNormals: (includeNormals !== false),\n includeTextures: (includeTextures !== false),\n geometryCreated: {},\n nextId: 0,\n stats\n };\n\n ctx.log(\"Using parser: parseGLTFIntoXKTModel\");\n ctx.log(`Parsing normals: ${ctx.includeNormals ? \"enabled\" : \"disabled\"}`);\n ctx.log(`Parsing textures: ${ctx.includeTextures ? \"enabled\" : \"disabled\"}`);\n\n if (ctx.includeTextures) {\n parseTextures(ctx);\n }\n parseMaterials(ctx);\n parseDefaultScene(ctx);\n\n resolve();\n\n }, (errMsg) => {\n reject(`[parseGLTFIntoXKTModel] ${errMsg}`);\n });\n });\n}\n\nfunction getMetaModelCorrections(metaModelData) {\n const eachRootStats = {};\n const eachChildRoot = {};\n const metaObjects = metaModelData.metaObjects || [];\n const metaObjectsMap = {};\n for (let i = 0, len = metaObjects.length; i < len; i++) {\n const metaObject = metaObjects[i];\n metaObjectsMap[metaObject.id] = metaObject;\n }\n for (let i = 0, len = metaObjects.length; i < len; i++) {\n const metaObject = metaObjects[i];\n if (metaObject.parent !== undefined && metaObject.parent !== null) {\n const metaObjectParent = metaObjectsMap[metaObject.parent];\n if (metaObject.type === metaObjectParent.type) {\n let rootMetaObject = metaObjectParent;\n while (rootMetaObject.parent && metaObjectsMap[rootMetaObject.parent].type === rootMetaObject.type) {\n rootMetaObject = metaObjectsMap[rootMetaObject.parent];\n }\n const rootStats = eachRootStats[rootMetaObject.id] || (eachRootStats[rootMetaObject.id] = {\n numChildren: 0,\n countChildren: 0\n });\n rootStats.numChildren++;\n eachChildRoot[metaObject.id] = rootMetaObject;\n } else {\n\n }\n }\n }\n return {\n metaObjectsMap,\n eachRootStats,\n eachChildRoot\n };\n}\n\nfunction parseTextures(ctx) {\n const gltfData = ctx.gltfData;\n const textures = gltfData.textures;\n if (textures) {\n for (let i = 0, len = textures.length; i < len; i++) {\n parseTexture(ctx, textures[i]);\n ctx.stats.numTextures++;\n }\n }\n}\n\nfunction parseTexture(ctx, texture) {\n if (!texture.source || !texture.source.image) {\n return;\n }\n const textureId = `texture-${ctx.nextId++}`;\n\n let minFilter = NearestMipMapLinearFilter;\n switch (texture.sampler.minFilter) {\n case 9728:\n minFilter = NearestFilter;\n break;\n case 9729:\n minFilter = LinearFilter;\n break;\n case 9984:\n minFilter = NearestMipMapNearestFilter;\n break;\n case 9985:\n minFilter = LinearMipMapNearestFilter;\n break;\n case 9986:\n minFilter = NearestMipMapLinearFilter;\n break;\n case 9987:\n minFilter = LinearMipMapLinearFilter;\n break;\n }\n\n let magFilter = LinearFilter;\n switch (texture.sampler.magFilter) {\n case 9728:\n magFilter = NearestFilter;\n break;\n case 9729:\n magFilter = LinearFilter;\n break;\n }\n\n let wrapS = RepeatWrapping;\n switch (texture.sampler.wrapS) {\n case 33071:\n wrapS = ClampToEdgeWrapping;\n break;\n case 33648:\n wrapS = MirroredRepeatWrapping;\n break;\n case 10497:\n wrapS = RepeatWrapping;\n break;\n }\n\n let wrapT = RepeatWrapping;\n switch (texture.sampler.wrapT) {\n case 33071:\n wrapT = ClampToEdgeWrapping;\n break;\n case 33648:\n wrapT = MirroredRepeatWrapping;\n break;\n case 10497:\n wrapT = RepeatWrapping;\n break;\n }\n\n let wrapR = RepeatWrapping;\n switch (texture.sampler.wrapR) {\n case 33071:\n wrapR = ClampToEdgeWrapping;\n break;\n case 33648:\n wrapR = MirroredRepeatWrapping;\n break;\n case 10497:\n wrapR = RepeatWrapping;\n break;\n }\n\n ctx.xktModel.createTexture({\n textureId: textureId,\n imageData: texture.source.image,\n mediaType: texture.source.mediaType,\n compressed: true,\n width: texture.source.image.width,\n height: texture.source.image.height,\n minFilter,\n magFilter,\n wrapS,\n wrapT,\n wrapR,\n flipY: !!texture.flipY,\n // encoding: \"sRGB\"\n });\n texture._textureId = textureId;\n}\n\nfunction parseMaterials(ctx) {\n const gltfData = ctx.gltfData;\n const materials = gltfData.materials;\n if (materials) {\n for (let i = 0, len = materials.length; i < len; i++) {\n const material = materials[i];\n material._textureSetId = ctx.includeTextures ? parseTextureSet(ctx, material) : null;\n material._attributes = parseMaterialAttributes(ctx, material);\n }\n }\n}\n\nfunction parseTextureSet(ctx, material) {\n const textureSetCfg = {};\n if (material.normalTexture) {\n textureSetCfg.normalTextureId = material.normalTexture.texture._textureId;\n }\n if (material.occlusionTexture) {\n textureSetCfg.occlusionTextureId = material.occlusionTexture.texture._textureId;\n }\n if (material.emissiveTexture) {\n textureSetCfg.emissiveTextureId = material.emissiveTexture.texture._textureId;\n }\n // const alphaMode = material.alphaMode;\n // switch (alphaMode) {\n // case \"NORMAL_OPAQUE\":\n // materialCfg.alphaMode = \"opaque\";\n // break;\n // case \"MASK\":\n // materialCfg.alphaMode = \"mask\";\n // break;\n // case \"BLEND\":\n // materialCfg.alphaMode = \"blend\";\n // break;\n // default:\n // }\n // const alphaCutoff = material.alphaCutoff;\n // if (alphaCutoff !== undefined) {\n // materialCfg.alphaCutoff = alphaCutoff;\n // }\n const metallicPBR = material.pbrMetallicRoughness;\n if (material.pbrMetallicRoughness) {\n const pbrMetallicRoughness = material.pbrMetallicRoughness;\n const baseColorTexture = pbrMetallicRoughness.baseColorTexture || pbrMetallicRoughness.colorTexture;\n if (baseColorTexture) {\n if (baseColorTexture.texture) {\n textureSetCfg.colorTextureId = baseColorTexture.texture._textureId;\n } else {\n textureSetCfg.colorTextureId = ctx.gltfData.textures[baseColorTexture.index]._textureId;\n }\n }\n if (metallicPBR.metallicRoughnessTexture) {\n textureSetCfg.metallicRoughnessTextureId = metallicPBR.metallicRoughnessTexture.texture._textureId;\n }\n }\n const extensions = material.extensions;\n if (extensions) {\n const specularPBR = extensions[\"KHR_materials_pbrSpecularGlossiness\"];\n if (specularPBR) {\n const specularTexture = specularPBR.specularTexture;\n if (specularTexture !== null && specularTexture !== undefined) {\n // textureSetCfg.colorTextureId = ctx.gltfData.textures[specularColorTexture.index]._textureId;\n }\n const specularColorTexture = specularPBR.specularColorTexture;\n if (specularColorTexture !== null && specularColorTexture !== undefined) {\n textureSetCfg.colorTextureId = ctx.gltfData.textures[specularColorTexture.index]._textureId;\n }\n }\n }\n if (textureSetCfg.normalTextureId !== undefined ||\n textureSetCfg.occlusionTextureId !== undefined ||\n textureSetCfg.emissiveTextureId !== undefined ||\n textureSetCfg.colorTextureId !== undefined ||\n textureSetCfg.metallicRoughnessTextureId !== undefined) {\n textureSetCfg.textureSetId = `textureSet-${ctx.nextId++};`\n ctx.xktModel.createTextureSet(textureSetCfg);\n ctx.stats.numTextureSets++;\n return textureSetCfg.textureSetId;\n }\n return null;\n}\n\nfunction parseMaterialAttributes(ctx, material) { // Substitute RGBA for material, to use fast flat shading instead\n const extensions = material.extensions;\n const materialAttributes = {\n color: new Float32Array([1, 1, 1, 1]),\n opacity: 1,\n metallic: 0,\n roughness: 1\n };\n if (extensions) {\n const specularPBR = extensions[\"KHR_materials_pbrSpecularGlossiness\"];\n if (specularPBR) {\n const diffuseFactor = specularPBR.diffuseFactor;\n if (diffuseFactor !== null && diffuseFactor !== undefined) {\n materialAttributes.color.set(diffuseFactor);\n }\n }\n const common = extensions[\"KHR_materials_common\"];\n if (common) {\n const technique = common.technique;\n const values = common.values || {};\n const blinn = technique === \"BLINN\";\n const phong = technique === \"PHONG\";\n const lambert = technique === \"LAMBERT\";\n const diffuse = values.diffuse;\n if (diffuse && (blinn || phong || lambert)) {\n if (!utils.isString(diffuse)) {\n materialAttributes.color.set(diffuse);\n }\n }\n const transparency = values.transparency;\n if (transparency !== null && transparency !== undefined) {\n materialAttributes.opacity = transparency;\n }\n const transparent = values.transparent;\n if (transparent !== null && transparent !== undefined) {\n materialAttributes.opacity = transparent;\n }\n }\n }\n const metallicPBR = material.pbrMetallicRoughness;\n if (metallicPBR) {\n const baseColorFactor = metallicPBR.baseColorFactor;\n if (baseColorFactor) {\n materialAttributes.color[0] = baseColorFactor[0];\n materialAttributes.color[1] = baseColorFactor[1];\n materialAttributes.color[2] = baseColorFactor[2];\n materialAttributes.opacity = baseColorFactor[3];\n }\n const metallicFactor = metallicPBR.metallicFactor;\n if (metallicFactor !== null && metallicFactor !== undefined) {\n materialAttributes.metallic = metallicFactor;\n }\n const roughnessFactor = metallicPBR.roughnessFactor;\n if (roughnessFactor !== null && roughnessFactor !== undefined) {\n materialAttributes.roughness = roughnessFactor;\n }\n }\n return materialAttributes;\n}\n\nfunction parseDefaultScene(ctx) {\n const gltfData = ctx.gltfData;\n const scene = gltfData.scene || gltfData.scenes[0];\n if (!scene) {\n ctx.error(\"glTF has no default scene\");\n return;\n }\n parseScene(ctx, scene);\n}\n\nfunction parseScene(ctx, scene) {\n const nodes = scene.nodes;\n if (!nodes) {\n return;\n }\n for (let i = 0, len = nodes.length; i < len; i++) {\n const node = nodes[i];\n countMeshUsage(ctx, node);\n }\n for (let i = 0, len = nodes.length; i < len; i++) {\n const node = nodes[i];\n parseNode(ctx, node, 0, null);\n }\n}\n\nfunction countMeshUsage(ctx, node) {\n const mesh = node.mesh;\n if (mesh) {\n mesh.instances = mesh.instances ? mesh.instances + 1 : 1;\n }\n if (node.children) {\n const children = node.children;\n for (let i = 0, len = children.length; i < len; i++) {\n const childNode = children[i];\n if (!childNode) {\n ctx.error(\"Node not found: \" + i);\n continue;\n }\n countMeshUsage(ctx, childNode);\n }\n }\n}\n\nconst deferredMeshIds = [];\n\nfunction parseNode(ctx, node, depth, matrix) {\n\n const xktModel = ctx.xktModel;\n\n // Pre-order visit scene node\n\n let localMatrix;\n if (node.matrix) {\n localMatrix = node.matrix;\n if (matrix) {\n matrix = math.mulMat4(matrix, localMatrix, math.mat4());\n } else {\n matrix = localMatrix;\n }\n }\n if (node.translation) {\n localMatrix = math.translationMat4v(node.translation);\n if (matrix) {\n matrix = math.mulMat4(matrix, localMatrix, math.mat4());\n } else {\n matrix = localMatrix;\n }\n }\n if (node.rotation) {\n localMatrix = math.quaternionToMat4(node.rotation);\n if (matrix) {\n matrix = math.mulMat4(matrix, localMatrix, math.mat4());\n } else {\n matrix = localMatrix;\n }\n }\n if (node.scale) {\n localMatrix = math.scalingMat4v(node.scale);\n if (matrix) {\n matrix = math.mulMat4(matrix, localMatrix, math.mat4());\n } else {\n matrix = localMatrix;\n }\n }\n\n if (node.mesh) {\n\n const mesh = node.mesh;\n const numPrimitives = mesh.primitives.length;\n\n if (numPrimitives > 0) {\n for (let i = 0; i < numPrimitives; i++) {\n const primitive = mesh.primitives[i];\n if (!primitive._xktGeometryId) {\n const xktGeometryId = \"geometry-\" + ctx.nextId++;\n const geometryCfg = {\n geometryId: xktGeometryId\n };\n switch (primitive.mode) {\n case 0: // POINTS\n geometryCfg.primitiveType = \"points\";\n break;\n case 1: // LINES\n geometryCfg.primitiveType = \"lines\";\n break;\n case 2: // LINE_LOOP\n geometryCfg.primitiveType = \"line-loop\";\n break;\n case 3: // LINE_STRIP\n geometryCfg.primitiveType = \"line-strip\";\n break;\n case 4: // TRIANGLES\n geometryCfg.primitiveType = \"triangles\";\n break;\n case 5: // TRIANGLE_STRIP\n geometryCfg.primitiveType = \"triangle-strip\";\n break;\n case 6: // TRIANGLE_FAN\n geometryCfg.primitiveType = \"triangle-fan\";\n break;\n default:\n geometryCfg.primitiveType = \"triangles\";\n }\n const POSITION = primitive.attributes.POSITION;\n if (!POSITION) {\n continue;\n }\n geometryCfg.positions = primitive.attributes.POSITION.value;\n ctx.stats.numVertices += geometryCfg.positions.length / 3;\n if (ctx.includeNormals) {\n if (primitive.attributes.NORMAL) {\n geometryCfg.normals = primitive.attributes.NORMAL.value;\n ctx.stats.numNormals += geometryCfg.normals.length / 3;\n }\n }\n if (primitive.attributes.COLOR_0) {\n geometryCfg.colorsCompressed = primitive.attributes.COLOR_0.value;\n }\n if (ctx.includeTextures) {\n if (primitive.attributes.TEXCOORD_0) {\n geometryCfg.uvs = primitive.attributes.TEXCOORD_0.value;\n ctx.stats.numUVs += geometryCfg.uvs.length / 2;\n }\n }\n if (primitive.indices) {\n geometryCfg.indices = primitive.indices.value;\n if (primitive.mode === 4) {\n ctx.stats.numTriangles += geometryCfg.indices.length / 3;\n }\n }\n xktModel.createGeometry(geometryCfg);\n primitive._xktGeometryId = xktGeometryId;\n ctx.stats.numGeometries++;\n }\n\n const xktMeshId = ctx.nextId++;\n const meshCfg = {\n meshId: xktMeshId,\n geometryId: primitive._xktGeometryId,\n matrix: matrix ? matrix.slice() : math.identityMat4()\n };\n const material = primitive.material;\n if (material) {\n meshCfg.textureSetId = material._textureSetId;\n meshCfg.color = material._attributes.color;\n meshCfg.opacity = material._attributes.opacity;\n meshCfg.metallic = material._attributes.metallic;\n meshCfg.roughness = material._attributes.roughness;\n } else {\n meshCfg.color = [1.0, 1.0, 1.0];\n meshCfg.opacity = 1.0;\n }\n xktModel.createMesh(meshCfg);\n deferredMeshIds.push(xktMeshId);\n }\n }\n }\n\n // Visit child scene nodes\n\n if (node.children) {\n const children = node.children;\n for (let i = 0, len = children.length; i < len; i++) {\n const childNode = children[i];\n parseNode(ctx, childNode, depth + 1, matrix);\n }\n }\n\n // Post-order visit scene node\n\n const nodeName = node.name;\n if (((nodeName !== undefined && nodeName !== null) || depth === 0) && deferredMeshIds.length > 0) {\n if (nodeName === undefined || nodeName === null) {\n ctx.log(`Warning: 'name' properties not found on glTF scene nodes - will randomly-generate object IDs in XKT`);\n }\n let xktEntityId = nodeName; // Fall back on generated ID when `name` not found on glTF scene node(s)\n if (!!xktEntityId && xktModel.entities[xktEntityId]) {\n ctx.log(`Warning: Two or more glTF nodes found with same 'name' attribute: '${nodeName} - will randomly-generating an object ID in XKT`);\n }\n while (!xktEntityId || xktModel.entities[xktEntityId]) {\n xktEntityId = \"entity-\" + ctx.nextId++;\n }\n if (ctx.metaModelCorrections) {\n // Merging meshes into XKTObjects that map to metaobjects\n const rootMetaObject = ctx.metaModelCorrections.eachChildRoot[xktEntityId];\n if (rootMetaObject) {\n const rootMetaObjectStats = ctx.metaModelCorrections.eachRootStats[rootMetaObject.id];\n rootMetaObjectStats.countChildren++;\n if (rootMetaObjectStats.countChildren >= rootMetaObjectStats.numChildren) {\n xktModel.createEntity({\n entityId: rootMetaObject.id,\n meshIds: deferredMeshIds\n });\n ctx.stats.numObjects++;\n deferredMeshIds.length = 0;\n }\n } else {\n const metaObject = ctx.metaModelCorrections.metaObjectsMap[xktEntityId];\n if (metaObject) {\n xktModel.createEntity({\n entityId: xktEntityId,\n meshIds: deferredMeshIds\n });\n ctx.stats.numObjects++;\n deferredMeshIds.length = 0;\n }\n }\n } else {\n // Create an XKTObject from the meshes at each named glTF node, don't care about metaobjects\n xktModel.createEntity({\n entityId: xktEntityId,\n meshIds: deferredMeshIds\n });\n ctx.stats.numObjects++;\n deferredMeshIds.length = 0;\n }\n }\n}\n\nexport {parseGLTFIntoXKTModel};\n","import {utils} from \"../XKTModel/lib/utils.js\";\nimport {math} from \"../lib/math.js\";\n\nconst atob2 = (typeof atob !== 'undefined') ? atob : a => Buffer.from(a, 'base64').toString('binary');\n\nconst WEBGL_COMPONENT_TYPES = {\n 5120: Int8Array,\n 5121: Uint8Array,\n 5122: Int16Array,\n 5123: Uint16Array,\n 5125: Uint32Array,\n 5126: Float32Array\n};\n\nconst WEBGL_TYPE_SIZES = {\n 'SCALAR': 1,\n 'VEC2': 2,\n 'VEC3': 3,\n 'VEC4': 4,\n 'MAT2': 4,\n 'MAT3': 9,\n 'MAT4': 16\n};\n\n/**\n * @desc Parses glTF JSON into an {@link XKTModel}, without ````.glb```` and textures.\n *\n * * Lightweight JSON-based glTF parser which ignores textures\n * * For texture and ````.glb```` support, see {@link parseGLTFIntoXKTModel}\n *\n * ## Usage\n *\n * In the example below we'll create an {@link XKTModel}, then load a glTF model into it.\n *\n * ````javascript\n * utils.loadJSON(\"./models/gltf/duplex/scene.gltf\", async (data) => {\n *\n * const xktModel = new XKTModel();\n *\n * parseGLTFJSONIntoXKTModel({\n * data,\n * xktModel,\n * log: (msg) => { console.log(msg); }\n * }).then(()=>{\n * xktModel.finalize();\n * },\n * (msg) => {\n * console.error(msg);\n * });\n * });\n * ````\n *\n * @param {Object} params Parsing parameters.\n * @param {Object} params.data The glTF JSON.\n * @param {Object} [params.metaModelData] Metamodel JSON. If this is provided, then parsing is able to ensure that the XKTObjects it creates will fit the metadata properly.\n * @param {XKTModel} params.xktModel XKTModel to parse into.\n * @param {Boolean} [params.includeNormals=false] Whether to parse normals. When false, the parser will ignore the glTF\n * geometry normals, and the glTF data will rely on the xeokit ````Viewer```` to automatically generate them. This has\n * the limitation that the normals will be face-aligned, and therefore the ````Viewer```` will only be able to render\n * a flat-shaded representation of the glTF.\n * @param {Boolean} [params.reuseGeometries=true] When true, the parser will enable geometry reuse within the XKTModel. When false,\n * will automatically \"expand\" all reused geometries into duplicate copies. This has the drawback of increasing the XKT\n * file size (~10-30% for typical models), but can make the model more responsive in the xeokit Viewer, especially if the model\n * has excessive geometry reuse. An example of excessive geometry reuse would be if we have 4000 geometries that are\n * shared amongst 2000 objects, ie. a large number of geometries with a low amount of reuse, which can present a\n * pathological performance case for xeokit's underlying graphics APIs (WebGL, WebGPU etc).\n * @param {function} [params.getAttachment] Callback through which to fetch attachments, if the glTF has them.\n * @param {Object} [params.stats] Collects statistics.\n * @param {function} [params.log] Logging callback.\n * @returns {Promise}\n */\nfunction parseGLTFJSONIntoXKTModel({\n data,\n xktModel,\n metaModelData,\n includeNormals,\n reuseGeometries,\n getAttachment,\n stats = {},\n log\n }) {\n\n if (log) {\n log(\"Using parser: parseGLTFJSONIntoXKTModel\");\n }\n\n return new Promise(function (resolve, reject) {\n\n if (!data) {\n reject(\"Argument expected: data\");\n return;\n }\n\n if (!xktModel) {\n reject(\"Argument expected: xktModel\");\n return;\n }\n\n stats.sourceFormat = \"glTF\";\n stats.schemaVersion = \"2.0\";\n stats.title = \"\";\n stats.author = \"\";\n stats.created = \"\";\n stats.numTriangles = 0;\n stats.numVertices = 0;\n stats.numNormals = 0;\n stats.numObjects = 0;\n stats.numGeometries = 0;\n\n const ctx = {\n gltf: data,\n metaModelCorrections: metaModelData ? getMetaModelCorrections(metaModelData) : null,\n getAttachment: getAttachment || (() => {\n throw new Error('You must define getAttachment() method to convert glTF with external resources')\n }),\n log: (log || function (msg) {\n }),\n xktModel,\n includeNormals,\n createXKTGeometryIds: {},\n nextMeshId: 0,\n reuseGeometries: (reuseGeometries !== false),\n stats\n };\n\n ctx.log(`Parsing normals: ${ctx.includeNormals ? \"enabled\" : \"disabled\"}`);\n\n parseBuffers(ctx).then(() => {\n\n parseBufferViews(ctx);\n freeBuffers(ctx);\n parseMaterials(ctx);\n parseDefaultScene(ctx);\n\n resolve();\n\n }, (errMsg) => {\n reject(errMsg);\n });\n });\n}\n\nfunction getMetaModelCorrections(metaModelData) {\n const eachRootStats = {};\n const eachChildRoot = {};\n const metaObjects = metaModelData.metaObjects || [];\n const metaObjectsMap = {};\n for (let i = 0, len = metaObjects.length; i < len; i++) {\n const metaObject = metaObjects[i];\n metaObjectsMap[metaObject.id] = metaObject;\n }\n for (let i = 0, len = metaObjects.length; i < len; i++) {\n const metaObject = metaObjects[i];\n if (metaObject.parent !== undefined && metaObject.parent !== null) {\n const metaObjectParent = metaObjectsMap[metaObject.parent];\n if (metaObject.type === metaObjectParent.type) {\n let rootMetaObject = metaObjectParent;\n while (rootMetaObject.parent && metaObjectsMap[rootMetaObject.parent].type === rootMetaObject.type) {\n rootMetaObject = metaObjectsMap[rootMetaObject.parent];\n }\n const rootStats = eachRootStats[rootMetaObject.id] || (eachRootStats[rootMetaObject.id] = {\n numChildren: 0,\n countChildren: 0\n });\n rootStats.numChildren++;\n eachChildRoot[metaObject.id] = rootMetaObject;\n } else {\n\n }\n }\n }\n const metaModelCorrections = {\n metaObjectsMap,\n eachRootStats,\n eachChildRoot\n };\n return metaModelCorrections;\n}\n\nfunction parseBuffers(ctx) { // Parses geometry buffers into temporary \"_buffer\" Unit8Array properties on the glTF \"buffer\" elements\n const buffers = ctx.gltf.buffers;\n if (buffers) {\n return Promise.all(buffers.map(buffer => parseBuffer(ctx, buffer)));\n } else {\n return new Promise(function (resolve, reject) {\n resolve();\n });\n }\n}\n\nfunction parseBuffer(ctx, bufferInfo) {\n return new Promise(function (resolve, reject) {\n // Allow a shortcut where the glTF buffer is \"enrichened\" with direct\n // access to the data-arrayBuffer, w/out needing to either:\n // - read the file indicated by the \".uri\" component of the buffer\n // - base64-decode the encoded data in the \".uri\" component\n if (bufferInfo._arrayBuffer) {\n bufferInfo._buffer = bufferInfo._arrayBuffer;\n resolve(bufferInfo);\n return;\n }\n // Otherwise, proceed with \"standard-glTF\" .uri component.\n const uri = bufferInfo.uri;\n if (!uri) {\n reject('gltf/handleBuffer missing uri in ' + JSON.stringify(bufferInfo));\n return;\n }\n parseArrayBuffer(ctx, uri).then((arrayBuffer) => {\n bufferInfo._buffer = arrayBuffer;\n resolve(arrayBuffer);\n }, (errMsg) => {\n reject(errMsg);\n })\n });\n}\n\nfunction parseArrayBuffer(ctx, uri) {\n return new Promise(function (resolve, reject) {\n const dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/; // Check for data: URI\n const dataUriRegexResult = uri.match(dataUriRegex);\n if (dataUriRegexResult) { // Safari can't handle data URIs through XMLHttpRequest\n const isBase64 = !!dataUriRegexResult[2];\n let data = dataUriRegexResult[3];\n data = decodeURIComponent(data);\n if (isBase64) {\n data = atob2(data);\n }\n const buffer = new ArrayBuffer(data.length);\n const view = new Uint8Array(buffer);\n for (let i = 0; i < data.length; i++) {\n view[i] = data.charCodeAt(i);\n }\n resolve(buffer);\n } else { // Uri is a path to a file\n ctx.getAttachment(uri).then(\n (arrayBuffer) => {\n resolve(arrayBuffer);\n },\n (errMsg) => {\n reject(errMsg);\n });\n }\n });\n}\n\nfunction parseBufferViews(ctx) { // Parses our temporary \"_buffer\" properties into \"_buffer\" properties on glTF \"bufferView\" elements\n const bufferViewsInfo = ctx.gltf.bufferViews;\n if (bufferViewsInfo) {\n for (let i = 0, len = bufferViewsInfo.length; i < len; i++) {\n parseBufferView(ctx, bufferViewsInfo[i]);\n }\n }\n}\n\nfunction parseBufferView(ctx, bufferViewInfo) {\n const buffer = ctx.gltf.buffers[bufferViewInfo.buffer];\n bufferViewInfo._typedArray = null;\n const byteLength = bufferViewInfo.byteLength || 0;\n const byteOffset = bufferViewInfo.byteOffset || 0;\n bufferViewInfo._buffer = buffer._buffer.slice(byteOffset, byteOffset + byteLength);\n}\n\nfunction freeBuffers(ctx) { // Deletes the \"_buffer\" properties from the glTF \"buffer\" elements, to save memory\n const buffers = ctx.gltf.buffers;\n if (buffers) {\n for (let i = 0, len = buffers.length; i < len; i++) {\n buffers[i]._buffer = null;\n }\n }\n}\n\nfunction parseMaterials(ctx) {\n const materialsInfo = ctx.gltf.materials;\n if (materialsInfo) {\n for (let i = 0, len = materialsInfo.length; i < len; i++) {\n const materialInfo = materialsInfo[i];\n const material = parseMaterial(ctx, materialInfo);\n materialInfo._materialData = material;\n }\n }\n}\n\nfunction parseMaterial(ctx, materialInfo) { // Attempts to extract an RGBA color for a glTF material\n const material = {\n color: new Float32Array([1, 1, 1]),\n opacity: 1.0,\n metallic: 0,\n roughness: 1\n };\n const extensions = materialInfo.extensions;\n if (extensions) {\n const specularPBR = extensions[\"KHR_materials_pbrSpecularGlossiness\"];\n if (specularPBR) {\n const diffuseFactor = specularPBR.diffuseFactor;\n if (diffuseFactor !== null && diffuseFactor !== undefined) {\n material.color[0] = diffuseFactor[0];\n material.color[1] = diffuseFactor[1];\n material.color[2] = diffuseFactor[2];\n }\n }\n const common = extensions[\"KHR_materials_common\"];\n if (common) {\n const technique = common.technique;\n const values = common.values || {};\n const blinn = technique === \"BLINN\";\n const phong = technique === \"PHONG\";\n const lambert = technique === \"LAMBERT\";\n const diffuse = values.diffuse;\n if (diffuse && (blinn || phong || lambert)) {\n if (!utils.isString(diffuse)) {\n material.color[0] = diffuse[0];\n material.color[1] = diffuse[1];\n material.color[2] = diffuse[2];\n }\n }\n const transparency = values.transparency;\n if (transparency !== null && transparency !== undefined) {\n material.opacity = transparency;\n }\n const transparent = values.transparent;\n if (transparent !== null && transparent !== undefined) {\n material.opacity = transparent;\n }\n }\n }\n const metallicPBR = materialInfo.pbrMetallicRoughness;\n if (metallicPBR) {\n const baseColorFactor = metallicPBR.baseColorFactor;\n if (baseColorFactor) {\n material.color[0] = baseColorFactor[0];\n material.color[1] = baseColorFactor[1];\n material.color[2] = baseColorFactor[2];\n material.opacity = baseColorFactor[3];\n }\n const metallicFactor = metallicPBR.metallicFactor;\n if (metallicFactor !== null && metallicFactor !== undefined) {\n material.metallic = metallicFactor;\n }\n const roughnessFactor = metallicPBR.roughnessFactor;\n if (roughnessFactor !== null && roughnessFactor !== undefined) {\n material.roughness = roughnessFactor;\n }\n }\n return material;\n}\n\nfunction parseDefaultScene(ctx) {\n const scene = ctx.gltf.scene || 0;\n const defaultSceneInfo = ctx.gltf.scenes[scene];\n if (!defaultSceneInfo) {\n throw new Error(\"glTF has no default scene\");\n }\n parseScene(ctx, defaultSceneInfo);\n}\n\n\nfunction parseScene(ctx, sceneInfo) {\n const nodes = sceneInfo.nodes;\n if (!nodes) {\n return;\n }\n for (let i = 0, len = nodes.length; i < len; i++) {\n const glTFNode = ctx.gltf.nodes[nodes[i]];\n if (glTFNode) {\n parseNode(ctx, glTFNode, 0, null);\n }\n }\n}\n\nlet deferredMeshIds = [];\n\nfunction parseNode(ctx, glTFNode, depth, matrix) {\n\n const gltf = ctx.gltf;\n const xktModel = ctx.xktModel;\n\n let localMatrix;\n\n if (glTFNode.matrix) {\n localMatrix = glTFNode.matrix;\n if (matrix) {\n matrix = math.mulMat4(matrix, localMatrix, math.mat4());\n } else {\n matrix = localMatrix;\n }\n }\n\n if (glTFNode.translation) {\n localMatrix = math.translationMat4v(glTFNode.translation);\n if (matrix) {\n matrix = math.mulMat4(matrix, localMatrix, localMatrix);\n } else {\n matrix = localMatrix;\n }\n }\n\n if (glTFNode.rotation) {\n localMatrix = math.quaternionToMat4(glTFNode.rotation);\n if (matrix) {\n matrix = math.mulMat4(matrix, localMatrix, localMatrix);\n } else {\n matrix = localMatrix;\n }\n }\n\n if (glTFNode.scale) {\n localMatrix = math.scalingMat4v(glTFNode.scale);\n if (matrix) {\n matrix = math.mulMat4(matrix, localMatrix, localMatrix);\n } else {\n matrix = localMatrix;\n }\n }\n\n const gltfMeshId = glTFNode.mesh;\n\n if (gltfMeshId !== undefined) {\n\n const meshInfo = gltf.meshes[gltfMeshId];\n\n if (meshInfo) {\n\n const numPrimitivesInMesh = meshInfo.primitives.length;\n\n if (numPrimitivesInMesh > 0) {\n\n for (let i = 0; i < numPrimitivesInMesh; i++) {\n\n const primitiveInfo = meshInfo.primitives[i];\n\n const geometryHash = createPrimitiveGeometryHash(primitiveInfo);\n\n let xktGeometryId = ctx.createXKTGeometryIds[geometryHash];\n\n if ((!ctx.reuseGeometries) || !xktGeometryId) {\n\n xktGeometryId = \"geometry-\" + ctx.nextMeshId++\n\n const geometryArrays = {};\n\n parsePrimitiveGeometry(ctx, primitiveInfo, geometryArrays);\n\n const colors = geometryArrays.colors;\n\n let colorsCompressed;\n\n if (geometryArrays.colors) {\n colorsCompressed = [];\n for (let j = 0, lenj = colors.length; j < lenj; j += 4) {\n colorsCompressed.push(colors[j + 0]);\n colorsCompressed.push(colors[j + 1]);\n colorsCompressed.push(colors[j + 2]);\n colorsCompressed.push(255);\n }\n }\n\n xktModel.createGeometry({\n geometryId: xktGeometryId,\n primitiveType: geometryArrays.primitive,\n positions: geometryArrays.positions,\n normals: ctx.includeNormals ? geometryArrays.normals : null,\n colorsCompressed: colorsCompressed,\n indices: geometryArrays.indices\n });\n\n ctx.stats.numGeometries++;\n ctx.stats.numVertices += geometryArrays.positions ? geometryArrays.positions.length / 3 : 0;\n ctx.stats.numNormals += (ctx.includeNormals && geometryArrays.normals) ? geometryArrays.normals.length / 3 : 0;\n ctx.stats.numTriangles += geometryArrays.indices ? geometryArrays.indices.length / 3 : 0;\n\n ctx.createXKTGeometryIds[geometryHash] = xktGeometryId;\n } else {\n// Geometry reused\n }\n\n const materialIndex = primitiveInfo.material;\n const materialInfo = (materialIndex !== null && materialIndex !== undefined) ? gltf.materials[materialIndex] : null;\n const color = materialInfo ? materialInfo._materialData.color : new Float32Array([1.0, 1.0, 1.0, 1.0]);\n const opacity = materialInfo ? materialInfo._materialData.opacity : 1.0;\n const metallic = materialInfo ? materialInfo._materialData.metallic : 0.0;\n const roughness = materialInfo ? materialInfo._materialData.roughness : 1.0;\n\n const xktMeshId = \"mesh-\" + ctx.nextMeshId++;\n\n xktModel.createMesh({\n meshId: xktMeshId,\n geometryId: xktGeometryId,\n matrix: matrix ? matrix.slice() : math.identityMat4(),\n color: color,\n opacity: opacity,\n metallic: metallic,\n roughness: roughness\n });\n\n deferredMeshIds.push(xktMeshId);\n }\n }\n }\n }\n\n\n if (glTFNode.children) {\n const children = glTFNode.children;\n for (let i = 0, len = children.length; i < len; i++) {\n const childNodeIdx = children[i];\n const childGLTFNode = gltf.nodes[childNodeIdx];\n if (!childGLTFNode) {\n console.warn('Node not found: ' + i);\n continue;\n }\n parseNode(ctx, childGLTFNode, depth + 1, matrix);\n }\n }\n\n // Post-order visit scene node\n\n const nodeName = glTFNode.name;\n if (((nodeName !== undefined && nodeName !== null) || depth === 0) && deferredMeshIds.length > 0) {\n if (nodeName === undefined || nodeName === null) {\n ctx.log(`[parseGLTFJSONIntoXKTModel] Warning: 'name' properties not found on glTF scene nodes - will randomly-generate object IDs in XKT`);\n }\n let xktEntityId = nodeName; // Fall back on generated ID when `name` not found on glTF scene node(s)\n if (xktEntityId === undefined || xktEntityId === null) {\n if (xktModel.entities[xktEntityId]) {\n ctx.error(\"Two or more glTF nodes found with same 'name' attribute: '\" + nodeName + \"'\");\n }\n while (!xktEntityId || xktModel.entities[xktEntityId]) {\n xktEntityId = \"entity-\" + ctx.nextId++;\n }\n }\n if (ctx.metaModelCorrections) { // Merging meshes into XKTObjects that map to metaobjects\n const rootMetaObject = ctx.metaModelCorrections.eachChildRoot[xktEntityId];\n if (rootMetaObject) {\n const rootMetaObjectStats = ctx.metaModelCorrections.eachRootStats[rootMetaObject.id];\n rootMetaObjectStats.countChildren++;\n if (rootMetaObjectStats.countChildren >= rootMetaObjectStats.numChildren) {\n xktModel.createEntity({\n entityId: rootMetaObject.id,\n meshIds: deferredMeshIds\n });\n ctx.stats.numObjects++;\n deferredMeshIds = [];\n }\n } else {\n const metaObject = ctx.metaModelCorrections.metaObjectsMap[xktEntityId];\n if (metaObject) {\n xktModel.createEntity({\n entityId: xktEntityId,\n meshIds: deferredMeshIds\n });\n ctx.stats.numObjects++;\n deferredMeshIds = [];\n }\n }\n } else { // Create an XKTObject from the meshes at each named glTF node, don't care about metaobjects\n xktModel.createEntity({\n entityId: xktEntityId,\n meshIds: deferredMeshIds\n });\n ctx.stats.numObjects++;\n deferredMeshIds = [];\n }\n }\n}\n\nfunction createPrimitiveGeometryHash(primitiveInfo) {\n const attributes = primitiveInfo.attributes;\n if (!attributes) {\n return \"empty\";\n }\n const mode = primitiveInfo.mode;\n const material = primitiveInfo.material;\n const indices = primitiveInfo.indices;\n const positions = primitiveInfo.attributes.POSITION;\n const normals = primitiveInfo.attributes.NORMAL;\n const colors = primitiveInfo.attributes.COLOR_0;\n const uv = primitiveInfo.attributes.TEXCOORD_0;\n return [\n mode,\n // material,\n (indices !== null && indices !== undefined) ? indices : \"-\",\n (positions !== null && positions !== undefined) ? positions : \"-\",\n (normals !== null && normals !== undefined) ? normals : \"-\",\n (colors !== null && colors !== undefined) ? colors : \"-\",\n (uv !== null && uv !== undefined) ? uv : \"-\"\n ].join(\";\");\n}\n\nfunction parsePrimitiveGeometry(ctx, primitiveInfo, geometryArrays) {\n const attributes = primitiveInfo.attributes;\n if (!attributes) {\n return;\n }\n switch (primitiveInfo.mode) {\n case 0: // POINTS\n geometryArrays.primitive = \"points\";\n break;\n case 1: // LINES\n geometryArrays.primitive = \"lines\";\n break;\n case 2: // LINE_LOOP\n // TODO: convert\n geometryArrays.primitive = \"lines\";\n break;\n case 3: // LINE_STRIP\n // TODO: convert\n geometryArrays.primitive = \"lines\";\n break;\n case 4: // TRIANGLES\n geometryArrays.primitive = \"triangles\";\n break;\n case 5: // TRIANGLE_STRIP\n // TODO: convert\n console.log(\"TRIANGLE_STRIP\");\n geometryArrays.primitive = \"triangles\";\n break;\n case 6: // TRIANGLE_FAN\n // TODO: convert\n console.log(\"TRIANGLE_FAN\");\n geometryArrays.primitive = \"triangles\";\n break;\n default:\n geometryArrays.primitive = \"triangles\";\n }\n const accessors = ctx.gltf.accessors;\n const indicesIndex = primitiveInfo.indices;\n if (indicesIndex !== null && indicesIndex !== undefined) {\n const accessorInfo = accessors[indicesIndex];\n geometryArrays.indices = parseAccessorTypedArray(ctx, accessorInfo);\n }\n const positionsIndex = attributes.POSITION;\n if (positionsIndex !== null && positionsIndex !== undefined) {\n const accessorInfo = accessors[positionsIndex];\n geometryArrays.positions = parseAccessorTypedArray(ctx, accessorInfo);\n }\n const normalsIndex = attributes.NORMAL;\n if (normalsIndex !== null && normalsIndex !== undefined) {\n const accessorInfo = accessors[normalsIndex];\n geometryArrays.normals = parseAccessorTypedArray(ctx, accessorInfo);\n }\n const colorsIndex = attributes.COLOR_0;\n if (colorsIndex !== null && colorsIndex !== undefined) {\n const accessorInfo = accessors[colorsIndex];\n geometryArrays.colors = parseAccessorTypedArray(ctx, accessorInfo);\n }\n}\n\nfunction parseAccessorTypedArray(ctx, accessorInfo) {\n const bufferView = ctx.gltf.bufferViews[accessorInfo.bufferView];\n const itemSize = WEBGL_TYPE_SIZES[accessorInfo.type];\n const TypedArray = WEBGL_COMPONENT_TYPES[accessorInfo.componentType];\n const elementBytes = TypedArray.BYTES_PER_ELEMENT; // For VEC3: itemSize is 3, elementBytes is 4, itemBytes is 12.\n const itemBytes = elementBytes * itemSize;\n if (accessorInfo.byteStride && accessorInfo.byteStride !== itemBytes) { // The buffer is not interleaved if the stride is the item size in bytes.\n throw new Error(\"interleaved buffer!\"); // TODO\n } else {\n return new TypedArray(bufferView._buffer, accessorInfo.byteOffset || 0, accessorInfo.count * itemSize);\n }\n}\n\nexport {parseGLTFJSONIntoXKTModel};\n","/**\n * @desc Parses IFC STEP file data into an {@link XKTModel}.\n *\n * This function uses [web-ifc](https://github.com/tomvandig/web-ifc) to parse the IFC, which relies on a\n * WASM file to do the parsing.\n *\n * Depending on how we use this function, we may need to provide it with a path to the directory where that WASM file is stored.\n *\n * This function is tested with web-ifc version 0.0.34.\n *\n * ## Usage\n *\n * In the example below we'll create an {@link XKTModel}, then load an IFC model into it.\n *\n * ````javascript\n * import {XKTModel, parseIFCIntoXKTModel, writeXKTModelToArrayBuffer} from \"xeokit-convert.es.js\";\n *\n * import * as WebIFC from \"web-ifc-api.js\";\n *\n * utils.loadArraybuffer(\"rac_advanced_sample_project.ifc\", async (data) => {\n *\n * const xktModel = new XKTModel();\n *\n * parseIFCIntoXKTModel({\n * WebIFC,\n * data,\n * xktModel,\n * wasmPath: \"../dist/\",\n * autoNormals: true,\n * log: (msg) => { console.log(msg); }\n * }).then(()=>{\n * xktModel.finalize();\n * },\n * (msg) => {\n * console.error(msg);\n * });\n * });\n * ````\n *\n * @param {Object} params Parsing params.\n * @param {Object} params.WebIFC The WebIFC library. We pass this in as an external dependency, in order to give the\n * caller the choice of whether to use the Browser or NodeJS version.\n * @param {ArrayBuffer} [params.data] IFC file data.\n * @param {XKTModel} [params.xktModel] XKTModel to parse into.\n * @param {Boolean} [params.autoNormals=true] When true, the parser will ignore the IFC geometry normals, and the IFC\n * data will rely on the xeokit ````Viewer```` to automatically generate them. This has the limitation that the\n * normals will be face-aligned, and therefore the ````Viewer```` will only be able to render a flat-shaded representation\n * of the IFC model. This is ````true```` by default, because IFC models tend to look acceptable with flat-shading,\n * and we always want to minimize IFC model size wherever possible.\n * @param {String[]} [params.includeTypes] Option to only convert objects of these types.\n * @param {String[]} [params.excludeTypes] Option to never convert objects of these types.\n * @param {String} params.wasmPath Path to ````web-ifc.wasm````, required by this function.\n * @param {Object} [params.stats={}] Collects statistics.\n * @param {function} [params.log] Logging callback.\n * @returns {Promise} Resolves when IFC has been parsed.\n */\nfunction parseIFCIntoXKTModel({\n WebIFC,\n data,\n xktModel,\n autoNormals = true,\n includeTypes,\n excludeTypes,\n wasmPath,\n stats = {},\n log\n }) {\n\n if (log) {\n log(\"Using parser: parseIFCIntoXKTModel\");\n }\n\n return new Promise(function (resolve, reject) {\n\n if (!data) {\n reject(\"Argument expected: data\");\n return;\n }\n\n if (!xktModel) {\n reject(\"Argument expected: xktModel\");\n return;\n }\n\n if (!wasmPath) {\n reject(\"Argument expected: wasmPath\");\n return;\n }\n\n const ifcAPI = new WebIFC.IfcAPI();\n\n if (wasmPath) {\n ifcAPI.SetWasmPath(wasmPath);\n }\n\n ifcAPI.Init().then(() => {\n\n const dataArray = new Uint8Array(data);\n\n const modelID = ifcAPI.OpenModel(dataArray);\n\n stats.sourceFormat = \"IFC\";\n stats.schemaVersion = \"\";\n stats.title = \"\";\n stats.author = \"\";\n stats.created = \"\";\n stats.numMetaObjects = 0;\n stats.numPropertySets = 0;\n stats.numObjects = 0;\n stats.numGeometries = 0;\n stats.numTriangles = 0;\n stats.numVertices = 0;\n\n const ctx = {\n WebIFC,\n modelID,\n ifcAPI,\n xktModel,\n autoNormals,\n log: (log || function (msg) {\n }),\n nextId: 0,\n stats\n };\n\n if (includeTypes) {\n ctx.includeTypes = {};\n for (let i = 0, len = includeTypes.length; i < len; i++) {\n ctx.includeTypes[includeTypes[i]] = true;\n }\n }\n\n if (excludeTypes) {\n ctx.excludeTypes = {};\n for (let i = 0, len = excludeTypes.length; i < len; i++) {\n ctx.excludeTypes[excludeTypes[i]] = true;\n }\n }\n\n const lines = ctx.ifcAPI.GetLineIDsWithType(modelID, WebIFC.IFCPROJECT);\n const ifcProjectId = lines.get(0);\n const ifcProject = ctx.ifcAPI.GetLine(modelID, ifcProjectId);\n\n ctx.xktModel.schema = \"\";\n ctx.xktModel.modelId = \"\" + modelID;\n ctx.xktModel.projectId = \"\" + ifcProjectId;\n\n parseMetadata(ctx);\n parseGeometry(ctx);\n parsePropertySets(ctx);\n\n resolve();\n\n }).catch((e) => {\n\n reject(e);\n })\n });\n}\n\nfunction parsePropertySets(ctx) {\n\n const lines = ctx.ifcAPI.GetLineIDsWithType(ctx.modelID, ctx.WebIFC.IFCRELDEFINESBYPROPERTIES);\n\n for (let i = 0; i < lines.size(); i++) {\n\n let relID = lines.get(i);\n\n let rel = ctx.ifcAPI.GetLine(ctx.modelID, relID, true);\n\n if (rel) {\n\n const relatingPropertyDefinition = rel.RelatingPropertyDefinition;\n if (!relatingPropertyDefinition) {\n continue;\n }\n\n const propertySetId = relatingPropertyDefinition.GlobalId.value;\n\n const relatedObjects = rel.RelatedObjects;\n if (relatedObjects) {\n for (let i = 0, len = relatedObjects.length; i < len; i++) {\n const relatedObject = relatedObjects[i];\n const metaObjectId = relatedObject.GlobalId.value;\n const metaObject = ctx.xktModel.metaObjects[metaObjectId];\n if (metaObject) {\n if (!metaObject.propertySetIds) {\n metaObject.propertySetIds = [];\n }\n metaObject.propertySetIds.push(propertySetId);\n }\n }\n }\n\n const props = relatingPropertyDefinition.HasProperties;\n if (props && props.length > 0) {\n const propertySetType = \"Default\";\n const propertySetName = relatingPropertyDefinition.Name.value;\n const properties = [];\n for (let i = 0, len = props.length; i < len; i++) {\n const prop = props[i];\n const name = prop.Name;\n const nominalValue = prop.NominalValue;\n if (name && nominalValue) {\n const property = {\n name: name.value,\n type: nominalValue.type,\n value: nominalValue.value,\n valueType: nominalValue.valueType\n };\n if (prop.Description) {\n property.description = prop.Description.value;\n } else if (nominalValue.description) {\n property.description = nominalValue.description;\n }\n properties.push(property);\n }\n }\n ctx.xktModel.createPropertySet({propertySetId, propertySetType, propertySetName, properties});\n ctx.stats.numPropertySets++;\n }\n }\n }\n}\n\nfunction parseMetadata(ctx) {\n\n const lines = ctx.ifcAPI.GetLineIDsWithType(ctx.modelID, ctx.WebIFC.IFCPROJECT);\n const ifcProjectId = lines.get(0);\n const ifcProject = ctx.ifcAPI.GetLine(ctx.modelID, ifcProjectId);\n\n parseSpatialChildren(ctx, ifcProject);\n}\n\nfunction parseSpatialChildren(ctx, ifcElement, parentMetaObjectId) {\n\n const metaObjectType = ifcElement.__proto__.constructor.name;\n\n if (ctx.includeTypes && (!ctx.includeTypes[metaObjectType])) {\n return;\n }\n\n if (ctx.excludeTypes && ctx.excludeTypes[metaObjectType]) {\n return;\n }\n\n createMetaObject(ctx, ifcElement, parentMetaObjectId);\n\n const metaObjectId = ifcElement.GlobalId.value;\n\n parseRelatedItemsOfType(\n ctx,\n ifcElement.expressID,\n 'RelatingObject',\n 'RelatedObjects',\n ctx.WebIFC.IFCRELAGGREGATES,\n metaObjectId);\n\n parseRelatedItemsOfType(\n ctx,\n ifcElement.expressID,\n 'RelatingStructure',\n 'RelatedElements',\n ctx.WebIFC.IFCRELCONTAINEDINSPATIALSTRUCTURE,\n metaObjectId);\n}\n\nfunction createMetaObject(ctx, ifcElement, parentMetaObjectId) {\n\n const metaObjectId = ifcElement.GlobalId.value;\n const propertySetIds = null;\n const metaObjectType = ifcElement.__proto__.constructor.name;\n const metaObjectName = (ifcElement.Name && ifcElement.Name.value !== \"\") ? ifcElement.Name.value : metaObjectType;\n\n ctx.xktModel.createMetaObject({metaObjectId, propertySetIds, metaObjectType, metaObjectName, parentMetaObjectId});\n ctx.stats.numMetaObjects++;\n}\n\nfunction parseRelatedItemsOfType(ctx, id, relation, related, type, parentMetaObjectId) {\n\n const lines = ctx.ifcAPI.GetLineIDsWithType(ctx.modelID, type);\n\n for (let i = 0; i < lines.size(); i++) {\n\n const relID = lines.get(i);\n const rel = ctx.ifcAPI.GetLine(ctx.modelID, relID);\n const relatedItems = rel[relation];\n\n let foundElement = false;\n\n if (Array.isArray(relatedItems)) {\n const values = relatedItems.map((item) => item.value);\n foundElement = values.includes(id);\n\n } else {\n foundElement = (relatedItems.value === id);\n }\n\n if (foundElement) {\n\n const element = rel[related];\n\n if (!Array.isArray(element)) {\n\n const ifcElement = ctx.ifcAPI.GetLine(ctx.modelID, element.value);\n\n parseSpatialChildren(ctx, ifcElement, parentMetaObjectId);\n\n } else {\n\n element.forEach((element2) => {\n\n const ifcElement = ctx.ifcAPI.GetLine(ctx.modelID, element2.value);\n\n parseSpatialChildren(ctx, ifcElement, parentMetaObjectId);\n });\n }\n }\n }\n}\n\nfunction parseGeometry(ctx) {\n\n // Parses the geometry and materials in the IFC, creates\n // XKTEntity, XKTMesh and XKTGeometry components within the XKTModel.\n\n const flatMeshes = ctx.ifcAPI.LoadAllGeometry(ctx.modelID);\n\n for (let i = 0, len = flatMeshes.size(); i < len; i++) {\n const flatMesh = flatMeshes.get(i);\n createObject(ctx, flatMesh);\n }\n\n // LoadAllGeometry does not return IFCSpace meshes\n // here is a workaround\n\n const lines = ctx.ifcAPI.GetLineIDsWithType(ctx.modelID, ctx.WebIFC.IFCSPACE);\n for (let j = 0, len = lines.size(); j < len; j++) {\n const ifcSpaceId = lines.get(j);\n const flatMesh = ctx.ifcAPI.GetFlatMesh(ctx.modelID, ifcSpaceId);\n createObject(ctx, flatMesh);\n }\n}\n\nfunction createObject(ctx, flatMesh) {\n\n const flatMeshExpressID = flatMesh.expressID;\n const placedGeometries = flatMesh.geometries;\n\n const meshIds = [];\n\n const properties = ctx.ifcAPI.GetLine(ctx.modelID, flatMeshExpressID);\n const entityId = properties.GlobalId.value;\n\n const metaObjectId = entityId;\n const metaObject = ctx.xktModel.metaObjects[metaObjectId];\n\n if (ctx.includeTypes && (!metaObject || (!ctx.includeTypes[metaObject.metaObjectType]))) {\n return;\n }\n\n if (ctx.excludeTypes && (!metaObject || ctx.excludeTypes[metaObject.metaObjectType])) {\n console.log(\"excluding: \" + metaObjectId)\n return;\n }\n\n for (let j = 0, lenj = placedGeometries.size(); j < lenj; j++) {\n\n const placedGeometry = placedGeometries.get(j);\n const geometryId = \"\" + placedGeometry.geometryExpressID;\n\n if (!ctx.xktModel.geometries[geometryId]) {\n\n const geometry = ctx.ifcAPI.GetGeometry(ctx.modelID, placedGeometry.geometryExpressID);\n const vertexData = ctx.ifcAPI.GetVertexArray(geometry.GetVertexData(), geometry.GetVertexDataSize());\n const indices = ctx.ifcAPI.GetIndexArray(geometry.GetIndexData(), geometry.GetIndexDataSize());\n\n // De-interleave vertex arrays\n\n const positions = [];\n const normals = [];\n\n for (let k = 0, lenk = vertexData.length / 6; k < lenk; k++) {\n positions.push(vertexData[k * 6 + 0]);\n positions.push(vertexData[k * 6 + 1]);\n positions.push(vertexData[k * 6 + 2]);\n }\n\n if (!ctx.autoNormals) {\n for (let k = 0, lenk = vertexData.length / 6; k < lenk; k++) {\n normals.push(vertexData[k * 6 + 3]);\n normals.push(vertexData[k * 6 + 4]);\n normals.push(vertexData[k * 6 + 5]);\n }\n }\n\n ctx.xktModel.createGeometry({\n geometryId: geometryId,\n primitiveType: \"triangles\",\n positions: positions,\n normals: ctx.autoNormals ? null : normals,\n indices: indices\n });\n\n ctx.stats.numGeometries++;\n ctx.stats.numVertices += (positions.length / 3);\n ctx.stats.numTriangles += (indices.length / 3);\n }\n\n const meshId = (\"mesh\" + ctx.nextId++);\n\n ctx.xktModel.createMesh({\n meshId: meshId,\n geometryId: geometryId,\n matrix: placedGeometry.flatTransformation,\n color: [placedGeometry.color.x, placedGeometry.color.y, placedGeometry.color.z],\n opacity: placedGeometry.color.w\n });\n\n meshIds.push(meshId);\n }\n\n if (meshIds.length > 0) {\n ctx.xktModel.createEntity({\n entityId: entityId,\n meshIds: meshIds\n });\n ctx.stats.numObjects++;\n }\n}\n\nexport {parseIFCIntoXKTModel};\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@loaders.gl/las\");","import {parse} from '@loaders.gl/core';\nimport {LASLoader} from '@loaders.gl/las';\n\nimport {math} from \"../lib/math.js\";\n\nconst MAX_VERTICES = 500000; // TODO: Rough estimate\n\n/**\n * @desc Parses LAS and LAZ point cloud data into an {@link XKTModel}.\n *\n * This parser handles both the LASER file format (LAS) and its compressed version (LAZ),\n * a public format for the interchange of 3-dimensional point cloud data data, developed\n * for LIDAR mapping purposes.\n *\n * ## Usage\n *\n * In the example below we'll create an {@link XKTModel}, then load an LAZ point cloud model into it.\n *\n * ````javascript\n * utils.loadArraybuffer(\"./models/laz/autzen.laz\", async (data) => {\n *\n * const xktModel = new XKTModel();\n *\n * await parseLASIntoXKTModel({\n * data,\n * xktModel,\n * rotateX: true,\n * log: (msg) => { console.log(msg); }\n * }).then(()=>{\n * xktModel.finalize();\n * },\n * (msg) => {\n * console.error(msg);\n * });\n * });\n * ````\n *\n * @param {Object} params Parsing params.\n * @param {ArrayBuffer} params.data LAS/LAZ file data.\n * @param {XKTModel} params.xktModel XKTModel to parse into.\n * @param {boolean} [params.center=false] Set true to center the LAS point positions to [0,0,0]. This is applied before the transformation matrix, if specified.\n * @param {Boolean} [params.transform] 4x4 transformation matrix to transform point positions. Use this to rotate, translate and scale them if neccessary.\n * @param {Number|String} [params.colorDepth=8] Whether colors encoded using 8 or 16 bits. Can be set to 'auto'. LAS specification recommends 16 bits.\n * @param {Boolean} [params.fp64=false] Configures if LASLoaderPlugin assumes that LAS positions are stored in 64-bit floats instead of 32-bit.\n * @param {Number} [params.skip=1] Read one from every n points.\n * @param {Object} [params.stats] Collects statistics.\n * @param {function} [params.log] Logging callback.\n * @returns {Promise} Resolves when LAS has been parsed.\n */\nfunction parseLASIntoXKTModel({\n data,\n xktModel,\n center = false,\n transform = null,\n colorDepth = \"auto\",\n fp64 = false,\n skip = 1,\n stats,\n log = () => {\n }\n }) {\n\n if (log) {\n log(\"Using parser: parseLASIntoXKTModel\");\n }\n\n return new Promise(function (resolve, reject) {\n\n if (!data) {\n reject(\"Argument expected: data\");\n return;\n }\n\n if (!xktModel) {\n reject(\"Argument expected: xktModel\");\n return;\n }\n\n log(\"Converting LAZ/LAS\");\n\n log(`center: ${center}`);\n if (transform) {\n log(`transform: [${transform}]`);\n }\n log(`colorDepth: ${colorDepth}`);\n log(`fp64: ${fp64}`);\n log(`skip: ${skip}`);\n\n parse(data, LASLoader, {\n las: {\n colorDepth,\n fp64\n }\n }).then((parsedData) => {\n\n const attributes = parsedData.attributes;\n\n const loaderData = parsedData.loaderData;\n const pointsFormatId = loaderData.pointsFormatId !== undefined ? loaderData.pointsFormatId : -1;\n\n if (!attributes.POSITION) {\n log(\"No positions found in file (expected for all LAS point formats)\");\n return;\n }\n\n let readAttributes = {};\n\n switch (pointsFormatId) {\n case 0:\n if (!attributes.intensity) {\n log(\"No intensities found in file (expected for LAS point format 0)\");\n return;\n }\n\n readAttributes = readIntensities(attributes.POSITION, attributes.intensity);\n break;\n case 1:\n if (!attributes.intensity) {\n log(\"No intensities found in file (expected for LAS point format 1)\");\n return;\n }\n readAttributes = readIntensities(attributes.POSITION, attributes.intensity);\n break;\n case 2:\n if (!attributes.intensity) {\n log(\"No intensities found in file (expected for LAS point format 2)\");\n return;\n }\n\n readAttributes = readColorsAndIntensities(attributes.POSITION, attributes.COLOR_0, attributes.intensity);\n break;\n case 3:\n if (!attributes.intensity) {\n log(\"No intensities found in file (expected for LAS point format 3)\");\n return;\n }\n readAttributes = readColorsAndIntensities(attributes.POSITION, attributes.COLOR_0, attributes.intensity);\n break;\n }\n\n const pointsChunks = chunkArray(readPositions(readAttributes.positions), MAX_VERTICES * 3);\n const colorsChunks = chunkArray(readAttributes.colors, MAX_VERTICES * 4);\n\n const meshIds = [];\n\n for (let j = 0, lenj = pointsChunks.length; j < lenj; j++) {\n\n const geometryId = `geometry-${j}`;\n const meshId = `mesh-${j}`;\n\n meshIds.push(meshId);\n\n xktModel.createGeometry({\n geometryId: geometryId,\n primitiveType: \"points\",\n positions: pointsChunks[j],\n colorsCompressed: colorsChunks[j]\n });\n\n xktModel.createMesh({\n meshId,\n geometryId\n });\n }\n\n const entityId = math.createUUID();\n\n xktModel.createEntity({\n entityId,\n meshIds\n });\n\n const rootMetaObjectId = math.createUUID();\n\n xktModel.createMetaObject({\n metaObjectId: rootMetaObjectId,\n metaObjectType: \"Model\",\n metaObjectName: \"Model\"\n });\n\n xktModel.createMetaObject({\n metaObjectId: entityId,\n metaObjectType: \"PointCloud\",\n metaObjectName: \"PointCloud (LAZ)\",\n parentMetaObjectId: rootMetaObjectId\n });\n\n if (stats) {\n stats.sourceFormat = \"LAS\";\n stats.schemaVersion = \"\";\n stats.title = \"\";\n stats.author = \"\";\n stats.created = \"\";\n stats.numMetaObjects = 2;\n stats.numPropertySets = 0;\n stats.numObjects = 1;\n stats.numGeometries = 1;\n stats.numVertices = readAttributes.positions.length / 3;\n }\n\n resolve();\n\n }, (errMsg) => {\n reject(errMsg);\n });\n });\n\n function readPositions(positionsValue) {\n if (positionsValue) {\n if (center) {\n const centerPos = math.vec3();\n const numPoints = positionsValue.length;\n for (let i = 0, len = positionsValue.length; i < len; i += 3) {\n centerPos[0] += positionsValue[i + 0];\n centerPos[1] += positionsValue[i + 1];\n centerPos[2] += positionsValue[i + 2];\n }\n centerPos[0] /= numPoints;\n centerPos[1] /= numPoints;\n centerPos[2] /= numPoints;\n for (let i = 0, len = positionsValue.length; i < len; i += 3) {\n positionsValue[i + 0] -= centerPos[0];\n positionsValue[i + 1] -= centerPos[1];\n positionsValue[i + 2] -= centerPos[2];\n }\n }\n if (transform) {\n const mat = math.mat4(transform);\n const pos = math.vec3();\n for (let i = 0, len = positionsValue.length; i < len; i += 3) {\n pos[0] = positionsValue[i + 0];\n pos[1] = positionsValue[i + 1];\n pos[2] = positionsValue[i + 2];\n math.transformPoint3(mat, pos, pos);\n positionsValue[i + 0] = pos[0];\n positionsValue[i + 1] = pos[1];\n positionsValue[i + 2] = pos[2];\n }\n }\n }\n return positionsValue;\n }\n\n function readColorsAndIntensities(attributesPosition, attributesColor, attributesIntensity) {\n const positionsValue = attributesPosition.value;\n const colors = attributesColor.value;\n const colorSize = attributesColor.size;\n const intensities = attributesIntensity.value;\n const colorsCompressedSize = intensities.length * 4;\n const positions = [];\n const colorsCompressed = new Uint8Array(colorsCompressedSize / skip);\n let count = skip;\n for (let i = 0, j = 0, k = 0, l = 0, m = 0, n=0,len = intensities.length; i < len; i++, k += colorSize, j += 4, l += 3) {\n if (count <= 0) {\n colorsCompressed[m++] = colors[k + 0];\n colorsCompressed[m++] = colors[k + 1];\n colorsCompressed[m++] = colors[k + 2];\n colorsCompressed[m++] = Math.round((intensities[i] / 65536) * 255);\n positions[n++] = positionsValue[l + 0];\n positions[n++] = positionsValue[l + 1];\n positions[n++] = positionsValue[l + 2];\n count = skip;\n } else {\n count--;\n }\n }\n return {\n positions,\n colors: colorsCompressed\n };\n }\n\n function readIntensities(attributesPosition, attributesIntensity) {\n const positionsValue = attributesPosition.value;\n const intensities = attributesIntensity.intensity;\n const colorsCompressedSize = intensities.length * 4;\n const positions = [];\n const colorsCompressed = new Uint8Array(colorsCompressedSize / skip);\n let count = skip;\n for (let i = 0, j = 0, k = 0, l = 0, m = 0, n = 0, len = intensities.length; i < len; i++, k += 3, j += 4, l += 3) {\n if (count <= 0) {\n colorsCompressed[m++] = 0;\n colorsCompressed[m++] = 0;\n colorsCompressed[m++] = 0;\n colorsCompressed[m++] = Math.round((intensities[i] / 65536) * 255);\n positions[n++] = positionsValue[l + 0];\n positions[n++] = positionsValue[l + 1];\n positions[n++] = positionsValue[l + 2];\n count = skip;\n } else {\n count--;\n }\n }\n return {\n positions,\n colors: colorsCompressed\n };\n }\n\n function chunkArray(array, chunkSize) {\n if (chunkSize >= array.length) {\n return [array]; // One chunk\n }\n let result = [];\n for (let i = 0; i < array.length; i += chunkSize) {\n result.push(array.slice(i, i + chunkSize));\n }\n return result;\n }\n\n}\n\nexport {parseLASIntoXKTModel};","/**\n * @desc Parses JSON metamodel into an {@link XKTModel}.\n *\n * @param {Object} params Parsing parameters.\n * @param {JSON} params.metaModelData Metamodel data.\n * @param {String[]} [params.excludeTypes] Types to exclude from parsing.\n * @param {String[]} [params.includeTypes] Types to include in parsing.\n * @param {XKTModel} params.xktModel XKTModel to parse into.\n * @param {function} [params.log] Logging callback.\n @returns {Promise} Resolves when JSON has been parsed.\n */\nfunction parseMetaModelIntoXKTModel({metaModelData, xktModel, includeTypes, excludeTypes, log}) {\n\n if (log) {\n log(\"Using parser: parseMetaModelIntoXKTModel\");\n }\n\n return new Promise(function (resolve, reject) {\n\n const metaObjects = metaModelData.metaObjects || [];\n const propertySets = metaModelData.propertySets || [];\n\n xktModel.modelId = metaModelData.revisionId || \"\"; // HACK\n xktModel.projectId = metaModelData.projectId || \"\";\n xktModel.revisionId = metaModelData.revisionId || \"\";\n xktModel.author = metaModelData.author || \"\";\n xktModel.createdAt = metaModelData.createdAt || \"\";\n xktModel.creatingApplication = metaModelData.creatingApplication || \"\";\n xktModel.schema = metaModelData.schema || \"\";\n\n for (let i = 0, len = propertySets.length; i < len; i++) {\n\n const propertySet = propertySets[i];\n\n xktModel.createPropertySet({\n propertySetId: propertySet.id,\n propertySetName: propertySet.name,\n propertySetType: propertySet.type,\n properties: propertySet.properties\n });\n }\n\n let includeTypesMap;\n if (includeTypes) {\n includeTypesMap = {};\n for (let i = 0, len = includeTypes.length; i < len; i++) {\n includeTypesMap[includeTypes[i]] = true;\n }\n }\n\n let excludeTypesMap;\n if (excludeTypes) {\n excludeTypesMap = {};\n for (let i = 0, len = excludeTypes.length; i < len; i++) {\n excludeTypesMap[excludeTypes[i]] = true;\n }\n }\n\n const metaObjectsMap = {};\n\n for (let i = 0, len = metaObjects.length; i < len; i++) {\n const newObject = metaObjects[i];\n metaObjectsMap[newObject.id] = newObject;\n }\n\n let countMetaObjects = 0;\n\n for (let i = 0, len = metaObjects.length; i < len; i++) {\n\n const metaObject = metaObjects[i];\n const type = metaObject.type;\n\n if (excludeTypesMap && excludeTypesMap[type]) {\n continue;\n }\n\n if (includeTypesMap && !includeTypesMap[type]) {\n continue;\n }\n\n if (metaObject.parent !== undefined && metaObject.parent !== null) {\n const metaObjectParent = metaObjectsMap[metaObject.parent];\n if (metaObject.type === metaObjectParent.type) { // Don't create redundant sub-objects\n continue\n }\n }\n\n const propertySetIds = [];\n if (metaObject.propertySetIds) {\n for (let j = 0, lenj = metaObject.propertySetIds.length; j < lenj; j++) {\n const propertySetId = metaObject.propertySetIds[j];\n if (propertySetId !== undefined && propertySetId !== null && propertySetId !== \"\") {\n propertySetIds.push(propertySetId);\n }\n }\n }\n if (metaObject.propertySetId !== undefined && metaObject.propertySetId !== null && metaObject.propertySetId !== \"\") {\n propertySetIds.push(metaObject.propertySetId);\n }\n\n xktModel.createMetaObject({\n metaObjectId: metaObject.id,\n metaObjectType: metaObject.type,\n metaObjectName: metaObject.name,\n parentMetaObjectId: metaObject.parent,\n propertySetIds: propertySetIds.length > 0 ? propertySetIds : null\n });\n\n countMetaObjects++;\n }\n\n if (log) {\n log(\"Converted meta objects: \" + countMetaObjects);\n }\n\n resolve();\n });\n}\n\nexport {parseMetaModelIntoXKTModel};\n","/**\n * @desc Parses PCD point cloud data into an {@link XKTModel}.\n *\n * ## Usage\n *\n * In the example below we'll create an {@link XKTModel}, then load an LAZ point cloud model into it.\n *\n * ````javascript\n * utils.loadArraybuffer(\"\"./models/pcd/ism_test_cat.pcd\"\", async (data) => {\n *\n * const xktModel = new XKTModel();\n *\n * await parsePCDIntoXKTModel({\n * data,\n * xktModel,\n * log: (msg) => { console.log(msg); }\n * }).then(()=>{\n * xktModel.finalize();\n * },\n * (msg) => {\n * console.error(msg);\n * });\n * });\n * ````\n *\n * @param {Object} params Parsing params.\n * @param {ArrayBuffer} params.data PCD file data.\n * @param {Boolean} [params.littleEndian=true] Whether PCD binary data is Little-Endian or Big-Endian.\n * @param {XKTModel} params.xktModel XKTModel to parse into.\n * @param {Object} [params.stats] Collects statistics.\n * @param {function} [params.log] Logging callback.\n @returns {Promise} Resolves when PCD has been parsed.\n */\nfunction parsePCDIntoXKTModel({data, xktModel, littleEndian = true, stats, log}) {\n\n if (log) {\n log(\"Using parser: parsePCDIntoXKTModel\");\n }\n\n return new Promise(function(resolve, reject) {\n\n const textData = decodeText(new Uint8Array(data));\n\n const header = parseHeader(textData);\n\n const positions = [];\n const normals = [];\n const colors = [];\n\n if (header.data === 'ascii') {\n\n const offset = header.offset;\n const data = textData.substr(header.headerLen);\n const lines = data.split('\\n');\n\n for (let i = 0, l = lines.length; i < l; i++) {\n\n if (lines[i] === '') {\n continue;\n }\n\n const line = lines[i].split(' ');\n\n if (offset.x !== undefined) {\n positions.push(parseFloat(line[offset.x]));\n positions.push(parseFloat(line[offset.y]));\n positions.push(parseFloat(line[offset.z]));\n }\n\n if (offset.rgb !== undefined) {\n const rgb = parseFloat(line[offset.rgb]);\n const r = (rgb >> 16) & 0x0000ff;\n const g = (rgb >> 8) & 0x0000ff;\n const b = (rgb >> 0) & 0x0000ff;\n colors.push(r, g, b, 255);\n } else {\n colors.push(255);\n colors.push(255);\n colors.push(255);\n }\n }\n }\n\n if (header.data === 'binary_compressed') {\n\n const sizes = new Uint32Array(data.slice(header.headerLen, header.headerLen + 8));\n const compressedSize = sizes[0];\n const decompressedSize = sizes[1];\n const decompressed = decompressLZF(new Uint8Array(data, header.headerLen + 8, compressedSize), decompressedSize);\n const dataview = new DataView(decompressed.buffer);\n const offset = header.offset;\n\n for (let i = 0; i < header.points; i++) {\n\n if (offset.x !== undefined) {\n positions.push(dataview.getFloat32((header.points * offset.x) + header.size[0] * i, littleEndian));\n positions.push(dataview.getFloat32((header.points * offset.y) + header.size[1] * i, littleEndian));\n positions.push(dataview.getFloat32((header.points * offset.z) + header.size[2] * i, littleEndian));\n }\n\n if (offset.rgb !== undefined) {\n colors.push(dataview.getUint8((header.points * offset.rgb) + header.size[3] * i + 0));\n colors.push(dataview.getUint8((header.points * offset.rgb) + header.size[3] * i + 1));\n colors.push(dataview.getUint8((header.points * offset.rgb) + header.size[3] * i + 2));\n // colors.push(255);\n } else {\n colors.push(1);\n colors.push(1);\n colors.push(1);\n }\n }\n }\n\n if (header.data === 'binary') {\n\n const dataview = new DataView(data, header.headerLen);\n const offset = header.offset;\n\n for (let i = 0, row = 0; i < header.points; i++, row += header.rowSize) {\n if (offset.x !== undefined) {\n positions.push(dataview.getFloat32(row + offset.x, littleEndian));\n positions.push(dataview.getFloat32(row + offset.y, littleEndian));\n positions.push(dataview.getFloat32(row + offset.z, littleEndian));\n }\n\n if (offset.rgb !== undefined) {\n colors.push(dataview.getUint8(row + offset.rgb + 2));\n colors.push(dataview.getUint8(row + offset.rgb + 1));\n colors.push(dataview.getUint8(row + offset.rgb + 0));\n } else {\n colors.push(255);\n colors.push(255);\n colors.push(255);\n }\n }\n }\n\n xktModel.createGeometry({\n geometryId: \"pointsGeometry\",\n primitiveType: \"points\",\n positions: positions,\n colors: colors && colors.length > 0 ? colors : null\n });\n\n xktModel.createMesh({\n meshId: \"pointsMesh\",\n geometryId: \"pointsGeometry\"\n });\n\n xktModel.createEntity({\n entityId: \"geometries\",\n meshIds: [\"pointsMesh\"]\n });\n\n if (log) {\n log(\"Converted drawable objects: 1\");\n log(\"Converted geometries: 1\");\n log(\"Converted vertices: \" + positions.length / 3);\n }\n\n if (stats) {\n stats.sourceFormat = \"PCD\";\n stats.schemaVersion = \"\";\n stats.title = \"\";\n stats.author = \"\";\n stats.created = \"\";\n stats.numObjects = 1;\n stats.numGeometries = 1;\n stats.numVertices = positions.length / 3;\n }\n\n resolve();\n });\n}\n\nfunction parseHeader(data) {\n const header = {};\n const result1 = data.search(/[\\r\\n]DATA\\s(\\S*)\\s/i);\n const result2 = /[\\r\\n]DATA\\s(\\S*)\\s/i.exec(data.substr(result1 - 1));\n header.data = result2[1];\n header.headerLen = result2[0].length + result1;\n header.str = data.substr(0, header.headerLen);\n header.str = header.str.replace(/\\#.*/gi, ''); // Strip comments\n header.version = /VERSION (.*)/i.exec(header.str); // Parse\n header.fields = /FIELDS (.*)/i.exec(header.str);\n header.size = /SIZE (.*)/i.exec(header.str);\n header.type = /TYPE (.*)/i.exec(header.str);\n header.count = /COUNT (.*)/i.exec(header.str);\n header.width = /WIDTH (.*)/i.exec(header.str);\n header.height = /HEIGHT (.*)/i.exec(header.str);\n header.viewpoint = /VIEWPOINT (.*)/i.exec(header.str);\n header.points = /POINTS (.*)/i.exec(header.str);\n if (header.version !== null) {\n header.version = parseFloat(header.version[1]);\n }\n if (header.fields !== null) {\n header.fields = header.fields[1].split(' ');\n }\n if (header.type !== null) {\n header.type = header.type[1].split(' ');\n }\n if (header.width !== null) {\n header.width = parseInt(header.width[1]);\n }\n if (header.height !== null) {\n header.height = parseInt(header.height[1]);\n }\n if (header.viewpoint !== null) {\n header.viewpoint = header.viewpoint[1];\n }\n if (header.points !== null) {\n header.points = parseInt(header.points[1], 10);\n }\n if (header.points === null) {\n header.points = header.width * header.height;\n }\n if (header.size !== null) {\n header.size = header.size[1].split(' ').map(function (x) {\n return parseInt(x, 10);\n });\n }\n if (header.count !== null) {\n header.count = header.count[1].split(' ').map(function (x) {\n return parseInt(x, 10);\n });\n } else {\n header.count = [];\n for (let i = 0, l = header.fields.length; i < l; i++) {\n header.count.push(1);\n }\n }\n header.offset = {};\n let sizeSum = 0;\n for (let i = 0, l = header.fields.length; i < l; i++) {\n if (header.data === 'ascii') {\n header.offset[header.fields[i]] = i;\n } else {\n header.offset[header.fields[i]] = sizeSum;\n sizeSum += header.size[i] * header.count[i];\n }\n }\n header.rowSize = sizeSum; // For binary only\n return header;\n}\n\nfunction decodeText(array) {\n if (typeof TextDecoder !== 'undefined') {\n return new TextDecoder().decode(array);\n }\n let s = '';\n for (let i = 0, il = array.length; i < il; i++) {\n s += String.fromCharCode(array[i]);\n }\n try {\n return decodeURIComponent(escape(s));\n } catch (e) {\n return s;\n }\n}\n\nfunction decompressLZF(inData, outLength) { // https://gitlab.com/taketwo/three-pcd-loader/blob/master/decompress-lzf.js\n const inLength = inData.length;\n const outData = new Uint8Array(outLength);\n let inPtr = 0;\n let outPtr = 0;\n let ctrl;\n let len;\n let ref;\n do {\n ctrl = inData[inPtr++];\n if (ctrl < (1 << 5)) {\n ctrl++;\n if (outPtr + ctrl > outLength) throw new Error('Output buffer is not large enough');\n if (inPtr + ctrl > inLength) throw new Error('Invalid compressed data');\n do {\n outData[outPtr++] = inData[inPtr++];\n } while (--ctrl);\n } else {\n len = ctrl >> 5;\n ref = outPtr - ((ctrl & 0x1f) << 8) - 1;\n if (inPtr >= inLength) throw new Error('Invalid compressed data');\n if (len === 7) {\n len += inData[inPtr++];\n if (inPtr >= inLength) throw new Error('Invalid compressed data');\n }\n ref -= inData[inPtr++];\n if (outPtr + len + 2 > outLength) throw new Error('Output buffer is not large enough');\n if (ref < 0) throw new Error('Invalid compressed data');\n if (ref >= outPtr) throw new Error('Invalid compressed data');\n do {\n outData[outPtr++] = outData[ref++];\n } while (--len + 2);\n }\n } while (inPtr < inLength);\n return outData;\n}\n\nexport {parsePCDIntoXKTModel};","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@loaders.gl/ply\");","import {parse} from '@loaders.gl/core';\nimport {PLYLoader} from '@loaders.gl/ply';\n\n/**\n * @desc Parses PLY file data into an {@link XKTModel}.\n *\n * ## Usage\n *\n * In the example below we'll create an {@link XKTModel}, then load a PLY model into it.\n *\n * ````javascript\n * utils.loadArraybuffer(\"./models/ply/test.ply\", async (data) => {\n *\n * const xktModel = new XKTModel();\n *\n * parsePLYIntoXKTModel({data, xktModel}).then(()=>{\n * xktModel.finalize();\n * },\n * (msg) => {\n * console.error(msg);\n * });\n * });\n * ````\n *\n * @param {Object} params Parsing params.\n * @param {ArrayBuffer} params.data PLY file data.\n * @param {XKTModel} params.xktModel XKTModel to parse into.\n * @param {Object} [params.stats] Collects statistics.\n * @param {function} [params.log] Logging callback.\n @returns {Promise} Resolves when PLY has been parsed.\n */\nasync function parsePLYIntoXKTModel({data, xktModel, stats, log}) {\n\n if (log) {\n log(\"Using parser: parsePLYIntoXKTModel\");\n }\n\n if (!data) {\n throw \"Argument expected: data\";\n }\n\n if (!xktModel) {\n throw \"Argument expected: xktModel\";\n }\n\n let parsedData;\n try {\n parsedData = await parse(data, PLYLoader);\n } catch (e) {\n if (log) {\n log(\"Error: \" + e);\n }\n return;\n }\n\n const attributes = parsedData.attributes;\n const hasColors = !!attributes.COLOR_0;\n\n if (hasColors) {\n const colorsValue = hasColors ? attributes.COLOR_0.value : null;\n const colorsCompressed = [];\n for (let i = 0, len = colorsValue.length; i < len; i += 4) {\n colorsCompressed.push(colorsValue[i]);\n colorsCompressed.push(colorsValue[i + 1]);\n colorsCompressed.push(colorsValue[i + 2]);\n }\n xktModel.createGeometry({\n geometryId: \"plyGeometry\",\n primitiveType: \"triangles\",\n positions: attributes.POSITION.value,\n indices: parsedData.indices ? parsedData.indices.value : [],\n colorsCompressed: colorsCompressed\n });\n } else {\n xktModel.createGeometry({\n geometryId: \"plyGeometry\",\n primitiveType: \"triangles\",\n positions: attributes.POSITION.value,\n indices: parsedData.indices ? parsedData.indices.value : []\n });\n }\n\n xktModel.createMesh({\n meshId: \"plyMesh\",\n geometryId: \"plyGeometry\",\n color: (!hasColors) ? [1, 1, 1] : null\n });\n\n xktModel.createEntity({\n entityId: \"ply\",\n meshIds: [\"plyMesh\"]\n });\n\n if (stats) {\n stats.sourceFormat = \"PLY\";\n stats.schemaVersion = \"\";\n stats.title = \"\";\n stats.author = \"\";\n stats.created = \"\";\n stats.numMetaObjects = 2;\n stats.numPropertySets = 0;\n stats.numObjects = 1;\n stats.numGeometries = 1;\n stats.numVertices = attributes.POSITION.value.length / 3;\n }\n}\n\nexport {parsePLYIntoXKTModel};\n","import {faceToVertexNormals} from \"../lib/faceToVertexNormals.js\";\nimport {math} from \"../lib/math.js\";\n\n/**\n * @desc Parses STL file data into an {@link XKTModel}.\n *\n * * Supports binary and ASCII STL formats.\n * * Option to create a separate {@link XKTEntity} for each group of faces that share the same vertex colors.\n * * Option to smooth face-aligned normals loaded from STL.\n * * Option to reduce XKT file size by ignoring STL normals and relying on xeokit to auto-generate them.\n *\n * ## Usage\n *\n * In the example below we'll create an {@link XKTModel}, then load an STL model into it.\n *\n * ````javascript\n * utils.loadArraybuffer(\"./models/stl/binary/spurGear.stl\", async (data) => {\n *\n * const xktModel = new XKTModel();\n *\n * parseSTLIntoXKTModel({data, xktModel});\n *\n * xktModel.finalize();\n * });\n * ````\n *\n * @param {Object} params Parsing params.\n * @param {ArrayBuffer|String} [params.data] STL file data. Can be binary or string.\n * @param {Boolean} [params.autoNormals=false] When true, the parser will ignore the STL geometry normals, and the STL\n * data will rely on the xeokit ````Viewer```` to automatically generate them. This has the limitation that the\n * normals will be face-aligned, and therefore the ````Viewer```` will only be able to render a flat-shaded representation\n * of the STL.\n * Overrides ````smoothNormals```` when ````true````. This ignores the normals in the STL, and loads no\n * normals from the STL into the {@link XKTModel}, resulting in the XKT file storing no normals for the STL model. The\n * xeokit-sdk will then automatically generate the normals within its shaders. The disadvantages are that auto-normals\n * may slow rendering down a little bit, and that the normals can only be face-aligned (and thus rendered using flat\n * shading). The advantages, however, are a smaller XKT file size, and the ability to apply certain geometry optimizations\n * during parsing, such as removing duplicated STL vertex positions, that are not possible when normals are loaded\n * for the STL vertices.\n * @param {Boolean} [params.smoothNormals=true] When true, automatically converts face-oriented STL normals to vertex normals, for a smooth appearance. Ignored if ````autoNormals```` is ````true````.\n * @param {Number} [params.smoothNormalsAngleThreshold=20] This is the threshold angle between normals of adjacent triangles, below which their shared wireframe edge is not drawn.\n * @param {Boolean} [params.splitMeshes=true] When true, creates a separate {@link XKTEntity} for each group of faces that share the same vertex colors. Only works with binary STL (ie. when ````data```` is an ArrayBuffer).\n * @param {XKTModel} [params.xktModel] XKTModel to parse into.\n * @param {Object} [params.stats] Collects statistics.\n * @param {function} [params.log] Logging callback.\n @returns {Promise} Resolves when STL has been parsed.\n */\nasync function parseSTLIntoXKTModel({\n data,\n splitMeshes,\n autoNormals,\n smoothNormals,\n smoothNormalsAngleThreshold,\n xktModel,\n stats,\n log\n }) {\n\n if (log) {\n log(\"Using parser: parseSTLIntoXKTModel\");\n }\n\n return new Promise(function (resolve, reject) {\n\n if (!data) {\n reject(\"Argument expected: data\");\n return;\n }\n\n if (!xktModel) {\n reject(\"Argument expected: xktModel\");\n return;\n }\n\n const rootMetaObjectId = math.createUUID();\n\n const rootMetaObject = xktModel.createMetaObject({\n metaObjectId: rootMetaObjectId,\n metaObjectType: \"Model\",\n metaObjectName: \"Model\"\n });\n\n const ctx = {\n data,\n splitMeshes,\n autoNormals,\n smoothNormals,\n smoothNormalsAngleThreshold,\n xktModel,\n rootMetaObject,\n nextId: 0,\n log: (log || function (msg) {\n }),\n stats: {\n numObjects: 0,\n numGeometries: 0,\n numTriangles: 0,\n numVertices: 0\n }\n };\n\n const binData = ensureBinary(data);\n\n if (isBinary(binData)) {\n parseBinary(ctx, binData);\n } else {\n parseASCII(ctx, ensureString(data));\n }\n\n if (stats) {\n stats.sourceFormat = \"STL\";\n stats.schemaVersion = \"\";\n stats.title = \"\";\n stats.author = \"\";\n stats.created = \"\";\n stats.numMetaObjects = 2;\n stats.numPropertySets = 0;\n stats.numObjects = 1;\n stats.numGeometries = 1;\n stats.numTriangles = ctx.stats.numTriangles;\n stats.numVertices = ctx.stats.numVertices;\n }\n\n resolve();\n });\n}\n\nfunction isBinary(data) {\n const reader = new DataView(data);\n const numFaces = reader.getUint32(80, true);\n const faceSize = (32 / 8 * 3) + ((32 / 8 * 3) * 3) + (16 / 8);\n const numExpectedBytes = 80 + (32 / 8) + (numFaces * faceSize);\n if (numExpectedBytes === reader.byteLength) {\n return true;\n }\n const solid = [115, 111, 108, 105, 100];\n for (let i = 0; i < 5; i++) {\n if (solid[i] !== reader.getUint8(i, false)) {\n return true;\n }\n }\n return false;\n}\n\nfunction parseBinary(ctx, data) {\n const reader = new DataView(data);\n const faces = reader.getUint32(80, true);\n let r;\n let g;\n let b;\n let hasColors = false;\n let colors;\n let defaultR;\n let defaultG;\n let defaultB;\n let lastR = null;\n let lastG = null;\n let lastB = null;\n let newMesh = false;\n let alpha;\n for (let index = 0; index < 80 - 10; index++) {\n if ((reader.getUint32(index, false) === 0x434F4C4F /*COLO*/) &&\n (reader.getUint8(index + 4) === 0x52 /*'R'*/) &&\n (reader.getUint8(index + 5) === 0x3D /*'='*/)) {\n hasColors = true;\n colors = [];\n defaultR = reader.getUint8(index + 6) / 255;\n defaultG = reader.getUint8(index + 7) / 255;\n defaultB = reader.getUint8(index + 8) / 255;\n alpha = reader.getUint8(index + 9) / 255;\n }\n }\n let dataOffset = 84;\n let faceLength = 12 * 4 + 2;\n let positions = [];\n let normals = [];\n let splitMeshes = ctx.splitMeshes;\n for (let face = 0; face < faces; face++) {\n let start = dataOffset + face * faceLength;\n let normalX = reader.getFloat32(start, true);\n let normalY = reader.getFloat32(start + 4, true);\n let normalZ = reader.getFloat32(start + 8, true);\n if (hasColors) {\n let packedColor = reader.getUint16(start + 48, true);\n if ((packedColor & 0x8000) === 0) {\n r = (packedColor & 0x1F) / 31;\n g = ((packedColor >> 5) & 0x1F) / 31;\n b = ((packedColor >> 10) & 0x1F) / 31;\n } else {\n r = defaultR;\n g = defaultG;\n b = defaultB;\n }\n if (splitMeshes && r !== lastR || g !== lastG || b !== lastB) {\n if (lastR !== null) {\n newMesh = true;\n }\n lastR = r;\n lastG = g;\n lastB = b;\n }\n }\n for (let i = 1; i <= 3; i++) {\n let vertexstart = start + i * 12;\n positions.push(reader.getFloat32(vertexstart, true));\n positions.push(reader.getFloat32(vertexstart + 4, true));\n positions.push(reader.getFloat32(vertexstart + 8, true));\n if (!ctx.autoNormals) {\n normals.push(normalX, normalY, normalZ);\n }\n if (hasColors) {\n colors.push(r, g, b, 1); // TODO: handle alpha\n }\n }\n if (splitMeshes && newMesh) {\n addMesh(ctx, positions, normals, colors);\n positions = [];\n normals = [];\n colors = colors ? [] : null;\n newMesh = false;\n }\n }\n if (positions.length > 0) {\n addMesh(ctx, positions, normals, colors);\n }\n}\n\nfunction parseASCII(ctx, data) {\n const faceRegex = /facet([\\s\\S]*?)endfacet/g;\n let faceCounter = 0;\n const floatRegex = /[\\s]+([+-]?(?:\\d+.\\d+|\\d+.|\\d+|.\\d+)(?:[eE][+-]?\\d+)?)/.source;\n const vertexRegex = new RegExp('vertex' + floatRegex + floatRegex + floatRegex, 'g');\n const normalRegex = new RegExp('normal' + floatRegex + floatRegex + floatRegex, 'g');\n const positions = [];\n const normals = [];\n const colors = null;\n let normalx;\n let normaly;\n let normalz;\n let result;\n let verticesPerFace;\n let normalsPerFace;\n let text;\n while ((result = faceRegex.exec(data)) !== null) {\n verticesPerFace = 0;\n normalsPerFace = 0;\n text = result[0];\n while ((result = normalRegex.exec(text)) !== null) {\n normalx = parseFloat(result[1]);\n normaly = parseFloat(result[2]);\n normalz = parseFloat(result[3]);\n normalsPerFace++;\n }\n while ((result = vertexRegex.exec(text)) !== null) {\n positions.push(parseFloat(result[1]), parseFloat(result[2]), parseFloat(result[3]));\n normals.push(normalx, normaly, normalz);\n verticesPerFace++;\n }\n if (normalsPerFace !== 1) {\n ctx.log(\"Error in normal of face \" + faceCounter);\n return -1;\n }\n if (verticesPerFace !== 3) {\n ctx.log(\"Error in positions of face \" + faceCounter);\n return -1;\n }\n faceCounter++;\n }\n addMesh(ctx, positions, normals, colors);\n}\n\nlet nextGeometryId = 0;\n\nfunction addMesh(ctx, positions, normals, colors) {\n\n const indices = new Int32Array(positions.length / 3);\n for (let ni = 0, len = indices.length; ni < len; ni++) {\n indices[ni] = ni;\n }\n\n normals = normals && normals.length > 0 ? normals : null;\n colors = colors && colors.length > 0 ? colors : null;\n\n if (!ctx.autoNormals && ctx.smoothNormals) {\n faceToVertexNormals(positions, normals, {smoothNormalsAngleThreshold: ctx.smoothNormalsAngleThreshold});\n }\n\n const geometryId = \"\" + nextGeometryId++;\n const meshId = \"\" + nextGeometryId++;\n const entityId = \"\" + nextGeometryId++;\n\n ctx.xktModel.createGeometry({\n geometryId: geometryId,\n primitiveType: \"triangles\",\n positions: positions,\n normals: (!ctx.autoNormals) ? normals : null,\n colors: colors,\n indices: indices\n });\n\n ctx.xktModel.createMesh({\n meshId: meshId,\n geometryId: geometryId,\n color: colors ? null : [1, 1, 1],\n metallic: 0.9,\n roughness: 0.1\n });\n\n ctx.xktModel.createEntity({\n entityId: entityId,\n meshIds: [meshId]\n });\n\n ctx.xktModel.createMetaObject({\n metaObjectId: entityId,\n metaObjectType: \"Default\",\n metaObjectName: \"STL Mesh\",\n parentMetaObjectId: ctx.rootMetaObject.metaObjectId\n });\n\n ctx.stats.numGeometries++;\n ctx.stats.numObjects++;\n ctx.stats.numVertices += positions.length / 3;\n ctx.stats.numTriangles += indices.length / 3;\n}\n\nfunction ensureString(buffer) {\n if (typeof buffer !== 'string') {\n return decodeText(new Uint8Array(buffer));\n }\n return buffer;\n}\n\nfunction ensureBinary(buffer) {\n if (typeof buffer === 'string') {\n const arrayBuffer = new Uint8Array(buffer.length);\n for (let i = 0; i < buffer.length; i++) {\n arrayBuffer[i] = buffer.charCodeAt(i) & 0xff; // implicitly assumes little-endian\n }\n return arrayBuffer.buffer || arrayBuffer;\n } else {\n return buffer;\n }\n}\n\nfunction decodeText(array) {\n if (typeof TextDecoder !== 'undefined') {\n return new TextDecoder().decode(array);\n }\n let s = '';\n for (let i = 0, il = array.length; i < il; i++) {\n s += String.fromCharCode(array[i]); // Implicitly assumes little-endian.\n }\n return decodeURIComponent(escape(s));\n}\n\nexport {parseSTLIntoXKTModel};\n","import {math} from \"./math.js\";\n\n/**\n * Converts surface-perpendicular face normals to vertex normals. Assumes that the mesh contains disjoint triangles\n * that don't share vertex array elements. Works by finding groups of vertices that have the same location and\n * averaging their normal vectors.\n *\n * @returns {{positions: Array, normals: *}}\n * @private\n */\nfunction faceToVertexNormals(positions, normals, options = {}) {\n const smoothNormalsAngleThreshold = options.smoothNormalsAngleThreshold || 20;\n const vertexMap = {};\n const vertexNormals = [];\n const vertexNormalAccum = {};\n let acc;\n let vx;\n let vy;\n let vz;\n let key;\n const precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001\n const precision = 10 ** precisionPoints;\n let posi;\n let i;\n let j;\n let len;\n let a;\n let b;\n let c;\n\n for (i = 0, len = positions.length; i < len; i += 3) {\n\n posi = i / 3;\n\n vx = positions[i];\n vy = positions[i + 1];\n vz = positions[i + 2];\n\n key = `${Math.round(vx * precision)}_${Math.round(vy * precision)}_${Math.round(vz * precision)}`;\n\n if (vertexMap[key] === undefined) {\n vertexMap[key] = [posi];\n } else {\n vertexMap[key].push(posi);\n }\n\n const normal = math.normalizeVec3([normals[i], normals[i + 1], normals[i + 2]]);\n\n vertexNormals[posi] = normal;\n\n acc = math.vec4([normal[0], normal[1], normal[2], 1]);\n\n vertexNormalAccum[posi] = acc;\n }\n\n for (key in vertexMap) {\n\n if (vertexMap.hasOwnProperty(key)) {\n\n const vertices = vertexMap[key];\n const numVerts = vertices.length;\n\n for (i = 0; i < numVerts; i++) {\n\n const ii = vertices[i];\n\n acc = vertexNormalAccum[ii];\n\n for (j = 0; j < numVerts; j++) {\n\n if (i === j) {\n continue;\n }\n\n const jj = vertices[j];\n\n a = vertexNormals[ii];\n b = vertexNormals[jj];\n\n const angle = Math.abs(math.angleVec3(a, b) / math.DEGTORAD);\n\n if (angle < smoothNormalsAngleThreshold) {\n\n acc[0] += b[0];\n acc[1] += b[1];\n acc[2] += b[2];\n acc[3] += 1.0;\n }\n }\n }\n }\n }\n\n for (i = 0, len = normals.length; i < len; i += 3) {\n\n acc = vertexNormalAccum[i / 3];\n\n normals[i + 0] = acc[0] / acc[3];\n normals[i + 1] = acc[1] / acc[3];\n normals[i + 2] = acc[2] / acc[3];\n\n }\n}\n\nexport {faceToVertexNormals};","/**\n * @desc Creates box-shaped triangle mesh geometry arrays.\n *\n * ## Usage\n *\n * In the example below we'll create an {@link XKTModel}, then create an {@link XKTMesh} with a box-shaped {@link XKTGeometry}.\n *\n * [[Run this example](http://xeokit.github.io/xeokit-sdk/examples/#geometry_builders_buildBoxGeometry)]\n *\n * ````javascript\n * const xktModel = new XKTModel();\n *\n * const box = buildBoxGeometry({\n * primitiveType: \"triangles\" // or \"lines\"\n * center: [0,0,0],\n * xSize: 1, // Half-size on each axis\n * ySize: 1,\n * zSize: 1\n * });\n *\n * const xktGeometry = xktModel.createGeometry({\n * geometryId: \"boxGeometry\",\n * primitiveType: box.primitiveType,\n * positions: box.positions,\n * normals: box.normals,\n * indices: box.indices\n * });\n *\n * const xktMesh = xktModel.createMesh({\n * meshId: \"redBoxMesh\",\n * geometryId: \"boxGeometry\",\n * position: [-4, -6, -4],\n * scale: [1, 3, 1],\n * rotation: [0, 0, 0],\n * color: [1, 0, 0],\n * opacity: 1\n * });\n *\n * const xktEntity = xktModel.createEntity({\n * entityId: \"redBox\",\n * meshIds: [\"redBoxMesh\"]\n * });\n *\n * xktModel.finalize();\n * ````\n *\n * @function buildBoxGeometry\n * @param {*} [cfg] Configs\n * @param {Number[]} [cfg.center] 3D point indicating the center position.\n * @param {Number} [cfg.xSize=1.0] Half-size on the X-axis.\n * @param {Number} [cfg.ySize=1.0] Half-size on the Y-axis.\n * @param {Number} [cfg.zSize=1.0] Half-size on the Z-axis.\n * @returns {Object} Geometry arrays for {@link XKTModel#createGeometry} or {@link XKTModel#createMesh}.\n */\nfunction buildBoxGeometry(cfg = {}) {\n\n let xSize = cfg.xSize || 1;\n if (xSize < 0) {\n console.error(\"negative xSize not allowed - will invert\");\n xSize *= -1;\n }\n\n let ySize = cfg.ySize || 1;\n if (ySize < 0) {\n console.error(\"negative ySize not allowed - will invert\");\n ySize *= -1;\n }\n\n let zSize = cfg.zSize || 1;\n if (zSize < 0) {\n console.error(\"negative zSize not allowed - will invert\");\n zSize *= -1;\n }\n\n const center = cfg.center;\n const centerX = center ? center[0] : 0;\n const centerY = center ? center[1] : 0;\n const centerZ = center ? center[2] : 0;\n\n const xmin = -xSize + centerX;\n const ymin = -ySize + centerY;\n const zmin = -zSize + centerZ;\n const xmax = xSize + centerX;\n const ymax = ySize + centerY;\n const zmax = zSize + centerZ;\n\n return {\n\n primitiveType: \"triangles\",\n\n // The vertices - eight for our cube, each\n // one spanning three array elements for X,Y and Z\n\n positions: [\n\n // v0-v1-v2-v3 front\n xmax, ymax, zmax,\n xmin, ymax, zmax,\n xmin, ymin, zmax,\n xmax, ymin, zmax,\n\n // v0-v3-v4-v1 right\n xmax, ymax, zmax,\n xmax, ymin, zmax,\n xmax, ymin, zmin,\n xmax, ymax, zmin,\n\n // v0-v1-v6-v1 top\n xmax, ymax, zmax,\n xmax, ymax, zmin,\n xmin, ymax, zmin,\n xmin, ymax, zmax,\n\n // v1-v6-v7-v2 left\n xmin, ymax, zmax,\n xmin, ymax, zmin,\n xmin, ymin, zmin,\n xmin, ymin, zmax,\n\n // v7-v4-v3-v2 bottom\n xmin, ymin, zmin,\n xmax, ymin, zmin,\n xmax, ymin, zmax,\n xmin, ymin, zmax,\n\n // v4-v7-v6-v1 back\n xmax, ymin, zmin,\n xmin, ymin, zmin,\n xmin, ymax, zmin,\n xmax, ymax, zmin\n ],\n\n // Normal vectors, one for each vertex\n normals: [\n\n // v0-v1-v2-v3 front\n 0, 0, 1,\n 0, 0, 1,\n 0, 0, 1,\n 0, 0, 1,\n\n // v0-v3-v4-v5 right\n 1, 0, 0,\n 1, 0, 0,\n 1, 0, 0,\n 1, 0, 0,\n\n // v0-v5-v6-v1 top\n 0, 1, 0,\n 0, 1, 0,\n 0, 1, 0,\n 0, 1, 0,\n\n // v1-v6-v7-v2 left\n -1, 0, 0,\n -1, 0, 0,\n -1, 0, 0,\n -1, 0, 0,\n\n // v7-v4-v3-v2 bottom\n 0, -1, 0,\n 0, -1, 0,\n 0, -1, 0,\n 0, -1, 0,\n\n // v4-v7-v6-v5 back\n 0, 0, -1,\n 0, 0, -1,\n 0, 0, -1,\n 0, 0, -1\n ],\n\n // UV coords\n uv: [\n\n // v0-v1-v2-v3 front\n 1, 0,\n 0, 0,\n 0, 1,\n 1, 1,\n\n // v0-v3-v4-v1 right\n 0, 0,\n 0, 1,\n 1, 1,\n 1, 0,\n\n // v0-v1-v6-v1 top\n 1, 1,\n 1, 0,\n 0, 0,\n 0, 1,\n\n // v1-v6-v7-v2 left\n 1, 0,\n 0, 0,\n 0, 1,\n 1, 1,\n\n // v7-v4-v3-v2 bottom\n 0, 1,\n 1, 1,\n 1, 0,\n 0, 0,\n\n // v4-v7-v6-v1 back\n 0, 1,\n 1, 1,\n 1, 0,\n 0, 0\n ],\n\n // Indices - these organise the\n // positions and uv texture coordinates\n // into geometric primitives in accordance\n // with the \"primitive\" parameter,\n // in this case a set of three indices\n // for each triangle.\n //\n // Note that each triangle is specified\n // in counter-clockwise winding order.\n //\n // You can specify them in clockwise\n // order if you configure the Modes\n // node's frontFace flag as \"cw\", instead of\n // the default \"ccw\".\n indices: [\n 0, 1, 2,\n 0, 2, 3,\n // front\n 4, 5, 6,\n 4, 6, 7,\n // right\n 8, 9, 10,\n 8, 10, 11,\n // top\n 12, 13, 14,\n 12, 14, 15,\n // left\n 16, 17, 18,\n 16, 18, 19,\n // bottom\n 20, 21, 22,\n 20, 22, 23\n ]\n };\n}\n\nexport {buildBoxGeometry};\n","/**\n * @desc Creates box-shaped line segment geometry arrays.\n *\n * ## Usage\n *\n * In the example below we'll create an {@link XKTModel}, then create an {@link XKTMesh} with a box-shaped {@link XKTGeometry}.\n *\n * [[Run this example](http://xeokit.github.io/xeokit-sdk/examples/#geometry_builders_buildBoxLinesGeometry)]\n *\n * ````javascript\n * const xktModel = new XKTModel();\n *\n * const box = buildBoxLinesGeometry({\n * center: [0,0,0],\n * xSize: 1, // Half-size on each axis\n * ySize: 1,\n * zSize: 1\n * });\n *\n * const xktGeometry = xktModel.createGeometry({\n * geometryId: \"boxGeometry\",\n * primitiveType: box.primitiveType, // \"lines\"\n * positions: box.positions,\n * normals: box.normals,\n * indices: box.indices\n * });\n *\n * const xktMesh = xktModel.createMesh({\n * meshId: \"redBoxMesh\",\n * geometryId: \"boxGeometry\",\n * position: [-4, -6, -4],\n * scale: [1, 3, 1],\n * rotation: [0, 0, 0],\n * color: [1, 0, 0],\n * opacity: 1\n * });\n *\n * const xktEntity = xktModel.createEntity({\n * entityId: \"redBox\",\n * meshIds: [\"redBoxMesh\"]\n * });\n *\n * xktModel.finalize();\n * ````\n *\n * @function buildBoxLinesGeometry\n * @param {*} [cfg] Configs\n * @param {Number[]} [cfg.center] 3D point indicating the center position.\n * @param {Number} [cfg.xSize=1.0] Half-size on the X-axis.\n * @param {Number} [cfg.ySize=1.0] Half-size on the Y-axis.\n * @param {Number} [cfg.zSize=1.0] Half-size on the Z-axis.\n * @returns {Object} Geometry arrays for {@link XKTModel#createGeometry} or {@link XKTModel#createMesh}.\n */\nfunction buildBoxLinesGeometry(cfg = {}) {\n\n let xSize = cfg.xSize || 1;\n if (xSize < 0) {\n console.error(\"negative xSize not allowed - will invert\");\n xSize *= -1;\n }\n\n let ySize = cfg.ySize || 1;\n if (ySize < 0) {\n console.error(\"negative ySize not allowed - will invert\");\n ySize *= -1;\n }\n\n let zSize = cfg.zSize || 1;\n if (zSize < 0) {\n console.error(\"negative zSize not allowed - will invert\");\n zSize *= -1;\n }\n\n const center = cfg.center;\n const centerX = center ? center[0] : 0;\n const centerY = center ? center[1] : 0;\n const centerZ = center ? center[2] : 0;\n\n const xmin = -xSize + centerX;\n const ymin = -ySize + centerY;\n const zmin = -zSize + centerZ;\n const xmax = xSize + centerX;\n const ymax = ySize + centerY;\n const zmax = zSize + centerZ;\n\n return {\n primitiveType: \"lines\",\n positions: [\n xmin, ymin, zmin,\n xmin, ymin, zmax,\n xmin, ymax, zmin,\n xmin, ymax, zmax,\n xmax, ymin, zmin,\n xmax, ymin, zmax,\n xmax, ymax, zmin,\n xmax, ymax, zmax\n ],\n indices: [\n 0, 1,\n 1, 3,\n 3, 2,\n 2, 0,\n 4, 5,\n 5, 7,\n 7, 6,\n 6, 4,\n 0, 4,\n 1, 5,\n 2, 6,\n 3, 7\n ]\n }\n}\n\nexport {buildBoxLinesGeometry};\n","/**\n * @desc Creates cylinder-shaped geometry arrays.\n *\n * ## Usage\n *\n * In the example below we'll create an {@link XKTModel}, then create an {@link XKTMesh} with a cylinder-shaped {@link XKTGeometry}.\n *\n * [[Run this example](http://xeokit.github.io/xeokit-sdk/examples/#geometry_builders_buildCylinderGeometry)]\n *\n * ````javascript\n * const xktModel = new XKTModel();\n *\n * const cylinder = buildCylinderGeometry({\n * center: [0,0,0],\n * radiusTop: 2.0,\n * radiusBottom: 2.0,\n * height: 5.0,\n * radialSegments: 20,\n * heightSegments: 1,\n * openEnded: false\n * });\n *\n * const xktGeometry = xktModel.createGeometry({\n * geometryId: \"cylinderGeometry\",\n * primitiveType: cylinder.primitiveType,\n * positions: cylinder.positions,\n * normals: cylinder.normals,\n * indices: cylinder.indices\n * });\n *\n * const xktMesh = xktModel.createMesh({\n * meshId: \"redCylinderMesh\",\n * geometryId: \"cylinderGeometry\",\n * position: [-4, -6, -4],\n * scale: [1, 3, 1],\n * rotation: [0, 0, 0],\n * color: [1, 0, 0],\n * opacity: 1\n * });\n *\n * const xktEntity = xktModel.createEntity({\n * entityId: \"redCylinder\",\n * meshIds: [\"redCylinderMesh\"]\n * });\n *\n * xktModel.finalize();\n * ````\n *\n * @function buildCylinderGeometry\n * @param {*} [cfg] Configs\n * @param {Number[]} [cfg.center] 3D point indicating the center position.\n * @param {Number} [cfg.radiusTop=1] Radius of top.\n * @param {Number} [cfg.radiusBottom=1] Radius of bottom.\n * @param {Number} [cfg.height=1] Height.\n * @param {Number} [cfg.radialSegments=60] Number of horizontal segments.\n * @param {Number} [cfg.heightSegments=1] Number of vertical segments.\n * @param {Boolean} [cfg.openEnded=false] Whether or not the cylinder has solid caps on the ends.\n * @returns {Object} Geometry arrays for {@link XKTModel#createGeometry} or {@link XKTModel#createMesh}.\n */\nfunction buildCylinderGeometry(cfg = {}) {\n\n let radiusTop = cfg.radiusTop || 1;\n if (radiusTop < 0) {\n console.error(\"negative radiusTop not allowed - will invert\");\n radiusTop *= -1;\n }\n\n let radiusBottom = cfg.radiusBottom || 1;\n if (radiusBottom < 0) {\n console.error(\"negative radiusBottom not allowed - will invert\");\n radiusBottom *= -1;\n }\n\n let height = cfg.height || 1;\n if (height < 0) {\n console.error(\"negative height not allowed - will invert\");\n height *= -1;\n }\n\n let radialSegments = cfg.radialSegments || 32;\n if (radialSegments < 0) {\n console.error(\"negative radialSegments not allowed - will invert\");\n radialSegments *= -1;\n }\n if (radialSegments < 3) {\n radialSegments = 3;\n }\n\n let heightSegments = cfg.heightSegments || 1;\n if (heightSegments < 0) {\n console.error(\"negative heightSegments not allowed - will invert\");\n heightSegments *= -1;\n }\n if (heightSegments < 1) {\n heightSegments = 1;\n }\n\n const openEnded = !!cfg.openEnded;\n\n let center = cfg.center;\n const centerX = center ? center[0] : 0;\n const centerY = center ? center[1] : 0;\n const centerZ = center ? center[2] : 0;\n\n const heightHalf = height / 2;\n const heightLength = height / heightSegments;\n const radialAngle = (2.0 * Math.PI / radialSegments);\n const radialLength = 1.0 / radialSegments;\n //var nextRadius = this._radiusBottom;\n const radiusChange = (radiusTop - radiusBottom) / heightSegments;\n\n const positions = [];\n const normals = [];\n const uvs = [];\n const indices = [];\n\n let h;\n let i;\n\n let x;\n let z;\n\n let currentRadius;\n let currentHeight;\n\n let first;\n let second;\n\n let startIndex;\n let tu;\n let tv;\n\n // create vertices\n const normalY = (90.0 - (Math.atan(height / (radiusBottom - radiusTop))) * 180 / Math.PI) / 90.0;\n\n for (h = 0; h <= heightSegments; h++) {\n currentRadius = radiusTop - h * radiusChange;\n currentHeight = heightHalf - h * heightLength;\n\n for (i = 0; i <= radialSegments; i++) {\n x = Math.sin(i * radialAngle);\n z = Math.cos(i * radialAngle);\n\n normals.push(currentRadius * x);\n normals.push(normalY); //todo\n normals.push(currentRadius * z);\n\n uvs.push((i * radialLength));\n uvs.push(h * 1 / heightSegments);\n\n positions.push((currentRadius * x) + centerX);\n positions.push((currentHeight) + centerY);\n positions.push((currentRadius * z) + centerZ);\n }\n }\n\n // create faces\n for (h = 0; h < heightSegments; h++) {\n for (i = 0; i <= radialSegments; i++) {\n\n first = h * (radialSegments + 1) + i;\n second = first + radialSegments;\n\n indices.push(first);\n indices.push(second);\n indices.push(second + 1);\n\n indices.push(first);\n indices.push(second + 1);\n indices.push(first + 1);\n }\n }\n\n // create top cap\n if (!openEnded && radiusTop > 0) {\n startIndex = (positions.length / 3);\n\n // top center\n normals.push(0.0);\n normals.push(1.0);\n normals.push(0.0);\n\n uvs.push(0.5);\n uvs.push(0.5);\n\n positions.push(0 + centerX);\n positions.push(heightHalf + centerY);\n positions.push(0 + centerZ);\n\n // top triangle fan\n for (i = 0; i <= radialSegments; i++) {\n x = Math.sin(i * radialAngle);\n z = Math.cos(i * radialAngle);\n tu = (0.5 * Math.sin(i * radialAngle)) + 0.5;\n tv = (0.5 * Math.cos(i * radialAngle)) + 0.5;\n\n normals.push(radiusTop * x);\n normals.push(1.0);\n normals.push(radiusTop * z);\n\n uvs.push(tu);\n uvs.push(tv);\n\n positions.push((radiusTop * x) + centerX);\n positions.push((heightHalf) + centerY);\n positions.push((radiusTop * z) + centerZ);\n }\n\n for (i = 0; i < radialSegments; i++) {\n center = startIndex;\n first = startIndex + 1 + i;\n\n indices.push(first);\n indices.push(first + 1);\n indices.push(center);\n }\n }\n\n // create bottom cap\n if (!openEnded && radiusBottom > 0) {\n\n startIndex = (positions.length / 3);\n\n // top center\n normals.push(0.0);\n normals.push(-1.0);\n normals.push(0.0);\n\n uvs.push(0.5);\n uvs.push(0.5);\n\n positions.push(0 + centerX);\n positions.push(0 - heightHalf + centerY);\n positions.push(0 + centerZ);\n\n // top triangle fan\n for (i = 0; i <= radialSegments; i++) {\n\n x = Math.sin(i * radialAngle);\n z = Math.cos(i * radialAngle);\n\n tu = (0.5 * Math.sin(i * radialAngle)) + 0.5;\n tv = (0.5 * Math.cos(i * radialAngle)) + 0.5;\n\n normals.push(radiusBottom * x);\n normals.push(-1.0);\n normals.push(radiusBottom * z);\n\n uvs.push(tu);\n uvs.push(tv);\n\n positions.push((radiusBottom * x) + centerX);\n positions.push((0 - heightHalf) + centerY);\n positions.push((radiusBottom * z) + centerZ);\n }\n\n for (i = 0; i < radialSegments; i++) {\n\n center = startIndex;\n first = startIndex + 1 + i;\n\n indices.push(center);\n indices.push(first + 1);\n indices.push(first);\n }\n }\n\n return {\n primitiveType: \"triangles\",\n positions: positions,\n normals: normals,\n uv: uvs,\n uvs: uvs,\n indices: indices\n };\n}\n\n\nexport {buildCylinderGeometry};\n","/**\n * @desc Creates grid-shaped geometry arrays..\n *\n * ## Usage\n *\n * In the example below we'll create an {@link XKTModel}, then create an {@link XKTMesh} with a grid-shaped {@link XKTGeometry}.\n *\n * [[Run this example](http://xeokit.github.io/xeokit-sdk/examples/#geometry_builders_buildGridGeometry)]\n *\n * ````javascript\n * const xktModel = new XKTModel();\n *\n * const grid = buildGridGeometry({\n * size: 1000,\n * divisions: 500\n * });\n *\n * const xktGeometry = xktModel.createGeometry({\n * geometryId: \"gridGeometry\",\n * primitiveType: grid.primitiveType, // Will be \"lines\"\n * positions: grid.positions,\n * indices: grid.indices\n * });\n *\n * const xktMesh = xktModel.createMesh({\n * meshId: \"redGridMesh\",\n * geometryId: \"gridGeometry\",\n * position: [-4, -6, -4],\n * scale: [1, 3, 1],\n * rotation: [0, 0, 0],\n * color: [1, 0, 0],\n * opacity: 1\n * });\n *\n * const xktEntity = xktModel.createEntity({\n * entityId: \"redGrid\",\n * meshIds: [\"redGridMesh\"]\n * });\n *\n * xktModel.finalize();\n * ````\n *\n * @function buildGridGeometry\n * @param {*} [cfg] Configs\n * @param {Number} [cfg.size=1] Dimension on the X and Z-axis.\n * @param {Number} [cfg.divisions=1] Number of divisions on X and Z axis..\n * @returns {Object} Geometry arrays for {@link XKTModel#createGeometry} or {@link XKTModel#createMesh}.\n */\nfunction buildGridGeometry(cfg = {}) {\n\n let size = cfg.size || 1;\n if (size < 0) {\n console.error(\"negative size not allowed - will invert\");\n size *= -1;\n }\n\n let divisions = cfg.divisions || 1;\n if (divisions < 0) {\n console.error(\"negative divisions not allowed - will invert\");\n divisions *= -1;\n }\n if (divisions < 1) {\n divisions = 1;\n }\n\n size = size || 10;\n divisions = divisions || 10;\n\n const step = size / divisions;\n const halfSize = size / 2;\n\n const positions = [];\n const indices = [];\n let l = 0;\n\n for (let i = 0, j = 0, k = -halfSize; i <= divisions; i++, k += step) {\n\n positions.push(-halfSize);\n positions.push(0);\n positions.push(k);\n\n positions.push(halfSize);\n positions.push(0);\n positions.push(k);\n\n positions.push(k);\n positions.push(0);\n positions.push(-halfSize);\n\n positions.push(k);\n positions.push(0);\n positions.push(halfSize);\n\n indices.push(l++);\n indices.push(l++);\n indices.push(l++);\n indices.push(l++);\n }\n\n return {\n primitiveType: \"lines\",\n positions: positions,\n indices: indices\n };\n}\n\n\nexport {buildGridGeometry};\n","/**\n * @desc Creates plane-shaped geometry arrays.\n *\n * ## Usage\n *\n * In the example below we'll create an {@link XKTModel}, then create an {@link XKTMesh} with a plane-shaped {@link XKTGeometry}.\n *\n * [[Run this example](http://xeokit.github.io/xeokit-sdk/examples/#geometry_builders_buildPlaneGeometry)]\n *\n * ````javascript\n * const xktModel = new XKTModel();\n *\n * const plane = buildPlaneGeometry({\n * center: [0,0,0],\n * xSize: 2,\n * zSize: 2,\n * xSegments: 10,\n * zSegments: 10\n * });\n *\n * const xktGeometry = xktModel.createGeometry({\n * geometryId: \"planeGeometry\",\n * primitiveType: plane.primitiveType, // Will be \"triangles\"\n * positions: plane.positions,\n * normals: plane.normals,\n * indices: plane.indices\n * });\n *\n * const xktMesh = xktModel.createMesh({\n * meshId: \"redPlaneMesh\",\n * geometryId: \"planeGeometry\",\n * position: [-4, -6, -4],\n * scale: [1, 3, 1],\n * rotation: [0, 0, 0],\n * color: [1, 0, 0],\n * opacity: 1\n * });\n *\n * const xktEntity = xktModel.createEntity({\n * entityId: \"redPlane\",\n * meshIds: [\"redPlaneMesh\"]\n * });\n *\n * xktModel.finalize();\n * ````\n *\n * @function buildPlaneGeometry\n * @param {*} [cfg] Configs\n * @param {Number[]} [cfg.center] 3D point indicating the center position.\n * @param {Number} [cfg.xSize=1] Dimension on the X-axis.\n * @param {Number} [cfg.zSize=1] Dimension on the Z-axis.\n * @param {Number} [cfg.xSegments=1] Number of segments on the X-axis.\n * @param {Number} [cfg.zSegments=1] Number of segments on the Z-axis.\n * @returns {Object} Geometry arrays for {@link XKTModel#createGeometry} or {@link XKTModel#createMesh}.\n */\nfunction buildPlaneGeometry(cfg = {}) {\n\n let xSize = cfg.xSize || 1;\n if (xSize < 0) {\n console.error(\"negative xSize not allowed - will invert\");\n xSize *= -1;\n }\n\n let zSize = cfg.zSize || 1;\n if (zSize < 0) {\n console.error(\"negative zSize not allowed - will invert\");\n zSize *= -1;\n }\n\n let xSegments = cfg.xSegments || 1;\n if (xSegments < 0) {\n console.error(\"negative xSegments not allowed - will invert\");\n xSegments *= -1;\n }\n if (xSegments < 1) {\n xSegments = 1;\n }\n\n let zSegments = cfg.xSegments || 1;\n if (zSegments < 0) {\n console.error(\"negative zSegments not allowed - will invert\");\n zSegments *= -1;\n }\n if (zSegments < 1) {\n zSegments = 1;\n }\n\n const center = cfg.center;\n const centerX = center ? center[0] : 0;\n const centerY = center ? center[1] : 0;\n const centerZ = center ? center[2] : 0;\n\n const halfWidth = xSize / 2;\n const halfHeight = zSize / 2;\n\n const planeX = Math.floor(xSegments) || 1;\n const planeZ = Math.floor(zSegments) || 1;\n\n const planeX1 = planeX + 1;\n const planeZ1 = planeZ + 1;\n\n const segmentWidth = xSize / planeX;\n const segmentHeight = zSize / planeZ;\n\n const positions = new Float32Array(planeX1 * planeZ1 * 3);\n const normals = new Float32Array(planeX1 * planeZ1 * 3);\n const uvs = new Float32Array(planeX1 * planeZ1 * 2);\n\n let offset = 0;\n let offset2 = 0;\n\n let iz;\n let ix;\n let x;\n let a;\n let b;\n let c;\n let d;\n\n for (iz = 0; iz < planeZ1; iz++) {\n\n const z = iz * segmentHeight - halfHeight;\n\n for (ix = 0; ix < planeX1; ix++) {\n\n x = ix * segmentWidth - halfWidth;\n\n positions[offset] = x + centerX;\n positions[offset + 1] = centerY;\n positions[offset + 2] = -z + centerZ;\n\n normals[offset + 2] = -1;\n\n uvs[offset2] = (ix) / planeX;\n uvs[offset2 + 1] = ((planeZ - iz) / planeZ);\n\n offset += 3;\n offset2 += 2;\n }\n }\n\n offset = 0;\n\n const indices = new ((positions.length / 3) > 65535 ? Uint32Array : Uint16Array)(planeX * planeZ * 6);\n\n for (iz = 0; iz < planeZ; iz++) {\n\n for (ix = 0; ix < planeX; ix++) {\n\n a = ix + planeX1 * iz;\n b = ix + planeX1 * (iz + 1);\n c = (ix + 1) + planeX1 * (iz + 1);\n d = (ix + 1) + planeX1 * iz;\n\n indices[offset] = d;\n indices[offset + 1] = b;\n indices[offset + 2] = a;\n\n indices[offset + 3] = d;\n indices[offset + 4] = c;\n indices[offset + 5] = b;\n\n offset += 6;\n }\n }\n\n return {\n primitiveType: \"triangles\",\n positions: positions,\n normals: normals,\n uv: uvs,\n uvs: uvs,\n indices: indices\n };\n}\n\nexport {buildPlaneGeometry};\n","/**\n * @desc Creates sphere-shaped geometry arrays.\n *\n * ## Usage\n *\n * In the example below we'll create an {@link XKTModel}, then create an {@link XKTMesh} with a sphere-shaped {@link XKTGeometry}.\n *\n * [[Run this example](http://xeokit.github.io/xeokit-sdk/examples/#geometry_builders_buildSphereGeometry)]\n *\n * ````javascript\n * const xktModel = new XKTModel();\n *\n * const sphere = buildSphereGeometry({\n * center: [0,0,0],\n * radius: 1.5,\n * heightSegments: 60,\n * widthSegments: 60\n * });\n *\n * const xktGeometry = xktModel.createGeometry({\n * geometryId: \"sphereGeometry\",\n * primitiveType: sphere.primitiveType, // Will be \"triangles\"\n * positions: sphere.positions,\n * normals: sphere.normals,\n * indices: sphere.indices\n * });\n *\n * const xktMesh = xktModel.createMesh({\n * meshId: \"redSphereMesh\",\n * geometryId: \"sphereGeometry\",\n * position: [-4, -6, -4],\n * scale: [1, 3, 1],\n * rotation: [0, 0, 0],\n * color: [1, 0, 0],\n * opacity: 1\n * });\n *\n *const xktEntity = xktModel.createEntity({\n * entityId: \"redSphere\",\n * meshIds: [\"redSphereMesh\"]\n * });\n *\n * xktModel.finalize();\n * ````\n *\n * @function buildSphereGeometry\n * @param {*} [cfg] Configs\n * @param {Number[]} [cfg.center] 3D point indicating the center position.\n * @param {Number} [cfg.radius=1] Radius.\n * @param {Number} [cfg.heightSegments=24] Number of latitudinal bands.\n * @param {Number} [cfg.widthSegments=18] Number of longitudinal bands.\n * @returns {Object} Geometry arrays for {@link XKTModel#createGeometry} or {@link XKTModel#createMesh}.\n */\nfunction buildSphereGeometry(cfg = {}) {\n\n const lod = cfg.lod || 1;\n\n const centerX = cfg.center ? cfg.center[0] : 0;\n const centerY = cfg.center ? cfg.center[1] : 0;\n const centerZ = cfg.center ? cfg.center[2] : 0;\n\n let radius = cfg.radius || 1;\n if (radius < 0) {\n console.error(\"negative radius not allowed - will invert\");\n radius *= -1;\n }\n\n let heightSegments = cfg.heightSegments || 18;\n if (heightSegments < 0) {\n console.error(\"negative heightSegments not allowed - will invert\");\n heightSegments *= -1;\n }\n heightSegments = Math.floor(lod * heightSegments);\n if (heightSegments < 18) {\n heightSegments = 18;\n }\n\n let widthSegments = cfg.widthSegments || 18;\n if (widthSegments < 0) {\n console.error(\"negative widthSegments not allowed - will invert\");\n widthSegments *= -1;\n }\n widthSegments = Math.floor(lod * widthSegments);\n if (widthSegments < 18) {\n widthSegments = 18;\n }\n\n const positions = [];\n const normals = [];\n const uvs = [];\n const indices = [];\n\n let i;\n let j;\n\n let theta;\n let sinTheta;\n let cosTheta;\n\n let phi;\n let sinPhi;\n let cosPhi;\n\n let x;\n let y;\n let z;\n\n let u;\n let v;\n\n let first;\n let second;\n\n for (i = 0; i <= heightSegments; i++) {\n\n theta = i * Math.PI / heightSegments;\n sinTheta = Math.sin(theta);\n cosTheta = Math.cos(theta);\n\n for (j = 0; j <= widthSegments; j++) {\n\n phi = j * 2 * Math.PI / widthSegments;\n sinPhi = Math.sin(phi);\n cosPhi = Math.cos(phi);\n\n x = cosPhi * sinTheta;\n y = cosTheta;\n z = sinPhi * sinTheta;\n u = 1.0 - j / widthSegments;\n v = i / heightSegments;\n\n normals.push(x);\n normals.push(y);\n normals.push(z);\n\n uvs.push(u);\n uvs.push(v);\n\n positions.push(centerX + radius * x);\n positions.push(centerY + radius * y);\n positions.push(centerZ + radius * z);\n }\n }\n\n for (i = 0; i < heightSegments; i++) {\n for (j = 0; j < widthSegments; j++) {\n\n first = (i * (widthSegments + 1)) + j;\n second = first + widthSegments + 1;\n\n indices.push(first + 1);\n indices.push(second + 1);\n indices.push(second);\n indices.push(first + 1);\n indices.push(second);\n indices.push(first);\n }\n }\n\n return {\n primitiveType: \"triangles\",\n positions: positions,\n normals: normals,\n uv: uvs,\n uvs: uvs,\n indices: indices\n };\n}\n\nexport {buildSphereGeometry};\n","import {math} from '../lib/math.js';\n\n/**\n * @desc Creates torus-shaped geometry arrays.\n *\n * ## Usage\n *\n * In the example below we'll create an {@link XKTModel}, then create an {@link XKTMesh} with a torus-shaped {@link XKTGeometry}.\n *\n * [[Run this example](http://xeokit.github.io/xeokit-sdk/examples/#geometry_builders_buildTorusGeometry)]\n *\n * ````javascript\n * const xktModel = new XKTModel();\n *\n * const torus = buildTorusGeometry({\n * center: [0,0,0],\n * radius: 1.0,\n * tube: 0.5,\n * radialSegments: 32,\n * tubeSegments: 24,\n * arc: Math.PI * 2.0\n * });\n *\n * const xktGeometry = xktModel.createGeometry({\n * geometryId: \"torusGeometry\",\n * primitiveType: torus.primitiveType, // Will be \"triangles\"\n * positions: torus.positions,\n * normals: torus.normals,\n * indices: torus.indices\n * });\n *\n * const xktMesh = xktModel.createMesh({\n * meshId: \"redTorusMesh\",\n * geometryId: \"torusGeometry\",\n * position: [-4, -6, -4],\n * scale: [1, 3, 1],\n * rotation: [0, 0, 0],\n * color: [1, 0, 0],\n * opacity: 1\n * });\n *\n * const xktEntity = xktModel.createEntity({\n * entityId: \"redTorus\",\n * meshIds: [\"redTorusMesh\"]\n * });\n *\n * xktModel.finalize();\n * ````\n *\n * @function buildTorusGeometry\n * @param {*} [cfg] Configs\n * @param {Number[]} [cfg.center] 3D point indicating the center position.\n * @param {Number} [cfg.radius=1] The overall radius.\n * @param {Number} [cfg.tube=0.3] The tube radius.\n * @param {Number} [cfg.radialSegments=32] The number of radial segments.\n * @param {Number} [cfg.tubeSegments=24] The number of tubular segments.\n * @param {Number} [cfg.arc=Math.PI*0.5] The length of the arc in radians, where Math.PI*2 is a closed torus.\n * @returns {Object} Geometry arrays for {@link XKTModel#createGeometry} or {@link XKTModel#createMesh}.\n */\nfunction buildTorusGeometry(cfg = {}) {\n\n let radius = cfg.radius || 1;\n if (radius < 0) {\n console.error(\"negative radius not allowed - will invert\");\n radius *= -1;\n }\n radius *= 0.5;\n\n let tube = cfg.tube || 0.3;\n if (tube < 0) {\n console.error(\"negative tube not allowed - will invert\");\n tube *= -1;\n }\n\n let radialSegments = cfg.radialSegments || 32;\n if (radialSegments < 0) {\n console.error(\"negative radialSegments not allowed - will invert\");\n radialSegments *= -1;\n }\n if (radialSegments < 4) {\n radialSegments = 4;\n }\n\n let tubeSegments = cfg.tubeSegments || 24;\n if (tubeSegments < 0) {\n console.error(\"negative tubeSegments not allowed - will invert\");\n tubeSegments *= -1;\n }\n if (tubeSegments < 4) {\n tubeSegments = 4;\n }\n\n let arc = cfg.arc || Math.PI * 2;\n if (arc < 0) {\n console.warn(\"negative arc not allowed - will invert\");\n arc *= -1;\n }\n if (arc > 360) {\n arc = 360;\n }\n\n const center = cfg.center;\n let centerX = center ? center[0] : 0;\n let centerY = center ? center[1] : 0;\n const centerZ = center ? center[2] : 0;\n\n const positions = [];\n const normals = [];\n const uvs = [];\n const indices = [];\n\n let u;\n let v;\n let x;\n let y;\n let z;\n let vec;\n\n let i;\n let j;\n\n for (j = 0; j <= tubeSegments; j++) {\n for (i = 0; i <= radialSegments; i++) {\n\n u = i / radialSegments * arc;\n v = 0.785398 + (j / tubeSegments * Math.PI * 2);\n\n centerX = radius * Math.cos(u);\n centerY = radius * Math.sin(u);\n\n x = (radius + tube * Math.cos(v)) * Math.cos(u);\n y = (radius + tube * Math.cos(v)) * Math.sin(u);\n z = tube * Math.sin(v);\n\n positions.push(x + centerX);\n positions.push(y + centerY);\n positions.push(z + centerZ);\n\n uvs.push(1 - (i / radialSegments));\n uvs.push((j / tubeSegments));\n\n vec = math.normalizeVec3(math.subVec3([x, y, z], [centerX, centerY, centerZ], []), []);\n\n normals.push(vec[0]);\n normals.push(vec[1]);\n normals.push(vec[2]);\n }\n }\n\n let a;\n let b;\n let c;\n let d;\n\n for (j = 1; j <= tubeSegments; j++) {\n for (i = 1; i <= radialSegments; i++) {\n\n a = (radialSegments + 1) * j + i - 1;\n b = (radialSegments + 1) * (j - 1) + i - 1;\n c = (radialSegments + 1) * (j - 1) + i;\n d = (radialSegments + 1) * j + i;\n\n indices.push(a);\n indices.push(b);\n indices.push(c);\n\n indices.push(c);\n indices.push(d);\n indices.push(a);\n }\n }\n\n return {\n primitiveType: \"triangles\",\n positions: positions,\n normals: normals,\n uv: uvs,\n uvs: uvs,\n indices: indices\n };\n}\n\nexport {buildTorusGeometry};\n","const letters = {\n ' ': {width: 16, points: []},\n '!': {\n width: 10, points: [\n [5, 21],\n [5, 7],\n [-1, -1],\n [5, 2],\n [4, 1],\n [5, 0],\n [6, 1],\n [5, 2]\n ]\n },\n '\"': {\n width: 16, points: [\n [4, 21],\n [4, 14],\n [-1, -1],\n [12, 21],\n [12, 14]\n ]\n },\n '#': {\n width: 21, points: [\n [11, 25],\n [4, -7],\n [-1, -1],\n [17, 25],\n [10, -7],\n [-1, -1],\n [4, 12],\n [18, 12],\n [-1, -1],\n [3, 6],\n [17, 6]\n ]\n },\n '$': {\n width: 20, points: [\n [8, 25],\n [8, -4],\n [-1, -1],\n [12, 25],\n [12, -4],\n [-1, -1],\n [17, 18],\n [15, 20],\n [12, 21],\n [8, 21],\n [5, 20],\n [3, 18],\n [3, 16],\n [4, 14],\n [5, 13],\n [7, 12],\n [13, 10],\n [15, 9],\n [16, 8],\n [17, 6],\n [17, 3],\n [15, 1],\n [12, 0],\n [8, 0],\n [5, 1],\n [3, 3]\n ]\n },\n '%': {\n width: 24, points: [\n [21, 21],\n [3, 0],\n [-1, -1],\n [8, 21],\n [10, 19],\n [10, 17],\n [9, 15],\n [7, 14],\n [5, 14],\n [3, 16],\n [3, 18],\n [4, 20],\n [6, 21],\n [8, 21],\n [10, 20],\n [13, 19],\n [16, 19],\n [19, 20],\n [21, 21],\n [-1, -1],\n [17, 7],\n [15, 6],\n [14, 4],\n [14, 2],\n [16, 0],\n [18, 0],\n [20, 1],\n [21, 3],\n [21, 5],\n [19, 7],\n [17, 7]\n ]\n },\n '&': {\n width: 26, points: [\n [23, 12],\n [23, 13],\n [22, 14],\n [21, 14],\n [20, 13],\n [19, 11],\n [17, 6],\n [15, 3],\n [13, 1],\n [11, 0],\n [7, 0],\n [5, 1],\n [4, 2],\n [3, 4],\n [3, 6],\n [4, 8],\n [5, 9],\n [12, 13],\n [13, 14],\n [14, 16],\n [14, 18],\n [13, 20],\n [11, 21],\n [9, 20],\n [8, 18],\n [8, 16],\n [9, 13],\n [11, 10],\n [16, 3],\n [18, 1],\n [20, 0],\n [22, 0],\n [23, 1],\n [23, 2]\n ]\n },\n '\\'': {\n width: 10, points: [\n [5, 19],\n [4, 20],\n [5, 21],\n [6, 20],\n [6, 18],\n [5, 16],\n [4, 15]\n ]\n },\n '(': {\n width: 14, points: [\n [11, 25],\n [9, 23],\n [7, 20],\n [5, 16],\n [4, 11],\n [4, 7],\n [5, 2],\n [7, -2],\n [9, -5],\n [11, -7]\n ]\n },\n ')': {\n width: 14, points: [\n [3, 25],\n [5, 23],\n [7, 20],\n [9, 16],\n [10, 11],\n [10, 7],\n [9, 2],\n [7, -2],\n [5, -5],\n [3, -7]\n ]\n },\n '*': {\n width: 16, points: [\n [8, 21],\n [8, 9],\n [-1, -1],\n [3, 18],\n [13, 12],\n [-1, -1],\n [13, 18],\n [3, 12]\n ]\n },\n '+': {\n width: 26, points: [\n [13, 18],\n [13, 0],\n [-1, -1],\n [4, 9],\n [22, 9]\n ]\n },\n ',': {\n width: 10, points: [\n [6, 1],\n [5, 0],\n [4, 1],\n [5, 2],\n [6, 1],\n [6, -1],\n [5, -3],\n [4, -4]\n ]\n },\n '-': {\n width: 26, points: [\n [4, 9],\n [22, 9]\n ]\n },\n '.': {\n width: 10, points: [\n [5, 2],\n [4, 1],\n [5, 0],\n [6, 1],\n [5, 2]\n ]\n },\n '/': {\n width: 22, points: [\n [20, 25],\n [2, -7]\n ]\n },\n '0': {\n width: 20, points: [\n [9, 21],\n [6, 20],\n [4, 17],\n [3, 12],\n [3, 9],\n [4, 4],\n [6, 1],\n [9, 0],\n [11, 0],\n [14, 1],\n [16, 4],\n [17, 9],\n [17, 12],\n [16, 17],\n [14, 20],\n [11, 21],\n [9, 21]\n ]\n },\n '1': {\n width: 20, points: [\n [6, 17],\n [8, 18],\n [11, 21],\n [11, 0]\n ]\n },\n '2': {\n width: 20, points: [\n [4, 16],\n [4, 17],\n [5, 19],\n [6, 20],\n [8, 21],\n [12, 21],\n [14, 20],\n [15, 19],\n [16, 17],\n [16, 15],\n [15, 13],\n [13, 10],\n [3, 0],\n [17, 0]\n ]\n },\n '3': {\n width: 20, points: [\n [5, 21],\n [16, 21],\n [10, 13],\n [13, 13],\n [15, 12],\n [16, 11],\n [17, 8],\n [17, 6],\n [16, 3],\n [14, 1],\n [11, 0],\n [8, 0],\n [5, 1],\n [4, 2],\n [3, 4]\n ]\n },\n '4': {\n width: 20, points: [\n [13, 21],\n [3, 7],\n [18, 7],\n [-1, -1],\n [13, 21],\n [13, 0]\n ]\n },\n '5': {\n width: 20, points: [\n [15, 21],\n [5, 21],\n [4, 12],\n [5, 13],\n [8, 14],\n [11, 14],\n [14, 13],\n [16, 11],\n [17, 8],\n [17, 6],\n [16, 3],\n [14, 1],\n [11, 0],\n [8, 0],\n [5, 1],\n [4, 2],\n [3, 4]\n ]\n },\n '6': {\n width: 20, points: [\n [16, 18],\n [15, 20],\n [12, 21],\n [10, 21],\n [7, 20],\n [5, 17],\n [4, 12],\n [4, 7],\n [5, 3],\n [7, 1],\n [10, 0],\n [11, 0],\n [14, 1],\n [16, 3],\n [17, 6],\n [17, 7],\n [16, 10],\n [14, 12],\n [11, 13],\n [10, 13],\n [7, 12],\n [5, 10],\n [4, 7]\n ]\n },\n '7': {\n width: 20, points: [\n [17, 21],\n [7, 0],\n [-1, -1],\n [3, 21],\n [17, 21]\n ]\n },\n '8': {\n width: 20, points: [\n [8, 21],\n [5, 20],\n [4, 18],\n [4, 16],\n [5, 14],\n [7, 13],\n [11, 12],\n [14, 11],\n [16, 9],\n [17, 7],\n [17, 4],\n [16, 2],\n [15, 1],\n [12, 0],\n [8, 0],\n [5, 1],\n [4, 2],\n [3, 4],\n [3, 7],\n [4, 9],\n [6, 11],\n [9, 12],\n [13, 13],\n [15, 14],\n [16, 16],\n [16, 18],\n [15, 20],\n [12, 21],\n [8, 21]\n ]\n },\n '9': {\n width: 20, points: [\n [16, 14],\n [15, 11],\n [13, 9],\n [10, 8],\n [9, 8],\n [6, 9],\n [4, 11],\n [3, 14],\n [3, 15],\n [4, 18],\n [6, 20],\n [9, 21],\n [10, 21],\n [13, 20],\n [15, 18],\n [16, 14],\n [16, 9],\n [15, 4],\n [13, 1],\n [10, 0],\n [8, 0],\n [5, 1],\n [4, 3]\n ]\n },\n ':': {\n width: 10, points: [\n [5, 14],\n [4, 13],\n [5, 12],\n [6, 13],\n [5, 14],\n [-1, -1],\n [5, 2],\n [4, 1],\n [5, 0],\n [6, 1],\n [5, 2]\n ]\n },\n ';': {\n width: 10, points: [\n [5, 14],\n [4, 13],\n [5, 12],\n [6, 13],\n [5, 14],\n [-1, -1],\n [6, 1],\n [5, 0],\n [4, 1],\n [5, 2],\n [6, 1],\n [6, -1],\n [5, -3],\n [4, -4]\n ]\n },\n '<': {\n width: 24, points: [\n [20, 18],\n [4, 9],\n [20, 0]\n ]\n },\n '=': {\n width: 26, points: [\n [4, 12],\n [22, 12],\n [-1, -1],\n [4, 6],\n [22, 6]\n ]\n },\n '>': {\n width: 24, points: [\n [4, 18],\n [20, 9],\n [4, 0]\n ]\n },\n '?': {\n width: 18, points: [\n [3, 16],\n [3, 17],\n [4, 19],\n [5, 20],\n [7, 21],\n [11, 21],\n [13, 20],\n [14, 19],\n [15, 17],\n [15, 15],\n [14, 13],\n [13, 12],\n [9, 10],\n [9, 7],\n [-1, -1],\n [9, 2],\n [8, 1],\n [9, 0],\n [10, 1],\n [9, 2]\n ]\n },\n '@': {\n width: 27, points: [\n [18, 13],\n [17, 15],\n [15, 16],\n [12, 16],\n [10, 15],\n [9, 14],\n [8, 11],\n [8, 8],\n [9, 6],\n [11, 5],\n [14, 5],\n [16, 6],\n [17, 8],\n [-1, -1],\n [12, 16],\n [10, 14],\n [9, 11],\n [9, 8],\n [10, 6],\n [11, 5],\n [-1, -1],\n [18, 16],\n [17, 8],\n [17, 6],\n [19, 5],\n [21, 5],\n [23, 7],\n [24, 10],\n [24, 12],\n [23, 15],\n [22, 17],\n [20, 19],\n [18, 20],\n [15, 21],\n [12, 21],\n [9, 20],\n [7, 19],\n [5, 17],\n [4, 15],\n [3, 12],\n [3, 9],\n [4, 6],\n [5, 4],\n [7, 2],\n [9, 1],\n [12, 0],\n [15, 0],\n [18, 1],\n [20, 2],\n [21, 3],\n [-1, -1],\n [19, 16],\n [18, 8],\n [18, 6],\n [19, 5]\n ]\n },\n 'A': {\n width: 18, points: [\n [9, 21],\n [1, 0],\n [-1, -1],\n [9, 21],\n [17, 0],\n [-1, -1],\n [4, 7],\n [14, 7]\n ]\n },\n 'B': {\n width: 21, points: [\n [4, 21],\n [4, 0],\n [-1, -1],\n [4, 21],\n [13, 21],\n [16, 20],\n [17, 19],\n [18, 17],\n [18, 15],\n [17, 13],\n [16, 12],\n [13, 11],\n [-1, -1],\n [4, 11],\n [13, 11],\n [16, 10],\n [17, 9],\n [18, 7],\n [18, 4],\n [17, 2],\n [16, 1],\n [13, 0],\n [4, 0]\n ]\n },\n 'C': {\n width: 21, points: [\n [18, 16],\n [17, 18],\n [15, 20],\n [13, 21],\n [9, 21],\n [7, 20],\n [5, 18],\n [4, 16],\n [3, 13],\n [3, 8],\n [4, 5],\n [5, 3],\n [7, 1],\n [9, 0],\n [13, 0],\n [15, 1],\n [17, 3],\n [18, 5]\n ]\n },\n 'D': {\n width: 21, points: [\n [4, 21],\n [4, 0],\n [-1, -1],\n [4, 21],\n [11, 21],\n [14, 20],\n [16, 18],\n [17, 16],\n [18, 13],\n [18, 8],\n [17, 5],\n [16, 3],\n [14, 1],\n [11, 0],\n [4, 0]\n ]\n },\n 'E': {\n width: 19, points: [\n [4, 21],\n [4, 0],\n [-1, -1],\n [4, 21],\n [17, 21],\n [-1, -1],\n [4, 11],\n [12, 11],\n [-1, -1],\n [4, 0],\n [17, 0]\n ]\n },\n 'F': {\n width: 18, points: [\n [4, 21],\n [4, 0],\n [-1, -1],\n [4, 21],\n [17, 21],\n [-1, -1],\n [4, 11],\n [12, 11]\n ]\n },\n 'G': {\n width: 21, points: [\n [18, 16],\n [17, 18],\n [15, 20],\n [13, 21],\n [9, 21],\n [7, 20],\n [5, 18],\n [4, 16],\n [3, 13],\n [3, 8],\n [4, 5],\n [5, 3],\n [7, 1],\n [9, 0],\n [13, 0],\n [15, 1],\n [17, 3],\n [18, 5],\n [18, 8],\n [-1, -1],\n [13, 8],\n [18, 8]\n ]\n },\n 'H': {\n width: 22, points: [\n [4, 21],\n [4, 0],\n [-1, -1],\n [18, 21],\n [18, 0],\n [-1, -1],\n [4, 11],\n [18, 11]\n ]\n },\n 'I': {\n width: 8, points: [\n [4, 21],\n [4, 0]\n ]\n },\n 'J': {\n width: 16, points: [\n [12, 21],\n [12, 5],\n [11, 2],\n [10, 1],\n [8, 0],\n [6, 0],\n [4, 1],\n [3, 2],\n [2, 5],\n [2, 7]\n ]\n },\n 'K': {\n width: 21, points: [\n [4, 21],\n [4, 0],\n [-1, -1],\n [18, 21],\n [4, 7],\n [-1, -1],\n [9, 12],\n [18, 0]\n ]\n },\n 'L': {\n width: 17, points: [\n [4, 21],\n [4, 0],\n [-1, -1],\n [4, 0],\n [16, 0]\n ]\n },\n 'M': {\n width: 24, points: [\n [4, 21],\n [4, 0],\n [-1, -1],\n [4, 21],\n [12, 0],\n [-1, -1],\n [20, 21],\n [12, 0],\n [-1, -1],\n [20, 21],\n [20, 0]\n ]\n },\n 'N': {\n width: 22, points: [\n [4, 21],\n [4, 0],\n [-1, -1],\n [4, 21],\n [18, 0],\n [-1, -1],\n [18, 21],\n [18, 0]\n ]\n },\n 'O': {\n width: 22, points: [\n [9, 21],\n [7, 20],\n [5, 18],\n [4, 16],\n [3, 13],\n [3, 8],\n [4, 5],\n [5, 3],\n [7, 1],\n [9, 0],\n [13, 0],\n [15, 1],\n [17, 3],\n [18, 5],\n [19, 8],\n [19, 13],\n [18, 16],\n [17, 18],\n [15, 20],\n [13, 21],\n [9, 21]\n ]\n },\n 'P': {\n width: 21, points: [\n [4, 21],\n [4, 0],\n [-1, -1],\n [4, 21],\n [13, 21],\n [16, 20],\n [17, 19],\n [18, 17],\n [18, 14],\n [17, 12],\n [16, 11],\n [13, 10],\n [4, 10]\n ]\n },\n 'Q': {\n width: 22, points: [\n [9, 21],\n [7, 20],\n [5, 18],\n [4, 16],\n [3, 13],\n [3, 8],\n [4, 5],\n [5, 3],\n [7, 1],\n [9, 0],\n [13, 0],\n [15, 1],\n [17, 3],\n [18, 5],\n [19, 8],\n [19, 13],\n [18, 16],\n [17, 18],\n [15, 20],\n [13, 21],\n [9, 21],\n [-1, -1],\n [12, 4],\n [18, -2]\n ]\n },\n 'R': {\n width: 21, points: [\n [4, 21],\n [4, 0],\n [-1, -1],\n [4, 21],\n [13, 21],\n [16, 20],\n [17, 19],\n [18, 17],\n [18, 15],\n [17, 13],\n [16, 12],\n [13, 11],\n [4, 11],\n [-1, -1],\n [11, 11],\n [18, 0]\n ]\n },\n 'S': {\n width: 20, points: [\n [17, 18],\n [15, 20],\n [12, 21],\n [8, 21],\n [5, 20],\n [3, 18],\n [3, 16],\n [4, 14],\n [5, 13],\n [7, 12],\n [13, 10],\n [15, 9],\n [16, 8],\n [17, 6],\n [17, 3],\n [15, 1],\n [12, 0],\n [8, 0],\n [5, 1],\n [3, 3]\n ]\n },\n 'T': {\n width: 16, points: [\n [8, 21],\n [8, 0],\n [-1, -1],\n [1, 21],\n [15, 21]\n ]\n },\n 'U': {\n width: 22, points: [\n [4, 21],\n [4, 6],\n [5, 3],\n [7, 1],\n [10, 0],\n [12, 0],\n [15, 1],\n [17, 3],\n [18, 6],\n [18, 21]\n ]\n },\n 'V': {\n width: 18, points: [\n [1, 21],\n [9, 0],\n [-1, -1],\n [17, 21],\n [9, 0]\n ]\n },\n 'W': {\n width: 24, points: [\n [2, 21],\n [7, 0],\n [-1, -1],\n [12, 21],\n [7, 0],\n [-1, -1],\n [12, 21],\n [17, 0],\n [-1, -1],\n [22, 21],\n [17, 0]\n ]\n },\n 'X': {\n width: 20, points: [\n [3, 21],\n [17, 0],\n [-1, -1],\n [17, 21],\n [3, 0]\n ]\n },\n 'Y': {\n width: 18, points: [\n [1, 21],\n [9, 11],\n [9, 0],\n [-1, -1],\n [17, 21],\n [9, 11]\n ]\n },\n 'Z': {\n width: 20, points: [\n [17, 21],\n [3, 0],\n [-1, -1],\n [3, 21],\n [17, 21],\n [-1, -1],\n [3, 0],\n [17, 0]\n ]\n },\n '[': {\n width: 14, points: [\n [4, 25],\n [4, -7],\n [-1, -1],\n [5, 25],\n [5, -7],\n [-1, -1],\n [4, 25],\n [11, 25],\n [-1, -1],\n [4, -7],\n [11, -7]\n ]\n },\n '\\\\': {\n width: 14, points: [\n [0, 21],\n [14, -3]\n ]\n },\n ']': {\n width: 14, points: [\n [9, 25],\n [9, -7],\n [-1, -1],\n [10, 25],\n [10, -7],\n [-1, -1],\n [3, 25],\n [10, 25],\n [-1, -1],\n [3, -7],\n [10, -7]\n ]\n },\n '^': {\n width: 16, points: [\n [6, 15],\n [8, 18],\n [10, 15],\n [-1, -1],\n [3, 12],\n [8, 17],\n [13, 12],\n [-1, -1],\n [8, 17],\n [8, 0]\n ]\n },\n '_': {\n width: 16, points: [\n [0, -2],\n [16, -2]\n ]\n },\n '`': {\n width: 10, points: [\n [6, 21],\n [5, 20],\n [4, 18],\n [4, 16],\n [5, 15],\n [6, 16],\n [5, 17]\n ]\n },\n 'a': {\n width: 19, points: [\n [15, 14],\n [15, 0],\n [-1, -1],\n [15, 11],\n [13, 13],\n [11, 14],\n [8, 14],\n [6, 13],\n [4, 11],\n [3, 8],\n [3, 6],\n [4, 3],\n [6, 1],\n [8, 0],\n [11, 0],\n [13, 1],\n [15, 3]\n ]\n },\n 'b': {\n width: 19, points: [\n [4, 21],\n [4, 0],\n [-1, -1],\n [4, 11],\n [6, 13],\n [8, 14],\n [11, 14],\n [13, 13],\n [15, 11],\n [16, 8],\n [16, 6],\n [15, 3],\n [13, 1],\n [11, 0],\n [8, 0],\n [6, 1],\n [4, 3]\n ]\n },\n 'c': {\n width: 18, points: [\n [15, 11],\n [13, 13],\n [11, 14],\n [8, 14],\n [6, 13],\n [4, 11],\n [3, 8],\n [3, 6],\n [4, 3],\n [6, 1],\n [8, 0],\n [11, 0],\n [13, 1],\n [15, 3]\n ]\n },\n 'd': {\n width: 19, points: [\n [15, 21],\n [15, 0],\n [-1, -1],\n [15, 11],\n [13, 13],\n [11, 14],\n [8, 14],\n [6, 13],\n [4, 11],\n [3, 8],\n [3, 6],\n [4, 3],\n [6, 1],\n [8, 0],\n [11, 0],\n [13, 1],\n [15, 3]\n ]\n },\n 'e': {\n width: 18, points: [\n [3, 8],\n [15, 8],\n [15, 10],\n [14, 12],\n [13, 13],\n [11, 14],\n [8, 14],\n [6, 13],\n [4, 11],\n [3, 8],\n [3, 6],\n [4, 3],\n [6, 1],\n [8, 0],\n [11, 0],\n [13, 1],\n [15, 3]\n ]\n },\n 'f': {\n width: 12, points: [\n [10, 21],\n [8, 21],\n [6, 20],\n [5, 17],\n [5, 0],\n [-1, -1],\n [2, 14],\n [9, 14]\n ]\n },\n 'g': {\n width: 19, points: [\n [15, 14],\n [15, -2],\n [14, -5],\n [13, -6],\n [11, -7],\n [8, -7],\n [6, -6],\n [-1, -1],\n [15, 11],\n [13, 13],\n [11, 14],\n [8, 14],\n [6, 13],\n [4, 11],\n [3, 8],\n [3, 6],\n [4, 3],\n [6, 1],\n [8, 0],\n [11, 0],\n [13, 1],\n [15, 3]\n ]\n },\n 'h': {\n width: 19, points: [\n [4, 21],\n [4, 0],\n [-1, -1],\n [4, 10],\n [7, 13],\n [9, 14],\n [12, 14],\n [14, 13],\n [15, 10],\n [15, 0]\n ]\n },\n 'i': {\n width: 8, points: [\n [3, 21],\n [4, 20],\n [5, 21],\n [4, 22],\n [3, 21],\n [-1, -1],\n [4, 14],\n [4, 0]\n ]\n },\n 'j': {\n width: 10, points: [\n [5, 21],\n [6, 20],\n [7, 21],\n [6, 22],\n [5, 21],\n [-1, -1],\n [6, 14],\n [6, -3],\n [5, -6],\n [3, -7],\n [1, -7]\n ]\n },\n 'k': {\n width: 17, points: [\n [4, 21],\n [4, 0],\n [-1, -1],\n [14, 14],\n [4, 4],\n [-1, -1],\n [8, 8],\n [15, 0]\n ]\n },\n 'l': {\n width: 8, points: [\n [4, 21],\n [4, 0]\n ]\n },\n 'm': {\n width: 30, points: [\n [4, 14],\n [4, 0],\n [-1, -1],\n [4, 10],\n [7, 13],\n [9, 14],\n [12, 14],\n [14, 13],\n [15, 10],\n [15, 0],\n [-1, -1],\n [15, 10],\n [18, 13],\n [20, 14],\n [23, 14],\n [25, 13],\n [26, 10],\n [26, 0]\n ]\n },\n 'n': {\n width: 19, points: [\n [4, 14],\n [4, 0],\n [-1, -1],\n [4, 10],\n [7, 13],\n [9, 14],\n [12, 14],\n [14, 13],\n [15, 10],\n [15, 0]\n ]\n },\n 'o': {\n width: 19, points: [\n [8, 14],\n [6, 13],\n [4, 11],\n [3, 8],\n [3, 6],\n [4, 3],\n [6, 1],\n [8, 0],\n [11, 0],\n [13, 1],\n [15, 3],\n [16, 6],\n [16, 8],\n [15, 11],\n [13, 13],\n [11, 14],\n [8, 14]\n ]\n },\n 'p': {\n width: 19, points: [\n [4, 14],\n [4, -7],\n [-1, -1],\n [4, 11],\n [6, 13],\n [8, 14],\n [11, 14],\n [13, 13],\n [15, 11],\n [16, 8],\n [16, 6],\n [15, 3],\n [13, 1],\n [11, 0],\n [8, 0],\n [6, 1],\n [4, 3]\n ]\n },\n 'q': {\n width: 19, points: [\n [15, 14],\n [15, -7],\n [-1, -1],\n [15, 11],\n [13, 13],\n [11, 14],\n [8, 14],\n [6, 13],\n [4, 11],\n [3, 8],\n [3, 6],\n [4, 3],\n [6, 1],\n [8, 0],\n [11, 0],\n [13, 1],\n [15, 3]\n ]\n },\n 'r': {\n width: 13, points: [\n [4, 14],\n [4, 0],\n [-1, -1],\n [4, 8],\n [5, 11],\n [7, 13],\n [9, 14],\n [12, 14]\n ]\n },\n 's': {\n width: 17, points: [\n [14, 11],\n [13, 13],\n [10, 14],\n [7, 14],\n [4, 13],\n [3, 11],\n [4, 9],\n [6, 8],\n [11, 7],\n [13, 6],\n [14, 4],\n [14, 3],\n [13, 1],\n [10, 0],\n [7, 0],\n [4, 1],\n [3, 3]\n ]\n },\n 't': {\n width: 12, points: [\n [5, 21],\n [5, 4],\n [6, 1],\n [8, 0],\n [10, 0],\n [-1, -1],\n [2, 14],\n [9, 14]\n ]\n },\n 'u': {\n width: 19, points: [\n [4, 14],\n [4, 4],\n [5, 1],\n [7, 0],\n [10, 0],\n [12, 1],\n [15, 4],\n [-1, -1],\n [15, 14],\n [15, 0]\n ]\n },\n 'v': {\n width: 16, points: [\n [2, 14],\n [8, 0],\n [-1, -1],\n [14, 14],\n [8, 0]\n ]\n },\n 'w': {\n width: 22, points: [\n [3, 14],\n [7, 0],\n [-1, -1],\n [11, 14],\n [7, 0],\n [-1, -1],\n [11, 14],\n [15, 0],\n [-1, -1],\n [19, 14],\n [15, 0]\n ]\n },\n 'x': {\n width: 17, points: [\n [3, 14],\n [14, 0],\n [-1, -1],\n [14, 14],\n [3, 0]\n ]\n },\n 'y': {\n width: 16, points: [\n [2, 14],\n [8, 0],\n [-1, -1],\n [14, 14],\n [8, 0],\n [6, -4],\n [4, -6],\n [2, -7],\n [1, -7]\n ]\n },\n 'z': {\n width: 17, points: [\n [14, 14],\n [3, 0],\n [-1, -1],\n [3, 14],\n [14, 14],\n [-1, -1],\n [3, 0],\n [14, 0]\n ]\n },\n '{': {\n width: 14, points: [\n [9, 25],\n [7, 24],\n [6, 23],\n [5, 21],\n [5, 19],\n [6, 17],\n [7, 16],\n [8, 14],\n [8, 12],\n [6, 10],\n [-1, -1],\n [7, 24],\n [6, 22],\n [6, 20],\n [7, 18],\n [8, 17],\n [9, 15],\n [9, 13],\n [8, 11],\n [4, 9],\n [8, 7],\n [9, 5],\n [9, 3],\n [8, 1],\n [7, 0],\n [6, -2],\n [6, -4],\n [7, -6],\n [-1, -1],\n [6, 8],\n [8, 6],\n [8, 4],\n [7, 2],\n [6, 1],\n [5, -1],\n [5, -3],\n [6, -5],\n [7, -6],\n [9, -7]\n ]\n },\n '|': {\n width: 8, points: [\n [4, 25],\n [4, -7]\n ]\n },\n '}': {\n width: 14, points: [\n [5, 25],\n [7, 24],\n [8, 23],\n [9, 21],\n [9, 19],\n [8, 17],\n [7, 16],\n [6, 14],\n [6, 12],\n [8, 10],\n [-1, -1],\n [7, 24],\n [8, 22],\n [8, 20],\n [7, 18],\n [6, 17],\n [5, 15],\n [5, 13],\n [6, 11],\n [10, 9],\n [6, 7],\n [5, 5],\n [5, 3],\n [6, 1],\n [7, 0],\n [8, -2],\n [8, -4],\n [7, -6],\n [-1, -1],\n [8, 8],\n [6, 6],\n [6, 4],\n [7, 2],\n [8, 1],\n [9, -1],\n [9, -3],\n [8, -5],\n [7, -6],\n [5, -7]\n ]\n },\n '~': {\n width: 24, points: [\n [3, 6],\n [3, 8],\n [4, 11],\n [6, 12],\n [8, 12],\n [10, 11],\n [14, 8],\n [16, 7],\n [18, 7],\n [20, 8],\n [21, 10],\n [-1, -1],\n [3, 8],\n [4, 10],\n [6, 11],\n [8, 11],\n [10, 10],\n [14, 7],\n [16, 6],\n [18, 6],\n [20, 7],\n [21, 10],\n [21, 12]\n ]\n }\n};\n\n/**\n * @desc Creates wireframe text-shaped geometry arrays.\n *\n * ## Usage\n *\n * In the example below we'll create an {@link XKTModel}, then create an {@link XKTMesh} with a text-shaped {@link XKTGeometry}.\n *\n * [[Run this example](http://xeokit.github.io/xeokit-sdk/examples/#geometry_builders_buildVectorTextGeometry)]\n *\n * ````javascript\n * const xktModel = new XKTModel();\n *\n * const text = buildVectorTextGeometry({\n * origin: [0,0,0],\n * text: \"On the other side of the screen, it all looked so easy\"\n * });\n *\n * const xktGeometry = xktModel.createGeometry({\n * geometryId: \"textGeometry\",\n * primitiveType: text.primitiveType, // Will be \"lines\"\n * positions: text.positions,\n * indices: text.indices\n * });\n *\n * const xktMesh = xktModel.createMesh({\n * meshId: \"redTextMesh\",\n * geometryId: \"textGeometry\",\n * position: [-4, -6, -4],\n * scale: [1, 3, 1],\n * rotation: [0, 0, 0],\n * color: [1, 0, 0],\n * opacity: 1\n * });\n *\n * const xktEntity = xktModel.createEntity({\n * entityId: \"redText\",\n * meshIds: [\"redTextMesh\"]\n * });\n *\n * xktModel.finalize();\n * ````\n *\n * @function buildVectorTextGeometry\n * @param {*} [cfg] Configs\n * @param {Number[]} [cfg.center] 3D point indicating the center position.\n * @param {Number[]} [cfg.origin] 3D point indicating the top left corner.\n * @param {Number} [cfg.size=1] Size of each character.\n * @param {String} [cfg.text=\"\"] The text.\n * @returns {Object} Geometry arrays for {@link XKTModel#createGeometry} or {@link XKTModel#createMesh}.\n */\nfunction buildVectorTextGeometry(cfg = {}) {\n\n var origin = cfg.origin || [0, 0, 0];\n var xOrigin = origin[0];\n var yOrigin = origin[1];\n var zOrigin = origin[2];\n var size = cfg.size || 1;\n\n var positions = [];\n var indices = [];\n var text = (\"\" + cfg.text).trim();\n var lines = (text || \"\").split(\"\\n\");\n var countVerts = 0;\n var y = 0;\n var x;\n var str;\n var len;\n var c;\n var mag = 1.0 / 25.0;\n var penUp;\n var p1;\n var p2;\n var needLine;\n var pointsLen;\n var a;\n\n for (var iLine = 0; iLine < lines.length; iLine++) {\n\n x = 0;\n str = lines[iLine];\n len = str.length;\n\n for (var i = 0; i < len; i++) {\n\n c = letters[str.charAt(i)];\n\n if (c === '\\n') {\n //alert(\"newline\");\n }\n\n if (!c) {\n continue;\n }\n\n penUp = 1;\n p1 = -1;\n p2 = -1;\n needLine = false;\n\n pointsLen = c.points.length;\n\n for (var j = 0; j < pointsLen; j++) {\n a = c.points[j];\n\n if (a[0] === -1 && a[1] === -1) {\n penUp = 1;\n needLine = false;\n continue;\n }\n\n positions.push((x + (a[0] * size) * mag) + xOrigin);\n positions.push((y + (a[1] * size) * mag) + yOrigin);\n positions.push(0 + zOrigin);\n\n if (p1 === -1) {\n p1 = countVerts;\n } else if (p2 === -1) {\n p2 = countVerts;\n } else {\n p1 = p2;\n p2 = countVerts;\n }\n countVerts++;\n\n if (penUp) {\n penUp = false;\n\n } else {\n indices.push(p1);\n indices.push(p2);\n }\n\n needLine = true;\n }\n x += c.width * mag * size;\n\n }\n y -= 35 * mag * size;\n }\n\n return {\n primitiveType: \"lines\",\n positions: positions,\n indices: indices\n };\n}\n\n\nexport {buildVectorTextGeometry}\n","/**\n * @private\n * @param buf\n * @returns {ArrayBuffer}\n */\nexport function toArrayBuffer(buf) {\n const ab = new ArrayBuffer(buf.length);\n const view = new Uint8Array(ab);\n for (let i = 0; i < buf.length; ++i) {\n view[i] = buf[i];\n }\n return ab;\n}","import {XKT_INFO} from \"./XKT_INFO.js\";\nimport {XKTModel} from \"./XKTModel/XKTModel.js\";\nimport {parseCityJSONIntoXKTModel} from \"./parsers/parseCityJSONIntoXKTModel.js\";\nimport {parseGLTFIntoXKTModel} from \"./parsers/parseGLTFIntoXKTModel.js\";\nimport {parseIFCIntoXKTModel} from \"./parsers/parseIFCIntoXKTModel.js\";\nimport {parseLASIntoXKTModel} from \"./parsers/parseLASIntoXKTModel.js\";\nimport {parsePCDIntoXKTModel} from \"./parsers/parsePCDIntoXKTModel.js\";\nimport {parsePLYIntoXKTModel} from \"./parsers/parsePLYIntoXKTModel.js\";\nimport {parseSTLIntoXKTModel} from \"./parsers/parseSTLIntoXKTModel.js\";\nimport {writeXKTModelToArrayBuffer} from \"./XKTModel/writeXKTModelToArrayBuffer.js\";\n\nimport {toArrayBuffer} from \"./XKTModel/lib/toArraybuffer\";\n\nconst fs = require('fs');\nconst path = require(\"path\");\n\n/**\n * Converts model files into xeokit's native XKT format.\n *\n * Supported source formats are: IFC, CityJSON, glTF, LAZ and LAS.\n *\n * **Only bundled in xeokit-convert.cjs.js.**\n *\n * ## Usage\n *\n * ````javascript\n * const convert2xkt = require(\"@xeokit/xeokit-convert/dist/convert2xkt.cjs.js\");\n * const fs = require('fs');\n *\n * convert2xkt({\n * sourceData: fs.readFileSync(\"rme_advanced_sample_project.ifc\"),\n * outputXKT: (xtkArrayBuffer) => {\n * fs.writeFileSync(\"rme_advanced_sample_project.ifc.xkt\", xtkArrayBuffer);\n * }\n * }).then(() => {\n * console.log(\"Converted.\");\n * }, (errMsg) => {\n * console.error(\"Conversion failed: \" + errMsg)\n * });\n ````\n * @param {Object} params Conversion parameters.\n * @param {Object} params.WebIFC The WebIFC library. We pass this in as an external dependency, in order to give the\n * caller the choice of whether to use the Browser or NodeJS version.\n * @param {*} [params.configs] Configurations.\n * @param {String} [params.source] Path to source file. Alternative to ````sourceData````.\n * @param {ArrayBuffer|JSON} [params.sourceData] Source file data. Alternative to ````source````.\n * @param {String} [params.sourceFormat] Format of source file/data. Always needed with ````sourceData````, but not normally needed with ````source````, because convert2xkt will determine the format automatically from the file extension of ````source````.\n * @param {String} [params.metaModelDataStr] Source file data. Overrides metadata from ````metaModelSource````, ````sourceData```` and ````source````.\n * @param {String} [params.metaModelSource] Path to source metaModel file. Overrides metadata from ````sourceData```` and ````source````. Overridden by ````metaModelData````.\n * @param {String} [params.output] Path to destination XKT file. Directories on this path are automatically created if not existing.\n * @param {Function} [params.outputXKTModel] Callback to collect the ````XKTModel```` that is internally build by this method.\n * @param {Function} [params.outputXKT] Callback to collect XKT file data.\n * @param {String[]} [params.includeTypes] Option to only convert objects of these types.\n * @param {String[]} [params.excludeTypes] Option to never convert objects of these types.\n * @param {Object} [stats] Collects conversion statistics. Statistics are attached to this object if provided.\n * @param {Function} [params.outputStats] Callback to collect statistics.\n * @param {Boolean} [params.rotateX=false] Whether to rotate the model 90 degrees about the X axis to make the Y axis \"up\", if necessary. Applies to CityJSON and LAS/LAZ models.\n * @param {Boolean} [params.reuseGeometries=true] When true, will enable geometry reuse within the XKT. When false,\n * will automatically \"expand\" all reused geometries into duplicate copies. This has the drawback of increasing the XKT\n * file size (~10-30% for typical models), but can make the model more responsive in the xeokit Viewer, especially if the model\n * has excessive geometry reuse. An example of excessive geometry reuse would be when a model (eg. glTF) has 4000 geometries that are\n * shared amongst 2000 objects, ie. a large number of geometries with a low amount of reuse, which can present a\n * pathological performance case for xeokit's underlying graphics APIs (WebGL, WebGPU etc).\n * @param {Boolean} [params.includeTextures=true] Whether to convert textures. Only works for ````glTF```` models.\n * @param {Boolean} [params.includeNormals=true] Whether to convert normals. When false, the parser will ignore\n * geometry normals, and the modelwill rely on the xeokit ````Viewer```` to automatically generate them. This has\n * the limitation that the normals will be face-aligned, and therefore the ````Viewer```` will only be able to render\n * a flat-shaded non-PBR representation of the model.\n * @param {Number} [params.minTileSize=200] Minimum RTC coordinate tile size. Set this to a value between 100 and 10000,\n * depending on how far from the coordinate origin the model's vertex positions are; specify larger tile sizes when close\n * to the origin, and smaller sizes when distant. This compensates for decreasing precision as floats get bigger.\n * @param {Function} [params.log] Logging callback.\n * @return {Promise}\n */\nfunction convert2xkt({\n WebIFC,\n configs,\n source,\n sourceData,\n sourceFormat,\n metaModelSource,\n metaModelDataStr,\n modelAABB,\n output,\n outputXKTModel,\n outputXKT,\n includeTypes,\n excludeTypes,\n reuseGeometries = true,\n minTileSize = 200,\n stats = {},\n outputStats,\n rotateX = false,\n includeTextures = true,\n includeNormals = true,\n log = function (msg) {\n }\n }) {\n\n stats.sourceFormat = \"\";\n stats.schemaVersion = \"\";\n stats.title = \"\";\n stats.author = \"\";\n stats.created = \"\";\n stats.numMetaObjects = 0;\n stats.numPropertySets = 0;\n stats.numTriangles = 0;\n stats.numVertices = 0;\n stats.numNormals = 0;\n stats.numUVs = 0;\n stats.numTextures = 0;\n stats.numTextureSets = 0;\n stats.numObjects = 0;\n stats.numGeometries = 0;\n stats.sourceSize = 0;\n stats.xktSize = 0;\n stats.texturesSize = 0;\n stats.xktVersion = \"\";\n stats.compressionRatio = 0;\n stats.conversionTime = 0;\n stats.aabb = null;\n\n function getFileExtension(fileName) {\n let ext = path.extname(source);\n if (ext.charAt(0) === \".\") {\n ext = ext.substring(1);\n }\n return ext;\n }\n\n return new Promise(function (resolve, reject) {\n const _log = log;\n log = (msg) => {\n _log(`[convert2xkt] ${msg}`)\n }\n\n if (!source && !sourceData) {\n reject(\"Argument expected: source or sourceData\");\n return;\n }\n\n if (!sourceFormat && sourceData) {\n reject(\"Argument expected: sourceFormat is required with sourceData\");\n return;\n }\n\n if (!output && !outputXKTModel && !outputXKT) {\n reject(\"Argument expected: output, outputXKTModel or outputXKT\");\n return;\n }\n\n if (source) {\n log('Reading input file: ' + source);\n }\n\n const startTime = new Date();\n\n const sourceConfigs = configs.sourceConfigs || {};\n const ext = sourceFormat || getFileExtension(source);\n\n log(`Input file extension: \"${ext}\"`);\n\n let fileTypeConfigs = sourceConfigs[ext];\n\n if (!fileTypeConfigs) {\n log(`[WARNING] Could not find configs sourceConfigs entry for source format \"${ext}\". This is derived from the source file name extension. Will use internal default configs.`);\n fileTypeConfigs = {};\n }\n function overrideOption(option1, option2) {\n if (option1 !== undefined) {\n return option1;\n }\n return option2;\n }\n\n if (!sourceData) {\n try {\n sourceData = fs.readFileSync(source);\n } catch (err) {\n reject(err);\n return;\n }\n }\n\n const sourceFileSizeBytes = sourceData.byteLength;\n\n log(\"Input file size: \" + (sourceFileSizeBytes / 1000).toFixed(2) + \" kB\");\n\n if (!metaModelDataStr && metaModelSource) {\n log('Reading input metadata file: ' + metaModelSource);\n try {\n metaModelDataStr = fs.readFileSync(metaModelSource);\n } catch (err) {\n reject(err);\n return;\n }\n } else {\n log(`Not embedding metadata in XKT`);\n }\n\n let metaModelJSON;\n\n if (metaModelDataStr) {\n try {\n metaModelJSON = JSON.parse(metaModelDataStr);\n } catch (e) {\n metaModelJSON = {};\n log(`Error parsing metadata JSON: ${e}`);\n }\n }\n\n minTileSize = overrideOption(fileTypeConfigs.minTileSize, minTileSize);\n rotateX = overrideOption(fileTypeConfigs.rotateX, rotateX);\n reuseGeometries = overrideOption(fileTypeConfigs.reuseGeometries, reuseGeometries);\n includeTextures = overrideOption(fileTypeConfigs.includeTextures, includeTextures);\n includeNormals = overrideOption(fileTypeConfigs.includeNormals, includeNormals);\n includeTypes = overrideOption(fileTypeConfigs.includeTypes, includeTypes);\n excludeTypes = overrideOption(fileTypeConfigs.excludeTypes, excludeTypes);\n\n if (reuseGeometries === false) {\n log(\"Geometry reuse is disabled\");\n }\n\n const xktModel = new XKTModel({\n minTileSize,\n modelAABB\n });\n\n switch (ext) {\n case \"json\":\n convert(parseCityJSONIntoXKTModel, {\n data: JSON.parse(sourceData),\n xktModel,\n stats,\n rotateX,\n center: fileTypeConfigs.center,\n transform: fileTypeConfigs.transform,\n log\n });\n break;\n\n case \"glb\":\n sourceData = toArrayBuffer(sourceData);\n convert(parseGLTFIntoXKTModel, {\n data: sourceData,\n reuseGeometries,\n includeTextures: true,\n includeNormals,\n metaModelData: metaModelJSON,\n xktModel,\n stats,\n log\n });\n break;\n\n case \"gltf\":\n sourceData = toArrayBuffer(sourceData);\n const gltfBasePath = source ? path.dirname(source) : \"\";\n convert(parseGLTFIntoXKTModel, {\n baseUri: gltfBasePath,\n data: sourceData,\n reuseGeometries,\n includeTextures: true,\n includeNormals,\n metaModelData: metaModelJSON,\n xktModel,\n stats,\n log\n });\n break;\n\n // case \"gltf\":\n // const gltfJSON = JSON.parse(sourceData);\n // const gltfBasePath = source ? getBasePath(source) : \"\";\n // convert(parseGLTFIntoXKTModel, {\n // baseUri: gltfBasePath,\n // data: gltfJSON,\n // reuseGeometries,\n // includeTextures,\n // includeNormals,\n // metaModelData: metaModelJSON,\n // xktModel,\n // getAttachment: async (name) => {\n // const filePath = gltfBasePath + name;\n // log(`Reading attachment file: ${filePath}`);\n // const buffer = fs.readFileSync(filePath);\n // const arrayBuf = toArrayBuffer(buffer);\n // return arrayBuf;\n // },\n // stats,\n // log\n // });\n // break;\n\n case \"ifc\":\n convert(parseIFCIntoXKTModel, {\n WebIFC,\n data: sourceData,\n xktModel,\n wasmPath: \"./\",\n includeTypes,\n excludeTypes,\n stats,\n log\n });\n break;\n\n case \"laz\":\n convert(parseLASIntoXKTModel, {\n data: sourceData,\n xktModel,\n stats,\n fp64: fileTypeConfigs.fp64,\n colorDepth: fileTypeConfigs.colorDepth,\n center: fileTypeConfigs.center,\n transform: fileTypeConfigs.transform,\n skip: overrideOption(fileTypeConfigs.skip, 1),\n log\n });\n break;\n\n case \"las\":\n convert(parseLASIntoXKTModel, {\n data: sourceData,\n xktModel,\n stats,\n fp64: fileTypeConfigs.fp64,\n colorDepth: fileTypeConfigs.colorDepth,\n center: fileTypeConfigs.center,\n transform: fileTypeConfigs.transform,\n skip: overrideOption(fileTypeConfigs.skip, 1),\n log\n });\n break;\n\n case \"pcd\":\n convert(parsePCDIntoXKTModel, {\n data: sourceData,\n xktModel,\n stats,\n log\n });\n break;\n\n case \"ply\":\n convert(parsePLYIntoXKTModel, {\n data: sourceData,\n xktModel,\n stats,\n log\n });\n break;\n\n case \"stl\":\n convert(parseSTLIntoXKTModel, {\n data: sourceData,\n xktModel,\n stats,\n log\n });\n break;\n\n default:\n reject(`Error: unsupported source format: \"${ext}\".`);\n return;\n }\n\n function convert(parser, converterParams) {\n\n parser(converterParams).then(() => {\n\n if (!metaModelJSON) {\n log(\"Creating default metamodel in XKT\");\n xktModel.createDefaultMetaObjects();\n }\n\n log(\"Input file parsed OK. Building XKT document...\");\n\n xktModel.finalize().then(() => {\n\n log(\"XKT document built OK. Writing to XKT file...\");\n\n const xktArrayBuffer = writeXKTModelToArrayBuffer(xktModel, metaModelJSON, stats, {zip: true});\n\n const xktContent = Buffer.from(xktArrayBuffer);\n\n const targetFileSizeBytes = xktArrayBuffer.byteLength;\n\n stats.minTileSize = minTileSize || 200;\n stats.sourceSize = (sourceFileSizeBytes / 1000).toFixed(2);\n stats.xktSize = (targetFileSizeBytes / 1000).toFixed(2);\n stats.xktVersion = XKT_INFO.xktVersion;\n stats.compressionRatio = (sourceFileSizeBytes / targetFileSizeBytes).toFixed(2);\n stats.conversionTime = ((new Date() - startTime) / 1000.0).toFixed(2);\n stats.aabb = xktModel.aabb;\n log(`Converted to: XKT v${stats.xktVersion}`);\n if (includeTypes) {\n log(\"Include types: \" + (includeTypes ? includeTypes : \"(include all)\"));\n }\n if (excludeTypes) {\n log(\"Exclude types: \" + (excludeTypes ? excludeTypes : \"(exclude none)\"));\n }\n log(\"XKT size: \" + stats.xktSize + \" kB\");\n log(\"XKT textures size: \" + (stats.texturesSize / 1000).toFixed(2) + \"kB\");\n log(\"Compression ratio: \" + stats.compressionRatio);\n log(\"Conversion time: \" + stats.conversionTime + \" s\");\n log(\"Converted metaobjects: \" + stats.numMetaObjects);\n log(\"Converted property sets: \" + stats.numPropertySets);\n log(\"Converted drawable objects: \" + stats.numObjects);\n log(\"Converted geometries: \" + stats.numGeometries);\n log(\"Converted textures: \" + stats.numTextures);\n log(\"Converted textureSets: \" + stats.numTextureSets);\n log(\"Converted triangles: \" + stats.numTriangles);\n log(\"Converted vertices: \" + stats.numVertices);\n log(\"Converted UVs: \" + stats.numUVs);\n log(\"Converted normals: \" + stats.numNormals);\n log(\"Converted tiles: \" + xktModel.tilesList.length);\n log(\"minTileSize: \" + stats.minTileSize);\n\n if (output) {\n const outputDir = path.dirname(output);\n if (outputDir !== \"\" && !fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, {recursive: true});\n }\n log('Writing XKT file: ' + output);\n fs.writeFileSync(output, xktContent);\n }\n\n if (outputXKTModel) {\n outputXKTModel(xktModel);\n }\n\n if (outputXKT) {\n outputXKT(xktContent);\n }\n\n if (outputStats) {\n outputStats(stats);\n }\n\n resolve();\n });\n }, (err) => {\n reject(err);\n });\n }\n });\n}\n\nexport {convert2xkt};","import '@loaders.gl/polyfills';\nimport {installFilePolyfills} from '@loaders.gl/polyfills';\n\ninstallFilePolyfills();\n\nexport * from \"./src/index.js\";\nexport {convert2xkt} from \"./src/convert2xkt.js\"; // convert2xkt is only bundled for Node.js\n"],"names":["root","factory","exports","module","define","amd","global","require","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","d","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","r","Symbol","toStringTag","value","p","mat","mat2","mat3","xyz","tempVec3","vec","translate","scale","XKT_INFO","xktVersion","RepeatWrapping","ClampToEdgeWrapping","MirroredRepeatWrapping","NearestFilter","NearestMipMapNearestFilter","NearestMipmapNearestFilter","NearestMipmapLinearFilter","NearestMipMapLinearFilter","LinearFilter","LinearMipmapNearestFilter","LinearMipMapNearestFilter","LinearMipmapLinearFilter","LinearMipMapLinearFilter","GIFMediaType","JPEGMediaType","PNGMediaType","FloatArrayType","Float64Array","tempMat1","tempMat2","tempVec4","math","MIN_DOUBLE","Number","MAX_SAFE_INTEGER","MAX_DOUBLE","DEGTORAD","RADTODEG","vec2","values","vec3","vec4","mat3ToMat4","mat4","arguments","length","mat4ToMat3","createUUID","lut","i","toString","d0","Math","random","d1","d2","d3","concat","clamp","min","max","fmod","a","b","console","error","negateVec4","v","dest","addVec4","u","addVec4Scalar","s","addVec3","addVec3Scalar","subVec4","subVec3","subVec2","subVec4Scalar","subScalarVec4","mulVec4","mulVec4Scalar","mulVec3Scalar","mulVec2Scalar","divVec3","divVec4","divScalarVec3","divVec3Scalar","divVec4Scalar","divScalarVec4","dotVec4","cross3Vec4","u0","u1","u2","v0","v1","v2","cross3Vec3","x","y","z","x2","y2","z2","sqLenVec4","lenVec4","sqrt","dotVec3","dotVec2","sqLenVec3","sqLenVec2","lenVec3","distVec3","w","lenVec2","distVec2","rcpVec3","normalizeVec4","f","normalizeVec3","normalizeVec2","angleVec3","theta","acos","vec3FromMat4Scale","m","vecToArray","trunc","round","len","Array","slice","xyzArrayToObject","arr","xyzObjectToArray","arry","dupMat4","mat4To3","m4s","setMat4ToZeroes","setMat4ToOnes","diagonalMat4v","diagonalMat4c","diagonalMat4s","identityMat4","identityMat3","isIdentityMat4","negateMat4","addMat4","addMat4Scalar","addScalarMat4","subMat4","subMat4Scalar","subScalarMat4","mulMat4","a00","a01","a02","a03","a10","a11","a12","a13","a20","a21","a22","a23","a30","a31","a32","a33","b00","b01","b02","b03","b10","b11","b12","b13","b20","b21","b22","b23","b30","b31","b32","b33","mulMat3","mulMat4Scalar","mulMat4v4","v3","transposeMat4","m4","m14","m8","m13","m12","m9","transposeMat3","determinantMat4","inverseMat4","b04","b05","b06","b07","b08","b09","invDet","traceMat4","translationMat4v","translationMat3v","translationMat4c","translationMat4s","translateMat4v","translateMat4c","OLDtranslateMat4c","m15","m3","m7","m11","rotationMat4v","anglerad","axis","xy","yz","zx","xs","ys","zs","ax","sin","c","cos","q","rotationMat4c","scalingMat4v","scalingMat3v","scalingMat4c","scaleMat4c","scaleMat4v","scalingMat4s","rotationTranslationMat4","xx","xz","yy","zz","wx","wy","wz","mat4ToEuler","order","m21","m22","m23","m31","m32","m33","asin","abs","atan2","composeMat4","position","quaternion","quaternionToRotationMat4","decomposeMat4","matrix","sx","sy","sz","set","invSX","invSY","invSZ","mat4ToQuaternion","this","lookAtMat4v","pos","target","up","z0","z1","x0","x1","y0","y1","posx","posy","posz","upx","upy","upz","targetx","targety","targetz","lookAtMat4c","orthoMat4c","left","right","bottom","top","near","far","rl","tb","fn","frustumMat4v","fmin","fmax","fmin4","fmax4","t","tempMat20","tempMat21","tempMat22","frustumMat4","perspectiveMat4","fovyrad","aspectratio","znear","zfar","pmin","pmax","tan","transformPoint3","transformPoint4","transformPoints3","points","points2","p0","p1","p2","pi","result","m0","m1","m2","m5","m6","m10","transformPositions3","transformPositions4","transformVec3","transformVec4","rotateVec3X","rotateVec3Y","rotateVec3Z","projectVec4","unprojectVec3","viewMat","projMat","lerpVec3","t1","t2","flatten","leni","j","lenj","item","push","identityQuaternion","eulerToQuaternion","euler","c1","c2","c3","s1","s2","s3","trace","vec3PairToQuaternion","norm_u_norm_v","real_part","normalizeQuaternion","angleAxisToQuaternion","angleAxis","halfAngle","fsin","quaternionToEuler","mulQuaternions","p3","q0","q1","q2","q3","vec3ApplyQuaternion","qx","qy","qz","qw","ix","iy","iz","iw","quaternionToMat4","tx","ty","tz","twx","twy","twz","txx","txy","txz","tyy","tyz","tzz","conjugateQuaternion","inverseQuaternion","quaternionToAngleAxis","angle","AABB3","AABB2","OBB3","OBB2","Sphere3","transformOBB3","containsAABB3","aabb1","aabb2","getAABB3Diag","aabb","getAABB3DiagPoint","diagVec","xneg","xpos","yneg","ypos","zneg","zpos","getAABB3Center","getAABB2Center","collapseAABB3","AABB3ToOBB3","obb","positions3ToAABB3","positions","positionsDecodeMatrix","xmin","ymin","zmin","xmax","ymax","zmax","decompressPosition","OBB3ToAABB3","points3ToAABB3","points3ToSphere3","sphere","numPoints","dist","radius","positions3ToSphere3","tempVec3a","tempVec3b","lenPositions","numPositions","OBB3ToSphere3","point","lenPoints","getSphere3Center","expandAABB3","expandAABB3Point3","triangleNormal","normal","p1x","p1y","p1z","p2x","p2y","p2z","p3x","p3y","p3z","mag","octEncodeVec3","array","xfunc","yfunc","tempx","tempy","Int8Array","octDecodeVec2","oct","dot","uniquePositions","indicesLookup","indicesReverseLookup","weldedIndices","faces","numFaces","compa","compb","compc","cb","ab","cross","inverseNormal","geometryCompression","quantizePositions","quantizedPositions","maxInt","xMultiplier","yMultiplier","zMultiplier","verify","num","floor","compressPosition","multiplier","Float32Array","createPositionsDecodeMatrix","xwid","ywid","zwid","transformAndOctEncodeNormals","modelNormalMatrix","normals","lenNormals","compressedNormals","lenCompressedNormals","best","currentCos","bestCos","localNormal","worldNormal","octEncodeNormals","buildEdgeIndices","Uint16Array","indices","edgeThreshold","vx","vy","vz","positionsMap","precision","pow","lenUniquePositions","weldVertices","numIndices","ia","ib","ic","face","buildFaces","edge1","edge2","index1","index2","edge","normal1","normal2","edgeIndices","thresholdDot","edges","largeIndex","faceIndex","face1","face2","dot2","Uint32Array","isTriangleMeshSolid","vertexIndexMapping","compareIndexPositions","posA","posB","newIndices","sort","uniqueVertexIndex","a2","b2","temp","compareEdges","e1","e2","sameEdgeCount","XKTMesh","_createClass","cfg","_classCallCheck","meshId","meshIndex","geometry","color","metallic","roughness","opacity","textureSet","entity","XKTGeometry","geometryId","primitiveType","geometryIndex","numInstances","positionsQuantized","normalsOctEncoded","colorsCompressed","uvs","uvsCompressed","solid","XKTEntity","entityId","meshes","entityIndex","hasReusedGeometries","XKTTile","entities","KDNode","XKTMetaObject","metaObjectId","propertySetIds","metaObjectType","metaObjectName","parentMetaObjectId","XKTPropertySet","propertySetId","propertySetType","propertySetName","properties","XKTTexture","textureId","textureIndex","imageData","channel","width","height","src","compressed","mediaType","minFilter","magFilter","wrapS","wrapT","wrapR","XKTTextureSet","textureSetId","textureSetIndex","materialType","materialIndex","colorTexture","metallicRoughnessTexture","normalsTexture","emissiveTexture","occlusionTexture","_regeneratorRuntime","Op","hasOwn","desc","$Symbol","iteratorSymbol","iterator","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","configurable","writable","err","wrap","innerFn","outerFn","self","tryLocsList","protoGenerator","Generator","generator","create","context","Context","makeInvokeMethod","tryCatch","arg","type","ContinueSentinel","GeneratorFunction","GeneratorFunctionPrototype","IteratorPrototype","getProto","getPrototypeOf","NativeIteratorPrototype","Gp","defineIteratorMethods","forEach","method","_invoke","AsyncIterator","PromiseImpl","invoke","resolve","reject","record","_typeof","__await","then","unwrapped","previousPromise","callInvokeWithMethodAndArg","state","Error","done","delegate","delegateResult","maybeInvokeDelegate","sent","_sent","dispatchException","abrupt","methodName","TypeError","info","resultName","next","nextLoc","pushTryEntry","locs","entry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","resetTryEntry","completion","reset","iterable","iteratorMethod","isNaN","doneResult","displayName","isGeneratorFunction","genFun","ctor","constructor","name","mark","setPrototypeOf","__proto__","awrap","async","Promise","iter","keys","val","object","reverse","pop","skipTempReset","prev","charAt","stop","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","thrown","delegateYield","asyncGeneratorStep","gen","_next","_throw","_defineProperties","props","descriptor","input","hint","prim","toPrimitive","res","String","_toPrimitive","tempVec4a","tempVec4b","tempMat4","tempMat4b","kdTreeDimLength","TEXTURE_ENCODING_OPTIONS","useSRGB","qualityLevel","encodeUASTC","mipmaps","XKTModel","instance","Constructor","modelId","projectId","revisionId","author","createdAt","creatingApplication","schema","minTileSize","modelAABB","propertySets","propertySetsList","metaObjects","metaObjectsList","reusedGeometriesDecodeMatrix","geometries","geometriesList","textures","texturesList","textureSets","textureSetsList","meshesList","entitiesList","tilesList","finalized","protoProps","_finalize","params","propertySet","metaObject","_rootMetaObject","fileExt","split","texture","colorTextureId","metallicRoughnessTextureId","normalsTextureId","emissiveTextureId","occlusionTextureId","triangles","lines","line_strip","_createDefaultIndices","colors","xktGeometryCfg","uv","Uint8Array","mergedPositions","mergedIndices","mergeVertices","rotation","mesh","meshIds","meshIdIdx","meshIdLen","warn","createMetaObject","_callee","rootKDNode","_context","log","_removeUnusedTextures","_compressTextures","_bakeSingleUseGeometryPositions","_bakeAndOctEncodeNormals","_createEntityAABBs","_createKDTree","_createTilesFromKDTree","_createReusedGeometriesDecodeMatrix","_flagSolidGeometries","args","apply","_this","countTextures","_loop","encodingOptions","load","ImageLoader","image","encode","KTX2BasisWriter","encodedData","encodedImageData","entityAABB","_insertEntityIntoKDTree","kdNode","nodeAABB","dim","aabbLeft","aabbRight","_createTilesFromKDNode","_createTileFromEntities","tileAABB","tileCenter","tileCenterNeg","rtcAABB","reused","k","lenk","tile","reusedGeometriesAABB","countReusedGeometries","numGeometries","maxNumPositions","maxNumIndices","XKT_VERSION","NUM_TEXTURE_ATTRIBUTES","NUM_MATERIAL_ATTRIBUTES","writeXKTModelToArrayBuffer","xktModel","metaModelJSON","stats","options","data","metaModelDataStr","numPropertySets","numMetaObjects","numTextures","numTextureSets","numMeshes","numEntities","numTiles","lenColors","lenUVs","lenIndices","lenEdgeIndices","lenMatrices","lenTextures","xktTexture","byteLength","numCompressedTextures","metadata","textureData","eachTextureDataPortion","eachTextureAttributes","eachTextureSetTextures","Int32Array","matrices","eachGeometryPrimitiveType","eachGeometryPositionsPortion","eachGeometryNormalsPortion","eachGeometryColorsPortion","eachGeometryUVsPortion","eachGeometryIndicesPortion","eachGeometryEdgeIndicesPortion","eachMeshGeometriesPortion","eachMeshMatricesPortion","eachMeshTextureSet","eachMeshMaterialAttributes","eachEntityId","eachEntityMeshesPortion","eachTileAABB","eachTileEntitiesPortion","countPositions","countNormals","countColors","countUVs","countIndices","countEdgeIndices","id","propertySetsIndex","propertySetJSON","metaObjectsIndex","metaObjectJSON","parent","external","portionIdx","textureAttrIdx","eachTextureSetTexturesIndex","countEntityMeshesPortion","eachMeshMaterialAttributesIndex","matricesIndex","tileIndex","tileEntities","numTileEntities","entityMeshes","numEntityMeshes","tileAABBIndex","getModelData","deflatedData","deflate","buffer","zip","pako","deflateJSON","JSON","stringify","replace","chr","charCodeAt","substr","deflateData","texturesSize","arrayBuffer","elements","indexData","dataLen","elementsize","indexBuf","dataArray","offset","element","toArrayBuffer","createArrayBuffer","strings","earcut","holeIndices","minX","minY","maxX","maxY","invSize","hasHoles","outerLen","outerNode","linkedList","list","queue","steiner","getLeftmost","compareX","eliminateHole","filterPoints","eliminateHoles","earcutLinked","start","end","clockwise","last","signedArea","insertNode","equals","removeNode","again","area","ear","pass","zOrder","prevZ","nextZ","e","tail","numMerges","pSize","qSize","inSize","sortLinked","indexCurve","isEarHashed","isEar","cureLocalIntersections","splitEarcut","pointInTriangle","minTX","minTY","maxTX","maxTY","minZ","maxZ","n","intersects","locallyInside","isValidDiagonal","splitPolygon","hole","hx","hy","mx","my","tanMin","Infinity","sectorContainsSector","findHoleBridge","leftmost","ay","bx","by","cx","cy","px","py","intersectsPolygon","inside","middleInside","o1","sign","o2","o3","o4","onSegment","Node","an","bp","sum","deviation","polygonArea","trianglesArea","vertices","holes","dimensions","holeIndex","tempVec2a","tempVec3c","parseCityJSONIntoXKTModel","_ref","_ref$center","center","_ref$transform","transform","_ref$stats","vertices2","copyVertices","cityJSONTransform","vertex","transformVertices","centerVertices","customTransformVertices","sourceFormat","schemaVersion","version","title","created","numTriangles","numVertices","numObjects","rootMetaObjectId","modelMetaObjectId","ctx","msg","nextId","cityObjects","CityObjects","objectId","parseCityObject","parseCityJSON","centerPos","cityObject","parents","objectMaterial","surfaceMaterials","appearance","materials","geometryMaterial","material","themeIds","theme","surfaceMaterial","parseGeometrySurfacesWithOwnMaterials","parseGeometrySurfacesWithSharedMaterial","createEntity","parseSurfacesWithOwnMaterials","boundaries","shells","solids","surfaces","surface","diffuseColor","transparency","sharedIndices","geometryCfg","newFace","extractLocalIndices","_toConsumableArray","pList","getNormalOfPositions","pv","to2D","unshift","tr","createGeometry","createMesh","parseSurfacesWithSharedMaterial","primitiveCfg","boundary","newBoundary","index","includes","vertexIndex","indexOf","nexti","_p","_n","re","x3","tmp2","y3","utils","isString","parseGLTFIntoXKTModel","baseUri","metaModelData","_ref$includeTextures","includeTextures","_ref$includeNormals","includeNormals","getAttachment","numNormals","numUVs","parse","GLTFLoader","gltfData","metaModelCorrections","getMetaModelCorrections","geometryCreated","parseTexture","parseTextures","_textureSetId","parseTextureSet","_attributes","parseMaterialAttributes","parseMaterials","scene","scenes","nodes","countMeshUsage","parseNode","parseScene","parseDefaultScene","errMsg","eachRootStats","eachChildRoot","metaObjectsMap","metaObjectParent","rootMetaObject","numChildren","countChildren","source","sampler","createTexture","flipY","_textureId","textureSetCfg","normalTexture","normalTextureId","metallicPBR","pbrMetallicRoughness","baseColorTexture","extensions","specularPBR","specularTexture","specularColorTexture","createTextureSet","materialAttributes","diffuseFactor","common","technique","blinn","phong","lambert","diffuse","transparent","baseColorFactor","metallicFactor","roughnessFactor","node","instances","children","childNode","deferredMeshIds","depth","localMatrix","translation","numPrimitives","primitives","primitive","_xktGeometryId","xktGeometryId","mode","attributes","POSITION","NORMAL","COLOR_0","TEXCOORD_0","xktMeshId","meshCfg","nodeName","xktEntityId","rootMetaObjectStats","atob2","atob","Buffer","from","WEBGL_COMPONENT_TYPES","Int16Array","WEBGL_TYPE_SIZES","parseGLTFJSONIntoXKTModel","reuseGeometries","gltf","createXKTGeometryIds","nextMeshId","buffers","all","map","bufferInfo","_arrayBuffer","_buffer","uri","dataUriRegexResult","match","isBase64","decodeURIComponent","ArrayBuffer","view","parseArrayBuffer","parseBuffer","parseBuffers","bufferViewsInfo","bufferViews","parseBufferView","parseBufferViews","freeBuffers","materialsInfo","materialInfo","parseMaterial","_materialData","defaultSceneInfo","sceneInfo","glTFNode","bufferViewInfo","_typedArray","byteOffset","gltfMeshId","meshInfo","numPrimitivesInMesh","primitiveInfo","geometryHash","createPrimitiveGeometryHash","geometryArrays","parsePrimitiveGeometry","childNodeIdx","childGLTFNode","join","accessors","indicesIndex","accessorInfo","parseAccessorTypedArray","positionsIndex","normalsIndex","colorsIndex","bufferView","itemSize","TypedArray","componentType","itemBytes","BYTES_PER_ELEMENT","byteStride","count","parseIFCIntoXKTModel","WebIFC","_ref$autoNormals","autoNormals","includeTypes","excludeTypes","wasmPath","ifcAPI","IfcAPI","SetWasmPath","Init","modelID","OpenModel","ifcProjectId","GetLineIDsWithType","IFCPROJECT","GetLine","ifcProject","parseSpatialChildren","parseMetadata","flatMeshes","LoadAllGeometry","size","createObject","IFCSPACE","ifcSpaceId","flatMesh","GetFlatMesh","parseGeometry","IFCRELDEFINESBYPROPERTIES","relID","rel","relatingPropertyDefinition","RelatingPropertyDefinition","GlobalId","relatedObjects","RelatedObjects","HasProperties","Name","nominalValue","NominalValue","property","valueType","Description","description","createPropertySet","parsePropertySets","ifcElement","parseRelatedItemsOfType","expressID","IFCRELAGGREGATES","IFCRELCONTAINEDINSPATIALSTRUCTURE","relation","related","relatedItems","isArray","element2","flatMeshExpressID","placedGeometries","placedGeometry","geometryExpressID","GetGeometry","vertexData","GetVertexArray","GetVertexData","GetVertexDataSize","GetIndexArray","GetIndexData","GetIndexDataSize","flatTransformation","MAX_VERTICES","parseLASIntoXKTModel","_ref$colorDepth","colorDepth","_ref$fp","fp64","_ref$skip","skip","_ref$log","LASLoader","las","parsedData","loaderData","pointsFormatId","readAttributes","intensity","readIntensities","readColorsAndIntensities","pointsChunks","chunkArray","positionsValue","readPositions","colorsChunks","attributesPosition","attributesColor","attributesIntensity","colorSize","intensities","colorsCompressedSize","l","chunkSize","parseMetaModelIntoXKTModel","includeTypesMap","excludeTypesMap","newObject","countMetaObjects","parsePCDIntoXKTModel","_ref$littleEndian","littleEndian","textData","TextDecoder","decode","il","fromCharCode","escape","decodeText","header","result1","search","result2","exec","headerLen","str","fields","viewpoint","parseFloat","parseInt","sizeSum","rowSize","parseHeader","line","rgb","g","sizes","compressedSize","decompressedSize","decompressed","inData","outLength","ctrl","ref","inLength","outData","inPtr","outPtr","decompressLZF","dataview","DataView","getFloat32","getUint8","row","parsePLYIntoXKTModel","_x","_parsePLYIntoXKTModel","hasColors","colorsValue","PLYLoader","t0","parseSTLIntoXKTModel","_parseSTLIntoXKTModel","splitMeshes","smoothNormals","smoothNormalsAngleThreshold","binData","ensureBinary","isBinary","parseBinary","parseASCII","reader","getUint32","defaultR","defaultG","defaultB","lastR","lastG","lastB","newMesh","normalX","normalY","normalZ","packedColor","getUint16","vertexstart","addMesh","normalx","normaly","normalz","verticesPerFace","normalsPerFace","text","faceRegex","faceCounter","floatRegex","vertexRegex","RegExp","normalRegex","nextGeometryId","ni","acc","posi","vertexMap","vertexNormals","vertexNormalAccum","numVerts","ii","jj","faceToVertexNormals","buildBoxGeometry","xSize","ySize","zSize","centerX","centerY","centerZ","buildBoxLinesGeometry","buildCylinderGeometry","radiusTop","radiusBottom","radialSegments","heightSegments","h","currentRadius","currentHeight","first","second","startIndex","tu","tv","openEnded","heightHalf","heightLength","radialAngle","PI","radialLength","radiusChange","atan","buildGridGeometry","divisions","step","halfSize","buildPlaneGeometry","xSegments","zSegments","halfWidth","halfHeight","planeX","planeZ","planeX1","planeZ1","segmentWidth","segmentHeight","offset2","buildSphereGeometry","lod","widthSegments","sinTheta","cosTheta","phi","sinPhi","buildTorusGeometry","tube","tubeSegments","arc","letters","buildVectorTextGeometry","penUp","pointsLen","origin","xOrigin","yOrigin","zOrigin","trim","countVerts","iLine","buf","fs","path","convert2xkt","configs","sourceData","metaModelSource","output","outputXKTModel","outputXKT","_ref$reuseGeometries","_ref$minTileSize","outputStats","_ref$rotateX","rotateX","sourceSize","xktSize","compressionRatio","conversionTime","_log","startTime","Date","sourceConfigs","ext","fileName","extname","substring","getFileExtension","fileTypeConfigs","readFileSync","sourceFileSizeBytes","toFixed","overrideOption","convert","dirname","option1","option2","parser","converterParams","createDefaultMetaObjects","finalize","xktArrayBuffer","xktContent","targetFileSizeBytes","outputDir","existsSync","mkdirSync","recursive","writeFileSync","installFilePolyfills"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"xeokit-convert.cjs.js","mappings":"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","sources":["webpack://convert2xkt/webpack/universalModuleDefinition","webpack://convert2xkt/external commonjs \"fs\"","webpack://convert2xkt/external commonjs \"path\"","webpack://convert2xkt/webpack/bootstrap","webpack://convert2xkt/webpack/runtime/define property getters","webpack://convert2xkt/webpack/runtime/hasOwnProperty shorthand","webpack://convert2xkt/webpack/runtime/make namespace object","webpack://convert2xkt/external commonjs \"@loaders.gl/polyfills\"","webpack://convert2xkt/./src/XKT_INFO.js","webpack://convert2xkt/./src/lib/math.js","webpack://convert2xkt/./src/XKTModel/lib/geometryCompression.js","webpack://convert2xkt/./src/constants.js","webpack://convert2xkt/./src/XKTModel/lib/buildEdgeIndices.js","webpack://convert2xkt/./src/XKTModel/lib/isTriangleMeshSolid.js","webpack://convert2xkt/./src/XKTModel/XKTMesh.js","webpack://convert2xkt/./src/XKTModel/XKTGeometry.js","webpack://convert2xkt/./src/XKTModel/XKTEntity.js","webpack://convert2xkt/./src/XKTModel/XKTTile.js","webpack://convert2xkt/./src/XKTModel/KDNode.js","webpack://convert2xkt/./src/XKTModel/XKTMetaObject.js","webpack://convert2xkt/./src/XKTModel/XKTPropertySet.js","webpack://convert2xkt/./src/XKTModel/XKTTexture.js","webpack://convert2xkt/./src/XKTModel/XKTTextureSet.js","webpack://convert2xkt/external commonjs \"@loaders.gl/core\"","webpack://convert2xkt/external commonjs \"@loaders.gl/textures\"","webpack://convert2xkt/external commonjs \"@loaders.gl/images\"","webpack://convert2xkt/./src/XKTModel/XKTModel.js","webpack://convert2xkt/./src/lib/mergeVertices.js","webpack://convert2xkt/external commonjs \"pako\"","webpack://convert2xkt/./src/XKTModel/writeXKTModelToArrayBuffer.js","webpack://convert2xkt/./src/lib/earcut.js","webpack://convert2xkt/./src/parsers/parseCityJSONIntoXKTModel.js","webpack://convert2xkt/./src/XKTModel/lib/utils.js","webpack://convert2xkt/external commonjs \"@loaders.gl/gltf\"","webpack://convert2xkt/./src/parsers/parseGLTFIntoXKTModel.js","webpack://convert2xkt/./src/parsers/parseGLTFJSONIntoXKTModel.js","webpack://convert2xkt/./src/parsers/parseIFCIntoXKTModel.js","webpack://convert2xkt/external commonjs \"@loaders.gl/las\"","webpack://convert2xkt/./src/parsers/parseLASIntoXKTModel.js","webpack://convert2xkt/./src/parsers/parseMetaModelIntoXKTModel.js","webpack://convert2xkt/./src/parsers/parsePCDIntoXKTModel.js","webpack://convert2xkt/external commonjs \"@loaders.gl/ply\"","webpack://convert2xkt/./src/parsers/parsePLYIntoXKTModel.js","webpack://convert2xkt/./src/parsers/parseSTLIntoXKTModel.js","webpack://convert2xkt/./src/lib/faceToVertexNormals.js","webpack://convert2xkt/./src/geometryBuilders/buildBoxGeometry.js","webpack://convert2xkt/./src/geometryBuilders/buildBoxLinesGeometry.js","webpack://convert2xkt/./src/geometryBuilders/buildCylinderGeometry.js","webpack://convert2xkt/./src/geometryBuilders/buildGridGeometry.js","webpack://convert2xkt/./src/geometryBuilders/buildPlaneGeometry.js","webpack://convert2xkt/./src/geometryBuilders/buildSphereGeometry.js","webpack://convert2xkt/./src/geometryBuilders/buildTorusGeometry.js","webpack://convert2xkt/./src/geometryBuilders/buildVectorTextGeometry.js","webpack://convert2xkt/./src/XKTModel/lib/toArraybuffer.js","webpack://convert2xkt/./src/convert2xkt.js","webpack://convert2xkt/./index.dist.node.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[\"convert2xkt\"] = factory();\n\telse\n\t\troot[\"convert2xkt\"] = factory();\n})(global, () => {\nreturn ","module.exports = require(\"fs\");","module.exports = require(\"path\");","// 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\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.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","// 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};","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@loaders.gl/polyfills\");","/**\n * @desc Provides info on the XKT generated by xeokit-convert.\n */\nconst XKT_INFO = {\n\n /**\n * The XKT version generated by xeokit-convert.\n *\n * This is the XKT version that's modeled by {@link XKTModel}, serialized\n * by {@link writeXKTModelToArrayBuffer}, and written by {@link convert2xkt}.\n *\n * * Current XKT version: **10**\n * * [XKT format specs](https://github.com/xeokit/xeokit-convert/blob/main/specs/index.md)\n *\n * @property xktVersion\n * @type {number}\n */\n xktVersion: 10\n};\n\nexport {XKT_INFO};","// Some temporary vars to help avoid garbage collection\n\nconst doublePrecision = true;\nconst FloatArrayType = doublePrecision ? Float64Array : Float32Array;\n\nconst tempMat1 = new FloatArrayType(16);\nconst tempMat2 = new FloatArrayType(16);\nconst tempVec4 = new FloatArrayType(4);\n\n/**\n * @private\n */\nconst math = {\n\n MIN_DOUBLE: -Number.MAX_SAFE_INTEGER,\n MAX_DOUBLE: Number.MAX_SAFE_INTEGER,\n\n /**\n * The number of radiians in a degree (0.0174532925).\n * @property DEGTORAD\n * @type {Number}\n */\n DEGTORAD: 0.0174532925,\n\n /**\n * The number of degrees in a radian.\n * @property RADTODEG\n * @type {Number}\n */\n RADTODEG: 57.295779513,\n\n /**\n * Returns a new, uninitialized two-element vector.\n * @method vec2\n * @param [values] Initial values.\n * @static\n * @returns {Number[]}\n */\n vec2(values) {\n return new FloatArrayType(values || 2);\n },\n\n /**\n * Returns a new, uninitialized three-element vector.\n * @method vec3\n * @param [values] Initial values.\n * @static\n * @returns {Number[]}\n */\n vec3(values) {\n return new FloatArrayType(values || 3);\n },\n\n /**\n * Returns a new, uninitialized four-element vector.\n * @method vec4\n * @param [values] Initial values.\n * @static\n * @returns {Number[]}\n */\n vec4(values) {\n return new FloatArrayType(values || 4);\n },\n\n /**\n * Returns a new, uninitialized 3x3 matrix.\n * @method mat3\n * @param [values] Initial values.\n * @static\n * @returns {Number[]}\n */\n mat3(values) {\n return new FloatArrayType(values || 9);\n },\n\n /**\n * Converts a 3x3 matrix to 4x4\n * @method mat3ToMat4\n * @param mat3 3x3 matrix.\n * @param mat4 4x4 matrix\n * @static\n * @returns {Number[]}\n */\n mat3ToMat4(mat3, mat4 = new FloatArrayType(16)) {\n mat4[0] = mat3[0];\n mat4[1] = mat3[1];\n mat4[2] = mat3[2];\n mat4[3] = 0;\n mat4[4] = mat3[3];\n mat4[5] = mat3[4];\n mat4[6] = mat3[5];\n mat4[7] = 0;\n mat4[8] = mat3[6];\n mat4[9] = mat3[7];\n mat4[10] = mat3[8];\n mat4[11] = 0;\n mat4[12] = 0;\n mat4[13] = 0;\n mat4[14] = 0;\n mat4[15] = 1;\n return mat4;\n },\n\n /**\n * Returns a new, uninitialized 4x4 matrix.\n * @method mat4\n * @param [values] Initial values.\n * @static\n * @returns {Number[]}\n */\n mat4(values) {\n return new FloatArrayType(values || 16);\n },\n\n /**\n * Converts a 4x4 matrix to 3x3\n * @method mat4ToMat3\n * @param mat4 4x4 matrix.\n * @param mat3 3x3 matrix\n * @static\n * @returns {Number[]}\n */\n mat4ToMat3(mat4, mat3) { // TODO\n //return new FloatArrayType(values || 9);\n },\n\n /**\n * Returns a new UUID.\n * @method createUUID\n * @static\n * @return string The new UUID\n */\n createUUID: ((() => {\n const self = {};\n const lut = [];\n for (let i = 0; i < 256; i++) {\n lut[i] = (i < 16 ? '0' : '') + (i).toString(16);\n }\n return () => {\n const d0 = Math.random() * 0xffffffff | 0;\n const d1 = Math.random() * 0xffffffff | 0;\n const d2 = Math.random() * 0xffffffff | 0;\n const d3 = Math.random() * 0xffffffff | 0;\n return `${lut[d0 & 0xff] + lut[d0 >> 8 & 0xff] + lut[d0 >> 16 & 0xff] + lut[d0 >> 24 & 0xff]}-${lut[d1 & 0xff]}${lut[d1 >> 8 & 0xff]}-${lut[d1 >> 16 & 0x0f | 0x40]}${lut[d1 >> 24 & 0xff]}-${lut[d2 & 0x3f | 0x80]}${lut[d2 >> 8 & 0xff]}-${lut[d2 >> 16 & 0xff]}${lut[d2 >> 24 & 0xff]}${lut[d3 & 0xff]}${lut[d3 >> 8 & 0xff]}${lut[d3 >> 16 & 0xff]}${lut[d3 >> 24 & 0xff]}`;\n };\n }))(),\n\n /**\n * Clamps a value to the given range.\n * @param {Number} value Value to clamp.\n * @param {Number} min Lower bound.\n * @param {Number} max Upper bound.\n * @returns {Number} Clamped result.\n */\n clamp(value, min, max) {\n return Math.max(min, Math.min(max, value));\n },\n\n /**\n * Floating-point modulus\n * @method fmod\n * @static\n * @param {Number} a\n * @param {Number} b\n * @returns {*}\n */\n fmod(a, b) {\n if (a < b) {\n console.error(\"math.fmod : Attempting to find modulus within negative range - would be infinite loop - ignoring\");\n return a;\n }\n while (b <= a) {\n a -= b;\n }\n return a;\n },\n\n /**\n * Negates a four-element vector.\n * @method negateVec4\n * @static\n * @param {Array(Number)} v Vector to negate\n * @param {Array(Number)} [dest] Destination vector\n * @return {Array(Number)} dest if specified, v otherwise\n */\n negateVec4(v, dest) {\n if (!dest) {\n dest = v;\n }\n dest[0] = -v[0];\n dest[1] = -v[1];\n dest[2] = -v[2];\n dest[3] = -v[3];\n return dest;\n },\n\n /**\n * Adds one four-element vector to another.\n * @method addVec4\n * @static\n * @param {Array(Number)} u First vector\n * @param {Array(Number)} v Second vector\n * @param {Array(Number)} [dest] Destination vector\n * @return {Array(Number)} dest if specified, u otherwise\n */\n addVec4(u, v, dest) {\n if (!dest) {\n dest = u;\n }\n dest[0] = u[0] + v[0];\n dest[1] = u[1] + v[1];\n dest[2] = u[2] + v[2];\n dest[3] = u[3] + v[3];\n return dest;\n },\n\n /**\n * Adds a scalar value to each element of a four-element vector.\n * @method addVec4Scalar\n * @static\n * @param {Array(Number)} v The vector\n * @param {Number} s The scalar\n * @param {Array(Number)} [dest] Destination vector\n * @return {Array(Number)} dest if specified, v otherwise\n */\n addVec4Scalar(v, s, dest) {\n if (!dest) {\n dest = v;\n }\n dest[0] = v[0] + s;\n dest[1] = v[1] + s;\n dest[2] = v[2] + s;\n dest[3] = v[3] + s;\n return dest;\n },\n\n /**\n * Adds one three-element vector to another.\n * @method addVec3\n * @static\n * @param {Array(Number)} u First vector\n * @param {Array(Number)} v Second vector\n * @param {Array(Number)} [dest] Destination vector\n * @return {Array(Number)} dest if specified, u otherwise\n */\n addVec3(u, v, dest) {\n if (!dest) {\n dest = u;\n }\n dest[0] = u[0] + v[0];\n dest[1] = u[1] + v[1];\n dest[2] = u[2] + v[2];\n return dest;\n },\n\n /**\n * Adds a scalar value to each element of a three-element vector.\n * @method addVec4Scalar\n * @static\n * @param {Array(Number)} v The vector\n * @param {Number} s The scalar\n * @param {Array(Number)} [dest] Destination vector\n * @return {Array(Number)} dest if specified, v otherwise\n */\n addVec3Scalar(v, s, dest) {\n if (!dest) {\n dest = v;\n }\n dest[0] = v[0] + s;\n dest[1] = v[1] + s;\n dest[2] = v[2] + s;\n return dest;\n },\n\n /**\n * Subtracts one four-element vector from another.\n * @method subVec4\n * @static\n * @param {Array(Number)} u First vector\n * @param {Array(Number)} v Vector to subtract\n * @param {Array(Number)} [dest] Destination vector\n * @return {Array(Number)} dest if specified, u otherwise\n */\n subVec4(u, v, dest) {\n if (!dest) {\n dest = u;\n }\n dest[0] = u[0] - v[0];\n dest[1] = u[1] - v[1];\n dest[2] = u[2] - v[2];\n dest[3] = u[3] - v[3];\n return dest;\n },\n\n /**\n * Subtracts one three-element vector from another.\n * @method subVec3\n * @static\n * @param {Array(Number)} u First vector\n * @param {Array(Number)} v Vector to subtract\n * @param {Array(Number)} [dest] Destination vector\n * @return {Array(Number)} dest if specified, u otherwise\n */\n subVec3(u, v, dest) {\n if (!dest) {\n dest = u;\n }\n dest[0] = u[0] - v[0];\n dest[1] = u[1] - v[1];\n dest[2] = u[2] - v[2];\n return dest;\n },\n\n /**\n * Subtracts one two-element vector from another.\n * @method subVec2\n * @static\n * @param {Array(Number)} u First vector\n * @param {Array(Number)} v Vector to subtract\n * @param {Array(Number)} [dest] Destination vector\n * @return {Array(Number)} dest if specified, u otherwise\n */\n subVec2(u, v, dest) {\n if (!dest) {\n dest = u;\n }\n dest[0] = u[0] - v[0];\n dest[1] = u[1] - v[1];\n return dest;\n },\n\n /**\n * Subtracts a scalar value from each element of a four-element vector.\n * @method subVec4Scalar\n * @static\n * @param {Array(Number)} v The vector\n * @param {Number} s The scalar\n * @param {Array(Number)} [dest] Destination vector\n * @return {Array(Number)} dest if specified, v otherwise\n */\n subVec4Scalar(v, s, dest) {\n if (!dest) {\n dest = v;\n }\n dest[0] = v[0] - s;\n dest[1] = v[1] - s;\n dest[2] = v[2] - s;\n dest[3] = v[3] - s;\n return dest;\n },\n\n /**\n * Sets each element of a 4-element vector to a scalar value minus the value of that element.\n * @method subScalarVec4\n * @static\n * @param {Array(Number)} v The vector\n * @param {Number} s The scalar\n * @param {Array(Number)} [dest] Destination vector\n * @return {Array(Number)} dest if specified, v otherwise\n */\n subScalarVec4(v, s, dest) {\n if (!dest) {\n dest = v;\n }\n dest[0] = s - v[0];\n dest[1] = s - v[1];\n dest[2] = s - v[2];\n dest[3] = s - v[3];\n return dest;\n },\n\n /**\n * Multiplies one three-element vector by another.\n * @method mulVec3\n * @static\n * @param {Array(Number)} u First vector\n * @param {Array(Number)} v Second vector\n * @param {Array(Number)} [dest] Destination vector\n * @return {Array(Number)} dest if specified, u otherwise\n */\n mulVec4(u, v, dest) {\n if (!dest) {\n dest = u;\n }\n dest[0] = u[0] * v[0];\n dest[1] = u[1] * v[1];\n dest[2] = u[2] * v[2];\n dest[3] = u[3] * v[3];\n return dest;\n },\n\n /**\n * Multiplies each element of a four-element vector by a scalar.\n * @method mulVec34calar\n * @static\n * @param {Array(Number)} v The vector\n * @param {Number} s The scalar\n * @param {Array(Number)} [dest] Destination vector\n * @return {Array(Number)} dest if specified, v otherwise\n */\n mulVec4Scalar(v, s, dest) {\n if (!dest) {\n dest = v;\n }\n dest[0] = v[0] * s;\n dest[1] = v[1] * s;\n dest[2] = v[2] * s;\n dest[3] = v[3] * s;\n return dest;\n },\n\n /**\n * Multiplies each element of a three-element vector by a scalar.\n * @method mulVec3Scalar\n * @static\n * @param {Array(Number)} v The vector\n * @param {Number} s The scalar\n * @param {Array(Number)} [dest] Destination vector\n * @return {Array(Number)} dest if specified, v otherwise\n */\n mulVec3Scalar(v, s, dest) {\n if (!dest) {\n dest = v;\n }\n dest[0] = v[0] * s;\n dest[1] = v[1] * s;\n dest[2] = v[2] * s;\n return dest;\n },\n\n /**\n * Multiplies each element of a two-element vector by a scalar.\n * @method mulVec2Scalar\n * @static\n * @param {Array(Number)} v The vector\n * @param {Number} s The scalar\n * @param {Array(Number)} [dest] Destination vector\n * @return {Array(Number)} dest if specified, v otherwise\n */\n mulVec2Scalar(v, s, dest) {\n if (!dest) {\n dest = v;\n }\n dest[0] = v[0] * s;\n dest[1] = v[1] * s;\n return dest;\n },\n\n /**\n * Divides one three-element vector by another.\n * @method divVec3\n * @static\n * @param {Array(Number)} u First vector\n * @param {Array(Number)} v Second vector\n * @param {Array(Number)} [dest] Destination vector\n * @return {Array(Number)} dest if specified, u otherwise\n */\n divVec3(u, v, dest) {\n if (!dest) {\n dest = u;\n }\n dest[0] = u[0] / v[0];\n dest[1] = u[1] / v[1];\n dest[2] = u[2] / v[2];\n return dest;\n },\n\n /**\n * Divides one four-element vector by another.\n * @method divVec4\n * @static\n * @param {Array(Number)} u First vector\n * @param {Array(Number)} v Second vector\n * @param {Array(Number)} [dest] Destination vector\n * @return {Array(Number)} dest if specified, u otherwise\n */\n divVec4(u, v, dest) {\n if (!dest) {\n dest = u;\n }\n dest[0] = u[0] / v[0];\n dest[1] = u[1] / v[1];\n dest[2] = u[2] / v[2];\n dest[3] = u[3] / v[3];\n return dest;\n },\n\n /**\n * Divides a scalar by a three-element vector, returning a new vector.\n * @method divScalarVec3\n * @static\n * @param v vec3\n * @param s scalar\n * @param dest vec3 - optional destination\n * @return [] dest if specified, v otherwise\n */\n divScalarVec3(s, v, dest) {\n if (!dest) {\n dest = v;\n }\n dest[0] = s / v[0];\n dest[1] = s / v[1];\n dest[2] = s / v[2];\n return dest;\n },\n\n /**\n * Divides a three-element vector by a scalar.\n * @method divVec3Scalar\n * @static\n * @param v vec3\n * @param s scalar\n * @param dest vec3 - optional destination\n * @return [] dest if specified, v otherwise\n */\n divVec3Scalar(v, s, dest) {\n if (!dest) {\n dest = v;\n }\n dest[0] = v[0] / s;\n dest[1] = v[1] / s;\n dest[2] = v[2] / s;\n return dest;\n },\n\n /**\n * Divides a four-element vector by a scalar.\n * @method divVec4Scalar\n * @static\n * @param v vec4\n * @param s scalar\n * @param dest vec4 - optional destination\n * @return [] dest if specified, v otherwise\n */\n divVec4Scalar(v, s, dest) {\n if (!dest) {\n dest = v;\n }\n dest[0] = v[0] / s;\n dest[1] = v[1] / s;\n dest[2] = v[2] / s;\n dest[3] = v[3] / s;\n return dest;\n },\n\n\n /**\n * Divides a scalar by a four-element vector, returning a new vector.\n * @method divScalarVec4\n * @static\n * @param s scalar\n * @param v vec4\n * @param dest vec4 - optional destination\n * @return [] dest if specified, v otherwise\n */\n divScalarVec4(s, v, dest) {\n if (!dest) {\n dest = v;\n }\n dest[0] = s / v[0];\n dest[1] = s / v[1];\n dest[2] = s / v[2];\n dest[3] = s / v[3];\n return dest;\n },\n\n /**\n * Returns the dot product of two four-element vectors.\n * @method dotVec4\n * @static\n * @param {Array(Number)} u First vector\n * @param {Array(Number)} v Second vector\n * @return The dot product\n */\n dotVec4(u, v) {\n return (u[0] * v[0] + u[1] * v[1] + u[2] * v[2] + u[3] * v[3]);\n },\n\n /**\n * Returns the cross product of two four-element vectors.\n * @method cross3Vec4\n * @static\n * @param {Array(Number)} u First vector\n * @param {Array(Number)} v Second vector\n * @return The cross product\n */\n cross3Vec4(u, v) {\n const u0 = u[0];\n const u1 = u[1];\n const u2 = u[2];\n const v0 = v[0];\n const v1 = v[1];\n const v2 = v[2];\n return [\n u1 * v2 - u2 * v1,\n u2 * v0 - u0 * v2,\n u0 * v1 - u1 * v0,\n 0.0];\n },\n\n /**\n * Returns the cross product of two three-element vectors.\n * @method cross3Vec3\n * @static\n * @param {Array(Number)} u First vector\n * @param {Array(Number)} v Second vector\n * @return The cross product\n */\n cross3Vec3(u, v, dest) {\n if (!dest) {\n dest = u;\n }\n const x = u[0];\n const y = u[1];\n const z = u[2];\n const x2 = v[0];\n const y2 = v[1];\n const z2 = v[2];\n dest[0] = y * z2 - z * y2;\n dest[1] = z * x2 - x * z2;\n dest[2] = x * y2 - y * x2;\n return dest;\n },\n\n\n sqLenVec4(v) { // TODO\n return math.dotVec4(v, v);\n },\n\n /**\n * Returns the length of a four-element vector.\n * @method lenVec4\n * @static\n * @param {Array(Number)} v The vector\n * @return The length\n */\n lenVec4(v) {\n return Math.sqrt(math.sqLenVec4(v));\n },\n\n /**\n * Returns the dot product of two three-element vectors.\n * @method dotVec3\n * @static\n * @param {Array(Number)} u First vector\n * @param {Array(Number)} v Second vector\n * @return The dot product\n */\n dotVec3(u, v) {\n return (u[0] * v[0] + u[1] * v[1] + u[2] * v[2]);\n },\n\n /**\n * Returns the dot product of two two-element vectors.\n * @method dotVec4\n * @static\n * @param {Array(Number)} u First vector\n * @param {Array(Number)} v Second vector\n * @return The dot product\n */\n dotVec2(u, v) {\n return (u[0] * v[0] + u[1] * v[1]);\n },\n\n\n sqLenVec3(v) {\n return math.dotVec3(v, v);\n },\n\n\n sqLenVec2(v) {\n return math.dotVec2(v, v);\n },\n\n /**\n * Returns the length of a three-element vector.\n * @method lenVec3\n * @static\n * @param {Array(Number)} v The vector\n * @return The length\n */\n lenVec3(v) {\n return Math.sqrt(math.sqLenVec3(v));\n },\n\n distVec3: ((() => {\n const vec = new FloatArrayType(3);\n return (v, w) => math.lenVec3(math.subVec3(v, w, vec));\n }))(),\n\n /**\n * Returns the length of a two-element vector.\n * @method lenVec2\n * @static\n * @param {Array(Number)} v The vector\n * @return The length\n */\n lenVec2(v) {\n return Math.sqrt(math.sqLenVec2(v));\n },\n\n distVec2: ((() => {\n const vec = new FloatArrayType(2);\n return (v, w) => math.lenVec2(math.subVec2(v, w, vec));\n }))(),\n\n /**\n * @method rcpVec3\n * @static\n * @param v vec3\n * @param dest vec3 - optional destination\n * @return [] dest if specified, v otherwise\n *\n */\n rcpVec3(v, dest) {\n return math.divScalarVec3(1.0, v, dest);\n },\n\n /**\n * Normalizes a four-element vector\n * @method normalizeVec4\n * @static\n * @param v vec4\n * @param dest vec4 - optional destination\n * @return [] dest if specified, v otherwise\n *\n */\n normalizeVec4(v, dest) {\n const f = 1.0 / math.lenVec4(v);\n return math.mulVec4Scalar(v, f, dest);\n },\n\n /**\n * Normalizes a three-element vector\n * @method normalizeVec4\n * @static\n */\n normalizeVec3(v, dest) {\n const f = 1.0 / math.lenVec3(v);\n return math.mulVec3Scalar(v, f, dest);\n },\n\n /**\n * Normalizes a two-element vector\n * @method normalizeVec2\n * @static\n */\n normalizeVec2(v, dest) {\n const f = 1.0 / math.lenVec2(v);\n return math.mulVec2Scalar(v, f, dest);\n },\n\n /**\n * Gets the angle between two vectors\n * @method angleVec3\n * @param v\n * @param w\n * @returns {number}\n */\n angleVec3(v, w) {\n let theta = math.dotVec3(v, w) / (Math.sqrt(math.sqLenVec3(v) * math.sqLenVec3(w)));\n theta = theta < -1 ? -1 : (theta > 1 ? 1 : theta); // Clamp to handle numerical problems\n return Math.acos(theta);\n },\n\n /**\n * Creates a three-element vector from the rotation part of a sixteen-element matrix.\n * @param m\n * @param dest\n */\n vec3FromMat4Scale: ((() => {\n\n const tempVec3 = new FloatArrayType(3);\n\n return (m, dest) => {\n\n tempVec3[0] = m[0];\n tempVec3[1] = m[1];\n tempVec3[2] = m[2];\n\n dest[0] = math.lenVec3(tempVec3);\n\n tempVec3[0] = m[4];\n tempVec3[1] = m[5];\n tempVec3[2] = m[6];\n\n dest[1] = math.lenVec3(tempVec3);\n\n tempVec3[0] = m[8];\n tempVec3[1] = m[9];\n tempVec3[2] = m[10];\n\n dest[2] = math.lenVec3(tempVec3);\n\n return dest;\n };\n }))(),\n\n /**\n * Converts an n-element vector to a JSON-serializable\n * array with values rounded to two decimal places.\n */\n vecToArray: ((() => {\n function trunc(v) {\n return Math.round(v * 100000) / 100000\n }\n\n return v => {\n v = Array.prototype.slice.call(v);\n for (let i = 0, len = v.length; i < len; i++) {\n v[i] = trunc(v[i]);\n }\n return v;\n };\n }))(),\n\n /**\n * Converts a 3-element vector from an array to an object of the form ````{x:999, y:999, z:999}````.\n * @param arr\n * @returns {{x: *, y: *, z: *}}\n */\n xyzArrayToObject(arr) {\n return {\"x\": arr[0], \"y\": arr[1], \"z\": arr[2]};\n },\n\n /**\n * Converts a 3-element vector object of the form ````{x:999, y:999, z:999}```` to an array.\n * @param xyz\n * @param [arry]\n * @returns {*[]}\n */\n xyzObjectToArray(xyz, arry) {\n arry = arry || new FloatArrayType(3);\n arry[0] = xyz.x;\n arry[1] = xyz.y;\n arry[2] = xyz.z;\n return arry;\n },\n\n /**\n * Duplicates a 4x4 identity matrix.\n * @method dupMat4\n * @static\n */\n dupMat4(m) {\n return m.slice(0, 16);\n },\n\n /**\n * Extracts a 3x3 matrix from a 4x4 matrix.\n * @method mat4To3\n * @static\n */\n mat4To3(m) {\n return [\n m[0], m[1], m[2],\n m[4], m[5], m[6],\n m[8], m[9], m[10]\n ];\n },\n\n /**\n * Returns a 4x4 matrix with each element set to the given scalar value.\n * @method m4s\n * @static\n */\n m4s(s) {\n return [\n s, s, s, s,\n s, s, s, s,\n s, s, s, s,\n s, s, s, s\n ];\n },\n\n /**\n * Returns a 4x4 matrix with each element set to zero.\n * @method setMat4ToZeroes\n * @static\n */\n setMat4ToZeroes() {\n return math.m4s(0.0);\n },\n\n /**\n * Returns a 4x4 matrix with each element set to 1.0.\n * @method setMat4ToOnes\n * @static\n */\n setMat4ToOnes() {\n return math.m4s(1.0);\n },\n\n /**\n * Returns a 4x4 matrix with each element set to 1.0.\n * @method setMat4ToOnes\n * @static\n */\n diagonalMat4v(v) {\n return new FloatArrayType([\n v[0], 0.0, 0.0, 0.0,\n 0.0, v[1], 0.0, 0.0,\n 0.0, 0.0, v[2], 0.0,\n 0.0, 0.0, 0.0, v[3]\n ]);\n },\n\n /**\n * Returns a 4x4 matrix with diagonal elements set to the given vector.\n * @method diagonalMat4c\n * @static\n */\n diagonalMat4c(x, y, z, w) {\n return math.diagonalMat4v([x, y, z, w]);\n },\n\n /**\n * Returns a 4x4 matrix with diagonal elements set to the given scalar.\n * @method diagonalMat4s\n * @static\n */\n diagonalMat4s(s) {\n return math.diagonalMat4c(s, s, s, s);\n },\n\n /**\n * Returns a 4x4 identity matrix.\n * @method identityMat4\n * @static\n */\n identityMat4(mat = new FloatArrayType(16)) {\n mat[0] = 1.0;\n mat[1] = 0.0;\n mat[2] = 0.0;\n mat[3] = 0.0;\n\n mat[4] = 0.0;\n mat[5] = 1.0;\n mat[6] = 0.0;\n mat[7] = 0.0;\n\n mat[8] = 0.0;\n mat[9] = 0.0;\n mat[10] = 1.0;\n mat[11] = 0.0;\n\n mat[12] = 0.0;\n mat[13] = 0.0;\n mat[14] = 0.0;\n mat[15] = 1.0;\n\n return mat;\n },\n\n /**\n * Returns a 3x3 identity matrix.\n * @method identityMat3\n * @static\n */\n identityMat3(mat = new FloatArrayType(9)) {\n mat[0] = 1.0;\n mat[1] = 0.0;\n mat[2] = 0.0;\n\n mat[3] = 0.0;\n mat[4] = 1.0;\n mat[5] = 0.0;\n\n mat[6] = 0.0;\n mat[7] = 0.0;\n mat[8] = 1.0;\n\n return mat;\n },\n\n /**\n * Tests if the given 4x4 matrix is the identity matrix.\n * @method isIdentityMat4\n * @static\n */\n isIdentityMat4(m) {\n if (m[0] !== 1.0 || m[1] !== 0.0 || m[2] !== 0.0 || m[3] !== 0.0 ||\n m[4] !== 0.0 || m[5] !== 1.0 || m[6] !== 0.0 || m[7] !== 0.0 ||\n m[8] !== 0.0 || m[9] !== 0.0 || m[10] !== 1.0 || m[11] !== 0.0 ||\n m[12] !== 0.0 || m[13] !== 0.0 || m[14] !== 0.0 || m[15] !== 1.0) {\n return false;\n }\n return true;\n },\n\n /**\n * Negates the given 4x4 matrix.\n * @method negateMat4\n * @static\n */\n negateMat4(m, dest) {\n if (!dest) {\n dest = m;\n }\n dest[0] = -m[0];\n dest[1] = -m[1];\n dest[2] = -m[2];\n dest[3] = -m[3];\n dest[4] = -m[4];\n dest[5] = -m[5];\n dest[6] = -m[6];\n dest[7] = -m[7];\n dest[8] = -m[8];\n dest[9] = -m[9];\n dest[10] = -m[10];\n dest[11] = -m[11];\n dest[12] = -m[12];\n dest[13] = -m[13];\n dest[14] = -m[14];\n dest[15] = -m[15];\n return dest;\n },\n\n /**\n * Adds the given 4x4 matrices together.\n * @method addMat4\n * @static\n */\n addMat4(a, b, dest) {\n if (!dest) {\n dest = a;\n }\n dest[0] = a[0] + b[0];\n dest[1] = a[1] + b[1];\n dest[2] = a[2] + b[2];\n dest[3] = a[3] + b[3];\n dest[4] = a[4] + b[4];\n dest[5] = a[5] + b[5];\n dest[6] = a[6] + b[6];\n dest[7] = a[7] + b[7];\n dest[8] = a[8] + b[8];\n dest[9] = a[9] + b[9];\n dest[10] = a[10] + b[10];\n dest[11] = a[11] + b[11];\n dest[12] = a[12] + b[12];\n dest[13] = a[13] + b[13];\n dest[14] = a[14] + b[14];\n dest[15] = a[15] + b[15];\n return dest;\n },\n\n /**\n * Adds the given scalar to each element of the given 4x4 matrix.\n * @method addMat4Scalar\n * @static\n */\n addMat4Scalar(m, s, dest) {\n if (!dest) {\n dest = m;\n }\n dest[0] = m[0] + s;\n dest[1] = m[1] + s;\n dest[2] = m[2] + s;\n dest[3] = m[3] + s;\n dest[4] = m[4] + s;\n dest[5] = m[5] + s;\n dest[6] = m[6] + s;\n dest[7] = m[7] + s;\n dest[8] = m[8] + s;\n dest[9] = m[9] + s;\n dest[10] = m[10] + s;\n dest[11] = m[11] + s;\n dest[12] = m[12] + s;\n dest[13] = m[13] + s;\n dest[14] = m[14] + s;\n dest[15] = m[15] + s;\n return dest;\n },\n\n /**\n * Adds the given scalar to each element of the given 4x4 matrix.\n * @method addScalarMat4\n * @static\n */\n addScalarMat4(s, m, dest) {\n return math.addMat4Scalar(m, s, dest);\n },\n\n /**\n * Subtracts the second 4x4 matrix from the first.\n * @method subMat4\n * @static\n */\n subMat4(a, b, dest) {\n if (!dest) {\n dest = a;\n }\n dest[0] = a[0] - b[0];\n dest[1] = a[1] - b[1];\n dest[2] = a[2] - b[2];\n dest[3] = a[3] - b[3];\n dest[4] = a[4] - b[4];\n dest[5] = a[5] - b[5];\n dest[6] = a[6] - b[6];\n dest[7] = a[7] - b[7];\n dest[8] = a[8] - b[8];\n dest[9] = a[9] - b[9];\n dest[10] = a[10] - b[10];\n dest[11] = a[11] - b[11];\n dest[12] = a[12] - b[12];\n dest[13] = a[13] - b[13];\n dest[14] = a[14] - b[14];\n dest[15] = a[15] - b[15];\n return dest;\n },\n\n /**\n * Subtracts the given scalar from each element of the given 4x4 matrix.\n * @method subMat4Scalar\n * @static\n */\n subMat4Scalar(m, s, dest) {\n if (!dest) {\n dest = m;\n }\n dest[0] = m[0] - s;\n dest[1] = m[1] - s;\n dest[2] = m[2] - s;\n dest[3] = m[3] - s;\n dest[4] = m[4] - s;\n dest[5] = m[5] - s;\n dest[6] = m[6] - s;\n dest[7] = m[7] - s;\n dest[8] = m[8] - s;\n dest[9] = m[9] - s;\n dest[10] = m[10] - s;\n dest[11] = m[11] - s;\n dest[12] = m[12] - s;\n dest[13] = m[13] - s;\n dest[14] = m[14] - s;\n dest[15] = m[15] - s;\n return dest;\n },\n\n /**\n * Subtracts the given scalar from each element of the given 4x4 matrix.\n * @method subScalarMat4\n * @static\n */\n subScalarMat4(s, m, dest) {\n if (!dest) {\n dest = m;\n }\n dest[0] = s - m[0];\n dest[1] = s - m[1];\n dest[2] = s - m[2];\n dest[3] = s - m[3];\n dest[4] = s - m[4];\n dest[5] = s - m[5];\n dest[6] = s - m[6];\n dest[7] = s - m[7];\n dest[8] = s - m[8];\n dest[9] = s - m[9];\n dest[10] = s - m[10];\n dest[11] = s - m[11];\n dest[12] = s - m[12];\n dest[13] = s - m[13];\n dest[14] = s - m[14];\n dest[15] = s - m[15];\n return dest;\n },\n\n /**\n * Multiplies the two given 4x4 matrix by each other.\n * @method mulMat4\n * @static\n */\n mulMat4(a, b, dest) {\n if (!dest) {\n dest = a;\n }\n\n // Cache the matrix values (makes for huge speed increases!)\n const a00 = a[0];\n\n const a01 = a[1];\n const a02 = a[2];\n const a03 = a[3];\n const a10 = a[4];\n const a11 = a[5];\n const a12 = a[6];\n const a13 = a[7];\n const a20 = a[8];\n const a21 = a[9];\n const a22 = a[10];\n const a23 = a[11];\n const a30 = a[12];\n const a31 = a[13];\n const a32 = a[14];\n const a33 = a[15];\n const b00 = b[0];\n const b01 = b[1];\n const b02 = b[2];\n const b03 = b[3];\n const b10 = b[4];\n const b11 = b[5];\n const b12 = b[6];\n const b13 = b[7];\n const b20 = b[8];\n const b21 = b[9];\n const b22 = b[10];\n const b23 = b[11];\n const b30 = b[12];\n const b31 = b[13];\n const b32 = b[14];\n const b33 = b[15];\n\n dest[0] = b00 * a00 + b01 * a10 + b02 * a20 + b03 * a30;\n dest[1] = b00 * a01 + b01 * a11 + b02 * a21 + b03 * a31;\n dest[2] = b00 * a02 + b01 * a12 + b02 * a22 + b03 * a32;\n dest[3] = b00 * a03 + b01 * a13 + b02 * a23 + b03 * a33;\n dest[4] = b10 * a00 + b11 * a10 + b12 * a20 + b13 * a30;\n dest[5] = b10 * a01 + b11 * a11 + b12 * a21 + b13 * a31;\n dest[6] = b10 * a02 + b11 * a12 + b12 * a22 + b13 * a32;\n dest[7] = b10 * a03 + b11 * a13 + b12 * a23 + b13 * a33;\n dest[8] = b20 * a00 + b21 * a10 + b22 * a20 + b23 * a30;\n dest[9] = b20 * a01 + b21 * a11 + b22 * a21 + b23 * a31;\n dest[10] = b20 * a02 + b21 * a12 + b22 * a22 + b23 * a32;\n dest[11] = b20 * a03 + b21 * a13 + b22 * a23 + b23 * a33;\n dest[12] = b30 * a00 + b31 * a10 + b32 * a20 + b33 * a30;\n dest[13] = b30 * a01 + b31 * a11 + b32 * a21 + b33 * a31;\n dest[14] = b30 * a02 + b31 * a12 + b32 * a22 + b33 * a32;\n dest[15] = b30 * a03 + b31 * a13 + b32 * a23 + b33 * a33;\n\n return dest;\n },\n\n /**\n * Multiplies the two given 3x3 matrices by each other.\n * @method mulMat4\n * @static\n */\n mulMat3(a, b, dest) {\n if (!dest) {\n dest = new FloatArrayType(9);\n }\n\n const a11 = a[0];\n const a12 = a[3];\n const a13 = a[6];\n const a21 = a[1];\n const a22 = a[4];\n const a23 = a[7];\n const a31 = a[2];\n const a32 = a[5];\n const a33 = a[8];\n const b11 = b[0];\n const b12 = b[3];\n const b13 = b[6];\n const b21 = b[1];\n const b22 = b[4];\n const b23 = b[7];\n const b31 = b[2];\n const b32 = b[5];\n const b33 = b[8];\n\n dest[0] = a11 * b11 + a12 * b21 + a13 * b31;\n dest[3] = a11 * b12 + a12 * b22 + a13 * b32;\n dest[6] = a11 * b13 + a12 * b23 + a13 * b33;\n\n dest[1] = a21 * b11 + a22 * b21 + a23 * b31;\n dest[4] = a21 * b12 + a22 * b22 + a23 * b32;\n dest[7] = a21 * b13 + a22 * b23 + a23 * b33;\n\n dest[2] = a31 * b11 + a32 * b21 + a33 * b31;\n dest[5] = a31 * b12 + a32 * b22 + a33 * b32;\n dest[8] = a31 * b13 + a32 * b23 + a33 * b33;\n\n return dest;\n },\n\n /**\n * Multiplies each element of the given 4x4 matrix by the given scalar.\n * @method mulMat4Scalar\n * @static\n */\n mulMat4Scalar(m, s, dest) {\n if (!dest) {\n dest = m;\n }\n dest[0] = m[0] * s;\n dest[1] = m[1] * s;\n dest[2] = m[2] * s;\n dest[3] = m[3] * s;\n dest[4] = m[4] * s;\n dest[5] = m[5] * s;\n dest[6] = m[6] * s;\n dest[7] = m[7] * s;\n dest[8] = m[8] * s;\n dest[9] = m[9] * s;\n dest[10] = m[10] * s;\n dest[11] = m[11] * s;\n dest[12] = m[12] * s;\n dest[13] = m[13] * s;\n dest[14] = m[14] * s;\n dest[15] = m[15] * s;\n return dest;\n },\n\n /**\n * Multiplies the given 4x4 matrix by the given four-element vector.\n * @method mulMat4v4\n * @static\n */\n mulMat4v4(m, v, dest = math.vec4()) {\n const v0 = v[0];\n const v1 = v[1];\n const v2 = v[2];\n const v3 = v[3];\n dest[0] = m[0] * v0 + m[4] * v1 + m[8] * v2 + m[12] * v3;\n dest[1] = m[1] * v0 + m[5] * v1 + m[9] * v2 + m[13] * v3;\n dest[2] = m[2] * v0 + m[6] * v1 + m[10] * v2 + m[14] * v3;\n dest[3] = m[3] * v0 + m[7] * v1 + m[11] * v2 + m[15] * v3;\n return dest;\n },\n\n /**\n * Transposes the given 4x4 matrix.\n * @method transposeMat4\n * @static\n */\n transposeMat4(mat, dest) {\n // If we are transposing ourselves we can skip a few steps but have to cache some values\n const m4 = mat[4];\n\n const m14 = mat[14];\n const m8 = mat[8];\n const m13 = mat[13];\n const m12 = mat[12];\n const m9 = mat[9];\n if (!dest || mat === dest) {\n const a01 = mat[1];\n const a02 = mat[2];\n const a03 = mat[3];\n const a12 = mat[6];\n const a13 = mat[7];\n const a23 = mat[11];\n mat[1] = m4;\n mat[2] = m8;\n mat[3] = m12;\n mat[4] = a01;\n mat[6] = m9;\n mat[7] = m13;\n mat[8] = a02;\n mat[9] = a12;\n mat[11] = m14;\n mat[12] = a03;\n mat[13] = a13;\n mat[14] = a23;\n return mat;\n }\n dest[0] = mat[0];\n dest[1] = m4;\n dest[2] = m8;\n dest[3] = m12;\n dest[4] = mat[1];\n dest[5] = mat[5];\n dest[6] = m9;\n dest[7] = m13;\n dest[8] = mat[2];\n dest[9] = mat[6];\n dest[10] = mat[10];\n dest[11] = m14;\n dest[12] = mat[3];\n dest[13] = mat[7];\n dest[14] = mat[11];\n dest[15] = mat[15];\n return dest;\n },\n\n /**\n * Transposes the given 3x3 matrix.\n *\n * @method transposeMat3\n * @static\n */\n transposeMat3(mat, dest) {\n if (dest === mat) {\n const a01 = mat[1];\n const a02 = mat[2];\n const a12 = mat[5];\n dest[1] = mat[3];\n dest[2] = mat[6];\n dest[3] = a01;\n dest[5] = mat[7];\n dest[6] = a02;\n dest[7] = a12;\n } else {\n dest[0] = mat[0];\n dest[1] = mat[3];\n dest[2] = mat[6];\n dest[3] = mat[1];\n dest[4] = mat[4];\n dest[5] = mat[7];\n dest[6] = mat[2];\n dest[7] = mat[5];\n dest[8] = mat[8];\n }\n return dest;\n },\n\n /**\n * Returns the determinant of the given 4x4 matrix.\n * @method determinantMat4\n * @static\n */\n determinantMat4(mat) {\n // Cache the matrix values (makes for huge speed increases!)\n const a00 = mat[0];\n\n const a01 = mat[1];\n const a02 = mat[2];\n const a03 = mat[3];\n const a10 = mat[4];\n const a11 = mat[5];\n const a12 = mat[6];\n const a13 = mat[7];\n const a20 = mat[8];\n const a21 = mat[9];\n const a22 = mat[10];\n const a23 = mat[11];\n const a30 = mat[12];\n const a31 = mat[13];\n const a32 = mat[14];\n const a33 = mat[15];\n return a30 * a21 * a12 * a03 - a20 * a31 * a12 * a03 - a30 * a11 * a22 * a03 + a10 * a31 * a22 * a03 +\n a20 * a11 * a32 * a03 - a10 * a21 * a32 * a03 - a30 * a21 * a02 * a13 + a20 * a31 * a02 * a13 +\n a30 * a01 * a22 * a13 - a00 * a31 * a22 * a13 - a20 * a01 * a32 * a13 + a00 * a21 * a32 * a13 +\n a30 * a11 * a02 * a23 - a10 * a31 * a02 * a23 - a30 * a01 * a12 * a23 + a00 * a31 * a12 * a23 +\n a10 * a01 * a32 * a23 - a00 * a11 * a32 * a23 - a20 * a11 * a02 * a33 + a10 * a21 * a02 * a33 +\n a20 * a01 * a12 * a33 - a00 * a21 * a12 * a33 - a10 * a01 * a22 * a33 + a00 * a11 * a22 * a33;\n },\n\n /**\n * Returns the inverse of the given 4x4 matrix.\n * @method inverseMat4\n * @static\n */\n inverseMat4(mat, dest) {\n if (!dest) {\n dest = mat;\n }\n\n // Cache the matrix values (makes for huge speed increases!)\n const a00 = mat[0];\n\n const a01 = mat[1];\n const a02 = mat[2];\n const a03 = mat[3];\n const a10 = mat[4];\n const a11 = mat[5];\n const a12 = mat[6];\n const a13 = mat[7];\n const a20 = mat[8];\n const a21 = mat[9];\n const a22 = mat[10];\n const a23 = mat[11];\n const a30 = mat[12];\n const a31 = mat[13];\n const a32 = mat[14];\n const a33 = mat[15];\n const b00 = a00 * a11 - a01 * a10;\n const b01 = a00 * a12 - a02 * a10;\n const b02 = a00 * a13 - a03 * a10;\n const b03 = a01 * a12 - a02 * a11;\n const b04 = a01 * a13 - a03 * a11;\n const b05 = a02 * a13 - a03 * a12;\n const b06 = a20 * a31 - a21 * a30;\n const b07 = a20 * a32 - a22 * a30;\n const b08 = a20 * a33 - a23 * a30;\n const b09 = a21 * a32 - a22 * a31;\n const b10 = a21 * a33 - a23 * a31;\n const b11 = a22 * a33 - a23 * a32;\n\n // Calculate the determinant (inlined to avoid double-caching)\n const invDet = 1 / (b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06);\n\n dest[0] = (a11 * b11 - a12 * b10 + a13 * b09) * invDet;\n dest[1] = (-a01 * b11 + a02 * b10 - a03 * b09) * invDet;\n dest[2] = (a31 * b05 - a32 * b04 + a33 * b03) * invDet;\n dest[3] = (-a21 * b05 + a22 * b04 - a23 * b03) * invDet;\n dest[4] = (-a10 * b11 + a12 * b08 - a13 * b07) * invDet;\n dest[5] = (a00 * b11 - a02 * b08 + a03 * b07) * invDet;\n dest[6] = (-a30 * b05 + a32 * b02 - a33 * b01) * invDet;\n dest[7] = (a20 * b05 - a22 * b02 + a23 * b01) * invDet;\n dest[8] = (a10 * b10 - a11 * b08 + a13 * b06) * invDet;\n dest[9] = (-a00 * b10 + a01 * b08 - a03 * b06) * invDet;\n dest[10] = (a30 * b04 - a31 * b02 + a33 * b00) * invDet;\n dest[11] = (-a20 * b04 + a21 * b02 - a23 * b00) * invDet;\n dest[12] = (-a10 * b09 + a11 * b07 - a12 * b06) * invDet;\n dest[13] = (a00 * b09 - a01 * b07 + a02 * b06) * invDet;\n dest[14] = (-a30 * b03 + a31 * b01 - a32 * b00) * invDet;\n dest[15] = (a20 * b03 - a21 * b01 + a22 * b00) * invDet;\n\n return dest;\n },\n\n /**\n * Returns the trace of the given 4x4 matrix.\n * @method traceMat4\n * @static\n */\n traceMat4(m) {\n return (m[0] + m[5] + m[10] + m[15]);\n },\n\n /**\n * Returns 4x4 translation matrix.\n * @method translationMat4\n * @static\n */\n translationMat4v(v, dest) {\n const m = dest || math.identityMat4();\n m[12] = v[0];\n m[13] = v[1];\n m[14] = v[2];\n return m;\n },\n\n /**\n * Returns 3x3 translation matrix.\n * @method translationMat3\n * @static\n */\n translationMat3v(v, dest) {\n const m = dest || math.identityMat3();\n m[6] = v[0];\n m[7] = v[1];\n return m;\n },\n\n /**\n * Returns 4x4 translation matrix.\n * @method translationMat4c\n * @static\n */\n translationMat4c: ((() => {\n const xyz = new FloatArrayType(3);\n return (x, y, z, dest) => {\n xyz[0] = x;\n xyz[1] = y;\n xyz[2] = z;\n return math.translationMat4v(xyz, dest);\n };\n }))(),\n\n /**\n * Returns 4x4 translation matrix.\n * @method translationMat4s\n * @static\n */\n translationMat4s(s, dest) {\n return math.translationMat4c(s, s, s, dest);\n },\n\n /**\n * Efficiently post-concatenates a translation to the given matrix.\n * @param v\n * @param m\n */\n translateMat4v(xyz, m) {\n return math.translateMat4c(xyz[0], xyz[1], xyz[2], m);\n },\n\n /**\n * Efficiently post-concatenates a translation to the given matrix.\n * @param x\n * @param y\n * @param z\n * @param m\n */\n OLDtranslateMat4c(x, y, z, m) {\n\n const m12 = m[12];\n m[0] += m12 * x;\n m[4] += m12 * y;\n m[8] += m12 * z;\n\n const m13 = m[13];\n m[1] += m13 * x;\n m[5] += m13 * y;\n m[9] += m13 * z;\n\n const m14 = m[14];\n m[2] += m14 * x;\n m[6] += m14 * y;\n m[10] += m14 * z;\n\n const m15 = m[15];\n m[3] += m15 * x;\n m[7] += m15 * y;\n m[11] += m15 * z;\n\n return m;\n },\n\n translateMat4c(x, y, z, m) {\n\n const m3 = m[3];\n m[0] += m3 * x;\n m[1] += m3 * y;\n m[2] += m3 * z;\n\n const m7 = m[7];\n m[4] += m7 * x;\n m[5] += m7 * y;\n m[6] += m7 * z;\n\n const m11 = m[11];\n m[8] += m11 * x;\n m[9] += m11 * y;\n m[10] += m11 * z;\n\n const m15 = m[15];\n m[12] += m15 * x;\n m[13] += m15 * y;\n m[14] += m15 * z;\n\n return m;\n },\n /**\n * Returns 4x4 rotation matrix.\n * @method rotationMat4v\n * @static\n */\n rotationMat4v(anglerad, axis, m) {\n const ax = math.normalizeVec4([axis[0], axis[1], axis[2], 0.0], []);\n const s = Math.sin(anglerad);\n const c = Math.cos(anglerad);\n const q = 1.0 - c;\n\n const x = ax[0];\n const y = ax[1];\n const z = ax[2];\n\n let xy;\n let yz;\n let zx;\n let xs;\n let ys;\n let zs;\n\n //xx = x * x; used once\n //yy = y * y; used once\n //zz = z * z; used once\n xy = x * y;\n yz = y * z;\n zx = z * x;\n xs = x * s;\n ys = y * s;\n zs = z * s;\n\n m = m || math.mat4();\n\n m[0] = (q * x * x) + c;\n m[1] = (q * xy) + zs;\n m[2] = (q * zx) - ys;\n m[3] = 0.0;\n\n m[4] = (q * xy) - zs;\n m[5] = (q * y * y) + c;\n m[6] = (q * yz) + xs;\n m[7] = 0.0;\n\n m[8] = (q * zx) + ys;\n m[9] = (q * yz) - xs;\n m[10] = (q * z * z) + c;\n m[11] = 0.0;\n\n m[12] = 0.0;\n m[13] = 0.0;\n m[14] = 0.0;\n m[15] = 1.0;\n\n return m;\n },\n\n /**\n * Returns 4x4 rotation matrix.\n * @method rotationMat4c\n * @static\n */\n rotationMat4c(anglerad, x, y, z, mat) {\n return math.rotationMat4v(anglerad, [x, y, z], mat);\n },\n\n /**\n * Returns 4x4 scale matrix.\n * @method scalingMat4v\n * @static\n */\n scalingMat4v(v, m = math.identityMat4()) {\n m[0] = v[0];\n m[5] = v[1];\n m[10] = v[2];\n return m;\n },\n\n /**\n * Returns 3x3 scale matrix.\n * @method scalingMat3v\n * @static\n */\n scalingMat3v(v, m = math.identityMat3()) {\n m[0] = v[0];\n m[4] = v[1];\n return m;\n },\n\n /**\n * Returns 4x4 scale matrix.\n * @method scalingMat4c\n * @static\n */\n scalingMat4c: ((() => {\n const xyz = new FloatArrayType(3);\n return (x, y, z, dest) => {\n xyz[0] = x;\n xyz[1] = y;\n xyz[2] = z;\n return math.scalingMat4v(xyz, dest);\n };\n }))(),\n\n /**\n * Efficiently post-concatenates a scaling to the given matrix.\n * @method scaleMat4c\n * @param x\n * @param y\n * @param z\n * @param m\n */\n scaleMat4c(x, y, z, m) {\n\n m[0] *= x;\n m[4] *= y;\n m[8] *= z;\n\n m[1] *= x;\n m[5] *= y;\n m[9] *= z;\n\n m[2] *= x;\n m[6] *= y;\n m[10] *= z;\n\n m[3] *= x;\n m[7] *= y;\n m[11] *= z;\n return m;\n },\n\n /**\n * Efficiently post-concatenates a scaling to the given matrix.\n * @method scaleMat4c\n * @param xyz\n * @param m\n */\n scaleMat4v(xyz, m) {\n\n const x = xyz[0];\n const y = xyz[1];\n const z = xyz[2];\n\n m[0] *= x;\n m[4] *= y;\n m[8] *= z;\n m[1] *= x;\n m[5] *= y;\n m[9] *= z;\n m[2] *= x;\n m[6] *= y;\n m[10] *= z;\n m[3] *= x;\n m[7] *= y;\n m[11] *= z;\n\n return m;\n },\n\n /**\n * Returns 4x4 scale matrix.\n * @method scalingMat4s\n * @static\n */\n scalingMat4s(s) {\n return math.scalingMat4c(s, s, s);\n },\n\n /**\n * Creates a matrix from a quaternion rotation and vector translation\n *\n * @param {Number[]} q Rotation quaternion\n * @param {Number[]} v Translation vector\n * @param {Number[]} dest Destination matrix\n * @returns {Number[]} dest\n */\n rotationTranslationMat4(q, v, dest = math.mat4()) {\n const x = q[0];\n const y = q[1];\n const z = q[2];\n const w = q[3];\n\n const x2 = x + x;\n const y2 = y + y;\n const z2 = z + z;\n const xx = x * x2;\n const xy = x * y2;\n const xz = x * z2;\n const yy = y * y2;\n const yz = y * z2;\n const zz = z * z2;\n const wx = w * x2;\n const wy = w * y2;\n const wz = w * z2;\n\n dest[0] = 1 - (yy + zz);\n dest[1] = xy + wz;\n dest[2] = xz - wy;\n dest[3] = 0;\n dest[4] = xy - wz;\n dest[5] = 1 - (xx + zz);\n dest[6] = yz + wx;\n dest[7] = 0;\n dest[8] = xz + wy;\n dest[9] = yz - wx;\n dest[10] = 1 - (xx + yy);\n dest[11] = 0;\n dest[12] = v[0];\n dest[13] = v[1];\n dest[14] = v[2];\n dest[15] = 1;\n\n return dest;\n },\n\n /**\n * Gets Euler angles from a 4x4 matrix.\n *\n * @param {Number[]} mat The 4x4 matrix.\n * @param {String} order Desired Euler angle order: \"XYZ\", \"YXZ\", \"ZXY\" etc.\n * @param {Number[]} [dest] Destination Euler angles, created by default.\n * @returns {Number[]} The Euler angles.\n */\n mat4ToEuler(mat, order, dest = math.vec4()) {\n const clamp = math.clamp;\n\n // Assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n const m11 = mat[0];\n\n const m12 = mat[4];\n const m13 = mat[8];\n const m21 = mat[1];\n const m22 = mat[5];\n const m23 = mat[9];\n const m31 = mat[2];\n const m32 = mat[6];\n const m33 = mat[10];\n\n if (order === 'XYZ') {\n\n dest[1] = Math.asin(clamp(m13, -1, 1));\n\n if (Math.abs(m13) < 0.99999) {\n dest[0] = Math.atan2(-m23, m33);\n dest[2] = Math.atan2(-m12, m11);\n } else {\n dest[0] = Math.atan2(m32, m22);\n dest[2] = 0;\n\n }\n\n } else if (order === 'YXZ') {\n\n dest[0] = Math.asin(-clamp(m23, -1, 1));\n\n if (Math.abs(m23) < 0.99999) {\n dest[1] = Math.atan2(m13, m33);\n dest[2] = Math.atan2(m21, m22);\n } else {\n dest[1] = Math.atan2(-m31, m11);\n dest[2] = 0;\n }\n\n } else if (order === 'ZXY') {\n\n dest[0] = Math.asin(clamp(m32, -1, 1));\n\n if (Math.abs(m32) < 0.99999) {\n dest[1] = Math.atan2(-m31, m33);\n dest[2] = Math.atan2(-m12, m22);\n } else {\n dest[1] = 0;\n dest[2] = Math.atan2(m21, m11);\n }\n\n } else if (order === 'ZYX') {\n\n dest[1] = Math.asin(-clamp(m31, -1, 1));\n\n if (Math.abs(m31) < 0.99999) {\n dest[0] = Math.atan2(m32, m33);\n dest[2] = Math.atan2(m21, m11);\n } else {\n dest[0] = 0;\n dest[2] = Math.atan2(-m12, m22);\n }\n\n } else if (order === 'YZX') {\n\n dest[2] = Math.asin(clamp(m21, -1, 1));\n\n if (Math.abs(m21) < 0.99999) {\n dest[0] = Math.atan2(-m23, m22);\n dest[1] = Math.atan2(-m31, m11);\n } else {\n dest[0] = 0;\n dest[1] = Math.atan2(m13, m33);\n }\n\n } else if (order === 'XZY') {\n\n dest[2] = Math.asin(-clamp(m12, -1, 1));\n\n if (Math.abs(m12) < 0.99999) {\n dest[0] = Math.atan2(m32, m22);\n dest[1] = Math.atan2(m13, m11);\n } else {\n dest[0] = Math.atan2(-m23, m33);\n dest[1] = 0;\n }\n }\n\n return dest;\n },\n\n composeMat4(position, quaternion, scale, mat = math.mat4()) {\n math.quaternionToRotationMat4(quaternion, mat);\n math.scaleMat4v(scale, mat);\n math.translateMat4v(position, mat);\n\n return mat;\n },\n\n decomposeMat4: (() => {\n\n const vec = new FloatArrayType(3);\n const matrix = new FloatArrayType(16);\n\n return function decompose(mat, position, quaternion, scale) {\n\n vec[0] = mat[0];\n vec[1] = mat[1];\n vec[2] = mat[2];\n\n let sx = math.lenVec3(vec);\n\n vec[0] = mat[4];\n vec[1] = mat[5];\n vec[2] = mat[6];\n\n const sy = math.lenVec3(vec);\n\n vec[8] = mat[8];\n vec[9] = mat[9];\n vec[10] = mat[10];\n\n const sz = math.lenVec3(vec);\n\n // if determine is negative, we need to invert one scale\n const det = math.determinantMat4(mat);\n\n if (det < 0) {\n sx = -sx;\n }\n\n position[0] = mat[12];\n position[1] = mat[13];\n position[2] = mat[14];\n\n // scale the rotation part\n matrix.set(mat);\n\n const invSX = 1 / sx;\n const invSY = 1 / sy;\n const invSZ = 1 / sz;\n\n matrix[0] *= invSX;\n matrix[1] *= invSX;\n matrix[2] *= invSX;\n\n matrix[4] *= invSY;\n matrix[5] *= invSY;\n matrix[6] *= invSY;\n\n matrix[8] *= invSZ;\n matrix[9] *= invSZ;\n matrix[10] *= invSZ;\n\n math.mat4ToQuaternion(matrix, quaternion);\n\n scale[0] = sx;\n scale[1] = sy;\n scale[2] = sz;\n\n return this;\n\n };\n\n })(),\n\n /**\n * Returns a 4x4 'lookat' viewing transform matrix.\n * @method lookAtMat4v\n * @param pos vec3 position of the viewer\n * @param target vec3 point the viewer is looking at\n * @param up vec3 pointing \"up\"\n * @param dest mat4 Optional, mat4 matrix will be written into\n *\n * @return {mat4} dest if specified, a new mat4 otherwise\n */\n lookAtMat4v(pos, target, up, dest) {\n if (!dest) {\n dest = math.mat4();\n }\n\n const posx = pos[0];\n const posy = pos[1];\n const posz = pos[2];\n const upx = up[0];\n const upy = up[1];\n const upz = up[2];\n const targetx = target[0];\n const targety = target[1];\n const targetz = target[2];\n\n if (posx === targetx && posy === targety && posz === targetz) {\n return math.identityMat4();\n }\n\n let z0;\n let z1;\n let z2;\n let x0;\n let x1;\n let x2;\n let y0;\n let y1;\n let y2;\n let len;\n\n //vec3.direction(eye, center, z);\n z0 = posx - targetx;\n z1 = posy - targety;\n z2 = posz - targetz;\n\n // normalize (no check needed for 0 because of early return)\n len = 1 / Math.sqrt(z0 * z0 + z1 * z1 + z2 * z2);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n\n //vec3.normalize(vec3.cross(up, z, x));\n x0 = upy * z2 - upz * z1;\n x1 = upz * z0 - upx * z2;\n x2 = upx * z1 - upy * z0;\n len = Math.sqrt(x0 * x0 + x1 * x1 + x2 * x2);\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 //vec3.normalize(vec3.cross(z, x, y));\n y0 = z1 * x2 - z2 * x1;\n y1 = z2 * x0 - z0 * x2;\n y2 = z0 * x1 - z1 * x0;\n\n len = Math.sqrt(y0 * y0 + y1 * y1 + y2 * y2);\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 dest[0] = x0;\n dest[1] = y0;\n dest[2] = z0;\n dest[3] = 0;\n dest[4] = x1;\n dest[5] = y1;\n dest[6] = z1;\n dest[7] = 0;\n dest[8] = x2;\n dest[9] = y2;\n dest[10] = z2;\n dest[11] = 0;\n dest[12] = -(x0 * posx + x1 * posy + x2 * posz);\n dest[13] = -(y0 * posx + y1 * posy + y2 * posz);\n dest[14] = -(z0 * posx + z1 * posy + z2 * posz);\n dest[15] = 1;\n\n return dest;\n },\n\n /**\n * Returns a 4x4 'lookat' viewing transform matrix.\n * @method lookAtMat4c\n * @static\n */\n lookAtMat4c(posx, posy, posz, targetx, targety, targetz, upx, upy, upz) {\n return math.lookAtMat4v([posx, posy, posz], [targetx, targety, targetz], [upx, upy, upz], []);\n },\n\n /**\n * Returns a 4x4 orthographic projection matrix.\n * @method orthoMat4c\n * @static\n */\n orthoMat4c(left, right, bottom, top, near, far, dest) {\n if (!dest) {\n dest = math.mat4();\n }\n const rl = (right - left);\n const tb = (top - bottom);\n const fn = (far - near);\n\n dest[0] = 2.0 / rl;\n dest[1] = 0.0;\n dest[2] = 0.0;\n dest[3] = 0.0;\n\n dest[4] = 0.0;\n dest[5] = 2.0 / tb;\n dest[6] = 0.0;\n dest[7] = 0.0;\n\n dest[8] = 0.0;\n dest[9] = 0.0;\n dest[10] = -2.0 / fn;\n dest[11] = 0.0;\n\n dest[12] = -(left + right) / rl;\n dest[13] = -(top + bottom) / tb;\n dest[14] = -(far + near) / fn;\n dest[15] = 1.0;\n\n return dest;\n },\n\n /**\n * Returns a 4x4 perspective projection matrix.\n * @method frustumMat4v\n * @static\n */\n frustumMat4v(fmin, fmax, m) {\n if (!m) {\n m = math.mat4();\n }\n\n const fmin4 = [fmin[0], fmin[1], fmin[2], 0.0];\n const fmax4 = [fmax[0], fmax[1], fmax[2], 0.0];\n\n math.addVec4(fmax4, fmin4, tempMat1);\n math.subVec4(fmax4, fmin4, tempMat2);\n\n const t = 2.0 * fmin4[2];\n\n const tempMat20 = tempMat2[0];\n const tempMat21 = tempMat2[1];\n const tempMat22 = tempMat2[2];\n\n m[0] = t / tempMat20;\n m[1] = 0.0;\n m[2] = 0.0;\n m[3] = 0.0;\n\n m[4] = 0.0;\n m[5] = t / tempMat21;\n m[6] = 0.0;\n m[7] = 0.0;\n\n m[8] = tempMat1[0] / tempMat20;\n m[9] = tempMat1[1] / tempMat21;\n m[10] = -tempMat1[2] / tempMat22;\n m[11] = -1.0;\n\n m[12] = 0.0;\n m[13] = 0.0;\n m[14] = -t * fmax4[2] / tempMat22;\n m[15] = 0.0;\n\n return m;\n },\n\n /**\n * Returns a 4x4 perspective projection matrix.\n * @method frustumMat4v\n * @static\n */\n frustumMat4(left, right, bottom, top, near, far, dest) {\n if (!dest) {\n dest = math.mat4();\n }\n const rl = (right - left);\n const tb = (top - bottom);\n const fn = (far - near);\n dest[0] = (near * 2) / rl;\n dest[1] = 0;\n dest[2] = 0;\n dest[3] = 0;\n dest[4] = 0;\n dest[5] = (near * 2) / tb;\n dest[6] = 0;\n dest[7] = 0;\n dest[8] = (right + left) / rl;\n dest[9] = (top + bottom) / tb;\n dest[10] = -(far + near) / fn;\n dest[11] = -1;\n dest[12] = 0;\n dest[13] = 0;\n dest[14] = -(far * near * 2) / fn;\n dest[15] = 0;\n return dest;\n },\n\n /**\n * Returns a 4x4 perspective projection matrix.\n * @method perspectiveMat4v\n * @static\n */\n perspectiveMat4(fovyrad, aspectratio, znear, zfar, m) {\n const pmin = [];\n const pmax = [];\n\n pmin[2] = znear;\n pmax[2] = zfar;\n\n pmax[1] = pmin[2] * Math.tan(fovyrad / 2.0);\n pmin[1] = -pmax[1];\n\n pmax[0] = pmax[1] * aspectratio;\n pmin[0] = -pmax[0];\n\n return math.frustumMat4v(pmin, pmax, m);\n },\n\n /**\n * Transforms a three-element position by a 4x4 matrix.\n * @method transformPoint3\n * @static\n */\n transformPoint3(m, p, dest = math.vec3()) {\n\n const x = p[0];\n const y = p[1];\n const z = p[2];\n\n dest[0] = (m[0] * x) + (m[4] * y) + (m[8] * z) + m[12];\n dest[1] = (m[1] * x) + (m[5] * y) + (m[9] * z) + m[13];\n dest[2] = (m[2] * x) + (m[6] * y) + (m[10] * z) + m[14];\n\n return dest;\n },\n\n /**\n * Transforms a homogeneous coordinate by a 4x4 matrix.\n * @method transformPoint3\n * @static\n */\n transformPoint4(m, v, dest = math.vec4()) {\n dest[0] = m[0] * v[0] + m[4] * v[1] + m[8] * v[2] + m[12] * v[3];\n dest[1] = m[1] * v[0] + m[5] * v[1] + m[9] * v[2] + m[13] * v[3];\n dest[2] = m[2] * v[0] + m[6] * v[1] + m[10] * v[2] + m[14] * v[3];\n dest[3] = m[3] * v[0] + m[7] * v[1] + m[11] * v[2] + m[15] * v[3];\n\n return dest;\n },\n\n\n /**\n * Transforms an array of three-element positions by a 4x4 matrix.\n * @method transformPoints3\n * @static\n */\n transformPoints3(m, points, points2) {\n const result = points2 || [];\n const len = points.length;\n let p0;\n let p1;\n let p2;\n let pi;\n\n // cache values\n const m0 = m[0];\n\n const m1 = m[1];\n const m2 = m[2];\n const m3 = m[3];\n const m4 = m[4];\n const m5 = m[5];\n const m6 = m[6];\n const m7 = m[7];\n const m8 = m[8];\n const m9 = m[9];\n const m10 = m[10];\n const m11 = m[11];\n const m12 = m[12];\n const m13 = m[13];\n const m14 = m[14];\n const m15 = m[15];\n\n let r;\n\n for (let i = 0; i < len; ++i) {\n\n // cache values\n pi = points[i];\n\n p0 = pi[0];\n p1 = pi[1];\n p2 = pi[2];\n\n r = result[i] || (result[i] = [0, 0, 0]);\n\n r[0] = (m0 * p0) + (m4 * p1) + (m8 * p2) + m12;\n r[1] = (m1 * p0) + (m5 * p1) + (m9 * p2) + m13;\n r[2] = (m2 * p0) + (m6 * p1) + (m10 * p2) + m14;\n r[3] = (m3 * p0) + (m7 * p1) + (m11 * p2) + m15;\n }\n\n result.length = len;\n\n return result;\n },\n\n /**\n * Transforms an array of positions by a 4x4 matrix.\n * @method transformPositions3\n * @static\n */\n transformPositions3(m, p, p2 = p) {\n let i;\n const len = p.length;\n\n let x;\n let y;\n let z;\n\n const m0 = m[0];\n const m1 = m[1];\n const m2 = m[2];\n const m3 = m[3];\n const m4 = m[4];\n const m5 = m[5];\n const m6 = m[6];\n const m7 = m[7];\n const m8 = m[8];\n const m9 = m[9];\n const m10 = m[10];\n const m11 = m[11];\n const m12 = m[12];\n const m13 = m[13];\n const m14 = m[14];\n const m15 = m[15];\n\n for (i = 0; i < len; i += 3) {\n\n x = p[i + 0];\n y = p[i + 1];\n z = p[i + 2];\n\n p2[i + 0] = (m0 * x) + (m4 * y) + (m8 * z) + m12;\n p2[i + 1] = (m1 * x) + (m5 * y) + (m9 * z) + m13;\n p2[i + 2] = (m2 * x) + (m6 * y) + (m10 * z) + m14;\n p2[i + 3] = (m3 * x) + (m7 * y) + (m11 * z) + m15;\n }\n\n return p2;\n },\n\n /**\n * Transforms an array of positions by a 4x4 matrix.\n * @method transformPositions4\n * @static\n */\n transformPositions4(m, p, p2 = p) {\n let i;\n const len = p.length;\n\n let x;\n let y;\n let z;\n\n const m0 = m[0];\n const m1 = m[1];\n const m2 = m[2];\n const m3 = m[3];\n const m4 = m[4];\n const m5 = m[5];\n const m6 = m[6];\n const m7 = m[7];\n const m8 = m[8];\n const m9 = m[9];\n const m10 = m[10];\n const m11 = m[11];\n const m12 = m[12];\n const m13 = m[13];\n const m14 = m[14];\n const m15 = m[15];\n\n for (i = 0; i < len; i += 4) {\n\n x = p[i + 0];\n y = p[i + 1];\n z = p[i + 2];\n\n p2[i + 0] = (m0 * x) + (m4 * y) + (m8 * z) + m12;\n p2[i + 1] = (m1 * x) + (m5 * y) + (m9 * z) + m13;\n p2[i + 2] = (m2 * x) + (m6 * y) + (m10 * z) + m14;\n p2[i + 3] = (m3 * x) + (m7 * y) + (m11 * z) + m15;\n }\n\n return p2;\n },\n\n /**\n * Transforms a three-element vector by a 4x4 matrix.\n * @method transformVec3\n * @static\n */\n transformVec3(m, v, dest) {\n const v0 = v[0];\n const v1 = v[1];\n const v2 = v[2];\n dest = dest || this.vec3();\n dest[0] = (m[0] * v0) + (m[4] * v1) + (m[8] * v2);\n dest[1] = (m[1] * v0) + (m[5] * v1) + (m[9] * v2);\n dest[2] = (m[2] * v0) + (m[6] * v1) + (m[10] * v2);\n return dest;\n },\n\n /**\n * Transforms a four-element vector by a 4x4 matrix.\n * @method transformVec4\n * @static\n */\n transformVec4(m, v, dest) {\n const v0 = v[0];\n const v1 = v[1];\n const v2 = v[2];\n const v3 = v[3];\n dest = dest || math.vec4();\n dest[0] = m[0] * v0 + m[4] * v1 + m[8] * v2 + m[12] * v3;\n dest[1] = m[1] * v0 + m[5] * v1 + m[9] * v2 + m[13] * v3;\n dest[2] = m[2] * v0 + m[6] * v1 + m[10] * v2 + m[14] * v3;\n dest[3] = m[3] * v0 + m[7] * v1 + m[11] * v2 + m[15] * v3;\n return dest;\n },\n\n /**\n * Rotate a 3D vector around the x-axis\n *\n * @method rotateVec3X\n * @param {Number[]} a The vec3 point to rotate\n * @param {Number[]} b The origin of the rotation\n * @param {Number} c The angle of rotation\n * @param {Number[]} dest The receiving vec3\n * @returns {Number[]} dest\n * @static\n */\n rotateVec3X(a, b, c, dest) {\n const p = [];\n const r = [];\n\n //Translate point to the origin\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2];\n\n //perform rotation\n r[0] = p[0];\n r[1] = p[1] * Math.cos(c) - p[2] * Math.sin(c);\n r[2] = p[1] * Math.sin(c) + p[2] * Math.cos(c);\n\n //translate to correct position\n dest[0] = r[0] + b[0];\n dest[1] = r[1] + b[1];\n dest[2] = r[2] + b[2];\n\n return dest;\n },\n\n /**\n * Rotate a 3D vector around the y-axis\n *\n * @method rotateVec3Y\n * @param {Number[]} a The vec3 point to rotate\n * @param {Number[]} b The origin of the rotation\n * @param {Number} c The angle of rotation\n * @param {Number[]} dest The receiving vec3\n * @returns {Number[]} dest\n * @static\n */\n rotateVec3Y(a, b, c, dest) {\n const p = [];\n const r = [];\n\n //Translate point to the origin\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2];\n\n //perform rotation\n r[0] = p[2] * Math.sin(c) + p[0] * Math.cos(c);\n r[1] = p[1];\n r[2] = p[2] * Math.cos(c) - p[0] * Math.sin(c);\n\n //translate to correct position\n dest[0] = r[0] + b[0];\n dest[1] = r[1] + b[1];\n dest[2] = r[2] + b[2];\n\n return dest;\n },\n\n /**\n * Rotate a 3D vector around the z-axis\n *\n * @method rotateVec3Z\n * @param {Number[]} a The vec3 point to rotate\n * @param {Number[]} b The origin of the rotation\n * @param {Number} c The angle of rotation\n * @param {Number[]} dest The receiving vec3\n * @returns {Number[]} dest\n * @static\n */\n rotateVec3Z(a, b, c, dest) {\n const p = [];\n const r = [];\n\n //Translate point to the origin\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2];\n\n //perform rotation\n r[0] = p[0] * Math.cos(c) - p[1] * Math.sin(c);\n r[1] = p[0] * Math.sin(c) + p[1] * Math.cos(c);\n r[2] = p[2];\n\n //translate to correct position\n dest[0] = r[0] + b[0];\n dest[1] = r[1] + b[1];\n dest[2] = r[2] + b[2];\n\n return dest;\n },\n\n /**\n * Transforms a four-element vector by a 4x4 projection matrix.\n *\n * @method projectVec4\n * @param {Number[]} p 3D View-space coordinate\n * @param {Number[]} q 2D Projected coordinate\n * @returns {Number[]} 2D Projected coordinate\n * @static\n */\n projectVec4(p, q) {\n const f = 1.0 / p[3];\n q = q || math.vec2();\n q[0] = v[0] * f;\n q[1] = v[1] * f;\n return q;\n },\n\n /**\n * Unprojects a three-element vector.\n *\n * @method unprojectVec3\n * @param {Number[]} p 3D Projected coordinate\n * @param {Number[]} viewMat View matrix\n * @returns {Number[]} projMat Projection matrix\n * @static\n */\n unprojectVec3: ((() => {\n const mat = new FloatArrayType(16);\n const mat2 = new FloatArrayType(16);\n const mat3 = new FloatArrayType(16);\n return function (p, viewMat, projMat, q) {\n return this.transformVec3(this.mulMat4(this.inverseMat4(viewMat, mat), this.inverseMat4(projMat, mat2), mat3), p, q)\n };\n }))(),\n\n /**\n * Linearly interpolates between two 3D vectors.\n * @method lerpVec3\n * @static\n */\n lerpVec3(t, t1, t2, p1, p2, dest) {\n const result = dest || math.vec3();\n const f = (t - t1) / (t2 - t1);\n result[0] = p1[0] + (f * (p2[0] - p1[0]));\n result[1] = p1[1] + (f * (p2[1] - p1[1]));\n result[2] = p1[2] + (f * (p2[2] - p1[2]));\n return result;\n },\n\n\n /**\n * Flattens a two-dimensional array into a one-dimensional array.\n *\n * @method flatten\n * @static\n * @param {Array of Arrays} a A 2D array\n * @returns Flattened 1D array\n */\n flatten(a) {\n\n const result = [];\n\n let i;\n let leni;\n let j;\n let lenj;\n let item;\n\n for (i = 0, leni = a.length; i < leni; i++) {\n item = a[i];\n for (j = 0, lenj = item.length; j < lenj; j++) {\n result.push(item[j]);\n }\n }\n\n return result;\n },\n\n\n identityQuaternion(dest = math.vec4()) {\n dest[0] = 0.0;\n dest[1] = 0.0;\n dest[2] = 0.0;\n dest[3] = 1.0;\n return dest;\n },\n\n /**\n * Initializes a quaternion from Euler angles.\n *\n * @param {Number[]} euler The Euler angles.\n * @param {String} order Euler angle order: \"XYZ\", \"YXZ\", \"ZXY\" etc.\n * @param {Number[]} [dest] Destination quaternion, created by default.\n * @returns {Number[]} The quaternion.\n */\n eulerToQuaternion(euler, order, dest = math.vec4()) {\n // http://www.mathworks.com/matlabcentral/fileexchange/\n // \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n //\tcontent/SpinCalc.m\n\n const a = (euler[0] * math.DEGTORAD) / 2;\n const b = (euler[1] * math.DEGTORAD) / 2;\n const c = (euler[2] * math.DEGTORAD) / 2;\n\n const c1 = Math.cos(a);\n const c2 = Math.cos(b);\n const c3 = Math.cos(c);\n const s1 = Math.sin(a);\n const s2 = Math.sin(b);\n const s3 = Math.sin(c);\n\n if (order === 'XYZ') {\n\n dest[0] = s1 * c2 * c3 + c1 * s2 * s3;\n dest[1] = c1 * s2 * c3 - s1 * c2 * s3;\n dest[2] = c1 * c2 * s3 + s1 * s2 * c3;\n dest[3] = c1 * c2 * c3 - s1 * s2 * s3;\n\n } else if (order === 'YXZ') {\n\n dest[0] = s1 * c2 * c3 + c1 * s2 * s3;\n dest[1] = c1 * s2 * c3 - s1 * c2 * s3;\n dest[2] = c1 * c2 * s3 - s1 * s2 * c3;\n dest[3] = c1 * c2 * c3 + s1 * s2 * s3;\n\n } else if (order === 'ZXY') {\n\n dest[0] = s1 * c2 * c3 - c1 * s2 * s3;\n dest[1] = c1 * s2 * c3 + s1 * c2 * s3;\n dest[2] = c1 * c2 * s3 + s1 * s2 * c3;\n dest[3] = c1 * c2 * c3 - s1 * s2 * s3;\n\n } else if (order === 'ZYX') {\n\n dest[0] = s1 * c2 * c3 - c1 * s2 * s3;\n dest[1] = c1 * s2 * c3 + s1 * c2 * s3;\n dest[2] = c1 * c2 * s3 - s1 * s2 * c3;\n dest[3] = c1 * c2 * c3 + s1 * s2 * s3;\n\n } else if (order === 'YZX') {\n\n dest[0] = s1 * c2 * c3 + c1 * s2 * s3;\n dest[1] = c1 * s2 * c3 + s1 * c2 * s3;\n dest[2] = c1 * c2 * s3 - s1 * s2 * c3;\n dest[3] = c1 * c2 * c3 - s1 * s2 * s3;\n\n } else if (order === 'XZY') {\n\n dest[0] = s1 * c2 * c3 - c1 * s2 * s3;\n dest[1] = c1 * s2 * c3 - s1 * c2 * s3;\n dest[2] = c1 * c2 * s3 + s1 * s2 * c3;\n dest[3] = c1 * c2 * c3 + s1 * s2 * s3;\n }\n\n return dest;\n },\n\n mat4ToQuaternion(m, dest = math.vec4()) {\n // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n\n // Assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n const m11 = m[0];\n const m12 = m[4];\n const m13 = m[8];\n const m21 = m[1];\n const m22 = m[5];\n const m23 = m[9];\n const m31 = m[2];\n const m32 = m[6];\n const m33 = m[10];\n let s;\n\n const trace = m11 + m22 + m33;\n\n if (trace > 0) {\n\n s = 0.5 / Math.sqrt(trace + 1.0);\n\n dest[3] = 0.25 / s;\n dest[0] = (m32 - m23) * s;\n dest[1] = (m13 - m31) * s;\n dest[2] = (m21 - m12) * s;\n\n } else if (m11 > m22 && m11 > m33) {\n\n s = 2.0 * Math.sqrt(1.0 + m11 - m22 - m33);\n\n dest[3] = (m32 - m23) / s;\n dest[0] = 0.25 * s;\n dest[1] = (m12 + m21) / s;\n dest[2] = (m13 + m31) / s;\n\n } else if (m22 > m33) {\n\n s = 2.0 * Math.sqrt(1.0 + m22 - m11 - m33);\n\n dest[3] = (m13 - m31) / s;\n dest[0] = (m12 + m21) / s;\n dest[1] = 0.25 * s;\n dest[2] = (m23 + m32) / s;\n\n } else {\n\n s = 2.0 * Math.sqrt(1.0 + m33 - m11 - m22);\n\n dest[3] = (m21 - m12) / s;\n dest[0] = (m13 + m31) / s;\n dest[1] = (m23 + m32) / s;\n dest[2] = 0.25 * s;\n }\n\n return dest;\n },\n\n vec3PairToQuaternion(u, v, dest = math.vec4()) {\n const norm_u_norm_v = Math.sqrt(math.dotVec3(u, u) * math.dotVec3(v, v));\n let real_part = norm_u_norm_v + math.dotVec3(u, v);\n\n if (real_part < 0.00000001 * norm_u_norm_v) {\n\n // If u and v are exactly opposite, rotate 180 degrees\n // around an arbitrary orthogonal axis. Axis normalisation\n // can happen later, when we normalise the quaternion.\n\n real_part = 0.0;\n\n if (Math.abs(u[0]) > Math.abs(u[2])) {\n\n dest[0] = -u[1];\n dest[1] = u[0];\n dest[2] = 0;\n\n } else {\n dest[0] = 0;\n dest[1] = -u[2];\n dest[2] = u[1]\n }\n\n } else {\n\n // Otherwise, build quaternion the standard way.\n math.cross3Vec3(u, v, dest);\n }\n\n dest[3] = real_part;\n\n return math.normalizeQuaternion(dest);\n },\n\n angleAxisToQuaternion(angleAxis, dest = math.vec4()) {\n const halfAngle = angleAxis[3] / 2.0;\n const fsin = Math.sin(halfAngle);\n dest[0] = fsin * angleAxis[0];\n dest[1] = fsin * angleAxis[1];\n dest[2] = fsin * angleAxis[2];\n dest[3] = Math.cos(halfAngle);\n return dest;\n },\n\n quaternionToEuler: ((() => {\n const mat = new FloatArrayType(16);\n return (q, order, dest) => {\n dest = dest || math.vec3();\n math.quaternionToRotationMat4(q, mat);\n math.mat4ToEuler(mat, order, dest);\n return dest;\n };\n }))(),\n\n mulQuaternions(p, q, dest = math.vec4()) {\n const p0 = p[0];\n const p1 = p[1];\n const p2 = p[2];\n const p3 = p[3];\n const q0 = q[0];\n const q1 = q[1];\n const q2 = q[2];\n const q3 = q[3];\n dest[0] = p3 * q0 + p0 * q3 + p1 * q2 - p2 * q1;\n dest[1] = p3 * q1 + p1 * q3 + p2 * q0 - p0 * q2;\n dest[2] = p3 * q2 + p2 * q3 + p0 * q1 - p1 * q0;\n dest[3] = p3 * q3 - p0 * q0 - p1 * q1 - p2 * q2;\n return dest;\n },\n\n vec3ApplyQuaternion(q, vec, dest = math.vec3()) {\n const x = vec[0];\n const y = vec[1];\n const z = vec[2];\n\n const qx = q[0];\n const qy = q[1];\n const qz = q[2];\n const qw = q[3];\n\n // calculate quat * vector\n\n const ix = qw * x + qy * z - qz * y;\n const iy = qw * y + qz * x - qx * z;\n const iz = qw * z + qx * y - qy * x;\n const iw = -qx * x - qy * y - qz * z;\n\n // calculate result * inverse quat\n\n dest[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n dest[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n dest[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n\n return dest;\n },\n\n quaternionToMat4(q, dest) {\n\n dest = math.identityMat4(dest);\n\n const q0 = q[0]; //x\n const q1 = q[1]; //y\n const q2 = q[2]; //z\n const q3 = q[3]; //w\n\n const tx = 2.0 * q0;\n const ty = 2.0 * q1;\n const tz = 2.0 * q2;\n\n const twx = tx * q3;\n const twy = ty * q3;\n const twz = tz * q3;\n\n const txx = tx * q0;\n const txy = ty * q0;\n const txz = tz * q0;\n\n const tyy = ty * q1;\n const tyz = tz * q1;\n const tzz = tz * q2;\n\n dest[0] = 1.0 - (tyy + tzz);\n dest[1] = txy + twz;\n dest[2] = txz - twy;\n\n dest[4] = txy - twz;\n dest[5] = 1.0 - (txx + tzz);\n dest[6] = tyz + twx;\n\n dest[8] = txz + twy;\n dest[9] = tyz - twx;\n\n dest[10] = 1.0 - (txx + tyy);\n\n return dest;\n },\n\n quaternionToRotationMat4(q, m) {\n const x = q[0];\n const y = q[1];\n const z = q[2];\n const w = q[3];\n\n const x2 = x + x;\n const y2 = y + y;\n const z2 = z + z;\n const xx = x * x2;\n const xy = x * y2;\n const xz = x * z2;\n const yy = y * y2;\n const yz = y * z2;\n const zz = z * z2;\n const wx = w * x2;\n const wy = w * y2;\n const wz = w * z2;\n\n m[0] = 1 - (yy + zz);\n m[4] = xy - wz;\n m[8] = xz + wy;\n\n m[1] = xy + wz;\n m[5] = 1 - (xx + zz);\n m[9] = yz - wx;\n\n m[2] = xz - wy;\n m[6] = yz + wx;\n m[10] = 1 - (xx + yy);\n\n // last column\n m[3] = 0;\n m[7] = 0;\n m[11] = 0;\n\n // bottom row\n m[12] = 0;\n m[13] = 0;\n m[14] = 0;\n m[15] = 1;\n\n return m;\n },\n\n normalizeQuaternion(q, dest = q) {\n const len = math.lenVec4([q[0], q[1], q[2], q[3]]);\n dest[0] = q[0] / len;\n dest[1] = q[1] / len;\n dest[2] = q[2] / len;\n dest[3] = q[3] / len;\n return dest;\n },\n\n conjugateQuaternion(q, dest = q) {\n dest[0] = -q[0];\n dest[1] = -q[1];\n dest[2] = -q[2];\n dest[3] = q[3];\n return dest;\n },\n\n inverseQuaternion(q, dest) {\n return math.normalizeQuaternion(math.conjugateQuaternion(q, dest));\n },\n\n quaternionToAngleAxis(q, angleAxis = math.vec4()) {\n q = math.normalizeQuaternion(q, tempVec4);\n const q3 = q[3];\n const angle = 2 * Math.acos(q3);\n const s = Math.sqrt(1 - q3 * q3);\n if (s < 0.001) { // test to avoid divide by zero, s is always positive due to sqrt\n angleAxis[0] = q[0];\n angleAxis[1] = q[1];\n angleAxis[2] = q[2];\n } else {\n angleAxis[0] = q[0] / s;\n angleAxis[1] = q[1] / s;\n angleAxis[2] = q[2] / s;\n }\n angleAxis[3] = angle; // * 57.295779579;\n return angleAxis;\n },\n\n //------------------------------------------------------------------------------------------------------------------\n // Boundaries\n //------------------------------------------------------------------------------------------------------------------\n\n /**\n * Returns a new, uninitialized 3D axis-aligned bounding box.\n *\n * @private\n */\n AABB3(values) {\n return new FloatArrayType(values || 6);\n },\n\n /**\n * Returns a new, uninitialized 2D axis-aligned bounding box.\n *\n * @private\n */\n AABB2(values) {\n return new FloatArrayType(values || 4);\n },\n\n /**\n * Returns a new, uninitialized 3D oriented bounding box (OBB).\n *\n * @private\n */\n OBB3(values) {\n return new FloatArrayType(values || 32);\n },\n\n /**\n * Returns a new, uninitialized 2D oriented bounding box (OBB).\n *\n * @private\n */\n OBB2(values) {\n return new FloatArrayType(values || 16);\n },\n\n /** Returns a new 3D bounding sphere */\n Sphere3(x, y, z, r) {\n return new FloatArrayType([x, y, z, r]);\n },\n\n /**\n * Transforms an OBB3 by a 4x4 matrix.\n *\n * @private\n */\n transformOBB3(m, p, p2 = p) {\n let i;\n const len = p.length;\n\n let x;\n let y;\n let z;\n\n const m0 = m[0];\n const m1 = m[1];\n const m2 = m[2];\n const m3 = m[3];\n const m4 = m[4];\n const m5 = m[5];\n const m6 = m[6];\n const m7 = m[7];\n const m8 = m[8];\n const m9 = m[9];\n const m10 = m[10];\n const m11 = m[11];\n const m12 = m[12];\n const m13 = m[13];\n const m14 = m[14];\n const m15 = m[15];\n\n for (i = 0; i < len; i += 4) {\n\n x = p[i + 0];\n y = p[i + 1];\n z = p[i + 2];\n\n p2[i + 0] = (m0 * x) + (m4 * y) + (m8 * z) + m12;\n p2[i + 1] = (m1 * x) + (m5 * y) + (m9 * z) + m13;\n p2[i + 2] = (m2 * x) + (m6 * y) + (m10 * z) + m14;\n p2[i + 3] = (m3 * x) + (m7 * y) + (m11 * z) + m15;\n }\n\n return p2;\n },\n\n /** Returns true if the first AABB contains the second AABB.\n * @param aabb1\n * @param aabb2\n * @returns {boolean}\n */\n containsAABB3: function (aabb1, aabb2) {\n const result = (\n aabb1[0] <= aabb2[0] && aabb2[3] <= aabb1[3] &&\n aabb1[1] <= aabb2[1] && aabb2[4] <= aabb1[4] &&\n aabb1[2] <= aabb2[2] && aabb2[5] <= aabb1[5]);\n return result;\n },\n\n /**\n * Gets the diagonal size of an AABB3 given as minima and maxima.\n *\n * @private\n */\n getAABB3Diag: ((() => {\n\n const min = new FloatArrayType(3);\n const max = new FloatArrayType(3);\n const tempVec3 = new FloatArrayType(3);\n\n return aabb => {\n\n min[0] = aabb[0];\n min[1] = aabb[1];\n min[2] = aabb[2];\n\n max[0] = aabb[3];\n max[1] = aabb[4];\n max[2] = aabb[5];\n\n math.subVec3(max, min, tempVec3);\n\n return Math.abs(math.lenVec3(tempVec3));\n };\n }))(),\n\n /**\n * Get a diagonal boundary size that is symmetrical about the given point.\n *\n * @private\n */\n getAABB3DiagPoint: ((() => {\n\n const min = new FloatArrayType(3);\n const max = new FloatArrayType(3);\n const tempVec3 = new FloatArrayType(3);\n\n return (aabb, p) => {\n\n min[0] = aabb[0];\n min[1] = aabb[1];\n min[2] = aabb[2];\n\n max[0] = aabb[3];\n max[1] = aabb[4];\n max[2] = aabb[5];\n\n const diagVec = math.subVec3(max, min, tempVec3);\n\n const xneg = p[0] - aabb[0];\n const xpos = aabb[3] - p[0];\n const yneg = p[1] - aabb[1];\n const ypos = aabb[4] - p[1];\n const zneg = p[2] - aabb[2];\n const zpos = aabb[5] - p[2];\n\n diagVec[0] += (xneg > xpos) ? xneg : xpos;\n diagVec[1] += (yneg > ypos) ? yneg : ypos;\n diagVec[2] += (zneg > zpos) ? zneg : zpos;\n\n return Math.abs(math.lenVec3(diagVec));\n };\n }))(),\n\n /**\n * Gets the center of an AABB.\n *\n * @private\n */\n getAABB3Center(aabb, dest) {\n const r = dest || math.vec3();\n\n r[0] = (aabb[0] + aabb[3]) / 2;\n r[1] = (aabb[1] + aabb[4]) / 2;\n r[2] = (aabb[2] + aabb[5]) / 2;\n\n return r;\n },\n\n /**\n * Gets the center of a 2D AABB.\n *\n * @private\n */\n getAABB2Center(aabb, dest) {\n const r = dest || math.vec2();\n\n r[0] = (aabb[2] + aabb[0]) / 2;\n r[1] = (aabb[3] + aabb[1]) / 2;\n\n return r;\n },\n\n /**\n * Collapses a 3D axis-aligned boundary, ready to expand to fit 3D points.\n * Creates new AABB if none supplied.\n *\n * @private\n */\n collapseAABB3(aabb = math.AABB3()) {\n aabb[0] = math.MAX_DOUBLE;\n aabb[1] = math.MAX_DOUBLE;\n aabb[2] = math.MAX_DOUBLE;\n aabb[3] = -math.MAX_DOUBLE;\n aabb[4] = -math.MAX_DOUBLE;\n aabb[5] = -math.MAX_DOUBLE;\n\n return aabb;\n },\n\n /**\n * Converts an axis-aligned 3D boundary into an oriented boundary consisting of\n * an array of eight 3D positions, one for each corner of the boundary.\n *\n * @private\n */\n AABB3ToOBB3(aabb, obb = math.OBB3()) {\n obb[0] = aabb[0];\n obb[1] = aabb[1];\n obb[2] = aabb[2];\n obb[3] = 1;\n\n obb[4] = aabb[3];\n obb[5] = aabb[1];\n obb[6] = aabb[2];\n obb[7] = 1;\n\n obb[8] = aabb[3];\n obb[9] = aabb[4];\n obb[10] = aabb[2];\n obb[11] = 1;\n\n obb[12] = aabb[0];\n obb[13] = aabb[4];\n obb[14] = aabb[2];\n obb[15] = 1;\n\n obb[16] = aabb[0];\n obb[17] = aabb[1];\n obb[18] = aabb[5];\n obb[19] = 1;\n\n obb[20] = aabb[3];\n obb[21] = aabb[1];\n obb[22] = aabb[5];\n obb[23] = 1;\n\n obb[24] = aabb[3];\n obb[25] = aabb[4];\n obb[26] = aabb[5];\n obb[27] = 1;\n\n obb[28] = aabb[0];\n obb[29] = aabb[4];\n obb[30] = aabb[5];\n obb[31] = 1;\n\n return obb;\n },\n\n /**\n * Finds the minimum axis-aligned 3D boundary enclosing the homogeneous 3D points (x,y,z,w) given in a flattened array.\n *\n * @private\n */\n positions3ToAABB3: ((() => {\n\n const p = new FloatArrayType(3);\n\n return (positions, aabb, positionsDecodeMatrix) => {\n aabb = aabb || math.AABB3();\n\n let xmin = math.MAX_DOUBLE;\n let ymin = math.MAX_DOUBLE;\n let zmin = math.MAX_DOUBLE;\n let xmax = -math.MAX_DOUBLE;\n let ymax = -math.MAX_DOUBLE;\n let zmax = -math.MAX_DOUBLE;\n\n let x;\n let y;\n let z;\n\n for (let i = 0, len = positions.length; i < len; i += 3) {\n\n if (positionsDecodeMatrix) {\n\n p[0] = positions[i + 0];\n p[1] = positions[i + 1];\n p[2] = positions[i + 2];\n\n math.decompressPosition(p, positionsDecodeMatrix, p);\n\n x = p[0];\n y = p[1];\n z = p[2];\n\n } else {\n x = positions[i + 0];\n y = positions[i + 1];\n z = positions[i + 2];\n }\n\n if (x < xmin) {\n xmin = x;\n }\n\n if (y < ymin) {\n ymin = y;\n }\n\n if (z < zmin) {\n zmin = z;\n }\n\n if (x > xmax) {\n xmax = x;\n }\n\n if (y > ymax) {\n ymax = y;\n }\n\n if (z > zmax) {\n zmax = z;\n }\n }\n\n aabb[0] = xmin;\n aabb[1] = ymin;\n aabb[2] = zmin;\n aabb[3] = xmax;\n aabb[4] = ymax;\n aabb[5] = zmax;\n\n return aabb;\n };\n }))(),\n\n /**\n * Finds the minimum axis-aligned 3D boundary enclosing the homogeneous 3D points (x,y,z,w) given in a flattened array.\n *\n * @private\n */\n OBB3ToAABB3(obb, aabb = math.AABB3()) {\n let xmin = math.MAX_DOUBLE;\n let ymin = math.MAX_DOUBLE;\n let zmin = math.MAX_DOUBLE;\n let xmax = -math.MAX_DOUBLE;\n let ymax = -math.MAX_DOUBLE;\n let zmax = -math.MAX_DOUBLE;\n\n let x;\n let y;\n let z;\n\n for (let i = 0, len = obb.length; i < len; i += 4) {\n\n x = obb[i + 0];\n y = obb[i + 1];\n z = obb[i + 2];\n\n if (x < xmin) {\n xmin = x;\n }\n\n if (y < ymin) {\n ymin = y;\n }\n\n if (z < zmin) {\n zmin = z;\n }\n\n if (x > xmax) {\n xmax = x;\n }\n\n if (y > ymax) {\n ymax = y;\n }\n\n if (z > zmax) {\n zmax = z;\n }\n }\n\n aabb[0] = xmin;\n aabb[1] = ymin;\n aabb[2] = zmin;\n aabb[3] = xmax;\n aabb[4] = ymax;\n aabb[5] = zmax;\n\n return aabb;\n },\n\n /**\n * Finds the minimum axis-aligned 3D boundary enclosing the given 3D points.\n *\n * @private\n */\n points3ToAABB3(points, aabb = math.AABB3()) {\n let xmin = math.MAX_DOUBLE;\n let ymin = math.MAX_DOUBLE;\n let zmin = math.MAX_DOUBLE;\n let xmax = -math.MAX_DOUBLE;\n let ymax = -math.MAX_DOUBLE;\n let zmax = -math.MAX_DOUBLE;\n\n let x;\n let y;\n let z;\n\n for (let i = 0, len = points.length; i < len; i++) {\n\n x = points[i][0];\n y = points[i][1];\n z = points[i][2];\n\n if (x < xmin) {\n xmin = x;\n }\n\n if (y < ymin) {\n ymin = y;\n }\n\n if (z < zmin) {\n zmin = z;\n }\n\n if (x > xmax) {\n xmax = x;\n }\n\n if (y > ymax) {\n ymax = y;\n }\n\n if (z > zmax) {\n zmax = z;\n }\n }\n\n aabb[0] = xmin;\n aabb[1] = ymin;\n aabb[2] = zmin;\n aabb[3] = xmax;\n aabb[4] = ymax;\n aabb[5] = zmax;\n\n return aabb;\n },\n\n /**\n * Finds the minimum boundary sphere enclosing the given 3D points.\n *\n * @private\n */\n points3ToSphere3: ((() => {\n\n const tempVec3 = new FloatArrayType(3);\n\n return (points, sphere) => {\n\n sphere = sphere || math.vec4();\n\n let x = 0;\n let y = 0;\n let z = 0;\n\n let i;\n const numPoints = points.length;\n\n for (i = 0; i < numPoints; i++) {\n x += points[i][0];\n y += points[i][1];\n z += points[i][2];\n }\n\n sphere[0] = x / numPoints;\n sphere[1] = y / numPoints;\n sphere[2] = z / numPoints;\n\n let radius = 0;\n let dist;\n\n for (i = 0; i < numPoints; i++) {\n\n dist = Math.abs(math.lenVec3(math.subVec3(points[i], sphere, tempVec3)));\n\n if (dist > radius) {\n radius = dist;\n }\n }\n\n sphere[3] = radius;\n\n return sphere;\n };\n }))(),\n\n /**\n * Finds the minimum boundary sphere enclosing the given 3D positions.\n *\n * @private\n */\n positions3ToSphere3: ((() => {\n\n const tempVec3a = new FloatArrayType(3);\n const tempVec3b = new FloatArrayType(3);\n\n return (positions, sphere) => {\n\n sphere = sphere || math.vec4();\n\n let x = 0;\n let y = 0;\n let z = 0;\n\n let i;\n const lenPositions = positions.length;\n let radius = 0;\n\n for (i = 0; i < lenPositions; i += 3) {\n x += positions[i];\n y += positions[i + 1];\n z += positions[i + 2];\n }\n\n const numPositions = lenPositions / 3;\n\n sphere[0] = x / numPositions;\n sphere[1] = y / numPositions;\n sphere[2] = z / numPositions;\n\n let dist;\n\n for (i = 0; i < lenPositions; i += 3) {\n\n tempVec3a[0] = positions[i];\n tempVec3a[1] = positions[i + 1];\n tempVec3a[2] = positions[i + 2];\n\n dist = Math.abs(math.lenVec3(math.subVec3(tempVec3a, sphere, tempVec3b)));\n\n if (dist > radius) {\n radius = dist;\n }\n }\n\n sphere[3] = radius;\n\n return sphere;\n };\n }))(),\n\n /**\n * Finds the minimum boundary sphere enclosing the given 3D points.\n *\n * @private\n */\n OBB3ToSphere3: ((() => {\n\n const point = new FloatArrayType(3);\n const tempVec3 = new FloatArrayType(3);\n\n return (points, sphere) => {\n\n sphere = sphere || math.vec4();\n\n let x = 0;\n let y = 0;\n let z = 0;\n\n let i;\n const lenPoints = points.length;\n const numPoints = lenPoints / 4;\n\n for (i = 0; i < lenPoints; i += 4) {\n x += points[i + 0];\n y += points[i + 1];\n z += points[i + 2];\n }\n\n sphere[0] = x / numPoints;\n sphere[1] = y / numPoints;\n sphere[2] = z / numPoints;\n\n let radius = 0;\n let dist;\n\n for (i = 0; i < lenPoints; i += 4) {\n\n point[0] = points[i + 0];\n point[1] = points[i + 1];\n point[2] = points[i + 2];\n\n dist = Math.abs(math.lenVec3(math.subVec3(point, sphere, tempVec3)));\n\n if (dist > radius) {\n radius = dist;\n }\n }\n\n sphere[3] = radius;\n\n return sphere;\n };\n }))(),\n\n /**\n * Gets the center of a bounding sphere.\n *\n * @private\n */\n getSphere3Center(sphere, dest = math.vec3()) {\n dest[0] = sphere[0];\n dest[1] = sphere[1];\n dest[2] = sphere[2];\n\n return dest;\n },\n\n /**\n * Expands the first axis-aligned 3D boundary to enclose the second, if required.\n *\n * @private\n */\n expandAABB3(aabb1, aabb2) {\n\n if (aabb1[0] > aabb2[0]) {\n aabb1[0] = aabb2[0];\n }\n\n if (aabb1[1] > aabb2[1]) {\n aabb1[1] = aabb2[1];\n }\n\n if (aabb1[2] > aabb2[2]) {\n aabb1[2] = aabb2[2];\n }\n\n if (aabb1[3] < aabb2[3]) {\n aabb1[3] = aabb2[3];\n }\n\n if (aabb1[4] < aabb2[4]) {\n aabb1[4] = aabb2[4];\n }\n\n if (aabb1[5] < aabb2[5]) {\n aabb1[5] = aabb2[5];\n }\n\n return aabb1;\n },\n\n /**\n * Expands an axis-aligned 3D boundary to enclose the given point, if needed.\n *\n * @private\n */\n expandAABB3Point3(aabb, p) {\n\n if (aabb[0] > p[0]) {\n aabb[0] = p[0];\n }\n\n if (aabb[1] > p[1]) {\n aabb[1] = p[1];\n }\n\n if (aabb[2] > p[2]) {\n aabb[2] = p[2];\n }\n\n if (aabb[3] < p[0]) {\n aabb[3] = p[0];\n }\n\n if (aabb[4] < p[1]) {\n aabb[4] = p[1];\n }\n\n if (aabb[5] < p[2]) {\n aabb[5] = p[2];\n }\n\n return aabb;\n },\n\n /**\n * Calculates the normal vector of a triangle.\n *\n * @private\n */\n triangleNormal(a, b, c, normal = math.vec3()) {\n const p1x = b[0] - a[0];\n const p1y = b[1] - a[1];\n const p1z = b[2] - a[2];\n\n const p2x = c[0] - a[0];\n const p2y = c[1] - a[1];\n const p2z = c[2] - a[2];\n\n const p3x = p1y * p2z - p1z * p2y;\n const p3y = p1z * p2x - p1x * p2z;\n const p3z = p1x * p2y - p1y * p2x;\n\n const mag = Math.sqrt(p3x * p3x + p3y * p3y + p3z * p3z);\n if (mag === 0) {\n normal[0] = 0;\n normal[1] = 0;\n normal[2] = 0;\n } else {\n normal[0] = p3x / mag;\n normal[1] = p3y / mag;\n normal[2] = p3z / mag;\n }\n\n return normal\n }\n};\n\nexport {math};","import {math} from \"../../lib/math.js\";\n\nfunction quantizePositions (positions, lenPositions, aabb, quantizedPositions) {\n const xmin = aabb[0];\n const ymin = aabb[1];\n const zmin = aabb[2];\n const xwid = aabb[3] - xmin;\n const ywid = aabb[4] - ymin;\n const zwid = aabb[5] - zmin;\n const maxInt = 65535;\n const xMultiplier = maxInt / xwid;\n const yMultiplier = maxInt / ywid;\n const zMultiplier = maxInt / zwid;\n const verify = (num) => num >= 0 ? num : 0;\n for (let i = 0; i < lenPositions; i += 3) {\n quantizedPositions[i + 0] = Math.max(0, Math.min(65535,Math.floor(verify(positions[i + 0] - xmin) * xMultiplier)));\n quantizedPositions[i + 1] = Math.max(0, Math.min(65535,Math.floor(verify(positions[i + 1] - ymin) * yMultiplier)));\n quantizedPositions[i + 2] = Math.max(0, Math.min(65535,Math.floor(verify(positions[i + 2] - zmin) * zMultiplier)));\n }\n}\n\nfunction compressPosition(p, aabb, q) {\n const multiplier = new Float32Array([\n aabb[3] !== aabb[0] ? 65535 / (aabb[3] - aabb[0]) : 0,\n aabb[4] !== aabb[1] ? 65535 / (aabb[4] - aabb[1]) : 0,\n aabb[5] !== aabb[2] ? 65535 / (aabb[5] - aabb[2]) : 0\n ]);\n q[0] = Math.max(0, Math.min(65535, Math.floor((p[0] - aabb[0]) * multiplier[0])));\n q[1] = Math.max(0, Math.min(65535, Math.floor((p[1] - aabb[1]) * multiplier[1])));\n q[2] = Math.max(0, Math.min(65535, Math.floor((p[2] - aabb[2]) * multiplier[2])));\n}\n\nvar createPositionsDecodeMatrix = (function () {\n const translate = math.mat4();\n const scale = math.mat4();\n return function (aabb, positionsDecodeMatrix) {\n positionsDecodeMatrix = positionsDecodeMatrix || math.mat4();\n const xmin = aabb[0];\n const ymin = aabb[1];\n const zmin = aabb[2];\n const xwid = aabb[3] - xmin;\n const ywid = aabb[4] - ymin;\n const zwid = aabb[5] - zmin;\n const maxInt = 65535;\n math.identityMat4(translate);\n math.translationMat4v(aabb, translate);\n math.identityMat4(scale);\n math.scalingMat4v([xwid / maxInt, ywid / maxInt, zwid / maxInt], scale);\n math.mulMat4(translate, scale, positionsDecodeMatrix);\n return positionsDecodeMatrix;\n };\n})();\n\nfunction transformAndOctEncodeNormals(modelNormalMatrix, normals, lenNormals, compressedNormals, lenCompressedNormals) {\n // http://jcgt.org/published/0003/02/01/\n let oct, dec, best, currentCos, bestCos;\n let i, ei;\n let localNormal = math.vec3();\n let worldNormal = math.vec3();\n for (i = 0; i < lenNormals; i += 3) {\n localNormal[0] = normals[i];\n localNormal[1] = normals[i + 1];\n localNormal[2] = normals[i + 2];\n\n math.transformVec3(modelNormalMatrix, localNormal, worldNormal);\n math.normalizeVec3(worldNormal, worldNormal);\n\n // Test various combinations of ceil and floor to minimize rounding errors\n best = oct = octEncodeVec3(worldNormal, 0, \"floor\", \"floor\");\n dec = octDecodeVec2(oct);\n currentCos = bestCos = dot(worldNormal, 0, dec);\n oct = octEncodeVec3(worldNormal, 0, \"ceil\", \"floor\");\n dec = octDecodeVec2(oct);\n currentCos = dot(worldNormal, 0, dec);\n if (currentCos > bestCos) {\n best = oct;\n bestCos = currentCos;\n }\n oct = octEncodeVec3(worldNormal, 0, \"floor\", \"ceil\");\n dec = octDecodeVec2(oct);\n currentCos = dot(worldNormal, 0, dec);\n if (currentCos > bestCos) {\n best = oct;\n bestCos = currentCos;\n }\n oct = octEncodeVec3(worldNormal, 0, \"ceil\", \"ceil\");\n dec = octDecodeVec2(oct);\n currentCos = dot(worldNormal, 0, dec);\n if (currentCos > bestCos) {\n best = oct;\n bestCos = currentCos;\n }\n compressedNormals[lenCompressedNormals + i + 0] = best[0];\n compressedNormals[lenCompressedNormals + i + 1] = best[1];\n compressedNormals[lenCompressedNormals + i + 2] = 0.0; // Unused\n }\n lenCompressedNormals += lenNormals;\n return lenCompressedNormals;\n}\n\nfunction octEncodeNormals(normals, lenNormals, compressedNormals, lenCompressedNormals) { // http://jcgt.org/published/0003/02/01/\n let oct, dec, best, currentCos, bestCos;\n for (let i = 0; i < lenNormals; i += 3) {\n // Test various combinations of ceil and floor to minimize rounding errors\n best = oct = octEncodeVec3(normals, i, \"floor\", \"floor\");\n dec = octDecodeVec2(oct);\n currentCos = bestCos = dot(normals, i, dec);\n oct = octEncodeVec3(normals, i, \"ceil\", \"floor\");\n dec = octDecodeVec2(oct);\n currentCos = dot(normals, i, dec);\n if (currentCos > bestCos) {\n best = oct;\n bestCos = currentCos;\n }\n oct = octEncodeVec3(normals, i, \"floor\", \"ceil\");\n dec = octDecodeVec2(oct);\n currentCos = dot(normals, i, dec);\n if (currentCos > bestCos) {\n best = oct;\n bestCos = currentCos;\n }\n oct = octEncodeVec3(normals, i, \"ceil\", \"ceil\");\n dec = octDecodeVec2(oct);\n currentCos = dot(normals, i, dec);\n if (currentCos > bestCos) {\n best = oct;\n bestCos = currentCos;\n }\n compressedNormals[lenCompressedNormals + i + 0] = best[0];\n compressedNormals[lenCompressedNormals + i + 1] = best[1];\n compressedNormals[lenCompressedNormals + i + 2] = 0.0; // Unused\n }\n lenCompressedNormals += lenNormals;\n return lenCompressedNormals;\n}\n\n/**\n * @private\n */\nfunction octEncodeVec3(array, i, xfunc, yfunc) { // Oct-encode single normal vector in 2 bytes\n let x = array[i] / (Math.abs(array[i]) + Math.abs(array[i + 1]) + Math.abs(array[i + 2]));\n let y = array[i + 1] / (Math.abs(array[i]) + Math.abs(array[i + 1]) + Math.abs(array[i + 2]));\n if (array[i + 2] < 0) {\n let tempx = (1 - Math.abs(y)) * (x >= 0 ? 1 : -1);\n let tempy = (1 - Math.abs(x)) * (y >= 0 ? 1 : -1);\n x = tempx;\n y = tempy;\n }\n return new Int8Array([\n Math[xfunc](x * 127.5 + (x < 0 ? -1 : 0)),\n Math[yfunc](y * 127.5 + (y < 0 ? -1 : 0))\n ]);\n}\n\n/**\n * Decode an oct-encoded normal\n */\nfunction octDecodeVec2(oct) {\n let x = oct[0];\n let y = oct[1];\n x /= x < 0 ? 127 : 128;\n y /= y < 0 ? 127 : 128;\n const z = 1 - Math.abs(x) - Math.abs(y);\n if (z < 0) {\n x = (1 - Math.abs(y)) * (x >= 0 ? 1 : -1);\n y = (1 - Math.abs(x)) * (y >= 0 ? 1 : -1);\n }\n const length = Math.sqrt(x * x + y * y + z * z);\n return [\n x / length,\n y / length,\n z / length\n ];\n}\n\n/**\n * Dot product of a normal in an array against a candidate decoding\n * @private\n */\nfunction dot(array, i, vec3) {\n return array[i] * vec3[0] + array[i + 1] * vec3[1] + array[i + 2] * vec3[2];\n}\n\n/**\n * @private\n */\nconst geometryCompression = {\n quantizePositions,\n compressPosition,\n createPositionsDecodeMatrix,\n transformAndOctEncodeNormals,\n octEncodeNormals,\n};\n\nexport {geometryCompression}","/*----------------------------------------------------------------------------------------------------------------------\n * NOTE: The values of these constants must match those within xeokit-sdk\n *--------------------------------------------------------------------------------------------------------------------*/\n\n/**\n * Texture wrapping mode in which the texture repeats to infinity.\n */\nexport const RepeatWrapping = 1000;\n\n/**\n * Texture wrapping mode in which the last pixel of the texture stretches to the edge of the mesh.\n */\nexport const ClampToEdgeWrapping = 1001;\n\n/**\n * Texture wrapping mode in which the texture repeats to infinity, mirroring on each repeat.\n */\nexport const MirroredRepeatWrapping = 1002;\n\n/**\n * Texture magnification and minification filter that returns the nearest texel to the given sample coordinates.\n */\nexport const NearestFilter = 1003;\n\n/**\n * Texture minification filter that chooses the mipmap that most closely matches the size of the pixel being textured and returns the nearest texel to the given sample coordinates.\n */\nexport const NearestMipMapNearestFilter = 1004;\n\n/**\n * Texture minification filter that chooses the mipmap that most closely matches the size of the pixel being textured\n * and returns the nearest texel to the given sample coordinates.\n */\nexport const NearestMipmapNearestFilter = 1004;\n\n/**\n * Texture minification filter that chooses two mipmaps that most closely match the size of the pixel being textured\n * and returns the nearest texel to the center of the pixel at the given sample coordinates.\n */\nexport const NearestMipmapLinearFilter = 1005;\n\n/**\n * Texture minification filter that chooses two mipmaps that most closely match the size of the pixel being textured\n * and returns the nearest texel to the center of the pixel at the given sample coordinates.\n */\nexport const NearestMipMapLinearFilter = 1005;\n\n/**\n * Texture magnification and minification filter that returns the weighted average of the four nearest texels to the given sample coordinates.\n */\nexport const LinearFilter = 1006;\n\n/**\n * Texture minification filter that chooses the mipmap that most closely matches the size of the pixel being textured and\n * returns the weighted average of the four nearest texels to the given sample coordinates.\n */\nexport const LinearMipmapNearestFilter = 1007;\n\n/**\n * Texture minification filter that chooses the mipmap that most closely matches the size of the pixel being textured and\n * returns the weighted average of the four nearest texels to the given sample coordinates.\n */\nexport const LinearMipMapNearestFilter = 1007;\n\n/**\n * Texture minification filter that chooses two mipmaps that most closely match the size of the pixel being textured,\n * finds within each mipmap the weighted average of the nearest texel to the center of the pixel, then returns the\n * weighted average of those two values.\n */\nexport const LinearMipmapLinearFilter = 1008;\n\n/**\n * Texture minification filter that chooses two mipmaps that most closely match the size of the pixel being textured,\n * finds within each mipmap the weighted average of the nearest texel to the center of the pixel, then returns the\n * weighted average of those two values.\n */\nexport const LinearMipMapLinearFilter = 1008;\n\n/**\n * Media type for GIF images.\n */\nexport const GIFMediaType = 10000;\n\n/**\n * Media type for JPEG images.\n */\nexport const JPEGMediaType = 10001;\n\n/**\n * Media type for PNG images.\n */\nexport const PNGMediaType = 10002;","import {math} from \"../../lib/math.js\";\n\n/**\n * @private\n */\nconst buildEdgeIndices = (function () {\n\n const uniquePositions = [];\n const indicesLookup = [];\n const indicesReverseLookup = [];\n const weldedIndices = [];\n\n// TODO: Optimize with caching, but need to cater to both compressed and uncompressed positions\n\n const faces = [];\n let numFaces = 0;\n const compa = new Uint16Array(3);\n const compb = new Uint16Array(3);\n const compc = new Uint16Array(3);\n const a = math.vec3();\n const b = math.vec3();\n const c = math.vec3();\n const cb = math.vec3();\n const ab = math.vec3();\n const cross = math.vec3();\n const normal = math.vec3();\n const inverseNormal = math.vec3();\n\n function weldVertices(positions, indices) {\n const positionsMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique)\n let vx;\n let vy;\n let vz;\n let key;\n const precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001\n const precision = Math.pow(10, precisionPoints);\n let i;\n let len;\n let lenUniquePositions = 0;\n for (i = 0, len = positions.length; i < len; i += 3) {\n vx = positions[i];\n vy = positions[i + 1];\n vz = positions[i + 2];\n key = Math.round(vx * precision) + '_' + Math.round(vy * precision) + '_' + Math.round(vz * precision);\n if (positionsMap[key] === undefined) {\n positionsMap[key] = lenUniquePositions / 3;\n uniquePositions[lenUniquePositions++] = vx;\n uniquePositions[lenUniquePositions++] = vy;\n uniquePositions[lenUniquePositions++] = vz;\n }\n indicesLookup[i / 3] = positionsMap[key];\n }\n for (i = 0, len = indices.length; i < len; i++) {\n weldedIndices[i] = indicesLookup[indices[i]];\n indicesReverseLookup[weldedIndices[i]] = indices[i];\n }\n }\n\n function buildFaces(numIndices, positionsDecodeMatrix) {\n numFaces = 0;\n for (let i = 0, len = numIndices; i < len; i += 3) {\n const ia = ((weldedIndices[i]) * 3);\n const ib = ((weldedIndices[i + 1]) * 3);\n const ic = ((weldedIndices[i + 2]) * 3);\n if (positionsDecodeMatrix) {\n compa[0] = uniquePositions[ia];\n compa[1] = uniquePositions[ia + 1];\n compa[2] = uniquePositions[ia + 2];\n compb[0] = uniquePositions[ib];\n compb[1] = uniquePositions[ib + 1];\n compb[2] = uniquePositions[ib + 2];\n compc[0] = uniquePositions[ic];\n compc[1] = uniquePositions[ic + 1];\n compc[2] = uniquePositions[ic + 2];\n // Decode\n math.decompressPosition(compa, positionsDecodeMatrix, a);\n math.decompressPosition(compb, positionsDecodeMatrix, b);\n math.decompressPosition(compc, positionsDecodeMatrix, c);\n } else {\n a[0] = uniquePositions[ia];\n a[1] = uniquePositions[ia + 1];\n a[2] = uniquePositions[ia + 2];\n b[0] = uniquePositions[ib];\n b[1] = uniquePositions[ib + 1];\n b[2] = uniquePositions[ib + 2];\n c[0] = uniquePositions[ic];\n c[1] = uniquePositions[ic + 1];\n c[2] = uniquePositions[ic + 2];\n }\n math.subVec3(c, b, cb);\n math.subVec3(a, b, ab);\n math.cross3Vec3(cb, ab, cross);\n math.normalizeVec3(cross, normal);\n const face = faces[numFaces] || (faces[numFaces] = {normal: math.vec3()});\n face.normal[0] = normal[0];\n face.normal[1] = normal[1];\n face.normal[2] = normal[2];\n numFaces++;\n }\n }\n\n return function (positions, indices, positionsDecodeMatrix, edgeThreshold) {\n weldVertices(positions, indices);\n buildFaces(indices.length, positionsDecodeMatrix);\n const edgeIndices = [];\n const thresholdDot = Math.cos(math.DEGTORAD * edgeThreshold);\n const edges = {};\n let edge1;\n let edge2;\n let index1;\n let index2;\n let key;\n let largeIndex = false;\n let edge;\n let normal1;\n let normal2;\n let dot;\n let ia;\n let ib;\n for (let i = 0, len = indices.length; i < len; i += 3) {\n const faceIndex = i / 3;\n for (let j = 0; j < 3; j++) {\n edge1 = weldedIndices[i + j];\n edge2 = weldedIndices[i + ((j + 1) % 3)];\n index1 = Math.min(edge1, edge2);\n index2 = Math.max(edge1, edge2);\n key = index1 + ',' + index2;\n if (edges[key] === undefined) {\n edges[key] = {\n index1: index1,\n index2: index2,\n face1: faceIndex,\n face2: undefined,\n };\n } else {\n edges[key].face2 = faceIndex;\n }\n }\n }\n for (key in edges) {\n edge = edges[key];\n // an edge is only rendered if the angle (in degrees) between the face normals of the adjoining faces exceeds this value. default = 1 degree.\n if (edge.face2 !== undefined) {\n normal1 = faces[edge.face1].normal;\n normal2 = faces[edge.face2].normal;\n inverseNormal[0] = -normal2[0];\n inverseNormal[1] = -normal2[1];\n inverseNormal[2] = -normal2[2];\n dot = Math.abs(math.dotVec3(normal1, normal2));\n const dot2 = Math.abs(math.dotVec3(normal1, inverseNormal));\n if (dot > thresholdDot && dot2 > thresholdDot) {\n continue;\n }\n }\n ia = indicesReverseLookup[edge.index1];\n ib = indicesReverseLookup[edge.index2];\n if (!largeIndex && ia > 65535 || ib > 65535) {\n largeIndex = true;\n }\n edgeIndices.push(ia);\n edgeIndices.push(ib);\n }\n return (largeIndex) ? new Uint32Array(edgeIndices) : new Uint16Array(edgeIndices);\n };\n})();\n\n\nexport {buildEdgeIndices};","/**\n * Uses edge adjacency counts to identify if the given triangle mesh can be rendered with backface culling enabled.\n *\n * If all edges are connected to exactly two triangles, then the mesh will likely be a closed solid, and we can safely\n * render it with backface culling enabled.\n *\n * Otherwise, the mesh is a surface, and we must render it with backface culling disabled.\n *\n * @private\n */\nconst isTriangleMeshSolid = (indices, positions, vertexIndexMapping, edges) => {\n\n function compareIndexPositions(a, b)\n {\n let posA, posB;\n\n for (let i = 0; i < 3; i++) {\n posA = positions [a*3+i];\n posB = positions [b*3+i];\n\n if (posA !== posB) {\n return posB - posA;\n }\n }\n\n return 0;\n };\n\n // Group together indices corresponding to same position coordinates\n let newIndices = indices.slice ().sort (compareIndexPositions);\n\n // Calculate the mapping:\n // - from original index in indices array\n // - to indices-for-unique-positions\n let uniqueVertexIndex = null;\n\n for (let i = 0, len = newIndices.length; i < len; i++) {\n if (i == 0 || 0 != compareIndexPositions (\n newIndices[i],\n newIndices[i-1],\n )) {\n // different position\n uniqueVertexIndex = newIndices [i];\n }\n\n vertexIndexMapping [\n newIndices[i]\n ] = uniqueVertexIndex;\n }\n\n // Generate the list of edges\n for (let i = 0, len = indices.length; i < len; i += 3) {\n\n const a = vertexIndexMapping[indices[i]];\n const b = vertexIndexMapping[indices[i+1]];\n const c = vertexIndexMapping[indices[i+2]];\n\n let a2 = a;\n let b2 = b;\n let c2 = c;\n\n if (a > b && a > c) {\n if (b > c) {\n a2 = a;\n b2 = b;\n c2 = c;\n } else {\n a2 = a;\n b2 = c;\n c2 = b;\n }\n } else if (b > a && b > c) {\n if (a > c) {\n a2 = b;\n b2 = a;\n c2 = c;\n } else {\n a2 = b;\n b2 = c;\n c2 = a;\n }\n } else if (c > a && c > b) {\n if (a > b) {\n a2 = c;\n b2 = a;\n c2 = b;\n } else {\n a2 = c;\n b2 = b;\n c2 = a;\n }\n }\n\n edges[i+0] = [\n a2, b2\n ];\n edges[i+1] = [\n b2, c2\n ];\n\n if (a2 > c2) {\n const temp = c2;\n c2 = a2;\n a2 = temp;\n }\n\n edges[i+2] = [\n c2, a2\n ];\n }\n\n // Group semantically equivalent edgdes together\n function compareEdges (e1, e2) {\n let a, b;\n\n for (let i = 0; i < 2; i++) {\n a = e1[i];\n b = e2[i];\n\n if (b !== a) {\n return b - a;\n }\n }\n\n return 0;\n }\n\n edges = edges.slice(0, indices.length);\n\n edges.sort (compareEdges);\n\n // Make sure each edge is used exactly twice\n let sameEdgeCount = 0;\n\n for (let i = 0; i < edges.length; i++)\n {\n if (i === 0 || 0 !== compareEdges (\n edges[i], edges[i-1]\n )) {\n // different edge\n if (0 !== i && sameEdgeCount !== 2)\n {\n return false;\n }\n\n sameEdgeCount = 1;\n }\n else\n {\n // same edge\n sameEdgeCount++;\n }\n }\n\n if (edges.length > 0 && sameEdgeCount !== 2)\n {\n return false;\n }\n\n // Each edge is used exactly twice, this is a\n // watertight surface and hence a solid geometry.\n return true;\n};\n\nexport {isTriangleMeshSolid};","/**\n * Represents the usage of a {@link XKTGeometry} by an {@link XKTEntity}.\n *\n * * Created by {@link XKTModel#createEntity}\n * * Stored in {@link XKTEntity#meshes} and {@link XKTModel#meshesList}\n * * Has an {@link XKTGeometry}, and an optional {@link XKTTextureSet}, both of which it can share with other {@link XKTMesh}es\n * * Has {@link XKTMesh#color}, {@link XKTMesh#opacity}, {@link XKTMesh#metallic} and {@link XKTMesh#roughness} PBR attributes\n * @class XKTMesh\n */\nclass XKTMesh {\n\n /**\n * @private\n */\n constructor(cfg) {\n\n /**\n * Unique ID of this XKTMesh in {@link XKTModel#meshes}.\n *\n * @type {Number}\n */\n this.meshId = cfg.meshId;\n\n /**\n * Index of this XKTMesh in {@link XKTModel#meshesList};\n *\n * @type {Number}\n */\n this.meshIndex = cfg.meshIndex;\n\n /**\n * The 4x4 modeling transform matrix.\n *\n * Transform is relative to the center of the {@link XKTTile} that contains this XKTMesh's {@link XKTEntity},\n * which is given in {@link XKTMesh#entity}.\n *\n * When the ````XKTEntity```` shares its {@link XKTGeometry}s with other ````XKTEntity````s, this matrix is used\n * to transform this XKTMesh's XKTGeometry into World-space. When this XKTMesh does not share its ````XKTGeometry````,\n * then this matrix is ignored.\n *\n * @type {Number[]}\n */\n this.matrix = cfg.matrix;\n\n /**\n * The instanced {@link XKTGeometry}.\n *\n * @type {XKTGeometry}\n */\n this.geometry = cfg.geometry;\n\n /**\n * RGB color of this XKTMesh.\n *\n * @type {Float32Array}\n */\n this.color = cfg.color || new Float32Array([1, 1, 1]);\n\n /**\n * PBR metallness of this XKTMesh.\n *\n * @type {Number}\n */\n this.metallic = (cfg.metallic !== null && cfg.metallic !== undefined) ? cfg.metallic : 0;\n\n /**\n * PBR roughness of this XKTMesh.\n * The {@link XKTTextureSet} that defines the appearance of this XKTMesh.\n *\n * @type {Number}\n * @type {XKTTextureSet}\n */\n this.roughness = (cfg.roughness !== null && cfg.roughness !== undefined) ? cfg.roughness : 1;\n\n /**\n * Opacity of this XKTMesh.\n *\n * @type {Number}\n */\n this.opacity = (cfg.opacity !== undefined && cfg.opacity !== null) ? cfg.opacity : 1.0;\n\n /**\n * The {@link XKTTextureSet} that defines the appearance of this XKTMesh.\n *\n * @type {XKTTextureSet}\n */\n this.textureSet = cfg.textureSet;\n\n /**\n * The owner {@link XKTEntity}.\n *\n * Set by {@link XKTModel#createEntity}.\n *\n * @type {XKTEntity}\n */\n this.entity = null; // Set after instantiation, when the Entity is known\n }\n}\n\nexport {XKTMesh};","/**\n * An element of reusable geometry within an {@link XKTModel}.\n *\n * * Created by {@link XKTModel#createGeometry}\n * * Stored in {@link XKTModel#geometries} and {@link XKTModel#geometriesList}\n * * Referenced by {@link XKTMesh}s, which belong to {@link XKTEntity}s\n *\n * @class XKTGeometry\n */\nclass XKTGeometry {\n\n /**\n * @private\n * @param {*} cfg Configuration for the XKTGeometry.\n * @param {Number} cfg.geometryId Unique ID of the geometry in {@link XKTModel#geometries}.\n * @param {String} cfg.primitiveType Type of this geometry - \"triangles\", \"points\" or \"lines\" so far.\n * @param {Number} cfg.geometryIndex Index of this XKTGeometry in {@link XKTModel#geometriesList}.\n * @param {Float64Array} cfg.positions Non-quantized 3D vertex positions.\n * @param {Float32Array} cfg.normals Non-compressed vertex normals.\n * @param {Uint8Array} cfg.colorsCompressed Unsigned 8-bit integer RGBA vertex colors.\n * @param {Float32Array} cfg.uvs Non-compressed vertex UV coordinates.\n * @param {Uint32Array} cfg.indices Indices to organize the vertex positions and normals into triangles.\n * @param {Uint32Array} cfg.edgeIndices Indices to organize the vertex positions into edges.\n */\n constructor(cfg) {\n\n /**\n * Unique ID of this XKTGeometry in {@link XKTModel#geometries}.\n *\n * @type {Number}\n */\n this.geometryId = cfg.geometryId;\n\n /**\n * The type of primitive - \"triangles\" | \"points\" | \"lines\".\n *\n * @type {String}\n */\n this.primitiveType = cfg.primitiveType;\n\n /**\n * Index of this XKTGeometry in {@link XKTModel#geometriesList}.\n *\n * @type {Number}\n */\n this.geometryIndex = cfg.geometryIndex;\n\n /**\n * The number of {@link XKTMesh}s that reference this XKTGeometry.\n *\n * @type {Number}\n */\n this.numInstances = 0;\n\n /**\n * Non-quantized 3D vertex positions.\n *\n * Defined for all primitive types.\n *\n * @type {Float64Array}\n */\n this.positions = cfg.positions;\n\n /**\n * Quantized vertex positions.\n *\n * Defined for all primitive types.\n *\n * This array is later created from {@link XKTGeometry#positions} by {@link XKTModel#finalize}.\n *\n * @type {Uint16Array}\n */\n this.positionsQuantized = new Uint16Array(cfg.positions.length);\n\n /**\n * Non-compressed 3D vertex normals.\n *\n * Defined only for triangle primitives. Can be null if we want xeokit to auto-generate them. Ignored for points and lines.\n *\n * @type {Float32Array}\n */\n this.normals = cfg.normals;\n\n /**\n * Compressed vertex normals.\n *\n * Defined only for triangle primitives. Ignored for points and lines.\n *\n * This array is later created from {@link XKTGeometry#normals} by {@link XKTModel#finalize}.\n *\n * Will be null if {@link XKTGeometry#normals} is also null.\n *\n * @type {Int8Array}\n */\n this.normalsOctEncoded = null;\n\n /**\n * Compressed RGBA vertex colors.\n *\n * Defined only for point primitives. Ignored for triangles and lines.\n *\n * @type {Uint8Array}\n */\n this.colorsCompressed = cfg.colorsCompressed;\n\n /**\n * Non-compressed vertex UVs.\n *\n * @type {Float32Array}\n */\n this.uvs = cfg.uvs;\n\n /**\n * Compressed vertex UVs.\n *\n * @type {Uint16Array}\n */\n this.uvsCompressed = cfg.uvsCompressed;\n\n /**\n * Indices that organize the vertex positions and normals as triangles.\n *\n * Defined only for triangle and lines primitives. Ignored for points.\n *\n * @type {Uint32Array}\n */\n this.indices = cfg.indices;\n\n /**\n * Indices that organize the vertex positions as edges.\n *\n * Defined only for triangle primitives. Ignored for points and lines.\n *\n * @type {Uint32Array}\n */\n this.edgeIndices = cfg.edgeIndices;\n\n /**\n * When {@link XKTGeometry#primitiveType} is \"triangles\", this is ````true```` when this geometry is a watertight mesh.\n *\n * Defined only for triangle primitives. Ignored for points and lines.\n *\n * Set by {@link XKTModel#finalize}.\n *\n * @type {boolean}\n */\n this.solid = false;\n }\n\n /**\n * Convenience property that is ````true```` when {@link XKTGeometry#numInstances} is greater that one.\n * @returns {boolean}\n */\n get reused() {\n return (this.numInstances > 1);\n }\n}\n\nexport {XKTGeometry};","import {math} from \"../lib/math.js\";\n\n/**\n * An object within an {@link XKTModel}.\n *\n * * Created by {@link XKTModel#createEntity}\n * * Stored in {@link XKTModel#entities} and {@link XKTModel#entitiesList}\n * * Has one or more {@link XKTMesh}s, each having an {@link XKTGeometry}\n *\n * @class XKTEntity\n */\nclass XKTEntity {\n\n /**\n * @private\n * @param entityId\n * @param meshes\n */\n constructor(entityId, meshes) {\n\n /**\n * Unique ID of this ````XKTEntity```` in {@link XKTModel#entities}.\n *\n * For a BIM model, this will be an IFC product ID.\n *\n * We can also use {@link XKTModel#createMetaObject} to create an {@link XKTMetaObject} to specify metadata for\n * this ````XKTEntity````. To associate the {@link XKTMetaObject} with our {@link XKTEntity}, we give\n * {@link XKTMetaObject#metaObjectId} the same value as {@link XKTEntity#entityId}.\n *\n * @type {String}\n */\n this.entityId = entityId;\n\n /**\n * Index of this ````XKTEntity```` in {@link XKTModel#entitiesList}.\n *\n * Set by {@link XKTModel#finalize}.\n *\n * @type {Number}\n */\n this.entityIndex = null;\n\n /**\n * A list of {@link XKTMesh}s that indicate which {@link XKTGeometry}s are used by this Entity.\n *\n * @type {XKTMesh[]}\n */\n this.meshes = meshes;\n\n /**\n * World-space axis-aligned bounding box (AABB) that encloses the {@link XKTGeometry#positions} of\n * the {@link XKTGeometry}s that are used by this ````XKTEntity````.\n *\n * Set by {@link XKTModel#finalize}.\n *\n * @type {Float32Array}\n */\n this.aabb = math.AABB3();\n\n /**\n * Indicates if this ````XKTEntity```` shares {@link XKTGeometry}s with other {@link XKTEntity}'s.\n *\n * Set by {@link XKTModel#finalize}.\n *\n * Note that when an ````XKTEntity```` shares ````XKTGeometrys````, it shares **all** of its ````XKTGeometrys````. An ````XKTEntity````\n * never shares only some of its ````XKTGeometrys```` - it always shares either the whole set or none at all.\n *\n * @type {Boolean}\n */\n this.hasReusedGeometries = false;\n }\n}\n\nexport {XKTEntity};","/**\n * @desc A box-shaped 3D region within an {@link XKTModel} that contains {@link XKTEntity}s.\n *\n * * Created by {@link XKTModel#finalize}\n * * Stored in {@link XKTModel#tilesList}\n *\n * @class XKTTile\n */\nclass XKTTile {\n\n /**\n * Creates a new XKTTile.\n *\n * @private\n * @param aabb\n * @param entities\n */\n constructor(aabb, entities) {\n\n /**\n * Axis-aligned World-space bounding box that encloses the {@link XKTEntity}'s within this Tile.\n *\n * @type {Float64Array}\n */\n this.aabb = aabb;\n\n /**\n * The {@link XKTEntity}'s within this XKTTile.\n *\n * @type {XKTEntity[]}\n */\n this.entities = entities;\n }\n}\n\nexport {XKTTile};","/**\n * A kd-Tree node, used internally by {@link XKTModel}.\n *\n * @private\n */\nclass KDNode {\n\n /**\n * Create a KDNode with an axis-aligned 3D World-space boundary.\n */\n constructor(aabb) {\n\n /**\n * The axis-aligned 3D World-space boundary of this KDNode.\n *\n * @type {Float64Array}\n */\n this.aabb = aabb;\n\n /**\n * The {@link XKTEntity}s within this KDNode.\n */\n this.entities = null;\n\n /**\n * The left child KDNode.\n */\n this.left = null;\n\n /**\n * The right child KDNode.\n */\n this.right = null;\n }\n}\n\nexport {KDNode};","/**\n * A meta object within an {@link XKTModel}.\n *\n * These are plugged together into a parent-child hierarchy to represent structural\n * metadata for the {@link XKTModel}.\n *\n * The leaf XKTMetaObjects are usually associated with\n * an {@link XKTEntity}, which they do so by sharing the same ID,\n * ie. where {@link XKTMetaObject#metaObjectId} == {@link XKTEntity#entityId}.\n *\n * * Created by {@link XKTModel#createMetaObject}\n * * Stored in {@link XKTModel#metaObjects} and {@link XKTModel#metaObjectsList}\n * * Has an ID, a type, and a human-readable name\n * * May have a parent {@link XKTMetaObject}\n * * When no children, is usually associated with an {@link XKTEntity}\n *\n * @class XKTMetaObject\n */\nclass XKTMetaObject {\n\n /**\n * @private\n * @param metaObjectId\n * @param propertySetIds\n * @param metaObjectType\n * @param metaObjectName\n * @param parentMetaObjectId\n */\n constructor(metaObjectId, propertySetIds, metaObjectType, metaObjectName, parentMetaObjectId) {\n\n /**\n * Unique ID of this ````XKTMetaObject```` in {@link XKTModel#metaObjects}.\n *\n * For a BIM model, this will be an IFC product ID.\n *\n * If this is a leaf XKTMetaObject, where it is not a parent to any other XKTMetaObject,\n * then this will be equal to the ID of an {@link XKTEntity} in {@link XKTModel#entities},\n * ie. where {@link XKTMetaObject#metaObjectId} == {@link XKTEntity#entityId}.\n *\n * @type {String}\n */\n this.metaObjectId = metaObjectId;\n\n /**\n * Unique ID of one or more property sets that contains additional metadata about this\n * {@link XKTMetaObject}. The property sets can be stored in an external system, or\n * within the {@link XKTModel}, as {@link XKTPropertySet}s within {@link XKTModel#propertySets}.\n *\n * @type {String[]}\n */\n this.propertySetIds = propertySetIds;\n\n /**\n * Indicates the XKTMetaObject meta object type.\n *\n * This defaults to \"default\".\n *\n * @type {string}\n */\n this.metaObjectType = metaObjectType;\n\n /**\n * Indicates the XKTMetaObject meta object name.\n *\n * This defaults to {@link XKTMetaObject#metaObjectId}.\n *\n * @type {string}\n */\n this.metaObjectName = metaObjectName;\n\n /**\n * The parent XKTMetaObject, if any.\n *\n * Will be null if there is no parent.\n *\n * @type {String}\n */\n this.parentMetaObjectId = parentMetaObjectId;\n }\n}\n\nexport {XKTMetaObject};","/**\n * A property set within an {@link XKTModel}.\n *\n * These are shared among {@link XKTMetaObject}s.\n *\n * * Created by {@link XKTModel#createPropertySet}\n * * Stored in {@link XKTModel#propertySets} and {@link XKTModel#propertySetsList}\n * * Has an ID, a type, and a human-readable name\n *\n * @class XKTPropertySet\n */\nclass XKTPropertySet {\n\n /**\n * @private\n */\n constructor(propertySetId, propertySetType, propertySetName, properties) {\n\n /**\n * Unique ID of this ````XKTPropertySet```` in {@link XKTModel#propertySets}.\n *\n * @type {String}\n */\n this.propertySetId = propertySetId;\n\n /**\n * Indicates the ````XKTPropertySet````'s type.\n *\n * This defaults to \"default\".\n *\n * @type {string}\n */\n this.propertySetType = propertySetType;\n\n /**\n * Indicates the XKTPropertySet meta object name.\n *\n * This defaults to {@link XKTPropertySet#propertySetId}.\n *\n * @type {string}\n */\n this.propertySetName = propertySetName;\n\n /**\n * The properties within this ````XKTPropertySet````.\n *\n * @type {*[]}\n */\n this.properties = properties;\n }\n}\n\nexport {XKTPropertySet};","/**\n * A texture shared by {@link XKTTextureSet}s.\n *\n * * Created by {@link XKTModel#createTexture}\n * * Stored in {@link XKTTextureSet#textures}, {@link XKTModel#textures} and {@link XKTModel#texturesList}\n *\n * @class XKTTexture\n */\nimport {RepeatWrapping, LinearMipMapNearestFilter} from \"../constants\";\n\nclass XKTTexture {\n\n /**\n * @private\n */\n constructor(cfg) {\n\n /**\n * Unique ID of this XKTTexture in {@link XKTModel#textures}.\n *\n * @type {Number}\n */\n this.textureId = cfg.textureId;\n\n /**\n * Index of this XKTTexture in {@link XKTModel#texturesList};\n *\n * @type {Number}\n */\n this.textureIndex = cfg.textureIndex;\n\n /**\n * Texture image data.\n *\n * @type {Buffer}\n */\n this.imageData = cfg.imageData;\n\n /**\n * Which material channel this texture is applied to, as determined by its {@link XKTTextureSet}s.\n *\n * @type {Number}\n */\n this.channel = null;\n\n /**\n * Width of this XKTTexture.\n *\n * @type {Number}\n */\n this.width = cfg.width;\n\n /**\n * Height of this XKTTexture.\n *\n * @type {Number}\n */\n this.height = cfg.height;\n\n /**\n * Texture file source.\n *\n * @type {String}\n */\n this.src = cfg.src;\n\n /**\n * Whether this XKTTexture is to be compressed.\n *\n * @type {Boolean}\n */\n this.compressed = (!!cfg.compressed);\n\n /**\n * Media type of this XKTTexture.\n *\n * Supported values are {@link GIFMediaType}, {@link PNGMediaType} and {@link JPEGMediaType}.\n *\n * Ignored for compressed textures.\n *\n * @type {Number}\n */\n this.mediaType = cfg.mediaType;\n\n /**\n * How the texture is sampled when a texel covers less than one pixel. Supported values\n * are {@link LinearMipmapLinearFilter}, {@link LinearMipMapNearestFilter},\n * {@link NearestMipMapNearestFilter}, {@link NearestMipMapLinearFilter}\n * and {@link LinearMipMapLinearFilter}.\n *\n * Ignored for compressed textures.\n *\n * @type {Number}\n */\n this.minFilter = cfg.minFilter || LinearMipMapNearestFilter;\n\n /**\n * How the texture is sampled when a texel covers more than one pixel. Supported values\n * are {@link LinearFilter} and {@link NearestFilter}.\n *\n * Ignored for compressed textures.\n *\n * @type {Number}\n */\n this.magFilter = cfg.magFilter || LinearMipMapNearestFilter;\n\n /**\n * S wrapping mode.\n *\n * Supported values are {@link ClampToEdgeWrapping},\n * {@link MirroredRepeatWrapping} and {@link RepeatWrapping}.\n *\n * Ignored for compressed textures.\n *\n * @type {Number}\n */\n this.wrapS = cfg.wrapS || RepeatWrapping;\n\n /**\n * T wrapping mode.\n *\n * Supported values are {@link ClampToEdgeWrapping},\n * {@link MirroredRepeatWrapping} and {@link RepeatWrapping}.\n *\n * Ignored for compressed textures.\n *\n * @type {Number}\n */\n this.wrapT = cfg.wrapT || RepeatWrapping;\n\n /**\n * R wrapping mode.\n *\n * Ignored for compressed textures.\n *\n * Supported values are {@link ClampToEdgeWrapping},\n * {@link MirroredRepeatWrapping} and {@link RepeatWrapping}.\n *\n * @type {*|number}\n */\n this.wrapR = cfg.wrapR || RepeatWrapping\n }\n}\n\nexport {XKTTexture};","/**\n * A set of textures shared by {@link XKTMesh}es.\n *\n * * Created by {@link XKTModel#createTextureSet}\n * * Registered in {@link XKTMesh#material}, {@link XKTModel#materials} and {@link XKTModel#.textureSetsList}\n *\n * @class XKTMetalRoughMaterial\n */\nclass XKTTextureSet {\n\n /**\n * @private\n */\n constructor(cfg) {\n\n /**\n * Unique ID of this XKTTextureSet in {@link XKTModel#materials}.\n *\n * @type {Number}\n */\n this.textureSetId = cfg.textureSetId;\n\n /**\n * Index of this XKTTexture in {@link XKTModel#texturesList};\n *\n * @type {Number}\n */\n this.textureSetIndex = cfg.textureSetIndex;\n\n /**\n * Identifies the material type.\n *\n * @type {Number}\n */\n this.materialType = cfg.materialType;\n\n /**\n * Index of this XKTTextureSet in {@link XKTModel#meshesList};\n *\n * @type {Number}\n */\n this.materialIndex = cfg.materialIndex;\n\n /**\n * The number of {@link XKTMesh}s that reference this XKTTextureSet.\n *\n * @type {Number}\n */\n this.numInstances = 0;\n\n /**\n * RGBA {@link XKTTexture} containing base color in RGB and opacity in A.\n *\n * @type {XKTTexture}\n */\n this.colorTexture = cfg.colorTexture;\n\n /**\n * RGBA {@link XKTTexture} containing metallic and roughness factors in R and G.\n *\n * @type {XKTTexture}\n */\n this.metallicRoughnessTexture = cfg.metallicRoughnessTexture;\n\n /**\n * RGBA {@link XKTTexture} with surface normals in RGB.\n *\n * @type {XKTTexture}\n */\n this.normalsTexture = cfg.normalsTexture;\n\n /**\n * RGBA {@link XKTTexture} with emissive color in RGB.\n *\n * @type {XKTTexture}\n */\n this.emissiveTexture = cfg.emissiveTexture;\n\n /**\n * RGBA {@link XKTTexture} with ambient occlusion factors in RGB.\n *\n * @type {XKTTexture}\n */\n this.occlusionTexture = cfg.occlusionTexture;\n }\n}\n\nexport {XKTTextureSet};","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@loaders.gl/core\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@loaders.gl/textures\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@loaders.gl/images\");","import {math} from \"../lib/math.js\";\nimport {geometryCompression} from \"./lib/geometryCompression.js\";\nimport {buildEdgeIndices} from \"./lib/buildEdgeIndices.js\";\nimport {isTriangleMeshSolid} from \"./lib/isTriangleMeshSolid.js\";\n\nimport {XKTMesh} from './XKTMesh.js';\nimport {XKTGeometry} from './XKTGeometry.js';\nimport {XKTEntity} from './XKTEntity.js';\nimport {XKTTile} from './XKTTile.js';\nimport {KDNode} from \"./KDNode.js\";\nimport {XKTMetaObject} from \"./XKTMetaObject.js\";\nimport {XKTPropertySet} from \"./XKTPropertySet.js\";\nimport {mergeVertices} from \"../lib/mergeVertices.js\";\nimport {XKT_INFO} from \"../XKT_INFO.js\";\nimport {XKTTexture} from \"./XKTTexture\";\nimport {XKTTextureSet} from \"./XKTTextureSet\";\nimport {encode, load} from \"@loaders.gl/core\";\nimport {KTX2BasisWriter} from \"@loaders.gl/textures\";\nimport {ImageLoader} from '@loaders.gl/images';\n\nconst tempVec4a = math.vec4([0, 0, 0, 1]);\nconst tempVec4b = math.vec4([0, 0, 0, 1]);\n\nconst tempMat4 = math.mat4();\nconst tempMat4b = math.mat4();\n\nconst kdTreeDimLength = new Float64Array(3);\n\n// XKT texture types\n\nconst COLOR_TEXTURE = 0;\nconst METALLIC_ROUGHNESS_TEXTURE = 1;\nconst NORMALS_TEXTURE = 2;\nconst EMISSIVE_TEXTURE = 3;\nconst OCCLUSION_TEXTURE = 4;\n\n// KTX2 encoding options for each texture type\n\nconst TEXTURE_ENCODING_OPTIONS = {}\nTEXTURE_ENCODING_OPTIONS[COLOR_TEXTURE] = {\n useSRGB: true,\n qualityLevel: 50,\n encodeUASTC: true,\n mipmaps: true\n};\nTEXTURE_ENCODING_OPTIONS[EMISSIVE_TEXTURE] = {\n useSRGB: true,\n encodeUASTC: true,\n qualityLevel: 10,\n mipmaps: false\n};\nTEXTURE_ENCODING_OPTIONS[METALLIC_ROUGHNESS_TEXTURE] = {\n useSRGB: false,\n encodeUASTC: true,\n qualityLevel: 50,\n mipmaps: true // Needed for GGX roughness shading\n};\nTEXTURE_ENCODING_OPTIONS[NORMALS_TEXTURE] = {\n useSRGB: false,\n encodeUASTC: true,\n qualityLevel: 10,\n mipmaps: false\n};\nTEXTURE_ENCODING_OPTIONS[OCCLUSION_TEXTURE] = {\n useSRGB: false,\n encodeUASTC: true,\n qualityLevel: 10,\n mipmaps: false\n};\n\n/**\n * A document model that represents the contents of an .XKT file.\n *\n * * An XKTModel contains {@link XKTTile}s, which spatially subdivide the model into axis-aligned, box-shaped regions.\n * * Each {@link XKTTile} contains {@link XKTEntity}s, which represent the objects within its region.\n * * Each {@link XKTEntity} has {@link XKTMesh}s, which each have a {@link XKTGeometry}. Each {@link XKTGeometry} can be shared by multiple {@link XKTMesh}s.\n * * Import models into an XKTModel using {@link parseGLTFJSONIntoXKTModel}, {@link parseIFCIntoXKTModel}, {@link parseCityJSONIntoXKTModel} etc.\n * * Build an XKTModel programmatically using {@link XKTModel#createGeometry}, {@link XKTModel#createMesh} and {@link XKTModel#createEntity}.\n * * Serialize an XKTModel to an ArrayBuffer using {@link writeXKTModelToArrayBuffer}.\n *\n * ## Usage\n *\n * See [main docs page](/docs/#javascript-api) for usage examples.\n *\n * @class XKTModel\n */\nclass XKTModel {\n\n /**\n * Constructs a new XKTModel.\n *\n * @param {*} [cfg] Configuration\n * @param {Number} [cfg.edgeThreshold=10]\n * @param {Number} [cfg.minTileSize=500]\n */\n constructor(cfg = {}) {\n\n /**\n * The model's ID, if available.\n *\n * Will be \"default\" by default.\n *\n * @type {String}\n */\n this.modelId = cfg.modelId || \"default\";\n\n /**\n * The project ID, if available.\n *\n * Will be an empty string by default.\n *\n * @type {String}\n */\n this.projectId = cfg.projectId || \"\";\n\n /**\n * The revision ID, if available.\n *\n * Will be an empty string by default.\n *\n * @type {String}\n */\n this.revisionId = cfg.revisionId || \"\";\n\n /**\n * The model author, if available.\n *\n * Will be an empty string by default.\n *\n * @property author\n * @type {String}\n */\n this.author = cfg.author || \"\";\n\n /**\n * The date the model was created, if available.\n *\n * Will be an empty string by default.\n *\n * @property createdAt\n * @type {String}\n */\n this.createdAt = cfg.createdAt || \"\";\n\n /**\n * The application that created the model, if available.\n *\n * Will be an empty string by default.\n *\n * @property creatingApplication\n * @type {String}\n */\n this.creatingApplication = cfg.creatingApplication || \"\";\n\n /**\n * The model schema version, if available.\n *\n * In the case of IFC, this could be \"IFC2x3\" or \"IFC4\", for example.\n *\n * Will be an empty string by default.\n *\n * @property schema\n * @type {String}\n */\n this.schema = cfg.schema || \"\";\n\n /**\n * The XKT format version.\n *\n * @property xktVersion;\n * @type {number}\n */\n this.xktVersion = XKT_INFO.xktVersion;\n\n /**\n *\n * @type {Number|number}\n */\n this.edgeThreshold = cfg.edgeThreshold || 10;\n\n /**\n * Minimum diagonal size of the boundary of an {@link XKTTile}.\n *\n * @type {Number|number}\n */\n this.minTileSize = cfg.minTileSize || 500;\n\n /**\n * Optional overall AABB that contains all the {@link XKTEntity}s we'll create in this model, if previously known.\n *\n * This is the AABB of a complete set of input files that are provided as a split-model set for conversion.\n *\n * This is used to help the {@link XKTTile.aabb}s within split models align neatly with each other, as we\n * build them with a k-d tree in {@link XKTModel#finalize}. Without this, the AABBs of the different parts\n * tend to misalign slightly, resulting in excess number of {@link XKTTile}s, which degrades memory and rendering\n * performance when the XKT is viewer in the xeokit Viewer.\n */\n this.modelAABB = cfg.modelAABB;\n\n /**\n * Map of {@link XKTPropertySet}s within this XKTModel, each mapped to {@link XKTPropertySet#propertySetId}.\n *\n * Created by {@link XKTModel#createPropertySet}.\n *\n * @type {{String:XKTPropertySet}}\n */\n this.propertySets = {};\n\n /**\n * {@link XKTPropertySet}s within this XKTModel.\n *\n * Each XKTPropertySet holds its position in this list in {@link XKTPropertySet#propertySetIndex}.\n *\n * Created by {@link XKTModel#finalize}.\n *\n * @type {XKTPropertySet[]}\n */\n this.propertySetsList = [];\n\n /**\n * Map of {@link XKTMetaObject}s within this XKTModel, each mapped to {@link XKTMetaObject#metaObjectId}.\n *\n * Created by {@link XKTModel#createMetaObject}.\n *\n * @type {{String:XKTMetaObject}}\n */\n this.metaObjects = {};\n\n /**\n * {@link XKTMetaObject}s within this XKTModel.\n *\n * Each XKTMetaObject holds its position in this list in {@link XKTMetaObject#metaObjectIndex}.\n *\n * Created by {@link XKTModel#finalize}.\n *\n * @type {XKTMetaObject[]}\n */\n this.metaObjectsList = [];\n\n /**\n * The positions of all shared {@link XKTGeometry}s are de-quantized using this singular\n * de-quantization matrix.\n *\n * This de-quantization matrix is generated from the collective Local-space boundary of the\n * positions of all shared {@link XKTGeometry}s.\n *\n * @type {Float32Array}\n */\n this.reusedGeometriesDecodeMatrix = new Float32Array(16);\n\n /**\n * Map of {@link XKTGeometry}s within this XKTModel, each mapped to {@link XKTGeometry#geometryId}.\n *\n * Created by {@link XKTModel#createGeometry}.\n *\n * @type {{Number:XKTGeometry}}\n */\n this.geometries = {};\n\n /**\n * List of {@link XKTGeometry}s within this XKTModel, in the order they were created.\n *\n * Each XKTGeometry holds its position in this list in {@link XKTGeometry#geometryIndex}.\n *\n * Created by {@link XKTModel#finalize}.\n *\n * @type {XKTGeometry[]}\n */\n this.geometriesList = [];\n\n /**\n * Map of {@link XKTTexture}s within this XKTModel, each mapped to {@link XKTTexture#textureId}.\n *\n * Created by {@link XKTModel#createTexture}.\n *\n * @type {{Number:XKTTexture}}\n */\n this.textures = {};\n\n /**\n * List of {@link XKTTexture}s within this XKTModel, in the order they were created.\n *\n * Each XKTTexture holds its position in this list in {@link XKTTexture#textureIndex}.\n *\n * Created by {@link XKTModel#finalize}.\n *\n * @type {XKTTexture[]}\n */\n this.texturesList = [];\n\n /**\n * Map of {@link XKTTextureSet}s within this XKTModel, each mapped to {@link XKTTextureSet#textureSetId}.\n *\n * Created by {@link XKTModel#createTextureSet}.\n *\n * @type {{Number:XKTTextureSet}}\n */\n this.textureSets = {};\n\n /**\n * List of {@link XKTTextureSet}s within this XKTModel, in the order they were created.\n *\n * Each XKTTextureSet holds its position in this list in {@link XKTTextureSet#textureSetIndex}.\n *\n * Created by {@link XKTModel#finalize}.\n *\n * @type {XKTTextureSet[]}\n */\n this.textureSetsList = [];\n\n /**\n * Map of {@link XKTMesh}s within this XKTModel, each mapped to {@link XKTMesh#meshId}.\n *\n * Created by {@link XKTModel#createMesh}.\n *\n * @type {{Number:XKTMesh}}\n */\n this.meshes = {};\n\n /**\n * List of {@link XKTMesh}s within this XKTModel, in the order they were created.\n *\n * Each XKTMesh holds its position in this list in {@link XKTMesh#meshIndex}.\n *\n * Created by {@link XKTModel#finalize}.\n *\n * @type {XKTMesh[]}\n */\n this.meshesList = [];\n\n /**\n * Map of {@link XKTEntity}s within this XKTModel, each mapped to {@link XKTEntity#entityId}.\n *\n * Created by {@link XKTModel#createEntity}.\n *\n * @type {{String:XKTEntity}}\n */\n this.entities = {};\n\n /**\n * {@link XKTEntity}s within this XKTModel.\n *\n * Each XKTEntity holds its position in this list in {@link XKTEntity#entityIndex}.\n *\n * Created by {@link XKTModel#finalize}.\n *\n * @type {XKTEntity[]}\n */\n this.entitiesList = [];\n\n /**\n * {@link XKTTile}s within this XKTModel.\n *\n * Created by {@link XKTModel#finalize}.\n *\n * @type {XKTTile[]}\n */\n this.tilesList = [];\n\n /**\n * The axis-aligned 3D World-space boundary of this XKTModel.\n *\n * Created by {@link XKTModel#finalize}.\n *\n * @type {Float64Array}\n */\n this.aabb = math.AABB3();\n\n /**\n * Indicates if this XKTModel has been finalized.\n *\n * Set ````true```` by {@link XKTModel#finalize}.\n *\n * @type {boolean}\n */\n this.finalized = false;\n }\n\n /**\n * Creates an {@link XKTPropertySet} within this XKTModel.\n *\n * Logs error and does nothing if this XKTModel has been finalized (see {@link XKTModel#finalized}).\n *\n * @param {*} params Method parameters.\n * @param {String} params.propertySetId Unique ID for the {@link XKTPropertySet}.\n * @param {String} [params.propertySetType=\"default\"] A meta type for the {@link XKTPropertySet}.\n * @param {String} [params.propertySetName] Human-readable name for the {@link XKTPropertySet}. Defaults to the ````propertySetId```` parameter.\n * @param {String[]} params.properties Properties for the {@link XKTPropertySet}.\n * @returns {XKTPropertySet} The new {@link XKTPropertySet}.\n */\n createPropertySet(params) {\n\n if (!params) {\n throw \"Parameters expected: params\";\n }\n\n if (params.propertySetId === null || params.propertySetId === undefined) {\n throw \"Parameter expected: params.propertySetId\";\n }\n\n if (params.properties === null || params.properties === undefined) {\n throw \"Parameter expected: params.properties\";\n }\n\n if (this.finalized) {\n console.error(\"XKTModel has been finalized, can't add more property sets\");\n return;\n }\n\n if (this.propertySets[params.propertySetId]) {\n // console.error(\"XKTPropertySet already exists with this ID: \" + params.propertySetId);\n return;\n }\n\n const propertySetId = params.propertySetId;\n const propertySetType = params.propertySetType || \"Default\";\n const propertySetName = params.propertySetName || params.propertySetId;\n const properties = params.properties || [];\n\n const propertySet = new XKTPropertySet(propertySetId, propertySetType, propertySetName, properties);\n\n this.propertySets[propertySetId] = propertySet;\n this.propertySetsList.push(propertySet);\n\n return propertySet;\n }\n\n /**\n * Creates an {@link XKTMetaObject} within this XKTModel.\n *\n * Logs error and does nothing if this XKTModel has been finalized (see {@link XKTModel#finalized}).\n *\n * @param {*} params Method parameters.\n * @param {String} params.metaObjectId Unique ID for the {@link XKTMetaObject}.\n * @param {String} params.propertySetIds ID of one or more property sets that contains additional metadata about\n * this {@link XKTMetaObject}. The property sets could be stored externally (ie not managed at all by the XKT file),\n * or could be {@link XKTPropertySet}s within {@link XKTModel#propertySets}.\n * @param {String} [params.metaObjectType=\"default\"] A meta type for the {@link XKTMetaObject}. Can be anything,\n * but is usually an IFC type, such as \"IfcSite\" or \"IfcWall\".\n * @param {String} [params.metaObjectName] Human-readable name for the {@link XKTMetaObject}. Defaults to the ````metaObjectId```` parameter.\n * @param {String} [params.parentMetaObjectId] ID of the parent {@link XKTMetaObject}, if any. Defaults to the ````metaObjectId```` parameter.\n * @returns {XKTMetaObject} The new {@link XKTMetaObject}.\n */\n createMetaObject(params) {\n\n if (!params) {\n throw \"Parameters expected: params\";\n }\n\n if (params.metaObjectId === null || params.metaObjectId === undefined) {\n throw \"Parameter expected: params.metaObjectId\";\n }\n\n if (this.finalized) {\n console.error(\"XKTModel has been finalized, can't add more meta objects\");\n return;\n }\n\n if (this.metaObjects[params.metaObjectId]) {\n // console.error(\"XKTMetaObject already exists with this ID: \" + params.metaObjectId);\n return;\n }\n\n const metaObjectId = params.metaObjectId;\n const propertySetIds = params.propertySetIds;\n const metaObjectType = params.metaObjectType || \"Default\";\n const metaObjectName = params.metaObjectName || params.metaObjectId;\n const parentMetaObjectId = params.parentMetaObjectId;\n\n const metaObject = new XKTMetaObject(metaObjectId, propertySetIds, metaObjectType, metaObjectName, parentMetaObjectId);\n\n this.metaObjects[metaObjectId] = metaObject;\n this.metaObjectsList.push(metaObject);\n\n if (!parentMetaObjectId) {\n if (!this._rootMetaObject) {\n this._rootMetaObject = metaObject;\n }\n }\n\n return metaObject;\n }\n\n /**\n * Creates an {@link XKTTexture} within this XKTModel.\n *\n * Registers the new {@link XKTTexture} in {@link XKTModel#textures} and {@link XKTModel#texturesList}.\n *\n * Logs error and does nothing if this XKTModel has been finalized (see {@link XKTModel#finalized}).\n *\n * @param {*} params Method parameters.\n * @param {Number} params.textureId Unique ID for the {@link XKTTexture}.\n * @param {String} [params.src] Source of an image file for the texture.\n * @param {Buffer} [params.imageData] Image data for the texture.\n * @param {Number} [params.mediaType] Media type (ie. MIME type) of ````imageData````. Supported values are {@link GIFMediaType}, {@link PNGMediaType} and {@link JPEGMediaType}.\n * @param {Number} [params.width] Texture width, used with ````imageData````. Ignored for compressed textures.\n * @param {Number} [params.height] Texture height, used with ````imageData````. Ignored for compressed textures.\n * @param {Boolean} [params.compressed=true] Whether to compress the texture.\n * @param {Number} [params.minFilter=LinearMipMapNearestFilter] How the texture is sampled when a texel covers less than one pixel. Supported\n * values are {@link LinearMipmapLinearFilter}, {@link LinearMipMapNearestFilter}, {@link NearestMipMapNearestFilter},\n * {@link NearestMipMapLinearFilter} and {@link LinearMipMapLinearFilter}. Ignored for compressed textures.\n * @param {Number} [params.magFilter=LinearMipMapNearestFilter] How the texture is sampled when a texel covers more than one pixel. Supported values\n * are {@link LinearFilter} and {@link NearestFilter}. Ignored for compressed textures.\n * @param {Number} [params.wrapS=RepeatWrapping] Wrap parameter for texture coordinate *S*. Supported values are {@link ClampToEdgeWrapping},\n * {@link MirroredRepeatWrapping} and {@link RepeatWrapping}. Ignored for compressed textures.\n * @param {Number} [params.wrapT=RepeatWrapping] Wrap parameter for texture coordinate *T*. Supported values are {@link ClampToEdgeWrapping},\n * {@link MirroredRepeatWrapping} and {@link RepeatWrapping}. Ignored for compressed textures.\n * {@param {Number} [params.wrapR=RepeatWrapping] Wrap parameter for texture coordinate *R*. Supported values are {@link ClampToEdgeWrapping},\n * {@link MirroredRepeatWrapping} and {@link RepeatWrapping}. Ignored for compressed textures.\n * @returns {XKTTexture} The new {@link XKTTexture}.\n */\n createTexture(params) {\n\n if (!params) {\n throw \"Parameters expected: params\";\n }\n\n if (params.textureId === null || params.textureId === undefined) {\n throw \"Parameter expected: params.textureId\";\n }\n\n if (!params.imageData && !params.src) {\n throw \"Parameter expected: params.imageData or params.src\";\n }\n\n if (this.finalized) {\n console.error(\"XKTModel has been finalized, can't add more textures\");\n return;\n }\n\n if (this.textures[params.textureId]) {\n console.error(\"XKTTexture already exists with this ID: \" + params.textureId);\n return;\n }\n\n if (params.src) {\n const fileExt = params.src.split('.').pop();\n if (fileExt !== \"jpg\" && fileExt !== \"jpeg\" && fileExt !== \"png\") {\n console.error(`XKTModel does not support image files with extension '${fileExt}' - won't create texture '${params.textureId}`);\n return;\n }\n }\n\n const textureId = params.textureId;\n\n const texture = new XKTTexture({\n textureId,\n imageData: params.imageData,\n mediaType: params.mediaType,\n minFilter: params.minFilter,\n magFilter: params.magFilter,\n wrapS: params.wrapS,\n wrapT: params.wrapT,\n wrapR: params.wrapR,\n width: params.width,\n height: params.height,\n compressed: (params.compressed !== false),\n src: params.src\n });\n\n this.textures[textureId] = texture;\n this.texturesList.push(texture);\n\n return texture;\n }\n\n /**\n * Creates an {@link XKTTextureSet} within this XKTModel.\n *\n * Registers the new {@link XKTTextureSet} in {@link XKTModel#textureSets} and {@link XKTModel#.textureSetsList}.\n *\n * Logs error and does nothing if this XKTModel has been finalized (see {@link XKTModel#finalized}).\n *\n * @param {*} params Method parameters.\n * @param {Number} params.textureSetId Unique ID for the {@link XKTTextureSet}.\n * @param {*} [params.colorTextureId] ID of *RGBA* base color {@link XKTTexture}, with color in *RGB* and alpha in *A*.\n * @param {*} [params.metallicRoughnessTextureId] ID of *RGBA* metal-roughness {@link XKTTexture}, with the metallic factor in *R*, and roughness factor in *G*.\n * @param {*} [params.normalsTextureId] ID of *RGBA* normal {@link XKTTexture}, with normal map vectors in *RGB*.\n * @param {*} [params.emissiveTextureId] ID of *RGBA* emissive {@link XKTTexture}, with emissive color in *RGB*.\n * @param {*} [params.occlusionTextureId] ID of *RGBA* occlusion {@link XKTTexture}, with occlusion factor in *R*.\n * @returns {XKTTextureSet} The new {@link XKTTextureSet}.\n */\n createTextureSet(params) {\n\n if (!params) {\n throw \"Parameters expected: params\";\n }\n\n if (params.textureSetId === null || params.textureSetId === undefined) {\n throw \"Parameter expected: params.textureSetId\";\n }\n\n if (this.finalized) {\n console.error(\"XKTModel has been finalized, can't add more textureSets\");\n return;\n }\n\n if (this.textureSets[params.textureSetId]) {\n console.error(\"XKTTextureSet already exists with this ID: \" + params.textureSetId);\n return;\n }\n\n let colorTexture;\n if (params.colorTextureId !== undefined && params.colorTextureId !== null) {\n colorTexture = this.textures[params.colorTextureId];\n if (!colorTexture) {\n console.error(`Texture not found: ${params.colorTextureId} - ensure that you create it first with createTexture()`);\n return;\n }\n colorTexture.channel = COLOR_TEXTURE;\n }\n\n let metallicRoughnessTexture;\n if (params.metallicRoughnessTextureId !== undefined && params.metallicRoughnessTextureId !== null) {\n metallicRoughnessTexture = this.textures[params.metallicRoughnessTextureId];\n if (!metallicRoughnessTexture) {\n console.error(`Texture not found: ${params.metallicRoughnessTextureId} - ensure that you create it first with createTexture()`);\n return;\n }\n metallicRoughnessTexture.channel = METALLIC_ROUGHNESS_TEXTURE;\n }\n\n let normalsTexture;\n if (params.normalsTextureId !== undefined && params.normalsTextureId !== null) {\n normalsTexture = this.textures[params.normalsTextureId];\n if (!normalsTexture) {\n console.error(`Texture not found: ${params.normalsTextureId} - ensure that you create it first with createTexture()`);\n return;\n }\n normalsTexture.channel = NORMALS_TEXTURE;\n }\n\n let emissiveTexture;\n if (params.emissiveTextureId !== undefined && params.emissiveTextureId !== null) {\n emissiveTexture = this.textures[params.emissiveTextureId];\n if (!emissiveTexture) {\n console.error(`Texture not found: ${params.emissiveTextureId} - ensure that you create it first with createTexture()`);\n return;\n }\n emissiveTexture.channel = EMISSIVE_TEXTURE;\n }\n\n let occlusionTexture;\n if (params.occlusionTextureId !== undefined && params.occlusionTextureId !== null) {\n occlusionTexture = this.textures[params.occlusionTextureId];\n if (!occlusionTexture) {\n console.error(`Texture not found: ${params.occlusionTextureId} - ensure that you create it first with createTexture()`);\n return;\n }\n occlusionTexture.channel = OCCLUSION_TEXTURE;\n }\n\n const textureSet = new XKTTextureSet({\n textureSetId: params.textureSetId,\n textureSetIndex: this.textureSetsList.length,\n colorTexture,\n metallicRoughnessTexture,\n normalsTexture,\n emissiveTexture,\n occlusionTexture\n });\n\n this.textureSets[params.textureSetId] = textureSet;\n this.textureSetsList.push(textureSet);\n\n return textureSet;\n }\n\n /**\n * Creates an {@link XKTGeometry} within this XKTModel.\n *\n * Registers the new {@link XKTGeometry} in {@link XKTModel#geometries} and {@link XKTModel#geometriesList}.\n *\n * Logs error and does nothing if this XKTModel has been finalized (see {@link XKTModel#finalized}).\n *\n * @param {*} params Method parameters.\n * @param {Number} params.geometryId Unique ID for the {@link XKTGeometry}.\n * @param {String} params.primitiveType The type of {@link XKTGeometry}: \"triangles\", \"lines\" or \"points\".\n * @param {Float64Array} params.positions Floating-point Local-space vertex positions for the {@link XKTGeometry}. Required for all primitive types.\n * @param {Number[]} [params.normals] Floating-point vertex normals for the {@link XKTGeometry}. Only used with triangles primitives. Ignored for points and lines.\n * @param {Number[]} [params.colors] Floating-point RGBA vertex colors for the {@link XKTGeometry}. Required for points primitives. Ignored for lines and triangles.\n * @param {Number[]} [params.colorsCompressed] Integer RGBA vertex colors for the {@link XKTGeometry}. Required for points primitives. Ignored for lines and triangles.\n * @param {Number[]} [params.uvs] Floating-point vertex UV coordinates for the {@link XKTGeometry}. Alias for ````uv````.\n * @param {Number[]} [params.uv] Floating-point vertex UV coordinates for the {@link XKTGeometry}. Alias for ````uvs````.\n * @param {Number[]} [params.colorsCompressed] Integer RGBA vertex colors for the {@link XKTGeometry}. Required for points primitives. Ignored for lines and triangles.\n * @param {Uint32Array} [params.indices] Indices for the {@link XKTGeometry}. Required for triangles and lines primitives. Ignored for points.\n * @param {Number} [params.edgeThreshold=10]\n * @returns {XKTGeometry} The new {@link XKTGeometry}.\n */\n createGeometry(params) {\n\n if (!params) {\n throw \"Parameters expected: params\";\n }\n\n if (params.geometryId === null || params.geometryId === undefined) {\n throw \"Parameter expected: params.geometryId\";\n }\n\n if (!params.primitiveType) {\n throw \"Parameter expected: params.primitiveType\";\n }\n\n if (!params.positions) {\n throw \"Parameter expected: params.positions\";\n }\n\n const triangles = params.primitiveType === \"triangles\";\n const points = params.primitiveType === \"points\";\n const lines = params.primitiveType === \"lines\";\n const line_strip = params.primitiveType === \"line-strip\";\n const triangle_strip = params.primitiveType === \"triangle-strip\";\n const triangle_fan = params.primitiveType === \"triangle-fan\";\n\n if (!triangles && !points && !lines && !line_strip) {\n throw \"Unsupported value for params.primitiveType: \"\n + params.primitiveType\n + \"' - supported values are 'triangles', 'points', 'lines', 'line-strip', 'triangle-strip' and 'triangle-fan\";\n }\n\n if (triangles) {\n if (!params.indices) {\n params.indices = this._createDefaultIndices()\n throw \"Parameter expected for 'triangles' primitive: params.indices\";\n }\n }\n\n if (points) {\n if (!params.colors && !params.colorsCompressed) {\n throw \"Parameter expected for 'points' primitive: params.colors or params.colorsCompressed\";\n }\n }\n\n if (lines) {\n if (!params.indices) {\n throw \"Parameter expected for 'lines' primitive: params.indices\";\n }\n }\n\n if (this.finalized) {\n console.error(\"XKTModel has been finalized, can't add more geometries\");\n return;\n }\n\n if (this.geometries[params.geometryId]) {\n console.error(\"XKTGeometry already exists with this ID: \" + params.geometryId);\n return;\n }\n\n const geometryId = params.geometryId;\n const primitiveType = params.primitiveType;\n const positions = new Float64Array(params.positions); // May modify in #finalize\n\n const xktGeometryCfg = {\n geometryId: geometryId,\n geometryIndex: this.geometriesList.length,\n primitiveType: primitiveType,\n positions: positions,\n uvs: params.uvs || params.uv\n }\n\n if (triangles) {\n if (params.normals) {\n xktGeometryCfg.normals = new Float32Array(params.normals);\n }\n if (params.indices) {\n xktGeometryCfg.indices = params.indices;\n } else {\n xktGeometryCfg.indices = this._createDefaultIndices(positions.length / 3);\n }\n }\n\n if (points) {\n if (params.colorsCompressed) {\n xktGeometryCfg.colorsCompressed = new Uint8Array(params.colorsCompressed);\n\n } else {\n const colors = params.colors;\n const colorsCompressed = new Uint8Array(colors.length);\n for (let i = 0, len = colors.length; i < len; i++) {\n colorsCompressed[i] = Math.floor(colors[i] * 255);\n }\n xktGeometryCfg.colorsCompressed = colorsCompressed;\n }\n }\n\n if (lines) {\n xktGeometryCfg.indices = params.indices;\n }\n\n if (triangles) {\n\n if (!params.normals && !params.uv && !params.uvs) {\n\n // Building models often duplicate positions to allow face-aligned vertex normals; when we're not\n // providing normals for a geometry, it becomes possible to merge duplicate vertex positions within it.\n\n // TODO: Make vertex merging also merge normals?\n\n const mergedPositions = [];\n const mergedIndices = [];\n mergeVertices(xktGeometryCfg.positions, xktGeometryCfg.indices, mergedPositions, mergedIndices);\n xktGeometryCfg.positions = new Float64Array(mergedPositions);\n xktGeometryCfg.indices = mergedIndices;\n }\n\n xktGeometryCfg.edgeIndices = buildEdgeIndices(xktGeometryCfg.positions, xktGeometryCfg.indices, null, params.edgeThreshold || this.edgeThreshold || 10);\n }\n\n const geometry = new XKTGeometry(xktGeometryCfg);\n\n this.geometries[geometryId] = geometry;\n this.geometriesList.push(geometry);\n\n return geometry;\n }\n\n _createDefaultIndices(numIndices) {\n const indices = [];\n for (let i = 0; i < numIndices; i++) {\n indices.push(i);\n }\n return indices;\n }\n\n /**\n * Creates an {@link XKTMesh} within this XKTModel.\n *\n * An {@link XKTMesh} can be owned by one {@link XKTEntity}, which can own multiple {@link XKTMesh}es.\n *\n * Registers the new {@link XKTMesh} in {@link XKTModel#meshes} and {@link XKTModel#meshesList}.\n *\n * @param {*} params Method parameters.\n * @param {Number} params.meshId Unique ID for the {@link XKTMesh}.\n * @param {Number} params.geometryId ID of an existing {@link XKTGeometry} in {@link XKTModel#geometries}.\n * @param {Number} [params.textureSetId] Unique ID of an {@link XKTTextureSet} in {@link XKTModel#textureSets}.\n * @param {Float32Array} params.color RGB color for the {@link XKTMesh}, with each color component in range [0..1].\n * @param {Number} [params.metallic=0] How metallic the {@link XKTMesh} is, in range [0..1]. A value of ````0```` indicates fully dielectric material, while ````1```` indicates fully metallic.\n * @param {Number} [params.roughness=1] How rough the {@link XKTMesh} is, in range [0..1]. A value of ````0```` indicates fully smooth, while ````1```` indicates fully rough.\n * @param {Number} params.opacity Opacity factor for the {@link XKTMesh}, in range [0..1].\n * @param {Float64Array} [params.matrix] Modeling matrix for the {@link XKTMesh}. Overrides ````position````, ````scale```` and ````rotation```` parameters.\n * @param {Number[]} [params.position=[0,0,0]] Position of the {@link XKTMesh}. Overridden by the ````matrix```` parameter.\n * @param {Number[]} [params.scale=[1,1,1]] Scale of the {@link XKTMesh}. Overridden by the ````matrix```` parameter.\n * @param {Number[]} [params.rotation=[0,0,0]] Rotation of the {@link XKTMesh} as Euler angles given in degrees, for each of the X, Y and Z axis. Overridden by the ````matrix```` parameter.\n * @returns {XKTMesh} The new {@link XKTMesh}.\n */\n createMesh(params) {\n\n if (params.meshId === null || params.meshId === undefined) {\n throw \"Parameter expected: params.meshId\";\n }\n\n if (params.geometryId === null || params.geometryId === undefined) {\n throw \"Parameter expected: params.geometryId\";\n }\n\n if (this.finalized) {\n throw \"XKTModel has been finalized, can't add more meshes\";\n }\n\n if (this.meshes[params.meshId]) {\n console.error(\"XKTMesh already exists with this ID: \" + params.meshId);\n return;\n }\n\n const geometry = this.geometries[params.geometryId];\n\n if (!geometry) {\n console.error(\"XKTGeometry not found: \" + params.geometryId);\n return;\n }\n\n geometry.numInstances++;\n\n let textureSet = null;\n if (params.textureSetId) {\n textureSet = this.textureSets[params.textureSetId];\n if (!textureSet) {\n console.error(\"XKTTextureSet not found: \" + params.textureSetId);\n return;\n }\n textureSet.numInstances++;\n }\n\n let matrix = params.matrix;\n\n if (!matrix) {\n\n const position = params.position;\n const scale = params.scale;\n const rotation = params.rotation;\n\n if (position || scale || rotation) {\n matrix = math.identityMat4();\n const quaternion = math.eulerToQuaternion(rotation || [0, 0, 0], \"XYZ\", math.identityQuaternion());\n math.composeMat4(position || [0, 0, 0], quaternion, scale || [1, 1, 1], matrix)\n\n } else {\n matrix = math.identityMat4();\n }\n }\n\n const meshIndex = this.meshesList.length;\n\n const mesh = new XKTMesh({\n meshId: params.meshId,\n meshIndex,\n matrix,\n geometry,\n color: params.color,\n metallic: params.metallic,\n roughness: params.roughness,\n opacity: params.opacity,\n textureSet\n });\n\n this.meshes[mesh.meshId] = mesh;\n this.meshesList.push(mesh);\n\n return mesh;\n }\n\n /**\n * Creates an {@link XKTEntity} within this XKTModel.\n *\n * Registers the new {@link XKTEntity} in {@link XKTModel#entities} and {@link XKTModel#entitiesList}.\n *\n * Logs error and does nothing if this XKTModel has been finalized (see {@link XKTModel#finalized}).\n *\n * @param {*} params Method parameters.\n * @param {String} params.entityId Unique ID for the {@link XKTEntity}.\n * @param {String[]} params.meshIds IDs of {@link XKTMesh}es used by the {@link XKTEntity}. Note that each {@link XKTMesh} can only be used by one {@link XKTEntity}.\n * @returns {XKTEntity} The new {@link XKTEntity}.\n */\n createEntity(params) {\n\n if (!params) {\n throw \"Parameters expected: params\";\n }\n\n if (params.entityId === null || params.entityId === undefined) {\n throw \"Parameter expected: params.entityId\";\n }\n\n if (!params.meshIds) {\n throw \"Parameter expected: params.meshIds\";\n }\n\n if (this.finalized) {\n console.error(\"XKTModel has been finalized, can't add more entities\");\n return;\n }\n\n if (params.meshIds.length === 0) {\n console.warn(\"XKTEntity has no meshes - won't create: \" + params.entityId);\n return;\n }\n\n let entityId = params.entityId;\n\n if (this.entities[entityId]) {\n while (this.entities[entityId]) {\n entityId = math.createUUID();\n }\n console.error(\"XKTEntity already exists with this ID: \" + params.entityId + \" - substituting random ID instead: \" + entityId);\n }\n\n const meshIds = params.meshIds;\n const meshes = [];\n\n for (let meshIdIdx = 0, meshIdLen = meshIds.length; meshIdIdx < meshIdLen; meshIdIdx++) {\n\n const meshId = meshIds[meshIdIdx];\n const mesh = this.meshes[meshId];\n\n if (!mesh) {\n console.error(\"XKTMesh found: \" + meshId);\n continue;\n }\n\n if (mesh.entity) {\n console.error(\"XKTMesh \" + meshId + \" already used by XKTEntity \" + mesh.entity.entityId);\n continue;\n }\n\n meshes.push(mesh);\n }\n\n const entity = new XKTEntity(entityId, meshes);\n\n for (let i = 0, len = meshes.length; i < len; i++) {\n const mesh = meshes[i];\n mesh.entity = entity;\n }\n\n this.entities[entityId] = entity;\n this.entitiesList.push(entity);\n\n return entity;\n }\n\n /**\n * Creates a default {@link XKTMetaObject} for each {@link XKTEntity} that does not already have one.\n */\n createDefaultMetaObjects() {\n\n for (let i = 0, len = this.entitiesList.length; i < len; i++) {\n\n const entity = this.entitiesList[i];\n const metaObjectId = entity.entityId;\n const metaObject = this.metaObjects[metaObjectId];\n\n if (!metaObject) {\n\n if (!this._rootMetaObject) {\n this._rootMetaObject = this.createMetaObject({\n metaObjectId: this.modelId,\n metaObjectType: \"Default\",\n metaObjectName: this.modelId\n });\n }\n\n this.createMetaObject({\n metaObjectId: metaObjectId,\n metaObjectType: \"Default\",\n metaObjectName: \"\" + metaObjectId,\n parentMetaObjectId: this._rootMetaObject.metaObjectId\n });\n }\n }\n }\n\n /**\n * Finalizes this XKTModel.\n *\n * After finalizing, we may then serialize the model to an array buffer using {@link writeXKTModelToArrayBuffer}.\n *\n * Logs error and does nothing if this XKTModel has already been finalized.\n *\n * Internally, this method:\n *\n * * for each {@link XKTEntity} that doesn't already have a {@link XKTMetaObject}, creates one with {@link XKTMetaObject#metaObjectType} set to \"default\"\n * * sets each {@link XKTEntity}'s {@link XKTEntity#hasReusedGeometries} true if it shares its {@link XKTGeometry}s with other {@link XKTEntity}s,\n * * creates each {@link XKTEntity}'s {@link XKTEntity#aabb},\n * * creates {@link XKTTile}s in {@link XKTModel#tilesList}, and\n * * sets {@link XKTModel#finalized} ````true````.\n */\n async finalize() {\n\n if (this.finalized) {\n console.log(\"XKTModel already finalized\");\n return;\n }\n\n this._removeUnusedTextures();\n\n await this._compressTextures();\n\n this._bakeSingleUseGeometryPositions();\n\n this._bakeAndOctEncodeNormals();\n\n this._createEntityAABBs();\n\n const rootKDNode = this._createKDTree();\n\n this.entitiesList = [];\n\n this._createTilesFromKDTree(rootKDNode);\n\n this._createReusedGeometriesDecodeMatrix();\n\n this._flagSolidGeometries();\n\n this.aabb.set(rootKDNode.aabb);\n\n this.finalized = true;\n }\n\n _removeUnusedTextures() {\n let texturesList = [];\n const textures = {};\n for (let i = 0, leni = this.texturesList.length; i < leni; i++) {\n const texture = this.texturesList[i];\n if (texture.channel !== null) {\n texture.textureIndex = texturesList.length;\n texturesList.push(texture);\n textures[texture.textureId] = texture;\n }\n }\n this.texturesList = texturesList;\n this.textures = textures;\n }\n\n _compressTextures() {\n let countTextures = this.texturesList.length;\n return new Promise((resolve) => {\n if (countTextures === 0) {\n resolve();\n return;\n }\n for (let i = 0, leni = this.texturesList.length; i < leni; i++) {\n const texture = this.texturesList[i];\n const encodingOptions = TEXTURE_ENCODING_OPTIONS[texture.channel] || {};\n\n if (texture.src) {\n\n // XKTTexture created with XKTModel#createTexture({ src: ... })\n\n const src = texture.src;\n const fileExt = src.split('.').pop();\n switch (fileExt) {\n case \"jpeg\":\n case \"jpg\":\n case \"png\":\n load(src, ImageLoader, {\n image: {\n type: \"data\"\n }\n }).then((imageData) => {\n if (texture.compressed) {\n encode(imageData, KTX2BasisWriter, encodingOptions).then((encodedData) => {\n const encodedImageData = new Uint8Array(encodedData);\n texture.imageData = encodedImageData;\n if (--countTextures <= 0) {\n resolve();\n }\n }).catch((err) => {\n console.error(\"[XKTModel.finalize] Failed to encode image: \" + err);\n if (--countTextures <= 0) {\n resolve();\n }\n });\n } else {\n texture.imageData = new Uint8Array(1);\n if (--countTextures <= 0) {\n resolve();\n }\n }\n }).catch((err) => {\n console.error(\"[XKTModel.finalize] Failed to load image: \" + err);\n if (--countTextures <= 0) {\n resolve();\n }\n });\n break;\n default:\n if (--countTextures <= 0) {\n resolve();\n }\n break;\n }\n }\n\n if (texture.imageData) {\n\n // XKTTexture created with XKTModel#createTexture({ imageData: ... })\n\n if (texture.compressed) {\n encode(texture.imageData, KTX2BasisWriter, encodingOptions)\n .then((encodedImageData) => {\n texture.imageData = new Uint8Array(encodedImageData);\n if (--countTextures <= 0) {\n resolve();\n }\n }).catch((err) => {\n console.error(\"[XKTModel.finalize] Failed to encode image: \" + err);\n if (--countTextures <= 0) {\n resolve();\n }\n });\n } else {\n texture.imageData = new Uint8Array(1);\n if (--countTextures <= 0) {\n resolve();\n }\n }\n }\n }\n });\n }\n\n _bakeSingleUseGeometryPositions() {\n\n for (let j = 0, lenj = this.meshesList.length; j < lenj; j++) {\n\n const mesh = this.meshesList[j];\n\n const geometry = mesh.geometry;\n\n if (geometry.numInstances === 1) {\n\n const matrix = mesh.matrix;\n\n if (matrix && (!math.isIdentityMat4(matrix))) {\n\n const positions = geometry.positions;\n\n for (let i = 0, len = positions.length; i < len; i += 3) {\n\n tempVec4a[0] = positions[i + 0];\n tempVec4a[1] = positions[i + 1];\n tempVec4a[2] = positions[i + 2];\n tempVec4a[3] = 1;\n\n math.transformPoint4(matrix, tempVec4a, tempVec4b);\n\n positions[i + 0] = tempVec4b[0];\n positions[i + 1] = tempVec4b[1];\n positions[i + 2] = tempVec4b[2];\n }\n }\n }\n }\n }\n\n _bakeAndOctEncodeNormals() {\n\n for (let i = 0, len = this.meshesList.length; i < len; i++) {\n\n const mesh = this.meshesList[i];\n const geometry = mesh.geometry;\n\n if (geometry.normals && !geometry.normalsOctEncoded) {\n\n geometry.normalsOctEncoded = new Int8Array(geometry.normals.length);\n\n if (geometry.numInstances > 1) {\n geometryCompression.octEncodeNormals(geometry.normals, geometry.normals.length, geometry.normalsOctEncoded, 0);\n\n } else {\n const modelNormalMatrix = math.inverseMat4(math.transposeMat4(mesh.matrix, tempMat4), tempMat4b);\n geometryCompression.transformAndOctEncodeNormals(modelNormalMatrix, geometry.normals, geometry.normals.length, geometry.normalsOctEncoded, 0);\n }\n }\n }\n }\n\n _createEntityAABBs() {\n\n for (let i = 0, len = this.entitiesList.length; i < len; i++) {\n\n const entity = this.entitiesList[i];\n const entityAABB = entity.aabb;\n const meshes = entity.meshes;\n\n math.collapseAABB3(entityAABB);\n\n for (let j = 0, lenj = meshes.length; j < lenj; j++) {\n\n const mesh = meshes[j];\n const geometry = mesh.geometry;\n const matrix = mesh.matrix;\n\n if (geometry.numInstances > 1) {\n\n const positions = geometry.positions;\n for (let i = 0, len = positions.length; i < len; i += 3) {\n tempVec4a[0] = positions[i + 0];\n tempVec4a[1] = positions[i + 1];\n tempVec4a[2] = positions[i + 2];\n tempVec4a[3] = 1;\n math.transformPoint4(matrix, tempVec4a, tempVec4b);\n math.expandAABB3Point3(entityAABB, tempVec4b);\n }\n\n } else {\n\n const positions = geometry.positions;\n for (let i = 0, len = positions.length; i < len; i += 3) {\n tempVec4a[0] = positions[i + 0];\n tempVec4a[1] = positions[i + 1];\n tempVec4a[2] = positions[i + 2];\n math.expandAABB3Point3(entityAABB, tempVec4a);\n }\n }\n }\n }\n }\n\n _createKDTree() {\n\n let aabb;\n if (this.modelAABB) {\n aabb = this.modelAABB; // Pre-known uber AABB\n } else {\n aabb = math.collapseAABB3();\n for (let i = 0, len = this.entitiesList.length; i < len; i++) {\n const entity = this.entitiesList[i];\n math.expandAABB3(aabb, entity.aabb);\n }\n }\n\n const rootKDNode = new KDNode(aabb);\n\n for (let i = 0, len = this.entitiesList.length; i < len; i++) {\n const entity = this.entitiesList[i];\n this._insertEntityIntoKDTree(rootKDNode, entity);\n }\n\n return rootKDNode;\n }\n\n _insertEntityIntoKDTree(kdNode, entity) {\n\n const nodeAABB = kdNode.aabb;\n const entityAABB = entity.aabb;\n\n const nodeAABBDiag = math.getAABB3Diag(nodeAABB);\n\n if (nodeAABBDiag < this.minTileSize) {\n kdNode.entities = kdNode.entities || [];\n kdNode.entities.push(entity);\n math.expandAABB3(nodeAABB, entityAABB);\n return;\n }\n\n if (kdNode.left) {\n if (math.containsAABB3(kdNode.left.aabb, entityAABB)) {\n this._insertEntityIntoKDTree(kdNode.left, entity);\n return;\n }\n }\n\n if (kdNode.right) {\n if (math.containsAABB3(kdNode.right.aabb, entityAABB)) {\n this._insertEntityIntoKDTree(kdNode.right, entity);\n return;\n }\n }\n\n kdTreeDimLength[0] = nodeAABB[3] - nodeAABB[0];\n kdTreeDimLength[1] = nodeAABB[4] - nodeAABB[1];\n kdTreeDimLength[2] = nodeAABB[5] - nodeAABB[2];\n\n let dim = 0;\n\n if (kdTreeDimLength[1] > kdTreeDimLength[dim]) {\n dim = 1;\n }\n\n if (kdTreeDimLength[2] > kdTreeDimLength[dim]) {\n dim = 2;\n }\n\n if (!kdNode.left) {\n const aabbLeft = nodeAABB.slice();\n aabbLeft[dim + 3] = ((nodeAABB[dim] + nodeAABB[dim + 3]) / 2.0);\n kdNode.left = new KDNode(aabbLeft);\n if (math.containsAABB3(aabbLeft, entityAABB)) {\n this._insertEntityIntoKDTree(kdNode.left, entity);\n return;\n }\n }\n\n if (!kdNode.right) {\n const aabbRight = nodeAABB.slice();\n aabbRight[dim] = ((nodeAABB[dim] + nodeAABB[dim + 3]) / 2.0);\n kdNode.right = new KDNode(aabbRight);\n if (math.containsAABB3(aabbRight, entityAABB)) {\n this._insertEntityIntoKDTree(kdNode.right, entity);\n return;\n }\n }\n\n kdNode.entities = kdNode.entities || [];\n kdNode.entities.push(entity);\n\n math.expandAABB3(nodeAABB, entityAABB);\n }\n\n _createTilesFromKDTree(rootKDNode) {\n this._createTilesFromKDNode(rootKDNode);\n }\n\n _createTilesFromKDNode(kdNode) {\n if (kdNode.entities && kdNode.entities.length > 0) {\n this._createTileFromEntities(kdNode);\n }\n if (kdNode.left) {\n this._createTilesFromKDNode(kdNode.left);\n }\n if (kdNode.right) {\n this._createTilesFromKDNode(kdNode.right);\n }\n }\n\n /**\n * Creates a tile from the given entities.\n *\n * For each single-use {@link XKTGeometry}, this method centers {@link XKTGeometry#positions} to make them relative to the\n * tile's center, then quantizes the positions to unsigned 16-bit integers, relative to the tile's boundary.\n *\n * @param kdNode\n */\n _createTileFromEntities(kdNode) {\n\n const tileAABB = kdNode.aabb;\n const entities = kdNode.entities;\n\n const tileCenter = math.getAABB3Center(tileAABB);\n const tileCenterNeg = math.mulVec3Scalar(tileCenter, -1, math.vec3());\n\n const rtcAABB = math.AABB3(); // AABB centered at the RTC origin\n\n rtcAABB[0] = tileAABB[0] - tileCenter[0];\n rtcAABB[1] = tileAABB[1] - tileCenter[1];\n rtcAABB[2] = tileAABB[2] - tileCenter[2];\n rtcAABB[3] = tileAABB[3] - tileCenter[0];\n rtcAABB[4] = tileAABB[4] - tileCenter[1];\n rtcAABB[5] = tileAABB[5] - tileCenter[2];\n\n for (let i = 0; i < entities.length; i++) {\n\n const entity = entities [i];\n\n const meshes = entity.meshes;\n\n for (let j = 0, lenj = meshes.length; j < lenj; j++) {\n\n const mesh = meshes[j];\n const geometry = mesh.geometry;\n\n if (!geometry.reused) { // Batched geometry\n\n const positions = geometry.positions;\n\n // Center positions relative to their tile's World-space center\n\n for (let k = 0, lenk = positions.length; k < lenk; k += 3) {\n\n positions[k + 0] -= tileCenter[0];\n positions[k + 1] -= tileCenter[1];\n positions[k + 2] -= tileCenter[2];\n }\n\n // Quantize positions relative to tile's RTC-space boundary\n\n geometryCompression.quantizePositions(positions, positions.length, rtcAABB, geometry.positionsQuantized);\n\n } else { // Instanced geometry\n\n // Post-multiply a translation to the mesh's modeling matrix\n // to center the entity's geometry instances to the tile RTC center\n\n //////////////////////////////\n // Why do we do this?\n // Seems to break various models\n /////////////////////////////////\n\n math.translateMat4v(tileCenterNeg, mesh.matrix);\n }\n }\n\n entity.entityIndex = this.entitiesList.length;\n\n this.entitiesList.push(entity);\n }\n\n const tile = new XKTTile(tileAABB, entities);\n\n this.tilesList.push(tile);\n }\n\n _createReusedGeometriesDecodeMatrix() {\n\n const tempVec3a = math.vec3();\n const reusedGeometriesAABB = math.collapseAABB3(math.AABB3());\n let countReusedGeometries = 0;\n\n for (let geometryIndex = 0, numGeometries = this.geometriesList.length; geometryIndex < numGeometries; geometryIndex++) {\n\n const geometry = this.geometriesList [geometryIndex];\n\n if (geometry.reused) { // Instanced geometry\n\n const positions = geometry.positions;\n\n for (let i = 0, len = positions.length; i < len; i += 3) {\n\n tempVec3a[0] = positions[i];\n tempVec3a[1] = positions[i + 1];\n tempVec3a[2] = positions[i + 2];\n\n math.expandAABB3Point3(reusedGeometriesAABB, tempVec3a);\n }\n\n countReusedGeometries++;\n }\n }\n\n if (countReusedGeometries > 0) {\n\n geometryCompression.createPositionsDecodeMatrix(reusedGeometriesAABB, this.reusedGeometriesDecodeMatrix);\n\n for (let geometryIndex = 0, numGeometries = this.geometriesList.length; geometryIndex < numGeometries; geometryIndex++) {\n\n const geometry = this.geometriesList [geometryIndex];\n\n if (geometry.reused) {\n geometryCompression.quantizePositions(geometry.positions, geometry.positions.length, reusedGeometriesAABB, geometry.positionsQuantized);\n }\n }\n\n } else {\n math.identityMat4(this.reusedGeometriesDecodeMatrix); // No need for this matrix, but we'll be tidy and set it to identity\n }\n }\n\n _flagSolidGeometries() {\n let maxNumPositions = 0;\n let maxNumIndices = 0;\n for (let i = 0, len = this.geometriesList.length; i < len; i++) {\n const geometry = this.geometriesList[i];\n if (geometry.primitiveType === \"triangles\") {\n if (geometry.positionsQuantized.length > maxNumPositions) {\n maxNumPositions = geometry.positionsQuantized.length;\n }\n if (geometry.indices.length > maxNumIndices) {\n maxNumIndices = geometry.indices.length;\n }\n }\n }\n let vertexIndexMapping = new Array(maxNumPositions / 3);\n let edges = new Array(maxNumIndices);\n for (let i = 0, len = this.geometriesList.length; i < len; i++) {\n const geometry = this.geometriesList[i];\n if (geometry.primitiveType === \"triangles\") {\n geometry.solid = isTriangleMeshSolid(geometry.indices, geometry.positionsQuantized, vertexIndexMapping, edges);\n }\n }\n }\n}\n\nexport {\n XKTModel\n}","/**\n * Given geometry defined as an array of positions, optional normals, option uv and an array of indices, returns\n * modified arrays that have duplicate vertices removed.\n *\n * @private\n */\nfunction mergeVertices(positions, indices, mergedPositions, mergedIndices) {\n const positionsMap = {};\n const indicesLookup = [];\n const precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001\n const precision = 10 ** precisionPoints;\n let uvi = 0;\n for (let i = 0, len = positions.length; i < len; i += 3) {\n const vx = positions[i];\n const vy = positions[i + 1];\n const vz = positions[i + 2];\n const key = `${Math.round(vx * precision)}_${Math.round(vy * precision)}_${Math.round(vz * precision)}`;\n if (positionsMap[key] === undefined) {\n positionsMap[key] = mergedPositions.length / 3;\n mergedPositions.push(vx);\n mergedPositions.push(vy);\n mergedPositions.push(vz);\n }\n indicesLookup[i / 3] = positionsMap[key];\n uvi += 2;\n }\n for (let i = 0, len = indices.length; i < len; i++) {\n mergedIndices[i] = indicesLookup[indices[i]];\n }\n}\n\nexport {mergeVertices};","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"pako\");","import {XKT_INFO} from \"../XKT_INFO.js\";\nimport * as pako from 'pako';\n\nconst XKT_VERSION = XKT_INFO.xktVersion;\nconst NUM_TEXTURE_ATTRIBUTES = 9;\nconst NUM_MATERIAL_ATTRIBUTES = 6;\n\n/**\n * Writes an {@link XKTModel} to an {@link ArrayBuffer}.\n *\n * @param {XKTModel} xktModel The {@link XKTModel}.\n * @param {String} metaModelJSON The metamodel JSON in a string.\n * @param {Object} [stats] Collects statistics.\n * @param {Object} options Options for how the XKT is written.\n * @param {Boolean} [options.zip=true] ZIP the contents?\n * @returns {ArrayBuffer} The {@link ArrayBuffer}.\n */\nfunction writeXKTModelToArrayBuffer(xktModel, metaModelJSON, stats, options) {\n const data = getModelData(xktModel, metaModelJSON, stats);\n const deflatedData = deflateData(data, metaModelJSON, options);\n stats.texturesSize += deflatedData.textureData.byteLength;\n const arrayBuffer = createArrayBuffer(deflatedData);\n return arrayBuffer;\n}\n\nfunction getModelData(xktModel, metaModelDataStr, stats) {\n\n //------------------------------------------------------------------------------------------------------------------\n // Allocate data\n //------------------------------------------------------------------------------------------------------------------\n\n const propertySetsList = xktModel.propertySetsList;\n const metaObjectsList = xktModel.metaObjectsList;\n const geometriesList = xktModel.geometriesList;\n const texturesList = xktModel.texturesList;\n const textureSetsList = xktModel.textureSetsList;\n const meshesList = xktModel.meshesList;\n const entitiesList = xktModel.entitiesList;\n const tilesList = xktModel.tilesList;\n\n const numPropertySets = propertySetsList.length;\n const numMetaObjects = metaObjectsList.length;\n const numGeometries = geometriesList.length;\n const numTextures = texturesList.length;\n const numTextureSets = textureSetsList.length;\n const numMeshes = meshesList.length;\n const numEntities = entitiesList.length;\n const numTiles = tilesList.length;\n\n let lenPositions = 0;\n let lenNormals = 0;\n let lenColors = 0;\n let lenUVs = 0;\n let lenIndices = 0;\n let lenEdgeIndices = 0;\n let lenMatrices = 0;\n let lenTextures = 0;\n\n for (let geometryIndex = 0; geometryIndex < numGeometries; geometryIndex++) {\n const geometry = geometriesList [geometryIndex];\n if (geometry.positionsQuantized) {\n lenPositions += geometry.positionsQuantized.length;\n }\n if (geometry.normalsOctEncoded) {\n lenNormals += geometry.normalsOctEncoded.length;\n }\n if (geometry.colorsCompressed) {\n lenColors += geometry.colorsCompressed.length;\n }\n if (geometry.uvs) {\n lenUVs += geometry.uvs.length;\n }\n if (geometry.indices) {\n lenIndices += geometry.indices.length;\n }\n if (geometry.edgeIndices) {\n lenEdgeIndices += geometry.edgeIndices.length;\n }\n }\n\n for (let textureIndex = 0; textureIndex < numTextures; textureIndex++) {\n const xktTexture = texturesList[textureIndex];\n const imageData = xktTexture.imageData;\n lenTextures += imageData.byteLength;\n\n if (xktTexture.compressed) {\n stats.numCompressedTextures++;\n }\n }\n\n for (let meshIndex = 0; meshIndex < numMeshes; meshIndex++) {\n const mesh = meshesList[meshIndex];\n if (mesh.geometry.numInstances > 1) {\n lenMatrices += 16;\n }\n }\n\n const data = {\n metadata: {},\n textureData: new Uint8Array(lenTextures), // All textures\n eachTextureDataPortion: new Uint32Array(numTextures), // For each texture, an index to its first element in textureData\n eachTextureAttributes: new Uint16Array(numTextures * NUM_TEXTURE_ATTRIBUTES),\n positions: new Uint16Array(lenPositions), // All geometry arrays\n normals: new Int8Array(lenNormals),\n colors: new Uint8Array(lenColors),\n uvs: new Float32Array(lenUVs),\n indices: new Uint32Array(lenIndices),\n edgeIndices: new Uint32Array(lenEdgeIndices),\n eachTextureSetTextures: new Int32Array(numTextureSets * 5), // For each texture set, a set of five Texture indices [color, metal/roughness,normals,emissive,occlusion]; each index has value -1 if no texture\n matrices: new Float32Array(lenMatrices), // Modeling matrices for entities that share geometries. Each entity either shares all it's geometries, or owns all its geometries exclusively. Exclusively-owned geometries are pre-transformed into World-space, and so their entities don't have modeling matrices in this array.\n reusedGeometriesDecodeMatrix: new Float32Array(xktModel.reusedGeometriesDecodeMatrix), // A single, global vertex position de-quantization matrix for all reused geometries. Reused geometries are quantized to their collective Local-space AABB, and this matrix is derived from that AABB.\n eachGeometryPrimitiveType: new Uint8Array(numGeometries), // Primitive type for each geometry (0=solid triangles, 1=surface triangles, 2=lines, 3=points, 4=line-strip)\n eachGeometryPositionsPortion: new Uint32Array(numGeometries), // For each geometry, an index to its first element in data.positions. Every primitive type has positions.\n eachGeometryNormalsPortion: new Uint32Array(numGeometries), // For each geometry, an index to its first element in data.normals. If the next geometry has the same index, then this geometry has no normals.\n eachGeometryColorsPortion: new Uint32Array(numGeometries), // For each geometry, an index to its first element in data.colors. If the next geometry has the same index, then this geometry has no colors.\n eachGeometryUVsPortion: new Uint32Array(numGeometries), // For each geometry, an index to its first element in data.uvs. If the next geometry has the same index, then this geometry has no UVs.\n eachGeometryIndicesPortion: new Uint32Array(numGeometries), // For each geometry, an index to its first element in data.indices. If the next geometry has the same index, then this geometry has no indices.\n eachGeometryEdgeIndicesPortion: new Uint32Array(numGeometries), // For each geometry, an index to its first element in data.edgeIndices. If the next geometry has the same index, then this geometry has no edge indices.\n eachMeshGeometriesPortion: new Uint32Array(numMeshes), // For each mesh, an index into the eachGeometry* arrays\n eachMeshMatricesPortion: new Uint32Array(numMeshes), // For each mesh that shares its geometry, an index to its first element in data.matrices, to indicate the modeling matrix that transforms the shared geometry Local-space vertex positions. This is ignored for meshes that don't share geometries, because the vertex positions of non-shared geometries are pre-transformed into World-space.\n eachMeshTextureSet: new Int32Array(numMeshes), // For each mesh, the index of its texture set in data.eachTextureSetTextures; this array contains signed integers so that we can use -1 to indicate when a mesh has no texture set\n eachMeshMaterialAttributes: new Uint8Array(numMeshes * NUM_MATERIAL_ATTRIBUTES), // For each mesh, an RGBA integer color of format [0..255, 0..255, 0..255, 0..255], and PBR metallic and roughness factors, of format [0..255, 0..255]\n eachEntityId: [], // For each entity, an ID string\n eachEntityMeshesPortion: new Uint32Array(numEntities), // For each entity, the index of the first element of meshes used by the entity\n eachTileAABB: new Float64Array(numTiles * 6), // For each tile, an axis-aligned bounding box\n eachTileEntitiesPortion: new Uint32Array(numTiles) // For each tile, the index of the first element of eachEntityId, eachEntityMeshesPortion and eachEntityMatricesPortion used by the tile\n };\n\n let countPositions = 0;\n let countNormals = 0;\n let countColors = 0;\n let countUVs = 0;\n let countIndices = 0;\n let countEdgeIndices = 0;\n\n // Metadata\n\n data.metadata = {\n id: xktModel.modelId,\n projectId: xktModel.projectId,\n revisionId: xktModel.revisionId,\n author: xktModel.author,\n createdAt: xktModel.createdAt,\n creatingApplication: xktModel.creatingApplication,\n schema: xktModel.schema,\n propertySets: [],\n metaObjects: []\n };\n\n // Property sets\n\n for (let propertySetsIndex = 0; propertySetsIndex < numPropertySets; propertySetsIndex++) {\n const propertySet = propertySetsList[propertySetsIndex];\n const propertySetJSON = {\n id: \"\" + propertySet.propertySetId,\n name: propertySet.propertySetName,\n type: propertySet.propertySetType,\n properties: propertySet.properties\n };\n data.metadata.propertySets.push(propertySetJSON);\n }\n\n // Metaobjects\n\n if (!metaModelDataStr) {\n for (let metaObjectsIndex = 0; metaObjectsIndex < numMetaObjects; metaObjectsIndex++) {\n const metaObject = metaObjectsList[metaObjectsIndex];\n const metaObjectJSON = {\n name: metaObject.metaObjectName,\n type: metaObject.metaObjectType,\n id: \"\" + metaObject.metaObjectId\n };\n if (metaObject.parentMetaObjectId !== undefined && metaObject.parentMetaObjectId !== null) {\n metaObjectJSON.parent = \"\" + metaObject.parentMetaObjectId;\n }\n if (metaObject.propertySetIds && metaObject.propertySetIds.length > 0) {\n metaObjectJSON.propertySetIds = metaObject.propertySetIds;\n }\n if (metaObject.external) {\n metaObjectJSON.external = metaObject.external;\n }\n data.metadata.metaObjects.push(metaObjectJSON);\n }\n }\n\n // Geometries\n\n for (let geometryIndex = 0; geometryIndex < numGeometries; geometryIndex++) {\n const geometry = geometriesList [geometryIndex];\n let primitiveType = 1;\n switch (geometry.primitiveType) {\n case \"triangles\":\n primitiveType = geometry.solid ? 0 : 1;\n break;\n case \"points\":\n primitiveType = 2;\n break;\n case \"lines\":\n primitiveType = 3;\n break;\n case \"line-strip\":\n primitiveType = 4;\n break;\n case \"triangle-strip\":\n primitiveType = 5;\n break;\n case \"triangle-fan\":\n primitiveType = 6;\n break;\n default:\n primitiveType = 1\n }\n data.eachGeometryPrimitiveType [geometryIndex] = primitiveType;\n data.eachGeometryPositionsPortion [geometryIndex] = countPositions;\n data.eachGeometryNormalsPortion [geometryIndex] = countNormals;\n data.eachGeometryColorsPortion [geometryIndex] = countColors;\n data.eachGeometryUVsPortion [geometryIndex] = countUVs;\n data.eachGeometryIndicesPortion [geometryIndex] = countIndices;\n data.eachGeometryEdgeIndicesPortion [geometryIndex] = countEdgeIndices;\n if (geometry.positionsQuantized) {\n data.positions.set(geometry.positionsQuantized, countPositions);\n countPositions += geometry.positionsQuantized.length;\n }\n if (geometry.normalsOctEncoded) {\n data.normals.set(geometry.normalsOctEncoded, countNormals);\n countNormals += geometry.normalsOctEncoded.length;\n }\n if (geometry.colorsCompressed) {\n data.colors.set(geometry.colorsCompressed, countColors);\n countColors += geometry.colorsCompressed.length;\n }\n if (geometry.uvs) {\n data.uvs.set(geometry.uvs, countUVs);\n countUVs += geometry.uvs.length;\n }\n if (geometry.indices) {\n data.indices.set(geometry.indices, countIndices);\n countIndices += geometry.indices.length;\n }\n if (geometry.edgeIndices) {\n data.edgeIndices.set(geometry.edgeIndices, countEdgeIndices);\n countEdgeIndices += geometry.edgeIndices.length;\n }\n }\n\n // Textures\n\n for (let textureIndex = 0, numTextures = xktModel.texturesList.length, portionIdx = 0; textureIndex < numTextures; textureIndex++) {\n const xktTexture = xktModel.texturesList[textureIndex];\n const imageData = xktTexture.imageData;\n data.textureData.set(imageData, portionIdx);\n data.eachTextureDataPortion[textureIndex] = portionIdx;\n\n portionIdx += imageData.byteLength;\n\n let textureAttrIdx = textureIndex * NUM_TEXTURE_ATTRIBUTES;\n data.eachTextureAttributes[textureAttrIdx++] = xktTexture.compressed ? 1 : 0;\n data.eachTextureAttributes[textureAttrIdx++] = xktTexture.mediaType; // GIFMediaType | PNGMediaType | JPEGMediaType\n data.eachTextureAttributes[textureAttrIdx++] = xktTexture.width;\n data.eachTextureAttributes[textureAttrIdx++] = xktTexture.height;\n data.eachTextureAttributes[textureAttrIdx++] = xktTexture.minFilter; // LinearMipmapLinearFilter | LinearMipMapNearestFilter | NearestMipMapNearestFilter | NearestMipMapLinearFilter | LinearMipMapLinearFilter\n data.eachTextureAttributes[textureAttrIdx++] = xktTexture.magFilter; // LinearFilter | NearestFilter\n data.eachTextureAttributes[textureAttrIdx++] = xktTexture.wrapS; // ClampToEdgeWrapping | MirroredRepeatWrapping | RepeatWrapping\n data.eachTextureAttributes[textureAttrIdx++] = xktTexture.wrapT; // ClampToEdgeWrapping | MirroredRepeatWrapping | RepeatWrapping\n data.eachTextureAttributes[textureAttrIdx++] = xktTexture.wrapR; // ClampToEdgeWrapping | MirroredRepeatWrapping | RepeatWrapping\n }\n\n // Texture sets\n\n for (let textureSetIndex = 0, numTextureSets = xktModel.textureSetsList.length, eachTextureSetTexturesIndex = 0; textureSetIndex < numTextureSets; textureSetIndex++) {\n const textureSet = textureSetsList[textureSetIndex];\n data.eachTextureSetTextures[eachTextureSetTexturesIndex++] = textureSet.colorTexture ? textureSet.colorTexture.textureIndex : -1; // Color map\n data.eachTextureSetTextures[eachTextureSetTexturesIndex++] = textureSet.metallicRoughnessTexture ? textureSet.metallicRoughnessTexture.textureIndex : -1; // Metal/rough map\n data.eachTextureSetTextures[eachTextureSetTexturesIndex++] = textureSet.normalsTexture ? textureSet.normalsTexture.textureIndex : -1; // Normal map\n data.eachTextureSetTextures[eachTextureSetTexturesIndex++] = textureSet.emissiveTexture ? textureSet.emissiveTexture.textureIndex : -1; // Emissive map\n data.eachTextureSetTextures[eachTextureSetTexturesIndex++] = textureSet.occlusionTexture ? textureSet.occlusionTexture.textureIndex : -1; // Occlusion map\n }\n\n // Tiles -> Entities -> Meshes\n\n let entityIndex = 0;\n let countEntityMeshesPortion = 0;\n let eachMeshMaterialAttributesIndex = 0;\n let matricesIndex = 0;\n let meshIndex = 0;\n\n for (let tileIndex = 0; tileIndex < numTiles; tileIndex++) {\n\n const tile = tilesList [tileIndex];\n const tileEntities = tile.entities;\n const numTileEntities = tileEntities.length;\n\n if (numTileEntities === 0) {\n continue;\n }\n\n data.eachTileEntitiesPortion[tileIndex] = entityIndex;\n\n const tileAABB = tile.aabb;\n\n for (let j = 0; j < numTileEntities; j++) {\n\n const entity = tileEntities[j];\n const entityMeshes = entity.meshes;\n const numEntityMeshes = entityMeshes.length;\n\n for (let k = 0; k < numEntityMeshes; k++) {\n\n const mesh = entityMeshes[k];\n const geometry = mesh.geometry;\n const geometryIndex = geometry.geometryIndex;\n\n data.eachMeshGeometriesPortion [countEntityMeshesPortion + k] = geometryIndex;\n\n if (mesh.geometry.numInstances > 1) {\n data.matrices.set(mesh.matrix, matricesIndex);\n data.eachMeshMatricesPortion [meshIndex] = matricesIndex;\n matricesIndex += 16;\n }\n\n data.eachMeshTextureSet[meshIndex] = mesh.textureSet ? mesh.textureSet.textureSetIndex : -1;\n\n data.eachMeshMaterialAttributes[eachMeshMaterialAttributesIndex++] = (mesh.color[0] * 255); // Color RGB\n data.eachMeshMaterialAttributes[eachMeshMaterialAttributesIndex++] = (mesh.color[1] * 255);\n data.eachMeshMaterialAttributes[eachMeshMaterialAttributesIndex++] = (mesh.color[2] * 255);\n data.eachMeshMaterialAttributes[eachMeshMaterialAttributesIndex++] = (mesh.opacity * 255); // Opacity\n data.eachMeshMaterialAttributes[eachMeshMaterialAttributesIndex++] = (mesh.metallic * 255); // Metallic\n data.eachMeshMaterialAttributes[eachMeshMaterialAttributesIndex++] = (mesh.roughness * 255); // Roughness\n\n meshIndex++;\n }\n\n data.eachEntityId [entityIndex] = entity.entityId;\n data.eachEntityMeshesPortion[entityIndex] = countEntityMeshesPortion; // <<<<<<<<<<<<<<<<<<<< Error here? Order/value of countEntityMeshesPortion correct?\n\n entityIndex++;\n countEntityMeshesPortion += numEntityMeshes;\n }\n\n const tileAABBIndex = tileIndex * 6;\n\n data.eachTileAABB.set(tileAABB, tileAABBIndex);\n }\n\n return data;\n}\n\nfunction deflateData(data, metaModelJSON, options) {\n\n function deflate(buffer) {\n return (options.zip !== false) ? pako.deflate(buffer) : buffer;\n }\n\n let metaModelBytes;\n if (metaModelJSON) {\n const deflatedJSON = deflateJSON(metaModelJSON);\n metaModelBytes = deflate(deflatedJSON)\n } else {\n const deflatedJSON = deflateJSON(data.metadata);\n metaModelBytes = deflate(deflatedJSON)\n }\n\n return {\n metadata: metaModelBytes,\n textureData: deflate(data.textureData.buffer),\n eachTextureDataPortion: deflate(data.eachTextureDataPortion.buffer),\n eachTextureAttributes: deflate(data.eachTextureAttributes.buffer),\n positions: deflate(data.positions.buffer),\n normals: deflate(data.normals.buffer),\n colors: deflate(data.colors.buffer),\n uvs: deflate(data.uvs.buffer),\n indices: deflate(data.indices.buffer),\n edgeIndices: deflate(data.edgeIndices.buffer),\n eachTextureSetTextures: deflate(data.eachTextureSetTextures.buffer),\n matrices: deflate(data.matrices.buffer),\n reusedGeometriesDecodeMatrix: deflate(data.reusedGeometriesDecodeMatrix.buffer),\n eachGeometryPrimitiveType: deflate(data.eachGeometryPrimitiveType.buffer),\n eachGeometryPositionsPortion: deflate(data.eachGeometryPositionsPortion.buffer),\n eachGeometryNormalsPortion: deflate(data.eachGeometryNormalsPortion.buffer),\n eachGeometryColorsPortion: deflate(data.eachGeometryColorsPortion.buffer),\n eachGeometryUVsPortion: deflate(data.eachGeometryUVsPortion.buffer),\n eachGeometryIndicesPortion: deflate(data.eachGeometryIndicesPortion.buffer),\n eachGeometryEdgeIndicesPortion: deflate(data.eachGeometryEdgeIndicesPortion.buffer),\n eachMeshGeometriesPortion: deflate(data.eachMeshGeometriesPortion.buffer),\n eachMeshMatricesPortion: deflate(data.eachMeshMatricesPortion.buffer),\n eachMeshTextureSet: deflate(data.eachMeshTextureSet.buffer),\n eachMeshMaterialAttributes: deflate(data.eachMeshMaterialAttributes.buffer),\n eachEntityId: deflate(JSON.stringify(data.eachEntityId)\n .replace(/[\\u007F-\\uFFFF]/g, function (chr) { // Produce only ASCII-chars, so that the data can be inflated later\n return \"\\\\u\" + (\"0000\" + chr.charCodeAt(0).toString(16)).substr(-4)\n })),\n eachEntityMeshesPortion: deflate(data.eachEntityMeshesPortion.buffer),\n eachTileAABB: deflate(data.eachTileAABB.buffer),\n eachTileEntitiesPortion: deflate(data.eachTileEntitiesPortion.buffer)\n };\n}\n\nfunction deflateJSON(strings) {\n return JSON.stringify(strings)\n .replace(/[\\u007F-\\uFFFF]/g, function (chr) { // Produce only ASCII-chars, so that the data can be inflated later\n return \"\\\\u\" + (\"0000\" + chr.charCodeAt(0).toString(16)).substr(-4)\n });\n}\n\nfunction createArrayBuffer(deflatedData) {\n return toArrayBuffer([\n deflatedData.metadata,\n deflatedData.textureData,\n deflatedData.eachTextureDataPortion,\n deflatedData.eachTextureAttributes,\n deflatedData.positions,\n deflatedData.normals,\n deflatedData.colors,\n deflatedData.uvs,\n deflatedData.indices,\n deflatedData.edgeIndices,\n deflatedData.eachTextureSetTextures,\n deflatedData.matrices,\n deflatedData.reusedGeometriesDecodeMatrix,\n deflatedData.eachGeometryPrimitiveType,\n deflatedData.eachGeometryPositionsPortion,\n deflatedData.eachGeometryNormalsPortion,\n deflatedData.eachGeometryColorsPortion,\n deflatedData.eachGeometryUVsPortion,\n deflatedData.eachGeometryIndicesPortion,\n deflatedData.eachGeometryEdgeIndicesPortion,\n deflatedData.eachMeshGeometriesPortion,\n deflatedData.eachMeshMatricesPortion,\n deflatedData.eachMeshTextureSet,\n deflatedData.eachMeshMaterialAttributes,\n deflatedData.eachEntityId,\n deflatedData.eachEntityMeshesPortion,\n deflatedData.eachTileAABB,\n deflatedData.eachTileEntitiesPortion\n ]);\n}\n\nfunction toArrayBuffer(elements) {\n const indexData = new Uint32Array(elements.length + 2);\n indexData[0] = XKT_VERSION;\n indexData [1] = elements.length; // Stored Data 1.1: number of stored elements\n let dataLen = 0; // Stored Data 1.2: length of stored elements\n for (let i = 0, len = elements.length; i < len; i++) {\n const element = elements[i];\n const elementsize = element.length;\n indexData[i + 2] = elementsize;\n dataLen += elementsize;\n }\n const indexBuf = new Uint8Array(indexData.buffer);\n const dataArray = new Uint8Array(indexBuf.length + dataLen);\n dataArray.set(indexBuf);\n let offset = indexBuf.length;\n for (let i = 0, len = elements.length; i < len; i++) { // Stored Data 2: the elements themselves\n const element = elements[i];\n dataArray.set(element, offset);\n offset += element.length;\n }\n return dataArray.buffer;\n}\n\nexport {writeXKTModelToArrayBuffer};","/** @private */\nfunction earcut(data, holeIndices, dim) {\n\n dim = dim || 2;\n\n var hasHoles = holeIndices && holeIndices.length,\n outerLen = hasHoles ? holeIndices[0] * dim : data.length,\n outerNode = linkedList(data, 0, outerLen, dim, true),\n triangles = [];\n\n if (!outerNode || outerNode.next === outerNode.prev) return triangles;\n\n var minX, minY, maxX, maxY, x, y, invSize;\n\n if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);\n\n // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n if (data.length > 80 * dim) {\n minX = maxX = data[0];\n minY = maxY = data[1];\n\n for (var i = dim; i < outerLen; i += dim) {\n x = data[i];\n y = data[i + 1];\n if (x < minX) minX = x;\n if (y < minY) minY = y;\n if (x > maxX) maxX = x;\n if (y > maxY) maxY = y;\n }\n\n // minX, minY and invSize are later used to transform coords into integers for z-order calculation\n invSize = Math.max(maxX - minX, maxY - minY);\n invSize = invSize !== 0 ? 1 / invSize : 0;\n }\n\n earcutLinked(outerNode, triangles, dim, minX, minY, invSize);\n\n return triangles;\n}\n\n// create a circular doubly linked list from polygon points in the specified winding order\nfunction linkedList(data, start, end, dim, clockwise) {\n var i, last;\n\n if (clockwise === (signedArea(data, start, end, dim) > 0)) {\n for (i = start; i < end; i += dim) last = insertNode(i, data[i], data[i + 1], last);\n } else {\n for (i = end - dim; i >= start; i -= dim) last = insertNode(i, data[i], data[i + 1], last);\n }\n\n if (last && equals(last, last.next)) {\n removeNode(last);\n last = last.next;\n }\n\n return last;\n}\n\n// eliminate colinear or duplicate points\nfunction filterPoints(start, end) {\n if (!start) return start;\n if (!end) end = start;\n\n var p = start,\n again;\n do {\n again = false;\n\n if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {\n removeNode(p);\n p = end = p.prev;\n if (p === p.next) break;\n again = true;\n\n } else {\n p = p.next;\n }\n } while (again || p !== end);\n\n return end;\n}\n\n// main ear slicing loop which triangulates a polygon (given as a linked list)\nfunction earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) {\n if (!ear) return;\n\n // interlink polygon nodes in z-order\n if (!pass && invSize) indexCurve(ear, minX, minY, invSize);\n\n var stop = ear,\n prev, next;\n\n // iterate through ears, slicing them one by one\n while (ear.prev !== ear.next) {\n prev = ear.prev;\n next = ear.next;\n\n if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) {\n // cut off the triangle\n triangles.push(prev.i / dim);\n triangles.push(ear.i / dim);\n triangles.push(next.i / dim);\n\n removeNode(ear);\n\n // skipping the next vertex leads to less sliver triangles\n ear = next.next;\n stop = next.next;\n\n continue;\n }\n\n ear = next;\n\n // if we looped through the whole remaining polygon and can't find any more ears\n if (ear === stop) {\n // try filtering points and slicing again\n if (!pass) {\n earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1);\n\n // if this didn't work, try curing all small self-intersections locally\n } else if (pass === 1) {\n ear = cureLocalIntersections(filterPoints(ear), triangles, dim);\n earcutLinked(ear, triangles, dim, minX, minY, invSize, 2);\n\n // as a last resort, try splitting the remaining polygon into two\n } else if (pass === 2) {\n splitEarcut(ear, triangles, dim, minX, minY, invSize);\n }\n\n break;\n }\n }\n}\n\n// check whether a polygon node forms a valid ear with adjacent nodes\nfunction isEar(ear) {\n var a = ear.prev,\n b = ear,\n c = ear.next;\n\n if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n // now make sure we don't have other points inside the potential ear\n var p = ear.next.next;\n\n while (p !== ear.prev) {\n if (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n area(p.prev, p, p.next) >= 0) return false;\n p = p.next;\n }\n\n return true;\n}\n\nfunction isEarHashed(ear, minX, minY, invSize) {\n var a = ear.prev,\n b = ear,\n c = ear.next;\n\n if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n // triangle bbox; min & max are calculated like this for speed\n var minTX = a.x < b.x ? (a.x < c.x ? a.x : c.x) : (b.x < c.x ? b.x : c.x),\n minTY = a.y < b.y ? (a.y < c.y ? a.y : c.y) : (b.y < c.y ? b.y : c.y),\n maxTX = a.x > b.x ? (a.x > c.x ? a.x : c.x) : (b.x > c.x ? b.x : c.x),\n maxTY = a.y > b.y ? (a.y > c.y ? a.y : c.y) : (b.y > c.y ? b.y : c.y);\n\n // z-order range for the current triangle bbox;\n var minZ = zOrder(minTX, minTY, minX, minY, invSize),\n maxZ = zOrder(maxTX, maxTY, minX, minY, invSize);\n\n var p = ear.prevZ,\n n = ear.nextZ;\n\n // look for points inside the triangle in both directions\n while (p && p.z >= minZ && n && n.z <= maxZ) {\n if (p !== ear.prev && p !== ear.next &&\n pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n area(p.prev, p, p.next) >= 0) return false;\n p = p.prevZ;\n\n if (n !== ear.prev && n !== ear.next &&\n pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) &&\n area(n.prev, n, n.next) >= 0) return false;\n n = n.nextZ;\n }\n\n // look for remaining points in decreasing z-order\n while (p && p.z >= minZ) {\n if (p !== ear.prev && p !== ear.next &&\n pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n area(p.prev, p, p.next) >= 0) return false;\n p = p.prevZ;\n }\n\n // look for remaining points in increasing z-order\n while (n && n.z <= maxZ) {\n if (n !== ear.prev && n !== ear.next &&\n pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) &&\n area(n.prev, n, n.next) >= 0) return false;\n n = n.nextZ;\n }\n\n return true;\n}\n\n// go through all polygon nodes and cure small local self-intersections\nfunction cureLocalIntersections(start, triangles, dim) {\n var p = start;\n do {\n var a = p.prev,\n b = p.next.next;\n\n if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {\n\n triangles.push(a.i / dim);\n triangles.push(p.i / dim);\n triangles.push(b.i / dim);\n\n // remove two nodes involved\n removeNode(p);\n removeNode(p.next);\n\n p = start = b;\n }\n p = p.next;\n } while (p !== start);\n\n return filterPoints(p);\n}\n\n// try splitting polygon into two and triangulate them independently\nfunction splitEarcut(start, triangles, dim, minX, minY, invSize) {\n // look for a valid diagonal that divides the polygon into two\n var a = start;\n do {\n var b = a.next.next;\n while (b !== a.prev) {\n if (a.i !== b.i && isValidDiagonal(a, b)) {\n // split the polygon in two by the diagonal\n var c = splitPolygon(a, b);\n\n // filter colinear points around the cuts\n a = filterPoints(a, a.next);\n c = filterPoints(c, c.next);\n\n // run earcut on each half\n earcutLinked(a, triangles, dim, minX, minY, invSize);\n earcutLinked(c, triangles, dim, minX, minY, invSize);\n return;\n }\n b = b.next;\n }\n a = a.next;\n } while (a !== start);\n}\n\n// link every hole into the outer loop, producing a single-ring polygon without holes\nfunction eliminateHoles(data, holeIndices, outerNode, dim) {\n var queue = [],\n i, len, start, end, list;\n\n for (i = 0, len = holeIndices.length; i < len; i++) {\n start = holeIndices[i] * dim;\n end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n list = linkedList(data, start, end, dim, false);\n if (list === list.next) list.steiner = true;\n queue.push(getLeftmost(list));\n }\n\n queue.sort(compareX);\n\n // process holes from left to right\n for (i = 0; i < queue.length; i++) {\n eliminateHole(queue[i], outerNode);\n outerNode = filterPoints(outerNode, outerNode.next);\n }\n\n return outerNode;\n}\n\nfunction compareX(a, b) {\n return a.x - b.x;\n}\n\n// find a bridge between vertices that connects hole with an outer ring and and link it\nfunction eliminateHole(hole, outerNode) {\n outerNode = findHoleBridge(hole, outerNode);\n if (outerNode) {\n var b = splitPolygon(outerNode, hole);\n\n // filter collinear points around the cuts\n filterPoints(outerNode, outerNode.next);\n filterPoints(b, b.next);\n }\n}\n\n// David Eberly's algorithm for finding a bridge between hole and outer polygon\nfunction findHoleBridge(hole, outerNode) {\n var p = outerNode,\n hx = hole.x,\n hy = hole.y,\n qx = -Infinity,\n m;\n\n // find a segment intersected by a ray from the hole's leftmost point to the left;\n // segment's endpoint with lesser x will be potential connection point\n do {\n if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {\n var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);\n if (x <= hx && x > qx) {\n qx = x;\n if (x === hx) {\n if (hy === p.y) return p;\n if (hy === p.next.y) return p.next;\n }\n m = p.x < p.next.x ? p : p.next;\n }\n }\n p = p.next;\n } while (p !== outerNode);\n\n if (!m) return null;\n\n if (hx === qx) return m; // hole touches outer segment; pick leftmost endpoint\n\n // look for points inside the triangle of hole point, segment intersection and endpoint;\n // if there are no points found, we have a valid connection;\n // otherwise choose the point of the minimum angle with the ray as connection point\n\n var stop = m,\n mx = m.x,\n my = m.y,\n tanMin = Infinity,\n tan;\n\n p = m;\n\n do {\n if (hx >= p.x && p.x >= mx && hx !== p.x &&\n pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {\n\n tan = Math.abs(hy - p.y) / (hx - p.x); // tangential\n\n if (locallyInside(p, hole) &&\n (tan < tanMin || (tan === tanMin && (p.x > m.x || (p.x === m.x && sectorContainsSector(m, p)))))) {\n m = p;\n tanMin = tan;\n }\n }\n\n p = p.next;\n } while (p !== stop);\n\n return m;\n}\n\n// whether sector in vertex m contains sector in vertex p in the same coordinates\nfunction sectorContainsSector(m, p) {\n return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0;\n}\n\n// interlink polygon nodes in z-order\nfunction indexCurve(start, minX, minY, invSize) {\n var p = start;\n do {\n if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, invSize);\n p.prevZ = p.prev;\n p.nextZ = p.next;\n p = p.next;\n } while (p !== start);\n\n p.prevZ.nextZ = null;\n p.prevZ = null;\n\n sortLinked(p);\n}\n\n// Simon Tatham's linked list merge sort algorithm\n// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\nfunction sortLinked(list) {\n var i, p, q, e, tail, numMerges, pSize, qSize,\n inSize = 1;\n\n do {\n p = list;\n list = null;\n tail = null;\n numMerges = 0;\n\n while (p) {\n numMerges++;\n q = p;\n pSize = 0;\n for (i = 0; i < inSize; i++) {\n pSize++;\n q = q.nextZ;\n if (!q) break;\n }\n qSize = inSize;\n\n while (pSize > 0 || (qSize > 0 && q)) {\n\n if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {\n e = p;\n p = p.nextZ;\n pSize--;\n } else {\n e = q;\n q = q.nextZ;\n qSize--;\n }\n\n if (tail) tail.nextZ = e;\n else list = e;\n\n e.prevZ = tail;\n tail = e;\n }\n\n p = q;\n }\n\n tail.nextZ = null;\n inSize *= 2;\n\n } while (numMerges > 1);\n\n return list;\n}\n\n// z-order of a point given coords and inverse of the longer side of data bbox\nfunction zOrder(x, y, minX, minY, invSize) {\n // coords are transformed into non-negative 15-bit integer range\n x = 32767 * (x - minX) * invSize;\n y = 32767 * (y - minY) * invSize;\n\n x = (x | (x << 8)) & 0x00FF00FF;\n x = (x | (x << 4)) & 0x0F0F0F0F;\n x = (x | (x << 2)) & 0x33333333;\n x = (x | (x << 1)) & 0x55555555;\n\n y = (y | (y << 8)) & 0x00FF00FF;\n y = (y | (y << 4)) & 0x0F0F0F0F;\n y = (y | (y << 2)) & 0x33333333;\n y = (y | (y << 1)) & 0x55555555;\n\n return x | (y << 1);\n}\n\n// find the leftmost node of a polygon ring\nfunction getLeftmost(start) {\n var p = start,\n leftmost = start;\n do {\n if (p.x < leftmost.x || (p.x === leftmost.x && p.y < leftmost.y)) leftmost = p;\n p = p.next;\n } while (p !== start);\n\n return leftmost;\n}\n\n// check if a point lies within a convex triangle\nfunction pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {\n return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 &&\n (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 &&\n (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0;\n}\n\n// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\nfunction isValidDiagonal(a, b) {\n return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && // dones't intersect other edges\n (locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && // locally visible\n (area(a.prev, a, b.prev) || area(a, b.prev, b)) || // does not create opposite-facing sectors\n equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); // special zero-length case\n}\n\n// signed area of a triangle\nfunction area(p, q, r) {\n return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);\n}\n\n// check if two points are equal\nfunction equals(p1, p2) {\n return p1.x === p2.x && p1.y === p2.y;\n}\n\n// check if two segments intersect\nfunction intersects(p1, q1, p2, q2) {\n var o1 = sign(area(p1, q1, p2));\n var o2 = sign(area(p1, q1, q2));\n var o3 = sign(area(p2, q2, p1));\n var o4 = sign(area(p2, q2, q1));\n\n if (o1 !== o2 && o3 !== o4) return true; // general case\n\n if (o1 === 0 && onSegment(p1, p2, q1)) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1\n if (o2 === 0 && onSegment(p1, q2, q1)) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1\n if (o3 === 0 && onSegment(p2, p1, q2)) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2\n if (o4 === 0 && onSegment(p2, q1, q2)) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2\n\n return false;\n}\n\n// for collinear points p, q, r, check if point q lies on segment pr\nfunction onSegment(p, q, r) {\n return q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y);\n}\n\nfunction sign(num) {\n return num > 0 ? 1 : num < 0 ? -1 : 0;\n}\n\n// check if a polygon diagonal intersects any polygon segments\nfunction intersectsPolygon(a, b) {\n var p = a;\n do {\n if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&\n intersects(p, p.next, a, b)) return true;\n p = p.next;\n } while (p !== a);\n\n return false;\n}\n\n// check if a polygon diagonal is locally inside the polygon\nfunction locallyInside(a, b) {\n return area(a.prev, a, a.next) < 0 ?\n area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 :\n area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;\n}\n\n// check if the middle point of a polygon diagonal is inside the polygon\nfunction middleInside(a, b) {\n var p = a,\n inside = false,\n px = (a.x + b.x) / 2,\n py = (a.y + b.y) / 2;\n do {\n if (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y &&\n (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x))\n inside = !inside;\n p = p.next;\n } while (p !== a);\n\n return inside;\n}\n\n// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\n// if one belongs to the outer ring and another to a hole, it merges it into a single ring\nfunction splitPolygon(a, b) {\n var a2 = new Node(a.i, a.x, a.y),\n b2 = new Node(b.i, b.x, b.y),\n an = a.next,\n bp = b.prev;\n\n a.next = b;\n b.prev = a;\n\n a2.next = an;\n an.prev = a2;\n\n b2.next = a2;\n a2.prev = b2;\n\n bp.next = b2;\n b2.prev = bp;\n\n return b2;\n}\n\n// create a node and optionally link it with previous one (in a circular doubly linked list)\nfunction insertNode(i, x, y, last) {\n var p = new Node(i, x, y);\n\n if (!last) {\n p.prev = p;\n p.next = p;\n\n } else {\n p.next = last.next;\n p.prev = last;\n last.next.prev = p;\n last.next = p;\n }\n return p;\n}\n\nfunction removeNode(p) {\n p.next.prev = p.prev;\n p.prev.next = p.next;\n\n if (p.prevZ) p.prevZ.nextZ = p.nextZ;\n if (p.nextZ) p.nextZ.prevZ = p.prevZ;\n}\n\nfunction Node(i, x, y) {\n // vertex index in coordinates array\n this.i = i;\n\n // vertex coordinates\n this.x = x;\n this.y = y;\n\n // previous and next vertex nodes in a polygon ring\n this.prev = null;\n this.next = null;\n\n // z-order curve value\n this.z = null;\n\n // previous and next nodes in z-order\n this.prevZ = null;\n this.nextZ = null;\n\n // indicates whether this is a steiner point\n this.steiner = false;\n}\n\n// return a percentage difference between the polygon area and its triangulation area;\n// used to verify correctness of triangulation\nearcut.deviation = function (data, holeIndices, dim, triangles) {\n var hasHoles = holeIndices && holeIndices.length;\n var outerLen = hasHoles ? holeIndices[0] * dim : data.length;\n\n var polygonArea = Math.abs(signedArea(data, 0, outerLen, dim));\n if (hasHoles) {\n for (var i = 0, len = holeIndices.length; i < len; i++) {\n var start = holeIndices[i] * dim;\n var end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n polygonArea -= Math.abs(signedArea(data, start, end, dim));\n }\n }\n\n var trianglesArea = 0;\n for (i = 0; i < triangles.length; i += 3) {\n var a = triangles[i] * dim;\n var b = triangles[i + 1] * dim;\n var c = triangles[i + 2] * dim;\n trianglesArea += Math.abs(\n (data[a] - data[c]) * (data[b + 1] - data[a + 1]) -\n (data[a] - data[b]) * (data[c + 1] - data[a + 1]));\n }\n\n return polygonArea === 0 && trianglesArea === 0 ? 0 :\n Math.abs((trianglesArea - polygonArea) / polygonArea);\n};\n\nfunction signedArea(data, start, end, dim) {\n var sum = 0;\n for (var i = start, j = end - dim; i < end; i += dim) {\n sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);\n j = i;\n }\n return sum;\n}\n\n// turn a polygon in a multi-dimensional array form (e.g. as in GeoJSON) into a form Earcut accepts\nearcut.flatten = function (data) {\n var dim = data[0][0].length,\n result = {vertices: [], holes: [], dimensions: dim},\n holeIndex = 0;\n\n for (var i = 0; i < data.length; i++) {\n for (var j = 0; j < data[i].length; j++) {\n for (var d = 0; d < dim; d++) result.vertices.push(data[i][j][d]);\n }\n if (i > 0) {\n holeIndex += data[i - 1].length;\n result.holes.push(holeIndex);\n }\n }\n return result;\n};\n\nexport {earcut};","import {earcut} from './../lib/earcut';\nimport {math} from \"./../lib/math.js\";\n\nconst tempVec2a = math.vec2();\nconst tempVec3a = math.vec3();\nconst tempVec3b = math.vec3();\nconst tempVec3c = math.vec3();\n\n/**\n * @desc Parses a CityJSON model into an {@link XKTModel}.\n *\n * [CityJSON](https://www.cityjson.org) is a JSON-based encoding for a subset of the CityGML data model (version 2.0.0),\n * which is an open standardised data model and exchange format to store digital 3D models of cities and\n * landscapes. CityGML is an official standard of the [Open Geospatial Consortium](https://www.ogc.org/).\n *\n * This converter function supports most of the [CityJSON 1.0.2 Specification](https://www.cityjson.org/specs/1.0.2),\n * with the following limitations:\n *\n * * Does not (yet) support CityJSON semantics for geometry primitives.\n * * Does not (yet) support textured geometries.\n * * Does not (yet) support geometry templates.\n * * When the CityJSON file provides multiple *themes* for a geometry, then we parse only the first of the provided themes for that geometry.\n *\n * ## Usage\n *\n * In the example below we'll create an {@link XKTModel}, then load a CityJSON model into it.\n *\n * ````javascript\n * utils.loadJSON(\"./models/cityjson/DenHaag.json\", async (data) => {\n *\n * const xktModel = new XKTModel();\n *\n * parseCityJSONIntoXKTModel({\n * data,\n * xktModel,\n * log: (msg) => { console.log(msg); }\n * }).then(()=>{\n * xktModel.finalize();\n * },\n * (msg) => {\n * console.error(msg);\n * });\n * });\n * ````\n *\n * @param {Object} params Parsing params.\n * @param {Object} params.data CityJSON data.\n * @param {XKTModel} params.xktModel XKTModel to parse into.\n * @param {boolean} [params.center=false] Set true to center the CityJSON vertex positions to [0,0,0]. This is applied before the transformation matrix, if specified.\n * @param {Boolean} [params.transform] 4x4 transformation matrix to transform CityJSON vertex positions. Use this to rotate, translate and scale them if neccessary.\n * @param {Object} [params.stats] Collects statistics.\n * @param {function} [params.log] Logging callback.\n @returns {Promise} Resolves when CityJSON has been parsed.\n */\nfunction parseCityJSONIntoXKTModel({\n data,\n xktModel,\n center = false,\n transform = null,\n stats = {}, log\n }) {\n\n return new Promise(function (resolve, reject) {\n\n if (!data) {\n reject(\"Argument expected: data\");\n return;\n }\n\n if (data.type !== \"CityJSON\") {\n reject(\"Invalid argument: data is not a CityJSON file\");\n return;\n }\n\n if (!xktModel) {\n reject(\"Argument expected: xktModel\");\n return;\n }\n\n let vertices;\n\n log(\"Using parser: parseCityJSONIntoXKTModel\");\n\n log(`center: ${center}`);\n if (transform) {\n log(`transform: [${transform}]`);\n }\n\n if (data.transform || center || transform) {\n vertices = copyVertices(data.vertices);\n if (data.transform) {\n transformVertices(vertices, data.transform)\n }\n if (center) {\n centerVertices(vertices);\n }\n if (transform) {\n customTransformVertices(vertices, transform);\n }\n } else {\n vertices = data.vertices;\n }\n\n stats.sourceFormat = data.type || \"\";\n stats.schemaVersion = data.version || \"\";\n stats.title = \"\";\n stats.author = \"\";\n stats.created = \"\";\n stats.numMetaObjects = 0;\n stats.numPropertySets = 0;\n stats.numTriangles = 0;\n stats.numVertices = 0;\n stats.numObjects = 0;\n stats.numGeometries = 0;\n\n const rootMetaObjectId = math.createUUID();\n\n xktModel.createMetaObject({\n metaObjectId: rootMetaObjectId,\n metaObjectType: \"Model\",\n metaObjectName: \"Model\"\n });\n\n stats.numMetaObjects++;\n\n const modelMetaObjectId = math.createUUID();\n\n xktModel.createMetaObject({\n metaObjectId: modelMetaObjectId,\n metaObjectType: \"CityJSON\",\n metaObjectName: \"CityJSON\",\n parentMetaObjectId: rootMetaObjectId\n });\n\n stats.numMetaObjects++;\n\n const ctx = {\n data,\n vertices,\n xktModel,\n rootMetaObjectId: modelMetaObjectId,\n log: (log || function (msg) {\n }),\n nextId: 0,\n stats\n };\n\n ctx.xktModel.schema = data.type + \" \" + data.version;\n\n ctx.log(\"Converting \" + ctx.xktModel.schema);\n\n parseCityJSON(ctx);\n\n resolve();\n });\n}\n\nfunction copyVertices(vertices) {\n const vertices2 = [];\n for (let i = 0, j = 0; i < vertices.length; i++, j += 3) {\n const x = vertices[i][0];\n const y = vertices[i][1];\n const z = vertices[i][2];\n vertices2.push([x, y, z]);\n }\n return vertices2;\n}\n\nfunction transformVertices(vertices, cityJSONTransform) {\n const scale = cityJSONTransform.scale || math.vec3([1, 1, 1]);\n const translate = cityJSONTransform.translate || math.vec3([0, 0, 0]);\n for (let i = 0; i < vertices.length; i++) {\n const vertex = vertices[i];\n vertex[0] = (vertex[0] * scale[0]) + translate[0];\n vertex[1] = (vertex[1] * scale[1]) + translate[1];\n vertex[2] = (vertex[2] * scale[2]) + translate[2];\n }\n}\n\nfunction centerVertices(vertices) {\n if (center) {\n const centerPos = math.vec3();\n const numPoints = vertices.length;\n for (let i = 0, len = vertices.length; i < len; i++) {\n const vertex = vertices[i];\n centerPos[0] += vertex[0];\n centerPos[1] += vertex[1];\n centerPos[2] += vertex[2];\n }\n centerPos[0] /= numPoints;\n centerPos[1] /= numPoints;\n centerPos[2] /= numPoints;\n for (let i = 0, len = vertices.length; i < len; i++) {\n const vertex = vertices[i];\n vertex[0] -= centerPos[0];\n vertex[1] -= centerPos[1];\n vertex[2] -= centerPos[2];\n }\n }\n}\n\nfunction customTransformVertices(vertices, transform) {\n if (transform) {\n const mat = math.mat4(transform);\n for (let i = 0, len = vertices.length; i < len; i++) {\n const vertex = vertices[i];\n math.transformPoint3(mat, vertex, vertex);\n }\n }\n}\n\nfunction parseCityJSON(ctx) {\n\n const data = ctx.data;\n const cityObjects = data.CityObjects;\n\n for (const objectId in cityObjects) {\n if (cityObjects.hasOwnProperty(objectId)) {\n const cityObject = cityObjects[objectId];\n parseCityObject(ctx, cityObject, objectId);\n }\n }\n}\n\nfunction parseCityObject(ctx, cityObject, objectId) {\n\n const xktModel = ctx.xktModel;\n const data = ctx.data;\n const metaObjectId = objectId;\n const metaObjectType = cityObject.type;\n const metaObjectName = metaObjectType + \" : \" + objectId;\n\n const parentMetaObjectId = cityObject.parents ? cityObject.parents[0] : ctx.rootMetaObjectId;\n\n xktModel.createMetaObject({\n metaObjectId,\n metaObjectName,\n metaObjectType,\n parentMetaObjectId\n });\n\n ctx.stats.numMetaObjects++;\n\n if (!(cityObject.geometry && cityObject.geometry.length > 0)) {\n return;\n }\n\n const meshIds = [];\n\n for (let i = 0, len = cityObject.geometry.length; i < len; i++) {\n\n const geometry = cityObject.geometry[i];\n\n let objectMaterial;\n let surfaceMaterials;\n\n const appearance = data.appearance;\n if (appearance) {\n const materials = appearance.materials;\n if (materials) {\n const geometryMaterial = geometry.material;\n if (geometryMaterial) {\n const themeIds = Object.keys(geometryMaterial);\n if (themeIds.length > 0) {\n const themeId = themeIds[0];\n const theme = geometryMaterial[themeId];\n if (theme.value !== undefined) {\n objectMaterial = materials[theme.value];\n } else {\n const values = theme.values;\n if (values) {\n surfaceMaterials = [];\n for (let j = 0, lenj = values.length; j < lenj; j++) {\n const value = values[i];\n const surfaceMaterial = materials[value];\n surfaceMaterials.push(surfaceMaterial);\n }\n }\n }\n }\n }\n }\n }\n\n if (surfaceMaterials) {\n parseGeometrySurfacesWithOwnMaterials(ctx, geometry, surfaceMaterials, meshIds);\n\n } else {\n parseGeometrySurfacesWithSharedMaterial(ctx, geometry, objectMaterial, meshIds);\n }\n }\n\n if (meshIds.length > 0) {\n xktModel.createEntity({\n entityId: objectId,\n meshIds: meshIds\n });\n\n ctx.stats.numObjects++;\n }\n}\n\nfunction parseGeometrySurfacesWithOwnMaterials(ctx, geometry, surfaceMaterials, meshIds) {\n\n const geomType = geometry.type;\n\n switch (geomType) {\n\n case \"MultiPoint\":\n break;\n\n case \"MultiLineString\":\n break;\n\n case \"MultiSurface\":\n\n case \"CompositeSurface\":\n const surfaces = geometry.boundaries;\n parseSurfacesWithOwnMaterials(ctx, surfaceMaterials, surfaces, meshIds);\n break;\n\n case \"Solid\":\n const shells = geometry.boundaries;\n for (let j = 0; j < shells.length; j++) {\n const surfaces = shells[j];\n parseSurfacesWithOwnMaterials(ctx, surfaceMaterials, surfaces, meshIds);\n }\n break;\n\n case \"MultiSolid\":\n\n case \"CompositeSolid\":\n const solids = geometry.boundaries;\n for (let j = 0; j < solids.length; j++) {\n for (let k = 0; k < solids[j].length; k++) {\n const surfaces = solids[j][k];\n parseSurfacesWithOwnMaterials(ctx, surfaceMaterials, surfaces, meshIds);\n }\n }\n break;\n\n case \"GeometryInstance\":\n break;\n }\n}\n\nfunction parseSurfacesWithOwnMaterials(ctx, surfaceMaterials, surfaces, meshIds) {\n\n const vertices = ctx.vertices;\n const xktModel = ctx.xktModel;\n\n for (let i = 0; i < surfaces.length; i++) {\n\n const surface = surfaces[i];\n const surfaceMaterial = surfaceMaterials[i] || {diffuseColor: [0.8, 0.8, 0.8], transparency: 1.0};\n\n const face = [];\n const holes = [];\n\n const sharedIndices = [];\n\n const geometryCfg = {\n positions: [],\n indices: []\n };\n\n for (let j = 0; j < surface.length; j++) {\n\n if (face.length > 0) {\n holes.push(face.length);\n }\n\n const newFace = extractLocalIndices(ctx, surface[j], sharedIndices, geometryCfg);\n\n face.push(...newFace);\n }\n\n if (face.length === 3) { // Triangle\n\n geometryCfg.indices.push(face[0]);\n geometryCfg.indices.push(face[1]);\n geometryCfg.indices.push(face[2]);\n\n } else if (face.length > 3) { // Polygon\n\n // Prepare to triangulate\n\n const pList = [];\n\n for (let k = 0; k < face.length; k++) {\n pList.push({\n x: vertices[sharedIndices[face[k]]][0],\n y: vertices[sharedIndices[face[k]]][1],\n z: vertices[sharedIndices[face[k]]][2]\n });\n }\n\n const normal = getNormalOfPositions(pList, math.vec3());\n\n // Convert to 2D\n\n let pv = [];\n\n for (let k = 0; k < pList.length; k++) {\n\n to2D(pList[k], normal, tempVec2a);\n\n pv.unshift(tempVec2a[0]);\n pv.unshift(tempVec2a[1]);\n }\n\n // Triangulate\n\n const tr = earcut(pv, holes, 2);\n\n // Create triangles\n\n for (let k = 0; k < tr.length; k += 3) {\n geometryCfg.indices.unshift(face[tr[k]]);\n geometryCfg.indices.unshift(face[tr[k + 1]]);\n geometryCfg.indices.unshift(face[tr[k + 2]]);\n }\n }\n\n const geometryId = \"\" + ctx.nextId++;\n const meshId = \"\" + ctx.nextId++;\n\n xktModel.createGeometry({\n geometryId: geometryId,\n primitiveType: \"triangles\",\n positions: geometryCfg.positions,\n indices: geometryCfg.indices\n });\n\n xktModel.createMesh({\n meshId: meshId,\n geometryId: geometryId,\n color: (surfaceMaterial && surfaceMaterial.diffuseColor) ? surfaceMaterial.diffuseColor : [0.8, 0.8, 0.8],\n opacity: 1.0\n //opacity: (surfaceMaterial && surfaceMaterial.transparency !== undefined) ? (1.0 - surfaceMaterial.transparency) : 1.0\n });\n\n meshIds.push(meshId);\n\n ctx.stats.numGeometries++;\n ctx.stats.numVertices += geometryCfg.positions.length / 3;\n ctx.stats.numTriangles += geometryCfg.indices.length / 3;\n }\n}\n\nfunction parseGeometrySurfacesWithSharedMaterial(ctx, geometry, objectMaterial, meshIds) {\n\n const xktModel = ctx.xktModel;\n const sharedIndices = [];\n const geometryCfg = {\n positions: [],\n indices: []\n };\n\n const geomType = geometry.type;\n\n switch (geomType) {\n case \"MultiPoint\":\n break;\n\n case \"MultiLineString\":\n break;\n\n case \"MultiSurface\":\n case \"CompositeSurface\":\n const surfaces = geometry.boundaries;\n parseSurfacesWithSharedMaterial(ctx, surfaces, sharedIndices, geometryCfg);\n break;\n\n case \"Solid\":\n const shells = geometry.boundaries;\n for (let j = 0; j < shells.length; j++) {\n const surfaces = shells[j];\n parseSurfacesWithSharedMaterial(ctx, surfaces, sharedIndices, geometryCfg);\n }\n break;\n\n case \"MultiSolid\":\n case \"CompositeSolid\":\n const solids = geometry.boundaries;\n for (let j = 0; j < solids.length; j++) {\n for (let k = 0; k < solids[j].length; k++) {\n const surfaces = solids[j][k];\n parseSurfacesWithSharedMaterial(ctx, surfaces, sharedIndices, geometryCfg);\n }\n }\n break;\n\n case \"GeometryInstance\":\n break;\n }\n\n const geometryId = \"\" + ctx.nextId++;\n const meshId = \"\" + ctx.nextId++;\n\n xktModel.createGeometry({\n geometryId: geometryId,\n primitiveType: \"triangles\",\n positions: geometryCfg.positions,\n indices: geometryCfg.indices\n });\n\n xktModel.createMesh({\n meshId: meshId,\n geometryId: geometryId,\n color: (objectMaterial && objectMaterial.diffuseColor) ? objectMaterial.diffuseColor : [0.8, 0.8, 0.8],\n opacity: 1.0\n //opacity: (objectMaterial && objectMaterial.transparency !== undefined) ? (1.0 - objectMaterial.transparency) : 1.0\n });\n\n meshIds.push(meshId);\n\n ctx.stats.numGeometries++;\n ctx.stats.numVertices += geometryCfg.positions.length / 3;\n ctx.stats.numTriangles += geometryCfg.indices.length / 3;\n}\n\nfunction parseSurfacesWithSharedMaterial(ctx, surfaces, sharedIndices, primitiveCfg) {\n\n const vertices = ctx.vertices;\n\n for (let i = 0; i < surfaces.length; i++) {\n\n let boundary = [];\n let holes = [];\n\n for (let j = 0; j < surfaces[i].length; j++) {\n if (boundary.length > 0) {\n holes.push(boundary.length);\n }\n const newBoundary = extractLocalIndices(ctx, surfaces[i][j], sharedIndices, primitiveCfg);\n boundary.push(...newBoundary);\n }\n\n if (boundary.length === 3) { // Triangle\n\n primitiveCfg.indices.push(boundary[0]);\n primitiveCfg.indices.push(boundary[1]);\n primitiveCfg.indices.push(boundary[2]);\n\n } else if (boundary.length > 3) { // Polygon\n\n let pList = [];\n\n for (let k = 0; k < boundary.length; k++) {\n pList.push({\n x: vertices[sharedIndices[boundary[k]]][0],\n y: vertices[sharedIndices[boundary[k]]][1],\n z: vertices[sharedIndices[boundary[k]]][2]\n });\n }\n\n const normal = getNormalOfPositions(pList, math.vec3());\n let pv = [];\n\n for (let k = 0; k < pList.length; k++) {\n to2D(pList[k], normal, tempVec2a);\n pv.unshift(tempVec2a[0]);\n pv.unshift(tempVec2a[1]);\n }\n\n const tr = earcut(pv, holes, 2);\n\n for (let k = 0; k < tr.length; k += 3) {\n primitiveCfg.indices.unshift(boundary[tr[k]]);\n primitiveCfg.indices.unshift(boundary[tr[k + 1]]);\n primitiveCfg.indices.unshift(boundary[tr[k + 2]]);\n }\n }\n }\n}\n\nfunction extractLocalIndices(ctx, boundary, sharedIndices, geometryCfg) {\n\n const vertices = ctx.vertices;\n const newBoundary = []\n\n for (let i = 0, len = boundary.length; i < len; i++) {\n\n const index = boundary[i];\n\n if (sharedIndices.includes(index)) {\n const vertexIndex = sharedIndices.indexOf(index);\n newBoundary.push(vertexIndex);\n\n } else {\n geometryCfg.positions.push(vertices[index][0]);\n geometryCfg.positions.push(vertices[index][1]);\n geometryCfg.positions.push(vertices[index][2]);\n\n newBoundary.push(sharedIndices.length);\n\n sharedIndices.push(index);\n }\n }\n\n return newBoundary\n}\n\nfunction getNormalOfPositions(positions, normal) {\n\n for (let i = 0; i < positions.length; i++) {\n\n let nexti = i + 1;\n if (nexti === positions.length) {\n nexti = 0;\n }\n\n normal[0] += ((positions[i].y - positions[nexti].y) * (positions[i].z + positions[nexti].z));\n normal[1] += ((positions[i].z - positions[nexti].z) * (positions[i].x + positions[nexti].x));\n normal[2] += ((positions[i].x - positions[nexti].x) * (positions[i].y + positions[nexti].y));\n }\n\n return math.normalizeVec3(normal);\n}\n\nfunction to2D(_p, _n, re) {\n\n const p = tempVec3a;\n const n = tempVec3b;\n const x3 = tempVec3c;\n\n p[0] = _p.x;\n p[1] = _p.y;\n p[2] = _p.z;\n\n n[0] = _n.x;\n n[1] = _n.y;\n n[2] = _n.z;\n\n x3[0] = 1.1;\n x3[1] = 1.1;\n x3[2] = 1.1;\n\n const dist = math.lenVec3(math.subVec3(x3, n));\n\n if (dist < 0.01) {\n x3[0] += 1.0;\n x3[1] += 2.0;\n x3[2] += 3.0;\n }\n\n const dot = math.dotVec3(x3, n);\n const tmp2 = math.mulVec3Scalar(n, dot, math.vec3());\n\n x3[0] -= tmp2[0];\n x3[1] -= tmp2[1];\n x3[2] -= tmp2[2];\n\n math.normalizeVec3(x3);\n\n const y3 = math.cross3Vec3(n, x3, math.vec3());\n const x = math.dotVec3(p, x3);\n const y = math.dotVec3(p, y3);\n\n re[0] = x;\n re[1] = y;\n}\n\nexport {parseCityJSONIntoXKTModel};","function isString(value) {\n return (typeof value === 'string' || value instanceof String);\n}\n\nfunction apply(o, o2) {\n for (const name in o) {\n if (o.hasOwnProperty(name)) {\n o2[name] = o[name];\n }\n }\n return o2;\n}\n\n/**\n * @private\n */\nconst utils = {\n isString,\n apply\n};\n\nexport {utils};\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@loaders.gl/gltf\");","import {utils} from \"../XKTModel/lib/utils.js\";\nimport {math} from \"../lib/math.js\";\n\nimport {parse} from '@loaders.gl/core';\nimport {GLTFLoader} from '@loaders.gl/gltf';\nimport {\n ClampToEdgeWrapping,\n LinearFilter,\n LinearMipMapLinearFilter,\n LinearMipMapNearestFilter,\n MirroredRepeatWrapping,\n NearestFilter,\n NearestMipMapLinearFilter,\n NearestMipMapNearestFilter,\n RepeatWrapping\n} from \"../constants.js\";\n\n/**\n * @desc Parses glTF into an {@link XKTModel}, supporting ````.glb```` and textures.\n *\n * * Supports ````.glb```` and textures\n * * For a lightweight glTF JSON parser that ignores textures, see {@link parseGLTFJSONIntoXKTModel}.\n *\n * ## Usage\n *\n * In the example below we'll create an {@link XKTModel}, then load a binary glTF model into it.\n *\n * ````javascript\n * utils.loadArraybuffer(\"../assets/models/gltf/HousePlan/glTF-Binary/HousePlan.glb\", async (data) => {\n *\n * const xktModel = new XKTModel();\n *\n * parseGLTFIntoXKTModel({\n * data,\n * xktModel,\n * log: (msg) => { console.log(msg); }\n * }).then(()=>{\n * xktModel.finalize();\n * },\n * (msg) => {\n * console.error(msg);\n * });\n * });\n * ````\n *\n * @param {Object} params Parsing parameters.\n * @param {ArrayBuffer} params.data The glTF.\n * @param {String} [params.baseUri] The base URI used to load this glTF, if any. For resolving relative uris to linked resources.\n * @param {Object} [params.metaModelData] Metamodel JSON. If this is provided, then parsing is able to ensure that the XKTObjects it creates will fit the metadata properly.\n * @param {XKTModel} params.xktModel XKTModel to parse into.\n * @param {Boolean} [params.includeTextures=true] Whether to parse textures.\n * @param {Boolean} [params.includeNormals=true] Whether to parse normals. When false, the parser will ignore the glTF\n * geometry normals, and the glTF data will rely on the xeokit ````Viewer```` to automatically generate them. This has\n * the limitation that the normals will be face-aligned, and therefore the ````Viewer```` will only be able to render\n * a flat-shaded non-PBR representation of the glTF.\n * @param {Object} [params.stats] Collects statistics.\n * @param {function} [params.log] Logging callback.\n @returns {Promise} Resolves when glTF has been parsed.\n */\nfunction parseGLTFIntoXKTModel({\n data,\n baseUri,\n xktModel,\n metaModelData,\n includeTextures = true,\n includeNormals = true,\n getAttachment,\n stats = {},\n log\n }) {\n\n return new Promise(function (resolve, reject) {\n\n if (!data) {\n reject(\"Argument expected: data\");\n return;\n }\n\n if (!xktModel) {\n reject(\"Argument expected: xktModel\");\n return;\n }\n\n stats.sourceFormat = \"glTF\";\n stats.schemaVersion = \"2.0\";\n stats.title = \"\";\n stats.author = \"\";\n stats.created = \"\";\n stats.numTriangles = 0;\n stats.numVertices = 0;\n stats.numNormals = 0;\n stats.numUVs = 0;\n stats.numTextures = 0;\n stats.numObjects = 0;\n stats.numGeometries = 0;\n\n parse(data, GLTFLoader, {\n baseUri\n }).then((gltfData) => {\n\n const ctx = {\n gltfData,\n metaModelCorrections: metaModelData ? getMetaModelCorrections(metaModelData) : null,\n getAttachment: getAttachment || (() => {\n throw new Error('You must define getAttachment() method to convert glTF with external resources')\n }),\n log: (log || function (msg) {\n }),\n error: function (msg) {\n console.error(msg);\n },\n xktModel,\n includeNormals: (includeNormals !== false),\n includeTextures: (includeTextures !== false),\n geometryCreated: {},\n nextId: 0,\n stats\n };\n\n ctx.log(\"Using parser: parseGLTFIntoXKTModel\");\n ctx.log(`Parsing normals: ${ctx.includeNormals ? \"enabled\" : \"disabled\"}`);\n ctx.log(`Parsing textures: ${ctx.includeTextures ? \"enabled\" : \"disabled\"}`);\n\n if (ctx.includeTextures) {\n parseTextures(ctx);\n }\n parseMaterials(ctx);\n parseDefaultScene(ctx);\n\n resolve();\n\n }, (errMsg) => {\n reject(`[parseGLTFIntoXKTModel] ${errMsg}`);\n });\n });\n}\n\nfunction getMetaModelCorrections(metaModelData) {\n const eachRootStats = {};\n const eachChildRoot = {};\n const metaObjects = metaModelData.metaObjects || [];\n const metaObjectsMap = {};\n for (let i = 0, len = metaObjects.length; i < len; i++) {\n const metaObject = metaObjects[i];\n metaObjectsMap[metaObject.id] = metaObject;\n }\n for (let i = 0, len = metaObjects.length; i < len; i++) {\n const metaObject = metaObjects[i];\n if (metaObject.parent !== undefined && metaObject.parent !== null) {\n const metaObjectParent = metaObjectsMap[metaObject.parent];\n if (metaObject.type === metaObjectParent.type) {\n let rootMetaObject = metaObjectParent;\n while (rootMetaObject.parent && metaObjectsMap[rootMetaObject.parent].type === rootMetaObject.type) {\n rootMetaObject = metaObjectsMap[rootMetaObject.parent];\n }\n const rootStats = eachRootStats[rootMetaObject.id] || (eachRootStats[rootMetaObject.id] = {\n numChildren: 0,\n countChildren: 0\n });\n rootStats.numChildren++;\n eachChildRoot[metaObject.id] = rootMetaObject;\n } else {\n\n }\n }\n }\n return {\n metaObjectsMap,\n eachRootStats,\n eachChildRoot\n };\n}\n\nfunction parseTextures(ctx) {\n const gltfData = ctx.gltfData;\n const textures = gltfData.textures;\n if (textures) {\n for (let i = 0, len = textures.length; i < len; i++) {\n parseTexture(ctx, textures[i]);\n ctx.stats.numTextures++;\n }\n }\n}\n\nfunction parseTexture(ctx, texture) {\n if (!texture.source || !texture.source.image) {\n return;\n }\n const textureId = `texture-${ctx.nextId++}`;\n\n let minFilter = NearestMipMapLinearFilter;\n switch (texture.sampler.minFilter) {\n case 9728:\n minFilter = NearestFilter;\n break;\n case 9729:\n minFilter = LinearFilter;\n break;\n case 9984:\n minFilter = NearestMipMapNearestFilter;\n break;\n case 9985:\n minFilter = LinearMipMapNearestFilter;\n break;\n case 9986:\n minFilter = NearestMipMapLinearFilter;\n break;\n case 9987:\n minFilter = LinearMipMapLinearFilter;\n break;\n }\n\n let magFilter = LinearFilter;\n switch (texture.sampler.magFilter) {\n case 9728:\n magFilter = NearestFilter;\n break;\n case 9729:\n magFilter = LinearFilter;\n break;\n }\n\n let wrapS = RepeatWrapping;\n switch (texture.sampler.wrapS) {\n case 33071:\n wrapS = ClampToEdgeWrapping;\n break;\n case 33648:\n wrapS = MirroredRepeatWrapping;\n break;\n case 10497:\n wrapS = RepeatWrapping;\n break;\n }\n\n let wrapT = RepeatWrapping;\n switch (texture.sampler.wrapT) {\n case 33071:\n wrapT = ClampToEdgeWrapping;\n break;\n case 33648:\n wrapT = MirroredRepeatWrapping;\n break;\n case 10497:\n wrapT = RepeatWrapping;\n break;\n }\n\n let wrapR = RepeatWrapping;\n switch (texture.sampler.wrapR) {\n case 33071:\n wrapR = ClampToEdgeWrapping;\n break;\n case 33648:\n wrapR = MirroredRepeatWrapping;\n break;\n case 10497:\n wrapR = RepeatWrapping;\n break;\n }\n\n ctx.xktModel.createTexture({\n textureId: textureId,\n imageData: texture.source.image,\n mediaType: texture.source.mediaType,\n compressed: true,\n width: texture.source.image.width,\n height: texture.source.image.height,\n minFilter,\n magFilter,\n wrapS,\n wrapT,\n wrapR,\n flipY: !!texture.flipY,\n // encoding: \"sRGB\"\n });\n texture._textureId = textureId;\n}\n\nfunction parseMaterials(ctx) {\n const gltfData = ctx.gltfData;\n const materials = gltfData.materials;\n if (materials) {\n for (let i = 0, len = materials.length; i < len; i++) {\n const material = materials[i];\n material._textureSetId = ctx.includeTextures ? parseTextureSet(ctx, material) : null;\n material._attributes = parseMaterialAttributes(ctx, material);\n }\n }\n}\n\nfunction parseTextureSet(ctx, material) {\n const textureSetCfg = {};\n if (material.normalTexture) {\n textureSetCfg.normalTextureId = material.normalTexture.texture._textureId;\n }\n if (material.occlusionTexture) {\n textureSetCfg.occlusionTextureId = material.occlusionTexture.texture._textureId;\n }\n if (material.emissiveTexture) {\n textureSetCfg.emissiveTextureId = material.emissiveTexture.texture._textureId;\n }\n // const alphaMode = material.alphaMode;\n // switch (alphaMode) {\n // case \"NORMAL_OPAQUE\":\n // materialCfg.alphaMode = \"opaque\";\n // break;\n // case \"MASK\":\n // materialCfg.alphaMode = \"mask\";\n // break;\n // case \"BLEND\":\n // materialCfg.alphaMode = \"blend\";\n // break;\n // default:\n // }\n // const alphaCutoff = material.alphaCutoff;\n // if (alphaCutoff !== undefined) {\n // materialCfg.alphaCutoff = alphaCutoff;\n // }\n const metallicPBR = material.pbrMetallicRoughness;\n if (material.pbrMetallicRoughness) {\n const pbrMetallicRoughness = material.pbrMetallicRoughness;\n const baseColorTexture = pbrMetallicRoughness.baseColorTexture || pbrMetallicRoughness.colorTexture;\n if (baseColorTexture) {\n if (baseColorTexture.texture) {\n textureSetCfg.colorTextureId = baseColorTexture.texture._textureId;\n } else {\n textureSetCfg.colorTextureId = ctx.gltfData.textures[baseColorTexture.index]._textureId;\n }\n }\n if (metallicPBR.metallicRoughnessTexture) {\n textureSetCfg.metallicRoughnessTextureId = metallicPBR.metallicRoughnessTexture.texture._textureId;\n }\n }\n const extensions = material.extensions;\n if (extensions) {\n const specularPBR = extensions[\"KHR_materials_pbrSpecularGlossiness\"];\n if (specularPBR) {\n const specularTexture = specularPBR.specularTexture;\n if (specularTexture !== null && specularTexture !== undefined) {\n // textureSetCfg.colorTextureId = ctx.gltfData.textures[specularColorTexture.index]._textureId;\n }\n const specularColorTexture = specularPBR.specularColorTexture;\n if (specularColorTexture !== null && specularColorTexture !== undefined) {\n textureSetCfg.colorTextureId = ctx.gltfData.textures[specularColorTexture.index]._textureId;\n }\n }\n }\n if (textureSetCfg.normalTextureId !== undefined ||\n textureSetCfg.occlusionTextureId !== undefined ||\n textureSetCfg.emissiveTextureId !== undefined ||\n textureSetCfg.colorTextureId !== undefined ||\n textureSetCfg.metallicRoughnessTextureId !== undefined) {\n textureSetCfg.textureSetId = `textureSet-${ctx.nextId++};`\n ctx.xktModel.createTextureSet(textureSetCfg);\n ctx.stats.numTextureSets++;\n return textureSetCfg.textureSetId;\n }\n return null;\n}\n\nfunction parseMaterialAttributes(ctx, material) { // Substitute RGBA for material, to use fast flat shading instead\n const extensions = material.extensions;\n const materialAttributes = {\n color: new Float32Array([1, 1, 1, 1]),\n opacity: 1,\n metallic: 0,\n roughness: 1\n };\n if (extensions) {\n const specularPBR = extensions[\"KHR_materials_pbrSpecularGlossiness\"];\n if (specularPBR) {\n const diffuseFactor = specularPBR.diffuseFactor;\n if (diffuseFactor !== null && diffuseFactor !== undefined) {\n materialAttributes.color.set(diffuseFactor);\n }\n }\n const common = extensions[\"KHR_materials_common\"];\n if (common) {\n const technique = common.technique;\n const values = common.values || {};\n const blinn = technique === \"BLINN\";\n const phong = technique === \"PHONG\";\n const lambert = technique === \"LAMBERT\";\n const diffuse = values.diffuse;\n if (diffuse && (blinn || phong || lambert)) {\n if (!utils.isString(diffuse)) {\n materialAttributes.color.set(diffuse);\n }\n }\n const transparency = values.transparency;\n if (transparency !== null && transparency !== undefined) {\n materialAttributes.opacity = transparency;\n }\n const transparent = values.transparent;\n if (transparent !== null && transparent !== undefined) {\n materialAttributes.opacity = transparent;\n }\n }\n }\n const metallicPBR = material.pbrMetallicRoughness;\n if (metallicPBR) {\n const baseColorFactor = metallicPBR.baseColorFactor;\n if (baseColorFactor) {\n materialAttributes.color[0] = baseColorFactor[0];\n materialAttributes.color[1] = baseColorFactor[1];\n materialAttributes.color[2] = baseColorFactor[2];\n materialAttributes.opacity = baseColorFactor[3];\n }\n const metallicFactor = metallicPBR.metallicFactor;\n if (metallicFactor !== null && metallicFactor !== undefined) {\n materialAttributes.metallic = metallicFactor;\n }\n const roughnessFactor = metallicPBR.roughnessFactor;\n if (roughnessFactor !== null && roughnessFactor !== undefined) {\n materialAttributes.roughness = roughnessFactor;\n }\n }\n return materialAttributes;\n}\n\nfunction parseDefaultScene(ctx) {\n const gltfData = ctx.gltfData;\n const scene = gltfData.scene || gltfData.scenes[0];\n if (!scene) {\n ctx.error(\"glTF has no default scene\");\n return;\n }\n parseScene(ctx, scene);\n}\n\nfunction parseScene(ctx, scene) {\n const nodes = scene.nodes;\n if (!nodes) {\n return;\n }\n for (let i = 0, len = nodes.length; i < len; i++) {\n const node = nodes[i];\n countMeshUsage(ctx, node);\n }\n for (let i = 0, len = nodes.length; i < len; i++) {\n const node = nodes[i];\n parseNode(ctx, node, 0, null);\n }\n}\n\nfunction countMeshUsage(ctx, node) {\n const mesh = node.mesh;\n if (mesh) {\n mesh.instances = mesh.instances ? mesh.instances + 1 : 1;\n }\n if (node.children) {\n const children = node.children;\n for (let i = 0, len = children.length; i < len; i++) {\n const childNode = children[i];\n if (!childNode) {\n ctx.error(\"Node not found: \" + i);\n continue;\n }\n countMeshUsage(ctx, childNode);\n }\n }\n}\n\nconst deferredMeshIds = [];\n\nfunction parseNode(ctx, node, depth, matrix) {\n\n const xktModel = ctx.xktModel;\n\n // Pre-order visit scene node\n\n let localMatrix;\n if (node.matrix) {\n localMatrix = node.matrix;\n if (matrix) {\n matrix = math.mulMat4(matrix, localMatrix, math.mat4());\n } else {\n matrix = localMatrix;\n }\n }\n if (node.translation) {\n localMatrix = math.translationMat4v(node.translation);\n if (matrix) {\n matrix = math.mulMat4(matrix, localMatrix, math.mat4());\n } else {\n matrix = localMatrix;\n }\n }\n if (node.rotation) {\n localMatrix = math.quaternionToMat4(node.rotation);\n if (matrix) {\n matrix = math.mulMat4(matrix, localMatrix, math.mat4());\n } else {\n matrix = localMatrix;\n }\n }\n if (node.scale) {\n localMatrix = math.scalingMat4v(node.scale);\n if (matrix) {\n matrix = math.mulMat4(matrix, localMatrix, math.mat4());\n } else {\n matrix = localMatrix;\n }\n }\n\n if (node.mesh) {\n\n const mesh = node.mesh;\n const numPrimitives = mesh.primitives.length;\n\n if (numPrimitives > 0) {\n for (let i = 0; i < numPrimitives; i++) {\n const primitive = mesh.primitives[i];\n if (!primitive._xktGeometryId) {\n const xktGeometryId = \"geometry-\" + ctx.nextId++;\n const geometryCfg = {\n geometryId: xktGeometryId\n };\n switch (primitive.mode) {\n case 0: // POINTS\n geometryCfg.primitiveType = \"points\";\n break;\n case 1: // LINES\n geometryCfg.primitiveType = \"lines\";\n break;\n case 2: // LINE_LOOP\n geometryCfg.primitiveType = \"line-loop\";\n break;\n case 3: // LINE_STRIP\n geometryCfg.primitiveType = \"line-strip\";\n break;\n case 4: // TRIANGLES\n geometryCfg.primitiveType = \"triangles\";\n break;\n case 5: // TRIANGLE_STRIP\n geometryCfg.primitiveType = \"triangle-strip\";\n break;\n case 6: // TRIANGLE_FAN\n geometryCfg.primitiveType = \"triangle-fan\";\n break;\n default:\n geometryCfg.primitiveType = \"triangles\";\n }\n const POSITION = primitive.attributes.POSITION;\n if (!POSITION) {\n continue;\n }\n geometryCfg.positions = primitive.attributes.POSITION.value;\n ctx.stats.numVertices += geometryCfg.positions.length / 3;\n if (ctx.includeNormals) {\n if (primitive.attributes.NORMAL) {\n geometryCfg.normals = primitive.attributes.NORMAL.value;\n ctx.stats.numNormals += geometryCfg.normals.length / 3;\n }\n }\n if (primitive.attributes.COLOR_0) {\n geometryCfg.colorsCompressed = primitive.attributes.COLOR_0.value;\n }\n if (ctx.includeTextures) {\n if (primitive.attributes.TEXCOORD_0) {\n geometryCfg.uvs = primitive.attributes.TEXCOORD_0.value;\n ctx.stats.numUVs += geometryCfg.uvs.length / 2;\n }\n }\n if (primitive.indices) {\n geometryCfg.indices = primitive.indices.value;\n if (primitive.mode === 4) {\n ctx.stats.numTriangles += geometryCfg.indices.length / 3;\n }\n }\n xktModel.createGeometry(geometryCfg);\n primitive._xktGeometryId = xktGeometryId;\n ctx.stats.numGeometries++;\n }\n\n const xktMeshId = ctx.nextId++;\n const meshCfg = {\n meshId: xktMeshId,\n geometryId: primitive._xktGeometryId,\n matrix: matrix ? matrix.slice() : math.identityMat4()\n };\n const material = primitive.material;\n if (material) {\n meshCfg.textureSetId = material._textureSetId;\n meshCfg.color = material._attributes.color;\n meshCfg.opacity = material._attributes.opacity;\n meshCfg.metallic = material._attributes.metallic;\n meshCfg.roughness = material._attributes.roughness;\n } else {\n meshCfg.color = [1.0, 1.0, 1.0];\n meshCfg.opacity = 1.0;\n }\n xktModel.createMesh(meshCfg);\n deferredMeshIds.push(xktMeshId);\n }\n }\n }\n\n // Visit child scene nodes\n\n if (node.children) {\n const children = node.children;\n for (let i = 0, len = children.length; i < len; i++) {\n const childNode = children[i];\n parseNode(ctx, childNode, depth + 1, matrix);\n }\n }\n\n // Post-order visit scene node\n\n const nodeName = node.name;\n if (((nodeName !== undefined && nodeName !== null) || depth === 0) && deferredMeshIds.length > 0) {\n if (nodeName === undefined || nodeName === null) {\n ctx.log(`Warning: 'name' properties not found on glTF scene nodes - will randomly-generate object IDs in XKT`);\n }\n let xktEntityId = nodeName; // Fall back on generated ID when `name` not found on glTF scene node(s)\n if (!!xktEntityId && xktModel.entities[xktEntityId]) {\n ctx.log(`Warning: Two or more glTF nodes found with same 'name' attribute: '${nodeName} - will randomly-generating an object ID in XKT`);\n }\n while (!xktEntityId || xktModel.entities[xktEntityId]) {\n xktEntityId = \"entity-\" + ctx.nextId++;\n }\n if (ctx.metaModelCorrections) {\n // Merging meshes into XKTObjects that map to metaobjects\n const rootMetaObject = ctx.metaModelCorrections.eachChildRoot[xktEntityId];\n if (rootMetaObject) {\n const rootMetaObjectStats = ctx.metaModelCorrections.eachRootStats[rootMetaObject.id];\n rootMetaObjectStats.countChildren++;\n if (rootMetaObjectStats.countChildren >= rootMetaObjectStats.numChildren) {\n xktModel.createEntity({\n entityId: rootMetaObject.id,\n meshIds: deferredMeshIds\n });\n ctx.stats.numObjects++;\n deferredMeshIds.length = 0;\n }\n } else {\n const metaObject = ctx.metaModelCorrections.metaObjectsMap[xktEntityId];\n if (metaObject) {\n xktModel.createEntity({\n entityId: xktEntityId,\n meshIds: deferredMeshIds\n });\n ctx.stats.numObjects++;\n deferredMeshIds.length = 0;\n }\n }\n } else {\n // Create an XKTObject from the meshes at each named glTF node, don't care about metaobjects\n xktModel.createEntity({\n entityId: xktEntityId,\n meshIds: deferredMeshIds\n });\n ctx.stats.numObjects++;\n deferredMeshIds.length = 0;\n }\n }\n}\n\nexport {parseGLTFIntoXKTModel};\n","import {utils} from \"../XKTModel/lib/utils.js\";\nimport {math} from \"../lib/math.js\";\n\nconst atob2 = (typeof atob !== 'undefined') ? atob : a => Buffer.from(a, 'base64').toString('binary');\n\nconst WEBGL_COMPONENT_TYPES = {\n 5120: Int8Array,\n 5121: Uint8Array,\n 5122: Int16Array,\n 5123: Uint16Array,\n 5125: Uint32Array,\n 5126: Float32Array\n};\n\nconst WEBGL_TYPE_SIZES = {\n 'SCALAR': 1,\n 'VEC2': 2,\n 'VEC3': 3,\n 'VEC4': 4,\n 'MAT2': 4,\n 'MAT3': 9,\n 'MAT4': 16\n};\n\n/**\n * @desc Parses glTF JSON into an {@link XKTModel}, without ````.glb```` and textures.\n *\n * * Lightweight JSON-based glTF parser which ignores textures\n * * For texture and ````.glb```` support, see {@link parseGLTFIntoXKTModel}\n *\n * ## Usage\n *\n * In the example below we'll create an {@link XKTModel}, then load a glTF model into it.\n *\n * ````javascript\n * utils.loadJSON(\"./models/gltf/duplex/scene.gltf\", async (data) => {\n *\n * const xktModel = new XKTModel();\n *\n * parseGLTFJSONIntoXKTModel({\n * data,\n * xktModel,\n * log: (msg) => { console.log(msg); }\n * }).then(()=>{\n * xktModel.finalize();\n * },\n * (msg) => {\n * console.error(msg);\n * });\n * });\n * ````\n *\n * @param {Object} params Parsing parameters.\n * @param {Object} params.data The glTF JSON.\n * @param {Object} [params.metaModelData] Metamodel JSON. If this is provided, then parsing is able to ensure that the XKTObjects it creates will fit the metadata properly.\n * @param {XKTModel} params.xktModel XKTModel to parse into.\n * @param {Boolean} [params.includeNormals=false] Whether to parse normals. When false, the parser will ignore the glTF\n * geometry normals, and the glTF data will rely on the xeokit ````Viewer```` to automatically generate them. This has\n * the limitation that the normals will be face-aligned, and therefore the ````Viewer```` will only be able to render\n * a flat-shaded representation of the glTF.\n * @param {Boolean} [params.reuseGeometries=true] When true, the parser will enable geometry reuse within the XKTModel. When false,\n * will automatically \"expand\" all reused geometries into duplicate copies. This has the drawback of increasing the XKT\n * file size (~10-30% for typical models), but can make the model more responsive in the xeokit Viewer, especially if the model\n * has excessive geometry reuse. An example of excessive geometry reuse would be if we have 4000 geometries that are\n * shared amongst 2000 objects, ie. a large number of geometries with a low amount of reuse, which can present a\n * pathological performance case for xeokit's underlying graphics APIs (WebGL, WebGPU etc).\n * @param {function} [params.getAttachment] Callback through which to fetch attachments, if the glTF has them.\n * @param {Object} [params.stats] Collects statistics.\n * @param {function} [params.log] Logging callback.\n * @returns {Promise}\n */\nfunction parseGLTFJSONIntoXKTModel({\n data,\n xktModel,\n metaModelData,\n includeNormals,\n reuseGeometries,\n getAttachment,\n stats = {},\n log\n }) {\n\n if (log) {\n log(\"Using parser: parseGLTFJSONIntoXKTModel\");\n }\n\n return new Promise(function (resolve, reject) {\n\n if (!data) {\n reject(\"Argument expected: data\");\n return;\n }\n\n if (!xktModel) {\n reject(\"Argument expected: xktModel\");\n return;\n }\n\n stats.sourceFormat = \"glTF\";\n stats.schemaVersion = \"2.0\";\n stats.title = \"\";\n stats.author = \"\";\n stats.created = \"\";\n stats.numTriangles = 0;\n stats.numVertices = 0;\n stats.numNormals = 0;\n stats.numObjects = 0;\n stats.numGeometries = 0;\n\n const ctx = {\n gltf: data,\n metaModelCorrections: metaModelData ? getMetaModelCorrections(metaModelData) : null,\n getAttachment: getAttachment || (() => {\n throw new Error('You must define getAttachment() method to convert glTF with external resources')\n }),\n log: (log || function (msg) {\n }),\n xktModel,\n includeNormals,\n createXKTGeometryIds: {},\n nextMeshId: 0,\n reuseGeometries: (reuseGeometries !== false),\n stats\n };\n\n ctx.log(`Parsing normals: ${ctx.includeNormals ? \"enabled\" : \"disabled\"}`);\n\n parseBuffers(ctx).then(() => {\n\n parseBufferViews(ctx);\n freeBuffers(ctx);\n parseMaterials(ctx);\n parseDefaultScene(ctx);\n\n resolve();\n\n }, (errMsg) => {\n reject(errMsg);\n });\n });\n}\n\nfunction getMetaModelCorrections(metaModelData) {\n const eachRootStats = {};\n const eachChildRoot = {};\n const metaObjects = metaModelData.metaObjects || [];\n const metaObjectsMap = {};\n for (let i = 0, len = metaObjects.length; i < len; i++) {\n const metaObject = metaObjects[i];\n metaObjectsMap[metaObject.id] = metaObject;\n }\n for (let i = 0, len = metaObjects.length; i < len; i++) {\n const metaObject = metaObjects[i];\n if (metaObject.parent !== undefined && metaObject.parent !== null) {\n const metaObjectParent = metaObjectsMap[metaObject.parent];\n if (metaObject.type === metaObjectParent.type) {\n let rootMetaObject = metaObjectParent;\n while (rootMetaObject.parent && metaObjectsMap[rootMetaObject.parent].type === rootMetaObject.type) {\n rootMetaObject = metaObjectsMap[rootMetaObject.parent];\n }\n const rootStats = eachRootStats[rootMetaObject.id] || (eachRootStats[rootMetaObject.id] = {\n numChildren: 0,\n countChildren: 0\n });\n rootStats.numChildren++;\n eachChildRoot[metaObject.id] = rootMetaObject;\n } else {\n\n }\n }\n }\n const metaModelCorrections = {\n metaObjectsMap,\n eachRootStats,\n eachChildRoot\n };\n return metaModelCorrections;\n}\n\nfunction parseBuffers(ctx) { // Parses geometry buffers into temporary \"_buffer\" Unit8Array properties on the glTF \"buffer\" elements\n const buffers = ctx.gltf.buffers;\n if (buffers) {\n return Promise.all(buffers.map(buffer => parseBuffer(ctx, buffer)));\n } else {\n return new Promise(function (resolve, reject) {\n resolve();\n });\n }\n}\n\nfunction parseBuffer(ctx, bufferInfo) {\n return new Promise(function (resolve, reject) {\n // Allow a shortcut where the glTF buffer is \"enrichened\" with direct\n // access to the data-arrayBuffer, w/out needing to either:\n // - read the file indicated by the \".uri\" component of the buffer\n // - base64-decode the encoded data in the \".uri\" component\n if (bufferInfo._arrayBuffer) {\n bufferInfo._buffer = bufferInfo._arrayBuffer;\n resolve(bufferInfo);\n return;\n }\n // Otherwise, proceed with \"standard-glTF\" .uri component.\n const uri = bufferInfo.uri;\n if (!uri) {\n reject('gltf/handleBuffer missing uri in ' + JSON.stringify(bufferInfo));\n return;\n }\n parseArrayBuffer(ctx, uri).then((arrayBuffer) => {\n bufferInfo._buffer = arrayBuffer;\n resolve(arrayBuffer);\n }, (errMsg) => {\n reject(errMsg);\n })\n });\n}\n\nfunction parseArrayBuffer(ctx, uri) {\n return new Promise(function (resolve, reject) {\n const dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/; // Check for data: URI\n const dataUriRegexResult = uri.match(dataUriRegex);\n if (dataUriRegexResult) { // Safari can't handle data URIs through XMLHttpRequest\n const isBase64 = !!dataUriRegexResult[2];\n let data = dataUriRegexResult[3];\n data = decodeURIComponent(data);\n if (isBase64) {\n data = atob2(data);\n }\n const buffer = new ArrayBuffer(data.length);\n const view = new Uint8Array(buffer);\n for (let i = 0; i < data.length; i++) {\n view[i] = data.charCodeAt(i);\n }\n resolve(buffer);\n } else { // Uri is a path to a file\n ctx.getAttachment(uri).then(\n (arrayBuffer) => {\n resolve(arrayBuffer);\n },\n (errMsg) => {\n reject(errMsg);\n });\n }\n });\n}\n\nfunction parseBufferViews(ctx) { // Parses our temporary \"_buffer\" properties into \"_buffer\" properties on glTF \"bufferView\" elements\n const bufferViewsInfo = ctx.gltf.bufferViews;\n if (bufferViewsInfo) {\n for (let i = 0, len = bufferViewsInfo.length; i < len; i++) {\n parseBufferView(ctx, bufferViewsInfo[i]);\n }\n }\n}\n\nfunction parseBufferView(ctx, bufferViewInfo) {\n const buffer = ctx.gltf.buffers[bufferViewInfo.buffer];\n bufferViewInfo._typedArray = null;\n const byteLength = bufferViewInfo.byteLength || 0;\n const byteOffset = bufferViewInfo.byteOffset || 0;\n bufferViewInfo._buffer = buffer._buffer.slice(byteOffset, byteOffset + byteLength);\n}\n\nfunction freeBuffers(ctx) { // Deletes the \"_buffer\" properties from the glTF \"buffer\" elements, to save memory\n const buffers = ctx.gltf.buffers;\n if (buffers) {\n for (let i = 0, len = buffers.length; i < len; i++) {\n buffers[i]._buffer = null;\n }\n }\n}\n\nfunction parseMaterials(ctx) {\n const materialsInfo = ctx.gltf.materials;\n if (materialsInfo) {\n for (let i = 0, len = materialsInfo.length; i < len; i++) {\n const materialInfo = materialsInfo[i];\n const material = parseMaterial(ctx, materialInfo);\n materialInfo._materialData = material;\n }\n }\n}\n\nfunction parseMaterial(ctx, materialInfo) { // Attempts to extract an RGBA color for a glTF material\n const material = {\n color: new Float32Array([1, 1, 1]),\n opacity: 1.0,\n metallic: 0,\n roughness: 1\n };\n const extensions = materialInfo.extensions;\n if (extensions) {\n const specularPBR = extensions[\"KHR_materials_pbrSpecularGlossiness\"];\n if (specularPBR) {\n const diffuseFactor = specularPBR.diffuseFactor;\n if (diffuseFactor !== null && diffuseFactor !== undefined) {\n material.color[0] = diffuseFactor[0];\n material.color[1] = diffuseFactor[1];\n material.color[2] = diffuseFactor[2];\n }\n }\n const common = extensions[\"KHR_materials_common\"];\n if (common) {\n const technique = common.technique;\n const values = common.values || {};\n const blinn = technique === \"BLINN\";\n const phong = technique === \"PHONG\";\n const lambert = technique === \"LAMBERT\";\n const diffuse = values.diffuse;\n if (diffuse && (blinn || phong || lambert)) {\n if (!utils.isString(diffuse)) {\n material.color[0] = diffuse[0];\n material.color[1] = diffuse[1];\n material.color[2] = diffuse[2];\n }\n }\n const transparency = values.transparency;\n if (transparency !== null && transparency !== undefined) {\n material.opacity = transparency;\n }\n const transparent = values.transparent;\n if (transparent !== null && transparent !== undefined) {\n material.opacity = transparent;\n }\n }\n }\n const metallicPBR = materialInfo.pbrMetallicRoughness;\n if (metallicPBR) {\n const baseColorFactor = metallicPBR.baseColorFactor;\n if (baseColorFactor) {\n material.color[0] = baseColorFactor[0];\n material.color[1] = baseColorFactor[1];\n material.color[2] = baseColorFactor[2];\n material.opacity = baseColorFactor[3];\n }\n const metallicFactor = metallicPBR.metallicFactor;\n if (metallicFactor !== null && metallicFactor !== undefined) {\n material.metallic = metallicFactor;\n }\n const roughnessFactor = metallicPBR.roughnessFactor;\n if (roughnessFactor !== null && roughnessFactor !== undefined) {\n material.roughness = roughnessFactor;\n }\n }\n return material;\n}\n\nfunction parseDefaultScene(ctx) {\n const scene = ctx.gltf.scene || 0;\n const defaultSceneInfo = ctx.gltf.scenes[scene];\n if (!defaultSceneInfo) {\n throw new Error(\"glTF has no default scene\");\n }\n parseScene(ctx, defaultSceneInfo);\n}\n\n\nfunction parseScene(ctx, sceneInfo) {\n const nodes = sceneInfo.nodes;\n if (!nodes) {\n return;\n }\n for (let i = 0, len = nodes.length; i < len; i++) {\n const glTFNode = ctx.gltf.nodes[nodes[i]];\n if (glTFNode) {\n parseNode(ctx, glTFNode, 0, null);\n }\n }\n}\n\nlet deferredMeshIds = [];\n\nfunction parseNode(ctx, glTFNode, depth, matrix) {\n\n const gltf = ctx.gltf;\n const xktModel = ctx.xktModel;\n\n let localMatrix;\n\n if (glTFNode.matrix) {\n localMatrix = glTFNode.matrix;\n if (matrix) {\n matrix = math.mulMat4(matrix, localMatrix, math.mat4());\n } else {\n matrix = localMatrix;\n }\n }\n\n if (glTFNode.translation) {\n localMatrix = math.translationMat4v(glTFNode.translation);\n if (matrix) {\n matrix = math.mulMat4(matrix, localMatrix, localMatrix);\n } else {\n matrix = localMatrix;\n }\n }\n\n if (glTFNode.rotation) {\n localMatrix = math.quaternionToMat4(glTFNode.rotation);\n if (matrix) {\n matrix = math.mulMat4(matrix, localMatrix, localMatrix);\n } else {\n matrix = localMatrix;\n }\n }\n\n if (glTFNode.scale) {\n localMatrix = math.scalingMat4v(glTFNode.scale);\n if (matrix) {\n matrix = math.mulMat4(matrix, localMatrix, localMatrix);\n } else {\n matrix = localMatrix;\n }\n }\n\n const gltfMeshId = glTFNode.mesh;\n\n if (gltfMeshId !== undefined) {\n\n const meshInfo = gltf.meshes[gltfMeshId];\n\n if (meshInfo) {\n\n const numPrimitivesInMesh = meshInfo.primitives.length;\n\n if (numPrimitivesInMesh > 0) {\n\n for (let i = 0; i < numPrimitivesInMesh; i++) {\n\n const primitiveInfo = meshInfo.primitives[i];\n\n const geometryHash = createPrimitiveGeometryHash(primitiveInfo);\n\n let xktGeometryId = ctx.createXKTGeometryIds[geometryHash];\n\n if ((!ctx.reuseGeometries) || !xktGeometryId) {\n\n xktGeometryId = \"geometry-\" + ctx.nextMeshId++\n\n const geometryArrays = {};\n\n parsePrimitiveGeometry(ctx, primitiveInfo, geometryArrays);\n\n const colors = geometryArrays.colors;\n\n let colorsCompressed;\n\n if (geometryArrays.colors) {\n colorsCompressed = [];\n for (let j = 0, lenj = colors.length; j < lenj; j += 4) {\n colorsCompressed.push(colors[j + 0]);\n colorsCompressed.push(colors[j + 1]);\n colorsCompressed.push(colors[j + 2]);\n colorsCompressed.push(255);\n }\n }\n\n xktModel.createGeometry({\n geometryId: xktGeometryId,\n primitiveType: geometryArrays.primitive,\n positions: geometryArrays.positions,\n normals: ctx.includeNormals ? geometryArrays.normals : null,\n colorsCompressed: colorsCompressed,\n indices: geometryArrays.indices\n });\n\n ctx.stats.numGeometries++;\n ctx.stats.numVertices += geometryArrays.positions ? geometryArrays.positions.length / 3 : 0;\n ctx.stats.numNormals += (ctx.includeNormals && geometryArrays.normals) ? geometryArrays.normals.length / 3 : 0;\n ctx.stats.numTriangles += geometryArrays.indices ? geometryArrays.indices.length / 3 : 0;\n\n ctx.createXKTGeometryIds[geometryHash] = xktGeometryId;\n } else {\n// Geometry reused\n }\n\n const materialIndex = primitiveInfo.material;\n const materialInfo = (materialIndex !== null && materialIndex !== undefined) ? gltf.materials[materialIndex] : null;\n const color = materialInfo ? materialInfo._materialData.color : new Float32Array([1.0, 1.0, 1.0, 1.0]);\n const opacity = materialInfo ? materialInfo._materialData.opacity : 1.0;\n const metallic = materialInfo ? materialInfo._materialData.metallic : 0.0;\n const roughness = materialInfo ? materialInfo._materialData.roughness : 1.0;\n\n const xktMeshId = \"mesh-\" + ctx.nextMeshId++;\n\n xktModel.createMesh({\n meshId: xktMeshId,\n geometryId: xktGeometryId,\n matrix: matrix ? matrix.slice() : math.identityMat4(),\n color: color,\n opacity: opacity,\n metallic: metallic,\n roughness: roughness\n });\n\n deferredMeshIds.push(xktMeshId);\n }\n }\n }\n }\n\n\n if (glTFNode.children) {\n const children = glTFNode.children;\n for (let i = 0, len = children.length; i < len; i++) {\n const childNodeIdx = children[i];\n const childGLTFNode = gltf.nodes[childNodeIdx];\n if (!childGLTFNode) {\n console.warn('Node not found: ' + i);\n continue;\n }\n parseNode(ctx, childGLTFNode, depth + 1, matrix);\n }\n }\n\n // Post-order visit scene node\n\n const nodeName = glTFNode.name;\n if (((nodeName !== undefined && nodeName !== null) || depth === 0) && deferredMeshIds.length > 0) {\n if (nodeName === undefined || nodeName === null) {\n ctx.log(`[parseGLTFJSONIntoXKTModel] Warning: 'name' properties not found on glTF scene nodes - will randomly-generate object IDs in XKT`);\n }\n let xktEntityId = nodeName; // Fall back on generated ID when `name` not found on glTF scene node(s)\n if (xktEntityId === undefined || xktEntityId === null) {\n if (xktModel.entities[xktEntityId]) {\n ctx.error(\"Two or more glTF nodes found with same 'name' attribute: '\" + nodeName + \"'\");\n }\n while (!xktEntityId || xktModel.entities[xktEntityId]) {\n xktEntityId = \"entity-\" + ctx.nextId++;\n }\n }\n if (ctx.metaModelCorrections) { // Merging meshes into XKTObjects that map to metaobjects\n const rootMetaObject = ctx.metaModelCorrections.eachChildRoot[xktEntityId];\n if (rootMetaObject) {\n const rootMetaObjectStats = ctx.metaModelCorrections.eachRootStats[rootMetaObject.id];\n rootMetaObjectStats.countChildren++;\n if (rootMetaObjectStats.countChildren >= rootMetaObjectStats.numChildren) {\n xktModel.createEntity({\n entityId: rootMetaObject.id,\n meshIds: deferredMeshIds\n });\n ctx.stats.numObjects++;\n deferredMeshIds = [];\n }\n } else {\n const metaObject = ctx.metaModelCorrections.metaObjectsMap[xktEntityId];\n if (metaObject) {\n xktModel.createEntity({\n entityId: xktEntityId,\n meshIds: deferredMeshIds\n });\n ctx.stats.numObjects++;\n deferredMeshIds = [];\n }\n }\n } else { // Create an XKTObject from the meshes at each named glTF node, don't care about metaobjects\n xktModel.createEntity({\n entityId: xktEntityId,\n meshIds: deferredMeshIds\n });\n ctx.stats.numObjects++;\n deferredMeshIds = [];\n }\n }\n}\n\nfunction createPrimitiveGeometryHash(primitiveInfo) {\n const attributes = primitiveInfo.attributes;\n if (!attributes) {\n return \"empty\";\n }\n const mode = primitiveInfo.mode;\n const material = primitiveInfo.material;\n const indices = primitiveInfo.indices;\n const positions = primitiveInfo.attributes.POSITION;\n const normals = primitiveInfo.attributes.NORMAL;\n const colors = primitiveInfo.attributes.COLOR_0;\n const uv = primitiveInfo.attributes.TEXCOORD_0;\n return [\n mode,\n // material,\n (indices !== null && indices !== undefined) ? indices : \"-\",\n (positions !== null && positions !== undefined) ? positions : \"-\",\n (normals !== null && normals !== undefined) ? normals : \"-\",\n (colors !== null && colors !== undefined) ? colors : \"-\",\n (uv !== null && uv !== undefined) ? uv : \"-\"\n ].join(\";\");\n}\n\nfunction parsePrimitiveGeometry(ctx, primitiveInfo, geometryArrays) {\n const attributes = primitiveInfo.attributes;\n if (!attributes) {\n return;\n }\n switch (primitiveInfo.mode) {\n case 0: // POINTS\n geometryArrays.primitive = \"points\";\n break;\n case 1: // LINES\n geometryArrays.primitive = \"lines\";\n break;\n case 2: // LINE_LOOP\n // TODO: convert\n geometryArrays.primitive = \"lines\";\n break;\n case 3: // LINE_STRIP\n // TODO: convert\n geometryArrays.primitive = \"lines\";\n break;\n case 4: // TRIANGLES\n geometryArrays.primitive = \"triangles\";\n break;\n case 5: // TRIANGLE_STRIP\n // TODO: convert\n console.log(\"TRIANGLE_STRIP\");\n geometryArrays.primitive = \"triangles\";\n break;\n case 6: // TRIANGLE_FAN\n // TODO: convert\n console.log(\"TRIANGLE_FAN\");\n geometryArrays.primitive = \"triangles\";\n break;\n default:\n geometryArrays.primitive = \"triangles\";\n }\n const accessors = ctx.gltf.accessors;\n const indicesIndex = primitiveInfo.indices;\n if (indicesIndex !== null && indicesIndex !== undefined) {\n const accessorInfo = accessors[indicesIndex];\n geometryArrays.indices = parseAccessorTypedArray(ctx, accessorInfo);\n }\n const positionsIndex = attributes.POSITION;\n if (positionsIndex !== null && positionsIndex !== undefined) {\n const accessorInfo = accessors[positionsIndex];\n geometryArrays.positions = parseAccessorTypedArray(ctx, accessorInfo);\n }\n const normalsIndex = attributes.NORMAL;\n if (normalsIndex !== null && normalsIndex !== undefined) {\n const accessorInfo = accessors[normalsIndex];\n geometryArrays.normals = parseAccessorTypedArray(ctx, accessorInfo);\n }\n const colorsIndex = attributes.COLOR_0;\n if (colorsIndex !== null && colorsIndex !== undefined) {\n const accessorInfo = accessors[colorsIndex];\n geometryArrays.colors = parseAccessorTypedArray(ctx, accessorInfo);\n }\n}\n\nfunction parseAccessorTypedArray(ctx, accessorInfo) {\n const bufferView = ctx.gltf.bufferViews[accessorInfo.bufferView];\n const itemSize = WEBGL_TYPE_SIZES[accessorInfo.type];\n const TypedArray = WEBGL_COMPONENT_TYPES[accessorInfo.componentType];\n const elementBytes = TypedArray.BYTES_PER_ELEMENT; // For VEC3: itemSize is 3, elementBytes is 4, itemBytes is 12.\n const itemBytes = elementBytes * itemSize;\n if (accessorInfo.byteStride && accessorInfo.byteStride !== itemBytes) { // The buffer is not interleaved if the stride is the item size in bytes.\n throw new Error(\"interleaved buffer!\"); // TODO\n } else {\n return new TypedArray(bufferView._buffer, accessorInfo.byteOffset || 0, accessorInfo.count * itemSize);\n }\n}\n\nexport {parseGLTFJSONIntoXKTModel};\n","/**\n * @desc Parses IFC STEP file data into an {@link XKTModel}.\n *\n * This function uses [web-ifc](https://github.com/tomvandig/web-ifc) to parse the IFC, which relies on a\n * WASM file to do the parsing.\n *\n * Depending on how we use this function, we may need to provide it with a path to the directory where that WASM file is stored.\n *\n * This function is tested with web-ifc version 0.0.34.\n *\n * ## Usage\n *\n * In the example below we'll create an {@link XKTModel}, then load an IFC model into it.\n *\n * ````javascript\n * import {XKTModel, parseIFCIntoXKTModel, writeXKTModelToArrayBuffer} from \"xeokit-convert.es.js\";\n *\n * import * as WebIFC from \"web-ifc-api.js\";\n *\n * utils.loadArraybuffer(\"rac_advanced_sample_project.ifc\", async (data) => {\n *\n * const xktModel = new XKTModel();\n *\n * parseIFCIntoXKTModel({\n * WebIFC,\n * data,\n * xktModel,\n * wasmPath: \"../dist/\",\n * autoNormals: true,\n * log: (msg) => { console.log(msg); }\n * }).then(()=>{\n * xktModel.finalize();\n * },\n * (msg) => {\n * console.error(msg);\n * });\n * });\n * ````\n *\n * @param {Object} params Parsing params.\n * @param {Object} params.WebIFC The WebIFC library. We pass this in as an external dependency, in order to give the\n * caller the choice of whether to use the Browser or NodeJS version.\n * @param {ArrayBuffer} [params.data] IFC file data.\n * @param {XKTModel} [params.xktModel] XKTModel to parse into.\n * @param {Boolean} [params.autoNormals=true] When true, the parser will ignore the IFC geometry normals, and the IFC\n * data will rely on the xeokit ````Viewer```` to automatically generate them. This has the limitation that the\n * normals will be face-aligned, and therefore the ````Viewer```` will only be able to render a flat-shaded representation\n * of the IFC model. This is ````true```` by default, because IFC models tend to look acceptable with flat-shading,\n * and we always want to minimize IFC model size wherever possible.\n * @param {String[]} [params.includeTypes] Option to only convert objects of these types.\n * @param {String[]} [params.excludeTypes] Option to never convert objects of these types.\n * @param {String} params.wasmPath Path to ````web-ifc.wasm````, required by this function.\n * @param {Object} [params.stats={}] Collects statistics.\n * @param {function} [params.log] Logging callback.\n * @returns {Promise} Resolves when IFC has been parsed.\n */\nfunction parseIFCIntoXKTModel({\n WebIFC,\n data,\n xktModel,\n autoNormals = true,\n includeTypes,\n excludeTypes,\n wasmPath,\n stats = {},\n log\n }) {\n\n if (log) {\n log(\"Using parser: parseIFCIntoXKTModel\");\n }\n\n return new Promise(function (resolve, reject) {\n\n if (!data) {\n reject(\"Argument expected: data\");\n return;\n }\n\n if (!xktModel) {\n reject(\"Argument expected: xktModel\");\n return;\n }\n\n if (!wasmPath) {\n reject(\"Argument expected: wasmPath\");\n return;\n }\n\n const ifcAPI = new WebIFC.IfcAPI();\n\n if (wasmPath) {\n ifcAPI.SetWasmPath(wasmPath);\n }\n\n ifcAPI.Init().then(() => {\n\n const dataArray = new Uint8Array(data);\n\n const modelID = ifcAPI.OpenModel(dataArray);\n\n stats.sourceFormat = \"IFC\";\n stats.schemaVersion = \"\";\n stats.title = \"\";\n stats.author = \"\";\n stats.created = \"\";\n stats.numMetaObjects = 0;\n stats.numPropertySets = 0;\n stats.numObjects = 0;\n stats.numGeometries = 0;\n stats.numTriangles = 0;\n stats.numVertices = 0;\n\n const ctx = {\n WebIFC,\n modelID,\n ifcAPI,\n xktModel,\n autoNormals,\n log: (log || function (msg) {\n }),\n nextId: 0,\n stats\n };\n\n if (includeTypes) {\n ctx.includeTypes = {};\n for (let i = 0, len = includeTypes.length; i < len; i++) {\n ctx.includeTypes[includeTypes[i]] = true;\n }\n }\n\n if (excludeTypes) {\n ctx.excludeTypes = {};\n for (let i = 0, len = excludeTypes.length; i < len; i++) {\n ctx.excludeTypes[excludeTypes[i]] = true;\n }\n }\n\n const lines = ctx.ifcAPI.GetLineIDsWithType(modelID, WebIFC.IFCPROJECT);\n const ifcProjectId = lines.get(0);\n const ifcProject = ctx.ifcAPI.GetLine(modelID, ifcProjectId);\n\n ctx.xktModel.schema = \"\";\n ctx.xktModel.modelId = \"\" + modelID;\n ctx.xktModel.projectId = \"\" + ifcProjectId;\n\n parseMetadata(ctx);\n parseGeometry(ctx);\n parsePropertySets(ctx);\n\n resolve();\n\n }).catch((e) => {\n\n reject(e);\n })\n });\n}\n\nfunction parsePropertySets(ctx) {\n\n const lines = ctx.ifcAPI.GetLineIDsWithType(ctx.modelID, ctx.WebIFC.IFCRELDEFINESBYPROPERTIES);\n\n for (let i = 0; i < lines.size(); i++) {\n\n let relID = lines.get(i);\n\n let rel = ctx.ifcAPI.GetLine(ctx.modelID, relID, true);\n\n if (rel) {\n\n const relatingPropertyDefinition = rel.RelatingPropertyDefinition;\n if (!relatingPropertyDefinition) {\n continue;\n }\n\n const propertySetId = relatingPropertyDefinition.GlobalId.value;\n\n const relatedObjects = rel.RelatedObjects;\n if (relatedObjects) {\n for (let i = 0, len = relatedObjects.length; i < len; i++) {\n const relatedObject = relatedObjects[i];\n const metaObjectId = relatedObject.GlobalId.value;\n const metaObject = ctx.xktModel.metaObjects[metaObjectId];\n if (metaObject) {\n if (!metaObject.propertySetIds) {\n metaObject.propertySetIds = [];\n }\n metaObject.propertySetIds.push(propertySetId);\n }\n }\n }\n\n const props = relatingPropertyDefinition.HasProperties;\n if (props && props.length > 0) {\n const propertySetType = \"Default\";\n const propertySetName = relatingPropertyDefinition.Name.value;\n const properties = [];\n for (let i = 0, len = props.length; i < len; i++) {\n const prop = props[i];\n const name = prop.Name;\n const nominalValue = prop.NominalValue;\n if (name && nominalValue) {\n const property = {\n name: name.value,\n type: nominalValue.type,\n value: nominalValue.value,\n valueType: nominalValue.valueType\n };\n if (prop.Description) {\n property.description = prop.Description.value;\n } else if (nominalValue.description) {\n property.description = nominalValue.description;\n }\n properties.push(property);\n }\n }\n ctx.xktModel.createPropertySet({propertySetId, propertySetType, propertySetName, properties});\n ctx.stats.numPropertySets++;\n }\n }\n }\n}\n\nfunction parseMetadata(ctx) {\n\n const lines = ctx.ifcAPI.GetLineIDsWithType(ctx.modelID, ctx.WebIFC.IFCPROJECT);\n const ifcProjectId = lines.get(0);\n const ifcProject = ctx.ifcAPI.GetLine(ctx.modelID, ifcProjectId);\n\n parseSpatialChildren(ctx, ifcProject);\n}\n\nfunction parseSpatialChildren(ctx, ifcElement, parentMetaObjectId) {\n\n const metaObjectType = ifcElement.__proto__.constructor.name;\n\n if (ctx.includeTypes && (!ctx.includeTypes[metaObjectType])) {\n return;\n }\n\n if (ctx.excludeTypes && ctx.excludeTypes[metaObjectType]) {\n return;\n }\n\n createMetaObject(ctx, ifcElement, parentMetaObjectId);\n\n const metaObjectId = ifcElement.GlobalId.value;\n\n parseRelatedItemsOfType(\n ctx,\n ifcElement.expressID,\n 'RelatingObject',\n 'RelatedObjects',\n ctx.WebIFC.IFCRELAGGREGATES,\n metaObjectId);\n\n parseRelatedItemsOfType(\n ctx,\n ifcElement.expressID,\n 'RelatingStructure',\n 'RelatedElements',\n ctx.WebIFC.IFCRELCONTAINEDINSPATIALSTRUCTURE,\n metaObjectId);\n}\n\nfunction createMetaObject(ctx, ifcElement, parentMetaObjectId) {\n\n const metaObjectId = ifcElement.GlobalId.value;\n const propertySetIds = null;\n const metaObjectType = ifcElement.__proto__.constructor.name;\n const metaObjectName = (ifcElement.Name && ifcElement.Name.value !== \"\") ? ifcElement.Name.value : metaObjectType;\n\n ctx.xktModel.createMetaObject({metaObjectId, propertySetIds, metaObjectType, metaObjectName, parentMetaObjectId});\n ctx.stats.numMetaObjects++;\n}\n\nfunction parseRelatedItemsOfType(ctx, id, relation, related, type, parentMetaObjectId) {\n\n const lines = ctx.ifcAPI.GetLineIDsWithType(ctx.modelID, type);\n\n for (let i = 0; i < lines.size(); i++) {\n\n const relID = lines.get(i);\n const rel = ctx.ifcAPI.GetLine(ctx.modelID, relID);\n const relatedItems = rel[relation];\n\n let foundElement = false;\n\n if (Array.isArray(relatedItems)) {\n const values = relatedItems.map((item) => item.value);\n foundElement = values.includes(id);\n\n } else {\n foundElement = (relatedItems.value === id);\n }\n\n if (foundElement) {\n\n const element = rel[related];\n\n if (!Array.isArray(element)) {\n\n const ifcElement = ctx.ifcAPI.GetLine(ctx.modelID, element.value);\n\n parseSpatialChildren(ctx, ifcElement, parentMetaObjectId);\n\n } else {\n\n element.forEach((element2) => {\n\n const ifcElement = ctx.ifcAPI.GetLine(ctx.modelID, element2.value);\n\n parseSpatialChildren(ctx, ifcElement, parentMetaObjectId);\n });\n }\n }\n }\n}\n\nfunction parseGeometry(ctx) {\n\n // Parses the geometry and materials in the IFC, creates\n // XKTEntity, XKTMesh and XKTGeometry components within the XKTModel.\n\n const flatMeshes = ctx.ifcAPI.LoadAllGeometry(ctx.modelID);\n\n for (let i = 0, len = flatMeshes.size(); i < len; i++) {\n const flatMesh = flatMeshes.get(i);\n createObject(ctx, flatMesh);\n }\n\n // LoadAllGeometry does not return IFCSpace meshes\n // here is a workaround\n\n const lines = ctx.ifcAPI.GetLineIDsWithType(ctx.modelID, ctx.WebIFC.IFCSPACE);\n for (let j = 0, len = lines.size(); j < len; j++) {\n const ifcSpaceId = lines.get(j);\n const flatMesh = ctx.ifcAPI.GetFlatMesh(ctx.modelID, ifcSpaceId);\n createObject(ctx, flatMesh);\n }\n}\n\nfunction createObject(ctx, flatMesh) {\n\n const flatMeshExpressID = flatMesh.expressID;\n const placedGeometries = flatMesh.geometries;\n\n const meshIds = [];\n\n const properties = ctx.ifcAPI.GetLine(ctx.modelID, flatMeshExpressID);\n const entityId = properties.GlobalId.value;\n\n const metaObjectId = entityId;\n const metaObject = ctx.xktModel.metaObjects[metaObjectId];\n\n if (ctx.includeTypes && (!metaObject || (!ctx.includeTypes[metaObject.metaObjectType]))) {\n return;\n }\n\n if (ctx.excludeTypes && (!metaObject || ctx.excludeTypes[metaObject.metaObjectType])) {\n console.log(\"excluding: \" + metaObjectId)\n return;\n }\n\n for (let j = 0, lenj = placedGeometries.size(); j < lenj; j++) {\n\n const placedGeometry = placedGeometries.get(j);\n const geometryId = \"\" + placedGeometry.geometryExpressID;\n\n if (!ctx.xktModel.geometries[geometryId]) {\n\n const geometry = ctx.ifcAPI.GetGeometry(ctx.modelID, placedGeometry.geometryExpressID);\n const vertexData = ctx.ifcAPI.GetVertexArray(geometry.GetVertexData(), geometry.GetVertexDataSize());\n const indices = ctx.ifcAPI.GetIndexArray(geometry.GetIndexData(), geometry.GetIndexDataSize());\n\n // De-interleave vertex arrays\n\n const positions = [];\n const normals = [];\n\n for (let k = 0, lenk = vertexData.length / 6; k < lenk; k++) {\n positions.push(vertexData[k * 6 + 0]);\n positions.push(vertexData[k * 6 + 1]);\n positions.push(vertexData[k * 6 + 2]);\n }\n\n if (!ctx.autoNormals) {\n for (let k = 0, lenk = vertexData.length / 6; k < lenk; k++) {\n normals.push(vertexData[k * 6 + 3]);\n normals.push(vertexData[k * 6 + 4]);\n normals.push(vertexData[k * 6 + 5]);\n }\n }\n\n ctx.xktModel.createGeometry({\n geometryId: geometryId,\n primitiveType: \"triangles\",\n positions: positions,\n normals: ctx.autoNormals ? null : normals,\n indices: indices\n });\n\n ctx.stats.numGeometries++;\n ctx.stats.numVertices += (positions.length / 3);\n ctx.stats.numTriangles += (indices.length / 3);\n }\n\n const meshId = (\"mesh\" + ctx.nextId++);\n\n ctx.xktModel.createMesh({\n meshId: meshId,\n geometryId: geometryId,\n matrix: placedGeometry.flatTransformation,\n color: [placedGeometry.color.x, placedGeometry.color.y, placedGeometry.color.z],\n opacity: placedGeometry.color.w\n });\n\n meshIds.push(meshId);\n }\n\n if (meshIds.length > 0) {\n ctx.xktModel.createEntity({\n entityId: entityId,\n meshIds: meshIds\n });\n ctx.stats.numObjects++;\n }\n}\n\nexport {parseIFCIntoXKTModel};\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@loaders.gl/las\");","import {parse} from '@loaders.gl/core';\nimport {LASLoader} from '@loaders.gl/las';\n\nimport {math} from \"../lib/math.js\";\n\nconst MAX_VERTICES = 500000; // TODO: Rough estimate\n\n/**\n * @desc Parses LAS and LAZ point cloud data into an {@link XKTModel}.\n *\n * This parser handles both the LASER file format (LAS) and its compressed version (LAZ),\n * a public format for the interchange of 3-dimensional point cloud data data, developed\n * for LIDAR mapping purposes.\n *\n * ## Usage\n *\n * In the example below we'll create an {@link XKTModel}, then load an LAZ point cloud model into it.\n *\n * ````javascript\n * utils.loadArraybuffer(\"./models/laz/autzen.laz\", async (data) => {\n *\n * const xktModel = new XKTModel();\n *\n * await parseLASIntoXKTModel({\n * data,\n * xktModel,\n * rotateX: true,\n * log: (msg) => { console.log(msg); }\n * }).then(()=>{\n * xktModel.finalize();\n * },\n * (msg) => {\n * console.error(msg);\n * });\n * });\n * ````\n *\n * @param {Object} params Parsing params.\n * @param {ArrayBuffer} params.data LAS/LAZ file data.\n * @param {XKTModel} params.xktModel XKTModel to parse into.\n * @param {boolean} [params.center=false] Set true to center the LAS point positions to [0,0,0]. This is applied before the transformation matrix, if specified.\n * @param {Boolean} [params.transform] 4x4 transformation matrix to transform point positions. Use this to rotate, translate and scale them if neccessary.\n * @param {Number|String} [params.colorDepth=8] Whether colors encoded using 8 or 16 bits. Can be set to 'auto'. LAS specification recommends 16 bits.\n * @param {Boolean} [params.fp64=false] Configures if LASLoaderPlugin assumes that LAS positions are stored in 64-bit floats instead of 32-bit.\n * @param {Number} [params.skip=1] Read one from every n points.\n * @param {Object} [params.stats] Collects statistics.\n * @param {function} [params.log] Logging callback.\n * @returns {Promise} Resolves when LAS has been parsed.\n */\nfunction parseLASIntoXKTModel({\n data,\n xktModel,\n center = false,\n transform = null,\n colorDepth = \"auto\",\n fp64 = false,\n skip = 1,\n stats,\n log = () => {\n }\n }) {\n\n if (log) {\n log(\"Using parser: parseLASIntoXKTModel\");\n }\n\n return new Promise(function (resolve, reject) {\n\n if (!data) {\n reject(\"Argument expected: data\");\n return;\n }\n\n if (!xktModel) {\n reject(\"Argument expected: xktModel\");\n return;\n }\n\n log(\"Converting LAZ/LAS\");\n\n log(`center: ${center}`);\n if (transform) {\n log(`transform: [${transform}]`);\n }\n log(`colorDepth: ${colorDepth}`);\n log(`fp64: ${fp64}`);\n log(`skip: ${skip}`);\n\n parse(data, LASLoader, {\n las: {\n colorDepth,\n fp64\n }\n }).then((parsedData) => {\n\n const attributes = parsedData.attributes;\n\n const loaderData = parsedData.loaderData;\n const pointsFormatId = loaderData.pointsFormatId !== undefined ? loaderData.pointsFormatId : -1;\n\n if (!attributes.POSITION) {\n log(\"No positions found in file (expected for all LAS point formats)\");\n return;\n }\n\n let readAttributes = {};\n\n switch (pointsFormatId) {\n case 0:\n if (!attributes.intensity) {\n log(\"No intensities found in file (expected for LAS point format 0)\");\n return;\n }\n\n readAttributes = readIntensities(attributes.POSITION, attributes.intensity);\n break;\n case 1:\n if (!attributes.intensity) {\n log(\"No intensities found in file (expected for LAS point format 1)\");\n return;\n }\n readAttributes = readIntensities(attributes.POSITION, attributes.intensity);\n break;\n case 2:\n if (!attributes.intensity) {\n log(\"No intensities found in file (expected for LAS point format 2)\");\n return;\n }\n\n readAttributes = readColorsAndIntensities(attributes.POSITION, attributes.COLOR_0, attributes.intensity);\n break;\n case 3:\n if (!attributes.intensity) {\n log(\"No intensities found in file (expected for LAS point format 3)\");\n return;\n }\n readAttributes = readColorsAndIntensities(attributes.POSITION, attributes.COLOR_0, attributes.intensity);\n break;\n }\n\n const pointsChunks = chunkArray(readPositions(readAttributes.positions), MAX_VERTICES * 3);\n const colorsChunks = chunkArray(readAttributes.colors, MAX_VERTICES * 4);\n\n const meshIds = [];\n\n for (let j = 0, lenj = pointsChunks.length; j < lenj; j++) {\n\n const geometryId = `geometry-${j}`;\n const meshId = `mesh-${j}`;\n\n meshIds.push(meshId);\n\n xktModel.createGeometry({\n geometryId: geometryId,\n primitiveType: \"points\",\n positions: pointsChunks[j],\n colorsCompressed: colorsChunks[j]\n });\n\n xktModel.createMesh({\n meshId,\n geometryId\n });\n }\n\n const entityId = math.createUUID();\n\n xktModel.createEntity({\n entityId,\n meshIds\n });\n\n const rootMetaObjectId = math.createUUID();\n\n xktModel.createMetaObject({\n metaObjectId: rootMetaObjectId,\n metaObjectType: \"Model\",\n metaObjectName: \"Model\"\n });\n\n xktModel.createMetaObject({\n metaObjectId: entityId,\n metaObjectType: \"PointCloud\",\n metaObjectName: \"PointCloud (LAZ)\",\n parentMetaObjectId: rootMetaObjectId\n });\n\n if (stats) {\n stats.sourceFormat = \"LAS\";\n stats.schemaVersion = \"\";\n stats.title = \"\";\n stats.author = \"\";\n stats.created = \"\";\n stats.numMetaObjects = 2;\n stats.numPropertySets = 0;\n stats.numObjects = 1;\n stats.numGeometries = 1;\n stats.numVertices = readAttributes.positions.length / 3;\n }\n\n resolve();\n\n }, (errMsg) => {\n reject(errMsg);\n });\n });\n\n function readPositions(positionsValue) {\n if (positionsValue) {\n if (center) {\n const centerPos = math.vec3();\n const numPoints = positionsValue.length;\n for (let i = 0, len = positionsValue.length; i < len; i += 3) {\n centerPos[0] += positionsValue[i + 0];\n centerPos[1] += positionsValue[i + 1];\n centerPos[2] += positionsValue[i + 2];\n }\n centerPos[0] /= numPoints;\n centerPos[1] /= numPoints;\n centerPos[2] /= numPoints;\n for (let i = 0, len = positionsValue.length; i < len; i += 3) {\n positionsValue[i + 0] -= centerPos[0];\n positionsValue[i + 1] -= centerPos[1];\n positionsValue[i + 2] -= centerPos[2];\n }\n }\n if (transform) {\n const mat = math.mat4(transform);\n const pos = math.vec3();\n for (let i = 0, len = positionsValue.length; i < len; i += 3) {\n pos[0] = positionsValue[i + 0];\n pos[1] = positionsValue[i + 1];\n pos[2] = positionsValue[i + 2];\n math.transformPoint3(mat, pos, pos);\n positionsValue[i + 0] = pos[0];\n positionsValue[i + 1] = pos[1];\n positionsValue[i + 2] = pos[2];\n }\n }\n }\n return positionsValue;\n }\n\n function readColorsAndIntensities(attributesPosition, attributesColor, attributesIntensity) {\n const positionsValue = attributesPosition.value;\n const colors = attributesColor.value;\n const colorSize = attributesColor.size;\n const intensities = attributesIntensity.value;\n const colorsCompressedSize = intensities.length * 4;\n const positions = [];\n const colorsCompressed = new Uint8Array(colorsCompressedSize / skip);\n let count = skip;\n for (let i = 0, j = 0, k = 0, l = 0, m = 0, n=0,len = intensities.length; i < len; i++, k += colorSize, j += 4, l += 3) {\n if (count <= 0) {\n colorsCompressed[m++] = colors[k + 0];\n colorsCompressed[m++] = colors[k + 1];\n colorsCompressed[m++] = colors[k + 2];\n colorsCompressed[m++] = Math.round((intensities[i] / 65536) * 255);\n positions[n++] = positionsValue[l + 0];\n positions[n++] = positionsValue[l + 1];\n positions[n++] = positionsValue[l + 2];\n count = skip;\n } else {\n count--;\n }\n }\n return {\n positions,\n colors: colorsCompressed\n };\n }\n\n function readIntensities(attributesPosition, attributesIntensity) {\n const positionsValue = attributesPosition.value;\n const intensities = attributesIntensity.intensity;\n const colorsCompressedSize = intensities.length * 4;\n const positions = [];\n const colorsCompressed = new Uint8Array(colorsCompressedSize / skip);\n let count = skip;\n for (let i = 0, j = 0, k = 0, l = 0, m = 0, n = 0, len = intensities.length; i < len; i++, k += 3, j += 4, l += 3) {\n if (count <= 0) {\n colorsCompressed[m++] = 0;\n colorsCompressed[m++] = 0;\n colorsCompressed[m++] = 0;\n colorsCompressed[m++] = Math.round((intensities[i] / 65536) * 255);\n positions[n++] = positionsValue[l + 0];\n positions[n++] = positionsValue[l + 1];\n positions[n++] = positionsValue[l + 2];\n count = skip;\n } else {\n count--;\n }\n }\n return {\n positions,\n colors: colorsCompressed\n };\n }\n\n function chunkArray(array, chunkSize) {\n if (chunkSize >= array.length) {\n return [array]; // One chunk\n }\n let result = [];\n for (let i = 0; i < array.length; i += chunkSize) {\n result.push(array.slice(i, i + chunkSize));\n }\n return result;\n }\n\n}\n\nexport {parseLASIntoXKTModel};","/**\n * @desc Parses JSON metamodel into an {@link XKTModel}.\n *\n * @param {Object} params Parsing parameters.\n * @param {JSON} params.metaModelData Metamodel data.\n * @param {String[]} [params.excludeTypes] Types to exclude from parsing.\n * @param {String[]} [params.includeTypes] Types to include in parsing.\n * @param {XKTModel} params.xktModel XKTModel to parse into.\n * @param {function} [params.log] Logging callback.\n @returns {Promise} Resolves when JSON has been parsed.\n */\nfunction parseMetaModelIntoXKTModel({metaModelData, xktModel, includeTypes, excludeTypes, log}) {\n\n if (log) {\n log(\"Using parser: parseMetaModelIntoXKTModel\");\n }\n\n return new Promise(function (resolve, reject) {\n\n const metaObjects = metaModelData.metaObjects || [];\n const propertySets = metaModelData.propertySets || [];\n\n xktModel.modelId = metaModelData.revisionId || \"\"; // HACK\n xktModel.projectId = metaModelData.projectId || \"\";\n xktModel.revisionId = metaModelData.revisionId || \"\";\n xktModel.author = metaModelData.author || \"\";\n xktModel.createdAt = metaModelData.createdAt || \"\";\n xktModel.creatingApplication = metaModelData.creatingApplication || \"\";\n xktModel.schema = metaModelData.schema || \"\";\n\n for (let i = 0, len = propertySets.length; i < len; i++) {\n\n const propertySet = propertySets[i];\n\n xktModel.createPropertySet({\n propertySetId: propertySet.id,\n propertySetName: propertySet.name,\n propertySetType: propertySet.type,\n properties: propertySet.properties\n });\n }\n\n let includeTypesMap;\n if (includeTypes) {\n includeTypesMap = {};\n for (let i = 0, len = includeTypes.length; i < len; i++) {\n includeTypesMap[includeTypes[i]] = true;\n }\n }\n\n let excludeTypesMap;\n if (excludeTypes) {\n excludeTypesMap = {};\n for (let i = 0, len = excludeTypes.length; i < len; i++) {\n excludeTypesMap[excludeTypes[i]] = true;\n }\n }\n\n const metaObjectsMap = {};\n\n for (let i = 0, len = metaObjects.length; i < len; i++) {\n const newObject = metaObjects[i];\n metaObjectsMap[newObject.id] = newObject;\n }\n\n let countMetaObjects = 0;\n\n for (let i = 0, len = metaObjects.length; i < len; i++) {\n\n const metaObject = metaObjects[i];\n const type = metaObject.type;\n\n if (excludeTypesMap && excludeTypesMap[type]) {\n continue;\n }\n\n if (includeTypesMap && !includeTypesMap[type]) {\n continue;\n }\n\n if (metaObject.parent !== undefined && metaObject.parent !== null) {\n const metaObjectParent = metaObjectsMap[metaObject.parent];\n if (metaObject.type === metaObjectParent.type) { // Don't create redundant sub-objects\n continue\n }\n }\n\n const propertySetIds = [];\n if (metaObject.propertySetIds) {\n for (let j = 0, lenj = metaObject.propertySetIds.length; j < lenj; j++) {\n const propertySetId = metaObject.propertySetIds[j];\n if (propertySetId !== undefined && propertySetId !== null && propertySetId !== \"\") {\n propertySetIds.push(propertySetId);\n }\n }\n }\n if (metaObject.propertySetId !== undefined && metaObject.propertySetId !== null && metaObject.propertySetId !== \"\") {\n propertySetIds.push(metaObject.propertySetId);\n }\n\n xktModel.createMetaObject({\n metaObjectId: metaObject.id,\n metaObjectType: metaObject.type,\n metaObjectName: metaObject.name,\n parentMetaObjectId: metaObject.parent,\n propertySetIds: propertySetIds.length > 0 ? propertySetIds : null\n });\n\n countMetaObjects++;\n }\n\n if (log) {\n log(\"Converted meta objects: \" + countMetaObjects);\n }\n\n resolve();\n });\n}\n\nexport {parseMetaModelIntoXKTModel};\n","/**\n * @desc Parses PCD point cloud data into an {@link XKTModel}.\n *\n * ## Usage\n *\n * In the example below we'll create an {@link XKTModel}, then load an LAZ point cloud model into it.\n *\n * ````javascript\n * utils.loadArraybuffer(\"\"./models/pcd/ism_test_cat.pcd\"\", async (data) => {\n *\n * const xktModel = new XKTModel();\n *\n * await parsePCDIntoXKTModel({\n * data,\n * xktModel,\n * log: (msg) => { console.log(msg); }\n * }).then(()=>{\n * xktModel.finalize();\n * },\n * (msg) => {\n * console.error(msg);\n * });\n * });\n * ````\n *\n * @param {Object} params Parsing params.\n * @param {ArrayBuffer} params.data PCD file data.\n * @param {Boolean} [params.littleEndian=true] Whether PCD binary data is Little-Endian or Big-Endian.\n * @param {XKTModel} params.xktModel XKTModel to parse into.\n * @param {Object} [params.stats] Collects statistics.\n * @param {function} [params.log] Logging callback.\n @returns {Promise} Resolves when PCD has been parsed.\n */\nfunction parsePCDIntoXKTModel({data, xktModel, littleEndian = true, stats, log}) {\n\n if (log) {\n log(\"Using parser: parsePCDIntoXKTModel\");\n }\n\n return new Promise(function(resolve, reject) {\n\n const textData = decodeText(new Uint8Array(data));\n\n const header = parseHeader(textData);\n\n const positions = [];\n const normals = [];\n const colors = [];\n\n if (header.data === 'ascii') {\n\n const offset = header.offset;\n const data = textData.substr(header.headerLen);\n const lines = data.split('\\n');\n\n for (let i = 0, l = lines.length; i < l; i++) {\n\n if (lines[i] === '') {\n continue;\n }\n\n const line = lines[i].split(' ');\n\n if (offset.x !== undefined) {\n positions.push(parseFloat(line[offset.x]));\n positions.push(parseFloat(line[offset.y]));\n positions.push(parseFloat(line[offset.z]));\n }\n\n if (offset.rgb !== undefined) {\n const rgb = parseFloat(line[offset.rgb]);\n const r = (rgb >> 16) & 0x0000ff;\n const g = (rgb >> 8) & 0x0000ff;\n const b = (rgb >> 0) & 0x0000ff;\n colors.push(r, g, b, 255);\n } else {\n colors.push(255);\n colors.push(255);\n colors.push(255);\n }\n }\n }\n\n if (header.data === 'binary_compressed') {\n\n const sizes = new Uint32Array(data.slice(header.headerLen, header.headerLen + 8));\n const compressedSize = sizes[0];\n const decompressedSize = sizes[1];\n const decompressed = decompressLZF(new Uint8Array(data, header.headerLen + 8, compressedSize), decompressedSize);\n const dataview = new DataView(decompressed.buffer);\n const offset = header.offset;\n\n for (let i = 0; i < header.points; i++) {\n\n if (offset.x !== undefined) {\n positions.push(dataview.getFloat32((header.points * offset.x) + header.size[0] * i, littleEndian));\n positions.push(dataview.getFloat32((header.points * offset.y) + header.size[1] * i, littleEndian));\n positions.push(dataview.getFloat32((header.points * offset.z) + header.size[2] * i, littleEndian));\n }\n\n if (offset.rgb !== undefined) {\n colors.push(dataview.getUint8((header.points * offset.rgb) + header.size[3] * i + 0));\n colors.push(dataview.getUint8((header.points * offset.rgb) + header.size[3] * i + 1));\n colors.push(dataview.getUint8((header.points * offset.rgb) + header.size[3] * i + 2));\n // colors.push(255);\n } else {\n colors.push(1);\n colors.push(1);\n colors.push(1);\n }\n }\n }\n\n if (header.data === 'binary') {\n\n const dataview = new DataView(data, header.headerLen);\n const offset = header.offset;\n\n for (let i = 0, row = 0; i < header.points; i++, row += header.rowSize) {\n if (offset.x !== undefined) {\n positions.push(dataview.getFloat32(row + offset.x, littleEndian));\n positions.push(dataview.getFloat32(row + offset.y, littleEndian));\n positions.push(dataview.getFloat32(row + offset.z, littleEndian));\n }\n\n if (offset.rgb !== undefined) {\n colors.push(dataview.getUint8(row + offset.rgb + 2));\n colors.push(dataview.getUint8(row + offset.rgb + 1));\n colors.push(dataview.getUint8(row + offset.rgb + 0));\n } else {\n colors.push(255);\n colors.push(255);\n colors.push(255);\n }\n }\n }\n\n xktModel.createGeometry({\n geometryId: \"pointsGeometry\",\n primitiveType: \"points\",\n positions: positions,\n colors: colors && colors.length > 0 ? colors : null\n });\n\n xktModel.createMesh({\n meshId: \"pointsMesh\",\n geometryId: \"pointsGeometry\"\n });\n\n xktModel.createEntity({\n entityId: \"geometries\",\n meshIds: [\"pointsMesh\"]\n });\n\n if (log) {\n log(\"Converted drawable objects: 1\");\n log(\"Converted geometries: 1\");\n log(\"Converted vertices: \" + positions.length / 3);\n }\n\n if (stats) {\n stats.sourceFormat = \"PCD\";\n stats.schemaVersion = \"\";\n stats.title = \"\";\n stats.author = \"\";\n stats.created = \"\";\n stats.numObjects = 1;\n stats.numGeometries = 1;\n stats.numVertices = positions.length / 3;\n }\n\n resolve();\n });\n}\n\nfunction parseHeader(data) {\n const header = {};\n const result1 = data.search(/[\\r\\n]DATA\\s(\\S*)\\s/i);\n const result2 = /[\\r\\n]DATA\\s(\\S*)\\s/i.exec(data.substr(result1 - 1));\n header.data = result2[1];\n header.headerLen = result2[0].length + result1;\n header.str = data.substr(0, header.headerLen);\n header.str = header.str.replace(/\\#.*/gi, ''); // Strip comments\n header.version = /VERSION (.*)/i.exec(header.str); // Parse\n header.fields = /FIELDS (.*)/i.exec(header.str);\n header.size = /SIZE (.*)/i.exec(header.str);\n header.type = /TYPE (.*)/i.exec(header.str);\n header.count = /COUNT (.*)/i.exec(header.str);\n header.width = /WIDTH (.*)/i.exec(header.str);\n header.height = /HEIGHT (.*)/i.exec(header.str);\n header.viewpoint = /VIEWPOINT (.*)/i.exec(header.str);\n header.points = /POINTS (.*)/i.exec(header.str);\n if (header.version !== null) {\n header.version = parseFloat(header.version[1]);\n }\n if (header.fields !== null) {\n header.fields = header.fields[1].split(' ');\n }\n if (header.type !== null) {\n header.type = header.type[1].split(' ');\n }\n if (header.width !== null) {\n header.width = parseInt(header.width[1]);\n }\n if (header.height !== null) {\n header.height = parseInt(header.height[1]);\n }\n if (header.viewpoint !== null) {\n header.viewpoint = header.viewpoint[1];\n }\n if (header.points !== null) {\n header.points = parseInt(header.points[1], 10);\n }\n if (header.points === null) {\n header.points = header.width * header.height;\n }\n if (header.size !== null) {\n header.size = header.size[1].split(' ').map(function (x) {\n return parseInt(x, 10);\n });\n }\n if (header.count !== null) {\n header.count = header.count[1].split(' ').map(function (x) {\n return parseInt(x, 10);\n });\n } else {\n header.count = [];\n for (let i = 0, l = header.fields.length; i < l; i++) {\n header.count.push(1);\n }\n }\n header.offset = {};\n let sizeSum = 0;\n for (let i = 0, l = header.fields.length; i < l; i++) {\n if (header.data === 'ascii') {\n header.offset[header.fields[i]] = i;\n } else {\n header.offset[header.fields[i]] = sizeSum;\n sizeSum += header.size[i] * header.count[i];\n }\n }\n header.rowSize = sizeSum; // For binary only\n return header;\n}\n\nfunction decodeText(array) {\n if (typeof TextDecoder !== 'undefined') {\n return new TextDecoder().decode(array);\n }\n let s = '';\n for (let i = 0, il = array.length; i < il; i++) {\n s += String.fromCharCode(array[i]);\n }\n try {\n return decodeURIComponent(escape(s));\n } catch (e) {\n return s;\n }\n}\n\nfunction decompressLZF(inData, outLength) { // https://gitlab.com/taketwo/three-pcd-loader/blob/master/decompress-lzf.js\n const inLength = inData.length;\n const outData = new Uint8Array(outLength);\n let inPtr = 0;\n let outPtr = 0;\n let ctrl;\n let len;\n let ref;\n do {\n ctrl = inData[inPtr++];\n if (ctrl < (1 << 5)) {\n ctrl++;\n if (outPtr + ctrl > outLength) throw new Error('Output buffer is not large enough');\n if (inPtr + ctrl > inLength) throw new Error('Invalid compressed data');\n do {\n outData[outPtr++] = inData[inPtr++];\n } while (--ctrl);\n } else {\n len = ctrl >> 5;\n ref = outPtr - ((ctrl & 0x1f) << 8) - 1;\n if (inPtr >= inLength) throw new Error('Invalid compressed data');\n if (len === 7) {\n len += inData[inPtr++];\n if (inPtr >= inLength) throw new Error('Invalid compressed data');\n }\n ref -= inData[inPtr++];\n if (outPtr + len + 2 > outLength) throw new Error('Output buffer is not large enough');\n if (ref < 0) throw new Error('Invalid compressed data');\n if (ref >= outPtr) throw new Error('Invalid compressed data');\n do {\n outData[outPtr++] = outData[ref++];\n } while (--len + 2);\n }\n } while (inPtr < inLength);\n return outData;\n}\n\nexport {parsePCDIntoXKTModel};","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@loaders.gl/ply\");","import {parse} from '@loaders.gl/core';\nimport {PLYLoader} from '@loaders.gl/ply';\n\n/**\n * @desc Parses PLY file data into an {@link XKTModel}.\n *\n * ## Usage\n *\n * In the example below we'll create an {@link XKTModel}, then load a PLY model into it.\n *\n * ````javascript\n * utils.loadArraybuffer(\"./models/ply/test.ply\", async (data) => {\n *\n * const xktModel = new XKTModel();\n *\n * parsePLYIntoXKTModel({data, xktModel}).then(()=>{\n * xktModel.finalize();\n * },\n * (msg) => {\n * console.error(msg);\n * });\n * });\n * ````\n *\n * @param {Object} params Parsing params.\n * @param {ArrayBuffer} params.data PLY file data.\n * @param {XKTModel} params.xktModel XKTModel to parse into.\n * @param {Object} [params.stats] Collects statistics.\n * @param {function} [params.log] Logging callback.\n @returns {Promise} Resolves when PLY has been parsed.\n */\nasync function parsePLYIntoXKTModel({data, xktModel, stats, log}) {\n\n if (log) {\n log(\"Using parser: parsePLYIntoXKTModel\");\n }\n\n if (!data) {\n throw \"Argument expected: data\";\n }\n\n if (!xktModel) {\n throw \"Argument expected: xktModel\";\n }\n\n let parsedData;\n try {\n parsedData = await parse(data, PLYLoader);\n } catch (e) {\n if (log) {\n log(\"Error: \" + e);\n }\n return;\n }\n\n const attributes = parsedData.attributes;\n const hasColors = !!attributes.COLOR_0;\n\n if (hasColors) {\n const colorsValue = hasColors ? attributes.COLOR_0.value : null;\n const colorsCompressed = [];\n for (let i = 0, len = colorsValue.length; i < len; i += 4) {\n colorsCompressed.push(colorsValue[i]);\n colorsCompressed.push(colorsValue[i + 1]);\n colorsCompressed.push(colorsValue[i + 2]);\n }\n xktModel.createGeometry({\n geometryId: \"plyGeometry\",\n primitiveType: \"triangles\",\n positions: attributes.POSITION.value,\n indices: parsedData.indices ? parsedData.indices.value : [],\n colorsCompressed: colorsCompressed\n });\n } else {\n xktModel.createGeometry({\n geometryId: \"plyGeometry\",\n primitiveType: \"triangles\",\n positions: attributes.POSITION.value,\n indices: parsedData.indices ? parsedData.indices.value : []\n });\n }\n\n xktModel.createMesh({\n meshId: \"plyMesh\",\n geometryId: \"plyGeometry\",\n color: (!hasColors) ? [1, 1, 1] : null\n });\n\n xktModel.createEntity({\n entityId: \"ply\",\n meshIds: [\"plyMesh\"]\n });\n\n if (stats) {\n stats.sourceFormat = \"PLY\";\n stats.schemaVersion = \"\";\n stats.title = \"\";\n stats.author = \"\";\n stats.created = \"\";\n stats.numMetaObjects = 2;\n stats.numPropertySets = 0;\n stats.numObjects = 1;\n stats.numGeometries = 1;\n stats.numVertices = attributes.POSITION.value.length / 3;\n }\n}\n\nexport {parsePLYIntoXKTModel};\n","import {faceToVertexNormals} from \"../lib/faceToVertexNormals.js\";\nimport {math} from \"../lib/math.js\";\n\n/**\n * @desc Parses STL file data into an {@link XKTModel}.\n *\n * * Supports binary and ASCII STL formats.\n * * Option to create a separate {@link XKTEntity} for each group of faces that share the same vertex colors.\n * * Option to smooth face-aligned normals loaded from STL.\n * * Option to reduce XKT file size by ignoring STL normals and relying on xeokit to auto-generate them.\n *\n * ## Usage\n *\n * In the example below we'll create an {@link XKTModel}, then load an STL model into it.\n *\n * ````javascript\n * utils.loadArraybuffer(\"./models/stl/binary/spurGear.stl\", async (data) => {\n *\n * const xktModel = new XKTModel();\n *\n * parseSTLIntoXKTModel({data, xktModel});\n *\n * xktModel.finalize();\n * });\n * ````\n *\n * @param {Object} params Parsing params.\n * @param {ArrayBuffer|String} [params.data] STL file data. Can be binary or string.\n * @param {Boolean} [params.autoNormals=false] When true, the parser will ignore the STL geometry normals, and the STL\n * data will rely on the xeokit ````Viewer```` to automatically generate them. This has the limitation that the\n * normals will be face-aligned, and therefore the ````Viewer```` will only be able to render a flat-shaded representation\n * of the STL.\n * Overrides ````smoothNormals```` when ````true````. This ignores the normals in the STL, and loads no\n * normals from the STL into the {@link XKTModel}, resulting in the XKT file storing no normals for the STL model. The\n * xeokit-sdk will then automatically generate the normals within its shaders. The disadvantages are that auto-normals\n * may slow rendering down a little bit, and that the normals can only be face-aligned (and thus rendered using flat\n * shading). The advantages, however, are a smaller XKT file size, and the ability to apply certain geometry optimizations\n * during parsing, such as removing duplicated STL vertex positions, that are not possible when normals are loaded\n * for the STL vertices.\n * @param {Boolean} [params.smoothNormals=true] When true, automatically converts face-oriented STL normals to vertex normals, for a smooth appearance. Ignored if ````autoNormals```` is ````true````.\n * @param {Number} [params.smoothNormalsAngleThreshold=20] This is the threshold angle between normals of adjacent triangles, below which their shared wireframe edge is not drawn.\n * @param {Boolean} [params.splitMeshes=true] When true, creates a separate {@link XKTEntity} for each group of faces that share the same vertex colors. Only works with binary STL (ie. when ````data```` is an ArrayBuffer).\n * @param {XKTModel} [params.xktModel] XKTModel to parse into.\n * @param {Object} [params.stats] Collects statistics.\n * @param {function} [params.log] Logging callback.\n @returns {Promise} Resolves when STL has been parsed.\n */\nasync function parseSTLIntoXKTModel({\n data,\n splitMeshes,\n autoNormals,\n smoothNormals,\n smoothNormalsAngleThreshold,\n xktModel,\n stats,\n log\n }) {\n\n if (log) {\n log(\"Using parser: parseSTLIntoXKTModel\");\n }\n\n return new Promise(function (resolve, reject) {\n\n if (!data) {\n reject(\"Argument expected: data\");\n return;\n }\n\n if (!xktModel) {\n reject(\"Argument expected: xktModel\");\n return;\n }\n\n const rootMetaObjectId = math.createUUID();\n\n const rootMetaObject = xktModel.createMetaObject({\n metaObjectId: rootMetaObjectId,\n metaObjectType: \"Model\",\n metaObjectName: \"Model\"\n });\n\n const ctx = {\n data,\n splitMeshes,\n autoNormals,\n smoothNormals,\n smoothNormalsAngleThreshold,\n xktModel,\n rootMetaObject,\n nextId: 0,\n log: (log || function (msg) {\n }),\n stats: {\n numObjects: 0,\n numGeometries: 0,\n numTriangles: 0,\n numVertices: 0\n }\n };\n\n const binData = ensureBinary(data);\n\n if (isBinary(binData)) {\n parseBinary(ctx, binData);\n } else {\n parseASCII(ctx, ensureString(data));\n }\n\n if (stats) {\n stats.sourceFormat = \"STL\";\n stats.schemaVersion = \"\";\n stats.title = \"\";\n stats.author = \"\";\n stats.created = \"\";\n stats.numMetaObjects = 2;\n stats.numPropertySets = 0;\n stats.numObjects = 1;\n stats.numGeometries = 1;\n stats.numTriangles = ctx.stats.numTriangles;\n stats.numVertices = ctx.stats.numVertices;\n }\n\n resolve();\n });\n}\n\nfunction isBinary(data) {\n const reader = new DataView(data);\n const numFaces = reader.getUint32(80, true);\n const faceSize = (32 / 8 * 3) + ((32 / 8 * 3) * 3) + (16 / 8);\n const numExpectedBytes = 80 + (32 / 8) + (numFaces * faceSize);\n if (numExpectedBytes === reader.byteLength) {\n return true;\n }\n const solid = [115, 111, 108, 105, 100];\n for (let i = 0; i < 5; i++) {\n if (solid[i] !== reader.getUint8(i, false)) {\n return true;\n }\n }\n return false;\n}\n\nfunction parseBinary(ctx, data) {\n const reader = new DataView(data);\n const faces = reader.getUint32(80, true);\n let r;\n let g;\n let b;\n let hasColors = false;\n let colors;\n let defaultR;\n let defaultG;\n let defaultB;\n let lastR = null;\n let lastG = null;\n let lastB = null;\n let newMesh = false;\n let alpha;\n for (let index = 0; index < 80 - 10; index++) {\n if ((reader.getUint32(index, false) === 0x434F4C4F /*COLO*/) &&\n (reader.getUint8(index + 4) === 0x52 /*'R'*/) &&\n (reader.getUint8(index + 5) === 0x3D /*'='*/)) {\n hasColors = true;\n colors = [];\n defaultR = reader.getUint8(index + 6) / 255;\n defaultG = reader.getUint8(index + 7) / 255;\n defaultB = reader.getUint8(index + 8) / 255;\n alpha = reader.getUint8(index + 9) / 255;\n }\n }\n let dataOffset = 84;\n let faceLength = 12 * 4 + 2;\n let positions = [];\n let normals = [];\n let splitMeshes = ctx.splitMeshes;\n for (let face = 0; face < faces; face++) {\n let start = dataOffset + face * faceLength;\n let normalX = reader.getFloat32(start, true);\n let normalY = reader.getFloat32(start + 4, true);\n let normalZ = reader.getFloat32(start + 8, true);\n if (hasColors) {\n let packedColor = reader.getUint16(start + 48, true);\n if ((packedColor & 0x8000) === 0) {\n r = (packedColor & 0x1F) / 31;\n g = ((packedColor >> 5) & 0x1F) / 31;\n b = ((packedColor >> 10) & 0x1F) / 31;\n } else {\n r = defaultR;\n g = defaultG;\n b = defaultB;\n }\n if (splitMeshes && r !== lastR || g !== lastG || b !== lastB) {\n if (lastR !== null) {\n newMesh = true;\n }\n lastR = r;\n lastG = g;\n lastB = b;\n }\n }\n for (let i = 1; i <= 3; i++) {\n let vertexstart = start + i * 12;\n positions.push(reader.getFloat32(vertexstart, true));\n positions.push(reader.getFloat32(vertexstart + 4, true));\n positions.push(reader.getFloat32(vertexstart + 8, true));\n if (!ctx.autoNormals) {\n normals.push(normalX, normalY, normalZ);\n }\n if (hasColors) {\n colors.push(r, g, b, 1); // TODO: handle alpha\n }\n }\n if (splitMeshes && newMesh) {\n addMesh(ctx, positions, normals, colors);\n positions = [];\n normals = [];\n colors = colors ? [] : null;\n newMesh = false;\n }\n }\n if (positions.length > 0) {\n addMesh(ctx, positions, normals, colors);\n }\n}\n\nfunction parseASCII(ctx, data) {\n const faceRegex = /facet([\\s\\S]*?)endfacet/g;\n let faceCounter = 0;\n const floatRegex = /[\\s]+([+-]?(?:\\d+.\\d+|\\d+.|\\d+|.\\d+)(?:[eE][+-]?\\d+)?)/.source;\n const vertexRegex = new RegExp('vertex' + floatRegex + floatRegex + floatRegex, 'g');\n const normalRegex = new RegExp('normal' + floatRegex + floatRegex + floatRegex, 'g');\n const positions = [];\n const normals = [];\n const colors = null;\n let normalx;\n let normaly;\n let normalz;\n let result;\n let verticesPerFace;\n let normalsPerFace;\n let text;\n while ((result = faceRegex.exec(data)) !== null) {\n verticesPerFace = 0;\n normalsPerFace = 0;\n text = result[0];\n while ((result = normalRegex.exec(text)) !== null) {\n normalx = parseFloat(result[1]);\n normaly = parseFloat(result[2]);\n normalz = parseFloat(result[3]);\n normalsPerFace++;\n }\n while ((result = vertexRegex.exec(text)) !== null) {\n positions.push(parseFloat(result[1]), parseFloat(result[2]), parseFloat(result[3]));\n normals.push(normalx, normaly, normalz);\n verticesPerFace++;\n }\n if (normalsPerFace !== 1) {\n ctx.log(\"Error in normal of face \" + faceCounter);\n return -1;\n }\n if (verticesPerFace !== 3) {\n ctx.log(\"Error in positions of face \" + faceCounter);\n return -1;\n }\n faceCounter++;\n }\n addMesh(ctx, positions, normals, colors);\n}\n\nlet nextGeometryId = 0;\n\nfunction addMesh(ctx, positions, normals, colors) {\n\n const indices = new Int32Array(positions.length / 3);\n for (let ni = 0, len = indices.length; ni < len; ni++) {\n indices[ni] = ni;\n }\n\n normals = normals && normals.length > 0 ? normals : null;\n colors = colors && colors.length > 0 ? colors : null;\n\n if (!ctx.autoNormals && ctx.smoothNormals) {\n faceToVertexNormals(positions, normals, {smoothNormalsAngleThreshold: ctx.smoothNormalsAngleThreshold});\n }\n\n const geometryId = \"\" + nextGeometryId++;\n const meshId = \"\" + nextGeometryId++;\n const entityId = \"\" + nextGeometryId++;\n\n ctx.xktModel.createGeometry({\n geometryId: geometryId,\n primitiveType: \"triangles\",\n positions: positions,\n normals: (!ctx.autoNormals) ? normals : null,\n colors: colors,\n indices: indices\n });\n\n ctx.xktModel.createMesh({\n meshId: meshId,\n geometryId: geometryId,\n color: colors ? null : [1, 1, 1],\n metallic: 0.9,\n roughness: 0.1\n });\n\n ctx.xktModel.createEntity({\n entityId: entityId,\n meshIds: [meshId]\n });\n\n ctx.xktModel.createMetaObject({\n metaObjectId: entityId,\n metaObjectType: \"Default\",\n metaObjectName: \"STL Mesh\",\n parentMetaObjectId: ctx.rootMetaObject.metaObjectId\n });\n\n ctx.stats.numGeometries++;\n ctx.stats.numObjects++;\n ctx.stats.numVertices += positions.length / 3;\n ctx.stats.numTriangles += indices.length / 3;\n}\n\nfunction ensureString(buffer) {\n if (typeof buffer !== 'string') {\n return decodeText(new Uint8Array(buffer));\n }\n return buffer;\n}\n\nfunction ensureBinary(buffer) {\n if (typeof buffer === 'string') {\n const arrayBuffer = new Uint8Array(buffer.length);\n for (let i = 0; i < buffer.length; i++) {\n arrayBuffer[i] = buffer.charCodeAt(i) & 0xff; // implicitly assumes little-endian\n }\n return arrayBuffer.buffer || arrayBuffer;\n } else {\n return buffer;\n }\n}\n\nfunction decodeText(array) {\n if (typeof TextDecoder !== 'undefined') {\n return new TextDecoder().decode(array);\n }\n let s = '';\n for (let i = 0, il = array.length; i < il; i++) {\n s += String.fromCharCode(array[i]); // Implicitly assumes little-endian.\n }\n return decodeURIComponent(escape(s));\n}\n\nexport {parseSTLIntoXKTModel};\n","import {math} from \"./math.js\";\n\n/**\n * Converts surface-perpendicular face normals to vertex normals. Assumes that the mesh contains disjoint triangles\n * that don't share vertex array elements. Works by finding groups of vertices that have the same location and\n * averaging their normal vectors.\n *\n * @returns {{positions: Array, normals: *}}\n * @private\n */\nfunction faceToVertexNormals(positions, normals, options = {}) {\n const smoothNormalsAngleThreshold = options.smoothNormalsAngleThreshold || 20;\n const vertexMap = {};\n const vertexNormals = [];\n const vertexNormalAccum = {};\n let acc;\n let vx;\n let vy;\n let vz;\n let key;\n const precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001\n const precision = 10 ** precisionPoints;\n let posi;\n let i;\n let j;\n let len;\n let a;\n let b;\n let c;\n\n for (i = 0, len = positions.length; i < len; i += 3) {\n\n posi = i / 3;\n\n vx = positions[i];\n vy = positions[i + 1];\n vz = positions[i + 2];\n\n key = `${Math.round(vx * precision)}_${Math.round(vy * precision)}_${Math.round(vz * precision)}`;\n\n if (vertexMap[key] === undefined) {\n vertexMap[key] = [posi];\n } else {\n vertexMap[key].push(posi);\n }\n\n const normal = math.normalizeVec3([normals[i], normals[i + 1], normals[i + 2]]);\n\n vertexNormals[posi] = normal;\n\n acc = math.vec4([normal[0], normal[1], normal[2], 1]);\n\n vertexNormalAccum[posi] = acc;\n }\n\n for (key in vertexMap) {\n\n if (vertexMap.hasOwnProperty(key)) {\n\n const vertices = vertexMap[key];\n const numVerts = vertices.length;\n\n for (i = 0; i < numVerts; i++) {\n\n const ii = vertices[i];\n\n acc = vertexNormalAccum[ii];\n\n for (j = 0; j < numVerts; j++) {\n\n if (i === j) {\n continue;\n }\n\n const jj = vertices[j];\n\n a = vertexNormals[ii];\n b = vertexNormals[jj];\n\n const angle = Math.abs(math.angleVec3(a, b) / math.DEGTORAD);\n\n if (angle < smoothNormalsAngleThreshold) {\n\n acc[0] += b[0];\n acc[1] += b[1];\n acc[2] += b[2];\n acc[3] += 1.0;\n }\n }\n }\n }\n }\n\n for (i = 0, len = normals.length; i < len; i += 3) {\n\n acc = vertexNormalAccum[i / 3];\n\n normals[i + 0] = acc[0] / acc[3];\n normals[i + 1] = acc[1] / acc[3];\n normals[i + 2] = acc[2] / acc[3];\n\n }\n}\n\nexport {faceToVertexNormals};","/**\n * @desc Creates box-shaped triangle mesh geometry arrays.\n *\n * ## Usage\n *\n * In the example below we'll create an {@link XKTModel}, then create an {@link XKTMesh} with a box-shaped {@link XKTGeometry}.\n *\n * [[Run this example](http://xeokit.github.io/xeokit-sdk/examples/#geometry_builders_buildBoxGeometry)]\n *\n * ````javascript\n * const xktModel = new XKTModel();\n *\n * const box = buildBoxGeometry({\n * primitiveType: \"triangles\" // or \"lines\"\n * center: [0,0,0],\n * xSize: 1, // Half-size on each axis\n * ySize: 1,\n * zSize: 1\n * });\n *\n * const xktGeometry = xktModel.createGeometry({\n * geometryId: \"boxGeometry\",\n * primitiveType: box.primitiveType,\n * positions: box.positions,\n * normals: box.normals,\n * indices: box.indices\n * });\n *\n * const xktMesh = xktModel.createMesh({\n * meshId: \"redBoxMesh\",\n * geometryId: \"boxGeometry\",\n * position: [-4, -6, -4],\n * scale: [1, 3, 1],\n * rotation: [0, 0, 0],\n * color: [1, 0, 0],\n * opacity: 1\n * });\n *\n * const xktEntity = xktModel.createEntity({\n * entityId: \"redBox\",\n * meshIds: [\"redBoxMesh\"]\n * });\n *\n * xktModel.finalize();\n * ````\n *\n * @function buildBoxGeometry\n * @param {*} [cfg] Configs\n * @param {Number[]} [cfg.center] 3D point indicating the center position.\n * @param {Number} [cfg.xSize=1.0] Half-size on the X-axis.\n * @param {Number} [cfg.ySize=1.0] Half-size on the Y-axis.\n * @param {Number} [cfg.zSize=1.0] Half-size on the Z-axis.\n * @returns {Object} Geometry arrays for {@link XKTModel#createGeometry} or {@link XKTModel#createMesh}.\n */\nfunction buildBoxGeometry(cfg = {}) {\n\n let xSize = cfg.xSize || 1;\n if (xSize < 0) {\n console.error(\"negative xSize not allowed - will invert\");\n xSize *= -1;\n }\n\n let ySize = cfg.ySize || 1;\n if (ySize < 0) {\n console.error(\"negative ySize not allowed - will invert\");\n ySize *= -1;\n }\n\n let zSize = cfg.zSize || 1;\n if (zSize < 0) {\n console.error(\"negative zSize not allowed - will invert\");\n zSize *= -1;\n }\n\n const center = cfg.center;\n const centerX = center ? center[0] : 0;\n const centerY = center ? center[1] : 0;\n const centerZ = center ? center[2] : 0;\n\n const xmin = -xSize + centerX;\n const ymin = -ySize + centerY;\n const zmin = -zSize + centerZ;\n const xmax = xSize + centerX;\n const ymax = ySize + centerY;\n const zmax = zSize + centerZ;\n\n return {\n\n primitiveType: \"triangles\",\n\n // The vertices - eight for our cube, each\n // one spanning three array elements for X,Y and Z\n\n positions: [\n\n // v0-v1-v2-v3 front\n xmax, ymax, zmax,\n xmin, ymax, zmax,\n xmin, ymin, zmax,\n xmax, ymin, zmax,\n\n // v0-v3-v4-v1 right\n xmax, ymax, zmax,\n xmax, ymin, zmax,\n xmax, ymin, zmin,\n xmax, ymax, zmin,\n\n // v0-v1-v6-v1 top\n xmax, ymax, zmax,\n xmax, ymax, zmin,\n xmin, ymax, zmin,\n xmin, ymax, zmax,\n\n // v1-v6-v7-v2 left\n xmin, ymax, zmax,\n xmin, ymax, zmin,\n xmin, ymin, zmin,\n xmin, ymin, zmax,\n\n // v7-v4-v3-v2 bottom\n xmin, ymin, zmin,\n xmax, ymin, zmin,\n xmax, ymin, zmax,\n xmin, ymin, zmax,\n\n // v4-v7-v6-v1 back\n xmax, ymin, zmin,\n xmin, ymin, zmin,\n xmin, ymax, zmin,\n xmax, ymax, zmin\n ],\n\n // Normal vectors, one for each vertex\n normals: [\n\n // v0-v1-v2-v3 front\n 0, 0, 1,\n 0, 0, 1,\n 0, 0, 1,\n 0, 0, 1,\n\n // v0-v3-v4-v5 right\n 1, 0, 0,\n 1, 0, 0,\n 1, 0, 0,\n 1, 0, 0,\n\n // v0-v5-v6-v1 top\n 0, 1, 0,\n 0, 1, 0,\n 0, 1, 0,\n 0, 1, 0,\n\n // v1-v6-v7-v2 left\n -1, 0, 0,\n -1, 0, 0,\n -1, 0, 0,\n -1, 0, 0,\n\n // v7-v4-v3-v2 bottom\n 0, -1, 0,\n 0, -1, 0,\n 0, -1, 0,\n 0, -1, 0,\n\n // v4-v7-v6-v5 back\n 0, 0, -1,\n 0, 0, -1,\n 0, 0, -1,\n 0, 0, -1\n ],\n\n // UV coords\n uv: [\n\n // v0-v1-v2-v3 front\n 1, 0,\n 0, 0,\n 0, 1,\n 1, 1,\n\n // v0-v3-v4-v1 right\n 0, 0,\n 0, 1,\n 1, 1,\n 1, 0,\n\n // v0-v1-v6-v1 top\n 1, 1,\n 1, 0,\n 0, 0,\n 0, 1,\n\n // v1-v6-v7-v2 left\n 1, 0,\n 0, 0,\n 0, 1,\n 1, 1,\n\n // v7-v4-v3-v2 bottom\n 0, 1,\n 1, 1,\n 1, 0,\n 0, 0,\n\n // v4-v7-v6-v1 back\n 0, 1,\n 1, 1,\n 1, 0,\n 0, 0\n ],\n\n // Indices - these organise the\n // positions and uv texture coordinates\n // into geometric primitives in accordance\n // with the \"primitive\" parameter,\n // in this case a set of three indices\n // for each triangle.\n //\n // Note that each triangle is specified\n // in counter-clockwise winding order.\n //\n // You can specify them in clockwise\n // order if you configure the Modes\n // node's frontFace flag as \"cw\", instead of\n // the default \"ccw\".\n indices: [\n 0, 1, 2,\n 0, 2, 3,\n // front\n 4, 5, 6,\n 4, 6, 7,\n // right\n 8, 9, 10,\n 8, 10, 11,\n // top\n 12, 13, 14,\n 12, 14, 15,\n // left\n 16, 17, 18,\n 16, 18, 19,\n // bottom\n 20, 21, 22,\n 20, 22, 23\n ]\n };\n}\n\nexport {buildBoxGeometry};\n","/**\n * @desc Creates box-shaped line segment geometry arrays.\n *\n * ## Usage\n *\n * In the example below we'll create an {@link XKTModel}, then create an {@link XKTMesh} with a box-shaped {@link XKTGeometry}.\n *\n * [[Run this example](http://xeokit.github.io/xeokit-sdk/examples/#geometry_builders_buildBoxLinesGeometry)]\n *\n * ````javascript\n * const xktModel = new XKTModel();\n *\n * const box = buildBoxLinesGeometry({\n * center: [0,0,0],\n * xSize: 1, // Half-size on each axis\n * ySize: 1,\n * zSize: 1\n * });\n *\n * const xktGeometry = xktModel.createGeometry({\n * geometryId: \"boxGeometry\",\n * primitiveType: box.primitiveType, // \"lines\"\n * positions: box.positions,\n * normals: box.normals,\n * indices: box.indices\n * });\n *\n * const xktMesh = xktModel.createMesh({\n * meshId: \"redBoxMesh\",\n * geometryId: \"boxGeometry\",\n * position: [-4, -6, -4],\n * scale: [1, 3, 1],\n * rotation: [0, 0, 0],\n * color: [1, 0, 0],\n * opacity: 1\n * });\n *\n * const xktEntity = xktModel.createEntity({\n * entityId: \"redBox\",\n * meshIds: [\"redBoxMesh\"]\n * });\n *\n * xktModel.finalize();\n * ````\n *\n * @function buildBoxLinesGeometry\n * @param {*} [cfg] Configs\n * @param {Number[]} [cfg.center] 3D point indicating the center position.\n * @param {Number} [cfg.xSize=1.0] Half-size on the X-axis.\n * @param {Number} [cfg.ySize=1.0] Half-size on the Y-axis.\n * @param {Number} [cfg.zSize=1.0] Half-size on the Z-axis.\n * @returns {Object} Geometry arrays for {@link XKTModel#createGeometry} or {@link XKTModel#createMesh}.\n */\nfunction buildBoxLinesGeometry(cfg = {}) {\n\n let xSize = cfg.xSize || 1;\n if (xSize < 0) {\n console.error(\"negative xSize not allowed - will invert\");\n xSize *= -1;\n }\n\n let ySize = cfg.ySize || 1;\n if (ySize < 0) {\n console.error(\"negative ySize not allowed - will invert\");\n ySize *= -1;\n }\n\n let zSize = cfg.zSize || 1;\n if (zSize < 0) {\n console.error(\"negative zSize not allowed - will invert\");\n zSize *= -1;\n }\n\n const center = cfg.center;\n const centerX = center ? center[0] : 0;\n const centerY = center ? center[1] : 0;\n const centerZ = center ? center[2] : 0;\n\n const xmin = -xSize + centerX;\n const ymin = -ySize + centerY;\n const zmin = -zSize + centerZ;\n const xmax = xSize + centerX;\n const ymax = ySize + centerY;\n const zmax = zSize + centerZ;\n\n return {\n primitiveType: \"lines\",\n positions: [\n xmin, ymin, zmin,\n xmin, ymin, zmax,\n xmin, ymax, zmin,\n xmin, ymax, zmax,\n xmax, ymin, zmin,\n xmax, ymin, zmax,\n xmax, ymax, zmin,\n xmax, ymax, zmax\n ],\n indices: [\n 0, 1,\n 1, 3,\n 3, 2,\n 2, 0,\n 4, 5,\n 5, 7,\n 7, 6,\n 6, 4,\n 0, 4,\n 1, 5,\n 2, 6,\n 3, 7\n ]\n }\n}\n\nexport {buildBoxLinesGeometry};\n","/**\n * @desc Creates cylinder-shaped geometry arrays.\n *\n * ## Usage\n *\n * In the example below we'll create an {@link XKTModel}, then create an {@link XKTMesh} with a cylinder-shaped {@link XKTGeometry}.\n *\n * [[Run this example](http://xeokit.github.io/xeokit-sdk/examples/#geometry_builders_buildCylinderGeometry)]\n *\n * ````javascript\n * const xktModel = new XKTModel();\n *\n * const cylinder = buildCylinderGeometry({\n * center: [0,0,0],\n * radiusTop: 2.0,\n * radiusBottom: 2.0,\n * height: 5.0,\n * radialSegments: 20,\n * heightSegments: 1,\n * openEnded: false\n * });\n *\n * const xktGeometry = xktModel.createGeometry({\n * geometryId: \"cylinderGeometry\",\n * primitiveType: cylinder.primitiveType,\n * positions: cylinder.positions,\n * normals: cylinder.normals,\n * indices: cylinder.indices\n * });\n *\n * const xktMesh = xktModel.createMesh({\n * meshId: \"redCylinderMesh\",\n * geometryId: \"cylinderGeometry\",\n * position: [-4, -6, -4],\n * scale: [1, 3, 1],\n * rotation: [0, 0, 0],\n * color: [1, 0, 0],\n * opacity: 1\n * });\n *\n * const xktEntity = xktModel.createEntity({\n * entityId: \"redCylinder\",\n * meshIds: [\"redCylinderMesh\"]\n * });\n *\n * xktModel.finalize();\n * ````\n *\n * @function buildCylinderGeometry\n * @param {*} [cfg] Configs\n * @param {Number[]} [cfg.center] 3D point indicating the center position.\n * @param {Number} [cfg.radiusTop=1] Radius of top.\n * @param {Number} [cfg.radiusBottom=1] Radius of bottom.\n * @param {Number} [cfg.height=1] Height.\n * @param {Number} [cfg.radialSegments=60] Number of horizontal segments.\n * @param {Number} [cfg.heightSegments=1] Number of vertical segments.\n * @param {Boolean} [cfg.openEnded=false] Whether or not the cylinder has solid caps on the ends.\n * @returns {Object} Geometry arrays for {@link XKTModel#createGeometry} or {@link XKTModel#createMesh}.\n */\nfunction buildCylinderGeometry(cfg = {}) {\n\n let radiusTop = cfg.radiusTop || 1;\n if (radiusTop < 0) {\n console.error(\"negative radiusTop not allowed - will invert\");\n radiusTop *= -1;\n }\n\n let radiusBottom = cfg.radiusBottom || 1;\n if (radiusBottom < 0) {\n console.error(\"negative radiusBottom not allowed - will invert\");\n radiusBottom *= -1;\n }\n\n let height = cfg.height || 1;\n if (height < 0) {\n console.error(\"negative height not allowed - will invert\");\n height *= -1;\n }\n\n let radialSegments = cfg.radialSegments || 32;\n if (radialSegments < 0) {\n console.error(\"negative radialSegments not allowed - will invert\");\n radialSegments *= -1;\n }\n if (radialSegments < 3) {\n radialSegments = 3;\n }\n\n let heightSegments = cfg.heightSegments || 1;\n if (heightSegments < 0) {\n console.error(\"negative heightSegments not allowed - will invert\");\n heightSegments *= -1;\n }\n if (heightSegments < 1) {\n heightSegments = 1;\n }\n\n const openEnded = !!cfg.openEnded;\n\n let center = cfg.center;\n const centerX = center ? center[0] : 0;\n const centerY = center ? center[1] : 0;\n const centerZ = center ? center[2] : 0;\n\n const heightHalf = height / 2;\n const heightLength = height / heightSegments;\n const radialAngle = (2.0 * Math.PI / radialSegments);\n const radialLength = 1.0 / radialSegments;\n //var nextRadius = this._radiusBottom;\n const radiusChange = (radiusTop - radiusBottom) / heightSegments;\n\n const positions = [];\n const normals = [];\n const uvs = [];\n const indices = [];\n\n let h;\n let i;\n\n let x;\n let z;\n\n let currentRadius;\n let currentHeight;\n\n let first;\n let second;\n\n let startIndex;\n let tu;\n let tv;\n\n // create vertices\n const normalY = (90.0 - (Math.atan(height / (radiusBottom - radiusTop))) * 180 / Math.PI) / 90.0;\n\n for (h = 0; h <= heightSegments; h++) {\n currentRadius = radiusTop - h * radiusChange;\n currentHeight = heightHalf - h * heightLength;\n\n for (i = 0; i <= radialSegments; i++) {\n x = Math.sin(i * radialAngle);\n z = Math.cos(i * radialAngle);\n\n normals.push(currentRadius * x);\n normals.push(normalY); //todo\n normals.push(currentRadius * z);\n\n uvs.push((i * radialLength));\n uvs.push(h * 1 / heightSegments);\n\n positions.push((currentRadius * x) + centerX);\n positions.push((currentHeight) + centerY);\n positions.push((currentRadius * z) + centerZ);\n }\n }\n\n // create faces\n for (h = 0; h < heightSegments; h++) {\n for (i = 0; i <= radialSegments; i++) {\n\n first = h * (radialSegments + 1) + i;\n second = first + radialSegments;\n\n indices.push(first);\n indices.push(second);\n indices.push(second + 1);\n\n indices.push(first);\n indices.push(second + 1);\n indices.push(first + 1);\n }\n }\n\n // create top cap\n if (!openEnded && radiusTop > 0) {\n startIndex = (positions.length / 3);\n\n // top center\n normals.push(0.0);\n normals.push(1.0);\n normals.push(0.0);\n\n uvs.push(0.5);\n uvs.push(0.5);\n\n positions.push(0 + centerX);\n positions.push(heightHalf + centerY);\n positions.push(0 + centerZ);\n\n // top triangle fan\n for (i = 0; i <= radialSegments; i++) {\n x = Math.sin(i * radialAngle);\n z = Math.cos(i * radialAngle);\n tu = (0.5 * Math.sin(i * radialAngle)) + 0.5;\n tv = (0.5 * Math.cos(i * radialAngle)) + 0.5;\n\n normals.push(radiusTop * x);\n normals.push(1.0);\n normals.push(radiusTop * z);\n\n uvs.push(tu);\n uvs.push(tv);\n\n positions.push((radiusTop * x) + centerX);\n positions.push((heightHalf) + centerY);\n positions.push((radiusTop * z) + centerZ);\n }\n\n for (i = 0; i < radialSegments; i++) {\n center = startIndex;\n first = startIndex + 1 + i;\n\n indices.push(first);\n indices.push(first + 1);\n indices.push(center);\n }\n }\n\n // create bottom cap\n if (!openEnded && radiusBottom > 0) {\n\n startIndex = (positions.length / 3);\n\n // top center\n normals.push(0.0);\n normals.push(-1.0);\n normals.push(0.0);\n\n uvs.push(0.5);\n uvs.push(0.5);\n\n positions.push(0 + centerX);\n positions.push(0 - heightHalf + centerY);\n positions.push(0 + centerZ);\n\n // top triangle fan\n for (i = 0; i <= radialSegments; i++) {\n\n x = Math.sin(i * radialAngle);\n z = Math.cos(i * radialAngle);\n\n tu = (0.5 * Math.sin(i * radialAngle)) + 0.5;\n tv = (0.5 * Math.cos(i * radialAngle)) + 0.5;\n\n normals.push(radiusBottom * x);\n normals.push(-1.0);\n normals.push(radiusBottom * z);\n\n uvs.push(tu);\n uvs.push(tv);\n\n positions.push((radiusBottom * x) + centerX);\n positions.push((0 - heightHalf) + centerY);\n positions.push((radiusBottom * z) + centerZ);\n }\n\n for (i = 0; i < radialSegments; i++) {\n\n center = startIndex;\n first = startIndex + 1 + i;\n\n indices.push(center);\n indices.push(first + 1);\n indices.push(first);\n }\n }\n\n return {\n primitiveType: \"triangles\",\n positions: positions,\n normals: normals,\n uv: uvs,\n uvs: uvs,\n indices: indices\n };\n}\n\n\nexport {buildCylinderGeometry};\n","/**\n * @desc Creates grid-shaped geometry arrays..\n *\n * ## Usage\n *\n * In the example below we'll create an {@link XKTModel}, then create an {@link XKTMesh} with a grid-shaped {@link XKTGeometry}.\n *\n * [[Run this example](http://xeokit.github.io/xeokit-sdk/examples/#geometry_builders_buildGridGeometry)]\n *\n * ````javascript\n * const xktModel = new XKTModel();\n *\n * const grid = buildGridGeometry({\n * size: 1000,\n * divisions: 500\n * });\n *\n * const xktGeometry = xktModel.createGeometry({\n * geometryId: \"gridGeometry\",\n * primitiveType: grid.primitiveType, // Will be \"lines\"\n * positions: grid.positions,\n * indices: grid.indices\n * });\n *\n * const xktMesh = xktModel.createMesh({\n * meshId: \"redGridMesh\",\n * geometryId: \"gridGeometry\",\n * position: [-4, -6, -4],\n * scale: [1, 3, 1],\n * rotation: [0, 0, 0],\n * color: [1, 0, 0],\n * opacity: 1\n * });\n *\n * const xktEntity = xktModel.createEntity({\n * entityId: \"redGrid\",\n * meshIds: [\"redGridMesh\"]\n * });\n *\n * xktModel.finalize();\n * ````\n *\n * @function buildGridGeometry\n * @param {*} [cfg] Configs\n * @param {Number} [cfg.size=1] Dimension on the X and Z-axis.\n * @param {Number} [cfg.divisions=1] Number of divisions on X and Z axis..\n * @returns {Object} Geometry arrays for {@link XKTModel#createGeometry} or {@link XKTModel#createMesh}.\n */\nfunction buildGridGeometry(cfg = {}) {\n\n let size = cfg.size || 1;\n if (size < 0) {\n console.error(\"negative size not allowed - will invert\");\n size *= -1;\n }\n\n let divisions = cfg.divisions || 1;\n if (divisions < 0) {\n console.error(\"negative divisions not allowed - will invert\");\n divisions *= -1;\n }\n if (divisions < 1) {\n divisions = 1;\n }\n\n size = size || 10;\n divisions = divisions || 10;\n\n const step = size / divisions;\n const halfSize = size / 2;\n\n const positions = [];\n const indices = [];\n let l = 0;\n\n for (let i = 0, j = 0, k = -halfSize; i <= divisions; i++, k += step) {\n\n positions.push(-halfSize);\n positions.push(0);\n positions.push(k);\n\n positions.push(halfSize);\n positions.push(0);\n positions.push(k);\n\n positions.push(k);\n positions.push(0);\n positions.push(-halfSize);\n\n positions.push(k);\n positions.push(0);\n positions.push(halfSize);\n\n indices.push(l++);\n indices.push(l++);\n indices.push(l++);\n indices.push(l++);\n }\n\n return {\n primitiveType: \"lines\",\n positions: positions,\n indices: indices\n };\n}\n\n\nexport {buildGridGeometry};\n","/**\n * @desc Creates plane-shaped geometry arrays.\n *\n * ## Usage\n *\n * In the example below we'll create an {@link XKTModel}, then create an {@link XKTMesh} with a plane-shaped {@link XKTGeometry}.\n *\n * [[Run this example](http://xeokit.github.io/xeokit-sdk/examples/#geometry_builders_buildPlaneGeometry)]\n *\n * ````javascript\n * const xktModel = new XKTModel();\n *\n * const plane = buildPlaneGeometry({\n * center: [0,0,0],\n * xSize: 2,\n * zSize: 2,\n * xSegments: 10,\n * zSegments: 10\n * });\n *\n * const xktGeometry = xktModel.createGeometry({\n * geometryId: \"planeGeometry\",\n * primitiveType: plane.primitiveType, // Will be \"triangles\"\n * positions: plane.positions,\n * normals: plane.normals,\n * indices: plane.indices\n * });\n *\n * const xktMesh = xktModel.createMesh({\n * meshId: \"redPlaneMesh\",\n * geometryId: \"planeGeometry\",\n * position: [-4, -6, -4],\n * scale: [1, 3, 1],\n * rotation: [0, 0, 0],\n * color: [1, 0, 0],\n * opacity: 1\n * });\n *\n * const xktEntity = xktModel.createEntity({\n * entityId: \"redPlane\",\n * meshIds: [\"redPlaneMesh\"]\n * });\n *\n * xktModel.finalize();\n * ````\n *\n * @function buildPlaneGeometry\n * @param {*} [cfg] Configs\n * @param {Number[]} [cfg.center] 3D point indicating the center position.\n * @param {Number} [cfg.xSize=1] Dimension on the X-axis.\n * @param {Number} [cfg.zSize=1] Dimension on the Z-axis.\n * @param {Number} [cfg.xSegments=1] Number of segments on the X-axis.\n * @param {Number} [cfg.zSegments=1] Number of segments on the Z-axis.\n * @returns {Object} Geometry arrays for {@link XKTModel#createGeometry} or {@link XKTModel#createMesh}.\n */\nfunction buildPlaneGeometry(cfg = {}) {\n\n let xSize = cfg.xSize || 1;\n if (xSize < 0) {\n console.error(\"negative xSize not allowed - will invert\");\n xSize *= -1;\n }\n\n let zSize = cfg.zSize || 1;\n if (zSize < 0) {\n console.error(\"negative zSize not allowed - will invert\");\n zSize *= -1;\n }\n\n let xSegments = cfg.xSegments || 1;\n if (xSegments < 0) {\n console.error(\"negative xSegments not allowed - will invert\");\n xSegments *= -1;\n }\n if (xSegments < 1) {\n xSegments = 1;\n }\n\n let zSegments = cfg.xSegments || 1;\n if (zSegments < 0) {\n console.error(\"negative zSegments not allowed - will invert\");\n zSegments *= -1;\n }\n if (zSegments < 1) {\n zSegments = 1;\n }\n\n const center = cfg.center;\n const centerX = center ? center[0] : 0;\n const centerY = center ? center[1] : 0;\n const centerZ = center ? center[2] : 0;\n\n const halfWidth = xSize / 2;\n const halfHeight = zSize / 2;\n\n const planeX = Math.floor(xSegments) || 1;\n const planeZ = Math.floor(zSegments) || 1;\n\n const planeX1 = planeX + 1;\n const planeZ1 = planeZ + 1;\n\n const segmentWidth = xSize / planeX;\n const segmentHeight = zSize / planeZ;\n\n const positions = new Float32Array(planeX1 * planeZ1 * 3);\n const normals = new Float32Array(planeX1 * planeZ1 * 3);\n const uvs = new Float32Array(planeX1 * planeZ1 * 2);\n\n let offset = 0;\n let offset2 = 0;\n\n let iz;\n let ix;\n let x;\n let a;\n let b;\n let c;\n let d;\n\n for (iz = 0; iz < planeZ1; iz++) {\n\n const z = iz * segmentHeight - halfHeight;\n\n for (ix = 0; ix < planeX1; ix++) {\n\n x = ix * segmentWidth - halfWidth;\n\n positions[offset] = x + centerX;\n positions[offset + 1] = centerY;\n positions[offset + 2] = -z + centerZ;\n\n normals[offset + 2] = -1;\n\n uvs[offset2] = (ix) / planeX;\n uvs[offset2 + 1] = ((planeZ - iz) / planeZ);\n\n offset += 3;\n offset2 += 2;\n }\n }\n\n offset = 0;\n\n const indices = new ((positions.length / 3) > 65535 ? Uint32Array : Uint16Array)(planeX * planeZ * 6);\n\n for (iz = 0; iz < planeZ; iz++) {\n\n for (ix = 0; ix < planeX; ix++) {\n\n a = ix + planeX1 * iz;\n b = ix + planeX1 * (iz + 1);\n c = (ix + 1) + planeX1 * (iz + 1);\n d = (ix + 1) + planeX1 * iz;\n\n indices[offset] = d;\n indices[offset + 1] = b;\n indices[offset + 2] = a;\n\n indices[offset + 3] = d;\n indices[offset + 4] = c;\n indices[offset + 5] = b;\n\n offset += 6;\n }\n }\n\n return {\n primitiveType: \"triangles\",\n positions: positions,\n normals: normals,\n uv: uvs,\n uvs: uvs,\n indices: indices\n };\n}\n\nexport {buildPlaneGeometry};\n","/**\n * @desc Creates sphere-shaped geometry arrays.\n *\n * ## Usage\n *\n * In the example below we'll create an {@link XKTModel}, then create an {@link XKTMesh} with a sphere-shaped {@link XKTGeometry}.\n *\n * [[Run this example](http://xeokit.github.io/xeokit-sdk/examples/#geometry_builders_buildSphereGeometry)]\n *\n * ````javascript\n * const xktModel = new XKTModel();\n *\n * const sphere = buildSphereGeometry({\n * center: [0,0,0],\n * radius: 1.5,\n * heightSegments: 60,\n * widthSegments: 60\n * });\n *\n * const xktGeometry = xktModel.createGeometry({\n * geometryId: \"sphereGeometry\",\n * primitiveType: sphere.primitiveType, // Will be \"triangles\"\n * positions: sphere.positions,\n * normals: sphere.normals,\n * indices: sphere.indices\n * });\n *\n * const xktMesh = xktModel.createMesh({\n * meshId: \"redSphereMesh\",\n * geometryId: \"sphereGeometry\",\n * position: [-4, -6, -4],\n * scale: [1, 3, 1],\n * rotation: [0, 0, 0],\n * color: [1, 0, 0],\n * opacity: 1\n * });\n *\n *const xktEntity = xktModel.createEntity({\n * entityId: \"redSphere\",\n * meshIds: [\"redSphereMesh\"]\n * });\n *\n * xktModel.finalize();\n * ````\n *\n * @function buildSphereGeometry\n * @param {*} [cfg] Configs\n * @param {Number[]} [cfg.center] 3D point indicating the center position.\n * @param {Number} [cfg.radius=1] Radius.\n * @param {Number} [cfg.heightSegments=24] Number of latitudinal bands.\n * @param {Number} [cfg.widthSegments=18] Number of longitudinal bands.\n * @returns {Object} Geometry arrays for {@link XKTModel#createGeometry} or {@link XKTModel#createMesh}.\n */\nfunction buildSphereGeometry(cfg = {}) {\n\n const lod = cfg.lod || 1;\n\n const centerX = cfg.center ? cfg.center[0] : 0;\n const centerY = cfg.center ? cfg.center[1] : 0;\n const centerZ = cfg.center ? cfg.center[2] : 0;\n\n let radius = cfg.radius || 1;\n if (radius < 0) {\n console.error(\"negative radius not allowed - will invert\");\n radius *= -1;\n }\n\n let heightSegments = cfg.heightSegments || 18;\n if (heightSegments < 0) {\n console.error(\"negative heightSegments not allowed - will invert\");\n heightSegments *= -1;\n }\n heightSegments = Math.floor(lod * heightSegments);\n if (heightSegments < 18) {\n heightSegments = 18;\n }\n\n let widthSegments = cfg.widthSegments || 18;\n if (widthSegments < 0) {\n console.error(\"negative widthSegments not allowed - will invert\");\n widthSegments *= -1;\n }\n widthSegments = Math.floor(lod * widthSegments);\n if (widthSegments < 18) {\n widthSegments = 18;\n }\n\n const positions = [];\n const normals = [];\n const uvs = [];\n const indices = [];\n\n let i;\n let j;\n\n let theta;\n let sinTheta;\n let cosTheta;\n\n let phi;\n let sinPhi;\n let cosPhi;\n\n let x;\n let y;\n let z;\n\n let u;\n let v;\n\n let first;\n let second;\n\n for (i = 0; i <= heightSegments; i++) {\n\n theta = i * Math.PI / heightSegments;\n sinTheta = Math.sin(theta);\n cosTheta = Math.cos(theta);\n\n for (j = 0; j <= widthSegments; j++) {\n\n phi = j * 2 * Math.PI / widthSegments;\n sinPhi = Math.sin(phi);\n cosPhi = Math.cos(phi);\n\n x = cosPhi * sinTheta;\n y = cosTheta;\n z = sinPhi * sinTheta;\n u = 1.0 - j / widthSegments;\n v = i / heightSegments;\n\n normals.push(x);\n normals.push(y);\n normals.push(z);\n\n uvs.push(u);\n uvs.push(v);\n\n positions.push(centerX + radius * x);\n positions.push(centerY + radius * y);\n positions.push(centerZ + radius * z);\n }\n }\n\n for (i = 0; i < heightSegments; i++) {\n for (j = 0; j < widthSegments; j++) {\n\n first = (i * (widthSegments + 1)) + j;\n second = first + widthSegments + 1;\n\n indices.push(first + 1);\n indices.push(second + 1);\n indices.push(second);\n indices.push(first + 1);\n indices.push(second);\n indices.push(first);\n }\n }\n\n return {\n primitiveType: \"triangles\",\n positions: positions,\n normals: normals,\n uv: uvs,\n uvs: uvs,\n indices: indices\n };\n}\n\nexport {buildSphereGeometry};\n","import {math} from '../lib/math.js';\n\n/**\n * @desc Creates torus-shaped geometry arrays.\n *\n * ## Usage\n *\n * In the example below we'll create an {@link XKTModel}, then create an {@link XKTMesh} with a torus-shaped {@link XKTGeometry}.\n *\n * [[Run this example](http://xeokit.github.io/xeokit-sdk/examples/#geometry_builders_buildTorusGeometry)]\n *\n * ````javascript\n * const xktModel = new XKTModel();\n *\n * const torus = buildTorusGeometry({\n * center: [0,0,0],\n * radius: 1.0,\n * tube: 0.5,\n * radialSegments: 32,\n * tubeSegments: 24,\n * arc: Math.PI * 2.0\n * });\n *\n * const xktGeometry = xktModel.createGeometry({\n * geometryId: \"torusGeometry\",\n * primitiveType: torus.primitiveType, // Will be \"triangles\"\n * positions: torus.positions,\n * normals: torus.normals,\n * indices: torus.indices\n * });\n *\n * const xktMesh = xktModel.createMesh({\n * meshId: \"redTorusMesh\",\n * geometryId: \"torusGeometry\",\n * position: [-4, -6, -4],\n * scale: [1, 3, 1],\n * rotation: [0, 0, 0],\n * color: [1, 0, 0],\n * opacity: 1\n * });\n *\n * const xktEntity = xktModel.createEntity({\n * entityId: \"redTorus\",\n * meshIds: [\"redTorusMesh\"]\n * });\n *\n * xktModel.finalize();\n * ````\n *\n * @function buildTorusGeometry\n * @param {*} [cfg] Configs\n * @param {Number[]} [cfg.center] 3D point indicating the center position.\n * @param {Number} [cfg.radius=1] The overall radius.\n * @param {Number} [cfg.tube=0.3] The tube radius.\n * @param {Number} [cfg.radialSegments=32] The number of radial segments.\n * @param {Number} [cfg.tubeSegments=24] The number of tubular segments.\n * @param {Number} [cfg.arc=Math.PI*0.5] The length of the arc in radians, where Math.PI*2 is a closed torus.\n * @returns {Object} Geometry arrays for {@link XKTModel#createGeometry} or {@link XKTModel#createMesh}.\n */\nfunction buildTorusGeometry(cfg = {}) {\n\n let radius = cfg.radius || 1;\n if (radius < 0) {\n console.error(\"negative radius not allowed - will invert\");\n radius *= -1;\n }\n radius *= 0.5;\n\n let tube = cfg.tube || 0.3;\n if (tube < 0) {\n console.error(\"negative tube not allowed - will invert\");\n tube *= -1;\n }\n\n let radialSegments = cfg.radialSegments || 32;\n if (radialSegments < 0) {\n console.error(\"negative radialSegments not allowed - will invert\");\n radialSegments *= -1;\n }\n if (radialSegments < 4) {\n radialSegments = 4;\n }\n\n let tubeSegments = cfg.tubeSegments || 24;\n if (tubeSegments < 0) {\n console.error(\"negative tubeSegments not allowed - will invert\");\n tubeSegments *= -1;\n }\n if (tubeSegments < 4) {\n tubeSegments = 4;\n }\n\n let arc = cfg.arc || Math.PI * 2;\n if (arc < 0) {\n console.warn(\"negative arc not allowed - will invert\");\n arc *= -1;\n }\n if (arc > 360) {\n arc = 360;\n }\n\n const center = cfg.center;\n let centerX = center ? center[0] : 0;\n let centerY = center ? center[1] : 0;\n const centerZ = center ? center[2] : 0;\n\n const positions = [];\n const normals = [];\n const uvs = [];\n const indices = [];\n\n let u;\n let v;\n let x;\n let y;\n let z;\n let vec;\n\n let i;\n let j;\n\n for (j = 0; j <= tubeSegments; j++) {\n for (i = 0; i <= radialSegments; i++) {\n\n u = i / radialSegments * arc;\n v = 0.785398 + (j / tubeSegments * Math.PI * 2);\n\n centerX = radius * Math.cos(u);\n centerY = radius * Math.sin(u);\n\n x = (radius + tube * Math.cos(v)) * Math.cos(u);\n y = (radius + tube * Math.cos(v)) * Math.sin(u);\n z = tube * Math.sin(v);\n\n positions.push(x + centerX);\n positions.push(y + centerY);\n positions.push(z + centerZ);\n\n uvs.push(1 - (i / radialSegments));\n uvs.push((j / tubeSegments));\n\n vec = math.normalizeVec3(math.subVec3([x, y, z], [centerX, centerY, centerZ], []), []);\n\n normals.push(vec[0]);\n normals.push(vec[1]);\n normals.push(vec[2]);\n }\n }\n\n let a;\n let b;\n let c;\n let d;\n\n for (j = 1; j <= tubeSegments; j++) {\n for (i = 1; i <= radialSegments; i++) {\n\n a = (radialSegments + 1) * j + i - 1;\n b = (radialSegments + 1) * (j - 1) + i - 1;\n c = (radialSegments + 1) * (j - 1) + i;\n d = (radialSegments + 1) * j + i;\n\n indices.push(a);\n indices.push(b);\n indices.push(c);\n\n indices.push(c);\n indices.push(d);\n indices.push(a);\n }\n }\n\n return {\n primitiveType: \"triangles\",\n positions: positions,\n normals: normals,\n uv: uvs,\n uvs: uvs,\n indices: indices\n };\n}\n\nexport {buildTorusGeometry};\n","const letters = {\n ' ': {width: 16, points: []},\n '!': {\n width: 10, points: [\n [5, 21],\n [5, 7],\n [-1, -1],\n [5, 2],\n [4, 1],\n [5, 0],\n [6, 1],\n [5, 2]\n ]\n },\n '\"': {\n width: 16, points: [\n [4, 21],\n [4, 14],\n [-1, -1],\n [12, 21],\n [12, 14]\n ]\n },\n '#': {\n width: 21, points: [\n [11, 25],\n [4, -7],\n [-1, -1],\n [17, 25],\n [10, -7],\n [-1, -1],\n [4, 12],\n [18, 12],\n [-1, -1],\n [3, 6],\n [17, 6]\n ]\n },\n '$': {\n width: 20, points: [\n [8, 25],\n [8, -4],\n [-1, -1],\n [12, 25],\n [12, -4],\n [-1, -1],\n [17, 18],\n [15, 20],\n [12, 21],\n [8, 21],\n [5, 20],\n [3, 18],\n [3, 16],\n [4, 14],\n [5, 13],\n [7, 12],\n [13, 10],\n [15, 9],\n [16, 8],\n [17, 6],\n [17, 3],\n [15, 1],\n [12, 0],\n [8, 0],\n [5, 1],\n [3, 3]\n ]\n },\n '%': {\n width: 24, points: [\n [21, 21],\n [3, 0],\n [-1, -1],\n [8, 21],\n [10, 19],\n [10, 17],\n [9, 15],\n [7, 14],\n [5, 14],\n [3, 16],\n [3, 18],\n [4, 20],\n [6, 21],\n [8, 21],\n [10, 20],\n [13, 19],\n [16, 19],\n [19, 20],\n [21, 21],\n [-1, -1],\n [17, 7],\n [15, 6],\n [14, 4],\n [14, 2],\n [16, 0],\n [18, 0],\n [20, 1],\n [21, 3],\n [21, 5],\n [19, 7],\n [17, 7]\n ]\n },\n '&': {\n width: 26, points: [\n [23, 12],\n [23, 13],\n [22, 14],\n [21, 14],\n [20, 13],\n [19, 11],\n [17, 6],\n [15, 3],\n [13, 1],\n [11, 0],\n [7, 0],\n [5, 1],\n [4, 2],\n [3, 4],\n [3, 6],\n [4, 8],\n [5, 9],\n [12, 13],\n [13, 14],\n [14, 16],\n [14, 18],\n [13, 20],\n [11, 21],\n [9, 20],\n [8, 18],\n [8, 16],\n [9, 13],\n [11, 10],\n [16, 3],\n [18, 1],\n [20, 0],\n [22, 0],\n [23, 1],\n [23, 2]\n ]\n },\n '\\'': {\n width: 10, points: [\n [5, 19],\n [4, 20],\n [5, 21],\n [6, 20],\n [6, 18],\n [5, 16],\n [4, 15]\n ]\n },\n '(': {\n width: 14, points: [\n [11, 25],\n [9, 23],\n [7, 20],\n [5, 16],\n [4, 11],\n [4, 7],\n [5, 2],\n [7, -2],\n [9, -5],\n [11, -7]\n ]\n },\n ')': {\n width: 14, points: [\n [3, 25],\n [5, 23],\n [7, 20],\n [9, 16],\n [10, 11],\n [10, 7],\n [9, 2],\n [7, -2],\n [5, -5],\n [3, -7]\n ]\n },\n '*': {\n width: 16, points: [\n [8, 21],\n [8, 9],\n [-1, -1],\n [3, 18],\n [13, 12],\n [-1, -1],\n [13, 18],\n [3, 12]\n ]\n },\n '+': {\n width: 26, points: [\n [13, 18],\n [13, 0],\n [-1, -1],\n [4, 9],\n [22, 9]\n ]\n },\n ',': {\n width: 10, points: [\n [6, 1],\n [5, 0],\n [4, 1],\n [5, 2],\n [6, 1],\n [6, -1],\n [5, -3],\n [4, -4]\n ]\n },\n '-': {\n width: 26, points: [\n [4, 9],\n [22, 9]\n ]\n },\n '.': {\n width: 10, points: [\n [5, 2],\n [4, 1],\n [5, 0],\n [6, 1],\n [5, 2]\n ]\n },\n '/': {\n width: 22, points: [\n [20, 25],\n [2, -7]\n ]\n },\n '0': {\n width: 20, points: [\n [9, 21],\n [6, 20],\n [4, 17],\n [3, 12],\n [3, 9],\n [4, 4],\n [6, 1],\n [9, 0],\n [11, 0],\n [14, 1],\n [16, 4],\n [17, 9],\n [17, 12],\n [16, 17],\n [14, 20],\n [11, 21],\n [9, 21]\n ]\n },\n '1': {\n width: 20, points: [\n [6, 17],\n [8, 18],\n [11, 21],\n [11, 0]\n ]\n },\n '2': {\n width: 20, points: [\n [4, 16],\n [4, 17],\n [5, 19],\n [6, 20],\n [8, 21],\n [12, 21],\n [14, 20],\n [15, 19],\n [16, 17],\n [16, 15],\n [15, 13],\n [13, 10],\n [3, 0],\n [17, 0]\n ]\n },\n '3': {\n width: 20, points: [\n [5, 21],\n [16, 21],\n [10, 13],\n [13, 13],\n [15, 12],\n [16, 11],\n [17, 8],\n [17, 6],\n [16, 3],\n [14, 1],\n [11, 0],\n [8, 0],\n [5, 1],\n [4, 2],\n [3, 4]\n ]\n },\n '4': {\n width: 20, points: [\n [13, 21],\n [3, 7],\n [18, 7],\n [-1, -1],\n [13, 21],\n [13, 0]\n ]\n },\n '5': {\n width: 20, points: [\n [15, 21],\n [5, 21],\n [4, 12],\n [5, 13],\n [8, 14],\n [11, 14],\n [14, 13],\n [16, 11],\n [17, 8],\n [17, 6],\n [16, 3],\n [14, 1],\n [11, 0],\n [8, 0],\n [5, 1],\n [4, 2],\n [3, 4]\n ]\n },\n '6': {\n width: 20, points: [\n [16, 18],\n [15, 20],\n [12, 21],\n [10, 21],\n [7, 20],\n [5, 17],\n [4, 12],\n [4, 7],\n [5, 3],\n [7, 1],\n [10, 0],\n [11, 0],\n [14, 1],\n [16, 3],\n [17, 6],\n [17, 7],\n [16, 10],\n [14, 12],\n [11, 13],\n [10, 13],\n [7, 12],\n [5, 10],\n [4, 7]\n ]\n },\n '7': {\n width: 20, points: [\n [17, 21],\n [7, 0],\n [-1, -1],\n [3, 21],\n [17, 21]\n ]\n },\n '8': {\n width: 20, points: [\n [8, 21],\n [5, 20],\n [4, 18],\n [4, 16],\n [5, 14],\n [7, 13],\n [11, 12],\n [14, 11],\n [16, 9],\n [17, 7],\n [17, 4],\n [16, 2],\n [15, 1],\n [12, 0],\n [8, 0],\n [5, 1],\n [4, 2],\n [3, 4],\n [3, 7],\n [4, 9],\n [6, 11],\n [9, 12],\n [13, 13],\n [15, 14],\n [16, 16],\n [16, 18],\n [15, 20],\n [12, 21],\n [8, 21]\n ]\n },\n '9': {\n width: 20, points: [\n [16, 14],\n [15, 11],\n [13, 9],\n [10, 8],\n [9, 8],\n [6, 9],\n [4, 11],\n [3, 14],\n [3, 15],\n [4, 18],\n [6, 20],\n [9, 21],\n [10, 21],\n [13, 20],\n [15, 18],\n [16, 14],\n [16, 9],\n [15, 4],\n [13, 1],\n [10, 0],\n [8, 0],\n [5, 1],\n [4, 3]\n ]\n },\n ':': {\n width: 10, points: [\n [5, 14],\n [4, 13],\n [5, 12],\n [6, 13],\n [5, 14],\n [-1, -1],\n [5, 2],\n [4, 1],\n [5, 0],\n [6, 1],\n [5, 2]\n ]\n },\n ';': {\n width: 10, points: [\n [5, 14],\n [4, 13],\n [5, 12],\n [6, 13],\n [5, 14],\n [-1, -1],\n [6, 1],\n [5, 0],\n [4, 1],\n [5, 2],\n [6, 1],\n [6, -1],\n [5, -3],\n [4, -4]\n ]\n },\n '<': {\n width: 24, points: [\n [20, 18],\n [4, 9],\n [20, 0]\n ]\n },\n '=': {\n width: 26, points: [\n [4, 12],\n [22, 12],\n [-1, -1],\n [4, 6],\n [22, 6]\n ]\n },\n '>': {\n width: 24, points: [\n [4, 18],\n [20, 9],\n [4, 0]\n ]\n },\n '?': {\n width: 18, points: [\n [3, 16],\n [3, 17],\n [4, 19],\n [5, 20],\n [7, 21],\n [11, 21],\n [13, 20],\n [14, 19],\n [15, 17],\n [15, 15],\n [14, 13],\n [13, 12],\n [9, 10],\n [9, 7],\n [-1, -1],\n [9, 2],\n [8, 1],\n [9, 0],\n [10, 1],\n [9, 2]\n ]\n },\n '@': {\n width: 27, points: [\n [18, 13],\n [17, 15],\n [15, 16],\n [12, 16],\n [10, 15],\n [9, 14],\n [8, 11],\n [8, 8],\n [9, 6],\n [11, 5],\n [14, 5],\n [16, 6],\n [17, 8],\n [-1, -1],\n [12, 16],\n [10, 14],\n [9, 11],\n [9, 8],\n [10, 6],\n [11, 5],\n [-1, -1],\n [18, 16],\n [17, 8],\n [17, 6],\n [19, 5],\n [21, 5],\n [23, 7],\n [24, 10],\n [24, 12],\n [23, 15],\n [22, 17],\n [20, 19],\n [18, 20],\n [15, 21],\n [12, 21],\n [9, 20],\n [7, 19],\n [5, 17],\n [4, 15],\n [3, 12],\n [3, 9],\n [4, 6],\n [5, 4],\n [7, 2],\n [9, 1],\n [12, 0],\n [15, 0],\n [18, 1],\n [20, 2],\n [21, 3],\n [-1, -1],\n [19, 16],\n [18, 8],\n [18, 6],\n [19, 5]\n ]\n },\n 'A': {\n width: 18, points: [\n [9, 21],\n [1, 0],\n [-1, -1],\n [9, 21],\n [17, 0],\n [-1, -1],\n [4, 7],\n [14, 7]\n ]\n },\n 'B': {\n width: 21, points: [\n [4, 21],\n [4, 0],\n [-1, -1],\n [4, 21],\n [13, 21],\n [16, 20],\n [17, 19],\n [18, 17],\n [18, 15],\n [17, 13],\n [16, 12],\n [13, 11],\n [-1, -1],\n [4, 11],\n [13, 11],\n [16, 10],\n [17, 9],\n [18, 7],\n [18, 4],\n [17, 2],\n [16, 1],\n [13, 0],\n [4, 0]\n ]\n },\n 'C': {\n width: 21, points: [\n [18, 16],\n [17, 18],\n [15, 20],\n [13, 21],\n [9, 21],\n [7, 20],\n [5, 18],\n [4, 16],\n [3, 13],\n [3, 8],\n [4, 5],\n [5, 3],\n [7, 1],\n [9, 0],\n [13, 0],\n [15, 1],\n [17, 3],\n [18, 5]\n ]\n },\n 'D': {\n width: 21, points: [\n [4, 21],\n [4, 0],\n [-1, -1],\n [4, 21],\n [11, 21],\n [14, 20],\n [16, 18],\n [17, 16],\n [18, 13],\n [18, 8],\n [17, 5],\n [16, 3],\n [14, 1],\n [11, 0],\n [4, 0]\n ]\n },\n 'E': {\n width: 19, points: [\n [4, 21],\n [4, 0],\n [-1, -1],\n [4, 21],\n [17, 21],\n [-1, -1],\n [4, 11],\n [12, 11],\n [-1, -1],\n [4, 0],\n [17, 0]\n ]\n },\n 'F': {\n width: 18, points: [\n [4, 21],\n [4, 0],\n [-1, -1],\n [4, 21],\n [17, 21],\n [-1, -1],\n [4, 11],\n [12, 11]\n ]\n },\n 'G': {\n width: 21, points: [\n [18, 16],\n [17, 18],\n [15, 20],\n [13, 21],\n [9, 21],\n [7, 20],\n [5, 18],\n [4, 16],\n [3, 13],\n [3, 8],\n [4, 5],\n [5, 3],\n [7, 1],\n [9, 0],\n [13, 0],\n [15, 1],\n [17, 3],\n [18, 5],\n [18, 8],\n [-1, -1],\n [13, 8],\n [18, 8]\n ]\n },\n 'H': {\n width: 22, points: [\n [4, 21],\n [4, 0],\n [-1, -1],\n [18, 21],\n [18, 0],\n [-1, -1],\n [4, 11],\n [18, 11]\n ]\n },\n 'I': {\n width: 8, points: [\n [4, 21],\n [4, 0]\n ]\n },\n 'J': {\n width: 16, points: [\n [12, 21],\n [12, 5],\n [11, 2],\n [10, 1],\n [8, 0],\n [6, 0],\n [4, 1],\n [3, 2],\n [2, 5],\n [2, 7]\n ]\n },\n 'K': {\n width: 21, points: [\n [4, 21],\n [4, 0],\n [-1, -1],\n [18, 21],\n [4, 7],\n [-1, -1],\n [9, 12],\n [18, 0]\n ]\n },\n 'L': {\n width: 17, points: [\n [4, 21],\n [4, 0],\n [-1, -1],\n [4, 0],\n [16, 0]\n ]\n },\n 'M': {\n width: 24, points: [\n [4, 21],\n [4, 0],\n [-1, -1],\n [4, 21],\n [12, 0],\n [-1, -1],\n [20, 21],\n [12, 0],\n [-1, -1],\n [20, 21],\n [20, 0]\n ]\n },\n 'N': {\n width: 22, points: [\n [4, 21],\n [4, 0],\n [-1, -1],\n [4, 21],\n [18, 0],\n [-1, -1],\n [18, 21],\n [18, 0]\n ]\n },\n 'O': {\n width: 22, points: [\n [9, 21],\n [7, 20],\n [5, 18],\n [4, 16],\n [3, 13],\n [3, 8],\n [4, 5],\n [5, 3],\n [7, 1],\n [9, 0],\n [13, 0],\n [15, 1],\n [17, 3],\n [18, 5],\n [19, 8],\n [19, 13],\n [18, 16],\n [17, 18],\n [15, 20],\n [13, 21],\n [9, 21]\n ]\n },\n 'P': {\n width: 21, points: [\n [4, 21],\n [4, 0],\n [-1, -1],\n [4, 21],\n [13, 21],\n [16, 20],\n [17, 19],\n [18, 17],\n [18, 14],\n [17, 12],\n [16, 11],\n [13, 10],\n [4, 10]\n ]\n },\n 'Q': {\n width: 22, points: [\n [9, 21],\n [7, 20],\n [5, 18],\n [4, 16],\n [3, 13],\n [3, 8],\n [4, 5],\n [5, 3],\n [7, 1],\n [9, 0],\n [13, 0],\n [15, 1],\n [17, 3],\n [18, 5],\n [19, 8],\n [19, 13],\n [18, 16],\n [17, 18],\n [15, 20],\n [13, 21],\n [9, 21],\n [-1, -1],\n [12, 4],\n [18, -2]\n ]\n },\n 'R': {\n width: 21, points: [\n [4, 21],\n [4, 0],\n [-1, -1],\n [4, 21],\n [13, 21],\n [16, 20],\n [17, 19],\n [18, 17],\n [18, 15],\n [17, 13],\n [16, 12],\n [13, 11],\n [4, 11],\n [-1, -1],\n [11, 11],\n [18, 0]\n ]\n },\n 'S': {\n width: 20, points: [\n [17, 18],\n [15, 20],\n [12, 21],\n [8, 21],\n [5, 20],\n [3, 18],\n [3, 16],\n [4, 14],\n [5, 13],\n [7, 12],\n [13, 10],\n [15, 9],\n [16, 8],\n [17, 6],\n [17, 3],\n [15, 1],\n [12, 0],\n [8, 0],\n [5, 1],\n [3, 3]\n ]\n },\n 'T': {\n width: 16, points: [\n [8, 21],\n [8, 0],\n [-1, -1],\n [1, 21],\n [15, 21]\n ]\n },\n 'U': {\n width: 22, points: [\n [4, 21],\n [4, 6],\n [5, 3],\n [7, 1],\n [10, 0],\n [12, 0],\n [15, 1],\n [17, 3],\n [18, 6],\n [18, 21]\n ]\n },\n 'V': {\n width: 18, points: [\n [1, 21],\n [9, 0],\n [-1, -1],\n [17, 21],\n [9, 0]\n ]\n },\n 'W': {\n width: 24, points: [\n [2, 21],\n [7, 0],\n [-1, -1],\n [12, 21],\n [7, 0],\n [-1, -1],\n [12, 21],\n [17, 0],\n [-1, -1],\n [22, 21],\n [17, 0]\n ]\n },\n 'X': {\n width: 20, points: [\n [3, 21],\n [17, 0],\n [-1, -1],\n [17, 21],\n [3, 0]\n ]\n },\n 'Y': {\n width: 18, points: [\n [1, 21],\n [9, 11],\n [9, 0],\n [-1, -1],\n [17, 21],\n [9, 11]\n ]\n },\n 'Z': {\n width: 20, points: [\n [17, 21],\n [3, 0],\n [-1, -1],\n [3, 21],\n [17, 21],\n [-1, -1],\n [3, 0],\n [17, 0]\n ]\n },\n '[': {\n width: 14, points: [\n [4, 25],\n [4, -7],\n [-1, -1],\n [5, 25],\n [5, -7],\n [-1, -1],\n [4, 25],\n [11, 25],\n [-1, -1],\n [4, -7],\n [11, -7]\n ]\n },\n '\\\\': {\n width: 14, points: [\n [0, 21],\n [14, -3]\n ]\n },\n ']': {\n width: 14, points: [\n [9, 25],\n [9, -7],\n [-1, -1],\n [10, 25],\n [10, -7],\n [-1, -1],\n [3, 25],\n [10, 25],\n [-1, -1],\n [3, -7],\n [10, -7]\n ]\n },\n '^': {\n width: 16, points: [\n [6, 15],\n [8, 18],\n [10, 15],\n [-1, -1],\n [3, 12],\n [8, 17],\n [13, 12],\n [-1, -1],\n [8, 17],\n [8, 0]\n ]\n },\n '_': {\n width: 16, points: [\n [0, -2],\n [16, -2]\n ]\n },\n '`': {\n width: 10, points: [\n [6, 21],\n [5, 20],\n [4, 18],\n [4, 16],\n [5, 15],\n [6, 16],\n [5, 17]\n ]\n },\n 'a': {\n width: 19, points: [\n [15, 14],\n [15, 0],\n [-1, -1],\n [15, 11],\n [13, 13],\n [11, 14],\n [8, 14],\n [6, 13],\n [4, 11],\n [3, 8],\n [3, 6],\n [4, 3],\n [6, 1],\n [8, 0],\n [11, 0],\n [13, 1],\n [15, 3]\n ]\n },\n 'b': {\n width: 19, points: [\n [4, 21],\n [4, 0],\n [-1, -1],\n [4, 11],\n [6, 13],\n [8, 14],\n [11, 14],\n [13, 13],\n [15, 11],\n [16, 8],\n [16, 6],\n [15, 3],\n [13, 1],\n [11, 0],\n [8, 0],\n [6, 1],\n [4, 3]\n ]\n },\n 'c': {\n width: 18, points: [\n [15, 11],\n [13, 13],\n [11, 14],\n [8, 14],\n [6, 13],\n [4, 11],\n [3, 8],\n [3, 6],\n [4, 3],\n [6, 1],\n [8, 0],\n [11, 0],\n [13, 1],\n [15, 3]\n ]\n },\n 'd': {\n width: 19, points: [\n [15, 21],\n [15, 0],\n [-1, -1],\n [15, 11],\n [13, 13],\n [11, 14],\n [8, 14],\n [6, 13],\n [4, 11],\n [3, 8],\n [3, 6],\n [4, 3],\n [6, 1],\n [8, 0],\n [11, 0],\n [13, 1],\n [15, 3]\n ]\n },\n 'e': {\n width: 18, points: [\n [3, 8],\n [15, 8],\n [15, 10],\n [14, 12],\n [13, 13],\n [11, 14],\n [8, 14],\n [6, 13],\n [4, 11],\n [3, 8],\n [3, 6],\n [4, 3],\n [6, 1],\n [8, 0],\n [11, 0],\n [13, 1],\n [15, 3]\n ]\n },\n 'f': {\n width: 12, points: [\n [10, 21],\n [8, 21],\n [6, 20],\n [5, 17],\n [5, 0],\n [-1, -1],\n [2, 14],\n [9, 14]\n ]\n },\n 'g': {\n width: 19, points: [\n [15, 14],\n [15, -2],\n [14, -5],\n [13, -6],\n [11, -7],\n [8, -7],\n [6, -6],\n [-1, -1],\n [15, 11],\n [13, 13],\n [11, 14],\n [8, 14],\n [6, 13],\n [4, 11],\n [3, 8],\n [3, 6],\n [4, 3],\n [6, 1],\n [8, 0],\n [11, 0],\n [13, 1],\n [15, 3]\n ]\n },\n 'h': {\n width: 19, points: [\n [4, 21],\n [4, 0],\n [-1, -1],\n [4, 10],\n [7, 13],\n [9, 14],\n [12, 14],\n [14, 13],\n [15, 10],\n [15, 0]\n ]\n },\n 'i': {\n width: 8, points: [\n [3, 21],\n [4, 20],\n [5, 21],\n [4, 22],\n [3, 21],\n [-1, -1],\n [4, 14],\n [4, 0]\n ]\n },\n 'j': {\n width: 10, points: [\n [5, 21],\n [6, 20],\n [7, 21],\n [6, 22],\n [5, 21],\n [-1, -1],\n [6, 14],\n [6, -3],\n [5, -6],\n [3, -7],\n [1, -7]\n ]\n },\n 'k': {\n width: 17, points: [\n [4, 21],\n [4, 0],\n [-1, -1],\n [14, 14],\n [4, 4],\n [-1, -1],\n [8, 8],\n [15, 0]\n ]\n },\n 'l': {\n width: 8, points: [\n [4, 21],\n [4, 0]\n ]\n },\n 'm': {\n width: 30, points: [\n [4, 14],\n [4, 0],\n [-1, -1],\n [4, 10],\n [7, 13],\n [9, 14],\n [12, 14],\n [14, 13],\n [15, 10],\n [15, 0],\n [-1, -1],\n [15, 10],\n [18, 13],\n [20, 14],\n [23, 14],\n [25, 13],\n [26, 10],\n [26, 0]\n ]\n },\n 'n': {\n width: 19, points: [\n [4, 14],\n [4, 0],\n [-1, -1],\n [4, 10],\n [7, 13],\n [9, 14],\n [12, 14],\n [14, 13],\n [15, 10],\n [15, 0]\n ]\n },\n 'o': {\n width: 19, points: [\n [8, 14],\n [6, 13],\n [4, 11],\n [3, 8],\n [3, 6],\n [4, 3],\n [6, 1],\n [8, 0],\n [11, 0],\n [13, 1],\n [15, 3],\n [16, 6],\n [16, 8],\n [15, 11],\n [13, 13],\n [11, 14],\n [8, 14]\n ]\n },\n 'p': {\n width: 19, points: [\n [4, 14],\n [4, -7],\n [-1, -1],\n [4, 11],\n [6, 13],\n [8, 14],\n [11, 14],\n [13, 13],\n [15, 11],\n [16, 8],\n [16, 6],\n [15, 3],\n [13, 1],\n [11, 0],\n [8, 0],\n [6, 1],\n [4, 3]\n ]\n },\n 'q': {\n width: 19, points: [\n [15, 14],\n [15, -7],\n [-1, -1],\n [15, 11],\n [13, 13],\n [11, 14],\n [8, 14],\n [6, 13],\n [4, 11],\n [3, 8],\n [3, 6],\n [4, 3],\n [6, 1],\n [8, 0],\n [11, 0],\n [13, 1],\n [15, 3]\n ]\n },\n 'r': {\n width: 13, points: [\n [4, 14],\n [4, 0],\n [-1, -1],\n [4, 8],\n [5, 11],\n [7, 13],\n [9, 14],\n [12, 14]\n ]\n },\n 's': {\n width: 17, points: [\n [14, 11],\n [13, 13],\n [10, 14],\n [7, 14],\n [4, 13],\n [3, 11],\n [4, 9],\n [6, 8],\n [11, 7],\n [13, 6],\n [14, 4],\n [14, 3],\n [13, 1],\n [10, 0],\n [7, 0],\n [4, 1],\n [3, 3]\n ]\n },\n 't': {\n width: 12, points: [\n [5, 21],\n [5, 4],\n [6, 1],\n [8, 0],\n [10, 0],\n [-1, -1],\n [2, 14],\n [9, 14]\n ]\n },\n 'u': {\n width: 19, points: [\n [4, 14],\n [4, 4],\n [5, 1],\n [7, 0],\n [10, 0],\n [12, 1],\n [15, 4],\n [-1, -1],\n [15, 14],\n [15, 0]\n ]\n },\n 'v': {\n width: 16, points: [\n [2, 14],\n [8, 0],\n [-1, -1],\n [14, 14],\n [8, 0]\n ]\n },\n 'w': {\n width: 22, points: [\n [3, 14],\n [7, 0],\n [-1, -1],\n [11, 14],\n [7, 0],\n [-1, -1],\n [11, 14],\n [15, 0],\n [-1, -1],\n [19, 14],\n [15, 0]\n ]\n },\n 'x': {\n width: 17, points: [\n [3, 14],\n [14, 0],\n [-1, -1],\n [14, 14],\n [3, 0]\n ]\n },\n 'y': {\n width: 16, points: [\n [2, 14],\n [8, 0],\n [-1, -1],\n [14, 14],\n [8, 0],\n [6, -4],\n [4, -6],\n [2, -7],\n [1, -7]\n ]\n },\n 'z': {\n width: 17, points: [\n [14, 14],\n [3, 0],\n [-1, -1],\n [3, 14],\n [14, 14],\n [-1, -1],\n [3, 0],\n [14, 0]\n ]\n },\n '{': {\n width: 14, points: [\n [9, 25],\n [7, 24],\n [6, 23],\n [5, 21],\n [5, 19],\n [6, 17],\n [7, 16],\n [8, 14],\n [8, 12],\n [6, 10],\n [-1, -1],\n [7, 24],\n [6, 22],\n [6, 20],\n [7, 18],\n [8, 17],\n [9, 15],\n [9, 13],\n [8, 11],\n [4, 9],\n [8, 7],\n [9, 5],\n [9, 3],\n [8, 1],\n [7, 0],\n [6, -2],\n [6, -4],\n [7, -6],\n [-1, -1],\n [6, 8],\n [8, 6],\n [8, 4],\n [7, 2],\n [6, 1],\n [5, -1],\n [5, -3],\n [6, -5],\n [7, -6],\n [9, -7]\n ]\n },\n '|': {\n width: 8, points: [\n [4, 25],\n [4, -7]\n ]\n },\n '}': {\n width: 14, points: [\n [5, 25],\n [7, 24],\n [8, 23],\n [9, 21],\n [9, 19],\n [8, 17],\n [7, 16],\n [6, 14],\n [6, 12],\n [8, 10],\n [-1, -1],\n [7, 24],\n [8, 22],\n [8, 20],\n [7, 18],\n [6, 17],\n [5, 15],\n [5, 13],\n [6, 11],\n [10, 9],\n [6, 7],\n [5, 5],\n [5, 3],\n [6, 1],\n [7, 0],\n [8, -2],\n [8, -4],\n [7, -6],\n [-1, -1],\n [8, 8],\n [6, 6],\n [6, 4],\n [7, 2],\n [8, 1],\n [9, -1],\n [9, -3],\n [8, -5],\n [7, -6],\n [5, -7]\n ]\n },\n '~': {\n width: 24, points: [\n [3, 6],\n [3, 8],\n [4, 11],\n [6, 12],\n [8, 12],\n [10, 11],\n [14, 8],\n [16, 7],\n [18, 7],\n [20, 8],\n [21, 10],\n [-1, -1],\n [3, 8],\n [4, 10],\n [6, 11],\n [8, 11],\n [10, 10],\n [14, 7],\n [16, 6],\n [18, 6],\n [20, 7],\n [21, 10],\n [21, 12]\n ]\n }\n};\n\n/**\n * @desc Creates wireframe text-shaped geometry arrays.\n *\n * ## Usage\n *\n * In the example below we'll create an {@link XKTModel}, then create an {@link XKTMesh} with a text-shaped {@link XKTGeometry}.\n *\n * [[Run this example](http://xeokit.github.io/xeokit-sdk/examples/#geometry_builders_buildVectorTextGeometry)]\n *\n * ````javascript\n * const xktModel = new XKTModel();\n *\n * const text = buildVectorTextGeometry({\n * origin: [0,0,0],\n * text: \"On the other side of the screen, it all looked so easy\"\n * });\n *\n * const xktGeometry = xktModel.createGeometry({\n * geometryId: \"textGeometry\",\n * primitiveType: text.primitiveType, // Will be \"lines\"\n * positions: text.positions,\n * indices: text.indices\n * });\n *\n * const xktMesh = xktModel.createMesh({\n * meshId: \"redTextMesh\",\n * geometryId: \"textGeometry\",\n * position: [-4, -6, -4],\n * scale: [1, 3, 1],\n * rotation: [0, 0, 0],\n * color: [1, 0, 0],\n * opacity: 1\n * });\n *\n * const xktEntity = xktModel.createEntity({\n * entityId: \"redText\",\n * meshIds: [\"redTextMesh\"]\n * });\n *\n * xktModel.finalize();\n * ````\n *\n * @function buildVectorTextGeometry\n * @param {*} [cfg] Configs\n * @param {Number[]} [cfg.center] 3D point indicating the center position.\n * @param {Number[]} [cfg.origin] 3D point indicating the top left corner.\n * @param {Number} [cfg.size=1] Size of each character.\n * @param {String} [cfg.text=\"\"] The text.\n * @returns {Object} Geometry arrays for {@link XKTModel#createGeometry} or {@link XKTModel#createMesh}.\n */\nfunction buildVectorTextGeometry(cfg = {}) {\n\n var origin = cfg.origin || [0, 0, 0];\n var xOrigin = origin[0];\n var yOrigin = origin[1];\n var zOrigin = origin[2];\n var size = cfg.size || 1;\n\n var positions = [];\n var indices = [];\n var text = (\"\" + cfg.text).trim();\n var lines = (text || \"\").split(\"\\n\");\n var countVerts = 0;\n var y = 0;\n var x;\n var str;\n var len;\n var c;\n var mag = 1.0 / 25.0;\n var penUp;\n var p1;\n var p2;\n var needLine;\n var pointsLen;\n var a;\n\n for (var iLine = 0; iLine < lines.length; iLine++) {\n\n x = 0;\n str = lines[iLine];\n len = str.length;\n\n for (var i = 0; i < len; i++) {\n\n c = letters[str.charAt(i)];\n\n if (c === '\\n') {\n //alert(\"newline\");\n }\n\n if (!c) {\n continue;\n }\n\n penUp = 1;\n p1 = -1;\n p2 = -1;\n needLine = false;\n\n pointsLen = c.points.length;\n\n for (var j = 0; j < pointsLen; j++) {\n a = c.points[j];\n\n if (a[0] === -1 && a[1] === -1) {\n penUp = 1;\n needLine = false;\n continue;\n }\n\n positions.push((x + (a[0] * size) * mag) + xOrigin);\n positions.push((y + (a[1] * size) * mag) + yOrigin);\n positions.push(0 + zOrigin);\n\n if (p1 === -1) {\n p1 = countVerts;\n } else if (p2 === -1) {\n p2 = countVerts;\n } else {\n p1 = p2;\n p2 = countVerts;\n }\n countVerts++;\n\n if (penUp) {\n penUp = false;\n\n } else {\n indices.push(p1);\n indices.push(p2);\n }\n\n needLine = true;\n }\n x += c.width * mag * size;\n\n }\n y -= 35 * mag * size;\n }\n\n return {\n primitiveType: \"lines\",\n positions: positions,\n indices: indices\n };\n}\n\n\nexport {buildVectorTextGeometry}\n","/**\n * @private\n * @param buf\n * @returns {ArrayBuffer}\n */\nexport function toArrayBuffer(buf) {\n const ab = new ArrayBuffer(buf.length);\n const view = new Uint8Array(ab);\n for (let i = 0; i < buf.length; ++i) {\n view[i] = buf[i];\n }\n return ab;\n}","import {XKT_INFO} from \"./XKT_INFO.js\";\nimport {XKTModel} from \"./XKTModel/XKTModel.js\";\nimport {parseCityJSONIntoXKTModel} from \"./parsers/parseCityJSONIntoXKTModel.js\";\nimport {parseGLTFIntoXKTModel} from \"./parsers/parseGLTFIntoXKTModel.js\";\nimport {parseIFCIntoXKTModel} from \"./parsers/parseIFCIntoXKTModel.js\";\nimport {parseLASIntoXKTModel} from \"./parsers/parseLASIntoXKTModel.js\";\nimport {parsePCDIntoXKTModel} from \"./parsers/parsePCDIntoXKTModel.js\";\nimport {parsePLYIntoXKTModel} from \"./parsers/parsePLYIntoXKTModel.js\";\nimport {parseSTLIntoXKTModel} from \"./parsers/parseSTLIntoXKTModel.js\";\nimport {writeXKTModelToArrayBuffer} from \"./XKTModel/writeXKTModelToArrayBuffer.js\";\n\nimport {toArrayBuffer} from \"./XKTModel/lib/toArraybuffer\";\n\nconst fs = require('fs');\nconst path = require(\"path\");\n\n/**\n * Converts model files into xeokit's native XKT format.\n *\n * Supported source formats are: IFC, CityJSON, glTF, LAZ and LAS.\n *\n * **Only bundled in xeokit-convert.cjs.js.**\n *\n * ## Usage\n *\n * ````javascript\n * const convert2xkt = require(\"@xeokit/xeokit-convert/dist/convert2xkt.cjs.js\");\n * const fs = require('fs');\n *\n * convert2xkt({\n * sourceData: fs.readFileSync(\"rme_advanced_sample_project.ifc\"),\n * outputXKT: (xtkArrayBuffer) => {\n * fs.writeFileSync(\"rme_advanced_sample_project.ifc.xkt\", xtkArrayBuffer);\n * }\n * }).then(() => {\n * console.log(\"Converted.\");\n * }, (errMsg) => {\n * console.error(\"Conversion failed: \" + errMsg)\n * });\n ````\n * @param {Object} params Conversion parameters.\n * @param {Object} params.WebIFC The WebIFC library. We pass this in as an external dependency, in order to give the\n * caller the choice of whether to use the Browser or NodeJS version.\n * @param {*} [params.configs] Configurations.\n * @param {String} [params.source] Path to source file. Alternative to ````sourceData````.\n * @param {ArrayBuffer|JSON} [params.sourceData] Source file data. Alternative to ````source````.\n * @param {String} [params.sourceFormat] Format of source file/data. Always needed with ````sourceData````, but not normally needed with ````source````, because convert2xkt will determine the format automatically from the file extension of ````source````.\n * @param {String} [params.metaModelDataStr] Source file data. Overrides metadata from ````metaModelSource````, ````sourceData```` and ````source````.\n * @param {String} [params.metaModelSource] Path to source metaModel file. Overrides metadata from ````sourceData```` and ````source````. Overridden by ````metaModelData````.\n * @param {String} [params.output] Path to destination XKT file. Directories on this path are automatically created if not existing.\n * @param {Function} [params.outputXKTModel] Callback to collect the ````XKTModel```` that is internally build by this method.\n * @param {Function} [params.outputXKT] Callback to collect XKT file data.\n * @param {String[]} [params.includeTypes] Option to only convert objects of these types.\n * @param {String[]} [params.excludeTypes] Option to never convert objects of these types.\n * @param {Object} [stats] Collects conversion statistics. Statistics are attached to this object if provided.\n * @param {Function} [params.outputStats] Callback to collect statistics.\n * @param {Boolean} [params.rotateX=false] Whether to rotate the model 90 degrees about the X axis to make the Y axis \"up\", if necessary. Applies to CityJSON and LAS/LAZ models.\n * @param {Boolean} [params.reuseGeometries=true] When true, will enable geometry reuse within the XKT. When false,\n * will automatically \"expand\" all reused geometries into duplicate copies. This has the drawback of increasing the XKT\n * file size (~10-30% for typical models), but can make the model more responsive in the xeokit Viewer, especially if the model\n * has excessive geometry reuse. An example of excessive geometry reuse would be when a model (eg. glTF) has 4000 geometries that are\n * shared amongst 2000 objects, ie. a large number of geometries with a low amount of reuse, which can present a\n * pathological performance case for xeokit's underlying graphics APIs (WebGL, WebGPU etc).\n * @param {Boolean} [params.includeTextures=true] Whether to convert textures. Only works for ````glTF```` models.\n * @param {Boolean} [params.includeNormals=true] Whether to convert normals. When false, the parser will ignore\n * geometry normals, and the modelwill rely on the xeokit ````Viewer```` to automatically generate them. This has\n * the limitation that the normals will be face-aligned, and therefore the ````Viewer```` will only be able to render\n * a flat-shaded non-PBR representation of the model.\n * @param {Number} [params.minTileSize=200] Minimum RTC coordinate tile size. Set this to a value between 100 and 10000,\n * depending on how far from the coordinate origin the model's vertex positions are; specify larger tile sizes when close\n * to the origin, and smaller sizes when distant. This compensates for decreasing precision as floats get bigger.\n * @param {Function} [params.log] Logging callback.\n * @return {Promise}\n */\nfunction convert2xkt({\n WebIFC,\n configs,\n source,\n sourceData,\n sourceFormat,\n metaModelSource,\n metaModelDataStr,\n modelAABB,\n output,\n outputXKTModel,\n outputXKT,\n includeTypes,\n excludeTypes,\n reuseGeometries = true,\n minTileSize = 200,\n stats = {},\n outputStats,\n rotateX = false,\n includeTextures = true,\n includeNormals = true,\n log = function (msg) {\n }\n }) {\n\n stats.sourceFormat = \"\";\n stats.schemaVersion = \"\";\n stats.title = \"\";\n stats.author = \"\";\n stats.created = \"\";\n stats.numMetaObjects = 0;\n stats.numPropertySets = 0;\n stats.numTriangles = 0;\n stats.numVertices = 0;\n stats.numNormals = 0;\n stats.numUVs = 0;\n stats.numTextures = 0;\n stats.numTextureSets = 0;\n stats.numObjects = 0;\n stats.numGeometries = 0;\n stats.sourceSize = 0;\n stats.xktSize = 0;\n stats.texturesSize = 0;\n stats.xktVersion = \"\";\n stats.compressionRatio = 0;\n stats.conversionTime = 0;\n stats.aabb = null;\n\n function getFileExtension(fileName) {\n let ext = path.extname(fileName);\n if (ext.charAt(0) === \".\") {\n ext = ext.substring(1);\n }\n return ext;\n }\n\n return new Promise(function (resolve, reject) {\n const _log = log;\n log = (msg) => {\n _log(`[convert2xkt] ${msg}`)\n }\n\n if (!source && !sourceData) {\n reject(\"Argument expected: source or sourceData\");\n return;\n }\n\n if (!sourceFormat && sourceData) {\n reject(\"Argument expected: sourceFormat is required with sourceData\");\n return;\n }\n\n if (!output && !outputXKTModel && !outputXKT) {\n reject(\"Argument expected: output, outputXKTModel or outputXKT\");\n return;\n }\n\n if (source) {\n log('Reading input file: ' + source);\n }\n\n const startTime = new Date();\n\n const sourceConfigs = configs.sourceConfigs || {};\n const ext = sourceFormat || getFileExtension(source);\n\n log(`Input file extension: \"${ext}\"`);\n\n let fileTypeConfigs = sourceConfigs[ext];\n\n if (!fileTypeConfigs) {\n log(`[WARNING] Could not find configs sourceConfigs entry for source format \"${ext}\". This is derived from the source file name extension. Will use internal default configs.`);\n fileTypeConfigs = {};\n }\n function overrideOption(option1, option2) {\n if (option1 !== undefined) {\n return option1;\n }\n return option2;\n }\n\n if (!sourceData) {\n try {\n sourceData = fs.readFileSync(source);\n } catch (err) {\n reject(err);\n return;\n }\n }\n\n const sourceFileSizeBytes = sourceData.byteLength;\n\n log(\"Input file size: \" + (sourceFileSizeBytes / 1000).toFixed(2) + \" kB\");\n\n if (!metaModelDataStr && metaModelSource) {\n log('Reading input metadata file: ' + metaModelSource);\n try {\n metaModelDataStr = fs.readFileSync(metaModelSource);\n } catch (err) {\n reject(err);\n return;\n }\n } else {\n log(`Not embedding metadata in XKT`);\n }\n\n let metaModelJSON;\n\n if (metaModelDataStr) {\n try {\n metaModelJSON = JSON.parse(metaModelDataStr);\n } catch (e) {\n metaModelJSON = {};\n log(`Error parsing metadata JSON: ${e}`);\n }\n }\n\n minTileSize = overrideOption(fileTypeConfigs.minTileSize, minTileSize);\n rotateX = overrideOption(fileTypeConfigs.rotateX, rotateX);\n reuseGeometries = overrideOption(fileTypeConfigs.reuseGeometries, reuseGeometries);\n includeTextures = overrideOption(fileTypeConfigs.includeTextures, includeTextures);\n includeNormals = overrideOption(fileTypeConfigs.includeNormals, includeNormals);\n includeTypes = overrideOption(fileTypeConfigs.includeTypes, includeTypes);\n excludeTypes = overrideOption(fileTypeConfigs.excludeTypes, excludeTypes);\n\n if (reuseGeometries === false) {\n log(\"Geometry reuse is disabled\");\n }\n\n const xktModel = new XKTModel({\n minTileSize,\n modelAABB\n });\n\n switch (ext) {\n case \"json\":\n convert(parseCityJSONIntoXKTModel, {\n data: JSON.parse(sourceData),\n xktModel,\n stats,\n rotateX,\n center: fileTypeConfigs.center,\n transform: fileTypeConfigs.transform,\n log\n });\n break;\n\n case \"glb\":\n sourceData = toArrayBuffer(sourceData);\n convert(parseGLTFIntoXKTModel, {\n data: sourceData,\n reuseGeometries,\n includeTextures: true,\n includeNormals,\n metaModelData: metaModelJSON,\n xktModel,\n stats,\n log\n });\n break;\n\n case \"gltf\":\n sourceData = toArrayBuffer(sourceData);\n const gltfBasePath = source ? path.dirname(source) : \"\";\n convert(parseGLTFIntoXKTModel, {\n baseUri: gltfBasePath,\n data: sourceData,\n reuseGeometries,\n includeTextures: true,\n includeNormals,\n metaModelData: metaModelJSON,\n xktModel,\n stats,\n log\n });\n break;\n\n // case \"gltf\":\n // const gltfJSON = JSON.parse(sourceData);\n // const gltfBasePath = source ? getBasePath(source) : \"\";\n // convert(parseGLTFIntoXKTModel, {\n // baseUri: gltfBasePath,\n // data: gltfJSON,\n // reuseGeometries,\n // includeTextures,\n // includeNormals,\n // metaModelData: metaModelJSON,\n // xktModel,\n // getAttachment: async (name) => {\n // const filePath = gltfBasePath + name;\n // log(`Reading attachment file: ${filePath}`);\n // const buffer = fs.readFileSync(filePath);\n // const arrayBuf = toArrayBuffer(buffer);\n // return arrayBuf;\n // },\n // stats,\n // log\n // });\n // break;\n\n case \"ifc\":\n convert(parseIFCIntoXKTModel, {\n WebIFC,\n data: sourceData,\n xktModel,\n wasmPath: \"./\",\n includeTypes,\n excludeTypes,\n stats,\n log\n });\n break;\n\n case \"laz\":\n convert(parseLASIntoXKTModel, {\n data: sourceData,\n xktModel,\n stats,\n fp64: fileTypeConfigs.fp64,\n colorDepth: fileTypeConfigs.colorDepth,\n center: fileTypeConfigs.center,\n transform: fileTypeConfigs.transform,\n skip: overrideOption(fileTypeConfigs.skip, 1),\n log\n });\n break;\n\n case \"las\":\n convert(parseLASIntoXKTModel, {\n data: sourceData,\n xktModel,\n stats,\n fp64: fileTypeConfigs.fp64,\n colorDepth: fileTypeConfigs.colorDepth,\n center: fileTypeConfigs.center,\n transform: fileTypeConfigs.transform,\n skip: overrideOption(fileTypeConfigs.skip, 1),\n log\n });\n break;\n\n case \"pcd\":\n convert(parsePCDIntoXKTModel, {\n data: sourceData,\n xktModel,\n stats,\n log\n });\n break;\n\n case \"ply\":\n convert(parsePLYIntoXKTModel, {\n data: sourceData,\n xktModel,\n stats,\n log\n });\n break;\n\n case \"stl\":\n convert(parseSTLIntoXKTModel, {\n data: sourceData,\n xktModel,\n stats,\n log\n });\n break;\n\n default:\n reject(`Error: unsupported source format: \"${ext}\".`);\n return;\n }\n\n function convert(parser, converterParams) {\n\n parser(converterParams).then(() => {\n\n if (!metaModelJSON) {\n log(\"Creating default metamodel in XKT\");\n xktModel.createDefaultMetaObjects();\n }\n\n log(\"Input file parsed OK. Building XKT document...\");\n\n xktModel.finalize().then(() => {\n\n log(\"XKT document built OK. Writing to XKT file...\");\n\n const xktArrayBuffer = writeXKTModelToArrayBuffer(xktModel, metaModelJSON, stats, {zip: true});\n\n const xktContent = Buffer.from(xktArrayBuffer);\n\n const targetFileSizeBytes = xktArrayBuffer.byteLength;\n\n stats.minTileSize = minTileSize || 200;\n stats.sourceSize = (sourceFileSizeBytes / 1000).toFixed(2);\n stats.xktSize = (targetFileSizeBytes / 1000).toFixed(2);\n stats.xktVersion = XKT_INFO.xktVersion;\n stats.compressionRatio = (sourceFileSizeBytes / targetFileSizeBytes).toFixed(2);\n stats.conversionTime = ((new Date() - startTime) / 1000.0).toFixed(2);\n stats.aabb = xktModel.aabb;\n log(`Converted to: XKT v${stats.xktVersion}`);\n if (includeTypes) {\n log(\"Include types: \" + (includeTypes ? includeTypes : \"(include all)\"));\n }\n if (excludeTypes) {\n log(\"Exclude types: \" + (excludeTypes ? excludeTypes : \"(exclude none)\"));\n }\n log(\"XKT size: \" + stats.xktSize + \" kB\");\n log(\"XKT textures size: \" + (stats.texturesSize / 1000).toFixed(2) + \"kB\");\n log(\"Compression ratio: \" + stats.compressionRatio);\n log(\"Conversion time: \" + stats.conversionTime + \" s\");\n log(\"Converted metaobjects: \" + stats.numMetaObjects);\n log(\"Converted property sets: \" + stats.numPropertySets);\n log(\"Converted drawable objects: \" + stats.numObjects);\n log(\"Converted geometries: \" + stats.numGeometries);\n log(\"Converted textures: \" + stats.numTextures);\n log(\"Converted textureSets: \" + stats.numTextureSets);\n log(\"Converted triangles: \" + stats.numTriangles);\n log(\"Converted vertices: \" + stats.numVertices);\n log(\"Converted UVs: \" + stats.numUVs);\n log(\"Converted normals: \" + stats.numNormals);\n log(\"Converted tiles: \" + xktModel.tilesList.length);\n log(\"minTileSize: \" + stats.minTileSize);\n\n if (output) {\n const outputDir = path.dirname(output);\n if (outputDir !== \"\" && !fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, {recursive: true});\n }\n log('Writing XKT file: ' + output);\n fs.writeFileSync(output, xktContent);\n }\n\n if (outputXKTModel) {\n outputXKTModel(xktModel);\n }\n\n if (outputXKT) {\n outputXKT(xktContent);\n }\n\n if (outputStats) {\n outputStats(stats);\n }\n\n resolve();\n });\n }, (err) => {\n reject(err);\n });\n }\n });\n}\n\nexport {convert2xkt};","import '@loaders.gl/polyfills';\nimport {installFilePolyfills} from '@loaders.gl/polyfills';\n\ninstallFilePolyfills();\n\nexport * from \"./src/index.js\";\nexport {convert2xkt} from \"./src/convert2xkt.js\"; // convert2xkt is only bundled for Node.js\n"],"names":["root","factory","exports","module","define","amd","global","require","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","d","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","r","Symbol","toStringTag","value","p","mat","mat2","mat3","xyz","tempVec3","vec","translate","scale","XKT_INFO","xktVersion","RepeatWrapping","ClampToEdgeWrapping","MirroredRepeatWrapping","NearestFilter","NearestMipMapNearestFilter","NearestMipmapNearestFilter","NearestMipmapLinearFilter","NearestMipMapLinearFilter","LinearFilter","LinearMipmapNearestFilter","LinearMipMapNearestFilter","LinearMipmapLinearFilter","LinearMipMapLinearFilter","GIFMediaType","JPEGMediaType","PNGMediaType","FloatArrayType","Float64Array","tempMat1","tempMat2","tempVec4","math","MIN_DOUBLE","Number","MAX_SAFE_INTEGER","MAX_DOUBLE","DEGTORAD","RADTODEG","vec2","values","vec3","vec4","mat3ToMat4","mat4","arguments","length","mat4ToMat3","createUUID","lut","i","toString","d0","Math","random","d1","d2","d3","concat","clamp","min","max","fmod","a","b","console","error","negateVec4","v","dest","addVec4","u","addVec4Scalar","s","addVec3","addVec3Scalar","subVec4","subVec3","subVec2","subVec4Scalar","subScalarVec4","mulVec4","mulVec4Scalar","mulVec3Scalar","mulVec2Scalar","divVec3","divVec4","divScalarVec3","divVec3Scalar","divVec4Scalar","divScalarVec4","dotVec4","cross3Vec4","u0","u1","u2","v0","v1","v2","cross3Vec3","x","y","z","x2","y2","z2","sqLenVec4","lenVec4","sqrt","dotVec3","dotVec2","sqLenVec3","sqLenVec2","lenVec3","distVec3","w","lenVec2","distVec2","rcpVec3","normalizeVec4","f","normalizeVec3","normalizeVec2","angleVec3","theta","acos","vec3FromMat4Scale","m","vecToArray","trunc","round","len","Array","slice","xyzArrayToObject","arr","xyzObjectToArray","arry","dupMat4","mat4To3","m4s","setMat4ToZeroes","setMat4ToOnes","diagonalMat4v","diagonalMat4c","diagonalMat4s","identityMat4","identityMat3","isIdentityMat4","negateMat4","addMat4","addMat4Scalar","addScalarMat4","subMat4","subMat4Scalar","subScalarMat4","mulMat4","a00","a01","a02","a03","a10","a11","a12","a13","a20","a21","a22","a23","a30","a31","a32","a33","b00","b01","b02","b03","b10","b11","b12","b13","b20","b21","b22","b23","b30","b31","b32","b33","mulMat3","mulMat4Scalar","mulMat4v4","v3","transposeMat4","m4","m14","m8","m13","m12","m9","transposeMat3","determinantMat4","inverseMat4","b04","b05","b06","b07","b08","b09","invDet","traceMat4","translationMat4v","translationMat3v","translationMat4c","translationMat4s","translateMat4v","translateMat4c","OLDtranslateMat4c","m15","m3","m7","m11","rotationMat4v","anglerad","axis","xy","yz","zx","xs","ys","zs","ax","sin","c","cos","q","rotationMat4c","scalingMat4v","scalingMat3v","scalingMat4c","scaleMat4c","scaleMat4v","scalingMat4s","rotationTranslationMat4","xx","xz","yy","zz","wx","wy","wz","mat4ToEuler","order","m21","m22","m23","m31","m32","m33","asin","abs","atan2","composeMat4","position","quaternion","quaternionToRotationMat4","decomposeMat4","matrix","sx","sy","sz","set","invSX","invSY","invSZ","mat4ToQuaternion","this","lookAtMat4v","pos","target","up","z0","z1","x0","x1","y0","y1","posx","posy","posz","upx","upy","upz","targetx","targety","targetz","lookAtMat4c","orthoMat4c","left","right","bottom","top","near","far","rl","tb","fn","frustumMat4v","fmin","fmax","fmin4","fmax4","t","tempMat20","tempMat21","tempMat22","frustumMat4","perspectiveMat4","fovyrad","aspectratio","znear","zfar","pmin","pmax","tan","transformPoint3","transformPoint4","transformPoints3","points","points2","p0","p1","p2","pi","result","m0","m1","m2","m5","m6","m10","transformPositions3","transformPositions4","transformVec3","transformVec4","rotateVec3X","rotateVec3Y","rotateVec3Z","projectVec4","unprojectVec3","viewMat","projMat","lerpVec3","t1","t2","flatten","leni","j","lenj","item","push","identityQuaternion","eulerToQuaternion","euler","c1","c2","c3","s1","s2","s3","trace","vec3PairToQuaternion","norm_u_norm_v","real_part","normalizeQuaternion","angleAxisToQuaternion","angleAxis","halfAngle","fsin","quaternionToEuler","mulQuaternions","p3","q0","q1","q2","q3","vec3ApplyQuaternion","qx","qy","qz","qw","ix","iy","iz","iw","quaternionToMat4","tx","ty","tz","twx","twy","twz","txx","txy","txz","tyy","tyz","tzz","conjugateQuaternion","inverseQuaternion","quaternionToAngleAxis","angle","AABB3","AABB2","OBB3","OBB2","Sphere3","transformOBB3","containsAABB3","aabb1","aabb2","getAABB3Diag","aabb","getAABB3DiagPoint","diagVec","xneg","xpos","yneg","ypos","zneg","zpos","getAABB3Center","getAABB2Center","collapseAABB3","AABB3ToOBB3","obb","positions3ToAABB3","positions","positionsDecodeMatrix","xmin","ymin","zmin","xmax","ymax","zmax","decompressPosition","OBB3ToAABB3","points3ToAABB3","points3ToSphere3","sphere","numPoints","dist","radius","positions3ToSphere3","tempVec3a","tempVec3b","lenPositions","numPositions","OBB3ToSphere3","point","lenPoints","getSphere3Center","expandAABB3","expandAABB3Point3","triangleNormal","normal","p1x","p1y","p1z","p2x","p2y","p2z","p3x","p3y","p3z","mag","octEncodeVec3","array","xfunc","yfunc","tempx","tempy","Int8Array","octDecodeVec2","oct","dot","uniquePositions","indicesLookup","indicesReverseLookup","weldedIndices","faces","numFaces","compa","compb","compc","cb","ab","cross","inverseNormal","geometryCompression","quantizePositions","quantizedPositions","maxInt","xMultiplier","yMultiplier","zMultiplier","verify","num","floor","compressPosition","multiplier","Float32Array","createPositionsDecodeMatrix","xwid","ywid","zwid","transformAndOctEncodeNormals","modelNormalMatrix","normals","lenNormals","compressedNormals","lenCompressedNormals","best","currentCos","bestCos","localNormal","worldNormal","octEncodeNormals","buildEdgeIndices","Uint16Array","indices","edgeThreshold","vx","vy","vz","positionsMap","precision","pow","lenUniquePositions","weldVertices","numIndices","ia","ib","ic","face","buildFaces","edge1","edge2","index1","index2","edge","normal1","normal2","edgeIndices","thresholdDot","edges","largeIndex","faceIndex","face1","face2","dot2","Uint32Array","isTriangleMeshSolid","vertexIndexMapping","compareIndexPositions","posA","posB","newIndices","sort","uniqueVertexIndex","a2","b2","temp","compareEdges","e1","e2","sameEdgeCount","XKTMesh","_createClass","cfg","_classCallCheck","meshId","meshIndex","geometry","color","metallic","roughness","opacity","textureSet","entity","XKTGeometry","geometryId","primitiveType","geometryIndex","numInstances","positionsQuantized","normalsOctEncoded","colorsCompressed","uvs","uvsCompressed","solid","XKTEntity","entityId","meshes","entityIndex","hasReusedGeometries","XKTTile","entities","KDNode","XKTMetaObject","metaObjectId","propertySetIds","metaObjectType","metaObjectName","parentMetaObjectId","XKTPropertySet","propertySetId","propertySetType","propertySetName","properties","XKTTexture","textureId","textureIndex","imageData","channel","width","height","src","compressed","mediaType","minFilter","magFilter","wrapS","wrapT","wrapR","XKTTextureSet","textureSetId","textureSetIndex","materialType","materialIndex","colorTexture","metallicRoughnessTexture","normalsTexture","emissiveTexture","occlusionTexture","_regeneratorRuntime","Op","hasOwn","desc","$Symbol","iteratorSymbol","iterator","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","configurable","writable","err","wrap","innerFn","outerFn","self","tryLocsList","protoGenerator","Generator","generator","create","context","Context","makeInvokeMethod","tryCatch","arg","type","ContinueSentinel","GeneratorFunction","GeneratorFunctionPrototype","IteratorPrototype","getProto","getPrototypeOf","NativeIteratorPrototype","Gp","defineIteratorMethods","forEach","method","_invoke","AsyncIterator","PromiseImpl","invoke","resolve","reject","record","_typeof","__await","then","unwrapped","previousPromise","callInvokeWithMethodAndArg","state","Error","done","delegate","delegateResult","maybeInvokeDelegate","sent","_sent","dispatchException","abrupt","methodName","TypeError","info","resultName","next","nextLoc","pushTryEntry","locs","entry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","resetTryEntry","completion","reset","iterable","iteratorMethod","isNaN","doneResult","displayName","isGeneratorFunction","genFun","ctor","constructor","name","mark","setPrototypeOf","__proto__","awrap","async","Promise","iter","keys","val","object","reverse","pop","skipTempReset","prev","charAt","stop","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","thrown","delegateYield","asyncGeneratorStep","gen","_next","_throw","_defineProperties","props","descriptor","input","hint","prim","toPrimitive","res","String","_toPrimitive","tempVec4a","tempVec4b","tempMat4","tempMat4b","kdTreeDimLength","TEXTURE_ENCODING_OPTIONS","useSRGB","qualityLevel","encodeUASTC","mipmaps","XKTModel","instance","Constructor","modelId","projectId","revisionId","author","createdAt","creatingApplication","schema","minTileSize","modelAABB","propertySets","propertySetsList","metaObjects","metaObjectsList","reusedGeometriesDecodeMatrix","geometries","geometriesList","textures","texturesList","textureSets","textureSetsList","meshesList","entitiesList","tilesList","finalized","protoProps","_finalize","params","propertySet","metaObject","_rootMetaObject","fileExt","split","texture","colorTextureId","metallicRoughnessTextureId","normalsTextureId","emissiveTextureId","occlusionTextureId","triangles","lines","line_strip","_createDefaultIndices","colors","xktGeometryCfg","uv","Uint8Array","mergedPositions","mergedIndices","mergeVertices","rotation","mesh","meshIds","meshIdIdx","meshIdLen","warn","createMetaObject","_callee","rootKDNode","_context","log","_removeUnusedTextures","_compressTextures","_bakeSingleUseGeometryPositions","_bakeAndOctEncodeNormals","_createEntityAABBs","_createKDTree","_createTilesFromKDTree","_createReusedGeometriesDecodeMatrix","_flagSolidGeometries","args","apply","_this","countTextures","_loop","encodingOptions","load","ImageLoader","image","encode","KTX2BasisWriter","encodedData","encodedImageData","entityAABB","_insertEntityIntoKDTree","kdNode","nodeAABB","dim","aabbLeft","aabbRight","_createTilesFromKDNode","_createTileFromEntities","tileAABB","tileCenter","tileCenterNeg","rtcAABB","reused","k","lenk","tile","reusedGeometriesAABB","countReusedGeometries","numGeometries","maxNumPositions","maxNumIndices","XKT_VERSION","NUM_TEXTURE_ATTRIBUTES","NUM_MATERIAL_ATTRIBUTES","writeXKTModelToArrayBuffer","xktModel","metaModelJSON","stats","options","data","metaModelDataStr","numPropertySets","numMetaObjects","numTextures","numTextureSets","numMeshes","numEntities","numTiles","lenColors","lenUVs","lenIndices","lenEdgeIndices","lenMatrices","lenTextures","xktTexture","byteLength","numCompressedTextures","metadata","textureData","eachTextureDataPortion","eachTextureAttributes","eachTextureSetTextures","Int32Array","matrices","eachGeometryPrimitiveType","eachGeometryPositionsPortion","eachGeometryNormalsPortion","eachGeometryColorsPortion","eachGeometryUVsPortion","eachGeometryIndicesPortion","eachGeometryEdgeIndicesPortion","eachMeshGeometriesPortion","eachMeshMatricesPortion","eachMeshTextureSet","eachMeshMaterialAttributes","eachEntityId","eachEntityMeshesPortion","eachTileAABB","eachTileEntitiesPortion","countPositions","countNormals","countColors","countUVs","countIndices","countEdgeIndices","id","propertySetsIndex","propertySetJSON","metaObjectsIndex","metaObjectJSON","parent","external","portionIdx","textureAttrIdx","eachTextureSetTexturesIndex","countEntityMeshesPortion","eachMeshMaterialAttributesIndex","matricesIndex","tileIndex","tileEntities","numTileEntities","entityMeshes","numEntityMeshes","tileAABBIndex","getModelData","deflatedData","deflate","buffer","zip","pako","deflateJSON","JSON","stringify","replace","chr","charCodeAt","substr","deflateData","texturesSize","arrayBuffer","elements","indexData","dataLen","elementsize","indexBuf","dataArray","offset","element","toArrayBuffer","createArrayBuffer","strings","earcut","holeIndices","minX","minY","maxX","maxY","invSize","hasHoles","outerLen","outerNode","linkedList","list","queue","steiner","getLeftmost","compareX","eliminateHole","filterPoints","eliminateHoles","earcutLinked","start","end","clockwise","last","signedArea","insertNode","equals","removeNode","again","area","ear","pass","zOrder","prevZ","nextZ","e","tail","numMerges","pSize","qSize","inSize","sortLinked","indexCurve","isEarHashed","isEar","cureLocalIntersections","splitEarcut","pointInTriangle","minTX","minTY","maxTX","maxTY","minZ","maxZ","n","intersects","locallyInside","isValidDiagonal","splitPolygon","hole","hx","hy","mx","my","tanMin","Infinity","sectorContainsSector","findHoleBridge","leftmost","ay","bx","by","cx","cy","px","py","intersectsPolygon","inside","middleInside","o1","sign","o2","o3","o4","onSegment","Node","an","bp","sum","deviation","polygonArea","trianglesArea","vertices","holes","dimensions","holeIndex","tempVec2a","tempVec3c","parseCityJSONIntoXKTModel","_ref","_ref$center","center","_ref$transform","transform","_ref$stats","vertices2","copyVertices","cityJSONTransform","vertex","transformVertices","centerVertices","customTransformVertices","sourceFormat","schemaVersion","version","title","created","numTriangles","numVertices","numObjects","rootMetaObjectId","modelMetaObjectId","ctx","msg","nextId","cityObjects","CityObjects","objectId","parseCityObject","parseCityJSON","centerPos","cityObject","parents","objectMaterial","surfaceMaterials","appearance","materials","geometryMaterial","material","themeIds","theme","surfaceMaterial","parseGeometrySurfacesWithOwnMaterials","parseGeometrySurfacesWithSharedMaterial","createEntity","parseSurfacesWithOwnMaterials","boundaries","shells","solids","surfaces","surface","diffuseColor","transparency","sharedIndices","geometryCfg","newFace","extractLocalIndices","_toConsumableArray","pList","getNormalOfPositions","pv","to2D","unshift","tr","createGeometry","createMesh","parseSurfacesWithSharedMaterial","primitiveCfg","boundary","newBoundary","index","includes","vertexIndex","indexOf","nexti","_p","_n","re","x3","tmp2","y3","utils","isString","parseGLTFIntoXKTModel","baseUri","metaModelData","_ref$includeTextures","includeTextures","_ref$includeNormals","includeNormals","getAttachment","numNormals","numUVs","parse","GLTFLoader","gltfData","metaModelCorrections","getMetaModelCorrections","geometryCreated","parseTexture","parseTextures","_textureSetId","parseTextureSet","_attributes","parseMaterialAttributes","parseMaterials","scene","scenes","nodes","countMeshUsage","parseNode","parseScene","parseDefaultScene","errMsg","eachRootStats","eachChildRoot","metaObjectsMap","metaObjectParent","rootMetaObject","numChildren","countChildren","source","sampler","createTexture","flipY","_textureId","textureSetCfg","normalTexture","normalTextureId","metallicPBR","pbrMetallicRoughness","baseColorTexture","extensions","specularPBR","specularTexture","specularColorTexture","createTextureSet","materialAttributes","diffuseFactor","common","technique","blinn","phong","lambert","diffuse","transparent","baseColorFactor","metallicFactor","roughnessFactor","node","instances","children","childNode","deferredMeshIds","depth","localMatrix","translation","numPrimitives","primitives","primitive","_xktGeometryId","xktGeometryId","mode","attributes","POSITION","NORMAL","COLOR_0","TEXCOORD_0","xktMeshId","meshCfg","nodeName","xktEntityId","rootMetaObjectStats","atob2","atob","Buffer","from","WEBGL_COMPONENT_TYPES","Int16Array","WEBGL_TYPE_SIZES","parseGLTFJSONIntoXKTModel","reuseGeometries","gltf","createXKTGeometryIds","nextMeshId","buffers","all","map","bufferInfo","_arrayBuffer","_buffer","uri","dataUriRegexResult","match","isBase64","decodeURIComponent","ArrayBuffer","view","parseArrayBuffer","parseBuffer","parseBuffers","bufferViewsInfo","bufferViews","parseBufferView","parseBufferViews","freeBuffers","materialsInfo","materialInfo","parseMaterial","_materialData","defaultSceneInfo","sceneInfo","glTFNode","bufferViewInfo","_typedArray","byteOffset","gltfMeshId","meshInfo","numPrimitivesInMesh","primitiveInfo","geometryHash","createPrimitiveGeometryHash","geometryArrays","parsePrimitiveGeometry","childNodeIdx","childGLTFNode","join","accessors","indicesIndex","accessorInfo","parseAccessorTypedArray","positionsIndex","normalsIndex","colorsIndex","bufferView","itemSize","TypedArray","componentType","itemBytes","BYTES_PER_ELEMENT","byteStride","count","parseIFCIntoXKTModel","WebIFC","_ref$autoNormals","autoNormals","includeTypes","excludeTypes","wasmPath","ifcAPI","IfcAPI","SetWasmPath","Init","modelID","OpenModel","ifcProjectId","GetLineIDsWithType","IFCPROJECT","GetLine","ifcProject","parseSpatialChildren","parseMetadata","flatMeshes","LoadAllGeometry","size","createObject","IFCSPACE","ifcSpaceId","flatMesh","GetFlatMesh","parseGeometry","IFCRELDEFINESBYPROPERTIES","relID","rel","relatingPropertyDefinition","RelatingPropertyDefinition","GlobalId","relatedObjects","RelatedObjects","HasProperties","Name","nominalValue","NominalValue","property","valueType","Description","description","createPropertySet","parsePropertySets","ifcElement","parseRelatedItemsOfType","expressID","IFCRELAGGREGATES","IFCRELCONTAINEDINSPATIALSTRUCTURE","relation","related","relatedItems","isArray","element2","flatMeshExpressID","placedGeometries","placedGeometry","geometryExpressID","GetGeometry","vertexData","GetVertexArray","GetVertexData","GetVertexDataSize","GetIndexArray","GetIndexData","GetIndexDataSize","flatTransformation","MAX_VERTICES","parseLASIntoXKTModel","_ref$colorDepth","colorDepth","_ref$fp","fp64","_ref$skip","skip","_ref$log","LASLoader","las","parsedData","loaderData","pointsFormatId","readAttributes","intensity","readIntensities","readColorsAndIntensities","pointsChunks","chunkArray","positionsValue","readPositions","colorsChunks","attributesPosition","attributesColor","attributesIntensity","colorSize","intensities","colorsCompressedSize","l","chunkSize","parseMetaModelIntoXKTModel","includeTypesMap","excludeTypesMap","newObject","countMetaObjects","parsePCDIntoXKTModel","_ref$littleEndian","littleEndian","textData","TextDecoder","decode","il","fromCharCode","escape","decodeText","header","result1","search","result2","exec","headerLen","str","fields","viewpoint","parseFloat","parseInt","sizeSum","rowSize","parseHeader","line","rgb","g","sizes","compressedSize","decompressedSize","decompressed","inData","outLength","ctrl","ref","inLength","outData","inPtr","outPtr","decompressLZF","dataview","DataView","getFloat32","getUint8","row","parsePLYIntoXKTModel","_x","_parsePLYIntoXKTModel","hasColors","colorsValue","PLYLoader","t0","parseSTLIntoXKTModel","_parseSTLIntoXKTModel","splitMeshes","smoothNormals","smoothNormalsAngleThreshold","binData","ensureBinary","isBinary","parseBinary","parseASCII","reader","getUint32","defaultR","defaultG","defaultB","lastR","lastG","lastB","newMesh","normalX","normalY","normalZ","packedColor","getUint16","vertexstart","addMesh","normalx","normaly","normalz","verticesPerFace","normalsPerFace","text","faceRegex","faceCounter","floatRegex","vertexRegex","RegExp","normalRegex","nextGeometryId","ni","acc","posi","vertexMap","vertexNormals","vertexNormalAccum","numVerts","ii","jj","faceToVertexNormals","buildBoxGeometry","xSize","ySize","zSize","centerX","centerY","centerZ","buildBoxLinesGeometry","buildCylinderGeometry","radiusTop","radiusBottom","radialSegments","heightSegments","h","currentRadius","currentHeight","first","second","startIndex","tu","tv","openEnded","heightHalf","heightLength","radialAngle","PI","radialLength","radiusChange","atan","buildGridGeometry","divisions","step","halfSize","buildPlaneGeometry","xSegments","zSegments","halfWidth","halfHeight","planeX","planeZ","planeX1","planeZ1","segmentWidth","segmentHeight","offset2","buildSphereGeometry","lod","widthSegments","sinTheta","cosTheta","phi","sinPhi","buildTorusGeometry","tube","tubeSegments","arc","letters","buildVectorTextGeometry","penUp","pointsLen","origin","xOrigin","yOrigin","zOrigin","trim","countVerts","iLine","buf","fs","path","convert2xkt","configs","sourceData","metaModelSource","output","outputXKTModel","outputXKT","_ref$reuseGeometries","_ref$minTileSize","outputStats","_ref$rotateX","rotateX","sourceSize","xktSize","compressionRatio","conversionTime","_log","startTime","Date","sourceConfigs","ext","fileName","extname","substring","getFileExtension","fileTypeConfigs","readFileSync","sourceFileSizeBytes","toFixed","overrideOption","convert","dirname","option1","option2","parser","converterParams","createDefaultMetaObjects","finalize","xktArrayBuffer","xktContent","targetFileSizeBytes","outputDir","existsSync","mkdirSync","recursive","writeFileSync","installFilePolyfills"],"sourceRoot":""} \ No newline at end of file diff --git a/docs/ast/source/convert2xkt.js.json b/docs/ast/source/convert2xkt.js.json index bb1c986..0afd99e 100644 --- a/docs/ast/source/convert2xkt.js.json +++ b/docs/ast/source/convert2xkt.js.json @@ -1,7 +1,7 @@ { "type": "File", "start": 0, - "end": 18394, + "end": 18396, "loc": { "start": { "line": 1, @@ -15,7 +15,7 @@ "program": { "type": "Program", "start": 0, - "end": 18394, + "end": 18396, "loc": { "start": { "line": 1, @@ -1133,7 +1133,7 @@ { "type": "Identifier", "start": 5090, - "end": 18371, + "end": 18373, "loc": { "start": { "line": 75, @@ -2602,7 +2602,7 @@ "body": { "type": "BlockStatement", "start": 6004, - "end": 18371, + "end": 18373, "loc": { "start": { "line": 98, @@ -4834,7 +4834,7 @@ { "type": "FunctionDeclaration", "start": 6605, - "end": 6787, + "end": 6789, "loc": { "start": { "line": 123, @@ -4887,7 +4887,7 @@ "body": { "type": "BlockStatement", "start": 6641, - "end": 6787, + "end": 6789, "loc": { "start": { "line": 123, @@ -4902,7 +4902,7 @@ { "type": "VariableDeclaration", "start": 6650, - "end": 6682, + "end": 6684, "loc": { "start": { "line": 124, @@ -4910,14 +4910,14 @@ }, "end": { "line": 124, - "column": 39 + "column": 41 } }, "declarations": [ { "type": "VariableDeclarator", "start": 6654, - "end": 6681, + "end": 6683, "loc": { "start": { "line": 124, @@ -4925,7 +4925,7 @@ }, "end": { "line": 124, - "column": 38 + "column": 40 } }, "id": { @@ -4948,7 +4948,7 @@ "init": { "type": "CallExpression", "start": 6661, - "end": 6681, + "end": 6683, "loc": { "start": { "line": 124, @@ -4956,7 +4956,7 @@ }, "end": { "line": 124, - "column": 38 + "column": 40 } }, "callee": { @@ -5013,7 +5013,7 @@ { "type": "Identifier", "start": 6674, - "end": 6680, + "end": 6682, "loc": { "start": { "line": 124, @@ -5021,11 +5021,11 @@ }, "end": { "line": 124, - "column": 37 + "column": 39 }, - "identifierName": "source" + "identifierName": "fileName" }, - "name": "source" + "name": "fileName" } ] } @@ -5035,8 +5035,8 @@ }, { "type": "IfStatement", - "start": 6690, - "end": 6762, + "start": 6692, + "end": 6764, "loc": { "start": { "line": 125, @@ -5049,8 +5049,8 @@ }, "test": { "type": "BinaryExpression", - "start": 6694, - "end": 6715, + "start": 6696, + "end": 6717, "loc": { "start": { "line": 125, @@ -5063,8 +5063,8 @@ }, "left": { "type": "CallExpression", - "start": 6694, - "end": 6707, + "start": 6696, + "end": 6709, "loc": { "start": { "line": 125, @@ -5077,8 +5077,8 @@ }, "callee": { "type": "MemberExpression", - "start": 6694, - "end": 6704, + "start": 6696, + "end": 6706, "loc": { "start": { "line": 125, @@ -5091,8 +5091,8 @@ }, "object": { "type": "Identifier", - "start": 6694, - "end": 6697, + "start": 6696, + "end": 6699, "loc": { "start": { "line": 125, @@ -5108,8 +5108,8 @@ }, "property": { "type": "Identifier", - "start": 6698, - "end": 6704, + "start": 6700, + "end": 6706, "loc": { "start": { "line": 125, @@ -5128,8 +5128,8 @@ "arguments": [ { "type": "NumericLiteral", - "start": 6705, - "end": 6706, + "start": 6707, + "end": 6708, "loc": { "start": { "line": 125, @@ -5151,8 +5151,8 @@ "operator": "===", "right": { "type": "StringLiteral", - "start": 6712, - "end": 6715, + "start": 6714, + "end": 6717, "loc": { "start": { "line": 125, @@ -5172,8 +5172,8 @@ }, "consequent": { "type": "BlockStatement", - "start": 6717, - "end": 6762, + "start": 6719, + "end": 6764, "loc": { "start": { "line": 125, @@ -5187,8 +5187,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 6730, - "end": 6753, + "start": 6732, + "end": 6755, "loc": { "start": { "line": 126, @@ -5201,8 +5201,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 6730, - "end": 6752, + "start": 6732, + "end": 6754, "loc": { "start": { "line": 126, @@ -5216,8 +5216,8 @@ "operator": "=", "left": { "type": "Identifier", - "start": 6730, - "end": 6733, + "start": 6732, + "end": 6735, "loc": { "start": { "line": 126, @@ -5233,8 +5233,8 @@ }, "right": { "type": "CallExpression", - "start": 6736, - "end": 6752, + "start": 6738, + "end": 6754, "loc": { "start": { "line": 126, @@ -5247,8 +5247,8 @@ }, "callee": { "type": "MemberExpression", - "start": 6736, - "end": 6749, + "start": 6738, + "end": 6751, "loc": { "start": { "line": 126, @@ -5261,8 +5261,8 @@ }, "object": { "type": "Identifier", - "start": 6736, - "end": 6739, + "start": 6738, + "end": 6741, "loc": { "start": { "line": 126, @@ -5278,8 +5278,8 @@ }, "property": { "type": "Identifier", - "start": 6740, - "end": 6749, + "start": 6742, + "end": 6751, "loc": { "start": { "line": 126, @@ -5298,8 +5298,8 @@ "arguments": [ { "type": "NumericLiteral", - "start": 6750, - "end": 6751, + "start": 6752, + "end": 6753, "loc": { "start": { "line": 126, @@ -5327,8 +5327,8 @@ }, { "type": "ReturnStatement", - "start": 6770, - "end": 6781, + "start": 6772, + "end": 6783, "loc": { "start": { "line": 128, @@ -5341,8 +5341,8 @@ }, "argument": { "type": "Identifier", - "start": 6777, - "end": 6780, + "start": 6779, + "end": 6782, "loc": { "start": { "line": 128, @@ -5363,8 +5363,8 @@ }, { "type": "ReturnStatement", - "start": 6793, - "end": 18369, + "start": 6795, + "end": 18371, "loc": { "start": { "line": 131, @@ -5377,8 +5377,8 @@ }, "argument": { "type": "NewExpression", - "start": 6800, - "end": 18368, + "start": 6802, + "end": 18370, "loc": { "start": { "line": 131, @@ -5391,8 +5391,8 @@ }, "callee": { "type": "Identifier", - "start": 6804, - "end": 6811, + "start": 6806, + "end": 6813, "loc": { "start": { "line": 131, @@ -5409,8 +5409,8 @@ "arguments": [ { "type": "FunctionExpression", - "start": 6812, - "end": 18367, + "start": 6814, + "end": 18369, "loc": { "start": { "line": 131, @@ -5428,8 +5428,8 @@ "params": [ { "type": "Identifier", - "start": 6822, - "end": 6829, + "start": 6824, + "end": 6831, "loc": { "start": { "line": 131, @@ -5445,8 +5445,8 @@ }, { "type": "Identifier", - "start": 6831, - "end": 6837, + "start": 6833, + "end": 6839, "loc": { "start": { "line": 131, @@ -5463,8 +5463,8 @@ ], "body": { "type": "BlockStatement", - "start": 6839, - "end": 18367, + "start": 6841, + "end": 18369, "loc": { "start": { "line": 131, @@ -5478,8 +5478,8 @@ "body": [ { "type": "VariableDeclaration", - "start": 6849, - "end": 6866, + "start": 6851, + "end": 6868, "loc": { "start": { "line": 132, @@ -5493,8 +5493,8 @@ "declarations": [ { "type": "VariableDeclarator", - "start": 6855, - "end": 6865, + "start": 6857, + "end": 6867, "loc": { "start": { "line": 132, @@ -5507,8 +5507,8 @@ }, "id": { "type": "Identifier", - "start": 6855, - "end": 6859, + "start": 6857, + "end": 6861, "loc": { "start": { "line": 132, @@ -5524,8 +5524,8 @@ }, "init": { "type": "Identifier", - "start": 6862, - "end": 6865, + "start": 6864, + "end": 6867, "loc": { "start": { "line": 132, @@ -5545,8 +5545,8 @@ }, { "type": "ExpressionStatement", - "start": 6875, - "end": 6942, + "start": 6877, + "end": 6944, "loc": { "start": { "line": 133, @@ -5559,8 +5559,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 6875, - "end": 6942, + "start": 6877, + "end": 6944, "loc": { "start": { "line": 133, @@ -5574,8 +5574,8 @@ "operator": "=", "left": { "type": "Identifier", - "start": 6875, - "end": 6878, + "start": 6877, + "end": 6880, "loc": { "start": { "line": 133, @@ -5591,8 +5591,8 @@ }, "right": { "type": "ArrowFunctionExpression", - "start": 6881, - "end": 6942, + "start": 6883, + "end": 6944, "loc": { "start": { "line": 133, @@ -5610,8 +5610,8 @@ "params": [ { "type": "Identifier", - "start": 6882, - "end": 6885, + "start": 6884, + "end": 6887, "loc": { "start": { "line": 133, @@ -5628,8 +5628,8 @@ ], "body": { "type": "BlockStatement", - "start": 6890, - "end": 6942, + "start": 6892, + "end": 6944, "loc": { "start": { "line": 133, @@ -5643,8 +5643,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 6904, - "end": 6932, + "start": 6906, + "end": 6934, "loc": { "start": { "line": 134, @@ -5657,8 +5657,8 @@ }, "expression": { "type": "CallExpression", - "start": 6904, - "end": 6932, + "start": 6906, + "end": 6934, "loc": { "start": { "line": 134, @@ -5671,8 +5671,8 @@ }, "callee": { "type": "Identifier", - "start": 6904, - "end": 6908, + "start": 6906, + "end": 6910, "loc": { "start": { "line": 134, @@ -5689,8 +5689,8 @@ "arguments": [ { "type": "TemplateLiteral", - "start": 6909, - "end": 6931, + "start": 6911, + "end": 6933, "loc": { "start": { "line": 134, @@ -5704,8 +5704,8 @@ "expressions": [ { "type": "Identifier", - "start": 6926, - "end": 6929, + "start": 6928, + "end": 6931, "loc": { "start": { "line": 134, @@ -5723,8 +5723,8 @@ "quasis": [ { "type": "TemplateElement", - "start": 6910, - "end": 6924, + "start": 6912, + "end": 6926, "loc": { "start": { "line": 134, @@ -5743,8 +5743,8 @@ }, { "type": "TemplateElement", - "start": 6930, - "end": 6930, + "start": 6932, + "end": 6932, "loc": { "start": { "line": 134, @@ -5774,8 +5774,8 @@ }, { "type": "IfStatement", - "start": 6952, - "end": 7074, + "start": 6954, + "end": 7076, "loc": { "start": { "line": 137, @@ -5788,8 +5788,8 @@ }, "test": { "type": "LogicalExpression", - "start": 6956, - "end": 6978, + "start": 6958, + "end": 6980, "loc": { "start": { "line": 137, @@ -5802,8 +5802,8 @@ }, "left": { "type": "UnaryExpression", - "start": 6956, - "end": 6963, + "start": 6958, + "end": 6965, "loc": { "start": { "line": 137, @@ -5818,8 +5818,8 @@ "prefix": true, "argument": { "type": "Identifier", - "start": 6957, - "end": 6963, + "start": 6959, + "end": 6965, "loc": { "start": { "line": 137, @@ -5840,8 +5840,8 @@ "operator": "&&", "right": { "type": "UnaryExpression", - "start": 6967, - "end": 6978, + "start": 6969, + "end": 6980, "loc": { "start": { "line": 137, @@ -5856,8 +5856,8 @@ "prefix": true, "argument": { "type": "Identifier", - "start": 6968, - "end": 6978, + "start": 6970, + "end": 6980, "loc": { "start": { "line": 137, @@ -5878,8 +5878,8 @@ }, "consequent": { "type": "BlockStatement", - "start": 6980, - "end": 7074, + "start": 6982, + "end": 7076, "loc": { "start": { "line": 137, @@ -5893,8 +5893,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 6994, - "end": 7044, + "start": 6996, + "end": 7046, "loc": { "start": { "line": 138, @@ -5907,8 +5907,8 @@ }, "expression": { "type": "CallExpression", - "start": 6994, - "end": 7043, + "start": 6996, + "end": 7045, "loc": { "start": { "line": 138, @@ -5921,8 +5921,8 @@ }, "callee": { "type": "Identifier", - "start": 6994, - "end": 7000, + "start": 6996, + "end": 7002, "loc": { "start": { "line": 138, @@ -5939,8 +5939,8 @@ "arguments": [ { "type": "StringLiteral", - "start": 7001, - "end": 7042, + "start": 7003, + "end": 7044, "loc": { "start": { "line": 138, @@ -5962,8 +5962,8 @@ }, { "type": "ReturnStatement", - "start": 7057, - "end": 7064, + "start": 7059, + "end": 7066, "loc": { "start": { "line": 139, @@ -5983,8 +5983,8 @@ }, { "type": "IfStatement", - "start": 7084, - "end": 7231, + "start": 7086, + "end": 7233, "loc": { "start": { "line": 142, @@ -5997,8 +5997,8 @@ }, "test": { "type": "LogicalExpression", - "start": 7088, - "end": 7115, + "start": 7090, + "end": 7117, "loc": { "start": { "line": 142, @@ -6011,8 +6011,8 @@ }, "left": { "type": "UnaryExpression", - "start": 7088, - "end": 7101, + "start": 7090, + "end": 7103, "loc": { "start": { "line": 142, @@ -6027,8 +6027,8 @@ "prefix": true, "argument": { "type": "Identifier", - "start": 7089, - "end": 7101, + "start": 7091, + "end": 7103, "loc": { "start": { "line": 142, @@ -6049,8 +6049,8 @@ "operator": "&&", "right": { "type": "Identifier", - "start": 7105, - "end": 7115, + "start": 7107, + "end": 7117, "loc": { "start": { "line": 142, @@ -6067,8 +6067,8 @@ }, "consequent": { "type": "BlockStatement", - "start": 7117, - "end": 7231, + "start": 7119, + "end": 7233, "loc": { "start": { "line": 142, @@ -6082,8 +6082,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 7131, - "end": 7201, + "start": 7133, + "end": 7203, "loc": { "start": { "line": 143, @@ -6096,8 +6096,8 @@ }, "expression": { "type": "CallExpression", - "start": 7131, - "end": 7200, + "start": 7133, + "end": 7202, "loc": { "start": { "line": 143, @@ -6110,8 +6110,8 @@ }, "callee": { "type": "Identifier", - "start": 7131, - "end": 7137, + "start": 7133, + "end": 7139, "loc": { "start": { "line": 143, @@ -6128,8 +6128,8 @@ "arguments": [ { "type": "StringLiteral", - "start": 7138, - "end": 7199, + "start": 7140, + "end": 7201, "loc": { "start": { "line": 143, @@ -6151,8 +6151,8 @@ }, { "type": "ReturnStatement", - "start": 7214, - "end": 7221, + "start": 7216, + "end": 7223, "loc": { "start": { "line": 144, @@ -6172,8 +6172,8 @@ }, { "type": "IfStatement", - "start": 7241, - "end": 7396, + "start": 7243, + "end": 7398, "loc": { "start": { "line": 147, @@ -6186,8 +6186,8 @@ }, "test": { "type": "LogicalExpression", - "start": 7245, - "end": 7285, + "start": 7247, + "end": 7287, "loc": { "start": { "line": 147, @@ -6200,8 +6200,8 @@ }, "left": { "type": "LogicalExpression", - "start": 7245, - "end": 7271, + "start": 7247, + "end": 7273, "loc": { "start": { "line": 147, @@ -6214,8 +6214,8 @@ }, "left": { "type": "UnaryExpression", - "start": 7245, - "end": 7252, + "start": 7247, + "end": 7254, "loc": { "start": { "line": 147, @@ -6230,8 +6230,8 @@ "prefix": true, "argument": { "type": "Identifier", - "start": 7246, - "end": 7252, + "start": 7248, + "end": 7254, "loc": { "start": { "line": 147, @@ -6252,8 +6252,8 @@ "operator": "&&", "right": { "type": "UnaryExpression", - "start": 7256, - "end": 7271, + "start": 7258, + "end": 7273, "loc": { "start": { "line": 147, @@ -6268,8 +6268,8 @@ "prefix": true, "argument": { "type": "Identifier", - "start": 7257, - "end": 7271, + "start": 7259, + "end": 7273, "loc": { "start": { "line": 147, @@ -6291,8 +6291,8 @@ "operator": "&&", "right": { "type": "UnaryExpression", - "start": 7275, - "end": 7285, + "start": 7277, + "end": 7287, "loc": { "start": { "line": 147, @@ -6307,8 +6307,8 @@ "prefix": true, "argument": { "type": "Identifier", - "start": 7276, - "end": 7285, + "start": 7278, + "end": 7287, "loc": { "start": { "line": 147, @@ -6329,8 +6329,8 @@ }, "consequent": { "type": "BlockStatement", - "start": 7287, - "end": 7396, + "start": 7289, + "end": 7398, "loc": { "start": { "line": 147, @@ -6344,8 +6344,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 7301, - "end": 7366, + "start": 7303, + "end": 7368, "loc": { "start": { "line": 148, @@ -6358,8 +6358,8 @@ }, "expression": { "type": "CallExpression", - "start": 7301, - "end": 7365, + "start": 7303, + "end": 7367, "loc": { "start": { "line": 148, @@ -6372,8 +6372,8 @@ }, "callee": { "type": "Identifier", - "start": 7301, - "end": 7307, + "start": 7303, + "end": 7309, "loc": { "start": { "line": 148, @@ -6390,8 +6390,8 @@ "arguments": [ { "type": "StringLiteral", - "start": 7308, - "end": 7364, + "start": 7310, + "end": 7366, "loc": { "start": { "line": 148, @@ -6413,8 +6413,8 @@ }, { "type": "ReturnStatement", - "start": 7379, - "end": 7386, + "start": 7381, + "end": 7388, "loc": { "start": { "line": 149, @@ -6434,8 +6434,8 @@ }, { "type": "IfStatement", - "start": 7406, - "end": 7479, + "start": 7408, + "end": 7481, "loc": { "start": { "line": 152, @@ -6448,8 +6448,8 @@ }, "test": { "type": "Identifier", - "start": 7410, - "end": 7416, + "start": 7412, + "end": 7418, "loc": { "start": { "line": 152, @@ -6465,8 +6465,8 @@ }, "consequent": { "type": "BlockStatement", - "start": 7418, - "end": 7479, + "start": 7420, + "end": 7481, "loc": { "start": { "line": 152, @@ -6480,8 +6480,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 7432, - "end": 7469, + "start": 7434, + "end": 7471, "loc": { "start": { "line": 153, @@ -6494,8 +6494,8 @@ }, "expression": { "type": "CallExpression", - "start": 7432, - "end": 7468, + "start": 7434, + "end": 7470, "loc": { "start": { "line": 153, @@ -6508,8 +6508,8 @@ }, "callee": { "type": "Identifier", - "start": 7432, - "end": 7435, + "start": 7434, + "end": 7437, "loc": { "start": { "line": 153, @@ -6526,8 +6526,8 @@ "arguments": [ { "type": "BinaryExpression", - "start": 7436, - "end": 7467, + "start": 7438, + "end": 7469, "loc": { "start": { "line": 153, @@ -6540,8 +6540,8 @@ }, "left": { "type": "StringLiteral", - "start": 7436, - "end": 7458, + "start": 7438, + "end": 7460, "loc": { "start": { "line": 153, @@ -6561,8 +6561,8 @@ "operator": "+", "right": { "type": "Identifier", - "start": 7461, - "end": 7467, + "start": 7463, + "end": 7469, "loc": { "start": { "line": 153, @@ -6587,8 +6587,8 @@ }, { "type": "VariableDeclaration", - "start": 7489, - "end": 7518, + "start": 7491, + "end": 7520, "loc": { "start": { "line": 156, @@ -6602,8 +6602,8 @@ "declarations": [ { "type": "VariableDeclarator", - "start": 7495, - "end": 7517, + "start": 7497, + "end": 7519, "loc": { "start": { "line": 156, @@ -6616,8 +6616,8 @@ }, "id": { "type": "Identifier", - "start": 7495, - "end": 7504, + "start": 7497, + "end": 7506, "loc": { "start": { "line": 156, @@ -6633,8 +6633,8 @@ }, "init": { "type": "NewExpression", - "start": 7507, - "end": 7517, + "start": 7509, + "end": 7519, "loc": { "start": { "line": 156, @@ -6647,8 +6647,8 @@ }, "callee": { "type": "Identifier", - "start": 7511, - "end": 7515, + "start": 7513, + "end": 7517, "loc": { "start": { "line": 156, @@ -6670,8 +6670,8 @@ }, { "type": "VariableDeclaration", - "start": 7528, - "end": 7578, + "start": 7530, + "end": 7580, "loc": { "start": { "line": 158, @@ -6685,8 +6685,8 @@ "declarations": [ { "type": "VariableDeclarator", - "start": 7534, - "end": 7577, + "start": 7536, + "end": 7579, "loc": { "start": { "line": 158, @@ -6699,8 +6699,8 @@ }, "id": { "type": "Identifier", - "start": 7534, - "end": 7547, + "start": 7536, + "end": 7549, "loc": { "start": { "line": 158, @@ -6716,8 +6716,8 @@ }, "init": { "type": "LogicalExpression", - "start": 7550, - "end": 7577, + "start": 7552, + "end": 7579, "loc": { "start": { "line": 158, @@ -6730,8 +6730,8 @@ }, "left": { "type": "MemberExpression", - "start": 7550, - "end": 7571, + "start": 7552, + "end": 7573, "loc": { "start": { "line": 158, @@ -6744,8 +6744,8 @@ }, "object": { "type": "Identifier", - "start": 7550, - "end": 7557, + "start": 7552, + "end": 7559, "loc": { "start": { "line": 158, @@ -6761,8 +6761,8 @@ }, "property": { "type": "Identifier", - "start": 7558, - "end": 7571, + "start": 7560, + "end": 7573, "loc": { "start": { "line": 158, @@ -6781,8 +6781,8 @@ "operator": "||", "right": { "type": "ObjectExpression", - "start": 7575, - "end": 7577, + "start": 7577, + "end": 7579, "loc": { "start": { "line": 158, @@ -6802,8 +6802,8 @@ }, { "type": "VariableDeclaration", - "start": 7587, - "end": 7640, + "start": 7589, + "end": 7642, "loc": { "start": { "line": 159, @@ -6817,8 +6817,8 @@ "declarations": [ { "type": "VariableDeclarator", - "start": 7593, - "end": 7639, + "start": 7595, + "end": 7641, "loc": { "start": { "line": 159, @@ -6831,8 +6831,8 @@ }, "id": { "type": "Identifier", - "start": 7593, - "end": 7596, + "start": 7595, + "end": 7598, "loc": { "start": { "line": 159, @@ -6848,8 +6848,8 @@ }, "init": { "type": "LogicalExpression", - "start": 7599, - "end": 7639, + "start": 7601, + "end": 7641, "loc": { "start": { "line": 159, @@ -6862,8 +6862,8 @@ }, "left": { "type": "Identifier", - "start": 7599, - "end": 7611, + "start": 7601, + "end": 7613, "loc": { "start": { "line": 159, @@ -6880,8 +6880,8 @@ "operator": "||", "right": { "type": "CallExpression", - "start": 7615, - "end": 7639, + "start": 7617, + "end": 7641, "loc": { "start": { "line": 159, @@ -6894,8 +6894,8 @@ }, "callee": { "type": "Identifier", - "start": 7615, - "end": 7631, + "start": 7617, + "end": 7633, "loc": { "start": { "line": 159, @@ -6912,8 +6912,8 @@ "arguments": [ { "type": "Identifier", - "start": 7632, - "end": 7638, + "start": 7634, + "end": 7640, "loc": { "start": { "line": 159, @@ -6936,8 +6936,8 @@ }, { "type": "ExpressionStatement", - "start": 7650, - "end": 7688, + "start": 7652, + "end": 7690, "loc": { "start": { "line": 161, @@ -6950,8 +6950,8 @@ }, "expression": { "type": "CallExpression", - "start": 7650, - "end": 7687, + "start": 7652, + "end": 7689, "loc": { "start": { "line": 161, @@ -6964,8 +6964,8 @@ }, "callee": { "type": "Identifier", - "start": 7650, - "end": 7653, + "start": 7652, + "end": 7655, "loc": { "start": { "line": 161, @@ -6982,8 +6982,8 @@ "arguments": [ { "type": "TemplateLiteral", - "start": 7654, - "end": 7686, + "start": 7656, + "end": 7688, "loc": { "start": { "line": 161, @@ -6997,8 +6997,8 @@ "expressions": [ { "type": "Identifier", - "start": 7680, - "end": 7683, + "start": 7682, + "end": 7685, "loc": { "start": { "line": 161, @@ -7016,8 +7016,8 @@ "quasis": [ { "type": "TemplateElement", - "start": 7655, - "end": 7678, + "start": 7657, + "end": 7680, "loc": { "start": { "line": 161, @@ -7036,8 +7036,8 @@ }, { "type": "TemplateElement", - "start": 7684, - "end": 7685, + "start": 7686, + "end": 7687, "loc": { "start": { "line": 161, @@ -7061,8 +7061,8 @@ }, { "type": "VariableDeclaration", - "start": 7698, - "end": 7739, + "start": 7700, + "end": 7741, "loc": { "start": { "line": 163, @@ -7076,8 +7076,8 @@ "declarations": [ { "type": "VariableDeclarator", - "start": 7702, - "end": 7738, + "start": 7704, + "end": 7740, "loc": { "start": { "line": 163, @@ -7090,8 +7090,8 @@ }, "id": { "type": "Identifier", - "start": 7702, - "end": 7717, + "start": 7704, + "end": 7719, "loc": { "start": { "line": 163, @@ -7107,8 +7107,8 @@ }, "init": { "type": "MemberExpression", - "start": 7720, - "end": 7738, + "start": 7722, + "end": 7740, "loc": { "start": { "line": 163, @@ -7121,8 +7121,8 @@ }, "object": { "type": "Identifier", - "start": 7720, - "end": 7733, + "start": 7722, + "end": 7735, "loc": { "start": { "line": 163, @@ -7138,8 +7138,8 @@ }, "property": { "type": "Identifier", - "start": 7734, - "end": 7737, + "start": 7736, + "end": 7739, "loc": { "start": { "line": 163, @@ -7161,8 +7161,8 @@ }, { "type": "IfStatement", - "start": 7749, - "end": 8005, + "start": 7751, + "end": 8007, "loc": { "start": { "line": 165, @@ -7175,8 +7175,8 @@ }, "test": { "type": "UnaryExpression", - "start": 7753, - "end": 7769, + "start": 7755, + "end": 7771, "loc": { "start": { "line": 165, @@ -7191,8 +7191,8 @@ "prefix": true, "argument": { "type": "Identifier", - "start": 7754, - "end": 7769, + "start": 7756, + "end": 7771, "loc": { "start": { "line": 165, @@ -7212,8 +7212,8 @@ }, "consequent": { "type": "BlockStatement", - "start": 7771, - "end": 8005, + "start": 7773, + "end": 8007, "loc": { "start": { "line": 165, @@ -7227,8 +7227,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 7785, - "end": 7961, + "start": 7787, + "end": 7963, "loc": { "start": { "line": 166, @@ -7241,8 +7241,8 @@ }, "expression": { "type": "CallExpression", - "start": 7785, - "end": 7960, + "start": 7787, + "end": 7962, "loc": { "start": { "line": 166, @@ -7255,8 +7255,8 @@ }, "callee": { "type": "Identifier", - "start": 7785, - "end": 7788, + "start": 7787, + "end": 7790, "loc": { "start": { "line": 166, @@ -7273,8 +7273,8 @@ "arguments": [ { "type": "TemplateLiteral", - "start": 7789, - "end": 7959, + "start": 7791, + "end": 7961, "loc": { "start": { "line": 166, @@ -7288,8 +7288,8 @@ "expressions": [ { "type": "Identifier", - "start": 7864, - "end": 7867, + "start": 7866, + "end": 7869, "loc": { "start": { "line": 166, @@ -7307,8 +7307,8 @@ "quasis": [ { "type": "TemplateElement", - "start": 7790, - "end": 7862, + "start": 7792, + "end": 7864, "loc": { "start": { "line": 166, @@ -7327,8 +7327,8 @@ }, { "type": "TemplateElement", - "start": 7868, - "end": 7958, + "start": 7870, + "end": 7960, "loc": { "start": { "line": 166, @@ -7352,8 +7352,8 @@ }, { "type": "ExpressionStatement", - "start": 7974, - "end": 7995, + "start": 7976, + "end": 7997, "loc": { "start": { "line": 167, @@ -7366,8 +7366,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 7974, - "end": 7994, + "start": 7976, + "end": 7996, "loc": { "start": { "line": 167, @@ -7381,8 +7381,8 @@ "operator": "=", "left": { "type": "Identifier", - "start": 7974, - "end": 7989, + "start": 7976, + "end": 7991, "loc": { "start": { "line": 167, @@ -7398,8 +7398,8 @@ }, "right": { "type": "ObjectExpression", - "start": 7992, - "end": 7994, + "start": 7994, + "end": 7996, "loc": { "start": { "line": 167, @@ -7421,8 +7421,8 @@ }, { "type": "FunctionDeclaration", - "start": 8014, - "end": 8182, + "start": 8016, + "end": 8184, "loc": { "start": { "line": 169, @@ -7435,8 +7435,8 @@ }, "id": { "type": "Identifier", - "start": 8023, - "end": 8037, + "start": 8025, + "end": 8039, "loc": { "start": { "line": 169, @@ -7456,8 +7456,8 @@ "params": [ { "type": "Identifier", - "start": 8038, - "end": 8045, + "start": 8040, + "end": 8047, "loc": { "start": { "line": 169, @@ -7473,8 +7473,8 @@ }, { "type": "Identifier", - "start": 8047, - "end": 8054, + "start": 8049, + "end": 8056, "loc": { "start": { "line": 169, @@ -7491,8 +7491,8 @@ ], "body": { "type": "BlockStatement", - "start": 8056, - "end": 8182, + "start": 8058, + "end": 8184, "loc": { "start": { "line": 169, @@ -7506,8 +7506,8 @@ "body": [ { "type": "IfStatement", - "start": 8070, - "end": 8144, + "start": 8072, + "end": 8146, "loc": { "start": { "line": 170, @@ -7520,8 +7520,8 @@ }, "test": { "type": "BinaryExpression", - "start": 8074, - "end": 8095, + "start": 8076, + "end": 8097, "loc": { "start": { "line": 170, @@ -7534,8 +7534,8 @@ }, "left": { "type": "Identifier", - "start": 8074, - "end": 8081, + "start": 8076, + "end": 8083, "loc": { "start": { "line": 170, @@ -7552,8 +7552,8 @@ "operator": "!==", "right": { "type": "Identifier", - "start": 8086, - "end": 8095, + "start": 8088, + "end": 8097, "loc": { "start": { "line": 170, @@ -7570,8 +7570,8 @@ }, "consequent": { "type": "BlockStatement", - "start": 8097, - "end": 8144, + "start": 8099, + "end": 8146, "loc": { "start": { "line": 170, @@ -7585,8 +7585,8 @@ "body": [ { "type": "ReturnStatement", - "start": 8115, - "end": 8130, + "start": 8117, + "end": 8132, "loc": { "start": { "line": 171, @@ -7599,8 +7599,8 @@ }, "argument": { "type": "Identifier", - "start": 8122, - "end": 8129, + "start": 8124, + "end": 8131, "loc": { "start": { "line": 171, @@ -7622,8 +7622,8 @@ }, { "type": "ReturnStatement", - "start": 8157, - "end": 8172, + "start": 8159, + "end": 8174, "loc": { "start": { "line": 173, @@ -7636,8 +7636,8 @@ }, "argument": { "type": "Identifier", - "start": 8164, - "end": 8171, + "start": 8166, + "end": 8173, "loc": { "start": { "line": 173, @@ -7658,8 +7658,8 @@ }, { "type": "IfStatement", - "start": 8192, - "end": 8387, + "start": 8194, + "end": 8389, "loc": { "start": { "line": 176, @@ -7672,8 +7672,8 @@ }, "test": { "type": "UnaryExpression", - "start": 8196, - "end": 8207, + "start": 8198, + "end": 8209, "loc": { "start": { "line": 176, @@ -7688,8 +7688,8 @@ "prefix": true, "argument": { "type": "Identifier", - "start": 8197, - "end": 8207, + "start": 8199, + "end": 8209, "loc": { "start": { "line": 176, @@ -7709,8 +7709,8 @@ }, "consequent": { "type": "BlockStatement", - "start": 8209, - "end": 8387, + "start": 8211, + "end": 8389, "loc": { "start": { "line": 176, @@ -7724,8 +7724,8 @@ "body": [ { "type": "TryStatement", - "start": 8223, - "end": 8377, + "start": 8225, + "end": 8379, "loc": { "start": { "line": 177, @@ -7738,8 +7738,8 @@ }, "block": { "type": "BlockStatement", - "start": 8227, - "end": 8296, + "start": 8229, + "end": 8298, "loc": { "start": { "line": 177, @@ -7753,8 +7753,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 8245, - "end": 8282, + "start": 8247, + "end": 8284, "loc": { "start": { "line": 178, @@ -7767,8 +7767,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 8245, - "end": 8281, + "start": 8247, + "end": 8283, "loc": { "start": { "line": 178, @@ -7782,8 +7782,8 @@ "operator": "=", "left": { "type": "Identifier", - "start": 8245, - "end": 8255, + "start": 8247, + "end": 8257, "loc": { "start": { "line": 178, @@ -7799,8 +7799,8 @@ }, "right": { "type": "CallExpression", - "start": 8258, - "end": 8281, + "start": 8260, + "end": 8283, "loc": { "start": { "line": 178, @@ -7813,8 +7813,8 @@ }, "callee": { "type": "MemberExpression", - "start": 8258, - "end": 8273, + "start": 8260, + "end": 8275, "loc": { "start": { "line": 178, @@ -7827,8 +7827,8 @@ }, "object": { "type": "Identifier", - "start": 8258, - "end": 8260, + "start": 8260, + "end": 8262, "loc": { "start": { "line": 178, @@ -7844,8 +7844,8 @@ }, "property": { "type": "Identifier", - "start": 8261, - "end": 8273, + "start": 8263, + "end": 8275, "loc": { "start": { "line": 178, @@ -7864,8 +7864,8 @@ "arguments": [ { "type": "Identifier", - "start": 8274, - "end": 8280, + "start": 8276, + "end": 8282, "loc": { "start": { "line": 178, @@ -7888,8 +7888,8 @@ }, "handler": { "type": "CatchClause", - "start": 8297, - "end": 8377, + "start": 8299, + "end": 8379, "loc": { "start": { "line": 179, @@ -7902,8 +7902,8 @@ }, "param": { "type": "Identifier", - "start": 8304, - "end": 8307, + "start": 8306, + "end": 8309, "loc": { "start": { "line": 179, @@ -7919,8 +7919,8 @@ }, "body": { "type": "BlockStatement", - "start": 8309, - "end": 8377, + "start": 8311, + "end": 8379, "loc": { "start": { "line": 179, @@ -7934,8 +7934,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 8327, - "end": 8339, + "start": 8329, + "end": 8341, "loc": { "start": { "line": 180, @@ -7948,8 +7948,8 @@ }, "expression": { "type": "CallExpression", - "start": 8327, - "end": 8338, + "start": 8329, + "end": 8340, "loc": { "start": { "line": 180, @@ -7962,8 +7962,8 @@ }, "callee": { "type": "Identifier", - "start": 8327, - "end": 8333, + "start": 8329, + "end": 8335, "loc": { "start": { "line": 180, @@ -7980,8 +7980,8 @@ "arguments": [ { "type": "Identifier", - "start": 8334, - "end": 8337, + "start": 8336, + "end": 8339, "loc": { "start": { "line": 180, @@ -8000,8 +8000,8 @@ }, { "type": "ReturnStatement", - "start": 8356, - "end": 8363, + "start": 8358, + "end": 8365, "loc": { "start": { "line": 181, @@ -8028,8 +8028,8 @@ }, { "type": "VariableDeclaration", - "start": 8397, - "end": 8447, + "start": 8399, + "end": 8449, "loc": { "start": { "line": 185, @@ -8043,8 +8043,8 @@ "declarations": [ { "type": "VariableDeclarator", - "start": 8403, - "end": 8446, + "start": 8405, + "end": 8448, "loc": { "start": { "line": 185, @@ -8057,8 +8057,8 @@ }, "id": { "type": "Identifier", - "start": 8403, - "end": 8422, + "start": 8405, + "end": 8424, "loc": { "start": { "line": 185, @@ -8074,8 +8074,8 @@ }, "init": { "type": "MemberExpression", - "start": 8425, - "end": 8446, + "start": 8427, + "end": 8448, "loc": { "start": { "line": 185, @@ -8088,8 +8088,8 @@ }, "object": { "type": "Identifier", - "start": 8425, - "end": 8435, + "start": 8427, + "end": 8437, "loc": { "start": { "line": 185, @@ -8105,8 +8105,8 @@ }, "property": { "type": "Identifier", - "start": 8436, - "end": 8446, + "start": 8438, + "end": 8448, "loc": { "start": { "line": 185, @@ -8128,8 +8128,8 @@ }, { "type": "ExpressionStatement", - "start": 8457, - "end": 8532, + "start": 8459, + "end": 8534, "loc": { "start": { "line": 187, @@ -8142,8 +8142,8 @@ }, "expression": { "type": "CallExpression", - "start": 8457, - "end": 8531, + "start": 8459, + "end": 8533, "loc": { "start": { "line": 187, @@ -8156,8 +8156,8 @@ }, "callee": { "type": "Identifier", - "start": 8457, - "end": 8460, + "start": 8459, + "end": 8462, "loc": { "start": { "line": 187, @@ -8174,8 +8174,8 @@ "arguments": [ { "type": "BinaryExpression", - "start": 8461, - "end": 8530, + "start": 8463, + "end": 8532, "loc": { "start": { "line": 187, @@ -8188,8 +8188,8 @@ }, "left": { "type": "BinaryExpression", - "start": 8461, - "end": 8522, + "start": 8463, + "end": 8524, "loc": { "start": { "line": 187, @@ -8202,8 +8202,8 @@ }, "left": { "type": "StringLiteral", - "start": 8461, - "end": 8480, + "start": 8463, + "end": 8482, "loc": { "start": { "line": 187, @@ -8223,8 +8223,8 @@ "operator": "+", "right": { "type": "CallExpression", - "start": 8483, - "end": 8522, + "start": 8485, + "end": 8524, "loc": { "start": { "line": 187, @@ -8237,8 +8237,8 @@ }, "callee": { "type": "MemberExpression", - "start": 8483, - "end": 8519, + "start": 8485, + "end": 8521, "loc": { "start": { "line": 187, @@ -8251,8 +8251,8 @@ }, "object": { "type": "BinaryExpression", - "start": 8484, - "end": 8510, + "start": 8486, + "end": 8512, "loc": { "start": { "line": 187, @@ -8265,8 +8265,8 @@ }, "left": { "type": "Identifier", - "start": 8484, - "end": 8503, + "start": 8486, + "end": 8505, "loc": { "start": { "line": 187, @@ -8283,8 +8283,8 @@ "operator": "/", "right": { "type": "NumericLiteral", - "start": 8506, - "end": 8510, + "start": 8508, + "end": 8512, "loc": { "start": { "line": 187, @@ -8303,13 +8303,13 @@ }, "extra": { "parenthesized": true, - "parenStart": 8483 + "parenStart": 8485 } }, "property": { "type": "Identifier", - "start": 8512, - "end": 8519, + "start": 8514, + "end": 8521, "loc": { "start": { "line": 187, @@ -8328,8 +8328,8 @@ "arguments": [ { "type": "NumericLiteral", - "start": 8520, - "end": 8521, + "start": 8522, + "end": 8523, "loc": { "start": { "line": 187, @@ -8352,8 +8352,8 @@ "operator": "+", "right": { "type": "StringLiteral", - "start": 8525, - "end": 8530, + "start": 8527, + "end": 8532, "loc": { "start": { "line": 187, @@ -8376,8 +8376,8 @@ }, { "type": "IfStatement", - "start": 8542, - "end": 8912, + "start": 8544, + "end": 8914, "loc": { "start": { "line": 189, @@ -8390,8 +8390,8 @@ }, "test": { "type": "LogicalExpression", - "start": 8546, - "end": 8582, + "start": 8548, + "end": 8584, "loc": { "start": { "line": 189, @@ -8404,8 +8404,8 @@ }, "left": { "type": "UnaryExpression", - "start": 8546, - "end": 8563, + "start": 8548, + "end": 8565, "loc": { "start": { "line": 189, @@ -8420,8 +8420,8 @@ "prefix": true, "argument": { "type": "Identifier", - "start": 8547, - "end": 8563, + "start": 8549, + "end": 8565, "loc": { "start": { "line": 189, @@ -8442,8 +8442,8 @@ "operator": "&&", "right": { "type": "Identifier", - "start": 8567, - "end": 8582, + "start": 8569, + "end": 8584, "loc": { "start": { "line": 189, @@ -8460,8 +8460,8 @@ }, "consequent": { "type": "BlockStatement", - "start": 8584, - "end": 8845, + "start": 8586, + "end": 8847, "loc": { "start": { "line": 189, @@ -8475,8 +8475,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 8598, - "end": 8653, + "start": 8600, + "end": 8655, "loc": { "start": { "line": 190, @@ -8489,8 +8489,8 @@ }, "expression": { "type": "CallExpression", - "start": 8598, - "end": 8652, + "start": 8600, + "end": 8654, "loc": { "start": { "line": 190, @@ -8503,8 +8503,8 @@ }, "callee": { "type": "Identifier", - "start": 8598, - "end": 8601, + "start": 8600, + "end": 8603, "loc": { "start": { "line": 190, @@ -8521,8 +8521,8 @@ "arguments": [ { "type": "BinaryExpression", - "start": 8602, - "end": 8651, + "start": 8604, + "end": 8653, "loc": { "start": { "line": 190, @@ -8535,8 +8535,8 @@ }, "left": { "type": "StringLiteral", - "start": 8602, - "end": 8633, + "start": 8604, + "end": 8635, "loc": { "start": { "line": 190, @@ -8556,8 +8556,8 @@ "operator": "+", "right": { "type": "Identifier", - "start": 8636, - "end": 8651, + "start": 8638, + "end": 8653, "loc": { "start": { "line": 190, @@ -8577,8 +8577,8 @@ }, { "type": "TryStatement", - "start": 8666, - "end": 8835, + "start": 8668, + "end": 8837, "loc": { "start": { "line": 191, @@ -8591,8 +8591,8 @@ }, "block": { "type": "BlockStatement", - "start": 8670, - "end": 8754, + "start": 8672, + "end": 8756, "loc": { "start": { "line": 191, @@ -8606,8 +8606,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 8688, - "end": 8740, + "start": 8690, + "end": 8742, "loc": { "start": { "line": 192, @@ -8620,8 +8620,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 8688, - "end": 8739, + "start": 8690, + "end": 8741, "loc": { "start": { "line": 192, @@ -8635,8 +8635,8 @@ "operator": "=", "left": { "type": "Identifier", - "start": 8688, - "end": 8704, + "start": 8690, + "end": 8706, "loc": { "start": { "line": 192, @@ -8652,8 +8652,8 @@ }, "right": { "type": "CallExpression", - "start": 8707, - "end": 8739, + "start": 8709, + "end": 8741, "loc": { "start": { "line": 192, @@ -8666,8 +8666,8 @@ }, "callee": { "type": "MemberExpression", - "start": 8707, - "end": 8722, + "start": 8709, + "end": 8724, "loc": { "start": { "line": 192, @@ -8680,8 +8680,8 @@ }, "object": { "type": "Identifier", - "start": 8707, - "end": 8709, + "start": 8709, + "end": 8711, "loc": { "start": { "line": 192, @@ -8697,8 +8697,8 @@ }, "property": { "type": "Identifier", - "start": 8710, - "end": 8722, + "start": 8712, + "end": 8724, "loc": { "start": { "line": 192, @@ -8717,8 +8717,8 @@ "arguments": [ { "type": "Identifier", - "start": 8723, - "end": 8738, + "start": 8725, + "end": 8740, "loc": { "start": { "line": 192, @@ -8741,8 +8741,8 @@ }, "handler": { "type": "CatchClause", - "start": 8755, - "end": 8835, + "start": 8757, + "end": 8837, "loc": { "start": { "line": 193, @@ -8755,8 +8755,8 @@ }, "param": { "type": "Identifier", - "start": 8762, - "end": 8765, + "start": 8764, + "end": 8767, "loc": { "start": { "line": 193, @@ -8772,8 +8772,8 @@ }, "body": { "type": "BlockStatement", - "start": 8767, - "end": 8835, + "start": 8769, + "end": 8837, "loc": { "start": { "line": 193, @@ -8787,8 +8787,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 8785, - "end": 8797, + "start": 8787, + "end": 8799, "loc": { "start": { "line": 194, @@ -8801,8 +8801,8 @@ }, "expression": { "type": "CallExpression", - "start": 8785, - "end": 8796, + "start": 8787, + "end": 8798, "loc": { "start": { "line": 194, @@ -8815,8 +8815,8 @@ }, "callee": { "type": "Identifier", - "start": 8785, - "end": 8791, + "start": 8787, + "end": 8793, "loc": { "start": { "line": 194, @@ -8833,8 +8833,8 @@ "arguments": [ { "type": "Identifier", - "start": 8792, - "end": 8795, + "start": 8794, + "end": 8797, "loc": { "start": { "line": 194, @@ -8853,8 +8853,8 @@ }, { "type": "ReturnStatement", - "start": 8814, - "end": 8821, + "start": 8816, + "end": 8823, "loc": { "start": { "line": 195, @@ -8879,8 +8879,8 @@ }, "alternate": { "type": "BlockStatement", - "start": 8851, - "end": 8912, + "start": 8853, + "end": 8914, "loc": { "start": { "line": 197, @@ -8894,8 +8894,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 8865, - "end": 8902, + "start": 8867, + "end": 8904, "loc": { "start": { "line": 198, @@ -8908,8 +8908,8 @@ }, "expression": { "type": "CallExpression", - "start": 8865, - "end": 8901, + "start": 8867, + "end": 8903, "loc": { "start": { "line": 198, @@ -8922,8 +8922,8 @@ }, "callee": { "type": "Identifier", - "start": 8865, - "end": 8868, + "start": 8867, + "end": 8870, "loc": { "start": { "line": 198, @@ -8940,8 +8940,8 @@ "arguments": [ { "type": "TemplateLiteral", - "start": 8869, - "end": 8900, + "start": 8871, + "end": 8902, "loc": { "start": { "line": 198, @@ -8956,8 +8956,8 @@ "quasis": [ { "type": "TemplateElement", - "start": 8870, - "end": 8899, + "start": 8872, + "end": 8901, "loc": { "start": { "line": 198, @@ -8985,8 +8985,8 @@ }, { "type": "VariableDeclaration", - "start": 8922, - "end": 8940, + "start": 8924, + "end": 8942, "loc": { "start": { "line": 201, @@ -9000,8 +9000,8 @@ "declarations": [ { "type": "VariableDeclarator", - "start": 8926, - "end": 8939, + "start": 8928, + "end": 8941, "loc": { "start": { "line": 201, @@ -9014,8 +9014,8 @@ }, "id": { "type": "Identifier", - "start": 8926, - "end": 8939, + "start": 8928, + "end": 8941, "loc": { "start": { "line": 201, @@ -9036,8 +9036,8 @@ }, { "type": "IfStatement", - "start": 8950, - "end": 9197, + "start": 8952, + "end": 9199, "loc": { "start": { "line": 203, @@ -9050,8 +9050,8 @@ }, "test": { "type": "Identifier", - "start": 8954, - "end": 8970, + "start": 8956, + "end": 8972, "loc": { "start": { "line": 203, @@ -9067,8 +9067,8 @@ }, "consequent": { "type": "BlockStatement", - "start": 8972, - "end": 9197, + "start": 8974, + "end": 9199, "loc": { "start": { "line": 203, @@ -9082,8 +9082,8 @@ "body": [ { "type": "TryStatement", - "start": 8986, - "end": 9187, + "start": 8988, + "end": 9189, "loc": { "start": { "line": 204, @@ -9096,8 +9096,8 @@ }, "block": { "type": "BlockStatement", - "start": 8990, - "end": 9067, + "start": 8992, + "end": 9069, "loc": { "start": { "line": 204, @@ -9111,8 +9111,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 9008, - "end": 9053, + "start": 9010, + "end": 9055, "loc": { "start": { "line": 205, @@ -9125,8 +9125,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 9008, - "end": 9052, + "start": 9010, + "end": 9054, "loc": { "start": { "line": 205, @@ -9140,8 +9140,8 @@ "operator": "=", "left": { "type": "Identifier", - "start": 9008, - "end": 9021, + "start": 9010, + "end": 9023, "loc": { "start": { "line": 205, @@ -9157,8 +9157,8 @@ }, "right": { "type": "CallExpression", - "start": 9024, - "end": 9052, + "start": 9026, + "end": 9054, "loc": { "start": { "line": 205, @@ -9171,8 +9171,8 @@ }, "callee": { "type": "MemberExpression", - "start": 9024, - "end": 9034, + "start": 9026, + "end": 9036, "loc": { "start": { "line": 205, @@ -9185,8 +9185,8 @@ }, "object": { "type": "Identifier", - "start": 9024, - "end": 9028, + "start": 9026, + "end": 9030, "loc": { "start": { "line": 205, @@ -9202,8 +9202,8 @@ }, "property": { "type": "Identifier", - "start": 9029, - "end": 9034, + "start": 9031, + "end": 9036, "loc": { "start": { "line": 205, @@ -9222,8 +9222,8 @@ "arguments": [ { "type": "Identifier", - "start": 9035, - "end": 9051, + "start": 9037, + "end": 9053, "loc": { "start": { "line": 205, @@ -9246,8 +9246,8 @@ }, "handler": { "type": "CatchClause", - "start": 9068, - "end": 9187, + "start": 9070, + "end": 9189, "loc": { "start": { "line": 206, @@ -9260,8 +9260,8 @@ }, "param": { "type": "Identifier", - "start": 9075, - "end": 9076, + "start": 9077, + "end": 9078, "loc": { "start": { "line": 206, @@ -9277,8 +9277,8 @@ }, "body": { "type": "BlockStatement", - "start": 9078, - "end": 9187, + "start": 9080, + "end": 9189, "loc": { "start": { "line": 206, @@ -9292,8 +9292,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 9096, - "end": 9115, + "start": 9098, + "end": 9117, "loc": { "start": { "line": 207, @@ -9306,8 +9306,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 9096, - "end": 9114, + "start": 9098, + "end": 9116, "loc": { "start": { "line": 207, @@ -9321,8 +9321,8 @@ "operator": "=", "left": { "type": "Identifier", - "start": 9096, - "end": 9109, + "start": 9098, + "end": 9111, "loc": { "start": { "line": 207, @@ -9338,8 +9338,8 @@ }, "right": { "type": "ObjectExpression", - "start": 9112, - "end": 9114, + "start": 9114, + "end": 9116, "loc": { "start": { "line": 207, @@ -9356,8 +9356,8 @@ }, { "type": "ExpressionStatement", - "start": 9132, - "end": 9173, + "start": 9134, + "end": 9175, "loc": { "start": { "line": 208, @@ -9370,8 +9370,8 @@ }, "expression": { "type": "CallExpression", - "start": 9132, - "end": 9172, + "start": 9134, + "end": 9174, "loc": { "start": { "line": 208, @@ -9384,8 +9384,8 @@ }, "callee": { "type": "Identifier", - "start": 9132, - "end": 9135, + "start": 9134, + "end": 9137, "loc": { "start": { "line": 208, @@ -9402,8 +9402,8 @@ "arguments": [ { "type": "TemplateLiteral", - "start": 9136, - "end": 9171, + "start": 9138, + "end": 9173, "loc": { "start": { "line": 208, @@ -9417,8 +9417,8 @@ "expressions": [ { "type": "Identifier", - "start": 9168, - "end": 9169, + "start": 9170, + "end": 9171, "loc": { "start": { "line": 208, @@ -9436,8 +9436,8 @@ "quasis": [ { "type": "TemplateElement", - "start": 9137, - "end": 9166, + "start": 9139, + "end": 9168, "loc": { "start": { "line": 208, @@ -9456,8 +9456,8 @@ }, { "type": "TemplateElement", - "start": 9170, - "end": 9170, + "start": 9172, + "end": 9172, "loc": { "start": { "line": 208, @@ -9493,8 +9493,8 @@ }, { "type": "ExpressionStatement", - "start": 9207, - "end": 9278, + "start": 9209, + "end": 9280, "loc": { "start": { "line": 212, @@ -9507,8 +9507,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 9207, - "end": 9277, + "start": 9209, + "end": 9279, "loc": { "start": { "line": 212, @@ -9522,8 +9522,8 @@ "operator": "=", "left": { "type": "Identifier", - "start": 9207, - "end": 9218, + "start": 9209, + "end": 9220, "loc": { "start": { "line": 212, @@ -9539,8 +9539,8 @@ }, "right": { "type": "CallExpression", - "start": 9221, - "end": 9277, + "start": 9223, + "end": 9279, "loc": { "start": { "line": 212, @@ -9553,8 +9553,8 @@ }, "callee": { "type": "Identifier", - "start": 9221, - "end": 9235, + "start": 9223, + "end": 9237, "loc": { "start": { "line": 212, @@ -9571,8 +9571,8 @@ "arguments": [ { "type": "MemberExpression", - "start": 9236, - "end": 9263, + "start": 9238, + "end": 9265, "loc": { "start": { "line": 212, @@ -9585,8 +9585,8 @@ }, "object": { "type": "Identifier", - "start": 9236, - "end": 9251, + "start": 9238, + "end": 9253, "loc": { "start": { "line": 212, @@ -9602,8 +9602,8 @@ }, "property": { "type": "Identifier", - "start": 9252, - "end": 9263, + "start": 9254, + "end": 9265, "loc": { "start": { "line": 212, @@ -9621,8 +9621,8 @@ }, { "type": "Identifier", - "start": 9265, - "end": 9276, + "start": 9267, + "end": 9278, "loc": { "start": { "line": 212, @@ -9642,8 +9642,8 @@ }, { "type": "ExpressionStatement", - "start": 9287, - "end": 9346, + "start": 9289, + "end": 9348, "loc": { "start": { "line": 213, @@ -9656,8 +9656,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 9287, - "end": 9345, + "start": 9289, + "end": 9347, "loc": { "start": { "line": 213, @@ -9671,8 +9671,8 @@ "operator": "=", "left": { "type": "Identifier", - "start": 9287, - "end": 9294, + "start": 9289, + "end": 9296, "loc": { "start": { "line": 213, @@ -9688,8 +9688,8 @@ }, "right": { "type": "CallExpression", - "start": 9297, - "end": 9345, + "start": 9299, + "end": 9347, "loc": { "start": { "line": 213, @@ -9702,8 +9702,8 @@ }, "callee": { "type": "Identifier", - "start": 9297, - "end": 9311, + "start": 9299, + "end": 9313, "loc": { "start": { "line": 213, @@ -9720,8 +9720,8 @@ "arguments": [ { "type": "MemberExpression", - "start": 9312, - "end": 9335, + "start": 9314, + "end": 9337, "loc": { "start": { "line": 213, @@ -9734,8 +9734,8 @@ }, "object": { "type": "Identifier", - "start": 9312, - "end": 9327, + "start": 9314, + "end": 9329, "loc": { "start": { "line": 213, @@ -9751,8 +9751,8 @@ }, "property": { "type": "Identifier", - "start": 9328, - "end": 9335, + "start": 9330, + "end": 9337, "loc": { "start": { "line": 213, @@ -9770,8 +9770,8 @@ }, { "type": "Identifier", - "start": 9337, - "end": 9344, + "start": 9339, + "end": 9346, "loc": { "start": { "line": 213, @@ -9791,8 +9791,8 @@ }, { "type": "ExpressionStatement", - "start": 9355, - "end": 9438, + "start": 9357, + "end": 9440, "loc": { "start": { "line": 214, @@ -9805,8 +9805,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 9355, - "end": 9437, + "start": 9357, + "end": 9439, "loc": { "start": { "line": 214, @@ -9820,8 +9820,8 @@ "operator": "=", "left": { "type": "Identifier", - "start": 9355, - "end": 9370, + "start": 9357, + "end": 9372, "loc": { "start": { "line": 214, @@ -9837,8 +9837,8 @@ }, "right": { "type": "CallExpression", - "start": 9373, - "end": 9437, + "start": 9375, + "end": 9439, "loc": { "start": { "line": 214, @@ -9851,8 +9851,8 @@ }, "callee": { "type": "Identifier", - "start": 9373, - "end": 9387, + "start": 9375, + "end": 9389, "loc": { "start": { "line": 214, @@ -9869,8 +9869,8 @@ "arguments": [ { "type": "MemberExpression", - "start": 9388, - "end": 9419, + "start": 9390, + "end": 9421, "loc": { "start": { "line": 214, @@ -9883,8 +9883,8 @@ }, "object": { "type": "Identifier", - "start": 9388, - "end": 9403, + "start": 9390, + "end": 9405, "loc": { "start": { "line": 214, @@ -9900,8 +9900,8 @@ }, "property": { "type": "Identifier", - "start": 9404, - "end": 9419, + "start": 9406, + "end": 9421, "loc": { "start": { "line": 214, @@ -9919,8 +9919,8 @@ }, { "type": "Identifier", - "start": 9421, - "end": 9436, + "start": 9423, + "end": 9438, "loc": { "start": { "line": 214, @@ -9940,8 +9940,8 @@ }, { "type": "ExpressionStatement", - "start": 9447, - "end": 9530, + "start": 9449, + "end": 9532, "loc": { "start": { "line": 215, @@ -9954,8 +9954,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 9447, - "end": 9529, + "start": 9449, + "end": 9531, "loc": { "start": { "line": 215, @@ -9969,8 +9969,8 @@ "operator": "=", "left": { "type": "Identifier", - "start": 9447, - "end": 9462, + "start": 9449, + "end": 9464, "loc": { "start": { "line": 215, @@ -9986,8 +9986,8 @@ }, "right": { "type": "CallExpression", - "start": 9465, - "end": 9529, + "start": 9467, + "end": 9531, "loc": { "start": { "line": 215, @@ -10000,8 +10000,8 @@ }, "callee": { "type": "Identifier", - "start": 9465, - "end": 9479, + "start": 9467, + "end": 9481, "loc": { "start": { "line": 215, @@ -10018,8 +10018,8 @@ "arguments": [ { "type": "MemberExpression", - "start": 9480, - "end": 9511, + "start": 9482, + "end": 9513, "loc": { "start": { "line": 215, @@ -10032,8 +10032,8 @@ }, "object": { "type": "Identifier", - "start": 9480, - "end": 9495, + "start": 9482, + "end": 9497, "loc": { "start": { "line": 215, @@ -10049,8 +10049,8 @@ }, "property": { "type": "Identifier", - "start": 9496, - "end": 9511, + "start": 9498, + "end": 9513, "loc": { "start": { "line": 215, @@ -10068,8 +10068,8 @@ }, { "type": "Identifier", - "start": 9513, - "end": 9528, + "start": 9515, + "end": 9530, "loc": { "start": { "line": 215, @@ -10089,8 +10089,8 @@ }, { "type": "ExpressionStatement", - "start": 9539, - "end": 9619, + "start": 9541, + "end": 9621, "loc": { "start": { "line": 216, @@ -10103,8 +10103,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 9539, - "end": 9618, + "start": 9541, + "end": 9620, "loc": { "start": { "line": 216, @@ -10118,8 +10118,8 @@ "operator": "=", "left": { "type": "Identifier", - "start": 9539, - "end": 9553, + "start": 9541, + "end": 9555, "loc": { "start": { "line": 216, @@ -10135,8 +10135,8 @@ }, "right": { "type": "CallExpression", - "start": 9556, - "end": 9618, + "start": 9558, + "end": 9620, "loc": { "start": { "line": 216, @@ -10149,8 +10149,8 @@ }, "callee": { "type": "Identifier", - "start": 9556, - "end": 9570, + "start": 9558, + "end": 9572, "loc": { "start": { "line": 216, @@ -10167,8 +10167,8 @@ "arguments": [ { "type": "MemberExpression", - "start": 9571, - "end": 9601, + "start": 9573, + "end": 9603, "loc": { "start": { "line": 216, @@ -10181,8 +10181,8 @@ }, "object": { "type": "Identifier", - "start": 9571, - "end": 9586, + "start": 9573, + "end": 9588, "loc": { "start": { "line": 216, @@ -10198,8 +10198,8 @@ }, "property": { "type": "Identifier", - "start": 9587, - "end": 9601, + "start": 9589, + "end": 9603, "loc": { "start": { "line": 216, @@ -10217,8 +10217,8 @@ }, { "type": "Identifier", - "start": 9603, - "end": 9617, + "start": 9605, + "end": 9619, "loc": { "start": { "line": 216, @@ -10238,8 +10238,8 @@ }, { "type": "ExpressionStatement", - "start": 9628, - "end": 9702, + "start": 9630, + "end": 9704, "loc": { "start": { "line": 217, @@ -10252,8 +10252,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 9628, - "end": 9701, + "start": 9630, + "end": 9703, "loc": { "start": { "line": 217, @@ -10267,8 +10267,8 @@ "operator": "=", "left": { "type": "Identifier", - "start": 9628, - "end": 9640, + "start": 9630, + "end": 9642, "loc": { "start": { "line": 217, @@ -10284,8 +10284,8 @@ }, "right": { "type": "CallExpression", - "start": 9643, - "end": 9701, + "start": 9645, + "end": 9703, "loc": { "start": { "line": 217, @@ -10298,8 +10298,8 @@ }, "callee": { "type": "Identifier", - "start": 9643, - "end": 9657, + "start": 9645, + "end": 9659, "loc": { "start": { "line": 217, @@ -10316,8 +10316,8 @@ "arguments": [ { "type": "MemberExpression", - "start": 9658, - "end": 9686, + "start": 9660, + "end": 9688, "loc": { "start": { "line": 217, @@ -10330,8 +10330,8 @@ }, "object": { "type": "Identifier", - "start": 9658, - "end": 9673, + "start": 9660, + "end": 9675, "loc": { "start": { "line": 217, @@ -10347,8 +10347,8 @@ }, "property": { "type": "Identifier", - "start": 9674, - "end": 9686, + "start": 9676, + "end": 9688, "loc": { "start": { "line": 217, @@ -10366,8 +10366,8 @@ }, { "type": "Identifier", - "start": 9688, - "end": 9700, + "start": 9690, + "end": 9702, "loc": { "start": { "line": 217, @@ -10387,8 +10387,8 @@ }, { "type": "ExpressionStatement", - "start": 9711, - "end": 9785, + "start": 9713, + "end": 9787, "loc": { "start": { "line": 218, @@ -10401,8 +10401,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 9711, - "end": 9784, + "start": 9713, + "end": 9786, "loc": { "start": { "line": 218, @@ -10416,8 +10416,8 @@ "operator": "=", "left": { "type": "Identifier", - "start": 9711, - "end": 9723, + "start": 9713, + "end": 9725, "loc": { "start": { "line": 218, @@ -10433,8 +10433,8 @@ }, "right": { "type": "CallExpression", - "start": 9726, - "end": 9784, + "start": 9728, + "end": 9786, "loc": { "start": { "line": 218, @@ -10447,8 +10447,8 @@ }, "callee": { "type": "Identifier", - "start": 9726, - "end": 9740, + "start": 9728, + "end": 9742, "loc": { "start": { "line": 218, @@ -10465,8 +10465,8 @@ "arguments": [ { "type": "MemberExpression", - "start": 9741, - "end": 9769, + "start": 9743, + "end": 9771, "loc": { "start": { "line": 218, @@ -10479,8 +10479,8 @@ }, "object": { "type": "Identifier", - "start": 9741, - "end": 9756, + "start": 9743, + "end": 9758, "loc": { "start": { "line": 218, @@ -10496,8 +10496,8 @@ }, "property": { "type": "Identifier", - "start": 9757, - "end": 9769, + "start": 9759, + "end": 9771, "loc": { "start": { "line": 218, @@ -10515,8 +10515,8 @@ }, { "type": "Identifier", - "start": 9771, - "end": 9783, + "start": 9773, + "end": 9785, "loc": { "start": { "line": 218, @@ -10536,8 +10536,8 @@ }, { "type": "IfStatement", - "start": 9795, - "end": 9884, + "start": 9797, + "end": 9886, "loc": { "start": { "line": 220, @@ -10550,8 +10550,8 @@ }, "test": { "type": "BinaryExpression", - "start": 9799, - "end": 9824, + "start": 9801, + "end": 9826, "loc": { "start": { "line": 220, @@ -10564,8 +10564,8 @@ }, "left": { "type": "Identifier", - "start": 9799, - "end": 9814, + "start": 9801, + "end": 9816, "loc": { "start": { "line": 220, @@ -10582,8 +10582,8 @@ "operator": "===", "right": { "type": "BooleanLiteral", - "start": 9819, - "end": 9824, + "start": 9821, + "end": 9826, "loc": { "start": { "line": 220, @@ -10599,8 +10599,8 @@ }, "consequent": { "type": "BlockStatement", - "start": 9826, - "end": 9884, + "start": 9828, + "end": 9886, "loc": { "start": { "line": 220, @@ -10614,8 +10614,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 9840, - "end": 9874, + "start": 9842, + "end": 9876, "loc": { "start": { "line": 221, @@ -10628,8 +10628,8 @@ }, "expression": { "type": "CallExpression", - "start": 9840, - "end": 9873, + "start": 9842, + "end": 9875, "loc": { "start": { "line": 221, @@ -10642,8 +10642,8 @@ }, "callee": { "type": "Identifier", - "start": 9840, - "end": 9843, + "start": 9842, + "end": 9845, "loc": { "start": { "line": 221, @@ -10660,8 +10660,8 @@ "arguments": [ { "type": "StringLiteral", - "start": 9844, - "end": 9872, + "start": 9846, + "end": 9874, "loc": { "start": { "line": 221, @@ -10688,8 +10688,8 @@ }, { "type": "VariableDeclaration", - "start": 9894, - "end": 9984, + "start": 9896, + "end": 9986, "loc": { "start": { "line": 224, @@ -10703,8 +10703,8 @@ "declarations": [ { "type": "VariableDeclarator", - "start": 9900, - "end": 9983, + "start": 9902, + "end": 9985, "loc": { "start": { "line": 224, @@ -10717,8 +10717,8 @@ }, "id": { "type": "Identifier", - "start": 9900, - "end": 9908, + "start": 9902, + "end": 9910, "loc": { "start": { "line": 224, @@ -10734,8 +10734,8 @@ }, "init": { "type": "NewExpression", - "start": 9911, - "end": 9983, + "start": 9913, + "end": 9985, "loc": { "start": { "line": 224, @@ -10748,8 +10748,8 @@ }, "callee": { "type": "Identifier", - "start": 9915, - "end": 9923, + "start": 9917, + "end": 9925, "loc": { "start": { "line": 224, @@ -10766,8 +10766,8 @@ "arguments": [ { "type": "ObjectExpression", - "start": 9924, - "end": 9982, + "start": 9926, + "end": 9984, "loc": { "start": { "line": 224, @@ -10781,8 +10781,8 @@ "properties": [ { "type": "ObjectProperty", - "start": 9938, - "end": 9949, + "start": 9940, + "end": 9951, "loc": { "start": { "line": 225, @@ -10798,8 +10798,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 9938, - "end": 9949, + "start": 9940, + "end": 9951, "loc": { "start": { "line": 225, @@ -10815,8 +10815,8 @@ }, "value": { "type": "Identifier", - "start": 9938, - "end": 9949, + "start": 9940, + "end": 9951, "loc": { "start": { "line": 225, @@ -10836,8 +10836,8 @@ }, { "type": "ObjectProperty", - "start": 9963, - "end": 9972, + "start": 9965, + "end": 9974, "loc": { "start": { "line": 226, @@ -10853,8 +10853,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 9963, - "end": 9972, + "start": 9965, + "end": 9974, "loc": { "start": { "line": 226, @@ -10870,8 +10870,8 @@ }, "value": { "type": "Identifier", - "start": 9963, - "end": 9972, + "start": 9965, + "end": 9974, "loc": { "start": { "line": 226, @@ -10899,8 +10899,8 @@ }, { "type": "SwitchStatement", - "start": 9994, - "end": 14682, + "start": 9996, + "end": 14684, "loc": { "start": { "line": 229, @@ -10913,8 +10913,8 @@ }, "discriminant": { "type": "Identifier", - "start": 10002, - "end": 10005, + "start": 10004, + "end": 10007, "loc": { "start": { "line": 229, @@ -10931,8 +10931,8 @@ "cases": [ { "type": "SwitchCase", - "start": 10021, - "end": 10399, + "start": 10023, + "end": 10401, "loc": { "start": { "line": 230, @@ -10946,8 +10946,8 @@ "consequent": [ { "type": "ExpressionStatement", - "start": 10050, - "end": 10376, + "start": 10052, + "end": 10378, "loc": { "start": { "line": 231, @@ -10960,8 +10960,8 @@ }, "expression": { "type": "CallExpression", - "start": 10050, - "end": 10375, + "start": 10052, + "end": 10377, "loc": { "start": { "line": 231, @@ -10974,8 +10974,8 @@ }, "callee": { "type": "Identifier", - "start": 10050, - "end": 10057, + "start": 10052, + "end": 10059, "loc": { "start": { "line": 231, @@ -10992,8 +10992,8 @@ "arguments": [ { "type": "Identifier", - "start": 10058, - "end": 10083, + "start": 10060, + "end": 10085, "loc": { "start": { "line": 231, @@ -11009,8 +11009,8 @@ }, { "type": "ObjectExpression", - "start": 10085, - "end": 10374, + "start": 10087, + "end": 10376, "loc": { "start": { "line": 231, @@ -11024,8 +11024,8 @@ "properties": [ { "type": "ObjectProperty", - "start": 10107, - "end": 10135, + "start": 10109, + "end": 10137, "loc": { "start": { "line": 232, @@ -11041,8 +11041,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 10107, - "end": 10111, + "start": 10109, + "end": 10113, "loc": { "start": { "line": 232, @@ -11058,8 +11058,8 @@ }, "value": { "type": "CallExpression", - "start": 10113, - "end": 10135, + "start": 10115, + "end": 10137, "loc": { "start": { "line": 232, @@ -11072,8 +11072,8 @@ }, "callee": { "type": "MemberExpression", - "start": 10113, - "end": 10123, + "start": 10115, + "end": 10125, "loc": { "start": { "line": 232, @@ -11086,8 +11086,8 @@ }, "object": { "type": "Identifier", - "start": 10113, - "end": 10117, + "start": 10115, + "end": 10119, "loc": { "start": { "line": 232, @@ -11103,8 +11103,8 @@ }, "property": { "type": "Identifier", - "start": 10118, - "end": 10123, + "start": 10120, + "end": 10125, "loc": { "start": { "line": 232, @@ -11123,8 +11123,8 @@ "arguments": [ { "type": "Identifier", - "start": 10124, - "end": 10134, + "start": 10126, + "end": 10136, "loc": { "start": { "line": 232, @@ -11143,8 +11143,8 @@ }, { "type": "ObjectProperty", - "start": 10157, - "end": 10165, + "start": 10159, + "end": 10167, "loc": { "start": { "line": 233, @@ -11160,8 +11160,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 10157, - "end": 10165, + "start": 10159, + "end": 10167, "loc": { "start": { "line": 233, @@ -11177,8 +11177,8 @@ }, "value": { "type": "Identifier", - "start": 10157, - "end": 10165, + "start": 10159, + "end": 10167, "loc": { "start": { "line": 233, @@ -11198,8 +11198,8 @@ }, { "type": "ObjectProperty", - "start": 10187, - "end": 10192, + "start": 10189, + "end": 10194, "loc": { "start": { "line": 234, @@ -11215,8 +11215,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 10187, - "end": 10192, + "start": 10189, + "end": 10194, "loc": { "start": { "line": 234, @@ -11232,8 +11232,8 @@ }, "value": { "type": "Identifier", - "start": 10187, - "end": 10192, + "start": 10189, + "end": 10194, "loc": { "start": { "line": 234, @@ -11253,8 +11253,8 @@ }, { "type": "ObjectProperty", - "start": 10214, - "end": 10221, + "start": 10216, + "end": 10223, "loc": { "start": { "line": 235, @@ -11270,8 +11270,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 10214, - "end": 10221, + "start": 10216, + "end": 10223, "loc": { "start": { "line": 235, @@ -11287,8 +11287,8 @@ }, "value": { "type": "Identifier", - "start": 10214, - "end": 10221, + "start": 10216, + "end": 10223, "loc": { "start": { "line": 235, @@ -11308,8 +11308,8 @@ }, { "type": "ObjectProperty", - "start": 10243, - "end": 10273, + "start": 10245, + "end": 10275, "loc": { "start": { "line": 236, @@ -11325,8 +11325,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 10243, - "end": 10249, + "start": 10245, + "end": 10251, "loc": { "start": { "line": 236, @@ -11342,8 +11342,8 @@ }, "value": { "type": "MemberExpression", - "start": 10251, - "end": 10273, + "start": 10253, + "end": 10275, "loc": { "start": { "line": 236, @@ -11356,8 +11356,8 @@ }, "object": { "type": "Identifier", - "start": 10251, - "end": 10266, + "start": 10253, + "end": 10268, "loc": { "start": { "line": 236, @@ -11373,8 +11373,8 @@ }, "property": { "type": "Identifier", - "start": 10267, - "end": 10273, + "start": 10269, + "end": 10275, "loc": { "start": { "line": 236, @@ -11393,8 +11393,8 @@ }, { "type": "ObjectProperty", - "start": 10295, - "end": 10331, + "start": 10297, + "end": 10333, "loc": { "start": { "line": 237, @@ -11410,8 +11410,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 10295, - "end": 10304, + "start": 10297, + "end": 10306, "loc": { "start": { "line": 237, @@ -11427,8 +11427,8 @@ }, "value": { "type": "MemberExpression", - "start": 10306, - "end": 10331, + "start": 10308, + "end": 10333, "loc": { "start": { "line": 237, @@ -11441,8 +11441,8 @@ }, "object": { "type": "Identifier", - "start": 10306, - "end": 10321, + "start": 10308, + "end": 10323, "loc": { "start": { "line": 237, @@ -11458,8 +11458,8 @@ }, "property": { "type": "Identifier", - "start": 10322, - "end": 10331, + "start": 10324, + "end": 10333, "loc": { "start": { "line": 237, @@ -11478,8 +11478,8 @@ }, { "type": "ObjectProperty", - "start": 10353, - "end": 10356, + "start": 10355, + "end": 10358, "loc": { "start": { "line": 238, @@ -11495,8 +11495,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 10353, - "end": 10356, + "start": 10355, + "end": 10358, "loc": { "start": { "line": 238, @@ -11512,8 +11512,8 @@ }, "value": { "type": "Identifier", - "start": 10353, - "end": 10356, + "start": 10355, + "end": 10358, "loc": { "start": { "line": 238, @@ -11538,8 +11538,8 @@ }, { "type": "BreakStatement", - "start": 10393, - "end": 10399, + "start": 10395, + "end": 10401, "loc": { "start": { "line": 240, @@ -11555,8 +11555,8 @@ ], "test": { "type": "StringLiteral", - "start": 10026, - "end": 10032, + "start": 10028, + "end": 10034, "loc": { "start": { "line": 230, @@ -11576,8 +11576,8 @@ }, { "type": "SwitchCase", - "start": 10413, - "end": 10857, + "start": 10415, + "end": 10859, "loc": { "start": { "line": 242, @@ -11591,8 +11591,8 @@ "consequent": [ { "type": "ExpressionStatement", - "start": 10441, - "end": 10480, + "start": 10443, + "end": 10482, "loc": { "start": { "line": 243, @@ -11605,8 +11605,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 10441, - "end": 10479, + "start": 10443, + "end": 10481, "loc": { "start": { "line": 243, @@ -11620,8 +11620,8 @@ "operator": "=", "left": { "type": "Identifier", - "start": 10441, - "end": 10451, + "start": 10443, + "end": 10453, "loc": { "start": { "line": 243, @@ -11637,8 +11637,8 @@ }, "right": { "type": "CallExpression", - "start": 10454, - "end": 10479, + "start": 10456, + "end": 10481, "loc": { "start": { "line": 243, @@ -11651,8 +11651,8 @@ }, "callee": { "type": "Identifier", - "start": 10454, - "end": 10467, + "start": 10456, + "end": 10469, "loc": { "start": { "line": 243, @@ -11669,8 +11669,8 @@ "arguments": [ { "type": "Identifier", - "start": 10468, - "end": 10478, + "start": 10470, + "end": 10480, "loc": { "start": { "line": 243, @@ -11690,8 +11690,8 @@ }, { "type": "ExpressionStatement", - "start": 10497, - "end": 10834, + "start": 10499, + "end": 10836, "loc": { "start": { "line": 244, @@ -11704,8 +11704,8 @@ }, "expression": { "type": "CallExpression", - "start": 10497, - "end": 10833, + "start": 10499, + "end": 10835, "loc": { "start": { "line": 244, @@ -11718,8 +11718,8 @@ }, "callee": { "type": "Identifier", - "start": 10497, - "end": 10504, + "start": 10499, + "end": 10506, "loc": { "start": { "line": 244, @@ -11736,8 +11736,8 @@ "arguments": [ { "type": "Identifier", - "start": 10505, - "end": 10526, + "start": 10507, + "end": 10528, "loc": { "start": { "line": 244, @@ -11753,8 +11753,8 @@ }, { "type": "ObjectExpression", - "start": 10528, - "end": 10832, + "start": 10530, + "end": 10834, "loc": { "start": { "line": 244, @@ -11768,8 +11768,8 @@ "properties": [ { "type": "ObjectProperty", - "start": 10550, - "end": 10566, + "start": 10552, + "end": 10568, "loc": { "start": { "line": 245, @@ -11785,8 +11785,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 10550, - "end": 10554, + "start": 10552, + "end": 10556, "loc": { "start": { "line": 245, @@ -11802,8 +11802,8 @@ }, "value": { "type": "Identifier", - "start": 10556, - "end": 10566, + "start": 10558, + "end": 10568, "loc": { "start": { "line": 245, @@ -11820,8 +11820,8 @@ }, { "type": "ObjectProperty", - "start": 10588, - "end": 10603, + "start": 10590, + "end": 10605, "loc": { "start": { "line": 246, @@ -11837,8 +11837,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 10588, - "end": 10603, + "start": 10590, + "end": 10605, "loc": { "start": { "line": 246, @@ -11854,8 +11854,8 @@ }, "value": { "type": "Identifier", - "start": 10588, - "end": 10603, + "start": 10590, + "end": 10605, "loc": { "start": { "line": 246, @@ -11875,8 +11875,8 @@ }, { "type": "ObjectProperty", - "start": 10625, - "end": 10646, + "start": 10627, + "end": 10648, "loc": { "start": { "line": 247, @@ -11892,8 +11892,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 10625, - "end": 10640, + "start": 10627, + "end": 10642, "loc": { "start": { "line": 247, @@ -11909,8 +11909,8 @@ }, "value": { "type": "BooleanLiteral", - "start": 10642, - "end": 10646, + "start": 10644, + "end": 10648, "loc": { "start": { "line": 247, @@ -11926,8 +11926,8 @@ }, { "type": "ObjectProperty", - "start": 10668, - "end": 10682, + "start": 10670, + "end": 10684, "loc": { "start": { "line": 248, @@ -11943,8 +11943,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 10668, - "end": 10682, + "start": 10670, + "end": 10684, "loc": { "start": { "line": 248, @@ -11960,8 +11960,8 @@ }, "value": { "type": "Identifier", - "start": 10668, - "end": 10682, + "start": 10670, + "end": 10684, "loc": { "start": { "line": 248, @@ -11981,8 +11981,8 @@ }, { "type": "ObjectProperty", - "start": 10704, - "end": 10732, + "start": 10706, + "end": 10734, "loc": { "start": { "line": 249, @@ -11998,8 +11998,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 10704, - "end": 10717, + "start": 10706, + "end": 10719, "loc": { "start": { "line": 249, @@ -12015,8 +12015,8 @@ }, "value": { "type": "Identifier", - "start": 10719, - "end": 10732, + "start": 10721, + "end": 10734, "loc": { "start": { "line": 249, @@ -12033,8 +12033,8 @@ }, { "type": "ObjectProperty", - "start": 10754, - "end": 10762, + "start": 10756, + "end": 10764, "loc": { "start": { "line": 250, @@ -12050,8 +12050,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 10754, - "end": 10762, + "start": 10756, + "end": 10764, "loc": { "start": { "line": 250, @@ -12067,8 +12067,8 @@ }, "value": { "type": "Identifier", - "start": 10754, - "end": 10762, + "start": 10756, + "end": 10764, "loc": { "start": { "line": 250, @@ -12088,8 +12088,8 @@ }, { "type": "ObjectProperty", - "start": 10784, - "end": 10789, + "start": 10786, + "end": 10791, "loc": { "start": { "line": 251, @@ -12105,8 +12105,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 10784, - "end": 10789, + "start": 10786, + "end": 10791, "loc": { "start": { "line": 251, @@ -12122,8 +12122,8 @@ }, "value": { "type": "Identifier", - "start": 10784, - "end": 10789, + "start": 10786, + "end": 10791, "loc": { "start": { "line": 251, @@ -12143,8 +12143,8 @@ }, { "type": "ObjectProperty", - "start": 10811, - "end": 10814, + "start": 10813, + "end": 10816, "loc": { "start": { "line": 252, @@ -12160,8 +12160,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 10811, - "end": 10814, + "start": 10813, + "end": 10816, "loc": { "start": { "line": 252, @@ -12177,8 +12177,8 @@ }, "value": { "type": "Identifier", - "start": 10811, - "end": 10814, + "start": 10813, + "end": 10816, "loc": { "start": { "line": 252, @@ -12203,8 +12203,8 @@ }, { "type": "BreakStatement", - "start": 10851, - "end": 10857, + "start": 10853, + "end": 10859, "loc": { "start": { "line": 254, @@ -12220,8 +12220,8 @@ ], "test": { "type": "StringLiteral", - "start": 10418, - "end": 10423, + "start": 10420, + "end": 10425, "loc": { "start": { "line": 242, @@ -12241,8 +12241,8 @@ }, { "type": "SwitchCase", - "start": 10871, - "end": 11432, + "start": 10873, + "end": 11434, "loc": { "start": { "line": 256, @@ -12256,8 +12256,8 @@ "consequent": [ { "type": "ExpressionStatement", - "start": 10900, - "end": 10939, + "start": 10902, + "end": 10941, "loc": { "start": { "line": 257, @@ -12270,8 +12270,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 10900, - "end": 10938, + "start": 10902, + "end": 10940, "loc": { "start": { "line": 257, @@ -12285,8 +12285,8 @@ "operator": "=", "left": { "type": "Identifier", - "start": 10900, - "end": 10910, + "start": 10902, + "end": 10912, "loc": { "start": { "line": 257, @@ -12302,8 +12302,8 @@ }, "right": { "type": "CallExpression", - "start": 10913, - "end": 10938, + "start": 10915, + "end": 10940, "loc": { "start": { "line": 257, @@ -12316,8 +12316,8 @@ }, "callee": { "type": "Identifier", - "start": 10913, - "end": 10926, + "start": 10915, + "end": 10928, "loc": { "start": { "line": 257, @@ -12334,8 +12334,8 @@ "arguments": [ { "type": "Identifier", - "start": 10927, - "end": 10937, + "start": 10929, + "end": 10939, "loc": { "start": { "line": 257, @@ -12355,8 +12355,8 @@ }, { "type": "VariableDeclaration", - "start": 10956, - "end": 11012, + "start": 10958, + "end": 11014, "loc": { "start": { "line": 258, @@ -12370,8 +12370,8 @@ "declarations": [ { "type": "VariableDeclarator", - "start": 10962, - "end": 11011, + "start": 10964, + "end": 11013, "loc": { "start": { "line": 258, @@ -12384,8 +12384,8 @@ }, "id": { "type": "Identifier", - "start": 10962, - "end": 10974, + "start": 10964, + "end": 10976, "loc": { "start": { "line": 258, @@ -12401,8 +12401,8 @@ }, "init": { "type": "ConditionalExpression", - "start": 10977, - "end": 11011, + "start": 10979, + "end": 11013, "loc": { "start": { "line": 258, @@ -12415,8 +12415,8 @@ }, "test": { "type": "Identifier", - "start": 10977, - "end": 10983, + "start": 10979, + "end": 10985, "loc": { "start": { "line": 258, @@ -12432,8 +12432,8 @@ }, "consequent": { "type": "CallExpression", - "start": 10986, - "end": 11006, + "start": 10988, + "end": 11008, "loc": { "start": { "line": 258, @@ -12446,8 +12446,8 @@ }, "callee": { "type": "MemberExpression", - "start": 10986, - "end": 10998, + "start": 10988, + "end": 11000, "loc": { "start": { "line": 258, @@ -12460,8 +12460,8 @@ }, "object": { "type": "Identifier", - "start": 10986, - "end": 10990, + "start": 10988, + "end": 10992, "loc": { "start": { "line": 258, @@ -12477,8 +12477,8 @@ }, "property": { "type": "Identifier", - "start": 10991, - "end": 10998, + "start": 10993, + "end": 11000, "loc": { "start": { "line": 258, @@ -12497,8 +12497,8 @@ "arguments": [ { "type": "Identifier", - "start": 10999, - "end": 11005, + "start": 11001, + "end": 11007, "loc": { "start": { "line": 258, @@ -12516,8 +12516,8 @@ }, "alternate": { "type": "StringLiteral", - "start": 11009, - "end": 11011, + "start": 11011, + "end": 11013, "loc": { "start": { "line": 258, @@ -12541,8 +12541,8 @@ }, { "type": "ExpressionStatement", - "start": 11029, - "end": 11409, + "start": 11031, + "end": 11411, "loc": { "start": { "line": 259, @@ -12555,8 +12555,8 @@ }, "expression": { "type": "CallExpression", - "start": 11029, - "end": 11408, + "start": 11031, + "end": 11410, "loc": { "start": { "line": 259, @@ -12569,8 +12569,8 @@ }, "callee": { "type": "Identifier", - "start": 11029, - "end": 11036, + "start": 11031, + "end": 11038, "loc": { "start": { "line": 259, @@ -12587,8 +12587,8 @@ "arguments": [ { "type": "Identifier", - "start": 11037, - "end": 11058, + "start": 11039, + "end": 11060, "loc": { "start": { "line": 259, @@ -12604,8 +12604,8 @@ }, { "type": "ObjectExpression", - "start": 11060, - "end": 11407, + "start": 11062, + "end": 11409, "loc": { "start": { "line": 259, @@ -12619,8 +12619,8 @@ "properties": [ { "type": "ObjectProperty", - "start": 11082, - "end": 11103, + "start": 11084, + "end": 11105, "loc": { "start": { "line": 260, @@ -12636,8 +12636,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 11082, - "end": 11089, + "start": 11084, + "end": 11091, "loc": { "start": { "line": 260, @@ -12653,8 +12653,8 @@ }, "value": { "type": "Identifier", - "start": 11091, - "end": 11103, + "start": 11093, + "end": 11105, "loc": { "start": { "line": 260, @@ -12671,8 +12671,8 @@ }, { "type": "ObjectProperty", - "start": 11125, - "end": 11141, + "start": 11127, + "end": 11143, "loc": { "start": { "line": 261, @@ -12688,8 +12688,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 11125, - "end": 11129, + "start": 11127, + "end": 11131, "loc": { "start": { "line": 261, @@ -12705,8 +12705,8 @@ }, "value": { "type": "Identifier", - "start": 11131, - "end": 11141, + "start": 11133, + "end": 11143, "loc": { "start": { "line": 261, @@ -12723,8 +12723,8 @@ }, { "type": "ObjectProperty", - "start": 11163, - "end": 11178, + "start": 11165, + "end": 11180, "loc": { "start": { "line": 262, @@ -12740,8 +12740,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 11163, - "end": 11178, + "start": 11165, + "end": 11180, "loc": { "start": { "line": 262, @@ -12757,8 +12757,8 @@ }, "value": { "type": "Identifier", - "start": 11163, - "end": 11178, + "start": 11165, + "end": 11180, "loc": { "start": { "line": 262, @@ -12778,8 +12778,8 @@ }, { "type": "ObjectProperty", - "start": 11200, - "end": 11221, + "start": 11202, + "end": 11223, "loc": { "start": { "line": 263, @@ -12795,8 +12795,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 11200, - "end": 11215, + "start": 11202, + "end": 11217, "loc": { "start": { "line": 263, @@ -12812,8 +12812,8 @@ }, "value": { "type": "BooleanLiteral", - "start": 11217, - "end": 11221, + "start": 11219, + "end": 11223, "loc": { "start": { "line": 263, @@ -12829,8 +12829,8 @@ }, { "type": "ObjectProperty", - "start": 11243, - "end": 11257, + "start": 11245, + "end": 11259, "loc": { "start": { "line": 264, @@ -12846,8 +12846,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 11243, - "end": 11257, + "start": 11245, + "end": 11259, "loc": { "start": { "line": 264, @@ -12863,8 +12863,8 @@ }, "value": { "type": "Identifier", - "start": 11243, - "end": 11257, + "start": 11245, + "end": 11259, "loc": { "start": { "line": 264, @@ -12884,8 +12884,8 @@ }, { "type": "ObjectProperty", - "start": 11279, - "end": 11307, + "start": 11281, + "end": 11309, "loc": { "start": { "line": 265, @@ -12901,8 +12901,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 11279, - "end": 11292, + "start": 11281, + "end": 11294, "loc": { "start": { "line": 265, @@ -12918,8 +12918,8 @@ }, "value": { "type": "Identifier", - "start": 11294, - "end": 11307, + "start": 11296, + "end": 11309, "loc": { "start": { "line": 265, @@ -12936,8 +12936,8 @@ }, { "type": "ObjectProperty", - "start": 11329, - "end": 11337, + "start": 11331, + "end": 11339, "loc": { "start": { "line": 266, @@ -12953,8 +12953,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 11329, - "end": 11337, + "start": 11331, + "end": 11339, "loc": { "start": { "line": 266, @@ -12970,8 +12970,8 @@ }, "value": { "type": "Identifier", - "start": 11329, - "end": 11337, + "start": 11331, + "end": 11339, "loc": { "start": { "line": 266, @@ -12991,8 +12991,8 @@ }, { "type": "ObjectProperty", - "start": 11359, - "end": 11364, + "start": 11361, + "end": 11366, "loc": { "start": { "line": 267, @@ -13008,8 +13008,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 11359, - "end": 11364, + "start": 11361, + "end": 11366, "loc": { "start": { "line": 267, @@ -13025,8 +13025,8 @@ }, "value": { "type": "Identifier", - "start": 11359, - "end": 11364, + "start": 11361, + "end": 11366, "loc": { "start": { "line": 267, @@ -13046,8 +13046,8 @@ }, { "type": "ObjectProperty", - "start": 11386, - "end": 11389, + "start": 11388, + "end": 11391, "loc": { "start": { "line": 268, @@ -13063,8 +13063,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 11386, - "end": 11389, + "start": 11388, + "end": 11391, "loc": { "start": { "line": 268, @@ -13080,8 +13080,8 @@ }, "value": { "type": "Identifier", - "start": 11386, - "end": 11389, + "start": 11388, + "end": 11391, "loc": { "start": { "line": 268, @@ -13106,8 +13106,8 @@ }, { "type": "BreakStatement", - "start": 11426, - "end": 11432, + "start": 11428, + "end": 11434, "loc": { "start": { "line": 270, @@ -13125,8 +13125,8 @@ ], "test": { "type": "StringLiteral", - "start": 10876, - "end": 10882, + "start": 10878, + "end": 10884, "loc": { "start": { "line": 256, @@ -13147,8 +13147,8 @@ { "type": "CommentLine", "value": " case \"gltf\":", - "start": 11446, - "end": 11461, + "start": 11448, + "end": 11463, "loc": { "start": { "line": 272, @@ -13163,8 +13163,8 @@ { "type": "CommentLine", "value": " const gltfJSON = JSON.parse(sourceData);", - "start": 11474, - "end": 11521, + "start": 11476, + "end": 11523, "loc": { "start": { "line": 273, @@ -13179,8 +13179,8 @@ { "type": "CommentLine", "value": " const gltfBasePath = source ? getBasePath(source) : \"\";", - "start": 11534, - "end": 11596, + "start": 11536, + "end": 11598, "loc": { "start": { "line": 274, @@ -13195,8 +13195,8 @@ { "type": "CommentLine", "value": " convert(parseGLTFIntoXKTModel, {", - "start": 11609, - "end": 11648, + "start": 11611, + "end": 11650, "loc": { "start": { "line": 275, @@ -13211,8 +13211,8 @@ { "type": "CommentLine", "value": " baseUri: gltfBasePath,", - "start": 11661, - "end": 11694, + "start": 11663, + "end": 11696, "loc": { "start": { "line": 276, @@ -13227,8 +13227,8 @@ { "type": "CommentLine", "value": " data: gltfJSON,", - "start": 11707, - "end": 11733, + "start": 11709, + "end": 11735, "loc": { "start": { "line": 277, @@ -13243,8 +13243,8 @@ { "type": "CommentLine", "value": " reuseGeometries,", - "start": 11746, - "end": 11773, + "start": 11748, + "end": 11775, "loc": { "start": { "line": 278, @@ -13259,8 +13259,8 @@ { "type": "CommentLine", "value": " includeTextures,", - "start": 11786, - "end": 11813, + "start": 11788, + "end": 11815, "loc": { "start": { "line": 279, @@ -13275,8 +13275,8 @@ { "type": "CommentLine", "value": " includeNormals,", - "start": 11826, - "end": 11852, + "start": 11828, + "end": 11854, "loc": { "start": { "line": 280, @@ -13291,8 +13291,8 @@ { "type": "CommentLine", "value": " metaModelData: metaModelJSON,", - "start": 11865, - "end": 11905, + "start": 11867, + "end": 11907, "loc": { "start": { "line": 281, @@ -13307,8 +13307,8 @@ { "type": "CommentLine", "value": " xktModel,", - "start": 11918, - "end": 11938, + "start": 11920, + "end": 11940, "loc": { "start": { "line": 282, @@ -13323,8 +13323,8 @@ { "type": "CommentLine", "value": " getAttachment: async (name) => {", - "start": 11951, - "end": 11994, + "start": 11953, + "end": 11996, "loc": { "start": { "line": 283, @@ -13339,8 +13339,8 @@ { "type": "CommentLine", "value": " const filePath = gltfBasePath + name;", - "start": 12007, - "end": 12059, + "start": 12009, + "end": 12061, "loc": { "start": { "line": 284, @@ -13355,8 +13355,8 @@ { "type": "CommentLine", "value": " log(`Reading attachment file: ${filePath}`);", - "start": 12072, - "end": 12131, + "start": 12074, + "end": 12133, "loc": { "start": { "line": 285, @@ -13371,8 +13371,8 @@ { "type": "CommentLine", "value": " const buffer = fs.readFileSync(filePath);", - "start": 12144, - "end": 12200, + "start": 12146, + "end": 12202, "loc": { "start": { "line": 286, @@ -13387,8 +13387,8 @@ { "type": "CommentLine", "value": " const arrayBuf = toArrayBuffer(buffer);", - "start": 12213, - "end": 12267, + "start": 12215, + "end": 12269, "loc": { "start": { "line": 287, @@ -13403,8 +13403,8 @@ { "type": "CommentLine", "value": " return arrayBuf;", - "start": 12280, - "end": 12311, + "start": 12282, + "end": 12313, "loc": { "start": { "line": 288, @@ -13419,8 +13419,8 @@ { "type": "CommentLine", "value": " },", - "start": 12324, - "end": 12337, + "start": 12326, + "end": 12339, "loc": { "start": { "line": 289, @@ -13435,8 +13435,8 @@ { "type": "CommentLine", "value": " stats,", - "start": 12350, - "end": 12367, + "start": 12352, + "end": 12369, "loc": { "start": { "line": 290, @@ -13451,8 +13451,8 @@ { "type": "CommentLine", "value": " log", - "start": 12380, - "end": 12394, + "start": 12382, + "end": 12396, "loc": { "start": { "line": 291, @@ -13467,8 +13467,8 @@ { "type": "CommentLine", "value": " });", - "start": 12407, - "end": 12417, + "start": 12409, + "end": 12419, "loc": { "start": { "line": 292, @@ -13483,8 +13483,8 @@ { "type": "CommentLine", "value": " break;", - "start": 12430, - "end": 12443, + "start": 12432, + "end": 12445, "loc": { "start": { "line": 293, @@ -13500,8 +13500,8 @@ }, { "type": "SwitchCase", - "start": 12457, - "end": 12810, + "start": 12459, + "end": 12812, "loc": { "start": { "line": 295, @@ -13515,8 +13515,8 @@ "consequent": [ { "type": "ExpressionStatement", - "start": 12485, - "end": 12787, + "start": 12487, + "end": 12789, "loc": { "start": { "line": 296, @@ -13529,8 +13529,8 @@ }, "expression": { "type": "CallExpression", - "start": 12485, - "end": 12786, + "start": 12487, + "end": 12788, "loc": { "start": { "line": 296, @@ -13543,8 +13543,8 @@ }, "callee": { "type": "Identifier", - "start": 12485, - "end": 12492, + "start": 12487, + "end": 12494, "loc": { "start": { "line": 296, @@ -13561,8 +13561,8 @@ "arguments": [ { "type": "Identifier", - "start": 12493, - "end": 12513, + "start": 12495, + "end": 12515, "loc": { "start": { "line": 296, @@ -13578,8 +13578,8 @@ }, { "type": "ObjectExpression", - "start": 12515, - "end": 12785, + "start": 12517, + "end": 12787, "loc": { "start": { "line": 296, @@ -13593,8 +13593,8 @@ "properties": [ { "type": "ObjectProperty", - "start": 12537, - "end": 12543, + "start": 12539, + "end": 12545, "loc": { "start": { "line": 297, @@ -13610,8 +13610,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 12537, - "end": 12543, + "start": 12539, + "end": 12545, "loc": { "start": { "line": 297, @@ -13627,8 +13627,8 @@ }, "value": { "type": "Identifier", - "start": 12537, - "end": 12543, + "start": 12539, + "end": 12545, "loc": { "start": { "line": 297, @@ -13648,8 +13648,8 @@ }, { "type": "ObjectProperty", - "start": 12565, - "end": 12581, + "start": 12567, + "end": 12583, "loc": { "start": { "line": 298, @@ -13665,8 +13665,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 12565, - "end": 12569, + "start": 12567, + "end": 12571, "loc": { "start": { "line": 298, @@ -13682,8 +13682,8 @@ }, "value": { "type": "Identifier", - "start": 12571, - "end": 12581, + "start": 12573, + "end": 12583, "loc": { "start": { "line": 298, @@ -13700,8 +13700,8 @@ }, { "type": "ObjectProperty", - "start": 12603, - "end": 12611, + "start": 12605, + "end": 12613, "loc": { "start": { "line": 299, @@ -13717,8 +13717,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 12603, - "end": 12611, + "start": 12605, + "end": 12613, "loc": { "start": { "line": 299, @@ -13734,8 +13734,8 @@ }, "value": { "type": "Identifier", - "start": 12603, - "end": 12611, + "start": 12605, + "end": 12613, "loc": { "start": { "line": 299, @@ -13755,8 +13755,8 @@ }, { "type": "ObjectProperty", - "start": 12633, - "end": 12647, + "start": 12635, + "end": 12649, "loc": { "start": { "line": 300, @@ -13772,8 +13772,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 12633, - "end": 12641, + "start": 12635, + "end": 12643, "loc": { "start": { "line": 300, @@ -13789,8 +13789,8 @@ }, "value": { "type": "StringLiteral", - "start": 12643, - "end": 12647, + "start": 12645, + "end": 12649, "loc": { "start": { "line": 300, @@ -13810,8 +13810,8 @@ }, { "type": "ObjectProperty", - "start": 12669, - "end": 12681, + "start": 12671, + "end": 12683, "loc": { "start": { "line": 301, @@ -13827,8 +13827,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 12669, - "end": 12681, + "start": 12671, + "end": 12683, "loc": { "start": { "line": 301, @@ -13844,8 +13844,8 @@ }, "value": { "type": "Identifier", - "start": 12669, - "end": 12681, + "start": 12671, + "end": 12683, "loc": { "start": { "line": 301, @@ -13865,8 +13865,8 @@ }, { "type": "ObjectProperty", - "start": 12703, - "end": 12715, + "start": 12705, + "end": 12717, "loc": { "start": { "line": 302, @@ -13882,8 +13882,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 12703, - "end": 12715, + "start": 12705, + "end": 12717, "loc": { "start": { "line": 302, @@ -13899,8 +13899,8 @@ }, "value": { "type": "Identifier", - "start": 12703, - "end": 12715, + "start": 12705, + "end": 12717, "loc": { "start": { "line": 302, @@ -13920,8 +13920,8 @@ }, { "type": "ObjectProperty", - "start": 12737, - "end": 12742, + "start": 12739, + "end": 12744, "loc": { "start": { "line": 303, @@ -13937,8 +13937,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 12737, - "end": 12742, + "start": 12739, + "end": 12744, "loc": { "start": { "line": 303, @@ -13954,8 +13954,8 @@ }, "value": { "type": "Identifier", - "start": 12737, - "end": 12742, + "start": 12739, + "end": 12744, "loc": { "start": { "line": 303, @@ -13975,8 +13975,8 @@ }, { "type": "ObjectProperty", - "start": 12764, - "end": 12767, + "start": 12766, + "end": 12769, "loc": { "start": { "line": 304, @@ -13992,8 +13992,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 12764, - "end": 12767, + "start": 12766, + "end": 12769, "loc": { "start": { "line": 304, @@ -14009,8 +14009,8 @@ }, "value": { "type": "Identifier", - "start": 12764, - "end": 12767, + "start": 12766, + "end": 12769, "loc": { "start": { "line": 304, @@ -14035,8 +14035,8 @@ }, { "type": "BreakStatement", - "start": 12804, - "end": 12810, + "start": 12806, + "end": 12812, "loc": { "start": { "line": 306, @@ -14052,8 +14052,8 @@ ], "test": { "type": "StringLiteral", - "start": 12462, - "end": 12467, + "start": 12464, + "end": 12469, "loc": { "start": { "line": 295, @@ -14075,8 +14075,8 @@ { "type": "CommentLine", "value": " case \"gltf\":", - "start": 11446, - "end": 11461, + "start": 11448, + "end": 11463, "loc": { "start": { "line": 272, @@ -14091,8 +14091,8 @@ { "type": "CommentLine", "value": " const gltfJSON = JSON.parse(sourceData);", - "start": 11474, - "end": 11521, + "start": 11476, + "end": 11523, "loc": { "start": { "line": 273, @@ -14107,8 +14107,8 @@ { "type": "CommentLine", "value": " const gltfBasePath = source ? getBasePath(source) : \"\";", - "start": 11534, - "end": 11596, + "start": 11536, + "end": 11598, "loc": { "start": { "line": 274, @@ -14123,8 +14123,8 @@ { "type": "CommentLine", "value": " convert(parseGLTFIntoXKTModel, {", - "start": 11609, - "end": 11648, + "start": 11611, + "end": 11650, "loc": { "start": { "line": 275, @@ -14139,8 +14139,8 @@ { "type": "CommentLine", "value": " baseUri: gltfBasePath,", - "start": 11661, - "end": 11694, + "start": 11663, + "end": 11696, "loc": { "start": { "line": 276, @@ -14155,8 +14155,8 @@ { "type": "CommentLine", "value": " data: gltfJSON,", - "start": 11707, - "end": 11733, + "start": 11709, + "end": 11735, "loc": { "start": { "line": 277, @@ -14171,8 +14171,8 @@ { "type": "CommentLine", "value": " reuseGeometries,", - "start": 11746, - "end": 11773, + "start": 11748, + "end": 11775, "loc": { "start": { "line": 278, @@ -14187,8 +14187,8 @@ { "type": "CommentLine", "value": " includeTextures,", - "start": 11786, - "end": 11813, + "start": 11788, + "end": 11815, "loc": { "start": { "line": 279, @@ -14203,8 +14203,8 @@ { "type": "CommentLine", "value": " includeNormals,", - "start": 11826, - "end": 11852, + "start": 11828, + "end": 11854, "loc": { "start": { "line": 280, @@ -14219,8 +14219,8 @@ { "type": "CommentLine", "value": " metaModelData: metaModelJSON,", - "start": 11865, - "end": 11905, + "start": 11867, + "end": 11907, "loc": { "start": { "line": 281, @@ -14235,8 +14235,8 @@ { "type": "CommentLine", "value": " xktModel,", - "start": 11918, - "end": 11938, + "start": 11920, + "end": 11940, "loc": { "start": { "line": 282, @@ -14251,8 +14251,8 @@ { "type": "CommentLine", "value": " getAttachment: async (name) => {", - "start": 11951, - "end": 11994, + "start": 11953, + "end": 11996, "loc": { "start": { "line": 283, @@ -14267,8 +14267,8 @@ { "type": "CommentLine", "value": " const filePath = gltfBasePath + name;", - "start": 12007, - "end": 12059, + "start": 12009, + "end": 12061, "loc": { "start": { "line": 284, @@ -14283,8 +14283,8 @@ { "type": "CommentLine", "value": " log(`Reading attachment file: ${filePath}`);", - "start": 12072, - "end": 12131, + "start": 12074, + "end": 12133, "loc": { "start": { "line": 285, @@ -14299,8 +14299,8 @@ { "type": "CommentLine", "value": " const buffer = fs.readFileSync(filePath);", - "start": 12144, - "end": 12200, + "start": 12146, + "end": 12202, "loc": { "start": { "line": 286, @@ -14315,8 +14315,8 @@ { "type": "CommentLine", "value": " const arrayBuf = toArrayBuffer(buffer);", - "start": 12213, - "end": 12267, + "start": 12215, + "end": 12269, "loc": { "start": { "line": 287, @@ -14331,8 +14331,8 @@ { "type": "CommentLine", "value": " return arrayBuf;", - "start": 12280, - "end": 12311, + "start": 12282, + "end": 12313, "loc": { "start": { "line": 288, @@ -14347,8 +14347,8 @@ { "type": "CommentLine", "value": " },", - "start": 12324, - "end": 12337, + "start": 12326, + "end": 12339, "loc": { "start": { "line": 289, @@ -14363,8 +14363,8 @@ { "type": "CommentLine", "value": " stats,", - "start": 12350, - "end": 12367, + "start": 12352, + "end": 12369, "loc": { "start": { "line": 290, @@ -14379,8 +14379,8 @@ { "type": "CommentLine", "value": " log", - "start": 12380, - "end": 12394, + "start": 12382, + "end": 12396, "loc": { "start": { "line": 291, @@ -14395,8 +14395,8 @@ { "type": "CommentLine", "value": " });", - "start": 12407, - "end": 12417, + "start": 12409, + "end": 12419, "loc": { "start": { "line": 292, @@ -14411,8 +14411,8 @@ { "type": "CommentLine", "value": " break;", - "start": 12430, - "end": 12443, + "start": 12432, + "end": 12445, "loc": { "start": { "line": 293, @@ -14428,8 +14428,8 @@ }, { "type": "SwitchCase", - "start": 12824, - "end": 13330, + "start": 12826, + "end": 13332, "loc": { "start": { "line": 308, @@ -14443,8 +14443,8 @@ "consequent": [ { "type": "ExpressionStatement", - "start": 12852, - "end": 13307, + "start": 12854, + "end": 13309, "loc": { "start": { "line": 309, @@ -14457,8 +14457,8 @@ }, "expression": { "type": "CallExpression", - "start": 12852, - "end": 13306, + "start": 12854, + "end": 13308, "loc": { "start": { "line": 309, @@ -14471,8 +14471,8 @@ }, "callee": { "type": "Identifier", - "start": 12852, - "end": 12859, + "start": 12854, + "end": 12861, "loc": { "start": { "line": 309, @@ -14489,8 +14489,8 @@ "arguments": [ { "type": "Identifier", - "start": 12860, - "end": 12880, + "start": 12862, + "end": 12882, "loc": { "start": { "line": 309, @@ -14506,8 +14506,8 @@ }, { "type": "ObjectExpression", - "start": 12882, - "end": 13305, + "start": 12884, + "end": 13307, "loc": { "start": { "line": 309, @@ -14521,8 +14521,8 @@ "properties": [ { "type": "ObjectProperty", - "start": 12904, - "end": 12920, + "start": 12906, + "end": 12922, "loc": { "start": { "line": 310, @@ -14538,8 +14538,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 12904, - "end": 12908, + "start": 12906, + "end": 12910, "loc": { "start": { "line": 310, @@ -14555,8 +14555,8 @@ }, "value": { "type": "Identifier", - "start": 12910, - "end": 12920, + "start": 12912, + "end": 12922, "loc": { "start": { "line": 310, @@ -14573,8 +14573,8 @@ }, { "type": "ObjectProperty", - "start": 12942, - "end": 12950, + "start": 12944, + "end": 12952, "loc": { "start": { "line": 311, @@ -14590,8 +14590,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 12942, - "end": 12950, + "start": 12944, + "end": 12952, "loc": { "start": { "line": 311, @@ -14607,8 +14607,8 @@ }, "value": { "type": "Identifier", - "start": 12942, - "end": 12950, + "start": 12944, + "end": 12952, "loc": { "start": { "line": 311, @@ -14628,8 +14628,8 @@ }, { "type": "ObjectProperty", - "start": 12972, - "end": 12977, + "start": 12974, + "end": 12979, "loc": { "start": { "line": 312, @@ -14645,8 +14645,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 12972, - "end": 12977, + "start": 12974, + "end": 12979, "loc": { "start": { "line": 312, @@ -14662,8 +14662,8 @@ }, "value": { "type": "Identifier", - "start": 12972, - "end": 12977, + "start": 12974, + "end": 12979, "loc": { "start": { "line": 312, @@ -14683,8 +14683,8 @@ }, { "type": "ObjectProperty", - "start": 12999, - "end": 13025, + "start": 13001, + "end": 13027, "loc": { "start": { "line": 313, @@ -14700,8 +14700,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 12999, - "end": 13003, + "start": 13001, + "end": 13005, "loc": { "start": { "line": 313, @@ -14717,8 +14717,8 @@ }, "value": { "type": "MemberExpression", - "start": 13005, - "end": 13025, + "start": 13007, + "end": 13027, "loc": { "start": { "line": 313, @@ -14731,8 +14731,8 @@ }, "object": { "type": "Identifier", - "start": 13005, - "end": 13020, + "start": 13007, + "end": 13022, "loc": { "start": { "line": 313, @@ -14748,8 +14748,8 @@ }, "property": { "type": "Identifier", - "start": 13021, - "end": 13025, + "start": 13023, + "end": 13027, "loc": { "start": { "line": 313, @@ -14768,8 +14768,8 @@ }, { "type": "ObjectProperty", - "start": 13047, - "end": 13085, + "start": 13049, + "end": 13087, "loc": { "start": { "line": 314, @@ -14785,8 +14785,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 13047, - "end": 13057, + "start": 13049, + "end": 13059, "loc": { "start": { "line": 314, @@ -14802,8 +14802,8 @@ }, "value": { "type": "MemberExpression", - "start": 13059, - "end": 13085, + "start": 13061, + "end": 13087, "loc": { "start": { "line": 314, @@ -14816,8 +14816,8 @@ }, "object": { "type": "Identifier", - "start": 13059, - "end": 13074, + "start": 13061, + "end": 13076, "loc": { "start": { "line": 314, @@ -14833,8 +14833,8 @@ }, "property": { "type": "Identifier", - "start": 13075, - "end": 13085, + "start": 13077, + "end": 13087, "loc": { "start": { "line": 314, @@ -14853,8 +14853,8 @@ }, { "type": "ObjectProperty", - "start": 13107, - "end": 13137, + "start": 13109, + "end": 13139, "loc": { "start": { "line": 315, @@ -14870,8 +14870,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 13107, - "end": 13113, + "start": 13109, + "end": 13115, "loc": { "start": { "line": 315, @@ -14887,8 +14887,8 @@ }, "value": { "type": "MemberExpression", - "start": 13115, - "end": 13137, + "start": 13117, + "end": 13139, "loc": { "start": { "line": 315, @@ -14901,8 +14901,8 @@ }, "object": { "type": "Identifier", - "start": 13115, - "end": 13130, + "start": 13117, + "end": 13132, "loc": { "start": { "line": 315, @@ -14918,8 +14918,8 @@ }, "property": { "type": "Identifier", - "start": 13131, - "end": 13137, + "start": 13133, + "end": 13139, "loc": { "start": { "line": 315, @@ -14938,8 +14938,8 @@ }, { "type": "ObjectProperty", - "start": 13159, - "end": 13195, + "start": 13161, + "end": 13197, "loc": { "start": { "line": 316, @@ -14955,8 +14955,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 13159, - "end": 13168, + "start": 13161, + "end": 13170, "loc": { "start": { "line": 316, @@ -14972,8 +14972,8 @@ }, "value": { "type": "MemberExpression", - "start": 13170, - "end": 13195, + "start": 13172, + "end": 13197, "loc": { "start": { "line": 316, @@ -14986,8 +14986,8 @@ }, "object": { "type": "Identifier", - "start": 13170, - "end": 13185, + "start": 13172, + "end": 13187, "loc": { "start": { "line": 316, @@ -15003,8 +15003,8 @@ }, "property": { "type": "Identifier", - "start": 13186, - "end": 13195, + "start": 13188, + "end": 13197, "loc": { "start": { "line": 316, @@ -15023,8 +15023,8 @@ }, { "type": "ObjectProperty", - "start": 13217, - "end": 13262, + "start": 13219, + "end": 13264, "loc": { "start": { "line": 317, @@ -15040,8 +15040,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 13217, - "end": 13221, + "start": 13219, + "end": 13223, "loc": { "start": { "line": 317, @@ -15057,8 +15057,8 @@ }, "value": { "type": "CallExpression", - "start": 13223, - "end": 13262, + "start": 13225, + "end": 13264, "loc": { "start": { "line": 317, @@ -15071,8 +15071,8 @@ }, "callee": { "type": "Identifier", - "start": 13223, - "end": 13237, + "start": 13225, + "end": 13239, "loc": { "start": { "line": 317, @@ -15089,8 +15089,8 @@ "arguments": [ { "type": "MemberExpression", - "start": 13238, - "end": 13258, + "start": 13240, + "end": 13260, "loc": { "start": { "line": 317, @@ -15103,8 +15103,8 @@ }, "object": { "type": "Identifier", - "start": 13238, - "end": 13253, + "start": 13240, + "end": 13255, "loc": { "start": { "line": 317, @@ -15120,8 +15120,8 @@ }, "property": { "type": "Identifier", - "start": 13254, - "end": 13258, + "start": 13256, + "end": 13260, "loc": { "start": { "line": 317, @@ -15139,8 +15139,8 @@ }, { "type": "NumericLiteral", - "start": 13260, - "end": 13261, + "start": 13262, + "end": 13263, "loc": { "start": { "line": 317, @@ -15162,8 +15162,8 @@ }, { "type": "ObjectProperty", - "start": 13284, - "end": 13287, + "start": 13286, + "end": 13289, "loc": { "start": { "line": 318, @@ -15179,8 +15179,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 13284, - "end": 13287, + "start": 13286, + "end": 13289, "loc": { "start": { "line": 318, @@ -15196,8 +15196,8 @@ }, "value": { "type": "Identifier", - "start": 13284, - "end": 13287, + "start": 13286, + "end": 13289, "loc": { "start": { "line": 318, @@ -15222,8 +15222,8 @@ }, { "type": "BreakStatement", - "start": 13324, - "end": 13330, + "start": 13326, + "end": 13332, "loc": { "start": { "line": 320, @@ -15239,8 +15239,8 @@ ], "test": { "type": "StringLiteral", - "start": 12829, - "end": 12834, + "start": 12831, + "end": 12836, "loc": { "start": { "line": 308, @@ -15260,8 +15260,8 @@ }, { "type": "SwitchCase", - "start": 13344, - "end": 13850, + "start": 13346, + "end": 13852, "loc": { "start": { "line": 322, @@ -15275,8 +15275,8 @@ "consequent": [ { "type": "ExpressionStatement", - "start": 13372, - "end": 13827, + "start": 13374, + "end": 13829, "loc": { "start": { "line": 323, @@ -15289,8 +15289,8 @@ }, "expression": { "type": "CallExpression", - "start": 13372, - "end": 13826, + "start": 13374, + "end": 13828, "loc": { "start": { "line": 323, @@ -15303,8 +15303,8 @@ }, "callee": { "type": "Identifier", - "start": 13372, - "end": 13379, + "start": 13374, + "end": 13381, "loc": { "start": { "line": 323, @@ -15321,8 +15321,8 @@ "arguments": [ { "type": "Identifier", - "start": 13380, - "end": 13400, + "start": 13382, + "end": 13402, "loc": { "start": { "line": 323, @@ -15338,8 +15338,8 @@ }, { "type": "ObjectExpression", - "start": 13402, - "end": 13825, + "start": 13404, + "end": 13827, "loc": { "start": { "line": 323, @@ -15353,8 +15353,8 @@ "properties": [ { "type": "ObjectProperty", - "start": 13424, - "end": 13440, + "start": 13426, + "end": 13442, "loc": { "start": { "line": 324, @@ -15370,8 +15370,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 13424, - "end": 13428, + "start": 13426, + "end": 13430, "loc": { "start": { "line": 324, @@ -15387,8 +15387,8 @@ }, "value": { "type": "Identifier", - "start": 13430, - "end": 13440, + "start": 13432, + "end": 13442, "loc": { "start": { "line": 324, @@ -15405,8 +15405,8 @@ }, { "type": "ObjectProperty", - "start": 13462, - "end": 13470, + "start": 13464, + "end": 13472, "loc": { "start": { "line": 325, @@ -15422,8 +15422,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 13462, - "end": 13470, + "start": 13464, + "end": 13472, "loc": { "start": { "line": 325, @@ -15439,8 +15439,8 @@ }, "value": { "type": "Identifier", - "start": 13462, - "end": 13470, + "start": 13464, + "end": 13472, "loc": { "start": { "line": 325, @@ -15460,8 +15460,8 @@ }, { "type": "ObjectProperty", - "start": 13492, - "end": 13497, + "start": 13494, + "end": 13499, "loc": { "start": { "line": 326, @@ -15477,8 +15477,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 13492, - "end": 13497, + "start": 13494, + "end": 13499, "loc": { "start": { "line": 326, @@ -15494,8 +15494,8 @@ }, "value": { "type": "Identifier", - "start": 13492, - "end": 13497, + "start": 13494, + "end": 13499, "loc": { "start": { "line": 326, @@ -15515,8 +15515,8 @@ }, { "type": "ObjectProperty", - "start": 13519, - "end": 13545, + "start": 13521, + "end": 13547, "loc": { "start": { "line": 327, @@ -15532,8 +15532,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 13519, - "end": 13523, + "start": 13521, + "end": 13525, "loc": { "start": { "line": 327, @@ -15549,8 +15549,8 @@ }, "value": { "type": "MemberExpression", - "start": 13525, - "end": 13545, + "start": 13527, + "end": 13547, "loc": { "start": { "line": 327, @@ -15563,8 +15563,8 @@ }, "object": { "type": "Identifier", - "start": 13525, - "end": 13540, + "start": 13527, + "end": 13542, "loc": { "start": { "line": 327, @@ -15580,8 +15580,8 @@ }, "property": { "type": "Identifier", - "start": 13541, - "end": 13545, + "start": 13543, + "end": 13547, "loc": { "start": { "line": 327, @@ -15600,8 +15600,8 @@ }, { "type": "ObjectProperty", - "start": 13567, - "end": 13605, + "start": 13569, + "end": 13607, "loc": { "start": { "line": 328, @@ -15617,8 +15617,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 13567, - "end": 13577, + "start": 13569, + "end": 13579, "loc": { "start": { "line": 328, @@ -15634,8 +15634,8 @@ }, "value": { "type": "MemberExpression", - "start": 13579, - "end": 13605, + "start": 13581, + "end": 13607, "loc": { "start": { "line": 328, @@ -15648,8 +15648,8 @@ }, "object": { "type": "Identifier", - "start": 13579, - "end": 13594, + "start": 13581, + "end": 13596, "loc": { "start": { "line": 328, @@ -15665,8 +15665,8 @@ }, "property": { "type": "Identifier", - "start": 13595, - "end": 13605, + "start": 13597, + "end": 13607, "loc": { "start": { "line": 328, @@ -15685,8 +15685,8 @@ }, { "type": "ObjectProperty", - "start": 13627, - "end": 13657, + "start": 13629, + "end": 13659, "loc": { "start": { "line": 329, @@ -15702,8 +15702,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 13627, - "end": 13633, + "start": 13629, + "end": 13635, "loc": { "start": { "line": 329, @@ -15719,8 +15719,8 @@ }, "value": { "type": "MemberExpression", - "start": 13635, - "end": 13657, + "start": 13637, + "end": 13659, "loc": { "start": { "line": 329, @@ -15733,8 +15733,8 @@ }, "object": { "type": "Identifier", - "start": 13635, - "end": 13650, + "start": 13637, + "end": 13652, "loc": { "start": { "line": 329, @@ -15750,8 +15750,8 @@ }, "property": { "type": "Identifier", - "start": 13651, - "end": 13657, + "start": 13653, + "end": 13659, "loc": { "start": { "line": 329, @@ -15770,8 +15770,8 @@ }, { "type": "ObjectProperty", - "start": 13679, - "end": 13715, + "start": 13681, + "end": 13717, "loc": { "start": { "line": 330, @@ -15787,8 +15787,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 13679, - "end": 13688, + "start": 13681, + "end": 13690, "loc": { "start": { "line": 330, @@ -15804,8 +15804,8 @@ }, "value": { "type": "MemberExpression", - "start": 13690, - "end": 13715, + "start": 13692, + "end": 13717, "loc": { "start": { "line": 330, @@ -15818,8 +15818,8 @@ }, "object": { "type": "Identifier", - "start": 13690, - "end": 13705, + "start": 13692, + "end": 13707, "loc": { "start": { "line": 330, @@ -15835,8 +15835,8 @@ }, "property": { "type": "Identifier", - "start": 13706, - "end": 13715, + "start": 13708, + "end": 13717, "loc": { "start": { "line": 330, @@ -15855,8 +15855,8 @@ }, { "type": "ObjectProperty", - "start": 13737, - "end": 13782, + "start": 13739, + "end": 13784, "loc": { "start": { "line": 331, @@ -15872,8 +15872,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 13737, - "end": 13741, + "start": 13739, + "end": 13743, "loc": { "start": { "line": 331, @@ -15889,8 +15889,8 @@ }, "value": { "type": "CallExpression", - "start": 13743, - "end": 13782, + "start": 13745, + "end": 13784, "loc": { "start": { "line": 331, @@ -15903,8 +15903,8 @@ }, "callee": { "type": "Identifier", - "start": 13743, - "end": 13757, + "start": 13745, + "end": 13759, "loc": { "start": { "line": 331, @@ -15921,8 +15921,8 @@ "arguments": [ { "type": "MemberExpression", - "start": 13758, - "end": 13778, + "start": 13760, + "end": 13780, "loc": { "start": { "line": 331, @@ -15935,8 +15935,8 @@ }, "object": { "type": "Identifier", - "start": 13758, - "end": 13773, + "start": 13760, + "end": 13775, "loc": { "start": { "line": 331, @@ -15952,8 +15952,8 @@ }, "property": { "type": "Identifier", - "start": 13774, - "end": 13778, + "start": 13776, + "end": 13780, "loc": { "start": { "line": 331, @@ -15971,8 +15971,8 @@ }, { "type": "NumericLiteral", - "start": 13780, - "end": 13781, + "start": 13782, + "end": 13783, "loc": { "start": { "line": 331, @@ -15994,8 +15994,8 @@ }, { "type": "ObjectProperty", - "start": 13804, - "end": 13807, + "start": 13806, + "end": 13809, "loc": { "start": { "line": 332, @@ -16011,8 +16011,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 13804, - "end": 13807, + "start": 13806, + "end": 13809, "loc": { "start": { "line": 332, @@ -16028,8 +16028,8 @@ }, "value": { "type": "Identifier", - "start": 13804, - "end": 13807, + "start": 13806, + "end": 13809, "loc": { "start": { "line": 332, @@ -16054,8 +16054,8 @@ }, { "type": "BreakStatement", - "start": 13844, - "end": 13850, + "start": 13846, + "end": 13852, "loc": { "start": { "line": 334, @@ -16071,8 +16071,8 @@ ], "test": { "type": "StringLiteral", - "start": 13349, - "end": 13354, + "start": 13351, + "end": 13356, "loc": { "start": { "line": 322, @@ -16092,8 +16092,8 @@ }, { "type": "SwitchCase", - "start": 13864, - "end": 14085, + "start": 13866, + "end": 14087, "loc": { "start": { "line": 336, @@ -16107,8 +16107,8 @@ "consequent": [ { "type": "ExpressionStatement", - "start": 13892, - "end": 14062, + "start": 13894, + "end": 14064, "loc": { "start": { "line": 337, @@ -16121,8 +16121,8 @@ }, "expression": { "type": "CallExpression", - "start": 13892, - "end": 14061, + "start": 13894, + "end": 14063, "loc": { "start": { "line": 337, @@ -16135,8 +16135,8 @@ }, "callee": { "type": "Identifier", - "start": 13892, - "end": 13899, + "start": 13894, + "end": 13901, "loc": { "start": { "line": 337, @@ -16153,8 +16153,8 @@ "arguments": [ { "type": "Identifier", - "start": 13900, - "end": 13920, + "start": 13902, + "end": 13922, "loc": { "start": { "line": 337, @@ -16170,8 +16170,8 @@ }, { "type": "ObjectExpression", - "start": 13922, - "end": 14060, + "start": 13924, + "end": 14062, "loc": { "start": { "line": 337, @@ -16185,8 +16185,8 @@ "properties": [ { "type": "ObjectProperty", - "start": 13944, - "end": 13960, + "start": 13946, + "end": 13962, "loc": { "start": { "line": 338, @@ -16202,8 +16202,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 13944, - "end": 13948, + "start": 13946, + "end": 13950, "loc": { "start": { "line": 338, @@ -16219,8 +16219,8 @@ }, "value": { "type": "Identifier", - "start": 13950, - "end": 13960, + "start": 13952, + "end": 13962, "loc": { "start": { "line": 338, @@ -16237,8 +16237,8 @@ }, { "type": "ObjectProperty", - "start": 13982, - "end": 13990, + "start": 13984, + "end": 13992, "loc": { "start": { "line": 339, @@ -16254,8 +16254,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 13982, - "end": 13990, + "start": 13984, + "end": 13992, "loc": { "start": { "line": 339, @@ -16271,8 +16271,8 @@ }, "value": { "type": "Identifier", - "start": 13982, - "end": 13990, + "start": 13984, + "end": 13992, "loc": { "start": { "line": 339, @@ -16292,8 +16292,8 @@ }, { "type": "ObjectProperty", - "start": 14012, - "end": 14017, + "start": 14014, + "end": 14019, "loc": { "start": { "line": 340, @@ -16309,8 +16309,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 14012, - "end": 14017, + "start": 14014, + "end": 14019, "loc": { "start": { "line": 340, @@ -16326,8 +16326,8 @@ }, "value": { "type": "Identifier", - "start": 14012, - "end": 14017, + "start": 14014, + "end": 14019, "loc": { "start": { "line": 340, @@ -16347,8 +16347,8 @@ }, { "type": "ObjectProperty", - "start": 14039, - "end": 14042, + "start": 14041, + "end": 14044, "loc": { "start": { "line": 341, @@ -16364,8 +16364,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 14039, - "end": 14042, + "start": 14041, + "end": 14044, "loc": { "start": { "line": 341, @@ -16381,8 +16381,8 @@ }, "value": { "type": "Identifier", - "start": 14039, - "end": 14042, + "start": 14041, + "end": 14044, "loc": { "start": { "line": 341, @@ -16407,8 +16407,8 @@ }, { "type": "BreakStatement", - "start": 14079, - "end": 14085, + "start": 14081, + "end": 14087, "loc": { "start": { "line": 343, @@ -16424,8 +16424,8 @@ ], "test": { "type": "StringLiteral", - "start": 13869, - "end": 13874, + "start": 13871, + "end": 13876, "loc": { "start": { "line": 336, @@ -16445,8 +16445,8 @@ }, { "type": "SwitchCase", - "start": 14099, - "end": 14320, + "start": 14101, + "end": 14322, "loc": { "start": { "line": 345, @@ -16460,8 +16460,8 @@ "consequent": [ { "type": "ExpressionStatement", - "start": 14127, - "end": 14297, + "start": 14129, + "end": 14299, "loc": { "start": { "line": 346, @@ -16474,8 +16474,8 @@ }, "expression": { "type": "CallExpression", - "start": 14127, - "end": 14296, + "start": 14129, + "end": 14298, "loc": { "start": { "line": 346, @@ -16488,8 +16488,8 @@ }, "callee": { "type": "Identifier", - "start": 14127, - "end": 14134, + "start": 14129, + "end": 14136, "loc": { "start": { "line": 346, @@ -16506,8 +16506,8 @@ "arguments": [ { "type": "Identifier", - "start": 14135, - "end": 14155, + "start": 14137, + "end": 14157, "loc": { "start": { "line": 346, @@ -16523,8 +16523,8 @@ }, { "type": "ObjectExpression", - "start": 14157, - "end": 14295, + "start": 14159, + "end": 14297, "loc": { "start": { "line": 346, @@ -16538,8 +16538,8 @@ "properties": [ { "type": "ObjectProperty", - "start": 14179, - "end": 14195, + "start": 14181, + "end": 14197, "loc": { "start": { "line": 347, @@ -16555,8 +16555,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 14179, - "end": 14183, + "start": 14181, + "end": 14185, "loc": { "start": { "line": 347, @@ -16572,8 +16572,8 @@ }, "value": { "type": "Identifier", - "start": 14185, - "end": 14195, + "start": 14187, + "end": 14197, "loc": { "start": { "line": 347, @@ -16590,8 +16590,8 @@ }, { "type": "ObjectProperty", - "start": 14217, - "end": 14225, + "start": 14219, + "end": 14227, "loc": { "start": { "line": 348, @@ -16607,8 +16607,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 14217, - "end": 14225, + "start": 14219, + "end": 14227, "loc": { "start": { "line": 348, @@ -16624,8 +16624,8 @@ }, "value": { "type": "Identifier", - "start": 14217, - "end": 14225, + "start": 14219, + "end": 14227, "loc": { "start": { "line": 348, @@ -16645,8 +16645,8 @@ }, { "type": "ObjectProperty", - "start": 14247, - "end": 14252, + "start": 14249, + "end": 14254, "loc": { "start": { "line": 349, @@ -16662,8 +16662,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 14247, - "end": 14252, + "start": 14249, + "end": 14254, "loc": { "start": { "line": 349, @@ -16679,8 +16679,8 @@ }, "value": { "type": "Identifier", - "start": 14247, - "end": 14252, + "start": 14249, + "end": 14254, "loc": { "start": { "line": 349, @@ -16700,8 +16700,8 @@ }, { "type": "ObjectProperty", - "start": 14274, - "end": 14277, + "start": 14276, + "end": 14279, "loc": { "start": { "line": 350, @@ -16717,8 +16717,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 14274, - "end": 14277, + "start": 14276, + "end": 14279, "loc": { "start": { "line": 350, @@ -16734,8 +16734,8 @@ }, "value": { "type": "Identifier", - "start": 14274, - "end": 14277, + "start": 14276, + "end": 14279, "loc": { "start": { "line": 350, @@ -16760,8 +16760,8 @@ }, { "type": "BreakStatement", - "start": 14314, - "end": 14320, + "start": 14316, + "end": 14322, "loc": { "start": { "line": 352, @@ -16777,8 +16777,8 @@ ], "test": { "type": "StringLiteral", - "start": 14104, - "end": 14109, + "start": 14106, + "end": 14111, "loc": { "start": { "line": 345, @@ -16798,8 +16798,8 @@ }, { "type": "SwitchCase", - "start": 14334, - "end": 14555, + "start": 14336, + "end": 14557, "loc": { "start": { "line": 354, @@ -16813,8 +16813,8 @@ "consequent": [ { "type": "ExpressionStatement", - "start": 14362, - "end": 14532, + "start": 14364, + "end": 14534, "loc": { "start": { "line": 355, @@ -16827,8 +16827,8 @@ }, "expression": { "type": "CallExpression", - "start": 14362, - "end": 14531, + "start": 14364, + "end": 14533, "loc": { "start": { "line": 355, @@ -16841,8 +16841,8 @@ }, "callee": { "type": "Identifier", - "start": 14362, - "end": 14369, + "start": 14364, + "end": 14371, "loc": { "start": { "line": 355, @@ -16859,8 +16859,8 @@ "arguments": [ { "type": "Identifier", - "start": 14370, - "end": 14390, + "start": 14372, + "end": 14392, "loc": { "start": { "line": 355, @@ -16876,8 +16876,8 @@ }, { "type": "ObjectExpression", - "start": 14392, - "end": 14530, + "start": 14394, + "end": 14532, "loc": { "start": { "line": 355, @@ -16891,8 +16891,8 @@ "properties": [ { "type": "ObjectProperty", - "start": 14414, - "end": 14430, + "start": 14416, + "end": 14432, "loc": { "start": { "line": 356, @@ -16908,8 +16908,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 14414, - "end": 14418, + "start": 14416, + "end": 14420, "loc": { "start": { "line": 356, @@ -16925,8 +16925,8 @@ }, "value": { "type": "Identifier", - "start": 14420, - "end": 14430, + "start": 14422, + "end": 14432, "loc": { "start": { "line": 356, @@ -16943,8 +16943,8 @@ }, { "type": "ObjectProperty", - "start": 14452, - "end": 14460, + "start": 14454, + "end": 14462, "loc": { "start": { "line": 357, @@ -16960,8 +16960,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 14452, - "end": 14460, + "start": 14454, + "end": 14462, "loc": { "start": { "line": 357, @@ -16977,8 +16977,8 @@ }, "value": { "type": "Identifier", - "start": 14452, - "end": 14460, + "start": 14454, + "end": 14462, "loc": { "start": { "line": 357, @@ -16998,8 +16998,8 @@ }, { "type": "ObjectProperty", - "start": 14482, - "end": 14487, + "start": 14484, + "end": 14489, "loc": { "start": { "line": 358, @@ -17015,8 +17015,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 14482, - "end": 14487, + "start": 14484, + "end": 14489, "loc": { "start": { "line": 358, @@ -17032,8 +17032,8 @@ }, "value": { "type": "Identifier", - "start": 14482, - "end": 14487, + "start": 14484, + "end": 14489, "loc": { "start": { "line": 358, @@ -17053,8 +17053,8 @@ }, { "type": "ObjectProperty", - "start": 14509, - "end": 14512, + "start": 14511, + "end": 14514, "loc": { "start": { "line": 359, @@ -17070,8 +17070,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 14509, - "end": 14512, + "start": 14511, + "end": 14514, "loc": { "start": { "line": 359, @@ -17087,8 +17087,8 @@ }, "value": { "type": "Identifier", - "start": 14509, - "end": 14512, + "start": 14511, + "end": 14514, "loc": { "start": { "line": 359, @@ -17113,8 +17113,8 @@ }, { "type": "BreakStatement", - "start": 14549, - "end": 14555, + "start": 14551, + "end": 14557, "loc": { "start": { "line": 361, @@ -17130,8 +17130,8 @@ ], "test": { "type": "StringLiteral", - "start": 14339, - "end": 14344, + "start": 14341, + "end": 14346, "loc": { "start": { "line": 354, @@ -17151,8 +17151,8 @@ }, { "type": "SwitchCase", - "start": 14569, - "end": 14672, + "start": 14571, + "end": 14674, "loc": { "start": { "line": 363, @@ -17166,8 +17166,8 @@ "consequent": [ { "type": "ExpressionStatement", - "start": 14594, - "end": 14648, + "start": 14596, + "end": 14650, "loc": { "start": { "line": 364, @@ -17180,8 +17180,8 @@ }, "expression": { "type": "CallExpression", - "start": 14594, - "end": 14647, + "start": 14596, + "end": 14649, "loc": { "start": { "line": 364, @@ -17194,8 +17194,8 @@ }, "callee": { "type": "Identifier", - "start": 14594, - "end": 14600, + "start": 14596, + "end": 14602, "loc": { "start": { "line": 364, @@ -17212,8 +17212,8 @@ "arguments": [ { "type": "TemplateLiteral", - "start": 14601, - "end": 14646, + "start": 14603, + "end": 14648, "loc": { "start": { "line": 364, @@ -17227,8 +17227,8 @@ "expressions": [ { "type": "Identifier", - "start": 14639, - "end": 14642, + "start": 14641, + "end": 14644, "loc": { "start": { "line": 364, @@ -17246,8 +17246,8 @@ "quasis": [ { "type": "TemplateElement", - "start": 14602, - "end": 14637, + "start": 14604, + "end": 14639, "loc": { "start": { "line": 364, @@ -17266,8 +17266,8 @@ }, { "type": "TemplateElement", - "start": 14643, - "end": 14645, + "start": 14645, + "end": 14647, "loc": { "start": { "line": 364, @@ -17291,8 +17291,8 @@ }, { "type": "ReturnStatement", - "start": 14665, - "end": 14672, + "start": 14667, + "end": 14674, "loc": { "start": { "line": 365, @@ -17312,8 +17312,8 @@ }, { "type": "FunctionDeclaration", - "start": 14692, - "end": 18361, + "start": 14694, + "end": 18363, "loc": { "start": { "line": 368, @@ -17326,8 +17326,8 @@ }, "id": { "type": "Identifier", - "start": 14701, - "end": 14708, + "start": 14703, + "end": 14710, "loc": { "start": { "line": 368, @@ -17347,8 +17347,8 @@ "params": [ { "type": "Identifier", - "start": 14709, - "end": 14715, + "start": 14711, + "end": 14717, "loc": { "start": { "line": 368, @@ -17364,8 +17364,8 @@ }, { "type": "Identifier", - "start": 14717, - "end": 14732, + "start": 14719, + "end": 14734, "loc": { "start": { "line": 368, @@ -17382,8 +17382,8 @@ ], "body": { "type": "BlockStatement", - "start": 14734, - "end": 18361, + "start": 14736, + "end": 18363, "loc": { "start": { "line": 368, @@ -17397,8 +17397,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 14749, - "end": 18351, + "start": 14751, + "end": 18353, "loc": { "start": { "line": 370, @@ -17411,8 +17411,8 @@ }, "expression": { "type": "CallExpression", - "start": 14749, - "end": 18350, + "start": 14751, + "end": 18352, "loc": { "start": { "line": 370, @@ -17425,8 +17425,8 @@ }, "callee": { "type": "MemberExpression", - "start": 14749, - "end": 14777, + "start": 14751, + "end": 14779, "loc": { "start": { "line": 370, @@ -17439,8 +17439,8 @@ }, "object": { "type": "CallExpression", - "start": 14749, - "end": 14772, + "start": 14751, + "end": 14774, "loc": { "start": { "line": 370, @@ -17453,8 +17453,8 @@ }, "callee": { "type": "Identifier", - "start": 14749, - "end": 14755, + "start": 14751, + "end": 14757, "loc": { "start": { "line": 370, @@ -17471,8 +17471,8 @@ "arguments": [ { "type": "Identifier", - "start": 14756, - "end": 14771, + "start": 14758, + "end": 14773, "loc": { "start": { "line": 370, @@ -17490,8 +17490,8 @@ }, "property": { "type": "Identifier", - "start": 14773, - "end": 14777, + "start": 14775, + "end": 14779, "loc": { "start": { "line": 370, @@ -17510,8 +17510,8 @@ "arguments": [ { "type": "ArrowFunctionExpression", - "start": 14778, - "end": 18294, + "start": 14780, + "end": 18296, "loc": { "start": { "line": 370, @@ -17529,8 +17529,8 @@ "params": [], "body": { "type": "BlockStatement", - "start": 14784, - "end": 18294, + "start": 14786, + "end": 18296, "loc": { "start": { "line": 370, @@ -17544,8 +17544,8 @@ "body": [ { "type": "IfStatement", - "start": 14803, - "end": 14961, + "start": 14805, + "end": 14963, "loc": { "start": { "line": 372, @@ -17558,8 +17558,8 @@ }, "test": { "type": "UnaryExpression", - "start": 14807, - "end": 14821, + "start": 14809, + "end": 14823, "loc": { "start": { "line": 372, @@ -17574,8 +17574,8 @@ "prefix": true, "argument": { "type": "Identifier", - "start": 14808, - "end": 14821, + "start": 14810, + "end": 14823, "loc": { "start": { "line": 372, @@ -17595,8 +17595,8 @@ }, "consequent": { "type": "BlockStatement", - "start": 14823, - "end": 14961, + "start": 14825, + "end": 14963, "loc": { "start": { "line": 372, @@ -17610,8 +17610,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 14845, - "end": 14886, + "start": 14847, + "end": 14888, "loc": { "start": { "line": 373, @@ -17624,8 +17624,8 @@ }, "expression": { "type": "CallExpression", - "start": 14845, - "end": 14885, + "start": 14847, + "end": 14887, "loc": { "start": { "line": 373, @@ -17638,8 +17638,8 @@ }, "callee": { "type": "Identifier", - "start": 14845, - "end": 14848, + "start": 14847, + "end": 14850, "loc": { "start": { "line": 373, @@ -17656,8 +17656,8 @@ "arguments": [ { "type": "StringLiteral", - "start": 14849, - "end": 14884, + "start": 14851, + "end": 14886, "loc": { "start": { "line": 373, @@ -17679,8 +17679,8 @@ }, { "type": "ExpressionStatement", - "start": 14907, - "end": 14943, + "start": 14909, + "end": 14945, "loc": { "start": { "line": 374, @@ -17693,8 +17693,8 @@ }, "expression": { "type": "CallExpression", - "start": 14907, - "end": 14942, + "start": 14909, + "end": 14944, "loc": { "start": { "line": 374, @@ -17707,8 +17707,8 @@ }, "callee": { "type": "MemberExpression", - "start": 14907, - "end": 14940, + "start": 14909, + "end": 14942, "loc": { "start": { "line": 374, @@ -17721,8 +17721,8 @@ }, "object": { "type": "Identifier", - "start": 14907, - "end": 14915, + "start": 14909, + "end": 14917, "loc": { "start": { "line": 374, @@ -17738,8 +17738,8 @@ }, "property": { "type": "Identifier", - "start": 14916, - "end": 14940, + "start": 14918, + "end": 14942, "loc": { "start": { "line": 374, @@ -17765,8 +17765,8 @@ }, { "type": "ExpressionStatement", - "start": 14979, - "end": 15033, + "start": 14981, + "end": 15035, "loc": { "start": { "line": 377, @@ -17779,8 +17779,8 @@ }, "expression": { "type": "CallExpression", - "start": 14979, - "end": 15032, + "start": 14981, + "end": 15034, "loc": { "start": { "line": 377, @@ -17793,8 +17793,8 @@ }, "callee": { "type": "Identifier", - "start": 14979, - "end": 14982, + "start": 14981, + "end": 14984, "loc": { "start": { "line": 377, @@ -17811,8 +17811,8 @@ "arguments": [ { "type": "StringLiteral", - "start": 14983, - "end": 15031, + "start": 14985, + "end": 15033, "loc": { "start": { "line": 377, @@ -17834,8 +17834,8 @@ }, { "type": "ExpressionStatement", - "start": 15051, - "end": 18280, + "start": 15053, + "end": 18282, "loc": { "start": { "line": 379, @@ -17848,8 +17848,8 @@ }, "expression": { "type": "CallExpression", - "start": 15051, - "end": 18279, + "start": 15053, + "end": 18281, "loc": { "start": { "line": 379, @@ -17862,8 +17862,8 @@ }, "callee": { "type": "MemberExpression", - "start": 15051, - "end": 15075, + "start": 15053, + "end": 15077, "loc": { "start": { "line": 379, @@ -17876,8 +17876,8 @@ }, "object": { "type": "CallExpression", - "start": 15051, - "end": 15070, + "start": 15053, + "end": 15072, "loc": { "start": { "line": 379, @@ -17890,8 +17890,8 @@ }, "callee": { "type": "MemberExpression", - "start": 15051, - "end": 15068, + "start": 15053, + "end": 15070, "loc": { "start": { "line": 379, @@ -17904,8 +17904,8 @@ }, "object": { "type": "Identifier", - "start": 15051, - "end": 15059, + "start": 15053, + "end": 15061, "loc": { "start": { "line": 379, @@ -17921,8 +17921,8 @@ }, "property": { "type": "Identifier", - "start": 15060, - "end": 15068, + "start": 15062, + "end": 15070, "loc": { "start": { "line": 379, @@ -17942,8 +17942,8 @@ }, "property": { "type": "Identifier", - "start": 15071, - "end": 15075, + "start": 15073, + "end": 15077, "loc": { "start": { "line": 379, @@ -17962,8 +17962,8 @@ "arguments": [ { "type": "ArrowFunctionExpression", - "start": 15076, - "end": 18278, + "start": 15078, + "end": 18280, "loc": { "start": { "line": 379, @@ -17981,8 +17981,8 @@ "params": [], "body": { "type": "BlockStatement", - "start": 15082, - "end": 18278, + "start": 15084, + "end": 18280, "loc": { "start": { "line": 379, @@ -17996,8 +17996,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 15105, - "end": 15158, + "start": 15107, + "end": 15160, "loc": { "start": { "line": 381, @@ -18010,8 +18010,8 @@ }, "expression": { "type": "CallExpression", - "start": 15105, - "end": 15157, + "start": 15107, + "end": 15159, "loc": { "start": { "line": 381, @@ -18024,8 +18024,8 @@ }, "callee": { "type": "Identifier", - "start": 15105, - "end": 15108, + "start": 15107, + "end": 15110, "loc": { "start": { "line": 381, @@ -18042,8 +18042,8 @@ "arguments": [ { "type": "StringLiteral", - "start": 15109, - "end": 15156, + "start": 15111, + "end": 15158, "loc": { "start": { "line": 381, @@ -18065,8 +18065,8 @@ }, { "type": "VariableDeclaration", - "start": 15180, - "end": 15275, + "start": 15182, + "end": 15277, "loc": { "start": { "line": 383, @@ -18080,8 +18080,8 @@ "declarations": [ { "type": "VariableDeclarator", - "start": 15186, - "end": 15274, + "start": 15188, + "end": 15276, "loc": { "start": { "line": 383, @@ -18094,8 +18094,8 @@ }, "id": { "type": "Identifier", - "start": 15186, - "end": 15200, + "start": 15188, + "end": 15202, "loc": { "start": { "line": 383, @@ -18111,8 +18111,8 @@ }, "init": { "type": "CallExpression", - "start": 15203, - "end": 15274, + "start": 15205, + "end": 15276, "loc": { "start": { "line": 383, @@ -18125,8 +18125,8 @@ }, "callee": { "type": "Identifier", - "start": 15203, - "end": 15229, + "start": 15205, + "end": 15231, "loc": { "start": { "line": 383, @@ -18143,8 +18143,8 @@ "arguments": [ { "type": "Identifier", - "start": 15230, - "end": 15238, + "start": 15232, + "end": 15240, "loc": { "start": { "line": 383, @@ -18160,8 +18160,8 @@ }, { "type": "Identifier", - "start": 15240, - "end": 15253, + "start": 15242, + "end": 15255, "loc": { "start": { "line": 383, @@ -18177,8 +18177,8 @@ }, { "type": "Identifier", - "start": 15255, - "end": 15260, + "start": 15257, + "end": 15262, "loc": { "start": { "line": 383, @@ -18194,8 +18194,8 @@ }, { "type": "ObjectExpression", - "start": 15262, - "end": 15273, + "start": 15264, + "end": 15275, "loc": { "start": { "line": 383, @@ -18209,8 +18209,8 @@ "properties": [ { "type": "ObjectProperty", - "start": 15263, - "end": 15272, + "start": 15265, + "end": 15274, "loc": { "start": { "line": 383, @@ -18226,8 +18226,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 15263, - "end": 15266, + "start": 15265, + "end": 15268, "loc": { "start": { "line": 383, @@ -18243,8 +18243,8 @@ }, "value": { "type": "BooleanLiteral", - "start": 15268, - "end": 15272, + "start": 15270, + "end": 15274, "loc": { "start": { "line": 383, @@ -18268,8 +18268,8 @@ }, { "type": "VariableDeclaration", - "start": 15297, - "end": 15344, + "start": 15299, + "end": 15346, "loc": { "start": { "line": 385, @@ -18283,8 +18283,8 @@ "declarations": [ { "type": "VariableDeclarator", - "start": 15303, - "end": 15343, + "start": 15305, + "end": 15345, "loc": { "start": { "line": 385, @@ -18297,8 +18297,8 @@ }, "id": { "type": "Identifier", - "start": 15303, - "end": 15313, + "start": 15305, + "end": 15315, "loc": { "start": { "line": 385, @@ -18314,8 +18314,8 @@ }, "init": { "type": "CallExpression", - "start": 15316, - "end": 15343, + "start": 15318, + "end": 15345, "loc": { "start": { "line": 385, @@ -18328,8 +18328,8 @@ }, "callee": { "type": "MemberExpression", - "start": 15316, - "end": 15327, + "start": 15318, + "end": 15329, "loc": { "start": { "line": 385, @@ -18342,8 +18342,8 @@ }, "object": { "type": "Identifier", - "start": 15316, - "end": 15322, + "start": 15318, + "end": 15324, "loc": { "start": { "line": 385, @@ -18359,8 +18359,8 @@ }, "property": { "type": "Identifier", - "start": 15323, - "end": 15327, + "start": 15325, + "end": 15329, "loc": { "start": { "line": 385, @@ -18379,8 +18379,8 @@ "arguments": [ { "type": "Identifier", - "start": 15328, - "end": 15342, + "start": 15330, + "end": 15344, "loc": { "start": { "line": 385, @@ -18402,8 +18402,8 @@ }, { "type": "VariableDeclaration", - "start": 15366, - "end": 15420, + "start": 15368, + "end": 15422, "loc": { "start": { "line": 387, @@ -18417,8 +18417,8 @@ "declarations": [ { "type": "VariableDeclarator", - "start": 15372, - "end": 15419, + "start": 15374, + "end": 15421, "loc": { "start": { "line": 387, @@ -18431,8 +18431,8 @@ }, "id": { "type": "Identifier", - "start": 15372, - "end": 15391, + "start": 15374, + "end": 15393, "loc": { "start": { "line": 387, @@ -18448,8 +18448,8 @@ }, "init": { "type": "MemberExpression", - "start": 15394, - "end": 15419, + "start": 15396, + "end": 15421, "loc": { "start": { "line": 387, @@ -18462,8 +18462,8 @@ }, "object": { "type": "Identifier", - "start": 15394, - "end": 15408, + "start": 15396, + "end": 15410, "loc": { "start": { "line": 387, @@ -18479,8 +18479,8 @@ }, "property": { "type": "Identifier", - "start": 15409, - "end": 15419, + "start": 15411, + "end": 15421, "loc": { "start": { "line": 387, @@ -18502,8 +18502,8 @@ }, { "type": "ExpressionStatement", - "start": 15442, - "end": 15481, + "start": 15444, + "end": 15483, "loc": { "start": { "line": 389, @@ -18516,8 +18516,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 15442, - "end": 15480, + "start": 15444, + "end": 15482, "loc": { "start": { "line": 389, @@ -18531,8 +18531,8 @@ "operator": "=", "left": { "type": "MemberExpression", - "start": 15442, - "end": 15459, + "start": 15444, + "end": 15461, "loc": { "start": { "line": 389, @@ -18545,8 +18545,8 @@ }, "object": { "type": "Identifier", - "start": 15442, - "end": 15447, + "start": 15444, + "end": 15449, "loc": { "start": { "line": 389, @@ -18562,8 +18562,8 @@ }, "property": { "type": "Identifier", - "start": 15448, - "end": 15459, + "start": 15450, + "end": 15461, "loc": { "start": { "line": 389, @@ -18581,8 +18581,8 @@ }, "right": { "type": "LogicalExpression", - "start": 15462, - "end": 15480, + "start": 15464, + "end": 15482, "loc": { "start": { "line": 389, @@ -18595,8 +18595,8 @@ }, "left": { "type": "Identifier", - "start": 15462, - "end": 15473, + "start": 15464, + "end": 15475, "loc": { "start": { "line": 389, @@ -18613,8 +18613,8 @@ "operator": "||", "right": { "type": "NumericLiteral", - "start": 15477, - "end": 15480, + "start": 15479, + "end": 15482, "loc": { "start": { "line": 389, @@ -18636,8 +18636,8 @@ }, { "type": "ExpressionStatement", - "start": 15502, - "end": 15561, + "start": 15504, + "end": 15563, "loc": { "start": { "line": 390, @@ -18650,8 +18650,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 15502, - "end": 15560, + "start": 15504, + "end": 15562, "loc": { "start": { "line": 390, @@ -18665,8 +18665,8 @@ "operator": "=", "left": { "type": "MemberExpression", - "start": 15502, - "end": 15518, + "start": 15504, + "end": 15520, "loc": { "start": { "line": 390, @@ -18679,8 +18679,8 @@ }, "object": { "type": "Identifier", - "start": 15502, - "end": 15507, + "start": 15504, + "end": 15509, "loc": { "start": { "line": 390, @@ -18696,8 +18696,8 @@ }, "property": { "type": "Identifier", - "start": 15508, - "end": 15518, + "start": 15510, + "end": 15520, "loc": { "start": { "line": 390, @@ -18715,8 +18715,8 @@ }, "right": { "type": "CallExpression", - "start": 15521, - "end": 15560, + "start": 15523, + "end": 15562, "loc": { "start": { "line": 390, @@ -18729,8 +18729,8 @@ }, "callee": { "type": "MemberExpression", - "start": 15521, - "end": 15557, + "start": 15523, + "end": 15559, "loc": { "start": { "line": 390, @@ -18743,8 +18743,8 @@ }, "object": { "type": "BinaryExpression", - "start": 15522, - "end": 15548, + "start": 15524, + "end": 15550, "loc": { "start": { "line": 390, @@ -18757,8 +18757,8 @@ }, "left": { "type": "Identifier", - "start": 15522, - "end": 15541, + "start": 15524, + "end": 15543, "loc": { "start": { "line": 390, @@ -18775,8 +18775,8 @@ "operator": "/", "right": { "type": "NumericLiteral", - "start": 15544, - "end": 15548, + "start": 15546, + "end": 15550, "loc": { "start": { "line": 390, @@ -18795,13 +18795,13 @@ }, "extra": { "parenthesized": true, - "parenStart": 15521 + "parenStart": 15523 } }, "property": { "type": "Identifier", - "start": 15550, - "end": 15557, + "start": 15552, + "end": 15559, "loc": { "start": { "line": 390, @@ -18820,8 +18820,8 @@ "arguments": [ { "type": "NumericLiteral", - "start": 15558, - "end": 15559, + "start": 15560, + "end": 15561, "loc": { "start": { "line": 390, @@ -18844,8 +18844,8 @@ }, { "type": "ExpressionStatement", - "start": 15582, - "end": 15638, + "start": 15584, + "end": 15640, "loc": { "start": { "line": 391, @@ -18858,8 +18858,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 15582, - "end": 15637, + "start": 15584, + "end": 15639, "loc": { "start": { "line": 391, @@ -18873,8 +18873,8 @@ "operator": "=", "left": { "type": "MemberExpression", - "start": 15582, - "end": 15595, + "start": 15584, + "end": 15597, "loc": { "start": { "line": 391, @@ -18887,8 +18887,8 @@ }, "object": { "type": "Identifier", - "start": 15582, - "end": 15587, + "start": 15584, + "end": 15589, "loc": { "start": { "line": 391, @@ -18904,8 +18904,8 @@ }, "property": { "type": "Identifier", - "start": 15588, - "end": 15595, + "start": 15590, + "end": 15597, "loc": { "start": { "line": 391, @@ -18923,8 +18923,8 @@ }, "right": { "type": "CallExpression", - "start": 15598, - "end": 15637, + "start": 15600, + "end": 15639, "loc": { "start": { "line": 391, @@ -18937,8 +18937,8 @@ }, "callee": { "type": "MemberExpression", - "start": 15598, - "end": 15634, + "start": 15600, + "end": 15636, "loc": { "start": { "line": 391, @@ -18951,8 +18951,8 @@ }, "object": { "type": "BinaryExpression", - "start": 15599, - "end": 15625, + "start": 15601, + "end": 15627, "loc": { "start": { "line": 391, @@ -18965,8 +18965,8 @@ }, "left": { "type": "Identifier", - "start": 15599, - "end": 15618, + "start": 15601, + "end": 15620, "loc": { "start": { "line": 391, @@ -18983,8 +18983,8 @@ "operator": "/", "right": { "type": "NumericLiteral", - "start": 15621, - "end": 15625, + "start": 15623, + "end": 15627, "loc": { "start": { "line": 391, @@ -19003,13 +19003,13 @@ }, "extra": { "parenthesized": true, - "parenStart": 15598 + "parenStart": 15600 } }, "property": { "type": "Identifier", - "start": 15627, - "end": 15634, + "start": 15629, + "end": 15636, "loc": { "start": { "line": 391, @@ -19028,8 +19028,8 @@ "arguments": [ { "type": "NumericLiteral", - "start": 15635, - "end": 15636, + "start": 15637, + "end": 15638, "loc": { "start": { "line": 391, @@ -19052,8 +19052,8 @@ }, { "type": "ExpressionStatement", - "start": 15659, - "end": 15698, + "start": 15661, + "end": 15700, "loc": { "start": { "line": 392, @@ -19066,8 +19066,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 15659, - "end": 15697, + "start": 15661, + "end": 15699, "loc": { "start": { "line": 392, @@ -19081,8 +19081,8 @@ "operator": "=", "left": { "type": "MemberExpression", - "start": 15659, - "end": 15675, + "start": 15661, + "end": 15677, "loc": { "start": { "line": 392, @@ -19095,8 +19095,8 @@ }, "object": { "type": "Identifier", - "start": 15659, - "end": 15664, + "start": 15661, + "end": 15666, "loc": { "start": { "line": 392, @@ -19112,8 +19112,8 @@ }, "property": { "type": "Identifier", - "start": 15665, - "end": 15675, + "start": 15667, + "end": 15677, "loc": { "start": { "line": 392, @@ -19131,8 +19131,8 @@ }, "right": { "type": "MemberExpression", - "start": 15678, - "end": 15697, + "start": 15680, + "end": 15699, "loc": { "start": { "line": 392, @@ -19145,8 +19145,8 @@ }, "object": { "type": "Identifier", - "start": 15678, - "end": 15686, + "start": 15680, + "end": 15688, "loc": { "start": { "line": 392, @@ -19162,8 +19162,8 @@ }, "property": { "type": "Identifier", - "start": 15687, - "end": 15697, + "start": 15689, + "end": 15699, "loc": { "start": { "line": 392, @@ -19183,8 +19183,8 @@ }, { "type": "ExpressionStatement", - "start": 15719, - "end": 15799, + "start": 15721, + "end": 15801, "loc": { "start": { "line": 393, @@ -19197,8 +19197,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 15719, - "end": 15798, + "start": 15721, + "end": 15800, "loc": { "start": { "line": 393, @@ -19212,8 +19212,8 @@ "operator": "=", "left": { "type": "MemberExpression", - "start": 15719, - "end": 15741, + "start": 15721, + "end": 15743, "loc": { "start": { "line": 393, @@ -19226,8 +19226,8 @@ }, "object": { "type": "Identifier", - "start": 15719, - "end": 15724, + "start": 15721, + "end": 15726, "loc": { "start": { "line": 393, @@ -19243,8 +19243,8 @@ }, "property": { "type": "Identifier", - "start": 15725, - "end": 15741, + "start": 15727, + "end": 15743, "loc": { "start": { "line": 393, @@ -19262,8 +19262,8 @@ }, "right": { "type": "CallExpression", - "start": 15744, - "end": 15798, + "start": 15746, + "end": 15800, "loc": { "start": { "line": 393, @@ -19276,8 +19276,8 @@ }, "callee": { "type": "MemberExpression", - "start": 15744, - "end": 15795, + "start": 15746, + "end": 15797, "loc": { "start": { "line": 393, @@ -19290,8 +19290,8 @@ }, "object": { "type": "BinaryExpression", - "start": 15745, - "end": 15786, + "start": 15747, + "end": 15788, "loc": { "start": { "line": 393, @@ -19304,8 +19304,8 @@ }, "left": { "type": "Identifier", - "start": 15745, - "end": 15764, + "start": 15747, + "end": 15766, "loc": { "start": { "line": 393, @@ -19322,8 +19322,8 @@ "operator": "/", "right": { "type": "Identifier", - "start": 15767, - "end": 15786, + "start": 15769, + "end": 15788, "loc": { "start": { "line": 393, @@ -19339,13 +19339,13 @@ }, "extra": { "parenthesized": true, - "parenStart": 15744 + "parenStart": 15746 } }, "property": { "type": "Identifier", - "start": 15788, - "end": 15795, + "start": 15790, + "end": 15797, "loc": { "start": { "line": 393, @@ -19364,8 +19364,8 @@ "arguments": [ { "type": "NumericLiteral", - "start": 15796, - "end": 15797, + "start": 15798, + "end": 15799, "loc": { "start": { "line": 393, @@ -19388,8 +19388,8 @@ }, { "type": "ExpressionStatement", - "start": 15820, - "end": 15890, + "start": 15822, + "end": 15892, "loc": { "start": { "line": 394, @@ -19402,8 +19402,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 15820, - "end": 15889, + "start": 15822, + "end": 15891, "loc": { "start": { "line": 394, @@ -19417,8 +19417,8 @@ "operator": "=", "left": { "type": "MemberExpression", - "start": 15820, - "end": 15840, + "start": 15822, + "end": 15842, "loc": { "start": { "line": 394, @@ -19431,8 +19431,8 @@ }, "object": { "type": "Identifier", - "start": 15820, - "end": 15825, + "start": 15822, + "end": 15827, "loc": { "start": { "line": 394, @@ -19448,8 +19448,8 @@ }, "property": { "type": "Identifier", - "start": 15826, - "end": 15840, + "start": 15828, + "end": 15842, "loc": { "start": { "line": 394, @@ -19467,8 +19467,8 @@ }, "right": { "type": "CallExpression", - "start": 15843, - "end": 15889, + "start": 15845, + "end": 15891, "loc": { "start": { "line": 394, @@ -19481,8 +19481,8 @@ }, "callee": { "type": "MemberExpression", - "start": 15843, - "end": 15886, + "start": 15845, + "end": 15888, "loc": { "start": { "line": 394, @@ -19495,8 +19495,8 @@ }, "object": { "type": "BinaryExpression", - "start": 15844, - "end": 15877, + "start": 15846, + "end": 15879, "loc": { "start": { "line": 394, @@ -19509,8 +19509,8 @@ }, "left": { "type": "BinaryExpression", - "start": 15845, - "end": 15867, + "start": 15847, + "end": 15869, "loc": { "start": { "line": 394, @@ -19523,8 +19523,8 @@ }, "left": { "type": "NewExpression", - "start": 15845, - "end": 15855, + "start": 15847, + "end": 15857, "loc": { "start": { "line": 394, @@ -19537,8 +19537,8 @@ }, "callee": { "type": "Identifier", - "start": 15849, - "end": 15853, + "start": 15851, + "end": 15855, "loc": { "start": { "line": 394, @@ -19557,8 +19557,8 @@ "operator": "-", "right": { "type": "Identifier", - "start": 15858, - "end": 15867, + "start": 15860, + "end": 15869, "loc": { "start": { "line": 394, @@ -19574,14 +19574,14 @@ }, "extra": { "parenthesized": true, - "parenStart": 15844 + "parenStart": 15846 } }, "operator": "/", "right": { "type": "NumericLiteral", - "start": 15871, - "end": 15877, + "start": 15873, + "end": 15879, "loc": { "start": { "line": 394, @@ -19600,13 +19600,13 @@ }, "extra": { "parenthesized": true, - "parenStart": 15843 + "parenStart": 15845 } }, "property": { "type": "Identifier", - "start": 15879, - "end": 15886, + "start": 15881, + "end": 15888, "loc": { "start": { "line": 394, @@ -19625,8 +19625,8 @@ "arguments": [ { "type": "NumericLiteral", - "start": 15887, - "end": 15888, + "start": 15889, + "end": 15890, "loc": { "start": { "line": 394, @@ -19649,8 +19649,8 @@ }, { "type": "ExpressionStatement", - "start": 15911, - "end": 15938, + "start": 15913, + "end": 15940, "loc": { "start": { "line": 395, @@ -19663,8 +19663,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 15911, - "end": 15937, + "start": 15913, + "end": 15939, "loc": { "start": { "line": 395, @@ -19678,8 +19678,8 @@ "operator": "=", "left": { "type": "MemberExpression", - "start": 15911, - "end": 15921, + "start": 15913, + "end": 15923, "loc": { "start": { "line": 395, @@ -19692,8 +19692,8 @@ }, "object": { "type": "Identifier", - "start": 15911, - "end": 15916, + "start": 15913, + "end": 15918, "loc": { "start": { "line": 395, @@ -19709,8 +19709,8 @@ }, "property": { "type": "Identifier", - "start": 15917, - "end": 15921, + "start": 15919, + "end": 15923, "loc": { "start": { "line": 395, @@ -19728,8 +19728,8 @@ }, "right": { "type": "MemberExpression", - "start": 15924, - "end": 15937, + "start": 15926, + "end": 15939, "loc": { "start": { "line": 395, @@ -19742,8 +19742,8 @@ }, "object": { "type": "Identifier", - "start": 15924, - "end": 15932, + "start": 15926, + "end": 15934, "loc": { "start": { "line": 395, @@ -19759,8 +19759,8 @@ }, "property": { "type": "Identifier", - "start": 15933, - "end": 15937, + "start": 15935, + "end": 15939, "loc": { "start": { "line": 395, @@ -19780,8 +19780,8 @@ }, { "type": "ExpressionStatement", - "start": 15959, - "end": 16005, + "start": 15961, + "end": 16007, "loc": { "start": { "line": 396, @@ -19794,8 +19794,8 @@ }, "expression": { "type": "CallExpression", - "start": 15959, - "end": 16004, + "start": 15961, + "end": 16006, "loc": { "start": { "line": 396, @@ -19808,8 +19808,8 @@ }, "callee": { "type": "Identifier", - "start": 15959, - "end": 15962, + "start": 15961, + "end": 15964, "loc": { "start": { "line": 396, @@ -19826,8 +19826,8 @@ "arguments": [ { "type": "TemplateLiteral", - "start": 15963, - "end": 16003, + "start": 15965, + "end": 16005, "loc": { "start": { "line": 396, @@ -19841,8 +19841,8 @@ "expressions": [ { "type": "MemberExpression", - "start": 15985, - "end": 16001, + "start": 15987, + "end": 16003, "loc": { "start": { "line": 396, @@ -19855,8 +19855,8 @@ }, "object": { "type": "Identifier", - "start": 15985, - "end": 15990, + "start": 15987, + "end": 15992, "loc": { "start": { "line": 396, @@ -19872,8 +19872,8 @@ }, "property": { "type": "Identifier", - "start": 15991, - "end": 16001, + "start": 15993, + "end": 16003, "loc": { "start": { "line": 396, @@ -19893,8 +19893,8 @@ "quasis": [ { "type": "TemplateElement", - "start": 15964, - "end": 15983, + "start": 15966, + "end": 15985, "loc": { "start": { "line": 396, @@ -19913,8 +19913,8 @@ }, { "type": "TemplateElement", - "start": 16002, - "end": 16002, + "start": 16004, + "end": 16004, "loc": { "start": { "line": 396, @@ -19938,8 +19938,8 @@ }, { "type": "IfStatement", - "start": 16026, - "end": 16165, + "start": 16028, + "end": 16167, "loc": { "start": { "line": 397, @@ -19952,8 +19952,8 @@ }, "test": { "type": "Identifier", - "start": 16030, - "end": 16042, + "start": 16032, + "end": 16044, "loc": { "start": { "line": 397, @@ -19969,8 +19969,8 @@ }, "consequent": { "type": "BlockStatement", - "start": 16044, - "end": 16165, + "start": 16046, + "end": 16167, "loc": { "start": { "line": 397, @@ -19984,8 +19984,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 16070, - "end": 16143, + "start": 16072, + "end": 16145, "loc": { "start": { "line": 398, @@ -19998,8 +19998,8 @@ }, "expression": { "type": "CallExpression", - "start": 16070, - "end": 16142, + "start": 16072, + "end": 16144, "loc": { "start": { "line": 398, @@ -20012,8 +20012,8 @@ }, "callee": { "type": "Identifier", - "start": 16070, - "end": 16073, + "start": 16072, + "end": 16075, "loc": { "start": { "line": 398, @@ -20030,8 +20030,8 @@ "arguments": [ { "type": "BinaryExpression", - "start": 16074, - "end": 16141, + "start": 16076, + "end": 16143, "loc": { "start": { "line": 398, @@ -20044,8 +20044,8 @@ }, "left": { "type": "StringLiteral", - "start": 16074, - "end": 16091, + "start": 16076, + "end": 16093, "loc": { "start": { "line": 398, @@ -20065,8 +20065,8 @@ "operator": "+", "right": { "type": "ConditionalExpression", - "start": 16095, - "end": 16140, + "start": 16097, + "end": 16142, "loc": { "start": { "line": 398, @@ -20079,8 +20079,8 @@ }, "test": { "type": "Identifier", - "start": 16095, - "end": 16107, + "start": 16097, + "end": 16109, "loc": { "start": { "line": 398, @@ -20096,8 +20096,8 @@ }, "consequent": { "type": "Identifier", - "start": 16110, - "end": 16122, + "start": 16112, + "end": 16124, "loc": { "start": { "line": 398, @@ -20113,8 +20113,8 @@ }, "alternate": { "type": "StringLiteral", - "start": 16125, - "end": 16140, + "start": 16127, + "end": 16142, "loc": { "start": { "line": 398, @@ -20133,7 +20133,7 @@ }, "extra": { "parenthesized": true, - "parenStart": 16094 + "parenStart": 16096 } } } @@ -20147,8 +20147,8 @@ }, { "type": "IfStatement", - "start": 16186, - "end": 16326, + "start": 16188, + "end": 16328, "loc": { "start": { "line": 400, @@ -20161,8 +20161,8 @@ }, "test": { "type": "Identifier", - "start": 16190, - "end": 16202, + "start": 16192, + "end": 16204, "loc": { "start": { "line": 400, @@ -20178,8 +20178,8 @@ }, "consequent": { "type": "BlockStatement", - "start": 16204, - "end": 16326, + "start": 16206, + "end": 16328, "loc": { "start": { "line": 400, @@ -20193,8 +20193,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 16230, - "end": 16304, + "start": 16232, + "end": 16306, "loc": { "start": { "line": 401, @@ -20207,8 +20207,8 @@ }, "expression": { "type": "CallExpression", - "start": 16230, - "end": 16303, + "start": 16232, + "end": 16305, "loc": { "start": { "line": 401, @@ -20221,8 +20221,8 @@ }, "callee": { "type": "Identifier", - "start": 16230, - "end": 16233, + "start": 16232, + "end": 16235, "loc": { "start": { "line": 401, @@ -20239,8 +20239,8 @@ "arguments": [ { "type": "BinaryExpression", - "start": 16234, - "end": 16302, + "start": 16236, + "end": 16304, "loc": { "start": { "line": 401, @@ -20253,8 +20253,8 @@ }, "left": { "type": "StringLiteral", - "start": 16234, - "end": 16251, + "start": 16236, + "end": 16253, "loc": { "start": { "line": 401, @@ -20274,8 +20274,8 @@ "operator": "+", "right": { "type": "ConditionalExpression", - "start": 16255, - "end": 16301, + "start": 16257, + "end": 16303, "loc": { "start": { "line": 401, @@ -20288,8 +20288,8 @@ }, "test": { "type": "Identifier", - "start": 16255, - "end": 16267, + "start": 16257, + "end": 16269, "loc": { "start": { "line": 401, @@ -20305,8 +20305,8 @@ }, "consequent": { "type": "Identifier", - "start": 16270, - "end": 16282, + "start": 16272, + "end": 16284, "loc": { "start": { "line": 401, @@ -20322,8 +20322,8 @@ }, "alternate": { "type": "StringLiteral", - "start": 16285, - "end": 16301, + "start": 16287, + "end": 16303, "loc": { "start": { "line": 401, @@ -20342,7 +20342,7 @@ }, "extra": { "parenthesized": true, - "parenStart": 16254 + "parenStart": 16256 } } } @@ -20356,8 +20356,8 @@ }, { "type": "ExpressionStatement", - "start": 16347, - "end": 16389, + "start": 16349, + "end": 16391, "loc": { "start": { "line": 403, @@ -20370,8 +20370,8 @@ }, "expression": { "type": "CallExpression", - "start": 16347, - "end": 16388, + "start": 16349, + "end": 16390, "loc": { "start": { "line": 403, @@ -20384,8 +20384,8 @@ }, "callee": { "type": "Identifier", - "start": 16347, - "end": 16350, + "start": 16349, + "end": 16352, "loc": { "start": { "line": 403, @@ -20402,8 +20402,8 @@ "arguments": [ { "type": "BinaryExpression", - "start": 16351, - "end": 16387, + "start": 16353, + "end": 16389, "loc": { "start": { "line": 403, @@ -20416,8 +20416,8 @@ }, "left": { "type": "BinaryExpression", - "start": 16351, - "end": 16379, + "start": 16353, + "end": 16381, "loc": { "start": { "line": 403, @@ -20430,8 +20430,8 @@ }, "left": { "type": "StringLiteral", - "start": 16351, - "end": 16363, + "start": 16353, + "end": 16365, "loc": { "start": { "line": 403, @@ -20451,8 +20451,8 @@ "operator": "+", "right": { "type": "MemberExpression", - "start": 16366, - "end": 16379, + "start": 16368, + "end": 16381, "loc": { "start": { "line": 403, @@ -20465,8 +20465,8 @@ }, "object": { "type": "Identifier", - "start": 16366, - "end": 16371, + "start": 16368, + "end": 16373, "loc": { "start": { "line": 403, @@ -20482,8 +20482,8 @@ }, "property": { "type": "Identifier", - "start": 16372, - "end": 16379, + "start": 16374, + "end": 16381, "loc": { "start": { "line": 403, @@ -20503,8 +20503,8 @@ "operator": "+", "right": { "type": "StringLiteral", - "start": 16382, - "end": 16387, + "start": 16384, + "end": 16389, "loc": { "start": { "line": 403, @@ -20527,8 +20527,8 @@ }, { "type": "ExpressionStatement", - "start": 16410, - "end": 16485, + "start": 16412, + "end": 16487, "loc": { "start": { "line": 404, @@ -20541,8 +20541,8 @@ }, "expression": { "type": "CallExpression", - "start": 16410, - "end": 16484, + "start": 16412, + "end": 16486, "loc": { "start": { "line": 404, @@ -20555,8 +20555,8 @@ }, "callee": { "type": "Identifier", - "start": 16410, - "end": 16413, + "start": 16412, + "end": 16415, "loc": { "start": { "line": 404, @@ -20573,8 +20573,8 @@ "arguments": [ { "type": "BinaryExpression", - "start": 16414, - "end": 16483, + "start": 16416, + "end": 16485, "loc": { "start": { "line": 404, @@ -20587,8 +20587,8 @@ }, "left": { "type": "BinaryExpression", - "start": 16414, - "end": 16476, + "start": 16416, + "end": 16478, "loc": { "start": { "line": 404, @@ -20601,8 +20601,8 @@ }, "left": { "type": "StringLiteral", - "start": 16414, - "end": 16435, + "start": 16416, + "end": 16437, "loc": { "start": { "line": 404, @@ -20622,8 +20622,8 @@ "operator": "+", "right": { "type": "CallExpression", - "start": 16438, - "end": 16476, + "start": 16440, + "end": 16478, "loc": { "start": { "line": 404, @@ -20636,8 +20636,8 @@ }, "callee": { "type": "MemberExpression", - "start": 16438, - "end": 16473, + "start": 16440, + "end": 16475, "loc": { "start": { "line": 404, @@ -20650,8 +20650,8 @@ }, "object": { "type": "BinaryExpression", - "start": 16439, - "end": 16464, + "start": 16441, + "end": 16466, "loc": { "start": { "line": 404, @@ -20664,8 +20664,8 @@ }, "left": { "type": "MemberExpression", - "start": 16439, - "end": 16457, + "start": 16441, + "end": 16459, "loc": { "start": { "line": 404, @@ -20678,8 +20678,8 @@ }, "object": { "type": "Identifier", - "start": 16439, - "end": 16444, + "start": 16441, + "end": 16446, "loc": { "start": { "line": 404, @@ -20695,8 +20695,8 @@ }, "property": { "type": "Identifier", - "start": 16445, - "end": 16457, + "start": 16447, + "end": 16459, "loc": { "start": { "line": 404, @@ -20715,8 +20715,8 @@ "operator": "/", "right": { "type": "NumericLiteral", - "start": 16460, - "end": 16464, + "start": 16462, + "end": 16466, "loc": { "start": { "line": 404, @@ -20735,13 +20735,13 @@ }, "extra": { "parenthesized": true, - "parenStart": 16438 + "parenStart": 16440 } }, "property": { "type": "Identifier", - "start": 16466, - "end": 16473, + "start": 16468, + "end": 16475, "loc": { "start": { "line": 404, @@ -20760,8 +20760,8 @@ "arguments": [ { "type": "NumericLiteral", - "start": 16474, - "end": 16475, + "start": 16476, + "end": 16477, "loc": { "start": { "line": 404, @@ -20784,8 +20784,8 @@ "operator": "+", "right": { "type": "StringLiteral", - "start": 16479, - "end": 16483, + "start": 16481, + "end": 16485, "loc": { "start": { "line": 404, @@ -20808,8 +20808,8 @@ }, { "type": "ExpressionStatement", - "start": 16506, - "end": 16558, + "start": 16508, + "end": 16560, "loc": { "start": { "line": 405, @@ -20822,8 +20822,8 @@ }, "expression": { "type": "CallExpression", - "start": 16506, - "end": 16557, + "start": 16508, + "end": 16559, "loc": { "start": { "line": 405, @@ -20836,8 +20836,8 @@ }, "callee": { "type": "Identifier", - "start": 16506, - "end": 16509, + "start": 16508, + "end": 16511, "loc": { "start": { "line": 405, @@ -20854,8 +20854,8 @@ "arguments": [ { "type": "BinaryExpression", - "start": 16510, - "end": 16556, + "start": 16512, + "end": 16558, "loc": { "start": { "line": 405, @@ -20868,8 +20868,8 @@ }, "left": { "type": "StringLiteral", - "start": 16510, - "end": 16531, + "start": 16512, + "end": 16533, "loc": { "start": { "line": 405, @@ -20889,8 +20889,8 @@ "operator": "+", "right": { "type": "MemberExpression", - "start": 16534, - "end": 16556, + "start": 16536, + "end": 16558, "loc": { "start": { "line": 405, @@ -20903,8 +20903,8 @@ }, "object": { "type": "Identifier", - "start": 16534, - "end": 16539, + "start": 16536, + "end": 16541, "loc": { "start": { "line": 405, @@ -20920,8 +20920,8 @@ }, "property": { "type": "Identifier", - "start": 16540, - "end": 16556, + "start": 16542, + "end": 16558, "loc": { "start": { "line": 405, @@ -20943,8 +20943,8 @@ }, { "type": "ExpressionStatement", - "start": 16579, - "end": 16634, + "start": 16581, + "end": 16636, "loc": { "start": { "line": 406, @@ -20957,8 +20957,8 @@ }, "expression": { "type": "CallExpression", - "start": 16579, - "end": 16633, + "start": 16581, + "end": 16635, "loc": { "start": { "line": 406, @@ -20971,8 +20971,8 @@ }, "callee": { "type": "Identifier", - "start": 16579, - "end": 16582, + "start": 16581, + "end": 16584, "loc": { "start": { "line": 406, @@ -20989,8 +20989,8 @@ "arguments": [ { "type": "BinaryExpression", - "start": 16583, - "end": 16632, + "start": 16585, + "end": 16634, "loc": { "start": { "line": 406, @@ -21003,8 +21003,8 @@ }, "left": { "type": "BinaryExpression", - "start": 16583, - "end": 16625, + "start": 16585, + "end": 16627, "loc": { "start": { "line": 406, @@ -21017,8 +21017,8 @@ }, "left": { "type": "StringLiteral", - "start": 16583, - "end": 16602, + "start": 16585, + "end": 16604, "loc": { "start": { "line": 406, @@ -21038,8 +21038,8 @@ "operator": "+", "right": { "type": "MemberExpression", - "start": 16605, - "end": 16625, + "start": 16607, + "end": 16627, "loc": { "start": { "line": 406, @@ -21052,8 +21052,8 @@ }, "object": { "type": "Identifier", - "start": 16605, - "end": 16610, + "start": 16607, + "end": 16612, "loc": { "start": { "line": 406, @@ -21069,8 +21069,8 @@ }, "property": { "type": "Identifier", - "start": 16611, - "end": 16625, + "start": 16613, + "end": 16627, "loc": { "start": { "line": 406, @@ -21090,8 +21090,8 @@ "operator": "+", "right": { "type": "StringLiteral", - "start": 16628, - "end": 16632, + "start": 16630, + "end": 16634, "loc": { "start": { "line": 406, @@ -21114,8 +21114,8 @@ }, { "type": "ExpressionStatement", - "start": 16655, - "end": 16709, + "start": 16657, + "end": 16711, "loc": { "start": { "line": 407, @@ -21128,8 +21128,8 @@ }, "expression": { "type": "CallExpression", - "start": 16655, - "end": 16708, + "start": 16657, + "end": 16710, "loc": { "start": { "line": 407, @@ -21142,8 +21142,8 @@ }, "callee": { "type": "Identifier", - "start": 16655, - "end": 16658, + "start": 16657, + "end": 16660, "loc": { "start": { "line": 407, @@ -21160,8 +21160,8 @@ "arguments": [ { "type": "BinaryExpression", - "start": 16659, - "end": 16707, + "start": 16661, + "end": 16709, "loc": { "start": { "line": 407, @@ -21174,8 +21174,8 @@ }, "left": { "type": "StringLiteral", - "start": 16659, - "end": 16684, + "start": 16661, + "end": 16686, "loc": { "start": { "line": 407, @@ -21195,8 +21195,8 @@ "operator": "+", "right": { "type": "MemberExpression", - "start": 16687, - "end": 16707, + "start": 16689, + "end": 16709, "loc": { "start": { "line": 407, @@ -21209,8 +21209,8 @@ }, "object": { "type": "Identifier", - "start": 16687, - "end": 16692, + "start": 16689, + "end": 16694, "loc": { "start": { "line": 407, @@ -21226,8 +21226,8 @@ }, "property": { "type": "Identifier", - "start": 16693, - "end": 16707, + "start": 16695, + "end": 16709, "loc": { "start": { "line": 407, @@ -21249,8 +21249,8 @@ }, { "type": "ExpressionStatement", - "start": 16730, - "end": 16787, + "start": 16732, + "end": 16789, "loc": { "start": { "line": 408, @@ -21263,8 +21263,8 @@ }, "expression": { "type": "CallExpression", - "start": 16730, - "end": 16786, + "start": 16732, + "end": 16788, "loc": { "start": { "line": 408, @@ -21277,8 +21277,8 @@ }, "callee": { "type": "Identifier", - "start": 16730, - "end": 16733, + "start": 16732, + "end": 16735, "loc": { "start": { "line": 408, @@ -21295,8 +21295,8 @@ "arguments": [ { "type": "BinaryExpression", - "start": 16734, - "end": 16785, + "start": 16736, + "end": 16787, "loc": { "start": { "line": 408, @@ -21309,8 +21309,8 @@ }, "left": { "type": "StringLiteral", - "start": 16734, - "end": 16761, + "start": 16736, + "end": 16763, "loc": { "start": { "line": 408, @@ -21330,8 +21330,8 @@ "operator": "+", "right": { "type": "MemberExpression", - "start": 16764, - "end": 16785, + "start": 16766, + "end": 16787, "loc": { "start": { "line": 408, @@ -21344,8 +21344,8 @@ }, "object": { "type": "Identifier", - "start": 16764, - "end": 16769, + "start": 16766, + "end": 16771, "loc": { "start": { "line": 408, @@ -21361,8 +21361,8 @@ }, "property": { "type": "Identifier", - "start": 16770, - "end": 16785, + "start": 16772, + "end": 16787, "loc": { "start": { "line": 408, @@ -21384,8 +21384,8 @@ }, { "type": "ExpressionStatement", - "start": 16808, - "end": 16863, + "start": 16810, + "end": 16865, "loc": { "start": { "line": 409, @@ -21398,8 +21398,8 @@ }, "expression": { "type": "CallExpression", - "start": 16808, - "end": 16862, + "start": 16810, + "end": 16864, "loc": { "start": { "line": 409, @@ -21412,8 +21412,8 @@ }, "callee": { "type": "Identifier", - "start": 16808, - "end": 16811, + "start": 16810, + "end": 16813, "loc": { "start": { "line": 409, @@ -21430,8 +21430,8 @@ "arguments": [ { "type": "BinaryExpression", - "start": 16812, - "end": 16861, + "start": 16814, + "end": 16863, "loc": { "start": { "line": 409, @@ -21444,8 +21444,8 @@ }, "left": { "type": "StringLiteral", - "start": 16812, - "end": 16842, + "start": 16814, + "end": 16844, "loc": { "start": { "line": 409, @@ -21465,8 +21465,8 @@ "operator": "+", "right": { "type": "MemberExpression", - "start": 16845, - "end": 16861, + "start": 16847, + "end": 16863, "loc": { "start": { "line": 409, @@ -21479,8 +21479,8 @@ }, "object": { "type": "Identifier", - "start": 16845, - "end": 16850, + "start": 16847, + "end": 16852, "loc": { "start": { "line": 409, @@ -21496,8 +21496,8 @@ }, "property": { "type": "Identifier", - "start": 16851, - "end": 16861, + "start": 16853, + "end": 16863, "loc": { "start": { "line": 409, @@ -21519,8 +21519,8 @@ }, { "type": "ExpressionStatement", - "start": 16884, - "end": 16936, + "start": 16886, + "end": 16938, "loc": { "start": { "line": 410, @@ -21533,8 +21533,8 @@ }, "expression": { "type": "CallExpression", - "start": 16884, - "end": 16935, + "start": 16886, + "end": 16937, "loc": { "start": { "line": 410, @@ -21547,8 +21547,8 @@ }, "callee": { "type": "Identifier", - "start": 16884, - "end": 16887, + "start": 16886, + "end": 16889, "loc": { "start": { "line": 410, @@ -21565,8 +21565,8 @@ "arguments": [ { "type": "BinaryExpression", - "start": 16888, - "end": 16934, + "start": 16890, + "end": 16936, "loc": { "start": { "line": 410, @@ -21579,8 +21579,8 @@ }, "left": { "type": "StringLiteral", - "start": 16888, - "end": 16912, + "start": 16890, + "end": 16914, "loc": { "start": { "line": 410, @@ -21600,8 +21600,8 @@ "operator": "+", "right": { "type": "MemberExpression", - "start": 16915, - "end": 16934, + "start": 16917, + "end": 16936, "loc": { "start": { "line": 410, @@ -21614,8 +21614,8 @@ }, "object": { "type": "Identifier", - "start": 16915, - "end": 16920, + "start": 16917, + "end": 16922, "loc": { "start": { "line": 410, @@ -21631,8 +21631,8 @@ }, "property": { "type": "Identifier", - "start": 16921, - "end": 16934, + "start": 16923, + "end": 16936, "loc": { "start": { "line": 410, @@ -21654,8 +21654,8 @@ }, { "type": "ExpressionStatement", - "start": 16957, - "end": 17005, + "start": 16959, + "end": 17007, "loc": { "start": { "line": 411, @@ -21668,8 +21668,8 @@ }, "expression": { "type": "CallExpression", - "start": 16957, - "end": 17004, + "start": 16959, + "end": 17006, "loc": { "start": { "line": 411, @@ -21682,8 +21682,8 @@ }, "callee": { "type": "Identifier", - "start": 16957, - "end": 16960, + "start": 16959, + "end": 16962, "loc": { "start": { "line": 411, @@ -21700,8 +21700,8 @@ "arguments": [ { "type": "BinaryExpression", - "start": 16961, - "end": 17003, + "start": 16963, + "end": 17005, "loc": { "start": { "line": 411, @@ -21714,8 +21714,8 @@ }, "left": { "type": "StringLiteral", - "start": 16961, - "end": 16983, + "start": 16963, + "end": 16985, "loc": { "start": { "line": 411, @@ -21735,8 +21735,8 @@ "operator": "+", "right": { "type": "MemberExpression", - "start": 16986, - "end": 17003, + "start": 16988, + "end": 17005, "loc": { "start": { "line": 411, @@ -21749,8 +21749,8 @@ }, "object": { "type": "Identifier", - "start": 16986, - "end": 16991, + "start": 16988, + "end": 16993, "loc": { "start": { "line": 411, @@ -21766,8 +21766,8 @@ }, "property": { "type": "Identifier", - "start": 16992, - "end": 17003, + "start": 16994, + "end": 17005, "loc": { "start": { "line": 411, @@ -21789,8 +21789,8 @@ }, { "type": "ExpressionStatement", - "start": 17026, - "end": 17080, + "start": 17028, + "end": 17082, "loc": { "start": { "line": 412, @@ -21803,8 +21803,8 @@ }, "expression": { "type": "CallExpression", - "start": 17026, - "end": 17079, + "start": 17028, + "end": 17081, "loc": { "start": { "line": 412, @@ -21817,8 +21817,8 @@ }, "callee": { "type": "Identifier", - "start": 17026, - "end": 17029, + "start": 17028, + "end": 17031, "loc": { "start": { "line": 412, @@ -21835,8 +21835,8 @@ "arguments": [ { "type": "BinaryExpression", - "start": 17030, - "end": 17078, + "start": 17032, + "end": 17080, "loc": { "start": { "line": 412, @@ -21849,8 +21849,8 @@ }, "left": { "type": "StringLiteral", - "start": 17030, - "end": 17055, + "start": 17032, + "end": 17057, "loc": { "start": { "line": 412, @@ -21870,8 +21870,8 @@ "operator": "+", "right": { "type": "MemberExpression", - "start": 17058, - "end": 17078, + "start": 17060, + "end": 17080, "loc": { "start": { "line": 412, @@ -21884,8 +21884,8 @@ }, "object": { "type": "Identifier", - "start": 17058, - "end": 17063, + "start": 17060, + "end": 17065, "loc": { "start": { "line": 412, @@ -21901,8 +21901,8 @@ }, "property": { "type": "Identifier", - "start": 17064, - "end": 17078, + "start": 17066, + "end": 17080, "loc": { "start": { "line": 412, @@ -21924,8 +21924,8 @@ }, { "type": "ExpressionStatement", - "start": 17101, - "end": 17151, + "start": 17103, + "end": 17153, "loc": { "start": { "line": 413, @@ -21938,8 +21938,8 @@ }, "expression": { "type": "CallExpression", - "start": 17101, - "end": 17150, + "start": 17103, + "end": 17152, "loc": { "start": { "line": 413, @@ -21952,8 +21952,8 @@ }, "callee": { "type": "Identifier", - "start": 17101, - "end": 17104, + "start": 17103, + "end": 17106, "loc": { "start": { "line": 413, @@ -21970,8 +21970,8 @@ "arguments": [ { "type": "BinaryExpression", - "start": 17105, - "end": 17149, + "start": 17107, + "end": 17151, "loc": { "start": { "line": 413, @@ -21984,8 +21984,8 @@ }, "left": { "type": "StringLiteral", - "start": 17105, - "end": 17128, + "start": 17107, + "end": 17130, "loc": { "start": { "line": 413, @@ -22005,8 +22005,8 @@ "operator": "+", "right": { "type": "MemberExpression", - "start": 17131, - "end": 17149, + "start": 17133, + "end": 17151, "loc": { "start": { "line": 413, @@ -22019,8 +22019,8 @@ }, "object": { "type": "Identifier", - "start": 17131, - "end": 17136, + "start": 17133, + "end": 17138, "loc": { "start": { "line": 413, @@ -22036,8 +22036,8 @@ }, "property": { "type": "Identifier", - "start": 17137, - "end": 17149, + "start": 17139, + "end": 17151, "loc": { "start": { "line": 413, @@ -22059,8 +22059,8 @@ }, { "type": "ExpressionStatement", - "start": 17172, - "end": 17220, + "start": 17174, + "end": 17222, "loc": { "start": { "line": 414, @@ -22073,8 +22073,8 @@ }, "expression": { "type": "CallExpression", - "start": 17172, - "end": 17219, + "start": 17174, + "end": 17221, "loc": { "start": { "line": 414, @@ -22087,8 +22087,8 @@ }, "callee": { "type": "Identifier", - "start": 17172, - "end": 17175, + "start": 17174, + "end": 17177, "loc": { "start": { "line": 414, @@ -22105,8 +22105,8 @@ "arguments": [ { "type": "BinaryExpression", - "start": 17176, - "end": 17218, + "start": 17178, + "end": 17220, "loc": { "start": { "line": 414, @@ -22119,8 +22119,8 @@ }, "left": { "type": "StringLiteral", - "start": 17176, - "end": 17198, + "start": 17178, + "end": 17200, "loc": { "start": { "line": 414, @@ -22140,8 +22140,8 @@ "operator": "+", "right": { "type": "MemberExpression", - "start": 17201, - "end": 17218, + "start": 17203, + "end": 17220, "loc": { "start": { "line": 414, @@ -22154,8 +22154,8 @@ }, "object": { "type": "Identifier", - "start": 17201, - "end": 17206, + "start": 17203, + "end": 17208, "loc": { "start": { "line": 414, @@ -22171,8 +22171,8 @@ }, "property": { "type": "Identifier", - "start": 17207, - "end": 17218, + "start": 17209, + "end": 17220, "loc": { "start": { "line": 414, @@ -22194,8 +22194,8 @@ }, { "type": "ExpressionStatement", - "start": 17241, - "end": 17279, + "start": 17243, + "end": 17281, "loc": { "start": { "line": 415, @@ -22208,8 +22208,8 @@ }, "expression": { "type": "CallExpression", - "start": 17241, - "end": 17278, + "start": 17243, + "end": 17280, "loc": { "start": { "line": 415, @@ -22222,8 +22222,8 @@ }, "callee": { "type": "Identifier", - "start": 17241, - "end": 17244, + "start": 17243, + "end": 17246, "loc": { "start": { "line": 415, @@ -22240,8 +22240,8 @@ "arguments": [ { "type": "BinaryExpression", - "start": 17245, - "end": 17277, + "start": 17247, + "end": 17279, "loc": { "start": { "line": 415, @@ -22254,8 +22254,8 @@ }, "left": { "type": "StringLiteral", - "start": 17245, - "end": 17262, + "start": 17247, + "end": 17264, "loc": { "start": { "line": 415, @@ -22275,8 +22275,8 @@ "operator": "+", "right": { "type": "MemberExpression", - "start": 17265, - "end": 17277, + "start": 17267, + "end": 17279, "loc": { "start": { "line": 415, @@ -22289,8 +22289,8 @@ }, "object": { "type": "Identifier", - "start": 17265, - "end": 17270, + "start": 17267, + "end": 17272, "loc": { "start": { "line": 415, @@ -22306,8 +22306,8 @@ }, "property": { "type": "Identifier", - "start": 17271, - "end": 17277, + "start": 17273, + "end": 17279, "loc": { "start": { "line": 415, @@ -22329,8 +22329,8 @@ }, { "type": "ExpressionStatement", - "start": 17300, - "end": 17346, + "start": 17302, + "end": 17348, "loc": { "start": { "line": 416, @@ -22343,8 +22343,8 @@ }, "expression": { "type": "CallExpression", - "start": 17300, - "end": 17345, + "start": 17302, + "end": 17347, "loc": { "start": { "line": 416, @@ -22357,8 +22357,8 @@ }, "callee": { "type": "Identifier", - "start": 17300, - "end": 17303, + "start": 17302, + "end": 17305, "loc": { "start": { "line": 416, @@ -22375,8 +22375,8 @@ "arguments": [ { "type": "BinaryExpression", - "start": 17304, - "end": 17344, + "start": 17306, + "end": 17346, "loc": { "start": { "line": 416, @@ -22389,8 +22389,8 @@ }, "left": { "type": "StringLiteral", - "start": 17304, - "end": 17325, + "start": 17306, + "end": 17327, "loc": { "start": { "line": 416, @@ -22410,8 +22410,8 @@ "operator": "+", "right": { "type": "MemberExpression", - "start": 17328, - "end": 17344, + "start": 17330, + "end": 17346, "loc": { "start": { "line": 416, @@ -22424,8 +22424,8 @@ }, "object": { "type": "Identifier", - "start": 17328, - "end": 17333, + "start": 17330, + "end": 17335, "loc": { "start": { "line": 416, @@ -22441,8 +22441,8 @@ }, "property": { "type": "Identifier", - "start": 17334, - "end": 17344, + "start": 17336, + "end": 17346, "loc": { "start": { "line": 416, @@ -22464,8 +22464,8 @@ }, { "type": "ExpressionStatement", - "start": 17367, - "end": 17420, + "start": 17369, + "end": 17422, "loc": { "start": { "line": 417, @@ -22478,8 +22478,8 @@ }, "expression": { "type": "CallExpression", - "start": 17367, - "end": 17419, + "start": 17369, + "end": 17421, "loc": { "start": { "line": 417, @@ -22492,8 +22492,8 @@ }, "callee": { "type": "Identifier", - "start": 17367, - "end": 17370, + "start": 17369, + "end": 17372, "loc": { "start": { "line": 417, @@ -22510,8 +22510,8 @@ "arguments": [ { "type": "BinaryExpression", - "start": 17371, - "end": 17418, + "start": 17373, + "end": 17420, "loc": { "start": { "line": 417, @@ -22524,8 +22524,8 @@ }, "left": { "type": "StringLiteral", - "start": 17371, - "end": 17390, + "start": 17373, + "end": 17392, "loc": { "start": { "line": 417, @@ -22545,8 +22545,8 @@ "operator": "+", "right": { "type": "MemberExpression", - "start": 17393, - "end": 17418, + "start": 17395, + "end": 17420, "loc": { "start": { "line": 417, @@ -22559,8 +22559,8 @@ }, "object": { "type": "MemberExpression", - "start": 17393, - "end": 17411, + "start": 17395, + "end": 17413, "loc": { "start": { "line": 417, @@ -22573,8 +22573,8 @@ }, "object": { "type": "Identifier", - "start": 17393, - "end": 17401, + "start": 17395, + "end": 17403, "loc": { "start": { "line": 417, @@ -22590,8 +22590,8 @@ }, "property": { "type": "Identifier", - "start": 17402, - "end": 17411, + "start": 17404, + "end": 17413, "loc": { "start": { "line": 417, @@ -22609,8 +22609,8 @@ }, "property": { "type": "Identifier", - "start": 17412, - "end": 17418, + "start": 17414, + "end": 17420, "loc": { "start": { "line": 417, @@ -22632,8 +22632,8 @@ }, { "type": "ExpressionStatement", - "start": 17441, - "end": 17482, + "start": 17443, + "end": 17484, "loc": { "start": { "line": 418, @@ -22646,8 +22646,8 @@ }, "expression": { "type": "CallExpression", - "start": 17441, - "end": 17481, + "start": 17443, + "end": 17483, "loc": { "start": { "line": 418, @@ -22660,8 +22660,8 @@ }, "callee": { "type": "Identifier", - "start": 17441, - "end": 17444, + "start": 17443, + "end": 17446, "loc": { "start": { "line": 418, @@ -22678,8 +22678,8 @@ "arguments": [ { "type": "BinaryExpression", - "start": 17445, - "end": 17480, + "start": 17447, + "end": 17482, "loc": { "start": { "line": 418, @@ -22692,8 +22692,8 @@ }, "left": { "type": "StringLiteral", - "start": 17445, - "end": 17460, + "start": 17447, + "end": 17462, "loc": { "start": { "line": 418, @@ -22713,8 +22713,8 @@ "operator": "+", "right": { "type": "MemberExpression", - "start": 17463, - "end": 17480, + "start": 17465, + "end": 17482, "loc": { "start": { "line": 418, @@ -22727,8 +22727,8 @@ }, "object": { "type": "Identifier", - "start": 17463, - "end": 17468, + "start": 17465, + "end": 17470, "loc": { "start": { "line": 418, @@ -22744,8 +22744,8 @@ }, "property": { "type": "Identifier", - "start": 17469, - "end": 17480, + "start": 17471, + "end": 17482, "loc": { "start": { "line": 418, @@ -22767,8 +22767,8 @@ }, { "type": "IfStatement", - "start": 17504, - "end": 17900, + "start": 17506, + "end": 17902, "loc": { "start": { "line": 420, @@ -22781,8 +22781,8 @@ }, "test": { "type": "Identifier", - "start": 17508, - "end": 17514, + "start": 17510, + "end": 17516, "loc": { "start": { "line": 420, @@ -22798,8 +22798,8 @@ }, "consequent": { "type": "BlockStatement", - "start": 17516, - "end": 17900, + "start": 17518, + "end": 17902, "loc": { "start": { "line": 420, @@ -22813,8 +22813,8 @@ "body": [ { "type": "VariableDeclaration", - "start": 17542, - "end": 17581, + "start": 17544, + "end": 17583, "loc": { "start": { "line": 421, @@ -22828,8 +22828,8 @@ "declarations": [ { "type": "VariableDeclarator", - "start": 17548, - "end": 17580, + "start": 17550, + "end": 17582, "loc": { "start": { "line": 421, @@ -22842,8 +22842,8 @@ }, "id": { "type": "Identifier", - "start": 17548, - "end": 17557, + "start": 17550, + "end": 17559, "loc": { "start": { "line": 421, @@ -22859,8 +22859,8 @@ }, "init": { "type": "CallExpression", - "start": 17560, - "end": 17580, + "start": 17562, + "end": 17582, "loc": { "start": { "line": 421, @@ -22873,8 +22873,8 @@ }, "callee": { "type": "MemberExpression", - "start": 17560, - "end": 17572, + "start": 17562, + "end": 17574, "loc": { "start": { "line": 421, @@ -22887,8 +22887,8 @@ }, "object": { "type": "Identifier", - "start": 17560, - "end": 17564, + "start": 17562, + "end": 17566, "loc": { "start": { "line": 421, @@ -22904,8 +22904,8 @@ }, "property": { "type": "Identifier", - "start": 17565, - "end": 17572, + "start": 17567, + "end": 17574, "loc": { "start": { "line": 421, @@ -22924,8 +22924,8 @@ "arguments": [ { "type": "Identifier", - "start": 17573, - "end": 17579, + "start": 17575, + "end": 17581, "loc": { "start": { "line": 421, @@ -22947,8 +22947,8 @@ }, { "type": "IfStatement", - "start": 17606, - "end": 17756, + "start": 17608, + "end": 17758, "loc": { "start": { "line": 422, @@ -22961,8 +22961,8 @@ }, "test": { "type": "LogicalExpression", - "start": 17610, - "end": 17655, + "start": 17612, + "end": 17657, "loc": { "start": { "line": 422, @@ -22975,8 +22975,8 @@ }, "left": { "type": "BinaryExpression", - "start": 17610, - "end": 17626, + "start": 17612, + "end": 17628, "loc": { "start": { "line": 422, @@ -22989,8 +22989,8 @@ }, "left": { "type": "Identifier", - "start": 17610, - "end": 17619, + "start": 17612, + "end": 17621, "loc": { "start": { "line": 422, @@ -23007,8 +23007,8 @@ "operator": "!==", "right": { "type": "StringLiteral", - "start": 17624, - "end": 17626, + "start": 17626, + "end": 17628, "loc": { "start": { "line": 422, @@ -23029,8 +23029,8 @@ "operator": "&&", "right": { "type": "UnaryExpression", - "start": 17630, - "end": 17655, + "start": 17632, + "end": 17657, "loc": { "start": { "line": 422, @@ -23045,8 +23045,8 @@ "prefix": true, "argument": { "type": "CallExpression", - "start": 17631, - "end": 17655, + "start": 17633, + "end": 17657, "loc": { "start": { "line": 422, @@ -23059,8 +23059,8 @@ }, "callee": { "type": "MemberExpression", - "start": 17631, - "end": 17644, + "start": 17633, + "end": 17646, "loc": { "start": { "line": 422, @@ -23073,8 +23073,8 @@ }, "object": { "type": "Identifier", - "start": 17631, - "end": 17633, + "start": 17633, + "end": 17635, "loc": { "start": { "line": 422, @@ -23090,8 +23090,8 @@ }, "property": { "type": "Identifier", - "start": 17634, - "end": 17644, + "start": 17636, + "end": 17646, "loc": { "start": { "line": 422, @@ -23110,8 +23110,8 @@ "arguments": [ { "type": "Identifier", - "start": 17645, - "end": 17654, + "start": 17647, + "end": 17656, "loc": { "start": { "line": 422, @@ -23134,8 +23134,8 @@ }, "consequent": { "type": "BlockStatement", - "start": 17657, - "end": 17756, + "start": 17659, + "end": 17758, "loc": { "start": { "line": 422, @@ -23149,8 +23149,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 17687, - "end": 17730, + "start": 17689, + "end": 17732, "loc": { "start": { "line": 423, @@ -23163,8 +23163,8 @@ }, "expression": { "type": "CallExpression", - "start": 17687, - "end": 17729, + "start": 17689, + "end": 17731, "loc": { "start": { "line": 423, @@ -23177,8 +23177,8 @@ }, "callee": { "type": "MemberExpression", - "start": 17687, - "end": 17699, + "start": 17689, + "end": 17701, "loc": { "start": { "line": 423, @@ -23191,8 +23191,8 @@ }, "object": { "type": "Identifier", - "start": 17687, - "end": 17689, + "start": 17689, + "end": 17691, "loc": { "start": { "line": 423, @@ -23208,8 +23208,8 @@ }, "property": { "type": "Identifier", - "start": 17690, - "end": 17699, + "start": 17692, + "end": 17701, "loc": { "start": { "line": 423, @@ -23228,8 +23228,8 @@ "arguments": [ { "type": "Identifier", - "start": 17700, - "end": 17709, + "start": 17702, + "end": 17711, "loc": { "start": { "line": 423, @@ -23245,8 +23245,8 @@ }, { "type": "ObjectExpression", - "start": 17711, - "end": 17728, + "start": 17713, + "end": 17730, "loc": { "start": { "line": 423, @@ -23260,8 +23260,8 @@ "properties": [ { "type": "ObjectProperty", - "start": 17712, - "end": 17727, + "start": 17714, + "end": 17729, "loc": { "start": { "line": 423, @@ -23277,8 +23277,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 17712, - "end": 17721, + "start": 17714, + "end": 17723, "loc": { "start": { "line": 423, @@ -23294,8 +23294,8 @@ }, "value": { "type": "BooleanLiteral", - "start": 17723, - "end": 17727, + "start": 17725, + "end": 17729, "loc": { "start": { "line": 423, @@ -23321,8 +23321,8 @@ }, { "type": "ExpressionStatement", - "start": 17781, - "end": 17816, + "start": 17783, + "end": 17818, "loc": { "start": { "line": 425, @@ -23335,8 +23335,8 @@ }, "expression": { "type": "CallExpression", - "start": 17781, - "end": 17815, + "start": 17783, + "end": 17817, "loc": { "start": { "line": 425, @@ -23349,8 +23349,8 @@ }, "callee": { "type": "Identifier", - "start": 17781, - "end": 17784, + "start": 17783, + "end": 17786, "loc": { "start": { "line": 425, @@ -23367,8 +23367,8 @@ "arguments": [ { "type": "BinaryExpression", - "start": 17785, - "end": 17814, + "start": 17787, + "end": 17816, "loc": { "start": { "line": 425, @@ -23381,8 +23381,8 @@ }, "left": { "type": "StringLiteral", - "start": 17785, - "end": 17805, + "start": 17787, + "end": 17807, "loc": { "start": { "line": 425, @@ -23402,8 +23402,8 @@ "operator": "+", "right": { "type": "Identifier", - "start": 17808, - "end": 17814, + "start": 17810, + "end": 17816, "loc": { "start": { "line": 425, @@ -23423,8 +23423,8 @@ }, { "type": "ExpressionStatement", - "start": 17841, - "end": 17878, + "start": 17843, + "end": 17880, "loc": { "start": { "line": 426, @@ -23437,8 +23437,8 @@ }, "expression": { "type": "CallExpression", - "start": 17841, - "end": 17877, + "start": 17843, + "end": 17879, "loc": { "start": { "line": 426, @@ -23451,8 +23451,8 @@ }, "callee": { "type": "MemberExpression", - "start": 17841, - "end": 17857, + "start": 17843, + "end": 17859, "loc": { "start": { "line": 426, @@ -23465,8 +23465,8 @@ }, "object": { "type": "Identifier", - "start": 17841, - "end": 17843, + "start": 17843, + "end": 17845, "loc": { "start": { "line": 426, @@ -23482,8 +23482,8 @@ }, "property": { "type": "Identifier", - "start": 17844, - "end": 17857, + "start": 17846, + "end": 17859, "loc": { "start": { "line": 426, @@ -23502,8 +23502,8 @@ "arguments": [ { "type": "Identifier", - "start": 17858, - "end": 17864, + "start": 17860, + "end": 17866, "loc": { "start": { "line": 426, @@ -23519,8 +23519,8 @@ }, { "type": "Identifier", - "start": 17866, - "end": 17876, + "start": 17868, + "end": 17878, "loc": { "start": { "line": 426, @@ -23544,8 +23544,8 @@ }, { "type": "IfStatement", - "start": 17922, - "end": 18015, + "start": 17924, + "end": 18017, "loc": { "start": { "line": 429, @@ -23558,8 +23558,8 @@ }, "test": { "type": "Identifier", - "start": 17926, - "end": 17940, + "start": 17928, + "end": 17942, "loc": { "start": { "line": 429, @@ -23575,8 +23575,8 @@ }, "consequent": { "type": "BlockStatement", - "start": 17942, - "end": 18015, + "start": 17944, + "end": 18017, "loc": { "start": { "line": 429, @@ -23590,8 +23590,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 17968, - "end": 17993, + "start": 17970, + "end": 17995, "loc": { "start": { "line": 430, @@ -23604,8 +23604,8 @@ }, "expression": { "type": "CallExpression", - "start": 17968, - "end": 17992, + "start": 17970, + "end": 17994, "loc": { "start": { "line": 430, @@ -23618,8 +23618,8 @@ }, "callee": { "type": "Identifier", - "start": 17968, - "end": 17982, + "start": 17970, + "end": 17984, "loc": { "start": { "line": 430, @@ -23636,8 +23636,8 @@ "arguments": [ { "type": "Identifier", - "start": 17983, - "end": 17991, + "start": 17985, + "end": 17993, "loc": { "start": { "line": 430, @@ -23661,8 +23661,8 @@ }, { "type": "IfStatement", - "start": 18037, - "end": 18122, + "start": 18039, + "end": 18124, "loc": { "start": { "line": 433, @@ -23675,8 +23675,8 @@ }, "test": { "type": "Identifier", - "start": 18041, - "end": 18050, + "start": 18043, + "end": 18052, "loc": { "start": { "line": 433, @@ -23692,8 +23692,8 @@ }, "consequent": { "type": "BlockStatement", - "start": 18052, - "end": 18122, + "start": 18054, + "end": 18124, "loc": { "start": { "line": 433, @@ -23707,8 +23707,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 18078, - "end": 18100, + "start": 18080, + "end": 18102, "loc": { "start": { "line": 434, @@ -23721,8 +23721,8 @@ }, "expression": { "type": "CallExpression", - "start": 18078, - "end": 18099, + "start": 18080, + "end": 18101, "loc": { "start": { "line": 434, @@ -23735,8 +23735,8 @@ }, "callee": { "type": "Identifier", - "start": 18078, - "end": 18087, + "start": 18080, + "end": 18089, "loc": { "start": { "line": 434, @@ -23753,8 +23753,8 @@ "arguments": [ { "type": "Identifier", - "start": 18088, - "end": 18098, + "start": 18090, + "end": 18100, "loc": { "start": { "line": 434, @@ -23778,8 +23778,8 @@ }, { "type": "IfStatement", - "start": 18144, - "end": 18228, + "start": 18146, + "end": 18230, "loc": { "start": { "line": 437, @@ -23792,8 +23792,8 @@ }, "test": { "type": "Identifier", - "start": 18148, - "end": 18159, + "start": 18150, + "end": 18161, "loc": { "start": { "line": 437, @@ -23809,8 +23809,8 @@ }, "consequent": { "type": "BlockStatement", - "start": 18161, - "end": 18228, + "start": 18163, + "end": 18230, "loc": { "start": { "line": 437, @@ -23824,8 +23824,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 18187, - "end": 18206, + "start": 18189, + "end": 18208, "loc": { "start": { "line": 438, @@ -23838,8 +23838,8 @@ }, "expression": { "type": "CallExpression", - "start": 18187, - "end": 18205, + "start": 18189, + "end": 18207, "loc": { "start": { "line": 438, @@ -23852,8 +23852,8 @@ }, "callee": { "type": "Identifier", - "start": 18187, - "end": 18198, + "start": 18189, + "end": 18200, "loc": { "start": { "line": 438, @@ -23870,8 +23870,8 @@ "arguments": [ { "type": "Identifier", - "start": 18199, - "end": 18204, + "start": 18201, + "end": 18206, "loc": { "start": { "line": 438, @@ -23895,8 +23895,8 @@ }, { "type": "ExpressionStatement", - "start": 18250, - "end": 18260, + "start": 18252, + "end": 18262, "loc": { "start": { "line": 441, @@ -23909,8 +23909,8 @@ }, "expression": { "type": "CallExpression", - "start": 18250, - "end": 18259, + "start": 18252, + "end": 18261, "loc": { "start": { "line": 441, @@ -23923,8 +23923,8 @@ }, "callee": { "type": "Identifier", - "start": 18250, - "end": 18257, + "start": 18252, + "end": 18259, "loc": { "start": { "line": 441, @@ -23954,8 +23954,8 @@ }, { "type": "ArrowFunctionExpression", - "start": 18296, - "end": 18349, + "start": 18298, + "end": 18351, "loc": { "start": { "line": 443, @@ -23973,8 +23973,8 @@ "params": [ { "type": "Identifier", - "start": 18297, - "end": 18300, + "start": 18299, + "end": 18302, "loc": { "start": { "line": 443, @@ -23991,8 +23991,8 @@ ], "body": { "type": "BlockStatement", - "start": 18305, - "end": 18349, + "start": 18307, + "end": 18351, "loc": { "start": { "line": 443, @@ -24006,8 +24006,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 18323, - "end": 18335, + "start": 18325, + "end": 18337, "loc": { "start": { "line": 444, @@ -24020,8 +24020,8 @@ }, "expression": { "type": "CallExpression", - "start": 18323, - "end": 18334, + "start": 18325, + "end": 18336, "loc": { "start": { "line": 444, @@ -24034,8 +24034,8 @@ }, "callee": { "type": "Identifier", - "start": 18323, - "end": 18329, + "start": 18325, + "end": 18331, "loc": { "start": { "line": 444, @@ -24052,8 +24052,8 @@ "arguments": [ { "type": "Identifier", - "start": 18330, - "end": 18333, + "start": 18332, + "end": 18335, "loc": { "start": { "line": 444, @@ -24097,8 +24097,8 @@ }, { "type": "ExportNamedDeclaration", - "start": 18373, - "end": 18394, + "start": 18375, + "end": 18396, "loc": { "start": { "line": 450, @@ -24113,8 +24113,8 @@ "specifiers": [ { "type": "ExportSpecifier", - "start": 18381, - "end": 18392, + "start": 18383, + "end": 18394, "loc": { "start": { "line": 450, @@ -24127,8 +24127,8 @@ }, "local": { "type": "Identifier", - "start": 18381, - "end": 18392, + "start": 18383, + "end": 18394, "loc": { "start": { "line": 450, @@ -24144,8 +24144,8 @@ }, "exported": { "type": "Identifier", - "start": 18381, - "end": 18392, + "start": 18383, + "end": 18394, "loc": { "start": { "line": 450, @@ -24165,8 +24165,8 @@ }, { "type": "ExportNamedDeclaration", - "start": 18373, - "end": 18394, + "start": 18375, + "end": 18396, "loc": { "start": { "line": 450, @@ -24180,7 +24180,7 @@ "declaration": { "type": "FunctionDeclaration", "start": 5090, - "end": 18371, + "end": 18373, "loc": { "start": { "line": 75, @@ -25649,7 +25649,7 @@ "body": { "type": "BlockStatement", "start": 6004, - "end": 18371, + "end": 18373, "loc": { "start": { "line": 98, @@ -27881,7 +27881,7 @@ { "type": "FunctionDeclaration", "start": 6605, - "end": 6787, + "end": 6789, "loc": { "start": { "line": 123, @@ -27934,7 +27934,7 @@ "body": { "type": "BlockStatement", "start": 6641, - "end": 6787, + "end": 6789, "loc": { "start": { "line": 123, @@ -27949,7 +27949,7 @@ { "type": "VariableDeclaration", "start": 6650, - "end": 6682, + "end": 6684, "loc": { "start": { "line": 124, @@ -27957,14 +27957,14 @@ }, "end": { "line": 124, - "column": 39 + "column": 41 } }, "declarations": [ { "type": "VariableDeclarator", "start": 6654, - "end": 6681, + "end": 6683, "loc": { "start": { "line": 124, @@ -27972,7 +27972,7 @@ }, "end": { "line": 124, - "column": 38 + "column": 40 } }, "id": { @@ -27995,7 +27995,7 @@ "init": { "type": "CallExpression", "start": 6661, - "end": 6681, + "end": 6683, "loc": { "start": { "line": 124, @@ -28003,7 +28003,7 @@ }, "end": { "line": 124, - "column": 38 + "column": 40 } }, "callee": { @@ -28060,7 +28060,7 @@ { "type": "Identifier", "start": 6674, - "end": 6680, + "end": 6682, "loc": { "start": { "line": 124, @@ -28068,11 +28068,11 @@ }, "end": { "line": 124, - "column": 37 + "column": 39 }, - "identifierName": "source" + "identifierName": "fileName" }, - "name": "source" + "name": "fileName" } ] } @@ -28082,8 +28082,8 @@ }, { "type": "IfStatement", - "start": 6690, - "end": 6762, + "start": 6692, + "end": 6764, "loc": { "start": { "line": 125, @@ -28096,8 +28096,8 @@ }, "test": { "type": "BinaryExpression", - "start": 6694, - "end": 6715, + "start": 6696, + "end": 6717, "loc": { "start": { "line": 125, @@ -28110,8 +28110,8 @@ }, "left": { "type": "CallExpression", - "start": 6694, - "end": 6707, + "start": 6696, + "end": 6709, "loc": { "start": { "line": 125, @@ -28124,8 +28124,8 @@ }, "callee": { "type": "MemberExpression", - "start": 6694, - "end": 6704, + "start": 6696, + "end": 6706, "loc": { "start": { "line": 125, @@ -28138,8 +28138,8 @@ }, "object": { "type": "Identifier", - "start": 6694, - "end": 6697, + "start": 6696, + "end": 6699, "loc": { "start": { "line": 125, @@ -28155,8 +28155,8 @@ }, "property": { "type": "Identifier", - "start": 6698, - "end": 6704, + "start": 6700, + "end": 6706, "loc": { "start": { "line": 125, @@ -28175,8 +28175,8 @@ "arguments": [ { "type": "NumericLiteral", - "start": 6705, - "end": 6706, + "start": 6707, + "end": 6708, "loc": { "start": { "line": 125, @@ -28198,8 +28198,8 @@ "operator": "===", "right": { "type": "StringLiteral", - "start": 6712, - "end": 6715, + "start": 6714, + "end": 6717, "loc": { "start": { "line": 125, @@ -28219,8 +28219,8 @@ }, "consequent": { "type": "BlockStatement", - "start": 6717, - "end": 6762, + "start": 6719, + "end": 6764, "loc": { "start": { "line": 125, @@ -28234,8 +28234,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 6730, - "end": 6753, + "start": 6732, + "end": 6755, "loc": { "start": { "line": 126, @@ -28248,8 +28248,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 6730, - "end": 6752, + "start": 6732, + "end": 6754, "loc": { "start": { "line": 126, @@ -28263,8 +28263,8 @@ "operator": "=", "left": { "type": "Identifier", - "start": 6730, - "end": 6733, + "start": 6732, + "end": 6735, "loc": { "start": { "line": 126, @@ -28280,8 +28280,8 @@ }, "right": { "type": "CallExpression", - "start": 6736, - "end": 6752, + "start": 6738, + "end": 6754, "loc": { "start": { "line": 126, @@ -28294,8 +28294,8 @@ }, "callee": { "type": "MemberExpression", - "start": 6736, - "end": 6749, + "start": 6738, + "end": 6751, "loc": { "start": { "line": 126, @@ -28308,8 +28308,8 @@ }, "object": { "type": "Identifier", - "start": 6736, - "end": 6739, + "start": 6738, + "end": 6741, "loc": { "start": { "line": 126, @@ -28325,8 +28325,8 @@ }, "property": { "type": "Identifier", - "start": 6740, - "end": 6749, + "start": 6742, + "end": 6751, "loc": { "start": { "line": 126, @@ -28345,8 +28345,8 @@ "arguments": [ { "type": "NumericLiteral", - "start": 6750, - "end": 6751, + "start": 6752, + "end": 6753, "loc": { "start": { "line": 126, @@ -28374,8 +28374,8 @@ }, { "type": "ReturnStatement", - "start": 6770, - "end": 6781, + "start": 6772, + "end": 6783, "loc": { "start": { "line": 128, @@ -28388,8 +28388,8 @@ }, "argument": { "type": "Identifier", - "start": 6777, - "end": 6780, + "start": 6779, + "end": 6782, "loc": { "start": { "line": 128, @@ -28410,8 +28410,8 @@ }, { "type": "ReturnStatement", - "start": 6793, - "end": 18369, + "start": 6795, + "end": 18371, "loc": { "start": { "line": 131, @@ -28424,8 +28424,8 @@ }, "argument": { "type": "NewExpression", - "start": 6800, - "end": 18368, + "start": 6802, + "end": 18370, "loc": { "start": { "line": 131, @@ -28438,8 +28438,8 @@ }, "callee": { "type": "Identifier", - "start": 6804, - "end": 6811, + "start": 6806, + "end": 6813, "loc": { "start": { "line": 131, @@ -28456,8 +28456,8 @@ "arguments": [ { "type": "FunctionExpression", - "start": 6812, - "end": 18367, + "start": 6814, + "end": 18369, "loc": { "start": { "line": 131, @@ -28475,8 +28475,8 @@ "params": [ { "type": "Identifier", - "start": 6822, - "end": 6829, + "start": 6824, + "end": 6831, "loc": { "start": { "line": 131, @@ -28492,8 +28492,8 @@ }, { "type": "Identifier", - "start": 6831, - "end": 6837, + "start": 6833, + "end": 6839, "loc": { "start": { "line": 131, @@ -28510,8 +28510,8 @@ ], "body": { "type": "BlockStatement", - "start": 6839, - "end": 18367, + "start": 6841, + "end": 18369, "loc": { "start": { "line": 131, @@ -28525,8 +28525,8 @@ "body": [ { "type": "VariableDeclaration", - "start": 6849, - "end": 6866, + "start": 6851, + "end": 6868, "loc": { "start": { "line": 132, @@ -28540,8 +28540,8 @@ "declarations": [ { "type": "VariableDeclarator", - "start": 6855, - "end": 6865, + "start": 6857, + "end": 6867, "loc": { "start": { "line": 132, @@ -28554,8 +28554,8 @@ }, "id": { "type": "Identifier", - "start": 6855, - "end": 6859, + "start": 6857, + "end": 6861, "loc": { "start": { "line": 132, @@ -28571,8 +28571,8 @@ }, "init": { "type": "Identifier", - "start": 6862, - "end": 6865, + "start": 6864, + "end": 6867, "loc": { "start": { "line": 132, @@ -28592,8 +28592,8 @@ }, { "type": "ExpressionStatement", - "start": 6875, - "end": 6942, + "start": 6877, + "end": 6944, "loc": { "start": { "line": 133, @@ -28606,8 +28606,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 6875, - "end": 6942, + "start": 6877, + "end": 6944, "loc": { "start": { "line": 133, @@ -28621,8 +28621,8 @@ "operator": "=", "left": { "type": "Identifier", - "start": 6875, - "end": 6878, + "start": 6877, + "end": 6880, "loc": { "start": { "line": 133, @@ -28638,8 +28638,8 @@ }, "right": { "type": "ArrowFunctionExpression", - "start": 6881, - "end": 6942, + "start": 6883, + "end": 6944, "loc": { "start": { "line": 133, @@ -28657,8 +28657,8 @@ "params": [ { "type": "Identifier", - "start": 6882, - "end": 6885, + "start": 6884, + "end": 6887, "loc": { "start": { "line": 133, @@ -28675,8 +28675,8 @@ ], "body": { "type": "BlockStatement", - "start": 6890, - "end": 6942, + "start": 6892, + "end": 6944, "loc": { "start": { "line": 133, @@ -28690,8 +28690,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 6904, - "end": 6932, + "start": 6906, + "end": 6934, "loc": { "start": { "line": 134, @@ -28704,8 +28704,8 @@ }, "expression": { "type": "CallExpression", - "start": 6904, - "end": 6932, + "start": 6906, + "end": 6934, "loc": { "start": { "line": 134, @@ -28718,8 +28718,8 @@ }, "callee": { "type": "Identifier", - "start": 6904, - "end": 6908, + "start": 6906, + "end": 6910, "loc": { "start": { "line": 134, @@ -28736,8 +28736,8 @@ "arguments": [ { "type": "TemplateLiteral", - "start": 6909, - "end": 6931, + "start": 6911, + "end": 6933, "loc": { "start": { "line": 134, @@ -28751,8 +28751,8 @@ "expressions": [ { "type": "Identifier", - "start": 6926, - "end": 6929, + "start": 6928, + "end": 6931, "loc": { "start": { "line": 134, @@ -28770,8 +28770,8 @@ "quasis": [ { "type": "TemplateElement", - "start": 6910, - "end": 6924, + "start": 6912, + "end": 6926, "loc": { "start": { "line": 134, @@ -28790,8 +28790,8 @@ }, { "type": "TemplateElement", - "start": 6930, - "end": 6930, + "start": 6932, + "end": 6932, "loc": { "start": { "line": 134, @@ -28821,8 +28821,8 @@ }, { "type": "IfStatement", - "start": 6952, - "end": 7074, + "start": 6954, + "end": 7076, "loc": { "start": { "line": 137, @@ -28835,8 +28835,8 @@ }, "test": { "type": "LogicalExpression", - "start": 6956, - "end": 6978, + "start": 6958, + "end": 6980, "loc": { "start": { "line": 137, @@ -28849,8 +28849,8 @@ }, "left": { "type": "UnaryExpression", - "start": 6956, - "end": 6963, + "start": 6958, + "end": 6965, "loc": { "start": { "line": 137, @@ -28865,8 +28865,8 @@ "prefix": true, "argument": { "type": "Identifier", - "start": 6957, - "end": 6963, + "start": 6959, + "end": 6965, "loc": { "start": { "line": 137, @@ -28887,8 +28887,8 @@ "operator": "&&", "right": { "type": "UnaryExpression", - "start": 6967, - "end": 6978, + "start": 6969, + "end": 6980, "loc": { "start": { "line": 137, @@ -28903,8 +28903,8 @@ "prefix": true, "argument": { "type": "Identifier", - "start": 6968, - "end": 6978, + "start": 6970, + "end": 6980, "loc": { "start": { "line": 137, @@ -28925,8 +28925,8 @@ }, "consequent": { "type": "BlockStatement", - "start": 6980, - "end": 7074, + "start": 6982, + "end": 7076, "loc": { "start": { "line": 137, @@ -28940,8 +28940,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 6994, - "end": 7044, + "start": 6996, + "end": 7046, "loc": { "start": { "line": 138, @@ -28954,8 +28954,8 @@ }, "expression": { "type": "CallExpression", - "start": 6994, - "end": 7043, + "start": 6996, + "end": 7045, "loc": { "start": { "line": 138, @@ -28968,8 +28968,8 @@ }, "callee": { "type": "Identifier", - "start": 6994, - "end": 7000, + "start": 6996, + "end": 7002, "loc": { "start": { "line": 138, @@ -28986,8 +28986,8 @@ "arguments": [ { "type": "StringLiteral", - "start": 7001, - "end": 7042, + "start": 7003, + "end": 7044, "loc": { "start": { "line": 138, @@ -29009,8 +29009,8 @@ }, { "type": "ReturnStatement", - "start": 7057, - "end": 7064, + "start": 7059, + "end": 7066, "loc": { "start": { "line": 139, @@ -29030,8 +29030,8 @@ }, { "type": "IfStatement", - "start": 7084, - "end": 7231, + "start": 7086, + "end": 7233, "loc": { "start": { "line": 142, @@ -29044,8 +29044,8 @@ }, "test": { "type": "LogicalExpression", - "start": 7088, - "end": 7115, + "start": 7090, + "end": 7117, "loc": { "start": { "line": 142, @@ -29058,8 +29058,8 @@ }, "left": { "type": "UnaryExpression", - "start": 7088, - "end": 7101, + "start": 7090, + "end": 7103, "loc": { "start": { "line": 142, @@ -29074,8 +29074,8 @@ "prefix": true, "argument": { "type": "Identifier", - "start": 7089, - "end": 7101, + "start": 7091, + "end": 7103, "loc": { "start": { "line": 142, @@ -29096,8 +29096,8 @@ "operator": "&&", "right": { "type": "Identifier", - "start": 7105, - "end": 7115, + "start": 7107, + "end": 7117, "loc": { "start": { "line": 142, @@ -29114,8 +29114,8 @@ }, "consequent": { "type": "BlockStatement", - "start": 7117, - "end": 7231, + "start": 7119, + "end": 7233, "loc": { "start": { "line": 142, @@ -29129,8 +29129,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 7131, - "end": 7201, + "start": 7133, + "end": 7203, "loc": { "start": { "line": 143, @@ -29143,8 +29143,8 @@ }, "expression": { "type": "CallExpression", - "start": 7131, - "end": 7200, + "start": 7133, + "end": 7202, "loc": { "start": { "line": 143, @@ -29157,8 +29157,8 @@ }, "callee": { "type": "Identifier", - "start": 7131, - "end": 7137, + "start": 7133, + "end": 7139, "loc": { "start": { "line": 143, @@ -29175,8 +29175,8 @@ "arguments": [ { "type": "StringLiteral", - "start": 7138, - "end": 7199, + "start": 7140, + "end": 7201, "loc": { "start": { "line": 143, @@ -29198,8 +29198,8 @@ }, { "type": "ReturnStatement", - "start": 7214, - "end": 7221, + "start": 7216, + "end": 7223, "loc": { "start": { "line": 144, @@ -29219,8 +29219,8 @@ }, { "type": "IfStatement", - "start": 7241, - "end": 7396, + "start": 7243, + "end": 7398, "loc": { "start": { "line": 147, @@ -29233,8 +29233,8 @@ }, "test": { "type": "LogicalExpression", - "start": 7245, - "end": 7285, + "start": 7247, + "end": 7287, "loc": { "start": { "line": 147, @@ -29247,8 +29247,8 @@ }, "left": { "type": "LogicalExpression", - "start": 7245, - "end": 7271, + "start": 7247, + "end": 7273, "loc": { "start": { "line": 147, @@ -29261,8 +29261,8 @@ }, "left": { "type": "UnaryExpression", - "start": 7245, - "end": 7252, + "start": 7247, + "end": 7254, "loc": { "start": { "line": 147, @@ -29277,8 +29277,8 @@ "prefix": true, "argument": { "type": "Identifier", - "start": 7246, - "end": 7252, + "start": 7248, + "end": 7254, "loc": { "start": { "line": 147, @@ -29299,8 +29299,8 @@ "operator": "&&", "right": { "type": "UnaryExpression", - "start": 7256, - "end": 7271, + "start": 7258, + "end": 7273, "loc": { "start": { "line": 147, @@ -29315,8 +29315,8 @@ "prefix": true, "argument": { "type": "Identifier", - "start": 7257, - "end": 7271, + "start": 7259, + "end": 7273, "loc": { "start": { "line": 147, @@ -29338,8 +29338,8 @@ "operator": "&&", "right": { "type": "UnaryExpression", - "start": 7275, - "end": 7285, + "start": 7277, + "end": 7287, "loc": { "start": { "line": 147, @@ -29354,8 +29354,8 @@ "prefix": true, "argument": { "type": "Identifier", - "start": 7276, - "end": 7285, + "start": 7278, + "end": 7287, "loc": { "start": { "line": 147, @@ -29376,8 +29376,8 @@ }, "consequent": { "type": "BlockStatement", - "start": 7287, - "end": 7396, + "start": 7289, + "end": 7398, "loc": { "start": { "line": 147, @@ -29391,8 +29391,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 7301, - "end": 7366, + "start": 7303, + "end": 7368, "loc": { "start": { "line": 148, @@ -29405,8 +29405,8 @@ }, "expression": { "type": "CallExpression", - "start": 7301, - "end": 7365, + "start": 7303, + "end": 7367, "loc": { "start": { "line": 148, @@ -29419,8 +29419,8 @@ }, "callee": { "type": "Identifier", - "start": 7301, - "end": 7307, + "start": 7303, + "end": 7309, "loc": { "start": { "line": 148, @@ -29437,8 +29437,8 @@ "arguments": [ { "type": "StringLiteral", - "start": 7308, - "end": 7364, + "start": 7310, + "end": 7366, "loc": { "start": { "line": 148, @@ -29460,8 +29460,8 @@ }, { "type": "ReturnStatement", - "start": 7379, - "end": 7386, + "start": 7381, + "end": 7388, "loc": { "start": { "line": 149, @@ -29481,8 +29481,8 @@ }, { "type": "IfStatement", - "start": 7406, - "end": 7479, + "start": 7408, + "end": 7481, "loc": { "start": { "line": 152, @@ -29495,8 +29495,8 @@ }, "test": { "type": "Identifier", - "start": 7410, - "end": 7416, + "start": 7412, + "end": 7418, "loc": { "start": { "line": 152, @@ -29512,8 +29512,8 @@ }, "consequent": { "type": "BlockStatement", - "start": 7418, - "end": 7479, + "start": 7420, + "end": 7481, "loc": { "start": { "line": 152, @@ -29527,8 +29527,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 7432, - "end": 7469, + "start": 7434, + "end": 7471, "loc": { "start": { "line": 153, @@ -29541,8 +29541,8 @@ }, "expression": { "type": "CallExpression", - "start": 7432, - "end": 7468, + "start": 7434, + "end": 7470, "loc": { "start": { "line": 153, @@ -29555,8 +29555,8 @@ }, "callee": { "type": "Identifier", - "start": 7432, - "end": 7435, + "start": 7434, + "end": 7437, "loc": { "start": { "line": 153, @@ -29573,8 +29573,8 @@ "arguments": [ { "type": "BinaryExpression", - "start": 7436, - "end": 7467, + "start": 7438, + "end": 7469, "loc": { "start": { "line": 153, @@ -29587,8 +29587,8 @@ }, "left": { "type": "StringLiteral", - "start": 7436, - "end": 7458, + "start": 7438, + "end": 7460, "loc": { "start": { "line": 153, @@ -29608,8 +29608,8 @@ "operator": "+", "right": { "type": "Identifier", - "start": 7461, - "end": 7467, + "start": 7463, + "end": 7469, "loc": { "start": { "line": 153, @@ -29634,8 +29634,8 @@ }, { "type": "VariableDeclaration", - "start": 7489, - "end": 7518, + "start": 7491, + "end": 7520, "loc": { "start": { "line": 156, @@ -29649,8 +29649,8 @@ "declarations": [ { "type": "VariableDeclarator", - "start": 7495, - "end": 7517, + "start": 7497, + "end": 7519, "loc": { "start": { "line": 156, @@ -29663,8 +29663,8 @@ }, "id": { "type": "Identifier", - "start": 7495, - "end": 7504, + "start": 7497, + "end": 7506, "loc": { "start": { "line": 156, @@ -29680,8 +29680,8 @@ }, "init": { "type": "NewExpression", - "start": 7507, - "end": 7517, + "start": 7509, + "end": 7519, "loc": { "start": { "line": 156, @@ -29694,8 +29694,8 @@ }, "callee": { "type": "Identifier", - "start": 7511, - "end": 7515, + "start": 7513, + "end": 7517, "loc": { "start": { "line": 156, @@ -29717,8 +29717,8 @@ }, { "type": "VariableDeclaration", - "start": 7528, - "end": 7578, + "start": 7530, + "end": 7580, "loc": { "start": { "line": 158, @@ -29732,8 +29732,8 @@ "declarations": [ { "type": "VariableDeclarator", - "start": 7534, - "end": 7577, + "start": 7536, + "end": 7579, "loc": { "start": { "line": 158, @@ -29746,8 +29746,8 @@ }, "id": { "type": "Identifier", - "start": 7534, - "end": 7547, + "start": 7536, + "end": 7549, "loc": { "start": { "line": 158, @@ -29763,8 +29763,8 @@ }, "init": { "type": "LogicalExpression", - "start": 7550, - "end": 7577, + "start": 7552, + "end": 7579, "loc": { "start": { "line": 158, @@ -29777,8 +29777,8 @@ }, "left": { "type": "MemberExpression", - "start": 7550, - "end": 7571, + "start": 7552, + "end": 7573, "loc": { "start": { "line": 158, @@ -29791,8 +29791,8 @@ }, "object": { "type": "Identifier", - "start": 7550, - "end": 7557, + "start": 7552, + "end": 7559, "loc": { "start": { "line": 158, @@ -29808,8 +29808,8 @@ }, "property": { "type": "Identifier", - "start": 7558, - "end": 7571, + "start": 7560, + "end": 7573, "loc": { "start": { "line": 158, @@ -29828,8 +29828,8 @@ "operator": "||", "right": { "type": "ObjectExpression", - "start": 7575, - "end": 7577, + "start": 7577, + "end": 7579, "loc": { "start": { "line": 158, @@ -29849,8 +29849,8 @@ }, { "type": "VariableDeclaration", - "start": 7587, - "end": 7640, + "start": 7589, + "end": 7642, "loc": { "start": { "line": 159, @@ -29864,8 +29864,8 @@ "declarations": [ { "type": "VariableDeclarator", - "start": 7593, - "end": 7639, + "start": 7595, + "end": 7641, "loc": { "start": { "line": 159, @@ -29878,8 +29878,8 @@ }, "id": { "type": "Identifier", - "start": 7593, - "end": 7596, + "start": 7595, + "end": 7598, "loc": { "start": { "line": 159, @@ -29895,8 +29895,8 @@ }, "init": { "type": "LogicalExpression", - "start": 7599, - "end": 7639, + "start": 7601, + "end": 7641, "loc": { "start": { "line": 159, @@ -29909,8 +29909,8 @@ }, "left": { "type": "Identifier", - "start": 7599, - "end": 7611, + "start": 7601, + "end": 7613, "loc": { "start": { "line": 159, @@ -29927,8 +29927,8 @@ "operator": "||", "right": { "type": "CallExpression", - "start": 7615, - "end": 7639, + "start": 7617, + "end": 7641, "loc": { "start": { "line": 159, @@ -29941,8 +29941,8 @@ }, "callee": { "type": "Identifier", - "start": 7615, - "end": 7631, + "start": 7617, + "end": 7633, "loc": { "start": { "line": 159, @@ -29959,8 +29959,8 @@ "arguments": [ { "type": "Identifier", - "start": 7632, - "end": 7638, + "start": 7634, + "end": 7640, "loc": { "start": { "line": 159, @@ -29983,8 +29983,8 @@ }, { "type": "ExpressionStatement", - "start": 7650, - "end": 7688, + "start": 7652, + "end": 7690, "loc": { "start": { "line": 161, @@ -29997,8 +29997,8 @@ }, "expression": { "type": "CallExpression", - "start": 7650, - "end": 7687, + "start": 7652, + "end": 7689, "loc": { "start": { "line": 161, @@ -30011,8 +30011,8 @@ }, "callee": { "type": "Identifier", - "start": 7650, - "end": 7653, + "start": 7652, + "end": 7655, "loc": { "start": { "line": 161, @@ -30029,8 +30029,8 @@ "arguments": [ { "type": "TemplateLiteral", - "start": 7654, - "end": 7686, + "start": 7656, + "end": 7688, "loc": { "start": { "line": 161, @@ -30044,8 +30044,8 @@ "expressions": [ { "type": "Identifier", - "start": 7680, - "end": 7683, + "start": 7682, + "end": 7685, "loc": { "start": { "line": 161, @@ -30063,8 +30063,8 @@ "quasis": [ { "type": "TemplateElement", - "start": 7655, - "end": 7678, + "start": 7657, + "end": 7680, "loc": { "start": { "line": 161, @@ -30083,8 +30083,8 @@ }, { "type": "TemplateElement", - "start": 7684, - "end": 7685, + "start": 7686, + "end": 7687, "loc": { "start": { "line": 161, @@ -30108,8 +30108,8 @@ }, { "type": "VariableDeclaration", - "start": 7698, - "end": 7739, + "start": 7700, + "end": 7741, "loc": { "start": { "line": 163, @@ -30123,8 +30123,8 @@ "declarations": [ { "type": "VariableDeclarator", - "start": 7702, - "end": 7738, + "start": 7704, + "end": 7740, "loc": { "start": { "line": 163, @@ -30137,8 +30137,8 @@ }, "id": { "type": "Identifier", - "start": 7702, - "end": 7717, + "start": 7704, + "end": 7719, "loc": { "start": { "line": 163, @@ -30154,8 +30154,8 @@ }, "init": { "type": "MemberExpression", - "start": 7720, - "end": 7738, + "start": 7722, + "end": 7740, "loc": { "start": { "line": 163, @@ -30168,8 +30168,8 @@ }, "object": { "type": "Identifier", - "start": 7720, - "end": 7733, + "start": 7722, + "end": 7735, "loc": { "start": { "line": 163, @@ -30185,8 +30185,8 @@ }, "property": { "type": "Identifier", - "start": 7734, - "end": 7737, + "start": 7736, + "end": 7739, "loc": { "start": { "line": 163, @@ -30208,8 +30208,8 @@ }, { "type": "IfStatement", - "start": 7749, - "end": 8005, + "start": 7751, + "end": 8007, "loc": { "start": { "line": 165, @@ -30222,8 +30222,8 @@ }, "test": { "type": "UnaryExpression", - "start": 7753, - "end": 7769, + "start": 7755, + "end": 7771, "loc": { "start": { "line": 165, @@ -30238,8 +30238,8 @@ "prefix": true, "argument": { "type": "Identifier", - "start": 7754, - "end": 7769, + "start": 7756, + "end": 7771, "loc": { "start": { "line": 165, @@ -30259,8 +30259,8 @@ }, "consequent": { "type": "BlockStatement", - "start": 7771, - "end": 8005, + "start": 7773, + "end": 8007, "loc": { "start": { "line": 165, @@ -30274,8 +30274,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 7785, - "end": 7961, + "start": 7787, + "end": 7963, "loc": { "start": { "line": 166, @@ -30288,8 +30288,8 @@ }, "expression": { "type": "CallExpression", - "start": 7785, - "end": 7960, + "start": 7787, + "end": 7962, "loc": { "start": { "line": 166, @@ -30302,8 +30302,8 @@ }, "callee": { "type": "Identifier", - "start": 7785, - "end": 7788, + "start": 7787, + "end": 7790, "loc": { "start": { "line": 166, @@ -30320,8 +30320,8 @@ "arguments": [ { "type": "TemplateLiteral", - "start": 7789, - "end": 7959, + "start": 7791, + "end": 7961, "loc": { "start": { "line": 166, @@ -30335,8 +30335,8 @@ "expressions": [ { "type": "Identifier", - "start": 7864, - "end": 7867, + "start": 7866, + "end": 7869, "loc": { "start": { "line": 166, @@ -30354,8 +30354,8 @@ "quasis": [ { "type": "TemplateElement", - "start": 7790, - "end": 7862, + "start": 7792, + "end": 7864, "loc": { "start": { "line": 166, @@ -30374,8 +30374,8 @@ }, { "type": "TemplateElement", - "start": 7868, - "end": 7958, + "start": 7870, + "end": 7960, "loc": { "start": { "line": 166, @@ -30399,8 +30399,8 @@ }, { "type": "ExpressionStatement", - "start": 7974, - "end": 7995, + "start": 7976, + "end": 7997, "loc": { "start": { "line": 167, @@ -30413,8 +30413,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 7974, - "end": 7994, + "start": 7976, + "end": 7996, "loc": { "start": { "line": 167, @@ -30428,8 +30428,8 @@ "operator": "=", "left": { "type": "Identifier", - "start": 7974, - "end": 7989, + "start": 7976, + "end": 7991, "loc": { "start": { "line": 167, @@ -30445,8 +30445,8 @@ }, "right": { "type": "ObjectExpression", - "start": 7992, - "end": 7994, + "start": 7994, + "end": 7996, "loc": { "start": { "line": 167, @@ -30468,8 +30468,8 @@ }, { "type": "FunctionDeclaration", - "start": 8014, - "end": 8182, + "start": 8016, + "end": 8184, "loc": { "start": { "line": 169, @@ -30482,8 +30482,8 @@ }, "id": { "type": "Identifier", - "start": 8023, - "end": 8037, + "start": 8025, + "end": 8039, "loc": { "start": { "line": 169, @@ -30503,8 +30503,8 @@ "params": [ { "type": "Identifier", - "start": 8038, - "end": 8045, + "start": 8040, + "end": 8047, "loc": { "start": { "line": 169, @@ -30520,8 +30520,8 @@ }, { "type": "Identifier", - "start": 8047, - "end": 8054, + "start": 8049, + "end": 8056, "loc": { "start": { "line": 169, @@ -30538,8 +30538,8 @@ ], "body": { "type": "BlockStatement", - "start": 8056, - "end": 8182, + "start": 8058, + "end": 8184, "loc": { "start": { "line": 169, @@ -30553,8 +30553,8 @@ "body": [ { "type": "IfStatement", - "start": 8070, - "end": 8144, + "start": 8072, + "end": 8146, "loc": { "start": { "line": 170, @@ -30567,8 +30567,8 @@ }, "test": { "type": "BinaryExpression", - "start": 8074, - "end": 8095, + "start": 8076, + "end": 8097, "loc": { "start": { "line": 170, @@ -30581,8 +30581,8 @@ }, "left": { "type": "Identifier", - "start": 8074, - "end": 8081, + "start": 8076, + "end": 8083, "loc": { "start": { "line": 170, @@ -30599,8 +30599,8 @@ "operator": "!==", "right": { "type": "Identifier", - "start": 8086, - "end": 8095, + "start": 8088, + "end": 8097, "loc": { "start": { "line": 170, @@ -30617,8 +30617,8 @@ }, "consequent": { "type": "BlockStatement", - "start": 8097, - "end": 8144, + "start": 8099, + "end": 8146, "loc": { "start": { "line": 170, @@ -30632,8 +30632,8 @@ "body": [ { "type": "ReturnStatement", - "start": 8115, - "end": 8130, + "start": 8117, + "end": 8132, "loc": { "start": { "line": 171, @@ -30646,8 +30646,8 @@ }, "argument": { "type": "Identifier", - "start": 8122, - "end": 8129, + "start": 8124, + "end": 8131, "loc": { "start": { "line": 171, @@ -30669,8 +30669,8 @@ }, { "type": "ReturnStatement", - "start": 8157, - "end": 8172, + "start": 8159, + "end": 8174, "loc": { "start": { "line": 173, @@ -30683,8 +30683,8 @@ }, "argument": { "type": "Identifier", - "start": 8164, - "end": 8171, + "start": 8166, + "end": 8173, "loc": { "start": { "line": 173, @@ -30705,8 +30705,8 @@ }, { "type": "IfStatement", - "start": 8192, - "end": 8387, + "start": 8194, + "end": 8389, "loc": { "start": { "line": 176, @@ -30719,8 +30719,8 @@ }, "test": { "type": "UnaryExpression", - "start": 8196, - "end": 8207, + "start": 8198, + "end": 8209, "loc": { "start": { "line": 176, @@ -30735,8 +30735,8 @@ "prefix": true, "argument": { "type": "Identifier", - "start": 8197, - "end": 8207, + "start": 8199, + "end": 8209, "loc": { "start": { "line": 176, @@ -30756,8 +30756,8 @@ }, "consequent": { "type": "BlockStatement", - "start": 8209, - "end": 8387, + "start": 8211, + "end": 8389, "loc": { "start": { "line": 176, @@ -30771,8 +30771,8 @@ "body": [ { "type": "TryStatement", - "start": 8223, - "end": 8377, + "start": 8225, + "end": 8379, "loc": { "start": { "line": 177, @@ -30785,8 +30785,8 @@ }, "block": { "type": "BlockStatement", - "start": 8227, - "end": 8296, + "start": 8229, + "end": 8298, "loc": { "start": { "line": 177, @@ -30800,8 +30800,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 8245, - "end": 8282, + "start": 8247, + "end": 8284, "loc": { "start": { "line": 178, @@ -30814,8 +30814,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 8245, - "end": 8281, + "start": 8247, + "end": 8283, "loc": { "start": { "line": 178, @@ -30829,8 +30829,8 @@ "operator": "=", "left": { "type": "Identifier", - "start": 8245, - "end": 8255, + "start": 8247, + "end": 8257, "loc": { "start": { "line": 178, @@ -30846,8 +30846,8 @@ }, "right": { "type": "CallExpression", - "start": 8258, - "end": 8281, + "start": 8260, + "end": 8283, "loc": { "start": { "line": 178, @@ -30860,8 +30860,8 @@ }, "callee": { "type": "MemberExpression", - "start": 8258, - "end": 8273, + "start": 8260, + "end": 8275, "loc": { "start": { "line": 178, @@ -30874,8 +30874,8 @@ }, "object": { "type": "Identifier", - "start": 8258, - "end": 8260, + "start": 8260, + "end": 8262, "loc": { "start": { "line": 178, @@ -30891,8 +30891,8 @@ }, "property": { "type": "Identifier", - "start": 8261, - "end": 8273, + "start": 8263, + "end": 8275, "loc": { "start": { "line": 178, @@ -30911,8 +30911,8 @@ "arguments": [ { "type": "Identifier", - "start": 8274, - "end": 8280, + "start": 8276, + "end": 8282, "loc": { "start": { "line": 178, @@ -30935,8 +30935,8 @@ }, "handler": { "type": "CatchClause", - "start": 8297, - "end": 8377, + "start": 8299, + "end": 8379, "loc": { "start": { "line": 179, @@ -30949,8 +30949,8 @@ }, "param": { "type": "Identifier", - "start": 8304, - "end": 8307, + "start": 8306, + "end": 8309, "loc": { "start": { "line": 179, @@ -30966,8 +30966,8 @@ }, "body": { "type": "BlockStatement", - "start": 8309, - "end": 8377, + "start": 8311, + "end": 8379, "loc": { "start": { "line": 179, @@ -30981,8 +30981,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 8327, - "end": 8339, + "start": 8329, + "end": 8341, "loc": { "start": { "line": 180, @@ -30995,8 +30995,8 @@ }, "expression": { "type": "CallExpression", - "start": 8327, - "end": 8338, + "start": 8329, + "end": 8340, "loc": { "start": { "line": 180, @@ -31009,8 +31009,8 @@ }, "callee": { "type": "Identifier", - "start": 8327, - "end": 8333, + "start": 8329, + "end": 8335, "loc": { "start": { "line": 180, @@ -31027,8 +31027,8 @@ "arguments": [ { "type": "Identifier", - "start": 8334, - "end": 8337, + "start": 8336, + "end": 8339, "loc": { "start": { "line": 180, @@ -31047,8 +31047,8 @@ }, { "type": "ReturnStatement", - "start": 8356, - "end": 8363, + "start": 8358, + "end": 8365, "loc": { "start": { "line": 181, @@ -31075,8 +31075,8 @@ }, { "type": "VariableDeclaration", - "start": 8397, - "end": 8447, + "start": 8399, + "end": 8449, "loc": { "start": { "line": 185, @@ -31090,8 +31090,8 @@ "declarations": [ { "type": "VariableDeclarator", - "start": 8403, - "end": 8446, + "start": 8405, + "end": 8448, "loc": { "start": { "line": 185, @@ -31104,8 +31104,8 @@ }, "id": { "type": "Identifier", - "start": 8403, - "end": 8422, + "start": 8405, + "end": 8424, "loc": { "start": { "line": 185, @@ -31121,8 +31121,8 @@ }, "init": { "type": "MemberExpression", - "start": 8425, - "end": 8446, + "start": 8427, + "end": 8448, "loc": { "start": { "line": 185, @@ -31135,8 +31135,8 @@ }, "object": { "type": "Identifier", - "start": 8425, - "end": 8435, + "start": 8427, + "end": 8437, "loc": { "start": { "line": 185, @@ -31152,8 +31152,8 @@ }, "property": { "type": "Identifier", - "start": 8436, - "end": 8446, + "start": 8438, + "end": 8448, "loc": { "start": { "line": 185, @@ -31175,8 +31175,8 @@ }, { "type": "ExpressionStatement", - "start": 8457, - "end": 8532, + "start": 8459, + "end": 8534, "loc": { "start": { "line": 187, @@ -31189,8 +31189,8 @@ }, "expression": { "type": "CallExpression", - "start": 8457, - "end": 8531, + "start": 8459, + "end": 8533, "loc": { "start": { "line": 187, @@ -31203,8 +31203,8 @@ }, "callee": { "type": "Identifier", - "start": 8457, - "end": 8460, + "start": 8459, + "end": 8462, "loc": { "start": { "line": 187, @@ -31221,8 +31221,8 @@ "arguments": [ { "type": "BinaryExpression", - "start": 8461, - "end": 8530, + "start": 8463, + "end": 8532, "loc": { "start": { "line": 187, @@ -31235,8 +31235,8 @@ }, "left": { "type": "BinaryExpression", - "start": 8461, - "end": 8522, + "start": 8463, + "end": 8524, "loc": { "start": { "line": 187, @@ -31249,8 +31249,8 @@ }, "left": { "type": "StringLiteral", - "start": 8461, - "end": 8480, + "start": 8463, + "end": 8482, "loc": { "start": { "line": 187, @@ -31270,8 +31270,8 @@ "operator": "+", "right": { "type": "CallExpression", - "start": 8483, - "end": 8522, + "start": 8485, + "end": 8524, "loc": { "start": { "line": 187, @@ -31284,8 +31284,8 @@ }, "callee": { "type": "MemberExpression", - "start": 8483, - "end": 8519, + "start": 8485, + "end": 8521, "loc": { "start": { "line": 187, @@ -31298,8 +31298,8 @@ }, "object": { "type": "BinaryExpression", - "start": 8484, - "end": 8510, + "start": 8486, + "end": 8512, "loc": { "start": { "line": 187, @@ -31312,8 +31312,8 @@ }, "left": { "type": "Identifier", - "start": 8484, - "end": 8503, + "start": 8486, + "end": 8505, "loc": { "start": { "line": 187, @@ -31330,8 +31330,8 @@ "operator": "/", "right": { "type": "NumericLiteral", - "start": 8506, - "end": 8510, + "start": 8508, + "end": 8512, "loc": { "start": { "line": 187, @@ -31350,13 +31350,13 @@ }, "extra": { "parenthesized": true, - "parenStart": 8483 + "parenStart": 8485 } }, "property": { "type": "Identifier", - "start": 8512, - "end": 8519, + "start": 8514, + "end": 8521, "loc": { "start": { "line": 187, @@ -31375,8 +31375,8 @@ "arguments": [ { "type": "NumericLiteral", - "start": 8520, - "end": 8521, + "start": 8522, + "end": 8523, "loc": { "start": { "line": 187, @@ -31399,8 +31399,8 @@ "operator": "+", "right": { "type": "StringLiteral", - "start": 8525, - "end": 8530, + "start": 8527, + "end": 8532, "loc": { "start": { "line": 187, @@ -31423,8 +31423,8 @@ }, { "type": "IfStatement", - "start": 8542, - "end": 8912, + "start": 8544, + "end": 8914, "loc": { "start": { "line": 189, @@ -31437,8 +31437,8 @@ }, "test": { "type": "LogicalExpression", - "start": 8546, - "end": 8582, + "start": 8548, + "end": 8584, "loc": { "start": { "line": 189, @@ -31451,8 +31451,8 @@ }, "left": { "type": "UnaryExpression", - "start": 8546, - "end": 8563, + "start": 8548, + "end": 8565, "loc": { "start": { "line": 189, @@ -31467,8 +31467,8 @@ "prefix": true, "argument": { "type": "Identifier", - "start": 8547, - "end": 8563, + "start": 8549, + "end": 8565, "loc": { "start": { "line": 189, @@ -31489,8 +31489,8 @@ "operator": "&&", "right": { "type": "Identifier", - "start": 8567, - "end": 8582, + "start": 8569, + "end": 8584, "loc": { "start": { "line": 189, @@ -31507,8 +31507,8 @@ }, "consequent": { "type": "BlockStatement", - "start": 8584, - "end": 8845, + "start": 8586, + "end": 8847, "loc": { "start": { "line": 189, @@ -31522,8 +31522,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 8598, - "end": 8653, + "start": 8600, + "end": 8655, "loc": { "start": { "line": 190, @@ -31536,8 +31536,8 @@ }, "expression": { "type": "CallExpression", - "start": 8598, - "end": 8652, + "start": 8600, + "end": 8654, "loc": { "start": { "line": 190, @@ -31550,8 +31550,8 @@ }, "callee": { "type": "Identifier", - "start": 8598, - "end": 8601, + "start": 8600, + "end": 8603, "loc": { "start": { "line": 190, @@ -31568,8 +31568,8 @@ "arguments": [ { "type": "BinaryExpression", - "start": 8602, - "end": 8651, + "start": 8604, + "end": 8653, "loc": { "start": { "line": 190, @@ -31582,8 +31582,8 @@ }, "left": { "type": "StringLiteral", - "start": 8602, - "end": 8633, + "start": 8604, + "end": 8635, "loc": { "start": { "line": 190, @@ -31603,8 +31603,8 @@ "operator": "+", "right": { "type": "Identifier", - "start": 8636, - "end": 8651, + "start": 8638, + "end": 8653, "loc": { "start": { "line": 190, @@ -31624,8 +31624,8 @@ }, { "type": "TryStatement", - "start": 8666, - "end": 8835, + "start": 8668, + "end": 8837, "loc": { "start": { "line": 191, @@ -31638,8 +31638,8 @@ }, "block": { "type": "BlockStatement", - "start": 8670, - "end": 8754, + "start": 8672, + "end": 8756, "loc": { "start": { "line": 191, @@ -31653,8 +31653,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 8688, - "end": 8740, + "start": 8690, + "end": 8742, "loc": { "start": { "line": 192, @@ -31667,8 +31667,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 8688, - "end": 8739, + "start": 8690, + "end": 8741, "loc": { "start": { "line": 192, @@ -31682,8 +31682,8 @@ "operator": "=", "left": { "type": "Identifier", - "start": 8688, - "end": 8704, + "start": 8690, + "end": 8706, "loc": { "start": { "line": 192, @@ -31699,8 +31699,8 @@ }, "right": { "type": "CallExpression", - "start": 8707, - "end": 8739, + "start": 8709, + "end": 8741, "loc": { "start": { "line": 192, @@ -31713,8 +31713,8 @@ }, "callee": { "type": "MemberExpression", - "start": 8707, - "end": 8722, + "start": 8709, + "end": 8724, "loc": { "start": { "line": 192, @@ -31727,8 +31727,8 @@ }, "object": { "type": "Identifier", - "start": 8707, - "end": 8709, + "start": 8709, + "end": 8711, "loc": { "start": { "line": 192, @@ -31744,8 +31744,8 @@ }, "property": { "type": "Identifier", - "start": 8710, - "end": 8722, + "start": 8712, + "end": 8724, "loc": { "start": { "line": 192, @@ -31764,8 +31764,8 @@ "arguments": [ { "type": "Identifier", - "start": 8723, - "end": 8738, + "start": 8725, + "end": 8740, "loc": { "start": { "line": 192, @@ -31788,8 +31788,8 @@ }, "handler": { "type": "CatchClause", - "start": 8755, - "end": 8835, + "start": 8757, + "end": 8837, "loc": { "start": { "line": 193, @@ -31802,8 +31802,8 @@ }, "param": { "type": "Identifier", - "start": 8762, - "end": 8765, + "start": 8764, + "end": 8767, "loc": { "start": { "line": 193, @@ -31819,8 +31819,8 @@ }, "body": { "type": "BlockStatement", - "start": 8767, - "end": 8835, + "start": 8769, + "end": 8837, "loc": { "start": { "line": 193, @@ -31834,8 +31834,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 8785, - "end": 8797, + "start": 8787, + "end": 8799, "loc": { "start": { "line": 194, @@ -31848,8 +31848,8 @@ }, "expression": { "type": "CallExpression", - "start": 8785, - "end": 8796, + "start": 8787, + "end": 8798, "loc": { "start": { "line": 194, @@ -31862,8 +31862,8 @@ }, "callee": { "type": "Identifier", - "start": 8785, - "end": 8791, + "start": 8787, + "end": 8793, "loc": { "start": { "line": 194, @@ -31880,8 +31880,8 @@ "arguments": [ { "type": "Identifier", - "start": 8792, - "end": 8795, + "start": 8794, + "end": 8797, "loc": { "start": { "line": 194, @@ -31900,8 +31900,8 @@ }, { "type": "ReturnStatement", - "start": 8814, - "end": 8821, + "start": 8816, + "end": 8823, "loc": { "start": { "line": 195, @@ -31926,8 +31926,8 @@ }, "alternate": { "type": "BlockStatement", - "start": 8851, - "end": 8912, + "start": 8853, + "end": 8914, "loc": { "start": { "line": 197, @@ -31941,8 +31941,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 8865, - "end": 8902, + "start": 8867, + "end": 8904, "loc": { "start": { "line": 198, @@ -31955,8 +31955,8 @@ }, "expression": { "type": "CallExpression", - "start": 8865, - "end": 8901, + "start": 8867, + "end": 8903, "loc": { "start": { "line": 198, @@ -31969,8 +31969,8 @@ }, "callee": { "type": "Identifier", - "start": 8865, - "end": 8868, + "start": 8867, + "end": 8870, "loc": { "start": { "line": 198, @@ -31987,8 +31987,8 @@ "arguments": [ { "type": "TemplateLiteral", - "start": 8869, - "end": 8900, + "start": 8871, + "end": 8902, "loc": { "start": { "line": 198, @@ -32003,8 +32003,8 @@ "quasis": [ { "type": "TemplateElement", - "start": 8870, - "end": 8899, + "start": 8872, + "end": 8901, "loc": { "start": { "line": 198, @@ -32032,8 +32032,8 @@ }, { "type": "VariableDeclaration", - "start": 8922, - "end": 8940, + "start": 8924, + "end": 8942, "loc": { "start": { "line": 201, @@ -32047,8 +32047,8 @@ "declarations": [ { "type": "VariableDeclarator", - "start": 8926, - "end": 8939, + "start": 8928, + "end": 8941, "loc": { "start": { "line": 201, @@ -32061,8 +32061,8 @@ }, "id": { "type": "Identifier", - "start": 8926, - "end": 8939, + "start": 8928, + "end": 8941, "loc": { "start": { "line": 201, @@ -32083,8 +32083,8 @@ }, { "type": "IfStatement", - "start": 8950, - "end": 9197, + "start": 8952, + "end": 9199, "loc": { "start": { "line": 203, @@ -32097,8 +32097,8 @@ }, "test": { "type": "Identifier", - "start": 8954, - "end": 8970, + "start": 8956, + "end": 8972, "loc": { "start": { "line": 203, @@ -32114,8 +32114,8 @@ }, "consequent": { "type": "BlockStatement", - "start": 8972, - "end": 9197, + "start": 8974, + "end": 9199, "loc": { "start": { "line": 203, @@ -32129,8 +32129,8 @@ "body": [ { "type": "TryStatement", - "start": 8986, - "end": 9187, + "start": 8988, + "end": 9189, "loc": { "start": { "line": 204, @@ -32143,8 +32143,8 @@ }, "block": { "type": "BlockStatement", - "start": 8990, - "end": 9067, + "start": 8992, + "end": 9069, "loc": { "start": { "line": 204, @@ -32158,8 +32158,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 9008, - "end": 9053, + "start": 9010, + "end": 9055, "loc": { "start": { "line": 205, @@ -32172,8 +32172,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 9008, - "end": 9052, + "start": 9010, + "end": 9054, "loc": { "start": { "line": 205, @@ -32187,8 +32187,8 @@ "operator": "=", "left": { "type": "Identifier", - "start": 9008, - "end": 9021, + "start": 9010, + "end": 9023, "loc": { "start": { "line": 205, @@ -32204,8 +32204,8 @@ }, "right": { "type": "CallExpression", - "start": 9024, - "end": 9052, + "start": 9026, + "end": 9054, "loc": { "start": { "line": 205, @@ -32218,8 +32218,8 @@ }, "callee": { "type": "MemberExpression", - "start": 9024, - "end": 9034, + "start": 9026, + "end": 9036, "loc": { "start": { "line": 205, @@ -32232,8 +32232,8 @@ }, "object": { "type": "Identifier", - "start": 9024, - "end": 9028, + "start": 9026, + "end": 9030, "loc": { "start": { "line": 205, @@ -32249,8 +32249,8 @@ }, "property": { "type": "Identifier", - "start": 9029, - "end": 9034, + "start": 9031, + "end": 9036, "loc": { "start": { "line": 205, @@ -32269,8 +32269,8 @@ "arguments": [ { "type": "Identifier", - "start": 9035, - "end": 9051, + "start": 9037, + "end": 9053, "loc": { "start": { "line": 205, @@ -32293,8 +32293,8 @@ }, "handler": { "type": "CatchClause", - "start": 9068, - "end": 9187, + "start": 9070, + "end": 9189, "loc": { "start": { "line": 206, @@ -32307,8 +32307,8 @@ }, "param": { "type": "Identifier", - "start": 9075, - "end": 9076, + "start": 9077, + "end": 9078, "loc": { "start": { "line": 206, @@ -32324,8 +32324,8 @@ }, "body": { "type": "BlockStatement", - "start": 9078, - "end": 9187, + "start": 9080, + "end": 9189, "loc": { "start": { "line": 206, @@ -32339,8 +32339,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 9096, - "end": 9115, + "start": 9098, + "end": 9117, "loc": { "start": { "line": 207, @@ -32353,8 +32353,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 9096, - "end": 9114, + "start": 9098, + "end": 9116, "loc": { "start": { "line": 207, @@ -32368,8 +32368,8 @@ "operator": "=", "left": { "type": "Identifier", - "start": 9096, - "end": 9109, + "start": 9098, + "end": 9111, "loc": { "start": { "line": 207, @@ -32385,8 +32385,8 @@ }, "right": { "type": "ObjectExpression", - "start": 9112, - "end": 9114, + "start": 9114, + "end": 9116, "loc": { "start": { "line": 207, @@ -32403,8 +32403,8 @@ }, { "type": "ExpressionStatement", - "start": 9132, - "end": 9173, + "start": 9134, + "end": 9175, "loc": { "start": { "line": 208, @@ -32417,8 +32417,8 @@ }, "expression": { "type": "CallExpression", - "start": 9132, - "end": 9172, + "start": 9134, + "end": 9174, "loc": { "start": { "line": 208, @@ -32431,8 +32431,8 @@ }, "callee": { "type": "Identifier", - "start": 9132, - "end": 9135, + "start": 9134, + "end": 9137, "loc": { "start": { "line": 208, @@ -32449,8 +32449,8 @@ "arguments": [ { "type": "TemplateLiteral", - "start": 9136, - "end": 9171, + "start": 9138, + "end": 9173, "loc": { "start": { "line": 208, @@ -32464,8 +32464,8 @@ "expressions": [ { "type": "Identifier", - "start": 9168, - "end": 9169, + "start": 9170, + "end": 9171, "loc": { "start": { "line": 208, @@ -32483,8 +32483,8 @@ "quasis": [ { "type": "TemplateElement", - "start": 9137, - "end": 9166, + "start": 9139, + "end": 9168, "loc": { "start": { "line": 208, @@ -32503,8 +32503,8 @@ }, { "type": "TemplateElement", - "start": 9170, - "end": 9170, + "start": 9172, + "end": 9172, "loc": { "start": { "line": 208, @@ -32540,8 +32540,8 @@ }, { "type": "ExpressionStatement", - "start": 9207, - "end": 9278, + "start": 9209, + "end": 9280, "loc": { "start": { "line": 212, @@ -32554,8 +32554,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 9207, - "end": 9277, + "start": 9209, + "end": 9279, "loc": { "start": { "line": 212, @@ -32569,8 +32569,8 @@ "operator": "=", "left": { "type": "Identifier", - "start": 9207, - "end": 9218, + "start": 9209, + "end": 9220, "loc": { "start": { "line": 212, @@ -32586,8 +32586,8 @@ }, "right": { "type": "CallExpression", - "start": 9221, - "end": 9277, + "start": 9223, + "end": 9279, "loc": { "start": { "line": 212, @@ -32600,8 +32600,8 @@ }, "callee": { "type": "Identifier", - "start": 9221, - "end": 9235, + "start": 9223, + "end": 9237, "loc": { "start": { "line": 212, @@ -32618,8 +32618,8 @@ "arguments": [ { "type": "MemberExpression", - "start": 9236, - "end": 9263, + "start": 9238, + "end": 9265, "loc": { "start": { "line": 212, @@ -32632,8 +32632,8 @@ }, "object": { "type": "Identifier", - "start": 9236, - "end": 9251, + "start": 9238, + "end": 9253, "loc": { "start": { "line": 212, @@ -32649,8 +32649,8 @@ }, "property": { "type": "Identifier", - "start": 9252, - "end": 9263, + "start": 9254, + "end": 9265, "loc": { "start": { "line": 212, @@ -32668,8 +32668,8 @@ }, { "type": "Identifier", - "start": 9265, - "end": 9276, + "start": 9267, + "end": 9278, "loc": { "start": { "line": 212, @@ -32689,8 +32689,8 @@ }, { "type": "ExpressionStatement", - "start": 9287, - "end": 9346, + "start": 9289, + "end": 9348, "loc": { "start": { "line": 213, @@ -32703,8 +32703,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 9287, - "end": 9345, + "start": 9289, + "end": 9347, "loc": { "start": { "line": 213, @@ -32718,8 +32718,8 @@ "operator": "=", "left": { "type": "Identifier", - "start": 9287, - "end": 9294, + "start": 9289, + "end": 9296, "loc": { "start": { "line": 213, @@ -32735,8 +32735,8 @@ }, "right": { "type": "CallExpression", - "start": 9297, - "end": 9345, + "start": 9299, + "end": 9347, "loc": { "start": { "line": 213, @@ -32749,8 +32749,8 @@ }, "callee": { "type": "Identifier", - "start": 9297, - "end": 9311, + "start": 9299, + "end": 9313, "loc": { "start": { "line": 213, @@ -32767,8 +32767,8 @@ "arguments": [ { "type": "MemberExpression", - "start": 9312, - "end": 9335, + "start": 9314, + "end": 9337, "loc": { "start": { "line": 213, @@ -32781,8 +32781,8 @@ }, "object": { "type": "Identifier", - "start": 9312, - "end": 9327, + "start": 9314, + "end": 9329, "loc": { "start": { "line": 213, @@ -32798,8 +32798,8 @@ }, "property": { "type": "Identifier", - "start": 9328, - "end": 9335, + "start": 9330, + "end": 9337, "loc": { "start": { "line": 213, @@ -32817,8 +32817,8 @@ }, { "type": "Identifier", - "start": 9337, - "end": 9344, + "start": 9339, + "end": 9346, "loc": { "start": { "line": 213, @@ -32838,8 +32838,8 @@ }, { "type": "ExpressionStatement", - "start": 9355, - "end": 9438, + "start": 9357, + "end": 9440, "loc": { "start": { "line": 214, @@ -32852,8 +32852,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 9355, - "end": 9437, + "start": 9357, + "end": 9439, "loc": { "start": { "line": 214, @@ -32867,8 +32867,8 @@ "operator": "=", "left": { "type": "Identifier", - "start": 9355, - "end": 9370, + "start": 9357, + "end": 9372, "loc": { "start": { "line": 214, @@ -32884,8 +32884,8 @@ }, "right": { "type": "CallExpression", - "start": 9373, - "end": 9437, + "start": 9375, + "end": 9439, "loc": { "start": { "line": 214, @@ -32898,8 +32898,8 @@ }, "callee": { "type": "Identifier", - "start": 9373, - "end": 9387, + "start": 9375, + "end": 9389, "loc": { "start": { "line": 214, @@ -32916,8 +32916,8 @@ "arguments": [ { "type": "MemberExpression", - "start": 9388, - "end": 9419, + "start": 9390, + "end": 9421, "loc": { "start": { "line": 214, @@ -32930,8 +32930,8 @@ }, "object": { "type": "Identifier", - "start": 9388, - "end": 9403, + "start": 9390, + "end": 9405, "loc": { "start": { "line": 214, @@ -32947,8 +32947,8 @@ }, "property": { "type": "Identifier", - "start": 9404, - "end": 9419, + "start": 9406, + "end": 9421, "loc": { "start": { "line": 214, @@ -32966,8 +32966,8 @@ }, { "type": "Identifier", - "start": 9421, - "end": 9436, + "start": 9423, + "end": 9438, "loc": { "start": { "line": 214, @@ -32987,8 +32987,8 @@ }, { "type": "ExpressionStatement", - "start": 9447, - "end": 9530, + "start": 9449, + "end": 9532, "loc": { "start": { "line": 215, @@ -33001,8 +33001,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 9447, - "end": 9529, + "start": 9449, + "end": 9531, "loc": { "start": { "line": 215, @@ -33016,8 +33016,8 @@ "operator": "=", "left": { "type": "Identifier", - "start": 9447, - "end": 9462, + "start": 9449, + "end": 9464, "loc": { "start": { "line": 215, @@ -33033,8 +33033,8 @@ }, "right": { "type": "CallExpression", - "start": 9465, - "end": 9529, + "start": 9467, + "end": 9531, "loc": { "start": { "line": 215, @@ -33047,8 +33047,8 @@ }, "callee": { "type": "Identifier", - "start": 9465, - "end": 9479, + "start": 9467, + "end": 9481, "loc": { "start": { "line": 215, @@ -33065,8 +33065,8 @@ "arguments": [ { "type": "MemberExpression", - "start": 9480, - "end": 9511, + "start": 9482, + "end": 9513, "loc": { "start": { "line": 215, @@ -33079,8 +33079,8 @@ }, "object": { "type": "Identifier", - "start": 9480, - "end": 9495, + "start": 9482, + "end": 9497, "loc": { "start": { "line": 215, @@ -33096,8 +33096,8 @@ }, "property": { "type": "Identifier", - "start": 9496, - "end": 9511, + "start": 9498, + "end": 9513, "loc": { "start": { "line": 215, @@ -33115,8 +33115,8 @@ }, { "type": "Identifier", - "start": 9513, - "end": 9528, + "start": 9515, + "end": 9530, "loc": { "start": { "line": 215, @@ -33136,8 +33136,8 @@ }, { "type": "ExpressionStatement", - "start": 9539, - "end": 9619, + "start": 9541, + "end": 9621, "loc": { "start": { "line": 216, @@ -33150,8 +33150,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 9539, - "end": 9618, + "start": 9541, + "end": 9620, "loc": { "start": { "line": 216, @@ -33165,8 +33165,8 @@ "operator": "=", "left": { "type": "Identifier", - "start": 9539, - "end": 9553, + "start": 9541, + "end": 9555, "loc": { "start": { "line": 216, @@ -33182,8 +33182,8 @@ }, "right": { "type": "CallExpression", - "start": 9556, - "end": 9618, + "start": 9558, + "end": 9620, "loc": { "start": { "line": 216, @@ -33196,8 +33196,8 @@ }, "callee": { "type": "Identifier", - "start": 9556, - "end": 9570, + "start": 9558, + "end": 9572, "loc": { "start": { "line": 216, @@ -33214,8 +33214,8 @@ "arguments": [ { "type": "MemberExpression", - "start": 9571, - "end": 9601, + "start": 9573, + "end": 9603, "loc": { "start": { "line": 216, @@ -33228,8 +33228,8 @@ }, "object": { "type": "Identifier", - "start": 9571, - "end": 9586, + "start": 9573, + "end": 9588, "loc": { "start": { "line": 216, @@ -33245,8 +33245,8 @@ }, "property": { "type": "Identifier", - "start": 9587, - "end": 9601, + "start": 9589, + "end": 9603, "loc": { "start": { "line": 216, @@ -33264,8 +33264,8 @@ }, { "type": "Identifier", - "start": 9603, - "end": 9617, + "start": 9605, + "end": 9619, "loc": { "start": { "line": 216, @@ -33285,8 +33285,8 @@ }, { "type": "ExpressionStatement", - "start": 9628, - "end": 9702, + "start": 9630, + "end": 9704, "loc": { "start": { "line": 217, @@ -33299,8 +33299,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 9628, - "end": 9701, + "start": 9630, + "end": 9703, "loc": { "start": { "line": 217, @@ -33314,8 +33314,8 @@ "operator": "=", "left": { "type": "Identifier", - "start": 9628, - "end": 9640, + "start": 9630, + "end": 9642, "loc": { "start": { "line": 217, @@ -33331,8 +33331,8 @@ }, "right": { "type": "CallExpression", - "start": 9643, - "end": 9701, + "start": 9645, + "end": 9703, "loc": { "start": { "line": 217, @@ -33345,8 +33345,8 @@ }, "callee": { "type": "Identifier", - "start": 9643, - "end": 9657, + "start": 9645, + "end": 9659, "loc": { "start": { "line": 217, @@ -33363,8 +33363,8 @@ "arguments": [ { "type": "MemberExpression", - "start": 9658, - "end": 9686, + "start": 9660, + "end": 9688, "loc": { "start": { "line": 217, @@ -33377,8 +33377,8 @@ }, "object": { "type": "Identifier", - "start": 9658, - "end": 9673, + "start": 9660, + "end": 9675, "loc": { "start": { "line": 217, @@ -33394,8 +33394,8 @@ }, "property": { "type": "Identifier", - "start": 9674, - "end": 9686, + "start": 9676, + "end": 9688, "loc": { "start": { "line": 217, @@ -33413,8 +33413,8 @@ }, { "type": "Identifier", - "start": 9688, - "end": 9700, + "start": 9690, + "end": 9702, "loc": { "start": { "line": 217, @@ -33434,8 +33434,8 @@ }, { "type": "ExpressionStatement", - "start": 9711, - "end": 9785, + "start": 9713, + "end": 9787, "loc": { "start": { "line": 218, @@ -33448,8 +33448,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 9711, - "end": 9784, + "start": 9713, + "end": 9786, "loc": { "start": { "line": 218, @@ -33463,8 +33463,8 @@ "operator": "=", "left": { "type": "Identifier", - "start": 9711, - "end": 9723, + "start": 9713, + "end": 9725, "loc": { "start": { "line": 218, @@ -33480,8 +33480,8 @@ }, "right": { "type": "CallExpression", - "start": 9726, - "end": 9784, + "start": 9728, + "end": 9786, "loc": { "start": { "line": 218, @@ -33494,8 +33494,8 @@ }, "callee": { "type": "Identifier", - "start": 9726, - "end": 9740, + "start": 9728, + "end": 9742, "loc": { "start": { "line": 218, @@ -33512,8 +33512,8 @@ "arguments": [ { "type": "MemberExpression", - "start": 9741, - "end": 9769, + "start": 9743, + "end": 9771, "loc": { "start": { "line": 218, @@ -33526,8 +33526,8 @@ }, "object": { "type": "Identifier", - "start": 9741, - "end": 9756, + "start": 9743, + "end": 9758, "loc": { "start": { "line": 218, @@ -33543,8 +33543,8 @@ }, "property": { "type": "Identifier", - "start": 9757, - "end": 9769, + "start": 9759, + "end": 9771, "loc": { "start": { "line": 218, @@ -33562,8 +33562,8 @@ }, { "type": "Identifier", - "start": 9771, - "end": 9783, + "start": 9773, + "end": 9785, "loc": { "start": { "line": 218, @@ -33583,8 +33583,8 @@ }, { "type": "IfStatement", - "start": 9795, - "end": 9884, + "start": 9797, + "end": 9886, "loc": { "start": { "line": 220, @@ -33597,8 +33597,8 @@ }, "test": { "type": "BinaryExpression", - "start": 9799, - "end": 9824, + "start": 9801, + "end": 9826, "loc": { "start": { "line": 220, @@ -33611,8 +33611,8 @@ }, "left": { "type": "Identifier", - "start": 9799, - "end": 9814, + "start": 9801, + "end": 9816, "loc": { "start": { "line": 220, @@ -33629,8 +33629,8 @@ "operator": "===", "right": { "type": "BooleanLiteral", - "start": 9819, - "end": 9824, + "start": 9821, + "end": 9826, "loc": { "start": { "line": 220, @@ -33646,8 +33646,8 @@ }, "consequent": { "type": "BlockStatement", - "start": 9826, - "end": 9884, + "start": 9828, + "end": 9886, "loc": { "start": { "line": 220, @@ -33661,8 +33661,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 9840, - "end": 9874, + "start": 9842, + "end": 9876, "loc": { "start": { "line": 221, @@ -33675,8 +33675,8 @@ }, "expression": { "type": "CallExpression", - "start": 9840, - "end": 9873, + "start": 9842, + "end": 9875, "loc": { "start": { "line": 221, @@ -33689,8 +33689,8 @@ }, "callee": { "type": "Identifier", - "start": 9840, - "end": 9843, + "start": 9842, + "end": 9845, "loc": { "start": { "line": 221, @@ -33707,8 +33707,8 @@ "arguments": [ { "type": "StringLiteral", - "start": 9844, - "end": 9872, + "start": 9846, + "end": 9874, "loc": { "start": { "line": 221, @@ -33735,8 +33735,8 @@ }, { "type": "VariableDeclaration", - "start": 9894, - "end": 9984, + "start": 9896, + "end": 9986, "loc": { "start": { "line": 224, @@ -33750,8 +33750,8 @@ "declarations": [ { "type": "VariableDeclarator", - "start": 9900, - "end": 9983, + "start": 9902, + "end": 9985, "loc": { "start": { "line": 224, @@ -33764,8 +33764,8 @@ }, "id": { "type": "Identifier", - "start": 9900, - "end": 9908, + "start": 9902, + "end": 9910, "loc": { "start": { "line": 224, @@ -33781,8 +33781,8 @@ }, "init": { "type": "NewExpression", - "start": 9911, - "end": 9983, + "start": 9913, + "end": 9985, "loc": { "start": { "line": 224, @@ -33795,8 +33795,8 @@ }, "callee": { "type": "Identifier", - "start": 9915, - "end": 9923, + "start": 9917, + "end": 9925, "loc": { "start": { "line": 224, @@ -33813,8 +33813,8 @@ "arguments": [ { "type": "ObjectExpression", - "start": 9924, - "end": 9982, + "start": 9926, + "end": 9984, "loc": { "start": { "line": 224, @@ -33828,8 +33828,8 @@ "properties": [ { "type": "ObjectProperty", - "start": 9938, - "end": 9949, + "start": 9940, + "end": 9951, "loc": { "start": { "line": 225, @@ -33845,8 +33845,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 9938, - "end": 9949, + "start": 9940, + "end": 9951, "loc": { "start": { "line": 225, @@ -33862,8 +33862,8 @@ }, "value": { "type": "Identifier", - "start": 9938, - "end": 9949, + "start": 9940, + "end": 9951, "loc": { "start": { "line": 225, @@ -33883,8 +33883,8 @@ }, { "type": "ObjectProperty", - "start": 9963, - "end": 9972, + "start": 9965, + "end": 9974, "loc": { "start": { "line": 226, @@ -33900,8 +33900,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 9963, - "end": 9972, + "start": 9965, + "end": 9974, "loc": { "start": { "line": 226, @@ -33917,8 +33917,8 @@ }, "value": { "type": "Identifier", - "start": 9963, - "end": 9972, + "start": 9965, + "end": 9974, "loc": { "start": { "line": 226, @@ -33946,8 +33946,8 @@ }, { "type": "SwitchStatement", - "start": 9994, - "end": 14682, + "start": 9996, + "end": 14684, "loc": { "start": { "line": 229, @@ -33960,8 +33960,8 @@ }, "discriminant": { "type": "Identifier", - "start": 10002, - "end": 10005, + "start": 10004, + "end": 10007, "loc": { "start": { "line": 229, @@ -33978,8 +33978,8 @@ "cases": [ { "type": "SwitchCase", - "start": 10021, - "end": 10399, + "start": 10023, + "end": 10401, "loc": { "start": { "line": 230, @@ -33993,8 +33993,8 @@ "consequent": [ { "type": "ExpressionStatement", - "start": 10050, - "end": 10376, + "start": 10052, + "end": 10378, "loc": { "start": { "line": 231, @@ -34007,8 +34007,8 @@ }, "expression": { "type": "CallExpression", - "start": 10050, - "end": 10375, + "start": 10052, + "end": 10377, "loc": { "start": { "line": 231, @@ -34021,8 +34021,8 @@ }, "callee": { "type": "Identifier", - "start": 10050, - "end": 10057, + "start": 10052, + "end": 10059, "loc": { "start": { "line": 231, @@ -34039,8 +34039,8 @@ "arguments": [ { "type": "Identifier", - "start": 10058, - "end": 10083, + "start": 10060, + "end": 10085, "loc": { "start": { "line": 231, @@ -34056,8 +34056,8 @@ }, { "type": "ObjectExpression", - "start": 10085, - "end": 10374, + "start": 10087, + "end": 10376, "loc": { "start": { "line": 231, @@ -34071,8 +34071,8 @@ "properties": [ { "type": "ObjectProperty", - "start": 10107, - "end": 10135, + "start": 10109, + "end": 10137, "loc": { "start": { "line": 232, @@ -34088,8 +34088,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 10107, - "end": 10111, + "start": 10109, + "end": 10113, "loc": { "start": { "line": 232, @@ -34105,8 +34105,8 @@ }, "value": { "type": "CallExpression", - "start": 10113, - "end": 10135, + "start": 10115, + "end": 10137, "loc": { "start": { "line": 232, @@ -34119,8 +34119,8 @@ }, "callee": { "type": "MemberExpression", - "start": 10113, - "end": 10123, + "start": 10115, + "end": 10125, "loc": { "start": { "line": 232, @@ -34133,8 +34133,8 @@ }, "object": { "type": "Identifier", - "start": 10113, - "end": 10117, + "start": 10115, + "end": 10119, "loc": { "start": { "line": 232, @@ -34150,8 +34150,8 @@ }, "property": { "type": "Identifier", - "start": 10118, - "end": 10123, + "start": 10120, + "end": 10125, "loc": { "start": { "line": 232, @@ -34170,8 +34170,8 @@ "arguments": [ { "type": "Identifier", - "start": 10124, - "end": 10134, + "start": 10126, + "end": 10136, "loc": { "start": { "line": 232, @@ -34190,8 +34190,8 @@ }, { "type": "ObjectProperty", - "start": 10157, - "end": 10165, + "start": 10159, + "end": 10167, "loc": { "start": { "line": 233, @@ -34207,8 +34207,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 10157, - "end": 10165, + "start": 10159, + "end": 10167, "loc": { "start": { "line": 233, @@ -34224,8 +34224,8 @@ }, "value": { "type": "Identifier", - "start": 10157, - "end": 10165, + "start": 10159, + "end": 10167, "loc": { "start": { "line": 233, @@ -34245,8 +34245,8 @@ }, { "type": "ObjectProperty", - "start": 10187, - "end": 10192, + "start": 10189, + "end": 10194, "loc": { "start": { "line": 234, @@ -34262,8 +34262,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 10187, - "end": 10192, + "start": 10189, + "end": 10194, "loc": { "start": { "line": 234, @@ -34279,8 +34279,8 @@ }, "value": { "type": "Identifier", - "start": 10187, - "end": 10192, + "start": 10189, + "end": 10194, "loc": { "start": { "line": 234, @@ -34300,8 +34300,8 @@ }, { "type": "ObjectProperty", - "start": 10214, - "end": 10221, + "start": 10216, + "end": 10223, "loc": { "start": { "line": 235, @@ -34317,8 +34317,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 10214, - "end": 10221, + "start": 10216, + "end": 10223, "loc": { "start": { "line": 235, @@ -34334,8 +34334,8 @@ }, "value": { "type": "Identifier", - "start": 10214, - "end": 10221, + "start": 10216, + "end": 10223, "loc": { "start": { "line": 235, @@ -34355,8 +34355,8 @@ }, { "type": "ObjectProperty", - "start": 10243, - "end": 10273, + "start": 10245, + "end": 10275, "loc": { "start": { "line": 236, @@ -34372,8 +34372,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 10243, - "end": 10249, + "start": 10245, + "end": 10251, "loc": { "start": { "line": 236, @@ -34389,8 +34389,8 @@ }, "value": { "type": "MemberExpression", - "start": 10251, - "end": 10273, + "start": 10253, + "end": 10275, "loc": { "start": { "line": 236, @@ -34403,8 +34403,8 @@ }, "object": { "type": "Identifier", - "start": 10251, - "end": 10266, + "start": 10253, + "end": 10268, "loc": { "start": { "line": 236, @@ -34420,8 +34420,8 @@ }, "property": { "type": "Identifier", - "start": 10267, - "end": 10273, + "start": 10269, + "end": 10275, "loc": { "start": { "line": 236, @@ -34440,8 +34440,8 @@ }, { "type": "ObjectProperty", - "start": 10295, - "end": 10331, + "start": 10297, + "end": 10333, "loc": { "start": { "line": 237, @@ -34457,8 +34457,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 10295, - "end": 10304, + "start": 10297, + "end": 10306, "loc": { "start": { "line": 237, @@ -34474,8 +34474,8 @@ }, "value": { "type": "MemberExpression", - "start": 10306, - "end": 10331, + "start": 10308, + "end": 10333, "loc": { "start": { "line": 237, @@ -34488,8 +34488,8 @@ }, "object": { "type": "Identifier", - "start": 10306, - "end": 10321, + "start": 10308, + "end": 10323, "loc": { "start": { "line": 237, @@ -34505,8 +34505,8 @@ }, "property": { "type": "Identifier", - "start": 10322, - "end": 10331, + "start": 10324, + "end": 10333, "loc": { "start": { "line": 237, @@ -34525,8 +34525,8 @@ }, { "type": "ObjectProperty", - "start": 10353, - "end": 10356, + "start": 10355, + "end": 10358, "loc": { "start": { "line": 238, @@ -34542,8 +34542,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 10353, - "end": 10356, + "start": 10355, + "end": 10358, "loc": { "start": { "line": 238, @@ -34559,8 +34559,8 @@ }, "value": { "type": "Identifier", - "start": 10353, - "end": 10356, + "start": 10355, + "end": 10358, "loc": { "start": { "line": 238, @@ -34585,8 +34585,8 @@ }, { "type": "BreakStatement", - "start": 10393, - "end": 10399, + "start": 10395, + "end": 10401, "loc": { "start": { "line": 240, @@ -34602,8 +34602,8 @@ ], "test": { "type": "StringLiteral", - "start": 10026, - "end": 10032, + "start": 10028, + "end": 10034, "loc": { "start": { "line": 230, @@ -34623,8 +34623,8 @@ }, { "type": "SwitchCase", - "start": 10413, - "end": 10857, + "start": 10415, + "end": 10859, "loc": { "start": { "line": 242, @@ -34638,8 +34638,8 @@ "consequent": [ { "type": "ExpressionStatement", - "start": 10441, - "end": 10480, + "start": 10443, + "end": 10482, "loc": { "start": { "line": 243, @@ -34652,8 +34652,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 10441, - "end": 10479, + "start": 10443, + "end": 10481, "loc": { "start": { "line": 243, @@ -34667,8 +34667,8 @@ "operator": "=", "left": { "type": "Identifier", - "start": 10441, - "end": 10451, + "start": 10443, + "end": 10453, "loc": { "start": { "line": 243, @@ -34684,8 +34684,8 @@ }, "right": { "type": "CallExpression", - "start": 10454, - "end": 10479, + "start": 10456, + "end": 10481, "loc": { "start": { "line": 243, @@ -34698,8 +34698,8 @@ }, "callee": { "type": "Identifier", - "start": 10454, - "end": 10467, + "start": 10456, + "end": 10469, "loc": { "start": { "line": 243, @@ -34716,8 +34716,8 @@ "arguments": [ { "type": "Identifier", - "start": 10468, - "end": 10478, + "start": 10470, + "end": 10480, "loc": { "start": { "line": 243, @@ -34737,8 +34737,8 @@ }, { "type": "ExpressionStatement", - "start": 10497, - "end": 10834, + "start": 10499, + "end": 10836, "loc": { "start": { "line": 244, @@ -34751,8 +34751,8 @@ }, "expression": { "type": "CallExpression", - "start": 10497, - "end": 10833, + "start": 10499, + "end": 10835, "loc": { "start": { "line": 244, @@ -34765,8 +34765,8 @@ }, "callee": { "type": "Identifier", - "start": 10497, - "end": 10504, + "start": 10499, + "end": 10506, "loc": { "start": { "line": 244, @@ -34783,8 +34783,8 @@ "arguments": [ { "type": "Identifier", - "start": 10505, - "end": 10526, + "start": 10507, + "end": 10528, "loc": { "start": { "line": 244, @@ -34800,8 +34800,8 @@ }, { "type": "ObjectExpression", - "start": 10528, - "end": 10832, + "start": 10530, + "end": 10834, "loc": { "start": { "line": 244, @@ -34815,8 +34815,8 @@ "properties": [ { "type": "ObjectProperty", - "start": 10550, - "end": 10566, + "start": 10552, + "end": 10568, "loc": { "start": { "line": 245, @@ -34832,8 +34832,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 10550, - "end": 10554, + "start": 10552, + "end": 10556, "loc": { "start": { "line": 245, @@ -34849,8 +34849,8 @@ }, "value": { "type": "Identifier", - "start": 10556, - "end": 10566, + "start": 10558, + "end": 10568, "loc": { "start": { "line": 245, @@ -34867,8 +34867,8 @@ }, { "type": "ObjectProperty", - "start": 10588, - "end": 10603, + "start": 10590, + "end": 10605, "loc": { "start": { "line": 246, @@ -34884,8 +34884,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 10588, - "end": 10603, + "start": 10590, + "end": 10605, "loc": { "start": { "line": 246, @@ -34901,8 +34901,8 @@ }, "value": { "type": "Identifier", - "start": 10588, - "end": 10603, + "start": 10590, + "end": 10605, "loc": { "start": { "line": 246, @@ -34922,8 +34922,8 @@ }, { "type": "ObjectProperty", - "start": 10625, - "end": 10646, + "start": 10627, + "end": 10648, "loc": { "start": { "line": 247, @@ -34939,8 +34939,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 10625, - "end": 10640, + "start": 10627, + "end": 10642, "loc": { "start": { "line": 247, @@ -34956,8 +34956,8 @@ }, "value": { "type": "BooleanLiteral", - "start": 10642, - "end": 10646, + "start": 10644, + "end": 10648, "loc": { "start": { "line": 247, @@ -34973,8 +34973,8 @@ }, { "type": "ObjectProperty", - "start": 10668, - "end": 10682, + "start": 10670, + "end": 10684, "loc": { "start": { "line": 248, @@ -34990,8 +34990,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 10668, - "end": 10682, + "start": 10670, + "end": 10684, "loc": { "start": { "line": 248, @@ -35007,8 +35007,8 @@ }, "value": { "type": "Identifier", - "start": 10668, - "end": 10682, + "start": 10670, + "end": 10684, "loc": { "start": { "line": 248, @@ -35028,8 +35028,8 @@ }, { "type": "ObjectProperty", - "start": 10704, - "end": 10732, + "start": 10706, + "end": 10734, "loc": { "start": { "line": 249, @@ -35045,8 +35045,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 10704, - "end": 10717, + "start": 10706, + "end": 10719, "loc": { "start": { "line": 249, @@ -35062,8 +35062,8 @@ }, "value": { "type": "Identifier", - "start": 10719, - "end": 10732, + "start": 10721, + "end": 10734, "loc": { "start": { "line": 249, @@ -35080,8 +35080,8 @@ }, { "type": "ObjectProperty", - "start": 10754, - "end": 10762, + "start": 10756, + "end": 10764, "loc": { "start": { "line": 250, @@ -35097,8 +35097,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 10754, - "end": 10762, + "start": 10756, + "end": 10764, "loc": { "start": { "line": 250, @@ -35114,8 +35114,8 @@ }, "value": { "type": "Identifier", - "start": 10754, - "end": 10762, + "start": 10756, + "end": 10764, "loc": { "start": { "line": 250, @@ -35135,8 +35135,8 @@ }, { "type": "ObjectProperty", - "start": 10784, - "end": 10789, + "start": 10786, + "end": 10791, "loc": { "start": { "line": 251, @@ -35152,8 +35152,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 10784, - "end": 10789, + "start": 10786, + "end": 10791, "loc": { "start": { "line": 251, @@ -35169,8 +35169,8 @@ }, "value": { "type": "Identifier", - "start": 10784, - "end": 10789, + "start": 10786, + "end": 10791, "loc": { "start": { "line": 251, @@ -35190,8 +35190,8 @@ }, { "type": "ObjectProperty", - "start": 10811, - "end": 10814, + "start": 10813, + "end": 10816, "loc": { "start": { "line": 252, @@ -35207,8 +35207,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 10811, - "end": 10814, + "start": 10813, + "end": 10816, "loc": { "start": { "line": 252, @@ -35224,8 +35224,8 @@ }, "value": { "type": "Identifier", - "start": 10811, - "end": 10814, + "start": 10813, + "end": 10816, "loc": { "start": { "line": 252, @@ -35250,8 +35250,8 @@ }, { "type": "BreakStatement", - "start": 10851, - "end": 10857, + "start": 10853, + "end": 10859, "loc": { "start": { "line": 254, @@ -35267,8 +35267,8 @@ ], "test": { "type": "StringLiteral", - "start": 10418, - "end": 10423, + "start": 10420, + "end": 10425, "loc": { "start": { "line": 242, @@ -35288,8 +35288,8 @@ }, { "type": "SwitchCase", - "start": 10871, - "end": 11432, + "start": 10873, + "end": 11434, "loc": { "start": { "line": 256, @@ -35303,8 +35303,8 @@ "consequent": [ { "type": "ExpressionStatement", - "start": 10900, - "end": 10939, + "start": 10902, + "end": 10941, "loc": { "start": { "line": 257, @@ -35317,8 +35317,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 10900, - "end": 10938, + "start": 10902, + "end": 10940, "loc": { "start": { "line": 257, @@ -35332,8 +35332,8 @@ "operator": "=", "left": { "type": "Identifier", - "start": 10900, - "end": 10910, + "start": 10902, + "end": 10912, "loc": { "start": { "line": 257, @@ -35349,8 +35349,8 @@ }, "right": { "type": "CallExpression", - "start": 10913, - "end": 10938, + "start": 10915, + "end": 10940, "loc": { "start": { "line": 257, @@ -35363,8 +35363,8 @@ }, "callee": { "type": "Identifier", - "start": 10913, - "end": 10926, + "start": 10915, + "end": 10928, "loc": { "start": { "line": 257, @@ -35381,8 +35381,8 @@ "arguments": [ { "type": "Identifier", - "start": 10927, - "end": 10937, + "start": 10929, + "end": 10939, "loc": { "start": { "line": 257, @@ -35402,8 +35402,8 @@ }, { "type": "VariableDeclaration", - "start": 10956, - "end": 11012, + "start": 10958, + "end": 11014, "loc": { "start": { "line": 258, @@ -35417,8 +35417,8 @@ "declarations": [ { "type": "VariableDeclarator", - "start": 10962, - "end": 11011, + "start": 10964, + "end": 11013, "loc": { "start": { "line": 258, @@ -35431,8 +35431,8 @@ }, "id": { "type": "Identifier", - "start": 10962, - "end": 10974, + "start": 10964, + "end": 10976, "loc": { "start": { "line": 258, @@ -35448,8 +35448,8 @@ }, "init": { "type": "ConditionalExpression", - "start": 10977, - "end": 11011, + "start": 10979, + "end": 11013, "loc": { "start": { "line": 258, @@ -35462,8 +35462,8 @@ }, "test": { "type": "Identifier", - "start": 10977, - "end": 10983, + "start": 10979, + "end": 10985, "loc": { "start": { "line": 258, @@ -35479,8 +35479,8 @@ }, "consequent": { "type": "CallExpression", - "start": 10986, - "end": 11006, + "start": 10988, + "end": 11008, "loc": { "start": { "line": 258, @@ -35493,8 +35493,8 @@ }, "callee": { "type": "MemberExpression", - "start": 10986, - "end": 10998, + "start": 10988, + "end": 11000, "loc": { "start": { "line": 258, @@ -35507,8 +35507,8 @@ }, "object": { "type": "Identifier", - "start": 10986, - "end": 10990, + "start": 10988, + "end": 10992, "loc": { "start": { "line": 258, @@ -35524,8 +35524,8 @@ }, "property": { "type": "Identifier", - "start": 10991, - "end": 10998, + "start": 10993, + "end": 11000, "loc": { "start": { "line": 258, @@ -35544,8 +35544,8 @@ "arguments": [ { "type": "Identifier", - "start": 10999, - "end": 11005, + "start": 11001, + "end": 11007, "loc": { "start": { "line": 258, @@ -35563,8 +35563,8 @@ }, "alternate": { "type": "StringLiteral", - "start": 11009, - "end": 11011, + "start": 11011, + "end": 11013, "loc": { "start": { "line": 258, @@ -35588,8 +35588,8 @@ }, { "type": "ExpressionStatement", - "start": 11029, - "end": 11409, + "start": 11031, + "end": 11411, "loc": { "start": { "line": 259, @@ -35602,8 +35602,8 @@ }, "expression": { "type": "CallExpression", - "start": 11029, - "end": 11408, + "start": 11031, + "end": 11410, "loc": { "start": { "line": 259, @@ -35616,8 +35616,8 @@ }, "callee": { "type": "Identifier", - "start": 11029, - "end": 11036, + "start": 11031, + "end": 11038, "loc": { "start": { "line": 259, @@ -35634,8 +35634,8 @@ "arguments": [ { "type": "Identifier", - "start": 11037, - "end": 11058, + "start": 11039, + "end": 11060, "loc": { "start": { "line": 259, @@ -35651,8 +35651,8 @@ }, { "type": "ObjectExpression", - "start": 11060, - "end": 11407, + "start": 11062, + "end": 11409, "loc": { "start": { "line": 259, @@ -35666,8 +35666,8 @@ "properties": [ { "type": "ObjectProperty", - "start": 11082, - "end": 11103, + "start": 11084, + "end": 11105, "loc": { "start": { "line": 260, @@ -35683,8 +35683,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 11082, - "end": 11089, + "start": 11084, + "end": 11091, "loc": { "start": { "line": 260, @@ -35700,8 +35700,8 @@ }, "value": { "type": "Identifier", - "start": 11091, - "end": 11103, + "start": 11093, + "end": 11105, "loc": { "start": { "line": 260, @@ -35718,8 +35718,8 @@ }, { "type": "ObjectProperty", - "start": 11125, - "end": 11141, + "start": 11127, + "end": 11143, "loc": { "start": { "line": 261, @@ -35735,8 +35735,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 11125, - "end": 11129, + "start": 11127, + "end": 11131, "loc": { "start": { "line": 261, @@ -35752,8 +35752,8 @@ }, "value": { "type": "Identifier", - "start": 11131, - "end": 11141, + "start": 11133, + "end": 11143, "loc": { "start": { "line": 261, @@ -35770,8 +35770,8 @@ }, { "type": "ObjectProperty", - "start": 11163, - "end": 11178, + "start": 11165, + "end": 11180, "loc": { "start": { "line": 262, @@ -35787,8 +35787,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 11163, - "end": 11178, + "start": 11165, + "end": 11180, "loc": { "start": { "line": 262, @@ -35804,8 +35804,8 @@ }, "value": { "type": "Identifier", - "start": 11163, - "end": 11178, + "start": 11165, + "end": 11180, "loc": { "start": { "line": 262, @@ -35825,8 +35825,8 @@ }, { "type": "ObjectProperty", - "start": 11200, - "end": 11221, + "start": 11202, + "end": 11223, "loc": { "start": { "line": 263, @@ -35842,8 +35842,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 11200, - "end": 11215, + "start": 11202, + "end": 11217, "loc": { "start": { "line": 263, @@ -35859,8 +35859,8 @@ }, "value": { "type": "BooleanLiteral", - "start": 11217, - "end": 11221, + "start": 11219, + "end": 11223, "loc": { "start": { "line": 263, @@ -35876,8 +35876,8 @@ }, { "type": "ObjectProperty", - "start": 11243, - "end": 11257, + "start": 11245, + "end": 11259, "loc": { "start": { "line": 264, @@ -35893,8 +35893,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 11243, - "end": 11257, + "start": 11245, + "end": 11259, "loc": { "start": { "line": 264, @@ -35910,8 +35910,8 @@ }, "value": { "type": "Identifier", - "start": 11243, - "end": 11257, + "start": 11245, + "end": 11259, "loc": { "start": { "line": 264, @@ -35931,8 +35931,8 @@ }, { "type": "ObjectProperty", - "start": 11279, - "end": 11307, + "start": 11281, + "end": 11309, "loc": { "start": { "line": 265, @@ -35948,8 +35948,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 11279, - "end": 11292, + "start": 11281, + "end": 11294, "loc": { "start": { "line": 265, @@ -35965,8 +35965,8 @@ }, "value": { "type": "Identifier", - "start": 11294, - "end": 11307, + "start": 11296, + "end": 11309, "loc": { "start": { "line": 265, @@ -35983,8 +35983,8 @@ }, { "type": "ObjectProperty", - "start": 11329, - "end": 11337, + "start": 11331, + "end": 11339, "loc": { "start": { "line": 266, @@ -36000,8 +36000,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 11329, - "end": 11337, + "start": 11331, + "end": 11339, "loc": { "start": { "line": 266, @@ -36017,8 +36017,8 @@ }, "value": { "type": "Identifier", - "start": 11329, - "end": 11337, + "start": 11331, + "end": 11339, "loc": { "start": { "line": 266, @@ -36038,8 +36038,8 @@ }, { "type": "ObjectProperty", - "start": 11359, - "end": 11364, + "start": 11361, + "end": 11366, "loc": { "start": { "line": 267, @@ -36055,8 +36055,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 11359, - "end": 11364, + "start": 11361, + "end": 11366, "loc": { "start": { "line": 267, @@ -36072,8 +36072,8 @@ }, "value": { "type": "Identifier", - "start": 11359, - "end": 11364, + "start": 11361, + "end": 11366, "loc": { "start": { "line": 267, @@ -36093,8 +36093,8 @@ }, { "type": "ObjectProperty", - "start": 11386, - "end": 11389, + "start": 11388, + "end": 11391, "loc": { "start": { "line": 268, @@ -36110,8 +36110,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 11386, - "end": 11389, + "start": 11388, + "end": 11391, "loc": { "start": { "line": 268, @@ -36127,8 +36127,8 @@ }, "value": { "type": "Identifier", - "start": 11386, - "end": 11389, + "start": 11388, + "end": 11391, "loc": { "start": { "line": 268, @@ -36153,8 +36153,8 @@ }, { "type": "BreakStatement", - "start": 11426, - "end": 11432, + "start": 11428, + "end": 11434, "loc": { "start": { "line": 270, @@ -36172,8 +36172,8 @@ ], "test": { "type": "StringLiteral", - "start": 10876, - "end": 10882, + "start": 10878, + "end": 10884, "loc": { "start": { "line": 256, @@ -36194,8 +36194,8 @@ { "type": "CommentLine", "value": " case \"gltf\":", - "start": 11446, - "end": 11461, + "start": 11448, + "end": 11463, "loc": { "start": { "line": 272, @@ -36210,8 +36210,8 @@ { "type": "CommentLine", "value": " const gltfJSON = JSON.parse(sourceData);", - "start": 11474, - "end": 11521, + "start": 11476, + "end": 11523, "loc": { "start": { "line": 273, @@ -36226,8 +36226,8 @@ { "type": "CommentLine", "value": " const gltfBasePath = source ? getBasePath(source) : \"\";", - "start": 11534, - "end": 11596, + "start": 11536, + "end": 11598, "loc": { "start": { "line": 274, @@ -36242,8 +36242,8 @@ { "type": "CommentLine", "value": " convert(parseGLTFIntoXKTModel, {", - "start": 11609, - "end": 11648, + "start": 11611, + "end": 11650, "loc": { "start": { "line": 275, @@ -36258,8 +36258,8 @@ { "type": "CommentLine", "value": " baseUri: gltfBasePath,", - "start": 11661, - "end": 11694, + "start": 11663, + "end": 11696, "loc": { "start": { "line": 276, @@ -36274,8 +36274,8 @@ { "type": "CommentLine", "value": " data: gltfJSON,", - "start": 11707, - "end": 11733, + "start": 11709, + "end": 11735, "loc": { "start": { "line": 277, @@ -36290,8 +36290,8 @@ { "type": "CommentLine", "value": " reuseGeometries,", - "start": 11746, - "end": 11773, + "start": 11748, + "end": 11775, "loc": { "start": { "line": 278, @@ -36306,8 +36306,8 @@ { "type": "CommentLine", "value": " includeTextures,", - "start": 11786, - "end": 11813, + "start": 11788, + "end": 11815, "loc": { "start": { "line": 279, @@ -36322,8 +36322,8 @@ { "type": "CommentLine", "value": " includeNormals,", - "start": 11826, - "end": 11852, + "start": 11828, + "end": 11854, "loc": { "start": { "line": 280, @@ -36338,8 +36338,8 @@ { "type": "CommentLine", "value": " metaModelData: metaModelJSON,", - "start": 11865, - "end": 11905, + "start": 11867, + "end": 11907, "loc": { "start": { "line": 281, @@ -36354,8 +36354,8 @@ { "type": "CommentLine", "value": " xktModel,", - "start": 11918, - "end": 11938, + "start": 11920, + "end": 11940, "loc": { "start": { "line": 282, @@ -36370,8 +36370,8 @@ { "type": "CommentLine", "value": " getAttachment: async (name) => {", - "start": 11951, - "end": 11994, + "start": 11953, + "end": 11996, "loc": { "start": { "line": 283, @@ -36386,8 +36386,8 @@ { "type": "CommentLine", "value": " const filePath = gltfBasePath + name;", - "start": 12007, - "end": 12059, + "start": 12009, + "end": 12061, "loc": { "start": { "line": 284, @@ -36402,8 +36402,8 @@ { "type": "CommentLine", "value": " log(`Reading attachment file: ${filePath}`);", - "start": 12072, - "end": 12131, + "start": 12074, + "end": 12133, "loc": { "start": { "line": 285, @@ -36418,8 +36418,8 @@ { "type": "CommentLine", "value": " const buffer = fs.readFileSync(filePath);", - "start": 12144, - "end": 12200, + "start": 12146, + "end": 12202, "loc": { "start": { "line": 286, @@ -36434,8 +36434,8 @@ { "type": "CommentLine", "value": " const arrayBuf = toArrayBuffer(buffer);", - "start": 12213, - "end": 12267, + "start": 12215, + "end": 12269, "loc": { "start": { "line": 287, @@ -36450,8 +36450,8 @@ { "type": "CommentLine", "value": " return arrayBuf;", - "start": 12280, - "end": 12311, + "start": 12282, + "end": 12313, "loc": { "start": { "line": 288, @@ -36466,8 +36466,8 @@ { "type": "CommentLine", "value": " },", - "start": 12324, - "end": 12337, + "start": 12326, + "end": 12339, "loc": { "start": { "line": 289, @@ -36482,8 +36482,8 @@ { "type": "CommentLine", "value": " stats,", - "start": 12350, - "end": 12367, + "start": 12352, + "end": 12369, "loc": { "start": { "line": 290, @@ -36498,8 +36498,8 @@ { "type": "CommentLine", "value": " log", - "start": 12380, - "end": 12394, + "start": 12382, + "end": 12396, "loc": { "start": { "line": 291, @@ -36514,8 +36514,8 @@ { "type": "CommentLine", "value": " });", - "start": 12407, - "end": 12417, + "start": 12409, + "end": 12419, "loc": { "start": { "line": 292, @@ -36530,8 +36530,8 @@ { "type": "CommentLine", "value": " break;", - "start": 12430, - "end": 12443, + "start": 12432, + "end": 12445, "loc": { "start": { "line": 293, @@ -36547,8 +36547,8 @@ }, { "type": "SwitchCase", - "start": 12457, - "end": 12810, + "start": 12459, + "end": 12812, "loc": { "start": { "line": 295, @@ -36562,8 +36562,8 @@ "consequent": [ { "type": "ExpressionStatement", - "start": 12485, - "end": 12787, + "start": 12487, + "end": 12789, "loc": { "start": { "line": 296, @@ -36576,8 +36576,8 @@ }, "expression": { "type": "CallExpression", - "start": 12485, - "end": 12786, + "start": 12487, + "end": 12788, "loc": { "start": { "line": 296, @@ -36590,8 +36590,8 @@ }, "callee": { "type": "Identifier", - "start": 12485, - "end": 12492, + "start": 12487, + "end": 12494, "loc": { "start": { "line": 296, @@ -36608,8 +36608,8 @@ "arguments": [ { "type": "Identifier", - "start": 12493, - "end": 12513, + "start": 12495, + "end": 12515, "loc": { "start": { "line": 296, @@ -36625,8 +36625,8 @@ }, { "type": "ObjectExpression", - "start": 12515, - "end": 12785, + "start": 12517, + "end": 12787, "loc": { "start": { "line": 296, @@ -36640,8 +36640,8 @@ "properties": [ { "type": "ObjectProperty", - "start": 12537, - "end": 12543, + "start": 12539, + "end": 12545, "loc": { "start": { "line": 297, @@ -36657,8 +36657,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 12537, - "end": 12543, + "start": 12539, + "end": 12545, "loc": { "start": { "line": 297, @@ -36674,8 +36674,8 @@ }, "value": { "type": "Identifier", - "start": 12537, - "end": 12543, + "start": 12539, + "end": 12545, "loc": { "start": { "line": 297, @@ -36695,8 +36695,8 @@ }, { "type": "ObjectProperty", - "start": 12565, - "end": 12581, + "start": 12567, + "end": 12583, "loc": { "start": { "line": 298, @@ -36712,8 +36712,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 12565, - "end": 12569, + "start": 12567, + "end": 12571, "loc": { "start": { "line": 298, @@ -36729,8 +36729,8 @@ }, "value": { "type": "Identifier", - "start": 12571, - "end": 12581, + "start": 12573, + "end": 12583, "loc": { "start": { "line": 298, @@ -36747,8 +36747,8 @@ }, { "type": "ObjectProperty", - "start": 12603, - "end": 12611, + "start": 12605, + "end": 12613, "loc": { "start": { "line": 299, @@ -36764,8 +36764,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 12603, - "end": 12611, + "start": 12605, + "end": 12613, "loc": { "start": { "line": 299, @@ -36781,8 +36781,8 @@ }, "value": { "type": "Identifier", - "start": 12603, - "end": 12611, + "start": 12605, + "end": 12613, "loc": { "start": { "line": 299, @@ -36802,8 +36802,8 @@ }, { "type": "ObjectProperty", - "start": 12633, - "end": 12647, + "start": 12635, + "end": 12649, "loc": { "start": { "line": 300, @@ -36819,8 +36819,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 12633, - "end": 12641, + "start": 12635, + "end": 12643, "loc": { "start": { "line": 300, @@ -36836,8 +36836,8 @@ }, "value": { "type": "StringLiteral", - "start": 12643, - "end": 12647, + "start": 12645, + "end": 12649, "loc": { "start": { "line": 300, @@ -36857,8 +36857,8 @@ }, { "type": "ObjectProperty", - "start": 12669, - "end": 12681, + "start": 12671, + "end": 12683, "loc": { "start": { "line": 301, @@ -36874,8 +36874,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 12669, - "end": 12681, + "start": 12671, + "end": 12683, "loc": { "start": { "line": 301, @@ -36891,8 +36891,8 @@ }, "value": { "type": "Identifier", - "start": 12669, - "end": 12681, + "start": 12671, + "end": 12683, "loc": { "start": { "line": 301, @@ -36912,8 +36912,8 @@ }, { "type": "ObjectProperty", - "start": 12703, - "end": 12715, + "start": 12705, + "end": 12717, "loc": { "start": { "line": 302, @@ -36929,8 +36929,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 12703, - "end": 12715, + "start": 12705, + "end": 12717, "loc": { "start": { "line": 302, @@ -36946,8 +36946,8 @@ }, "value": { "type": "Identifier", - "start": 12703, - "end": 12715, + "start": 12705, + "end": 12717, "loc": { "start": { "line": 302, @@ -36967,8 +36967,8 @@ }, { "type": "ObjectProperty", - "start": 12737, - "end": 12742, + "start": 12739, + "end": 12744, "loc": { "start": { "line": 303, @@ -36984,8 +36984,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 12737, - "end": 12742, + "start": 12739, + "end": 12744, "loc": { "start": { "line": 303, @@ -37001,8 +37001,8 @@ }, "value": { "type": "Identifier", - "start": 12737, - "end": 12742, + "start": 12739, + "end": 12744, "loc": { "start": { "line": 303, @@ -37022,8 +37022,8 @@ }, { "type": "ObjectProperty", - "start": 12764, - "end": 12767, + "start": 12766, + "end": 12769, "loc": { "start": { "line": 304, @@ -37039,8 +37039,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 12764, - "end": 12767, + "start": 12766, + "end": 12769, "loc": { "start": { "line": 304, @@ -37056,8 +37056,8 @@ }, "value": { "type": "Identifier", - "start": 12764, - "end": 12767, + "start": 12766, + "end": 12769, "loc": { "start": { "line": 304, @@ -37082,8 +37082,8 @@ }, { "type": "BreakStatement", - "start": 12804, - "end": 12810, + "start": 12806, + "end": 12812, "loc": { "start": { "line": 306, @@ -37099,8 +37099,8 @@ ], "test": { "type": "StringLiteral", - "start": 12462, - "end": 12467, + "start": 12464, + "end": 12469, "loc": { "start": { "line": 295, @@ -37122,8 +37122,8 @@ { "type": "CommentLine", "value": " case \"gltf\":", - "start": 11446, - "end": 11461, + "start": 11448, + "end": 11463, "loc": { "start": { "line": 272, @@ -37138,8 +37138,8 @@ { "type": "CommentLine", "value": " const gltfJSON = JSON.parse(sourceData);", - "start": 11474, - "end": 11521, + "start": 11476, + "end": 11523, "loc": { "start": { "line": 273, @@ -37154,8 +37154,8 @@ { "type": "CommentLine", "value": " const gltfBasePath = source ? getBasePath(source) : \"\";", - "start": 11534, - "end": 11596, + "start": 11536, + "end": 11598, "loc": { "start": { "line": 274, @@ -37170,8 +37170,8 @@ { "type": "CommentLine", "value": " convert(parseGLTFIntoXKTModel, {", - "start": 11609, - "end": 11648, + "start": 11611, + "end": 11650, "loc": { "start": { "line": 275, @@ -37186,8 +37186,8 @@ { "type": "CommentLine", "value": " baseUri: gltfBasePath,", - "start": 11661, - "end": 11694, + "start": 11663, + "end": 11696, "loc": { "start": { "line": 276, @@ -37202,8 +37202,8 @@ { "type": "CommentLine", "value": " data: gltfJSON,", - "start": 11707, - "end": 11733, + "start": 11709, + "end": 11735, "loc": { "start": { "line": 277, @@ -37218,8 +37218,8 @@ { "type": "CommentLine", "value": " reuseGeometries,", - "start": 11746, - "end": 11773, + "start": 11748, + "end": 11775, "loc": { "start": { "line": 278, @@ -37234,8 +37234,8 @@ { "type": "CommentLine", "value": " includeTextures,", - "start": 11786, - "end": 11813, + "start": 11788, + "end": 11815, "loc": { "start": { "line": 279, @@ -37250,8 +37250,8 @@ { "type": "CommentLine", "value": " includeNormals,", - "start": 11826, - "end": 11852, + "start": 11828, + "end": 11854, "loc": { "start": { "line": 280, @@ -37266,8 +37266,8 @@ { "type": "CommentLine", "value": " metaModelData: metaModelJSON,", - "start": 11865, - "end": 11905, + "start": 11867, + "end": 11907, "loc": { "start": { "line": 281, @@ -37282,8 +37282,8 @@ { "type": "CommentLine", "value": " xktModel,", - "start": 11918, - "end": 11938, + "start": 11920, + "end": 11940, "loc": { "start": { "line": 282, @@ -37298,8 +37298,8 @@ { "type": "CommentLine", "value": " getAttachment: async (name) => {", - "start": 11951, - "end": 11994, + "start": 11953, + "end": 11996, "loc": { "start": { "line": 283, @@ -37314,8 +37314,8 @@ { "type": "CommentLine", "value": " const filePath = gltfBasePath + name;", - "start": 12007, - "end": 12059, + "start": 12009, + "end": 12061, "loc": { "start": { "line": 284, @@ -37330,8 +37330,8 @@ { "type": "CommentLine", "value": " log(`Reading attachment file: ${filePath}`);", - "start": 12072, - "end": 12131, + "start": 12074, + "end": 12133, "loc": { "start": { "line": 285, @@ -37346,8 +37346,8 @@ { "type": "CommentLine", "value": " const buffer = fs.readFileSync(filePath);", - "start": 12144, - "end": 12200, + "start": 12146, + "end": 12202, "loc": { "start": { "line": 286, @@ -37362,8 +37362,8 @@ { "type": "CommentLine", "value": " const arrayBuf = toArrayBuffer(buffer);", - "start": 12213, - "end": 12267, + "start": 12215, + "end": 12269, "loc": { "start": { "line": 287, @@ -37378,8 +37378,8 @@ { "type": "CommentLine", "value": " return arrayBuf;", - "start": 12280, - "end": 12311, + "start": 12282, + "end": 12313, "loc": { "start": { "line": 288, @@ -37394,8 +37394,8 @@ { "type": "CommentLine", "value": " },", - "start": 12324, - "end": 12337, + "start": 12326, + "end": 12339, "loc": { "start": { "line": 289, @@ -37410,8 +37410,8 @@ { "type": "CommentLine", "value": " stats,", - "start": 12350, - "end": 12367, + "start": 12352, + "end": 12369, "loc": { "start": { "line": 290, @@ -37426,8 +37426,8 @@ { "type": "CommentLine", "value": " log", - "start": 12380, - "end": 12394, + "start": 12382, + "end": 12396, "loc": { "start": { "line": 291, @@ -37442,8 +37442,8 @@ { "type": "CommentLine", "value": " });", - "start": 12407, - "end": 12417, + "start": 12409, + "end": 12419, "loc": { "start": { "line": 292, @@ -37458,8 +37458,8 @@ { "type": "CommentLine", "value": " break;", - "start": 12430, - "end": 12443, + "start": 12432, + "end": 12445, "loc": { "start": { "line": 293, @@ -37475,8 +37475,8 @@ }, { "type": "SwitchCase", - "start": 12824, - "end": 13330, + "start": 12826, + "end": 13332, "loc": { "start": { "line": 308, @@ -37490,8 +37490,8 @@ "consequent": [ { "type": "ExpressionStatement", - "start": 12852, - "end": 13307, + "start": 12854, + "end": 13309, "loc": { "start": { "line": 309, @@ -37504,8 +37504,8 @@ }, "expression": { "type": "CallExpression", - "start": 12852, - "end": 13306, + "start": 12854, + "end": 13308, "loc": { "start": { "line": 309, @@ -37518,8 +37518,8 @@ }, "callee": { "type": "Identifier", - "start": 12852, - "end": 12859, + "start": 12854, + "end": 12861, "loc": { "start": { "line": 309, @@ -37536,8 +37536,8 @@ "arguments": [ { "type": "Identifier", - "start": 12860, - "end": 12880, + "start": 12862, + "end": 12882, "loc": { "start": { "line": 309, @@ -37553,8 +37553,8 @@ }, { "type": "ObjectExpression", - "start": 12882, - "end": 13305, + "start": 12884, + "end": 13307, "loc": { "start": { "line": 309, @@ -37568,8 +37568,8 @@ "properties": [ { "type": "ObjectProperty", - "start": 12904, - "end": 12920, + "start": 12906, + "end": 12922, "loc": { "start": { "line": 310, @@ -37585,8 +37585,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 12904, - "end": 12908, + "start": 12906, + "end": 12910, "loc": { "start": { "line": 310, @@ -37602,8 +37602,8 @@ }, "value": { "type": "Identifier", - "start": 12910, - "end": 12920, + "start": 12912, + "end": 12922, "loc": { "start": { "line": 310, @@ -37620,8 +37620,8 @@ }, { "type": "ObjectProperty", - "start": 12942, - "end": 12950, + "start": 12944, + "end": 12952, "loc": { "start": { "line": 311, @@ -37637,8 +37637,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 12942, - "end": 12950, + "start": 12944, + "end": 12952, "loc": { "start": { "line": 311, @@ -37654,8 +37654,8 @@ }, "value": { "type": "Identifier", - "start": 12942, - "end": 12950, + "start": 12944, + "end": 12952, "loc": { "start": { "line": 311, @@ -37675,8 +37675,8 @@ }, { "type": "ObjectProperty", - "start": 12972, - "end": 12977, + "start": 12974, + "end": 12979, "loc": { "start": { "line": 312, @@ -37692,8 +37692,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 12972, - "end": 12977, + "start": 12974, + "end": 12979, "loc": { "start": { "line": 312, @@ -37709,8 +37709,8 @@ }, "value": { "type": "Identifier", - "start": 12972, - "end": 12977, + "start": 12974, + "end": 12979, "loc": { "start": { "line": 312, @@ -37730,8 +37730,8 @@ }, { "type": "ObjectProperty", - "start": 12999, - "end": 13025, + "start": 13001, + "end": 13027, "loc": { "start": { "line": 313, @@ -37747,8 +37747,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 12999, - "end": 13003, + "start": 13001, + "end": 13005, "loc": { "start": { "line": 313, @@ -37764,8 +37764,8 @@ }, "value": { "type": "MemberExpression", - "start": 13005, - "end": 13025, + "start": 13007, + "end": 13027, "loc": { "start": { "line": 313, @@ -37778,8 +37778,8 @@ }, "object": { "type": "Identifier", - "start": 13005, - "end": 13020, + "start": 13007, + "end": 13022, "loc": { "start": { "line": 313, @@ -37795,8 +37795,8 @@ }, "property": { "type": "Identifier", - "start": 13021, - "end": 13025, + "start": 13023, + "end": 13027, "loc": { "start": { "line": 313, @@ -37815,8 +37815,8 @@ }, { "type": "ObjectProperty", - "start": 13047, - "end": 13085, + "start": 13049, + "end": 13087, "loc": { "start": { "line": 314, @@ -37832,8 +37832,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 13047, - "end": 13057, + "start": 13049, + "end": 13059, "loc": { "start": { "line": 314, @@ -37849,8 +37849,8 @@ }, "value": { "type": "MemberExpression", - "start": 13059, - "end": 13085, + "start": 13061, + "end": 13087, "loc": { "start": { "line": 314, @@ -37863,8 +37863,8 @@ }, "object": { "type": "Identifier", - "start": 13059, - "end": 13074, + "start": 13061, + "end": 13076, "loc": { "start": { "line": 314, @@ -37880,8 +37880,8 @@ }, "property": { "type": "Identifier", - "start": 13075, - "end": 13085, + "start": 13077, + "end": 13087, "loc": { "start": { "line": 314, @@ -37900,8 +37900,8 @@ }, { "type": "ObjectProperty", - "start": 13107, - "end": 13137, + "start": 13109, + "end": 13139, "loc": { "start": { "line": 315, @@ -37917,8 +37917,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 13107, - "end": 13113, + "start": 13109, + "end": 13115, "loc": { "start": { "line": 315, @@ -37934,8 +37934,8 @@ }, "value": { "type": "MemberExpression", - "start": 13115, - "end": 13137, + "start": 13117, + "end": 13139, "loc": { "start": { "line": 315, @@ -37948,8 +37948,8 @@ }, "object": { "type": "Identifier", - "start": 13115, - "end": 13130, + "start": 13117, + "end": 13132, "loc": { "start": { "line": 315, @@ -37965,8 +37965,8 @@ }, "property": { "type": "Identifier", - "start": 13131, - "end": 13137, + "start": 13133, + "end": 13139, "loc": { "start": { "line": 315, @@ -37985,8 +37985,8 @@ }, { "type": "ObjectProperty", - "start": 13159, - "end": 13195, + "start": 13161, + "end": 13197, "loc": { "start": { "line": 316, @@ -38002,8 +38002,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 13159, - "end": 13168, + "start": 13161, + "end": 13170, "loc": { "start": { "line": 316, @@ -38019,8 +38019,8 @@ }, "value": { "type": "MemberExpression", - "start": 13170, - "end": 13195, + "start": 13172, + "end": 13197, "loc": { "start": { "line": 316, @@ -38033,8 +38033,8 @@ }, "object": { "type": "Identifier", - "start": 13170, - "end": 13185, + "start": 13172, + "end": 13187, "loc": { "start": { "line": 316, @@ -38050,8 +38050,8 @@ }, "property": { "type": "Identifier", - "start": 13186, - "end": 13195, + "start": 13188, + "end": 13197, "loc": { "start": { "line": 316, @@ -38070,8 +38070,8 @@ }, { "type": "ObjectProperty", - "start": 13217, - "end": 13262, + "start": 13219, + "end": 13264, "loc": { "start": { "line": 317, @@ -38087,8 +38087,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 13217, - "end": 13221, + "start": 13219, + "end": 13223, "loc": { "start": { "line": 317, @@ -38104,8 +38104,8 @@ }, "value": { "type": "CallExpression", - "start": 13223, - "end": 13262, + "start": 13225, + "end": 13264, "loc": { "start": { "line": 317, @@ -38118,8 +38118,8 @@ }, "callee": { "type": "Identifier", - "start": 13223, - "end": 13237, + "start": 13225, + "end": 13239, "loc": { "start": { "line": 317, @@ -38136,8 +38136,8 @@ "arguments": [ { "type": "MemberExpression", - "start": 13238, - "end": 13258, + "start": 13240, + "end": 13260, "loc": { "start": { "line": 317, @@ -38150,8 +38150,8 @@ }, "object": { "type": "Identifier", - "start": 13238, - "end": 13253, + "start": 13240, + "end": 13255, "loc": { "start": { "line": 317, @@ -38167,8 +38167,8 @@ }, "property": { "type": "Identifier", - "start": 13254, - "end": 13258, + "start": 13256, + "end": 13260, "loc": { "start": { "line": 317, @@ -38186,8 +38186,8 @@ }, { "type": "NumericLiteral", - "start": 13260, - "end": 13261, + "start": 13262, + "end": 13263, "loc": { "start": { "line": 317, @@ -38209,8 +38209,8 @@ }, { "type": "ObjectProperty", - "start": 13284, - "end": 13287, + "start": 13286, + "end": 13289, "loc": { "start": { "line": 318, @@ -38226,8 +38226,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 13284, - "end": 13287, + "start": 13286, + "end": 13289, "loc": { "start": { "line": 318, @@ -38243,8 +38243,8 @@ }, "value": { "type": "Identifier", - "start": 13284, - "end": 13287, + "start": 13286, + "end": 13289, "loc": { "start": { "line": 318, @@ -38269,8 +38269,8 @@ }, { "type": "BreakStatement", - "start": 13324, - "end": 13330, + "start": 13326, + "end": 13332, "loc": { "start": { "line": 320, @@ -38286,8 +38286,8 @@ ], "test": { "type": "StringLiteral", - "start": 12829, - "end": 12834, + "start": 12831, + "end": 12836, "loc": { "start": { "line": 308, @@ -38307,8 +38307,8 @@ }, { "type": "SwitchCase", - "start": 13344, - "end": 13850, + "start": 13346, + "end": 13852, "loc": { "start": { "line": 322, @@ -38322,8 +38322,8 @@ "consequent": [ { "type": "ExpressionStatement", - "start": 13372, - "end": 13827, + "start": 13374, + "end": 13829, "loc": { "start": { "line": 323, @@ -38336,8 +38336,8 @@ }, "expression": { "type": "CallExpression", - "start": 13372, - "end": 13826, + "start": 13374, + "end": 13828, "loc": { "start": { "line": 323, @@ -38350,8 +38350,8 @@ }, "callee": { "type": "Identifier", - "start": 13372, - "end": 13379, + "start": 13374, + "end": 13381, "loc": { "start": { "line": 323, @@ -38368,8 +38368,8 @@ "arguments": [ { "type": "Identifier", - "start": 13380, - "end": 13400, + "start": 13382, + "end": 13402, "loc": { "start": { "line": 323, @@ -38385,8 +38385,8 @@ }, { "type": "ObjectExpression", - "start": 13402, - "end": 13825, + "start": 13404, + "end": 13827, "loc": { "start": { "line": 323, @@ -38400,8 +38400,8 @@ "properties": [ { "type": "ObjectProperty", - "start": 13424, - "end": 13440, + "start": 13426, + "end": 13442, "loc": { "start": { "line": 324, @@ -38417,8 +38417,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 13424, - "end": 13428, + "start": 13426, + "end": 13430, "loc": { "start": { "line": 324, @@ -38434,8 +38434,8 @@ }, "value": { "type": "Identifier", - "start": 13430, - "end": 13440, + "start": 13432, + "end": 13442, "loc": { "start": { "line": 324, @@ -38452,8 +38452,8 @@ }, { "type": "ObjectProperty", - "start": 13462, - "end": 13470, + "start": 13464, + "end": 13472, "loc": { "start": { "line": 325, @@ -38469,8 +38469,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 13462, - "end": 13470, + "start": 13464, + "end": 13472, "loc": { "start": { "line": 325, @@ -38486,8 +38486,8 @@ }, "value": { "type": "Identifier", - "start": 13462, - "end": 13470, + "start": 13464, + "end": 13472, "loc": { "start": { "line": 325, @@ -38507,8 +38507,8 @@ }, { "type": "ObjectProperty", - "start": 13492, - "end": 13497, + "start": 13494, + "end": 13499, "loc": { "start": { "line": 326, @@ -38524,8 +38524,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 13492, - "end": 13497, + "start": 13494, + "end": 13499, "loc": { "start": { "line": 326, @@ -38541,8 +38541,8 @@ }, "value": { "type": "Identifier", - "start": 13492, - "end": 13497, + "start": 13494, + "end": 13499, "loc": { "start": { "line": 326, @@ -38562,8 +38562,8 @@ }, { "type": "ObjectProperty", - "start": 13519, - "end": 13545, + "start": 13521, + "end": 13547, "loc": { "start": { "line": 327, @@ -38579,8 +38579,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 13519, - "end": 13523, + "start": 13521, + "end": 13525, "loc": { "start": { "line": 327, @@ -38596,8 +38596,8 @@ }, "value": { "type": "MemberExpression", - "start": 13525, - "end": 13545, + "start": 13527, + "end": 13547, "loc": { "start": { "line": 327, @@ -38610,8 +38610,8 @@ }, "object": { "type": "Identifier", - "start": 13525, - "end": 13540, + "start": 13527, + "end": 13542, "loc": { "start": { "line": 327, @@ -38627,8 +38627,8 @@ }, "property": { "type": "Identifier", - "start": 13541, - "end": 13545, + "start": 13543, + "end": 13547, "loc": { "start": { "line": 327, @@ -38647,8 +38647,8 @@ }, { "type": "ObjectProperty", - "start": 13567, - "end": 13605, + "start": 13569, + "end": 13607, "loc": { "start": { "line": 328, @@ -38664,8 +38664,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 13567, - "end": 13577, + "start": 13569, + "end": 13579, "loc": { "start": { "line": 328, @@ -38681,8 +38681,8 @@ }, "value": { "type": "MemberExpression", - "start": 13579, - "end": 13605, + "start": 13581, + "end": 13607, "loc": { "start": { "line": 328, @@ -38695,8 +38695,8 @@ }, "object": { "type": "Identifier", - "start": 13579, - "end": 13594, + "start": 13581, + "end": 13596, "loc": { "start": { "line": 328, @@ -38712,8 +38712,8 @@ }, "property": { "type": "Identifier", - "start": 13595, - "end": 13605, + "start": 13597, + "end": 13607, "loc": { "start": { "line": 328, @@ -38732,8 +38732,8 @@ }, { "type": "ObjectProperty", - "start": 13627, - "end": 13657, + "start": 13629, + "end": 13659, "loc": { "start": { "line": 329, @@ -38749,8 +38749,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 13627, - "end": 13633, + "start": 13629, + "end": 13635, "loc": { "start": { "line": 329, @@ -38766,8 +38766,8 @@ }, "value": { "type": "MemberExpression", - "start": 13635, - "end": 13657, + "start": 13637, + "end": 13659, "loc": { "start": { "line": 329, @@ -38780,8 +38780,8 @@ }, "object": { "type": "Identifier", - "start": 13635, - "end": 13650, + "start": 13637, + "end": 13652, "loc": { "start": { "line": 329, @@ -38797,8 +38797,8 @@ }, "property": { "type": "Identifier", - "start": 13651, - "end": 13657, + "start": 13653, + "end": 13659, "loc": { "start": { "line": 329, @@ -38817,8 +38817,8 @@ }, { "type": "ObjectProperty", - "start": 13679, - "end": 13715, + "start": 13681, + "end": 13717, "loc": { "start": { "line": 330, @@ -38834,8 +38834,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 13679, - "end": 13688, + "start": 13681, + "end": 13690, "loc": { "start": { "line": 330, @@ -38851,8 +38851,8 @@ }, "value": { "type": "MemberExpression", - "start": 13690, - "end": 13715, + "start": 13692, + "end": 13717, "loc": { "start": { "line": 330, @@ -38865,8 +38865,8 @@ }, "object": { "type": "Identifier", - "start": 13690, - "end": 13705, + "start": 13692, + "end": 13707, "loc": { "start": { "line": 330, @@ -38882,8 +38882,8 @@ }, "property": { "type": "Identifier", - "start": 13706, - "end": 13715, + "start": 13708, + "end": 13717, "loc": { "start": { "line": 330, @@ -38902,8 +38902,8 @@ }, { "type": "ObjectProperty", - "start": 13737, - "end": 13782, + "start": 13739, + "end": 13784, "loc": { "start": { "line": 331, @@ -38919,8 +38919,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 13737, - "end": 13741, + "start": 13739, + "end": 13743, "loc": { "start": { "line": 331, @@ -38936,8 +38936,8 @@ }, "value": { "type": "CallExpression", - "start": 13743, - "end": 13782, + "start": 13745, + "end": 13784, "loc": { "start": { "line": 331, @@ -38950,8 +38950,8 @@ }, "callee": { "type": "Identifier", - "start": 13743, - "end": 13757, + "start": 13745, + "end": 13759, "loc": { "start": { "line": 331, @@ -38968,8 +38968,8 @@ "arguments": [ { "type": "MemberExpression", - "start": 13758, - "end": 13778, + "start": 13760, + "end": 13780, "loc": { "start": { "line": 331, @@ -38982,8 +38982,8 @@ }, "object": { "type": "Identifier", - "start": 13758, - "end": 13773, + "start": 13760, + "end": 13775, "loc": { "start": { "line": 331, @@ -38999,8 +38999,8 @@ }, "property": { "type": "Identifier", - "start": 13774, - "end": 13778, + "start": 13776, + "end": 13780, "loc": { "start": { "line": 331, @@ -39018,8 +39018,8 @@ }, { "type": "NumericLiteral", - "start": 13780, - "end": 13781, + "start": 13782, + "end": 13783, "loc": { "start": { "line": 331, @@ -39041,8 +39041,8 @@ }, { "type": "ObjectProperty", - "start": 13804, - "end": 13807, + "start": 13806, + "end": 13809, "loc": { "start": { "line": 332, @@ -39058,8 +39058,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 13804, - "end": 13807, + "start": 13806, + "end": 13809, "loc": { "start": { "line": 332, @@ -39075,8 +39075,8 @@ }, "value": { "type": "Identifier", - "start": 13804, - "end": 13807, + "start": 13806, + "end": 13809, "loc": { "start": { "line": 332, @@ -39101,8 +39101,8 @@ }, { "type": "BreakStatement", - "start": 13844, - "end": 13850, + "start": 13846, + "end": 13852, "loc": { "start": { "line": 334, @@ -39118,8 +39118,8 @@ ], "test": { "type": "StringLiteral", - "start": 13349, - "end": 13354, + "start": 13351, + "end": 13356, "loc": { "start": { "line": 322, @@ -39139,8 +39139,8 @@ }, { "type": "SwitchCase", - "start": 13864, - "end": 14085, + "start": 13866, + "end": 14087, "loc": { "start": { "line": 336, @@ -39154,8 +39154,8 @@ "consequent": [ { "type": "ExpressionStatement", - "start": 13892, - "end": 14062, + "start": 13894, + "end": 14064, "loc": { "start": { "line": 337, @@ -39168,8 +39168,8 @@ }, "expression": { "type": "CallExpression", - "start": 13892, - "end": 14061, + "start": 13894, + "end": 14063, "loc": { "start": { "line": 337, @@ -39182,8 +39182,8 @@ }, "callee": { "type": "Identifier", - "start": 13892, - "end": 13899, + "start": 13894, + "end": 13901, "loc": { "start": { "line": 337, @@ -39200,8 +39200,8 @@ "arguments": [ { "type": "Identifier", - "start": 13900, - "end": 13920, + "start": 13902, + "end": 13922, "loc": { "start": { "line": 337, @@ -39217,8 +39217,8 @@ }, { "type": "ObjectExpression", - "start": 13922, - "end": 14060, + "start": 13924, + "end": 14062, "loc": { "start": { "line": 337, @@ -39232,8 +39232,8 @@ "properties": [ { "type": "ObjectProperty", - "start": 13944, - "end": 13960, + "start": 13946, + "end": 13962, "loc": { "start": { "line": 338, @@ -39249,8 +39249,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 13944, - "end": 13948, + "start": 13946, + "end": 13950, "loc": { "start": { "line": 338, @@ -39266,8 +39266,8 @@ }, "value": { "type": "Identifier", - "start": 13950, - "end": 13960, + "start": 13952, + "end": 13962, "loc": { "start": { "line": 338, @@ -39284,8 +39284,8 @@ }, { "type": "ObjectProperty", - "start": 13982, - "end": 13990, + "start": 13984, + "end": 13992, "loc": { "start": { "line": 339, @@ -39301,8 +39301,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 13982, - "end": 13990, + "start": 13984, + "end": 13992, "loc": { "start": { "line": 339, @@ -39318,8 +39318,8 @@ }, "value": { "type": "Identifier", - "start": 13982, - "end": 13990, + "start": 13984, + "end": 13992, "loc": { "start": { "line": 339, @@ -39339,8 +39339,8 @@ }, { "type": "ObjectProperty", - "start": 14012, - "end": 14017, + "start": 14014, + "end": 14019, "loc": { "start": { "line": 340, @@ -39356,8 +39356,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 14012, - "end": 14017, + "start": 14014, + "end": 14019, "loc": { "start": { "line": 340, @@ -39373,8 +39373,8 @@ }, "value": { "type": "Identifier", - "start": 14012, - "end": 14017, + "start": 14014, + "end": 14019, "loc": { "start": { "line": 340, @@ -39394,8 +39394,8 @@ }, { "type": "ObjectProperty", - "start": 14039, - "end": 14042, + "start": 14041, + "end": 14044, "loc": { "start": { "line": 341, @@ -39411,8 +39411,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 14039, - "end": 14042, + "start": 14041, + "end": 14044, "loc": { "start": { "line": 341, @@ -39428,8 +39428,8 @@ }, "value": { "type": "Identifier", - "start": 14039, - "end": 14042, + "start": 14041, + "end": 14044, "loc": { "start": { "line": 341, @@ -39454,8 +39454,8 @@ }, { "type": "BreakStatement", - "start": 14079, - "end": 14085, + "start": 14081, + "end": 14087, "loc": { "start": { "line": 343, @@ -39471,8 +39471,8 @@ ], "test": { "type": "StringLiteral", - "start": 13869, - "end": 13874, + "start": 13871, + "end": 13876, "loc": { "start": { "line": 336, @@ -39492,8 +39492,8 @@ }, { "type": "SwitchCase", - "start": 14099, - "end": 14320, + "start": 14101, + "end": 14322, "loc": { "start": { "line": 345, @@ -39507,8 +39507,8 @@ "consequent": [ { "type": "ExpressionStatement", - "start": 14127, - "end": 14297, + "start": 14129, + "end": 14299, "loc": { "start": { "line": 346, @@ -39521,8 +39521,8 @@ }, "expression": { "type": "CallExpression", - "start": 14127, - "end": 14296, + "start": 14129, + "end": 14298, "loc": { "start": { "line": 346, @@ -39535,8 +39535,8 @@ }, "callee": { "type": "Identifier", - "start": 14127, - "end": 14134, + "start": 14129, + "end": 14136, "loc": { "start": { "line": 346, @@ -39553,8 +39553,8 @@ "arguments": [ { "type": "Identifier", - "start": 14135, - "end": 14155, + "start": 14137, + "end": 14157, "loc": { "start": { "line": 346, @@ -39570,8 +39570,8 @@ }, { "type": "ObjectExpression", - "start": 14157, - "end": 14295, + "start": 14159, + "end": 14297, "loc": { "start": { "line": 346, @@ -39585,8 +39585,8 @@ "properties": [ { "type": "ObjectProperty", - "start": 14179, - "end": 14195, + "start": 14181, + "end": 14197, "loc": { "start": { "line": 347, @@ -39602,8 +39602,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 14179, - "end": 14183, + "start": 14181, + "end": 14185, "loc": { "start": { "line": 347, @@ -39619,8 +39619,8 @@ }, "value": { "type": "Identifier", - "start": 14185, - "end": 14195, + "start": 14187, + "end": 14197, "loc": { "start": { "line": 347, @@ -39637,8 +39637,8 @@ }, { "type": "ObjectProperty", - "start": 14217, - "end": 14225, + "start": 14219, + "end": 14227, "loc": { "start": { "line": 348, @@ -39654,8 +39654,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 14217, - "end": 14225, + "start": 14219, + "end": 14227, "loc": { "start": { "line": 348, @@ -39671,8 +39671,8 @@ }, "value": { "type": "Identifier", - "start": 14217, - "end": 14225, + "start": 14219, + "end": 14227, "loc": { "start": { "line": 348, @@ -39692,8 +39692,8 @@ }, { "type": "ObjectProperty", - "start": 14247, - "end": 14252, + "start": 14249, + "end": 14254, "loc": { "start": { "line": 349, @@ -39709,8 +39709,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 14247, - "end": 14252, + "start": 14249, + "end": 14254, "loc": { "start": { "line": 349, @@ -39726,8 +39726,8 @@ }, "value": { "type": "Identifier", - "start": 14247, - "end": 14252, + "start": 14249, + "end": 14254, "loc": { "start": { "line": 349, @@ -39747,8 +39747,8 @@ }, { "type": "ObjectProperty", - "start": 14274, - "end": 14277, + "start": 14276, + "end": 14279, "loc": { "start": { "line": 350, @@ -39764,8 +39764,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 14274, - "end": 14277, + "start": 14276, + "end": 14279, "loc": { "start": { "line": 350, @@ -39781,8 +39781,8 @@ }, "value": { "type": "Identifier", - "start": 14274, - "end": 14277, + "start": 14276, + "end": 14279, "loc": { "start": { "line": 350, @@ -39807,8 +39807,8 @@ }, { "type": "BreakStatement", - "start": 14314, - "end": 14320, + "start": 14316, + "end": 14322, "loc": { "start": { "line": 352, @@ -39824,8 +39824,8 @@ ], "test": { "type": "StringLiteral", - "start": 14104, - "end": 14109, + "start": 14106, + "end": 14111, "loc": { "start": { "line": 345, @@ -39845,8 +39845,8 @@ }, { "type": "SwitchCase", - "start": 14334, - "end": 14555, + "start": 14336, + "end": 14557, "loc": { "start": { "line": 354, @@ -39860,8 +39860,8 @@ "consequent": [ { "type": "ExpressionStatement", - "start": 14362, - "end": 14532, + "start": 14364, + "end": 14534, "loc": { "start": { "line": 355, @@ -39874,8 +39874,8 @@ }, "expression": { "type": "CallExpression", - "start": 14362, - "end": 14531, + "start": 14364, + "end": 14533, "loc": { "start": { "line": 355, @@ -39888,8 +39888,8 @@ }, "callee": { "type": "Identifier", - "start": 14362, - "end": 14369, + "start": 14364, + "end": 14371, "loc": { "start": { "line": 355, @@ -39906,8 +39906,8 @@ "arguments": [ { "type": "Identifier", - "start": 14370, - "end": 14390, + "start": 14372, + "end": 14392, "loc": { "start": { "line": 355, @@ -39923,8 +39923,8 @@ }, { "type": "ObjectExpression", - "start": 14392, - "end": 14530, + "start": 14394, + "end": 14532, "loc": { "start": { "line": 355, @@ -39938,8 +39938,8 @@ "properties": [ { "type": "ObjectProperty", - "start": 14414, - "end": 14430, + "start": 14416, + "end": 14432, "loc": { "start": { "line": 356, @@ -39955,8 +39955,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 14414, - "end": 14418, + "start": 14416, + "end": 14420, "loc": { "start": { "line": 356, @@ -39972,8 +39972,8 @@ }, "value": { "type": "Identifier", - "start": 14420, - "end": 14430, + "start": 14422, + "end": 14432, "loc": { "start": { "line": 356, @@ -39990,8 +39990,8 @@ }, { "type": "ObjectProperty", - "start": 14452, - "end": 14460, + "start": 14454, + "end": 14462, "loc": { "start": { "line": 357, @@ -40007,8 +40007,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 14452, - "end": 14460, + "start": 14454, + "end": 14462, "loc": { "start": { "line": 357, @@ -40024,8 +40024,8 @@ }, "value": { "type": "Identifier", - "start": 14452, - "end": 14460, + "start": 14454, + "end": 14462, "loc": { "start": { "line": 357, @@ -40045,8 +40045,8 @@ }, { "type": "ObjectProperty", - "start": 14482, - "end": 14487, + "start": 14484, + "end": 14489, "loc": { "start": { "line": 358, @@ -40062,8 +40062,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 14482, - "end": 14487, + "start": 14484, + "end": 14489, "loc": { "start": { "line": 358, @@ -40079,8 +40079,8 @@ }, "value": { "type": "Identifier", - "start": 14482, - "end": 14487, + "start": 14484, + "end": 14489, "loc": { "start": { "line": 358, @@ -40100,8 +40100,8 @@ }, { "type": "ObjectProperty", - "start": 14509, - "end": 14512, + "start": 14511, + "end": 14514, "loc": { "start": { "line": 359, @@ -40117,8 +40117,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 14509, - "end": 14512, + "start": 14511, + "end": 14514, "loc": { "start": { "line": 359, @@ -40134,8 +40134,8 @@ }, "value": { "type": "Identifier", - "start": 14509, - "end": 14512, + "start": 14511, + "end": 14514, "loc": { "start": { "line": 359, @@ -40160,8 +40160,8 @@ }, { "type": "BreakStatement", - "start": 14549, - "end": 14555, + "start": 14551, + "end": 14557, "loc": { "start": { "line": 361, @@ -40177,8 +40177,8 @@ ], "test": { "type": "StringLiteral", - "start": 14339, - "end": 14344, + "start": 14341, + "end": 14346, "loc": { "start": { "line": 354, @@ -40198,8 +40198,8 @@ }, { "type": "SwitchCase", - "start": 14569, - "end": 14672, + "start": 14571, + "end": 14674, "loc": { "start": { "line": 363, @@ -40213,8 +40213,8 @@ "consequent": [ { "type": "ExpressionStatement", - "start": 14594, - "end": 14648, + "start": 14596, + "end": 14650, "loc": { "start": { "line": 364, @@ -40227,8 +40227,8 @@ }, "expression": { "type": "CallExpression", - "start": 14594, - "end": 14647, + "start": 14596, + "end": 14649, "loc": { "start": { "line": 364, @@ -40241,8 +40241,8 @@ }, "callee": { "type": "Identifier", - "start": 14594, - "end": 14600, + "start": 14596, + "end": 14602, "loc": { "start": { "line": 364, @@ -40259,8 +40259,8 @@ "arguments": [ { "type": "TemplateLiteral", - "start": 14601, - "end": 14646, + "start": 14603, + "end": 14648, "loc": { "start": { "line": 364, @@ -40274,8 +40274,8 @@ "expressions": [ { "type": "Identifier", - "start": 14639, - "end": 14642, + "start": 14641, + "end": 14644, "loc": { "start": { "line": 364, @@ -40293,8 +40293,8 @@ "quasis": [ { "type": "TemplateElement", - "start": 14602, - "end": 14637, + "start": 14604, + "end": 14639, "loc": { "start": { "line": 364, @@ -40313,8 +40313,8 @@ }, { "type": "TemplateElement", - "start": 14643, - "end": 14645, + "start": 14645, + "end": 14647, "loc": { "start": { "line": 364, @@ -40338,8 +40338,8 @@ }, { "type": "ReturnStatement", - "start": 14665, - "end": 14672, + "start": 14667, + "end": 14674, "loc": { "start": { "line": 365, @@ -40359,8 +40359,8 @@ }, { "type": "FunctionDeclaration", - "start": 14692, - "end": 18361, + "start": 14694, + "end": 18363, "loc": { "start": { "line": 368, @@ -40373,8 +40373,8 @@ }, "id": { "type": "Identifier", - "start": 14701, - "end": 14708, + "start": 14703, + "end": 14710, "loc": { "start": { "line": 368, @@ -40394,8 +40394,8 @@ "params": [ { "type": "Identifier", - "start": 14709, - "end": 14715, + "start": 14711, + "end": 14717, "loc": { "start": { "line": 368, @@ -40411,8 +40411,8 @@ }, { "type": "Identifier", - "start": 14717, - "end": 14732, + "start": 14719, + "end": 14734, "loc": { "start": { "line": 368, @@ -40429,8 +40429,8 @@ ], "body": { "type": "BlockStatement", - "start": 14734, - "end": 18361, + "start": 14736, + "end": 18363, "loc": { "start": { "line": 368, @@ -40444,8 +40444,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 14749, - "end": 18351, + "start": 14751, + "end": 18353, "loc": { "start": { "line": 370, @@ -40458,8 +40458,8 @@ }, "expression": { "type": "CallExpression", - "start": 14749, - "end": 18350, + "start": 14751, + "end": 18352, "loc": { "start": { "line": 370, @@ -40472,8 +40472,8 @@ }, "callee": { "type": "MemberExpression", - "start": 14749, - "end": 14777, + "start": 14751, + "end": 14779, "loc": { "start": { "line": 370, @@ -40486,8 +40486,8 @@ }, "object": { "type": "CallExpression", - "start": 14749, - "end": 14772, + "start": 14751, + "end": 14774, "loc": { "start": { "line": 370, @@ -40500,8 +40500,8 @@ }, "callee": { "type": "Identifier", - "start": 14749, - "end": 14755, + "start": 14751, + "end": 14757, "loc": { "start": { "line": 370, @@ -40518,8 +40518,8 @@ "arguments": [ { "type": "Identifier", - "start": 14756, - "end": 14771, + "start": 14758, + "end": 14773, "loc": { "start": { "line": 370, @@ -40537,8 +40537,8 @@ }, "property": { "type": "Identifier", - "start": 14773, - "end": 14777, + "start": 14775, + "end": 14779, "loc": { "start": { "line": 370, @@ -40557,8 +40557,8 @@ "arguments": [ { "type": "ArrowFunctionExpression", - "start": 14778, - "end": 18294, + "start": 14780, + "end": 18296, "loc": { "start": { "line": 370, @@ -40576,8 +40576,8 @@ "params": [], "body": { "type": "BlockStatement", - "start": 14784, - "end": 18294, + "start": 14786, + "end": 18296, "loc": { "start": { "line": 370, @@ -40591,8 +40591,8 @@ "body": [ { "type": "IfStatement", - "start": 14803, - "end": 14961, + "start": 14805, + "end": 14963, "loc": { "start": { "line": 372, @@ -40605,8 +40605,8 @@ }, "test": { "type": "UnaryExpression", - "start": 14807, - "end": 14821, + "start": 14809, + "end": 14823, "loc": { "start": { "line": 372, @@ -40621,8 +40621,8 @@ "prefix": true, "argument": { "type": "Identifier", - "start": 14808, - "end": 14821, + "start": 14810, + "end": 14823, "loc": { "start": { "line": 372, @@ -40642,8 +40642,8 @@ }, "consequent": { "type": "BlockStatement", - "start": 14823, - "end": 14961, + "start": 14825, + "end": 14963, "loc": { "start": { "line": 372, @@ -40657,8 +40657,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 14845, - "end": 14886, + "start": 14847, + "end": 14888, "loc": { "start": { "line": 373, @@ -40671,8 +40671,8 @@ }, "expression": { "type": "CallExpression", - "start": 14845, - "end": 14885, + "start": 14847, + "end": 14887, "loc": { "start": { "line": 373, @@ -40685,8 +40685,8 @@ }, "callee": { "type": "Identifier", - "start": 14845, - "end": 14848, + "start": 14847, + "end": 14850, "loc": { "start": { "line": 373, @@ -40703,8 +40703,8 @@ "arguments": [ { "type": "StringLiteral", - "start": 14849, - "end": 14884, + "start": 14851, + "end": 14886, "loc": { "start": { "line": 373, @@ -40726,8 +40726,8 @@ }, { "type": "ExpressionStatement", - "start": 14907, - "end": 14943, + "start": 14909, + "end": 14945, "loc": { "start": { "line": 374, @@ -40740,8 +40740,8 @@ }, "expression": { "type": "CallExpression", - "start": 14907, - "end": 14942, + "start": 14909, + "end": 14944, "loc": { "start": { "line": 374, @@ -40754,8 +40754,8 @@ }, "callee": { "type": "MemberExpression", - "start": 14907, - "end": 14940, + "start": 14909, + "end": 14942, "loc": { "start": { "line": 374, @@ -40768,8 +40768,8 @@ }, "object": { "type": "Identifier", - "start": 14907, - "end": 14915, + "start": 14909, + "end": 14917, "loc": { "start": { "line": 374, @@ -40785,8 +40785,8 @@ }, "property": { "type": "Identifier", - "start": 14916, - "end": 14940, + "start": 14918, + "end": 14942, "loc": { "start": { "line": 374, @@ -40812,8 +40812,8 @@ }, { "type": "ExpressionStatement", - "start": 14979, - "end": 15033, + "start": 14981, + "end": 15035, "loc": { "start": { "line": 377, @@ -40826,8 +40826,8 @@ }, "expression": { "type": "CallExpression", - "start": 14979, - "end": 15032, + "start": 14981, + "end": 15034, "loc": { "start": { "line": 377, @@ -40840,8 +40840,8 @@ }, "callee": { "type": "Identifier", - "start": 14979, - "end": 14982, + "start": 14981, + "end": 14984, "loc": { "start": { "line": 377, @@ -40858,8 +40858,8 @@ "arguments": [ { "type": "StringLiteral", - "start": 14983, - "end": 15031, + "start": 14985, + "end": 15033, "loc": { "start": { "line": 377, @@ -40881,8 +40881,8 @@ }, { "type": "ExpressionStatement", - "start": 15051, - "end": 18280, + "start": 15053, + "end": 18282, "loc": { "start": { "line": 379, @@ -40895,8 +40895,8 @@ }, "expression": { "type": "CallExpression", - "start": 15051, - "end": 18279, + "start": 15053, + "end": 18281, "loc": { "start": { "line": 379, @@ -40909,8 +40909,8 @@ }, "callee": { "type": "MemberExpression", - "start": 15051, - "end": 15075, + "start": 15053, + "end": 15077, "loc": { "start": { "line": 379, @@ -40923,8 +40923,8 @@ }, "object": { "type": "CallExpression", - "start": 15051, - "end": 15070, + "start": 15053, + "end": 15072, "loc": { "start": { "line": 379, @@ -40937,8 +40937,8 @@ }, "callee": { "type": "MemberExpression", - "start": 15051, - "end": 15068, + "start": 15053, + "end": 15070, "loc": { "start": { "line": 379, @@ -40951,8 +40951,8 @@ }, "object": { "type": "Identifier", - "start": 15051, - "end": 15059, + "start": 15053, + "end": 15061, "loc": { "start": { "line": 379, @@ -40968,8 +40968,8 @@ }, "property": { "type": "Identifier", - "start": 15060, - "end": 15068, + "start": 15062, + "end": 15070, "loc": { "start": { "line": 379, @@ -40989,8 +40989,8 @@ }, "property": { "type": "Identifier", - "start": 15071, - "end": 15075, + "start": 15073, + "end": 15077, "loc": { "start": { "line": 379, @@ -41009,8 +41009,8 @@ "arguments": [ { "type": "ArrowFunctionExpression", - "start": 15076, - "end": 18278, + "start": 15078, + "end": 18280, "loc": { "start": { "line": 379, @@ -41028,8 +41028,8 @@ "params": [], "body": { "type": "BlockStatement", - "start": 15082, - "end": 18278, + "start": 15084, + "end": 18280, "loc": { "start": { "line": 379, @@ -41043,8 +41043,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 15105, - "end": 15158, + "start": 15107, + "end": 15160, "loc": { "start": { "line": 381, @@ -41057,8 +41057,8 @@ }, "expression": { "type": "CallExpression", - "start": 15105, - "end": 15157, + "start": 15107, + "end": 15159, "loc": { "start": { "line": 381, @@ -41071,8 +41071,8 @@ }, "callee": { "type": "Identifier", - "start": 15105, - "end": 15108, + "start": 15107, + "end": 15110, "loc": { "start": { "line": 381, @@ -41089,8 +41089,8 @@ "arguments": [ { "type": "StringLiteral", - "start": 15109, - "end": 15156, + "start": 15111, + "end": 15158, "loc": { "start": { "line": 381, @@ -41112,8 +41112,8 @@ }, { "type": "VariableDeclaration", - "start": 15180, - "end": 15275, + "start": 15182, + "end": 15277, "loc": { "start": { "line": 383, @@ -41127,8 +41127,8 @@ "declarations": [ { "type": "VariableDeclarator", - "start": 15186, - "end": 15274, + "start": 15188, + "end": 15276, "loc": { "start": { "line": 383, @@ -41141,8 +41141,8 @@ }, "id": { "type": "Identifier", - "start": 15186, - "end": 15200, + "start": 15188, + "end": 15202, "loc": { "start": { "line": 383, @@ -41158,8 +41158,8 @@ }, "init": { "type": "CallExpression", - "start": 15203, - "end": 15274, + "start": 15205, + "end": 15276, "loc": { "start": { "line": 383, @@ -41172,8 +41172,8 @@ }, "callee": { "type": "Identifier", - "start": 15203, - "end": 15229, + "start": 15205, + "end": 15231, "loc": { "start": { "line": 383, @@ -41190,8 +41190,8 @@ "arguments": [ { "type": "Identifier", - "start": 15230, - "end": 15238, + "start": 15232, + "end": 15240, "loc": { "start": { "line": 383, @@ -41207,8 +41207,8 @@ }, { "type": "Identifier", - "start": 15240, - "end": 15253, + "start": 15242, + "end": 15255, "loc": { "start": { "line": 383, @@ -41224,8 +41224,8 @@ }, { "type": "Identifier", - "start": 15255, - "end": 15260, + "start": 15257, + "end": 15262, "loc": { "start": { "line": 383, @@ -41241,8 +41241,8 @@ }, { "type": "ObjectExpression", - "start": 15262, - "end": 15273, + "start": 15264, + "end": 15275, "loc": { "start": { "line": 383, @@ -41256,8 +41256,8 @@ "properties": [ { "type": "ObjectProperty", - "start": 15263, - "end": 15272, + "start": 15265, + "end": 15274, "loc": { "start": { "line": 383, @@ -41273,8 +41273,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 15263, - "end": 15266, + "start": 15265, + "end": 15268, "loc": { "start": { "line": 383, @@ -41290,8 +41290,8 @@ }, "value": { "type": "BooleanLiteral", - "start": 15268, - "end": 15272, + "start": 15270, + "end": 15274, "loc": { "start": { "line": 383, @@ -41315,8 +41315,8 @@ }, { "type": "VariableDeclaration", - "start": 15297, - "end": 15344, + "start": 15299, + "end": 15346, "loc": { "start": { "line": 385, @@ -41330,8 +41330,8 @@ "declarations": [ { "type": "VariableDeclarator", - "start": 15303, - "end": 15343, + "start": 15305, + "end": 15345, "loc": { "start": { "line": 385, @@ -41344,8 +41344,8 @@ }, "id": { "type": "Identifier", - "start": 15303, - "end": 15313, + "start": 15305, + "end": 15315, "loc": { "start": { "line": 385, @@ -41361,8 +41361,8 @@ }, "init": { "type": "CallExpression", - "start": 15316, - "end": 15343, + "start": 15318, + "end": 15345, "loc": { "start": { "line": 385, @@ -41375,8 +41375,8 @@ }, "callee": { "type": "MemberExpression", - "start": 15316, - "end": 15327, + "start": 15318, + "end": 15329, "loc": { "start": { "line": 385, @@ -41389,8 +41389,8 @@ }, "object": { "type": "Identifier", - "start": 15316, - "end": 15322, + "start": 15318, + "end": 15324, "loc": { "start": { "line": 385, @@ -41406,8 +41406,8 @@ }, "property": { "type": "Identifier", - "start": 15323, - "end": 15327, + "start": 15325, + "end": 15329, "loc": { "start": { "line": 385, @@ -41426,8 +41426,8 @@ "arguments": [ { "type": "Identifier", - "start": 15328, - "end": 15342, + "start": 15330, + "end": 15344, "loc": { "start": { "line": 385, @@ -41449,8 +41449,8 @@ }, { "type": "VariableDeclaration", - "start": 15366, - "end": 15420, + "start": 15368, + "end": 15422, "loc": { "start": { "line": 387, @@ -41464,8 +41464,8 @@ "declarations": [ { "type": "VariableDeclarator", - "start": 15372, - "end": 15419, + "start": 15374, + "end": 15421, "loc": { "start": { "line": 387, @@ -41478,8 +41478,8 @@ }, "id": { "type": "Identifier", - "start": 15372, - "end": 15391, + "start": 15374, + "end": 15393, "loc": { "start": { "line": 387, @@ -41495,8 +41495,8 @@ }, "init": { "type": "MemberExpression", - "start": 15394, - "end": 15419, + "start": 15396, + "end": 15421, "loc": { "start": { "line": 387, @@ -41509,8 +41509,8 @@ }, "object": { "type": "Identifier", - "start": 15394, - "end": 15408, + "start": 15396, + "end": 15410, "loc": { "start": { "line": 387, @@ -41526,8 +41526,8 @@ }, "property": { "type": "Identifier", - "start": 15409, - "end": 15419, + "start": 15411, + "end": 15421, "loc": { "start": { "line": 387, @@ -41549,8 +41549,8 @@ }, { "type": "ExpressionStatement", - "start": 15442, - "end": 15481, + "start": 15444, + "end": 15483, "loc": { "start": { "line": 389, @@ -41563,8 +41563,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 15442, - "end": 15480, + "start": 15444, + "end": 15482, "loc": { "start": { "line": 389, @@ -41578,8 +41578,8 @@ "operator": "=", "left": { "type": "MemberExpression", - "start": 15442, - "end": 15459, + "start": 15444, + "end": 15461, "loc": { "start": { "line": 389, @@ -41592,8 +41592,8 @@ }, "object": { "type": "Identifier", - "start": 15442, - "end": 15447, + "start": 15444, + "end": 15449, "loc": { "start": { "line": 389, @@ -41609,8 +41609,8 @@ }, "property": { "type": "Identifier", - "start": 15448, - "end": 15459, + "start": 15450, + "end": 15461, "loc": { "start": { "line": 389, @@ -41628,8 +41628,8 @@ }, "right": { "type": "LogicalExpression", - "start": 15462, - "end": 15480, + "start": 15464, + "end": 15482, "loc": { "start": { "line": 389, @@ -41642,8 +41642,8 @@ }, "left": { "type": "Identifier", - "start": 15462, - "end": 15473, + "start": 15464, + "end": 15475, "loc": { "start": { "line": 389, @@ -41660,8 +41660,8 @@ "operator": "||", "right": { "type": "NumericLiteral", - "start": 15477, - "end": 15480, + "start": 15479, + "end": 15482, "loc": { "start": { "line": 389, @@ -41683,8 +41683,8 @@ }, { "type": "ExpressionStatement", - "start": 15502, - "end": 15561, + "start": 15504, + "end": 15563, "loc": { "start": { "line": 390, @@ -41697,8 +41697,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 15502, - "end": 15560, + "start": 15504, + "end": 15562, "loc": { "start": { "line": 390, @@ -41712,8 +41712,8 @@ "operator": "=", "left": { "type": "MemberExpression", - "start": 15502, - "end": 15518, + "start": 15504, + "end": 15520, "loc": { "start": { "line": 390, @@ -41726,8 +41726,8 @@ }, "object": { "type": "Identifier", - "start": 15502, - "end": 15507, + "start": 15504, + "end": 15509, "loc": { "start": { "line": 390, @@ -41743,8 +41743,8 @@ }, "property": { "type": "Identifier", - "start": 15508, - "end": 15518, + "start": 15510, + "end": 15520, "loc": { "start": { "line": 390, @@ -41762,8 +41762,8 @@ }, "right": { "type": "CallExpression", - "start": 15521, - "end": 15560, + "start": 15523, + "end": 15562, "loc": { "start": { "line": 390, @@ -41776,8 +41776,8 @@ }, "callee": { "type": "MemberExpression", - "start": 15521, - "end": 15557, + "start": 15523, + "end": 15559, "loc": { "start": { "line": 390, @@ -41790,8 +41790,8 @@ }, "object": { "type": "BinaryExpression", - "start": 15522, - "end": 15548, + "start": 15524, + "end": 15550, "loc": { "start": { "line": 390, @@ -41804,8 +41804,8 @@ }, "left": { "type": "Identifier", - "start": 15522, - "end": 15541, + "start": 15524, + "end": 15543, "loc": { "start": { "line": 390, @@ -41822,8 +41822,8 @@ "operator": "/", "right": { "type": "NumericLiteral", - "start": 15544, - "end": 15548, + "start": 15546, + "end": 15550, "loc": { "start": { "line": 390, @@ -41842,13 +41842,13 @@ }, "extra": { "parenthesized": true, - "parenStart": 15521 + "parenStart": 15523 } }, "property": { "type": "Identifier", - "start": 15550, - "end": 15557, + "start": 15552, + "end": 15559, "loc": { "start": { "line": 390, @@ -41867,8 +41867,8 @@ "arguments": [ { "type": "NumericLiteral", - "start": 15558, - "end": 15559, + "start": 15560, + "end": 15561, "loc": { "start": { "line": 390, @@ -41891,8 +41891,8 @@ }, { "type": "ExpressionStatement", - "start": 15582, - "end": 15638, + "start": 15584, + "end": 15640, "loc": { "start": { "line": 391, @@ -41905,8 +41905,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 15582, - "end": 15637, + "start": 15584, + "end": 15639, "loc": { "start": { "line": 391, @@ -41920,8 +41920,8 @@ "operator": "=", "left": { "type": "MemberExpression", - "start": 15582, - "end": 15595, + "start": 15584, + "end": 15597, "loc": { "start": { "line": 391, @@ -41934,8 +41934,8 @@ }, "object": { "type": "Identifier", - "start": 15582, - "end": 15587, + "start": 15584, + "end": 15589, "loc": { "start": { "line": 391, @@ -41951,8 +41951,8 @@ }, "property": { "type": "Identifier", - "start": 15588, - "end": 15595, + "start": 15590, + "end": 15597, "loc": { "start": { "line": 391, @@ -41970,8 +41970,8 @@ }, "right": { "type": "CallExpression", - "start": 15598, - "end": 15637, + "start": 15600, + "end": 15639, "loc": { "start": { "line": 391, @@ -41984,8 +41984,8 @@ }, "callee": { "type": "MemberExpression", - "start": 15598, - "end": 15634, + "start": 15600, + "end": 15636, "loc": { "start": { "line": 391, @@ -41998,8 +41998,8 @@ }, "object": { "type": "BinaryExpression", - "start": 15599, - "end": 15625, + "start": 15601, + "end": 15627, "loc": { "start": { "line": 391, @@ -42012,8 +42012,8 @@ }, "left": { "type": "Identifier", - "start": 15599, - "end": 15618, + "start": 15601, + "end": 15620, "loc": { "start": { "line": 391, @@ -42030,8 +42030,8 @@ "operator": "/", "right": { "type": "NumericLiteral", - "start": 15621, - "end": 15625, + "start": 15623, + "end": 15627, "loc": { "start": { "line": 391, @@ -42050,13 +42050,13 @@ }, "extra": { "parenthesized": true, - "parenStart": 15598 + "parenStart": 15600 } }, "property": { "type": "Identifier", - "start": 15627, - "end": 15634, + "start": 15629, + "end": 15636, "loc": { "start": { "line": 391, @@ -42075,8 +42075,8 @@ "arguments": [ { "type": "NumericLiteral", - "start": 15635, - "end": 15636, + "start": 15637, + "end": 15638, "loc": { "start": { "line": 391, @@ -42099,8 +42099,8 @@ }, { "type": "ExpressionStatement", - "start": 15659, - "end": 15698, + "start": 15661, + "end": 15700, "loc": { "start": { "line": 392, @@ -42113,8 +42113,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 15659, - "end": 15697, + "start": 15661, + "end": 15699, "loc": { "start": { "line": 392, @@ -42128,8 +42128,8 @@ "operator": "=", "left": { "type": "MemberExpression", - "start": 15659, - "end": 15675, + "start": 15661, + "end": 15677, "loc": { "start": { "line": 392, @@ -42142,8 +42142,8 @@ }, "object": { "type": "Identifier", - "start": 15659, - "end": 15664, + "start": 15661, + "end": 15666, "loc": { "start": { "line": 392, @@ -42159,8 +42159,8 @@ }, "property": { "type": "Identifier", - "start": 15665, - "end": 15675, + "start": 15667, + "end": 15677, "loc": { "start": { "line": 392, @@ -42178,8 +42178,8 @@ }, "right": { "type": "MemberExpression", - "start": 15678, - "end": 15697, + "start": 15680, + "end": 15699, "loc": { "start": { "line": 392, @@ -42192,8 +42192,8 @@ }, "object": { "type": "Identifier", - "start": 15678, - "end": 15686, + "start": 15680, + "end": 15688, "loc": { "start": { "line": 392, @@ -42209,8 +42209,8 @@ }, "property": { "type": "Identifier", - "start": 15687, - "end": 15697, + "start": 15689, + "end": 15699, "loc": { "start": { "line": 392, @@ -42230,8 +42230,8 @@ }, { "type": "ExpressionStatement", - "start": 15719, - "end": 15799, + "start": 15721, + "end": 15801, "loc": { "start": { "line": 393, @@ -42244,8 +42244,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 15719, - "end": 15798, + "start": 15721, + "end": 15800, "loc": { "start": { "line": 393, @@ -42259,8 +42259,8 @@ "operator": "=", "left": { "type": "MemberExpression", - "start": 15719, - "end": 15741, + "start": 15721, + "end": 15743, "loc": { "start": { "line": 393, @@ -42273,8 +42273,8 @@ }, "object": { "type": "Identifier", - "start": 15719, - "end": 15724, + "start": 15721, + "end": 15726, "loc": { "start": { "line": 393, @@ -42290,8 +42290,8 @@ }, "property": { "type": "Identifier", - "start": 15725, - "end": 15741, + "start": 15727, + "end": 15743, "loc": { "start": { "line": 393, @@ -42309,8 +42309,8 @@ }, "right": { "type": "CallExpression", - "start": 15744, - "end": 15798, + "start": 15746, + "end": 15800, "loc": { "start": { "line": 393, @@ -42323,8 +42323,8 @@ }, "callee": { "type": "MemberExpression", - "start": 15744, - "end": 15795, + "start": 15746, + "end": 15797, "loc": { "start": { "line": 393, @@ -42337,8 +42337,8 @@ }, "object": { "type": "BinaryExpression", - "start": 15745, - "end": 15786, + "start": 15747, + "end": 15788, "loc": { "start": { "line": 393, @@ -42351,8 +42351,8 @@ }, "left": { "type": "Identifier", - "start": 15745, - "end": 15764, + "start": 15747, + "end": 15766, "loc": { "start": { "line": 393, @@ -42369,8 +42369,8 @@ "operator": "/", "right": { "type": "Identifier", - "start": 15767, - "end": 15786, + "start": 15769, + "end": 15788, "loc": { "start": { "line": 393, @@ -42386,13 +42386,13 @@ }, "extra": { "parenthesized": true, - "parenStart": 15744 + "parenStart": 15746 } }, "property": { "type": "Identifier", - "start": 15788, - "end": 15795, + "start": 15790, + "end": 15797, "loc": { "start": { "line": 393, @@ -42411,8 +42411,8 @@ "arguments": [ { "type": "NumericLiteral", - "start": 15796, - "end": 15797, + "start": 15798, + "end": 15799, "loc": { "start": { "line": 393, @@ -42435,8 +42435,8 @@ }, { "type": "ExpressionStatement", - "start": 15820, - "end": 15890, + "start": 15822, + "end": 15892, "loc": { "start": { "line": 394, @@ -42449,8 +42449,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 15820, - "end": 15889, + "start": 15822, + "end": 15891, "loc": { "start": { "line": 394, @@ -42464,8 +42464,8 @@ "operator": "=", "left": { "type": "MemberExpression", - "start": 15820, - "end": 15840, + "start": 15822, + "end": 15842, "loc": { "start": { "line": 394, @@ -42478,8 +42478,8 @@ }, "object": { "type": "Identifier", - "start": 15820, - "end": 15825, + "start": 15822, + "end": 15827, "loc": { "start": { "line": 394, @@ -42495,8 +42495,8 @@ }, "property": { "type": "Identifier", - "start": 15826, - "end": 15840, + "start": 15828, + "end": 15842, "loc": { "start": { "line": 394, @@ -42514,8 +42514,8 @@ }, "right": { "type": "CallExpression", - "start": 15843, - "end": 15889, + "start": 15845, + "end": 15891, "loc": { "start": { "line": 394, @@ -42528,8 +42528,8 @@ }, "callee": { "type": "MemberExpression", - "start": 15843, - "end": 15886, + "start": 15845, + "end": 15888, "loc": { "start": { "line": 394, @@ -42542,8 +42542,8 @@ }, "object": { "type": "BinaryExpression", - "start": 15844, - "end": 15877, + "start": 15846, + "end": 15879, "loc": { "start": { "line": 394, @@ -42556,8 +42556,8 @@ }, "left": { "type": "BinaryExpression", - "start": 15845, - "end": 15867, + "start": 15847, + "end": 15869, "loc": { "start": { "line": 394, @@ -42570,8 +42570,8 @@ }, "left": { "type": "NewExpression", - "start": 15845, - "end": 15855, + "start": 15847, + "end": 15857, "loc": { "start": { "line": 394, @@ -42584,8 +42584,8 @@ }, "callee": { "type": "Identifier", - "start": 15849, - "end": 15853, + "start": 15851, + "end": 15855, "loc": { "start": { "line": 394, @@ -42604,8 +42604,8 @@ "operator": "-", "right": { "type": "Identifier", - "start": 15858, - "end": 15867, + "start": 15860, + "end": 15869, "loc": { "start": { "line": 394, @@ -42621,14 +42621,14 @@ }, "extra": { "parenthesized": true, - "parenStart": 15844 + "parenStart": 15846 } }, "operator": "/", "right": { "type": "NumericLiteral", - "start": 15871, - "end": 15877, + "start": 15873, + "end": 15879, "loc": { "start": { "line": 394, @@ -42647,13 +42647,13 @@ }, "extra": { "parenthesized": true, - "parenStart": 15843 + "parenStart": 15845 } }, "property": { "type": "Identifier", - "start": 15879, - "end": 15886, + "start": 15881, + "end": 15888, "loc": { "start": { "line": 394, @@ -42672,8 +42672,8 @@ "arguments": [ { "type": "NumericLiteral", - "start": 15887, - "end": 15888, + "start": 15889, + "end": 15890, "loc": { "start": { "line": 394, @@ -42696,8 +42696,8 @@ }, { "type": "ExpressionStatement", - "start": 15911, - "end": 15938, + "start": 15913, + "end": 15940, "loc": { "start": { "line": 395, @@ -42710,8 +42710,8 @@ }, "expression": { "type": "AssignmentExpression", - "start": 15911, - "end": 15937, + "start": 15913, + "end": 15939, "loc": { "start": { "line": 395, @@ -42725,8 +42725,8 @@ "operator": "=", "left": { "type": "MemberExpression", - "start": 15911, - "end": 15921, + "start": 15913, + "end": 15923, "loc": { "start": { "line": 395, @@ -42739,8 +42739,8 @@ }, "object": { "type": "Identifier", - "start": 15911, - "end": 15916, + "start": 15913, + "end": 15918, "loc": { "start": { "line": 395, @@ -42756,8 +42756,8 @@ }, "property": { "type": "Identifier", - "start": 15917, - "end": 15921, + "start": 15919, + "end": 15923, "loc": { "start": { "line": 395, @@ -42775,8 +42775,8 @@ }, "right": { "type": "MemberExpression", - "start": 15924, - "end": 15937, + "start": 15926, + "end": 15939, "loc": { "start": { "line": 395, @@ -42789,8 +42789,8 @@ }, "object": { "type": "Identifier", - "start": 15924, - "end": 15932, + "start": 15926, + "end": 15934, "loc": { "start": { "line": 395, @@ -42806,8 +42806,8 @@ }, "property": { "type": "Identifier", - "start": 15933, - "end": 15937, + "start": 15935, + "end": 15939, "loc": { "start": { "line": 395, @@ -42827,8 +42827,8 @@ }, { "type": "ExpressionStatement", - "start": 15959, - "end": 16005, + "start": 15961, + "end": 16007, "loc": { "start": { "line": 396, @@ -42841,8 +42841,8 @@ }, "expression": { "type": "CallExpression", - "start": 15959, - "end": 16004, + "start": 15961, + "end": 16006, "loc": { "start": { "line": 396, @@ -42855,8 +42855,8 @@ }, "callee": { "type": "Identifier", - "start": 15959, - "end": 15962, + "start": 15961, + "end": 15964, "loc": { "start": { "line": 396, @@ -42873,8 +42873,8 @@ "arguments": [ { "type": "TemplateLiteral", - "start": 15963, - "end": 16003, + "start": 15965, + "end": 16005, "loc": { "start": { "line": 396, @@ -42888,8 +42888,8 @@ "expressions": [ { "type": "MemberExpression", - "start": 15985, - "end": 16001, + "start": 15987, + "end": 16003, "loc": { "start": { "line": 396, @@ -42902,8 +42902,8 @@ }, "object": { "type": "Identifier", - "start": 15985, - "end": 15990, + "start": 15987, + "end": 15992, "loc": { "start": { "line": 396, @@ -42919,8 +42919,8 @@ }, "property": { "type": "Identifier", - "start": 15991, - "end": 16001, + "start": 15993, + "end": 16003, "loc": { "start": { "line": 396, @@ -42940,8 +42940,8 @@ "quasis": [ { "type": "TemplateElement", - "start": 15964, - "end": 15983, + "start": 15966, + "end": 15985, "loc": { "start": { "line": 396, @@ -42960,8 +42960,8 @@ }, { "type": "TemplateElement", - "start": 16002, - "end": 16002, + "start": 16004, + "end": 16004, "loc": { "start": { "line": 396, @@ -42985,8 +42985,8 @@ }, { "type": "IfStatement", - "start": 16026, - "end": 16165, + "start": 16028, + "end": 16167, "loc": { "start": { "line": 397, @@ -42999,8 +42999,8 @@ }, "test": { "type": "Identifier", - "start": 16030, - "end": 16042, + "start": 16032, + "end": 16044, "loc": { "start": { "line": 397, @@ -43016,8 +43016,8 @@ }, "consequent": { "type": "BlockStatement", - "start": 16044, - "end": 16165, + "start": 16046, + "end": 16167, "loc": { "start": { "line": 397, @@ -43031,8 +43031,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 16070, - "end": 16143, + "start": 16072, + "end": 16145, "loc": { "start": { "line": 398, @@ -43045,8 +43045,8 @@ }, "expression": { "type": "CallExpression", - "start": 16070, - "end": 16142, + "start": 16072, + "end": 16144, "loc": { "start": { "line": 398, @@ -43059,8 +43059,8 @@ }, "callee": { "type": "Identifier", - "start": 16070, - "end": 16073, + "start": 16072, + "end": 16075, "loc": { "start": { "line": 398, @@ -43077,8 +43077,8 @@ "arguments": [ { "type": "BinaryExpression", - "start": 16074, - "end": 16141, + "start": 16076, + "end": 16143, "loc": { "start": { "line": 398, @@ -43091,8 +43091,8 @@ }, "left": { "type": "StringLiteral", - "start": 16074, - "end": 16091, + "start": 16076, + "end": 16093, "loc": { "start": { "line": 398, @@ -43112,8 +43112,8 @@ "operator": "+", "right": { "type": "ConditionalExpression", - "start": 16095, - "end": 16140, + "start": 16097, + "end": 16142, "loc": { "start": { "line": 398, @@ -43126,8 +43126,8 @@ }, "test": { "type": "Identifier", - "start": 16095, - "end": 16107, + "start": 16097, + "end": 16109, "loc": { "start": { "line": 398, @@ -43143,8 +43143,8 @@ }, "consequent": { "type": "Identifier", - "start": 16110, - "end": 16122, + "start": 16112, + "end": 16124, "loc": { "start": { "line": 398, @@ -43160,8 +43160,8 @@ }, "alternate": { "type": "StringLiteral", - "start": 16125, - "end": 16140, + "start": 16127, + "end": 16142, "loc": { "start": { "line": 398, @@ -43180,7 +43180,7 @@ }, "extra": { "parenthesized": true, - "parenStart": 16094 + "parenStart": 16096 } } } @@ -43194,8 +43194,8 @@ }, { "type": "IfStatement", - "start": 16186, - "end": 16326, + "start": 16188, + "end": 16328, "loc": { "start": { "line": 400, @@ -43208,8 +43208,8 @@ }, "test": { "type": "Identifier", - "start": 16190, - "end": 16202, + "start": 16192, + "end": 16204, "loc": { "start": { "line": 400, @@ -43225,8 +43225,8 @@ }, "consequent": { "type": "BlockStatement", - "start": 16204, - "end": 16326, + "start": 16206, + "end": 16328, "loc": { "start": { "line": 400, @@ -43240,8 +43240,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 16230, - "end": 16304, + "start": 16232, + "end": 16306, "loc": { "start": { "line": 401, @@ -43254,8 +43254,8 @@ }, "expression": { "type": "CallExpression", - "start": 16230, - "end": 16303, + "start": 16232, + "end": 16305, "loc": { "start": { "line": 401, @@ -43268,8 +43268,8 @@ }, "callee": { "type": "Identifier", - "start": 16230, - "end": 16233, + "start": 16232, + "end": 16235, "loc": { "start": { "line": 401, @@ -43286,8 +43286,8 @@ "arguments": [ { "type": "BinaryExpression", - "start": 16234, - "end": 16302, + "start": 16236, + "end": 16304, "loc": { "start": { "line": 401, @@ -43300,8 +43300,8 @@ }, "left": { "type": "StringLiteral", - "start": 16234, - "end": 16251, + "start": 16236, + "end": 16253, "loc": { "start": { "line": 401, @@ -43321,8 +43321,8 @@ "operator": "+", "right": { "type": "ConditionalExpression", - "start": 16255, - "end": 16301, + "start": 16257, + "end": 16303, "loc": { "start": { "line": 401, @@ -43335,8 +43335,8 @@ }, "test": { "type": "Identifier", - "start": 16255, - "end": 16267, + "start": 16257, + "end": 16269, "loc": { "start": { "line": 401, @@ -43352,8 +43352,8 @@ }, "consequent": { "type": "Identifier", - "start": 16270, - "end": 16282, + "start": 16272, + "end": 16284, "loc": { "start": { "line": 401, @@ -43369,8 +43369,8 @@ }, "alternate": { "type": "StringLiteral", - "start": 16285, - "end": 16301, + "start": 16287, + "end": 16303, "loc": { "start": { "line": 401, @@ -43389,7 +43389,7 @@ }, "extra": { "parenthesized": true, - "parenStart": 16254 + "parenStart": 16256 } } } @@ -43403,8 +43403,8 @@ }, { "type": "ExpressionStatement", - "start": 16347, - "end": 16389, + "start": 16349, + "end": 16391, "loc": { "start": { "line": 403, @@ -43417,8 +43417,8 @@ }, "expression": { "type": "CallExpression", - "start": 16347, - "end": 16388, + "start": 16349, + "end": 16390, "loc": { "start": { "line": 403, @@ -43431,8 +43431,8 @@ }, "callee": { "type": "Identifier", - "start": 16347, - "end": 16350, + "start": 16349, + "end": 16352, "loc": { "start": { "line": 403, @@ -43449,8 +43449,8 @@ "arguments": [ { "type": "BinaryExpression", - "start": 16351, - "end": 16387, + "start": 16353, + "end": 16389, "loc": { "start": { "line": 403, @@ -43463,8 +43463,8 @@ }, "left": { "type": "BinaryExpression", - "start": 16351, - "end": 16379, + "start": 16353, + "end": 16381, "loc": { "start": { "line": 403, @@ -43477,8 +43477,8 @@ }, "left": { "type": "StringLiteral", - "start": 16351, - "end": 16363, + "start": 16353, + "end": 16365, "loc": { "start": { "line": 403, @@ -43498,8 +43498,8 @@ "operator": "+", "right": { "type": "MemberExpression", - "start": 16366, - "end": 16379, + "start": 16368, + "end": 16381, "loc": { "start": { "line": 403, @@ -43512,8 +43512,8 @@ }, "object": { "type": "Identifier", - "start": 16366, - "end": 16371, + "start": 16368, + "end": 16373, "loc": { "start": { "line": 403, @@ -43529,8 +43529,8 @@ }, "property": { "type": "Identifier", - "start": 16372, - "end": 16379, + "start": 16374, + "end": 16381, "loc": { "start": { "line": 403, @@ -43550,8 +43550,8 @@ "operator": "+", "right": { "type": "StringLiteral", - "start": 16382, - "end": 16387, + "start": 16384, + "end": 16389, "loc": { "start": { "line": 403, @@ -43574,8 +43574,8 @@ }, { "type": "ExpressionStatement", - "start": 16410, - "end": 16485, + "start": 16412, + "end": 16487, "loc": { "start": { "line": 404, @@ -43588,8 +43588,8 @@ }, "expression": { "type": "CallExpression", - "start": 16410, - "end": 16484, + "start": 16412, + "end": 16486, "loc": { "start": { "line": 404, @@ -43602,8 +43602,8 @@ }, "callee": { "type": "Identifier", - "start": 16410, - "end": 16413, + "start": 16412, + "end": 16415, "loc": { "start": { "line": 404, @@ -43620,8 +43620,8 @@ "arguments": [ { "type": "BinaryExpression", - "start": 16414, - "end": 16483, + "start": 16416, + "end": 16485, "loc": { "start": { "line": 404, @@ -43634,8 +43634,8 @@ }, "left": { "type": "BinaryExpression", - "start": 16414, - "end": 16476, + "start": 16416, + "end": 16478, "loc": { "start": { "line": 404, @@ -43648,8 +43648,8 @@ }, "left": { "type": "StringLiteral", - "start": 16414, - "end": 16435, + "start": 16416, + "end": 16437, "loc": { "start": { "line": 404, @@ -43669,8 +43669,8 @@ "operator": "+", "right": { "type": "CallExpression", - "start": 16438, - "end": 16476, + "start": 16440, + "end": 16478, "loc": { "start": { "line": 404, @@ -43683,8 +43683,8 @@ }, "callee": { "type": "MemberExpression", - "start": 16438, - "end": 16473, + "start": 16440, + "end": 16475, "loc": { "start": { "line": 404, @@ -43697,8 +43697,8 @@ }, "object": { "type": "BinaryExpression", - "start": 16439, - "end": 16464, + "start": 16441, + "end": 16466, "loc": { "start": { "line": 404, @@ -43711,8 +43711,8 @@ }, "left": { "type": "MemberExpression", - "start": 16439, - "end": 16457, + "start": 16441, + "end": 16459, "loc": { "start": { "line": 404, @@ -43725,8 +43725,8 @@ }, "object": { "type": "Identifier", - "start": 16439, - "end": 16444, + "start": 16441, + "end": 16446, "loc": { "start": { "line": 404, @@ -43742,8 +43742,8 @@ }, "property": { "type": "Identifier", - "start": 16445, - "end": 16457, + "start": 16447, + "end": 16459, "loc": { "start": { "line": 404, @@ -43762,8 +43762,8 @@ "operator": "/", "right": { "type": "NumericLiteral", - "start": 16460, - "end": 16464, + "start": 16462, + "end": 16466, "loc": { "start": { "line": 404, @@ -43782,13 +43782,13 @@ }, "extra": { "parenthesized": true, - "parenStart": 16438 + "parenStart": 16440 } }, "property": { "type": "Identifier", - "start": 16466, - "end": 16473, + "start": 16468, + "end": 16475, "loc": { "start": { "line": 404, @@ -43807,8 +43807,8 @@ "arguments": [ { "type": "NumericLiteral", - "start": 16474, - "end": 16475, + "start": 16476, + "end": 16477, "loc": { "start": { "line": 404, @@ -43831,8 +43831,8 @@ "operator": "+", "right": { "type": "StringLiteral", - "start": 16479, - "end": 16483, + "start": 16481, + "end": 16485, "loc": { "start": { "line": 404, @@ -43855,8 +43855,8 @@ }, { "type": "ExpressionStatement", - "start": 16506, - "end": 16558, + "start": 16508, + "end": 16560, "loc": { "start": { "line": 405, @@ -43869,8 +43869,8 @@ }, "expression": { "type": "CallExpression", - "start": 16506, - "end": 16557, + "start": 16508, + "end": 16559, "loc": { "start": { "line": 405, @@ -43883,8 +43883,8 @@ }, "callee": { "type": "Identifier", - "start": 16506, - "end": 16509, + "start": 16508, + "end": 16511, "loc": { "start": { "line": 405, @@ -43901,8 +43901,8 @@ "arguments": [ { "type": "BinaryExpression", - "start": 16510, - "end": 16556, + "start": 16512, + "end": 16558, "loc": { "start": { "line": 405, @@ -43915,8 +43915,8 @@ }, "left": { "type": "StringLiteral", - "start": 16510, - "end": 16531, + "start": 16512, + "end": 16533, "loc": { "start": { "line": 405, @@ -43936,8 +43936,8 @@ "operator": "+", "right": { "type": "MemberExpression", - "start": 16534, - "end": 16556, + "start": 16536, + "end": 16558, "loc": { "start": { "line": 405, @@ -43950,8 +43950,8 @@ }, "object": { "type": "Identifier", - "start": 16534, - "end": 16539, + "start": 16536, + "end": 16541, "loc": { "start": { "line": 405, @@ -43967,8 +43967,8 @@ }, "property": { "type": "Identifier", - "start": 16540, - "end": 16556, + "start": 16542, + "end": 16558, "loc": { "start": { "line": 405, @@ -43990,8 +43990,8 @@ }, { "type": "ExpressionStatement", - "start": 16579, - "end": 16634, + "start": 16581, + "end": 16636, "loc": { "start": { "line": 406, @@ -44004,8 +44004,8 @@ }, "expression": { "type": "CallExpression", - "start": 16579, - "end": 16633, + "start": 16581, + "end": 16635, "loc": { "start": { "line": 406, @@ -44018,8 +44018,8 @@ }, "callee": { "type": "Identifier", - "start": 16579, - "end": 16582, + "start": 16581, + "end": 16584, "loc": { "start": { "line": 406, @@ -44036,8 +44036,8 @@ "arguments": [ { "type": "BinaryExpression", - "start": 16583, - "end": 16632, + "start": 16585, + "end": 16634, "loc": { "start": { "line": 406, @@ -44050,8 +44050,8 @@ }, "left": { "type": "BinaryExpression", - "start": 16583, - "end": 16625, + "start": 16585, + "end": 16627, "loc": { "start": { "line": 406, @@ -44064,8 +44064,8 @@ }, "left": { "type": "StringLiteral", - "start": 16583, - "end": 16602, + "start": 16585, + "end": 16604, "loc": { "start": { "line": 406, @@ -44085,8 +44085,8 @@ "operator": "+", "right": { "type": "MemberExpression", - "start": 16605, - "end": 16625, + "start": 16607, + "end": 16627, "loc": { "start": { "line": 406, @@ -44099,8 +44099,8 @@ }, "object": { "type": "Identifier", - "start": 16605, - "end": 16610, + "start": 16607, + "end": 16612, "loc": { "start": { "line": 406, @@ -44116,8 +44116,8 @@ }, "property": { "type": "Identifier", - "start": 16611, - "end": 16625, + "start": 16613, + "end": 16627, "loc": { "start": { "line": 406, @@ -44137,8 +44137,8 @@ "operator": "+", "right": { "type": "StringLiteral", - "start": 16628, - "end": 16632, + "start": 16630, + "end": 16634, "loc": { "start": { "line": 406, @@ -44161,8 +44161,8 @@ }, { "type": "ExpressionStatement", - "start": 16655, - "end": 16709, + "start": 16657, + "end": 16711, "loc": { "start": { "line": 407, @@ -44175,8 +44175,8 @@ }, "expression": { "type": "CallExpression", - "start": 16655, - "end": 16708, + "start": 16657, + "end": 16710, "loc": { "start": { "line": 407, @@ -44189,8 +44189,8 @@ }, "callee": { "type": "Identifier", - "start": 16655, - "end": 16658, + "start": 16657, + "end": 16660, "loc": { "start": { "line": 407, @@ -44207,8 +44207,8 @@ "arguments": [ { "type": "BinaryExpression", - "start": 16659, - "end": 16707, + "start": 16661, + "end": 16709, "loc": { "start": { "line": 407, @@ -44221,8 +44221,8 @@ }, "left": { "type": "StringLiteral", - "start": 16659, - "end": 16684, + "start": 16661, + "end": 16686, "loc": { "start": { "line": 407, @@ -44242,8 +44242,8 @@ "operator": "+", "right": { "type": "MemberExpression", - "start": 16687, - "end": 16707, + "start": 16689, + "end": 16709, "loc": { "start": { "line": 407, @@ -44256,8 +44256,8 @@ }, "object": { "type": "Identifier", - "start": 16687, - "end": 16692, + "start": 16689, + "end": 16694, "loc": { "start": { "line": 407, @@ -44273,8 +44273,8 @@ }, "property": { "type": "Identifier", - "start": 16693, - "end": 16707, + "start": 16695, + "end": 16709, "loc": { "start": { "line": 407, @@ -44296,8 +44296,8 @@ }, { "type": "ExpressionStatement", - "start": 16730, - "end": 16787, + "start": 16732, + "end": 16789, "loc": { "start": { "line": 408, @@ -44310,8 +44310,8 @@ }, "expression": { "type": "CallExpression", - "start": 16730, - "end": 16786, + "start": 16732, + "end": 16788, "loc": { "start": { "line": 408, @@ -44324,8 +44324,8 @@ }, "callee": { "type": "Identifier", - "start": 16730, - "end": 16733, + "start": 16732, + "end": 16735, "loc": { "start": { "line": 408, @@ -44342,8 +44342,8 @@ "arguments": [ { "type": "BinaryExpression", - "start": 16734, - "end": 16785, + "start": 16736, + "end": 16787, "loc": { "start": { "line": 408, @@ -44356,8 +44356,8 @@ }, "left": { "type": "StringLiteral", - "start": 16734, - "end": 16761, + "start": 16736, + "end": 16763, "loc": { "start": { "line": 408, @@ -44377,8 +44377,8 @@ "operator": "+", "right": { "type": "MemberExpression", - "start": 16764, - "end": 16785, + "start": 16766, + "end": 16787, "loc": { "start": { "line": 408, @@ -44391,8 +44391,8 @@ }, "object": { "type": "Identifier", - "start": 16764, - "end": 16769, + "start": 16766, + "end": 16771, "loc": { "start": { "line": 408, @@ -44408,8 +44408,8 @@ }, "property": { "type": "Identifier", - "start": 16770, - "end": 16785, + "start": 16772, + "end": 16787, "loc": { "start": { "line": 408, @@ -44431,8 +44431,8 @@ }, { "type": "ExpressionStatement", - "start": 16808, - "end": 16863, + "start": 16810, + "end": 16865, "loc": { "start": { "line": 409, @@ -44445,8 +44445,8 @@ }, "expression": { "type": "CallExpression", - "start": 16808, - "end": 16862, + "start": 16810, + "end": 16864, "loc": { "start": { "line": 409, @@ -44459,8 +44459,8 @@ }, "callee": { "type": "Identifier", - "start": 16808, - "end": 16811, + "start": 16810, + "end": 16813, "loc": { "start": { "line": 409, @@ -44477,8 +44477,8 @@ "arguments": [ { "type": "BinaryExpression", - "start": 16812, - "end": 16861, + "start": 16814, + "end": 16863, "loc": { "start": { "line": 409, @@ -44491,8 +44491,8 @@ }, "left": { "type": "StringLiteral", - "start": 16812, - "end": 16842, + "start": 16814, + "end": 16844, "loc": { "start": { "line": 409, @@ -44512,8 +44512,8 @@ "operator": "+", "right": { "type": "MemberExpression", - "start": 16845, - "end": 16861, + "start": 16847, + "end": 16863, "loc": { "start": { "line": 409, @@ -44526,8 +44526,8 @@ }, "object": { "type": "Identifier", - "start": 16845, - "end": 16850, + "start": 16847, + "end": 16852, "loc": { "start": { "line": 409, @@ -44543,8 +44543,8 @@ }, "property": { "type": "Identifier", - "start": 16851, - "end": 16861, + "start": 16853, + "end": 16863, "loc": { "start": { "line": 409, @@ -44566,8 +44566,8 @@ }, { "type": "ExpressionStatement", - "start": 16884, - "end": 16936, + "start": 16886, + "end": 16938, "loc": { "start": { "line": 410, @@ -44580,8 +44580,8 @@ }, "expression": { "type": "CallExpression", - "start": 16884, - "end": 16935, + "start": 16886, + "end": 16937, "loc": { "start": { "line": 410, @@ -44594,8 +44594,8 @@ }, "callee": { "type": "Identifier", - "start": 16884, - "end": 16887, + "start": 16886, + "end": 16889, "loc": { "start": { "line": 410, @@ -44612,8 +44612,8 @@ "arguments": [ { "type": "BinaryExpression", - "start": 16888, - "end": 16934, + "start": 16890, + "end": 16936, "loc": { "start": { "line": 410, @@ -44626,8 +44626,8 @@ }, "left": { "type": "StringLiteral", - "start": 16888, - "end": 16912, + "start": 16890, + "end": 16914, "loc": { "start": { "line": 410, @@ -44647,8 +44647,8 @@ "operator": "+", "right": { "type": "MemberExpression", - "start": 16915, - "end": 16934, + "start": 16917, + "end": 16936, "loc": { "start": { "line": 410, @@ -44661,8 +44661,8 @@ }, "object": { "type": "Identifier", - "start": 16915, - "end": 16920, + "start": 16917, + "end": 16922, "loc": { "start": { "line": 410, @@ -44678,8 +44678,8 @@ }, "property": { "type": "Identifier", - "start": 16921, - "end": 16934, + "start": 16923, + "end": 16936, "loc": { "start": { "line": 410, @@ -44701,8 +44701,8 @@ }, { "type": "ExpressionStatement", - "start": 16957, - "end": 17005, + "start": 16959, + "end": 17007, "loc": { "start": { "line": 411, @@ -44715,8 +44715,8 @@ }, "expression": { "type": "CallExpression", - "start": 16957, - "end": 17004, + "start": 16959, + "end": 17006, "loc": { "start": { "line": 411, @@ -44729,8 +44729,8 @@ }, "callee": { "type": "Identifier", - "start": 16957, - "end": 16960, + "start": 16959, + "end": 16962, "loc": { "start": { "line": 411, @@ -44747,8 +44747,8 @@ "arguments": [ { "type": "BinaryExpression", - "start": 16961, - "end": 17003, + "start": 16963, + "end": 17005, "loc": { "start": { "line": 411, @@ -44761,8 +44761,8 @@ }, "left": { "type": "StringLiteral", - "start": 16961, - "end": 16983, + "start": 16963, + "end": 16985, "loc": { "start": { "line": 411, @@ -44782,8 +44782,8 @@ "operator": "+", "right": { "type": "MemberExpression", - "start": 16986, - "end": 17003, + "start": 16988, + "end": 17005, "loc": { "start": { "line": 411, @@ -44796,8 +44796,8 @@ }, "object": { "type": "Identifier", - "start": 16986, - "end": 16991, + "start": 16988, + "end": 16993, "loc": { "start": { "line": 411, @@ -44813,8 +44813,8 @@ }, "property": { "type": "Identifier", - "start": 16992, - "end": 17003, + "start": 16994, + "end": 17005, "loc": { "start": { "line": 411, @@ -44836,8 +44836,8 @@ }, { "type": "ExpressionStatement", - "start": 17026, - "end": 17080, + "start": 17028, + "end": 17082, "loc": { "start": { "line": 412, @@ -44850,8 +44850,8 @@ }, "expression": { "type": "CallExpression", - "start": 17026, - "end": 17079, + "start": 17028, + "end": 17081, "loc": { "start": { "line": 412, @@ -44864,8 +44864,8 @@ }, "callee": { "type": "Identifier", - "start": 17026, - "end": 17029, + "start": 17028, + "end": 17031, "loc": { "start": { "line": 412, @@ -44882,8 +44882,8 @@ "arguments": [ { "type": "BinaryExpression", - "start": 17030, - "end": 17078, + "start": 17032, + "end": 17080, "loc": { "start": { "line": 412, @@ -44896,8 +44896,8 @@ }, "left": { "type": "StringLiteral", - "start": 17030, - "end": 17055, + "start": 17032, + "end": 17057, "loc": { "start": { "line": 412, @@ -44917,8 +44917,8 @@ "operator": "+", "right": { "type": "MemberExpression", - "start": 17058, - "end": 17078, + "start": 17060, + "end": 17080, "loc": { "start": { "line": 412, @@ -44931,8 +44931,8 @@ }, "object": { "type": "Identifier", - "start": 17058, - "end": 17063, + "start": 17060, + "end": 17065, "loc": { "start": { "line": 412, @@ -44948,8 +44948,8 @@ }, "property": { "type": "Identifier", - "start": 17064, - "end": 17078, + "start": 17066, + "end": 17080, "loc": { "start": { "line": 412, @@ -44971,8 +44971,8 @@ }, { "type": "ExpressionStatement", - "start": 17101, - "end": 17151, + "start": 17103, + "end": 17153, "loc": { "start": { "line": 413, @@ -44985,8 +44985,8 @@ }, "expression": { "type": "CallExpression", - "start": 17101, - "end": 17150, + "start": 17103, + "end": 17152, "loc": { "start": { "line": 413, @@ -44999,8 +44999,8 @@ }, "callee": { "type": "Identifier", - "start": 17101, - "end": 17104, + "start": 17103, + "end": 17106, "loc": { "start": { "line": 413, @@ -45017,8 +45017,8 @@ "arguments": [ { "type": "BinaryExpression", - "start": 17105, - "end": 17149, + "start": 17107, + "end": 17151, "loc": { "start": { "line": 413, @@ -45031,8 +45031,8 @@ }, "left": { "type": "StringLiteral", - "start": 17105, - "end": 17128, + "start": 17107, + "end": 17130, "loc": { "start": { "line": 413, @@ -45052,8 +45052,8 @@ "operator": "+", "right": { "type": "MemberExpression", - "start": 17131, - "end": 17149, + "start": 17133, + "end": 17151, "loc": { "start": { "line": 413, @@ -45066,8 +45066,8 @@ }, "object": { "type": "Identifier", - "start": 17131, - "end": 17136, + "start": 17133, + "end": 17138, "loc": { "start": { "line": 413, @@ -45083,8 +45083,8 @@ }, "property": { "type": "Identifier", - "start": 17137, - "end": 17149, + "start": 17139, + "end": 17151, "loc": { "start": { "line": 413, @@ -45106,8 +45106,8 @@ }, { "type": "ExpressionStatement", - "start": 17172, - "end": 17220, + "start": 17174, + "end": 17222, "loc": { "start": { "line": 414, @@ -45120,8 +45120,8 @@ }, "expression": { "type": "CallExpression", - "start": 17172, - "end": 17219, + "start": 17174, + "end": 17221, "loc": { "start": { "line": 414, @@ -45134,8 +45134,8 @@ }, "callee": { "type": "Identifier", - "start": 17172, - "end": 17175, + "start": 17174, + "end": 17177, "loc": { "start": { "line": 414, @@ -45152,8 +45152,8 @@ "arguments": [ { "type": "BinaryExpression", - "start": 17176, - "end": 17218, + "start": 17178, + "end": 17220, "loc": { "start": { "line": 414, @@ -45166,8 +45166,8 @@ }, "left": { "type": "StringLiteral", - "start": 17176, - "end": 17198, + "start": 17178, + "end": 17200, "loc": { "start": { "line": 414, @@ -45187,8 +45187,8 @@ "operator": "+", "right": { "type": "MemberExpression", - "start": 17201, - "end": 17218, + "start": 17203, + "end": 17220, "loc": { "start": { "line": 414, @@ -45201,8 +45201,8 @@ }, "object": { "type": "Identifier", - "start": 17201, - "end": 17206, + "start": 17203, + "end": 17208, "loc": { "start": { "line": 414, @@ -45218,8 +45218,8 @@ }, "property": { "type": "Identifier", - "start": 17207, - "end": 17218, + "start": 17209, + "end": 17220, "loc": { "start": { "line": 414, @@ -45241,8 +45241,8 @@ }, { "type": "ExpressionStatement", - "start": 17241, - "end": 17279, + "start": 17243, + "end": 17281, "loc": { "start": { "line": 415, @@ -45255,8 +45255,8 @@ }, "expression": { "type": "CallExpression", - "start": 17241, - "end": 17278, + "start": 17243, + "end": 17280, "loc": { "start": { "line": 415, @@ -45269,8 +45269,8 @@ }, "callee": { "type": "Identifier", - "start": 17241, - "end": 17244, + "start": 17243, + "end": 17246, "loc": { "start": { "line": 415, @@ -45287,8 +45287,8 @@ "arguments": [ { "type": "BinaryExpression", - "start": 17245, - "end": 17277, + "start": 17247, + "end": 17279, "loc": { "start": { "line": 415, @@ -45301,8 +45301,8 @@ }, "left": { "type": "StringLiteral", - "start": 17245, - "end": 17262, + "start": 17247, + "end": 17264, "loc": { "start": { "line": 415, @@ -45322,8 +45322,8 @@ "operator": "+", "right": { "type": "MemberExpression", - "start": 17265, - "end": 17277, + "start": 17267, + "end": 17279, "loc": { "start": { "line": 415, @@ -45336,8 +45336,8 @@ }, "object": { "type": "Identifier", - "start": 17265, - "end": 17270, + "start": 17267, + "end": 17272, "loc": { "start": { "line": 415, @@ -45353,8 +45353,8 @@ }, "property": { "type": "Identifier", - "start": 17271, - "end": 17277, + "start": 17273, + "end": 17279, "loc": { "start": { "line": 415, @@ -45376,8 +45376,8 @@ }, { "type": "ExpressionStatement", - "start": 17300, - "end": 17346, + "start": 17302, + "end": 17348, "loc": { "start": { "line": 416, @@ -45390,8 +45390,8 @@ }, "expression": { "type": "CallExpression", - "start": 17300, - "end": 17345, + "start": 17302, + "end": 17347, "loc": { "start": { "line": 416, @@ -45404,8 +45404,8 @@ }, "callee": { "type": "Identifier", - "start": 17300, - "end": 17303, + "start": 17302, + "end": 17305, "loc": { "start": { "line": 416, @@ -45422,8 +45422,8 @@ "arguments": [ { "type": "BinaryExpression", - "start": 17304, - "end": 17344, + "start": 17306, + "end": 17346, "loc": { "start": { "line": 416, @@ -45436,8 +45436,8 @@ }, "left": { "type": "StringLiteral", - "start": 17304, - "end": 17325, + "start": 17306, + "end": 17327, "loc": { "start": { "line": 416, @@ -45457,8 +45457,8 @@ "operator": "+", "right": { "type": "MemberExpression", - "start": 17328, - "end": 17344, + "start": 17330, + "end": 17346, "loc": { "start": { "line": 416, @@ -45471,8 +45471,8 @@ }, "object": { "type": "Identifier", - "start": 17328, - "end": 17333, + "start": 17330, + "end": 17335, "loc": { "start": { "line": 416, @@ -45488,8 +45488,8 @@ }, "property": { "type": "Identifier", - "start": 17334, - "end": 17344, + "start": 17336, + "end": 17346, "loc": { "start": { "line": 416, @@ -45511,8 +45511,8 @@ }, { "type": "ExpressionStatement", - "start": 17367, - "end": 17420, + "start": 17369, + "end": 17422, "loc": { "start": { "line": 417, @@ -45525,8 +45525,8 @@ }, "expression": { "type": "CallExpression", - "start": 17367, - "end": 17419, + "start": 17369, + "end": 17421, "loc": { "start": { "line": 417, @@ -45539,8 +45539,8 @@ }, "callee": { "type": "Identifier", - "start": 17367, - "end": 17370, + "start": 17369, + "end": 17372, "loc": { "start": { "line": 417, @@ -45557,8 +45557,8 @@ "arguments": [ { "type": "BinaryExpression", - "start": 17371, - "end": 17418, + "start": 17373, + "end": 17420, "loc": { "start": { "line": 417, @@ -45571,8 +45571,8 @@ }, "left": { "type": "StringLiteral", - "start": 17371, - "end": 17390, + "start": 17373, + "end": 17392, "loc": { "start": { "line": 417, @@ -45592,8 +45592,8 @@ "operator": "+", "right": { "type": "MemberExpression", - "start": 17393, - "end": 17418, + "start": 17395, + "end": 17420, "loc": { "start": { "line": 417, @@ -45606,8 +45606,8 @@ }, "object": { "type": "MemberExpression", - "start": 17393, - "end": 17411, + "start": 17395, + "end": 17413, "loc": { "start": { "line": 417, @@ -45620,8 +45620,8 @@ }, "object": { "type": "Identifier", - "start": 17393, - "end": 17401, + "start": 17395, + "end": 17403, "loc": { "start": { "line": 417, @@ -45637,8 +45637,8 @@ }, "property": { "type": "Identifier", - "start": 17402, - "end": 17411, + "start": 17404, + "end": 17413, "loc": { "start": { "line": 417, @@ -45656,8 +45656,8 @@ }, "property": { "type": "Identifier", - "start": 17412, - "end": 17418, + "start": 17414, + "end": 17420, "loc": { "start": { "line": 417, @@ -45679,8 +45679,8 @@ }, { "type": "ExpressionStatement", - "start": 17441, - "end": 17482, + "start": 17443, + "end": 17484, "loc": { "start": { "line": 418, @@ -45693,8 +45693,8 @@ }, "expression": { "type": "CallExpression", - "start": 17441, - "end": 17481, + "start": 17443, + "end": 17483, "loc": { "start": { "line": 418, @@ -45707,8 +45707,8 @@ }, "callee": { "type": "Identifier", - "start": 17441, - "end": 17444, + "start": 17443, + "end": 17446, "loc": { "start": { "line": 418, @@ -45725,8 +45725,8 @@ "arguments": [ { "type": "BinaryExpression", - "start": 17445, - "end": 17480, + "start": 17447, + "end": 17482, "loc": { "start": { "line": 418, @@ -45739,8 +45739,8 @@ }, "left": { "type": "StringLiteral", - "start": 17445, - "end": 17460, + "start": 17447, + "end": 17462, "loc": { "start": { "line": 418, @@ -45760,8 +45760,8 @@ "operator": "+", "right": { "type": "MemberExpression", - "start": 17463, - "end": 17480, + "start": 17465, + "end": 17482, "loc": { "start": { "line": 418, @@ -45774,8 +45774,8 @@ }, "object": { "type": "Identifier", - "start": 17463, - "end": 17468, + "start": 17465, + "end": 17470, "loc": { "start": { "line": 418, @@ -45791,8 +45791,8 @@ }, "property": { "type": "Identifier", - "start": 17469, - "end": 17480, + "start": 17471, + "end": 17482, "loc": { "start": { "line": 418, @@ -45814,8 +45814,8 @@ }, { "type": "IfStatement", - "start": 17504, - "end": 17900, + "start": 17506, + "end": 17902, "loc": { "start": { "line": 420, @@ -45828,8 +45828,8 @@ }, "test": { "type": "Identifier", - "start": 17508, - "end": 17514, + "start": 17510, + "end": 17516, "loc": { "start": { "line": 420, @@ -45845,8 +45845,8 @@ }, "consequent": { "type": "BlockStatement", - "start": 17516, - "end": 17900, + "start": 17518, + "end": 17902, "loc": { "start": { "line": 420, @@ -45860,8 +45860,8 @@ "body": [ { "type": "VariableDeclaration", - "start": 17542, - "end": 17581, + "start": 17544, + "end": 17583, "loc": { "start": { "line": 421, @@ -45875,8 +45875,8 @@ "declarations": [ { "type": "VariableDeclarator", - "start": 17548, - "end": 17580, + "start": 17550, + "end": 17582, "loc": { "start": { "line": 421, @@ -45889,8 +45889,8 @@ }, "id": { "type": "Identifier", - "start": 17548, - "end": 17557, + "start": 17550, + "end": 17559, "loc": { "start": { "line": 421, @@ -45906,8 +45906,8 @@ }, "init": { "type": "CallExpression", - "start": 17560, - "end": 17580, + "start": 17562, + "end": 17582, "loc": { "start": { "line": 421, @@ -45920,8 +45920,8 @@ }, "callee": { "type": "MemberExpression", - "start": 17560, - "end": 17572, + "start": 17562, + "end": 17574, "loc": { "start": { "line": 421, @@ -45934,8 +45934,8 @@ }, "object": { "type": "Identifier", - "start": 17560, - "end": 17564, + "start": 17562, + "end": 17566, "loc": { "start": { "line": 421, @@ -45951,8 +45951,8 @@ }, "property": { "type": "Identifier", - "start": 17565, - "end": 17572, + "start": 17567, + "end": 17574, "loc": { "start": { "line": 421, @@ -45971,8 +45971,8 @@ "arguments": [ { "type": "Identifier", - "start": 17573, - "end": 17579, + "start": 17575, + "end": 17581, "loc": { "start": { "line": 421, @@ -45994,8 +45994,8 @@ }, { "type": "IfStatement", - "start": 17606, - "end": 17756, + "start": 17608, + "end": 17758, "loc": { "start": { "line": 422, @@ -46008,8 +46008,8 @@ }, "test": { "type": "LogicalExpression", - "start": 17610, - "end": 17655, + "start": 17612, + "end": 17657, "loc": { "start": { "line": 422, @@ -46022,8 +46022,8 @@ }, "left": { "type": "BinaryExpression", - "start": 17610, - "end": 17626, + "start": 17612, + "end": 17628, "loc": { "start": { "line": 422, @@ -46036,8 +46036,8 @@ }, "left": { "type": "Identifier", - "start": 17610, - "end": 17619, + "start": 17612, + "end": 17621, "loc": { "start": { "line": 422, @@ -46054,8 +46054,8 @@ "operator": "!==", "right": { "type": "StringLiteral", - "start": 17624, - "end": 17626, + "start": 17626, + "end": 17628, "loc": { "start": { "line": 422, @@ -46076,8 +46076,8 @@ "operator": "&&", "right": { "type": "UnaryExpression", - "start": 17630, - "end": 17655, + "start": 17632, + "end": 17657, "loc": { "start": { "line": 422, @@ -46092,8 +46092,8 @@ "prefix": true, "argument": { "type": "CallExpression", - "start": 17631, - "end": 17655, + "start": 17633, + "end": 17657, "loc": { "start": { "line": 422, @@ -46106,8 +46106,8 @@ }, "callee": { "type": "MemberExpression", - "start": 17631, - "end": 17644, + "start": 17633, + "end": 17646, "loc": { "start": { "line": 422, @@ -46120,8 +46120,8 @@ }, "object": { "type": "Identifier", - "start": 17631, - "end": 17633, + "start": 17633, + "end": 17635, "loc": { "start": { "line": 422, @@ -46137,8 +46137,8 @@ }, "property": { "type": "Identifier", - "start": 17634, - "end": 17644, + "start": 17636, + "end": 17646, "loc": { "start": { "line": 422, @@ -46157,8 +46157,8 @@ "arguments": [ { "type": "Identifier", - "start": 17645, - "end": 17654, + "start": 17647, + "end": 17656, "loc": { "start": { "line": 422, @@ -46181,8 +46181,8 @@ }, "consequent": { "type": "BlockStatement", - "start": 17657, - "end": 17756, + "start": 17659, + "end": 17758, "loc": { "start": { "line": 422, @@ -46196,8 +46196,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 17687, - "end": 17730, + "start": 17689, + "end": 17732, "loc": { "start": { "line": 423, @@ -46210,8 +46210,8 @@ }, "expression": { "type": "CallExpression", - "start": 17687, - "end": 17729, + "start": 17689, + "end": 17731, "loc": { "start": { "line": 423, @@ -46224,8 +46224,8 @@ }, "callee": { "type": "MemberExpression", - "start": 17687, - "end": 17699, + "start": 17689, + "end": 17701, "loc": { "start": { "line": 423, @@ -46238,8 +46238,8 @@ }, "object": { "type": "Identifier", - "start": 17687, - "end": 17689, + "start": 17689, + "end": 17691, "loc": { "start": { "line": 423, @@ -46255,8 +46255,8 @@ }, "property": { "type": "Identifier", - "start": 17690, - "end": 17699, + "start": 17692, + "end": 17701, "loc": { "start": { "line": 423, @@ -46275,8 +46275,8 @@ "arguments": [ { "type": "Identifier", - "start": 17700, - "end": 17709, + "start": 17702, + "end": 17711, "loc": { "start": { "line": 423, @@ -46292,8 +46292,8 @@ }, { "type": "ObjectExpression", - "start": 17711, - "end": 17728, + "start": 17713, + "end": 17730, "loc": { "start": { "line": 423, @@ -46307,8 +46307,8 @@ "properties": [ { "type": "ObjectProperty", - "start": 17712, - "end": 17727, + "start": 17714, + "end": 17729, "loc": { "start": { "line": 423, @@ -46324,8 +46324,8 @@ "computed": false, "key": { "type": "Identifier", - "start": 17712, - "end": 17721, + "start": 17714, + "end": 17723, "loc": { "start": { "line": 423, @@ -46341,8 +46341,8 @@ }, "value": { "type": "BooleanLiteral", - "start": 17723, - "end": 17727, + "start": 17725, + "end": 17729, "loc": { "start": { "line": 423, @@ -46368,8 +46368,8 @@ }, { "type": "ExpressionStatement", - "start": 17781, - "end": 17816, + "start": 17783, + "end": 17818, "loc": { "start": { "line": 425, @@ -46382,8 +46382,8 @@ }, "expression": { "type": "CallExpression", - "start": 17781, - "end": 17815, + "start": 17783, + "end": 17817, "loc": { "start": { "line": 425, @@ -46396,8 +46396,8 @@ }, "callee": { "type": "Identifier", - "start": 17781, - "end": 17784, + "start": 17783, + "end": 17786, "loc": { "start": { "line": 425, @@ -46414,8 +46414,8 @@ "arguments": [ { "type": "BinaryExpression", - "start": 17785, - "end": 17814, + "start": 17787, + "end": 17816, "loc": { "start": { "line": 425, @@ -46428,8 +46428,8 @@ }, "left": { "type": "StringLiteral", - "start": 17785, - "end": 17805, + "start": 17787, + "end": 17807, "loc": { "start": { "line": 425, @@ -46449,8 +46449,8 @@ "operator": "+", "right": { "type": "Identifier", - "start": 17808, - "end": 17814, + "start": 17810, + "end": 17816, "loc": { "start": { "line": 425, @@ -46470,8 +46470,8 @@ }, { "type": "ExpressionStatement", - "start": 17841, - "end": 17878, + "start": 17843, + "end": 17880, "loc": { "start": { "line": 426, @@ -46484,8 +46484,8 @@ }, "expression": { "type": "CallExpression", - "start": 17841, - "end": 17877, + "start": 17843, + "end": 17879, "loc": { "start": { "line": 426, @@ -46498,8 +46498,8 @@ }, "callee": { "type": "MemberExpression", - "start": 17841, - "end": 17857, + "start": 17843, + "end": 17859, "loc": { "start": { "line": 426, @@ -46512,8 +46512,8 @@ }, "object": { "type": "Identifier", - "start": 17841, - "end": 17843, + "start": 17843, + "end": 17845, "loc": { "start": { "line": 426, @@ -46529,8 +46529,8 @@ }, "property": { "type": "Identifier", - "start": 17844, - "end": 17857, + "start": 17846, + "end": 17859, "loc": { "start": { "line": 426, @@ -46549,8 +46549,8 @@ "arguments": [ { "type": "Identifier", - "start": 17858, - "end": 17864, + "start": 17860, + "end": 17866, "loc": { "start": { "line": 426, @@ -46566,8 +46566,8 @@ }, { "type": "Identifier", - "start": 17866, - "end": 17876, + "start": 17868, + "end": 17878, "loc": { "start": { "line": 426, @@ -46591,8 +46591,8 @@ }, { "type": "IfStatement", - "start": 17922, - "end": 18015, + "start": 17924, + "end": 18017, "loc": { "start": { "line": 429, @@ -46605,8 +46605,8 @@ }, "test": { "type": "Identifier", - "start": 17926, - "end": 17940, + "start": 17928, + "end": 17942, "loc": { "start": { "line": 429, @@ -46622,8 +46622,8 @@ }, "consequent": { "type": "BlockStatement", - "start": 17942, - "end": 18015, + "start": 17944, + "end": 18017, "loc": { "start": { "line": 429, @@ -46637,8 +46637,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 17968, - "end": 17993, + "start": 17970, + "end": 17995, "loc": { "start": { "line": 430, @@ -46651,8 +46651,8 @@ }, "expression": { "type": "CallExpression", - "start": 17968, - "end": 17992, + "start": 17970, + "end": 17994, "loc": { "start": { "line": 430, @@ -46665,8 +46665,8 @@ }, "callee": { "type": "Identifier", - "start": 17968, - "end": 17982, + "start": 17970, + "end": 17984, "loc": { "start": { "line": 430, @@ -46683,8 +46683,8 @@ "arguments": [ { "type": "Identifier", - "start": 17983, - "end": 17991, + "start": 17985, + "end": 17993, "loc": { "start": { "line": 430, @@ -46708,8 +46708,8 @@ }, { "type": "IfStatement", - "start": 18037, - "end": 18122, + "start": 18039, + "end": 18124, "loc": { "start": { "line": 433, @@ -46722,8 +46722,8 @@ }, "test": { "type": "Identifier", - "start": 18041, - "end": 18050, + "start": 18043, + "end": 18052, "loc": { "start": { "line": 433, @@ -46739,8 +46739,8 @@ }, "consequent": { "type": "BlockStatement", - "start": 18052, - "end": 18122, + "start": 18054, + "end": 18124, "loc": { "start": { "line": 433, @@ -46754,8 +46754,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 18078, - "end": 18100, + "start": 18080, + "end": 18102, "loc": { "start": { "line": 434, @@ -46768,8 +46768,8 @@ }, "expression": { "type": "CallExpression", - "start": 18078, - "end": 18099, + "start": 18080, + "end": 18101, "loc": { "start": { "line": 434, @@ -46782,8 +46782,8 @@ }, "callee": { "type": "Identifier", - "start": 18078, - "end": 18087, + "start": 18080, + "end": 18089, "loc": { "start": { "line": 434, @@ -46800,8 +46800,8 @@ "arguments": [ { "type": "Identifier", - "start": 18088, - "end": 18098, + "start": 18090, + "end": 18100, "loc": { "start": { "line": 434, @@ -46825,8 +46825,8 @@ }, { "type": "IfStatement", - "start": 18144, - "end": 18228, + "start": 18146, + "end": 18230, "loc": { "start": { "line": 437, @@ -46839,8 +46839,8 @@ }, "test": { "type": "Identifier", - "start": 18148, - "end": 18159, + "start": 18150, + "end": 18161, "loc": { "start": { "line": 437, @@ -46856,8 +46856,8 @@ }, "consequent": { "type": "BlockStatement", - "start": 18161, - "end": 18228, + "start": 18163, + "end": 18230, "loc": { "start": { "line": 437, @@ -46871,8 +46871,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 18187, - "end": 18206, + "start": 18189, + "end": 18208, "loc": { "start": { "line": 438, @@ -46885,8 +46885,8 @@ }, "expression": { "type": "CallExpression", - "start": 18187, - "end": 18205, + "start": 18189, + "end": 18207, "loc": { "start": { "line": 438, @@ -46899,8 +46899,8 @@ }, "callee": { "type": "Identifier", - "start": 18187, - "end": 18198, + "start": 18189, + "end": 18200, "loc": { "start": { "line": 438, @@ -46917,8 +46917,8 @@ "arguments": [ { "type": "Identifier", - "start": 18199, - "end": 18204, + "start": 18201, + "end": 18206, "loc": { "start": { "line": 438, @@ -46942,8 +46942,8 @@ }, { "type": "ExpressionStatement", - "start": 18250, - "end": 18260, + "start": 18252, + "end": 18262, "loc": { "start": { "line": 441, @@ -46956,8 +46956,8 @@ }, "expression": { "type": "CallExpression", - "start": 18250, - "end": 18259, + "start": 18252, + "end": 18261, "loc": { "start": { "line": 441, @@ -46970,8 +46970,8 @@ }, "callee": { "type": "Identifier", - "start": 18250, - "end": 18257, + "start": 18252, + "end": 18259, "loc": { "start": { "line": 441, @@ -47001,8 +47001,8 @@ }, { "type": "ArrowFunctionExpression", - "start": 18296, - "end": 18349, + "start": 18298, + "end": 18351, "loc": { "start": { "line": 443, @@ -47020,8 +47020,8 @@ "params": [ { "type": "Identifier", - "start": 18297, - "end": 18300, + "start": 18299, + "end": 18302, "loc": { "start": { "line": 443, @@ -47038,8 +47038,8 @@ ], "body": { "type": "BlockStatement", - "start": 18305, - "end": 18349, + "start": 18307, + "end": 18351, "loc": { "start": { "line": 443, @@ -47053,8 +47053,8 @@ "body": [ { "type": "ExpressionStatement", - "start": 18323, - "end": 18335, + "start": 18325, + "end": 18337, "loc": { "start": { "line": 444, @@ -47067,8 +47067,8 @@ }, "expression": { "type": "CallExpression", - "start": 18323, - "end": 18334, + "start": 18325, + "end": 18336, "loc": { "start": { "line": 444, @@ -47081,8 +47081,8 @@ }, "callee": { "type": "Identifier", - "start": 18323, - "end": 18329, + "start": 18325, + "end": 18331, "loc": { "start": { "line": 444, @@ -47099,8 +47099,8 @@ "arguments": [ { "type": "Identifier", - "start": 18330, - "end": 18333, + "start": 18332, + "end": 18335, "loc": { "start": { "line": 444, @@ -47185,8 +47185,8 @@ { "type": "CommentLine", "value": " case \"gltf\":", - "start": 11446, - "end": 11461, + "start": 11448, + "end": 11463, "loc": { "start": { "line": 272, @@ -47201,8 +47201,8 @@ { "type": "CommentLine", "value": " const gltfJSON = JSON.parse(sourceData);", - "start": 11474, - "end": 11521, + "start": 11476, + "end": 11523, "loc": { "start": { "line": 273, @@ -47217,8 +47217,8 @@ { "type": "CommentLine", "value": " const gltfBasePath = source ? getBasePath(source) : \"\";", - "start": 11534, - "end": 11596, + "start": 11536, + "end": 11598, "loc": { "start": { "line": 274, @@ -47233,8 +47233,8 @@ { "type": "CommentLine", "value": " convert(parseGLTFIntoXKTModel, {", - "start": 11609, - "end": 11648, + "start": 11611, + "end": 11650, "loc": { "start": { "line": 275, @@ -47249,8 +47249,8 @@ { "type": "CommentLine", "value": " baseUri: gltfBasePath,", - "start": 11661, - "end": 11694, + "start": 11663, + "end": 11696, "loc": { "start": { "line": 276, @@ -47265,8 +47265,8 @@ { "type": "CommentLine", "value": " data: gltfJSON,", - "start": 11707, - "end": 11733, + "start": 11709, + "end": 11735, "loc": { "start": { "line": 277, @@ -47281,8 +47281,8 @@ { "type": "CommentLine", "value": " reuseGeometries,", - "start": 11746, - "end": 11773, + "start": 11748, + "end": 11775, "loc": { "start": { "line": 278, @@ -47297,8 +47297,8 @@ { "type": "CommentLine", "value": " includeTextures,", - "start": 11786, - "end": 11813, + "start": 11788, + "end": 11815, "loc": { "start": { "line": 279, @@ -47313,8 +47313,8 @@ { "type": "CommentLine", "value": " includeNormals,", - "start": 11826, - "end": 11852, + "start": 11828, + "end": 11854, "loc": { "start": { "line": 280, @@ -47329,8 +47329,8 @@ { "type": "CommentLine", "value": " metaModelData: metaModelJSON,", - "start": 11865, - "end": 11905, + "start": 11867, + "end": 11907, "loc": { "start": { "line": 281, @@ -47345,8 +47345,8 @@ { "type": "CommentLine", "value": " xktModel,", - "start": 11918, - "end": 11938, + "start": 11920, + "end": 11940, "loc": { "start": { "line": 282, @@ -47361,8 +47361,8 @@ { "type": "CommentLine", "value": " getAttachment: async (name) => {", - "start": 11951, - "end": 11994, + "start": 11953, + "end": 11996, "loc": { "start": { "line": 283, @@ -47377,8 +47377,8 @@ { "type": "CommentLine", "value": " const filePath = gltfBasePath + name;", - "start": 12007, - "end": 12059, + "start": 12009, + "end": 12061, "loc": { "start": { "line": 284, @@ -47393,8 +47393,8 @@ { "type": "CommentLine", "value": " log(`Reading attachment file: ${filePath}`);", - "start": 12072, - "end": 12131, + "start": 12074, + "end": 12133, "loc": { "start": { "line": 285, @@ -47409,8 +47409,8 @@ { "type": "CommentLine", "value": " const buffer = fs.readFileSync(filePath);", - "start": 12144, - "end": 12200, + "start": 12146, + "end": 12202, "loc": { "start": { "line": 286, @@ -47425,8 +47425,8 @@ { "type": "CommentLine", "value": " const arrayBuf = toArrayBuffer(buffer);", - "start": 12213, - "end": 12267, + "start": 12215, + "end": 12269, "loc": { "start": { "line": 287, @@ -47441,8 +47441,8 @@ { "type": "CommentLine", "value": " return arrayBuf;", - "start": 12280, - "end": 12311, + "start": 12282, + "end": 12313, "loc": { "start": { "line": 288, @@ -47457,8 +47457,8 @@ { "type": "CommentLine", "value": " },", - "start": 12324, - "end": 12337, + "start": 12326, + "end": 12339, "loc": { "start": { "line": 289, @@ -47473,8 +47473,8 @@ { "type": "CommentLine", "value": " stats,", - "start": 12350, - "end": 12367, + "start": 12352, + "end": 12369, "loc": { "start": { "line": 290, @@ -47489,8 +47489,8 @@ { "type": "CommentLine", "value": " log", - "start": 12380, - "end": 12394, + "start": 12382, + "end": 12396, "loc": { "start": { "line": 291, @@ -47505,8 +47505,8 @@ { "type": "CommentLine", "value": " });", - "start": 12407, - "end": 12417, + "start": 12409, + "end": 12419, "loc": { "start": { "line": 292, @@ -47521,8 +47521,8 @@ { "type": "CommentLine", "value": " break;", - "start": 12430, - "end": 12443, + "start": 12432, + "end": 12445, "loc": { "start": { "line": 293, @@ -55433,9 +55433,9 @@ "postfix": false, "binop": null }, - "value": "source", + "value": "fileName", "start": 6674, - "end": 6680, + "end": 6682, "loc": { "start": { "line": 124, @@ -55443,7 +55443,7 @@ }, "end": { "line": 124, - "column": 37 + "column": 39 } } }, @@ -55459,16 +55459,16 @@ "postfix": false, "binop": null }, - "start": 6680, - "end": 6681, + "start": 6682, + "end": 6683, "loc": { "start": { "line": 124, - "column": 37 + "column": 39 }, "end": { "line": 124, - "column": 38 + "column": 40 } } }, @@ -55485,16 +55485,16 @@ "binop": null, "updateContext": null }, - "start": 6681, - "end": 6682, + "start": 6683, + "end": 6684, "loc": { "start": { "line": 124, - "column": 38 + "column": 40 }, "end": { "line": 124, - "column": 39 + "column": 41 } } }, @@ -55513,8 +55513,8 @@ "updateContext": null }, "value": "if", - "start": 6690, - "end": 6692, + "start": 6692, + "end": 6694, "loc": { "start": { "line": 125, @@ -55538,8 +55538,8 @@ "postfix": false, "binop": null }, - "start": 6693, - "end": 6694, + "start": 6695, + "end": 6696, "loc": { "start": { "line": 125, @@ -55564,8 +55564,8 @@ "binop": null }, "value": "ext", - "start": 6694, - "end": 6697, + "start": 6696, + "end": 6699, "loc": { "start": { "line": 125, @@ -55590,8 +55590,8 @@ "binop": null, "updateContext": null }, - "start": 6697, - "end": 6698, + "start": 6699, + "end": 6700, "loc": { "start": { "line": 125, @@ -55616,8 +55616,8 @@ "binop": null }, "value": "charAt", - "start": 6698, - "end": 6704, + "start": 6700, + "end": 6706, "loc": { "start": { "line": 125, @@ -55641,8 +55641,8 @@ "postfix": false, "binop": null }, - "start": 6704, - "end": 6705, + "start": 6706, + "end": 6707, "loc": { "start": { "line": 125, @@ -55668,8 +55668,8 @@ "updateContext": null }, "value": 0, - "start": 6705, - "end": 6706, + "start": 6707, + "end": 6708, "loc": { "start": { "line": 125, @@ -55693,8 +55693,8 @@ "postfix": false, "binop": null }, - "start": 6706, - "end": 6707, + "start": 6708, + "end": 6709, "loc": { "start": { "line": 125, @@ -55720,8 +55720,8 @@ "updateContext": null }, "value": "===", - "start": 6708, - "end": 6711, + "start": 6710, + "end": 6713, "loc": { "start": { "line": 125, @@ -55747,8 +55747,8 @@ "updateContext": null }, "value": ".", - "start": 6712, - "end": 6715, + "start": 6714, + "end": 6717, "loc": { "start": { "line": 125, @@ -55772,8 +55772,8 @@ "postfix": false, "binop": null }, - "start": 6715, - "end": 6716, + "start": 6717, + "end": 6718, "loc": { "start": { "line": 125, @@ -55797,8 +55797,8 @@ "postfix": false, "binop": null }, - "start": 6717, - "end": 6718, + "start": 6719, + "end": 6720, "loc": { "start": { "line": 125, @@ -55823,8 +55823,8 @@ "binop": null }, "value": "ext", - "start": 6730, - "end": 6733, + "start": 6732, + "end": 6735, "loc": { "start": { "line": 126, @@ -55850,8 +55850,8 @@ "updateContext": null }, "value": "=", - "start": 6734, - "end": 6735, + "start": 6736, + "end": 6737, "loc": { "start": { "line": 126, @@ -55876,8 +55876,8 @@ "binop": null }, "value": "ext", - "start": 6736, - "end": 6739, + "start": 6738, + "end": 6741, "loc": { "start": { "line": 126, @@ -55902,8 +55902,8 @@ "binop": null, "updateContext": null }, - "start": 6739, - "end": 6740, + "start": 6741, + "end": 6742, "loc": { "start": { "line": 126, @@ -55928,8 +55928,8 @@ "binop": null }, "value": "substring", - "start": 6740, - "end": 6749, + "start": 6742, + "end": 6751, "loc": { "start": { "line": 126, @@ -55953,8 +55953,8 @@ "postfix": false, "binop": null }, - "start": 6749, - "end": 6750, + "start": 6751, + "end": 6752, "loc": { "start": { "line": 126, @@ -55980,8 +55980,8 @@ "updateContext": null }, "value": 1, - "start": 6750, - "end": 6751, + "start": 6752, + "end": 6753, "loc": { "start": { "line": 126, @@ -56005,8 +56005,8 @@ "postfix": false, "binop": null }, - "start": 6751, - "end": 6752, + "start": 6753, + "end": 6754, "loc": { "start": { "line": 126, @@ -56031,8 +56031,8 @@ "binop": null, "updateContext": null }, - "start": 6752, - "end": 6753, + "start": 6754, + "end": 6755, "loc": { "start": { "line": 126, @@ -56056,8 +56056,8 @@ "postfix": false, "binop": null }, - "start": 6761, - "end": 6762, + "start": 6763, + "end": 6764, "loc": { "start": { "line": 127, @@ -56084,8 +56084,8 @@ "updateContext": null }, "value": "return", - "start": 6770, - "end": 6776, + "start": 6772, + "end": 6778, "loc": { "start": { "line": 128, @@ -56110,8 +56110,8 @@ "binop": null }, "value": "ext", - "start": 6777, - "end": 6780, + "start": 6779, + "end": 6782, "loc": { "start": { "line": 128, @@ -56136,8 +56136,8 @@ "binop": null, "updateContext": null }, - "start": 6780, - "end": 6781, + "start": 6782, + "end": 6783, "loc": { "start": { "line": 128, @@ -56161,8 +56161,8 @@ "postfix": false, "binop": null }, - "start": 6786, - "end": 6787, + "start": 6788, + "end": 6789, "loc": { "start": { "line": 129, @@ -56189,8 +56189,8 @@ "updateContext": null }, "value": "return", - "start": 6793, - "end": 6799, + "start": 6795, + "end": 6801, "loc": { "start": { "line": 131, @@ -56217,8 +56217,8 @@ "updateContext": null }, "value": "new", - "start": 6800, - "end": 6803, + "start": 6802, + "end": 6805, "loc": { "start": { "line": 131, @@ -56243,8 +56243,8 @@ "binop": null }, "value": "Promise", - "start": 6804, - "end": 6811, + "start": 6806, + "end": 6813, "loc": { "start": { "line": 131, @@ -56268,8 +56268,8 @@ "postfix": false, "binop": null }, - "start": 6811, - "end": 6812, + "start": 6813, + "end": 6814, "loc": { "start": { "line": 131, @@ -56295,8 +56295,8 @@ "binop": null }, "value": "function", - "start": 6812, - "end": 6820, + "start": 6814, + "end": 6822, "loc": { "start": { "line": 131, @@ -56320,8 +56320,8 @@ "postfix": false, "binop": null }, - "start": 6821, - "end": 6822, + "start": 6823, + "end": 6824, "loc": { "start": { "line": 131, @@ -56346,8 +56346,8 @@ "binop": null }, "value": "resolve", - "start": 6822, - "end": 6829, + "start": 6824, + "end": 6831, "loc": { "start": { "line": 131, @@ -56372,8 +56372,8 @@ "binop": null, "updateContext": null }, - "start": 6829, - "end": 6830, + "start": 6831, + "end": 6832, "loc": { "start": { "line": 131, @@ -56398,8 +56398,8 @@ "binop": null }, "value": "reject", - "start": 6831, - "end": 6837, + "start": 6833, + "end": 6839, "loc": { "start": { "line": 131, @@ -56423,8 +56423,8 @@ "postfix": false, "binop": null }, - "start": 6837, - "end": 6838, + "start": 6839, + "end": 6840, "loc": { "start": { "line": 131, @@ -56448,8 +56448,8 @@ "postfix": false, "binop": null }, - "start": 6839, - "end": 6840, + "start": 6841, + "end": 6842, "loc": { "start": { "line": 131, @@ -56476,8 +56476,8 @@ "updateContext": null }, "value": "const", - "start": 6849, - "end": 6854, + "start": 6851, + "end": 6856, "loc": { "start": { "line": 132, @@ -56502,8 +56502,8 @@ "binop": null }, "value": "_log", - "start": 6855, - "end": 6859, + "start": 6857, + "end": 6861, "loc": { "start": { "line": 132, @@ -56529,8 +56529,8 @@ "updateContext": null }, "value": "=", - "start": 6860, - "end": 6861, + "start": 6862, + "end": 6863, "loc": { "start": { "line": 132, @@ -56555,8 +56555,8 @@ "binop": null }, "value": "log", - "start": 6862, - "end": 6865, + "start": 6864, + "end": 6867, "loc": { "start": { "line": 132, @@ -56581,8 +56581,8 @@ "binop": null, "updateContext": null }, - "start": 6865, - "end": 6866, + "start": 6867, + "end": 6868, "loc": { "start": { "line": 132, @@ -56607,8 +56607,8 @@ "binop": null }, "value": "log", - "start": 6875, - "end": 6878, + "start": 6877, + "end": 6880, "loc": { "start": { "line": 133, @@ -56634,8 +56634,8 @@ "updateContext": null }, "value": "=", - "start": 6879, - "end": 6880, + "start": 6881, + "end": 6882, "loc": { "start": { "line": 133, @@ -56659,8 +56659,8 @@ "postfix": false, "binop": null }, - "start": 6881, - "end": 6882, + "start": 6883, + "end": 6884, "loc": { "start": { "line": 133, @@ -56685,8 +56685,8 @@ "binop": null }, "value": "msg", - "start": 6882, - "end": 6885, + "start": 6884, + "end": 6887, "loc": { "start": { "line": 133, @@ -56710,8 +56710,8 @@ "postfix": false, "binop": null }, - "start": 6885, - "end": 6886, + "start": 6887, + "end": 6888, "loc": { "start": { "line": 133, @@ -56736,8 +56736,8 @@ "binop": null, "updateContext": null }, - "start": 6887, - "end": 6889, + "start": 6889, + "end": 6891, "loc": { "start": { "line": 133, @@ -56761,8 +56761,8 @@ "postfix": false, "binop": null }, - "start": 6890, - "end": 6891, + "start": 6892, + "end": 6893, "loc": { "start": { "line": 133, @@ -56787,8 +56787,8 @@ "binop": null }, "value": "_log", - "start": 6904, - "end": 6908, + "start": 6906, + "end": 6910, "loc": { "start": { "line": 134, @@ -56812,8 +56812,8 @@ "postfix": false, "binop": null }, - "start": 6908, - "end": 6909, + "start": 6910, + "end": 6911, "loc": { "start": { "line": 134, @@ -56837,8 +56837,8 @@ "postfix": false, "binop": null }, - "start": 6909, - "end": 6910, + "start": 6911, + "end": 6912, "loc": { "start": { "line": 134, @@ -56864,8 +56864,8 @@ "updateContext": null }, "value": "[convert2xkt] ", - "start": 6910, - "end": 6924, + "start": 6912, + "end": 6926, "loc": { "start": { "line": 134, @@ -56889,8 +56889,8 @@ "postfix": false, "binop": null }, - "start": 6924, - "end": 6926, + "start": 6926, + "end": 6928, "loc": { "start": { "line": 134, @@ -56915,8 +56915,8 @@ "binop": null }, "value": "msg", - "start": 6926, - "end": 6929, + "start": 6928, + "end": 6931, "loc": { "start": { "line": 134, @@ -56940,8 +56940,8 @@ "postfix": false, "binop": null }, - "start": 6929, - "end": 6930, + "start": 6931, + "end": 6932, "loc": { "start": { "line": 134, @@ -56967,8 +56967,8 @@ "updateContext": null }, "value": "", - "start": 6930, - "end": 6930, + "start": 6932, + "end": 6932, "loc": { "start": { "line": 134, @@ -56992,8 +56992,8 @@ "postfix": false, "binop": null }, - "start": 6930, - "end": 6931, + "start": 6932, + "end": 6933, "loc": { "start": { "line": 134, @@ -57017,8 +57017,8 @@ "postfix": false, "binop": null }, - "start": 6931, - "end": 6932, + "start": 6933, + "end": 6934, "loc": { "start": { "line": 134, @@ -57042,8 +57042,8 @@ "postfix": false, "binop": null }, - "start": 6941, - "end": 6942, + "start": 6943, + "end": 6944, "loc": { "start": { "line": 135, @@ -57070,8 +57070,8 @@ "updateContext": null }, "value": "if", - "start": 6952, - "end": 6954, + "start": 6954, + "end": 6956, "loc": { "start": { "line": 137, @@ -57095,8 +57095,8 @@ "postfix": false, "binop": null }, - "start": 6955, - "end": 6956, + "start": 6957, + "end": 6958, "loc": { "start": { "line": 137, @@ -57122,8 +57122,8 @@ "updateContext": null }, "value": "!", - "start": 6956, - "end": 6957, + "start": 6958, + "end": 6959, "loc": { "start": { "line": 137, @@ -57148,8 +57148,8 @@ "binop": null }, "value": "source", - "start": 6957, - "end": 6963, + "start": 6959, + "end": 6965, "loc": { "start": { "line": 137, @@ -57175,8 +57175,8 @@ "updateContext": null }, "value": "&&", - "start": 6964, - "end": 6966, + "start": 6966, + "end": 6968, "loc": { "start": { "line": 137, @@ -57202,8 +57202,8 @@ "updateContext": null }, "value": "!", - "start": 6967, - "end": 6968, + "start": 6969, + "end": 6970, "loc": { "start": { "line": 137, @@ -57228,8 +57228,8 @@ "binop": null }, "value": "sourceData", - "start": 6968, - "end": 6978, + "start": 6970, + "end": 6980, "loc": { "start": { "line": 137, @@ -57253,8 +57253,8 @@ "postfix": false, "binop": null }, - "start": 6978, - "end": 6979, + "start": 6980, + "end": 6981, "loc": { "start": { "line": 137, @@ -57278,8 +57278,8 @@ "postfix": false, "binop": null }, - "start": 6980, - "end": 6981, + "start": 6982, + "end": 6983, "loc": { "start": { "line": 137, @@ -57304,8 +57304,8 @@ "binop": null }, "value": "reject", - "start": 6994, - "end": 7000, + "start": 6996, + "end": 7002, "loc": { "start": { "line": 138, @@ -57329,8 +57329,8 @@ "postfix": false, "binop": null }, - "start": 7000, - "end": 7001, + "start": 7002, + "end": 7003, "loc": { "start": { "line": 138, @@ -57356,8 +57356,8 @@ "updateContext": null }, "value": "Argument expected: source or sourceData", - "start": 7001, - "end": 7042, + "start": 7003, + "end": 7044, "loc": { "start": { "line": 138, @@ -57381,8 +57381,8 @@ "postfix": false, "binop": null }, - "start": 7042, - "end": 7043, + "start": 7044, + "end": 7045, "loc": { "start": { "line": 138, @@ -57407,8 +57407,8 @@ "binop": null, "updateContext": null }, - "start": 7043, - "end": 7044, + "start": 7045, + "end": 7046, "loc": { "start": { "line": 138, @@ -57435,8 +57435,8 @@ "updateContext": null }, "value": "return", - "start": 7057, - "end": 7063, + "start": 7059, + "end": 7065, "loc": { "start": { "line": 139, @@ -57461,8 +57461,8 @@ "binop": null, "updateContext": null }, - "start": 7063, - "end": 7064, + "start": 7065, + "end": 7066, "loc": { "start": { "line": 139, @@ -57486,8 +57486,8 @@ "postfix": false, "binop": null }, - "start": 7073, - "end": 7074, + "start": 7075, + "end": 7076, "loc": { "start": { "line": 140, @@ -57514,8 +57514,8 @@ "updateContext": null }, "value": "if", - "start": 7084, - "end": 7086, + "start": 7086, + "end": 7088, "loc": { "start": { "line": 142, @@ -57539,8 +57539,8 @@ "postfix": false, "binop": null }, - "start": 7087, - "end": 7088, + "start": 7089, + "end": 7090, "loc": { "start": { "line": 142, @@ -57566,8 +57566,8 @@ "updateContext": null }, "value": "!", - "start": 7088, - "end": 7089, + "start": 7090, + "end": 7091, "loc": { "start": { "line": 142, @@ -57592,8 +57592,8 @@ "binop": null }, "value": "sourceFormat", - "start": 7089, - "end": 7101, + "start": 7091, + "end": 7103, "loc": { "start": { "line": 142, @@ -57619,8 +57619,8 @@ "updateContext": null }, "value": "&&", - "start": 7102, - "end": 7104, + "start": 7104, + "end": 7106, "loc": { "start": { "line": 142, @@ -57645,8 +57645,8 @@ "binop": null }, "value": "sourceData", - "start": 7105, - "end": 7115, + "start": 7107, + "end": 7117, "loc": { "start": { "line": 142, @@ -57670,8 +57670,8 @@ "postfix": false, "binop": null }, - "start": 7115, - "end": 7116, + "start": 7117, + "end": 7118, "loc": { "start": { "line": 142, @@ -57695,8 +57695,8 @@ "postfix": false, "binop": null }, - "start": 7117, - "end": 7118, + "start": 7119, + "end": 7120, "loc": { "start": { "line": 142, @@ -57721,8 +57721,8 @@ "binop": null }, "value": "reject", - "start": 7131, - "end": 7137, + "start": 7133, + "end": 7139, "loc": { "start": { "line": 143, @@ -57746,8 +57746,8 @@ "postfix": false, "binop": null }, - "start": 7137, - "end": 7138, + "start": 7139, + "end": 7140, "loc": { "start": { "line": 143, @@ -57773,8 +57773,8 @@ "updateContext": null }, "value": "Argument expected: sourceFormat is required with sourceData", - "start": 7138, - "end": 7199, + "start": 7140, + "end": 7201, "loc": { "start": { "line": 143, @@ -57798,8 +57798,8 @@ "postfix": false, "binop": null }, - "start": 7199, - "end": 7200, + "start": 7201, + "end": 7202, "loc": { "start": { "line": 143, @@ -57824,8 +57824,8 @@ "binop": null, "updateContext": null }, - "start": 7200, - "end": 7201, + "start": 7202, + "end": 7203, "loc": { "start": { "line": 143, @@ -57852,8 +57852,8 @@ "updateContext": null }, "value": "return", - "start": 7214, - "end": 7220, + "start": 7216, + "end": 7222, "loc": { "start": { "line": 144, @@ -57878,8 +57878,8 @@ "binop": null, "updateContext": null }, - "start": 7220, - "end": 7221, + "start": 7222, + "end": 7223, "loc": { "start": { "line": 144, @@ -57903,8 +57903,8 @@ "postfix": false, "binop": null }, - "start": 7230, - "end": 7231, + "start": 7232, + "end": 7233, "loc": { "start": { "line": 145, @@ -57931,8 +57931,8 @@ "updateContext": null }, "value": "if", - "start": 7241, - "end": 7243, + "start": 7243, + "end": 7245, "loc": { "start": { "line": 147, @@ -57956,8 +57956,8 @@ "postfix": false, "binop": null }, - "start": 7244, - "end": 7245, + "start": 7246, + "end": 7247, "loc": { "start": { "line": 147, @@ -57983,8 +57983,8 @@ "updateContext": null }, "value": "!", - "start": 7245, - "end": 7246, + "start": 7247, + "end": 7248, "loc": { "start": { "line": 147, @@ -58009,8 +58009,8 @@ "binop": null }, "value": "output", - "start": 7246, - "end": 7252, + "start": 7248, + "end": 7254, "loc": { "start": { "line": 147, @@ -58036,8 +58036,8 @@ "updateContext": null }, "value": "&&", - "start": 7253, - "end": 7255, + "start": 7255, + "end": 7257, "loc": { "start": { "line": 147, @@ -58063,8 +58063,8 @@ "updateContext": null }, "value": "!", - "start": 7256, - "end": 7257, + "start": 7258, + "end": 7259, "loc": { "start": { "line": 147, @@ -58089,8 +58089,8 @@ "binop": null }, "value": "outputXKTModel", - "start": 7257, - "end": 7271, + "start": 7259, + "end": 7273, "loc": { "start": { "line": 147, @@ -58116,8 +58116,8 @@ "updateContext": null }, "value": "&&", - "start": 7272, - "end": 7274, + "start": 7274, + "end": 7276, "loc": { "start": { "line": 147, @@ -58143,8 +58143,8 @@ "updateContext": null }, "value": "!", - "start": 7275, - "end": 7276, + "start": 7277, + "end": 7278, "loc": { "start": { "line": 147, @@ -58169,8 +58169,8 @@ "binop": null }, "value": "outputXKT", - "start": 7276, - "end": 7285, + "start": 7278, + "end": 7287, "loc": { "start": { "line": 147, @@ -58194,8 +58194,8 @@ "postfix": false, "binop": null }, - "start": 7285, - "end": 7286, + "start": 7287, + "end": 7288, "loc": { "start": { "line": 147, @@ -58219,8 +58219,8 @@ "postfix": false, "binop": null }, - "start": 7287, - "end": 7288, + "start": 7289, + "end": 7290, "loc": { "start": { "line": 147, @@ -58245,8 +58245,8 @@ "binop": null }, "value": "reject", - "start": 7301, - "end": 7307, + "start": 7303, + "end": 7309, "loc": { "start": { "line": 148, @@ -58270,8 +58270,8 @@ "postfix": false, "binop": null }, - "start": 7307, - "end": 7308, + "start": 7309, + "end": 7310, "loc": { "start": { "line": 148, @@ -58297,8 +58297,8 @@ "updateContext": null }, "value": "Argument expected: output, outputXKTModel or outputXKT", - "start": 7308, - "end": 7364, + "start": 7310, + "end": 7366, "loc": { "start": { "line": 148, @@ -58322,8 +58322,8 @@ "postfix": false, "binop": null }, - "start": 7364, - "end": 7365, + "start": 7366, + "end": 7367, "loc": { "start": { "line": 148, @@ -58348,8 +58348,8 @@ "binop": null, "updateContext": null }, - "start": 7365, - "end": 7366, + "start": 7367, + "end": 7368, "loc": { "start": { "line": 148, @@ -58376,8 +58376,8 @@ "updateContext": null }, "value": "return", - "start": 7379, - "end": 7385, + "start": 7381, + "end": 7387, "loc": { "start": { "line": 149, @@ -58402,8 +58402,8 @@ "binop": null, "updateContext": null }, - "start": 7385, - "end": 7386, + "start": 7387, + "end": 7388, "loc": { "start": { "line": 149, @@ -58427,8 +58427,8 @@ "postfix": false, "binop": null }, - "start": 7395, - "end": 7396, + "start": 7397, + "end": 7398, "loc": { "start": { "line": 150, @@ -58455,8 +58455,8 @@ "updateContext": null }, "value": "if", - "start": 7406, - "end": 7408, + "start": 7408, + "end": 7410, "loc": { "start": { "line": 152, @@ -58480,8 +58480,8 @@ "postfix": false, "binop": null }, - "start": 7409, - "end": 7410, + "start": 7411, + "end": 7412, "loc": { "start": { "line": 152, @@ -58506,8 +58506,8 @@ "binop": null }, "value": "source", - "start": 7410, - "end": 7416, + "start": 7412, + "end": 7418, "loc": { "start": { "line": 152, @@ -58531,8 +58531,8 @@ "postfix": false, "binop": null }, - "start": 7416, - "end": 7417, + "start": 7418, + "end": 7419, "loc": { "start": { "line": 152, @@ -58556,8 +58556,8 @@ "postfix": false, "binop": null }, - "start": 7418, - "end": 7419, + "start": 7420, + "end": 7421, "loc": { "start": { "line": 152, @@ -58582,8 +58582,8 @@ "binop": null }, "value": "log", - "start": 7432, - "end": 7435, + "start": 7434, + "end": 7437, "loc": { "start": { "line": 153, @@ -58607,8 +58607,8 @@ "postfix": false, "binop": null }, - "start": 7435, - "end": 7436, + "start": 7437, + "end": 7438, "loc": { "start": { "line": 153, @@ -58634,8 +58634,8 @@ "updateContext": null }, "value": "Reading input file: ", - "start": 7436, - "end": 7458, + "start": 7438, + "end": 7460, "loc": { "start": { "line": 153, @@ -58661,8 +58661,8 @@ "updateContext": null }, "value": "+", - "start": 7459, - "end": 7460, + "start": 7461, + "end": 7462, "loc": { "start": { "line": 153, @@ -58687,8 +58687,8 @@ "binop": null }, "value": "source", - "start": 7461, - "end": 7467, + "start": 7463, + "end": 7469, "loc": { "start": { "line": 153, @@ -58712,8 +58712,8 @@ "postfix": false, "binop": null }, - "start": 7467, - "end": 7468, + "start": 7469, + "end": 7470, "loc": { "start": { "line": 153, @@ -58738,8 +58738,8 @@ "binop": null, "updateContext": null }, - "start": 7468, - "end": 7469, + "start": 7470, + "end": 7471, "loc": { "start": { "line": 153, @@ -58763,8 +58763,8 @@ "postfix": false, "binop": null }, - "start": 7478, - "end": 7479, + "start": 7480, + "end": 7481, "loc": { "start": { "line": 154, @@ -58791,8 +58791,8 @@ "updateContext": null }, "value": "const", - "start": 7489, - "end": 7494, + "start": 7491, + "end": 7496, "loc": { "start": { "line": 156, @@ -58817,8 +58817,8 @@ "binop": null }, "value": "startTime", - "start": 7495, - "end": 7504, + "start": 7497, + "end": 7506, "loc": { "start": { "line": 156, @@ -58844,8 +58844,8 @@ "updateContext": null }, "value": "=", - "start": 7505, - "end": 7506, + "start": 7507, + "end": 7508, "loc": { "start": { "line": 156, @@ -58872,8 +58872,8 @@ "updateContext": null }, "value": "new", - "start": 7507, - "end": 7510, + "start": 7509, + "end": 7512, "loc": { "start": { "line": 156, @@ -58898,8 +58898,8 @@ "binop": null }, "value": "Date", - "start": 7511, - "end": 7515, + "start": 7513, + "end": 7517, "loc": { "start": { "line": 156, @@ -58923,8 +58923,8 @@ "postfix": false, "binop": null }, - "start": 7515, - "end": 7516, + "start": 7517, + "end": 7518, "loc": { "start": { "line": 156, @@ -58948,8 +58948,8 @@ "postfix": false, "binop": null }, - "start": 7516, - "end": 7517, + "start": 7518, + "end": 7519, "loc": { "start": { "line": 156, @@ -58974,8 +58974,8 @@ "binop": null, "updateContext": null }, - "start": 7517, - "end": 7518, + "start": 7519, + "end": 7520, "loc": { "start": { "line": 156, @@ -59002,8 +59002,8 @@ "updateContext": null }, "value": "const", - "start": 7528, - "end": 7533, + "start": 7530, + "end": 7535, "loc": { "start": { "line": 158, @@ -59028,8 +59028,8 @@ "binop": null }, "value": "sourceConfigs", - "start": 7534, - "end": 7547, + "start": 7536, + "end": 7549, "loc": { "start": { "line": 158, @@ -59055,8 +59055,8 @@ "updateContext": null }, "value": "=", - "start": 7548, - "end": 7549, + "start": 7550, + "end": 7551, "loc": { "start": { "line": 158, @@ -59081,8 +59081,8 @@ "binop": null }, "value": "configs", - "start": 7550, - "end": 7557, + "start": 7552, + "end": 7559, "loc": { "start": { "line": 158, @@ -59107,8 +59107,8 @@ "binop": null, "updateContext": null }, - "start": 7557, - "end": 7558, + "start": 7559, + "end": 7560, "loc": { "start": { "line": 158, @@ -59133,8 +59133,8 @@ "binop": null }, "value": "sourceConfigs", - "start": 7558, - "end": 7571, + "start": 7560, + "end": 7573, "loc": { "start": { "line": 158, @@ -59160,8 +59160,8 @@ "updateContext": null }, "value": "||", - "start": 7572, - "end": 7574, + "start": 7574, + "end": 7576, "loc": { "start": { "line": 158, @@ -59185,8 +59185,8 @@ "postfix": false, "binop": null }, - "start": 7575, - "end": 7576, + "start": 7577, + "end": 7578, "loc": { "start": { "line": 158, @@ -59210,8 +59210,8 @@ "postfix": false, "binop": null }, - "start": 7576, - "end": 7577, + "start": 7578, + "end": 7579, "loc": { "start": { "line": 158, @@ -59236,8 +59236,8 @@ "binop": null, "updateContext": null }, - "start": 7577, - "end": 7578, + "start": 7579, + "end": 7580, "loc": { "start": { "line": 158, @@ -59264,8 +59264,8 @@ "updateContext": null }, "value": "const", - "start": 7587, - "end": 7592, + "start": 7589, + "end": 7594, "loc": { "start": { "line": 159, @@ -59290,8 +59290,8 @@ "binop": null }, "value": "ext", - "start": 7593, - "end": 7596, + "start": 7595, + "end": 7598, "loc": { "start": { "line": 159, @@ -59317,8 +59317,8 @@ "updateContext": null }, "value": "=", - "start": 7597, - "end": 7598, + "start": 7599, + "end": 7600, "loc": { "start": { "line": 159, @@ -59343,8 +59343,8 @@ "binop": null }, "value": "sourceFormat", - "start": 7599, - "end": 7611, + "start": 7601, + "end": 7613, "loc": { "start": { "line": 159, @@ -59370,8 +59370,8 @@ "updateContext": null }, "value": "||", - "start": 7612, - "end": 7614, + "start": 7614, + "end": 7616, "loc": { "start": { "line": 159, @@ -59396,8 +59396,8 @@ "binop": null }, "value": "getFileExtension", - "start": 7615, - "end": 7631, + "start": 7617, + "end": 7633, "loc": { "start": { "line": 159, @@ -59421,8 +59421,8 @@ "postfix": false, "binop": null }, - "start": 7631, - "end": 7632, + "start": 7633, + "end": 7634, "loc": { "start": { "line": 159, @@ -59447,8 +59447,8 @@ "binop": null }, "value": "source", - "start": 7632, - "end": 7638, + "start": 7634, + "end": 7640, "loc": { "start": { "line": 159, @@ -59472,8 +59472,8 @@ "postfix": false, "binop": null }, - "start": 7638, - "end": 7639, + "start": 7640, + "end": 7641, "loc": { "start": { "line": 159, @@ -59498,8 +59498,8 @@ "binop": null, "updateContext": null }, - "start": 7639, - "end": 7640, + "start": 7641, + "end": 7642, "loc": { "start": { "line": 159, @@ -59524,8 +59524,8 @@ "binop": null }, "value": "log", - "start": 7650, - "end": 7653, + "start": 7652, + "end": 7655, "loc": { "start": { "line": 161, @@ -59549,8 +59549,8 @@ "postfix": false, "binop": null }, - "start": 7653, - "end": 7654, + "start": 7655, + "end": 7656, "loc": { "start": { "line": 161, @@ -59574,8 +59574,8 @@ "postfix": false, "binop": null }, - "start": 7654, - "end": 7655, + "start": 7656, + "end": 7657, "loc": { "start": { "line": 161, @@ -59601,8 +59601,8 @@ "updateContext": null }, "value": "Input file extension: \"", - "start": 7655, - "end": 7678, + "start": 7657, + "end": 7680, "loc": { "start": { "line": 161, @@ -59626,8 +59626,8 @@ "postfix": false, "binop": null }, - "start": 7678, - "end": 7680, + "start": 7680, + "end": 7682, "loc": { "start": { "line": 161, @@ -59652,8 +59652,8 @@ "binop": null }, "value": "ext", - "start": 7680, - "end": 7683, + "start": 7682, + "end": 7685, "loc": { "start": { "line": 161, @@ -59677,8 +59677,8 @@ "postfix": false, "binop": null }, - "start": 7683, - "end": 7684, + "start": 7685, + "end": 7686, "loc": { "start": { "line": 161, @@ -59704,8 +59704,8 @@ "updateContext": null }, "value": "\"", - "start": 7684, - "end": 7685, + "start": 7686, + "end": 7687, "loc": { "start": { "line": 161, @@ -59729,8 +59729,8 @@ "postfix": false, "binop": null }, - "start": 7685, - "end": 7686, + "start": 7687, + "end": 7688, "loc": { "start": { "line": 161, @@ -59754,8 +59754,8 @@ "postfix": false, "binop": null }, - "start": 7686, - "end": 7687, + "start": 7688, + "end": 7689, "loc": { "start": { "line": 161, @@ -59780,8 +59780,8 @@ "binop": null, "updateContext": null }, - "start": 7687, - "end": 7688, + "start": 7689, + "end": 7690, "loc": { "start": { "line": 161, @@ -59808,8 +59808,8 @@ "updateContext": null }, "value": "let", - "start": 7698, - "end": 7701, + "start": 7700, + "end": 7703, "loc": { "start": { "line": 163, @@ -59834,8 +59834,8 @@ "binop": null }, "value": "fileTypeConfigs", - "start": 7702, - "end": 7717, + "start": 7704, + "end": 7719, "loc": { "start": { "line": 163, @@ -59861,8 +59861,8 @@ "updateContext": null }, "value": "=", - "start": 7718, - "end": 7719, + "start": 7720, + "end": 7721, "loc": { "start": { "line": 163, @@ -59887,8 +59887,8 @@ "binop": null }, "value": "sourceConfigs", - "start": 7720, - "end": 7733, + "start": 7722, + "end": 7735, "loc": { "start": { "line": 163, @@ -59913,8 +59913,8 @@ "binop": null, "updateContext": null }, - "start": 7733, - "end": 7734, + "start": 7735, + "end": 7736, "loc": { "start": { "line": 163, @@ -59939,8 +59939,8 @@ "binop": null }, "value": "ext", - "start": 7734, - "end": 7737, + "start": 7736, + "end": 7739, "loc": { "start": { "line": 163, @@ -59965,8 +59965,8 @@ "binop": null, "updateContext": null }, - "start": 7737, - "end": 7738, + "start": 7739, + "end": 7740, "loc": { "start": { "line": 163, @@ -59991,8 +59991,8 @@ "binop": null, "updateContext": null }, - "start": 7738, - "end": 7739, + "start": 7740, + "end": 7741, "loc": { "start": { "line": 163, @@ -60019,8 +60019,8 @@ "updateContext": null }, "value": "if", - "start": 7749, - "end": 7751, + "start": 7751, + "end": 7753, "loc": { "start": { "line": 165, @@ -60044,8 +60044,8 @@ "postfix": false, "binop": null }, - "start": 7752, - "end": 7753, + "start": 7754, + "end": 7755, "loc": { "start": { "line": 165, @@ -60071,8 +60071,8 @@ "updateContext": null }, "value": "!", - "start": 7753, - "end": 7754, + "start": 7755, + "end": 7756, "loc": { "start": { "line": 165, @@ -60097,8 +60097,8 @@ "binop": null }, "value": "fileTypeConfigs", - "start": 7754, - "end": 7769, + "start": 7756, + "end": 7771, "loc": { "start": { "line": 165, @@ -60122,8 +60122,8 @@ "postfix": false, "binop": null }, - "start": 7769, - "end": 7770, + "start": 7771, + "end": 7772, "loc": { "start": { "line": 165, @@ -60147,8 +60147,8 @@ "postfix": false, "binop": null }, - "start": 7771, - "end": 7772, + "start": 7773, + "end": 7774, "loc": { "start": { "line": 165, @@ -60173,8 +60173,8 @@ "binop": null }, "value": "log", - "start": 7785, - "end": 7788, + "start": 7787, + "end": 7790, "loc": { "start": { "line": 166, @@ -60198,8 +60198,8 @@ "postfix": false, "binop": null }, - "start": 7788, - "end": 7789, + "start": 7790, + "end": 7791, "loc": { "start": { "line": 166, @@ -60223,8 +60223,8 @@ "postfix": false, "binop": null }, - "start": 7789, - "end": 7790, + "start": 7791, + "end": 7792, "loc": { "start": { "line": 166, @@ -60250,8 +60250,8 @@ "updateContext": null }, "value": "[WARNING] Could not find configs sourceConfigs entry for source format \"", - "start": 7790, - "end": 7862, + "start": 7792, + "end": 7864, "loc": { "start": { "line": 166, @@ -60275,8 +60275,8 @@ "postfix": false, "binop": null }, - "start": 7862, - "end": 7864, + "start": 7864, + "end": 7866, "loc": { "start": { "line": 166, @@ -60301,8 +60301,8 @@ "binop": null }, "value": "ext", - "start": 7864, - "end": 7867, + "start": 7866, + "end": 7869, "loc": { "start": { "line": 166, @@ -60326,8 +60326,8 @@ "postfix": false, "binop": null }, - "start": 7867, - "end": 7868, + "start": 7869, + "end": 7870, "loc": { "start": { "line": 166, @@ -60353,8 +60353,8 @@ "updateContext": null }, "value": "\". This is derived from the source file name extension. Will use internal default configs.", - "start": 7868, - "end": 7958, + "start": 7870, + "end": 7960, "loc": { "start": { "line": 166, @@ -60378,8 +60378,8 @@ "postfix": false, "binop": null }, - "start": 7958, - "end": 7959, + "start": 7960, + "end": 7961, "loc": { "start": { "line": 166, @@ -60403,8 +60403,8 @@ "postfix": false, "binop": null }, - "start": 7959, - "end": 7960, + "start": 7961, + "end": 7962, "loc": { "start": { "line": 166, @@ -60429,8 +60429,8 @@ "binop": null, "updateContext": null }, - "start": 7960, - "end": 7961, + "start": 7962, + "end": 7963, "loc": { "start": { "line": 166, @@ -60455,8 +60455,8 @@ "binop": null }, "value": "fileTypeConfigs", - "start": 7974, - "end": 7989, + "start": 7976, + "end": 7991, "loc": { "start": { "line": 167, @@ -60482,8 +60482,8 @@ "updateContext": null }, "value": "=", - "start": 7990, - "end": 7991, + "start": 7992, + "end": 7993, "loc": { "start": { "line": 167, @@ -60507,8 +60507,8 @@ "postfix": false, "binop": null }, - "start": 7992, - "end": 7993, + "start": 7994, + "end": 7995, "loc": { "start": { "line": 167, @@ -60532,8 +60532,8 @@ "postfix": false, "binop": null }, - "start": 7993, - "end": 7994, + "start": 7995, + "end": 7996, "loc": { "start": { "line": 167, @@ -60558,8 +60558,8 @@ "binop": null, "updateContext": null }, - "start": 7994, - "end": 7995, + "start": 7996, + "end": 7997, "loc": { "start": { "line": 167, @@ -60583,8 +60583,8 @@ "postfix": false, "binop": null }, - "start": 8004, - "end": 8005, + "start": 8006, + "end": 8007, "loc": { "start": { "line": 168, @@ -60610,8 +60610,8 @@ "binop": null }, "value": "function", - "start": 8014, - "end": 8022, + "start": 8016, + "end": 8024, "loc": { "start": { "line": 169, @@ -60636,8 +60636,8 @@ "binop": null }, "value": "overrideOption", - "start": 8023, - "end": 8037, + "start": 8025, + "end": 8039, "loc": { "start": { "line": 169, @@ -60661,8 +60661,8 @@ "postfix": false, "binop": null }, - "start": 8037, - "end": 8038, + "start": 8039, + "end": 8040, "loc": { "start": { "line": 169, @@ -60687,8 +60687,8 @@ "binop": null }, "value": "option1", - "start": 8038, - "end": 8045, + "start": 8040, + "end": 8047, "loc": { "start": { "line": 169, @@ -60713,8 +60713,8 @@ "binop": null, "updateContext": null }, - "start": 8045, - "end": 8046, + "start": 8047, + "end": 8048, "loc": { "start": { "line": 169, @@ -60739,8 +60739,8 @@ "binop": null }, "value": "option2", - "start": 8047, - "end": 8054, + "start": 8049, + "end": 8056, "loc": { "start": { "line": 169, @@ -60764,8 +60764,8 @@ "postfix": false, "binop": null }, - "start": 8054, - "end": 8055, + "start": 8056, + "end": 8057, "loc": { "start": { "line": 169, @@ -60789,8 +60789,8 @@ "postfix": false, "binop": null }, - "start": 8056, - "end": 8057, + "start": 8058, + "end": 8059, "loc": { "start": { "line": 169, @@ -60817,8 +60817,8 @@ "updateContext": null }, "value": "if", - "start": 8070, - "end": 8072, + "start": 8072, + "end": 8074, "loc": { "start": { "line": 170, @@ -60842,8 +60842,8 @@ "postfix": false, "binop": null }, - "start": 8073, - "end": 8074, + "start": 8075, + "end": 8076, "loc": { "start": { "line": 170, @@ -60868,8 +60868,8 @@ "binop": null }, "value": "option1", - "start": 8074, - "end": 8081, + "start": 8076, + "end": 8083, "loc": { "start": { "line": 170, @@ -60895,8 +60895,8 @@ "updateContext": null }, "value": "!==", - "start": 8082, - "end": 8085, + "start": 8084, + "end": 8087, "loc": { "start": { "line": 170, @@ -60921,8 +60921,8 @@ "binop": null }, "value": "undefined", - "start": 8086, - "end": 8095, + "start": 8088, + "end": 8097, "loc": { "start": { "line": 170, @@ -60946,8 +60946,8 @@ "postfix": false, "binop": null }, - "start": 8095, - "end": 8096, + "start": 8097, + "end": 8098, "loc": { "start": { "line": 170, @@ -60971,8 +60971,8 @@ "postfix": false, "binop": null }, - "start": 8097, - "end": 8098, + "start": 8099, + "end": 8100, "loc": { "start": { "line": 170, @@ -60999,8 +60999,8 @@ "updateContext": null }, "value": "return", - "start": 8115, - "end": 8121, + "start": 8117, + "end": 8123, "loc": { "start": { "line": 171, @@ -61025,8 +61025,8 @@ "binop": null }, "value": "option1", - "start": 8122, - "end": 8129, + "start": 8124, + "end": 8131, "loc": { "start": { "line": 171, @@ -61051,8 +61051,8 @@ "binop": null, "updateContext": null }, - "start": 8129, - "end": 8130, + "start": 8131, + "end": 8132, "loc": { "start": { "line": 171, @@ -61076,8 +61076,8 @@ "postfix": false, "binop": null }, - "start": 8143, - "end": 8144, + "start": 8145, + "end": 8146, "loc": { "start": { "line": 172, @@ -61104,8 +61104,8 @@ "updateContext": null }, "value": "return", - "start": 8157, - "end": 8163, + "start": 8159, + "end": 8165, "loc": { "start": { "line": 173, @@ -61130,8 +61130,8 @@ "binop": null }, "value": "option2", - "start": 8164, - "end": 8171, + "start": 8166, + "end": 8173, "loc": { "start": { "line": 173, @@ -61156,8 +61156,8 @@ "binop": null, "updateContext": null }, - "start": 8171, - "end": 8172, + "start": 8173, + "end": 8174, "loc": { "start": { "line": 173, @@ -61181,8 +61181,8 @@ "postfix": false, "binop": null }, - "start": 8181, - "end": 8182, + "start": 8183, + "end": 8184, "loc": { "start": { "line": 174, @@ -61209,8 +61209,8 @@ "updateContext": null }, "value": "if", - "start": 8192, - "end": 8194, + "start": 8194, + "end": 8196, "loc": { "start": { "line": 176, @@ -61234,8 +61234,8 @@ "postfix": false, "binop": null }, - "start": 8195, - "end": 8196, + "start": 8197, + "end": 8198, "loc": { "start": { "line": 176, @@ -61261,8 +61261,8 @@ "updateContext": null }, "value": "!", - "start": 8196, - "end": 8197, + "start": 8198, + "end": 8199, "loc": { "start": { "line": 176, @@ -61287,8 +61287,8 @@ "binop": null }, "value": "sourceData", - "start": 8197, - "end": 8207, + "start": 8199, + "end": 8209, "loc": { "start": { "line": 176, @@ -61312,8 +61312,8 @@ "postfix": false, "binop": null }, - "start": 8207, - "end": 8208, + "start": 8209, + "end": 8210, "loc": { "start": { "line": 176, @@ -61337,8 +61337,8 @@ "postfix": false, "binop": null }, - "start": 8209, - "end": 8210, + "start": 8211, + "end": 8212, "loc": { "start": { "line": 176, @@ -61365,8 +61365,8 @@ "updateContext": null }, "value": "try", - "start": 8223, - "end": 8226, + "start": 8225, + "end": 8228, "loc": { "start": { "line": 177, @@ -61390,8 +61390,8 @@ "postfix": false, "binop": null }, - "start": 8227, - "end": 8228, + "start": 8229, + "end": 8230, "loc": { "start": { "line": 177, @@ -61416,8 +61416,8 @@ "binop": null }, "value": "sourceData", - "start": 8245, - "end": 8255, + "start": 8247, + "end": 8257, "loc": { "start": { "line": 178, @@ -61443,8 +61443,8 @@ "updateContext": null }, "value": "=", - "start": 8256, - "end": 8257, + "start": 8258, + "end": 8259, "loc": { "start": { "line": 178, @@ -61469,8 +61469,8 @@ "binop": null }, "value": "fs", - "start": 8258, - "end": 8260, + "start": 8260, + "end": 8262, "loc": { "start": { "line": 178, @@ -61495,8 +61495,8 @@ "binop": null, "updateContext": null }, - "start": 8260, - "end": 8261, + "start": 8262, + "end": 8263, "loc": { "start": { "line": 178, @@ -61521,8 +61521,8 @@ "binop": null }, "value": "readFileSync", - "start": 8261, - "end": 8273, + "start": 8263, + "end": 8275, "loc": { "start": { "line": 178, @@ -61546,8 +61546,8 @@ "postfix": false, "binop": null }, - "start": 8273, - "end": 8274, + "start": 8275, + "end": 8276, "loc": { "start": { "line": 178, @@ -61572,8 +61572,8 @@ "binop": null }, "value": "source", - "start": 8274, - "end": 8280, + "start": 8276, + "end": 8282, "loc": { "start": { "line": 178, @@ -61597,8 +61597,8 @@ "postfix": false, "binop": null }, - "start": 8280, - "end": 8281, + "start": 8282, + "end": 8283, "loc": { "start": { "line": 178, @@ -61623,8 +61623,8 @@ "binop": null, "updateContext": null }, - "start": 8281, - "end": 8282, + "start": 8283, + "end": 8284, "loc": { "start": { "line": 178, @@ -61648,8 +61648,8 @@ "postfix": false, "binop": null }, - "start": 8295, - "end": 8296, + "start": 8297, + "end": 8298, "loc": { "start": { "line": 179, @@ -61676,8 +61676,8 @@ "updateContext": null }, "value": "catch", - "start": 8297, - "end": 8302, + "start": 8299, + "end": 8304, "loc": { "start": { "line": 179, @@ -61701,8 +61701,8 @@ "postfix": false, "binop": null }, - "start": 8303, - "end": 8304, + "start": 8305, + "end": 8306, "loc": { "start": { "line": 179, @@ -61727,8 +61727,8 @@ "binop": null }, "value": "err", - "start": 8304, - "end": 8307, + "start": 8306, + "end": 8309, "loc": { "start": { "line": 179, @@ -61752,8 +61752,8 @@ "postfix": false, "binop": null }, - "start": 8307, - "end": 8308, + "start": 8309, + "end": 8310, "loc": { "start": { "line": 179, @@ -61777,8 +61777,8 @@ "postfix": false, "binop": null }, - "start": 8309, - "end": 8310, + "start": 8311, + "end": 8312, "loc": { "start": { "line": 179, @@ -61803,8 +61803,8 @@ "binop": null }, "value": "reject", - "start": 8327, - "end": 8333, + "start": 8329, + "end": 8335, "loc": { "start": { "line": 180, @@ -61828,8 +61828,8 @@ "postfix": false, "binop": null }, - "start": 8333, - "end": 8334, + "start": 8335, + "end": 8336, "loc": { "start": { "line": 180, @@ -61854,8 +61854,8 @@ "binop": null }, "value": "err", - "start": 8334, - "end": 8337, + "start": 8336, + "end": 8339, "loc": { "start": { "line": 180, @@ -61879,8 +61879,8 @@ "postfix": false, "binop": null }, - "start": 8337, - "end": 8338, + "start": 8339, + "end": 8340, "loc": { "start": { "line": 180, @@ -61905,8 +61905,8 @@ "binop": null, "updateContext": null }, - "start": 8338, - "end": 8339, + "start": 8340, + "end": 8341, "loc": { "start": { "line": 180, @@ -61933,8 +61933,8 @@ "updateContext": null }, "value": "return", - "start": 8356, - "end": 8362, + "start": 8358, + "end": 8364, "loc": { "start": { "line": 181, @@ -61959,8 +61959,8 @@ "binop": null, "updateContext": null }, - "start": 8362, - "end": 8363, + "start": 8364, + "end": 8365, "loc": { "start": { "line": 181, @@ -61984,8 +61984,8 @@ "postfix": false, "binop": null }, - "start": 8376, - "end": 8377, + "start": 8378, + "end": 8379, "loc": { "start": { "line": 182, @@ -62009,8 +62009,8 @@ "postfix": false, "binop": null }, - "start": 8386, - "end": 8387, + "start": 8388, + "end": 8389, "loc": { "start": { "line": 183, @@ -62037,8 +62037,8 @@ "updateContext": null }, "value": "const", - "start": 8397, - "end": 8402, + "start": 8399, + "end": 8404, "loc": { "start": { "line": 185, @@ -62063,8 +62063,8 @@ "binop": null }, "value": "sourceFileSizeBytes", - "start": 8403, - "end": 8422, + "start": 8405, + "end": 8424, "loc": { "start": { "line": 185, @@ -62090,8 +62090,8 @@ "updateContext": null }, "value": "=", - "start": 8423, - "end": 8424, + "start": 8425, + "end": 8426, "loc": { "start": { "line": 185, @@ -62116,8 +62116,8 @@ "binop": null }, "value": "sourceData", - "start": 8425, - "end": 8435, + "start": 8427, + "end": 8437, "loc": { "start": { "line": 185, @@ -62142,8 +62142,8 @@ "binop": null, "updateContext": null }, - "start": 8435, - "end": 8436, + "start": 8437, + "end": 8438, "loc": { "start": { "line": 185, @@ -62168,8 +62168,8 @@ "binop": null }, "value": "byteLength", - "start": 8436, - "end": 8446, + "start": 8438, + "end": 8448, "loc": { "start": { "line": 185, @@ -62194,8 +62194,8 @@ "binop": null, "updateContext": null }, - "start": 8446, - "end": 8447, + "start": 8448, + "end": 8449, "loc": { "start": { "line": 185, @@ -62220,8 +62220,8 @@ "binop": null }, "value": "log", - "start": 8457, - "end": 8460, + "start": 8459, + "end": 8462, "loc": { "start": { "line": 187, @@ -62245,8 +62245,8 @@ "postfix": false, "binop": null }, - "start": 8460, - "end": 8461, + "start": 8462, + "end": 8463, "loc": { "start": { "line": 187, @@ -62272,8 +62272,8 @@ "updateContext": null }, "value": "Input file size: ", - "start": 8461, - "end": 8480, + "start": 8463, + "end": 8482, "loc": { "start": { "line": 187, @@ -62299,8 +62299,8 @@ "updateContext": null }, "value": "+", - "start": 8481, - "end": 8482, + "start": 8483, + "end": 8484, "loc": { "start": { "line": 187, @@ -62324,8 +62324,8 @@ "postfix": false, "binop": null }, - "start": 8483, - "end": 8484, + "start": 8485, + "end": 8486, "loc": { "start": { "line": 187, @@ -62350,8 +62350,8 @@ "binop": null }, "value": "sourceFileSizeBytes", - "start": 8484, - "end": 8503, + "start": 8486, + "end": 8505, "loc": { "start": { "line": 187, @@ -62377,8 +62377,8 @@ "updateContext": null }, "value": "/", - "start": 8504, - "end": 8505, + "start": 8506, + "end": 8507, "loc": { "start": { "line": 187, @@ -62404,8 +62404,8 @@ "updateContext": null }, "value": 1000, - "start": 8506, - "end": 8510, + "start": 8508, + "end": 8512, "loc": { "start": { "line": 187, @@ -62429,8 +62429,8 @@ "postfix": false, "binop": null }, - "start": 8510, - "end": 8511, + "start": 8512, + "end": 8513, "loc": { "start": { "line": 187, @@ -62455,8 +62455,8 @@ "binop": null, "updateContext": null }, - "start": 8511, - "end": 8512, + "start": 8513, + "end": 8514, "loc": { "start": { "line": 187, @@ -62481,8 +62481,8 @@ "binop": null }, "value": "toFixed", - "start": 8512, - "end": 8519, + "start": 8514, + "end": 8521, "loc": { "start": { "line": 187, @@ -62506,8 +62506,8 @@ "postfix": false, "binop": null }, - "start": 8519, - "end": 8520, + "start": 8521, + "end": 8522, "loc": { "start": { "line": 187, @@ -62533,8 +62533,8 @@ "updateContext": null }, "value": 2, - "start": 8520, - "end": 8521, + "start": 8522, + "end": 8523, "loc": { "start": { "line": 187, @@ -62558,8 +62558,8 @@ "postfix": false, "binop": null }, - "start": 8521, - "end": 8522, + "start": 8523, + "end": 8524, "loc": { "start": { "line": 187, @@ -62585,8 +62585,8 @@ "updateContext": null }, "value": "+", - "start": 8523, - "end": 8524, + "start": 8525, + "end": 8526, "loc": { "start": { "line": 187, @@ -62612,8 +62612,8 @@ "updateContext": null }, "value": " kB", - "start": 8525, - "end": 8530, + "start": 8527, + "end": 8532, "loc": { "start": { "line": 187, @@ -62637,8 +62637,8 @@ "postfix": false, "binop": null }, - "start": 8530, - "end": 8531, + "start": 8532, + "end": 8533, "loc": { "start": { "line": 187, @@ -62663,8 +62663,8 @@ "binop": null, "updateContext": null }, - "start": 8531, - "end": 8532, + "start": 8533, + "end": 8534, "loc": { "start": { "line": 187, @@ -62691,8 +62691,8 @@ "updateContext": null }, "value": "if", - "start": 8542, - "end": 8544, + "start": 8544, + "end": 8546, "loc": { "start": { "line": 189, @@ -62716,8 +62716,8 @@ "postfix": false, "binop": null }, - "start": 8545, - "end": 8546, + "start": 8547, + "end": 8548, "loc": { "start": { "line": 189, @@ -62743,8 +62743,8 @@ "updateContext": null }, "value": "!", - "start": 8546, - "end": 8547, + "start": 8548, + "end": 8549, "loc": { "start": { "line": 189, @@ -62769,8 +62769,8 @@ "binop": null }, "value": "metaModelDataStr", - "start": 8547, - "end": 8563, + "start": 8549, + "end": 8565, "loc": { "start": { "line": 189, @@ -62796,8 +62796,8 @@ "updateContext": null }, "value": "&&", - "start": 8564, - "end": 8566, + "start": 8566, + "end": 8568, "loc": { "start": { "line": 189, @@ -62822,8 +62822,8 @@ "binop": null }, "value": "metaModelSource", - "start": 8567, - "end": 8582, + "start": 8569, + "end": 8584, "loc": { "start": { "line": 189, @@ -62847,8 +62847,8 @@ "postfix": false, "binop": null }, - "start": 8582, - "end": 8583, + "start": 8584, + "end": 8585, "loc": { "start": { "line": 189, @@ -62872,8 +62872,8 @@ "postfix": false, "binop": null }, - "start": 8584, - "end": 8585, + "start": 8586, + "end": 8587, "loc": { "start": { "line": 189, @@ -62898,8 +62898,8 @@ "binop": null }, "value": "log", - "start": 8598, - "end": 8601, + "start": 8600, + "end": 8603, "loc": { "start": { "line": 190, @@ -62923,8 +62923,8 @@ "postfix": false, "binop": null }, - "start": 8601, - "end": 8602, + "start": 8603, + "end": 8604, "loc": { "start": { "line": 190, @@ -62950,8 +62950,8 @@ "updateContext": null }, "value": "Reading input metadata file: ", - "start": 8602, - "end": 8633, + "start": 8604, + "end": 8635, "loc": { "start": { "line": 190, @@ -62977,8 +62977,8 @@ "updateContext": null }, "value": "+", - "start": 8634, - "end": 8635, + "start": 8636, + "end": 8637, "loc": { "start": { "line": 190, @@ -63003,8 +63003,8 @@ "binop": null }, "value": "metaModelSource", - "start": 8636, - "end": 8651, + "start": 8638, + "end": 8653, "loc": { "start": { "line": 190, @@ -63028,8 +63028,8 @@ "postfix": false, "binop": null }, - "start": 8651, - "end": 8652, + "start": 8653, + "end": 8654, "loc": { "start": { "line": 190, @@ -63054,8 +63054,8 @@ "binop": null, "updateContext": null }, - "start": 8652, - "end": 8653, + "start": 8654, + "end": 8655, "loc": { "start": { "line": 190, @@ -63082,8 +63082,8 @@ "updateContext": null }, "value": "try", - "start": 8666, - "end": 8669, + "start": 8668, + "end": 8671, "loc": { "start": { "line": 191, @@ -63107,8 +63107,8 @@ "postfix": false, "binop": null }, - "start": 8670, - "end": 8671, + "start": 8672, + "end": 8673, "loc": { "start": { "line": 191, @@ -63133,8 +63133,8 @@ "binop": null }, "value": "metaModelDataStr", - "start": 8688, - "end": 8704, + "start": 8690, + "end": 8706, "loc": { "start": { "line": 192, @@ -63160,8 +63160,8 @@ "updateContext": null }, "value": "=", - "start": 8705, - "end": 8706, + "start": 8707, + "end": 8708, "loc": { "start": { "line": 192, @@ -63186,8 +63186,8 @@ "binop": null }, "value": "fs", - "start": 8707, - "end": 8709, + "start": 8709, + "end": 8711, "loc": { "start": { "line": 192, @@ -63212,8 +63212,8 @@ "binop": null, "updateContext": null }, - "start": 8709, - "end": 8710, + "start": 8711, + "end": 8712, "loc": { "start": { "line": 192, @@ -63238,8 +63238,8 @@ "binop": null }, "value": "readFileSync", - "start": 8710, - "end": 8722, + "start": 8712, + "end": 8724, "loc": { "start": { "line": 192, @@ -63263,8 +63263,8 @@ "postfix": false, "binop": null }, - "start": 8722, - "end": 8723, + "start": 8724, + "end": 8725, "loc": { "start": { "line": 192, @@ -63289,8 +63289,8 @@ "binop": null }, "value": "metaModelSource", - "start": 8723, - "end": 8738, + "start": 8725, + "end": 8740, "loc": { "start": { "line": 192, @@ -63314,8 +63314,8 @@ "postfix": false, "binop": null }, - "start": 8738, - "end": 8739, + "start": 8740, + "end": 8741, "loc": { "start": { "line": 192, @@ -63340,8 +63340,8 @@ "binop": null, "updateContext": null }, - "start": 8739, - "end": 8740, + "start": 8741, + "end": 8742, "loc": { "start": { "line": 192, @@ -63365,8 +63365,8 @@ "postfix": false, "binop": null }, - "start": 8753, - "end": 8754, + "start": 8755, + "end": 8756, "loc": { "start": { "line": 193, @@ -63393,8 +63393,8 @@ "updateContext": null }, "value": "catch", - "start": 8755, - "end": 8760, + "start": 8757, + "end": 8762, "loc": { "start": { "line": 193, @@ -63418,8 +63418,8 @@ "postfix": false, "binop": null }, - "start": 8761, - "end": 8762, + "start": 8763, + "end": 8764, "loc": { "start": { "line": 193, @@ -63444,8 +63444,8 @@ "binop": null }, "value": "err", - "start": 8762, - "end": 8765, + "start": 8764, + "end": 8767, "loc": { "start": { "line": 193, @@ -63469,8 +63469,8 @@ "postfix": false, "binop": null }, - "start": 8765, - "end": 8766, + "start": 8767, + "end": 8768, "loc": { "start": { "line": 193, @@ -63494,8 +63494,8 @@ "postfix": false, "binop": null }, - "start": 8767, - "end": 8768, + "start": 8769, + "end": 8770, "loc": { "start": { "line": 193, @@ -63520,8 +63520,8 @@ "binop": null }, "value": "reject", - "start": 8785, - "end": 8791, + "start": 8787, + "end": 8793, "loc": { "start": { "line": 194, @@ -63545,8 +63545,8 @@ "postfix": false, "binop": null }, - "start": 8791, - "end": 8792, + "start": 8793, + "end": 8794, "loc": { "start": { "line": 194, @@ -63571,8 +63571,8 @@ "binop": null }, "value": "err", - "start": 8792, - "end": 8795, + "start": 8794, + "end": 8797, "loc": { "start": { "line": 194, @@ -63596,8 +63596,8 @@ "postfix": false, "binop": null }, - "start": 8795, - "end": 8796, + "start": 8797, + "end": 8798, "loc": { "start": { "line": 194, @@ -63622,8 +63622,8 @@ "binop": null, "updateContext": null }, - "start": 8796, - "end": 8797, + "start": 8798, + "end": 8799, "loc": { "start": { "line": 194, @@ -63650,8 +63650,8 @@ "updateContext": null }, "value": "return", - "start": 8814, - "end": 8820, + "start": 8816, + "end": 8822, "loc": { "start": { "line": 195, @@ -63676,8 +63676,8 @@ "binop": null, "updateContext": null }, - "start": 8820, - "end": 8821, + "start": 8822, + "end": 8823, "loc": { "start": { "line": 195, @@ -63701,8 +63701,8 @@ "postfix": false, "binop": null }, - "start": 8834, - "end": 8835, + "start": 8836, + "end": 8837, "loc": { "start": { "line": 196, @@ -63726,8 +63726,8 @@ "postfix": false, "binop": null }, - "start": 8844, - "end": 8845, + "start": 8846, + "end": 8847, "loc": { "start": { "line": 197, @@ -63754,8 +63754,8 @@ "updateContext": null }, "value": "else", - "start": 8846, - "end": 8850, + "start": 8848, + "end": 8852, "loc": { "start": { "line": 197, @@ -63779,8 +63779,8 @@ "postfix": false, "binop": null }, - "start": 8851, - "end": 8852, + "start": 8853, + "end": 8854, "loc": { "start": { "line": 197, @@ -63805,8 +63805,8 @@ "binop": null }, "value": "log", - "start": 8865, - "end": 8868, + "start": 8867, + "end": 8870, "loc": { "start": { "line": 198, @@ -63830,8 +63830,8 @@ "postfix": false, "binop": null }, - "start": 8868, - "end": 8869, + "start": 8870, + "end": 8871, "loc": { "start": { "line": 198, @@ -63855,8 +63855,8 @@ "postfix": false, "binop": null }, - "start": 8869, - "end": 8870, + "start": 8871, + "end": 8872, "loc": { "start": { "line": 198, @@ -63882,8 +63882,8 @@ "updateContext": null }, "value": "Not embedding metadata in XKT", - "start": 8870, - "end": 8899, + "start": 8872, + "end": 8901, "loc": { "start": { "line": 198, @@ -63907,8 +63907,8 @@ "postfix": false, "binop": null }, - "start": 8899, - "end": 8900, + "start": 8901, + "end": 8902, "loc": { "start": { "line": 198, @@ -63932,8 +63932,8 @@ "postfix": false, "binop": null }, - "start": 8900, - "end": 8901, + "start": 8902, + "end": 8903, "loc": { "start": { "line": 198, @@ -63958,8 +63958,8 @@ "binop": null, "updateContext": null }, - "start": 8901, - "end": 8902, + "start": 8903, + "end": 8904, "loc": { "start": { "line": 198, @@ -63983,8 +63983,8 @@ "postfix": false, "binop": null }, - "start": 8911, - "end": 8912, + "start": 8913, + "end": 8914, "loc": { "start": { "line": 199, @@ -64011,8 +64011,8 @@ "updateContext": null }, "value": "let", - "start": 8922, - "end": 8925, + "start": 8924, + "end": 8927, "loc": { "start": { "line": 201, @@ -64037,8 +64037,8 @@ "binop": null }, "value": "metaModelJSON", - "start": 8926, - "end": 8939, + "start": 8928, + "end": 8941, "loc": { "start": { "line": 201, @@ -64063,8 +64063,8 @@ "binop": null, "updateContext": null }, - "start": 8939, - "end": 8940, + "start": 8941, + "end": 8942, "loc": { "start": { "line": 201, @@ -64091,8 +64091,8 @@ "updateContext": null }, "value": "if", - "start": 8950, - "end": 8952, + "start": 8952, + "end": 8954, "loc": { "start": { "line": 203, @@ -64116,8 +64116,8 @@ "postfix": false, "binop": null }, - "start": 8953, - "end": 8954, + "start": 8955, + "end": 8956, "loc": { "start": { "line": 203, @@ -64142,8 +64142,8 @@ "binop": null }, "value": "metaModelDataStr", - "start": 8954, - "end": 8970, + "start": 8956, + "end": 8972, "loc": { "start": { "line": 203, @@ -64167,8 +64167,8 @@ "postfix": false, "binop": null }, - "start": 8970, - "end": 8971, + "start": 8972, + "end": 8973, "loc": { "start": { "line": 203, @@ -64192,8 +64192,8 @@ "postfix": false, "binop": null }, - "start": 8972, - "end": 8973, + "start": 8974, + "end": 8975, "loc": { "start": { "line": 203, @@ -64220,8 +64220,8 @@ "updateContext": null }, "value": "try", - "start": 8986, - "end": 8989, + "start": 8988, + "end": 8991, "loc": { "start": { "line": 204, @@ -64245,8 +64245,8 @@ "postfix": false, "binop": null }, - "start": 8990, - "end": 8991, + "start": 8992, + "end": 8993, "loc": { "start": { "line": 204, @@ -64271,8 +64271,8 @@ "binop": null }, "value": "metaModelJSON", - "start": 9008, - "end": 9021, + "start": 9010, + "end": 9023, "loc": { "start": { "line": 205, @@ -64298,8 +64298,8 @@ "updateContext": null }, "value": "=", - "start": 9022, - "end": 9023, + "start": 9024, + "end": 9025, "loc": { "start": { "line": 205, @@ -64324,8 +64324,8 @@ "binop": null }, "value": "JSON", - "start": 9024, - "end": 9028, + "start": 9026, + "end": 9030, "loc": { "start": { "line": 205, @@ -64350,8 +64350,8 @@ "binop": null, "updateContext": null }, - "start": 9028, - "end": 9029, + "start": 9030, + "end": 9031, "loc": { "start": { "line": 205, @@ -64376,8 +64376,8 @@ "binop": null }, "value": "parse", - "start": 9029, - "end": 9034, + "start": 9031, + "end": 9036, "loc": { "start": { "line": 205, @@ -64401,8 +64401,8 @@ "postfix": false, "binop": null }, - "start": 9034, - "end": 9035, + "start": 9036, + "end": 9037, "loc": { "start": { "line": 205, @@ -64427,8 +64427,8 @@ "binop": null }, "value": "metaModelDataStr", - "start": 9035, - "end": 9051, + "start": 9037, + "end": 9053, "loc": { "start": { "line": 205, @@ -64452,8 +64452,8 @@ "postfix": false, "binop": null }, - "start": 9051, - "end": 9052, + "start": 9053, + "end": 9054, "loc": { "start": { "line": 205, @@ -64478,8 +64478,8 @@ "binop": null, "updateContext": null }, - "start": 9052, - "end": 9053, + "start": 9054, + "end": 9055, "loc": { "start": { "line": 205, @@ -64503,8 +64503,8 @@ "postfix": false, "binop": null }, - "start": 9066, - "end": 9067, + "start": 9068, + "end": 9069, "loc": { "start": { "line": 206, @@ -64531,8 +64531,8 @@ "updateContext": null }, "value": "catch", - "start": 9068, - "end": 9073, + "start": 9070, + "end": 9075, "loc": { "start": { "line": 206, @@ -64556,8 +64556,8 @@ "postfix": false, "binop": null }, - "start": 9074, - "end": 9075, + "start": 9076, + "end": 9077, "loc": { "start": { "line": 206, @@ -64582,8 +64582,8 @@ "binop": null }, "value": "e", - "start": 9075, - "end": 9076, + "start": 9077, + "end": 9078, "loc": { "start": { "line": 206, @@ -64607,8 +64607,8 @@ "postfix": false, "binop": null }, - "start": 9076, - "end": 9077, + "start": 9078, + "end": 9079, "loc": { "start": { "line": 206, @@ -64632,8 +64632,8 @@ "postfix": false, "binop": null }, - "start": 9078, - "end": 9079, + "start": 9080, + "end": 9081, "loc": { "start": { "line": 206, @@ -64658,8 +64658,8 @@ "binop": null }, "value": "metaModelJSON", - "start": 9096, - "end": 9109, + "start": 9098, + "end": 9111, "loc": { "start": { "line": 207, @@ -64685,8 +64685,8 @@ "updateContext": null }, "value": "=", - "start": 9110, - "end": 9111, + "start": 9112, + "end": 9113, "loc": { "start": { "line": 207, @@ -64710,8 +64710,8 @@ "postfix": false, "binop": null }, - "start": 9112, - "end": 9113, + "start": 9114, + "end": 9115, "loc": { "start": { "line": 207, @@ -64735,8 +64735,8 @@ "postfix": false, "binop": null }, - "start": 9113, - "end": 9114, + "start": 9115, + "end": 9116, "loc": { "start": { "line": 207, @@ -64761,8 +64761,8 @@ "binop": null, "updateContext": null }, - "start": 9114, - "end": 9115, + "start": 9116, + "end": 9117, "loc": { "start": { "line": 207, @@ -64787,8 +64787,8 @@ "binop": null }, "value": "log", - "start": 9132, - "end": 9135, + "start": 9134, + "end": 9137, "loc": { "start": { "line": 208, @@ -64812,8 +64812,8 @@ "postfix": false, "binop": null }, - "start": 9135, - "end": 9136, + "start": 9137, + "end": 9138, "loc": { "start": { "line": 208, @@ -64837,8 +64837,8 @@ "postfix": false, "binop": null }, - "start": 9136, - "end": 9137, + "start": 9138, + "end": 9139, "loc": { "start": { "line": 208, @@ -64864,8 +64864,8 @@ "updateContext": null }, "value": "Error parsing metadata JSON: ", - "start": 9137, - "end": 9166, + "start": 9139, + "end": 9168, "loc": { "start": { "line": 208, @@ -64889,8 +64889,8 @@ "postfix": false, "binop": null }, - "start": 9166, - "end": 9168, + "start": 9168, + "end": 9170, "loc": { "start": { "line": 208, @@ -64915,8 +64915,8 @@ "binop": null }, "value": "e", - "start": 9168, - "end": 9169, + "start": 9170, + "end": 9171, "loc": { "start": { "line": 208, @@ -64940,8 +64940,8 @@ "postfix": false, "binop": null }, - "start": 9169, - "end": 9170, + "start": 9171, + "end": 9172, "loc": { "start": { "line": 208, @@ -64967,8 +64967,8 @@ "updateContext": null }, "value": "", - "start": 9170, - "end": 9170, + "start": 9172, + "end": 9172, "loc": { "start": { "line": 208, @@ -64992,8 +64992,8 @@ "postfix": false, "binop": null }, - "start": 9170, - "end": 9171, + "start": 9172, + "end": 9173, "loc": { "start": { "line": 208, @@ -65017,8 +65017,8 @@ "postfix": false, "binop": null }, - "start": 9171, - "end": 9172, + "start": 9173, + "end": 9174, "loc": { "start": { "line": 208, @@ -65043,8 +65043,8 @@ "binop": null, "updateContext": null }, - "start": 9172, - "end": 9173, + "start": 9174, + "end": 9175, "loc": { "start": { "line": 208, @@ -65068,8 +65068,8 @@ "postfix": false, "binop": null }, - "start": 9186, - "end": 9187, + "start": 9188, + "end": 9189, "loc": { "start": { "line": 209, @@ -65093,8 +65093,8 @@ "postfix": false, "binop": null }, - "start": 9196, - "end": 9197, + "start": 9198, + "end": 9199, "loc": { "start": { "line": 210, @@ -65119,8 +65119,8 @@ "binop": null }, "value": "minTileSize", - "start": 9207, - "end": 9218, + "start": 9209, + "end": 9220, "loc": { "start": { "line": 212, @@ -65146,8 +65146,8 @@ "updateContext": null }, "value": "=", - "start": 9219, - "end": 9220, + "start": 9221, + "end": 9222, "loc": { "start": { "line": 212, @@ -65172,8 +65172,8 @@ "binop": null }, "value": "overrideOption", - "start": 9221, - "end": 9235, + "start": 9223, + "end": 9237, "loc": { "start": { "line": 212, @@ -65197,8 +65197,8 @@ "postfix": false, "binop": null }, - "start": 9235, - "end": 9236, + "start": 9237, + "end": 9238, "loc": { "start": { "line": 212, @@ -65223,8 +65223,8 @@ "binop": null }, "value": "fileTypeConfigs", - "start": 9236, - "end": 9251, + "start": 9238, + "end": 9253, "loc": { "start": { "line": 212, @@ -65249,8 +65249,8 @@ "binop": null, "updateContext": null }, - "start": 9251, - "end": 9252, + "start": 9253, + "end": 9254, "loc": { "start": { "line": 212, @@ -65275,8 +65275,8 @@ "binop": null }, "value": "minTileSize", - "start": 9252, - "end": 9263, + "start": 9254, + "end": 9265, "loc": { "start": { "line": 212, @@ -65301,8 +65301,8 @@ "binop": null, "updateContext": null }, - "start": 9263, - "end": 9264, + "start": 9265, + "end": 9266, "loc": { "start": { "line": 212, @@ -65327,8 +65327,8 @@ "binop": null }, "value": "minTileSize", - "start": 9265, - "end": 9276, + "start": 9267, + "end": 9278, "loc": { "start": { "line": 212, @@ -65352,8 +65352,8 @@ "postfix": false, "binop": null }, - "start": 9276, - "end": 9277, + "start": 9278, + "end": 9279, "loc": { "start": { "line": 212, @@ -65378,8 +65378,8 @@ "binop": null, "updateContext": null }, - "start": 9277, - "end": 9278, + "start": 9279, + "end": 9280, "loc": { "start": { "line": 212, @@ -65404,8 +65404,8 @@ "binop": null }, "value": "rotateX", - "start": 9287, - "end": 9294, + "start": 9289, + "end": 9296, "loc": { "start": { "line": 213, @@ -65431,8 +65431,8 @@ "updateContext": null }, "value": "=", - "start": 9295, - "end": 9296, + "start": 9297, + "end": 9298, "loc": { "start": { "line": 213, @@ -65457,8 +65457,8 @@ "binop": null }, "value": "overrideOption", - "start": 9297, - "end": 9311, + "start": 9299, + "end": 9313, "loc": { "start": { "line": 213, @@ -65482,8 +65482,8 @@ "postfix": false, "binop": null }, - "start": 9311, - "end": 9312, + "start": 9313, + "end": 9314, "loc": { "start": { "line": 213, @@ -65508,8 +65508,8 @@ "binop": null }, "value": "fileTypeConfigs", - "start": 9312, - "end": 9327, + "start": 9314, + "end": 9329, "loc": { "start": { "line": 213, @@ -65534,8 +65534,8 @@ "binop": null, "updateContext": null }, - "start": 9327, - "end": 9328, + "start": 9329, + "end": 9330, "loc": { "start": { "line": 213, @@ -65560,8 +65560,8 @@ "binop": null }, "value": "rotateX", - "start": 9328, - "end": 9335, + "start": 9330, + "end": 9337, "loc": { "start": { "line": 213, @@ -65586,8 +65586,8 @@ "binop": null, "updateContext": null }, - "start": 9335, - "end": 9336, + "start": 9337, + "end": 9338, "loc": { "start": { "line": 213, @@ -65612,8 +65612,8 @@ "binop": null }, "value": "rotateX", - "start": 9337, - "end": 9344, + "start": 9339, + "end": 9346, "loc": { "start": { "line": 213, @@ -65637,8 +65637,8 @@ "postfix": false, "binop": null }, - "start": 9344, - "end": 9345, + "start": 9346, + "end": 9347, "loc": { "start": { "line": 213, @@ -65663,8 +65663,8 @@ "binop": null, "updateContext": null }, - "start": 9345, - "end": 9346, + "start": 9347, + "end": 9348, "loc": { "start": { "line": 213, @@ -65689,8 +65689,8 @@ "binop": null }, "value": "reuseGeometries", - "start": 9355, - "end": 9370, + "start": 9357, + "end": 9372, "loc": { "start": { "line": 214, @@ -65716,8 +65716,8 @@ "updateContext": null }, "value": "=", - "start": 9371, - "end": 9372, + "start": 9373, + "end": 9374, "loc": { "start": { "line": 214, @@ -65742,8 +65742,8 @@ "binop": null }, "value": "overrideOption", - "start": 9373, - "end": 9387, + "start": 9375, + "end": 9389, "loc": { "start": { "line": 214, @@ -65767,8 +65767,8 @@ "postfix": false, "binop": null }, - "start": 9387, - "end": 9388, + "start": 9389, + "end": 9390, "loc": { "start": { "line": 214, @@ -65793,8 +65793,8 @@ "binop": null }, "value": "fileTypeConfigs", - "start": 9388, - "end": 9403, + "start": 9390, + "end": 9405, "loc": { "start": { "line": 214, @@ -65819,8 +65819,8 @@ "binop": null, "updateContext": null }, - "start": 9403, - "end": 9404, + "start": 9405, + "end": 9406, "loc": { "start": { "line": 214, @@ -65845,8 +65845,8 @@ "binop": null }, "value": "reuseGeometries", - "start": 9404, - "end": 9419, + "start": 9406, + "end": 9421, "loc": { "start": { "line": 214, @@ -65871,8 +65871,8 @@ "binop": null, "updateContext": null }, - "start": 9419, - "end": 9420, + "start": 9421, + "end": 9422, "loc": { "start": { "line": 214, @@ -65897,8 +65897,8 @@ "binop": null }, "value": "reuseGeometries", - "start": 9421, - "end": 9436, + "start": 9423, + "end": 9438, "loc": { "start": { "line": 214, @@ -65922,8 +65922,8 @@ "postfix": false, "binop": null }, - "start": 9436, - "end": 9437, + "start": 9438, + "end": 9439, "loc": { "start": { "line": 214, @@ -65948,8 +65948,8 @@ "binop": null, "updateContext": null }, - "start": 9437, - "end": 9438, + "start": 9439, + "end": 9440, "loc": { "start": { "line": 214, @@ -65974,8 +65974,8 @@ "binop": null }, "value": "includeTextures", - "start": 9447, - "end": 9462, + "start": 9449, + "end": 9464, "loc": { "start": { "line": 215, @@ -66001,8 +66001,8 @@ "updateContext": null }, "value": "=", - "start": 9463, - "end": 9464, + "start": 9465, + "end": 9466, "loc": { "start": { "line": 215, @@ -66027,8 +66027,8 @@ "binop": null }, "value": "overrideOption", - "start": 9465, - "end": 9479, + "start": 9467, + "end": 9481, "loc": { "start": { "line": 215, @@ -66052,8 +66052,8 @@ "postfix": false, "binop": null }, - "start": 9479, - "end": 9480, + "start": 9481, + "end": 9482, "loc": { "start": { "line": 215, @@ -66078,8 +66078,8 @@ "binop": null }, "value": "fileTypeConfigs", - "start": 9480, - "end": 9495, + "start": 9482, + "end": 9497, "loc": { "start": { "line": 215, @@ -66104,8 +66104,8 @@ "binop": null, "updateContext": null }, - "start": 9495, - "end": 9496, + "start": 9497, + "end": 9498, "loc": { "start": { "line": 215, @@ -66130,8 +66130,8 @@ "binop": null }, "value": "includeTextures", - "start": 9496, - "end": 9511, + "start": 9498, + "end": 9513, "loc": { "start": { "line": 215, @@ -66156,8 +66156,8 @@ "binop": null, "updateContext": null }, - "start": 9511, - "end": 9512, + "start": 9513, + "end": 9514, "loc": { "start": { "line": 215, @@ -66182,8 +66182,8 @@ "binop": null }, "value": "includeTextures", - "start": 9513, - "end": 9528, + "start": 9515, + "end": 9530, "loc": { "start": { "line": 215, @@ -66207,8 +66207,8 @@ "postfix": false, "binop": null }, - "start": 9528, - "end": 9529, + "start": 9530, + "end": 9531, "loc": { "start": { "line": 215, @@ -66233,8 +66233,8 @@ "binop": null, "updateContext": null }, - "start": 9529, - "end": 9530, + "start": 9531, + "end": 9532, "loc": { "start": { "line": 215, @@ -66259,8 +66259,8 @@ "binop": null }, "value": "includeNormals", - "start": 9539, - "end": 9553, + "start": 9541, + "end": 9555, "loc": { "start": { "line": 216, @@ -66286,8 +66286,8 @@ "updateContext": null }, "value": "=", - "start": 9554, - "end": 9555, + "start": 9556, + "end": 9557, "loc": { "start": { "line": 216, @@ -66312,8 +66312,8 @@ "binop": null }, "value": "overrideOption", - "start": 9556, - "end": 9570, + "start": 9558, + "end": 9572, "loc": { "start": { "line": 216, @@ -66337,8 +66337,8 @@ "postfix": false, "binop": null }, - "start": 9570, - "end": 9571, + "start": 9572, + "end": 9573, "loc": { "start": { "line": 216, @@ -66363,8 +66363,8 @@ "binop": null }, "value": "fileTypeConfigs", - "start": 9571, - "end": 9586, + "start": 9573, + "end": 9588, "loc": { "start": { "line": 216, @@ -66389,8 +66389,8 @@ "binop": null, "updateContext": null }, - "start": 9586, - "end": 9587, + "start": 9588, + "end": 9589, "loc": { "start": { "line": 216, @@ -66415,8 +66415,8 @@ "binop": null }, "value": "includeNormals", - "start": 9587, - "end": 9601, + "start": 9589, + "end": 9603, "loc": { "start": { "line": 216, @@ -66441,8 +66441,8 @@ "binop": null, "updateContext": null }, - "start": 9601, - "end": 9602, + "start": 9603, + "end": 9604, "loc": { "start": { "line": 216, @@ -66467,8 +66467,8 @@ "binop": null }, "value": "includeNormals", - "start": 9603, - "end": 9617, + "start": 9605, + "end": 9619, "loc": { "start": { "line": 216, @@ -66492,8 +66492,8 @@ "postfix": false, "binop": null }, - "start": 9617, - "end": 9618, + "start": 9619, + "end": 9620, "loc": { "start": { "line": 216, @@ -66518,8 +66518,8 @@ "binop": null, "updateContext": null }, - "start": 9618, - "end": 9619, + "start": 9620, + "end": 9621, "loc": { "start": { "line": 216, @@ -66544,8 +66544,8 @@ "binop": null }, "value": "includeTypes", - "start": 9628, - "end": 9640, + "start": 9630, + "end": 9642, "loc": { "start": { "line": 217, @@ -66571,8 +66571,8 @@ "updateContext": null }, "value": "=", - "start": 9641, - "end": 9642, + "start": 9643, + "end": 9644, "loc": { "start": { "line": 217, @@ -66597,8 +66597,8 @@ "binop": null }, "value": "overrideOption", - "start": 9643, - "end": 9657, + "start": 9645, + "end": 9659, "loc": { "start": { "line": 217, @@ -66622,8 +66622,8 @@ "postfix": false, "binop": null }, - "start": 9657, - "end": 9658, + "start": 9659, + "end": 9660, "loc": { "start": { "line": 217, @@ -66648,8 +66648,8 @@ "binop": null }, "value": "fileTypeConfigs", - "start": 9658, - "end": 9673, + "start": 9660, + "end": 9675, "loc": { "start": { "line": 217, @@ -66674,8 +66674,8 @@ "binop": null, "updateContext": null }, - "start": 9673, - "end": 9674, + "start": 9675, + "end": 9676, "loc": { "start": { "line": 217, @@ -66700,8 +66700,8 @@ "binop": null }, "value": "includeTypes", - "start": 9674, - "end": 9686, + "start": 9676, + "end": 9688, "loc": { "start": { "line": 217, @@ -66726,8 +66726,8 @@ "binop": null, "updateContext": null }, - "start": 9686, - "end": 9687, + "start": 9688, + "end": 9689, "loc": { "start": { "line": 217, @@ -66752,8 +66752,8 @@ "binop": null }, "value": "includeTypes", - "start": 9688, - "end": 9700, + "start": 9690, + "end": 9702, "loc": { "start": { "line": 217, @@ -66777,8 +66777,8 @@ "postfix": false, "binop": null }, - "start": 9700, - "end": 9701, + "start": 9702, + "end": 9703, "loc": { "start": { "line": 217, @@ -66803,8 +66803,8 @@ "binop": null, "updateContext": null }, - "start": 9701, - "end": 9702, + "start": 9703, + "end": 9704, "loc": { "start": { "line": 217, @@ -66829,8 +66829,8 @@ "binop": null }, "value": "excludeTypes", - "start": 9711, - "end": 9723, + "start": 9713, + "end": 9725, "loc": { "start": { "line": 218, @@ -66856,8 +66856,8 @@ "updateContext": null }, "value": "=", - "start": 9724, - "end": 9725, + "start": 9726, + "end": 9727, "loc": { "start": { "line": 218, @@ -66882,8 +66882,8 @@ "binop": null }, "value": "overrideOption", - "start": 9726, - "end": 9740, + "start": 9728, + "end": 9742, "loc": { "start": { "line": 218, @@ -66907,8 +66907,8 @@ "postfix": false, "binop": null }, - "start": 9740, - "end": 9741, + "start": 9742, + "end": 9743, "loc": { "start": { "line": 218, @@ -66933,8 +66933,8 @@ "binop": null }, "value": "fileTypeConfigs", - "start": 9741, - "end": 9756, + "start": 9743, + "end": 9758, "loc": { "start": { "line": 218, @@ -66959,8 +66959,8 @@ "binop": null, "updateContext": null }, - "start": 9756, - "end": 9757, + "start": 9758, + "end": 9759, "loc": { "start": { "line": 218, @@ -66985,8 +66985,8 @@ "binop": null }, "value": "excludeTypes", - "start": 9757, - "end": 9769, + "start": 9759, + "end": 9771, "loc": { "start": { "line": 218, @@ -67011,8 +67011,8 @@ "binop": null, "updateContext": null }, - "start": 9769, - "end": 9770, + "start": 9771, + "end": 9772, "loc": { "start": { "line": 218, @@ -67037,8 +67037,8 @@ "binop": null }, "value": "excludeTypes", - "start": 9771, - "end": 9783, + "start": 9773, + "end": 9785, "loc": { "start": { "line": 218, @@ -67062,8 +67062,8 @@ "postfix": false, "binop": null }, - "start": 9783, - "end": 9784, + "start": 9785, + "end": 9786, "loc": { "start": { "line": 218, @@ -67088,8 +67088,8 @@ "binop": null, "updateContext": null }, - "start": 9784, - "end": 9785, + "start": 9786, + "end": 9787, "loc": { "start": { "line": 218, @@ -67116,8 +67116,8 @@ "updateContext": null }, "value": "if", - "start": 9795, - "end": 9797, + "start": 9797, + "end": 9799, "loc": { "start": { "line": 220, @@ -67141,8 +67141,8 @@ "postfix": false, "binop": null }, - "start": 9798, - "end": 9799, + "start": 9800, + "end": 9801, "loc": { "start": { "line": 220, @@ -67167,8 +67167,8 @@ "binop": null }, "value": "reuseGeometries", - "start": 9799, - "end": 9814, + "start": 9801, + "end": 9816, "loc": { "start": { "line": 220, @@ -67194,8 +67194,8 @@ "updateContext": null }, "value": "===", - "start": 9815, - "end": 9818, + "start": 9817, + "end": 9820, "loc": { "start": { "line": 220, @@ -67222,8 +67222,8 @@ "updateContext": null }, "value": "false", - "start": 9819, - "end": 9824, + "start": 9821, + "end": 9826, "loc": { "start": { "line": 220, @@ -67247,8 +67247,8 @@ "postfix": false, "binop": null }, - "start": 9824, - "end": 9825, + "start": 9826, + "end": 9827, "loc": { "start": { "line": 220, @@ -67272,8 +67272,8 @@ "postfix": false, "binop": null }, - "start": 9826, - "end": 9827, + "start": 9828, + "end": 9829, "loc": { "start": { "line": 220, @@ -67298,8 +67298,8 @@ "binop": null }, "value": "log", - "start": 9840, - "end": 9843, + "start": 9842, + "end": 9845, "loc": { "start": { "line": 221, @@ -67323,8 +67323,8 @@ "postfix": false, "binop": null }, - "start": 9843, - "end": 9844, + "start": 9845, + "end": 9846, "loc": { "start": { "line": 221, @@ -67350,8 +67350,8 @@ "updateContext": null }, "value": "Geometry reuse is disabled", - "start": 9844, - "end": 9872, + "start": 9846, + "end": 9874, "loc": { "start": { "line": 221, @@ -67375,8 +67375,8 @@ "postfix": false, "binop": null }, - "start": 9872, - "end": 9873, + "start": 9874, + "end": 9875, "loc": { "start": { "line": 221, @@ -67401,8 +67401,8 @@ "binop": null, "updateContext": null }, - "start": 9873, - "end": 9874, + "start": 9875, + "end": 9876, "loc": { "start": { "line": 221, @@ -67426,8 +67426,8 @@ "postfix": false, "binop": null }, - "start": 9883, - "end": 9884, + "start": 9885, + "end": 9886, "loc": { "start": { "line": 222, @@ -67454,8 +67454,8 @@ "updateContext": null }, "value": "const", - "start": 9894, - "end": 9899, + "start": 9896, + "end": 9901, "loc": { "start": { "line": 224, @@ -67480,8 +67480,8 @@ "binop": null }, "value": "xktModel", - "start": 9900, - "end": 9908, + "start": 9902, + "end": 9910, "loc": { "start": { "line": 224, @@ -67507,8 +67507,8 @@ "updateContext": null }, "value": "=", - "start": 9909, - "end": 9910, + "start": 9911, + "end": 9912, "loc": { "start": { "line": 224, @@ -67535,8 +67535,8 @@ "updateContext": null }, "value": "new", - "start": 9911, - "end": 9914, + "start": 9913, + "end": 9916, "loc": { "start": { "line": 224, @@ -67561,8 +67561,8 @@ "binop": null }, "value": "XKTModel", - "start": 9915, - "end": 9923, + "start": 9917, + "end": 9925, "loc": { "start": { "line": 224, @@ -67586,8 +67586,8 @@ "postfix": false, "binop": null }, - "start": 9923, - "end": 9924, + "start": 9925, + "end": 9926, "loc": { "start": { "line": 224, @@ -67611,8 +67611,8 @@ "postfix": false, "binop": null }, - "start": 9924, - "end": 9925, + "start": 9926, + "end": 9927, "loc": { "start": { "line": 224, @@ -67637,8 +67637,8 @@ "binop": null }, "value": "minTileSize", - "start": 9938, - "end": 9949, + "start": 9940, + "end": 9951, "loc": { "start": { "line": 225, @@ -67663,8 +67663,8 @@ "binop": null, "updateContext": null }, - "start": 9949, - "end": 9950, + "start": 9951, + "end": 9952, "loc": { "start": { "line": 225, @@ -67689,8 +67689,8 @@ "binop": null }, "value": "modelAABB", - "start": 9963, - "end": 9972, + "start": 9965, + "end": 9974, "loc": { "start": { "line": 226, @@ -67714,8 +67714,8 @@ "postfix": false, "binop": null }, - "start": 9981, - "end": 9982, + "start": 9983, + "end": 9984, "loc": { "start": { "line": 227, @@ -67739,8 +67739,8 @@ "postfix": false, "binop": null }, - "start": 9982, - "end": 9983, + "start": 9984, + "end": 9985, "loc": { "start": { "line": 227, @@ -67765,8 +67765,8 @@ "binop": null, "updateContext": null }, - "start": 9983, - "end": 9984, + "start": 9985, + "end": 9986, "loc": { "start": { "line": 227, @@ -67793,8 +67793,8 @@ "updateContext": null }, "value": "switch", - "start": 9994, - "end": 10000, + "start": 9996, + "end": 10002, "loc": { "start": { "line": 229, @@ -67818,8 +67818,8 @@ "postfix": false, "binop": null }, - "start": 10001, - "end": 10002, + "start": 10003, + "end": 10004, "loc": { "start": { "line": 229, @@ -67844,8 +67844,8 @@ "binop": null }, "value": "ext", - "start": 10002, - "end": 10005, + "start": 10004, + "end": 10007, "loc": { "start": { "line": 229, @@ -67869,8 +67869,8 @@ "postfix": false, "binop": null }, - "start": 10005, - "end": 10006, + "start": 10007, + "end": 10008, "loc": { "start": { "line": 229, @@ -67894,8 +67894,8 @@ "postfix": false, "binop": null }, - "start": 10007, - "end": 10008, + "start": 10009, + "end": 10010, "loc": { "start": { "line": 229, @@ -67922,8 +67922,8 @@ "updateContext": null }, "value": "case", - "start": 10021, - "end": 10025, + "start": 10023, + "end": 10027, "loc": { "start": { "line": 230, @@ -67949,8 +67949,8 @@ "updateContext": null }, "value": "json", - "start": 10026, - "end": 10032, + "start": 10028, + "end": 10034, "loc": { "start": { "line": 230, @@ -67975,8 +67975,8 @@ "binop": null, "updateContext": null }, - "start": 10032, - "end": 10033, + "start": 10034, + "end": 10035, "loc": { "start": { "line": 230, @@ -68001,8 +68001,8 @@ "binop": null }, "value": "convert", - "start": 10050, - "end": 10057, + "start": 10052, + "end": 10059, "loc": { "start": { "line": 231, @@ -68026,8 +68026,8 @@ "postfix": false, "binop": null }, - "start": 10057, - "end": 10058, + "start": 10059, + "end": 10060, "loc": { "start": { "line": 231, @@ -68052,8 +68052,8 @@ "binop": null }, "value": "parseCityJSONIntoXKTModel", - "start": 10058, - "end": 10083, + "start": 10060, + "end": 10085, "loc": { "start": { "line": 231, @@ -68078,8 +68078,8 @@ "binop": null, "updateContext": null }, - "start": 10083, - "end": 10084, + "start": 10085, + "end": 10086, "loc": { "start": { "line": 231, @@ -68103,8 +68103,8 @@ "postfix": false, "binop": null }, - "start": 10085, - "end": 10086, + "start": 10087, + "end": 10088, "loc": { "start": { "line": 231, @@ -68129,8 +68129,8 @@ "binop": null }, "value": "data", - "start": 10107, - "end": 10111, + "start": 10109, + "end": 10113, "loc": { "start": { "line": 232, @@ -68155,8 +68155,8 @@ "binop": null, "updateContext": null }, - "start": 10111, - "end": 10112, + "start": 10113, + "end": 10114, "loc": { "start": { "line": 232, @@ -68181,8 +68181,8 @@ "binop": null }, "value": "JSON", - "start": 10113, - "end": 10117, + "start": 10115, + "end": 10119, "loc": { "start": { "line": 232, @@ -68207,8 +68207,8 @@ "binop": null, "updateContext": null }, - "start": 10117, - "end": 10118, + "start": 10119, + "end": 10120, "loc": { "start": { "line": 232, @@ -68233,8 +68233,8 @@ "binop": null }, "value": "parse", - "start": 10118, - "end": 10123, + "start": 10120, + "end": 10125, "loc": { "start": { "line": 232, @@ -68258,8 +68258,8 @@ "postfix": false, "binop": null }, - "start": 10123, - "end": 10124, + "start": 10125, + "end": 10126, "loc": { "start": { "line": 232, @@ -68284,8 +68284,8 @@ "binop": null }, "value": "sourceData", - "start": 10124, - "end": 10134, + "start": 10126, + "end": 10136, "loc": { "start": { "line": 232, @@ -68309,8 +68309,8 @@ "postfix": false, "binop": null }, - "start": 10134, - "end": 10135, + "start": 10136, + "end": 10137, "loc": { "start": { "line": 232, @@ -68335,8 +68335,8 @@ "binop": null, "updateContext": null }, - "start": 10135, - "end": 10136, + "start": 10137, + "end": 10138, "loc": { "start": { "line": 232, @@ -68361,8 +68361,8 @@ "binop": null }, "value": "xktModel", - "start": 10157, - "end": 10165, + "start": 10159, + "end": 10167, "loc": { "start": { "line": 233, @@ -68387,8 +68387,8 @@ "binop": null, "updateContext": null }, - "start": 10165, - "end": 10166, + "start": 10167, + "end": 10168, "loc": { "start": { "line": 233, @@ -68413,8 +68413,8 @@ "binop": null }, "value": "stats", - "start": 10187, - "end": 10192, + "start": 10189, + "end": 10194, "loc": { "start": { "line": 234, @@ -68439,8 +68439,8 @@ "binop": null, "updateContext": null }, - "start": 10192, - "end": 10193, + "start": 10194, + "end": 10195, "loc": { "start": { "line": 234, @@ -68465,8 +68465,8 @@ "binop": null }, "value": "rotateX", - "start": 10214, - "end": 10221, + "start": 10216, + "end": 10223, "loc": { "start": { "line": 235, @@ -68491,8 +68491,8 @@ "binop": null, "updateContext": null }, - "start": 10221, - "end": 10222, + "start": 10223, + "end": 10224, "loc": { "start": { "line": 235, @@ -68517,8 +68517,8 @@ "binop": null }, "value": "center", - "start": 10243, - "end": 10249, + "start": 10245, + "end": 10251, "loc": { "start": { "line": 236, @@ -68543,8 +68543,8 @@ "binop": null, "updateContext": null }, - "start": 10249, - "end": 10250, + "start": 10251, + "end": 10252, "loc": { "start": { "line": 236, @@ -68569,8 +68569,8 @@ "binop": null }, "value": "fileTypeConfigs", - "start": 10251, - "end": 10266, + "start": 10253, + "end": 10268, "loc": { "start": { "line": 236, @@ -68595,8 +68595,8 @@ "binop": null, "updateContext": null }, - "start": 10266, - "end": 10267, + "start": 10268, + "end": 10269, "loc": { "start": { "line": 236, @@ -68621,8 +68621,8 @@ "binop": null }, "value": "center", - "start": 10267, - "end": 10273, + "start": 10269, + "end": 10275, "loc": { "start": { "line": 236, @@ -68647,8 +68647,8 @@ "binop": null, "updateContext": null }, - "start": 10273, - "end": 10274, + "start": 10275, + "end": 10276, "loc": { "start": { "line": 236, @@ -68673,8 +68673,8 @@ "binop": null }, "value": "transform", - "start": 10295, - "end": 10304, + "start": 10297, + "end": 10306, "loc": { "start": { "line": 237, @@ -68699,8 +68699,8 @@ "binop": null, "updateContext": null }, - "start": 10304, - "end": 10305, + "start": 10306, + "end": 10307, "loc": { "start": { "line": 237, @@ -68725,8 +68725,8 @@ "binop": null }, "value": "fileTypeConfigs", - "start": 10306, - "end": 10321, + "start": 10308, + "end": 10323, "loc": { "start": { "line": 237, @@ -68751,8 +68751,8 @@ "binop": null, "updateContext": null }, - "start": 10321, - "end": 10322, + "start": 10323, + "end": 10324, "loc": { "start": { "line": 237, @@ -68777,8 +68777,8 @@ "binop": null }, "value": "transform", - "start": 10322, - "end": 10331, + "start": 10324, + "end": 10333, "loc": { "start": { "line": 237, @@ -68803,8 +68803,8 @@ "binop": null, "updateContext": null }, - "start": 10331, - "end": 10332, + "start": 10333, + "end": 10334, "loc": { "start": { "line": 237, @@ -68829,8 +68829,8 @@ "binop": null }, "value": "log", - "start": 10353, - "end": 10356, + "start": 10355, + "end": 10358, "loc": { "start": { "line": 238, @@ -68854,8 +68854,8 @@ "postfix": false, "binop": null }, - "start": 10373, - "end": 10374, + "start": 10375, + "end": 10376, "loc": { "start": { "line": 239, @@ -68879,8 +68879,8 @@ "postfix": false, "binop": null }, - "start": 10374, - "end": 10375, + "start": 10376, + "end": 10377, "loc": { "start": { "line": 239, @@ -68905,8 +68905,8 @@ "binop": null, "updateContext": null }, - "start": 10375, - "end": 10376, + "start": 10377, + "end": 10378, "loc": { "start": { "line": 239, @@ -68933,8 +68933,8 @@ "updateContext": null }, "value": "break", - "start": 10393, - "end": 10398, + "start": 10395, + "end": 10400, "loc": { "start": { "line": 240, @@ -68959,8 +68959,8 @@ "binop": null, "updateContext": null }, - "start": 10398, - "end": 10399, + "start": 10400, + "end": 10401, "loc": { "start": { "line": 240, @@ -68987,8 +68987,8 @@ "updateContext": null }, "value": "case", - "start": 10413, - "end": 10417, + "start": 10415, + "end": 10419, "loc": { "start": { "line": 242, @@ -69014,8 +69014,8 @@ "updateContext": null }, "value": "glb", - "start": 10418, - "end": 10423, + "start": 10420, + "end": 10425, "loc": { "start": { "line": 242, @@ -69040,8 +69040,8 @@ "binop": null, "updateContext": null }, - "start": 10423, - "end": 10424, + "start": 10425, + "end": 10426, "loc": { "start": { "line": 242, @@ -69066,8 +69066,8 @@ "binop": null }, "value": "sourceData", - "start": 10441, - "end": 10451, + "start": 10443, + "end": 10453, "loc": { "start": { "line": 243, @@ -69093,8 +69093,8 @@ "updateContext": null }, "value": "=", - "start": 10452, - "end": 10453, + "start": 10454, + "end": 10455, "loc": { "start": { "line": 243, @@ -69119,8 +69119,8 @@ "binop": null }, "value": "toArrayBuffer", - "start": 10454, - "end": 10467, + "start": 10456, + "end": 10469, "loc": { "start": { "line": 243, @@ -69144,8 +69144,8 @@ "postfix": false, "binop": null }, - "start": 10467, - "end": 10468, + "start": 10469, + "end": 10470, "loc": { "start": { "line": 243, @@ -69170,8 +69170,8 @@ "binop": null }, "value": "sourceData", - "start": 10468, - "end": 10478, + "start": 10470, + "end": 10480, "loc": { "start": { "line": 243, @@ -69195,8 +69195,8 @@ "postfix": false, "binop": null }, - "start": 10478, - "end": 10479, + "start": 10480, + "end": 10481, "loc": { "start": { "line": 243, @@ -69221,8 +69221,8 @@ "binop": null, "updateContext": null }, - "start": 10479, - "end": 10480, + "start": 10481, + "end": 10482, "loc": { "start": { "line": 243, @@ -69247,8 +69247,8 @@ "binop": null }, "value": "convert", - "start": 10497, - "end": 10504, + "start": 10499, + "end": 10506, "loc": { "start": { "line": 244, @@ -69272,8 +69272,8 @@ "postfix": false, "binop": null }, - "start": 10504, - "end": 10505, + "start": 10506, + "end": 10507, "loc": { "start": { "line": 244, @@ -69298,8 +69298,8 @@ "binop": null }, "value": "parseGLTFIntoXKTModel", - "start": 10505, - "end": 10526, + "start": 10507, + "end": 10528, "loc": { "start": { "line": 244, @@ -69324,8 +69324,8 @@ "binop": null, "updateContext": null }, - "start": 10526, - "end": 10527, + "start": 10528, + "end": 10529, "loc": { "start": { "line": 244, @@ -69349,8 +69349,8 @@ "postfix": false, "binop": null }, - "start": 10528, - "end": 10529, + "start": 10530, + "end": 10531, "loc": { "start": { "line": 244, @@ -69375,8 +69375,8 @@ "binop": null }, "value": "data", - "start": 10550, - "end": 10554, + "start": 10552, + "end": 10556, "loc": { "start": { "line": 245, @@ -69401,8 +69401,8 @@ "binop": null, "updateContext": null }, - "start": 10554, - "end": 10555, + "start": 10556, + "end": 10557, "loc": { "start": { "line": 245, @@ -69427,8 +69427,8 @@ "binop": null }, "value": "sourceData", - "start": 10556, - "end": 10566, + "start": 10558, + "end": 10568, "loc": { "start": { "line": 245, @@ -69453,8 +69453,8 @@ "binop": null, "updateContext": null }, - "start": 10566, - "end": 10567, + "start": 10568, + "end": 10569, "loc": { "start": { "line": 245, @@ -69479,8 +69479,8 @@ "binop": null }, "value": "reuseGeometries", - "start": 10588, - "end": 10603, + "start": 10590, + "end": 10605, "loc": { "start": { "line": 246, @@ -69505,8 +69505,8 @@ "binop": null, "updateContext": null }, - "start": 10603, - "end": 10604, + "start": 10605, + "end": 10606, "loc": { "start": { "line": 246, @@ -69531,8 +69531,8 @@ "binop": null }, "value": "includeTextures", - "start": 10625, - "end": 10640, + "start": 10627, + "end": 10642, "loc": { "start": { "line": 247, @@ -69557,8 +69557,8 @@ "binop": null, "updateContext": null }, - "start": 10640, - "end": 10641, + "start": 10642, + "end": 10643, "loc": { "start": { "line": 247, @@ -69585,8 +69585,8 @@ "updateContext": null }, "value": "true", - "start": 10642, - "end": 10646, + "start": 10644, + "end": 10648, "loc": { "start": { "line": 247, @@ -69611,8 +69611,8 @@ "binop": null, "updateContext": null }, - "start": 10646, - "end": 10647, + "start": 10648, + "end": 10649, "loc": { "start": { "line": 247, @@ -69637,8 +69637,8 @@ "binop": null }, "value": "includeNormals", - "start": 10668, - "end": 10682, + "start": 10670, + "end": 10684, "loc": { "start": { "line": 248, @@ -69663,8 +69663,8 @@ "binop": null, "updateContext": null }, - "start": 10682, - "end": 10683, + "start": 10684, + "end": 10685, "loc": { "start": { "line": 248, @@ -69689,8 +69689,8 @@ "binop": null }, "value": "metaModelData", - "start": 10704, - "end": 10717, + "start": 10706, + "end": 10719, "loc": { "start": { "line": 249, @@ -69715,8 +69715,8 @@ "binop": null, "updateContext": null }, - "start": 10717, - "end": 10718, + "start": 10719, + "end": 10720, "loc": { "start": { "line": 249, @@ -69741,8 +69741,8 @@ "binop": null }, "value": "metaModelJSON", - "start": 10719, - "end": 10732, + "start": 10721, + "end": 10734, "loc": { "start": { "line": 249, @@ -69767,8 +69767,8 @@ "binop": null, "updateContext": null }, - "start": 10732, - "end": 10733, + "start": 10734, + "end": 10735, "loc": { "start": { "line": 249, @@ -69793,8 +69793,8 @@ "binop": null }, "value": "xktModel", - "start": 10754, - "end": 10762, + "start": 10756, + "end": 10764, "loc": { "start": { "line": 250, @@ -69819,8 +69819,8 @@ "binop": null, "updateContext": null }, - "start": 10762, - "end": 10763, + "start": 10764, + "end": 10765, "loc": { "start": { "line": 250, @@ -69845,8 +69845,8 @@ "binop": null }, "value": "stats", - "start": 10784, - "end": 10789, + "start": 10786, + "end": 10791, "loc": { "start": { "line": 251, @@ -69871,8 +69871,8 @@ "binop": null, "updateContext": null }, - "start": 10789, - "end": 10790, + "start": 10791, + "end": 10792, "loc": { "start": { "line": 251, @@ -69897,8 +69897,8 @@ "binop": null }, "value": "log", - "start": 10811, - "end": 10814, + "start": 10813, + "end": 10816, "loc": { "start": { "line": 252, @@ -69922,8 +69922,8 @@ "postfix": false, "binop": null }, - "start": 10831, - "end": 10832, + "start": 10833, + "end": 10834, "loc": { "start": { "line": 253, @@ -69947,8 +69947,8 @@ "postfix": false, "binop": null }, - "start": 10832, - "end": 10833, + "start": 10834, + "end": 10835, "loc": { "start": { "line": 253, @@ -69973,8 +69973,8 @@ "binop": null, "updateContext": null }, - "start": 10833, - "end": 10834, + "start": 10835, + "end": 10836, "loc": { "start": { "line": 253, @@ -70001,8 +70001,8 @@ "updateContext": null }, "value": "break", - "start": 10851, - "end": 10856, + "start": 10853, + "end": 10858, "loc": { "start": { "line": 254, @@ -70027,8 +70027,8 @@ "binop": null, "updateContext": null }, - "start": 10856, - "end": 10857, + "start": 10858, + "end": 10859, "loc": { "start": { "line": 254, @@ -70055,8 +70055,8 @@ "updateContext": null }, "value": "case", - "start": 10871, - "end": 10875, + "start": 10873, + "end": 10877, "loc": { "start": { "line": 256, @@ -70082,8 +70082,8 @@ "updateContext": null }, "value": "gltf", - "start": 10876, - "end": 10882, + "start": 10878, + "end": 10884, "loc": { "start": { "line": 256, @@ -70108,8 +70108,8 @@ "binop": null, "updateContext": null }, - "start": 10882, - "end": 10883, + "start": 10884, + "end": 10885, "loc": { "start": { "line": 256, @@ -70134,8 +70134,8 @@ "binop": null }, "value": "sourceData", - "start": 10900, - "end": 10910, + "start": 10902, + "end": 10912, "loc": { "start": { "line": 257, @@ -70161,8 +70161,8 @@ "updateContext": null }, "value": "=", - "start": 10911, - "end": 10912, + "start": 10913, + "end": 10914, "loc": { "start": { "line": 257, @@ -70187,8 +70187,8 @@ "binop": null }, "value": "toArrayBuffer", - "start": 10913, - "end": 10926, + "start": 10915, + "end": 10928, "loc": { "start": { "line": 257, @@ -70212,8 +70212,8 @@ "postfix": false, "binop": null }, - "start": 10926, - "end": 10927, + "start": 10928, + "end": 10929, "loc": { "start": { "line": 257, @@ -70238,8 +70238,8 @@ "binop": null }, "value": "sourceData", - "start": 10927, - "end": 10937, + "start": 10929, + "end": 10939, "loc": { "start": { "line": 257, @@ -70263,8 +70263,8 @@ "postfix": false, "binop": null }, - "start": 10937, - "end": 10938, + "start": 10939, + "end": 10940, "loc": { "start": { "line": 257, @@ -70289,8 +70289,8 @@ "binop": null, "updateContext": null }, - "start": 10938, - "end": 10939, + "start": 10940, + "end": 10941, "loc": { "start": { "line": 257, @@ -70317,8 +70317,8 @@ "updateContext": null }, "value": "const", - "start": 10956, - "end": 10961, + "start": 10958, + "end": 10963, "loc": { "start": { "line": 258, @@ -70343,8 +70343,8 @@ "binop": null }, "value": "gltfBasePath", - "start": 10962, - "end": 10974, + "start": 10964, + "end": 10976, "loc": { "start": { "line": 258, @@ -70370,8 +70370,8 @@ "updateContext": null }, "value": "=", - "start": 10975, - "end": 10976, + "start": 10977, + "end": 10978, "loc": { "start": { "line": 258, @@ -70396,8 +70396,8 @@ "binop": null }, "value": "source", - "start": 10977, - "end": 10983, + "start": 10979, + "end": 10985, "loc": { "start": { "line": 258, @@ -70422,8 +70422,8 @@ "binop": null, "updateContext": null }, - "start": 10984, - "end": 10985, + "start": 10986, + "end": 10987, "loc": { "start": { "line": 258, @@ -70448,8 +70448,8 @@ "binop": null }, "value": "path", - "start": 10986, - "end": 10990, + "start": 10988, + "end": 10992, "loc": { "start": { "line": 258, @@ -70474,8 +70474,8 @@ "binop": null, "updateContext": null }, - "start": 10990, - "end": 10991, + "start": 10992, + "end": 10993, "loc": { "start": { "line": 258, @@ -70500,8 +70500,8 @@ "binop": null }, "value": "dirname", - "start": 10991, - "end": 10998, + "start": 10993, + "end": 11000, "loc": { "start": { "line": 258, @@ -70525,8 +70525,8 @@ "postfix": false, "binop": null }, - "start": 10998, - "end": 10999, + "start": 11000, + "end": 11001, "loc": { "start": { "line": 258, @@ -70551,8 +70551,8 @@ "binop": null }, "value": "source", - "start": 10999, - "end": 11005, + "start": 11001, + "end": 11007, "loc": { "start": { "line": 258, @@ -70576,8 +70576,8 @@ "postfix": false, "binop": null }, - "start": 11005, - "end": 11006, + "start": 11007, + "end": 11008, "loc": { "start": { "line": 258, @@ -70602,8 +70602,8 @@ "binop": null, "updateContext": null }, - "start": 11007, - "end": 11008, + "start": 11009, + "end": 11010, "loc": { "start": { "line": 258, @@ -70629,8 +70629,8 @@ "updateContext": null }, "value": "", - "start": 11009, - "end": 11011, + "start": 11011, + "end": 11013, "loc": { "start": { "line": 258, @@ -70655,8 +70655,8 @@ "binop": null, "updateContext": null }, - "start": 11011, - "end": 11012, + "start": 11013, + "end": 11014, "loc": { "start": { "line": 258, @@ -70681,8 +70681,8 @@ "binop": null }, "value": "convert", - "start": 11029, - "end": 11036, + "start": 11031, + "end": 11038, "loc": { "start": { "line": 259, @@ -70706,8 +70706,8 @@ "postfix": false, "binop": null }, - "start": 11036, - "end": 11037, + "start": 11038, + "end": 11039, "loc": { "start": { "line": 259, @@ -70732,8 +70732,8 @@ "binop": null }, "value": "parseGLTFIntoXKTModel", - "start": 11037, - "end": 11058, + "start": 11039, + "end": 11060, "loc": { "start": { "line": 259, @@ -70758,8 +70758,8 @@ "binop": null, "updateContext": null }, - "start": 11058, - "end": 11059, + "start": 11060, + "end": 11061, "loc": { "start": { "line": 259, @@ -70783,8 +70783,8 @@ "postfix": false, "binop": null }, - "start": 11060, - "end": 11061, + "start": 11062, + "end": 11063, "loc": { "start": { "line": 259, @@ -70809,8 +70809,8 @@ "binop": null }, "value": "baseUri", - "start": 11082, - "end": 11089, + "start": 11084, + "end": 11091, "loc": { "start": { "line": 260, @@ -70835,8 +70835,8 @@ "binop": null, "updateContext": null }, - "start": 11089, - "end": 11090, + "start": 11091, + "end": 11092, "loc": { "start": { "line": 260, @@ -70861,8 +70861,8 @@ "binop": null }, "value": "gltfBasePath", - "start": 11091, - "end": 11103, + "start": 11093, + "end": 11105, "loc": { "start": { "line": 260, @@ -70887,8 +70887,8 @@ "binop": null, "updateContext": null }, - "start": 11103, - "end": 11104, + "start": 11105, + "end": 11106, "loc": { "start": { "line": 260, @@ -70913,8 +70913,8 @@ "binop": null }, "value": "data", - "start": 11125, - "end": 11129, + "start": 11127, + "end": 11131, "loc": { "start": { "line": 261, @@ -70939,8 +70939,8 @@ "binop": null, "updateContext": null }, - "start": 11129, - "end": 11130, + "start": 11131, + "end": 11132, "loc": { "start": { "line": 261, @@ -70965,8 +70965,8 @@ "binop": null }, "value": "sourceData", - "start": 11131, - "end": 11141, + "start": 11133, + "end": 11143, "loc": { "start": { "line": 261, @@ -70991,8 +70991,8 @@ "binop": null, "updateContext": null }, - "start": 11141, - "end": 11142, + "start": 11143, + "end": 11144, "loc": { "start": { "line": 261, @@ -71017,8 +71017,8 @@ "binop": null }, "value": "reuseGeometries", - "start": 11163, - "end": 11178, + "start": 11165, + "end": 11180, "loc": { "start": { "line": 262, @@ -71043,8 +71043,8 @@ "binop": null, "updateContext": null }, - "start": 11178, - "end": 11179, + "start": 11180, + "end": 11181, "loc": { "start": { "line": 262, @@ -71069,8 +71069,8 @@ "binop": null }, "value": "includeTextures", - "start": 11200, - "end": 11215, + "start": 11202, + "end": 11217, "loc": { "start": { "line": 263, @@ -71095,8 +71095,8 @@ "binop": null, "updateContext": null }, - "start": 11215, - "end": 11216, + "start": 11217, + "end": 11218, "loc": { "start": { "line": 263, @@ -71123,8 +71123,8 @@ "updateContext": null }, "value": "true", - "start": 11217, - "end": 11221, + "start": 11219, + "end": 11223, "loc": { "start": { "line": 263, @@ -71149,8 +71149,8 @@ "binop": null, "updateContext": null }, - "start": 11221, - "end": 11222, + "start": 11223, + "end": 11224, "loc": { "start": { "line": 263, @@ -71175,8 +71175,8 @@ "binop": null }, "value": "includeNormals", - "start": 11243, - "end": 11257, + "start": 11245, + "end": 11259, "loc": { "start": { "line": 264, @@ -71201,8 +71201,8 @@ "binop": null, "updateContext": null }, - "start": 11257, - "end": 11258, + "start": 11259, + "end": 11260, "loc": { "start": { "line": 264, @@ -71227,8 +71227,8 @@ "binop": null }, "value": "metaModelData", - "start": 11279, - "end": 11292, + "start": 11281, + "end": 11294, "loc": { "start": { "line": 265, @@ -71253,8 +71253,8 @@ "binop": null, "updateContext": null }, - "start": 11292, - "end": 11293, + "start": 11294, + "end": 11295, "loc": { "start": { "line": 265, @@ -71279,8 +71279,8 @@ "binop": null }, "value": "metaModelJSON", - "start": 11294, - "end": 11307, + "start": 11296, + "end": 11309, "loc": { "start": { "line": 265, @@ -71305,8 +71305,8 @@ "binop": null, "updateContext": null }, - "start": 11307, - "end": 11308, + "start": 11309, + "end": 11310, "loc": { "start": { "line": 265, @@ -71331,8 +71331,8 @@ "binop": null }, "value": "xktModel", - "start": 11329, - "end": 11337, + "start": 11331, + "end": 11339, "loc": { "start": { "line": 266, @@ -71357,8 +71357,8 @@ "binop": null, "updateContext": null }, - "start": 11337, - "end": 11338, + "start": 11339, + "end": 11340, "loc": { "start": { "line": 266, @@ -71383,8 +71383,8 @@ "binop": null }, "value": "stats", - "start": 11359, - "end": 11364, + "start": 11361, + "end": 11366, "loc": { "start": { "line": 267, @@ -71409,8 +71409,8 @@ "binop": null, "updateContext": null }, - "start": 11364, - "end": 11365, + "start": 11366, + "end": 11367, "loc": { "start": { "line": 267, @@ -71435,8 +71435,8 @@ "binop": null }, "value": "log", - "start": 11386, - "end": 11389, + "start": 11388, + "end": 11391, "loc": { "start": { "line": 268, @@ -71460,8 +71460,8 @@ "postfix": false, "binop": null }, - "start": 11406, - "end": 11407, + "start": 11408, + "end": 11409, "loc": { "start": { "line": 269, @@ -71485,8 +71485,8 @@ "postfix": false, "binop": null }, - "start": 11407, - "end": 11408, + "start": 11409, + "end": 11410, "loc": { "start": { "line": 269, @@ -71511,8 +71511,8 @@ "binop": null, "updateContext": null }, - "start": 11408, - "end": 11409, + "start": 11410, + "end": 11411, "loc": { "start": { "line": 269, @@ -71539,8 +71539,8 @@ "updateContext": null }, "value": "break", - "start": 11426, - "end": 11431, + "start": 11428, + "end": 11433, "loc": { "start": { "line": 270, @@ -71565,8 +71565,8 @@ "binop": null, "updateContext": null }, - "start": 11431, - "end": 11432, + "start": 11433, + "end": 11434, "loc": { "start": { "line": 270, @@ -71581,8 +71581,8 @@ { "type": "CommentLine", "value": " case \"gltf\":", - "start": 11446, - "end": 11461, + "start": 11448, + "end": 11463, "loc": { "start": { "line": 272, @@ -71597,8 +71597,8 @@ { "type": "CommentLine", "value": " const gltfJSON = JSON.parse(sourceData);", - "start": 11474, - "end": 11521, + "start": 11476, + "end": 11523, "loc": { "start": { "line": 273, @@ -71613,8 +71613,8 @@ { "type": "CommentLine", "value": " const gltfBasePath = source ? getBasePath(source) : \"\";", - "start": 11534, - "end": 11596, + "start": 11536, + "end": 11598, "loc": { "start": { "line": 274, @@ -71629,8 +71629,8 @@ { "type": "CommentLine", "value": " convert(parseGLTFIntoXKTModel, {", - "start": 11609, - "end": 11648, + "start": 11611, + "end": 11650, "loc": { "start": { "line": 275, @@ -71645,8 +71645,8 @@ { "type": "CommentLine", "value": " baseUri: gltfBasePath,", - "start": 11661, - "end": 11694, + "start": 11663, + "end": 11696, "loc": { "start": { "line": 276, @@ -71661,8 +71661,8 @@ { "type": "CommentLine", "value": " data: gltfJSON,", - "start": 11707, - "end": 11733, + "start": 11709, + "end": 11735, "loc": { "start": { "line": 277, @@ -71677,8 +71677,8 @@ { "type": "CommentLine", "value": " reuseGeometries,", - "start": 11746, - "end": 11773, + "start": 11748, + "end": 11775, "loc": { "start": { "line": 278, @@ -71693,8 +71693,8 @@ { "type": "CommentLine", "value": " includeTextures,", - "start": 11786, - "end": 11813, + "start": 11788, + "end": 11815, "loc": { "start": { "line": 279, @@ -71709,8 +71709,8 @@ { "type": "CommentLine", "value": " includeNormals,", - "start": 11826, - "end": 11852, + "start": 11828, + "end": 11854, "loc": { "start": { "line": 280, @@ -71725,8 +71725,8 @@ { "type": "CommentLine", "value": " metaModelData: metaModelJSON,", - "start": 11865, - "end": 11905, + "start": 11867, + "end": 11907, "loc": { "start": { "line": 281, @@ -71741,8 +71741,8 @@ { "type": "CommentLine", "value": " xktModel,", - "start": 11918, - "end": 11938, + "start": 11920, + "end": 11940, "loc": { "start": { "line": 282, @@ -71757,8 +71757,8 @@ { "type": "CommentLine", "value": " getAttachment: async (name) => {", - "start": 11951, - "end": 11994, + "start": 11953, + "end": 11996, "loc": { "start": { "line": 283, @@ -71773,8 +71773,8 @@ { "type": "CommentLine", "value": " const filePath = gltfBasePath + name;", - "start": 12007, - "end": 12059, + "start": 12009, + "end": 12061, "loc": { "start": { "line": 284, @@ -71789,8 +71789,8 @@ { "type": "CommentLine", "value": " log(`Reading attachment file: ${filePath}`);", - "start": 12072, - "end": 12131, + "start": 12074, + "end": 12133, "loc": { "start": { "line": 285, @@ -71805,8 +71805,8 @@ { "type": "CommentLine", "value": " const buffer = fs.readFileSync(filePath);", - "start": 12144, - "end": 12200, + "start": 12146, + "end": 12202, "loc": { "start": { "line": 286, @@ -71821,8 +71821,8 @@ { "type": "CommentLine", "value": " const arrayBuf = toArrayBuffer(buffer);", - "start": 12213, - "end": 12267, + "start": 12215, + "end": 12269, "loc": { "start": { "line": 287, @@ -71837,8 +71837,8 @@ { "type": "CommentLine", "value": " return arrayBuf;", - "start": 12280, - "end": 12311, + "start": 12282, + "end": 12313, "loc": { "start": { "line": 288, @@ -71853,8 +71853,8 @@ { "type": "CommentLine", "value": " },", - "start": 12324, - "end": 12337, + "start": 12326, + "end": 12339, "loc": { "start": { "line": 289, @@ -71869,8 +71869,8 @@ { "type": "CommentLine", "value": " stats,", - "start": 12350, - "end": 12367, + "start": 12352, + "end": 12369, "loc": { "start": { "line": 290, @@ -71885,8 +71885,8 @@ { "type": "CommentLine", "value": " log", - "start": 12380, - "end": 12394, + "start": 12382, + "end": 12396, "loc": { "start": { "line": 291, @@ -71901,8 +71901,8 @@ { "type": "CommentLine", "value": " });", - "start": 12407, - "end": 12417, + "start": 12409, + "end": 12419, "loc": { "start": { "line": 292, @@ -71917,8 +71917,8 @@ { "type": "CommentLine", "value": " break;", - "start": 12430, - "end": 12443, + "start": 12432, + "end": 12445, "loc": { "start": { "line": 293, @@ -71945,8 +71945,8 @@ "updateContext": null }, "value": "case", - "start": 12457, - "end": 12461, + "start": 12459, + "end": 12463, "loc": { "start": { "line": 295, @@ -71972,8 +71972,8 @@ "updateContext": null }, "value": "ifc", - "start": 12462, - "end": 12467, + "start": 12464, + "end": 12469, "loc": { "start": { "line": 295, @@ -71998,8 +71998,8 @@ "binop": null, "updateContext": null }, - "start": 12467, - "end": 12468, + "start": 12469, + "end": 12470, "loc": { "start": { "line": 295, @@ -72024,8 +72024,8 @@ "binop": null }, "value": "convert", - "start": 12485, - "end": 12492, + "start": 12487, + "end": 12494, "loc": { "start": { "line": 296, @@ -72049,8 +72049,8 @@ "postfix": false, "binop": null }, - "start": 12492, - "end": 12493, + "start": 12494, + "end": 12495, "loc": { "start": { "line": 296, @@ -72075,8 +72075,8 @@ "binop": null }, "value": "parseIFCIntoXKTModel", - "start": 12493, - "end": 12513, + "start": 12495, + "end": 12515, "loc": { "start": { "line": 296, @@ -72101,8 +72101,8 @@ "binop": null, "updateContext": null }, - "start": 12513, - "end": 12514, + "start": 12515, + "end": 12516, "loc": { "start": { "line": 296, @@ -72126,8 +72126,8 @@ "postfix": false, "binop": null }, - "start": 12515, - "end": 12516, + "start": 12517, + "end": 12518, "loc": { "start": { "line": 296, @@ -72152,8 +72152,8 @@ "binop": null }, "value": "WebIFC", - "start": 12537, - "end": 12543, + "start": 12539, + "end": 12545, "loc": { "start": { "line": 297, @@ -72178,8 +72178,8 @@ "binop": null, "updateContext": null }, - "start": 12543, - "end": 12544, + "start": 12545, + "end": 12546, "loc": { "start": { "line": 297, @@ -72204,8 +72204,8 @@ "binop": null }, "value": "data", - "start": 12565, - "end": 12569, + "start": 12567, + "end": 12571, "loc": { "start": { "line": 298, @@ -72230,8 +72230,8 @@ "binop": null, "updateContext": null }, - "start": 12569, - "end": 12570, + "start": 12571, + "end": 12572, "loc": { "start": { "line": 298, @@ -72256,8 +72256,8 @@ "binop": null }, "value": "sourceData", - "start": 12571, - "end": 12581, + "start": 12573, + "end": 12583, "loc": { "start": { "line": 298, @@ -72282,8 +72282,8 @@ "binop": null, "updateContext": null }, - "start": 12581, - "end": 12582, + "start": 12583, + "end": 12584, "loc": { "start": { "line": 298, @@ -72308,8 +72308,8 @@ "binop": null }, "value": "xktModel", - "start": 12603, - "end": 12611, + "start": 12605, + "end": 12613, "loc": { "start": { "line": 299, @@ -72334,8 +72334,8 @@ "binop": null, "updateContext": null }, - "start": 12611, - "end": 12612, + "start": 12613, + "end": 12614, "loc": { "start": { "line": 299, @@ -72360,8 +72360,8 @@ "binop": null }, "value": "wasmPath", - "start": 12633, - "end": 12641, + "start": 12635, + "end": 12643, "loc": { "start": { "line": 300, @@ -72386,8 +72386,8 @@ "binop": null, "updateContext": null }, - "start": 12641, - "end": 12642, + "start": 12643, + "end": 12644, "loc": { "start": { "line": 300, @@ -72413,8 +72413,8 @@ "updateContext": null }, "value": "./", - "start": 12643, - "end": 12647, + "start": 12645, + "end": 12649, "loc": { "start": { "line": 300, @@ -72439,8 +72439,8 @@ "binop": null, "updateContext": null }, - "start": 12647, - "end": 12648, + "start": 12649, + "end": 12650, "loc": { "start": { "line": 300, @@ -72465,8 +72465,8 @@ "binop": null }, "value": "includeTypes", - "start": 12669, - "end": 12681, + "start": 12671, + "end": 12683, "loc": { "start": { "line": 301, @@ -72491,8 +72491,8 @@ "binop": null, "updateContext": null }, - "start": 12681, - "end": 12682, + "start": 12683, + "end": 12684, "loc": { "start": { "line": 301, @@ -72517,8 +72517,8 @@ "binop": null }, "value": "excludeTypes", - "start": 12703, - "end": 12715, + "start": 12705, + "end": 12717, "loc": { "start": { "line": 302, @@ -72543,8 +72543,8 @@ "binop": null, "updateContext": null }, - "start": 12715, - "end": 12716, + "start": 12717, + "end": 12718, "loc": { "start": { "line": 302, @@ -72569,8 +72569,8 @@ "binop": null }, "value": "stats", - "start": 12737, - "end": 12742, + "start": 12739, + "end": 12744, "loc": { "start": { "line": 303, @@ -72595,8 +72595,8 @@ "binop": null, "updateContext": null }, - "start": 12742, - "end": 12743, + "start": 12744, + "end": 12745, "loc": { "start": { "line": 303, @@ -72621,8 +72621,8 @@ "binop": null }, "value": "log", - "start": 12764, - "end": 12767, + "start": 12766, + "end": 12769, "loc": { "start": { "line": 304, @@ -72646,8 +72646,8 @@ "postfix": false, "binop": null }, - "start": 12784, - "end": 12785, + "start": 12786, + "end": 12787, "loc": { "start": { "line": 305, @@ -72671,8 +72671,8 @@ "postfix": false, "binop": null }, - "start": 12785, - "end": 12786, + "start": 12787, + "end": 12788, "loc": { "start": { "line": 305, @@ -72697,8 +72697,8 @@ "binop": null, "updateContext": null }, - "start": 12786, - "end": 12787, + "start": 12788, + "end": 12789, "loc": { "start": { "line": 305, @@ -72725,8 +72725,8 @@ "updateContext": null }, "value": "break", - "start": 12804, - "end": 12809, + "start": 12806, + "end": 12811, "loc": { "start": { "line": 306, @@ -72751,8 +72751,8 @@ "binop": null, "updateContext": null }, - "start": 12809, - "end": 12810, + "start": 12811, + "end": 12812, "loc": { "start": { "line": 306, @@ -72779,8 +72779,8 @@ "updateContext": null }, "value": "case", - "start": 12824, - "end": 12828, + "start": 12826, + "end": 12830, "loc": { "start": { "line": 308, @@ -72806,8 +72806,8 @@ "updateContext": null }, "value": "laz", - "start": 12829, - "end": 12834, + "start": 12831, + "end": 12836, "loc": { "start": { "line": 308, @@ -72832,8 +72832,8 @@ "binop": null, "updateContext": null }, - "start": 12834, - "end": 12835, + "start": 12836, + "end": 12837, "loc": { "start": { "line": 308, @@ -72858,8 +72858,8 @@ "binop": null }, "value": "convert", - "start": 12852, - "end": 12859, + "start": 12854, + "end": 12861, "loc": { "start": { "line": 309, @@ -72883,8 +72883,8 @@ "postfix": false, "binop": null }, - "start": 12859, - "end": 12860, + "start": 12861, + "end": 12862, "loc": { "start": { "line": 309, @@ -72909,8 +72909,8 @@ "binop": null }, "value": "parseLASIntoXKTModel", - "start": 12860, - "end": 12880, + "start": 12862, + "end": 12882, "loc": { "start": { "line": 309, @@ -72935,8 +72935,8 @@ "binop": null, "updateContext": null }, - "start": 12880, - "end": 12881, + "start": 12882, + "end": 12883, "loc": { "start": { "line": 309, @@ -72960,8 +72960,8 @@ "postfix": false, "binop": null }, - "start": 12882, - "end": 12883, + "start": 12884, + "end": 12885, "loc": { "start": { "line": 309, @@ -72986,8 +72986,8 @@ "binop": null }, "value": "data", - "start": 12904, - "end": 12908, + "start": 12906, + "end": 12910, "loc": { "start": { "line": 310, @@ -73012,8 +73012,8 @@ "binop": null, "updateContext": null }, - "start": 12908, - "end": 12909, + "start": 12910, + "end": 12911, "loc": { "start": { "line": 310, @@ -73038,8 +73038,8 @@ "binop": null }, "value": "sourceData", - "start": 12910, - "end": 12920, + "start": 12912, + "end": 12922, "loc": { "start": { "line": 310, @@ -73064,8 +73064,8 @@ "binop": null, "updateContext": null }, - "start": 12920, - "end": 12921, + "start": 12922, + "end": 12923, "loc": { "start": { "line": 310, @@ -73090,8 +73090,8 @@ "binop": null }, "value": "xktModel", - "start": 12942, - "end": 12950, + "start": 12944, + "end": 12952, "loc": { "start": { "line": 311, @@ -73116,8 +73116,8 @@ "binop": null, "updateContext": null }, - "start": 12950, - "end": 12951, + "start": 12952, + "end": 12953, "loc": { "start": { "line": 311, @@ -73142,8 +73142,8 @@ "binop": null }, "value": "stats", - "start": 12972, - "end": 12977, + "start": 12974, + "end": 12979, "loc": { "start": { "line": 312, @@ -73168,8 +73168,8 @@ "binop": null, "updateContext": null }, - "start": 12977, - "end": 12978, + "start": 12979, + "end": 12980, "loc": { "start": { "line": 312, @@ -73194,8 +73194,8 @@ "binop": null }, "value": "fp64", - "start": 12999, - "end": 13003, + "start": 13001, + "end": 13005, "loc": { "start": { "line": 313, @@ -73220,8 +73220,8 @@ "binop": null, "updateContext": null }, - "start": 13003, - "end": 13004, + "start": 13005, + "end": 13006, "loc": { "start": { "line": 313, @@ -73246,8 +73246,8 @@ "binop": null }, "value": "fileTypeConfigs", - "start": 13005, - "end": 13020, + "start": 13007, + "end": 13022, "loc": { "start": { "line": 313, @@ -73272,8 +73272,8 @@ "binop": null, "updateContext": null }, - "start": 13020, - "end": 13021, + "start": 13022, + "end": 13023, "loc": { "start": { "line": 313, @@ -73298,8 +73298,8 @@ "binop": null }, "value": "fp64", - "start": 13021, - "end": 13025, + "start": 13023, + "end": 13027, "loc": { "start": { "line": 313, @@ -73324,8 +73324,8 @@ "binop": null, "updateContext": null }, - "start": 13025, - "end": 13026, + "start": 13027, + "end": 13028, "loc": { "start": { "line": 313, @@ -73350,8 +73350,8 @@ "binop": null }, "value": "colorDepth", - "start": 13047, - "end": 13057, + "start": 13049, + "end": 13059, "loc": { "start": { "line": 314, @@ -73376,8 +73376,8 @@ "binop": null, "updateContext": null }, - "start": 13057, - "end": 13058, + "start": 13059, + "end": 13060, "loc": { "start": { "line": 314, @@ -73402,8 +73402,8 @@ "binop": null }, "value": "fileTypeConfigs", - "start": 13059, - "end": 13074, + "start": 13061, + "end": 13076, "loc": { "start": { "line": 314, @@ -73428,8 +73428,8 @@ "binop": null, "updateContext": null }, - "start": 13074, - "end": 13075, + "start": 13076, + "end": 13077, "loc": { "start": { "line": 314, @@ -73454,8 +73454,8 @@ "binop": null }, "value": "colorDepth", - "start": 13075, - "end": 13085, + "start": 13077, + "end": 13087, "loc": { "start": { "line": 314, @@ -73480,8 +73480,8 @@ "binop": null, "updateContext": null }, - "start": 13085, - "end": 13086, + "start": 13087, + "end": 13088, "loc": { "start": { "line": 314, @@ -73506,8 +73506,8 @@ "binop": null }, "value": "center", - "start": 13107, - "end": 13113, + "start": 13109, + "end": 13115, "loc": { "start": { "line": 315, @@ -73532,8 +73532,8 @@ "binop": null, "updateContext": null }, - "start": 13113, - "end": 13114, + "start": 13115, + "end": 13116, "loc": { "start": { "line": 315, @@ -73558,8 +73558,8 @@ "binop": null }, "value": "fileTypeConfigs", - "start": 13115, - "end": 13130, + "start": 13117, + "end": 13132, "loc": { "start": { "line": 315, @@ -73584,8 +73584,8 @@ "binop": null, "updateContext": null }, - "start": 13130, - "end": 13131, + "start": 13132, + "end": 13133, "loc": { "start": { "line": 315, @@ -73610,8 +73610,8 @@ "binop": null }, "value": "center", - "start": 13131, - "end": 13137, + "start": 13133, + "end": 13139, "loc": { "start": { "line": 315, @@ -73636,8 +73636,8 @@ "binop": null, "updateContext": null }, - "start": 13137, - "end": 13138, + "start": 13139, + "end": 13140, "loc": { "start": { "line": 315, @@ -73662,8 +73662,8 @@ "binop": null }, "value": "transform", - "start": 13159, - "end": 13168, + "start": 13161, + "end": 13170, "loc": { "start": { "line": 316, @@ -73688,8 +73688,8 @@ "binop": null, "updateContext": null }, - "start": 13168, - "end": 13169, + "start": 13170, + "end": 13171, "loc": { "start": { "line": 316, @@ -73714,8 +73714,8 @@ "binop": null }, "value": "fileTypeConfigs", - "start": 13170, - "end": 13185, + "start": 13172, + "end": 13187, "loc": { "start": { "line": 316, @@ -73740,8 +73740,8 @@ "binop": null, "updateContext": null }, - "start": 13185, - "end": 13186, + "start": 13187, + "end": 13188, "loc": { "start": { "line": 316, @@ -73766,8 +73766,8 @@ "binop": null }, "value": "transform", - "start": 13186, - "end": 13195, + "start": 13188, + "end": 13197, "loc": { "start": { "line": 316, @@ -73792,8 +73792,8 @@ "binop": null, "updateContext": null }, - "start": 13195, - "end": 13196, + "start": 13197, + "end": 13198, "loc": { "start": { "line": 316, @@ -73818,8 +73818,8 @@ "binop": null }, "value": "skip", - "start": 13217, - "end": 13221, + "start": 13219, + "end": 13223, "loc": { "start": { "line": 317, @@ -73844,8 +73844,8 @@ "binop": null, "updateContext": null }, - "start": 13221, - "end": 13222, + "start": 13223, + "end": 13224, "loc": { "start": { "line": 317, @@ -73870,8 +73870,8 @@ "binop": null }, "value": "overrideOption", - "start": 13223, - "end": 13237, + "start": 13225, + "end": 13239, "loc": { "start": { "line": 317, @@ -73895,8 +73895,8 @@ "postfix": false, "binop": null }, - "start": 13237, - "end": 13238, + "start": 13239, + "end": 13240, "loc": { "start": { "line": 317, @@ -73921,8 +73921,8 @@ "binop": null }, "value": "fileTypeConfigs", - "start": 13238, - "end": 13253, + "start": 13240, + "end": 13255, "loc": { "start": { "line": 317, @@ -73947,8 +73947,8 @@ "binop": null, "updateContext": null }, - "start": 13253, - "end": 13254, + "start": 13255, + "end": 13256, "loc": { "start": { "line": 317, @@ -73973,8 +73973,8 @@ "binop": null }, "value": "skip", - "start": 13254, - "end": 13258, + "start": 13256, + "end": 13260, "loc": { "start": { "line": 317, @@ -73999,8 +73999,8 @@ "binop": null, "updateContext": null }, - "start": 13258, - "end": 13259, + "start": 13260, + "end": 13261, "loc": { "start": { "line": 317, @@ -74026,8 +74026,8 @@ "updateContext": null }, "value": 1, - "start": 13260, - "end": 13261, + "start": 13262, + "end": 13263, "loc": { "start": { "line": 317, @@ -74051,8 +74051,8 @@ "postfix": false, "binop": null }, - "start": 13261, - "end": 13262, + "start": 13263, + "end": 13264, "loc": { "start": { "line": 317, @@ -74077,8 +74077,8 @@ "binop": null, "updateContext": null }, - "start": 13262, - "end": 13263, + "start": 13264, + "end": 13265, "loc": { "start": { "line": 317, @@ -74103,8 +74103,8 @@ "binop": null }, "value": "log", - "start": 13284, - "end": 13287, + "start": 13286, + "end": 13289, "loc": { "start": { "line": 318, @@ -74128,8 +74128,8 @@ "postfix": false, "binop": null }, - "start": 13304, - "end": 13305, + "start": 13306, + "end": 13307, "loc": { "start": { "line": 319, @@ -74153,8 +74153,8 @@ "postfix": false, "binop": null }, - "start": 13305, - "end": 13306, + "start": 13307, + "end": 13308, "loc": { "start": { "line": 319, @@ -74179,8 +74179,8 @@ "binop": null, "updateContext": null }, - "start": 13306, - "end": 13307, + "start": 13308, + "end": 13309, "loc": { "start": { "line": 319, @@ -74207,8 +74207,8 @@ "updateContext": null }, "value": "break", - "start": 13324, - "end": 13329, + "start": 13326, + "end": 13331, "loc": { "start": { "line": 320, @@ -74233,8 +74233,8 @@ "binop": null, "updateContext": null }, - "start": 13329, - "end": 13330, + "start": 13331, + "end": 13332, "loc": { "start": { "line": 320, @@ -74261,8 +74261,8 @@ "updateContext": null }, "value": "case", - "start": 13344, - "end": 13348, + "start": 13346, + "end": 13350, "loc": { "start": { "line": 322, @@ -74288,8 +74288,8 @@ "updateContext": null }, "value": "las", - "start": 13349, - "end": 13354, + "start": 13351, + "end": 13356, "loc": { "start": { "line": 322, @@ -74314,8 +74314,8 @@ "binop": null, "updateContext": null }, - "start": 13354, - "end": 13355, + "start": 13356, + "end": 13357, "loc": { "start": { "line": 322, @@ -74340,8 +74340,8 @@ "binop": null }, "value": "convert", - "start": 13372, - "end": 13379, + "start": 13374, + "end": 13381, "loc": { "start": { "line": 323, @@ -74365,8 +74365,8 @@ "postfix": false, "binop": null }, - "start": 13379, - "end": 13380, + "start": 13381, + "end": 13382, "loc": { "start": { "line": 323, @@ -74391,8 +74391,8 @@ "binop": null }, "value": "parseLASIntoXKTModel", - "start": 13380, - "end": 13400, + "start": 13382, + "end": 13402, "loc": { "start": { "line": 323, @@ -74417,8 +74417,8 @@ "binop": null, "updateContext": null }, - "start": 13400, - "end": 13401, + "start": 13402, + "end": 13403, "loc": { "start": { "line": 323, @@ -74442,8 +74442,8 @@ "postfix": false, "binop": null }, - "start": 13402, - "end": 13403, + "start": 13404, + "end": 13405, "loc": { "start": { "line": 323, @@ -74468,8 +74468,8 @@ "binop": null }, "value": "data", - "start": 13424, - "end": 13428, + "start": 13426, + "end": 13430, "loc": { "start": { "line": 324, @@ -74494,8 +74494,8 @@ "binop": null, "updateContext": null }, - "start": 13428, - "end": 13429, + "start": 13430, + "end": 13431, "loc": { "start": { "line": 324, @@ -74520,8 +74520,8 @@ "binop": null }, "value": "sourceData", - "start": 13430, - "end": 13440, + "start": 13432, + "end": 13442, "loc": { "start": { "line": 324, @@ -74546,8 +74546,8 @@ "binop": null, "updateContext": null }, - "start": 13440, - "end": 13441, + "start": 13442, + "end": 13443, "loc": { "start": { "line": 324, @@ -74572,8 +74572,8 @@ "binop": null }, "value": "xktModel", - "start": 13462, - "end": 13470, + "start": 13464, + "end": 13472, "loc": { "start": { "line": 325, @@ -74598,8 +74598,8 @@ "binop": null, "updateContext": null }, - "start": 13470, - "end": 13471, + "start": 13472, + "end": 13473, "loc": { "start": { "line": 325, @@ -74624,8 +74624,8 @@ "binop": null }, "value": "stats", - "start": 13492, - "end": 13497, + "start": 13494, + "end": 13499, "loc": { "start": { "line": 326, @@ -74650,8 +74650,8 @@ "binop": null, "updateContext": null }, - "start": 13497, - "end": 13498, + "start": 13499, + "end": 13500, "loc": { "start": { "line": 326, @@ -74676,8 +74676,8 @@ "binop": null }, "value": "fp64", - "start": 13519, - "end": 13523, + "start": 13521, + "end": 13525, "loc": { "start": { "line": 327, @@ -74702,8 +74702,8 @@ "binop": null, "updateContext": null }, - "start": 13523, - "end": 13524, + "start": 13525, + "end": 13526, "loc": { "start": { "line": 327, @@ -74728,8 +74728,8 @@ "binop": null }, "value": "fileTypeConfigs", - "start": 13525, - "end": 13540, + "start": 13527, + "end": 13542, "loc": { "start": { "line": 327, @@ -74754,8 +74754,8 @@ "binop": null, "updateContext": null }, - "start": 13540, - "end": 13541, + "start": 13542, + "end": 13543, "loc": { "start": { "line": 327, @@ -74780,8 +74780,8 @@ "binop": null }, "value": "fp64", - "start": 13541, - "end": 13545, + "start": 13543, + "end": 13547, "loc": { "start": { "line": 327, @@ -74806,8 +74806,8 @@ "binop": null, "updateContext": null }, - "start": 13545, - "end": 13546, + "start": 13547, + "end": 13548, "loc": { "start": { "line": 327, @@ -74832,8 +74832,8 @@ "binop": null }, "value": "colorDepth", - "start": 13567, - "end": 13577, + "start": 13569, + "end": 13579, "loc": { "start": { "line": 328, @@ -74858,8 +74858,8 @@ "binop": null, "updateContext": null }, - "start": 13577, - "end": 13578, + "start": 13579, + "end": 13580, "loc": { "start": { "line": 328, @@ -74884,8 +74884,8 @@ "binop": null }, "value": "fileTypeConfigs", - "start": 13579, - "end": 13594, + "start": 13581, + "end": 13596, "loc": { "start": { "line": 328, @@ -74910,8 +74910,8 @@ "binop": null, "updateContext": null }, - "start": 13594, - "end": 13595, + "start": 13596, + "end": 13597, "loc": { "start": { "line": 328, @@ -74936,8 +74936,8 @@ "binop": null }, "value": "colorDepth", - "start": 13595, - "end": 13605, + "start": 13597, + "end": 13607, "loc": { "start": { "line": 328, @@ -74962,8 +74962,8 @@ "binop": null, "updateContext": null }, - "start": 13605, - "end": 13606, + "start": 13607, + "end": 13608, "loc": { "start": { "line": 328, @@ -74988,8 +74988,8 @@ "binop": null }, "value": "center", - "start": 13627, - "end": 13633, + "start": 13629, + "end": 13635, "loc": { "start": { "line": 329, @@ -75014,8 +75014,8 @@ "binop": null, "updateContext": null }, - "start": 13633, - "end": 13634, + "start": 13635, + "end": 13636, "loc": { "start": { "line": 329, @@ -75040,8 +75040,8 @@ "binop": null }, "value": "fileTypeConfigs", - "start": 13635, - "end": 13650, + "start": 13637, + "end": 13652, "loc": { "start": { "line": 329, @@ -75066,8 +75066,8 @@ "binop": null, "updateContext": null }, - "start": 13650, - "end": 13651, + "start": 13652, + "end": 13653, "loc": { "start": { "line": 329, @@ -75092,8 +75092,8 @@ "binop": null }, "value": "center", - "start": 13651, - "end": 13657, + "start": 13653, + "end": 13659, "loc": { "start": { "line": 329, @@ -75118,8 +75118,8 @@ "binop": null, "updateContext": null }, - "start": 13657, - "end": 13658, + "start": 13659, + "end": 13660, "loc": { "start": { "line": 329, @@ -75144,8 +75144,8 @@ "binop": null }, "value": "transform", - "start": 13679, - "end": 13688, + "start": 13681, + "end": 13690, "loc": { "start": { "line": 330, @@ -75170,8 +75170,8 @@ "binop": null, "updateContext": null }, - "start": 13688, - "end": 13689, + "start": 13690, + "end": 13691, "loc": { "start": { "line": 330, @@ -75196,8 +75196,8 @@ "binop": null }, "value": "fileTypeConfigs", - "start": 13690, - "end": 13705, + "start": 13692, + "end": 13707, "loc": { "start": { "line": 330, @@ -75222,8 +75222,8 @@ "binop": null, "updateContext": null }, - "start": 13705, - "end": 13706, + "start": 13707, + "end": 13708, "loc": { "start": { "line": 330, @@ -75248,8 +75248,8 @@ "binop": null }, "value": "transform", - "start": 13706, - "end": 13715, + "start": 13708, + "end": 13717, "loc": { "start": { "line": 330, @@ -75274,8 +75274,8 @@ "binop": null, "updateContext": null }, - "start": 13715, - "end": 13716, + "start": 13717, + "end": 13718, "loc": { "start": { "line": 330, @@ -75300,8 +75300,8 @@ "binop": null }, "value": "skip", - "start": 13737, - "end": 13741, + "start": 13739, + "end": 13743, "loc": { "start": { "line": 331, @@ -75326,8 +75326,8 @@ "binop": null, "updateContext": null }, - "start": 13741, - "end": 13742, + "start": 13743, + "end": 13744, "loc": { "start": { "line": 331, @@ -75352,8 +75352,8 @@ "binop": null }, "value": "overrideOption", - "start": 13743, - "end": 13757, + "start": 13745, + "end": 13759, "loc": { "start": { "line": 331, @@ -75377,8 +75377,8 @@ "postfix": false, "binop": null }, - "start": 13757, - "end": 13758, + "start": 13759, + "end": 13760, "loc": { "start": { "line": 331, @@ -75403,8 +75403,8 @@ "binop": null }, "value": "fileTypeConfigs", - "start": 13758, - "end": 13773, + "start": 13760, + "end": 13775, "loc": { "start": { "line": 331, @@ -75429,8 +75429,8 @@ "binop": null, "updateContext": null }, - "start": 13773, - "end": 13774, + "start": 13775, + "end": 13776, "loc": { "start": { "line": 331, @@ -75455,8 +75455,8 @@ "binop": null }, "value": "skip", - "start": 13774, - "end": 13778, + "start": 13776, + "end": 13780, "loc": { "start": { "line": 331, @@ -75481,8 +75481,8 @@ "binop": null, "updateContext": null }, - "start": 13778, - "end": 13779, + "start": 13780, + "end": 13781, "loc": { "start": { "line": 331, @@ -75508,8 +75508,8 @@ "updateContext": null }, "value": 1, - "start": 13780, - "end": 13781, + "start": 13782, + "end": 13783, "loc": { "start": { "line": 331, @@ -75533,8 +75533,8 @@ "postfix": false, "binop": null }, - "start": 13781, - "end": 13782, + "start": 13783, + "end": 13784, "loc": { "start": { "line": 331, @@ -75559,8 +75559,8 @@ "binop": null, "updateContext": null }, - "start": 13782, - "end": 13783, + "start": 13784, + "end": 13785, "loc": { "start": { "line": 331, @@ -75585,8 +75585,8 @@ "binop": null }, "value": "log", - "start": 13804, - "end": 13807, + "start": 13806, + "end": 13809, "loc": { "start": { "line": 332, @@ -75610,8 +75610,8 @@ "postfix": false, "binop": null }, - "start": 13824, - "end": 13825, + "start": 13826, + "end": 13827, "loc": { "start": { "line": 333, @@ -75635,8 +75635,8 @@ "postfix": false, "binop": null }, - "start": 13825, - "end": 13826, + "start": 13827, + "end": 13828, "loc": { "start": { "line": 333, @@ -75661,8 +75661,8 @@ "binop": null, "updateContext": null }, - "start": 13826, - "end": 13827, + "start": 13828, + "end": 13829, "loc": { "start": { "line": 333, @@ -75689,8 +75689,8 @@ "updateContext": null }, "value": "break", - "start": 13844, - "end": 13849, + "start": 13846, + "end": 13851, "loc": { "start": { "line": 334, @@ -75715,8 +75715,8 @@ "binop": null, "updateContext": null }, - "start": 13849, - "end": 13850, + "start": 13851, + "end": 13852, "loc": { "start": { "line": 334, @@ -75743,8 +75743,8 @@ "updateContext": null }, "value": "case", - "start": 13864, - "end": 13868, + "start": 13866, + "end": 13870, "loc": { "start": { "line": 336, @@ -75770,8 +75770,8 @@ "updateContext": null }, "value": "pcd", - "start": 13869, - "end": 13874, + "start": 13871, + "end": 13876, "loc": { "start": { "line": 336, @@ -75796,8 +75796,8 @@ "binop": null, "updateContext": null }, - "start": 13874, - "end": 13875, + "start": 13876, + "end": 13877, "loc": { "start": { "line": 336, @@ -75822,8 +75822,8 @@ "binop": null }, "value": "convert", - "start": 13892, - "end": 13899, + "start": 13894, + "end": 13901, "loc": { "start": { "line": 337, @@ -75847,8 +75847,8 @@ "postfix": false, "binop": null }, - "start": 13899, - "end": 13900, + "start": 13901, + "end": 13902, "loc": { "start": { "line": 337, @@ -75873,8 +75873,8 @@ "binop": null }, "value": "parsePCDIntoXKTModel", - "start": 13900, - "end": 13920, + "start": 13902, + "end": 13922, "loc": { "start": { "line": 337, @@ -75899,8 +75899,8 @@ "binop": null, "updateContext": null }, - "start": 13920, - "end": 13921, + "start": 13922, + "end": 13923, "loc": { "start": { "line": 337, @@ -75924,8 +75924,8 @@ "postfix": false, "binop": null }, - "start": 13922, - "end": 13923, + "start": 13924, + "end": 13925, "loc": { "start": { "line": 337, @@ -75950,8 +75950,8 @@ "binop": null }, "value": "data", - "start": 13944, - "end": 13948, + "start": 13946, + "end": 13950, "loc": { "start": { "line": 338, @@ -75976,8 +75976,8 @@ "binop": null, "updateContext": null }, - "start": 13948, - "end": 13949, + "start": 13950, + "end": 13951, "loc": { "start": { "line": 338, @@ -76002,8 +76002,8 @@ "binop": null }, "value": "sourceData", - "start": 13950, - "end": 13960, + "start": 13952, + "end": 13962, "loc": { "start": { "line": 338, @@ -76028,8 +76028,8 @@ "binop": null, "updateContext": null }, - "start": 13960, - "end": 13961, + "start": 13962, + "end": 13963, "loc": { "start": { "line": 338, @@ -76054,8 +76054,8 @@ "binop": null }, "value": "xktModel", - "start": 13982, - "end": 13990, + "start": 13984, + "end": 13992, "loc": { "start": { "line": 339, @@ -76080,8 +76080,8 @@ "binop": null, "updateContext": null }, - "start": 13990, - "end": 13991, + "start": 13992, + "end": 13993, "loc": { "start": { "line": 339, @@ -76106,8 +76106,8 @@ "binop": null }, "value": "stats", - "start": 14012, - "end": 14017, + "start": 14014, + "end": 14019, "loc": { "start": { "line": 340, @@ -76132,8 +76132,8 @@ "binop": null, "updateContext": null }, - "start": 14017, - "end": 14018, + "start": 14019, + "end": 14020, "loc": { "start": { "line": 340, @@ -76158,8 +76158,8 @@ "binop": null }, "value": "log", - "start": 14039, - "end": 14042, + "start": 14041, + "end": 14044, "loc": { "start": { "line": 341, @@ -76183,8 +76183,8 @@ "postfix": false, "binop": null }, - "start": 14059, - "end": 14060, + "start": 14061, + "end": 14062, "loc": { "start": { "line": 342, @@ -76208,8 +76208,8 @@ "postfix": false, "binop": null }, - "start": 14060, - "end": 14061, + "start": 14062, + "end": 14063, "loc": { "start": { "line": 342, @@ -76234,8 +76234,8 @@ "binop": null, "updateContext": null }, - "start": 14061, - "end": 14062, + "start": 14063, + "end": 14064, "loc": { "start": { "line": 342, @@ -76262,8 +76262,8 @@ "updateContext": null }, "value": "break", - "start": 14079, - "end": 14084, + "start": 14081, + "end": 14086, "loc": { "start": { "line": 343, @@ -76288,8 +76288,8 @@ "binop": null, "updateContext": null }, - "start": 14084, - "end": 14085, + "start": 14086, + "end": 14087, "loc": { "start": { "line": 343, @@ -76316,8 +76316,8 @@ "updateContext": null }, "value": "case", - "start": 14099, - "end": 14103, + "start": 14101, + "end": 14105, "loc": { "start": { "line": 345, @@ -76343,8 +76343,8 @@ "updateContext": null }, "value": "ply", - "start": 14104, - "end": 14109, + "start": 14106, + "end": 14111, "loc": { "start": { "line": 345, @@ -76369,8 +76369,8 @@ "binop": null, "updateContext": null }, - "start": 14109, - "end": 14110, + "start": 14111, + "end": 14112, "loc": { "start": { "line": 345, @@ -76395,8 +76395,8 @@ "binop": null }, "value": "convert", - "start": 14127, - "end": 14134, + "start": 14129, + "end": 14136, "loc": { "start": { "line": 346, @@ -76420,8 +76420,8 @@ "postfix": false, "binop": null }, - "start": 14134, - "end": 14135, + "start": 14136, + "end": 14137, "loc": { "start": { "line": 346, @@ -76446,8 +76446,8 @@ "binop": null }, "value": "parsePLYIntoXKTModel", - "start": 14135, - "end": 14155, + "start": 14137, + "end": 14157, "loc": { "start": { "line": 346, @@ -76472,8 +76472,8 @@ "binop": null, "updateContext": null }, - "start": 14155, - "end": 14156, + "start": 14157, + "end": 14158, "loc": { "start": { "line": 346, @@ -76497,8 +76497,8 @@ "postfix": false, "binop": null }, - "start": 14157, - "end": 14158, + "start": 14159, + "end": 14160, "loc": { "start": { "line": 346, @@ -76523,8 +76523,8 @@ "binop": null }, "value": "data", - "start": 14179, - "end": 14183, + "start": 14181, + "end": 14185, "loc": { "start": { "line": 347, @@ -76549,8 +76549,8 @@ "binop": null, "updateContext": null }, - "start": 14183, - "end": 14184, + "start": 14185, + "end": 14186, "loc": { "start": { "line": 347, @@ -76575,8 +76575,8 @@ "binop": null }, "value": "sourceData", - "start": 14185, - "end": 14195, + "start": 14187, + "end": 14197, "loc": { "start": { "line": 347, @@ -76601,8 +76601,8 @@ "binop": null, "updateContext": null }, - "start": 14195, - "end": 14196, + "start": 14197, + "end": 14198, "loc": { "start": { "line": 347, @@ -76627,8 +76627,8 @@ "binop": null }, "value": "xktModel", - "start": 14217, - "end": 14225, + "start": 14219, + "end": 14227, "loc": { "start": { "line": 348, @@ -76653,8 +76653,8 @@ "binop": null, "updateContext": null }, - "start": 14225, - "end": 14226, + "start": 14227, + "end": 14228, "loc": { "start": { "line": 348, @@ -76679,8 +76679,8 @@ "binop": null }, "value": "stats", - "start": 14247, - "end": 14252, + "start": 14249, + "end": 14254, "loc": { "start": { "line": 349, @@ -76705,8 +76705,8 @@ "binop": null, "updateContext": null }, - "start": 14252, - "end": 14253, + "start": 14254, + "end": 14255, "loc": { "start": { "line": 349, @@ -76731,8 +76731,8 @@ "binop": null }, "value": "log", - "start": 14274, - "end": 14277, + "start": 14276, + "end": 14279, "loc": { "start": { "line": 350, @@ -76756,8 +76756,8 @@ "postfix": false, "binop": null }, - "start": 14294, - "end": 14295, + "start": 14296, + "end": 14297, "loc": { "start": { "line": 351, @@ -76781,8 +76781,8 @@ "postfix": false, "binop": null }, - "start": 14295, - "end": 14296, + "start": 14297, + "end": 14298, "loc": { "start": { "line": 351, @@ -76807,8 +76807,8 @@ "binop": null, "updateContext": null }, - "start": 14296, - "end": 14297, + "start": 14298, + "end": 14299, "loc": { "start": { "line": 351, @@ -76835,8 +76835,8 @@ "updateContext": null }, "value": "break", - "start": 14314, - "end": 14319, + "start": 14316, + "end": 14321, "loc": { "start": { "line": 352, @@ -76861,8 +76861,8 @@ "binop": null, "updateContext": null }, - "start": 14319, - "end": 14320, + "start": 14321, + "end": 14322, "loc": { "start": { "line": 352, @@ -76889,8 +76889,8 @@ "updateContext": null }, "value": "case", - "start": 14334, - "end": 14338, + "start": 14336, + "end": 14340, "loc": { "start": { "line": 354, @@ -76916,8 +76916,8 @@ "updateContext": null }, "value": "stl", - "start": 14339, - "end": 14344, + "start": 14341, + "end": 14346, "loc": { "start": { "line": 354, @@ -76942,8 +76942,8 @@ "binop": null, "updateContext": null }, - "start": 14344, - "end": 14345, + "start": 14346, + "end": 14347, "loc": { "start": { "line": 354, @@ -76968,8 +76968,8 @@ "binop": null }, "value": "convert", - "start": 14362, - "end": 14369, + "start": 14364, + "end": 14371, "loc": { "start": { "line": 355, @@ -76993,8 +76993,8 @@ "postfix": false, "binop": null }, - "start": 14369, - "end": 14370, + "start": 14371, + "end": 14372, "loc": { "start": { "line": 355, @@ -77019,8 +77019,8 @@ "binop": null }, "value": "parseSTLIntoXKTModel", - "start": 14370, - "end": 14390, + "start": 14372, + "end": 14392, "loc": { "start": { "line": 355, @@ -77045,8 +77045,8 @@ "binop": null, "updateContext": null }, - "start": 14390, - "end": 14391, + "start": 14392, + "end": 14393, "loc": { "start": { "line": 355, @@ -77070,8 +77070,8 @@ "postfix": false, "binop": null }, - "start": 14392, - "end": 14393, + "start": 14394, + "end": 14395, "loc": { "start": { "line": 355, @@ -77096,8 +77096,8 @@ "binop": null }, "value": "data", - "start": 14414, - "end": 14418, + "start": 14416, + "end": 14420, "loc": { "start": { "line": 356, @@ -77122,8 +77122,8 @@ "binop": null, "updateContext": null }, - "start": 14418, - "end": 14419, + "start": 14420, + "end": 14421, "loc": { "start": { "line": 356, @@ -77148,8 +77148,8 @@ "binop": null }, "value": "sourceData", - "start": 14420, - "end": 14430, + "start": 14422, + "end": 14432, "loc": { "start": { "line": 356, @@ -77174,8 +77174,8 @@ "binop": null, "updateContext": null }, - "start": 14430, - "end": 14431, + "start": 14432, + "end": 14433, "loc": { "start": { "line": 356, @@ -77200,8 +77200,8 @@ "binop": null }, "value": "xktModel", - "start": 14452, - "end": 14460, + "start": 14454, + "end": 14462, "loc": { "start": { "line": 357, @@ -77226,8 +77226,8 @@ "binop": null, "updateContext": null }, - "start": 14460, - "end": 14461, + "start": 14462, + "end": 14463, "loc": { "start": { "line": 357, @@ -77252,8 +77252,8 @@ "binop": null }, "value": "stats", - "start": 14482, - "end": 14487, + "start": 14484, + "end": 14489, "loc": { "start": { "line": 358, @@ -77278,8 +77278,8 @@ "binop": null, "updateContext": null }, - "start": 14487, - "end": 14488, + "start": 14489, + "end": 14490, "loc": { "start": { "line": 358, @@ -77304,8 +77304,8 @@ "binop": null }, "value": "log", - "start": 14509, - "end": 14512, + "start": 14511, + "end": 14514, "loc": { "start": { "line": 359, @@ -77329,8 +77329,8 @@ "postfix": false, "binop": null }, - "start": 14529, - "end": 14530, + "start": 14531, + "end": 14532, "loc": { "start": { "line": 360, @@ -77354,8 +77354,8 @@ "postfix": false, "binop": null }, - "start": 14530, - "end": 14531, + "start": 14532, + "end": 14533, "loc": { "start": { "line": 360, @@ -77380,8 +77380,8 @@ "binop": null, "updateContext": null }, - "start": 14531, - "end": 14532, + "start": 14533, + "end": 14534, "loc": { "start": { "line": 360, @@ -77408,8 +77408,8 @@ "updateContext": null }, "value": "break", - "start": 14549, - "end": 14554, + "start": 14551, + "end": 14556, "loc": { "start": { "line": 361, @@ -77434,8 +77434,8 @@ "binop": null, "updateContext": null }, - "start": 14554, - "end": 14555, + "start": 14556, + "end": 14557, "loc": { "start": { "line": 361, @@ -77462,8 +77462,8 @@ "updateContext": null }, "value": "default", - "start": 14569, - "end": 14576, + "start": 14571, + "end": 14578, "loc": { "start": { "line": 363, @@ -77488,8 +77488,8 @@ "binop": null, "updateContext": null }, - "start": 14576, - "end": 14577, + "start": 14578, + "end": 14579, "loc": { "start": { "line": 363, @@ -77514,8 +77514,8 @@ "binop": null }, "value": "reject", - "start": 14594, - "end": 14600, + "start": 14596, + "end": 14602, "loc": { "start": { "line": 364, @@ -77539,8 +77539,8 @@ "postfix": false, "binop": null }, - "start": 14600, - "end": 14601, + "start": 14602, + "end": 14603, "loc": { "start": { "line": 364, @@ -77564,8 +77564,8 @@ "postfix": false, "binop": null }, - "start": 14601, - "end": 14602, + "start": 14603, + "end": 14604, "loc": { "start": { "line": 364, @@ -77591,8 +77591,8 @@ "updateContext": null }, "value": "Error: unsupported source format: \"", - "start": 14602, - "end": 14637, + "start": 14604, + "end": 14639, "loc": { "start": { "line": 364, @@ -77616,8 +77616,8 @@ "postfix": false, "binop": null }, - "start": 14637, - "end": 14639, + "start": 14639, + "end": 14641, "loc": { "start": { "line": 364, @@ -77642,8 +77642,8 @@ "binop": null }, "value": "ext", - "start": 14639, - "end": 14642, + "start": 14641, + "end": 14644, "loc": { "start": { "line": 364, @@ -77667,8 +77667,8 @@ "postfix": false, "binop": null }, - "start": 14642, - "end": 14643, + "start": 14644, + "end": 14645, "loc": { "start": { "line": 364, @@ -77694,8 +77694,8 @@ "updateContext": null }, "value": "\".", - "start": 14643, - "end": 14645, + "start": 14645, + "end": 14647, "loc": { "start": { "line": 364, @@ -77719,8 +77719,8 @@ "postfix": false, "binop": null }, - "start": 14645, - "end": 14646, + "start": 14647, + "end": 14648, "loc": { "start": { "line": 364, @@ -77744,8 +77744,8 @@ "postfix": false, "binop": null }, - "start": 14646, - "end": 14647, + "start": 14648, + "end": 14649, "loc": { "start": { "line": 364, @@ -77770,8 +77770,8 @@ "binop": null, "updateContext": null }, - "start": 14647, - "end": 14648, + "start": 14649, + "end": 14650, "loc": { "start": { "line": 364, @@ -77798,8 +77798,8 @@ "updateContext": null }, "value": "return", - "start": 14665, - "end": 14671, + "start": 14667, + "end": 14673, "loc": { "start": { "line": 365, @@ -77824,8 +77824,8 @@ "binop": null, "updateContext": null }, - "start": 14671, - "end": 14672, + "start": 14673, + "end": 14674, "loc": { "start": { "line": 365, @@ -77849,8 +77849,8 @@ "postfix": false, "binop": null }, - "start": 14681, - "end": 14682, + "start": 14683, + "end": 14684, "loc": { "start": { "line": 366, @@ -77876,8 +77876,8 @@ "binop": null }, "value": "function", - "start": 14692, - "end": 14700, + "start": 14694, + "end": 14702, "loc": { "start": { "line": 368, @@ -77902,8 +77902,8 @@ "binop": null }, "value": "convert", - "start": 14701, - "end": 14708, + "start": 14703, + "end": 14710, "loc": { "start": { "line": 368, @@ -77927,8 +77927,8 @@ "postfix": false, "binop": null }, - "start": 14708, - "end": 14709, + "start": 14710, + "end": 14711, "loc": { "start": { "line": 368, @@ -77953,8 +77953,8 @@ "binop": null }, "value": "parser", - "start": 14709, - "end": 14715, + "start": 14711, + "end": 14717, "loc": { "start": { "line": 368, @@ -77979,8 +77979,8 @@ "binop": null, "updateContext": null }, - "start": 14715, - "end": 14716, + "start": 14717, + "end": 14718, "loc": { "start": { "line": 368, @@ -78005,8 +78005,8 @@ "binop": null }, "value": "converterParams", - "start": 14717, - "end": 14732, + "start": 14719, + "end": 14734, "loc": { "start": { "line": 368, @@ -78030,8 +78030,8 @@ "postfix": false, "binop": null }, - "start": 14732, - "end": 14733, + "start": 14734, + "end": 14735, "loc": { "start": { "line": 368, @@ -78055,8 +78055,8 @@ "postfix": false, "binop": null }, - "start": 14734, - "end": 14735, + "start": 14736, + "end": 14737, "loc": { "start": { "line": 368, @@ -78081,8 +78081,8 @@ "binop": null }, "value": "parser", - "start": 14749, - "end": 14755, + "start": 14751, + "end": 14757, "loc": { "start": { "line": 370, @@ -78106,8 +78106,8 @@ "postfix": false, "binop": null }, - "start": 14755, - "end": 14756, + "start": 14757, + "end": 14758, "loc": { "start": { "line": 370, @@ -78132,8 +78132,8 @@ "binop": null }, "value": "converterParams", - "start": 14756, - "end": 14771, + "start": 14758, + "end": 14773, "loc": { "start": { "line": 370, @@ -78157,8 +78157,8 @@ "postfix": false, "binop": null }, - "start": 14771, - "end": 14772, + "start": 14773, + "end": 14774, "loc": { "start": { "line": 370, @@ -78183,8 +78183,8 @@ "binop": null, "updateContext": null }, - "start": 14772, - "end": 14773, + "start": 14774, + "end": 14775, "loc": { "start": { "line": 370, @@ -78209,8 +78209,8 @@ "binop": null }, "value": "then", - "start": 14773, - "end": 14777, + "start": 14775, + "end": 14779, "loc": { "start": { "line": 370, @@ -78234,8 +78234,8 @@ "postfix": false, "binop": null }, - "start": 14777, - "end": 14778, + "start": 14779, + "end": 14780, "loc": { "start": { "line": 370, @@ -78259,8 +78259,8 @@ "postfix": false, "binop": null }, - "start": 14778, - "end": 14779, + "start": 14780, + "end": 14781, "loc": { "start": { "line": 370, @@ -78284,8 +78284,8 @@ "postfix": false, "binop": null }, - "start": 14779, - "end": 14780, + "start": 14781, + "end": 14782, "loc": { "start": { "line": 370, @@ -78310,8 +78310,8 @@ "binop": null, "updateContext": null }, - "start": 14781, - "end": 14783, + "start": 14783, + "end": 14785, "loc": { "start": { "line": 370, @@ -78335,8 +78335,8 @@ "postfix": false, "binop": null }, - "start": 14784, - "end": 14785, + "start": 14786, + "end": 14787, "loc": { "start": { "line": 370, @@ -78363,8 +78363,8 @@ "updateContext": null }, "value": "if", - "start": 14803, - "end": 14805, + "start": 14805, + "end": 14807, "loc": { "start": { "line": 372, @@ -78388,8 +78388,8 @@ "postfix": false, "binop": null }, - "start": 14806, - "end": 14807, + "start": 14808, + "end": 14809, "loc": { "start": { "line": 372, @@ -78415,8 +78415,8 @@ "updateContext": null }, "value": "!", - "start": 14807, - "end": 14808, + "start": 14809, + "end": 14810, "loc": { "start": { "line": 372, @@ -78441,8 +78441,8 @@ "binop": null }, "value": "metaModelJSON", - "start": 14808, - "end": 14821, + "start": 14810, + "end": 14823, "loc": { "start": { "line": 372, @@ -78466,8 +78466,8 @@ "postfix": false, "binop": null }, - "start": 14821, - "end": 14822, + "start": 14823, + "end": 14824, "loc": { "start": { "line": 372, @@ -78491,8 +78491,8 @@ "postfix": false, "binop": null }, - "start": 14823, - "end": 14824, + "start": 14825, + "end": 14826, "loc": { "start": { "line": 372, @@ -78517,8 +78517,8 @@ "binop": null }, "value": "log", - "start": 14845, - "end": 14848, + "start": 14847, + "end": 14850, "loc": { "start": { "line": 373, @@ -78542,8 +78542,8 @@ "postfix": false, "binop": null }, - "start": 14848, - "end": 14849, + "start": 14850, + "end": 14851, "loc": { "start": { "line": 373, @@ -78569,8 +78569,8 @@ "updateContext": null }, "value": "Creating default metamodel in XKT", - "start": 14849, - "end": 14884, + "start": 14851, + "end": 14886, "loc": { "start": { "line": 373, @@ -78594,8 +78594,8 @@ "postfix": false, "binop": null }, - "start": 14884, - "end": 14885, + "start": 14886, + "end": 14887, "loc": { "start": { "line": 373, @@ -78620,8 +78620,8 @@ "binop": null, "updateContext": null }, - "start": 14885, - "end": 14886, + "start": 14887, + "end": 14888, "loc": { "start": { "line": 373, @@ -78646,8 +78646,8 @@ "binop": null }, "value": "xktModel", - "start": 14907, - "end": 14915, + "start": 14909, + "end": 14917, "loc": { "start": { "line": 374, @@ -78672,8 +78672,8 @@ "binop": null, "updateContext": null }, - "start": 14915, - "end": 14916, + "start": 14917, + "end": 14918, "loc": { "start": { "line": 374, @@ -78698,8 +78698,8 @@ "binop": null }, "value": "createDefaultMetaObjects", - "start": 14916, - "end": 14940, + "start": 14918, + "end": 14942, "loc": { "start": { "line": 374, @@ -78723,8 +78723,8 @@ "postfix": false, "binop": null }, - "start": 14940, - "end": 14941, + "start": 14942, + "end": 14943, "loc": { "start": { "line": 374, @@ -78748,8 +78748,8 @@ "postfix": false, "binop": null }, - "start": 14941, - "end": 14942, + "start": 14943, + "end": 14944, "loc": { "start": { "line": 374, @@ -78774,8 +78774,8 @@ "binop": null, "updateContext": null }, - "start": 14942, - "end": 14943, + "start": 14944, + "end": 14945, "loc": { "start": { "line": 374, @@ -78799,8 +78799,8 @@ "postfix": false, "binop": null }, - "start": 14960, - "end": 14961, + "start": 14962, + "end": 14963, "loc": { "start": { "line": 375, @@ -78825,8 +78825,8 @@ "binop": null }, "value": "log", - "start": 14979, - "end": 14982, + "start": 14981, + "end": 14984, "loc": { "start": { "line": 377, @@ -78850,8 +78850,8 @@ "postfix": false, "binop": null }, - "start": 14982, - "end": 14983, + "start": 14984, + "end": 14985, "loc": { "start": { "line": 377, @@ -78877,8 +78877,8 @@ "updateContext": null }, "value": "Input file parsed OK. Building XKT document...", - "start": 14983, - "end": 15031, + "start": 14985, + "end": 15033, "loc": { "start": { "line": 377, @@ -78902,8 +78902,8 @@ "postfix": false, "binop": null }, - "start": 15031, - "end": 15032, + "start": 15033, + "end": 15034, "loc": { "start": { "line": 377, @@ -78928,8 +78928,8 @@ "binop": null, "updateContext": null }, - "start": 15032, - "end": 15033, + "start": 15034, + "end": 15035, "loc": { "start": { "line": 377, @@ -78954,8 +78954,8 @@ "binop": null }, "value": "xktModel", - "start": 15051, - "end": 15059, + "start": 15053, + "end": 15061, "loc": { "start": { "line": 379, @@ -78980,8 +78980,8 @@ "binop": null, "updateContext": null }, - "start": 15059, - "end": 15060, + "start": 15061, + "end": 15062, "loc": { "start": { "line": 379, @@ -79006,8 +79006,8 @@ "binop": null }, "value": "finalize", - "start": 15060, - "end": 15068, + "start": 15062, + "end": 15070, "loc": { "start": { "line": 379, @@ -79031,8 +79031,8 @@ "postfix": false, "binop": null }, - "start": 15068, - "end": 15069, + "start": 15070, + "end": 15071, "loc": { "start": { "line": 379, @@ -79056,8 +79056,8 @@ "postfix": false, "binop": null }, - "start": 15069, - "end": 15070, + "start": 15071, + "end": 15072, "loc": { "start": { "line": 379, @@ -79082,8 +79082,8 @@ "binop": null, "updateContext": null }, - "start": 15070, - "end": 15071, + "start": 15072, + "end": 15073, "loc": { "start": { "line": 379, @@ -79108,8 +79108,8 @@ "binop": null }, "value": "then", - "start": 15071, - "end": 15075, + "start": 15073, + "end": 15077, "loc": { "start": { "line": 379, @@ -79133,8 +79133,8 @@ "postfix": false, "binop": null }, - "start": 15075, - "end": 15076, + "start": 15077, + "end": 15078, "loc": { "start": { "line": 379, @@ -79158,8 +79158,8 @@ "postfix": false, "binop": null }, - "start": 15076, - "end": 15077, + "start": 15078, + "end": 15079, "loc": { "start": { "line": 379, @@ -79183,8 +79183,8 @@ "postfix": false, "binop": null }, - "start": 15077, - "end": 15078, + "start": 15079, + "end": 15080, "loc": { "start": { "line": 379, @@ -79209,8 +79209,8 @@ "binop": null, "updateContext": null }, - "start": 15079, - "end": 15081, + "start": 15081, + "end": 15083, "loc": { "start": { "line": 379, @@ -79234,8 +79234,8 @@ "postfix": false, "binop": null }, - "start": 15082, - "end": 15083, + "start": 15084, + "end": 15085, "loc": { "start": { "line": 379, @@ -79260,8 +79260,8 @@ "binop": null }, "value": "log", - "start": 15105, - "end": 15108, + "start": 15107, + "end": 15110, "loc": { "start": { "line": 381, @@ -79285,8 +79285,8 @@ "postfix": false, "binop": null }, - "start": 15108, - "end": 15109, + "start": 15110, + "end": 15111, "loc": { "start": { "line": 381, @@ -79312,8 +79312,8 @@ "updateContext": null }, "value": "XKT document built OK. Writing to XKT file...", - "start": 15109, - "end": 15156, + "start": 15111, + "end": 15158, "loc": { "start": { "line": 381, @@ -79337,8 +79337,8 @@ "postfix": false, "binop": null }, - "start": 15156, - "end": 15157, + "start": 15158, + "end": 15159, "loc": { "start": { "line": 381, @@ -79363,8 +79363,8 @@ "binop": null, "updateContext": null }, - "start": 15157, - "end": 15158, + "start": 15159, + "end": 15160, "loc": { "start": { "line": 381, @@ -79391,8 +79391,8 @@ "updateContext": null }, "value": "const", - "start": 15180, - "end": 15185, + "start": 15182, + "end": 15187, "loc": { "start": { "line": 383, @@ -79417,8 +79417,8 @@ "binop": null }, "value": "xktArrayBuffer", - "start": 15186, - "end": 15200, + "start": 15188, + "end": 15202, "loc": { "start": { "line": 383, @@ -79444,8 +79444,8 @@ "updateContext": null }, "value": "=", - "start": 15201, - "end": 15202, + "start": 15203, + "end": 15204, "loc": { "start": { "line": 383, @@ -79470,8 +79470,8 @@ "binop": null }, "value": "writeXKTModelToArrayBuffer", - "start": 15203, - "end": 15229, + "start": 15205, + "end": 15231, "loc": { "start": { "line": 383, @@ -79495,8 +79495,8 @@ "postfix": false, "binop": null }, - "start": 15229, - "end": 15230, + "start": 15231, + "end": 15232, "loc": { "start": { "line": 383, @@ -79521,8 +79521,8 @@ "binop": null }, "value": "xktModel", - "start": 15230, - "end": 15238, + "start": 15232, + "end": 15240, "loc": { "start": { "line": 383, @@ -79547,8 +79547,8 @@ "binop": null, "updateContext": null }, - "start": 15238, - "end": 15239, + "start": 15240, + "end": 15241, "loc": { "start": { "line": 383, @@ -79573,8 +79573,8 @@ "binop": null }, "value": "metaModelJSON", - "start": 15240, - "end": 15253, + "start": 15242, + "end": 15255, "loc": { "start": { "line": 383, @@ -79599,8 +79599,8 @@ "binop": null, "updateContext": null }, - "start": 15253, - "end": 15254, + "start": 15255, + "end": 15256, "loc": { "start": { "line": 383, @@ -79625,8 +79625,8 @@ "binop": null }, "value": "stats", - "start": 15255, - "end": 15260, + "start": 15257, + "end": 15262, "loc": { "start": { "line": 383, @@ -79651,8 +79651,8 @@ "binop": null, "updateContext": null }, - "start": 15260, - "end": 15261, + "start": 15262, + "end": 15263, "loc": { "start": { "line": 383, @@ -79676,8 +79676,8 @@ "postfix": false, "binop": null }, - "start": 15262, - "end": 15263, + "start": 15264, + "end": 15265, "loc": { "start": { "line": 383, @@ -79702,8 +79702,8 @@ "binop": null }, "value": "zip", - "start": 15263, - "end": 15266, + "start": 15265, + "end": 15268, "loc": { "start": { "line": 383, @@ -79728,8 +79728,8 @@ "binop": null, "updateContext": null }, - "start": 15266, - "end": 15267, + "start": 15268, + "end": 15269, "loc": { "start": { "line": 383, @@ -79756,8 +79756,8 @@ "updateContext": null }, "value": "true", - "start": 15268, - "end": 15272, + "start": 15270, + "end": 15274, "loc": { "start": { "line": 383, @@ -79781,8 +79781,8 @@ "postfix": false, "binop": null }, - "start": 15272, - "end": 15273, + "start": 15274, + "end": 15275, "loc": { "start": { "line": 383, @@ -79806,8 +79806,8 @@ "postfix": false, "binop": null }, - "start": 15273, - "end": 15274, + "start": 15275, + "end": 15276, "loc": { "start": { "line": 383, @@ -79832,8 +79832,8 @@ "binop": null, "updateContext": null }, - "start": 15274, - "end": 15275, + "start": 15276, + "end": 15277, "loc": { "start": { "line": 383, @@ -79860,8 +79860,8 @@ "updateContext": null }, "value": "const", - "start": 15297, - "end": 15302, + "start": 15299, + "end": 15304, "loc": { "start": { "line": 385, @@ -79886,8 +79886,8 @@ "binop": null }, "value": "xktContent", - "start": 15303, - "end": 15313, + "start": 15305, + "end": 15315, "loc": { "start": { "line": 385, @@ -79913,8 +79913,8 @@ "updateContext": null }, "value": "=", - "start": 15314, - "end": 15315, + "start": 15316, + "end": 15317, "loc": { "start": { "line": 385, @@ -79939,8 +79939,8 @@ "binop": null }, "value": "Buffer", - "start": 15316, - "end": 15322, + "start": 15318, + "end": 15324, "loc": { "start": { "line": 385, @@ -79965,8 +79965,8 @@ "binop": null, "updateContext": null }, - "start": 15322, - "end": 15323, + "start": 15324, + "end": 15325, "loc": { "start": { "line": 385, @@ -79991,8 +79991,8 @@ "binop": null }, "value": "from", - "start": 15323, - "end": 15327, + "start": 15325, + "end": 15329, "loc": { "start": { "line": 385, @@ -80016,8 +80016,8 @@ "postfix": false, "binop": null }, - "start": 15327, - "end": 15328, + "start": 15329, + "end": 15330, "loc": { "start": { "line": 385, @@ -80042,8 +80042,8 @@ "binop": null }, "value": "xktArrayBuffer", - "start": 15328, - "end": 15342, + "start": 15330, + "end": 15344, "loc": { "start": { "line": 385, @@ -80067,8 +80067,8 @@ "postfix": false, "binop": null }, - "start": 15342, - "end": 15343, + "start": 15344, + "end": 15345, "loc": { "start": { "line": 385, @@ -80093,8 +80093,8 @@ "binop": null, "updateContext": null }, - "start": 15343, - "end": 15344, + "start": 15345, + "end": 15346, "loc": { "start": { "line": 385, @@ -80121,8 +80121,8 @@ "updateContext": null }, "value": "const", - "start": 15366, - "end": 15371, + "start": 15368, + "end": 15373, "loc": { "start": { "line": 387, @@ -80147,8 +80147,8 @@ "binop": null }, "value": "targetFileSizeBytes", - "start": 15372, - "end": 15391, + "start": 15374, + "end": 15393, "loc": { "start": { "line": 387, @@ -80174,8 +80174,8 @@ "updateContext": null }, "value": "=", - "start": 15392, - "end": 15393, + "start": 15394, + "end": 15395, "loc": { "start": { "line": 387, @@ -80200,8 +80200,8 @@ "binop": null }, "value": "xktArrayBuffer", - "start": 15394, - "end": 15408, + "start": 15396, + "end": 15410, "loc": { "start": { "line": 387, @@ -80226,8 +80226,8 @@ "binop": null, "updateContext": null }, - "start": 15408, - "end": 15409, + "start": 15410, + "end": 15411, "loc": { "start": { "line": 387, @@ -80252,8 +80252,8 @@ "binop": null }, "value": "byteLength", - "start": 15409, - "end": 15419, + "start": 15411, + "end": 15421, "loc": { "start": { "line": 387, @@ -80278,8 +80278,8 @@ "binop": null, "updateContext": null }, - "start": 15419, - "end": 15420, + "start": 15421, + "end": 15422, "loc": { "start": { "line": 387, @@ -80304,8 +80304,8 @@ "binop": null }, "value": "stats", - "start": 15442, - "end": 15447, + "start": 15444, + "end": 15449, "loc": { "start": { "line": 389, @@ -80330,8 +80330,8 @@ "binop": null, "updateContext": null }, - "start": 15447, - "end": 15448, + "start": 15449, + "end": 15450, "loc": { "start": { "line": 389, @@ -80356,8 +80356,8 @@ "binop": null }, "value": "minTileSize", - "start": 15448, - "end": 15459, + "start": 15450, + "end": 15461, "loc": { "start": { "line": 389, @@ -80383,8 +80383,8 @@ "updateContext": null }, "value": "=", - "start": 15460, - "end": 15461, + "start": 15462, + "end": 15463, "loc": { "start": { "line": 389, @@ -80409,8 +80409,8 @@ "binop": null }, "value": "minTileSize", - "start": 15462, - "end": 15473, + "start": 15464, + "end": 15475, "loc": { "start": { "line": 389, @@ -80436,8 +80436,8 @@ "updateContext": null }, "value": "||", - "start": 15474, - "end": 15476, + "start": 15476, + "end": 15478, "loc": { "start": { "line": 389, @@ -80463,8 +80463,8 @@ "updateContext": null }, "value": 200, - "start": 15477, - "end": 15480, + "start": 15479, + "end": 15482, "loc": { "start": { "line": 389, @@ -80489,8 +80489,8 @@ "binop": null, "updateContext": null }, - "start": 15480, - "end": 15481, + "start": 15482, + "end": 15483, "loc": { "start": { "line": 389, @@ -80515,8 +80515,8 @@ "binop": null }, "value": "stats", - "start": 15502, - "end": 15507, + "start": 15504, + "end": 15509, "loc": { "start": { "line": 390, @@ -80541,8 +80541,8 @@ "binop": null, "updateContext": null }, - "start": 15507, - "end": 15508, + "start": 15509, + "end": 15510, "loc": { "start": { "line": 390, @@ -80567,8 +80567,8 @@ "binop": null }, "value": "sourceSize", - "start": 15508, - "end": 15518, + "start": 15510, + "end": 15520, "loc": { "start": { "line": 390, @@ -80594,8 +80594,8 @@ "updateContext": null }, "value": "=", - "start": 15519, - "end": 15520, + "start": 15521, + "end": 15522, "loc": { "start": { "line": 390, @@ -80619,8 +80619,8 @@ "postfix": false, "binop": null }, - "start": 15521, - "end": 15522, + "start": 15523, + "end": 15524, "loc": { "start": { "line": 390, @@ -80645,8 +80645,8 @@ "binop": null }, "value": "sourceFileSizeBytes", - "start": 15522, - "end": 15541, + "start": 15524, + "end": 15543, "loc": { "start": { "line": 390, @@ -80672,8 +80672,8 @@ "updateContext": null }, "value": "/", - "start": 15542, - "end": 15543, + "start": 15544, + "end": 15545, "loc": { "start": { "line": 390, @@ -80699,8 +80699,8 @@ "updateContext": null }, "value": 1000, - "start": 15544, - "end": 15548, + "start": 15546, + "end": 15550, "loc": { "start": { "line": 390, @@ -80724,8 +80724,8 @@ "postfix": false, "binop": null }, - "start": 15548, - "end": 15549, + "start": 15550, + "end": 15551, "loc": { "start": { "line": 390, @@ -80750,8 +80750,8 @@ "binop": null, "updateContext": null }, - "start": 15549, - "end": 15550, + "start": 15551, + "end": 15552, "loc": { "start": { "line": 390, @@ -80776,8 +80776,8 @@ "binop": null }, "value": "toFixed", - "start": 15550, - "end": 15557, + "start": 15552, + "end": 15559, "loc": { "start": { "line": 390, @@ -80801,8 +80801,8 @@ "postfix": false, "binop": null }, - "start": 15557, - "end": 15558, + "start": 15559, + "end": 15560, "loc": { "start": { "line": 390, @@ -80828,8 +80828,8 @@ "updateContext": null }, "value": 2, - "start": 15558, - "end": 15559, + "start": 15560, + "end": 15561, "loc": { "start": { "line": 390, @@ -80853,8 +80853,8 @@ "postfix": false, "binop": null }, - "start": 15559, - "end": 15560, + "start": 15561, + "end": 15562, "loc": { "start": { "line": 390, @@ -80879,8 +80879,8 @@ "binop": null, "updateContext": null }, - "start": 15560, - "end": 15561, + "start": 15562, + "end": 15563, "loc": { "start": { "line": 390, @@ -80905,8 +80905,8 @@ "binop": null }, "value": "stats", - "start": 15582, - "end": 15587, + "start": 15584, + "end": 15589, "loc": { "start": { "line": 391, @@ -80931,8 +80931,8 @@ "binop": null, "updateContext": null }, - "start": 15587, - "end": 15588, + "start": 15589, + "end": 15590, "loc": { "start": { "line": 391, @@ -80957,8 +80957,8 @@ "binop": null }, "value": "xktSize", - "start": 15588, - "end": 15595, + "start": 15590, + "end": 15597, "loc": { "start": { "line": 391, @@ -80984,8 +80984,8 @@ "updateContext": null }, "value": "=", - "start": 15596, - "end": 15597, + "start": 15598, + "end": 15599, "loc": { "start": { "line": 391, @@ -81009,8 +81009,8 @@ "postfix": false, "binop": null }, - "start": 15598, - "end": 15599, + "start": 15600, + "end": 15601, "loc": { "start": { "line": 391, @@ -81035,8 +81035,8 @@ "binop": null }, "value": "targetFileSizeBytes", - "start": 15599, - "end": 15618, + "start": 15601, + "end": 15620, "loc": { "start": { "line": 391, @@ -81062,8 +81062,8 @@ "updateContext": null }, "value": "/", - "start": 15619, - "end": 15620, + "start": 15621, + "end": 15622, "loc": { "start": { "line": 391, @@ -81089,8 +81089,8 @@ "updateContext": null }, "value": 1000, - "start": 15621, - "end": 15625, + "start": 15623, + "end": 15627, "loc": { "start": { "line": 391, @@ -81114,8 +81114,8 @@ "postfix": false, "binop": null }, - "start": 15625, - "end": 15626, + "start": 15627, + "end": 15628, "loc": { "start": { "line": 391, @@ -81140,8 +81140,8 @@ "binop": null, "updateContext": null }, - "start": 15626, - "end": 15627, + "start": 15628, + "end": 15629, "loc": { "start": { "line": 391, @@ -81166,8 +81166,8 @@ "binop": null }, "value": "toFixed", - "start": 15627, - "end": 15634, + "start": 15629, + "end": 15636, "loc": { "start": { "line": 391, @@ -81191,8 +81191,8 @@ "postfix": false, "binop": null }, - "start": 15634, - "end": 15635, + "start": 15636, + "end": 15637, "loc": { "start": { "line": 391, @@ -81218,8 +81218,8 @@ "updateContext": null }, "value": 2, - "start": 15635, - "end": 15636, + "start": 15637, + "end": 15638, "loc": { "start": { "line": 391, @@ -81243,8 +81243,8 @@ "postfix": false, "binop": null }, - "start": 15636, - "end": 15637, + "start": 15638, + "end": 15639, "loc": { "start": { "line": 391, @@ -81269,8 +81269,8 @@ "binop": null, "updateContext": null }, - "start": 15637, - "end": 15638, + "start": 15639, + "end": 15640, "loc": { "start": { "line": 391, @@ -81295,8 +81295,8 @@ "binop": null }, "value": "stats", - "start": 15659, - "end": 15664, + "start": 15661, + "end": 15666, "loc": { "start": { "line": 392, @@ -81321,8 +81321,8 @@ "binop": null, "updateContext": null }, - "start": 15664, - "end": 15665, + "start": 15666, + "end": 15667, "loc": { "start": { "line": 392, @@ -81347,8 +81347,8 @@ "binop": null }, "value": "xktVersion", - "start": 15665, - "end": 15675, + "start": 15667, + "end": 15677, "loc": { "start": { "line": 392, @@ -81374,8 +81374,8 @@ "updateContext": null }, "value": "=", - "start": 15676, - "end": 15677, + "start": 15678, + "end": 15679, "loc": { "start": { "line": 392, @@ -81400,8 +81400,8 @@ "binop": null }, "value": "XKT_INFO", - "start": 15678, - "end": 15686, + "start": 15680, + "end": 15688, "loc": { "start": { "line": 392, @@ -81426,8 +81426,8 @@ "binop": null, "updateContext": null }, - "start": 15686, - "end": 15687, + "start": 15688, + "end": 15689, "loc": { "start": { "line": 392, @@ -81452,8 +81452,8 @@ "binop": null }, "value": "xktVersion", - "start": 15687, - "end": 15697, + "start": 15689, + "end": 15699, "loc": { "start": { "line": 392, @@ -81478,8 +81478,8 @@ "binop": null, "updateContext": null }, - "start": 15697, - "end": 15698, + "start": 15699, + "end": 15700, "loc": { "start": { "line": 392, @@ -81504,8 +81504,8 @@ "binop": null }, "value": "stats", - "start": 15719, - "end": 15724, + "start": 15721, + "end": 15726, "loc": { "start": { "line": 393, @@ -81530,8 +81530,8 @@ "binop": null, "updateContext": null }, - "start": 15724, - "end": 15725, + "start": 15726, + "end": 15727, "loc": { "start": { "line": 393, @@ -81556,8 +81556,8 @@ "binop": null }, "value": "compressionRatio", - "start": 15725, - "end": 15741, + "start": 15727, + "end": 15743, "loc": { "start": { "line": 393, @@ -81583,8 +81583,8 @@ "updateContext": null }, "value": "=", - "start": 15742, - "end": 15743, + "start": 15744, + "end": 15745, "loc": { "start": { "line": 393, @@ -81608,8 +81608,8 @@ "postfix": false, "binop": null }, - "start": 15744, - "end": 15745, + "start": 15746, + "end": 15747, "loc": { "start": { "line": 393, @@ -81634,8 +81634,8 @@ "binop": null }, "value": "sourceFileSizeBytes", - "start": 15745, - "end": 15764, + "start": 15747, + "end": 15766, "loc": { "start": { "line": 393, @@ -81661,8 +81661,8 @@ "updateContext": null }, "value": "/", - "start": 15765, - "end": 15766, + "start": 15767, + "end": 15768, "loc": { "start": { "line": 393, @@ -81687,8 +81687,8 @@ "binop": null }, "value": "targetFileSizeBytes", - "start": 15767, - "end": 15786, + "start": 15769, + "end": 15788, "loc": { "start": { "line": 393, @@ -81712,8 +81712,8 @@ "postfix": false, "binop": null }, - "start": 15786, - "end": 15787, + "start": 15788, + "end": 15789, "loc": { "start": { "line": 393, @@ -81738,8 +81738,8 @@ "binop": null, "updateContext": null }, - "start": 15787, - "end": 15788, + "start": 15789, + "end": 15790, "loc": { "start": { "line": 393, @@ -81764,8 +81764,8 @@ "binop": null }, "value": "toFixed", - "start": 15788, - "end": 15795, + "start": 15790, + "end": 15797, "loc": { "start": { "line": 393, @@ -81789,8 +81789,8 @@ "postfix": false, "binop": null }, - "start": 15795, - "end": 15796, + "start": 15797, + "end": 15798, "loc": { "start": { "line": 393, @@ -81816,8 +81816,8 @@ "updateContext": null }, "value": 2, - "start": 15796, - "end": 15797, + "start": 15798, + "end": 15799, "loc": { "start": { "line": 393, @@ -81841,8 +81841,8 @@ "postfix": false, "binop": null }, - "start": 15797, - "end": 15798, + "start": 15799, + "end": 15800, "loc": { "start": { "line": 393, @@ -81867,8 +81867,8 @@ "binop": null, "updateContext": null }, - "start": 15798, - "end": 15799, + "start": 15800, + "end": 15801, "loc": { "start": { "line": 393, @@ -81893,8 +81893,8 @@ "binop": null }, "value": "stats", - "start": 15820, - "end": 15825, + "start": 15822, + "end": 15827, "loc": { "start": { "line": 394, @@ -81919,8 +81919,8 @@ "binop": null, "updateContext": null }, - "start": 15825, - "end": 15826, + "start": 15827, + "end": 15828, "loc": { "start": { "line": 394, @@ -81945,8 +81945,8 @@ "binop": null }, "value": "conversionTime", - "start": 15826, - "end": 15840, + "start": 15828, + "end": 15842, "loc": { "start": { "line": 394, @@ -81972,8 +81972,8 @@ "updateContext": null }, "value": "=", - "start": 15841, - "end": 15842, + "start": 15843, + "end": 15844, "loc": { "start": { "line": 394, @@ -81997,8 +81997,8 @@ "postfix": false, "binop": null }, - "start": 15843, - "end": 15844, + "start": 15845, + "end": 15846, "loc": { "start": { "line": 394, @@ -82022,8 +82022,8 @@ "postfix": false, "binop": null }, - "start": 15844, - "end": 15845, + "start": 15846, + "end": 15847, "loc": { "start": { "line": 394, @@ -82050,8 +82050,8 @@ "updateContext": null }, "value": "new", - "start": 15845, - "end": 15848, + "start": 15847, + "end": 15850, "loc": { "start": { "line": 394, @@ -82076,8 +82076,8 @@ "binop": null }, "value": "Date", - "start": 15849, - "end": 15853, + "start": 15851, + "end": 15855, "loc": { "start": { "line": 394, @@ -82101,8 +82101,8 @@ "postfix": false, "binop": null }, - "start": 15853, - "end": 15854, + "start": 15855, + "end": 15856, "loc": { "start": { "line": 394, @@ -82126,8 +82126,8 @@ "postfix": false, "binop": null }, - "start": 15854, - "end": 15855, + "start": 15856, + "end": 15857, "loc": { "start": { "line": 394, @@ -82153,8 +82153,8 @@ "updateContext": null }, "value": "-", - "start": 15856, - "end": 15857, + "start": 15858, + "end": 15859, "loc": { "start": { "line": 394, @@ -82179,8 +82179,8 @@ "binop": null }, "value": "startTime", - "start": 15858, - "end": 15867, + "start": 15860, + "end": 15869, "loc": { "start": { "line": 394, @@ -82204,8 +82204,8 @@ "postfix": false, "binop": null }, - "start": 15867, - "end": 15868, + "start": 15869, + "end": 15870, "loc": { "start": { "line": 394, @@ -82231,8 +82231,8 @@ "updateContext": null }, "value": "/", - "start": 15869, - "end": 15870, + "start": 15871, + "end": 15872, "loc": { "start": { "line": 394, @@ -82258,8 +82258,8 @@ "updateContext": null }, "value": 1000, - "start": 15871, - "end": 15877, + "start": 15873, + "end": 15879, "loc": { "start": { "line": 394, @@ -82283,8 +82283,8 @@ "postfix": false, "binop": null }, - "start": 15877, - "end": 15878, + "start": 15879, + "end": 15880, "loc": { "start": { "line": 394, @@ -82309,8 +82309,8 @@ "binop": null, "updateContext": null }, - "start": 15878, - "end": 15879, + "start": 15880, + "end": 15881, "loc": { "start": { "line": 394, @@ -82335,8 +82335,8 @@ "binop": null }, "value": "toFixed", - "start": 15879, - "end": 15886, + "start": 15881, + "end": 15888, "loc": { "start": { "line": 394, @@ -82360,8 +82360,8 @@ "postfix": false, "binop": null }, - "start": 15886, - "end": 15887, + "start": 15888, + "end": 15889, "loc": { "start": { "line": 394, @@ -82387,8 +82387,8 @@ "updateContext": null }, "value": 2, - "start": 15887, - "end": 15888, + "start": 15889, + "end": 15890, "loc": { "start": { "line": 394, @@ -82412,8 +82412,8 @@ "postfix": false, "binop": null }, - "start": 15888, - "end": 15889, + "start": 15890, + "end": 15891, "loc": { "start": { "line": 394, @@ -82438,8 +82438,8 @@ "binop": null, "updateContext": null }, - "start": 15889, - "end": 15890, + "start": 15891, + "end": 15892, "loc": { "start": { "line": 394, @@ -82464,8 +82464,8 @@ "binop": null }, "value": "stats", - "start": 15911, - "end": 15916, + "start": 15913, + "end": 15918, "loc": { "start": { "line": 395, @@ -82490,8 +82490,8 @@ "binop": null, "updateContext": null }, - "start": 15916, - "end": 15917, + "start": 15918, + "end": 15919, "loc": { "start": { "line": 395, @@ -82516,8 +82516,8 @@ "binop": null }, "value": "aabb", - "start": 15917, - "end": 15921, + "start": 15919, + "end": 15923, "loc": { "start": { "line": 395, @@ -82543,8 +82543,8 @@ "updateContext": null }, "value": "=", - "start": 15922, - "end": 15923, + "start": 15924, + "end": 15925, "loc": { "start": { "line": 395, @@ -82569,8 +82569,8 @@ "binop": null }, "value": "xktModel", - "start": 15924, - "end": 15932, + "start": 15926, + "end": 15934, "loc": { "start": { "line": 395, @@ -82595,8 +82595,8 @@ "binop": null, "updateContext": null }, - "start": 15932, - "end": 15933, + "start": 15934, + "end": 15935, "loc": { "start": { "line": 395, @@ -82621,8 +82621,8 @@ "binop": null }, "value": "aabb", - "start": 15933, - "end": 15937, + "start": 15935, + "end": 15939, "loc": { "start": { "line": 395, @@ -82647,8 +82647,8 @@ "binop": null, "updateContext": null }, - "start": 15937, - "end": 15938, + "start": 15939, + "end": 15940, "loc": { "start": { "line": 395, @@ -82673,8 +82673,8 @@ "binop": null }, "value": "log", - "start": 15959, - "end": 15962, + "start": 15961, + "end": 15964, "loc": { "start": { "line": 396, @@ -82698,8 +82698,8 @@ "postfix": false, "binop": null }, - "start": 15962, - "end": 15963, + "start": 15964, + "end": 15965, "loc": { "start": { "line": 396, @@ -82723,8 +82723,8 @@ "postfix": false, "binop": null }, - "start": 15963, - "end": 15964, + "start": 15965, + "end": 15966, "loc": { "start": { "line": 396, @@ -82750,8 +82750,8 @@ "updateContext": null }, "value": "Converted to: XKT v", - "start": 15964, - "end": 15983, + "start": 15966, + "end": 15985, "loc": { "start": { "line": 396, @@ -82775,8 +82775,8 @@ "postfix": false, "binop": null }, - "start": 15983, - "end": 15985, + "start": 15985, + "end": 15987, "loc": { "start": { "line": 396, @@ -82801,8 +82801,8 @@ "binop": null }, "value": "stats", - "start": 15985, - "end": 15990, + "start": 15987, + "end": 15992, "loc": { "start": { "line": 396, @@ -82827,8 +82827,8 @@ "binop": null, "updateContext": null }, - "start": 15990, - "end": 15991, + "start": 15992, + "end": 15993, "loc": { "start": { "line": 396, @@ -82853,8 +82853,8 @@ "binop": null }, "value": "xktVersion", - "start": 15991, - "end": 16001, + "start": 15993, + "end": 16003, "loc": { "start": { "line": 396, @@ -82878,8 +82878,8 @@ "postfix": false, "binop": null }, - "start": 16001, - "end": 16002, + "start": 16003, + "end": 16004, "loc": { "start": { "line": 396, @@ -82905,8 +82905,8 @@ "updateContext": null }, "value": "", - "start": 16002, - "end": 16002, + "start": 16004, + "end": 16004, "loc": { "start": { "line": 396, @@ -82930,8 +82930,8 @@ "postfix": false, "binop": null }, - "start": 16002, - "end": 16003, + "start": 16004, + "end": 16005, "loc": { "start": { "line": 396, @@ -82955,8 +82955,8 @@ "postfix": false, "binop": null }, - "start": 16003, - "end": 16004, + "start": 16005, + "end": 16006, "loc": { "start": { "line": 396, @@ -82981,8 +82981,8 @@ "binop": null, "updateContext": null }, - "start": 16004, - "end": 16005, + "start": 16006, + "end": 16007, "loc": { "start": { "line": 396, @@ -83009,8 +83009,8 @@ "updateContext": null }, "value": "if", - "start": 16026, - "end": 16028, + "start": 16028, + "end": 16030, "loc": { "start": { "line": 397, @@ -83034,8 +83034,8 @@ "postfix": false, "binop": null }, - "start": 16029, - "end": 16030, + "start": 16031, + "end": 16032, "loc": { "start": { "line": 397, @@ -83060,8 +83060,8 @@ "binop": null }, "value": "includeTypes", - "start": 16030, - "end": 16042, + "start": 16032, + "end": 16044, "loc": { "start": { "line": 397, @@ -83085,8 +83085,8 @@ "postfix": false, "binop": null }, - "start": 16042, - "end": 16043, + "start": 16044, + "end": 16045, "loc": { "start": { "line": 397, @@ -83110,8 +83110,8 @@ "postfix": false, "binop": null }, - "start": 16044, - "end": 16045, + "start": 16046, + "end": 16047, "loc": { "start": { "line": 397, @@ -83136,8 +83136,8 @@ "binop": null }, "value": "log", - "start": 16070, - "end": 16073, + "start": 16072, + "end": 16075, "loc": { "start": { "line": 398, @@ -83161,8 +83161,8 @@ "postfix": false, "binop": null }, - "start": 16073, - "end": 16074, + "start": 16075, + "end": 16076, "loc": { "start": { "line": 398, @@ -83188,8 +83188,8 @@ "updateContext": null }, "value": "Include types: ", - "start": 16074, - "end": 16091, + "start": 16076, + "end": 16093, "loc": { "start": { "line": 398, @@ -83215,8 +83215,8 @@ "updateContext": null }, "value": "+", - "start": 16092, - "end": 16093, + "start": 16094, + "end": 16095, "loc": { "start": { "line": 398, @@ -83240,8 +83240,8 @@ "postfix": false, "binop": null }, - "start": 16094, - "end": 16095, + "start": 16096, + "end": 16097, "loc": { "start": { "line": 398, @@ -83266,8 +83266,8 @@ "binop": null }, "value": "includeTypes", - "start": 16095, - "end": 16107, + "start": 16097, + "end": 16109, "loc": { "start": { "line": 398, @@ -83292,8 +83292,8 @@ "binop": null, "updateContext": null }, - "start": 16108, - "end": 16109, + "start": 16110, + "end": 16111, "loc": { "start": { "line": 398, @@ -83318,8 +83318,8 @@ "binop": null }, "value": "includeTypes", - "start": 16110, - "end": 16122, + "start": 16112, + "end": 16124, "loc": { "start": { "line": 398, @@ -83344,8 +83344,8 @@ "binop": null, "updateContext": null }, - "start": 16123, - "end": 16124, + "start": 16125, + "end": 16126, "loc": { "start": { "line": 398, @@ -83371,8 +83371,8 @@ "updateContext": null }, "value": "(include all)", - "start": 16125, - "end": 16140, + "start": 16127, + "end": 16142, "loc": { "start": { "line": 398, @@ -83396,8 +83396,8 @@ "postfix": false, "binop": null }, - "start": 16140, - "end": 16141, + "start": 16142, + "end": 16143, "loc": { "start": { "line": 398, @@ -83421,8 +83421,8 @@ "postfix": false, "binop": null }, - "start": 16141, - "end": 16142, + "start": 16143, + "end": 16144, "loc": { "start": { "line": 398, @@ -83447,8 +83447,8 @@ "binop": null, "updateContext": null }, - "start": 16142, - "end": 16143, + "start": 16144, + "end": 16145, "loc": { "start": { "line": 398, @@ -83472,8 +83472,8 @@ "postfix": false, "binop": null }, - "start": 16164, - "end": 16165, + "start": 16166, + "end": 16167, "loc": { "start": { "line": 399, @@ -83500,8 +83500,8 @@ "updateContext": null }, "value": "if", - "start": 16186, - "end": 16188, + "start": 16188, + "end": 16190, "loc": { "start": { "line": 400, @@ -83525,8 +83525,8 @@ "postfix": false, "binop": null }, - "start": 16189, - "end": 16190, + "start": 16191, + "end": 16192, "loc": { "start": { "line": 400, @@ -83551,8 +83551,8 @@ "binop": null }, "value": "excludeTypes", - "start": 16190, - "end": 16202, + "start": 16192, + "end": 16204, "loc": { "start": { "line": 400, @@ -83576,8 +83576,8 @@ "postfix": false, "binop": null }, - "start": 16202, - "end": 16203, + "start": 16204, + "end": 16205, "loc": { "start": { "line": 400, @@ -83601,8 +83601,8 @@ "postfix": false, "binop": null }, - "start": 16204, - "end": 16205, + "start": 16206, + "end": 16207, "loc": { "start": { "line": 400, @@ -83627,8 +83627,8 @@ "binop": null }, "value": "log", - "start": 16230, - "end": 16233, + "start": 16232, + "end": 16235, "loc": { "start": { "line": 401, @@ -83652,8 +83652,8 @@ "postfix": false, "binop": null }, - "start": 16233, - "end": 16234, + "start": 16235, + "end": 16236, "loc": { "start": { "line": 401, @@ -83679,8 +83679,8 @@ "updateContext": null }, "value": "Exclude types: ", - "start": 16234, - "end": 16251, + "start": 16236, + "end": 16253, "loc": { "start": { "line": 401, @@ -83706,8 +83706,8 @@ "updateContext": null }, "value": "+", - "start": 16252, - "end": 16253, + "start": 16254, + "end": 16255, "loc": { "start": { "line": 401, @@ -83731,8 +83731,8 @@ "postfix": false, "binop": null }, - "start": 16254, - "end": 16255, + "start": 16256, + "end": 16257, "loc": { "start": { "line": 401, @@ -83757,8 +83757,8 @@ "binop": null }, "value": "excludeTypes", - "start": 16255, - "end": 16267, + "start": 16257, + "end": 16269, "loc": { "start": { "line": 401, @@ -83783,8 +83783,8 @@ "binop": null, "updateContext": null }, - "start": 16268, - "end": 16269, + "start": 16270, + "end": 16271, "loc": { "start": { "line": 401, @@ -83809,8 +83809,8 @@ "binop": null }, "value": "excludeTypes", - "start": 16270, - "end": 16282, + "start": 16272, + "end": 16284, "loc": { "start": { "line": 401, @@ -83835,8 +83835,8 @@ "binop": null, "updateContext": null }, - "start": 16283, - "end": 16284, + "start": 16285, + "end": 16286, "loc": { "start": { "line": 401, @@ -83862,8 +83862,8 @@ "updateContext": null }, "value": "(exclude none)", - "start": 16285, - "end": 16301, + "start": 16287, + "end": 16303, "loc": { "start": { "line": 401, @@ -83887,8 +83887,8 @@ "postfix": false, "binop": null }, - "start": 16301, - "end": 16302, + "start": 16303, + "end": 16304, "loc": { "start": { "line": 401, @@ -83912,8 +83912,8 @@ "postfix": false, "binop": null }, - "start": 16302, - "end": 16303, + "start": 16304, + "end": 16305, "loc": { "start": { "line": 401, @@ -83938,8 +83938,8 @@ "binop": null, "updateContext": null }, - "start": 16303, - "end": 16304, + "start": 16305, + "end": 16306, "loc": { "start": { "line": 401, @@ -83963,8 +83963,8 @@ "postfix": false, "binop": null }, - "start": 16325, - "end": 16326, + "start": 16327, + "end": 16328, "loc": { "start": { "line": 402, @@ -83989,8 +83989,8 @@ "binop": null }, "value": "log", - "start": 16347, - "end": 16350, + "start": 16349, + "end": 16352, "loc": { "start": { "line": 403, @@ -84014,8 +84014,8 @@ "postfix": false, "binop": null }, - "start": 16350, - "end": 16351, + "start": 16352, + "end": 16353, "loc": { "start": { "line": 403, @@ -84041,8 +84041,8 @@ "updateContext": null }, "value": "XKT size: ", - "start": 16351, - "end": 16363, + "start": 16353, + "end": 16365, "loc": { "start": { "line": 403, @@ -84068,8 +84068,8 @@ "updateContext": null }, "value": "+", - "start": 16364, - "end": 16365, + "start": 16366, + "end": 16367, "loc": { "start": { "line": 403, @@ -84094,8 +84094,8 @@ "binop": null }, "value": "stats", - "start": 16366, - "end": 16371, + "start": 16368, + "end": 16373, "loc": { "start": { "line": 403, @@ -84120,8 +84120,8 @@ "binop": null, "updateContext": null }, - "start": 16371, - "end": 16372, + "start": 16373, + "end": 16374, "loc": { "start": { "line": 403, @@ -84146,8 +84146,8 @@ "binop": null }, "value": "xktSize", - "start": 16372, - "end": 16379, + "start": 16374, + "end": 16381, "loc": { "start": { "line": 403, @@ -84173,8 +84173,8 @@ "updateContext": null }, "value": "+", - "start": 16380, - "end": 16381, + "start": 16382, + "end": 16383, "loc": { "start": { "line": 403, @@ -84200,8 +84200,8 @@ "updateContext": null }, "value": " kB", - "start": 16382, - "end": 16387, + "start": 16384, + "end": 16389, "loc": { "start": { "line": 403, @@ -84225,8 +84225,8 @@ "postfix": false, "binop": null }, - "start": 16387, - "end": 16388, + "start": 16389, + "end": 16390, "loc": { "start": { "line": 403, @@ -84251,8 +84251,8 @@ "binop": null, "updateContext": null }, - "start": 16388, - "end": 16389, + "start": 16390, + "end": 16391, "loc": { "start": { "line": 403, @@ -84277,8 +84277,8 @@ "binop": null }, "value": "log", - "start": 16410, - "end": 16413, + "start": 16412, + "end": 16415, "loc": { "start": { "line": 404, @@ -84302,8 +84302,8 @@ "postfix": false, "binop": null }, - "start": 16413, - "end": 16414, + "start": 16415, + "end": 16416, "loc": { "start": { "line": 404, @@ -84329,8 +84329,8 @@ "updateContext": null }, "value": "XKT textures size: ", - "start": 16414, - "end": 16435, + "start": 16416, + "end": 16437, "loc": { "start": { "line": 404, @@ -84356,8 +84356,8 @@ "updateContext": null }, "value": "+", - "start": 16436, - "end": 16437, + "start": 16438, + "end": 16439, "loc": { "start": { "line": 404, @@ -84381,8 +84381,8 @@ "postfix": false, "binop": null }, - "start": 16438, - "end": 16439, + "start": 16440, + "end": 16441, "loc": { "start": { "line": 404, @@ -84407,8 +84407,8 @@ "binop": null }, "value": "stats", - "start": 16439, - "end": 16444, + "start": 16441, + "end": 16446, "loc": { "start": { "line": 404, @@ -84433,8 +84433,8 @@ "binop": null, "updateContext": null }, - "start": 16444, - "end": 16445, + "start": 16446, + "end": 16447, "loc": { "start": { "line": 404, @@ -84459,8 +84459,8 @@ "binop": null }, "value": "texturesSize", - "start": 16445, - "end": 16457, + "start": 16447, + "end": 16459, "loc": { "start": { "line": 404, @@ -84486,8 +84486,8 @@ "updateContext": null }, "value": "/", - "start": 16458, - "end": 16459, + "start": 16460, + "end": 16461, "loc": { "start": { "line": 404, @@ -84513,8 +84513,8 @@ "updateContext": null }, "value": 1000, - "start": 16460, - "end": 16464, + "start": 16462, + "end": 16466, "loc": { "start": { "line": 404, @@ -84538,8 +84538,8 @@ "postfix": false, "binop": null }, - "start": 16464, - "end": 16465, + "start": 16466, + "end": 16467, "loc": { "start": { "line": 404, @@ -84564,8 +84564,8 @@ "binop": null, "updateContext": null }, - "start": 16465, - "end": 16466, + "start": 16467, + "end": 16468, "loc": { "start": { "line": 404, @@ -84590,8 +84590,8 @@ "binop": null }, "value": "toFixed", - "start": 16466, - "end": 16473, + "start": 16468, + "end": 16475, "loc": { "start": { "line": 404, @@ -84615,8 +84615,8 @@ "postfix": false, "binop": null }, - "start": 16473, - "end": 16474, + "start": 16475, + "end": 16476, "loc": { "start": { "line": 404, @@ -84642,8 +84642,8 @@ "updateContext": null }, "value": 2, - "start": 16474, - "end": 16475, + "start": 16476, + "end": 16477, "loc": { "start": { "line": 404, @@ -84667,8 +84667,8 @@ "postfix": false, "binop": null }, - "start": 16475, - "end": 16476, + "start": 16477, + "end": 16478, "loc": { "start": { "line": 404, @@ -84694,8 +84694,8 @@ "updateContext": null }, "value": "+", - "start": 16477, - "end": 16478, + "start": 16479, + "end": 16480, "loc": { "start": { "line": 404, @@ -84721,8 +84721,8 @@ "updateContext": null }, "value": "kB", - "start": 16479, - "end": 16483, + "start": 16481, + "end": 16485, "loc": { "start": { "line": 404, @@ -84746,8 +84746,8 @@ "postfix": false, "binop": null }, - "start": 16483, - "end": 16484, + "start": 16485, + "end": 16486, "loc": { "start": { "line": 404, @@ -84772,8 +84772,8 @@ "binop": null, "updateContext": null }, - "start": 16484, - "end": 16485, + "start": 16486, + "end": 16487, "loc": { "start": { "line": 404, @@ -84798,8 +84798,8 @@ "binop": null }, "value": "log", - "start": 16506, - "end": 16509, + "start": 16508, + "end": 16511, "loc": { "start": { "line": 405, @@ -84823,8 +84823,8 @@ "postfix": false, "binop": null }, - "start": 16509, - "end": 16510, + "start": 16511, + "end": 16512, "loc": { "start": { "line": 405, @@ -84850,8 +84850,8 @@ "updateContext": null }, "value": "Compression ratio: ", - "start": 16510, - "end": 16531, + "start": 16512, + "end": 16533, "loc": { "start": { "line": 405, @@ -84877,8 +84877,8 @@ "updateContext": null }, "value": "+", - "start": 16532, - "end": 16533, + "start": 16534, + "end": 16535, "loc": { "start": { "line": 405, @@ -84903,8 +84903,8 @@ "binop": null }, "value": "stats", - "start": 16534, - "end": 16539, + "start": 16536, + "end": 16541, "loc": { "start": { "line": 405, @@ -84929,8 +84929,8 @@ "binop": null, "updateContext": null }, - "start": 16539, - "end": 16540, + "start": 16541, + "end": 16542, "loc": { "start": { "line": 405, @@ -84955,8 +84955,8 @@ "binop": null }, "value": "compressionRatio", - "start": 16540, - "end": 16556, + "start": 16542, + "end": 16558, "loc": { "start": { "line": 405, @@ -84980,8 +84980,8 @@ "postfix": false, "binop": null }, - "start": 16556, - "end": 16557, + "start": 16558, + "end": 16559, "loc": { "start": { "line": 405, @@ -85006,8 +85006,8 @@ "binop": null, "updateContext": null }, - "start": 16557, - "end": 16558, + "start": 16559, + "end": 16560, "loc": { "start": { "line": 405, @@ -85032,8 +85032,8 @@ "binop": null }, "value": "log", - "start": 16579, - "end": 16582, + "start": 16581, + "end": 16584, "loc": { "start": { "line": 406, @@ -85057,8 +85057,8 @@ "postfix": false, "binop": null }, - "start": 16582, - "end": 16583, + "start": 16584, + "end": 16585, "loc": { "start": { "line": 406, @@ -85084,8 +85084,8 @@ "updateContext": null }, "value": "Conversion time: ", - "start": 16583, - "end": 16602, + "start": 16585, + "end": 16604, "loc": { "start": { "line": 406, @@ -85111,8 +85111,8 @@ "updateContext": null }, "value": "+", - "start": 16603, - "end": 16604, + "start": 16605, + "end": 16606, "loc": { "start": { "line": 406, @@ -85137,8 +85137,8 @@ "binop": null }, "value": "stats", - "start": 16605, - "end": 16610, + "start": 16607, + "end": 16612, "loc": { "start": { "line": 406, @@ -85163,8 +85163,8 @@ "binop": null, "updateContext": null }, - "start": 16610, - "end": 16611, + "start": 16612, + "end": 16613, "loc": { "start": { "line": 406, @@ -85189,8 +85189,8 @@ "binop": null }, "value": "conversionTime", - "start": 16611, - "end": 16625, + "start": 16613, + "end": 16627, "loc": { "start": { "line": 406, @@ -85216,8 +85216,8 @@ "updateContext": null }, "value": "+", - "start": 16626, - "end": 16627, + "start": 16628, + "end": 16629, "loc": { "start": { "line": 406, @@ -85243,8 +85243,8 @@ "updateContext": null }, "value": " s", - "start": 16628, - "end": 16632, + "start": 16630, + "end": 16634, "loc": { "start": { "line": 406, @@ -85268,8 +85268,8 @@ "postfix": false, "binop": null }, - "start": 16632, - "end": 16633, + "start": 16634, + "end": 16635, "loc": { "start": { "line": 406, @@ -85294,8 +85294,8 @@ "binop": null, "updateContext": null }, - "start": 16633, - "end": 16634, + "start": 16635, + "end": 16636, "loc": { "start": { "line": 406, @@ -85320,8 +85320,8 @@ "binop": null }, "value": "log", - "start": 16655, - "end": 16658, + "start": 16657, + "end": 16660, "loc": { "start": { "line": 407, @@ -85345,8 +85345,8 @@ "postfix": false, "binop": null }, - "start": 16658, - "end": 16659, + "start": 16660, + "end": 16661, "loc": { "start": { "line": 407, @@ -85372,8 +85372,8 @@ "updateContext": null }, "value": "Converted metaobjects: ", - "start": 16659, - "end": 16684, + "start": 16661, + "end": 16686, "loc": { "start": { "line": 407, @@ -85399,8 +85399,8 @@ "updateContext": null }, "value": "+", - "start": 16685, - "end": 16686, + "start": 16687, + "end": 16688, "loc": { "start": { "line": 407, @@ -85425,8 +85425,8 @@ "binop": null }, "value": "stats", - "start": 16687, - "end": 16692, + "start": 16689, + "end": 16694, "loc": { "start": { "line": 407, @@ -85451,8 +85451,8 @@ "binop": null, "updateContext": null }, - "start": 16692, - "end": 16693, + "start": 16694, + "end": 16695, "loc": { "start": { "line": 407, @@ -85477,8 +85477,8 @@ "binop": null }, "value": "numMetaObjects", - "start": 16693, - "end": 16707, + "start": 16695, + "end": 16709, "loc": { "start": { "line": 407, @@ -85502,8 +85502,8 @@ "postfix": false, "binop": null }, - "start": 16707, - "end": 16708, + "start": 16709, + "end": 16710, "loc": { "start": { "line": 407, @@ -85528,8 +85528,8 @@ "binop": null, "updateContext": null }, - "start": 16708, - "end": 16709, + "start": 16710, + "end": 16711, "loc": { "start": { "line": 407, @@ -85554,8 +85554,8 @@ "binop": null }, "value": "log", - "start": 16730, - "end": 16733, + "start": 16732, + "end": 16735, "loc": { "start": { "line": 408, @@ -85579,8 +85579,8 @@ "postfix": false, "binop": null }, - "start": 16733, - "end": 16734, + "start": 16735, + "end": 16736, "loc": { "start": { "line": 408, @@ -85606,8 +85606,8 @@ "updateContext": null }, "value": "Converted property sets: ", - "start": 16734, - "end": 16761, + "start": 16736, + "end": 16763, "loc": { "start": { "line": 408, @@ -85633,8 +85633,8 @@ "updateContext": null }, "value": "+", - "start": 16762, - "end": 16763, + "start": 16764, + "end": 16765, "loc": { "start": { "line": 408, @@ -85659,8 +85659,8 @@ "binop": null }, "value": "stats", - "start": 16764, - "end": 16769, + "start": 16766, + "end": 16771, "loc": { "start": { "line": 408, @@ -85685,8 +85685,8 @@ "binop": null, "updateContext": null }, - "start": 16769, - "end": 16770, + "start": 16771, + "end": 16772, "loc": { "start": { "line": 408, @@ -85711,8 +85711,8 @@ "binop": null }, "value": "numPropertySets", - "start": 16770, - "end": 16785, + "start": 16772, + "end": 16787, "loc": { "start": { "line": 408, @@ -85736,8 +85736,8 @@ "postfix": false, "binop": null }, - "start": 16785, - "end": 16786, + "start": 16787, + "end": 16788, "loc": { "start": { "line": 408, @@ -85762,8 +85762,8 @@ "binop": null, "updateContext": null }, - "start": 16786, - "end": 16787, + "start": 16788, + "end": 16789, "loc": { "start": { "line": 408, @@ -85788,8 +85788,8 @@ "binop": null }, "value": "log", - "start": 16808, - "end": 16811, + "start": 16810, + "end": 16813, "loc": { "start": { "line": 409, @@ -85813,8 +85813,8 @@ "postfix": false, "binop": null }, - "start": 16811, - "end": 16812, + "start": 16813, + "end": 16814, "loc": { "start": { "line": 409, @@ -85840,8 +85840,8 @@ "updateContext": null }, "value": "Converted drawable objects: ", - "start": 16812, - "end": 16842, + "start": 16814, + "end": 16844, "loc": { "start": { "line": 409, @@ -85867,8 +85867,8 @@ "updateContext": null }, "value": "+", - "start": 16843, - "end": 16844, + "start": 16845, + "end": 16846, "loc": { "start": { "line": 409, @@ -85893,8 +85893,8 @@ "binop": null }, "value": "stats", - "start": 16845, - "end": 16850, + "start": 16847, + "end": 16852, "loc": { "start": { "line": 409, @@ -85919,8 +85919,8 @@ "binop": null, "updateContext": null }, - "start": 16850, - "end": 16851, + "start": 16852, + "end": 16853, "loc": { "start": { "line": 409, @@ -85945,8 +85945,8 @@ "binop": null }, "value": "numObjects", - "start": 16851, - "end": 16861, + "start": 16853, + "end": 16863, "loc": { "start": { "line": 409, @@ -85970,8 +85970,8 @@ "postfix": false, "binop": null }, - "start": 16861, - "end": 16862, + "start": 16863, + "end": 16864, "loc": { "start": { "line": 409, @@ -85996,8 +85996,8 @@ "binop": null, "updateContext": null }, - "start": 16862, - "end": 16863, + "start": 16864, + "end": 16865, "loc": { "start": { "line": 409, @@ -86022,8 +86022,8 @@ "binop": null }, "value": "log", - "start": 16884, - "end": 16887, + "start": 16886, + "end": 16889, "loc": { "start": { "line": 410, @@ -86047,8 +86047,8 @@ "postfix": false, "binop": null }, - "start": 16887, - "end": 16888, + "start": 16889, + "end": 16890, "loc": { "start": { "line": 410, @@ -86074,8 +86074,8 @@ "updateContext": null }, "value": "Converted geometries: ", - "start": 16888, - "end": 16912, + "start": 16890, + "end": 16914, "loc": { "start": { "line": 410, @@ -86101,8 +86101,8 @@ "updateContext": null }, "value": "+", - "start": 16913, - "end": 16914, + "start": 16915, + "end": 16916, "loc": { "start": { "line": 410, @@ -86127,8 +86127,8 @@ "binop": null }, "value": "stats", - "start": 16915, - "end": 16920, + "start": 16917, + "end": 16922, "loc": { "start": { "line": 410, @@ -86153,8 +86153,8 @@ "binop": null, "updateContext": null }, - "start": 16920, - "end": 16921, + "start": 16922, + "end": 16923, "loc": { "start": { "line": 410, @@ -86179,8 +86179,8 @@ "binop": null }, "value": "numGeometries", - "start": 16921, - "end": 16934, + "start": 16923, + "end": 16936, "loc": { "start": { "line": 410, @@ -86204,8 +86204,8 @@ "postfix": false, "binop": null }, - "start": 16934, - "end": 16935, + "start": 16936, + "end": 16937, "loc": { "start": { "line": 410, @@ -86230,8 +86230,8 @@ "binop": null, "updateContext": null }, - "start": 16935, - "end": 16936, + "start": 16937, + "end": 16938, "loc": { "start": { "line": 410, @@ -86256,8 +86256,8 @@ "binop": null }, "value": "log", - "start": 16957, - "end": 16960, + "start": 16959, + "end": 16962, "loc": { "start": { "line": 411, @@ -86281,8 +86281,8 @@ "postfix": false, "binop": null }, - "start": 16960, - "end": 16961, + "start": 16962, + "end": 16963, "loc": { "start": { "line": 411, @@ -86308,8 +86308,8 @@ "updateContext": null }, "value": "Converted textures: ", - "start": 16961, - "end": 16983, + "start": 16963, + "end": 16985, "loc": { "start": { "line": 411, @@ -86335,8 +86335,8 @@ "updateContext": null }, "value": "+", - "start": 16984, - "end": 16985, + "start": 16986, + "end": 16987, "loc": { "start": { "line": 411, @@ -86361,8 +86361,8 @@ "binop": null }, "value": "stats", - "start": 16986, - "end": 16991, + "start": 16988, + "end": 16993, "loc": { "start": { "line": 411, @@ -86387,8 +86387,8 @@ "binop": null, "updateContext": null }, - "start": 16991, - "end": 16992, + "start": 16993, + "end": 16994, "loc": { "start": { "line": 411, @@ -86413,8 +86413,8 @@ "binop": null }, "value": "numTextures", - "start": 16992, - "end": 17003, + "start": 16994, + "end": 17005, "loc": { "start": { "line": 411, @@ -86438,8 +86438,8 @@ "postfix": false, "binop": null }, - "start": 17003, - "end": 17004, + "start": 17005, + "end": 17006, "loc": { "start": { "line": 411, @@ -86464,8 +86464,8 @@ "binop": null, "updateContext": null }, - "start": 17004, - "end": 17005, + "start": 17006, + "end": 17007, "loc": { "start": { "line": 411, @@ -86490,8 +86490,8 @@ "binop": null }, "value": "log", - "start": 17026, - "end": 17029, + "start": 17028, + "end": 17031, "loc": { "start": { "line": 412, @@ -86515,8 +86515,8 @@ "postfix": false, "binop": null }, - "start": 17029, - "end": 17030, + "start": 17031, + "end": 17032, "loc": { "start": { "line": 412, @@ -86542,8 +86542,8 @@ "updateContext": null }, "value": "Converted textureSets: ", - "start": 17030, - "end": 17055, + "start": 17032, + "end": 17057, "loc": { "start": { "line": 412, @@ -86569,8 +86569,8 @@ "updateContext": null }, "value": "+", - "start": 17056, - "end": 17057, + "start": 17058, + "end": 17059, "loc": { "start": { "line": 412, @@ -86595,8 +86595,8 @@ "binop": null }, "value": "stats", - "start": 17058, - "end": 17063, + "start": 17060, + "end": 17065, "loc": { "start": { "line": 412, @@ -86621,8 +86621,8 @@ "binop": null, "updateContext": null }, - "start": 17063, - "end": 17064, + "start": 17065, + "end": 17066, "loc": { "start": { "line": 412, @@ -86647,8 +86647,8 @@ "binop": null }, "value": "numTextureSets", - "start": 17064, - "end": 17078, + "start": 17066, + "end": 17080, "loc": { "start": { "line": 412, @@ -86672,8 +86672,8 @@ "postfix": false, "binop": null }, - "start": 17078, - "end": 17079, + "start": 17080, + "end": 17081, "loc": { "start": { "line": 412, @@ -86698,8 +86698,8 @@ "binop": null, "updateContext": null }, - "start": 17079, - "end": 17080, + "start": 17081, + "end": 17082, "loc": { "start": { "line": 412, @@ -86724,8 +86724,8 @@ "binop": null }, "value": "log", - "start": 17101, - "end": 17104, + "start": 17103, + "end": 17106, "loc": { "start": { "line": 413, @@ -86749,8 +86749,8 @@ "postfix": false, "binop": null }, - "start": 17104, - "end": 17105, + "start": 17106, + "end": 17107, "loc": { "start": { "line": 413, @@ -86776,8 +86776,8 @@ "updateContext": null }, "value": "Converted triangles: ", - "start": 17105, - "end": 17128, + "start": 17107, + "end": 17130, "loc": { "start": { "line": 413, @@ -86803,8 +86803,8 @@ "updateContext": null }, "value": "+", - "start": 17129, - "end": 17130, + "start": 17131, + "end": 17132, "loc": { "start": { "line": 413, @@ -86829,8 +86829,8 @@ "binop": null }, "value": "stats", - "start": 17131, - "end": 17136, + "start": 17133, + "end": 17138, "loc": { "start": { "line": 413, @@ -86855,8 +86855,8 @@ "binop": null, "updateContext": null }, - "start": 17136, - "end": 17137, + "start": 17138, + "end": 17139, "loc": { "start": { "line": 413, @@ -86881,8 +86881,8 @@ "binop": null }, "value": "numTriangles", - "start": 17137, - "end": 17149, + "start": 17139, + "end": 17151, "loc": { "start": { "line": 413, @@ -86906,8 +86906,8 @@ "postfix": false, "binop": null }, - "start": 17149, - "end": 17150, + "start": 17151, + "end": 17152, "loc": { "start": { "line": 413, @@ -86932,8 +86932,8 @@ "binop": null, "updateContext": null }, - "start": 17150, - "end": 17151, + "start": 17152, + "end": 17153, "loc": { "start": { "line": 413, @@ -86958,8 +86958,8 @@ "binop": null }, "value": "log", - "start": 17172, - "end": 17175, + "start": 17174, + "end": 17177, "loc": { "start": { "line": 414, @@ -86983,8 +86983,8 @@ "postfix": false, "binop": null }, - "start": 17175, - "end": 17176, + "start": 17177, + "end": 17178, "loc": { "start": { "line": 414, @@ -87010,8 +87010,8 @@ "updateContext": null }, "value": "Converted vertices: ", - "start": 17176, - "end": 17198, + "start": 17178, + "end": 17200, "loc": { "start": { "line": 414, @@ -87037,8 +87037,8 @@ "updateContext": null }, "value": "+", - "start": 17199, - "end": 17200, + "start": 17201, + "end": 17202, "loc": { "start": { "line": 414, @@ -87063,8 +87063,8 @@ "binop": null }, "value": "stats", - "start": 17201, - "end": 17206, + "start": 17203, + "end": 17208, "loc": { "start": { "line": 414, @@ -87089,8 +87089,8 @@ "binop": null, "updateContext": null }, - "start": 17206, - "end": 17207, + "start": 17208, + "end": 17209, "loc": { "start": { "line": 414, @@ -87115,8 +87115,8 @@ "binop": null }, "value": "numVertices", - "start": 17207, - "end": 17218, + "start": 17209, + "end": 17220, "loc": { "start": { "line": 414, @@ -87140,8 +87140,8 @@ "postfix": false, "binop": null }, - "start": 17218, - "end": 17219, + "start": 17220, + "end": 17221, "loc": { "start": { "line": 414, @@ -87166,8 +87166,8 @@ "binop": null, "updateContext": null }, - "start": 17219, - "end": 17220, + "start": 17221, + "end": 17222, "loc": { "start": { "line": 414, @@ -87192,8 +87192,8 @@ "binop": null }, "value": "log", - "start": 17241, - "end": 17244, + "start": 17243, + "end": 17246, "loc": { "start": { "line": 415, @@ -87217,8 +87217,8 @@ "postfix": false, "binop": null }, - "start": 17244, - "end": 17245, + "start": 17246, + "end": 17247, "loc": { "start": { "line": 415, @@ -87244,8 +87244,8 @@ "updateContext": null }, "value": "Converted UVs: ", - "start": 17245, - "end": 17262, + "start": 17247, + "end": 17264, "loc": { "start": { "line": 415, @@ -87271,8 +87271,8 @@ "updateContext": null }, "value": "+", - "start": 17263, - "end": 17264, + "start": 17265, + "end": 17266, "loc": { "start": { "line": 415, @@ -87297,8 +87297,8 @@ "binop": null }, "value": "stats", - "start": 17265, - "end": 17270, + "start": 17267, + "end": 17272, "loc": { "start": { "line": 415, @@ -87323,8 +87323,8 @@ "binop": null, "updateContext": null }, - "start": 17270, - "end": 17271, + "start": 17272, + "end": 17273, "loc": { "start": { "line": 415, @@ -87349,8 +87349,8 @@ "binop": null }, "value": "numUVs", - "start": 17271, - "end": 17277, + "start": 17273, + "end": 17279, "loc": { "start": { "line": 415, @@ -87374,8 +87374,8 @@ "postfix": false, "binop": null }, - "start": 17277, - "end": 17278, + "start": 17279, + "end": 17280, "loc": { "start": { "line": 415, @@ -87400,8 +87400,8 @@ "binop": null, "updateContext": null }, - "start": 17278, - "end": 17279, + "start": 17280, + "end": 17281, "loc": { "start": { "line": 415, @@ -87426,8 +87426,8 @@ "binop": null }, "value": "log", - "start": 17300, - "end": 17303, + "start": 17302, + "end": 17305, "loc": { "start": { "line": 416, @@ -87451,8 +87451,8 @@ "postfix": false, "binop": null }, - "start": 17303, - "end": 17304, + "start": 17305, + "end": 17306, "loc": { "start": { "line": 416, @@ -87478,8 +87478,8 @@ "updateContext": null }, "value": "Converted normals: ", - "start": 17304, - "end": 17325, + "start": 17306, + "end": 17327, "loc": { "start": { "line": 416, @@ -87505,8 +87505,8 @@ "updateContext": null }, "value": "+", - "start": 17326, - "end": 17327, + "start": 17328, + "end": 17329, "loc": { "start": { "line": 416, @@ -87531,8 +87531,8 @@ "binop": null }, "value": "stats", - "start": 17328, - "end": 17333, + "start": 17330, + "end": 17335, "loc": { "start": { "line": 416, @@ -87557,8 +87557,8 @@ "binop": null, "updateContext": null }, - "start": 17333, - "end": 17334, + "start": 17335, + "end": 17336, "loc": { "start": { "line": 416, @@ -87583,8 +87583,8 @@ "binop": null }, "value": "numNormals", - "start": 17334, - "end": 17344, + "start": 17336, + "end": 17346, "loc": { "start": { "line": 416, @@ -87608,8 +87608,8 @@ "postfix": false, "binop": null }, - "start": 17344, - "end": 17345, + "start": 17346, + "end": 17347, "loc": { "start": { "line": 416, @@ -87634,8 +87634,8 @@ "binop": null, "updateContext": null }, - "start": 17345, - "end": 17346, + "start": 17347, + "end": 17348, "loc": { "start": { "line": 416, @@ -87660,8 +87660,8 @@ "binop": null }, "value": "log", - "start": 17367, - "end": 17370, + "start": 17369, + "end": 17372, "loc": { "start": { "line": 417, @@ -87685,8 +87685,8 @@ "postfix": false, "binop": null }, - "start": 17370, - "end": 17371, + "start": 17372, + "end": 17373, "loc": { "start": { "line": 417, @@ -87712,8 +87712,8 @@ "updateContext": null }, "value": "Converted tiles: ", - "start": 17371, - "end": 17390, + "start": 17373, + "end": 17392, "loc": { "start": { "line": 417, @@ -87739,8 +87739,8 @@ "updateContext": null }, "value": "+", - "start": 17391, - "end": 17392, + "start": 17393, + "end": 17394, "loc": { "start": { "line": 417, @@ -87765,8 +87765,8 @@ "binop": null }, "value": "xktModel", - "start": 17393, - "end": 17401, + "start": 17395, + "end": 17403, "loc": { "start": { "line": 417, @@ -87791,8 +87791,8 @@ "binop": null, "updateContext": null }, - "start": 17401, - "end": 17402, + "start": 17403, + "end": 17404, "loc": { "start": { "line": 417, @@ -87817,8 +87817,8 @@ "binop": null }, "value": "tilesList", - "start": 17402, - "end": 17411, + "start": 17404, + "end": 17413, "loc": { "start": { "line": 417, @@ -87843,8 +87843,8 @@ "binop": null, "updateContext": null }, - "start": 17411, - "end": 17412, + "start": 17413, + "end": 17414, "loc": { "start": { "line": 417, @@ -87869,8 +87869,8 @@ "binop": null }, "value": "length", - "start": 17412, - "end": 17418, + "start": 17414, + "end": 17420, "loc": { "start": { "line": 417, @@ -87894,8 +87894,8 @@ "postfix": false, "binop": null }, - "start": 17418, - "end": 17419, + "start": 17420, + "end": 17421, "loc": { "start": { "line": 417, @@ -87920,8 +87920,8 @@ "binop": null, "updateContext": null }, - "start": 17419, - "end": 17420, + "start": 17421, + "end": 17422, "loc": { "start": { "line": 417, @@ -87946,8 +87946,8 @@ "binop": null }, "value": "log", - "start": 17441, - "end": 17444, + "start": 17443, + "end": 17446, "loc": { "start": { "line": 418, @@ -87971,8 +87971,8 @@ "postfix": false, "binop": null }, - "start": 17444, - "end": 17445, + "start": 17446, + "end": 17447, "loc": { "start": { "line": 418, @@ -87998,8 +87998,8 @@ "updateContext": null }, "value": "minTileSize: ", - "start": 17445, - "end": 17460, + "start": 17447, + "end": 17462, "loc": { "start": { "line": 418, @@ -88025,8 +88025,8 @@ "updateContext": null }, "value": "+", - "start": 17461, - "end": 17462, + "start": 17463, + "end": 17464, "loc": { "start": { "line": 418, @@ -88051,8 +88051,8 @@ "binop": null }, "value": "stats", - "start": 17463, - "end": 17468, + "start": 17465, + "end": 17470, "loc": { "start": { "line": 418, @@ -88077,8 +88077,8 @@ "binop": null, "updateContext": null }, - "start": 17468, - "end": 17469, + "start": 17470, + "end": 17471, "loc": { "start": { "line": 418, @@ -88103,8 +88103,8 @@ "binop": null }, "value": "minTileSize", - "start": 17469, - "end": 17480, + "start": 17471, + "end": 17482, "loc": { "start": { "line": 418, @@ -88128,8 +88128,8 @@ "postfix": false, "binop": null }, - "start": 17480, - "end": 17481, + "start": 17482, + "end": 17483, "loc": { "start": { "line": 418, @@ -88154,8 +88154,8 @@ "binop": null, "updateContext": null }, - "start": 17481, - "end": 17482, + "start": 17483, + "end": 17484, "loc": { "start": { "line": 418, @@ -88182,8 +88182,8 @@ "updateContext": null }, "value": "if", - "start": 17504, - "end": 17506, + "start": 17506, + "end": 17508, "loc": { "start": { "line": 420, @@ -88207,8 +88207,8 @@ "postfix": false, "binop": null }, - "start": 17507, - "end": 17508, + "start": 17509, + "end": 17510, "loc": { "start": { "line": 420, @@ -88233,8 +88233,8 @@ "binop": null }, "value": "output", - "start": 17508, - "end": 17514, + "start": 17510, + "end": 17516, "loc": { "start": { "line": 420, @@ -88258,8 +88258,8 @@ "postfix": false, "binop": null }, - "start": 17514, - "end": 17515, + "start": 17516, + "end": 17517, "loc": { "start": { "line": 420, @@ -88283,8 +88283,8 @@ "postfix": false, "binop": null }, - "start": 17516, - "end": 17517, + "start": 17518, + "end": 17519, "loc": { "start": { "line": 420, @@ -88311,8 +88311,8 @@ "updateContext": null }, "value": "const", - "start": 17542, - "end": 17547, + "start": 17544, + "end": 17549, "loc": { "start": { "line": 421, @@ -88337,8 +88337,8 @@ "binop": null }, "value": "outputDir", - "start": 17548, - "end": 17557, + "start": 17550, + "end": 17559, "loc": { "start": { "line": 421, @@ -88364,8 +88364,8 @@ "updateContext": null }, "value": "=", - "start": 17558, - "end": 17559, + "start": 17560, + "end": 17561, "loc": { "start": { "line": 421, @@ -88390,8 +88390,8 @@ "binop": null }, "value": "path", - "start": 17560, - "end": 17564, + "start": 17562, + "end": 17566, "loc": { "start": { "line": 421, @@ -88416,8 +88416,8 @@ "binop": null, "updateContext": null }, - "start": 17564, - "end": 17565, + "start": 17566, + "end": 17567, "loc": { "start": { "line": 421, @@ -88442,8 +88442,8 @@ "binop": null }, "value": "dirname", - "start": 17565, - "end": 17572, + "start": 17567, + "end": 17574, "loc": { "start": { "line": 421, @@ -88467,8 +88467,8 @@ "postfix": false, "binop": null }, - "start": 17572, - "end": 17573, + "start": 17574, + "end": 17575, "loc": { "start": { "line": 421, @@ -88493,8 +88493,8 @@ "binop": null }, "value": "output", - "start": 17573, - "end": 17579, + "start": 17575, + "end": 17581, "loc": { "start": { "line": 421, @@ -88518,8 +88518,8 @@ "postfix": false, "binop": null }, - "start": 17579, - "end": 17580, + "start": 17581, + "end": 17582, "loc": { "start": { "line": 421, @@ -88544,8 +88544,8 @@ "binop": null, "updateContext": null }, - "start": 17580, - "end": 17581, + "start": 17582, + "end": 17583, "loc": { "start": { "line": 421, @@ -88572,8 +88572,8 @@ "updateContext": null }, "value": "if", - "start": 17606, - "end": 17608, + "start": 17608, + "end": 17610, "loc": { "start": { "line": 422, @@ -88597,8 +88597,8 @@ "postfix": false, "binop": null }, - "start": 17609, - "end": 17610, + "start": 17611, + "end": 17612, "loc": { "start": { "line": 422, @@ -88623,8 +88623,8 @@ "binop": null }, "value": "outputDir", - "start": 17610, - "end": 17619, + "start": 17612, + "end": 17621, "loc": { "start": { "line": 422, @@ -88650,8 +88650,8 @@ "updateContext": null }, "value": "!==", - "start": 17620, - "end": 17623, + "start": 17622, + "end": 17625, "loc": { "start": { "line": 422, @@ -88677,8 +88677,8 @@ "updateContext": null }, "value": "", - "start": 17624, - "end": 17626, + "start": 17626, + "end": 17628, "loc": { "start": { "line": 422, @@ -88704,8 +88704,8 @@ "updateContext": null }, "value": "&&", - "start": 17627, - "end": 17629, + "start": 17629, + "end": 17631, "loc": { "start": { "line": 422, @@ -88731,8 +88731,8 @@ "updateContext": null }, "value": "!", - "start": 17630, - "end": 17631, + "start": 17632, + "end": 17633, "loc": { "start": { "line": 422, @@ -88757,8 +88757,8 @@ "binop": null }, "value": "fs", - "start": 17631, - "end": 17633, + "start": 17633, + "end": 17635, "loc": { "start": { "line": 422, @@ -88783,8 +88783,8 @@ "binop": null, "updateContext": null }, - "start": 17633, - "end": 17634, + "start": 17635, + "end": 17636, "loc": { "start": { "line": 422, @@ -88809,8 +88809,8 @@ "binop": null }, "value": "existsSync", - "start": 17634, - "end": 17644, + "start": 17636, + "end": 17646, "loc": { "start": { "line": 422, @@ -88834,8 +88834,8 @@ "postfix": false, "binop": null }, - "start": 17644, - "end": 17645, + "start": 17646, + "end": 17647, "loc": { "start": { "line": 422, @@ -88860,8 +88860,8 @@ "binop": null }, "value": "outputDir", - "start": 17645, - "end": 17654, + "start": 17647, + "end": 17656, "loc": { "start": { "line": 422, @@ -88885,8 +88885,8 @@ "postfix": false, "binop": null }, - "start": 17654, - "end": 17655, + "start": 17656, + "end": 17657, "loc": { "start": { "line": 422, @@ -88910,8 +88910,8 @@ "postfix": false, "binop": null }, - "start": 17655, - "end": 17656, + "start": 17657, + "end": 17658, "loc": { "start": { "line": 422, @@ -88935,8 +88935,8 @@ "postfix": false, "binop": null }, - "start": 17657, - "end": 17658, + "start": 17659, + "end": 17660, "loc": { "start": { "line": 422, @@ -88961,8 +88961,8 @@ "binop": null }, "value": "fs", - "start": 17687, - "end": 17689, + "start": 17689, + "end": 17691, "loc": { "start": { "line": 423, @@ -88987,8 +88987,8 @@ "binop": null, "updateContext": null }, - "start": 17689, - "end": 17690, + "start": 17691, + "end": 17692, "loc": { "start": { "line": 423, @@ -89013,8 +89013,8 @@ "binop": null }, "value": "mkdirSync", - "start": 17690, - "end": 17699, + "start": 17692, + "end": 17701, "loc": { "start": { "line": 423, @@ -89038,8 +89038,8 @@ "postfix": false, "binop": null }, - "start": 17699, - "end": 17700, + "start": 17701, + "end": 17702, "loc": { "start": { "line": 423, @@ -89064,8 +89064,8 @@ "binop": null }, "value": "outputDir", - "start": 17700, - "end": 17709, + "start": 17702, + "end": 17711, "loc": { "start": { "line": 423, @@ -89090,8 +89090,8 @@ "binop": null, "updateContext": null }, - "start": 17709, - "end": 17710, + "start": 17711, + "end": 17712, "loc": { "start": { "line": 423, @@ -89115,8 +89115,8 @@ "postfix": false, "binop": null }, - "start": 17711, - "end": 17712, + "start": 17713, + "end": 17714, "loc": { "start": { "line": 423, @@ -89141,8 +89141,8 @@ "binop": null }, "value": "recursive", - "start": 17712, - "end": 17721, + "start": 17714, + "end": 17723, "loc": { "start": { "line": 423, @@ -89167,8 +89167,8 @@ "binop": null, "updateContext": null }, - "start": 17721, - "end": 17722, + "start": 17723, + "end": 17724, "loc": { "start": { "line": 423, @@ -89195,8 +89195,8 @@ "updateContext": null }, "value": "true", - "start": 17723, - "end": 17727, + "start": 17725, + "end": 17729, "loc": { "start": { "line": 423, @@ -89220,8 +89220,8 @@ "postfix": false, "binop": null }, - "start": 17727, - "end": 17728, + "start": 17729, + "end": 17730, "loc": { "start": { "line": 423, @@ -89245,8 +89245,8 @@ "postfix": false, "binop": null }, - "start": 17728, - "end": 17729, + "start": 17730, + "end": 17731, "loc": { "start": { "line": 423, @@ -89271,8 +89271,8 @@ "binop": null, "updateContext": null }, - "start": 17729, - "end": 17730, + "start": 17731, + "end": 17732, "loc": { "start": { "line": 423, @@ -89296,8 +89296,8 @@ "postfix": false, "binop": null }, - "start": 17755, - "end": 17756, + "start": 17757, + "end": 17758, "loc": { "start": { "line": 424, @@ -89322,8 +89322,8 @@ "binop": null }, "value": "log", - "start": 17781, - "end": 17784, + "start": 17783, + "end": 17786, "loc": { "start": { "line": 425, @@ -89347,8 +89347,8 @@ "postfix": false, "binop": null }, - "start": 17784, - "end": 17785, + "start": 17786, + "end": 17787, "loc": { "start": { "line": 425, @@ -89374,8 +89374,8 @@ "updateContext": null }, "value": "Writing XKT file: ", - "start": 17785, - "end": 17805, + "start": 17787, + "end": 17807, "loc": { "start": { "line": 425, @@ -89401,8 +89401,8 @@ "updateContext": null }, "value": "+", - "start": 17806, - "end": 17807, + "start": 17808, + "end": 17809, "loc": { "start": { "line": 425, @@ -89427,8 +89427,8 @@ "binop": null }, "value": "output", - "start": 17808, - "end": 17814, + "start": 17810, + "end": 17816, "loc": { "start": { "line": 425, @@ -89452,8 +89452,8 @@ "postfix": false, "binop": null }, - "start": 17814, - "end": 17815, + "start": 17816, + "end": 17817, "loc": { "start": { "line": 425, @@ -89478,8 +89478,8 @@ "binop": null, "updateContext": null }, - "start": 17815, - "end": 17816, + "start": 17817, + "end": 17818, "loc": { "start": { "line": 425, @@ -89504,8 +89504,8 @@ "binop": null }, "value": "fs", - "start": 17841, - "end": 17843, + "start": 17843, + "end": 17845, "loc": { "start": { "line": 426, @@ -89530,8 +89530,8 @@ "binop": null, "updateContext": null }, - "start": 17843, - "end": 17844, + "start": 17845, + "end": 17846, "loc": { "start": { "line": 426, @@ -89556,8 +89556,8 @@ "binop": null }, "value": "writeFileSync", - "start": 17844, - "end": 17857, + "start": 17846, + "end": 17859, "loc": { "start": { "line": 426, @@ -89581,8 +89581,8 @@ "postfix": false, "binop": null }, - "start": 17857, - "end": 17858, + "start": 17859, + "end": 17860, "loc": { "start": { "line": 426, @@ -89607,8 +89607,8 @@ "binop": null }, "value": "output", - "start": 17858, - "end": 17864, + "start": 17860, + "end": 17866, "loc": { "start": { "line": 426, @@ -89633,8 +89633,8 @@ "binop": null, "updateContext": null }, - "start": 17864, - "end": 17865, + "start": 17866, + "end": 17867, "loc": { "start": { "line": 426, @@ -89659,8 +89659,8 @@ "binop": null }, "value": "xktContent", - "start": 17866, - "end": 17876, + "start": 17868, + "end": 17878, "loc": { "start": { "line": 426, @@ -89684,8 +89684,8 @@ "postfix": false, "binop": null }, - "start": 17876, - "end": 17877, + "start": 17878, + "end": 17879, "loc": { "start": { "line": 426, @@ -89710,8 +89710,8 @@ "binop": null, "updateContext": null }, - "start": 17877, - "end": 17878, + "start": 17879, + "end": 17880, "loc": { "start": { "line": 426, @@ -89735,8 +89735,8 @@ "postfix": false, "binop": null }, - "start": 17899, - "end": 17900, + "start": 17901, + "end": 17902, "loc": { "start": { "line": 427, @@ -89763,8 +89763,8 @@ "updateContext": null }, "value": "if", - "start": 17922, - "end": 17924, + "start": 17924, + "end": 17926, "loc": { "start": { "line": 429, @@ -89788,8 +89788,8 @@ "postfix": false, "binop": null }, - "start": 17925, - "end": 17926, + "start": 17927, + "end": 17928, "loc": { "start": { "line": 429, @@ -89814,8 +89814,8 @@ "binop": null }, "value": "outputXKTModel", - "start": 17926, - "end": 17940, + "start": 17928, + "end": 17942, "loc": { "start": { "line": 429, @@ -89839,8 +89839,8 @@ "postfix": false, "binop": null }, - "start": 17940, - "end": 17941, + "start": 17942, + "end": 17943, "loc": { "start": { "line": 429, @@ -89864,8 +89864,8 @@ "postfix": false, "binop": null }, - "start": 17942, - "end": 17943, + "start": 17944, + "end": 17945, "loc": { "start": { "line": 429, @@ -89890,8 +89890,8 @@ "binop": null }, "value": "outputXKTModel", - "start": 17968, - "end": 17982, + "start": 17970, + "end": 17984, "loc": { "start": { "line": 430, @@ -89915,8 +89915,8 @@ "postfix": false, "binop": null }, - "start": 17982, - "end": 17983, + "start": 17984, + "end": 17985, "loc": { "start": { "line": 430, @@ -89941,8 +89941,8 @@ "binop": null }, "value": "xktModel", - "start": 17983, - "end": 17991, + "start": 17985, + "end": 17993, "loc": { "start": { "line": 430, @@ -89966,8 +89966,8 @@ "postfix": false, "binop": null }, - "start": 17991, - "end": 17992, + "start": 17993, + "end": 17994, "loc": { "start": { "line": 430, @@ -89992,8 +89992,8 @@ "binop": null, "updateContext": null }, - "start": 17992, - "end": 17993, + "start": 17994, + "end": 17995, "loc": { "start": { "line": 430, @@ -90017,8 +90017,8 @@ "postfix": false, "binop": null }, - "start": 18014, - "end": 18015, + "start": 18016, + "end": 18017, "loc": { "start": { "line": 431, @@ -90045,8 +90045,8 @@ "updateContext": null }, "value": "if", - "start": 18037, - "end": 18039, + "start": 18039, + "end": 18041, "loc": { "start": { "line": 433, @@ -90070,8 +90070,8 @@ "postfix": false, "binop": null }, - "start": 18040, - "end": 18041, + "start": 18042, + "end": 18043, "loc": { "start": { "line": 433, @@ -90096,8 +90096,8 @@ "binop": null }, "value": "outputXKT", - "start": 18041, - "end": 18050, + "start": 18043, + "end": 18052, "loc": { "start": { "line": 433, @@ -90121,8 +90121,8 @@ "postfix": false, "binop": null }, - "start": 18050, - "end": 18051, + "start": 18052, + "end": 18053, "loc": { "start": { "line": 433, @@ -90146,8 +90146,8 @@ "postfix": false, "binop": null }, - "start": 18052, - "end": 18053, + "start": 18054, + "end": 18055, "loc": { "start": { "line": 433, @@ -90172,8 +90172,8 @@ "binop": null }, "value": "outputXKT", - "start": 18078, - "end": 18087, + "start": 18080, + "end": 18089, "loc": { "start": { "line": 434, @@ -90197,8 +90197,8 @@ "postfix": false, "binop": null }, - "start": 18087, - "end": 18088, + "start": 18089, + "end": 18090, "loc": { "start": { "line": 434, @@ -90223,8 +90223,8 @@ "binop": null }, "value": "xktContent", - "start": 18088, - "end": 18098, + "start": 18090, + "end": 18100, "loc": { "start": { "line": 434, @@ -90248,8 +90248,8 @@ "postfix": false, "binop": null }, - "start": 18098, - "end": 18099, + "start": 18100, + "end": 18101, "loc": { "start": { "line": 434, @@ -90274,8 +90274,8 @@ "binop": null, "updateContext": null }, - "start": 18099, - "end": 18100, + "start": 18101, + "end": 18102, "loc": { "start": { "line": 434, @@ -90299,8 +90299,8 @@ "postfix": false, "binop": null }, - "start": 18121, - "end": 18122, + "start": 18123, + "end": 18124, "loc": { "start": { "line": 435, @@ -90327,8 +90327,8 @@ "updateContext": null }, "value": "if", - "start": 18144, - "end": 18146, + "start": 18146, + "end": 18148, "loc": { "start": { "line": 437, @@ -90352,8 +90352,8 @@ "postfix": false, "binop": null }, - "start": 18147, - "end": 18148, + "start": 18149, + "end": 18150, "loc": { "start": { "line": 437, @@ -90378,8 +90378,8 @@ "binop": null }, "value": "outputStats", - "start": 18148, - "end": 18159, + "start": 18150, + "end": 18161, "loc": { "start": { "line": 437, @@ -90403,8 +90403,8 @@ "postfix": false, "binop": null }, - "start": 18159, - "end": 18160, + "start": 18161, + "end": 18162, "loc": { "start": { "line": 437, @@ -90428,8 +90428,8 @@ "postfix": false, "binop": null }, - "start": 18161, - "end": 18162, + "start": 18163, + "end": 18164, "loc": { "start": { "line": 437, @@ -90454,8 +90454,8 @@ "binop": null }, "value": "outputStats", - "start": 18187, - "end": 18198, + "start": 18189, + "end": 18200, "loc": { "start": { "line": 438, @@ -90479,8 +90479,8 @@ "postfix": false, "binop": null }, - "start": 18198, - "end": 18199, + "start": 18200, + "end": 18201, "loc": { "start": { "line": 438, @@ -90505,8 +90505,8 @@ "binop": null }, "value": "stats", - "start": 18199, - "end": 18204, + "start": 18201, + "end": 18206, "loc": { "start": { "line": 438, @@ -90530,8 +90530,8 @@ "postfix": false, "binop": null }, - "start": 18204, - "end": 18205, + "start": 18206, + "end": 18207, "loc": { "start": { "line": 438, @@ -90556,8 +90556,8 @@ "binop": null, "updateContext": null }, - "start": 18205, - "end": 18206, + "start": 18207, + "end": 18208, "loc": { "start": { "line": 438, @@ -90581,8 +90581,8 @@ "postfix": false, "binop": null }, - "start": 18227, - "end": 18228, + "start": 18229, + "end": 18230, "loc": { "start": { "line": 439, @@ -90607,8 +90607,8 @@ "binop": null }, "value": "resolve", - "start": 18250, - "end": 18257, + "start": 18252, + "end": 18259, "loc": { "start": { "line": 441, @@ -90632,8 +90632,8 @@ "postfix": false, "binop": null }, - "start": 18257, - "end": 18258, + "start": 18259, + "end": 18260, "loc": { "start": { "line": 441, @@ -90657,8 +90657,8 @@ "postfix": false, "binop": null }, - "start": 18258, - "end": 18259, + "start": 18260, + "end": 18261, "loc": { "start": { "line": 441, @@ -90683,8 +90683,8 @@ "binop": null, "updateContext": null }, - "start": 18259, - "end": 18260, + "start": 18261, + "end": 18262, "loc": { "start": { "line": 441, @@ -90708,8 +90708,8 @@ "postfix": false, "binop": null }, - "start": 18277, - "end": 18278, + "start": 18279, + "end": 18280, "loc": { "start": { "line": 442, @@ -90733,8 +90733,8 @@ "postfix": false, "binop": null }, - "start": 18278, - "end": 18279, + "start": 18280, + "end": 18281, "loc": { "start": { "line": 442, @@ -90759,8 +90759,8 @@ "binop": null, "updateContext": null }, - "start": 18279, - "end": 18280, + "start": 18281, + "end": 18282, "loc": { "start": { "line": 442, @@ -90784,8 +90784,8 @@ "postfix": false, "binop": null }, - "start": 18293, - "end": 18294, + "start": 18295, + "end": 18296, "loc": { "start": { "line": 443, @@ -90810,8 +90810,8 @@ "binop": null, "updateContext": null }, - "start": 18294, - "end": 18295, + "start": 18296, + "end": 18297, "loc": { "start": { "line": 443, @@ -90835,8 +90835,8 @@ "postfix": false, "binop": null }, - "start": 18296, - "end": 18297, + "start": 18298, + "end": 18299, "loc": { "start": { "line": 443, @@ -90861,8 +90861,8 @@ "binop": null }, "value": "err", - "start": 18297, - "end": 18300, + "start": 18299, + "end": 18302, "loc": { "start": { "line": 443, @@ -90886,8 +90886,8 @@ "postfix": false, "binop": null }, - "start": 18300, - "end": 18301, + "start": 18302, + "end": 18303, "loc": { "start": { "line": 443, @@ -90912,8 +90912,8 @@ "binop": null, "updateContext": null }, - "start": 18302, - "end": 18304, + "start": 18304, + "end": 18306, "loc": { "start": { "line": 443, @@ -90937,8 +90937,8 @@ "postfix": false, "binop": null }, - "start": 18305, - "end": 18306, + "start": 18307, + "end": 18308, "loc": { "start": { "line": 443, @@ -90963,8 +90963,8 @@ "binop": null }, "value": "reject", - "start": 18323, - "end": 18329, + "start": 18325, + "end": 18331, "loc": { "start": { "line": 444, @@ -90988,8 +90988,8 @@ "postfix": false, "binop": null }, - "start": 18329, - "end": 18330, + "start": 18331, + "end": 18332, "loc": { "start": { "line": 444, @@ -91014,8 +91014,8 @@ "binop": null }, "value": "err", - "start": 18330, - "end": 18333, + "start": 18332, + "end": 18335, "loc": { "start": { "line": 444, @@ -91039,8 +91039,8 @@ "postfix": false, "binop": null }, - "start": 18333, - "end": 18334, + "start": 18335, + "end": 18336, "loc": { "start": { "line": 444, @@ -91065,8 +91065,8 @@ "binop": null, "updateContext": null }, - "start": 18334, - "end": 18335, + "start": 18336, + "end": 18337, "loc": { "start": { "line": 444, @@ -91090,8 +91090,8 @@ "postfix": false, "binop": null }, - "start": 18348, - "end": 18349, + "start": 18350, + "end": 18351, "loc": { "start": { "line": 445, @@ -91115,8 +91115,8 @@ "postfix": false, "binop": null }, - "start": 18349, - "end": 18350, + "start": 18351, + "end": 18352, "loc": { "start": { "line": 445, @@ -91141,8 +91141,8 @@ "binop": null, "updateContext": null }, - "start": 18350, - "end": 18351, + "start": 18352, + "end": 18353, "loc": { "start": { "line": 445, @@ -91166,8 +91166,8 @@ "postfix": false, "binop": null }, - "start": 18360, - "end": 18361, + "start": 18362, + "end": 18363, "loc": { "start": { "line": 446, @@ -91191,8 +91191,8 @@ "postfix": false, "binop": null }, - "start": 18366, - "end": 18367, + "start": 18368, + "end": 18369, "loc": { "start": { "line": 447, @@ -91216,8 +91216,8 @@ "postfix": false, "binop": null }, - "start": 18367, - "end": 18368, + "start": 18369, + "end": 18370, "loc": { "start": { "line": 447, @@ -91242,8 +91242,8 @@ "binop": null, "updateContext": null }, - "start": 18368, - "end": 18369, + "start": 18370, + "end": 18371, "loc": { "start": { "line": 447, @@ -91267,8 +91267,8 @@ "postfix": false, "binop": null }, - "start": 18370, - "end": 18371, + "start": 18372, + "end": 18373, "loc": { "start": { "line": 448, @@ -91295,8 +91295,8 @@ "updateContext": null }, "value": "export", - "start": 18373, - "end": 18379, + "start": 18375, + "end": 18381, "loc": { "start": { "line": 450, @@ -91320,8 +91320,8 @@ "postfix": false, "binop": null }, - "start": 18380, - "end": 18381, + "start": 18382, + "end": 18383, "loc": { "start": { "line": 450, @@ -91346,8 +91346,8 @@ "binop": null }, "value": "convert2xkt", - "start": 18381, - "end": 18392, + "start": 18383, + "end": 18394, "loc": { "start": { "line": 450, @@ -91371,8 +91371,8 @@ "postfix": false, "binop": null }, - "start": 18392, - "end": 18393, + "start": 18394, + "end": 18395, "loc": { "start": { "line": 450, @@ -91397,8 +91397,8 @@ "binop": null, "updateContext": null }, - "start": 18393, - "end": 18394, + "start": 18395, + "end": 18396, "loc": { "start": { "line": 450, @@ -91423,8 +91423,8 @@ "binop": null, "updateContext": null }, - "start": 18394, - "end": 18394, + "start": 18396, + "end": 18396, "loc": { "start": { "line": 450, diff --git a/docs/file/src/convert2xkt.js.html b/docs/file/src/convert2xkt.js.html index 3093312..22ddd28 100644 --- a/docs/file/src/convert2xkt.js.html +++ b/docs/file/src/convert2xkt.js.html @@ -202,7 +202,7 @@ stats.aabb = null; function getFileExtension(fileName) { - let ext = path.extname(source); + let ext = path.extname(fileName); if (ext.charAt(0) === ".") { ext = ext.substring(1); } diff --git a/docs/index.json b/docs/index.json index 78a79ea..b58ace8 100644 --- a/docs/index.json +++ b/docs/index.json @@ -7934,7 +7934,7 @@ "__docId__": 328, "kind": "file", "name": "src/convert2xkt.js", - "content": "import {XKT_INFO} from \"./XKT_INFO.js\";\nimport {XKTModel} from \"./XKTModel/XKTModel.js\";\nimport {parseCityJSONIntoXKTModel} from \"./parsers/parseCityJSONIntoXKTModel.js\";\nimport {parseGLTFIntoXKTModel} from \"./parsers/parseGLTFIntoXKTModel.js\";\nimport {parseIFCIntoXKTModel} from \"./parsers/parseIFCIntoXKTModel.js\";\nimport {parseLASIntoXKTModel} from \"./parsers/parseLASIntoXKTModel.js\";\nimport {parsePCDIntoXKTModel} from \"./parsers/parsePCDIntoXKTModel.js\";\nimport {parsePLYIntoXKTModel} from \"./parsers/parsePLYIntoXKTModel.js\";\nimport {parseSTLIntoXKTModel} from \"./parsers/parseSTLIntoXKTModel.js\";\nimport {writeXKTModelToArrayBuffer} from \"./XKTModel/writeXKTModelToArrayBuffer.js\";\n\nimport {toArrayBuffer} from \"./XKTModel/lib/toArraybuffer\";\n\nconst fs = require('fs');\nconst path = require(\"path\");\n\n/**\n * Converts model files into xeokit's native XKT format.\n *\n * Supported source formats are: IFC, CityJSON, glTF, LAZ and LAS.\n *\n * **Only bundled in xeokit-convert.cjs.js.**\n *\n * ## Usage\n *\n * ````javascript\n * const convert2xkt = require(\"@xeokit/xeokit-convert/dist/convert2xkt.cjs.js\");\n * const fs = require('fs');\n *\n * convert2xkt({\n * sourceData: fs.readFileSync(\"rme_advanced_sample_project.ifc\"),\n * outputXKT: (xtkArrayBuffer) => {\n * fs.writeFileSync(\"rme_advanced_sample_project.ifc.xkt\", xtkArrayBuffer);\n * }\n * }).then(() => {\n * console.log(\"Converted.\");\n * }, (errMsg) => {\n * console.error(\"Conversion failed: \" + errMsg)\n * });\n ````\n * @param {Object} params Conversion parameters.\n * @param {Object} params.WebIFC The WebIFC library. We pass this in as an external dependency, in order to give the\n * caller the choice of whether to use the Browser or NodeJS version.\n * @param {*} [params.configs] Configurations.\n * @param {String} [params.source] Path to source file. Alternative to ````sourceData````.\n * @param {ArrayBuffer|JSON} [params.sourceData] Source file data. Alternative to ````source````.\n * @param {String} [params.sourceFormat] Format of source file/data. Always needed with ````sourceData````, but not normally needed with ````source````, because convert2xkt will determine the format automatically from the file extension of ````source````.\n * @param {String} [params.metaModelDataStr] Source file data. Overrides metadata from ````metaModelSource````, ````sourceData```` and ````source````.\n * @param {String} [params.metaModelSource] Path to source metaModel file. Overrides metadata from ````sourceData```` and ````source````. Overridden by ````metaModelData````.\n * @param {String} [params.output] Path to destination XKT file. Directories on this path are automatically created if not existing.\n * @param {Function} [params.outputXKTModel] Callback to collect the ````XKTModel```` that is internally build by this method.\n * @param {Function} [params.outputXKT] Callback to collect XKT file data.\n * @param {String[]} [params.includeTypes] Option to only convert objects of these types.\n * @param {String[]} [params.excludeTypes] Option to never convert objects of these types.\n * @param {Object} [stats] Collects conversion statistics. Statistics are attached to this object if provided.\n * @param {Function} [params.outputStats] Callback to collect statistics.\n * @param {Boolean} [params.rotateX=false] Whether to rotate the model 90 degrees about the X axis to make the Y axis \"up\", if necessary. Applies to CityJSON and LAS/LAZ models.\n * @param {Boolean} [params.reuseGeometries=true] When true, will enable geometry reuse within the XKT. When false,\n * will automatically \"expand\" all reused geometries into duplicate copies. This has the drawback of increasing the XKT\n * file size (~10-30% for typical models), but can make the model more responsive in the xeokit Viewer, especially if the model\n * has excessive geometry reuse. An example of excessive geometry reuse would be when a model (eg. glTF) has 4000 geometries that are\n * shared amongst 2000 objects, ie. a large number of geometries with a low amount of reuse, which can present a\n * pathological performance case for xeokit's underlying graphics APIs (WebGL, WebGPU etc).\n * @param {Boolean} [params.includeTextures=true] Whether to convert textures. Only works for ````glTF```` models.\n * @param {Boolean} [params.includeNormals=true] Whether to convert normals. When false, the parser will ignore\n * geometry normals, and the modelwill rely on the xeokit ````Viewer```` to automatically generate them. This has\n * the limitation that the normals will be face-aligned, and therefore the ````Viewer```` will only be able to render\n * a flat-shaded non-PBR representation of the model.\n * @param {Number} [params.minTileSize=200] Minimum RTC coordinate tile size. Set this to a value between 100 and 10000,\n * depending on how far from the coordinate origin the model's vertex positions are; specify larger tile sizes when close\n * to the origin, and smaller sizes when distant. This compensates for decreasing precision as floats get bigger.\n * @param {Function} [params.log] Logging callback.\n * @return {Promise}\n */\nfunction convert2xkt({\n WebIFC,\n configs,\n source,\n sourceData,\n sourceFormat,\n metaModelSource,\n metaModelDataStr,\n modelAABB,\n output,\n outputXKTModel,\n outputXKT,\n includeTypes,\n excludeTypes,\n reuseGeometries = true,\n minTileSize = 200,\n stats = {},\n outputStats,\n rotateX = false,\n includeTextures = true,\n includeNormals = true,\n log = function (msg) {\n }\n }) {\n\n stats.sourceFormat = \"\";\n stats.schemaVersion = \"\";\n stats.title = \"\";\n stats.author = \"\";\n stats.created = \"\";\n stats.numMetaObjects = 0;\n stats.numPropertySets = 0;\n stats.numTriangles = 0;\n stats.numVertices = 0;\n stats.numNormals = 0;\n stats.numUVs = 0;\n stats.numTextures = 0;\n stats.numTextureSets = 0;\n stats.numObjects = 0;\n stats.numGeometries = 0;\n stats.sourceSize = 0;\n stats.xktSize = 0;\n stats.texturesSize = 0;\n stats.xktVersion = \"\";\n stats.compressionRatio = 0;\n stats.conversionTime = 0;\n stats.aabb = null;\n\n function getFileExtension(fileName) {\n let ext = path.extname(source);\n if (ext.charAt(0) === \".\") {\n ext = ext.substring(1);\n }\n return ext;\n }\n\n return new Promise(function (resolve, reject) {\n const _log = log;\n log = (msg) => {\n _log(`[convert2xkt] ${msg}`)\n }\n\n if (!source && !sourceData) {\n reject(\"Argument expected: source or sourceData\");\n return;\n }\n\n if (!sourceFormat && sourceData) {\n reject(\"Argument expected: sourceFormat is required with sourceData\");\n return;\n }\n\n if (!output && !outputXKTModel && !outputXKT) {\n reject(\"Argument expected: output, outputXKTModel or outputXKT\");\n return;\n }\n\n if (source) {\n log('Reading input file: ' + source);\n }\n\n const startTime = new Date();\n\n const sourceConfigs = configs.sourceConfigs || {};\n const ext = sourceFormat || getFileExtension(source);\n\n log(`Input file extension: \"${ext}\"`);\n\n let fileTypeConfigs = sourceConfigs[ext];\n\n if (!fileTypeConfigs) {\n log(`[WARNING] Could not find configs sourceConfigs entry for source format \"${ext}\". This is derived from the source file name extension. Will use internal default configs.`);\n fileTypeConfigs = {};\n }\n function overrideOption(option1, option2) {\n if (option1 !== undefined) {\n return option1;\n }\n return option2;\n }\n\n if (!sourceData) {\n try {\n sourceData = fs.readFileSync(source);\n } catch (err) {\n reject(err);\n return;\n }\n }\n\n const sourceFileSizeBytes = sourceData.byteLength;\n\n log(\"Input file size: \" + (sourceFileSizeBytes / 1000).toFixed(2) + \" kB\");\n\n if (!metaModelDataStr && metaModelSource) {\n log('Reading input metadata file: ' + metaModelSource);\n try {\n metaModelDataStr = fs.readFileSync(metaModelSource);\n } catch (err) {\n reject(err);\n return;\n }\n } else {\n log(`Not embedding metadata in XKT`);\n }\n\n let metaModelJSON;\n\n if (metaModelDataStr) {\n try {\n metaModelJSON = JSON.parse(metaModelDataStr);\n } catch (e) {\n metaModelJSON = {};\n log(`Error parsing metadata JSON: ${e}`);\n }\n }\n\n minTileSize = overrideOption(fileTypeConfigs.minTileSize, minTileSize);\n rotateX = overrideOption(fileTypeConfigs.rotateX, rotateX);\n reuseGeometries = overrideOption(fileTypeConfigs.reuseGeometries, reuseGeometries);\n includeTextures = overrideOption(fileTypeConfigs.includeTextures, includeTextures);\n includeNormals = overrideOption(fileTypeConfigs.includeNormals, includeNormals);\n includeTypes = overrideOption(fileTypeConfigs.includeTypes, includeTypes);\n excludeTypes = overrideOption(fileTypeConfigs.excludeTypes, excludeTypes);\n\n if (reuseGeometries === false) {\n log(\"Geometry reuse is disabled\");\n }\n\n const xktModel = new XKTModel({\n minTileSize,\n modelAABB\n });\n\n switch (ext) {\n case \"json\":\n convert(parseCityJSONIntoXKTModel, {\n data: JSON.parse(sourceData),\n xktModel,\n stats,\n rotateX,\n center: fileTypeConfigs.center,\n transform: fileTypeConfigs.transform,\n log\n });\n break;\n\n case \"glb\":\n sourceData = toArrayBuffer(sourceData);\n convert(parseGLTFIntoXKTModel, {\n data: sourceData,\n reuseGeometries,\n includeTextures: true,\n includeNormals,\n metaModelData: metaModelJSON,\n xktModel,\n stats,\n log\n });\n break;\n\n case \"gltf\":\n sourceData = toArrayBuffer(sourceData);\n const gltfBasePath = source ? path.dirname(source) : \"\";\n convert(parseGLTFIntoXKTModel, {\n baseUri: gltfBasePath,\n data: sourceData,\n reuseGeometries,\n includeTextures: true,\n includeNormals,\n metaModelData: metaModelJSON,\n xktModel,\n stats,\n log\n });\n break;\n\n // case \"gltf\":\n // const gltfJSON = JSON.parse(sourceData);\n // const gltfBasePath = source ? getBasePath(source) : \"\";\n // convert(parseGLTFIntoXKTModel, {\n // baseUri: gltfBasePath,\n // data: gltfJSON,\n // reuseGeometries,\n // includeTextures,\n // includeNormals,\n // metaModelData: metaModelJSON,\n // xktModel,\n // getAttachment: async (name) => {\n // const filePath = gltfBasePath + name;\n // log(`Reading attachment file: ${filePath}`);\n // const buffer = fs.readFileSync(filePath);\n // const arrayBuf = toArrayBuffer(buffer);\n // return arrayBuf;\n // },\n // stats,\n // log\n // });\n // break;\n\n case \"ifc\":\n convert(parseIFCIntoXKTModel, {\n WebIFC,\n data: sourceData,\n xktModel,\n wasmPath: \"./\",\n includeTypes,\n excludeTypes,\n stats,\n log\n });\n break;\n\n case \"laz\":\n convert(parseLASIntoXKTModel, {\n data: sourceData,\n xktModel,\n stats,\n fp64: fileTypeConfigs.fp64,\n colorDepth: fileTypeConfigs.colorDepth,\n center: fileTypeConfigs.center,\n transform: fileTypeConfigs.transform,\n skip: overrideOption(fileTypeConfigs.skip, 1),\n log\n });\n break;\n\n case \"las\":\n convert(parseLASIntoXKTModel, {\n data: sourceData,\n xktModel,\n stats,\n fp64: fileTypeConfigs.fp64,\n colorDepth: fileTypeConfigs.colorDepth,\n center: fileTypeConfigs.center,\n transform: fileTypeConfigs.transform,\n skip: overrideOption(fileTypeConfigs.skip, 1),\n log\n });\n break;\n\n case \"pcd\":\n convert(parsePCDIntoXKTModel, {\n data: sourceData,\n xktModel,\n stats,\n log\n });\n break;\n\n case \"ply\":\n convert(parsePLYIntoXKTModel, {\n data: sourceData,\n xktModel,\n stats,\n log\n });\n break;\n\n case \"stl\":\n convert(parseSTLIntoXKTModel, {\n data: sourceData,\n xktModel,\n stats,\n log\n });\n break;\n\n default:\n reject(`Error: unsupported source format: \"${ext}\".`);\n return;\n }\n\n function convert(parser, converterParams) {\n\n parser(converterParams).then(() => {\n\n if (!metaModelJSON) {\n log(\"Creating default metamodel in XKT\");\n xktModel.createDefaultMetaObjects();\n }\n\n log(\"Input file parsed OK. Building XKT document...\");\n\n xktModel.finalize().then(() => {\n\n log(\"XKT document built OK. Writing to XKT file...\");\n\n const xktArrayBuffer = writeXKTModelToArrayBuffer(xktModel, metaModelJSON, stats, {zip: true});\n\n const xktContent = Buffer.from(xktArrayBuffer);\n\n const targetFileSizeBytes = xktArrayBuffer.byteLength;\n\n stats.minTileSize = minTileSize || 200;\n stats.sourceSize = (sourceFileSizeBytes / 1000).toFixed(2);\n stats.xktSize = (targetFileSizeBytes / 1000).toFixed(2);\n stats.xktVersion = XKT_INFO.xktVersion;\n stats.compressionRatio = (sourceFileSizeBytes / targetFileSizeBytes).toFixed(2);\n stats.conversionTime = ((new Date() - startTime) / 1000.0).toFixed(2);\n stats.aabb = xktModel.aabb;\n log(`Converted to: XKT v${stats.xktVersion}`);\n if (includeTypes) {\n log(\"Include types: \" + (includeTypes ? includeTypes : \"(include all)\"));\n }\n if (excludeTypes) {\n log(\"Exclude types: \" + (excludeTypes ? excludeTypes : \"(exclude none)\"));\n }\n log(\"XKT size: \" + stats.xktSize + \" kB\");\n log(\"XKT textures size: \" + (stats.texturesSize / 1000).toFixed(2) + \"kB\");\n log(\"Compression ratio: \" + stats.compressionRatio);\n log(\"Conversion time: \" + stats.conversionTime + \" s\");\n log(\"Converted metaobjects: \" + stats.numMetaObjects);\n log(\"Converted property sets: \" + stats.numPropertySets);\n log(\"Converted drawable objects: \" + stats.numObjects);\n log(\"Converted geometries: \" + stats.numGeometries);\n log(\"Converted textures: \" + stats.numTextures);\n log(\"Converted textureSets: \" + stats.numTextureSets);\n log(\"Converted triangles: \" + stats.numTriangles);\n log(\"Converted vertices: \" + stats.numVertices);\n log(\"Converted UVs: \" + stats.numUVs);\n log(\"Converted normals: \" + stats.numNormals);\n log(\"Converted tiles: \" + xktModel.tilesList.length);\n log(\"minTileSize: \" + stats.minTileSize);\n\n if (output) {\n const outputDir = path.dirname(output);\n if (outputDir !== \"\" && !fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, {recursive: true});\n }\n log('Writing XKT file: ' + output);\n fs.writeFileSync(output, xktContent);\n }\n\n if (outputXKTModel) {\n outputXKTModel(xktModel);\n }\n\n if (outputXKT) {\n outputXKT(xktContent);\n }\n\n if (outputStats) {\n outputStats(stats);\n }\n\n resolve();\n });\n }, (err) => {\n reject(err);\n });\n }\n });\n}\n\nexport {convert2xkt};", + "content": "import {XKT_INFO} from \"./XKT_INFO.js\";\nimport {XKTModel} from \"./XKTModel/XKTModel.js\";\nimport {parseCityJSONIntoXKTModel} from \"./parsers/parseCityJSONIntoXKTModel.js\";\nimport {parseGLTFIntoXKTModel} from \"./parsers/parseGLTFIntoXKTModel.js\";\nimport {parseIFCIntoXKTModel} from \"./parsers/parseIFCIntoXKTModel.js\";\nimport {parseLASIntoXKTModel} from \"./parsers/parseLASIntoXKTModel.js\";\nimport {parsePCDIntoXKTModel} from \"./parsers/parsePCDIntoXKTModel.js\";\nimport {parsePLYIntoXKTModel} from \"./parsers/parsePLYIntoXKTModel.js\";\nimport {parseSTLIntoXKTModel} from \"./parsers/parseSTLIntoXKTModel.js\";\nimport {writeXKTModelToArrayBuffer} from \"./XKTModel/writeXKTModelToArrayBuffer.js\";\n\nimport {toArrayBuffer} from \"./XKTModel/lib/toArraybuffer\";\n\nconst fs = require('fs');\nconst path = require(\"path\");\n\n/**\n * Converts model files into xeokit's native XKT format.\n *\n * Supported source formats are: IFC, CityJSON, glTF, LAZ and LAS.\n *\n * **Only bundled in xeokit-convert.cjs.js.**\n *\n * ## Usage\n *\n * ````javascript\n * const convert2xkt = require(\"@xeokit/xeokit-convert/dist/convert2xkt.cjs.js\");\n * const fs = require('fs');\n *\n * convert2xkt({\n * sourceData: fs.readFileSync(\"rme_advanced_sample_project.ifc\"),\n * outputXKT: (xtkArrayBuffer) => {\n * fs.writeFileSync(\"rme_advanced_sample_project.ifc.xkt\", xtkArrayBuffer);\n * }\n * }).then(() => {\n * console.log(\"Converted.\");\n * }, (errMsg) => {\n * console.error(\"Conversion failed: \" + errMsg)\n * });\n ````\n * @param {Object} params Conversion parameters.\n * @param {Object} params.WebIFC The WebIFC library. We pass this in as an external dependency, in order to give the\n * caller the choice of whether to use the Browser or NodeJS version.\n * @param {*} [params.configs] Configurations.\n * @param {String} [params.source] Path to source file. Alternative to ````sourceData````.\n * @param {ArrayBuffer|JSON} [params.sourceData] Source file data. Alternative to ````source````.\n * @param {String} [params.sourceFormat] Format of source file/data. Always needed with ````sourceData````, but not normally needed with ````source````, because convert2xkt will determine the format automatically from the file extension of ````source````.\n * @param {String} [params.metaModelDataStr] Source file data. Overrides metadata from ````metaModelSource````, ````sourceData```` and ````source````.\n * @param {String} [params.metaModelSource] Path to source metaModel file. Overrides metadata from ````sourceData```` and ````source````. Overridden by ````metaModelData````.\n * @param {String} [params.output] Path to destination XKT file. Directories on this path are automatically created if not existing.\n * @param {Function} [params.outputXKTModel] Callback to collect the ````XKTModel```` that is internally build by this method.\n * @param {Function} [params.outputXKT] Callback to collect XKT file data.\n * @param {String[]} [params.includeTypes] Option to only convert objects of these types.\n * @param {String[]} [params.excludeTypes] Option to never convert objects of these types.\n * @param {Object} [stats] Collects conversion statistics. Statistics are attached to this object if provided.\n * @param {Function} [params.outputStats] Callback to collect statistics.\n * @param {Boolean} [params.rotateX=false] Whether to rotate the model 90 degrees about the X axis to make the Y axis \"up\", if necessary. Applies to CityJSON and LAS/LAZ models.\n * @param {Boolean} [params.reuseGeometries=true] When true, will enable geometry reuse within the XKT. When false,\n * will automatically \"expand\" all reused geometries into duplicate copies. This has the drawback of increasing the XKT\n * file size (~10-30% for typical models), but can make the model more responsive in the xeokit Viewer, especially if the model\n * has excessive geometry reuse. An example of excessive geometry reuse would be when a model (eg. glTF) has 4000 geometries that are\n * shared amongst 2000 objects, ie. a large number of geometries with a low amount of reuse, which can present a\n * pathological performance case for xeokit's underlying graphics APIs (WebGL, WebGPU etc).\n * @param {Boolean} [params.includeTextures=true] Whether to convert textures. Only works for ````glTF```` models.\n * @param {Boolean} [params.includeNormals=true] Whether to convert normals. When false, the parser will ignore\n * geometry normals, and the modelwill rely on the xeokit ````Viewer```` to automatically generate them. This has\n * the limitation that the normals will be face-aligned, and therefore the ````Viewer```` will only be able to render\n * a flat-shaded non-PBR representation of the model.\n * @param {Number} [params.minTileSize=200] Minimum RTC coordinate tile size. Set this to a value between 100 and 10000,\n * depending on how far from the coordinate origin the model's vertex positions are; specify larger tile sizes when close\n * to the origin, and smaller sizes when distant. This compensates for decreasing precision as floats get bigger.\n * @param {Function} [params.log] Logging callback.\n * @return {Promise}\n */\nfunction convert2xkt({\n WebIFC,\n configs,\n source,\n sourceData,\n sourceFormat,\n metaModelSource,\n metaModelDataStr,\n modelAABB,\n output,\n outputXKTModel,\n outputXKT,\n includeTypes,\n excludeTypes,\n reuseGeometries = true,\n minTileSize = 200,\n stats = {},\n outputStats,\n rotateX = false,\n includeTextures = true,\n includeNormals = true,\n log = function (msg) {\n }\n }) {\n\n stats.sourceFormat = \"\";\n stats.schemaVersion = \"\";\n stats.title = \"\";\n stats.author = \"\";\n stats.created = \"\";\n stats.numMetaObjects = 0;\n stats.numPropertySets = 0;\n stats.numTriangles = 0;\n stats.numVertices = 0;\n stats.numNormals = 0;\n stats.numUVs = 0;\n stats.numTextures = 0;\n stats.numTextureSets = 0;\n stats.numObjects = 0;\n stats.numGeometries = 0;\n stats.sourceSize = 0;\n stats.xktSize = 0;\n stats.texturesSize = 0;\n stats.xktVersion = \"\";\n stats.compressionRatio = 0;\n stats.conversionTime = 0;\n stats.aabb = null;\n\n function getFileExtension(fileName) {\n let ext = path.extname(fileName);\n if (ext.charAt(0) === \".\") {\n ext = ext.substring(1);\n }\n return ext;\n }\n\n return new Promise(function (resolve, reject) {\n const _log = log;\n log = (msg) => {\n _log(`[convert2xkt] ${msg}`)\n }\n\n if (!source && !sourceData) {\n reject(\"Argument expected: source or sourceData\");\n return;\n }\n\n if (!sourceFormat && sourceData) {\n reject(\"Argument expected: sourceFormat is required with sourceData\");\n return;\n }\n\n if (!output && !outputXKTModel && !outputXKT) {\n reject(\"Argument expected: output, outputXKTModel or outputXKT\");\n return;\n }\n\n if (source) {\n log('Reading input file: ' + source);\n }\n\n const startTime = new Date();\n\n const sourceConfigs = configs.sourceConfigs || {};\n const ext = sourceFormat || getFileExtension(source);\n\n log(`Input file extension: \"${ext}\"`);\n\n let fileTypeConfigs = sourceConfigs[ext];\n\n if (!fileTypeConfigs) {\n log(`[WARNING] Could not find configs sourceConfigs entry for source format \"${ext}\". This is derived from the source file name extension. Will use internal default configs.`);\n fileTypeConfigs = {};\n }\n function overrideOption(option1, option2) {\n if (option1 !== undefined) {\n return option1;\n }\n return option2;\n }\n\n if (!sourceData) {\n try {\n sourceData = fs.readFileSync(source);\n } catch (err) {\n reject(err);\n return;\n }\n }\n\n const sourceFileSizeBytes = sourceData.byteLength;\n\n log(\"Input file size: \" + (sourceFileSizeBytes / 1000).toFixed(2) + \" kB\");\n\n if (!metaModelDataStr && metaModelSource) {\n log('Reading input metadata file: ' + metaModelSource);\n try {\n metaModelDataStr = fs.readFileSync(metaModelSource);\n } catch (err) {\n reject(err);\n return;\n }\n } else {\n log(`Not embedding metadata in XKT`);\n }\n\n let metaModelJSON;\n\n if (metaModelDataStr) {\n try {\n metaModelJSON = JSON.parse(metaModelDataStr);\n } catch (e) {\n metaModelJSON = {};\n log(`Error parsing metadata JSON: ${e}`);\n }\n }\n\n minTileSize = overrideOption(fileTypeConfigs.minTileSize, minTileSize);\n rotateX = overrideOption(fileTypeConfigs.rotateX, rotateX);\n reuseGeometries = overrideOption(fileTypeConfigs.reuseGeometries, reuseGeometries);\n includeTextures = overrideOption(fileTypeConfigs.includeTextures, includeTextures);\n includeNormals = overrideOption(fileTypeConfigs.includeNormals, includeNormals);\n includeTypes = overrideOption(fileTypeConfigs.includeTypes, includeTypes);\n excludeTypes = overrideOption(fileTypeConfigs.excludeTypes, excludeTypes);\n\n if (reuseGeometries === false) {\n log(\"Geometry reuse is disabled\");\n }\n\n const xktModel = new XKTModel({\n minTileSize,\n modelAABB\n });\n\n switch (ext) {\n case \"json\":\n convert(parseCityJSONIntoXKTModel, {\n data: JSON.parse(sourceData),\n xktModel,\n stats,\n rotateX,\n center: fileTypeConfigs.center,\n transform: fileTypeConfigs.transform,\n log\n });\n break;\n\n case \"glb\":\n sourceData = toArrayBuffer(sourceData);\n convert(parseGLTFIntoXKTModel, {\n data: sourceData,\n reuseGeometries,\n includeTextures: true,\n includeNormals,\n metaModelData: metaModelJSON,\n xktModel,\n stats,\n log\n });\n break;\n\n case \"gltf\":\n sourceData = toArrayBuffer(sourceData);\n const gltfBasePath = source ? path.dirname(source) : \"\";\n convert(parseGLTFIntoXKTModel, {\n baseUri: gltfBasePath,\n data: sourceData,\n reuseGeometries,\n includeTextures: true,\n includeNormals,\n metaModelData: metaModelJSON,\n xktModel,\n stats,\n log\n });\n break;\n\n // case \"gltf\":\n // const gltfJSON = JSON.parse(sourceData);\n // const gltfBasePath = source ? getBasePath(source) : \"\";\n // convert(parseGLTFIntoXKTModel, {\n // baseUri: gltfBasePath,\n // data: gltfJSON,\n // reuseGeometries,\n // includeTextures,\n // includeNormals,\n // metaModelData: metaModelJSON,\n // xktModel,\n // getAttachment: async (name) => {\n // const filePath = gltfBasePath + name;\n // log(`Reading attachment file: ${filePath}`);\n // const buffer = fs.readFileSync(filePath);\n // const arrayBuf = toArrayBuffer(buffer);\n // return arrayBuf;\n // },\n // stats,\n // log\n // });\n // break;\n\n case \"ifc\":\n convert(parseIFCIntoXKTModel, {\n WebIFC,\n data: sourceData,\n xktModel,\n wasmPath: \"./\",\n includeTypes,\n excludeTypes,\n stats,\n log\n });\n break;\n\n case \"laz\":\n convert(parseLASIntoXKTModel, {\n data: sourceData,\n xktModel,\n stats,\n fp64: fileTypeConfigs.fp64,\n colorDepth: fileTypeConfigs.colorDepth,\n center: fileTypeConfigs.center,\n transform: fileTypeConfigs.transform,\n skip: overrideOption(fileTypeConfigs.skip, 1),\n log\n });\n break;\n\n case \"las\":\n convert(parseLASIntoXKTModel, {\n data: sourceData,\n xktModel,\n stats,\n fp64: fileTypeConfigs.fp64,\n colorDepth: fileTypeConfigs.colorDepth,\n center: fileTypeConfigs.center,\n transform: fileTypeConfigs.transform,\n skip: overrideOption(fileTypeConfigs.skip, 1),\n log\n });\n break;\n\n case \"pcd\":\n convert(parsePCDIntoXKTModel, {\n data: sourceData,\n xktModel,\n stats,\n log\n });\n break;\n\n case \"ply\":\n convert(parsePLYIntoXKTModel, {\n data: sourceData,\n xktModel,\n stats,\n log\n });\n break;\n\n case \"stl\":\n convert(parseSTLIntoXKTModel, {\n data: sourceData,\n xktModel,\n stats,\n log\n });\n break;\n\n default:\n reject(`Error: unsupported source format: \"${ext}\".`);\n return;\n }\n\n function convert(parser, converterParams) {\n\n parser(converterParams).then(() => {\n\n if (!metaModelJSON) {\n log(\"Creating default metamodel in XKT\");\n xktModel.createDefaultMetaObjects();\n }\n\n log(\"Input file parsed OK. Building XKT document...\");\n\n xktModel.finalize().then(() => {\n\n log(\"XKT document built OK. Writing to XKT file...\");\n\n const xktArrayBuffer = writeXKTModelToArrayBuffer(xktModel, metaModelJSON, stats, {zip: true});\n\n const xktContent = Buffer.from(xktArrayBuffer);\n\n const targetFileSizeBytes = xktArrayBuffer.byteLength;\n\n stats.minTileSize = minTileSize || 200;\n stats.sourceSize = (sourceFileSizeBytes / 1000).toFixed(2);\n stats.xktSize = (targetFileSizeBytes / 1000).toFixed(2);\n stats.xktVersion = XKT_INFO.xktVersion;\n stats.compressionRatio = (sourceFileSizeBytes / targetFileSizeBytes).toFixed(2);\n stats.conversionTime = ((new Date() - startTime) / 1000.0).toFixed(2);\n stats.aabb = xktModel.aabb;\n log(`Converted to: XKT v${stats.xktVersion}`);\n if (includeTypes) {\n log(\"Include types: \" + (includeTypes ? includeTypes : \"(include all)\"));\n }\n if (excludeTypes) {\n log(\"Exclude types: \" + (excludeTypes ? excludeTypes : \"(exclude none)\"));\n }\n log(\"XKT size: \" + stats.xktSize + \" kB\");\n log(\"XKT textures size: \" + (stats.texturesSize / 1000).toFixed(2) + \"kB\");\n log(\"Compression ratio: \" + stats.compressionRatio);\n log(\"Conversion time: \" + stats.conversionTime + \" s\");\n log(\"Converted metaobjects: \" + stats.numMetaObjects);\n log(\"Converted property sets: \" + stats.numPropertySets);\n log(\"Converted drawable objects: \" + stats.numObjects);\n log(\"Converted geometries: \" + stats.numGeometries);\n log(\"Converted textures: \" + stats.numTextures);\n log(\"Converted textureSets: \" + stats.numTextureSets);\n log(\"Converted triangles: \" + stats.numTriangles);\n log(\"Converted vertices: \" + stats.numVertices);\n log(\"Converted UVs: \" + stats.numUVs);\n log(\"Converted normals: \" + stats.numNormals);\n log(\"Converted tiles: \" + xktModel.tilesList.length);\n log(\"minTileSize: \" + stats.minTileSize);\n\n if (output) {\n const outputDir = path.dirname(output);\n if (outputDir !== \"\" && !fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, {recursive: true});\n }\n log('Writing XKT file: ' + output);\n fs.writeFileSync(output, xktContent);\n }\n\n if (outputXKTModel) {\n outputXKTModel(xktModel);\n }\n\n if (outputXKT) {\n outputXKT(xktContent);\n }\n\n if (outputStats) {\n outputStats(stats);\n }\n\n resolve();\n });\n }, (err) => {\n reject(err);\n });\n }\n });\n}\n\nexport {convert2xkt};", "static": true, "longname": "/home/lindsay/xeokit/xeokit-convert-mar27/src/convert2xkt.js", "access": "public", @@ -14231,7 +14231,7 @@ }, { "kind": "packageJSON", - "content": "{\n \"name\": \"@xeokit/xeokit-convert\",\n \"version\": \"1.1.15-beta-10\",\n \"description\": \"JavaScript utilities to create .XKT files\",\n \"main\": \"index.js\",\n \"bin\": \"/convert2xkt.js\",\n \"directories\": {},\n \"scripts\": {\n \"build\": \"webpack --mode=production --node-env=production --progress; rollup --config rollup.config.dist.js; rollup --config rollup.config.convert2xkt.js; rm -Rf ./docs/*; ./node_modules/.bin/esdoc\",\n \"build-node\": \"webpack --mode=production --node-env=production --progress\",\n \"build-browser\": \"rollup --config rollup.config.dist.js\",\n \"docs\": \"rm -Rf ./docs/*; ./node_modules/.bin/esdoc\",\n \"publish\": \"npm publish --access public\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/xeokit/xeokit-convert.git\"\n },\n \"keywords\": [\n \"xeolabs\",\n \"xeokit\",\n \"bim\",\n \"opensource\",\n \"ifc\",\n \"webgl\",\n \"xkt\",\n \"gltf\",\n \"glb\",\n \"cityjson\",\n \"laz\",\n \"gis\"\n ],\n \"author\": \"Lindsay Kay\",\n \"license\": \"LICENSE\",\n \"bugs\": {\n \"url\": \"https://github.com/xeokit/xeokit-convert/issues\"\n },\n \"homepage\": \"https://github.com/xeokit/xeokit-convert#readme\",\n \"dependencies\": {\n \"@loaders.gl/core\": \"^3.2.6\",\n \"@loaders.gl/gltf\": \"^3.2.6\",\n \"@loaders.gl/images\": \"^3.2.6\",\n \"@loaders.gl/json\": \"^3.2.6\",\n \"@loaders.gl/las\": \"^3.2.6\",\n \"@loaders.gl/obj\": \"^3.2.6\",\n \"@loaders.gl/ply\": \"^3.2.6\",\n \"@loaders.gl/polyfills\": \"^3.2.6\",\n \"@loaders.gl/textures\": \"^3.2.6\",\n \"@typeonly/validator\": \"^0.5.2\",\n \"commander\": \"^11.0.0\",\n \"core-js\": \"^3.22.5\",\n \"fs\": \"0.0.1-security\",\n \"pako\": \"^2.0.4\",\n \"path\": \"^0.12.7\",\n \"web-ifc\": \"0.0.40\"\n },\n \"devDependencies\": {\n \"@babel/core\": \"^7.17.10\",\n \"@babel/plugin-external-helpers\": \"^7.17.12\",\n \"@babel/preset-env\": \"^7.17.12\",\n \"@rollup/plugin-alias\": \"^3.1.9\",\n \"@rollup/plugin-commonjs\": \"^21.1.0\",\n \"@rollup/plugin-node-resolve\": \"^13.2.1\",\n \"@xeokit/xeokit-sdk\": \"^2.3.0\",\n \"babel-loader\": \"^8.2.5\",\n \"copy-webpack-plugin\": \"^11.0.0\",\n \"esdoc\": \"^1.1.0\",\n \"esdoc-node\": \"^1.0.5\",\n \"esdoc-standard-plugin\": \"^1.0.0\",\n \"http-server\": \"^14.1.0\",\n \"npm-upgrade\": \"^3.1.0\",\n \"rimraf\": \"^3.0.2\",\n \"rollup\": \"^2.70.2\",\n \"rollup-plugin-copy\": \"^3.4.0\",\n \"rollup-plugin-minify-es\": \"^1.1.1\",\n \"typeonly\": \"^0.4.6\",\n \"webpack\": \"^5.72.1\",\n \"webpack-cli\": \"^4.9.2\",\n \"webpack-node-externals\": \"^3.0.0\"\n },\n \"files\": [\n \"/dist\",\n \"/convert2xkt.js\",\n \"/convert2xkt.conf.js\"\n ]\n}\n", + "content": "{\n \"name\": \"@xeokit/xeokit-convert\",\n \"version\": \"1.1.15-beta-11\",\n \"description\": \"JavaScript utilities to create .XKT files\",\n \"main\": \"index.js\",\n \"bin\": \"/convert2xkt.js\",\n \"directories\": {},\n \"scripts\": {\n \"build\": \"webpack --mode=production --node-env=production --progress; rollup --config rollup.config.dist.js; rollup --config rollup.config.convert2xkt.js; rm -Rf ./docs/*; ./node_modules/.bin/esdoc\",\n \"build-node\": \"webpack --mode=production --node-env=production --progress\",\n \"build-browser\": \"rollup --config rollup.config.dist.js\",\n \"docs\": \"rm -Rf ./docs/*; ./node_modules/.bin/esdoc\",\n \"publish\": \"npm publish --access public\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/xeokit/xeokit-convert.git\"\n },\n \"keywords\": [\n \"xeolabs\",\n \"xeokit\",\n \"bim\",\n \"opensource\",\n \"ifc\",\n \"webgl\",\n \"xkt\",\n \"gltf\",\n \"glb\",\n \"cityjson\",\n \"laz\",\n \"gis\"\n ],\n \"author\": \"Lindsay Kay\",\n \"license\": \"LICENSE\",\n \"bugs\": {\n \"url\": \"https://github.com/xeokit/xeokit-convert/issues\"\n },\n \"homepage\": \"https://github.com/xeokit/xeokit-convert#readme\",\n \"dependencies\": {\n \"@loaders.gl/core\": \"^3.2.6\",\n \"@loaders.gl/gltf\": \"^3.2.6\",\n \"@loaders.gl/images\": \"^3.2.6\",\n \"@loaders.gl/json\": \"^3.2.6\",\n \"@loaders.gl/las\": \"^3.2.6\",\n \"@loaders.gl/obj\": \"^3.2.6\",\n \"@loaders.gl/ply\": \"^3.2.6\",\n \"@loaders.gl/polyfills\": \"^3.2.6\",\n \"@loaders.gl/textures\": \"^3.2.6\",\n \"@typeonly/validator\": \"^0.5.2\",\n \"commander\": \"^11.0.0\",\n \"core-js\": \"^3.22.5\",\n \"fs\": \"0.0.1-security\",\n \"pako\": \"^2.0.4\",\n \"path\": \"^0.12.7\",\n \"web-ifc\": \"0.0.40\"\n },\n \"devDependencies\": {\n \"@babel/core\": \"^7.17.10\",\n \"@babel/plugin-external-helpers\": \"^7.17.12\",\n \"@babel/preset-env\": \"^7.17.12\",\n \"@rollup/plugin-alias\": \"^3.1.9\",\n \"@rollup/plugin-commonjs\": \"^21.1.0\",\n \"@rollup/plugin-node-resolve\": \"^13.2.1\",\n \"@xeokit/xeokit-sdk\": \"^2.3.0\",\n \"babel-loader\": \"^8.2.5\",\n \"copy-webpack-plugin\": \"^11.0.0\",\n \"esdoc\": \"^1.1.0\",\n \"esdoc-node\": \"^1.0.5\",\n \"esdoc-standard-plugin\": \"^1.0.0\",\n \"http-server\": \"^14.1.0\",\n \"npm-upgrade\": \"^3.1.0\",\n \"rimraf\": \"^3.0.2\",\n \"rollup\": \"^2.70.2\",\n \"rollup-plugin-copy\": \"^3.4.0\",\n \"rollup-plugin-minify-es\": \"^1.1.1\",\n \"typeonly\": \"^0.4.6\",\n \"webpack\": \"^5.72.1\",\n \"webpack-cli\": \"^4.9.2\",\n \"webpack-node-externals\": \"^3.0.0\"\n },\n \"files\": [\n \"/dist\",\n \"/convert2xkt.js\",\n \"/convert2xkt.conf.js\"\n ]\n}\n", "longname": "/home/lindsay/xeokit/xeokit-convert-mar27/package.json", "name": "package.json", "static": true, diff --git a/docs/source.html b/docs/source.html index 0ce8957..30ea818 100644 --- a/docs/source.html +++ b/docs/source.html @@ -312,9 +312,9 @@ src/convert2xkt.js convert2xkt 100 %1/1 - 18404 byte + 18406 byte 449 - 2024-04-05 05:31:40 (UTC) + 2024-04-05 08:45:05 (UTC) src/geometryBuilders/buildBoxGeometry.js diff --git a/package.json b/package.json index 93e47d9..4ad9840 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@xeokit/xeokit-convert", - "version": "1.1.15-beta-10", + "version": "1.1.15-beta-11", "description": "JavaScript utilities to create .XKT files", "main": "index.js", "bin": "/convert2xkt.js", diff --git a/src/convert2xkt.js b/src/convert2xkt.js index d1070e5..63d27c8 100755 --- a/src/convert2xkt.js +++ b/src/convert2xkt.js @@ -121,7 +121,7 @@ function convert2xkt({ stats.aabb = null; function getFileExtension(fileName) { - let ext = path.extname(source); + let ext = path.extname(fileName); if (ext.charAt(0) === ".") { ext = ext.substring(1); }