diff --git a/recursive_swarm/asdf/.gitignore b/recursive_swarm/asdf/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..bae154434ffeeabbd7d4bd6119aa4f980d2e3349 --- /dev/null +++ b/recursive_swarm/asdf/.gitignore @@ -0,0 +1,16 @@ +node_modules +.ipynb_checkpoints +.vscode +*.stl +*.obj +*.3dm +*.3dm_tmp +*.3dm.rhl +*.3dmbak +*.log +*.objbak +*.mtl +*.psd +*.ai +*.mov +.DS_Strore \ No newline at end of file diff --git a/recursive_swarm/asdf/json/Sphere/orderedCones1.json b/recursive_swarm/asdf/json/Sphere/orderedCones1.json new file mode 100644 index 0000000000000000000000000000000000000000..42764b72b868b1ff9298e9a437b17544f782b710 --- /dev/null +++ b/recursive_swarm/asdf/json/Sphere/orderedCones1.json @@ -0,0 +1 @@ +[[[[{"origin":[0.0,0.0,0.0],"widths":[1.0,1.0,1.0]},{"origin":[-1.0,0.0,0.0],"widths":[1.0,1.0,1.0]},{"origin":[0.0,0.0,-1.0],"widths":[1.0,1.0,1.0]},{"origin":[-1.0,0.0,-1.0],"widths":[1.0,1.0,1.0]}]],[[{"origin":[0.5,0.0,1.0],"widths":[0.5,0.5,0.5]},{"origin":[0.0,0.0,1.0],"widths":[0.5,0.5,0.5]},{"origin":[1.0,0.0,0.5],"widths":[0.5,0.5,0.5]},{"origin":[1.0,0.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,0.0,1.0],"widths":[0.5,0.5,0.5]},{"origin":[-1.0,0.0,1.0],"widths":[0.5,0.5,0.5]},{"origin":[-1.5,0.0,0.5],"widths":[0.5,0.5,0.5]},{"origin":[-1.5,0.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[1.0,0.0,-0.5],"widths":[0.5,0.5,0.5]},{"origin":[1.0,0.0,-1.0],"widths":[0.5,0.5,0.5]},{"origin":[0.5,0.0,-1.5],"widths":[0.5,0.5,0.5]},{"origin":[0.0,0.0,-1.5],"widths":[0.5,0.5,0.5]},{"origin":[-1.5,0.0,-0.5],"widths":[0.5,0.5,0.5]},{"origin":[-1.5,0.0,-1.0],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,0.0,-1.5],"widths":[0.5,0.5,0.5]},{"origin":[-1.0,0.0,-1.5],"widths":[0.5,0.5,0.5]}]],[[{"origin":[1.0,0.0,1.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.0,1.5],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.0,1.5],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.0,1.5],"widths":[0.25,0.25,0.25]},{"origin":[1.5,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[1.5,0.0,0.25],"widths":[0.25,0.25,0.25]},{"origin":[1.5,0.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.0,1.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.0,1.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,1.5],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,0.0,1.0],"widths":[0.25,0.25,0.25]},{"origin":[-1.75,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-1.75,0.0,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-1.75,0.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[1.5,0.0,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[1.5,0.0,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[1.5,0.0,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[1.0,0.0,-1.25],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.0,-1.75],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.0,-1.75],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.0,-1.75],"widths":[0.25,0.25,0.25]},{"origin":[-1.75,0.0,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-1.75,0.0,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-1.75,0.0,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.0,-1.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.0,-1.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,-1.75],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,0.0,-1.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.5,0.0,1.0],"widths":[0.25,0.25,0.25]},{"origin":[1.25,0.0,-1.25],"widths":[0.25,0.25,0.25]}],[{"origin":[1.0,0.0,1.25],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,0.0,-1.5],"widths":[0.25,0.25,0.25]}],[{"origin":[1.25,0.0,1.0],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,0.0,1.25],"widths":[0.25,0.25,0.25]},{"origin":[1.0,0.0,-1.5],"widths":[0.25,0.25,0.25]},{"origin":[-1.5,0.0,-1.25],"widths":[0.25,0.25,0.25]}],[{"origin":[1.5,0.0,0.75],"widths":[0.25,0.25,0.25]},{"origin":[-1.0,0.0,1.5],"widths":[0.25,0.25,0.25]},{"origin":[0.75,0.0,-1.75],"widths":[0.25,0.25,0.25]},{"origin":[-1.75,0.0,-1.0],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.75,0.0,0.75],"widths":[0.25,0.25,0.25]},{"origin":[1.5,0.0,-1.0],"widths":[0.25,0.25,0.25]}],[{"origin":[0.75,0.0,1.5],"widths":[0.25,0.25,0.25]},{"origin":[-1.0,0.0,-1.75],"widths":[0.25,0.25,0.25]}],[{"origin":[1.75,0.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.0,1.75],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.0,-2.0],"widths":[0.25,0.25,0.25]},{"origin":[-2.0,0.0,-0.25],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.25,0.0,1.75],"widths":[0.125,0.125,0.125]},{"origin":[0.125,0.0,1.75],"widths":[0.125,0.125,0.125]},{"origin":[0.0,0.0,1.75],"widths":[0.125,0.125,0.125]},{"origin":[-1.875,0.0,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-1.875,0.0,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-1.875,0.0,0.0],"widths":[0.125,0.125,0.125]},{"origin":[1.75,0.0,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[1.75,0.0,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[1.75,0.0,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.0,-1.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.0,-1.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.0,-1.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.375,0.0,1.75],"widths":[0.125,0.125,0.125]},{"origin":[-1.875,0.0,0.375],"widths":[0.125,0.125,0.125]},{"origin":[1.75,0.0,-0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,0.0,-1.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.5,0.0,1.75],"widths":[0.125,0.125,0.125]},{"origin":[-1.875,0.0,0.5],"widths":[0.125,0.125,0.125]},{"origin":[1.75,0.0,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.0,-1.875],"widths":[0.125,0.125,0.125]}],[{"origin":[1.75,0.0,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.0,1.75],"widths":[0.125,0.125,0.125]},{"origin":[0.5,0.0,-1.875],"widths":[0.125,0.125,0.125]},{"origin":[-1.875,0.0,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.625,0.0,1.75],"widths":[0.125,0.125,0.125]},{"origin":[-1.875,0.0,0.625],"widths":[0.125,0.125,0.125]},{"origin":[1.75,0.0,-0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.75,0.0,-1.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,0.0,1.875],"widths":[0.125,0.125,0.125]},{"origin":[-2.0,0.0,0.0],"widths":[0.125,0.125,0.125]},{"origin":[1.875,0.0,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.0,-2.0],"widths":[0.125,0.125,0.125]}],[{"origin":[1.75,0.0,0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.75,0.0,1.75],"widths":[0.125,0.125,0.125]},{"origin":[0.625,0.0,-1.875],"widths":[0.125,0.125,0.125]},{"origin":[-1.875,0.0,-0.75],"widths":[0.125,0.125,0.125]}]]],[[[{"origin":[0.0,0.125,1.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.125,-1.875],"widths":[0.125,0.125,0.125]}],[{"origin":[-1.875,0.125,0.0],"widths":[0.125,0.125,0.125]},{"origin":[1.75,0.125,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,0.125,1.75],"widths":[0.125,0.125,0.125]},{"origin":[-1.875,0.125,0.125],"widths":[0.125,0.125,0.125]},{"origin":[1.75,0.125,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.125,-1.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,0.125,1.75],"widths":[0.125,0.125,0.125]},{"origin":[-1.875,0.125,0.25],"widths":[0.125,0.125,0.125]},{"origin":[1.75,0.125,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.125,-1.875],"widths":[0.125,0.125,0.125]}]]],[[[{"origin":[1.0,0.25,1.0],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,0.25,1.0],"widths":[0.25,0.25,0.25]},{"origin":[1.0,0.25,-1.25],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,0.25,-1.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,0.25,1.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.25,-1.75],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.75,0.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[1.5,0.25,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[1.5,0.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.25,1.5],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.25,-1.75],"widths":[0.25,0.25,0.25]},{"origin":[-1.75,0.25,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,0.25,1.5],"widths":[0.25,0.25,0.25]},{"origin":[-1.75,0.25,0.25],"widths":[0.25,0.25,0.25]},{"origin":[1.5,0.25,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.25,-1.75],"widths":[0.25,0.25,0.25]}],[{"origin":[1.5,0.25,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.25,1.5],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.25,-1.75],"widths":[0.25,0.25,0.25]},{"origin":[-1.75,0.25,-0.5],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.5,0.25,1.5],"widths":[0.125,0.125,0.125]},{"origin":[-1.625,0.25,0.5],"widths":[0.125,0.125,0.125]},{"origin":[1.5,0.25,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.25,-1.625],"widths":[0.125,0.125,0.125]}],[{"origin":[1.5,0.25,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.25,1.5],"widths":[0.125,0.125,0.125]},{"origin":[0.5,0.25,-1.625],"widths":[0.125,0.125,0.125]},{"origin":[-1.625,0.25,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[1.5,0.25,0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.75,0.25,1.5],"widths":[0.125,0.125,0.125]},{"origin":[0.625,0.25,-1.625],"widths":[0.125,0.125,0.125]},{"origin":[-1.625,0.25,-0.75],"widths":[0.125,0.125,0.125]}],[{"origin":[-1.625,0.25,0.625],"widths":[0.125,0.125,0.125]},{"origin":[1.5,0.25,-0.75],"widths":[0.125,0.125,0.125]}],[{"origin":[0.625,0.25,1.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.75,0.25,-1.625],"widths":[0.125,0.125,0.125]}]]],[[[{"origin":[0.5,0.375,1.5],"widths":[0.125,0.125,0.125]},{"origin":[-1.625,0.375,0.5],"widths":[0.125,0.125,0.125]},{"origin":[1.5,0.375,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.375,-1.625],"widths":[0.125,0.125,0.125]}],[{"origin":[1.5,0.375,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.375,1.5],"widths":[0.125,0.125,0.125]},{"origin":[0.5,0.375,-1.625],"widths":[0.125,0.125,0.125]},{"origin":[-1.625,0.375,-0.625],"widths":[0.125,0.125,0.125]}]]],[[[{"origin":[0.0,0.5,1.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,-1.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.25,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[1.0,0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[1.0,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,1.0],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.5,-1.25],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,0.5,1.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.5,-1.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.25,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[1.0,0.5,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[1.0,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.5,1.0],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.5,-1.25],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,0.5,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[1.0,0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.5,1.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.5,-1.25],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,0.5,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.25,0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[1.0,0.5,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,0.5,1.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.5,-1.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,0.5,1.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,-1.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.5,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[1.25,0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[1.25,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,1.25],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.5,-1.5],"widths":[0.25,0.25,0.25]},{"origin":[-1.5,0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.25,0.5,0.75],"widths":[0.25,0.25,0.25]},{"origin":[1.0,0.5,-1.0],"widths":[0.25,0.25,0.25]}],[{"origin":[0.75,0.5,1.0],"widths":[0.25,0.25,0.25]},{"origin":[-1.0,0.5,-1.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,0.5,1.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.5,-1.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.5,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[1.25,0.5,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[1.0,0.5,0.75],"widths":[0.25,0.25,0.25]},{"origin":[-1.0,0.5,1.0],"widths":[0.25,0.25,0.25]},{"origin":[0.75,0.5,-1.25],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,0.5,-1.0],"widths":[0.25,0.25,0.25]}],[{"origin":[1.25,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.5,1.25],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.5,-1.5],"widths":[0.25,0.25,0.25]},{"origin":[-1.5,0.5,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[1.25,0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.5,1.25],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.5,-1.5],"widths":[0.25,0.25,0.25]},{"origin":[-1.5,0.5,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.5,0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[1.25,0.5,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,0.5,1.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.5,-1.5],"widths":[0.25,0.25,0.25]}]],[[{"origin":[1.0,0.5,1.0],"widths":[0.125,0.125,0.125]},{"origin":[-1.125,0.5,1.0],"widths":[0.125,0.125,0.125]},{"origin":[1.0,0.5,-1.125],"widths":[0.125,0.125,0.125]},{"origin":[-1.125,0.5,-1.125],"widths":[0.125,0.125,0.125]}],[{"origin":[-1.25,0.5,1.0],"widths":[0.125,0.125,0.125]},{"origin":[1.125,0.5,-1.125],"widths":[0.125,0.125,0.125]}],[{"origin":[1.0,0.5,1.125],"widths":[0.125,0.125,0.125]},{"origin":[-1.125,0.5,-1.25],"widths":[0.125,0.125,0.125]}],[{"origin":[1.125,0.5,1.0],"widths":[0.125,0.125,0.125]},{"origin":[-1.125,0.5,1.125],"widths":[0.125,0.125,0.125]},{"origin":[1.0,0.5,-1.25],"widths":[0.125,0.125,0.125]},{"origin":[-1.25,0.5,-1.125],"widths":[0.125,0.125,0.125]}]]],[[[{"origin":[1.0,0.625,1.0],"widths":[0.125,0.125,0.125]},{"origin":[-1.125,0.625,1.0],"widths":[0.125,0.125,0.125]},{"origin":[1.0,0.625,-1.125],"widths":[0.125,0.125,0.125]},{"origin":[-1.125,0.625,-1.125],"widths":[0.125,0.125,0.125]}]]],[[[{"origin":[0.0,0.75,1.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.75,-1.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.25,0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[1.0,0.75,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[1.0,0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.75,1.0],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.75,-1.25],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,0.75,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,0.75,1.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.75,-1.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.25,0.75,0.25],"widths":[0.25,0.25,0.25]},{"origin":[1.0,0.75,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[1.0,0.75,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.75,1.0],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.75,-1.25],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,0.75,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[1.0,0.75,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.75,1.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.75,-1.25],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,0.75,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.25,0.75,0.5],"widths":[0.25,0.25,0.25]},{"origin":[1.0,0.75,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,0.75,1.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.75,-1.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,0.75,1.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.75,-1.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.5,0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[1.25,0.75,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[1.25,0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.75,1.25],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.75,-1.5],"widths":[0.25,0.25,0.25]},{"origin":[-1.5,0.75,-0.25],"widths":[0.25,0.25,0.25]}]]],[[[{"origin":[0.0,1.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,1.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[0.0,1.0,-0.5],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,1.0,-0.5],"widths":[0.5,0.5,0.5]}],[{"origin":[0.0,1.0,0.5],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,1.0,-1.0],"widths":[0.5,0.5,0.5]}],[{"origin":[-1.0,1.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[0.5,1.0,-0.5],"widths":[0.5,0.5,0.5]}],[{"origin":[0.5,1.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,1.0,0.5],"widths":[0.5,0.5,0.5]},{"origin":[0.0,1.0,-1.0],"widths":[0.5,0.5,0.5]},{"origin":[-1.0,1.0,-0.5],"widths":[0.5,0.5,0.5]}]],[[{"origin":[0.5,1.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,1.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.5,1.0,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,1.0,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.0,1.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.75,1.0,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,1.0,0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,1.0,-1.0],"widths":[0.25,0.25,0.25]}],[{"origin":[0.75,1.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,1.0,0.75],"widths":[0.25,0.25,0.25]},{"origin":[0.5,1.0,-1.0],"widths":[0.25,0.25,0.25]},{"origin":[-1.0,1.0,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,1.0,1.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,1.0,-1.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.25,1.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[1.0,1.0,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[1.0,1.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,1.0,1.0],"widths":[0.25,0.25,0.25]},{"origin":[0.0,1.0,-1.25],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,1.0,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,1.0,1.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,1.0,-1.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.25,1.0,0.25],"widths":[0.25,0.25,0.25]},{"origin":[1.0,1.0,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[1.0,1.0,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,1.0,1.0],"widths":[0.25,0.25,0.25]},{"origin":[0.25,1.0,-1.25],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,1.0,-0.5],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.75,1.0,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,1.0,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.75,1.0,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,1.0,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[-1.0,1.0,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.875,1.0,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,1.0,0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,1.0,-1.0],"widths":[0.125,0.125,0.125]}],[{"origin":[0.875,1.0,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,1.0,0.875],"widths":[0.125,0.125,0.125]},{"origin":[0.75,1.0,-1.0],"widths":[0.125,0.125,0.125]},{"origin":[-1.0,1.0,-0.875],"widths":[0.125,0.125,0.125]}]]],[[[{"origin":[0.75,1.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,1.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.75,1.125,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,1.125,-0.875],"widths":[0.125,0.125,0.125]}]]],[[[{"origin":[0.5,1.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,1.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.5,1.25,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,1.25,-0.75],"widths":[0.25,0.25,0.25]}]]],[[[{"origin":[0.0,1.5,0.0],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,1.5,0.0],"widths":[0.5,0.5,0.5]},{"origin":[0.0,1.5,-0.5],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,1.5,-0.5],"widths":[0.5,0.5,0.5]}]],[[{"origin":[0.0,1.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,1.5,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.75,1.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,1.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,1.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,1.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.0,1.5,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,1.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,1.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,1.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.25,1.5,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,1.5,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.75,1.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.5,1.5,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,1.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,1.5,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,1.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,1.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.5,1.5,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,1.5,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,1.5,0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,1.5,-1.0],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.0,1.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.75,1.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.75,1.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,1.5,0.75],"widths":[0.25,0.25,0.25]},{"origin":[0.0,1.5,-1.0],"widths":[0.25,0.25,0.25]},{"origin":[-1.0,1.5,-0.25],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.75,1.5,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,1.5,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.25,1.5,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,1.5,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,1.5,0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,1.5,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.375,1.5,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,1.5,-0.5],"widths":[0.125,0.125,0.125]}]]],[[[{"origin":[0.0,1.75,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,1.75,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.75,1.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,1.75,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,1.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,1.75,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.0,1.75,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,1.75,-0.25],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.5,1.75,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,1.75,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.25,1.75,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,1.75,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.625,1.75,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.5,1.75,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,1.75,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,1.75,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.625,1.75,0.375],"widths":[0.125,0.125,0.125]},{"origin":[0.5,1.75,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[0.375,1.75,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,1.75,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.5,1.75,0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,1.75,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.375,1.75,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,1.75,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[0.625,1.75,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,1.75,0.625],"widths":[0.125,0.125,0.125]},{"origin":[0.25,1.75,-0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.75,1.75,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.75,1.75,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.625,1.75,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,1.75,0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,1.75,-0.75],"widths":[0.125,0.125,0.125]}]]],[[[{"origin":[0.5,1.875,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,1.875,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.25,1.875,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,1.875,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.625,1.875,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.5,1.875,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,1.875,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,1.875,-0.625],"widths":[0.125,0.125,0.125]}]]],[[[{"origin":[0.0,2.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,2.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.0,2.0,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,2.0,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,2.0,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,2.0,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.5,2.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.25,2.0,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,2.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,2.0,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.0,2.0,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,2.0,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,2.0,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,2.0,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.25,2.0,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,2.0,-0.5],"widths":[0.25,0.25,0.25]}]]],[[[{"origin":[0.0,2.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,2.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.0,2.25,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,2.25,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,2.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,2.25,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.0,2.25,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,2.25,-0.25],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.0,2.25,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,2.25,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.375,2.25,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.25,2.25,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.375,2.25,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.25,2.25,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,2.25,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,2.25,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,2.25,0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,2.25,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.5,2.25,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.375,2.25,-0.125],"widths":[0.125,0.125,0.125]}]]],[[[{"origin":[0.0,2.375,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,2.375,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.375,2.375,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.25,2.375,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.375,2.375,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.25,2.375,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,2.375,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,2.375,-0.375],"widths":[0.125,0.125,0.125]}]]],[[[{"origin":[0.0,2.5,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,2.5,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.0,2.5,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,2.5,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,2.5,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,2.5,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.25,2.5,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.125,2.5,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,2.5,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,2.5,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.0,2.5,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,2.5,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,2.5,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,2.5,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.125,2.5,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,2.5,-0.25],"widths":[0.125,0.125,0.125]}]]],[[[{"origin":[0.0,2.625,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,2.625,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.0,2.625,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,2.625,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,2.625,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,2.625,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.25,2.625,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.125,2.625,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,2.625,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,2.625,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.0,2.625,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,2.625,-0.125],"widths":[0.125,0.125,0.125]}]]],[[[{"origin":[0.0,2.75,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,2.75,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.0,2.75,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,2.75,-0.125],"widths":[0.125,0.125,0.125]}]]]] \ No newline at end of file diff --git a/recursive_swarm/asdf/json/Sphere/orderedCones2.json b/recursive_swarm/asdf/json/Sphere/orderedCones2.json new file mode 100644 index 0000000000000000000000000000000000000000..a9382c800637120cc7a20de2fc66ee4586b09cef --- /dev/null +++ b/recursive_swarm/asdf/json/Sphere/orderedCones2.json @@ -0,0 +1 @@ +[[[[{"origin":[0.0,0.0,0.0],"widths":[1.0,1.0,1.0]},{"origin":[-1.0,0.0,0.0],"widths":[1.0,1.0,1.0]},{"origin":[0.0,0.0,-1.0],"widths":[1.0,1.0,1.0]},{"origin":[-1.0,0.0,-1.0],"widths":[1.0,1.0,1.0]}]],[[{"origin":[0.5,0.0,1.0],"widths":[0.5,0.5,0.5]},{"origin":[0.0,0.0,1.0],"widths":[0.5,0.5,0.5]},{"origin":[1.0,0.0,0.5],"widths":[0.5,0.5,0.5]},{"origin":[1.0,0.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,0.0,1.0],"widths":[0.5,0.5,0.5]},{"origin":[-1.0,0.0,1.0],"widths":[0.5,0.5,0.5]},{"origin":[-1.5,0.0,0.5],"widths":[0.5,0.5,0.5]},{"origin":[-1.5,0.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[1.0,0.0,-0.5],"widths":[0.5,0.5,0.5]},{"origin":[1.0,0.0,-1.0],"widths":[0.5,0.5,0.5]},{"origin":[0.5,0.0,-1.5],"widths":[0.5,0.5,0.5]},{"origin":[0.0,0.0,-1.5],"widths":[0.5,0.5,0.5]},{"origin":[-1.5,0.0,-0.5],"widths":[0.5,0.5,0.5]},{"origin":[-1.5,0.0,-1.0],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,0.0,-1.5],"widths":[0.5,0.5,0.5]},{"origin":[-1.0,0.0,-1.5],"widths":[0.5,0.5,0.5]}],[{"origin":[1.0,0.0,1.0],"widths":[0.5,0.5,0.5]},{"origin":[-1.5,0.0,1.0],"widths":[0.5,0.5,0.5]},{"origin":[1.0,0.0,-1.5],"widths":[0.5,0.5,0.5]},{"origin":[-1.5,0.0,-1.5],"widths":[0.5,0.5,0.5]}],[{"origin":[1.5,0.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,0.0,1.5],"widths":[0.5,0.5,0.5]},{"origin":[0.0,0.0,-2.0],"widths":[0.5,0.5,0.5]},{"origin":[-2.0,0.0,-0.5],"widths":[0.5,0.5,0.5]}]],[[{"origin":[0.5,0.0,1.5],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.0,1.5],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.0,1.5],"widths":[0.25,0.25,0.25]},{"origin":[1.5,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,1.5],"widths":[0.25,0.25,0.25]},{"origin":[-1.75,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-1.75,0.0,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-1.75,0.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[1.5,0.0,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[1.5,0.0,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[1.5,0.0,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.0,-1.75],"widths":[0.25,0.25,0.25]},{"origin":[-1.75,0.0,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.0,-1.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.0,-1.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,-1.75],"widths":[0.25,0.25,0.25]}],[{"origin":[1.5,0.0,0.75],"widths":[0.25,0.25,0.25]},{"origin":[-1.0,0.0,1.5],"widths":[0.25,0.25,0.25]},{"origin":[0.75,0.0,-1.75],"widths":[0.25,0.25,0.25]},{"origin":[-1.75,0.0,-1.0],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.75,0.0,0.75],"widths":[0.25,0.25,0.25]},{"origin":[1.5,0.0,-1.0],"widths":[0.25,0.25,0.25]}],[{"origin":[0.75,0.0,1.5],"widths":[0.25,0.25,0.25]},{"origin":[-1.0,0.0,-1.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,0.0,1.75],"widths":[0.25,0.25,0.25]},{"origin":[-2.0,0.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[1.75,0.0,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.0,-2.0],"widths":[0.25,0.25,0.25]}]]],[[[{"origin":[0.0,0.25,1.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.25,-1.75],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.75,0.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[1.5,0.25,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,0.25,1.5],"widths":[0.25,0.25,0.25]},{"origin":[-1.75,0.25,0.25],"widths":[0.25,0.25,0.25]},{"origin":[1.5,0.25,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.25,-1.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,0.25,1.5],"widths":[0.25,0.25,0.25]},{"origin":[-1.75,0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[1.5,0.25,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.25,-1.75],"widths":[0.25,0.25,0.25]}]]],[[[{"origin":[0.0,0.5,1.0],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,0.5,-1.5],"widths":[0.5,0.5,0.5]}],[{"origin":[-1.5,0.5,0.0],"widths":[0.5,0.5,0.5]},{"origin":[1.0,0.5,-0.5],"widths":[0.5,0.5,0.5]}],[{"origin":[1.0,0.5,0.0],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,0.5,1.0],"widths":[0.5,0.5,0.5]},{"origin":[0.0,0.5,-1.5],"widths":[0.5,0.5,0.5]},{"origin":[-1.5,0.5,-0.5],"widths":[0.5,0.5,0.5]}]],[[{"origin":[1.0,0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.5,1.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.5,-1.25],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,0.5,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.25,0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[1.0,0.5,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,0.5,1.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.5,-1.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.25,0.5,0.75],"widths":[0.25,0.25,0.25]},{"origin":[1.0,0.5,-1.0],"widths":[0.25,0.25,0.25]}],[{"origin":[0.75,0.5,1.0],"widths":[0.25,0.25,0.25]},{"origin":[-1.0,0.5,-1.25],"widths":[0.25,0.25,0.25]}],[{"origin":[1.0,0.5,0.75],"widths":[0.25,0.25,0.25]},{"origin":[-1.0,0.5,1.0],"widths":[0.25,0.25,0.25]},{"origin":[0.75,0.5,-1.25],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,0.5,-1.0],"widths":[0.25,0.25,0.25]}],[{"origin":[1.25,0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.5,1.25],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.5,-1.5],"widths":[0.25,0.25,0.25]},{"origin":[-1.5,0.5,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.5,0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[1.25,0.5,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,0.5,1.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.5,-1.5],"widths":[0.25,0.25,0.25]}]]],[[[{"origin":[1.0,0.75,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.75,1.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.75,-1.25],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,0.75,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.25,0.75,0.5],"widths":[0.25,0.25,0.25]},{"origin":[1.0,0.75,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,0.75,1.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.75,-1.25],"widths":[0.25,0.25,0.25]}]]],[[[{"origin":[0.0,1.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,1.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[0.0,1.0,-0.5],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,1.0,-0.5],"widths":[0.5,0.5,0.5]}],[{"origin":[0.0,1.0,0.5],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,1.0,-1.0],"widths":[0.5,0.5,0.5]}],[{"origin":[-1.0,1.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[0.5,1.0,-0.5],"widths":[0.5,0.5,0.5]}],[{"origin":[0.5,1.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,1.0,0.5],"widths":[0.5,0.5,0.5]},{"origin":[0.0,1.0,-1.0],"widths":[0.5,0.5,0.5]},{"origin":[-1.0,1.0,-0.5],"widths":[0.5,0.5,0.5]}],[{"origin":[0.5,1.0,0.5],"widths":[0.5,0.5,0.5]},{"origin":[-1.0,1.0,0.5],"widths":[0.5,0.5,0.5]},{"origin":[0.5,1.0,-1.0],"widths":[0.5,0.5,0.5]},{"origin":[-1.0,1.0,-1.0],"widths":[0.5,0.5,0.5]}]]],[[[{"origin":[0.0,1.5,0.0],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,1.5,0.0],"widths":[0.5,0.5,0.5]},{"origin":[0.0,1.5,-0.5],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,1.5,-0.5],"widths":[0.5,0.5,0.5]}],[{"origin":[0.5,1.5,0.0],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,1.5,0.5],"widths":[0.5,0.5,0.5]},{"origin":[0.0,1.5,-1.0],"widths":[0.5,0.5,0.5]},{"origin":[-1.0,1.5,-0.5],"widths":[0.5,0.5,0.5]}]],[[{"origin":[0.0,1.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,1.5,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.75,1.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,1.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.75,1.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.5,1.5,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,1.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,1.5,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,1.5,0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,1.5,-1.0],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.0,1.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.75,1.5,-0.25],"widths":[0.25,0.25,0.25]}]]],[[[{"origin":[0.0,1.75,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,1.75,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.75,1.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,1.75,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.75,1.75,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.5,1.75,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,1.75,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,1.75,-0.75],"widths":[0.25,0.25,0.25]}]]],[[[{"origin":[0.0,2.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,2.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.0,2.0,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,2.0,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,2.0,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,2.0,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.5,2.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.25,2.0,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,2.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,2.0,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.0,2.0,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,2.0,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,2.0,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,2.0,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.25,2.0,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,2.0,-0.5],"widths":[0.25,0.25,0.25]}]]],[[[{"origin":[0.0,2.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,2.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.0,2.25,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,2.25,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,2.25,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,2.25,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.5,2.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.25,2.25,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,2.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,2.25,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.0,2.25,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,2.25,-0.25],"widths":[0.25,0.25,0.25]}]]],[[[{"origin":[0.0,2.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,2.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.0,2.5,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,2.5,-0.25],"widths":[0.25,0.25,0.25]}]]]] \ No newline at end of file diff --git a/recursive_swarm/asdf/json/Sphere/orderedCones3.json b/recursive_swarm/asdf/json/Sphere/orderedCones3.json new file mode 100644 index 0000000000000000000000000000000000000000..36f507a8f31a0deca7f392e338b3266b9905402e --- /dev/null +++ b/recursive_swarm/asdf/json/Sphere/orderedCones3.json @@ -0,0 +1 @@ +[[[[{"origin":[0.0,0.0,0.0],"widths":[1.0,1.0,1.0]},{"origin":[-1.0,0.0,0.0],"widths":[1.0,1.0,1.0]},{"origin":[0.0,0.0,-1.0],"widths":[1.0,1.0,1.0]},{"origin":[-1.0,0.0,-1.0],"widths":[1.0,1.0,1.0]}],[{"origin":[0.0,0.0,1.0],"widths":[1.0,1.0,1.0]},{"origin":[-2.0,0.0,0.0],"widths":[1.0,1.0,1.0]},{"origin":[1.0,0.0,-1.0],"widths":[1.0,1.0,1.0]},{"origin":[-1.0,0.0,-2.0],"widths":[1.0,1.0,1.0]}],[{"origin":[1.0,0.0,0.0],"widths":[1.0,1.0,1.0]},{"origin":[-1.0,0.0,1.0],"widths":[1.0,1.0,1.0]},{"origin":[0.0,0.0,-2.0],"widths":[1.0,1.0,1.0]},{"origin":[-2.0,0.0,-1.0],"widths":[1.0,1.0,1.0]}]]],[[[{"origin":[0.0,1.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,1.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[0.0,1.0,-0.5],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,1.0,-0.5],"widths":[0.5,0.5,0.5]}],[{"origin":[0.0,1.0,0.5],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,1.0,-1.0],"widths":[0.5,0.5,0.5]}],[{"origin":[-1.0,1.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[0.5,1.0,-0.5],"widths":[0.5,0.5,0.5]}],[{"origin":[0.5,1.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,1.0,0.5],"widths":[0.5,0.5,0.5]},{"origin":[0.0,1.0,-1.0],"widths":[0.5,0.5,0.5]},{"origin":[-1.0,1.0,-0.5],"widths":[0.5,0.5,0.5]}],[{"origin":[0.5,1.0,0.5],"widths":[0.5,0.5,0.5]},{"origin":[-1.0,1.0,0.5],"widths":[0.5,0.5,0.5]},{"origin":[0.5,1.0,-1.0],"widths":[0.5,0.5,0.5]},{"origin":[-1.0,1.0,-1.0],"widths":[0.5,0.5,0.5]}]]],[[[{"origin":[0.0,1.5,0.0],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,1.5,0.0],"widths":[0.5,0.5,0.5]},{"origin":[0.0,1.5,-0.5],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,1.5,-0.5],"widths":[0.5,0.5,0.5]}],[{"origin":[0.0,1.5,0.5],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,1.5,-1.0],"widths":[0.5,0.5,0.5]}],[{"origin":[-1.0,1.5,0.0],"widths":[0.5,0.5,0.5]},{"origin":[0.5,1.5,-0.5],"widths":[0.5,0.5,0.5]}],[{"origin":[0.5,1.5,0.0],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,1.5,0.5],"widths":[0.5,0.5,0.5]},{"origin":[0.0,1.5,-1.0],"widths":[0.5,0.5,0.5]},{"origin":[-1.0,1.5,-0.5],"widths":[0.5,0.5,0.5]}]]],[[[{"origin":[0.0,2.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,2.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[0.0,2.0,-0.5],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,2.0,-0.5],"widths":[0.5,0.5,0.5]}]]]] \ No newline at end of file diff --git a/recursive_swarm/asdf/json/Sphere/orderedCones4.json b/recursive_swarm/asdf/json/Sphere/orderedCones4.json new file mode 100644 index 0000000000000000000000000000000000000000..dd24218f73f5b70bc96dbc6c6a7e138d55dedb13 --- /dev/null +++ b/recursive_swarm/asdf/json/Sphere/orderedCones4.json @@ -0,0 +1 @@ +[[[[{"origin":[0.0,0.0,0.0],"widths":[1.0,1.0,1.0]},{"origin":[-1.0,0.0,0.0],"widths":[1.0,1.0,1.0]},{"origin":[0.0,0.0,-1.0],"widths":[1.0,1.0,1.0]},{"origin":[-1.0,0.0,-1.0],"widths":[1.0,1.0,1.0]}],[{"origin":[0.0,0.0,1.0],"widths":[1.0,1.0,1.0]},{"origin":[-2.0,0.0,0.0],"widths":[1.0,1.0,1.0]},{"origin":[1.0,0.0,-1.0],"widths":[1.0,1.0,1.0]},{"origin":[-1.0,0.0,-2.0],"widths":[1.0,1.0,1.0]}],[{"origin":[1.0,0.0,0.0],"widths":[1.0,1.0,1.0]},{"origin":[-1.0,0.0,1.0],"widths":[1.0,1.0,1.0]},{"origin":[0.0,0.0,-2.0],"widths":[1.0,1.0,1.0]},{"origin":[-2.0,0.0,-1.0],"widths":[1.0,1.0,1.0]}]]],[[[{"origin":[0.0,1.0,0.0],"widths":[1.0,1.0,1.0]},{"origin":[-1.0,1.0,0.0],"widths":[1.0,1.0,1.0]},{"origin":[0.0,1.0,-1.0],"widths":[1.0,1.0,1.0]},{"origin":[-1.0,1.0,-1.0],"widths":[1.0,1.0,1.0]}]]]] \ No newline at end of file diff --git a/recursive_swarm/asdf/json/Sphere/orderedCubes1.json b/recursive_swarm/asdf/json/Sphere/orderedCubes1.json new file mode 100644 index 0000000000000000000000000000000000000000..dd2f33edbf0d00d3e20d2e9ef842eb9d9b9f2443 --- /dev/null +++ b/recursive_swarm/asdf/json/Sphere/orderedCubes1.json @@ -0,0 +1 @@ +[[[[{"origin":[0.0,-1.0,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-1.0,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.0,-1.0,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-1.0,-0.125],"widths":[0.125,0.125,0.125]}]]],[[[{"origin":[0.125,-0.9375,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,-0.9375,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,-0.9375,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.9375,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,-0.9375,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.9375,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,-0.9375,-0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,-0.9375,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,-0.9375,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.9375,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,-0.9375,-0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,-0.9375,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,-0.9375,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,-0.9375,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,-0.9375,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.9375,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,-0.9375,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.9375,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,-0.9375,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.9375,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,-0.9375,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,-0.9375,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,-0.9375,-0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.9375,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,-0.9375,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.9375,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,-0.9375,-0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,-0.9375,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,-0.9375,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.9375,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,-0.9375,-0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,-0.9375,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,-0.9375,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,-0.9375,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,-0.9375,-0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.9375,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,-0.9375,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.9375,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,-0.9375,-0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.9375,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,-0.9375,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.9375,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,-0.9375,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.9375,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,-0.9375,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,-0.9375,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,-0.9375,-0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.9375,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,-0.9375,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.9375,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,-0.9375,-0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,-0.9375,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,-0.9375,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,-0.9375,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,-0.9375,-0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.9375,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,-0.9375,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.9375,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,-0.9375,-0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,-0.9375,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,-0.9375,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.9375,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,-0.9375,-0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.9375,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,-0.9375,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.9375,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,-0.9375,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.9375,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,-0.9375,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.9375,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,-0.9375,-0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.9375,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,-0.9375,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,-0.9375,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,-0.9375,-0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,-0.9375,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,-0.9375,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,-0.9375,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,-0.9375,-0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,-0.9375,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,-0.9375,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.9375,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,-0.9375,-0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.9375,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,-0.9375,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,-0.9375,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,-0.9375,-0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,-0.9375,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,-0.9375,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.9375,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,-0.9375,-0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.9375,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,-0.9375,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,-0.9375,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,-0.9375,-0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,-0.9375,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,-0.9375,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,-0.9375,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,-0.9375,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.9375,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,-0.9375,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.9375,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,-0.9375,-0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,-0.9375,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,-0.9375,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.9375,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.3125,-0.9375,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,-0.9375,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,-0.9375,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.9375,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.0625,-0.9375,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,-0.9375,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,-0.9375,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.9375,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,-0.9375,-0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,-0.9375,-0.4375],"widths":[0.0625,0.0625,0.0625]}]]],[[[{"origin":[0.0,-0.875,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.875,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.0,-0.875,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.875,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,-0.875,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.875,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.0,-0.875,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,-0.875,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,-0.875,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,-0.875,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.125,-0.875,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.875,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,-0.875,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,-0.875,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.125,-0.875,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,-0.875,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,-0.875,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.875,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.0,-0.875,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.875,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,-0.875,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.875,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.25,-0.875,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.875,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,-0.875,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.875,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.25,-0.875,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,-0.875,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.25,-0.875,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.125,-0.875,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,-0.875,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.875,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,-0.875,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.875,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.25,-0.875,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.875,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.375,-0.875,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,-0.875,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.125,-0.875,0.375],"widths":[0.125,0.125,0.125]},{"origin":[0.0,-0.875,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,-0.875,0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,-0.875,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.375,-0.875,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.875,-0.5],"widths":[0.125,0.125,0.125]}]],[[{"origin":[0.375,-0.875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.875,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.1875,-0.875,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,-0.875,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,-0.875,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,-0.875,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.875,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,-0.875,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.875,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.4375,-0.875,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,-0.875,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.25,-0.875,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,-0.875,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,-0.875,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.875,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.4375,-0.875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,-0.875,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.1875,-0.875,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,-0.875,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,-0.875,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,-0.875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.4375,-0.875,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.875,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.3125,-0.875,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,-0.875,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,-0.875,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.875,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,-0.875,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.875,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.4375,-0.875,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,-0.875,-0.3125],"widths":[0.0625,0.0625,0.0625]}]]],[[[{"origin":[0.375,-0.8125,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.8125,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.1875,-0.8125,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,-0.8125,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,-0.8125,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.8125,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,-0.8125,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.8125,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,-0.8125,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.8125,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,-0.8125,-0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.8125,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.25,-0.8125,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,-0.8125,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,-0.8125,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.8125,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.4375,-0.8125,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,-0.8125,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.1875,-0.8125,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,-0.8125,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,-0.8125,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,-0.8125,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.4375,-0.8125,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.8125,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.3125,-0.8125,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,-0.8125,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,-0.8125,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.8125,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,-0.8125,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.8125,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,-0.8125,-0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.8125,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,-0.8125,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.8125,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5,-0.8125,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.4375,-0.8125,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.25,-0.8125,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,-0.8125,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.4375,-0.8125,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,-0.8125,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,-0.8125,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.8125,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.0625,-0.8125,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,-0.8125,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,-0.8125,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.8125,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,-0.8125,-0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,-0.8125,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.375,-0.8125,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,-0.8125,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,-0.8125,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.8125,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,-0.8125,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.8125,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,-0.8125,-0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,-0.8125,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,-0.8125,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.8125,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.125,-0.8125,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,-0.8125,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,-0.8125,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.8125,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,-0.8125,-0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,-0.8125,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,-0.8125,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.8125,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5,-0.8125,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.4375,-0.8125,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.3125,-0.8125,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,-0.8125,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.4375,-0.8125,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,-0.8125,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,-0.8125,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.8125,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.1875,-0.8125,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,-0.8125,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,-0.8125,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.8125,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,-0.8125,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.8125,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.25,-0.8125,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,-0.8125,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,-0.8125,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.8125,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,-0.8125,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.8125,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,-0.8125,-0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.8125,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.375,-0.8125,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,-0.8125,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.4375,-0.8125,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,-0.8125,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,-0.8125,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,-0.8125,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5,-0.8125,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.4375,-0.8125,-0.375],"widths":[0.0625,0.0625,0.0625]}]]],[[[{"origin":[0.0,-0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,-0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.0,-0.75,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,-0.75,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,-0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,-0.75,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.25,-0.75,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.0,-0.75,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,-0.75,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,-0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.25,-0.75,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,-0.75,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,-0.75,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,-0.75,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.25,-0.75,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,-0.75,-0.5],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.5,-0.75,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.75,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.125,-0.75,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.0,-0.75,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,-0.75,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.75,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.5,-0.75,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.75,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.5,-0.75,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.75,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.25,-0.75,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.125,-0.75,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,-0.75,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.75,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.5,-0.75,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,-0.75,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,-0.75,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.75,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.5,-0.75,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.75,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.375,-0.75,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.25,-0.75,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.5,-0.75,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.75,-0.375],"widths":[0.125,0.125,0.125]}]],[[{"origin":[0.625,-0.75,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.75,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.0625,-0.75,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,-0.75,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,-0.75,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.75,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.75,-0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,-0.75,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,-0.75,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.75,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.125,-0.75,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,-0.75,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,-0.75,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.75,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.75,-0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,-0.75,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.4375,-0.75,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,-0.75,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,-0.75,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.75,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,-0.75,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.75,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,-0.75,-0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.75,-0.5625],"widths":[0.0625,0.0625,0.0625]}]]],[[[{"origin":[0.625,-0.6875,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.6875,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.0625,-0.6875,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,-0.6875,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,-0.6875,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.6875,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.6875,-0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,-0.6875,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,-0.6875,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.6875,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.125,-0.6875,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,-0.6875,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.6875,-0.6875,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.6875,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,-0.6875,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,-0.6875,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,-0.6875,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.6875,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.4375,-0.6875,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,-0.6875,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,-0.6875,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.6875,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,-0.6875,-0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.6875,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,-0.6875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.6875,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.1875,-0.6875,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,-0.6875,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.6875,-0.6875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.6875,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,-0.6875,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.6875,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,-0.6875,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.6875,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.25,-0.6875,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,-0.6875,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.6875,-0.6875,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.6875,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,-0.6875,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.6875,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.6875,-0.6875,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.6875,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,-0.6875,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.6875,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,-0.6875,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.6875,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5,-0.6875,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.4375,-0.6875,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,-0.6875,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.6875,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.3125,-0.6875,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,-0.6875,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.4375,-0.6875,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.6875,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,-0.6875,-0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,-0.6875,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.6875,-0.6875,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,-0.6875,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.0625,-0.6875,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,-0.6875,-0.75],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.75,-0.6875,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.6875,-0.6875,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,-0.6875,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,-0.6875,-0.75],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5625,-0.6875,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.625,-0.6875,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.4375,-0.6875,0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,-0.6875,-0.625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,-0.6875,0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.625,-0.6875,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5625,-0.6875,-0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.6875,-0.625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.6875,-0.6875,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,-0.6875,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.125,-0.6875,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,-0.6875,-0.75],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.75,-0.6875,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.6875,-0.6875,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,-0.6875,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,-0.6875,-0.75],"widths":[0.0625,0.0625,0.0625]}]]],[[[{"origin":[0.5,-0.625,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.625,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.125,-0.625,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.0,-0.625,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.625,-0.625,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.5,-0.625,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,-0.625,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.625,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.5,-0.625,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.625,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.25,-0.625,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.125,-0.625,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.625,-0.625,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.5,-0.625,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,-0.625,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,-0.625,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,-0.625,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.625,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.5,-0.625,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.625,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.5,-0.625,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.625,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.375,-0.625,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.25,-0.625,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.625,-0.625,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.75,-0.625,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.125,-0.625,0.625],"widths":[0.125,0.125,0.125]},{"origin":[0.0,-0.625,-0.75],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.75,-0.625,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.625,-0.625,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,-0.625,0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.625,-0.75],"widths":[0.125,0.125,0.125]}],[{"origin":[0.5,-0.625,0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.625,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.5,-0.625,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.375,-0.625,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.625,-0.625,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.75,-0.625,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.25,-0.625,0.625],"widths":[0.125,0.125,0.125]},{"origin":[0.125,-0.625,-0.75],"widths":[0.125,0.125,0.125]}],[{"origin":[0.375,-0.625,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.625,0.375],"widths":[0.125,0.125,0.125]},{"origin":[0.5,-0.625,-0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,-0.625,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.75,-0.625,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.625,-0.625,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,-0.625,0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,-0.625,-0.75],"widths":[0.125,0.125,0.125]}]],[[{"origin":[-0.6875,-0.625,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.625,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,-0.625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.625,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,-0.625,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.625,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.3125,-0.625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,-0.625,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,-0.625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.625,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.625,-0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,-0.625,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,-0.625,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.625,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.375,-0.625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,-0.625,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,-0.625,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.625,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,-0.625,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.625,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.6875,-0.625,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,-0.625,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.3125,-0.625,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,-0.625,-0.75],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.75,-0.625,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.6875,-0.625,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,-0.625,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.625,-0.75],"widths":[0.0625,0.0625,0.0625]}]]],[[[{"origin":[-0.6875,-0.5625,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.5625,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,-0.5625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.5625,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,-0.5625,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.5625,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.3125,-0.5625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,-0.5625,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,-0.5625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.5625,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.5625,-0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,-0.5625,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,-0.5625,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.5625,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.375,-0.5625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,-0.5625,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,-0.5625,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.5625,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,-0.5625,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.5625,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.6875,-0.5625,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,-0.5625,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.3125,-0.5625,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,-0.5625,-0.75],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.75,-0.5625,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.6875,-0.5625,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,-0.5625,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.5625,-0.75],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,-0.5625,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.5625,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.0625,-0.5625,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,-0.5625,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,-0.5625,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.5625,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,-0.5625,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,-0.5625,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,-0.5625,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.5625,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.125,-0.5625,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,-0.5625,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,-0.5625,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.5625,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,-0.5625,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,-0.5625,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,-0.5625,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,-0.5625,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.6875,-0.5625,-0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,-0.5625,-0.75],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5625,-0.5625,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.625,-0.5625,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5625,-0.5625,0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,-0.5625,-0.625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.6875,-0.5625,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,-0.5625,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.375,-0.5625,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,-0.5625,-0.75],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,-0.5625,0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.625,-0.5625,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5625,-0.5625,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.5625,-0.625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,-0.5625,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.5625,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.1875,-0.5625,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,-0.5625,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,-0.5625,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.5625,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,-0.5625,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.5625,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,-0.5625,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.5625,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.25,-0.5625,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,-0.5625,-0.8125],"widths":[0.0625,0.0625,0.0625]}]]],[[[{"origin":[0.0,-0.5,0.0],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,-0.5,0.0],"widths":[0.5,0.5,0.5]},{"origin":[0.0,-0.5,-0.5],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,-0.5,-0.5],"widths":[0.5,0.5,0.5]}]],[[{"origin":[0.5,-0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.25,-0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.0,-0.5,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.75,-0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,-0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,-0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,-0.5,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,-0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.5,-0.5,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,-0.5,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,-0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.5,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.5,-0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.25,-0.5,-0.75],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.5,-0.5,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.5,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.5,-0.5,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.5,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,-0.5,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.5,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.125,-0.5,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.0,-0.5,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.875,-0.5,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.75,-0.5,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,-0.5,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.5,-0.875],"widths":[0.125,0.125,0.125]}]],[[{"origin":[0.75,-0.5,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.5,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.1875,-0.5,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,-0.5,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,-0.5,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.5,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,-0.5,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.5,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,-0.5,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.5,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.25,-0.5,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,-0.5,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,-0.5,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.5,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,-0.5,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.5,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,-0.5,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.5,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.3125,-0.5,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,-0.5,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,-0.5,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.5,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,-0.5,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.5,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,-0.5,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.5,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.5,-0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,-0.5,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,-0.5,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.5,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5625,-0.5,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,-0.5,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,-0.5,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.5,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.375,-0.5,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,-0.5,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,-0.5,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.5,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.5,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.5,-0.6875],"widths":[0.0625,0.0625,0.0625]}]]],[[[{"origin":[0.75,-0.4375,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.4375,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.1875,-0.4375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,-0.4375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,-0.4375,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.4375,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,-0.4375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.4375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,-0.4375,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.4375,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.25,-0.4375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,-0.4375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,-0.4375,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.4375,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,-0.4375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.4375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,-0.4375,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.4375,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.3125,-0.4375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,-0.4375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,-0.4375,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.4375,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,-0.4375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.4375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,-0.4375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.4375,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.4375,-0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,-0.4375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,-0.4375,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.4375,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5625,-0.4375,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,-0.4375,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,-0.4375,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.4375,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.375,-0.4375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,-0.4375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,-0.4375,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.4375,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.4375,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.4375,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.8125,-0.4375,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.875,-0.4375,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.1875,-0.4375,0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,-0.4375,-0.875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.875,-0.4375,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.8125,-0.4375,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,-0.4375,0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.4375,-0.875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.8125,-0.4375,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.875,-0.4375,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.25,-0.4375,0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,-0.4375,-0.875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.875,-0.4375,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.8125,-0.4375,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,-0.4375,0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.4375,-0.875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,-0.4375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.4375,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.4375,-0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.4375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,-0.4375,0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.4375,-0.625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.625,-0.4375,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5625,-0.4375,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,-0.4375,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.4375,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.4375,-0.4375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,-0.4375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5625,-0.4375,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.4375,0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.4375,-0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.625,-0.4375,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.8125,-0.4375,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.875,-0.4375,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.3125,-0.4375,0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,-0.4375,-0.875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.875,-0.4375,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.8125,-0.4375,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,-0.4375,0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.4375,-0.875],"widths":[0.0625,0.0625,0.0625]}]]],[[[{"origin":[0.5,-0.375,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.375,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.5,-0.375,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.375,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,-0.375,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.375,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.0,-0.375,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.375,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,-0.375,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.375,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.75,-0.375,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.375,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,-0.375,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,-0.375,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.125,-0.375,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.375,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,-0.375,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.375,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.75,-0.375,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,-0.375,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,-0.375,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.375,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.25,-0.375,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.375,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,-0.375,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.375,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.75,-0.375,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.375,-0.875],"widths":[0.125,0.125,0.125]}]],[[{"origin":[0.625,-0.375,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.375,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,-0.375,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.375,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,-0.375,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.375,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.375,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.375,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,-0.375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,-0.375,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.375,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,-0.375,0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.625,-0.375,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5625,-0.375,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.375,-0.625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,-0.375,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,-0.375,-0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.375,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5625,-0.375,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.375,0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.375,-0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.625,-0.375,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.6875,-0.375,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.375,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,-0.375,-0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,-0.375,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,-0.375,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.375,-0.75],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.75,-0.375,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.6875,-0.375,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,-0.375,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,-0.375,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,-0.375,-0.9375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.375,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,-0.375,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.375,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,-0.375,-0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,-0.375,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,-0.375,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,-0.375,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,-0.375,-0.9375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.375,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,-0.375,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.375,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,-0.375,-0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,-0.375,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.4375,-0.375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,-0.375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,-0.375,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.375,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,-0.375,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,-0.375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.4375,-0.375,-0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.375,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,-0.375,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.375,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.375,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.375,-0.6875],"widths":[0.0625,0.0625,0.0625]}]]],[[[{"origin":[0.625,-0.3125,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.3125,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,-0.3125,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.3125,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.6875,-0.3125,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.3125,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,-0.3125,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.3125,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,-0.3125,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.3125,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,-0.3125,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.3125,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,-0.3125,0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.625,-0.3125,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5625,-0.3125,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.3125,-0.625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,-0.3125,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.3125,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,-0.3125,-0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.3125,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5625,-0.3125,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.3125,0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.3125,-0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.625,-0.3125,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.6875,-0.3125,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.3125,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,-0.3125,-0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,-0.3125,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,-0.3125,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.3125,-0.75],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.75,-0.3125,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.6875,-0.3125,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,-0.3125,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,-0.3125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,-0.3125,-0.9375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.3125,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,-0.3125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.3125,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,-0.3125,-0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,-0.3125,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,-0.3125,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,-0.3125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,-0.3125,-0.9375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.3125,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,-0.3125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.3125,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,-0.3125,-0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,-0.3125,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.4375,-0.3125,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,-0.3125,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,-0.3125,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.3125,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,-0.3125,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,-0.3125,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.4375,-0.3125,-0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.3125,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,-0.3125,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.3125,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.3125,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.3125,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,-0.3125,0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.3125,-0.875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.875,-0.3125,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.8125,-0.3125,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.6875,-0.3125,0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.625,-0.3125,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5625,-0.3125,-0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,-0.3125,-0.625],"widths":[0.0625,0.0625,0.0625]}]]],[[[{"origin":[0.5,-0.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,-0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.0,-0.25,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.25,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,-0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,-0.25,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,-0.25,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.75,-0.25,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.5,-0.25,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,-0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,-0.25,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,-0.25,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,-0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.25,-0.25,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.25,-0.5],"widths":[0.25,0.25,0.25]}]],[[{"origin":[-0.625,-0.25,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.5,-0.25,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.5,-0.25,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.25,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,-0.25,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.0,-0.25,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.25,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,-0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.25,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.75,-0.25,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.25,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,-0.25,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,-0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.125,-0.25,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.25,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,-0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.25,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.75,-0.25,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,-0.25,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,-0.25,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.25,-0.25,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.25,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,-0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.25,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.75,-0.25,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.25,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.625,-0.25,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.25,0.625],"widths":[0.125,0.125,0.125]},{"origin":[0.5,-0.25,-0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.75,-0.25,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.75,-0.25,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.625,-0.25,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.5,-0.25,0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.25,-0.75],"widths":[0.125,0.125,0.125]}]],[[{"origin":[0.375,-0.25,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.25,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,-0.25,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.25,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,-0.25,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.25,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,-0.25,-0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.25,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,-0.25,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,-0.25,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,-0.25,-0.9375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.25,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,-0.25,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.25,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,-0.25,-0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,-0.25,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,-0.25,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,-0.25,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,-0.25,-0.9375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.25,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,-0.25,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.25,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,-0.25,-0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,-0.25,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.4375,-0.25,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,-0.25,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,-0.25,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.25,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,-0.25,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,-0.25,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.4375,-0.25,-0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.25,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,-0.25,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.25,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.25,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.25,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,-0.25,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.25,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,-0.25,-0.9375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.25,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,-0.25,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.25,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,-0.25,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.25,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,-0.25,0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.25,-0.875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.875,-0.25,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.8125,-0.25,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.8125,-0.25,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.25,0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,-0.25,-0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.875,-0.25,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,-0.25,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.25,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,-0.25,-0.9375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.25,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,-0.25,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.25,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,-0.25,-0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.25,-0.9375],"widths":[0.0625,0.0625,0.0625]}]]],[[[{"origin":[0.375,-0.1875,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.1875,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,-0.1875,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.1875,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,-0.1875,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.1875,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,-0.1875,-0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.1875,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,-0.1875,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,-0.1875,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,-0.1875,-0.9375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.1875,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,-0.1875,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.1875,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,-0.1875,-0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,-0.1875,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,-0.1875,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,-0.1875,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,-0.1875,-0.9375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.1875,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,-0.1875,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.1875,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,-0.1875,-0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,-0.1875,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.4375,-0.1875,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,-0.1875,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,-0.1875,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.1875,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,-0.1875,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,-0.1875,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.4375,-0.1875,-0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.1875,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,-0.1875,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.1875,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.1875,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.1875,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,-0.1875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.1875,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,-0.1875,-0.9375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.1875,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,-0.1875,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.1875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,-0.1875,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.1875,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,-0.1875,0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.1875,-0.875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.875,-0.1875,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.8125,-0.1875,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.8125,-0.1875,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.1875,0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,-0.1875,-0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.875,-0.1875,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,-0.1875,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.1875,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,-0.1875,-0.9375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.1875,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,-0.1875,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.1875,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,-0.1875,-0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.1875,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,-0.1875,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.1875,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,-0.1875,-0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.1875,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,-0.1875,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.1875,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,-0.1875,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.1875,-0.5625],"widths":[0.0625,0.0625,0.0625]}]]],[[[{"origin":[-0.625,-0.125,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.5,-0.125,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.5,-0.125,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.125,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,-0.125,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.0,-0.125,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.125,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,-0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.125,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.75,-0.125,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.125,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,-0.125,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,-0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.125,-0.125,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.125,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,-0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.125,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.75,-0.125,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,-0.125,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,-0.125,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.25,-0.125,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.125,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,-0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.125,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.75,-0.125,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.125,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.625,-0.125,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.125,0.625],"widths":[0.125,0.125,0.125]},{"origin":[0.5,-0.125,-0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.75,-0.125,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.75,-0.125,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.625,-0.125,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.5,-0.125,0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.125,-0.75],"widths":[0.125,0.125,0.125]}],[{"origin":[0.375,-0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,-0.125,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.875,-0.125,0.375],"widths":[0.125,0.125,0.125]},{"origin":[0.75,-0.125,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,-0.125,0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,-0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.375,-0.125,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.125,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[0.875,-0.125,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.125,0.875],"widths":[0.125,0.125,0.125]},{"origin":[0.0,-0.125,-1.0],"widths":[0.125,0.125,0.125]},{"origin":[-1.0,-0.125,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,-0.125,0.875],"widths":[0.125,0.125,0.125]},{"origin":[-1.0,-0.125,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.875,-0.125,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.125,-1.0],"widths":[0.125,0.125,0.125]}]],[[{"origin":[0.625,-0.125,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.125,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.125,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.125,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,-0.125,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,-0.125,-0.9375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.125,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,-0.125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.125,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,-0.125,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.125,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,-0.125,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,-0.125,-0.9375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.125,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,-0.125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.125,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,-0.125,-0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.125,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,-0.125,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,-0.125,-0.9375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.125,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,-0.125,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.125,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,-0.125,-0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.125,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,-0.125,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.125,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,-0.125,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.125,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,-0.125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.125,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,-0.125,-0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.125,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,-0.125,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,-0.125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,-0.125,-0.9375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.125,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,-0.125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.125,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,-0.125,-0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,-0.125,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.6875,-0.125,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.125,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.125,-0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,-0.125,-0.6875],"widths":[0.0625,0.0625,0.0625]}]]],[[[{"origin":[0.625,-0.0625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.0625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.0625,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.0625,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,-0.0625,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.0625,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,-0.0625,-0.9375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.0625,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,-0.0625,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.0625,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,-0.0625,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.0625,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,-0.0625,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.0625,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,-0.0625,-0.9375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.0625,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,-0.0625,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.0625,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,-0.0625,-0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.0625,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,-0.0625,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.0625,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,-0.0625,-0.9375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.0625,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,-0.0625,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.0625,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,-0.0625,-0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.0625,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,-0.0625,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.0625,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,-0.0625,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.0625,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,-0.0625,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.0625,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,-0.0625,-0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.0625,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,-0.0625,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,-0.0625,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,-0.0625,-0.9375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.0625,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,-0.0625,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.0625,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,-0.0625,-0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,-0.0625,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.6875,-0.0625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.0625,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.0625,-0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,-0.0625,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,-0.0625,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.0625,-0.75],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.75,-0.0625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.6875,-0.0625,-0.6875],"widths":[0.0625,0.0625,0.0625]}]]],[[[{"origin":[0.0,0.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,0.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[0.0,0.0,-0.5],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,0.0,-0.5],"widths":[0.5,0.5,0.5]}]],[[{"origin":[0.5,0.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.25,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.0,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.0,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.0,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.0,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.0,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.5,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.0,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,0.0,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,-0.5],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.5,0.0,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.0,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.5,0.0,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.0,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,0.0,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.0,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.125,0.0,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.0,0.0,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,0.0,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.0,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.0,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.0,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,0.0,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.0,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.25,0.0,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.125,0.0,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,0.0,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.0,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.0,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.0,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,0.0,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.0,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.375,0.0,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.0,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,0.0,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.0,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.0,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.0,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.625,0.0,0.625],"widths":[0.125,0.125,0.125]},{"origin":[0.5,0.0,-0.75],"widths":[0.125,0.125,0.125]}],[{"origin":[0.625,0.0,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.75,0.0,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.5,0.0,0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.75,0.0,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.625,0.0,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.0,-0.75],"widths":[0.125,0.125,0.125]}],[{"origin":[0.375,0.0,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.0,0.375],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.0,-0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,0.0,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.5,0.0,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.375,0.0,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,0.0,0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.0,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[0.875,0.0,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-1.0,0.0,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.125,0.0,0.875],"widths":[0.125,0.125,0.125]},{"origin":[0.0,0.0,-1.0],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,0.0,0.875],"widths":[0.125,0.125,0.125]},{"origin":[-1.0,0.0,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.875,0.0,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.0,-1.0],"widths":[0.125,0.125,0.125]}]],[[{"origin":[0.625,0.0,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.0,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.0,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.0,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,0.0,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.0,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.1875,0.0,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,0.0,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,0.0,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.0,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,0.0,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.0,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,0.0,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.0,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.25,0.0,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,0.0,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,0.0,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.0,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,0.0,-0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.0,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,0.0,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.0,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.3125,0.0,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,0.0,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5625,0.0,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,0.0,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,0.0,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.0,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,0.0,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.0,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.0,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.0,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,0.0,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.0,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,0.0,-0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.0,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,0.0,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.0,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.375,0.0,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,0.0,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,0.0,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.0,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,0.0,-0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,0.0,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.6875,0.0,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.0,-0.75],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.6875,0.0,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,0.0,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,0.0,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,0.0,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.6875,0.0,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.0,-0.75],"widths":[0.0625,0.0625,0.0625]}]]],[[[{"origin":[0.625,0.0625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.0625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.0625,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.0625,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,0.0625,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.0625,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.1875,0.0625,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,0.0625,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,0.0625,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.0625,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,0.0625,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.0625,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,0.0625,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.0625,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.25,0.0625,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,0.0625,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,0.0625,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.0625,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,0.0625,-0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.0625,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,0.0625,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.0625,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.3125,0.0625,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,0.0625,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5625,0.0625,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,0.0625,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,0.0625,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.0625,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,0.0625,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.0625,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.0625,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.0625,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,0.0625,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.0625,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,0.0625,-0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.0625,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,0.0625,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.0625,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.375,0.0625,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,0.0625,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,0.0625,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.0625,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,0.0625,-0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,0.0625,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.6875,0.0625,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.0625,-0.75],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.6875,0.0625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,0.0625,-0.6875],"widths":[0.0625,0.0625,0.0625]}]]],[[[{"origin":[0.5,0.125,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.125,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.5,0.125,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.125,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,0.125,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.125,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.125,0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.0,0.125,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.125,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.125,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.125,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,0.125,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.125,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.25,0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.125,0.125,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.125,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.125,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.125,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,0.125,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.125,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.375,0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.125,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.125,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.125,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.125,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.625,0.125,0.625],"widths":[0.125,0.125,0.125]},{"origin":[0.5,0.125,-0.75],"widths":[0.125,0.125,0.125]}],[{"origin":[0.625,0.125,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.75,0.125,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.5,0.125,0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.75,0.125,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.625,0.125,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.125,-0.75],"widths":[0.125,0.125,0.125]}]],[[{"origin":[0.375,0.125,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.125,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.125,-0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,0.125,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.4375,0.125,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,0.125,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,0.125,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.125,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,0.125,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.125,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.0625,0.125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,0.125,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,0.125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.125,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,0.125,-0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,0.125,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,0.125,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.125,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.125,0.125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,0.125,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,0.125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.125,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,0.125,-0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,0.125,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.4375,0.125,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.125,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.125,-0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,0.125,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5,0.125,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.4375,0.125,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,0.125,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.125,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,0.125,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.125,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.125,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.125,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,0.125,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.125,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.1875,0.125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,0.125,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,0.125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.125,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,0.125,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.125,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,0.125,0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.875,0.125,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.8125,0.125,-0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,0.125,-0.875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.4375,0.125,0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,0.125,-0.875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.8125,0.125,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.875,0.125,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,0.125,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.125,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.25,0.125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,0.125,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,0.125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.125,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,0.125,-0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.125,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5625,0.125,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,0.125,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,0.125,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.125,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,0.125,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.125,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.125,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.125,-0.8125],"widths":[0.0625,0.0625,0.0625]}]]],[[[{"origin":[0.375,0.1875,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.1875,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.1875,-0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,0.1875,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.4375,0.1875,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,0.1875,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,0.1875,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.1875,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,0.1875,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.1875,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.0625,0.1875,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,0.1875,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,0.1875,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.1875,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,0.1875,-0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,0.1875,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,0.1875,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.1875,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.125,0.1875,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,0.1875,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,0.1875,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.1875,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,0.1875,-0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,0.1875,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.4375,0.1875,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.1875,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.1875,-0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,0.1875,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5,0.1875,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.4375,0.1875,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,0.1875,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.1875,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,0.1875,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.1875,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.1875,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.1875,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,0.1875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.1875,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.1875,0.1875,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,0.1875,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,0.1875,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.1875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,0.1875,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.1875,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,0.1875,0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.875,0.1875,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.8125,0.1875,-0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,0.1875,-0.875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.4375,0.1875,0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,0.1875,-0.875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.8125,0.1875,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.875,0.1875,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,0.1875,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.1875,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.25,0.1875,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,0.1875,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,0.1875,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.1875,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,0.1875,-0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.1875,-0.9375],"widths":[0.0625,0.0625,0.0625]}]]],[[[{"origin":[0.5,0.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.25,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.25,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.75,0.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.25,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.25,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.25,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.25,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.25,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,0.25,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.25,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.5,0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.25,-0.75],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.5,0.25,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.25,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.5,0.25,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.25,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,0.25,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.25,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.125,0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.0,0.25,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.25,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.25,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.25,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,0.25,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.25,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.25,0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.125,0.25,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.25,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.25,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.25,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,0.25,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.25,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.375,0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.25,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.25,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.25,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.25,-0.875],"widths":[0.125,0.125,0.125]}]],[[{"origin":[-0.5625,0.25,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,0.25,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,0.25,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.25,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,0.25,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.25,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.25,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.25,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,0.25,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.25,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.25,-0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,0.25,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.625,0.25,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5625,0.25,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,0.25,0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.25,-0.625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.4375,0.25,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,0.25,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,0.25,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.25,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5625,0.25,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.25,0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.25,-0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.625,0.25,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5625,0.25,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,0.25,-0.75],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.6875,0.25,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,0.25,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,0.25,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,0.25,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.6875,0.25,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.25,-0.75],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,0.25,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.25,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.0625,0.25,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,0.25,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,0.25,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.25,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,0.25,-0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,0.25,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,0.25,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.25,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.125,0.25,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,0.25,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,0.25,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.25,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,0.25,-0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,0.25,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.4375,0.25,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.25,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.25,-0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,0.25,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5,0.25,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.4375,0.25,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,0.25,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.25,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,0.25,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.25,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.25,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.25,-0.6875],"widths":[0.0625,0.0625,0.0625]}]]],[[[{"origin":[-0.5625,0.3125,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,0.3125,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,0.3125,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.3125,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,0.3125,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.3125,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.3125,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.3125,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,0.3125,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.3125,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.3125,-0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,0.3125,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.625,0.3125,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5625,0.3125,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,0.3125,0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.3125,-0.625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.4375,0.3125,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,0.3125,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,0.3125,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.3125,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5625,0.3125,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.3125,0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.3125,-0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.625,0.3125,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5625,0.3125,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,0.3125,-0.75],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.6875,0.3125,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,0.3125,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,0.3125,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,0.3125,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.6875,0.3125,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.3125,-0.75],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,0.3125,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.3125,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.0625,0.3125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,0.3125,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,0.3125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.3125,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,0.3125,-0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,0.3125,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,0.3125,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.3125,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.125,0.3125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,0.3125,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,0.3125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.3125,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,0.3125,-0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,0.3125,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.4375,0.3125,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.3125,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.3125,-0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,0.3125,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5,0.3125,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.4375,0.3125,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,0.3125,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.3125,-0.5],"widths":[0.0625,0.0625,0.0625]}]]],[[[{"origin":[0.5,0.375,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.375,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.5,0.375,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.375,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,0.375,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.375,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.0,0.375,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.375,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.875,0.375,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.375,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,0.375,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.375,-0.875],"widths":[0.125,0.125,0.125]}]],[[{"origin":[0.75,0.375,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,0.375,-0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.375,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,0.375,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.375,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,0.375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,0.375,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,0.375,-0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.375,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,0.375,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.375,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,0.375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,0.375,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,0.375,-0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.375,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,0.375,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.375,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,0.375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,0.375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.375,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.375,-0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,0.375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,0.375,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.375,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5625,0.375,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,0.375,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,0.375,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.375,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.375,0.375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,0.375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,0.375,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.375,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.375,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.375,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.8125,0.375,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.375,0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,0.375,-0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.875,0.375,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.875,0.375,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.8125,0.375,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,0.375,0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.375,-0.875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.8125,0.375,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.375,0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,0.375,-0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.875,0.375,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.875,0.375,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.8125,0.375,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,0.375,0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.375,-0.875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,0.375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.375,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.375,-0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,0.375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,0.375,0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.375,-0.625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.625,0.375,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5625,0.375,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,0.375,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.375,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.4375,0.375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,0.375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5625,0.375,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.375,0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.375,-0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.625,0.375,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.8125,0.375,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.375,0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,0.375,-0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.875,0.375,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.875,0.375,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.8125,0.375,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,0.375,0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.375,-0.875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.6875,0.375,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,0.375,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5625,0.375,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,0.375,-0.75],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,0.375,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,0.375,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.6875,0.375,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.375,-0.75],"widths":[0.0625,0.0625,0.0625]}]]],[[[{"origin":[0.75,0.4375,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.4375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,0.4375,-0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.4375,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,0.4375,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.4375,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,0.4375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.4375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,0.4375,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.4375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,0.4375,-0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.4375,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,0.4375,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.4375,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,0.4375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.4375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,0.4375,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.4375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,0.4375,-0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.4375,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,0.4375,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.4375,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,0.4375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.4375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,0.4375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.4375,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.4375,-0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,0.4375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,0.4375,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.4375,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5625,0.4375,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,0.4375,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,0.4375,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.4375,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.375,0.4375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,0.4375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,0.4375,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.4375,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.4375,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.4375,-0.6875],"widths":[0.0625,0.0625,0.0625]}]]],[[[{"origin":[0.0,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.5,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.5,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.5,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.5,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.5,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.5,-0.5],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.5,0.5,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.5,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.0,0.5,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.5,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.625,0.5,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.5,0.5,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,0.5,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.5,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.5,0.5,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.5,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.125,0.5,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.5,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.625,0.5,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.5,0.5,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,0.5,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.5,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,0.5,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.5,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.5,0.5,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.5,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.5,0.5,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.5,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.375,0.5,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.5,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.625,0.5,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.5,0.625],"widths":[0.125,0.125,0.125]},{"origin":[0.0,0.5,-0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.75,0.5,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.75,0.5,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.625,0.5,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,0.5,0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.5,-0.75],"widths":[0.125,0.125,0.125]}],[{"origin":[0.5,0.5,0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.5,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.5,0.5,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.375,0.5,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.625,0.5,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.5,0.625],"widths":[0.125,0.125,0.125]},{"origin":[0.125,0.5,-0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.75,0.5,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.375,0.5,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.5,0.375],"widths":[0.125,0.125,0.125]},{"origin":[0.5,0.5,-0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,0.5,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.75,0.5,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.625,0.5,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,0.5,0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.5,-0.75],"widths":[0.125,0.125,0.125]}]],[[{"origin":[-0.6875,0.5,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.5,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,0.5,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.5,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,0.5,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.5,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.3125,0.5,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,0.5,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,0.5,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.5,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.5,-0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,0.5,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,0.5,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.5,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.375,0.5,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,0.5,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,0.5,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.5,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,0.5,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.5,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.6875,0.5,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.5,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,0.5,-0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,0.5,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.75,0.5,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.6875,0.5,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,0.5,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.5,-0.75],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,0.5,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,0.5,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,0.5,-0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.5,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,0.5,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.5,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,0.5,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,0.5,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,0.5,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,0.5,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,0.5,-0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.5,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,0.5,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.5,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,0.5,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,0.5,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,0.5,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,0.5,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.6875,0.5,-0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,0.5,-0.75],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5625,0.5,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.625,0.5,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5625,0.5,0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,0.5,-0.625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.6875,0.5,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,0.5,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.375,0.5,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,0.5,-0.75],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,0.5,0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.625,0.5,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5625,0.5,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.5,-0.625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,0.5,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.5,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,0.5,-0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.5,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,0.5,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.5,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,0.5,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.5,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,0.5,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.5,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,0.5,-0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.5,-0.25],"widths":[0.0625,0.0625,0.0625]}]]],[[[{"origin":[-0.6875,0.5625,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.5625,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,0.5625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.5625,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,0.5625,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.5625,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.3125,0.5625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,0.5625,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,0.5625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.5625,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.5625,-0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,0.5625,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,0.5625,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.5625,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.375,0.5625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,0.5625,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,0.5625,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.5625,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,0.5625,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.5625,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.6875,0.5625,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.5625,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,0.5625,-0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,0.5625,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.75,0.5625,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.6875,0.5625,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,0.5625,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.5625,-0.75],"widths":[0.0625,0.0625,0.0625]}]]],[[[{"origin":[0.5,0.625,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.625,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.0,0.625,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.625,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,0.625,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.625,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.625,0.625,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.5,0.625,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.5,0.625,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.625,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.125,0.625,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.625,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,0.625,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.625,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.625,0.625,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.5,0.625,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,0.625,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.625,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.625,0.625,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.5,0.625,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.5,0.625,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.625,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.625,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.625,-0.375],"widths":[0.125,0.125,0.125]}]],[[{"origin":[0.625,0.625,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,0.625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,0.625,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.625,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.6875,0.625,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.625,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,0.625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,0.625,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,0.625,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,0.625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,0.625,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.625,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.6875,0.625,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.625,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,0.625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,0.625,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,0.625,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.625,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.4375,0.625,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,0.625,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,0.625,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.625,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,0.625,-0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,0.625,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,0.625,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,0.625,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.625,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.6875,0.625,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.625,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,0.625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.625,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,0.625,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,0.625,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.625,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.6875,0.625,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.625,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,0.625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.625,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.6875,0.625,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.625,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,0.625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.625,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,0.625,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.625,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5,0.625,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.4375,0.625,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,0.625,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.625,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.3125,0.625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,0.625,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.4375,0.625,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.625,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,0.625,-0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,0.625,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.6875,0.625,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,0.625,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,0.625,-0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,0.625,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.75,0.625,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.6875,0.625,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,0.625,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,0.625,-0.75],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5625,0.625,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.625,0.625,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.4375,0.625,0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,0.625,-0.625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,0.625,0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.625,0.625,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5625,0.625,-0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,0.625,-0.625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.6875,0.625,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,0.625,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,0.625,-0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,0.625,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.75,0.625,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.6875,0.625,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,0.625,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,0.625,-0.75],"widths":[0.0625,0.0625,0.0625]}]]],[[[{"origin":[0.625,0.6875,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,0.6875,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,0.6875,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.6875,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,0.6875,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,0.6875,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.6875,0.6875,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.6875,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,0.6875,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,0.6875,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,0.6875,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.6875,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,0.6875,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,0.6875,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.6875,0.6875,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.6875,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,0.6875,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,0.6875,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,0.6875,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.6875,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,0.6875,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,0.6875,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5625,0.6875,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,0.6875,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,0.6875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.6875,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,0.6875,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.6875,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,0.6875,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.6875,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.6875,0.6875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.6875,-0.1875],"widths":[0.0625,0.0625,0.0625]}]]],[[[{"origin":[0.0,0.75,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.75,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.0,0.75,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.75,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,0.75,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.75,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.0,0.75,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.75,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,0.75,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.75,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.125,0.75,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.75,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,0.75,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.75,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.125,0.75,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.75,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,0.75,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.75,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.0,0.75,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.75,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,0.75,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.75,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.75,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.75,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,0.75,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.75,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.375,0.75,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.75,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,0.75,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.75,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.125,0.75,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.75,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,0.75,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.75,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.375,0.75,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.75,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.375,0.75,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.75,0.375],"widths":[0.125,0.125,0.125]},{"origin":[0.0,0.75,-0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,0.75,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,0.75,0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.75,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.5,0.75,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.375,0.75,-0.125],"widths":[0.125,0.125,0.125]}]],[[{"origin":[0.375,0.75,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.75,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,0.75,-0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,0.75,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,0.75,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.75,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.4375,0.75,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,0.75,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,0.75,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.75,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.4375,0.75,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,0.75,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,0.75,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.75,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,0.75,-0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,0.75,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.4375,0.75,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.75,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,0.75,-0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,0.75,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,0.75,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.75,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5,0.75,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.4375,0.75,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,0.75,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.75,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,0.75,-0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,0.75,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,0.75,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.75,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.4375,0.75,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,0.75,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,0.75,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.75,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5,0.75,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.4375,0.75,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.4375,0.75,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.75,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,0.75,-0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,0.75,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,0.75,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,0.75,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,0.75,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.75,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,0.75,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,0.75,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5625,0.75,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,0.75,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,0.75,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,0.75,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,0.75,-0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,0.75,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,0.75,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,0.75,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.4375,0.75,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,0.75,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,0.75,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,0.75,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,0.75,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.75,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,0.75,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,0.75,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5625,0.75,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,0.75,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,0.75,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.75,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5,0.75,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.4375,0.75,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.4375,0.75,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.75,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,0.75,-0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,0.75,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,0.75,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.75,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,0.75,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.75,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,0.75,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.75,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5625,0.75,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,0.75,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,0.75,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.75,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,0.75,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.75,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,0.75,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.75,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5625,0.75,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,0.75,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.4375,0.75,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,0.75,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,0.75,-0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,0.75,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,0.75,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,0.75,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5,0.75,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.4375,0.75,-0.375],"widths":[0.0625,0.0625,0.0625]}]]],[[[{"origin":[0.375,0.8125,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.8125,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,0.8125,-0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,0.8125,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,0.8125,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.8125,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.4375,0.8125,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,0.8125,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,0.8125,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.8125,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.4375,0.8125,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,0.8125,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,0.8125,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.8125,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,0.8125,-0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,0.8125,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.4375,0.8125,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.8125,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,0.8125,-0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,0.8125,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,0.8125,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.8125,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5,0.8125,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.4375,0.8125,-0.1875],"widths":[0.0625,0.0625,0.0625]}]]],[[[{"origin":[0.0,0.875,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.875,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.0,0.875,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.875,-0.125],"widths":[0.125,0.125,0.125]}]],[[{"origin":[0.125,0.875,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,0.875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,0.875,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.875,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,0.875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.875,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,0.875,-0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,0.875,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,0.875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.875,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,0.875,-0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,0.875,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,0.875,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,0.875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,0.875,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.875,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,0.875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,0.875,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.875,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,0.875,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,0.875,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,0.875,-0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.875,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,0.875,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.875,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,0.875,-0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,0.875,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,0.875,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.875,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,0.875,-0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,0.875,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,0.875,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,0.875,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,0.875,-0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.875,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,0.875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.875,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,0.875,-0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.875,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,0.875,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,0.875,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.875,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,0.875,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,0.875,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,0.875,-0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.875,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,0.875,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.875,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,0.875,-0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,0.875,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,0.875,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,0.875,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,0.875,-0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.875,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,0.875,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.875,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,0.875,-0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,0.875,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,0.875,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.875,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,0.875,-0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.875,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,0.875,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,0.875,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.875,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,0.875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.875,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,0.875,-0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.875,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,0.875,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,0.875,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,0.875,-0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,0.875,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,0.875,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,0.875,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,0.875,-0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,0.875,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,0.875,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.875,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,0.875,-0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.875,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,0.875,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,0.875,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,0.875,-0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,0.875,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,0.875,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.875,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,0.875,-0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.875,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,0.875,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,0.875,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,0.875,-0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,0.875,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,0.875,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.875,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.375,0.875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,0.875,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,0.875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.875,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,0.875,-0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,0.875,-0.1875],"widths":[0.0625,0.0625,0.0625]}]]]] \ No newline at end of file diff --git a/recursive_swarm/asdf/json/Sphere/orderedCubes2.json b/recursive_swarm/asdf/json/Sphere/orderedCubes2.json new file mode 100644 index 0000000000000000000000000000000000000000..df04292d746a1c86734224a95135ddb052695648 --- /dev/null +++ b/recursive_swarm/asdf/json/Sphere/orderedCubes2.json @@ -0,0 +1 @@ +[[[[{"origin":[0.0,-1.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,-1.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.0,-1.0,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,-1.0,-0.25],"widths":[0.25,0.25,0.25]}]]],[[[{"origin":[0.25,-0.875,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.875,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.0,-0.875,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.875,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,-0.875,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.875,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.25,-0.875,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.875,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,-0.875,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.875,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.25,-0.875,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,-0.875,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.25,-0.875,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.125,-0.875,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,-0.875,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.875,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,-0.875,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.875,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.25,-0.875,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.875,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.375,-0.875,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,-0.875,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.125,-0.875,0.375],"widths":[0.125,0.125,0.125]},{"origin":[0.0,-0.875,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,-0.875,0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,-0.875,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.375,-0.875,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.875,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,-0.875,0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,-0.875,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.375,-0.875,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,-0.875,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.25,-0.875,0.375],"widths":[0.125,0.125,0.125]},{"origin":[0.125,-0.875,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[0.375,-0.875,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,-0.875,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.375,-0.875,0.375],"widths":[0.125,0.125,0.125]},{"origin":[0.25,-0.875,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[0.375,-0.875,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,-0.875,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,-0.875,0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.875,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.5,-0.875,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.375,-0.875,-0.375],"widths":[0.125,0.125,0.125]}]]],[[[{"origin":[0.0,-0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,-0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.0,-0.75,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,-0.75,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,-0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,-0.75,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.25,-0.75,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.0,-0.75,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,-0.75,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,-0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.25,-0.75,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,-0.75,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,-0.75,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,-0.75,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.25,-0.75,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,-0.75,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,-0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.75,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.25,-0.75,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.0,-0.75,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.75,-0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,-0.75,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,-0.75,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,-0.75,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,-0.75,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.75,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.5,-0.75,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,-0.75,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,-0.75,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.75,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.5,-0.75,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.25,-0.75,-0.75],"widths":[0.25,0.25,0.25]}]]],[[[{"origin":[0.0,-0.5,0.0],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,-0.5,0.0],"widths":[0.5,0.5,0.5]},{"origin":[0.0,-0.5,-0.5],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,-0.5,-0.5],"widths":[0.5,0.5,0.5]}]],[[{"origin":[0.5,-0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.25,-0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.0,-0.5,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.75,-0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,-0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,-0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,-0.5,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,-0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.5,-0.5,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,-0.5,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,-0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.5,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.5,-0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.25,-0.5,-0.75],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.5,-0.5,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.5,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.5,-0.5,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.5,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,-0.5,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.5,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.125,-0.5,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.0,-0.5,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.875,-0.5,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.75,-0.5,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,-0.5,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.5,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,-0.5,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.5,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.25,-0.5,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.125,-0.5,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.875,-0.5,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.75,-0.5,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,-0.5,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,-0.5,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,-0.5,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.5,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.375,-0.5,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.25,-0.5,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.875,-0.5,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.75,-0.5,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,-0.5,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.5,-0.875],"widths":[0.125,0.125,0.125]}]]],[[[{"origin":[0.5,-0.375,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.375,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.5,-0.375,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.375,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,-0.375,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.375,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.0,-0.375,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.375,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,-0.375,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.375,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.75,-0.375,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.375,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,-0.375,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,-0.375,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.125,-0.375,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.375,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,-0.375,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.375,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.75,-0.375,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,-0.375,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,-0.375,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.375,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.25,-0.375,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.375,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,-0.375,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.375,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.75,-0.375,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.375,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.625,-0.375,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.375,0.625],"widths":[0.125,0.125,0.125]},{"origin":[0.5,-0.375,-0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.75,-0.375,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.5,-0.375,0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.75,-0.375,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.625,-0.375,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.375,-0.75],"widths":[0.125,0.125,0.125]}],[{"origin":[0.375,-0.375,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,-0.375,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.875,-0.375,0.375],"widths":[0.125,0.125,0.125]},{"origin":[0.75,-0.375,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,-0.375,0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,-0.375,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.375,-0.375,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.375,-0.5],"widths":[0.125,0.125,0.125]}]]],[[[{"origin":[0.5,-0.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,-0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.0,-0.25,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.25,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,-0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,-0.25,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,-0.25,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.75,-0.25,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.5,-0.25,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,-0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,-0.25,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,-0.25,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,-0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.25,-0.25,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.25,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,-0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.5,-0.25,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.25,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.75,-0.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,-0.25,0.75],"widths":[0.25,0.25,0.25]},{"origin":[0.0,-0.25,-1.0],"widths":[0.25,0.25,0.25]},{"origin":[-1.0,-0.25,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,-0.25,0.75],"widths":[0.25,0.25,0.25]},{"origin":[-1.0,-0.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.75,-0.25,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,-0.25,-1.0],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.75,-0.25,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.25,-0.25,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.25,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,-0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.25,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.75,-0.25,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.25,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.375,-0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,-0.25,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.875,-0.25,0.375],"widths":[0.125,0.125,0.125]},{"origin":[0.75,-0.25,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,-0.25,0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,-0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.375,-0.25,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.25,-0.5],"widths":[0.125,0.125,0.125]}]]],[[[{"origin":[0.75,-0.125,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.25,-0.125,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.125,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,-0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.125,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.75,-0.125,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.125,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.375,-0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,-0.125,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.875,-0.125,0.375],"widths":[0.125,0.125,0.125]},{"origin":[0.75,-0.125,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,-0.125,0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,-0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.375,-0.125,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.125,-0.5],"widths":[0.125,0.125,0.125]}]]],[[[{"origin":[0.0,0.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,0.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[0.0,0.0,-0.5],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,0.0,-0.5],"widths":[0.5,0.5,0.5]}]],[[{"origin":[0.5,0.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.25,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.0,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.0,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.0,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.0,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.0,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.5,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.0,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,0.0,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.0,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.75,0.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-1.0,0.0,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.25,0.0,0.75],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.0,-1.0],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,0.0,0.75],"widths":[0.25,0.25,0.25]},{"origin":[-1.0,0.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.75,0.0,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.0,-1.0],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.75,0.0,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.0,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.375,0.0,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.0,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,0.0,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.0,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.0,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.0,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.375,0.0,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.0,0.375],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.0,-0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,0.0,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.5,0.0,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.375,0.0,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,0.0,0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.0,-0.5],"widths":[0.125,0.125,0.125]}]]],[[[{"origin":[0.75,0.125,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.125,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.375,0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.125,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.125,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.125,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.125,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.375,0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.125,0.375],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.125,-0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,0.125,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.5,0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.375,0.125,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,0.125,0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.125,-0.5],"widths":[0.125,0.125,0.125]}]]],[[[{"origin":[0.5,0.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.25,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.25,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.75,0.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.25,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.25,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.25,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.25,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.25,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,0.25,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.25,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.5,0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.25,-0.75],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.5,0.25,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.25,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.5,0.25,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.25,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,0.25,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.25,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.125,0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.0,0.25,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.25,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.25,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.25,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,0.25,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.25,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.25,0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.125,0.25,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.25,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.25,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.25,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,0.25,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.25,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.375,0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.25,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.25,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.25,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.25,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.625,0.25,0.625],"widths":[0.125,0.125,0.125]},{"origin":[0.5,0.25,-0.75],"widths":[0.125,0.125,0.125]}],[{"origin":[0.625,0.25,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.75,0.25,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.5,0.25,0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.75,0.25,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.625,0.25,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.25,-0.75],"widths":[0.125,0.125,0.125]}],[{"origin":[0.375,0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.25,0.375],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.25,-0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,0.25,-0.875],"widths":[0.125,0.125,0.125]}]]],[[[{"origin":[0.5,0.375,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.375,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.5,0.375,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.375,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,0.375,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.375,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.0,0.375,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.375,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.875,0.375,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.375,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,0.375,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.375,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,0.375,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.375,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.125,0.375,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.375,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.875,0.375,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.375,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,0.375,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.375,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,0.375,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.375,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.375,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.375,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.875,0.375,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.375,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,0.375,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.375,-0.875],"widths":[0.125,0.125,0.125]}]]],[[[{"origin":[0.0,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.5,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.5,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.5,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.5,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.5,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.5,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.5,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.75,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.5,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.5,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.5,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.5,0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.5,-0.75],"widths":[0.25,0.25,0.25]}]]],[[[{"origin":[0.0,0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.75,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.75,-0.25],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.25,0.75,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.75,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.0,0.75,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.75,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,0.75,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.75,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.75,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.75,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,0.75,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.75,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.375,0.75,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.75,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,0.75,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.75,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.125,0.75,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.75,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,0.75,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.75,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.375,0.75,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.75,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.375,0.75,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.75,0.375],"widths":[0.125,0.125,0.125]},{"origin":[0.0,0.75,-0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,0.75,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,0.75,0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.75,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.5,0.75,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.375,0.75,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,0.75,0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.75,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.5,0.75,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.375,0.75,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.375,0.75,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.75,0.375],"widths":[0.125,0.125,0.125]},{"origin":[0.125,0.75,-0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,0.75,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.375,0.75,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.75,0.375],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.75,-0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,0.75,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,0.75,0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.75,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.5,0.75,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.375,0.75,-0.375],"widths":[0.125,0.125,0.125]}]]]] \ No newline at end of file diff --git a/recursive_swarm/asdf/json/Sphere/orderedCubes3.json b/recursive_swarm/asdf/json/Sphere/orderedCubes3.json new file mode 100644 index 0000000000000000000000000000000000000000..cc50a4740e5bfdb297e0adf96b0e36f1a9efe99c --- /dev/null +++ b/recursive_swarm/asdf/json/Sphere/orderedCubes3.json @@ -0,0 +1 @@ +[[[[{"origin":[0.0,-1.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,-1.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[0.0,-1.0,-0.5],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,-1.0,-0.5],"widths":[0.5,0.5,0.5]}]]],[[[{"origin":[0.5,-0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.75,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.25,-0.75,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.0,-0.75,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.75,-0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,-0.75,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,-0.75,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,-0.75,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,-0.75,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.75,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.5,-0.75,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,-0.75,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,-0.75,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.75,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.5,-0.75,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.25,-0.75,-0.75],"widths":[0.25,0.25,0.25]}]]],[[[{"origin":[0.0,-0.5,0.0],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,-0.5,0.0],"widths":[0.5,0.5,0.5]},{"origin":[0.0,-0.5,-0.5],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,-0.5,-0.5],"widths":[0.5,0.5,0.5]}],[{"origin":[0.5,-0.5,0.0],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,-0.5,0.5],"widths":[0.5,0.5,0.5]},{"origin":[0.0,-0.5,-1.0],"widths":[0.5,0.5,0.5]},{"origin":[-1.0,-0.5,-0.5],"widths":[0.5,0.5,0.5]}],[{"origin":[0.0,-0.5,0.5],"widths":[0.5,0.5,0.5]},{"origin":[-1.0,-0.5,0.0],"widths":[0.5,0.5,0.5]},{"origin":[0.5,-0.5,-0.5],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,-0.5,-1.0],"widths":[0.5,0.5,0.5]}]],[[{"origin":[0.5,-0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.5,-0.5,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.5,-0.75],"widths":[0.25,0.25,0.25]}]]],[[[{"origin":[0.5,-0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.5,-0.25,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.25,-0.75],"widths":[0.25,0.25,0.25]}]]],[[[{"origin":[0.0,0.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,0.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[0.0,0.0,-0.5],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,0.0,-0.5],"widths":[0.5,0.5,0.5]}],[{"origin":[0.5,0.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[-1.0,0.0,-0.5],"widths":[0.5,0.5,0.5]}],[{"origin":[-0.5,0.0,0.5],"widths":[0.5,0.5,0.5]},{"origin":[0.0,0.0,-1.0],"widths":[0.5,0.5,0.5]}],[{"origin":[0.0,0.0,0.5],"widths":[0.5,0.5,0.5]},{"origin":[-1.0,0.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[0.5,0.0,-0.5],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,0.0,-1.0],"widths":[0.5,0.5,0.5]}]],[[{"origin":[0.5,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.0,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,-0.75],"widths":[0.25,0.25,0.25]}]]],[[[{"origin":[0.5,0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.25,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.25,-0.75],"widths":[0.25,0.25,0.25]}]]],[[[{"origin":[0.0,0.5,0.0],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,0.5,-0.5],"widths":[0.5,0.5,0.5]}],[{"origin":[-0.5,0.5,0.0],"widths":[0.5,0.5,0.5]},{"origin":[0.0,0.5,-0.5],"widths":[0.5,0.5,0.5]}]],[[{"origin":[0.5,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.5,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.75,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.5,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.5,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.5,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.5,0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.5,-0.75],"widths":[0.25,0.25,0.25]}]]]] \ No newline at end of file diff --git a/recursive_swarm/asdf/json/Sphere/orderedCubes4.json b/recursive_swarm/asdf/json/Sphere/orderedCubes4.json new file mode 100644 index 0000000000000000000000000000000000000000..10e81d8ebfaab8249d5065ac94bf33c0626fdbdd --- /dev/null +++ b/recursive_swarm/asdf/json/Sphere/orderedCubes4.json @@ -0,0 +1 @@ +[[[[{"origin":[0.0,-1.0,0.0],"widths":[1.0,1.0,1.0]},{"origin":[-1.0,-1.0,0.0],"widths":[1.0,1.0,1.0]},{"origin":[0.0,-1.0,-1.0],"widths":[1.0,1.0,1.0]},{"origin":[-1.0,-1.0,-1.0],"widths":[1.0,1.0,1.0]}]]],[[[{"origin":[0.0,0.0,0.0],"widths":[1.0,1.0,1.0]},{"origin":[-1.0,0.0,0.0],"widths":[1.0,1.0,1.0]},{"origin":[0.0,0.0,-1.0],"widths":[1.0,1.0,1.0]},{"origin":[-1.0,0.0,-1.0],"widths":[1.0,1.0,1.0]}]]]] \ No newline at end of file diff --git a/recursive_swarm/asdf/json/Sphere/orderedCubesSize1.json b/recursive_swarm/asdf/json/Sphere/orderedCubesSize1.json new file mode 100644 index 0000000000000000000000000000000000000000..ebe7b2ace50f8ab89312516c986a1c0a14d04b5d --- /dev/null +++ b/recursive_swarm/asdf/json/Sphere/orderedCubesSize1.json @@ -0,0 +1 @@ +[[[[{"origin":[0.0,-0.5,0.0],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,-0.5,0.0],"widths":[0.5,0.5,0.5]},{"origin":[0.0,-0.5,-0.5],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,-0.5,-0.5],"widths":[0.5,0.5,0.5]}]],[[{"origin":[0.0,0.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,0.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[0.0,0.0,-0.5],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,0.0,-0.5],"widths":[0.5,0.5,0.5]}]]],[[[{"origin":[0.0,-0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,-0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.0,-0.75,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,-0.75,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,-0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,-0.75,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.25,-0.75,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.0,-0.75,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,-0.75,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,-0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.25,-0.75,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,-0.75,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,-0.75,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,-0.75,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.25,-0.75,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,-0.75,-0.5],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.5,-0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.25,-0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.0,-0.5,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.75,-0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,-0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,-0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,-0.5,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,-0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.5,-0.5,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,-0.5,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,-0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.5,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.5,-0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.25,-0.5,-0.75],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.5,-0.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,-0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.0,-0.25,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.25,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,-0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,-0.25,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,-0.25,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.75,-0.25,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.5,-0.25,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,-0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,-0.25,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,-0.25,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,-0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.25,-0.25,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.25,-0.5],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.5,0.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.25,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.0,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.0,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.0,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.0,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.0,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.5,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.0,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,0.0,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,-0.5],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.5,0.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.25,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.25,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.75,0.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.25,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.25,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.25,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.25,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.25,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,0.25,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.25,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.5,0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.25,-0.75],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.0,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.5,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.5,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.5,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.5,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.5,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.5,-0.5],"widths":[0.25,0.25,0.25]}]]],[[[{"origin":[0.0,-1.0,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-1.0,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.0,-1.0,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-1.0,-0.125],"widths":[0.125,0.125,0.125]}]],[[{"origin":[0.0,-0.875,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.875,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.0,-0.875,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.875,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,-0.875,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.875,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.0,-0.875,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,-0.875,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,-0.875,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,-0.875,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.125,-0.875,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.875,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,-0.875,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,-0.875,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.125,-0.875,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,-0.875,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,-0.875,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.875,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.0,-0.875,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.875,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,-0.875,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.875,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.25,-0.875,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.875,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,-0.875,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.875,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.25,-0.875,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,-0.875,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.25,-0.875,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.125,-0.875,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,-0.875,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.875,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,-0.875,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.875,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.25,-0.875,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.875,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.375,-0.875,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,-0.875,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.125,-0.875,0.375],"widths":[0.125,0.125,0.125]},{"origin":[0.0,-0.875,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,-0.875,0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,-0.875,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.375,-0.875,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.875,-0.5],"widths":[0.125,0.125,0.125]}]],[[{"origin":[0.5,-0.75,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.75,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.125,-0.75,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.0,-0.75,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,-0.75,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.75,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.5,-0.75,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.75,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.5,-0.75,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.75,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.25,-0.75,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.125,-0.75,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,-0.75,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.75,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.5,-0.75,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,-0.75,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,-0.75,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.75,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.5,-0.75,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.75,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.375,-0.75,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.25,-0.75,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.5,-0.75,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.75,-0.375],"widths":[0.125,0.125,0.125]}]],[[{"origin":[0.5,-0.625,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.625,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.125,-0.625,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.0,-0.625,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.625,-0.625,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.5,-0.625,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,-0.625,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.625,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.5,-0.625,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.625,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.25,-0.625,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.125,-0.625,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.625,-0.625,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.5,-0.625,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,-0.625,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,-0.625,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,-0.625,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.625,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.5,-0.625,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.625,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.5,-0.625,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.625,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.375,-0.625,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.25,-0.625,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.625,-0.625,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.75,-0.625,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.125,-0.625,0.625],"widths":[0.125,0.125,0.125]},{"origin":[0.0,-0.625,-0.75],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.75,-0.625,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.625,-0.625,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,-0.625,0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.625,-0.75],"widths":[0.125,0.125,0.125]}],[{"origin":[0.5,-0.625,0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.625,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.5,-0.625,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.375,-0.625,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.625,-0.625,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.75,-0.625,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.25,-0.625,0.625],"widths":[0.125,0.125,0.125]},{"origin":[0.125,-0.625,-0.75],"widths":[0.125,0.125,0.125]}],[{"origin":[0.375,-0.625,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.625,0.375],"widths":[0.125,0.125,0.125]},{"origin":[0.5,-0.625,-0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,-0.625,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.75,-0.625,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.625,-0.625,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,-0.625,0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,-0.625,-0.75],"widths":[0.125,0.125,0.125]}]],[[{"origin":[0.5,-0.5,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.5,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.5,-0.5,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.5,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,-0.5,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.5,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.125,-0.5,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.0,-0.5,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.875,-0.5,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.75,-0.5,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,-0.5,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.5,-0.875],"widths":[0.125,0.125,0.125]}]],[[{"origin":[0.5,-0.375,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.375,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.5,-0.375,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.375,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,-0.375,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.375,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.0,-0.375,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.375,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,-0.375,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.375,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.75,-0.375,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.375,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,-0.375,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,-0.375,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.125,-0.375,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.375,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,-0.375,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.375,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.75,-0.375,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,-0.375,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,-0.375,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.375,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.25,-0.375,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.375,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,-0.375,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.375,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.75,-0.375,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.375,-0.875],"widths":[0.125,0.125,0.125]}]],[[{"origin":[-0.625,-0.25,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.5,-0.25,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.5,-0.25,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.25,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,-0.25,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.0,-0.25,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.25,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,-0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.25,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.75,-0.25,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.25,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,-0.25,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,-0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.125,-0.25,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.25,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,-0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.25,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.75,-0.25,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,-0.25,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,-0.25,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.25,-0.25,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.25,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,-0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.25,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.75,-0.25,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.25,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.625,-0.25,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.25,0.625],"widths":[0.125,0.125,0.125]},{"origin":[0.5,-0.25,-0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.75,-0.25,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.75,-0.25,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.625,-0.25,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.5,-0.25,0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.25,-0.75],"widths":[0.125,0.125,0.125]}]],[[{"origin":[-0.625,-0.125,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.5,-0.125,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.5,-0.125,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.125,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,-0.125,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.0,-0.125,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.125,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,-0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.125,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.75,-0.125,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.125,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,-0.125,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,-0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.125,-0.125,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.125,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,-0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.125,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.75,-0.125,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,-0.125,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,-0.125,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.25,-0.125,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.125,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,-0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.125,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.75,-0.125,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.125,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.625,-0.125,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.125,0.625],"widths":[0.125,0.125,0.125]},{"origin":[0.5,-0.125,-0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.75,-0.125,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.75,-0.125,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.625,-0.125,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.5,-0.125,0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.125,-0.75],"widths":[0.125,0.125,0.125]}],[{"origin":[0.375,-0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,-0.125,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.875,-0.125,0.375],"widths":[0.125,0.125,0.125]},{"origin":[0.75,-0.125,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,-0.125,0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,-0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.375,-0.125,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.125,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[0.875,-0.125,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.125,0.875],"widths":[0.125,0.125,0.125]},{"origin":[0.0,-0.125,-1.0],"widths":[0.125,0.125,0.125]},{"origin":[-1.0,-0.125,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,-0.125,0.875],"widths":[0.125,0.125,0.125]},{"origin":[-1.0,-0.125,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.875,-0.125,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.125,-1.0],"widths":[0.125,0.125,0.125]}]],[[{"origin":[0.5,0.0,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.0,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.5,0.0,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.0,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,0.0,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.0,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.125,0.0,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.0,0.0,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,0.0,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.0,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.0,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.0,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,0.0,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.0,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.25,0.0,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.125,0.0,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,0.0,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.0,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.0,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.0,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,0.0,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.0,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.375,0.0,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.0,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,0.0,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.0,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.0,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.0,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.625,0.0,0.625],"widths":[0.125,0.125,0.125]},{"origin":[0.5,0.0,-0.75],"widths":[0.125,0.125,0.125]}],[{"origin":[0.625,0.0,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.75,0.0,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.5,0.0,0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.75,0.0,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.625,0.0,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.0,-0.75],"widths":[0.125,0.125,0.125]}],[{"origin":[0.375,0.0,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.0,0.375],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.0,-0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,0.0,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.5,0.0,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.375,0.0,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,0.0,0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.0,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[0.875,0.0,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-1.0,0.0,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.125,0.0,0.875],"widths":[0.125,0.125,0.125]},{"origin":[0.0,0.0,-1.0],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,0.0,0.875],"widths":[0.125,0.125,0.125]},{"origin":[-1.0,0.0,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.875,0.0,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.0,-1.0],"widths":[0.125,0.125,0.125]}]],[[{"origin":[0.5,0.125,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.125,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.5,0.125,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.125,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,0.125,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.125,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.125,0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.0,0.125,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.125,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.125,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.125,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,0.125,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.125,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.25,0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.125,0.125,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.125,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.125,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.125,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,0.125,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.125,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.375,0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.125,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.125,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.125,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.125,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.625,0.125,0.625],"widths":[0.125,0.125,0.125]},{"origin":[0.5,0.125,-0.75],"widths":[0.125,0.125,0.125]}],[{"origin":[0.625,0.125,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.75,0.125,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.5,0.125,0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.75,0.125,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.625,0.125,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.125,-0.75],"widths":[0.125,0.125,0.125]}]],[[{"origin":[0.5,0.25,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.25,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.5,0.25,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.25,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,0.25,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.25,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.125,0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.0,0.25,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.25,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.25,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.25,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,0.25,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.25,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.25,0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.125,0.25,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.25,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.25,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.25,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,0.25,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.25,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.375,0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.25,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.25,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.25,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.25,-0.875],"widths":[0.125,0.125,0.125]}]],[[{"origin":[0.5,0.375,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.375,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.5,0.375,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.375,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,0.375,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.375,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.0,0.375,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.375,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.875,0.375,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.375,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,0.375,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.375,-0.875],"widths":[0.125,0.125,0.125]}]],[[{"origin":[0.5,0.5,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.5,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.0,0.5,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.5,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.625,0.5,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.5,0.5,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,0.5,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.5,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.5,0.5,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.5,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.125,0.5,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.5,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.625,0.5,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.5,0.5,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,0.5,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.5,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,0.5,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.5,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.5,0.5,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.5,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.5,0.5,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.5,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.375,0.5,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.5,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.625,0.5,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.5,0.625],"widths":[0.125,0.125,0.125]},{"origin":[0.0,0.5,-0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.75,0.5,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.75,0.5,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.625,0.5,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,0.5,0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.5,-0.75],"widths":[0.125,0.125,0.125]}],[{"origin":[0.5,0.5,0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.5,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.5,0.5,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.375,0.5,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.625,0.5,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.5,0.625],"widths":[0.125,0.125,0.125]},{"origin":[0.125,0.5,-0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.75,0.5,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.375,0.5,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.5,0.375],"widths":[0.125,0.125,0.125]},{"origin":[0.5,0.5,-0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,0.5,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.75,0.5,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.625,0.5,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,0.5,0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.5,-0.75],"widths":[0.125,0.125,0.125]}]],[[{"origin":[0.5,0.625,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.625,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.0,0.625,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.625,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,0.625,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.625,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.625,0.625,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.5,0.625,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.5,0.625,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.625,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.125,0.625,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.625,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,0.625,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.625,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.625,0.625,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.5,0.625,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,0.625,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.625,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.625,0.625,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.5,0.625,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.5,0.625,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.625,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.625,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.625,-0.375],"widths":[0.125,0.125,0.125]}]],[[{"origin":[0.0,0.75,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.75,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.0,0.75,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.75,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,0.75,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.75,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.0,0.75,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.75,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,0.75,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.75,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.125,0.75,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.75,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,0.75,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.75,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.125,0.75,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.75,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,0.75,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.75,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.0,0.75,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.75,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,0.75,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.75,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.75,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.75,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,0.75,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.75,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.375,0.75,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.75,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,0.75,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.75,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.125,0.75,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.75,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,0.75,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.75,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.375,0.75,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.75,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.375,0.75,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.75,0.375],"widths":[0.125,0.125,0.125]},{"origin":[0.0,0.75,-0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,0.75,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,0.75,0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.75,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.5,0.75,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.375,0.75,-0.125],"widths":[0.125,0.125,0.125]}]],[[{"origin":[0.0,0.875,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.875,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.0,0.875,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.875,-0.125],"widths":[0.125,0.125,0.125]}]]],[[[{"origin":[0.125,-0.9375,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,-0.9375,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,-0.9375,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.9375,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,-0.9375,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.9375,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,-0.9375,-0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,-0.9375,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,-0.9375,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.9375,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,-0.9375,-0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,-0.9375,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,-0.9375,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,-0.9375,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,-0.9375,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.9375,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,-0.9375,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.9375,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,-0.9375,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.9375,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,-0.9375,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,-0.9375,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,-0.9375,-0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.9375,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,-0.9375,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.9375,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,-0.9375,-0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,-0.9375,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,-0.9375,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.9375,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,-0.9375,-0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,-0.9375,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,-0.9375,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,-0.9375,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,-0.9375,-0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.9375,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,-0.9375,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.9375,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,-0.9375,-0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.9375,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,-0.9375,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.9375,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,-0.9375,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.9375,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,-0.9375,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,-0.9375,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,-0.9375,-0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.9375,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,-0.9375,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.9375,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,-0.9375,-0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,-0.9375,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,-0.9375,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,-0.9375,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,-0.9375,-0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.9375,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,-0.9375,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.9375,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,-0.9375,-0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,-0.9375,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,-0.9375,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.9375,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,-0.9375,-0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.9375,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,-0.9375,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.9375,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,-0.9375,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.9375,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,-0.9375,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.9375,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,-0.9375,-0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.9375,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,-0.9375,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,-0.9375,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,-0.9375,-0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,-0.9375,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,-0.9375,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,-0.9375,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,-0.9375,-0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,-0.9375,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,-0.9375,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.9375,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,-0.9375,-0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.9375,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,-0.9375,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,-0.9375,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,-0.9375,-0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,-0.9375,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,-0.9375,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.9375,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,-0.9375,-0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.9375,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,-0.9375,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,-0.9375,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,-0.9375,-0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,-0.9375,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,-0.9375,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,-0.9375,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,-0.9375,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.9375,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,-0.9375,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.9375,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,-0.9375,-0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,-0.9375,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,-0.9375,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.9375,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.3125,-0.9375,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,-0.9375,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,-0.9375,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.9375,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.0625,-0.9375,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,-0.9375,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,-0.9375,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.9375,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,-0.9375,-0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,-0.9375,-0.4375],"widths":[0.0625,0.0625,0.0625]}]],[[{"origin":[0.375,-0.875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.875,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.1875,-0.875,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,-0.875,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,-0.875,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,-0.875,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.875,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,-0.875,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.875,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.4375,-0.875,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,-0.875,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.25,-0.875,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,-0.875,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,-0.875,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.875,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.4375,-0.875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,-0.875,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.1875,-0.875,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,-0.875,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,-0.875,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,-0.875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.4375,-0.875,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.875,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.3125,-0.875,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,-0.875,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,-0.875,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.875,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,-0.875,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.875,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.4375,-0.875,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,-0.875,-0.3125],"widths":[0.0625,0.0625,0.0625]}]],[[{"origin":[0.375,-0.8125,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.8125,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.1875,-0.8125,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,-0.8125,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,-0.8125,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.8125,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,-0.8125,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.8125,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,-0.8125,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.8125,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,-0.8125,-0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.8125,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.25,-0.8125,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,-0.8125,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,-0.8125,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.8125,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.4375,-0.8125,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,-0.8125,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.1875,-0.8125,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,-0.8125,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,-0.8125,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,-0.8125,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.4375,-0.8125,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.8125,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.3125,-0.8125,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,-0.8125,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,-0.8125,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.8125,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,-0.8125,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.8125,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,-0.8125,-0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.8125,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,-0.8125,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.8125,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5,-0.8125,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.4375,-0.8125,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.25,-0.8125,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,-0.8125,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.4375,-0.8125,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,-0.8125,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,-0.8125,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.8125,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.0625,-0.8125,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,-0.8125,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,-0.8125,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.8125,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,-0.8125,-0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,-0.8125,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.375,-0.8125,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,-0.8125,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,-0.8125,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.8125,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,-0.8125,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.8125,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,-0.8125,-0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,-0.8125,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,-0.8125,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.8125,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.125,-0.8125,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,-0.8125,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,-0.8125,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.8125,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,-0.8125,-0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,-0.8125,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,-0.8125,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.8125,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5,-0.8125,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.4375,-0.8125,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.3125,-0.8125,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,-0.8125,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.4375,-0.8125,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,-0.8125,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,-0.8125,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.8125,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.1875,-0.8125,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,-0.8125,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,-0.8125,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.8125,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,-0.8125,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.8125,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.25,-0.8125,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,-0.8125,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,-0.8125,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.8125,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,-0.8125,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.8125,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,-0.8125,-0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.8125,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.375,-0.8125,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,-0.8125,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.4375,-0.8125,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,-0.8125,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,-0.8125,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,-0.8125,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5,-0.8125,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.4375,-0.8125,-0.375],"widths":[0.0625,0.0625,0.0625]}]],[[{"origin":[0.625,-0.75,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.75,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.0625,-0.75,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,-0.75,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,-0.75,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.75,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.75,-0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,-0.75,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,-0.75,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.75,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.125,-0.75,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,-0.75,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,-0.75,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.75,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.75,-0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,-0.75,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.4375,-0.75,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,-0.75,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,-0.75,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.75,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,-0.75,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.75,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,-0.75,-0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.75,-0.5625],"widths":[0.0625,0.0625,0.0625]}]],[[{"origin":[0.625,-0.6875,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.6875,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.0625,-0.6875,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,-0.6875,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,-0.6875,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.6875,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.6875,-0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,-0.6875,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,-0.6875,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.6875,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.125,-0.6875,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,-0.6875,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.6875,-0.6875,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.6875,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,-0.6875,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,-0.6875,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,-0.6875,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.6875,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.4375,-0.6875,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,-0.6875,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,-0.6875,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.6875,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,-0.6875,-0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.6875,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,-0.6875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.6875,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.1875,-0.6875,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,-0.6875,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.6875,-0.6875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.6875,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,-0.6875,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.6875,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,-0.6875,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.6875,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.25,-0.6875,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,-0.6875,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.6875,-0.6875,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.6875,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,-0.6875,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.6875,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.6875,-0.6875,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.6875,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,-0.6875,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.6875,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,-0.6875,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.6875,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5,-0.6875,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.4375,-0.6875,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,-0.6875,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.6875,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.3125,-0.6875,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,-0.6875,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.4375,-0.6875,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.6875,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,-0.6875,-0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,-0.6875,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.6875,-0.6875,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,-0.6875,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.0625,-0.6875,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,-0.6875,-0.75],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.75,-0.6875,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.6875,-0.6875,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,-0.6875,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,-0.6875,-0.75],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5625,-0.6875,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.625,-0.6875,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.4375,-0.6875,0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,-0.6875,-0.625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,-0.6875,0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.625,-0.6875,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5625,-0.6875,-0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.6875,-0.625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.6875,-0.6875,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,-0.6875,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.125,-0.6875,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,-0.6875,-0.75],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.75,-0.6875,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.6875,-0.6875,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,-0.6875,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,-0.6875,-0.75],"widths":[0.0625,0.0625,0.0625]}]],[[{"origin":[-0.6875,-0.625,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.625,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,-0.625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.625,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,-0.625,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.625,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.3125,-0.625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,-0.625,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,-0.625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.625,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.625,-0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,-0.625,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,-0.625,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.625,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.375,-0.625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,-0.625,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,-0.625,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.625,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,-0.625,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.625,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.6875,-0.625,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,-0.625,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.3125,-0.625,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,-0.625,-0.75],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.75,-0.625,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.6875,-0.625,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,-0.625,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.625,-0.75],"widths":[0.0625,0.0625,0.0625]}]],[[{"origin":[-0.6875,-0.5625,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.5625,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,-0.5625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.5625,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,-0.5625,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.5625,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.3125,-0.5625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,-0.5625,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,-0.5625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.5625,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.5625,-0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,-0.5625,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,-0.5625,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.5625,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.375,-0.5625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,-0.5625,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,-0.5625,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.5625,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,-0.5625,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.5625,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.6875,-0.5625,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,-0.5625,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.3125,-0.5625,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,-0.5625,-0.75],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.75,-0.5625,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.6875,-0.5625,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,-0.5625,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.5625,-0.75],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,-0.5625,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.5625,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.0625,-0.5625,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,-0.5625,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,-0.5625,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.5625,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,-0.5625,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,-0.5625,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,-0.5625,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.5625,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.125,-0.5625,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,-0.5625,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,-0.5625,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.5625,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,-0.5625,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,-0.5625,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,-0.5625,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,-0.5625,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.6875,-0.5625,-0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,-0.5625,-0.75],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5625,-0.5625,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.625,-0.5625,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5625,-0.5625,0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,-0.5625,-0.625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.6875,-0.5625,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,-0.5625,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.375,-0.5625,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,-0.5625,-0.75],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,-0.5625,0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.625,-0.5625,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5625,-0.5625,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.5625,-0.625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,-0.5625,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.5625,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.1875,-0.5625,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,-0.5625,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,-0.5625,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.5625,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,-0.5625,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.5625,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,-0.5625,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.5625,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.25,-0.5625,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,-0.5625,-0.8125],"widths":[0.0625,0.0625,0.0625]}]],[[{"origin":[0.75,-0.5,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.5,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.1875,-0.5,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,-0.5,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,-0.5,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.5,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,-0.5,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.5,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,-0.5,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.5,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.25,-0.5,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,-0.5,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,-0.5,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.5,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,-0.5,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.5,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,-0.5,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.5,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.3125,-0.5,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,-0.5,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,-0.5,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.5,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,-0.5,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.5,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,-0.5,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.5,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.5,-0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,-0.5,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,-0.5,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.5,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5625,-0.5,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,-0.5,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,-0.5,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.5,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.375,-0.5,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,-0.5,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,-0.5,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.5,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.5,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.5,-0.6875],"widths":[0.0625,0.0625,0.0625]}]],[[{"origin":[0.75,-0.4375,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.4375,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.1875,-0.4375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,-0.4375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,-0.4375,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.4375,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,-0.4375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.4375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,-0.4375,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.4375,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.25,-0.4375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,-0.4375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,-0.4375,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.4375,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,-0.4375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.4375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,-0.4375,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.4375,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.3125,-0.4375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,-0.4375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,-0.4375,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.4375,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,-0.4375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.4375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,-0.4375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.4375,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.4375,-0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,-0.4375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,-0.4375,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.4375,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5625,-0.4375,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,-0.4375,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,-0.4375,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.4375,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.375,-0.4375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,-0.4375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,-0.4375,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.4375,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.4375,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.4375,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.8125,-0.4375,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.875,-0.4375,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.1875,-0.4375,0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,-0.4375,-0.875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.875,-0.4375,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.8125,-0.4375,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,-0.4375,0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.4375,-0.875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.8125,-0.4375,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.875,-0.4375,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.25,-0.4375,0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,-0.4375,-0.875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.875,-0.4375,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.8125,-0.4375,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,-0.4375,0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.4375,-0.875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,-0.4375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.4375,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.4375,-0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.4375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,-0.4375,0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.4375,-0.625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.625,-0.4375,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5625,-0.4375,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,-0.4375,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.4375,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.4375,-0.4375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,-0.4375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5625,-0.4375,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.4375,0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.4375,-0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.625,-0.4375,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.8125,-0.4375,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.875,-0.4375,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.3125,-0.4375,0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,-0.4375,-0.875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.875,-0.4375,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.8125,-0.4375,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,-0.4375,0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.4375,-0.875],"widths":[0.0625,0.0625,0.0625]}]],[[{"origin":[0.625,-0.375,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.375,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,-0.375,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.375,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,-0.375,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.375,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.375,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.375,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,-0.375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,-0.375,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.375,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,-0.375,0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.625,-0.375,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5625,-0.375,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.375,-0.625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,-0.375,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,-0.375,-0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.375,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5625,-0.375,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.375,0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.375,-0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.625,-0.375,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.6875,-0.375,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.375,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,-0.375,-0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,-0.375,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,-0.375,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.375,-0.75],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.75,-0.375,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.6875,-0.375,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,-0.375,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,-0.375,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,-0.375,-0.9375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.375,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,-0.375,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.375,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,-0.375,-0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,-0.375,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,-0.375,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,-0.375,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,-0.375,-0.9375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.375,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,-0.375,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.375,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,-0.375,-0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,-0.375,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.4375,-0.375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,-0.375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,-0.375,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.375,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,-0.375,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,-0.375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.4375,-0.375,-0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.375,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,-0.375,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.375,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.375,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.375,-0.6875],"widths":[0.0625,0.0625,0.0625]}]],[[{"origin":[0.625,-0.3125,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.3125,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,-0.3125,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.3125,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.6875,-0.3125,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.3125,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,-0.3125,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.3125,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,-0.3125,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.3125,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,-0.3125,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.3125,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,-0.3125,0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.625,-0.3125,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5625,-0.3125,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.3125,-0.625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,-0.3125,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.3125,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,-0.3125,-0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.3125,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5625,-0.3125,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.3125,0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.3125,-0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.625,-0.3125,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.6875,-0.3125,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.3125,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,-0.3125,-0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,-0.3125,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,-0.3125,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.3125,-0.75],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.75,-0.3125,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.6875,-0.3125,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,-0.3125,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,-0.3125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,-0.3125,-0.9375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.3125,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,-0.3125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.3125,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,-0.3125,-0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,-0.3125,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,-0.3125,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,-0.3125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,-0.3125,-0.9375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.3125,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,-0.3125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.3125,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,-0.3125,-0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,-0.3125,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.4375,-0.3125,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,-0.3125,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,-0.3125,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.3125,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,-0.3125,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,-0.3125,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.4375,-0.3125,-0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.3125,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,-0.3125,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.3125,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.3125,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.3125,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,-0.3125,0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.3125,-0.875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.875,-0.3125,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.8125,-0.3125,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.6875,-0.3125,0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.625,-0.3125,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5625,-0.3125,-0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,-0.3125,-0.625],"widths":[0.0625,0.0625,0.0625]}]],[[{"origin":[0.375,-0.25,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.25,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,-0.25,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.25,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,-0.25,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.25,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,-0.25,-0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.25,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,-0.25,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,-0.25,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,-0.25,-0.9375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.25,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,-0.25,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.25,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,-0.25,-0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,-0.25,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,-0.25,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,-0.25,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,-0.25,-0.9375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.25,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,-0.25,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.25,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,-0.25,-0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,-0.25,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.4375,-0.25,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,-0.25,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,-0.25,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.25,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,-0.25,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,-0.25,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.4375,-0.25,-0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.25,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,-0.25,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.25,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.25,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.25,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,-0.25,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.25,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,-0.25,-0.9375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.25,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,-0.25,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.25,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,-0.25,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.25,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,-0.25,0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.25,-0.875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.875,-0.25,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.8125,-0.25,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.8125,-0.25,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.25,0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,-0.25,-0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.875,-0.25,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,-0.25,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.25,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,-0.25,-0.9375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.25,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,-0.25,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.25,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,-0.25,-0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.25,-0.9375],"widths":[0.0625,0.0625,0.0625]}]],[[{"origin":[0.375,-0.1875,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.1875,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,-0.1875,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.1875,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,-0.1875,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.1875,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,-0.1875,-0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.1875,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,-0.1875,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,-0.1875,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,-0.1875,-0.9375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.1875,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,-0.1875,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.1875,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,-0.1875,-0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,-0.1875,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,-0.1875,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,-0.1875,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,-0.1875,-0.9375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.1875,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,-0.1875,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.1875,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,-0.1875,-0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,-0.1875,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.4375,-0.1875,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,-0.1875,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,-0.1875,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.1875,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,-0.1875,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,-0.1875,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.4375,-0.1875,-0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.1875,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,-0.1875,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.1875,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.1875,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.1875,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,-0.1875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.1875,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,-0.1875,-0.9375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.1875,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,-0.1875,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.1875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,-0.1875,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.1875,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,-0.1875,0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.1875,-0.875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.875,-0.1875,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.8125,-0.1875,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.8125,-0.1875,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,-0.1875,0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,-0.1875,-0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.875,-0.1875,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,-0.1875,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.1875,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,-0.1875,-0.9375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.1875,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,-0.1875,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.1875,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,-0.1875,-0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.1875,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,-0.1875,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.1875,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,-0.1875,-0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.1875,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,-0.1875,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.1875,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,-0.1875,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.1875,-0.5625],"widths":[0.0625,0.0625,0.0625]}]],[[{"origin":[0.625,-0.125,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.125,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.125,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.125,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,-0.125,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,-0.125,-0.9375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.125,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,-0.125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.125,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,-0.125,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.125,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,-0.125,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,-0.125,-0.9375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.125,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,-0.125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.125,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,-0.125,-0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.125,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,-0.125,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,-0.125,-0.9375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.125,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,-0.125,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.125,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,-0.125,-0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.125,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,-0.125,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.125,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,-0.125,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.125,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,-0.125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.125,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,-0.125,-0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.125,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,-0.125,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,-0.125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,-0.125,-0.9375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.125,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,-0.125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.125,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,-0.125,-0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,-0.125,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.6875,-0.125,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.125,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.125,-0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,-0.125,-0.6875],"widths":[0.0625,0.0625,0.0625]}]],[[{"origin":[0.625,-0.0625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.0625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.0625,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.0625,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,-0.0625,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.0625,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,-0.0625,-0.9375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.0625,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,-0.0625,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.0625,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,-0.0625,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,-0.0625,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,-0.0625,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.0625,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,-0.0625,-0.9375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.0625,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,-0.0625,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.0625,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,-0.0625,-0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,-0.0625,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,-0.0625,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.0625,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,-0.0625,-0.9375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.0625,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,-0.0625,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.0625,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,-0.0625,-0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,-0.0625,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,-0.0625,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,-0.0625,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,-0.0625,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,-0.0625,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,-0.0625,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.0625,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,-0.0625,-0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,-0.0625,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,-0.0625,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,-0.0625,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,-0.0625,-0.9375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.0625,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,-0.0625,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,-0.0625,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,-0.0625,-0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,-0.0625,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.6875,-0.0625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.0625,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,-0.0625,-0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,-0.0625,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,-0.0625,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,-0.0625,-0.75],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.75,-0.0625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.6875,-0.0625,-0.6875],"widths":[0.0625,0.0625,0.0625]}]],[[{"origin":[0.625,0.0,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.0,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.0,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.0,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,0.0,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.0,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.1875,0.0,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,0.0,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,0.0,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.0,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,0.0,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.0,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,0.0,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.0,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.25,0.0,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,0.0,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,0.0,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.0,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,0.0,-0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.0,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,0.0,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.0,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.3125,0.0,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,0.0,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5625,0.0,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,0.0,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,0.0,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.0,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,0.0,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.0,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.0,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.0,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,0.0,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.0,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,0.0,-0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.0,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,0.0,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.0,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.375,0.0,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,0.0,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,0.0,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.0,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,0.0,-0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,0.0,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.6875,0.0,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.0,-0.75],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.6875,0.0,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,0.0,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,0.0,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,0.0,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.6875,0.0,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.0,-0.75],"widths":[0.0625,0.0625,0.0625]}]],[[{"origin":[0.625,0.0625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.0625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.0625,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.0625,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,0.0625,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.0625,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.1875,0.0625,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,0.0625,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,0.0625,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.0625,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,0.0625,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.0625,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,0.0625,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.0625,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.25,0.0625,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,0.0625,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,0.0625,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.0625,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,0.0625,-0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.0625,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,0.0625,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.0625,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.3125,0.0625,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,0.0625,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5625,0.0625,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,0.0625,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,0.0625,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.0625,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,0.0625,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.0625,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.0625,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.0625,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,0.0625,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.0625,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,0.0625,-0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.0625,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,0.0625,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.0625,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.375,0.0625,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,0.0625,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,0.0625,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.0625,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,0.0625,-0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,0.0625,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.6875,0.0625,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.0625,-0.75],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.6875,0.0625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,0.0625,-0.6875],"widths":[0.0625,0.0625,0.0625]}]],[[{"origin":[0.375,0.125,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.125,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.125,-0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,0.125,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.4375,0.125,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,0.125,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,0.125,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.125,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,0.125,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.125,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.0625,0.125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,0.125,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,0.125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.125,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,0.125,-0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,0.125,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,0.125,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.125,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.125,0.125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,0.125,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,0.125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.125,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,0.125,-0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,0.125,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.4375,0.125,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.125,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.125,-0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,0.125,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5,0.125,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.4375,0.125,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,0.125,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.125,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,0.125,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.125,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.125,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.125,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,0.125,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.125,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.1875,0.125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,0.125,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,0.125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.125,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,0.125,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.125,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,0.125,0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.875,0.125,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.8125,0.125,-0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,0.125,-0.875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.4375,0.125,0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,0.125,-0.875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.8125,0.125,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.875,0.125,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,0.125,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.125,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.25,0.125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,0.125,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,0.125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.125,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,0.125,-0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.125,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5625,0.125,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,0.125,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,0.125,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.125,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,0.125,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.125,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.125,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.125,-0.8125],"widths":[0.0625,0.0625,0.0625]}]],[[{"origin":[0.375,0.1875,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.1875,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.1875,-0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,0.1875,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.4375,0.1875,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,0.1875,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,0.1875,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.1875,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,0.1875,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.1875,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.0625,0.1875,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,0.1875,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,0.1875,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.1875,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,0.1875,-0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,0.1875,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,0.1875,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.1875,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.125,0.1875,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,0.1875,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,0.1875,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.1875,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,0.1875,-0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,0.1875,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.4375,0.1875,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.1875,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.1875,-0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,0.1875,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5,0.1875,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.4375,0.1875,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,0.1875,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.1875,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,0.1875,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.1875,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.1875,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.1875,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,0.1875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.1875,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.1875,0.1875,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,0.1875,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,0.1875,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.1875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,0.1875,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.1875,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,0.1875,0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.875,0.1875,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.8125,0.1875,-0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,0.1875,-0.875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.4375,0.1875,0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,0.1875,-0.875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.8125,0.1875,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.875,0.1875,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,0.1875,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.1875,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.25,0.1875,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,0.1875,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,0.1875,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.1875,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,0.1875,-0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.1875,-0.9375],"widths":[0.0625,0.0625,0.0625]}]],[[{"origin":[-0.5625,0.25,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,0.25,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,0.25,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.25,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,0.25,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.25,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.25,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.25,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,0.25,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.25,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.25,-0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,0.25,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.625,0.25,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5625,0.25,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,0.25,0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.25,-0.625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.4375,0.25,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,0.25,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,0.25,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.25,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5625,0.25,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.25,0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.25,-0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.625,0.25,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5625,0.25,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,0.25,-0.75],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.6875,0.25,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,0.25,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,0.25,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,0.25,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.6875,0.25,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.25,-0.75],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,0.25,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.25,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.0625,0.25,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,0.25,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,0.25,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.25,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,0.25,-0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,0.25,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,0.25,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.25,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.125,0.25,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,0.25,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,0.25,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.25,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,0.25,-0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,0.25,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.4375,0.25,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.25,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.25,-0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,0.25,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5,0.25,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.4375,0.25,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,0.25,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.25,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,0.25,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.25,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.25,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.25,-0.6875],"widths":[0.0625,0.0625,0.0625]}]],[[{"origin":[-0.5625,0.3125,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,0.3125,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,0.3125,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.3125,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,0.3125,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.3125,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.3125,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.3125,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,0.3125,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.3125,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.3125,-0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,0.3125,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.625,0.3125,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5625,0.3125,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,0.3125,0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.3125,-0.625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.4375,0.3125,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,0.3125,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,0.3125,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.3125,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5625,0.3125,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.3125,0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.3125,-0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.625,0.3125,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5625,0.3125,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,0.3125,-0.75],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.6875,0.3125,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,0.3125,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,0.3125,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,0.3125,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.6875,0.3125,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.3125,-0.75],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,0.3125,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.3125,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.0625,0.3125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,0.3125,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,0.3125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.3125,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,0.3125,-0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,0.3125,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.875,0.3125,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.3125,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.125,0.3125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,0.3125,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,0.3125,0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.9375,0.3125,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.875,0.3125,-0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,0.3125,-0.9375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.4375,0.3125,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.3125,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.3125,-0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,0.3125,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5,0.3125,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.4375,0.3125,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,0.3125,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.3125,-0.5],"widths":[0.0625,0.0625,0.0625]}]],[[{"origin":[0.75,0.375,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,0.375,-0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.375,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,0.375,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.375,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,0.375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,0.375,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,0.375,-0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.375,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,0.375,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.375,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,0.375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,0.375,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,0.375,-0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.375,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,0.375,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.375,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,0.375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,0.375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.375,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.375,-0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,0.375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,0.375,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.375,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5625,0.375,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,0.375,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,0.375,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.375,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.375,0.375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,0.375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,0.375,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.375,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.375,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.375,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.8125,0.375,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.375,0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,0.375,-0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.875,0.375,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.875,0.375,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.8125,0.375,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,0.375,0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.375,-0.875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.8125,0.375,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.375,0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,0.375,-0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.875,0.375,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.875,0.375,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.8125,0.375,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,0.375,0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.375,-0.875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,0.375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.375,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.375,-0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,0.375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,0.375,0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.375,-0.625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.625,0.375,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5625,0.375,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,0.375,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.375,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.4375,0.375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,0.375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5625,0.375,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.375,0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.375,-0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.625,0.375,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.8125,0.375,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.375,0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,0.375,-0.875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.875,0.375,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.875,0.375,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.8125,0.375,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,0.375,0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.375,-0.875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.6875,0.375,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,0.375,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5625,0.375,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,0.375,-0.75],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,0.375,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,0.375,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.6875,0.375,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.375,-0.75],"widths":[0.0625,0.0625,0.0625]}]],[[{"origin":[0.75,0.4375,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.4375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,0.4375,-0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.4375,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,0.4375,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.4375,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,0.4375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.4375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,0.4375,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.4375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,0.4375,-0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.4375,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,0.4375,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.4375,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,0.4375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.4375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,0.4375,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.4375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,0.4375,-0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.4375,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,0.4375,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.4375,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,0.4375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.4375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,0.4375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.4375,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.4375,-0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,0.4375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,0.4375,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.4375,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5625,0.4375,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,0.4375,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,0.4375,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.4375,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.375,0.4375,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,0.4375,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,0.4375,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.4375,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.4375,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.4375,-0.6875],"widths":[0.0625,0.0625,0.0625]}]],[[{"origin":[-0.6875,0.5,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.5,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,0.5,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.5,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,0.5,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.5,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.3125,0.5,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,0.5,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,0.5,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.5,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.5,-0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,0.5,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,0.5,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.5,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.375,0.5,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,0.5,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,0.5,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.5,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,0.5,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.5,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.6875,0.5,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.5,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,0.5,-0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,0.5,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.75,0.5,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.6875,0.5,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,0.5,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.5,-0.75],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,0.5,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,0.5,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,0.5,-0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.5,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,0.5,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.5,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,0.5,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,0.5,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,0.5,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,0.5,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,0.5,-0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.5,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,0.5,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.5,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,0.5,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,0.5,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,0.5,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,0.5,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.6875,0.5,-0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,0.5,-0.75],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5625,0.5,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.625,0.5,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5625,0.5,0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,0.5,-0.625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.6875,0.5,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,0.5,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.375,0.5,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,0.5,-0.75],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,0.5,0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.625,0.5,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5625,0.5,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.5,-0.625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,0.5,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.5,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,0.5,-0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.5,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.8125,0.5,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.75,0.5,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,0.5,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.5,-0.8125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.75,0.5,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.5,0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,0.5,-0.8125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.8125,0.5,-0.25],"widths":[0.0625,0.0625,0.0625]}]],[[{"origin":[-0.6875,0.5625,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.5625,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,0.5625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.5625,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,0.5625,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.5625,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.3125,0.5625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,0.5625,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,0.5625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.5625,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.5625,-0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,0.5625,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,0.5625,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.5625,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.375,0.5625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,0.5625,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,0.5625,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.5625,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,0.5625,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.5625,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.6875,0.5625,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.5625,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,0.5625,-0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,0.5625,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.75,0.5625,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.6875,0.5625,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,0.5625,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.5625,-0.75],"widths":[0.0625,0.0625,0.0625]}]],[[{"origin":[0.625,0.625,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,0.625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,0.625,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.625,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.6875,0.625,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.625,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,0.625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,0.625,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,0.625,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,0.625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,0.625,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.625,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.6875,0.625,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.625,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,0.625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,0.625,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,0.625,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.625,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.4375,0.625,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,0.625,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,0.625,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.625,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,0.625,-0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,0.625,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,0.625,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,0.625,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.625,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.6875,0.625,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.625,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,0.625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.625,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,0.625,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,0.625,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.625,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.6875,0.625,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.625,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,0.625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.625,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.6875,0.625,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.625,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,0.625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.625,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,0.625,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.625,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5,0.625,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.4375,0.625,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,0.625,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.625,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.3125,0.625,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,0.625,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.4375,0.625,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.625,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,0.625,-0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,0.625,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.6875,0.625,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,0.625,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,0.625,-0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,0.625,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.75,0.625,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.6875,0.625,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,0.625,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,0.625,-0.75],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5625,0.625,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.625,0.625,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.4375,0.625,0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,0.625,-0.625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,0.625,0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.625,0.625,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5625,0.625,-0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,0.625,-0.625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.6875,0.625,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,0.625,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,0.625,-0.75],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.75,0.625,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.75,0.625,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.6875,0.625,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,0.625,0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,0.625,-0.75],"widths":[0.0625,0.0625,0.0625]}]],[[{"origin":[0.625,0.6875,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,0.6875,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,0.6875,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.6875,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,0.6875,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,0.6875,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.6875,0.6875,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.6875,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,0.6875,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,0.6875,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,0.6875,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.6875,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,0.6875,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,0.6875,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.6875,0.6875,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.6875,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,0.6875,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,0.6875,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,0.6875,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.6875,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,0.6875,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,0.6875,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5625,0.6875,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,0.6875,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.625,0.6875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.6875,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,0.6875,-0.6875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.6875,0.6875,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,0.6875,0.625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.6875,-0.6875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.6875,0.6875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.625,0.6875,-0.1875],"widths":[0.0625,0.0625,0.0625]}]],[[{"origin":[0.375,0.75,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.75,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,0.75,-0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,0.75,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,0.75,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.75,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.4375,0.75,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,0.75,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,0.75,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.75,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.4375,0.75,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,0.75,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,0.75,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.75,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,0.75,-0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,0.75,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.4375,0.75,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.75,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,0.75,-0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,0.75,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,0.75,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.75,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5,0.75,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.4375,0.75,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,0.75,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.75,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,0.75,-0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,0.75,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,0.75,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.75,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.4375,0.75,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,0.75,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,0.75,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.75,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5,0.75,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.4375,0.75,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.4375,0.75,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.75,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,0.75,-0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,0.75,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,0.75,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,0.75,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,0.75,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.75,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,0.75,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,0.75,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5625,0.75,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,0.75,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,0.75,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,0.75,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,0.75,-0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,0.75,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,0.75,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,0.75,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.4375,0.75,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,0.75,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,0.75,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,0.75,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,0.75,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.75,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,0.75,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,0.75,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5625,0.75,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,0.75,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,0.75,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.75,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5,0.75,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.4375,0.75,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.4375,0.75,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.75,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,0.75,-0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,0.75,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,0.75,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.75,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,0.75,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.75,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,0.75,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.75,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5625,0.75,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,0.75,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.5,0.75,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.75,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,0.75,-0.5625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5625,0.75,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,0.75,0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.75,-0.5625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5625,0.75,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.5,0.75,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.4375,0.75,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,0.75,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,0.75,-0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,0.75,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,0.75,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,0.75,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5,0.75,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.4375,0.75,-0.375],"widths":[0.0625,0.0625,0.0625]}]],[[{"origin":[0.375,0.8125,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.8125,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,0.8125,-0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,0.8125,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,0.8125,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.8125,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.4375,0.8125,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,0.8125,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,0.8125,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.8125,-0.4375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.4375,0.8125,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.375,0.8125,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.375,0.8125,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.8125,0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,0.8125,-0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.4375,0.8125,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.4375,0.8125,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.8125,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,0.8125,-0.5],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.5,0.8125,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,0.8125,0.4375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.8125,-0.5],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.5,0.8125,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.4375,0.8125,-0.1875],"widths":[0.0625,0.0625,0.0625]}]],[[{"origin":[0.125,0.875,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,0.875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,0.875,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.875,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,0.875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.875,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,0.875,-0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,0.875,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,0.875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.875,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,0.875,-0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,0.875,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,0.875,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,0.875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,0.875,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.875,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,0.875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,0.875,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.875,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,0.875,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,0.875,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,0.875,-0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.875,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,0.875,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.875,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,0.875,-0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,0.875,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,0.875,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.875,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,0.875,-0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,0.875,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,0.875,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,0.875,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,0.875,-0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.875,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,0.875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.875,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,0.875,-0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.875,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,0.875,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,0.875,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.875,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,0.875,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,0.875,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,0.875,-0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.875,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,0.875,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.875,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,0.875,-0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,0.875,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,0.875,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,0.875,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,0.875,-0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.875,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,0.875,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.875,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,0.875,-0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,0.875,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,0.875,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.875,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,0.875,-0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.875,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,0.875,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,0.875,-0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.875,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,0.875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.875,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,0.875,-0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.875,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,0.875,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,0.875,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0,0.875,-0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,0.875,-0.0625],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0,0.875,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,0.875,0.0],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,0.875,-0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.0625,0.875,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.25,0.875,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.875,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.1875,0.875,-0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.875,-0.25],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,0.875,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,0.875,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.0625,0.875,-0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,0.875,-0.125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.1875,0.875,0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.3125,0.875,0.1875],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.25,0.875,-0.25],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.25,0.875,-0.3125],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.0625,0.875,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,0.875,0.0625],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,0.875,-0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.125,0.875,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.125,0.875,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.875,-0.375],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[-0.375,0.875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.3125,0.875,-0.1875],"widths":[0.0625,0.0625,0.0625]}],[{"origin":[0.3125,0.875,0.125],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.1875,0.875,0.3125],"widths":[0.0625,0.0625,0.0625]},{"origin":[0.125,0.875,-0.375],"widths":[0.0625,0.0625,0.0625]},{"origin":[-0.375,0.875,-0.1875],"widths":[0.0625,0.0625,0.0625]}]]]] \ No newline at end of file diff --git a/recursive_swarm/asdf/json/Sphere/orderedCubesSize2.json b/recursive_swarm/asdf/json/Sphere/orderedCubesSize2.json new file mode 100644 index 0000000000000000000000000000000000000000..03e5fe50be1c36f5938f74226d4db990acf60379 --- /dev/null +++ b/recursive_swarm/asdf/json/Sphere/orderedCubesSize2.json @@ -0,0 +1 @@ +[[[[{"origin":[0.0,-0.5,0.0],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,-0.5,0.0],"widths":[0.5,0.5,0.5]},{"origin":[0.0,-0.5,-0.5],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,-0.5,-0.5],"widths":[0.5,0.5,0.5]}]],[[{"origin":[0.0,0.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,0.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[0.0,0.0,-0.5],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,0.0,-0.5],"widths":[0.5,0.5,0.5]}]]],[[[{"origin":[0.0,-1.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,-1.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.0,-1.0,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,-1.0,-0.25],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.0,-0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,-0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.0,-0.75,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,-0.75,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,-0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,-0.75,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.25,-0.75,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.0,-0.75,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,-0.75,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,-0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.25,-0.75,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,-0.75,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,-0.75,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,-0.75,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.25,-0.75,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,-0.75,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,-0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.75,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.25,-0.75,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.0,-0.75,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.75,-0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,-0.75,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,-0.75,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,-0.75,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,-0.75,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.75,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.5,-0.75,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,-0.75,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,-0.75,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.75,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.5,-0.75,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.25,-0.75,-0.75],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.5,-0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.25,-0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.0,-0.5,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.75,-0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,-0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,-0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,-0.5,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,-0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.5,-0.5,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,-0.5,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,-0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.5,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.5,-0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.25,-0.5,-0.75],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.5,-0.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,-0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.0,-0.25,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.25,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,-0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,-0.25,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,-0.25,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.75,-0.25,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.5,-0.25,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,-0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,-0.25,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,-0.25,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,-0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.25,-0.25,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.25,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,-0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.5,-0.25,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.25,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.75,-0.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,-0.25,0.75],"widths":[0.25,0.25,0.25]},{"origin":[0.0,-0.25,-1.0],"widths":[0.25,0.25,0.25]},{"origin":[-1.0,-0.25,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,-0.25,0.75],"widths":[0.25,0.25,0.25]},{"origin":[-1.0,-0.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.75,-0.25,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,-0.25,-1.0],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.5,0.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.25,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.0,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.0,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.0,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.0,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.0,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.5,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.0,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,0.0,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.0,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.75,0.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-1.0,0.0,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.25,0.0,0.75],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.0,-1.0],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,0.0,0.75],"widths":[0.25,0.25,0.25]},{"origin":[-1.0,0.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.75,0.0,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.0,-1.0],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.5,0.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.25,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.25,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.75,0.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.25,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.25,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.25,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.25,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.25,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,0.25,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.25,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.5,0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.25,-0.75],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.0,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.5,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.5,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.5,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.5,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.5,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.5,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.5,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.75,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.5,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.5,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.5,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.5,0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.5,-0.75],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.0,0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.75,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.75,-0.25],"widths":[0.25,0.25,0.25]}]]],[[[{"origin":[0.25,-0.875,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.875,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.0,-0.875,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.875,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,-0.875,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.875,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.25,-0.875,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.875,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,-0.875,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.875,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.25,-0.875,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,-0.875,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.25,-0.875,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.125,-0.875,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,-0.875,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.875,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,-0.875,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.875,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.25,-0.875,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.875,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.375,-0.875,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,-0.875,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.125,-0.875,0.375],"widths":[0.125,0.125,0.125]},{"origin":[0.0,-0.875,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,-0.875,0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,-0.875,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.375,-0.875,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.875,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,-0.875,0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,-0.875,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.375,-0.875,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,-0.875,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.25,-0.875,0.375],"widths":[0.125,0.125,0.125]},{"origin":[0.125,-0.875,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[0.375,-0.875,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,-0.875,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.375,-0.875,0.375],"widths":[0.125,0.125,0.125]},{"origin":[0.25,-0.875,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[0.375,-0.875,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,-0.875,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,-0.875,0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.875,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.5,-0.875,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.375,-0.875,-0.375],"widths":[0.125,0.125,0.125]}]],[[{"origin":[0.5,-0.5,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.5,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.5,-0.5,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.5,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,-0.5,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.5,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.125,-0.5,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.0,-0.5,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.875,-0.5,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.75,-0.5,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,-0.5,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.5,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,-0.5,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.5,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.25,-0.5,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.125,-0.5,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.875,-0.5,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.75,-0.5,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,-0.5,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,-0.5,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,-0.5,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.5,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.375,-0.5,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.25,-0.5,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.875,-0.5,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.75,-0.5,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,-0.5,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.5,-0.875],"widths":[0.125,0.125,0.125]}]],[[{"origin":[0.5,-0.375,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.375,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.5,-0.375,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.375,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,-0.375,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.375,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.0,-0.375,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.375,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,-0.375,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.375,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.75,-0.375,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,-0.375,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,-0.375,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,-0.375,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.125,-0.375,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.375,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,-0.375,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.375,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.75,-0.375,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,-0.375,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,-0.375,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.375,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.25,-0.375,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.375,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,-0.375,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.375,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.75,-0.375,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.375,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.625,-0.375,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.375,0.625],"widths":[0.125,0.125,0.125]},{"origin":[0.5,-0.375,-0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.75,-0.375,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.5,-0.375,0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.75,-0.375,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.625,-0.375,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,-0.375,-0.75],"widths":[0.125,0.125,0.125]}],[{"origin":[0.375,-0.375,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,-0.375,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.875,-0.375,0.375],"widths":[0.125,0.125,0.125]},{"origin":[0.75,-0.375,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,-0.375,0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,-0.375,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.375,-0.375,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.375,-0.5],"widths":[0.125,0.125,0.125]}]],[[{"origin":[0.75,-0.25,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.25,-0.25,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.25,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,-0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.25,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.75,-0.25,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.25,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.375,-0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,-0.25,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.875,-0.25,0.375],"widths":[0.125,0.125,0.125]},{"origin":[0.75,-0.25,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,-0.25,0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,-0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.375,-0.25,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.25,-0.5],"widths":[0.125,0.125,0.125]}]],[[{"origin":[0.75,-0.125,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.25,-0.125,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.125,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,-0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.125,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.75,-0.125,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,-0.125,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.375,-0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,-0.125,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.875,-0.125,0.375],"widths":[0.125,0.125,0.125]},{"origin":[0.75,-0.125,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,-0.125,0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,-0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.375,-0.125,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,-0.125,-0.5],"widths":[0.125,0.125,0.125]}]],[[{"origin":[0.75,0.0,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.0,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.375,0.0,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.0,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,0.0,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.0,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.0,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.0,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.375,0.0,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.0,0.375],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.0,-0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,0.0,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.5,0.0,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.375,0.0,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,0.0,0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.0,-0.5],"widths":[0.125,0.125,0.125]}]],[[{"origin":[0.75,0.125,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.125,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.375,0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.125,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.125,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.125,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.125,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.375,0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.125,0.375],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.125,-0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,0.125,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.5,0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.375,0.125,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,0.125,0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.125,-0.5],"widths":[0.125,0.125,0.125]}]],[[{"origin":[0.5,0.25,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.25,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.5,0.25,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.25,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,0.25,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.25,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.125,0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.0,0.25,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.25,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.25,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.25,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,0.25,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.25,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.25,0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.125,0.25,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.25,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.25,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.25,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,0.25,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.25,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.375,0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.25,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.25,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.25,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.25,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.625,0.25,0.625],"widths":[0.125,0.125,0.125]},{"origin":[0.5,0.25,-0.75],"widths":[0.125,0.125,0.125]}],[{"origin":[0.625,0.25,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.75,0.25,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.5,0.25,0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.75,0.25,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.625,0.25,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.25,-0.75],"widths":[0.125,0.125,0.125]}],[{"origin":[0.375,0.25,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.25,0.375],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.25,-0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,0.25,-0.875],"widths":[0.125,0.125,0.125]}]],[[{"origin":[0.5,0.375,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.375,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.5,0.375,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.375,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,0.375,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.375,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.0,0.375,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.375,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.875,0.375,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.375,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,0.375,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.375,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,0.375,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.375,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.125,0.375,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.375,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.875,0.375,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.375,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,0.375,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.375,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,0.375,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.375,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.375,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.375,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.875,0.375,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.375,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,0.375,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.375,-0.875],"widths":[0.125,0.125,0.125]}]],[[{"origin":[0.25,0.75,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.75,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.0,0.75,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.75,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,0.75,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.75,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.75,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.75,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,0.75,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.75,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.375,0.75,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.75,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,0.75,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.75,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.125,0.75,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.75,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,0.75,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.75,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.375,0.75,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.75,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.375,0.75,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.75,0.375],"widths":[0.125,0.125,0.125]},{"origin":[0.0,0.75,-0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,0.75,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,0.75,0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.75,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.5,0.75,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.375,0.75,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,0.75,0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.75,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.5,0.75,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.375,0.75,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.375,0.75,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.75,0.375],"widths":[0.125,0.125,0.125]},{"origin":[0.125,0.75,-0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,0.75,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.375,0.75,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.75,0.375],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.75,-0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,0.75,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,0.75,0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.75,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.5,0.75,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.375,0.75,-0.375],"widths":[0.125,0.125,0.125]}]]]] \ No newline at end of file diff --git a/recursive_swarm/asdf/json/Sphere/orderedCubesSize3.json b/recursive_swarm/asdf/json/Sphere/orderedCubesSize3.json new file mode 100644 index 0000000000000000000000000000000000000000..b017ee4fcea2c35e5ce25bd1a81fc4f2f233ad7e --- /dev/null +++ b/recursive_swarm/asdf/json/Sphere/orderedCubesSize3.json @@ -0,0 +1 @@ +[[[[{"origin":[0.0,-1.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,-1.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[0.0,-1.0,-0.5],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,-1.0,-0.5],"widths":[0.5,0.5,0.5]}]],[[{"origin":[0.0,-0.5,0.0],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,-0.5,0.0],"widths":[0.5,0.5,0.5]},{"origin":[0.0,-0.5,-0.5],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,-0.5,-0.5],"widths":[0.5,0.5,0.5]}],[{"origin":[0.5,-0.5,0.0],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,-0.5,0.5],"widths":[0.5,0.5,0.5]},{"origin":[0.0,-0.5,-1.0],"widths":[0.5,0.5,0.5]},{"origin":[-1.0,-0.5,-0.5],"widths":[0.5,0.5,0.5]}],[{"origin":[0.0,-0.5,0.5],"widths":[0.5,0.5,0.5]},{"origin":[-1.0,-0.5,0.0],"widths":[0.5,0.5,0.5]},{"origin":[0.5,-0.5,-0.5],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,-0.5,-1.0],"widths":[0.5,0.5,0.5]}]],[[{"origin":[0.0,0.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,0.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[0.0,0.0,-0.5],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,0.0,-0.5],"widths":[0.5,0.5,0.5]}],[{"origin":[0.5,0.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[-1.0,0.0,-0.5],"widths":[0.5,0.5,0.5]}],[{"origin":[-0.5,0.0,0.5],"widths":[0.5,0.5,0.5]},{"origin":[0.0,0.0,-1.0],"widths":[0.5,0.5,0.5]}],[{"origin":[0.0,0.0,0.5],"widths":[0.5,0.5,0.5]},{"origin":[-1.0,0.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[0.5,0.0,-0.5],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,0.0,-1.0],"widths":[0.5,0.5,0.5]}]],[[{"origin":[0.0,0.5,0.0],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,0.5,-0.5],"widths":[0.5,0.5,0.5]}],[{"origin":[-0.5,0.5,0.0],"widths":[0.5,0.5,0.5]},{"origin":[0.0,0.5,-0.5],"widths":[0.5,0.5,0.5]}]]],[[[{"origin":[0.5,-0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.75,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.25,-0.75,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.0,-0.75,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.75,-0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,-0.75,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,-0.75,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,-0.75,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,-0.75,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.75,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.5,-0.75,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,-0.75,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,-0.75,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.75,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.5,-0.75,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.25,-0.75,-0.75],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.5,-0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.5,-0.5,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.5,-0.75],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.5,-0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.5,-0.25,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,-0.25,-0.75],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.5,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.0,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,-0.75],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.5,0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.25,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.25,-0.75],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.5,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.5,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.75,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.5,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.5,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.5,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.5,0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.5,-0.75],"widths":[0.25,0.25,0.25]}]]]] \ No newline at end of file diff --git a/recursive_swarm/asdf/json/Sphere/orderedCubesSize4.json b/recursive_swarm/asdf/json/Sphere/orderedCubesSize4.json new file mode 100644 index 0000000000000000000000000000000000000000..b55b801b41b910690e6d9723cad709ed789291ce --- /dev/null +++ b/recursive_swarm/asdf/json/Sphere/orderedCubesSize4.json @@ -0,0 +1 @@ +[[[[{"origin":[0.0,-1.0,0.0],"widths":[1.0,1.0,1.0]},{"origin":[-1.0,-1.0,0.0],"widths":[1.0,1.0,1.0]},{"origin":[0.0,-1.0,-1.0],"widths":[1.0,1.0,1.0]},{"origin":[-1.0,-1.0,-1.0],"widths":[1.0,1.0,1.0]}]],[[{"origin":[0.0,0.0,0.0],"widths":[1.0,1.0,1.0]},{"origin":[-1.0,0.0,0.0],"widths":[1.0,1.0,1.0]},{"origin":[0.0,0.0,-1.0],"widths":[1.0,1.0,1.0]},{"origin":[-1.0,0.0,-1.0],"widths":[1.0,1.0,1.0]}]]]] \ No newline at end of file diff --git a/recursive_swarm/asdf/json/cubeCone.json b/recursive_swarm/asdf/json/cubeCone.json new file mode 100644 index 0000000000000000000000000000000000000000..7cfe9d1f6ac6d00d7d04e8e9083c1ff5c1f86f5d --- /dev/null +++ b/recursive_swarm/asdf/json/cubeCone.json @@ -0,0 +1,1026 @@ +[ + [ + [ + [ + { + "origin": [ + 0, + 0, + 0 + ], + "widths": [ + 0.5, + 0.5, + 0.5 + ] + }, + { + "origin": [ + -0.5, + 0, + 0 + ], + "widths": [ + 0.5, + 0.5, + 0.5 + ] + }, + { + "origin": [ + 0, + 0, + -0.5 + ], + "widths": [ + 0.5, + 0.5, + 0.5 + ] + }, + { + "origin": [ + -0.5, + 0, + -0.5 + ], + "widths": [ + 0.5, + 0.5, + 0.5 + ] + } + ] + ], + [ + [ + { + "origin": [ + 0.25, + 0, + 0.5 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + 0, + 0, + 0.5 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + 0.5, + 0, + 0.25 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + 0.5, + 0, + 0 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + -0.25, + 0, + 0.5 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + -0.5, + 0, + 0.5 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + -0.75, + 0, + 0.25 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + -0.75, + 0, + 0 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + 0.5, + 0, + -0.25 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + 0.5, + 0, + -0.5 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + 0.25, + 0, + -0.75 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + 0, + 0, + -0.75 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + -0.75, + 0, + -0.25 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + -0.75, + 0, + -0.5 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + -0.25, + 0, + -0.75 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + -0.5, + 0, + -0.75 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + } + ], + [ + { + "origin": [ + 0.5, + 0, + 0.5 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + -0.75, + 0, + 0.5 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + 0.5, + 0, + -0.75 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + -0.75, + 0, + -0.75 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + } + ], + [ + { + "origin": [ + 0, + 0, + 0.75 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + -1, + 0, + 0 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + 0.75, + 0, + -0.25 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + -0.25, + 0, + -1 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + } + ], + [ + { + "origin": [ + 0.75, + 0, + 0 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + -0.25, + 0, + 0.75 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + 0, + 0, + -1 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + -1, + 0, + -0.25 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + } + ] + ] + ], + [ + [ + [ + { + "origin": [ + 0, + 0.25, + 0.5 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + -0.25, + 0.25, + -0.75 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + } + ], + [ + { + "origin": [ + -0.75, + 0.25, + 0 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + 0.5, + 0.25, + -0.25 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + } + ], + [ + { + "origin": [ + 0.5, + 0.25, + 0 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + -0.25, + 0.25, + 0.5 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + 0, + 0.25, + -0.75 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + -0.75, + 0.25, + -0.25 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + } + ], + [ + { + "origin": [ + 0.5, + 0.25, + 0.25 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + -0.5, + 0.25, + 0.5 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + 0.25, + 0.25, + -0.75 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + -0.75, + 0.25, + -0.5 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + } + ], + [ + { + "origin": [ + -0.75, + 0.25, + 0.25 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + 0.5, + 0.25, + -0.5 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + } + ], + [ + { + "origin": [ + 0.25, + 0.25, + 0.5 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + -0.5, + 0.25, + -0.75 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + } + ] + ] + ], + [ + [ + [ + { + "origin": [ + 0, + 0.5, + 0 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + -0.25, + 0.5, + 0 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + 0, + 0.5, + -0.25 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + -0.25, + 0.5, + -0.25 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + } + ], + [ + { + "origin": [ + 0, + 0.5, + 0.25 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + -0.25, + 0.5, + -0.5 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + } + ], + [ + { + "origin": [ + -0.5, + 0.5, + 0 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + 0.25, + 0.5, + -0.25 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + } + ], + [ + { + "origin": [ + 0.25, + 0.5, + 0 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + -0.25, + 0.5, + 0.25 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + 0, + 0.5, + -0.5 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + -0.5, + 0.5, + -0.25 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + } + ], + [ + { + "origin": [ + 0.25, + 0.5, + 0.25 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + -0.5, + 0.5, + 0.25 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + 0.25, + 0.5, + -0.5 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + -0.5, + 0.5, + -0.5 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + } + ] + ] + ], + [ + [ + [ + { + "origin": [ + 0, + 0.75, + 0 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + -0.25, + 0.75, + 0 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + 0, + 0.75, + -0.25 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + -0.25, + 0.75, + -0.25 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + } + ], + [ + { + "origin": [ + 0, + 0.75, + 0.25 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + -0.25, + 0.75, + -0.5 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + } + ], + [ + { + "origin": [ + -0.5, + 0.75, + 0 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + 0.25, + 0.75, + -0.25 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + } + ], + [ + { + "origin": [ + 0.25, + 0.75, + 0 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + -0.25, + 0.75, + 0.25 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + 0, + 0.75, + -0.5 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + -0.5, + 0.75, + -0.25 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + } + ] + ] + ], + [ + [ + [ + { + "origin": [ + 0, + 1, + 0 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + -0.25, + 1, + 0 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + 0, + 1, + -0.25 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + }, + { + "origin": [ + -0.25, + 1, + -0.25 + ], + "widths": [ + 0.25, + 0.25, + 0.25 + ] + } + ] + ] + ] +] \ No newline at end of file diff --git a/recursive_swarm/asdf/json/cubeCone2.json b/recursive_swarm/asdf/json/cubeCone2.json new file mode 100644 index 0000000000000000000000000000000000000000..78edec542da518c04716b17999e8fa085f34b650 --- /dev/null +++ b/recursive_swarm/asdf/json/cubeCone2.json @@ -0,0 +1 @@ +[[[[{"origin":[0.75,0.0,0.75],"widths":[0.375,0.375,0.375]},{"origin":[0.375,0.0,0.75],"widths":[0.375,0.375,0.375]},{"origin":[0.0,0.0,0.75],"widths":[0.375,0.375,0.375]},{"origin":[0.75,0.0,0.375],"widths":[0.375,0.375,0.375]},{"origin":[0.75,0.0,0.0],"widths":[0.375,0.375,0.375]},{"origin":[0.375,0.0,0.375],"widths":[0.375,0.375,0.375]},{"origin":[0.0,0.0,0.375],"widths":[0.375,0.375,0.375]},{"origin":[0.375,0.0,0.0],"widths":[0.375,0.375,0.375]},{"origin":[0.0,0.0,0.0],"widths":[0.375,0.375,0.375]},{"origin":[-0.375,0.0,0.75],"widths":[0.375,0.375,0.375]},{"origin":[-0.75,0.0,0.75],"widths":[0.375,0.375,0.375]},{"origin":[-1.125,0.0,0.75],"widths":[0.375,0.375,0.375]},{"origin":[-0.375,0.0,0.375],"widths":[0.375,0.375,0.375]},{"origin":[-0.75,0.0,0.375],"widths":[0.375,0.375,0.375]},{"origin":[-0.375,0.0,0.0],"widths":[0.375,0.375,0.375]},{"origin":[-0.75,0.0,0.0],"widths":[0.375,0.375,0.375]},{"origin":[-1.125,0.0,0.375],"widths":[0.375,0.375,0.375]},{"origin":[-1.125,0.0,0.0],"widths":[0.375,0.375,0.375]},{"origin":[0.75,0.0,-0.375],"widths":[0.375,0.375,0.375]},{"origin":[0.75,0.0,-0.75],"widths":[0.375,0.375,0.375]},{"origin":[0.375,0.0,-0.375],"widths":[0.375,0.375,0.375]},{"origin":[0.0,0.0,-0.375],"widths":[0.375,0.375,0.375]},{"origin":[0.375,0.0,-0.75],"widths":[0.375,0.375,0.375]},{"origin":[0.0,0.0,-0.75],"widths":[0.375,0.375,0.375]},{"origin":[0.75,0.0,-1.125],"widths":[0.375,0.375,0.375]},{"origin":[0.375,0.0,-1.125],"widths":[0.375,0.375,0.375]},{"origin":[0.0,0.0,-1.125],"widths":[0.375,0.375,0.375]},{"origin":[-0.375,0.0,-0.375],"widths":[0.375,0.375,0.375]},{"origin":[-0.75,0.0,-0.375],"widths":[0.375,0.375,0.375]},{"origin":[-0.375,0.0,-0.75],"widths":[0.375,0.375,0.375]},{"origin":[-0.75,0.0,-0.75],"widths":[0.375,0.375,0.375]},{"origin":[-1.125,0.0,-0.375],"widths":[0.375,0.375,0.375]},{"origin":[-1.125,0.0,-0.75],"widths":[0.375,0.375,0.375]},{"origin":[-0.375,0.0,-1.125],"widths":[0.375,0.375,0.375]},{"origin":[-0.75,0.0,-1.125],"widths":[0.375,0.375,0.375]},{"origin":[-1.125,0.0,-1.125],"widths":[0.375,0.375,0.375]}],[{"origin":[1.125,0.0,1.125],"widths":[0.375,0.375,0.375]},{"origin":[-1.5,0.0,1.125],"widths":[0.375,0.375,0.375]},{"origin":[1.125,0.0,-1.5],"widths":[0.375,0.375,0.375]},{"origin":[-1.5,0.0,-1.5],"widths":[0.375,0.375,0.375]}]],[[{"origin":[0.5625,0.0,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,0.0,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.0,1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,0.0,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.0,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.0,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.0,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.0,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.6875,0.0,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.0,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.9375,0.0,1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,0.0,1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.9375,0.0,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,0.0,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.3125,0.0,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.0,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.3125,0.0,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.0,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.5625,0.0,1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,0.0,1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.5625,0.0,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,0.0,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,0.0,1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.0,1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,0.0,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.0,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.3125,0.0,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.0,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.3125,0.0,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.0,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.3125,0.0,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.0,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.3125,0.0,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.0,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.0,1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.0,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.0,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.0,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.0,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.0,1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.0,1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.0,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.0,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.0,1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.0,1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.0,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.0,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.0,1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.125,0.0,1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.0,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.125,0.0,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.0,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.5,0.0,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.0,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.5,0.0,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.0,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.5,0.0,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.0,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.5,0.0,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.0,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.5,0.0,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.0,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.5,0.0,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.0,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.0,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.0,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.0,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.875,0.0,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.6875,0.0,-0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.0,-0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.0,-0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.0,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.0,-0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.3125,0.0,-0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.0,-0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.3125,0.0,-0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.0,-0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.3125,0.0,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.0,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.3125,0.0,-0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.0,-0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.3125,0.0,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.0,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.3125,0.0,-1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.0,-1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.9375,0.0,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,0.0,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.9375,0.0,-1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,0.0,-1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.5625,0.0,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,0.0,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.5625,0.0,-1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,0.0,-1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,0.0,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.0,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,0.0,-1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.0,-1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.5625,0.0,-1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,0.0,-1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,0.0,-1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.0,-1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.0,-1.875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.0,-0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.5,0.0,-0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.0,-0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.5,0.0,-0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.0,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.5,0.0,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.0,-0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.5,0.0,-0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.0,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.0,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.0,-1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.0,-1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.0,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.0,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.0,-1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.0,-1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.0,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.5,0.0,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.0,-1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.5,0.0,-1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.0,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.125,0.0,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.0,-1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.125,0.0,-1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.0,-0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.875,0.0,-0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.0,-0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.0,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.0,-0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.0,-1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.0,-1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.0,-1.875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.0,-1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.0,-1.6875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,0.0,1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.875,0.0,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.6875,0.0,-0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.0,-1.875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.6875,0.0,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.0,1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,0.0,-1.875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.875,0.0,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,0.0,1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.875,0.0,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.6875,0.0,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.0,-1.875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.6875,0.0,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.0,1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,0.0,-1.875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.875,0.0,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.5625,0.0,1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.875,0.0,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.6875,0.0,-0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.0,-1.875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.6875,0.0,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.0,1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.5625,0.0,-1.875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.875,0.0,-0.75],"widths":[0.1875,0.1875,0.1875]}]]],[[[{"origin":[0.5625,0.1875,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,0.1875,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,0.1875,1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.1875,1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,0.1875,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.1875,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.1875,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.1875,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.3125,0.1875,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.1875,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.3125,0.1875,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.1875,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.1875,1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.1875,1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.1875,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.1875,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.1875,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.1875,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.1875,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.1875,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.1875,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.5,0.1875,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.1875,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.5,0.1875,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.3125,0.1875,-0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.1875,-0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.3125,0.1875,-0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.1875,-0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.1875,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.1875,-0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.5625,0.1875,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,0.1875,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,0.1875,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.1875,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,0.1875,-1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.1875,-1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.1875,-0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.5,0.1875,-0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.1875,-0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.5,0.1875,-0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.1875,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.1875,-0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.1875,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.1875,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.1875,-1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.1875,-1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.1875,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.1875,-1.3125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,0.1875,1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.1875,-1.5],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.5,0.1875,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.3125,0.1875,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.3125,0.1875,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.1875,1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,0.1875,-1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.5,0.1875,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.3125,0.1875,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.1875,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,0.1875,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.1875,-1.3125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.125,0.1875,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.1875,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,0.1875,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.1875,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.3125,0.1875,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.1875,1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.5625,0.1875,-1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.5,0.1875,-0.75],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.5,0.1875,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.3125,0.1875,-0.75],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.5625,0.1875,1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.1875,-1.5],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.0,0.1875,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.1875,-1.6875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.6875,0.1875,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.1875,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.5,0.1875,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.1875,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.1875,-1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.1875,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.3125,0.1875,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.1875,-1.125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.9375,0.1875,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.125,0.1875,-1.3125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.125,0.1875,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.125,0.1875,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.9375,0.1875,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.1875,-1.125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,0.1875,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.1875,-1.6875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.6875,0.1875,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.1875,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.5,0.1875,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.1875,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,0.1875,-1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.1875,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.3125,0.1875,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.1875,1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,0.1875,-1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.5,0.1875,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.5,0.1875,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.3125,0.1875,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,0.1875,1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.1875,-1.5],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,0.1875,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.1875,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.1875,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.1875,-1.6875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.5,0.1875,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.1875,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,0.1875,-1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.1875,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.6875,0.1875,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.1875,-0.75],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.5625,0.1875,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.1875,-1.6875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.5,0.1875,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.1875,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.5625,0.1875,-1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.1875,-0.75],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.5,0.1875,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.3125,0.1875,-1.125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.9375,0.1875,1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.125,0.1875,-1.5],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.3125,0.1875,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.125,0.1875,1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.9375,0.1875,-1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.5,0.1875,-1.125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.0,0.1875,1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.1875,-1.875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.875,0.1875,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.6875,0.1875,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.6875,0.1875,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.1875,1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.1875,-1.875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.875,0.1875,-0.1875],"widths":[0.1875,0.1875,0.1875]}]]],[[[{"origin":[0.0,0.375,0.375],"widths":[0.375,0.375,0.375]},{"origin":[0.375,0.375,0.0],"widths":[0.375,0.375,0.375]},{"origin":[0.0,0.375,0.0],"widths":[0.375,0.375,0.375]},{"origin":[-0.375,0.375,0.375],"widths":[0.375,0.375,0.375]},{"origin":[-0.375,0.375,0.0],"widths":[0.375,0.375,0.375]},{"origin":[-0.75,0.375,0.0],"widths":[0.375,0.375,0.375]},{"origin":[0.375,0.375,-0.375],"widths":[0.375,0.375,0.375]},{"origin":[0.0,0.375,-0.375],"widths":[0.375,0.375,0.375]},{"origin":[0.0,0.375,-0.75],"widths":[0.375,0.375,0.375]},{"origin":[-0.375,0.375,-0.375],"widths":[0.375,0.375,0.375]},{"origin":[-0.75,0.375,-0.375],"widths":[0.375,0.375,0.375]},{"origin":[-0.375,0.375,-0.75],"widths":[0.375,0.375,0.375]}],[{"origin":[0.75,0.375,0.75],"widths":[0.375,0.375,0.375]},{"origin":[-1.125,0.375,0.75],"widths":[0.375,0.375,0.375]},{"origin":[0.75,0.375,-1.125],"widths":[0.375,0.375,0.375]},{"origin":[-1.125,0.375,-1.125],"widths":[0.375,0.375,0.375]}],[{"origin":[0.0,0.375,1.125],"widths":[0.375,0.375,0.375]},{"origin":[-0.375,0.375,-1.5],"widths":[0.375,0.375,0.375]}],[{"origin":[-1.5,0.375,0.0],"widths":[0.375,0.375,0.375]},{"origin":[1.125,0.375,-0.375],"widths":[0.375,0.375,0.375]}],[{"origin":[1.125,0.375,0.0],"widths":[0.375,0.375,0.375]},{"origin":[-0.375,0.375,1.125],"widths":[0.375,0.375,0.375]},{"origin":[0.0,0.375,-1.5],"widths":[0.375,0.375,0.375]},{"origin":[-1.5,0.375,-0.375],"widths":[0.375,0.375,0.375]}],[{"origin":[1.125,0.375,0.375],"widths":[0.375,0.375,0.375]},{"origin":[-0.75,0.375,1.125],"widths":[0.375,0.375,0.375]},{"origin":[0.375,0.375,-1.5],"widths":[0.375,0.375,0.375]},{"origin":[-1.5,0.375,-0.75],"widths":[0.375,0.375,0.375]}],[{"origin":[-1.5,0.375,0.375],"widths":[0.375,0.375,0.375]},{"origin":[1.125,0.375,-0.75],"widths":[0.375,0.375,0.375]}],[{"origin":[0.375,0.375,1.125],"widths":[0.375,0.375,0.375]},{"origin":[-0.75,0.375,-1.5],"widths":[0.375,0.375,0.375]}]],[[{"origin":[0.5625,0.375,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,0.375,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,0.375,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.375,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,0.375,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.375,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,0.375,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,0.375,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.9375,0.375,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,0.375,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.9375,0.375,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,0.375,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.5625,0.375,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,0.375,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.5625,0.375,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,0.375,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.375,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.375,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.375,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.375,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.375,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.375,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.375,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.375,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.375,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.375,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.375,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.375,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.375,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.125,0.375,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.375,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.125,0.375,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.9375,0.375,-0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,0.375,-0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.9375,0.375,-0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,0.375,-0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,0.375,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,0.375,-0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.5625,0.375,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,0.375,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.5625,0.375,-0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,0.375,-0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.5625,0.375,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,0.375,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,0.375,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.375,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,0.375,-1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.375,-1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.375,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.375,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.375,-0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.375,-0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.375,-0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.125,0.375,-0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.375,-0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.125,0.375,-0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.375,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.375,-0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.375,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.375,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.375,-1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.375,-1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.375,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.375,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.9375,0.375,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.375,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,0.375,-1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.125,0.375,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.125,0.375,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.9375,0.375,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,0.375,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.375,-1.125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.9375,0.375,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.375,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.5625,0.375,-1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.125,0.375,-0.75],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.125,0.375,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.9375,0.375,-0.75],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.5625,0.375,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.375,-1.125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.3125,0.375,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.375,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,0.375,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.375,-1.3125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.125,0.375,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.375,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,0.375,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.375,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.0,0.375,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.375,-1.6875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.6875,0.375,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.375,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.5,0.375,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.375,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.375,-1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.375,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.3125,0.375,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.375,-1.125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.9375,0.375,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.125,0.375,-1.3125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.125,0.375,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.125,0.375,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.9375,0.375,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.375,-1.125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,0.375,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.375,-1.6875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.6875,0.375,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.375,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.5,0.375,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.375,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,0.375,-1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.375,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.3125,0.375,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.375,1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,0.375,-1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.5,0.375,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.5,0.375,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.3125,0.375,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,0.375,1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.375,-1.5],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,0.375,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.375,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.375,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.375,-1.6875],"widths":[0.1875,0.1875,0.1875]}]]],[[[{"origin":[0.375,0.5625,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.5625,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,0.5625,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.5625,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.75,0.5625,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.5625,0.5625,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,0.5625,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.5625,-0.75],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.5625,0.5625,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.5625,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,0.5625,-0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.5625,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.0,0.5625,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.5625,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.9375,0.5625,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,0.5625,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,0.5625,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.5625,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.5625,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.5625,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,0.5625,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.5625,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.9375,0.5625,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,0.5625,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,0.5625,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.5625,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,0.5625,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.5625,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.5625,0.5625,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.5625,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.5625,0.5625,-0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.5625,-0.75],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,0.5625,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.5625,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,0.5625,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.5625,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.9375,0.5625,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,0.5625,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,0.5625,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.5625,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.0,0.5625,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.5625,-1.125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.125,0.5625,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.9375,0.5625,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.9375,0.5625,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.5625,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.5625,-1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.125,0.5625,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.9375,0.5625,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,0.5625,-0.75],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.5625,0.5625,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.5625,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,0.5625,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.5625,-1.125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.125,0.5625,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.9375,0.5625,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,0.5625,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.5625,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.5625,0.5625,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.5625,-0.75],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.9375,0.5625,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.5625,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,0.5625,-1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.125,0.5625,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.9375,0.5625,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.5625,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,0.5625,-1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.125,0.5625,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.125,0.5625,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.9375,0.5625,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,0.5625,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.5625,-1.125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.9375,0.5625,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.5625,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.5625,0.5625,-1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.125,0.5625,-0.75],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.125,0.5625,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.9375,0.5625,-0.75],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.5625,0.5625,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.5625,-1.125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.3125,0.5625,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.5625,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,0.5625,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.5625,-1.3125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.125,0.5625,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.5625,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,0.5625,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.5625,-0.9375],"widths":[0.1875,0.1875,0.1875]}]]],[[[{"origin":[0.0,0.75,0.375],"widths":[0.375,0.375,0.375]},{"origin":[-0.375,0.75,-0.75],"widths":[0.375,0.375,0.375]}],[{"origin":[-0.75,0.75,0.0],"widths":[0.375,0.375,0.375]},{"origin":[0.375,0.75,-0.375],"widths":[0.375,0.375,0.375]}],[{"origin":[0.375,0.75,0.0],"widths":[0.375,0.375,0.375]},{"origin":[-0.375,0.75,0.375],"widths":[0.375,0.375,0.375]},{"origin":[0.0,0.75,-0.75],"widths":[0.375,0.375,0.375]},{"origin":[-0.75,0.75,-0.375],"widths":[0.375,0.375,0.375]}],[{"origin":[0.375,0.75,0.375],"widths":[0.375,0.375,0.375]},{"origin":[-0.75,0.75,0.375],"widths":[0.375,0.375,0.375]},{"origin":[0.375,0.75,-0.75],"widths":[0.375,0.375,0.375]},{"origin":[-0.75,0.75,-0.75],"widths":[0.375,0.375,0.375]}],[{"origin":[0.0,0.75,0.75],"widths":[0.375,0.375,0.375]},{"origin":[-0.375,0.75,-1.125],"widths":[0.375,0.375,0.375]}],[{"origin":[-1.125,0.75,0.0],"widths":[0.375,0.375,0.375]},{"origin":[0.75,0.75,-0.375],"widths":[0.375,0.375,0.375]}],[{"origin":[0.75,0.75,0.0],"widths":[0.375,0.375,0.375]},{"origin":[-0.375,0.75,0.75],"widths":[0.375,0.375,0.375]},{"origin":[0.0,0.75,-1.125],"widths":[0.375,0.375,0.375]},{"origin":[-1.125,0.75,-0.375],"widths":[0.375,0.375,0.375]}],[{"origin":[0.75,0.75,0.375],"widths":[0.375,0.375,0.375]},{"origin":[-0.75,0.75,0.75],"widths":[0.375,0.375,0.375]},{"origin":[0.375,0.75,-1.125],"widths":[0.375,0.375,0.375]},{"origin":[-1.125,0.75,-0.75],"widths":[0.375,0.375,0.375]}],[{"origin":[-1.125,0.75,0.375],"widths":[0.375,0.375,0.375]},{"origin":[0.75,0.75,-0.75],"widths":[0.375,0.375,0.375]}],[{"origin":[0.375,0.75,0.75],"widths":[0.375,0.375,0.375]},{"origin":[-0.75,0.75,-1.125],"widths":[0.375,0.375,0.375]}]],[[{"origin":[0.1875,0.75,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.75,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,0.75,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.75,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.75,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.75,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.75,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.75,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,0.75,-0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.75,-0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,0.75,-0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.75,-0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.75,-0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.75,-0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.75,-0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.75,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,0.75,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.75,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,0.75,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.75,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.0,0.75,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.75,-1.3125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.3125,0.75,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.75,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.125,0.75,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.75,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.75,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.75,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,0.75,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.75,-1.3125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.3125,0.75,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.75,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.125,0.75,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.75,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,0.75,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.75,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,0.75,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.75,-1.3125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.3125,0.75,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.75,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.125,0.75,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.75,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,0.75,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.75,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.125,0.75,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.9375,0.75,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,0.75,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.75,-1.125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.9375,0.75,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.75,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,0.75,-1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.125,0.75,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.125,0.75,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.75,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.5625,0.75,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.75,-0.75],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.3125,0.75,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.75,-0.75],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.5625,0.75,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.75,-1.3125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.0,0.75,1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.75,-1.5],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.5,0.75,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.3125,0.75,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.3125,0.75,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.75,1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.75,-1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.5,0.75,-0.1875],"widths":[0.1875,0.1875,0.1875]}]]],[[[{"origin":[0.0,0.9375,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.9375,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.9375,-0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.9375,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.0,0.9375,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.9375,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.375,0.9375,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,0.9375,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,0.9375,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.9375,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.9375,-0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.9375,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,0.9375,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.9375,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,0.9375,-0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.9375,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,0.9375,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.9375,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,0.9375,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.9375,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.0,0.9375,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.9375,-1.3125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.3125,0.9375,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.9375,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.125,0.9375,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.9375,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.9375,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.9375,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,0.9375,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.9375,-1.3125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.3125,0.9375,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.9375,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.125,0.9375,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.9375,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,0.9375,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.9375,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,0.9375,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.9375,-1.3125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.3125,0.9375,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.9375,-0.5625],"widths":[0.1875,0.1875,0.1875]}]]],[[[{"origin":[0.0,1.125,0.0],"widths":[0.375,0.375,0.375]},{"origin":[-0.375,1.125,0.0],"widths":[0.375,0.375,0.375]},{"origin":[0.0,1.125,-0.375],"widths":[0.375,0.375,0.375]},{"origin":[-0.375,1.125,-0.375],"widths":[0.375,0.375,0.375]}],[{"origin":[0.0,1.125,0.375],"widths":[0.375,0.375,0.375]},{"origin":[-0.375,1.125,-0.75],"widths":[0.375,0.375,0.375]}],[{"origin":[-0.75,1.125,0.0],"widths":[0.375,0.375,0.375]},{"origin":[0.375,1.125,-0.375],"widths":[0.375,0.375,0.375]}],[{"origin":[0.375,1.125,0.0],"widths":[0.375,0.375,0.375]},{"origin":[-0.375,1.125,0.375],"widths":[0.375,0.375,0.375]},{"origin":[0.0,1.125,-0.75],"widths":[0.375,0.375,0.375]},{"origin":[-0.75,1.125,-0.375],"widths":[0.375,0.375,0.375]}],[{"origin":[0.375,1.125,0.375],"widths":[0.375,0.375,0.375]},{"origin":[-0.75,1.125,0.375],"widths":[0.375,0.375,0.375]},{"origin":[0.375,1.125,-0.75],"widths":[0.375,0.375,0.375]},{"origin":[-0.75,1.125,-0.75],"widths":[0.375,0.375,0.375]}]],[[{"origin":[0.0,1.125,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,1.125,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.9375,1.125,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,1.125,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,1.125,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,1.125,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,1.125,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,1.125,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,1.125,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,1.125,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.9375,1.125,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,1.125,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,1.125,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,1.125,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,1.125,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,1.125,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,1.125,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.125,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,1.125,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,1.125,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.9375,1.125,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,1.125,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,1.125,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.125,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.0,1.125,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,1.125,-1.125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.125,1.125,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.9375,1.125,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.9375,1.125,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,1.125,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,1.125,-1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.125,1.125,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.9375,1.125,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,1.125,-0.75],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.5625,1.125,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,1.125,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,1.125,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,1.125,-1.125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.125,1.125,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.9375,1.125,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,1.125,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,1.125,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.5625,1.125,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,1.125,-0.75],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.9375,1.125,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,1.125,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,1.125,-1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.125,1.125,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.9375,1.125,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.125,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,1.125,-1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.125,1.125,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.125,1.125,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.9375,1.125,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,1.125,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.125,-1.125],"widths":[0.1875,0.1875,0.1875]}]]],[[[{"origin":[0.0,1.3125,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,1.3125,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.9375,1.3125,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,1.3125,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,1.3125,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,1.3125,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,1.3125,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,1.3125,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,1.3125,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,1.3125,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.9375,1.3125,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,1.3125,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,1.3125,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,1.3125,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,1.3125,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,1.3125,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,1.3125,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.3125,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,1.3125,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,1.3125,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.9375,1.3125,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,1.3125,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,1.3125,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.3125,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.0,1.3125,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,1.3125,-1.125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.125,1.3125,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.9375,1.3125,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.9375,1.3125,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,1.3125,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,1.3125,-1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.125,1.3125,-0.1875],"widths":[0.1875,0.1875,0.1875]}]]],[[[{"origin":[0.0,1.5,0.0],"widths":[0.375,0.375,0.375]},{"origin":[-0.375,1.5,0.0],"widths":[0.375,0.375,0.375]},{"origin":[0.0,1.5,-0.375],"widths":[0.375,0.375,0.375]},{"origin":[-0.375,1.5,-0.375],"widths":[0.375,0.375,0.375]}],[{"origin":[0.0,1.5,0.375],"widths":[0.375,0.375,0.375]},{"origin":[-0.375,1.5,-0.75],"widths":[0.375,0.375,0.375]}],[{"origin":[-0.75,1.5,0.0],"widths":[0.375,0.375,0.375]},{"origin":[0.375,1.5,-0.375],"widths":[0.375,0.375,0.375]}],[{"origin":[0.375,1.5,0.0],"widths":[0.375,0.375,0.375]},{"origin":[-0.375,1.5,0.375],"widths":[0.375,0.375,0.375]},{"origin":[0.0,1.5,-0.75],"widths":[0.375,0.375,0.375]},{"origin":[-0.75,1.5,-0.375],"widths":[0.375,0.375,0.375]}]],[[{"origin":[0.375,1.5,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.5,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,1.5,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.5,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.75,1.5,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.5625,1.5,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,1.5,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.5,-0.75],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.5625,1.5,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.5,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,1.5,-0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,1.5,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.0,1.5,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,1.5,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.9375,1.5,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,1.5,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,1.5,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,1.5,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,1.5,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,1.5,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,1.5,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,1.5,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.9375,1.5,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,1.5,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,1.5,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,1.5,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,1.5,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,1.5,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.5625,1.5,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,1.5,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.5625,1.5,-0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,1.5,-0.75],"widths":[0.1875,0.1875,0.1875]}]]],[[[{"origin":[0.375,1.6875,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.6875,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,1.6875,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.6875,-0.5625],"widths":[0.1875,0.1875,0.1875]}]]],[[[{"origin":[0.0,1.875,0.0],"widths":[0.375,0.375,0.375]},{"origin":[-0.375,1.875,0.0],"widths":[0.375,0.375,0.375]},{"origin":[0.0,1.875,-0.375],"widths":[0.375,0.375,0.375]},{"origin":[-0.375,1.875,-0.375],"widths":[0.375,0.375,0.375]}]],[[{"origin":[0.0,1.875,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,1.875,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.5625,1.875,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,1.875,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,1.875,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,1.875,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,1.875,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.875,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,1.875,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,1.875,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,1.875,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.875,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.5625,1.875,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,1.875,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,1.875,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,1.875,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,1.875,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.875,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,1.875,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.875,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.0,1.875,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,1.875,-0.75],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.75,1.875,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.5625,1.875,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.5625,1.875,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,1.875,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,1.875,-0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,1.875,-0.1875],"widths":[0.1875,0.1875,0.1875]}]]],[[[{"origin":[0.0,2.0625,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,2.0625,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.5625,2.0625,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,2.0625,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,2.0625,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,2.0625,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,2.0625,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,2.0625,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,2.0625,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,2.0625,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,2.0625,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,2.0625,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.5625,2.0625,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,2.0625,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,2.0625,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,2.0625,-0.5625],"widths":[0.1875,0.1875,0.1875]}]]],[[[{"origin":[0.0,2.25,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,2.25,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,2.25,-0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,2.25,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.0,2.25,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,2.25,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.375,2.25,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,2.25,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,2.25,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,2.25,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,2.25,-0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,2.25,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,2.25,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,2.25,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,2.25,-0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,2.25,-0.375],"widths":[0.1875,0.1875,0.1875]}]]],[[[{"origin":[0.0,2.4375,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,2.4375,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,2.4375,-0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,2.4375,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.0,2.4375,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,2.4375,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.375,2.4375,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,2.4375,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,2.4375,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,2.4375,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,2.4375,-0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,2.4375,-0.1875],"widths":[0.1875,0.1875,0.1875]}]]],[[[{"origin":[0.0,2.625,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,2.625,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,2.625,-0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,2.625,-0.1875],"widths":[0.1875,0.1875,0.1875]}]]]] \ No newline at end of file diff --git a/recursive_swarm/asdf/json/cubeCone2Size.json b/recursive_swarm/asdf/json/cubeCone2Size.json new file mode 100644 index 0000000000000000000000000000000000000000..010afd1619da7334adc313525c8b6c322a8fd1e2 --- /dev/null +++ b/recursive_swarm/asdf/json/cubeCone2Size.json @@ -0,0 +1 @@ +[[[[{"origin":[0.5,0.0,0.5],"widths":[0.5,0.5,0.5]},{"origin":[0.0,0.0,0.5],"widths":[0.5,0.5,0.5]},{"origin":[0.5,0.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[0.0,0.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,0.0,0.5],"widths":[0.5,0.5,0.5]},{"origin":[-1.0,0.0,0.5],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,0.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[-1.0,0.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[0.5,0.0,-0.5],"widths":[0.5,0.5,0.5]},{"origin":[0.0,0.0,-0.5],"widths":[0.5,0.5,0.5]},{"origin":[0.5,0.0,-1.0],"widths":[0.5,0.5,0.5]},{"origin":[0.0,0.0,-1.0],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,0.0,-0.5],"widths":[0.5,0.5,0.5]},{"origin":[-1.0,0.0,-0.5],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,0.0,-1.0],"widths":[0.5,0.5,0.5]},{"origin":[-1.0,0.0,-1.0],"widths":[0.5,0.5,0.5]}]],[[{"origin":[0.5,0.5,0.5],"widths":[0.5,0.5,0.5]},{"origin":[-1.0,0.5,0.5],"widths":[0.5,0.5,0.5]},{"origin":[0.5,0.5,-1.0],"widths":[0.5,0.5,0.5]},{"origin":[-1.0,0.5,-1.0],"widths":[0.5,0.5,0.5]}]],[[{"origin":[0.0,1.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,1.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[0.0,1.0,-0.5],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,1.0,-0.5],"widths":[0.5,0.5,0.5]}],[{"origin":[0.0,1.0,0.5],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,1.0,-1.0],"widths":[0.5,0.5,0.5]}],[{"origin":[-1.0,1.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[0.5,1.0,-0.5],"widths":[0.5,0.5,0.5]}],[{"origin":[0.5,1.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,1.0,0.5],"widths":[0.5,0.5,0.5]},{"origin":[0.0,1.0,-1.0],"widths":[0.5,0.5,0.5]},{"origin":[-1.0,1.0,-0.5],"widths":[0.5,0.5,0.5]}]],[[{"origin":[0.0,1.5,0.0],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,1.5,0.0],"widths":[0.5,0.5,0.5]},{"origin":[0.0,1.5,-0.5],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,1.5,-0.5],"widths":[0.5,0.5,0.5]}]]],[[[{"origin":[1.0,0.0,1.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.0,1.5],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.0,1.5],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.0,1.5],"widths":[0.25,0.25,0.25]},{"origin":[0.75,0.0,1.25],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.0,1.25],"widths":[0.25,0.25,0.25]},{"origin":[0.75,0.0,1.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.0,1.0],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.0,1.25],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.0,1.25],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.0,1.0],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.0,1.0],"widths":[0.25,0.25,0.25]},{"origin":[1.5,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[1.25,0.0,0.75],"widths":[0.25,0.25,0.25]},{"origin":[1.0,0.0,0.75],"widths":[0.25,0.25,0.25]},{"origin":[1.25,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[1.0,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[1.5,0.0,0.25],"widths":[0.25,0.25,0.25]},{"origin":[1.5,0.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[1.25,0.0,0.25],"widths":[0.25,0.25,0.25]},{"origin":[1.0,0.0,0.25],"widths":[0.25,0.25,0.25]},{"origin":[1.25,0.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[1.0,0.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.0,1.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.0,1.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,1.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.0,1.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.0,1.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.0,1.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.0,1.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,1.25],"widths":[0.25,0.25,0.25]},{"origin":[-1.0,0.0,1.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,1.0],"widths":[0.25,0.25,0.25]},{"origin":[-1.0,0.0,1.0],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,0.0,1.0],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,0.0,0.75],"widths":[0.25,0.25,0.25]},{"origin":[-1.5,0.0,0.75],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-1.5,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-1.75,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,0.0,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-1.5,0.0,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,0.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-1.5,0.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-1.75,0.0,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-1.75,0.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[1.5,0.0,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[1.5,0.0,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[1.25,0.0,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[1.0,0.0,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[1.25,0.0,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[1.0,0.0,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[1.5,0.0,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[1.25,0.0,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[1.0,0.0,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[1.25,0.0,-1.0],"widths":[0.25,0.25,0.25]},{"origin":[1.0,0.0,-1.0],"widths":[0.25,0.25,0.25]},{"origin":[1.0,0.0,-1.25],"widths":[0.25,0.25,0.25]},{"origin":[0.75,0.0,-1.25],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.0,-1.25],"widths":[0.25,0.25,0.25]},{"origin":[0.75,0.0,-1.5],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.0,-1.5],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.0,-1.25],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.0,-1.25],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.0,-1.5],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.0,-1.5],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.0,-1.75],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.0,-1.75],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.0,-1.75],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,0.0,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-1.5,0.0,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,0.0,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-1.5,0.0,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-1.75,0.0,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-1.75,0.0,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,0.0,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-1.5,0.0,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,0.0,-1.0],"widths":[0.25,0.25,0.25]},{"origin":[-1.5,0.0,-1.0],"widths":[0.25,0.25,0.25]},{"origin":[-1.75,0.0,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.0,-1.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.0,-1.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.0,-1.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.0,-1.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,-1.25],"widths":[0.25,0.25,0.25]},{"origin":[-1.0,0.0,-1.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,-1.5],"widths":[0.25,0.25,0.25]},{"origin":[-1.0,0.0,-1.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.0,-1.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.0,-1.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,-1.75],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,0.0,-1.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.5,0.0,1.0],"widths":[0.25,0.25,0.25]},{"origin":[1.25,0.0,-1.25],"widths":[0.25,0.25,0.25]}],[{"origin":[1.0,0.0,1.25],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,0.0,-1.5],"widths":[0.25,0.25,0.25]}],[{"origin":[1.25,0.0,1.0],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,0.0,1.25],"widths":[0.25,0.25,0.25]},{"origin":[1.0,0.0,-1.5],"widths":[0.25,0.25,0.25]},{"origin":[-1.5,0.0,-1.25],"widths":[0.25,0.25,0.25]}],[{"origin":[1.5,0.0,0.75],"widths":[0.25,0.25,0.25]},{"origin":[-1.0,0.0,1.5],"widths":[0.25,0.25,0.25]},{"origin":[0.75,0.0,-1.75],"widths":[0.25,0.25,0.25]},{"origin":[-1.75,0.0,-1.0],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.75,0.0,0.75],"widths":[0.25,0.25,0.25]},{"origin":[1.5,0.0,-1.0],"widths":[0.25,0.25,0.25]}],[{"origin":[0.75,0.0,1.5],"widths":[0.25,0.25,0.25]},{"origin":[-1.0,0.0,-1.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,0.0,1.75],"widths":[0.25,0.25,0.25]},{"origin":[-2.0,0.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[1.75,0.0,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.0,-2.0],"widths":[0.25,0.25,0.25]}],[{"origin":[1.75,0.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.0,1.75],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.0,-2.0],"widths":[0.25,0.25,0.25]},{"origin":[-2.0,0.0,-0.25],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.25,0.25,1.0],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.25,1.0],"widths":[0.25,0.25,0.25]},{"origin":[1.0,0.25,0.25],"widths":[0.25,0.25,0.25]},{"origin":[1.0,0.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.25,1.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.25,1.0],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,0.25,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,0.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[1.0,0.25,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[1.0,0.25,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.25,-1.25],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.25,-1.25],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,0.25,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,0.25,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.25,-1.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.25,-1.25],"widths":[0.25,0.25,0.25]}],[{"origin":[1.0,0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.25,1.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.25,-1.25],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,0.25,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.25,0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[1.0,0.25,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,0.25,1.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.25,-1.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,0.25,1.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.25,-1.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.5,0.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[1.25,0.25,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[1.25,0.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.25,1.25],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.25,-1.5],"widths":[0.25,0.25,0.25]},{"origin":[-1.5,0.25,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.25,0.25,0.75],"widths":[0.25,0.25,0.25]},{"origin":[1.0,0.25,-1.0],"widths":[0.25,0.25,0.25]}],[{"origin":[0.75,0.25,1.0],"widths":[0.25,0.25,0.25]},{"origin":[-1.0,0.25,-1.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,0.25,1.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.25,-1.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.5,0.25,0.25],"widths":[0.25,0.25,0.25]},{"origin":[1.25,0.25,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[1.0,0.25,0.75],"widths":[0.25,0.25,0.25]},{"origin":[-1.0,0.25,1.0],"widths":[0.25,0.25,0.25]},{"origin":[0.75,0.25,-1.25],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,0.25,-1.0],"widths":[0.25,0.25,0.25]}],[{"origin":[1.25,0.25,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.25,1.25],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.25,-1.5],"widths":[0.25,0.25,0.25]},{"origin":[-1.5,0.25,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[1.25,0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.25,1.25],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.25,-1.5],"widths":[0.25,0.25,0.25]},{"origin":[-1.5,0.25,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.5,0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[1.25,0.25,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,0.25,1.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.25,-1.5],"widths":[0.25,0.25,0.25]}],[{"origin":[1.0,0.25,1.0],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,0.25,1.0],"widths":[0.25,0.25,0.25]},{"origin":[1.0,0.25,-1.25],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,0.25,-1.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,0.25,1.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.25,-1.75],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.75,0.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[1.5,0.25,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[1.5,0.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.25,1.5],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.25,-1.75],"widths":[0.25,0.25,0.25]},{"origin":[-1.75,0.25,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[1.25,0.25,0.75],"widths":[0.25,0.25,0.25]},{"origin":[-1.0,0.25,1.25],"widths":[0.25,0.25,0.25]},{"origin":[0.75,0.25,-1.5],"widths":[0.25,0.25,0.25]},{"origin":[-1.5,0.25,-1.0],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.5,0.25,0.75],"widths":[0.25,0.25,0.25]},{"origin":[1.25,0.25,-1.0],"widths":[0.25,0.25,0.25]}],[{"origin":[0.75,0.25,1.25],"widths":[0.25,0.25,0.25]},{"origin":[-1.0,0.25,-1.5],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,0.25,1.5],"widths":[0.25,0.25,0.25]},{"origin":[-1.75,0.25,0.25],"widths":[0.25,0.25,0.25]},{"origin":[1.5,0.25,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.25,-1.75],"widths":[0.25,0.25,0.25]}],[{"origin":[1.5,0.25,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.25,1.5],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.25,-1.75],"widths":[0.25,0.25,0.25]},{"origin":[-1.75,0.25,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,0.25,1.5],"widths":[0.25,0.25,0.25]},{"origin":[-1.75,0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[1.5,0.25,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.25,-1.75],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.25,0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.5,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.5,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.5,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.5,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.5,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.5,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.5,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.5,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.5,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.5,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.5,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.5,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.5,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,0.5,0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,-1.0],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.0,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.75,0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.75,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,0.75],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.5,-1.0],"widths":[0.25,0.25,0.25]},{"origin":[-1.0,0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.75,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.5,0.75],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.5,-1.0],"widths":[0.25,0.25,0.25]},{"origin":[-1.0,0.5,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.0,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.75,0.5,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,0.5,0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.5,-1.0],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,0.5,1.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,-1.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.25,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[1.0,0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[1.0,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,1.0],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.5,-1.25],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,0.5,1.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.5,-1.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.25,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[1.0,0.5,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[1.0,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.5,1.0],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.5,-1.25],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,0.5,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[1.0,0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.5,1.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.5,-1.25],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,0.5,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.25,0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[1.0,0.5,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,0.5,1.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.5,-1.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,0.5,1.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,-1.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.5,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[1.25,0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[1.25,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,1.25],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.5,-1.5],"widths":[0.25,0.25,0.25]},{"origin":[-1.5,0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.25,0.5,0.75],"widths":[0.25,0.25,0.25]},{"origin":[1.0,0.5,-1.0],"widths":[0.25,0.25,0.25]}],[{"origin":[0.75,0.5,1.0],"widths":[0.25,0.25,0.25]},{"origin":[-1.0,0.5,-1.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,0.5,1.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.5,-1.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.5,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[1.25,0.5,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[1.0,0.5,0.75],"widths":[0.25,0.25,0.25]},{"origin":[-1.0,0.5,1.0],"widths":[0.25,0.25,0.25]},{"origin":[0.75,0.5,-1.25],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,0.5,-1.0],"widths":[0.25,0.25,0.25]}],[{"origin":[1.25,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.5,1.25],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.5,-1.5],"widths":[0.25,0.25,0.25]},{"origin":[-1.5,0.5,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[1.25,0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.5,1.25],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.5,-1.5],"widths":[0.25,0.25,0.25]},{"origin":[-1.5,0.5,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.5,0.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[1.25,0.5,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,0.5,1.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.5,-1.5],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.0,0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.75,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.75,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,0.75,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.75,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.5,0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.75,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.75,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.75,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.75,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,0.75,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.75,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.75,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.75,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,0.75,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.75,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.75,0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.75,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.75,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.75,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.75,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,0.75,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.75,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.75,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.75,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.75,0.75,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.75,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,0.75,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.75,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,0.75,0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.75,-1.0],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.0,0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.75,0.75,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.75,0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.75,0.75],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.75,-1.0],"widths":[0.25,0.25,0.25]},{"origin":[-1.0,0.75,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.75,0.75,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.75,0.75],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.75,-1.0],"widths":[0.25,0.25,0.25]},{"origin":[-1.0,0.75,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.0,0.75,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.75,0.75,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,0.75,0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.75,-1.0],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,0.75,1.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.75,-1.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.25,0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[1.0,0.75,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[1.0,0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.75,1.0],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.75,-1.25],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,0.75,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,0.75,1.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.75,-1.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.25,0.75,0.25],"widths":[0.25,0.25,0.25]},{"origin":[1.0,0.75,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[1.0,0.75,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.75,1.0],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.75,-1.25],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,0.75,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[1.0,0.75,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.75,1.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.75,-1.25],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,0.75,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.25,0.75,0.5],"widths":[0.25,0.25,0.25]},{"origin":[1.0,0.75,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,0.75,1.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.75,-1.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,0.75,1.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.75,-1.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.5,0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[1.25,0.75,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[1.25,0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.75,1.25],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.75,-1.5],"widths":[0.25,0.25,0.25]},{"origin":[-1.5,0.75,-0.25],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.5,1.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,1.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.5,1.0,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,1.0,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.0,1.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.75,1.0,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,1.0,0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,1.0,-1.0],"widths":[0.25,0.25,0.25]}],[{"origin":[0.75,1.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,1.0,0.75],"widths":[0.25,0.25,0.25]},{"origin":[0.5,1.0,-1.0],"widths":[0.25,0.25,0.25]},{"origin":[-1.0,1.0,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,1.0,1.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,1.0,-1.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.25,1.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[1.0,1.0,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[1.0,1.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,1.0,1.0],"widths":[0.25,0.25,0.25]},{"origin":[0.0,1.0,-1.25],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,1.0,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,1.0,1.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,1.0,-1.25],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.25,1.0,0.25],"widths":[0.25,0.25,0.25]},{"origin":[1.0,1.0,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[1.0,1.0,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,1.0,1.0],"widths":[0.25,0.25,0.25]},{"origin":[0.25,1.0,-1.25],"widths":[0.25,0.25,0.25]},{"origin":[-1.25,1.0,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[0.75,1.0,0.75],"widths":[0.25,0.25,0.25]},{"origin":[-1.0,1.0,0.75],"widths":[0.25,0.25,0.25]},{"origin":[0.75,1.0,-1.0],"widths":[0.25,0.25,0.25]},{"origin":[-1.0,1.0,-1.0],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.5,1.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,1.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.5,1.25,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,1.25,-0.75],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.0,1.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,1.5,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.75,1.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,1.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,1.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,1.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.0,1.5,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,1.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,1.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,1.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.25,1.5,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,1.5,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.75,1.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.5,1.5,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,1.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,1.5,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,1.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,1.5,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.5,1.5,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,1.5,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,1.5,0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,1.5,-1.0],"widths":[0.25,0.25,0.25]}],[{"origin":[-1.0,1.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.75,1.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.75,1.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,1.5,0.75],"widths":[0.25,0.25,0.25]},{"origin":[0.0,1.5,-1.0],"widths":[0.25,0.25,0.25]},{"origin":[-1.0,1.5,-0.25],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.0,1.75,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,1.75,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.75,1.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,1.75,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,1.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,1.75,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.0,1.75,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,1.75,-0.25],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.0,2.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,2.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.0,2.0,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,2.0,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,2.0,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,2.0,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.5,2.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.25,2.0,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,2.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,2.0,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.0,2.0,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,2.0,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,2.0,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,2.0,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.25,2.0,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,2.0,-0.5],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.0,2.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,2.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.0,2.25,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,2.25,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,2.25,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,2.25,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.5,2.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.25,2.25,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,2.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,2.25,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.0,2.25,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,2.25,-0.25],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.0,2.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,2.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.0,2.5,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,2.5,-0.25],"widths":[0.25,0.25,0.25]}]]],[[[{"origin":[0.5,1.75,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,1.75,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.25,1.75,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,1.75,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.625,1.75,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.5,1.75,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,1.75,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,1.75,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.625,1.75,0.375],"widths":[0.125,0.125,0.125]},{"origin":[0.5,1.75,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[0.375,1.75,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,1.75,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.5,1.75,0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,1.75,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.375,1.75,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,1.75,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[0.625,1.75,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,1.75,0.625],"widths":[0.125,0.125,0.125]},{"origin":[0.25,1.75,-0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.75,1.75,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.75,1.75,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.625,1.75,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,1.75,0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,1.75,-0.75],"widths":[0.125,0.125,0.125]}]],[[{"origin":[0.5,1.875,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,1.875,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.25,1.875,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,1.875,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.625,1.875,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.5,1.875,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,1.875,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,1.875,-0.625],"widths":[0.125,0.125,0.125]}]]]] \ No newline at end of file diff --git a/recursive_swarm/asdf/json/cubeCone3.json b/recursive_swarm/asdf/json/cubeCone3.json new file mode 100644 index 0000000000000000000000000000000000000000..8fdedf7fa6cc78550c433c0f845bca2b22bec634 --- /dev/null +++ b/recursive_swarm/asdf/json/cubeCone3.json @@ -0,0 +1 @@ +[[[[{"origin":[0.0,0.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,0.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[0.0,0.0,-0.5],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,0.0,-0.5],"widths":[0.5,0.5,0.5]}]],[[{"origin":[0.25,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.0,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.0,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.0,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.0,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.0,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.0,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.0,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.0,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.75,0.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.0,0.75],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.0,-1.0],"widths":[0.25,0.25,0.25]},{"origin":[-1.0,0.0,-0.25],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.25,0.0,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.125,0.0,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.0,0.0,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.0,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.0,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.0,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.0,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.0,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.0,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.0,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.0,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.0,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.0,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.0,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.0,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.0,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,0.0,0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,0.0,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.375,0.0,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.0,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.875,0.0,0.375],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.0,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[0.375,0.0,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,0.0,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,0.0,0.875],"widths":[0.125,0.125,0.125]},{"origin":[-1.0,0.0,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.875,0.0,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.0,-1.0],"widths":[0.125,0.125,0.125]}]]],[[[{"origin":[0.0,0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.125,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.875,0.125,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.125,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.125,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.125,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.125,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.125,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.125,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.125,-0.875],"widths":[0.125,0.125,0.125]}]]],[[[{"origin":[0.0,0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.25,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.75,0.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.25,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,0.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.25,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.25,-0.25],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.5,0.25,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.25,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.25,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.25,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.625,0.25,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.5,0.25,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,0.25,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.25,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.625,0.25,0.375],"widths":[0.125,0.125,0.125]},{"origin":[0.5,0.25,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[0.375,0.25,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,0.25,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.5,0.25,0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,0.25,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.375,0.25,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.25,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[0.625,0.25,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.25,0.625],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.25,-0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.75,0.25,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.75,0.25,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.625,0.25,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,0.25,0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.25,-0.75],"widths":[0.125,0.125,0.125]}]]],[[[{"origin":[0.5,0.375,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.375,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.375,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.375,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.625,0.375,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.5,0.375,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,0.375,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.375,-0.625],"widths":[0.125,0.125,0.125]}]]],[[[{"origin":[0.0,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.5,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.5,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.5,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.5,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.5,-0.5],"widths":[0.25,0.25,0.25]}]]],[[[{"origin":[0.0,0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.75,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.75,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.75,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.75,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.75,-0.25],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.0,0.75,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.75,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.375,0.75,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.75,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.375,0.75,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.75,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,0.75,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.75,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,0.75,0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.75,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.5,0.75,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.375,0.75,-0.125],"widths":[0.125,0.125,0.125]}]]],[[[{"origin":[0.0,0.875,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.875,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.375,0.875,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.875,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.375,0.875,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.875,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,0.875,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.875,-0.375],"widths":[0.125,0.125,0.125]}]]],[[[{"origin":[0.0,1.0,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,1.0,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.0,1.0,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,1.0,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,1.0,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,1.0,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.25,1.0,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.125,1.0,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,1.0,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,1.0,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.0,1.0,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,1.0,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,1.0,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,1.0,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.125,1.0,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,1.0,-0.25],"widths":[0.125,0.125,0.125]}]]],[[[{"origin":[0.0,1.125,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,1.125,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.0,1.125,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,1.125,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,1.125,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,1.125,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.25,1.125,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.125,1.125,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,1.125,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,1.125,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.0,1.125,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,1.125,-0.125],"widths":[0.125,0.125,0.125]}]]],[[[{"origin":[0.0,1.25,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,1.25,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.0,1.25,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,1.25,-0.125],"widths":[0.125,0.125,0.125]}]]]] \ No newline at end of file diff --git a/recursive_swarm/asdf/json/cubeCone3Size.json b/recursive_swarm/asdf/json/cubeCone3Size.json new file mode 100644 index 0000000000000000000000000000000000000000..dd1e9705ab111f6fe66e3e45b2a5d2383cd14aea --- /dev/null +++ b/recursive_swarm/asdf/json/cubeCone3Size.json @@ -0,0 +1 @@ +[[[[{"origin":[0.0,0.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,0.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[0.0,0.0,-0.5],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,0.0,-0.5],"widths":[0.5,0.5,0.5]}]]],[[[{"origin":[0.25,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.0,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.0,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.0,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.0,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.0,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.0,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.0,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.0,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.75,0.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.0,0.75],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.0,-1.0],"widths":[0.25,0.25,0.25]},{"origin":[-1.0,0.0,-0.25],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.0,0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.25,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.75,0.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.25,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,0.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.25,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.25,-0.25],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.0,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.5,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.5,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.5,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.5,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.5,-0.5],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.0,0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.75,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.75,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.75,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.75,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.75,-0.25],"widths":[0.25,0.25,0.25]}]]],[[[{"origin":[0.25,0.0,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.125,0.0,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.0,0.0,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.0,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.0,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.0,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.0,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.0,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.0,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.0,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.0,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.0,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.0,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.0,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.0,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.0,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.75,0.0,0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,0.0,0.75],"widths":[0.125,0.125,0.125]},{"origin":[0.375,0.0,-0.875],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.0,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.875,0.0,0.375],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.0,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[0.375,0.0,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,0.0,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,0.0,0.875],"widths":[0.125,0.125,0.125]},{"origin":[-1.0,0.0,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.875,0.0,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.0,-1.0],"widths":[0.125,0.125,0.125]}]],[[{"origin":[0.0,0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.125,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.875,0.125,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.125,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.125,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.125,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.125,-0.875],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,0.125,0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.875,0.125,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.75,0.125,-0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.125,-0.875],"widths":[0.125,0.125,0.125]}]],[[{"origin":[0.5,0.25,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.25,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.25,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.25,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.625,0.25,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.5,0.25,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,0.25,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.25,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.625,0.25,0.375],"widths":[0.125,0.125,0.125]},{"origin":[0.5,0.25,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[0.375,0.25,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,0.25,-0.625],"widths":[0.125,0.125,0.125]}],[{"origin":[0.5,0.25,0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.5,0.25,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.375,0.25,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.25,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[0.625,0.25,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.25,0.625],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.25,-0.75],"widths":[0.125,0.125,0.125]},{"origin":[-0.75,0.25,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.75,0.25,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.625,0.25,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,0.25,0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.25,-0.75],"widths":[0.125,0.125,0.125]}]],[[{"origin":[0.5,0.375,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.375,0.5],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.375,-0.625],"widths":[0.125,0.125,0.125]},{"origin":[-0.625,0.375,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.625,0.375,0.25],"widths":[0.125,0.125,0.125]},{"origin":[0.5,0.375,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.25,0.375,0.5],"widths":[0.125,0.125,0.125]},{"origin":[-0.375,0.375,-0.625],"widths":[0.125,0.125,0.125]}]],[[{"origin":[0.0,0.75,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.75,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.375,0.75,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.75,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.375,0.75,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.75,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,0.75,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.75,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,0.75,0.375],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.75,-0.5],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.5,0.75,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.375,0.75,-0.125],"widths":[0.125,0.125,0.125]}]],[[{"origin":[0.0,0.875,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,0.875,-0.375],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.375,0.875,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.875,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.375,0.875,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.25,0.875,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,0.875,0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,0.875,-0.375],"widths":[0.125,0.125,0.125]}]],[[{"origin":[0.0,1.0,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,1.0,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.0,1.0,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,1.0,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,1.0,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,1.0,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.25,1.0,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.125,1.0,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,1.0,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,1.0,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.0,1.0,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,1.0,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,1.0,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,1.0,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.125,1.0,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,1.0,-0.25],"widths":[0.125,0.125,0.125]}]],[[{"origin":[0.0,1.125,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,1.125,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.0,1.125,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,1.125,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.0,1.125,0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,1.125,-0.25],"widths":[0.125,0.125,0.125]}],[{"origin":[-0.25,1.125,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.125,1.125,-0.125],"widths":[0.125,0.125,0.125]}],[{"origin":[0.125,1.125,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,1.125,0.125],"widths":[0.125,0.125,0.125]},{"origin":[0.0,1.125,-0.25],"widths":[0.125,0.125,0.125]},{"origin":[-0.25,1.125,-0.125],"widths":[0.125,0.125,0.125]}]],[[{"origin":[0.0,1.25,0.0],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,1.25,0.0],"widths":[0.125,0.125,0.125]},{"origin":[0.0,1.25,-0.125],"widths":[0.125,0.125,0.125]},{"origin":[-0.125,1.25,-0.125],"widths":[0.125,0.125,0.125]}]]]] \ No newline at end of file diff --git a/recursive_swarm/asdf/json/cubeCone4.json b/recursive_swarm/asdf/json/cubeCone4.json new file mode 100644 index 0000000000000000000000000000000000000000..b2b02d2848e92e158d5b49e738a703e9361545f0 --- /dev/null +++ b/recursive_swarm/asdf/json/cubeCone4.json @@ -0,0 +1 @@ +[[[[{"origin":[0.0,0.0,0.75],"widths":[0.75,0.75,0.75]},{"origin":[0.75,0.0,0.0],"widths":[0.75,0.75,0.75]},{"origin":[0.0,0.0,0.0],"widths":[0.75,0.75,0.75]},{"origin":[-0.75,0.0,0.75],"widths":[0.75,0.75,0.75]},{"origin":[-0.75,0.0,0.0],"widths":[0.75,0.75,0.75]},{"origin":[-1.5,0.0,0.0],"widths":[0.75,0.75,0.75]},{"origin":[0.75,0.0,-0.75],"widths":[0.75,0.75,0.75]},{"origin":[0.0,0.0,-0.75],"widths":[0.75,0.75,0.75]},{"origin":[0.0,0.0,-1.5],"widths":[0.75,0.75,0.75]},{"origin":[-0.75,0.0,-0.75],"widths":[0.75,0.75,0.75]},{"origin":[-1.5,0.0,-0.75],"widths":[0.75,0.75,0.75]},{"origin":[-0.75,0.0,-1.5],"widths":[0.75,0.75,0.75]}]],[[{"origin":[0.75,0.0,1.125],"widths":[0.375,0.375,0.375]},{"origin":[1.125,0.0,0.75],"widths":[0.375,0.375,0.375]},{"origin":[0.75,0.0,0.75],"widths":[0.375,0.375,0.375]},{"origin":[-1.125,0.0,1.125],"widths":[0.375,0.375,0.375]},{"origin":[-1.125,0.0,0.75],"widths":[0.375,0.375,0.375]},{"origin":[-1.5,0.0,0.75],"widths":[0.375,0.375,0.375]},{"origin":[1.125,0.0,-1.125],"widths":[0.375,0.375,0.375]},{"origin":[0.75,0.0,-1.125],"widths":[0.375,0.375,0.375]},{"origin":[0.75,0.0,-1.5],"widths":[0.375,0.375,0.375]},{"origin":[-1.125,0.0,-1.125],"widths":[0.375,0.375,0.375]},{"origin":[-1.5,0.0,-1.125],"widths":[0.375,0.375,0.375]},{"origin":[-1.125,0.0,-1.5],"widths":[0.375,0.375,0.375]}]],[[{"origin":[0.5625,0.0,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,0.0,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.0,1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,0.0,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.0,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.0,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.0,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.0,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.6875,0.0,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.0,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.0,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.0,1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.0,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.0,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.0,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.0,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.0,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.0,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.0,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.0,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.0,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.875,0.0,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.6875,0.0,-0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.0,-0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.0,-0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.0,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.0,-0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.0,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.5625,0.0,-1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,0.0,-1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,0.0,-1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.0,-1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.0,-1.875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.0,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.0,-0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.875,0.0,-0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.0,-0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.0,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.0,-0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.0,-1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.0,-1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.0,-1.875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.0,-1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.0,-1.6875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.5,0.0,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.0,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,0.0,-1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.0,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.6875,0.0,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.0,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,0.0,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.0,-1.6875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,0.0,1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.875,0.0,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.6875,0.0,-0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.0,-1.875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.6875,0.0,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.0,1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,0.0,-1.875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.875,0.0,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,0.0,1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.875,0.0,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.6875,0.0,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.0,-1.875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.6875,0.0,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.0,1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,0.0,-1.875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.875,0.0,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.5,0.0,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.3125,0.0,-1.3125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.125,0.0,1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.0,-1.5],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.3125,0.0,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.0,1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.0,-1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.5,0.0,-1.3125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.5625,0.0,1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.875,0.0,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.6875,0.0,-0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.0,-1.875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.6875,0.0,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.0,1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.5625,0.0,-1.875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.875,0.0,-0.75],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.5,0.0,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.125,0.0,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.9375,0.0,-1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.0,-1.125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.6875,0.0,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.0,-1.125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.9375,0.0,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.125,0.0,-1.6875],"widths":[0.1875,0.1875,0.1875]}]]],[[[{"origin":[0.0,0.1875,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.1875,-1.6875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.6875,0.1875,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.1875,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.5,0.1875,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.1875,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.1875,-1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.1875,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,0.1875,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.1875,-1.6875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.6875,0.1875,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.1875,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.5,0.1875,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.1875,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,0.1875,-1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.1875,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,0.1875,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.1875,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.1875,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.1875,-1.6875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.5,0.1875,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.1875,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,0.1875,-1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.1875,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.6875,0.1875,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.1875,-0.75],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.5625,0.1875,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.1875,-1.6875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.125,0.1875,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.1875,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.1875,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.1875,-1.3125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.5,0.1875,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.1875,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.5625,0.1875,-1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.1875,-0.75],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.0,0.1875,1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.1875,-1.875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.875,0.1875,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.6875,0.1875,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.6875,0.1875,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.1875,1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.1875,-1.875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.875,0.1875,-0.1875],"widths":[0.1875,0.1875,0.1875]}]]],[[[{"origin":[0.75,0.375,0.75],"widths":[0.375,0.375,0.375]},{"origin":[-1.125,0.375,0.75],"widths":[0.375,0.375,0.375]},{"origin":[0.75,0.375,-1.125],"widths":[0.375,0.375,0.375]},{"origin":[-1.125,0.375,-1.125],"widths":[0.375,0.375,0.375]}]],[[{"origin":[-1.3125,0.375,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.375,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,0.375,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.375,-1.3125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.125,0.375,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.375,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,0.375,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.375,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.0,0.375,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.375,-1.6875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.6875,0.375,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.375,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.5,0.375,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.375,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.375,-1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.375,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.3125,0.375,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.375,-1.125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.9375,0.375,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.125,0.375,-1.3125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.125,0.375,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.125,0.375,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.9375,0.375,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.375,-1.125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,0.375,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.375,-1.6875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.6875,0.375,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.375,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.5,0.375,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.375,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,0.375,-1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.375,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.3125,0.375,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.375,1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,0.375,-1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.5,0.375,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.5,0.375,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.3125,0.375,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,0.375,1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.375,-1.5],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,0.375,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.375,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.375,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.375,-1.6875],"widths":[0.1875,0.1875,0.1875]}]]],[[[{"origin":[-1.3125,0.5625,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.5625,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,0.5625,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.5625,-1.3125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.125,0.5625,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.5625,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,0.5625,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.5625,-0.9375],"widths":[0.1875,0.1875,0.1875]}]]],[[[{"origin":[0.0,0.75,0.0],"widths":[0.75,0.75,0.75]},{"origin":[-0.75,0.75,0.0],"widths":[0.75,0.75,0.75]},{"origin":[0.0,0.75,-0.75],"widths":[0.75,0.75,0.75]},{"origin":[-0.75,0.75,-0.75],"widths":[0.75,0.75,0.75]}]],[[{"origin":[0.0,0.75,0.75],"widths":[0.375,0.375,0.375]},{"origin":[-0.375,0.75,-1.125],"widths":[0.375,0.375,0.375]}],[{"origin":[-1.125,0.75,0.0],"widths":[0.375,0.375,0.375]},{"origin":[0.75,0.75,-0.375],"widths":[0.375,0.375,0.375]}],[{"origin":[0.75,0.75,0.0],"widths":[0.375,0.375,0.375]},{"origin":[-0.375,0.75,0.75],"widths":[0.375,0.375,0.375]},{"origin":[0.0,0.75,-1.125],"widths":[0.375,0.375,0.375]},{"origin":[-1.125,0.75,-0.375],"widths":[0.375,0.375,0.375]}],[{"origin":[0.75,0.75,0.375],"widths":[0.375,0.375,0.375]},{"origin":[-0.75,0.75,0.75],"widths":[0.375,0.375,0.375]},{"origin":[0.375,0.75,-1.125],"widths":[0.375,0.375,0.375]},{"origin":[-1.125,0.75,-0.75],"widths":[0.375,0.375,0.375]}],[{"origin":[-1.125,0.75,0.375],"widths":[0.375,0.375,0.375]},{"origin":[0.75,0.75,-0.75],"widths":[0.375,0.375,0.375]}],[{"origin":[0.375,0.75,0.75],"widths":[0.375,0.375,0.375]},{"origin":[-0.75,0.75,-1.125],"widths":[0.375,0.375,0.375]}]],[[{"origin":[0.75,0.75,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.75,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,0.75,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.75,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.0,0.75,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.75,-1.3125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.3125,0.75,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.75,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.125,0.75,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.75,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.75,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.75,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,0.75,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.75,-1.3125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.3125,0.75,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.75,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.125,0.75,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.75,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,0.75,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.75,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,0.75,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.75,-1.3125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.3125,0.75,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.75,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.125,0.75,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.75,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,0.75,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.75,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.125,0.75,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.9375,0.75,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,0.75,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.75,-1.125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.9375,0.75,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.75,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,0.75,-1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.125,0.75,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.125,0.75,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.75,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.5625,0.75,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.75,-0.75],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.3125,0.75,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.75,-0.75],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.5625,0.75,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.75,-1.3125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.0,0.75,1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.75,-1.5],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.5,0.75,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.3125,0.75,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.3125,0.75,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.75,1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.75,-1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.5,0.75,-0.1875],"widths":[0.1875,0.1875,0.1875]}]]],[[[{"origin":[0.75,0.9375,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.9375,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,0.9375,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.9375,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.0,0.9375,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.9375,-1.3125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.3125,0.9375,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.9375,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.125,0.9375,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.9375,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.9375,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.9375,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,0.9375,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.9375,-1.3125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.3125,0.9375,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.9375,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.125,0.9375,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.9375,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,0.9375,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.9375,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,0.9375,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.9375,-1.3125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.3125,0.9375,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.9375,-0.5625],"widths":[0.1875,0.1875,0.1875]}]]],[[[{"origin":[0.0,1.125,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,1.125,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.9375,1.125,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,1.125,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,1.125,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,1.125,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,1.125,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,1.125,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,1.125,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,1.125,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.9375,1.125,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,1.125,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,1.125,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,1.125,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,1.125,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,1.125,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,1.125,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.125,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,1.125,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,1.125,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.9375,1.125,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,1.125,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,1.125,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.125,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.0,1.125,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,1.125,-1.125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.125,1.125,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.9375,1.125,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.9375,1.125,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,1.125,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,1.125,-1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.125,1.125,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.9375,1.125,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,1.125,-0.75],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.5625,1.125,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,1.125,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,1.125,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,1.125,-1.125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.125,1.125,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.9375,1.125,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,1.125,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,1.125,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.5625,1.125,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,1.125,-0.75],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.9375,1.125,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,1.125,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,1.125,-1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.125,1.125,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.9375,1.125,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.125,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,1.125,-1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.125,1.125,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.125,1.125,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.9375,1.125,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,1.125,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.125,-1.125],"widths":[0.1875,0.1875,0.1875]}]]],[[[{"origin":[0.0,1.3125,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,1.3125,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.9375,1.3125,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,1.3125,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,1.3125,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,1.3125,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,1.3125,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,1.3125,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,1.3125,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,1.3125,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.9375,1.3125,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,1.3125,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,1.3125,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,1.3125,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,1.3125,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,1.3125,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,1.3125,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.3125,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,1.3125,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,1.3125,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.9375,1.3125,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,1.3125,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,1.3125,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.3125,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.0,1.3125,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,1.3125,-1.125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.125,1.3125,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.9375,1.3125,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.9375,1.3125,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,1.3125,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,1.3125,-1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.125,1.3125,-0.1875],"widths":[0.1875,0.1875,0.1875]}]]],[[[{"origin":[0.0,1.5,0.0],"widths":[0.375,0.375,0.375]},{"origin":[-0.375,1.5,0.0],"widths":[0.375,0.375,0.375]},{"origin":[0.0,1.5,-0.375],"widths":[0.375,0.375,0.375]},{"origin":[-0.375,1.5,-0.375],"widths":[0.375,0.375,0.375]}],[{"origin":[0.0,1.5,0.375],"widths":[0.375,0.375,0.375]},{"origin":[-0.375,1.5,-0.75],"widths":[0.375,0.375,0.375]}],[{"origin":[-0.75,1.5,0.0],"widths":[0.375,0.375,0.375]},{"origin":[0.375,1.5,-0.375],"widths":[0.375,0.375,0.375]}],[{"origin":[0.375,1.5,0.0],"widths":[0.375,0.375,0.375]},{"origin":[-0.375,1.5,0.375],"widths":[0.375,0.375,0.375]},{"origin":[0.0,1.5,-0.75],"widths":[0.375,0.375,0.375]},{"origin":[-0.75,1.5,-0.375],"widths":[0.375,0.375,0.375]}]],[[{"origin":[0.375,1.5,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.5,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,1.5,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.5,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.75,1.5,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.5625,1.5,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,1.5,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.5,-0.75],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.5625,1.5,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.5,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,1.5,-0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,1.5,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.0,1.5,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,1.5,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.9375,1.5,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,1.5,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,1.5,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,1.5,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,1.5,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,1.5,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,1.5,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,1.5,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.9375,1.5,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,1.5,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,1.5,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,1.5,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,1.5,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,1.5,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.5625,1.5,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,1.5,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.5625,1.5,-0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,1.5,-0.75],"widths":[0.1875,0.1875,0.1875]}]]],[[[{"origin":[0.375,1.6875,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.6875,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,1.6875,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.6875,-0.5625],"widths":[0.1875,0.1875,0.1875]}]]],[[[{"origin":[0.0,1.875,0.0],"widths":[0.375,0.375,0.375]},{"origin":[-0.375,1.875,0.0],"widths":[0.375,0.375,0.375]},{"origin":[0.0,1.875,-0.375],"widths":[0.375,0.375,0.375]},{"origin":[-0.375,1.875,-0.375],"widths":[0.375,0.375,0.375]}]],[[{"origin":[0.0,1.875,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,1.875,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.5625,1.875,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,1.875,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,1.875,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,1.875,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,1.875,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.875,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,1.875,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,1.875,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,1.875,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.875,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.5625,1.875,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,1.875,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,1.875,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,1.875,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,1.875,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.875,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,1.875,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.875,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.0,1.875,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,1.875,-0.75],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.75,1.875,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.5625,1.875,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.5625,1.875,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,1.875,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,1.875,-0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,1.875,-0.1875],"widths":[0.1875,0.1875,0.1875]}]]],[[[{"origin":[0.0,2.0625,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,2.0625,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.5625,2.0625,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,2.0625,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,2.0625,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,2.0625,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,2.0625,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,2.0625,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,2.0625,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,2.0625,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,2.0625,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,2.0625,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.5625,2.0625,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,2.0625,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,2.0625,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,2.0625,-0.5625],"widths":[0.1875,0.1875,0.1875]}]]],[[[{"origin":[0.0,2.25,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,2.25,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,2.25,-0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,2.25,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.0,2.25,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,2.25,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.375,2.25,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,2.25,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,2.25,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,2.25,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,2.25,-0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,2.25,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,2.25,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,2.25,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,2.25,-0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,2.25,-0.375],"widths":[0.1875,0.1875,0.1875]}]]],[[[{"origin":[0.0,2.4375,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,2.4375,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,2.4375,-0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,2.4375,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.0,2.4375,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,2.4375,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.375,2.4375,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,2.4375,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,2.4375,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,2.4375,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,2.4375,-0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,2.4375,-0.1875],"widths":[0.1875,0.1875,0.1875]}]]],[[[{"origin":[0.0,2.625,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,2.625,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,2.625,-0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,2.625,-0.1875],"widths":[0.1875,0.1875,0.1875]}]]]] \ No newline at end of file diff --git a/recursive_swarm/asdf/json/cubeCone4Size.json b/recursive_swarm/asdf/json/cubeCone4Size.json new file mode 100644 index 0000000000000000000000000000000000000000..c18c5b00a49f9381581c09ba9950e6c995434dcf --- /dev/null +++ b/recursive_swarm/asdf/json/cubeCone4Size.json @@ -0,0 +1 @@ +[[[[{"origin":[0.0,0.0,0.75],"widths":[0.75,0.75,0.75]},{"origin":[0.75,0.0,0.0],"widths":[0.75,0.75,0.75]},{"origin":[0.0,0.0,0.0],"widths":[0.75,0.75,0.75]},{"origin":[-0.75,0.0,0.75],"widths":[0.75,0.75,0.75]},{"origin":[-0.75,0.0,0.0],"widths":[0.75,0.75,0.75]},{"origin":[-1.5,0.0,0.0],"widths":[0.75,0.75,0.75]},{"origin":[0.75,0.0,-0.75],"widths":[0.75,0.75,0.75]},{"origin":[0.0,0.0,-0.75],"widths":[0.75,0.75,0.75]},{"origin":[0.0,0.0,-1.5],"widths":[0.75,0.75,0.75]},{"origin":[-0.75,0.0,-0.75],"widths":[0.75,0.75,0.75]},{"origin":[-1.5,0.0,-0.75],"widths":[0.75,0.75,0.75]},{"origin":[-0.75,0.0,-1.5],"widths":[0.75,0.75,0.75]}]],[[{"origin":[0.0,0.75,0.0],"widths":[0.75,0.75,0.75]},{"origin":[-0.75,0.75,0.0],"widths":[0.75,0.75,0.75]},{"origin":[0.0,0.75,-0.75],"widths":[0.75,0.75,0.75]},{"origin":[-0.75,0.75,-0.75],"widths":[0.75,0.75,0.75]}]]],[[[{"origin":[0.75,0.0,1.125],"widths":[0.375,0.375,0.375]},{"origin":[1.125,0.0,0.75],"widths":[0.375,0.375,0.375]},{"origin":[0.75,0.0,0.75],"widths":[0.375,0.375,0.375]},{"origin":[-1.125,0.0,1.125],"widths":[0.375,0.375,0.375]},{"origin":[-1.125,0.0,0.75],"widths":[0.375,0.375,0.375]},{"origin":[-1.5,0.0,0.75],"widths":[0.375,0.375,0.375]},{"origin":[1.125,0.0,-1.125],"widths":[0.375,0.375,0.375]},{"origin":[0.75,0.0,-1.125],"widths":[0.375,0.375,0.375]},{"origin":[0.75,0.0,-1.5],"widths":[0.375,0.375,0.375]},{"origin":[-1.125,0.0,-1.125],"widths":[0.375,0.375,0.375]},{"origin":[-1.5,0.0,-1.125],"widths":[0.375,0.375,0.375]},{"origin":[-1.125,0.0,-1.5],"widths":[0.375,0.375,0.375]}]],[[{"origin":[0.75,0.375,0.75],"widths":[0.375,0.375,0.375]},{"origin":[-1.125,0.375,0.75],"widths":[0.375,0.375,0.375]},{"origin":[0.75,0.375,-1.125],"widths":[0.375,0.375,0.375]},{"origin":[-1.125,0.375,-1.125],"widths":[0.375,0.375,0.375]}]],[[{"origin":[0.0,0.75,0.75],"widths":[0.375,0.375,0.375]},{"origin":[-0.375,0.75,-1.125],"widths":[0.375,0.375,0.375]}],[{"origin":[-1.125,0.75,0.0],"widths":[0.375,0.375,0.375]},{"origin":[0.75,0.75,-0.375],"widths":[0.375,0.375,0.375]}],[{"origin":[0.75,0.75,0.0],"widths":[0.375,0.375,0.375]},{"origin":[-0.375,0.75,0.75],"widths":[0.375,0.375,0.375]},{"origin":[0.0,0.75,-1.125],"widths":[0.375,0.375,0.375]},{"origin":[-1.125,0.75,-0.375],"widths":[0.375,0.375,0.375]}],[{"origin":[0.75,0.75,0.375],"widths":[0.375,0.375,0.375]},{"origin":[-0.75,0.75,0.75],"widths":[0.375,0.375,0.375]},{"origin":[0.375,0.75,-1.125],"widths":[0.375,0.375,0.375]},{"origin":[-1.125,0.75,-0.75],"widths":[0.375,0.375,0.375]}],[{"origin":[-1.125,0.75,0.375],"widths":[0.375,0.375,0.375]},{"origin":[0.75,0.75,-0.75],"widths":[0.375,0.375,0.375]}],[{"origin":[0.375,0.75,0.75],"widths":[0.375,0.375,0.375]},{"origin":[-0.75,0.75,-1.125],"widths":[0.375,0.375,0.375]}]],[[{"origin":[0.0,1.5,0.0],"widths":[0.375,0.375,0.375]},{"origin":[-0.375,1.5,0.0],"widths":[0.375,0.375,0.375]},{"origin":[0.0,1.5,-0.375],"widths":[0.375,0.375,0.375]},{"origin":[-0.375,1.5,-0.375],"widths":[0.375,0.375,0.375]}],[{"origin":[0.0,1.5,0.375],"widths":[0.375,0.375,0.375]},{"origin":[-0.375,1.5,-0.75],"widths":[0.375,0.375,0.375]}],[{"origin":[-0.75,1.5,0.0],"widths":[0.375,0.375,0.375]},{"origin":[0.375,1.5,-0.375],"widths":[0.375,0.375,0.375]}],[{"origin":[0.375,1.5,0.0],"widths":[0.375,0.375,0.375]},{"origin":[-0.375,1.5,0.375],"widths":[0.375,0.375,0.375]},{"origin":[0.0,1.5,-0.75],"widths":[0.375,0.375,0.375]},{"origin":[-0.75,1.5,-0.375],"widths":[0.375,0.375,0.375]}]],[[{"origin":[0.0,1.875,0.0],"widths":[0.375,0.375,0.375]},{"origin":[-0.375,1.875,0.0],"widths":[0.375,0.375,0.375]},{"origin":[0.0,1.875,-0.375],"widths":[0.375,0.375,0.375]},{"origin":[-0.375,1.875,-0.375],"widths":[0.375,0.375,0.375]}]]],[[[{"origin":[0.5625,0.0,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,0.0,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.0,1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,0.0,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.0,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.0,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.0,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.0,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.6875,0.0,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.0,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.0,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.0,1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.0,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.0,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.0,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.0,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.0,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.0,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.0,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.0,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.0,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.875,0.0,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.6875,0.0,-0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.0,-0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.0,-0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.0,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.0,-0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.0,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.5625,0.0,-1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,0.0,-1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,0.0,-1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.0,-1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.0,-1.875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.0,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.0,-0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.875,0.0,-0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.0,-0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.0,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.0,-0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.0,-1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.0,-1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.0,-1.875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.0,-1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.0,-1.6875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.5,0.0,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.0,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,0.0,-1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.0,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.6875,0.0,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.0,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,0.0,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.0,-1.6875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,0.0,1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.875,0.0,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.6875,0.0,-0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.0,-1.875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.6875,0.0,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.0,1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,0.0,-1.875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.875,0.0,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,0.0,1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.875,0.0,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.6875,0.0,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.0,-1.875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.6875,0.0,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.0,1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,0.0,-1.875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.875,0.0,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.5,0.0,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.3125,0.0,-1.3125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.125,0.0,1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.0,-1.5],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.3125,0.0,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.0,1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.0,-1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.5,0.0,-1.3125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.5625,0.0,1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.875,0.0,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.6875,0.0,-0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.0,-1.875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.6875,0.0,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.0,1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.5625,0.0,-1.875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.875,0.0,-0.75],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.5,0.0,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.125,0.0,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.9375,0.0,-1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.0,-1.125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.6875,0.0,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.0,-1.125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.9375,0.0,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.125,0.0,-1.6875],"widths":[0.1875,0.1875,0.1875]}]],[[{"origin":[0.0,0.1875,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.1875,-1.6875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.6875,0.1875,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.1875,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.5,0.1875,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.1875,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.1875,-1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.1875,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,0.1875,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.1875,-1.6875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.6875,0.1875,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.1875,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.5,0.1875,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.1875,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,0.1875,-1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.1875,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,0.1875,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.1875,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.1875,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.1875,-1.6875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.5,0.1875,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.1875,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,0.1875,-1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.1875,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.6875,0.1875,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.1875,-0.75],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.5625,0.1875,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.1875,-1.6875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.125,0.1875,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.1875,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.1875,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.1875,-1.3125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.5,0.1875,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.1875,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.5625,0.1875,-1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.1875,-0.75],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.0,0.1875,1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.1875,-1.875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.875,0.1875,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.6875,0.1875,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.6875,0.1875,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.1875,1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.1875,-1.875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.875,0.1875,-0.1875],"widths":[0.1875,0.1875,0.1875]}]],[[{"origin":[-1.3125,0.375,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.375,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,0.375,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.375,-1.3125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.125,0.375,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.375,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,0.375,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.375,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.0,0.375,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.375,-1.6875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.6875,0.375,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.375,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.5,0.375,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.375,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.375,-1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.375,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.3125,0.375,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.375,-1.125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.9375,0.375,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.125,0.375,-1.3125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.125,0.375,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.125,0.375,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.9375,0.375,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.375,-1.125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,0.375,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.375,-1.6875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.6875,0.375,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.375,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.5,0.375,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.375,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,0.375,-1.6875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.375,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.3125,0.375,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.375,1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,0.375,-1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.5,0.375,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.5,0.375,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.3125,0.375,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,0.375,1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.375,-1.5],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,0.375,1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.6875,0.375,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.5,0.375,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.375,-1.6875],"widths":[0.1875,0.1875,0.1875]}]],[[{"origin":[-1.3125,0.5625,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.5625,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,0.5625,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.5625,-1.3125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.125,0.5625,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.5625,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,0.5625,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.5625,-0.9375],"widths":[0.1875,0.1875,0.1875]}]],[[{"origin":[0.75,0.75,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.75,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,0.75,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.75,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.0,0.75,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.75,-1.3125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.3125,0.75,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.75,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.125,0.75,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.75,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.75,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.75,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,0.75,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.75,-1.3125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.3125,0.75,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.75,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.125,0.75,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.75,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,0.75,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.75,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,0.75,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.75,-1.3125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.3125,0.75,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.75,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.125,0.75,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.75,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,0.75,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.75,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.125,0.75,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.9375,0.75,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,0.75,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.75,-1.125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.9375,0.75,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.75,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,0.75,-1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.125,0.75,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.125,0.75,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.75,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.5625,0.75,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.75,-0.75],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.3125,0.75,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.75,-0.75],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.5625,0.75,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,0.75,-1.3125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.0,0.75,1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.75,-1.5],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.5,0.75,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.3125,0.75,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.3125,0.75,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.75,1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.75,-1.5],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.5,0.75,-0.1875],"widths":[0.1875,0.1875,0.1875]}]],[[{"origin":[0.75,0.9375,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.9375,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,0.9375,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,0.9375,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.0,0.9375,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.9375,-1.3125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.3125,0.9375,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.9375,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.125,0.9375,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,0.9375,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,0.9375,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.9375,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,0.9375,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.9375,-1.3125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.3125,0.9375,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.9375,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[1.125,0.9375,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,0.9375,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,0.9375,-1.3125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.3125,0.9375,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,0.9375,1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,0.9375,-1.3125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.3125,0.9375,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[1.125,0.9375,-0.5625],"widths":[0.1875,0.1875,0.1875]}]],[[{"origin":[0.0,1.125,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,1.125,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.9375,1.125,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,1.125,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,1.125,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,1.125,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,1.125,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,1.125,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,1.125,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,1.125,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.9375,1.125,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,1.125,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,1.125,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,1.125,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,1.125,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,1.125,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,1.125,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.125,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,1.125,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,1.125,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.9375,1.125,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,1.125,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,1.125,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.125,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.0,1.125,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,1.125,-1.125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.125,1.125,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.9375,1.125,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.9375,1.125,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,1.125,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,1.125,-1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.125,1.125,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.9375,1.125,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,1.125,-0.75],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.5625,1.125,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,1.125,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,1.125,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,1.125,-1.125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.125,1.125,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.9375,1.125,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,1.125,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,1.125,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.5625,1.125,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,1.125,-0.75],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.9375,1.125,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,1.125,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,1.125,-1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.125,1.125,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.9375,1.125,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.125,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,1.125,-1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.125,1.125,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.125,1.125,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.9375,1.125,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,1.125,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.125,-1.125],"widths":[0.1875,0.1875,0.1875]}]],[[{"origin":[0.0,1.3125,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,1.3125,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.9375,1.3125,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,1.3125,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,1.3125,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,1.3125,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,1.3125,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,1.3125,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,1.3125,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,1.3125,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.9375,1.3125,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,1.3125,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,1.3125,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,1.3125,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,1.3125,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,1.3125,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,1.3125,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.3125,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,1.3125,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,1.3125,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.9375,1.3125,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,1.3125,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,1.3125,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.3125,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.0,1.3125,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,1.3125,-1.125],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-1.125,1.3125,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.9375,1.3125,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.9375,1.3125,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,1.3125,0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,1.3125,-1.125],"widths":[0.1875,0.1875,0.1875]},{"origin":[-1.125,1.3125,-0.1875],"widths":[0.1875,0.1875,0.1875]}]],[[{"origin":[0.375,1.5,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.5,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,1.5,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.5,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.75,1.5,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.5625,1.5,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,1.5,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.5,-0.75],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.5625,1.5,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.5,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,1.5,-0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,1.5,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.0,1.5,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,1.5,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.9375,1.5,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,1.5,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,1.5,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,1.5,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,1.5,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,1.5,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,1.5,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,1.5,-0.9375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.9375,1.5,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.75,1.5,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.75,1.5,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,1.5,0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,1.5,-0.9375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.9375,1.5,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.5625,1.5,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,1.5,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.5625,1.5,-0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,1.5,-0.75],"widths":[0.1875,0.1875,0.1875]}]],[[{"origin":[0.375,1.6875,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.6875,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,1.6875,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.6875,-0.5625],"widths":[0.1875,0.1875,0.1875]}]],[[{"origin":[0.0,1.875,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,1.875,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.5625,1.875,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,1.875,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,1.875,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,1.875,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,1.875,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.875,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,1.875,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,1.875,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,1.875,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.875,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.5625,1.875,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,1.875,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,1.875,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,1.875,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,1.875,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.875,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,1.875,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,1.875,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.0,1.875,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,1.875,-0.75],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.75,1.875,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.5625,1.875,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.5625,1.875,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,1.875,0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,1.875,-0.75],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.75,1.875,-0.1875],"widths":[0.1875,0.1875,0.1875]}]],[[{"origin":[0.0,2.0625,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,2.0625,-0.5625],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.5625,2.0625,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,2.0625,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,2.0625,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,2.0625,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,2.0625,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,2.0625,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.375,2.0625,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,2.0625,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,2.0625,-0.5625],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.5625,2.0625,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.5625,2.0625,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.375,2.0625,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,2.0625,0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,2.0625,-0.5625],"widths":[0.1875,0.1875,0.1875]}]],[[{"origin":[0.0,2.25,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,2.25,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,2.25,-0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,2.25,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.0,2.25,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,2.25,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.375,2.25,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,2.25,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,2.25,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,2.25,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,2.25,-0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,2.25,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,2.25,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,2.25,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,2.25,-0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,2.25,-0.375],"widths":[0.1875,0.1875,0.1875]}]],[[{"origin":[0.0,2.4375,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,2.4375,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,2.4375,-0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,2.4375,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.0,2.4375,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,2.4375,-0.375],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[-0.375,2.4375,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.1875,2.4375,-0.1875],"widths":[0.1875,0.1875,0.1875]}],[{"origin":[0.1875,2.4375,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,2.4375,0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,2.4375,-0.375],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.375,2.4375,-0.1875],"widths":[0.1875,0.1875,0.1875]}]],[[{"origin":[0.0,2.625,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,2.625,0.0],"widths":[0.1875,0.1875,0.1875]},{"origin":[0.0,2.625,-0.1875],"widths":[0.1875,0.1875,0.1875]},{"origin":[-0.1875,2.625,-0.1875],"widths":[0.1875,0.1875,0.1875]}]]]] \ No newline at end of file diff --git a/recursive_swarm/asdf/json/cubeConeSize.json b/recursive_swarm/asdf/json/cubeConeSize.json new file mode 100644 index 0000000000000000000000000000000000000000..fe09189906ce4c65b5e74b2a330088e98c64b6ba --- /dev/null +++ b/recursive_swarm/asdf/json/cubeConeSize.json @@ -0,0 +1 @@ +[[[[{"origin":[0.0,0.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,0.0,0.0],"widths":[0.5,0.5,0.5]},{"origin":[0.0,0.0,-0.5],"widths":[0.5,0.5,0.5]},{"origin":[-0.5,0.0,-0.5],"widths":[0.5,0.5,0.5]}]]],[[[{"origin":[0.25,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.0,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.0,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.0,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.0,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.0,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.0,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.0,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.0,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.0,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,0.0,0.75],"widths":[0.25,0.25,0.25]},{"origin":[-1.0,0.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.75,0.0,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.0,-1.0],"widths":[0.25,0.25,0.25]}],[{"origin":[0.75,0.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.0,0.75],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.0,-1.0],"widths":[0.25,0.25,0.25]},{"origin":[-1.0,0.0,-0.25],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.0,0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.25,-0.75],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.75,0.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.25,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,0.25,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.25,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.25,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.5,0.25,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.25,-0.75],"widths":[0.25,0.25,0.25]},{"origin":[-0.75,0.25,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.75,0.25,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.5,0.25,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,0.25,0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.25,-0.75],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.0,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.5,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.5,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,0.5,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.5,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.5,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.5,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.5,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.5,-0.5],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.0,0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.75,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.75,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.0,0.75,0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.75,-0.5],"widths":[0.25,0.25,0.25]}],[{"origin":[-0.5,0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.25,0.75,-0.25],"widths":[0.25,0.25,0.25]}],[{"origin":[0.25,0.75,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,0.75,0.25],"widths":[0.25,0.25,0.25]},{"origin":[0.0,0.75,-0.5],"widths":[0.25,0.25,0.25]},{"origin":[-0.5,0.75,-0.25],"widths":[0.25,0.25,0.25]}]],[[{"origin":[0.0,1.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,1.0,0.0],"widths":[0.25,0.25,0.25]},{"origin":[0.0,1.0,-0.25],"widths":[0.25,0.25,0.25]},{"origin":[-0.25,1.0,-0.25],"widths":[0.25,0.25,0.25]}]]]] \ No newline at end of file diff --git a/recursive_swarm/demos/indexBuitSequence_old.html b/recursive_swarm/demos/indexBuitSequence_old.html new file mode 100644 index 0000000000000000000000000000000000000000..54e271bbefa27801d40adcaf2530777caab4e373 --- /dev/null +++ b/recursive_swarm/demos/indexBuitSequence_old.html @@ -0,0 +1,274 @@ +<head> + <!-- // Amira Abdel-Rahman --> + <!-- // (c) Massachusetts Institute of Technology 2020 --> + + <style> + body { margin: 0;background-color: #020227; } + + #graph1 { float: left;background-color: #020227; } + #graph { float: right;background-color: #020227; } + + + </style> + + + <title>Build Sequence</title> + <!-- <script src="//unpkg.com/three"></script> --> + <script src="../lib/three.min.js"></script> + <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script> + + <script src="//unpkg.com/d3-dsv"></script> + <script src="//unpkg.com/dat.gui"></script> + <script src="//unpkg.com/d3-octree"></script> + <script src="//unpkg.com/d3-force-3d"></script> + + + <script src="//unpkg.com/3d-force-graph"></script> + <script src="//unpkg.com/three-spritetext"></script> + + + <script src="../lib/js-colormaps.js"></script> + + + + + </head> + + <body> + <div id="graph1"></div> + <div id="graph"></div> + + <script src="../js/decision/decision_old.js"></script> + + <script> + var color1= 0xffffff; /*white*/ + var color1= '#ffffff'; /*white*/ + var color2= '#020227'; /*kohly*/ + var color3= 0x1c5c61; /*teal*/ + var color4= "#fa6e70"; //red/orange + var color5="#380152"; //purple + var color6="#696767"; //grey + var color7="#03dbfc"; //blue + colormap=Blues; + colormap=YlGnBu; + var fileName="../asdf/json/cubeCone4.json"; + var cone; + + + + setup={}; + setup.nodes=[]; + setup.edges=[]; + setup.viz={}; + setup.viz.colorMaps=[YlGnBu,coolwarm, winter ,jet]; + + example(); + + $.getJSON(fileName, function(json) { + + setup={}; + setup.nodes=[]; + setup.edges=[]; + setup.viz={}; + setup.viz.colorMaps=[YlGnBu,coolwarm, winter ,jet]; + console.log(json); + + //todo move this to other document + scale=1/0.1875; + + buildList= createBuildList1(json, setup, scale); + + drawGraph(setup); + + + }); + + var button={ + "Save Image":function(){ + // var cnvs = document.getElementById('graph').children[0].children[0].children[0].children[2]; + // console.log(cnvs) + // var ctx = cnvs.getContext('2d'); + + // var dataURL = cnvs.toDataURL({ pixelRatio: 1 }); + graph.renderer().render(graph.scene(), graph.camera()); + var dataURL = graph.renderer().domElement.toDataURL(); + + downloadURI(dataURL, 'canvas.png'); + + }, + "Start Simulation": function(){ + + }, + "Show Blocks": function(){ + + // example(); + cone.visible=!cone.visible; + + } + } + + const gui = new dat.GUI(); + gui.add(button,"Show Blocks"); + gui.add(button,"Start Simulation"); + + + + + function example(){ + + const controls = { 'DAG Orientation': 'td'}; + + function downloadURI(uri, name) { + var link = document.createElement('a'); + link.download = name; + link.href = uri; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + delete link; + } + + + // const gui = new dat.GUI(); + + // gui.add(controls, 'DAG Orientation', ['td', 'bu', 'lr', 'rl', 'zout', 'zin', 'radialout', 'radialin', null]) + // .onChange(orientation => graph && graph.dagMode(orientation)); + // gui.add(button,"Save Image"); + + + // graph config + const NODE_REL_SIZE = 1; + + const graph = ForceGraph3D({ controlType: 'orbit' }).backgroundColor(color2) + .dagMode('td') + .dagLevelDistance(150) + .linkColor(() => 'rgba(127,127,127,0.5)') + .nodeThreeObject(node => { + var use=(node.level<=2); + // use a sphere as a drag handle + const obj = new THREE.Mesh( + new THREE.CubeGeometry(node.size/25,node.size/25,node.size/25), + new THREE.MeshBasicMaterial({ depthWrite: false, transparent: use, opacity: 0 }) + ); + + // add text sprite as child + const sprite = new SpriteText(node.name); + // sprite.color = "#"+getColor(node.order,0, maxOrder,colormap); + sprite.color=color1; + // sprite.color = "#"+getColor(node.order,0, maxOrder,colormap); + // console.log(getColor(node.order,0, maxOrder,colormap)) + sprite.textHeight = 24/(node.level+1); + + if(node.level==0){ + sprite.textHeight = 20; + + }else if(node.level==1){ + sprite.textHeight = 20; + + }else if(node.level==2){ + sprite.textHeight = 20; + + }else if(node.level==3){ + sprite.textHeight = 12; + + } + sprite.fontFace="Times"; + if(use){ + obj.add(sprite); + }else{ + // obj.material.opacity=1; + // obj.material.depthWrite=true; + obj.material= new THREE.MeshLambertMaterial( { color: getColor(node.order,maxOrder ,0 ,colormap) } ); + + + } + return obj; + }) + .nodeRelSize(NODE_REL_SIZE) + .nodeId('path') + .nodeVal('size') + .nodeLabel('name') + .nodeAutoColorBy('module') + .nodeOpacity(0.9) + .linkDirectionalParticles(2) + .linkDirectionalParticleWidth(0.8) + .linkDirectionalParticleSpeed(0.006) + .d3Force('collision', d3.forceCollide(node => Math.cbrt(node.size) * NODE_REL_SIZE)) + .d3VelocityDecay(0.3) + .linkWidth(2.0) + .linkOpacity(0.5) + // .height(window.innerHeight); + // .height(2*window.innerHeight/3); + .width(1*window.innerWidth/2); + // + + // Decrease repel intensity + graph.d3Force('charge').strength(-10); + + + scale=1/0.1875; + + $.getJSON(fileName, function(json) { + console.log(json); + + //todo move this to other document + scale=1/0.1875; + + buildList=createBuildList(json, setup, scale); + var nodes=setup.nodes; + var links=setup.edges; + + graph(document.getElementById('graph')) + .graphData({ nodes, links }); + + }); + + + + // fetch('../js/decision/d3-dependencies.csv') + // .then(r => r.text()) + // .then(d3.csvParse) + // .then(data => { + // const nodes = [], links = []; + // data.forEach(({ size, path }) => { + // const levels = path.split('/'), + // level = levels.length - 1, + // module = level > 0 ? levels[1] : null, + // leaf = levels.pop(), + // parent = levels.join('/'); + + // const node = { + // path, + // // leaf, + // module, + // // size: +size || 20, + // // level + // }; + + // nodes.push(node); + + // if (parent) { + // // links.push({source: parent, target: path, targetNode: node}); + // links.push({source: parent, target: path}); + // } + // }); + // console.log(nodes) + + // graph(document.getElementById('graph')) + // .graphData({ nodes, links }); + + + // }); + // // + + } + + + + + </script> + + + + + </body> \ No newline at end of file diff --git a/recursive_swarm/demos/indexCone.html b/recursive_swarm/demos/indexCone.html new file mode 100644 index 0000000000000000000000000000000000000000..3126af274beeb9b231b9ba525a04ff4e1a51d751 --- /dev/null +++ b/recursive_swarm/demos/indexCone.html @@ -0,0 +1,191 @@ +<!DOCTYPE html> +<html> + <!-- // Amira Abdel-Rahman --> + <!-- // (c) Massachusetts Institute of Technology 2020 --> +<head> + <title>Small Cone - Recursive Swarms</title> + +</head> +<body> + <!-- <a download="info.txt" id="downloadlink" style="display: none">Download</a> --> + + <div id="webgl"></div> + + <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script> + + + <script src="../lib/three.min.js"></script> + <script src="../lib/OrbitControls.js"></script> + <script src="../lib/OBJLoader.js"></script> + <script src="../lib/dat.gui.min.js"></script> + <script src="../lib/TransformControls.js"></script> + <script src="../lib/GPUComputationRenderer.js"></script> + + <script src="../js/voxel.js"></script> + + <script src="../js/swarm.js"></script> + <script src="../js/swarm_geometry.js"></script> + <script src="../js/swarm_gui.js"></script> + <script src="../js/swarm_IK.js"></script> + <script src="../js/swarm_move.js"></script> + <script src="../js/swarm_path.js"></script> + <script src="../js/swarm_step.js"></script> + <script src="../js/swarm_three.js"></script> + <script src="../js/swarm_voxel.js"></script> + + <script src="../js/swarm_build.js"></script> + + <script> + + var voxelSpacing=3.0; + var three='webgl'; + var speed=1000; + var offset=6; + var buildSize=12; + var gridSize=buildSize+2*offset; + + var robotLocations=[ + [new THREE.Vector3(offset+0 ,offset+1 ,0) ,new THREE.Vector3(offset+0 ,offset+0 ,0), 1 ], + [new THREE.Vector3(offset+0 ,gridSize-offset-1 ,0) ,new THREE.Vector3(offset+0 ,gridSize-offset-2 ,0), 1 ], + [new THREE.Vector3((gridSize-offset-2),offset+1 ,0) ,new THREE.Vector3((gridSize-offset-2),offset+0 ,0), 1 ], + [new THREE.Vector3((gridSize-offset-2),gridSize-offset-1 ,0) ,new THREE.Vector3((gridSize-offset-2),(gridSize-offset-2),0), 1 ], + [new THREE.Vector3((offset+2) ,(offset+4) ,0) ,new THREE.Vector3((offset+0) ,(offset+4) ,0) ,2 ] + ]; + + var depositLocations=[ + [new THREE.Vector3(offset+0 ,offset+0 ,0) ,new THREE.Vector3(-2,-2,0)], + [new THREE.Vector3(offset+0 ,(gridSize-offset-2), 0) ,new THREE.Vector3(-2,2,0) ], + [new THREE.Vector3(gridSize-offset-2 ,offset+0 ,0) ,new THREE.Vector3(2,-2,0) ], + [new THREE.Vector3(gridSize-offset-2 ,(gridSize-offset-2), 0) ,new THREE.Vector3(2,2,0) ], + [new THREE.Vector3(0 ,gridSize/2.0 ,0),new THREE.Vector3(0,0,0)] + ]; + var hierarchical=true; + + var buildType=["frepCube","frep","directions","list","sdfList"]; + + var buildList,recursiveSwarms; + + $.getJSON("../asdf/json/cubeCone.json", function(json) { + console.log(json); + //todo move this to other document + var scale=4.0; + var shift=12.0; + buildList={ + currentSizeIndex:0, + maxSizeIndex:json.length, + done:false, + availablePickup:[], + listSize:[] + + }; + + // todo multiply by 4 as smallest size in cubeCone is 0.25 + // y is z and z is y + // shift z by 1 cause sacrificial layer is 0 + // shift x and y to not have negative values + + for(var i=0;i<json.length;i++){ //for each z layer bin + buildList.listSize.push({ + size:json[i][0][0][0].widths[0]*scale, + done:false, + currentZIndex:0, + maxZIndex:json[i].length, + listZ:[], + }); + for(var j=0;j<json[i].length;j++){ //for each size bin + buildList.listSize[i].listZ.push({ + + size:buildList.listSize[i].size, + layerZ:json[i][j][0][0].origin[1]*scale+1, + + done:false, + currentSDFIndex:0, + maxSDFIndex:json[i][j].length, + listSDF:[] + + }); + for(var k=0;k<json[i][j].length;k++){ //for each sdf bin (signed distance field) + buildList.listSize[i].listZ[j].listSDF.push({ + sdfRank:k, + layerZ:buildList.listSize[i].listZ[j].layerZ, + size:buildList.listSize[i].size, + done:false, + currentCubeIndex:0, + maxCubeIndex:json[i][j][k].length, + listCubes:[] + + + }); + + for(var l=0;l<json[i][j][k].length;l++){ //for each cube add location (todo check if int) + var stockBuilt=false; + if(buildList.listSize[i].size==1){ + stockBuilt=true; + } + buildList.listSize[i].listZ[j].listSDF[k].listCubes.push({ + layerZ:buildList.listSize[i].listZ[j].layerZ, + size:buildList.listSize[i].size, + sdfRank:buildList.listSize[i].listZ[j].listSDF[k].sdfRank, + done:false, + stockBuilt:stockBuilt, + stockAssigned:false, + stockPickedUp:false, + position:new THREE.Vector3( + json[i][j][k][l].origin[0]*scale+shift, + json[i][j][k][l].origin[2]*scale+shift, + json[i][j][k][l].origin[1]*scale+1) + }); + } + } + } + } + + console.log(buildList) + + buildList=createBuildList (json,scale,shift); + + var setup={ + three:'webgl', + voxelSpacing:3.0, + viz:{ + speed:500, + showGUI:false, + saveAngleData:false, + }, + robotGeometry:{ + leg1:5, + leg2:5, + offset:2 + }, + path:{ + showPath:false, + number:20, //number of divisions/points + cHeight:1.5 //parabola height (will be multiplied later by voxelSpacing) + + }, + robotLocations:robotLocations, + depositLocations:depositLocations, + hierarchical:true, + buildType:"sdfList", + buildList:buildList , + gridSize:gridSize, + + + }; + + + + recursiveSwarms=new Swarm(setup); + + }); + + + + + </script> + + + + +</body> +</html> \ No newline at end of file diff --git a/recursive_swarm/demos/indexCone4.html b/recursive_swarm/demos/indexCone4.html new file mode 100644 index 0000000000000000000000000000000000000000..81bcbb5ab2da137ce832548f149e02afbba89103 --- /dev/null +++ b/recursive_swarm/demos/indexCone4.html @@ -0,0 +1,158 @@ +<!DOCTYPE html> +<html> + <!-- // Amira Abdel-Rahman --> + <!-- // (c) Massachusetts Institute of Technology 2020 --> + +<head> + <title>Cone 4 - Recursive Swarms</title> + +</head> +<body> + <!-- <a download="info.txt" id="downloadlink" style="display: none">Download</a> --> + + <div id="webgl"></div> + + <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script> + + + <script src="../lib/three.min.js"></script> + <script src="../lib/OrbitControls.js"></script> + <script src="../lib/OBJLoader.js"></script> + <script src="../lib/dat.gui.min.js"></script> + <script src="../lib/TransformControls.js"></script> + <script src="../lib/GPUComputationRenderer.js"></script> + + <script src="../js/voxel.js"></script> + + + <script src="../js/swarm.js"></script> + <script src="../js/swarm_geometry.js"></script> + <script src="../js/swarm_gui.js"></script> + <script src="../js/swarm_IK.js"></script> + <script src="../js/swarm_move.js"></script> + <script src="../js/swarm_path.js"></script> + <script src="../js/swarm_step.js"></script> + <script src="../js/swarm_three.js"></script> + <script src="../js/swarm_voxel.js"></script> + + <script src="../js/swarm_build.js"></script> + + <script> + + var voxelSpacing=3.0; + var three='webgl'; + var speed=1000; + var offset2=12; + var offset=offset2+8; + var buildSize=32; + var gridSize=buildSize+2*(offset); + + var robotLocations=[ + + [new THREE.Vector3(offset+0 ,offset+1 ,0) ,new THREE.Vector3(offset+0 ,offset+0 ,0), 1 ], + [new THREE.Vector3(offset+0 ,gridSize-offset-1 ,0) ,new THREE.Vector3(offset+0 ,gridSize-offset-4 ,0), 1 ], + [new THREE.Vector3((gridSize-offset-4),offset+1 ,0) ,new THREE.Vector3((gridSize-offset-4),offset+0 ,0), 1 ], + [new THREE.Vector3((gridSize-offset-4),gridSize-offset-1 ,0) ,new THREE.Vector3((gridSize-offset-4),(gridSize-offset-4),0), 1 ], + + [new THREE.Vector3(offset+0 ,gridSize/2.0-1 ,0) ,new THREE.Vector3(offset+0 ,gridSize/2.0-2 ,0), 1 ], + [new THREE.Vector3((gridSize/2.0-2),offset+1 ,0) ,new THREE.Vector3((gridSize/2.0-2),offset+0 ,0), 1 ], + [new THREE.Vector3((gridSize/2.0-2),gridSize-offset-1 ,0) ,new THREE.Vector3((gridSize/2.0-2),(gridSize-offset-2),0), 1 ], + [new THREE.Vector3((gridSize-offset-2),gridSize/2.0-1 ,0) ,new THREE.Vector3((gridSize-offset-2),(gridSize/2.0-2),0), 1 ], + + [new THREE.Vector3(4+offset2 ,gridSize/2.0 ,0) ,new THREE.Vector3(6+offset2 ,gridSize/2.0 ,0) ,2 ], + [new THREE.Vector3(gridSize-4-offset2 ,gridSize/2.0 ,0) ,new THREE.Vector3(gridSize-2-offset2 ,gridSize/2.0 ,0) ,2 ], + [new THREE.Vector3(gridSize/2.0 ,2+offset2 ,0) ,new THREE.Vector3(gridSize/2.0 ,4+offset2 ,0) ,2 ], + [new THREE.Vector3(gridSize/2.0 ,gridSize-2-offset2 ,0) ,new THREE.Vector3(gridSize/2.0 ,gridSize-4-offset2 ,0) ,2 ], + + [new THREE.Vector3(gridSize-offset-4 ,4 ,0) ,new THREE.Vector3(gridSize-offset-4 ,8 ,0) ,4 ], + + + ]; + + var depositLocations=[ + + [new THREE.Vector3(offset+0 ,offset+0 ,0) ,new THREE.Vector3(-2,-2,0)], + [new THREE.Vector3(offset+0 ,(gridSize-offset-4), 0) ,new THREE.Vector3(-2,2,0) ], + [new THREE.Vector3(gridSize-offset-4 ,offset+0 ,0) ,new THREE.Vector3(2,-2,0) ], + [new THREE.Vector3(gridSize-offset-4 ,(gridSize-offset-4), 0) ,new THREE.Vector3(2,2,0) ], + + [new THREE.Vector3(offset+0 ,(gridSize/2.0-2), 0) ,new THREE.Vector3(-2,0,0) ], + [new THREE.Vector3(gridSize/2.0-2 ,offset+0 ,0) ,new THREE.Vector3(0,-2,0) ], + [new THREE.Vector3(gridSize/2.0-2 ,(gridSize-offset-2), 0) ,new THREE.Vector3(0,2,0) ], + [new THREE.Vector3(gridSize-offset-2 ,(gridSize/2.0-2), 0) ,new THREE.Vector3(2,0,0) ], + + + [new THREE.Vector3(4 +offset2 ,gridSize/2.0 ,0),new THREE.Vector3(-6,0,0)], + [new THREE.Vector3(gridSize-4-offset2 ,gridSize/2.0 ,0),new THREE.Vector3(6,0,0)], + [new THREE.Vector3(gridSize/2.0 ,4+offset2 ,0),new THREE.Vector3(0,-6,0)], + [new THREE.Vector3(gridSize/2.0 ,gridSize-4-offset2 ,0),new THREE.Vector3(0,6,0)], + + [new THREE.Vector3(gridSize-offset-4 ,4 ,0),new THREE.Vector3(0,0,0)], + + ]; + + var hierarchical=true; + + var buildType=["frepCube","frep","directions","list","sdfList","sdfList"]; + + var buildList,recursiveSwarms; + + $.getJSON("../asdf/json/cubeCone4.json", function(json) { + console.log(json); + //todo move this to other document + var scale=1/0.1875; + var shift=gridSize/2.0; + + buildList=createBuildList (json,scale,shift); + + var setup={ + three:'webgl', + voxelSpacing:3.0, + viz:{ + speed:1000, + showGUI:false, + saveAngleData:false, + }, + robotGeometry:{ + leg1:5, + leg2:5, + offset:2 + }, + path:{ + showPath:false, + number:10, //number of divisions/points + cHeight:1.5 //parabola height (will be multiplied later by voxelSpacing) + + }, + robotLocations:robotLocations, + depositLocations:depositLocations, + hierarchical:true, + buildType:"sdfList", + buildList:buildList , + gridSize:gridSize, + + + }; + + + var t=new THREE.Vector3(0,0,0); + + recursiveSwarms=new Swarm(setup); + + recursiveSwarms.camera.position.set(200*recursiveSwarms.gridSize/40, 200*recursiveSwarms.gridSize/40, 100*recursiveSwarms.gridSize/40);//general + recursiveSwarms.cameraControls.target.set( 0, 0, -40*recursiveSwarms.gridSize/30 );//general + + + + }); + + + + + </script> + + + + +</body> +</html> \ No newline at end of file diff --git a/recursive_swarm/demos/indexHierarchyExplanation.html b/recursive_swarm/demos/indexHierarchyExplanation.html new file mode 100644 index 0000000000000000000000000000000000000000..1e2a78caafb8616157fc59f02649bf841be4e70a --- /dev/null +++ b/recursive_swarm/demos/indexHierarchyExplanation.html @@ -0,0 +1,216 @@ +<!-- // Amira Abdel-Rahman --> +<!-- // (c) Massachusetts Institute of Technology 2020 --> + +<!DOCTYPE html> +<html> +<head> + <title>Hierarchy Explained</title> + +</head> +<body> + <!-- <a download="info.txt" id="downloadlink" style="display: none">Download</a> --> + + <div id="webgl"></div> + + <script src="../lib/three.min.js"></script> + <script src="../lib/OrbitControls.js"></script> + <script src="../lib/OBJLoader.js"></script> + <script src="../lib/dat.gui.min.js"></script> + <script src="../lib/TransformControls.js"></script> + <script src="../lib/GPUComputationRenderer.js"></script> + + <script src="../js/voxel.js"></script> + + <script src="../js/swarm.js"></script> + <script src="../js/swarm_geometry.js"></script> + <script src="../js/swarm_gui.js"></script> + <script src="../js/swarm_IK.js"></script> + <script src="../js/swarm_move.js"></script> + <script src="../js/swarm_path.js"></script> + <script src="../js/swarm_step.js"></script> + <script src="../js/swarm_three.js"></script> + <script src="../js/swarm_voxel.js"></script> + + <script> + + var voxelSpacing=3.0; + var three='webgl'; + var speed=1000; + var offset=8; + var buildSize=12; + var gridSize=buildSize+2*offset; + + var robotLocations=[ + // [new THREE.Vector3(offset+2 ,offset+0 ,0) ,new THREE.Vector3(offset+0 ,offset+0 ,0),2], + // [new THREE.Vector3(offset+0 ,gridSize-offset-1 ,0) ,new THREE.Vector3(offset+0 ,gridSize-offset-2 ,0),1], + // [new THREE.Vector3((gridSize-offset-2),offset+1 ,0) ,new THREE.Vector3((gridSize-offset-2),offset+0 ,0),1], + [new THREE.Vector3((gridSize-offset-2)+4,gridSize-offset -4,0) ,new THREE.Vector3((gridSize-offset-2)+4,(gridSize-offset-2)-4,0),1], + [new THREE.Vector3((gridSize-offset-2)+4,gridSize-offset -4,0) ,new THREE.Vector3((gridSize-offset-2)+4,(gridSize-offset-2)-4,0),2], + + [new THREE.Vector3((gridSize-offset-2)-4,gridSize-offset +4,0) ,new THREE.Vector3((gridSize-offset-2)-4,(gridSize-offset-1)+4,0),1], + + // [new THREE.Vector3((gridSize-offset-2),gridSize-offset ,0) ,new THREE.Vector3((gridSize-offset-2),(gridSize-offset-2),0),3], + + // [new THREE.Vector3((gridSize-offset-5),gridSize-offset-1 ,0) ,new THREE.Vector3((gridSize-offset-5),(gridSize-offset-2),0),1], + // [new THREE.Vector3((offset+4),gridSize-offset-1 ,0) ,new THREE.Vector3((offset+4),(gridSize-offset-2),0),1], + + + // [new THREE.Vector3((gridSize-offset-5),offset+1 ,0) ,new THREE.Vector3((gridSize-offset-5),(offset-0),0),1], + // [new THREE.Vector3((offset+4),offset+1 ,0) ,new THREE.Vector3((offset+4),(offset-0),0),1], + + + // [new THREE.Vector3((offset+2) ,(offset+0) ,0) ,new THREE.Vector3(offset+0 ,offset+0 ,0),2] + ]; + + var depositLocations=[ + // [new THREE.Vector3(offset+0 ,offset+0 ,0) ], + // [new THREE.Vector3(offset+0 ,(gridSize-offset-2), 0) ], + // [new THREE.Vector3(gridSize-offset-2 ,offset+0 ,0) ], + [new THREE.Vector3(gridSize-offset-2+4 ,(gridSize-offset-2)-4, 0) ], + [new THREE.Vector3(gridSize-offset-2+4 ,(gridSize-offset-2)-4, 0) ], + + [new THREE.Vector3(gridSize-offset-2-4 ,(gridSize-offset-2)+4, 0) ], + + // [new THREE.Vector3((gridSize-offset-5),gridSize-offset-2 , 0) ], + // [new THREE.Vector3((offset+4),gridSize-offset-2, 0) ], + // [new THREE.Vector3((gridSize-offset-5),offset+0, 0) ], + // [new THREE.Vector3((offset+4),offset+0, 0) ], + // [new THREE.Vector3(gridSize-offset-2 ,(gridSize-offset-2), 0) ], + ]; + var hierarchical=true; + + var buildType=["frepCube","frep","directions","list"]; + + var setup={ + three:'webgl', + voxelSpacing:3.0, + viz:{ + speed:1000, + showGUI:false, + saveAngleData:false, + }, + robotGeometry:{ + leg1:6, + leg2:6, + offset:3 + }, + path:{ + showPath:false, + number:20, //number of divisions/points + cHeight:1.5 //parabola height (will be multiplied later by voxelSpacing) + + }, + robotLocations:robotLocations, + depositLocations:depositLocations, + hierarchical:true, + buildType:"list", + gridSize:gridSize, + + + }; + + + + var recursiveSwarms=new Swarm(setup); + recursiveSwarms.camera.position.set(200*recursiveSwarms.gridSize/40, 200*recursiveSwarms.gridSize/40, 150*recursiveSwarms.gridSize/40);//general + + + recursiveSwarms.path[1].delay=2*recursiveSwarms.path[1].delay; + + + var scenario=1; + + var count=0; + var list=[] + + list.push(new THREE.Vector3(gridSize/2-2+2 +4 ,gridSize/2-2+2 -4 ,1+0)); + + list.push(new THREE.Vector3(gridSize/2-2+0 +4 ,gridSize/2-2+2 -4 ,1+0)); + list.push(new THREE.Vector3(gridSize/2-2+2 +4 ,gridSize/2-2+0 -4 ,1+0)); + + list.push(new THREE.Vector3(gridSize/2-2+0 +4 ,gridSize/2-2+0 -4 ,1+0)); + + + list.push(new THREE.Vector3(gridSize/2-2+2 +4 ,gridSize/2-2+2 -4 ,1+2)); + + list.push(new THREE.Vector3(gridSize/2-2+0 +4 ,gridSize/2-2+2 -4 ,1+2)); + list.push(new THREE.Vector3(gridSize/2-2+2 +4 ,gridSize/2-2+0 -4 ,1+2)); + + list.push(new THREE.Vector3(gridSize/2-2+0 +4 ,gridSize/2-2+0 -4 ,1+2)); + + + + + + + + + next(); + // recursiveSwarms.voxelList[0].list=[new THREE.Vector3(3,0,1)]; + // recursiveSwarms.startMovement(0,true); + function next(){ + console.log("herrr!!") + if(count%2==0){ + if(list.length>0){ + recursiveSwarms.THREESimulationRobot[1].visible=false; + recursiveSwarms.THREESimulationRobot[0].visible=true; + recursiveSwarms.voxelList[0].list=[]; + + recursiveSwarms.voxelList[0].list.push(new THREE.Vector3(gridSize-offset-2+2+1 +4 ,(gridSize-offset-2)+2+1 -4 ,1+0)); + recursiveSwarms.voxelList[0].list.push(new THREE.Vector3(gridSize-offset-2+2+0 +4 ,(gridSize-offset-2)+2+1 -4 ,1+0)); + recursiveSwarms.voxelList[0].list.push(new THREE.Vector3(gridSize-offset-2+2+1 +4 ,(gridSize-offset-2)+2+0 -4 ,1+0)); + recursiveSwarms.voxelList[0].list.push(new THREE.Vector3(gridSize-offset-2+2+0 +4 ,(gridSize-offset-2)+2+0 -4 ,1+0)); + recursiveSwarms.voxelList[0].list.push(new THREE.Vector3(gridSize-offset-2+2+1 +4 ,(gridSize-offset-2)+2+1 -4 ,1+1)); + recursiveSwarms.voxelList[0].list.push(new THREE.Vector3(gridSize-offset-2+2+0 +4 ,(gridSize-offset-2)+2+1 -4 ,1+1)); + recursiveSwarms.voxelList[0].list.push(new THREE.Vector3(gridSize-offset-2+2+1 +4 ,(gridSize-offset-2)+2+0 -4 ,1+1)); + recursiveSwarms.voxelList[0].list.push(new THREE.Vector3(gridSize-offset-2+2+0 +4 ,(gridSize-offset-2)+2+0 -4 ,1+1)); + + recursiveSwarms.startMovement(0,true); + + } + + + }else{ + recursiveSwarms.THREESimulationRobot[0].visible=false; + recursiveSwarms.THREESimulationRobot[1].visible=true; + recursiveSwarms.voxelList[1].list=[list[0]]; + list.shift() + + recursiveSwarms.deleteVoxelAt(0,new THREE.Vector3(gridSize-offset-2+2+1 +4 ,(gridSize-offset-2)+2+1 -4 ,1+0)); + recursiveSwarms.deleteVoxelAt(0,new THREE.Vector3(gridSize-offset-2+2+0 +4 ,(gridSize-offset-2)+2+1 -4 ,1+0)); + recursiveSwarms.deleteVoxelAt(0,new THREE.Vector3(gridSize-offset-2+2+1 +4 ,(gridSize-offset-2)+2+0 -4 ,1+0)); + recursiveSwarms.deleteVoxelAt(0,new THREE.Vector3(gridSize-offset-2+2+0 +4 ,(gridSize-offset-2)+2+0 -4 ,1+1)); + recursiveSwarms.deleteVoxelAt(0,new THREE.Vector3(gridSize-offset-2+2+1 +4 ,(gridSize-offset-2)+2+1 -4 ,1+1)); + recursiveSwarms.deleteVoxelAt(0,new THREE.Vector3(gridSize-offset-2+2+0 +4 ,(gridSize-offset-2)+2+1 -4 ,1+1)); + recursiveSwarms.deleteVoxelAt(0,new THREE.Vector3(gridSize-offset-2+2+1 +4 ,(gridSize-offset-2)+2+0 -4 ,1+1)); + + recursiveSwarms.startMovement(1,true); + } + count++; + + + + + } + + + recursiveSwarms.voxelList[2].list=[]; + for(var i=0;i<4;i++){ + for(var j=0;j<4;j++){ + for(var k=0;k<4;k++){ + recursiveSwarms.voxelList[2].list.push(new THREE.Vector3(gridSize-offset-2 -3-4-j ,(gridSize-offset-2)-3+4-k, 1+i)) + + } + } + } + recursiveSwarms.startMovement(2,true); + + + + </script> + + + + +</body> +</html> \ No newline at end of file diff --git a/recursive_swarm/js/decision/d3-dependencies.csv b/recursive_swarm/js/decision/d3-dependencies.csv new file mode 100644 index 0000000000000000000000000000000000000000..aa8727d0a206f4b74819cad5fa11a601cad8410a --- /dev/null +++ b/recursive_swarm/js/decision/d3-dependencies.csv @@ -0,0 +1,464 @@ +size,path +,d3 +,d3/d3-array +,d3/d3-array/threshold +,d3/d3-axis +,d3/d3-brush +,d3/d3-chord +,d3/d3-collection +,d3/d3-color +,d3/d3-dispatch +,d3/d3-drag +,d3/d3-dsv +,d3/d3-ease +,d3/d3-force +,d3/d3-format +,d3/d3-geo +,d3/d3-geo/clip +,d3/d3-geo/path +,d3/d3-geo/projection +,d3/d3-hierarchy +,d3/d3-hierarchy/hierarchy +,d3/d3-hierarchy/pack +,d3/d3-hierarchy/treemap +,d3/d3-interpolate +,d3/d3-interpolate/transform +,d3/d3-path +,d3/d3-polygon +,d3/d3-quadtree +,d3/d3-queue +,d3/d3-random +,d3/d3-request +,d3/d3-scale +,d3/d3-selection +,d3/d3-selection/selection +,d3/d3-shape +,d3/d3-shape/curve +,d3/d3-shape/offset +,d3/d3-shape/order +,d3/d3-shape/symbol +,d3/d3-time-format +,d3/d3-time +,d3/d3-timer +,d3/d3-transition +,d3/d3-transition/selection +,d3/d3-transition/transition +,d3/d3-voronoi +,d3/d3-zoom +90,d3/d3-array/array.js +86,d3/d3-array/ascending.js +238,d3/d3-array/bisect.js +786,d3/d3-array/bisector.js +72,d3/d3-array/constant.js +86,d3/d3-array/descending.js +135,d3/d3-array/deviation.js +553,d3/d3-array/extent.js +1876,d3/d3-array/histogram.js +43,d3/d3-array/identity.js +451,d3/d3-array/max.js +362,d3/d3-array/mean.js +452,d3/d3-array/median.js +339,d3/d3-array/merge.js +451,d3/d3-array/min.js +63,d3/d3-array/number.js +182,d3/d3-array/pairs.js +161,d3/d3-array/permute.js +416,d3/d3-array/quantile.js +344,d3/d3-array/range.js +357,d3/d3-array/scan.js +285,d3/d3-array/shuffle.js +295,d3/d3-array/sum.js +361,d3/d3-array/threshold/freedmanDiaconis.js +180,d3/d3-array/threshold/scott.js +96,d3/d3-array/threshold/sturges.js +672,d3/d3-array/ticks.js +356,d3/d3-array/transpose.js +540,d3/d3-array/variance.js +99,d3/d3-array/zip.js +42,d3/d3-axis/array.js +5239,d3/d3-axis/axis.js +43,d3/d3-axis/identity.js +15778,d3/d3-brush/brush.js +72,d3/d3-brush/constant.js +127,d3/d3-brush/event.js +202,d3/d3-brush/noevent.js +42,d3/d3-chord/array.js +3178,d3/d3-chord/chord.js +72,d3/d3-chord/constant.js +159,d3/d3-chord/math.js +2340,d3/d3-chord/ribbon.js +137,d3/d3-collection/entries.js +104,d3/d3-collection/keys.js +1988,d3/d3-collection/map.js +2021,d3/d3-collection/nest.js +800,d3/d3-collection/set.js +115,d3/d3-collection/values.js +9276,d3/d3-color/color.js +1855,d3/d3-color/cubehelix.js +340,d3/d3-color/define.js +3167,d3/d3-color/lab.js +72,d3/d3-color/math.js +2729,d3/d3-dispatch/dispatch.js +72,d3/d3-drag/constant.js +4297,d3/d3-drag/drag.js +430,d3/d3-drag/event.js +857,d3/d3-drag/nodrag.js +202,d3/d3-drag/noevent.js +199,d3/d3-dsv/csv.js +3582,d3/d3-dsv/dsv.js +200,d3/d3-dsv/tsv.js +653,d3/d3-ease/back.js +521,d3/d3-ease/bounce.js +261,d3/d3-ease/circle.js +210,d3/d3-ease/cubic.js +1309,d3/d3-ease/elastic.js +251,d3/d3-ease/exp.js +43,d3/d3-ease/linear.js +596,d3/d3-ease/poly.js +192,d3/d3-ease/quad.js +236,d3/d3-ease/sin.js +654,d3/d3-force/center.js +2447,d3/d3-force/collide.js +72,d3/d3-force/constant.js +69,d3/d3-force/jiggle.js +3213,d3/d3-force/link.js +3181,d3/d3-force/manyBody.js +3444,d3/d3-force/simulation.js +1030,d3/d3-force/x.js +1030,d3/d3-force/y.js +361,d3/d3-format/defaultLocale.js +134,d3/d3-format/exponent.js +656,d3/d3-format/formatDecimal.js +368,d3/d3-format/formatDefault.js +475,d3/d3-format/formatGroup.js +611,d3/d3-format/formatPrefixAuto.js +458,d3/d3-format/formatRounded.js +1589,d3/d3-format/formatSpecifier.js +846,d3/d3-format/formatTypes.js +5247,d3/d3-format/locale.js +119,d3/d3-format/precisionFixed.js +190,d3/d3-format/precisionPrefix.js +186,d3/d3-format/precisionRound.js +906,d3/d3-geo/adder.js +1958,d3/d3-geo/area.js +5361,d3/d3-geo/bounds.js +929,d3/d3-geo/cartesian.js +3816,d3/d3-geo/centroid.js +2373,d3/d3-geo/circle.js +2897,d3/d3-geo/clip/antimeridian.js +470,d3/d3-geo/clip/buffer.js +5956,d3/d3-geo/clip/circle.js +5527,d3/d3-geo/clip/extent.js +3813,d3/d3-geo/clip/index.js +1099,d3/d3-geo/clip/line.js +2802,d3/d3-geo/clip/polygon.js +250,d3/d3-geo/compose.js +72,d3/d3-geo/constant.js +229,d3/d3-geo/distance.js +3034,d3/d3-geo/graticule.js +43,d3/d3-geo/identity.js +911,d3/d3-geo/interpolate.js +1309,d3/d3-geo/length.js +880,d3/d3-geo/math.js +34,d3/d3-geo/noop.js +945,d3/d3-geo/path/area.js +485,d3/d3-geo/path/bounds.js +2033,d3/d3-geo/path/centroid.js +914,d3/d3-geo/path/context.js +1690,d3/d3-geo/path/index.js +1149,d3/d3-geo/path/string.js +139,d3/d3-geo/pointEqual.js +2491,d3/d3-geo/polygonContains.js +235,d3/d3-geo/projection/albers.js +3986,d3/d3-geo/projection/albersUsa.js +502,d3/d3-geo/projection/azimuthal.js +447,d3/d3-geo/projection/azimuthalEqualArea.js +443,d3/d3-geo/projection/azimuthalEquidistant.js +402,d3/d3-geo/projection/conic.js +1017,d3/d3-geo/projection/conicConformal.js +871,d3/d3-geo/projection/conicEqualArea.js +771,d3/d3-geo/projection/conicEquidistant.js +314,d3/d3-geo/projection/cylindricalEqualArea.js +253,d3/d3-geo/projection/equirectangular.js +910,d3/d3-geo/projection/fit.js +387,d3/d3-geo/projection/gnomonic.js +1922,d3/d3-geo/projection/identity.js +3752,d3/d3-geo/projection/index.js +1119,d3/d3-geo/projection/mercator.js +376,d3/d3-geo/projection/orthographic.js +3275,d3/d3-geo/projection/resample.js +436,d3/d3-geo/projection/stereographic.js +762,d3/d3-geo/projection/transverseMercator.js +2509,d3/d3-geo/rotation.js +2305,d3/d3-geo/stream.js +701,d3/d3-geo/transform.js +166,d3/d3-hierarchy/accessors.js +2093,d3/d3-hierarchy/cluster.js +120,d3/d3-hierarchy/constant.js +138,d3/d3-hierarchy/hierarchy/ancestors.js +121,d3/d3-hierarchy/hierarchy/descendants.js +381,d3/d3-hierarchy/hierarchy/each.js +353,d3/d3-hierarchy/hierarchy/eachAfter.js +282,d3/d3-hierarchy/hierarchy/eachBefore.js +1819,d3/d3-hierarchy/hierarchy/index.js +164,d3/d3-hierarchy/hierarchy/leaves.js +246,d3/d3-hierarchy/hierarchy/links.js +606,d3/d3-hierarchy/hierarchy/path.js +151,d3/d3-hierarchy/hierarchy/sort.js +264,d3/d3-hierarchy/hierarchy/sum.js +2452,d3/d3-hierarchy/pack/enclose.js +1917,d3/d3-hierarchy/pack/index.js +389,d3/d3-hierarchy/pack/shuffle.js +3497,d3/d3-hierarchy/pack/siblings.js +1266,d3/d3-hierarchy/partition.js +1934,d3/d3-hierarchy/stratify.js +7060,d3/d3-hierarchy/tree.js +1184,d3/d3-hierarchy/treemap/binary.js +309,d3/d3-hierarchy/treemap/dice.js +2810,d3/d3-hierarchy/treemap/index.js +1029,d3/d3-hierarchy/treemap/resquarify.js +166,d3/d3-hierarchy/treemap/round.js +309,d3/d3-hierarchy/treemap/slice.js +170,d3/d3-hierarchy/treemap/sliceDice.js +1868,d3/d3-hierarchy/treemap/squarify.js +372,d3/d3-interpolate/array.js +600,d3/d3-interpolate/basis.js +360,d3/d3-interpolate/basisClosed.js +697,d3/d3-interpolate/color.js +72,d3/d3-interpolate/constant.js +760,d3/d3-interpolate/cubehelix.js +134,d3/d3-interpolate/date.js +547,d3/d3-interpolate/hcl.js +547,d3/d3-interpolate/hsl.js +447,d3/d3-interpolate/lab.js +100,d3/d3-interpolate/number.js +390,d3/d3-interpolate/object.js +163,d3/d3-interpolate/quantize.js +1277,d3/d3-interpolate/rgb.js +112,d3/d3-interpolate/round.js +1758,d3/d3-interpolate/string.js +672,d3/d3-interpolate/transform/decompose.js +2064,d3/d3-interpolate/transform/index.js +980,d3/d3-interpolate/transform/parse.js +598,d3/d3-interpolate/value.js +1387,d3/d3-interpolate/zoom.js +4089,d3/d3-path/path.js +243,d3/d3-polygon/area.js +346,d3/d3-polygon/centroid.js +411,d3/d3-polygon/contains.js +402,d3/d3-polygon/cross.js +1710,d3/d3-polygon/hull.js +375,d3/d3-polygon/length.js +2441,d3/d3-quadtree/add.js +1667,d3/d3-quadtree/cover.js +170,d3/d3-quadtree/data.js +206,d3/d3-quadtree/extent.js +1696,d3/d3-quadtree/find.js +134,d3/d3-quadtree/quad.js +2077,d3/d3-quadtree/quadtree.js +1898,d3/d3-quadtree/remove.js +51,d3/d3-quadtree/root.js +155,d3/d3-quadtree/size.js +695,d3/d3-quadtree/visit.js +773,d3/d3-quadtree/visitAfter.js +138,d3/d3-quadtree/x.js +138,d3/d3-quadtree/y.js +29,d3/d3-queue/array.js +2870,d3/d3-queue/queue.js +168,d3/d3-random/bates.js +113,d3/d3-random/exponential.js +137,d3/d3-random/irwinHall.js +178,d3/d3-random/logNormal.js +503,d3/d3-random/normal.js +236,d3/d3-random/uniform.js +101,d3/d3-request/csv.js +517,d3/d3-request/dsv.js +157,d3/d3-request/html.js +127,d3/d3-request/json.js +4593,d3/d3-request/request.js +109,d3/d3-request/text.js +118,d3/d3-request/tsv.js +370,d3/d3-request/type.js +174,d3/d3-request/xml.js +90,d3/d3-scale/array.js +2637,d3/d3-scale/band.js +119,d3/d3-scale/category10.js +179,d3/d3-scale/category20.js +179,d3/d3-scale/category20b.js +179,d3/d3-scale/category20c.js +101,d3/d3-scale/colors.js +72,d3/d3-scale/constant.js +3328,d3/d3-scale/continuous.js +188,d3/d3-scale/cubehelix.js +463,d3/d3-scale/identity.js +1206,d3/d3-scale/linear.js +3273,d3/d3-scale/log.js +340,d3/d3-scale/nice.js +44,d3/d3-scale/number.js +1116,d3/d3-scale/ordinal.js +1000,d3/d3-scale/pow.js +1280,d3/d3-scale/quantile.js +1066,d3/d3-scale/quantize.js +536,d3/d3-scale/rainbow.js +717,d3/d3-scale/sequential.js +802,d3/d3-scale/threshold.js +1203,d3/d3-scale/tickFormat.js +4565,d3/d3-scale/time.js +379,d3/d3-scale/utcTime.js +6471,d3/d3-scale/viridis.js +72,d3/d3-selection/constant.js +662,d3/d3-selection/creator.js +536,d3/d3-selection/local.js +533,d3/d3-selection/matcher.js +224,d3/d3-selection/mouse.js +303,d3/d3-selection/namespace.js +254,d3/d3-selection/namespaces.js +448,d3/d3-selection/point.js +259,d3/d3-selection/select.js +282,d3/d3-selection/selectAll.js +235,d3/d3-selection/selection/append.js +1460,d3/d3-selection/selection/attr.js +134,d3/d3-selection/selection/call.js +1740,d3/d3-selection/selection/classed.js +3597,d3/d3-selection/selection/data.js +132,d3/d3-selection/selection/datum.js +869,d3/d3-selection/selection/dispatch.js +289,d3/d3-selection/selection/each.js +53,d3/d3-selection/selection/empty.js +792,d3/d3-selection/selection/enter.js +176,d3/d3-selection/selection/exit.js +546,d3/d3-selection/selection/filter.js +520,d3/d3-selection/selection/html.js +2216,d3/d3-selection/selection/index.js +468,d3/d3-selection/selection/insert.js +171,d3/d3-selection/selection/lower.js +575,d3/d3-selection/selection/merge.js +258,d3/d3-selection/selection/node.js +140,d3/d3-selection/selection/nodes.js +3119,d3/d3-selection/selection/on.js +367,d3/d3-selection/selection/order.js +617,d3/d3-selection/selection/property.js +138,d3/d3-selection/selection/raise.js +153,d3/d3-selection/selection/remove.js +653,d3/d3-selection/selection/select.js +550,d3/d3-selection/selection/selectAll.js +98,d3/d3-selection/selection/size.js +681,d3/d3-selection/selection/sort.js +71,d3/d3-selection/selection/sparse.js +889,d3/d3-selection/selection/style.js +528,d3/d3-selection/selection/text.js +152,d3/d3-selection/selector.js +171,d3/d3-selection/selectorAll.js +175,d3/d3-selection/sourceEvent.js +407,d3/d3-selection/touch.js +323,d3/d3-selection/touches.js +218,d3/d3-selection/window.js +8831,d3/d3-shape/arc.js +2917,d3/d3-shape/area.js +42,d3/d3-shape/array.js +81,d3/d3-shape/constant.js +1436,d3/d3-shape/curve/basis.js +1530,d3/d3-shape/curve/basisClosed.js +1069,d3/d3-shape/curve/basisOpen.js +1081,d3/d3-shape/curve/bundle.js +1633,d3/d3-shape/curve/cardinal.js +1605,d3/d3-shape/curve/cardinalClosed.js +1288,d3/d3-shape/curve/cardinalOpen.js +2637,d3/d3-shape/curve/catmullRom.js +2083,d3/d3-shape/curve/catmullRomClosed.js +1760,d3/d3-shape/curve/catmullRomOpen.js +738,d3/d3-shape/curve/linear.js +514,d3/d3-shape/curve/linearClosed.js +3203,d3/d3-shape/curve/monotone.js +1761,d3/d3-shape/curve/natural.js +655,d3/d3-shape/curve/radial.js +1367,d3/d3-shape/curve/step.js +86,d3/d3-shape/descending.js +43,d3/d3-shape/identity.js +1516,d3/d3-shape/line.js +106,d3/d3-shape/math.js +29,d3/d3-shape/noop.js +319,d3/d3-shape/offset/expand.js +310,d3/d3-shape/offset/none.js +314,d3/d3-shape/offset/silhouette.js +740,d3/d3-shape/offset/wiggle.js +305,d3/d3-shape/order/ascending.js +112,d3/d3-shape/order/descending.js +545,d3/d3-shape/order/insideOut.js +120,d3/d3-shape/order/none.js +97,d3/d3-shape/order/reverse.js +2336,d3/d3-shape/pie.js +81,d3/d3-shape/point.js +934,d3/d3-shape/radialArea.js +396,d3/d3-shape/radialLine.js +1432,d3/d3-shape/stack.js +186,d3/d3-shape/symbol/circle.js +476,d3/d3-shape/symbol/cross.js +307,d3/d3-shape/symbol/diamond.js +137,d3/d3-shape/symbol/square.js +609,d3/d3-shape/symbol/star.js +255,d3/d3-shape/symbol/triangle.js +733,d3/d3-shape/symbol/wye.js +1160,d3/d3-shape/symbol.js +867,d3/d3-time-format/defaultLocale.js +284,d3/d3-time-format/isoFormat.js +319,d3/d3-time-format/isoParse.js +13876,d3/d3-time-format/locale.js +462,d3/d3-time/day.js +164,d3/d3-time/duration.js +569,d3/d3-time/hour.js +1845,d3/d3-time/interval.js +668,d3/d3-time/millisecond.js +437,d3/d3-time/minute.js +414,d3/d3-time/month.js +440,d3/d3-time/second.js +397,d3/d3-time/utcDay.js +399,d3/d3-time/utcHour.js +412,d3/d3-time/utcMinute.js +453,d3/d3-time/utcMonth.js +979,d3/d3-time/utcWeek.js +808,d3/d3-time/utcYear.js +963,d3/d3-time/week.js +754,d3/d3-time/year.js +400,d3/d3-timer/interval.js +250,d3/d3-timer/timeout.js +2771,d3/d3-timer/timer.js +484,d3/d3-transition/active.js +665,d3/d3-transition/interrupt.js +245,d3/d3-transition/selection/index.js +138,d3/d3-transition/selection/interrupt.js +1090,d3/d3-transition/selection/transition.js +2473,d3/d3-transition/transition/attr.js +904,d3/d3-transition/transition/attrTween.js +510,d3/d3-transition/transition/delay.js +528,d3/d3-transition/transition/duration.js +348,d3/d3-transition/transition/ease.js +574,d3/d3-transition/transition/filter.js +1892,d3/d3-transition/transition/index.js +340,d3/d3-transition/transition/interpolate.js +653,d3/d3-transition/transition/merge.js +853,d3/d3-transition/transition/on.js +284,d3/d3-transition/transition/remove.js +4792,d3/d3-transition/transition/schedule.js +826,d3/d3-transition/transition/select.js +883,d3/d3-transition/transition/selectAll.js +174,d3/d3-transition/transition/selection.js +2119,d3/d3-transition/transition/style.js +607,d3/d3-transition/transition/styleTween.js +473,d3/d3-transition/transition/text.js +691,d3/d3-transition/transition/transition.js +2026,d3/d3-transition/transition/tween.js +4381,d3/d3-voronoi/Beach.js +4087,d3/d3-voronoi/Cell.js +1632,d3/d3-voronoi/Circle.js +72,d3/d3-voronoi/constant.js +3415,d3/d3-voronoi/Diagram.js +3634,d3/d3-voronoi/Edge.js +81,d3/d3-voronoi/point.js +5302,d3/d3-voronoi/RedBlackTree.js +1420,d3/d3-voronoi/voronoi.js +72,d3/d3-zoom/constant.js +137,d3/d3-zoom/event.js +202,d3/d3-zoom/noevent.js +1336,d3/d3-zoom/transform.js +12133,d3/d3-zoom/zoom.js \ No newline at end of file diff --git a/recursive_swarm/js/decision/decision.js b/recursive_swarm/js/decision/decision.js new file mode 100644 index 0000000000000000000000000000000000000000..f3155e36f2abc100636fe9349468d6ad88593d57 --- /dev/null +++ b/recursive_swarm/js/decision/decision.js @@ -0,0 +1,1201 @@ +// Amira Abdel-Rahman +// (c) Massachusetts Institute of Technology 2020 + + + +var buildList=[]; +var voxelIndexList; +var scale,setup; +setup={}; +setup.nodes=[]; +setup.edges=[]; +setup.viz={}; +setup.viz.colorMaps=[YlGnBu,coolwarm, winter ,jet]; +var colormap=YlGnBu; +var maxOrder; + +var Graph,gData; +var Graph1; + +var Robots; +var minCost=Infinity; +var minNodePath= "" ; + +function decisionTree(){ + Robots=[ + null, + { + size:1, + maxNum:4, + num:0 + }, + { + size:2, + maxNum:4, + num:0 + }, + null, + { + size:1, + maxNum:1, + num:0 + } + ]; + scale=400; + + + Robots[1].num++; + setup.nodes.push({ + path:"", + // name:"["+Robots[4].num +","+ Robots[2].num+","+ Robots[1].num+"]", + name:"Decision Tree", + size:scale, + min:false, + parent:"top" + }); + + + // console.log(estimateCost(Robots,"")); + + decision(setup,Robots,1,""); + + console.log("Min Node:"+minNodePath+"!!!"); + + var node=setup.nodes.filter(n => n.path==minNodePath)[0]; + node.min=true; + while(node.parent != "top"){ + var edge=setup.edges.filter(e => (e.source==node.parent) &&(e.target==node.path))[0]; + edge.min=true; + node=setup.nodes.filter(n => n.path==node.parent)[0]; + } + + var nodes=setup.nodes; + var links=setup.edges; + + Graph(document.getElementById('graph')).graphData({ nodes, links }); + + +} + +function decision(setup,robots,size,name){ + + + setup.nodes.push({ + path:name+"b", + type:"build", + // name:"expand:"+0, + // name:"["+robots[4].num +","+ robots[2].num+","+ robots[1].num+"] build cost:"+estimateCost(robots,name+"b"), + name:"Build Cost:"+estimateCost(robots,name+"b"), + size:scale, + parent:name, + min:false, + }); + setup.edges.push({source: name, target: name+"b",min:false}); + + + if(robots[size].num<robots[size].maxNum){ + var r=JSON.parse(JSON.stringify(robots)); + r[size].num++; + setup.nodes.push({ + path:name+"r", + type:"reproduce", + // name:"reproduce: ["+r[4].num +","+ r[2].num+","+ r[1].num+"]", + name:"Reproduce", + size:scale, + parent:name, + min:false, + + }); + setup.edges.push({source: name, target: name+"r",min:false}); + + //for each robot here propagate decision + decision(setup,r,size,name+"r"); + + } + + if(size<=2 && robots[size*2].num<robots[size*2].maxNum){ + var r=JSON.parse(JSON.stringify(robots)); + r[size*2].num++; + setup.nodes.push({ + path:name+"g", + type:"grow", + // name:"grow: ["+r[4].num +","+ r[2].num+","+ r[1].num+"]", + name:"Grow", + size:scale, + parent:name, + min:false, + + }); + setup.edges.push({source: name, target: name+"g",min:false});; + decision(setup,r,size*2,name+"g") + + } + + +} + +function estimateCost(robots,path){ + var cost =0; + //fisrt add cost of building robots + cost+=recursionCost(robots); + + var binZ=buildList.listZ[buildList.currentZIndex]; + var binSize=binZ.listSize[binZ.currentSizeIndex]; + var binSDF=binSize.listSDF[binSize.currentSDFIndex]; + + var indexZ=buildList.currentZIndex; + var indexSize=binZ.currentSizeIndex; + var indexSDF=binSize.currentSDFIndex; + + var maxIndexZ=buildList.maxZIndex; + var maxIndexSize=binZ.maxSizeIndex; + var maxIndexSDF=binSize.maxSDFIndex; + + for(var i=0;i<buildList.listZ.length;i++){ //for each z layer bin + binZ=buildList.listZ[i]; + indexZ=i; + maxIndexSize=binZ.maxSizeIndex; + + for(var j=0;j<binZ.listSize.length;j++){ //for each size bin + binSize=binZ.listSize[j]; + indexSize=j; + maxIndexSDF=binSize.maxSDFIndex; + + for(var k=0;k<binSize.listSDF.length;k++){ //for each sdf bin (signed distance field) + binSDF=binSize.listSDF[k]; + indexSDF=k; + var cubesToBuild=[]; + var size=binSize.size; + + if(robots[size].num>0){ + //there is robots same size + cubesToBuild=binSDF.listCubes; + }else if(robots[binSize.size/2].num>0 &&binSize.size>=2 ){ + + //there is no robots same size, divide stock by 2 + for(var l=0;l<binSDF.listCubes.length;l++){ + for(var ii=0;ii<voxelIndexList[2].list.length;ii++){ + var x1=binSDF.listCubes[l].position.x+voxelIndexList[2].list[ii].x; + var y1=binSDF.listCubes[l].position.y+voxelIndexList[2].list[ii].y; + var z1=binSDF.listCubes[l].position.z+voxelIndexList[2].list[ii].z; + var stockBuilt=false; + if(buildList.listZ[i].listSize[j].size==1){ + stockBuilt=true; + } + cubesToBuild.push({ + layerZ:buildList.listZ[i].layerZ, + size:buildList.listZ[i].listSize[j].size, + sdfRank:buildList.listZ[i].listSize[j].listSDF[k].sdfRank, + done:false, + stockBuilt:stockBuilt, + stockAssigned:false, + stockPickedUp:false, + position:new THREE.Vector3( + x1, + y1, + z1) + }); + } + } + size=binSize.size/2; + + }else if(robots[binSize.size/4].num>0&&binSize.size>=4){ + //there is no robots same size, divide stock by 8 + for(var l=0;l<binSDF.listCubes.length;l++){ + for(var ii=0;ii<voxelIndexList[4].list.length;ii++){ + var x1=binSDF.listCubes[l].position.x+voxelIndexList[4].list[ii].x; + var y1=binSDF.listCubes[l].position.y+voxelIndexList[4].list[ii].y; + var z1=binSDF.listCubes[l].position.z+voxelIndexList[4].list[ii].z; + var stockBuilt=false; + if(buildList.listZ[i].listSize[j].size==1){ + stockBuilt=true; + } + cubesToBuild.push({ + layerZ:buildList.listZ[i].layerZ, + size:buildList.listZ[i].listSize[j].size, + sdfRank:buildList.listZ[i].listSize[j].listSDF[k].sdfRank, + done:false, + stockBuilt:stockBuilt, + stockAssigned:false, + stockPickedUp:false, + position:new THREE.Vector3( + x1, + y1, + z1) + }); + } + } + size=binSize.size/4; + + } + + //check how many in parallel + + var numRobotParallel= Math.floor(cubesToBuild.length / robots[size].num); + if((cubesToBuild.length/robots[size].num - Math.floor(cubesToBuild.length/robots[size].num))>0){ + numRobotParallel++; + } + + //get furthest robot + var furthestVoxel=new THREE.Vector3(0,0,0); + + for(var l=0;l<cubesToBuild.length;l++){ //for each cube add location (todo check if int) + if( (cubesToBuild[l].position.x+cubesToBuild[l].position.y+cubesToBuild[l].position.z) + > (furthestVoxel.x+furthestVoxel.y+furthestVoxel.z)){ + furthestVoxel=cubesToBuild[l].position.clone(); + } + } + cost+=(numRobotParallel*2*((furthestVoxel.x+furthestVoxel.y+furthestVoxel.z))); + + } + } + } + + if(cost<minCost){ + minCost=cost; + minNodePath=path; + } + + + return cost; + +} + +function recursionCost(robots){ + //todo fix to more accurate estimate + // return cubeCost(2,2,2)*robots[1].num+cubeCost(4,4,4)*robots[2].num+cubeCost(8,8,8)*robots[4].num; + return cubeCost(1,1,1)*robots[1].num+cubeCost(2,2,2)*robots[2].num+cubeCost(4,4,4)*robots[4].num; + +} + +function cubeCost(x,y,z){ + return 2.0*(((x*x+x)/2)*y*z + ((y*y+y)/2)*x*z + ((z*z+z)/2)*y*x); +} + +///////////////////////////////////////////// + +//the one for vis built sequence no decision tree +function createBuildList(json, setup, scale){ + var offset2=12; + var offset=offset2+8; + var buildSize=32; + var gridSize=buildSize+2*(offset); + var order=0; + + var voxelIndexList=[ + null, + { + size:1, + list:[ + new THREE.Vector3(0,0,0), + + ] + }, + { + size:2, + list:[ + new THREE.Vector3(0,0,0), + new THREE.Vector3(0,1,0), + new THREE.Vector3(1,0,0), + new THREE.Vector3(1,1,0), + new THREE.Vector3(0,0,1), + new THREE.Vector3(0,1,1), + new THREE.Vector3(1,0,1), + new THREE.Vector3(1,1,1) + ] + + }, + null, + { + size:4, + list:[ + new THREE.Vector3(0,0,0), + new THREE.Vector3(0,1,0), + new THREE.Vector3(0,2,0), + new THREE.Vector3(0,3,0), + + new THREE.Vector3(1,0,0), + new THREE.Vector3(1,1,0), + new THREE.Vector3(1,2,0), + new THREE.Vector3(1,3,0), + + new THREE.Vector3(2,0,0), + new THREE.Vector3(2,1,0), + new THREE.Vector3(2,2,0), + new THREE.Vector3(2,3,0), + + new THREE.Vector3(3,0,0), + new THREE.Vector3(3,1,0), + new THREE.Vector3(3,2,0), + new THREE.Vector3(3,3,0), + + + new THREE.Vector3(0,0,1), + new THREE.Vector3(0,1,1), + new THREE.Vector3(0,2,1), + new THREE.Vector3(0,3,1), + + new THREE.Vector3(1,0,1), + // new THREE.Vector3(1,1,1), + // new THREE.Vector3(1,2,1), + new THREE.Vector3(1,3,1), + + new THREE.Vector3(2,0,1), + // new THREE.Vector3(2,1,1), + // new THREE.Vector3(2,2,1), + new THREE.Vector3(2,3,1), + + new THREE.Vector3(3,0,1), + new THREE.Vector3(3,1,1), + new THREE.Vector3(3,2,1), + new THREE.Vector3(3,3,1), + + new THREE.Vector3(0,0,2), + new THREE.Vector3(0,1,2), + new THREE.Vector3(0,2,2), + new THREE.Vector3(0,3,2), + + new THREE.Vector3(1,0,2), + // new THREE.Vector3(1,1,2), + // new THREE.Vector3(1,2,2), + new THREE.Vector3(1,3,2), + + new THREE.Vector3(2,0,2), + // new THREE.Vector3(2,1,2), + // new THREE.Vector3(2,2,2), + new THREE.Vector3(2,3,2), + + new THREE.Vector3(3,0,2), + new THREE.Vector3(3,1,2), + new THREE.Vector3(3,2,2), + new THREE.Vector3(3,3,2), + + + new THREE.Vector3(0,0,3), + new THREE.Vector3(0,1,3), + new THREE.Vector3(0,2,3), + new THREE.Vector3(0,3,3), + + new THREE.Vector3(1,0,3), + new THREE.Vector3(1,1,3), + new THREE.Vector3(1,2,3), + new THREE.Vector3(1,3,3), + + new THREE.Vector3(2,0,3), + new THREE.Vector3(2,1,3), + new THREE.Vector3(2,2,3), + new THREE.Vector3(2,3,3), + + new THREE.Vector3(3,0,3), + new THREE.Vector3(3,1,3), + new THREE.Vector3(3,2,3), + new THREE.Vector3(3,3,3), + + ] + + } + + ]; + + var shift=gridSize/2.0; + + var buildList={ + currentSizeIndex:0, + maxSizeIndex:json.length, + done:false, + availablePickup:[], + listSize:[], + listToBuild:[] + + }; + // todo multiply by 4 as smallest size in cubeCone is 0.25 + // y is z and z is y + // shift z by 1 cause sacrificial layer is 0 + // shift x and y to not have negative values + + setup.nodes.push({ + path:"[]", + size:100, + name:"Build Sequence", + level:0, + order:order + }); + + + + // todo multiply by 4 as smallest size in cubeCone is 0.25 + // y is z and z is y + // shift z by 1 cause sacrificial layer is 0 + // shift x and y to not have negative values + + for(var i=0;i<json.length;i++){ //for each z layer bin + buildList.listSize.push({ + size:json[i][0][0][0].widths[0]*scale, + done:false, + currentZIndex:0, + maxZIndex:json[i].length, + listZ:[], + }); + + setup.nodes.push({ + path:"["+i+"]", + size:100, + module:"["+i+"]", + name:"S:"+json[i][0][0][0].widths[0]*scale+"", + level:1, + order:order + }); + setup.edges.push({source: "[]", target: "["+i+"]"}); + + for(var j=0;j<json[i].length;j++){ //for each size bin + buildList.listSize[i].listZ.push({ + + size:buildList.listSize[i].size, + layerZ:json[i][j][0][0].origin[1]*scale+1, + + done:false, + currentSDFIndex:0, + maxSDFIndex:json[i][j].length, + listSDF:[] + + }); + setup.nodes.push({ + path:"["+i+","+j+"]", + size:100, + module:"["+i+"]", + // name:"Size:"+buildList.listSize[i].size+", Layer:"+(json[i][j][0][0].origin[1]*scale+1)+"", + name:"L:"+(json[i][j][0][0].origin[1]*scale+1)+"", + level:2, + order:order + }); + setup.edges.push({source: "["+i+"]", target: "["+i+","+j+"]"}); + + for(var k=0;k<json[i][j].length;k++){ //for each sdf bin (signed distance field) + buildList.listSize[i].listZ[j].listSDF.push({ + sdfRank:k, + layerZ:buildList.listSize[i].listZ[j].layerZ, + size:buildList.listSize[i].size, + done:false, + currentCubeIndex:0, + maxCubeIndex:json[i][j][k].length, + listCubes:[] + + + }); + + setup.nodes.push({ + path:"["+i+","+j+","+k+"]", + size:100, + module:"["+i+"]", + // name:"Size:"+buildList.listSize[i].size+", Layer:"+j+", SDF:"+k+"", + name:"SDF:"+k+"", + level:3, + order:order + }); + setup.edges.push({source: "["+i+","+j+"]", target: "["+i+","+j+","+k+"]"}); + + for(var l=0;l<json[i][j][k].length;l++){ //for each cube add location (todo check if int) + var stockBuilt=false; + if(buildList.listSize[i].size==1){ + stockBuilt=true; + } + buildList.listSize[i].listZ[j].listSDF[k].listCubes.push({ + layerZ:buildList.listSize[i].listZ[j].layerZ, + size:buildList.listSize[i].size, + sdfRank:buildList.listSize[i].listZ[j].listSDF[k].sdfRank, + done:false, + stockBuilt:stockBuilt, + stockAssigned:false, + stockPickedUp:false, + position:new THREE.Vector3( + json[i][j][k][l].origin[0]*scale+shift, + json[i][j][k][l].origin[2]*scale+shift, + json[i][j][k][l].origin[1]*scale+1) + }); + + setup.nodes.push({ + path:"["+i+","+j+","+k+","+l+"]", + size:200*buildList.listSize[i].size, + module:"["+i+"]", + // name:"layer:"+i+", size:"+buildList.listZ[i].listSize[j].size+", sdf:"+k+", cube:"+l+"", + name:"x:"+json[i][j][k][l].origin[0]*scale+", y:"+json[i][j][k][l].origin[2]*scale+", z:"+(json[i][j][k][l].origin[1]*scale+1.0), + level:4, + order:order + }); + setup.edges.push({source: "["+i+","+j+","+k+"]", target: "["+i+","+j+","+k+","+l+"]"}); + } + order++; + } + } + } + + maxOrder=order; + + return buildList; +} + +// the one for the simulation +function createBuildList1(json, setup, scale){ + var offset2=12; + var offset=offset2+8; + var buildSize=32; + var gridSize=buildSize+2*(offset); + var opacity=0.9; + var order1=0; + + + var voxelIndexList=[ + null, + { + size:1, + list:[ + new THREE.Vector3(0,0,0), + + ] + }, + { + size:2, + list:[ + new THREE.Vector3(0,0,0), + new THREE.Vector3(0,1,0), + new THREE.Vector3(1,0,0), + new THREE.Vector3(1,1,0), + new THREE.Vector3(0,0,1), + new THREE.Vector3(0,1,1), + new THREE.Vector3(1,0,1), + new THREE.Vector3(1,1,1) + ] + + }, + null, + { + size:4, + list:[ + new THREE.Vector3(0,0,0), + new THREE.Vector3(0,1,0), + new THREE.Vector3(0,2,0), + new THREE.Vector3(0,3,0), + + new THREE.Vector3(1,0,0), + new THREE.Vector3(1,1,0), + new THREE.Vector3(1,2,0), + new THREE.Vector3(1,3,0), + + new THREE.Vector3(2,0,0), + new THREE.Vector3(2,1,0), + new THREE.Vector3(2,2,0), + new THREE.Vector3(2,3,0), + + new THREE.Vector3(3,0,0), + new THREE.Vector3(3,1,0), + new THREE.Vector3(3,2,0), + new THREE.Vector3(3,3,0), + + + new THREE.Vector3(0,0,1), + new THREE.Vector3(0,1,1), + new THREE.Vector3(0,2,1), + new THREE.Vector3(0,3,1), + + new THREE.Vector3(1,0,1), + // new THREE.Vector3(1,1,1), + // new THREE.Vector3(1,2,1), + new THREE.Vector3(1,3,1), + + new THREE.Vector3(2,0,1), + // new THREE.Vector3(2,1,1), + // new THREE.Vector3(2,2,1), + new THREE.Vector3(2,3,1), + + new THREE.Vector3(3,0,1), + new THREE.Vector3(3,1,1), + new THREE.Vector3(3,2,1), + new THREE.Vector3(3,3,1), + + new THREE.Vector3(0,0,2), + new THREE.Vector3(0,1,2), + new THREE.Vector3(0,2,2), + new THREE.Vector3(0,3,2), + + new THREE.Vector3(1,0,2), + // new THREE.Vector3(1,1,2), + // new THREE.Vector3(1,2,2), + new THREE.Vector3(1,3,2), + + new THREE.Vector3(2,0,2), + // new THREE.Vector3(2,1,2), + // new THREE.Vector3(2,2,2), + new THREE.Vector3(2,3,2), + + new THREE.Vector3(3,0,2), + new THREE.Vector3(3,1,2), + new THREE.Vector3(3,2,2), + new THREE.Vector3(3,3,2), + + + new THREE.Vector3(0,0,3), + new THREE.Vector3(0,1,3), + new THREE.Vector3(0,2,3), + new THREE.Vector3(0,3,3), + + new THREE.Vector3(1,0,3), + new THREE.Vector3(1,1,3), + new THREE.Vector3(1,2,3), + new THREE.Vector3(1,3,3), + + new THREE.Vector3(2,0,3), + new THREE.Vector3(2,1,3), + new THREE.Vector3(2,2,3), + new THREE.Vector3(2,3,3), + + new THREE.Vector3(3,0,3), + new THREE.Vector3(3,1,3), + new THREE.Vector3(3,2,3), + new THREE.Vector3(3,3,3), + + ] + + } + + ]; + + var shift=gridSize/2.0; + + buildList={ + currentSizeIndex:0, + maxSizeIndex:json.length, + done:false, + availablePickup:[], + listSize:[] + + }; + + // todo multiply by 4 as smallest size in cubeCone is 0.25 + // y is z and z is y + // shift z by 1 cause sacrificial layer is 0 + // shift x and y to not have negative values + + for(var i=0;i<json.length;i++){ //for each z layer bin + buildList.listSize.push({ + size:json[i][0][0][0].widths[0]*scale, + done:false, + currentZIndex:0, + maxZIndex:json[i].length, + listZ:[], + }); + for(var j=0;j<json[i].length;j++){ //for each size bin + buildList.listSize[i].listZ.push({ + + size:buildList.listSize[i].size, + layerZ:json[i][j][0][0].origin[1]*scale+1, + + done:false, + currentSDFIndex:0, + maxSDFIndex:json[i][j].length, + listSDF:[] + + }); + for(var k=0;k<json[i][j].length;k++){ //for each sdf bin (signed distance field) + buildList.listSize[i].listZ[j].listSDF.push({ + sdfRank:k, + layerZ:buildList.listSize[i].listZ[j].layerZ, + size:buildList.listSize[i].size, + done:false, + currentCubeIndex:0, + maxCubeIndex:json[i][j][k].length, + listCubes:[] + + + }); + + for(var l=0;l<json[i][j][k].length;l++){ //for each cube add location (todo check if int) + var stockBuilt=false; + if(buildList.listSize[i].size==1){ + stockBuilt=true; + } + buildList.listSize[i].listZ[j].listSDF[k].listCubes.push({ + layerZ:buildList.listSize[i].listZ[j].layerZ, + size:buildList.listSize[i].size, + sdfRank:buildList.listSize[i].listZ[j].listSDF[k].sdfRank, + done:false, + stockBuilt:stockBuilt, + stockAssigned:false, + stockPickedUp:false, + position:new THREE.Vector3( + json[i][j][k][l].origin[0]*scale+shift, + json[i][j][k][l].origin[2]*scale+shift, + json[i][j][k][l].origin[1]*scale+1) + }); + var nomSize=buildList.listSize[i].size; + var x=json[i][j][k][l].origin[0]*scale; + var y=json[i][j][k][l].origin[1]*scale; + var z=json[i][j][k][l].origin[2]*scale; + + // if(true){ + // if(json[i][j][k][l].origin[2]*scale+nomSize/2.0<0){ + if(json[i][j][k][l].origin[2]*scale+nomSize/2.0<0 || json[i][j][k][l].origin[0]*scale+nomSize/2.0<0){ + setup.nodes.push({ + id:"["+nomSize+","+x+","+y+","+z+"]", + position:{ + x:x+nomSize/2.0, + y:y+nomSize/2.0, + z:z+nomSize/2.0 + }, + displacement:{ + x:0, + y:0, + z:0 + }, + nomSize:nomSize, + orgNomSize:nomSize, + viz:opacity, + order:order1 + }); + + addEdge(setup,nomSize,nomSize,x,y,z,opacity); + + if(nomSize==2){ + for(var ii=0;ii<voxelIndexList[2].list.length;ii++){ + var nomSize1=1; + var x1=x+voxelIndexList[2].list[ii].x; + var y1=y+voxelIndexList[2].list[ii].y; + var z1=z+voxelIndexList[2].list[ii].z; + + setup.nodes.push({ + id:"["+nomSize1+","+x1+","+y1+","+z1+"]", + position:{ + x:x1+nomSize1/2.0, + y:y1+nomSize1/2.0, + z:z1+nomSize1/2.0 + }, + displacement:{ + x:0, + y:0, + z:0 + }, + nomSize:nomSize1, + orgNomSize:nomSize, + viz:0.0, + order:order1 + }); + + addEdge(setup,nomSize1,nomSize,x1,y1,z1,0); + + } + } + + + if(nomSize==4){ + for(var ii=0;ii<voxelIndexList[4].list.length;ii++){ + var nomSize1=1; + var x1=x+voxelIndexList[4].list[ii].x; + var y1=y+voxelIndexList[4].list[ii].y; + var z1=z+voxelIndexList[4].list[ii].z; + + setup.nodes.push({ + id:"["+nomSize1+","+x1+","+y1+","+z1+"]", + position:{ + x:x1+nomSize1/2.0, + y:y1+nomSize1/2.0, + z:z1+nomSize1/2.0 + }, + displacement:{ + x:0, + y:0, + z:0 + }, + nomSize:nomSize1, + orgNomSize:nomSize, + viz:0.0, + order:order1 + }); + + addEdge(setup,nomSize1,nomSize,x1,y1,z1,0); + } + + } + } + } + order1++; + } + } + } + + maxOrder=order1; + console.log(maxOrder) + return buildList; +} + +//the original one +function createBuildList2(json, setup, scale,buildSize){ + var offset2=12; + var offset=offset2+8; + var gridSize=buildSize+2*(offset); + + + voxelIndexList=[ + null, + { + size:1, + list:[ + new THREE.Vector3(0,0,0), + + ] + }, + { + size:2, + list:[ + new THREE.Vector3(0,0,0), + new THREE.Vector3(0,1,0), + new THREE.Vector3(1,0,0), + new THREE.Vector3(1,1,0), + new THREE.Vector3(0,0,1), + new THREE.Vector3(0,1,1), + new THREE.Vector3(1,0,1), + new THREE.Vector3(1,1,1) + ] + + }, + null, + { + size:4, + list:[ + new THREE.Vector3(0,0,0), + new THREE.Vector3(0,1,0), + new THREE.Vector3(0,2,0), + new THREE.Vector3(0,3,0), + + new THREE.Vector3(1,0,0), + new THREE.Vector3(1,1,0), + new THREE.Vector3(1,2,0), + new THREE.Vector3(1,3,0), + + new THREE.Vector3(2,0,0), + new THREE.Vector3(2,1,0), + new THREE.Vector3(2,2,0), + new THREE.Vector3(2,3,0), + + new THREE.Vector3(3,0,0), + new THREE.Vector3(3,1,0), + new THREE.Vector3(3,2,0), + new THREE.Vector3(3,3,0), + + + new THREE.Vector3(0,0,1), + new THREE.Vector3(0,1,1), + new THREE.Vector3(0,2,1), + new THREE.Vector3(0,3,1), + + new THREE.Vector3(1,0,1), + // new THREE.Vector3(1,1,1), + // new THREE.Vector3(1,2,1), + new THREE.Vector3(1,3,1), + + new THREE.Vector3(2,0,1), + // new THREE.Vector3(2,1,1), + // new THREE.Vector3(2,2,1), + new THREE.Vector3(2,3,1), + + new THREE.Vector3(3,0,1), + new THREE.Vector3(3,1,1), + new THREE.Vector3(3,2,1), + new THREE.Vector3(3,3,1), + + new THREE.Vector3(0,0,2), + new THREE.Vector3(0,1,2), + new THREE.Vector3(0,2,2), + new THREE.Vector3(0,3,2), + + new THREE.Vector3(1,0,2), + // new THREE.Vector3(1,1,2), + // new THREE.Vector3(1,2,2), + new THREE.Vector3(1,3,2), + + new THREE.Vector3(2,0,2), + // new THREE.Vector3(2,1,2), + // new THREE.Vector3(2,2,2), + new THREE.Vector3(2,3,2), + + new THREE.Vector3(3,0,2), + new THREE.Vector3(3,1,2), + new THREE.Vector3(3,2,2), + new THREE.Vector3(3,3,2), + + + new THREE.Vector3(0,0,3), + new THREE.Vector3(0,1,3), + new THREE.Vector3(0,2,3), + new THREE.Vector3(0,3,3), + + new THREE.Vector3(1,0,3), + new THREE.Vector3(1,1,3), + new THREE.Vector3(1,2,3), + new THREE.Vector3(1,3,3), + + new THREE.Vector3(2,0,3), + new THREE.Vector3(2,1,3), + new THREE.Vector3(2,2,3), + new THREE.Vector3(2,3,3), + + new THREE.Vector3(3,0,3), + new THREE.Vector3(3,1,3), + new THREE.Vector3(3,2,3), + new THREE.Vector3(3,3,3), + + ] + + } + + ]; + + var shift=gridSize/2.0; + + var buildList={ + currentSizeIndex:0, + maxSizeIndex:json.length, + done:false, + availablePickup:[], + listSize:[], + listToBuild:[] + + }; + // todo multiply by 4 as smallest size in cubeCone is 0.25 + // y is z and z is y + // shift z by 1 cause sacrificial layer is 0 + // shift x and y to not have negative values + + for(var i=0;i<json.length;i++){ //for each z layer bin + buildList.listSize.push({ + size:json[i][0][0][0].widths[0]*scale, + done:false, + currentZIndex:0, + maxZIndex:json[i].length, + listZ:[], + }); + for(var j=0;j<json[i].length;j++){ //for each size bin + buildList.listSize[i].listZ.push({ + + size:buildList.listSize[i].size, + layerZ:json[i][j][0][0].origin[1]*scale+1, + + done:false, + currentSDFIndex:0, + maxSDFIndex:json[i][j].length, + listSDF:[] + + }); + for(var k=0;k<json[i][j].length;k++){ //for each sdf bin (signed distance field) + buildList.listSize[i].listZ[j].listSDF.push({ + sdfRank:k, + layerZ:buildList.listSize[i].listZ[j].layerZ, + size:buildList.listSize[i].size, + done:false, + currentCubeIndex:0, + maxCubeIndex:json[i][j][k].length, + listCubes:[] + + + }); + + for(var l=0;l<json[i][j][k].length;l++){ //for each cube add location (todo check if int) + var stockBuilt=false; + if(buildList.listSize[i].size==1){ + stockBuilt=true; + } + buildList.listSize[i].listZ[j].listSDF[k].listCubes.push({ + layerZ:buildList.listSize[i].listZ[j].layerZ, + size:buildList.listSize[i].size, + sdfRank:buildList.listSize[i].listZ[j].listSDF[k].sdfRank, + done:false, + stockBuilt:stockBuilt, + stockAssigned:false, + stockPickedUp:false, + position:new THREE.Vector3( + json[i][j][k][l].origin[0]*scale+shift, + json[i][j][k][l].origin[2]*scale+shift, + json[i][j][k][l].origin[1]*scale+1) + }); + } + } + } + } + + return buildList; +} + + +function drawGraph(setup){ + scale=10.0; + + gData = { + nodes: setup.nodes.map(node => ({ + id: node.id, + px:node.position.x*scale, + py:node.position.y*scale, + pz:node.position.z*scale, + dx:node.displacement.x*scale, + dy:node.displacement.y*scale, + dz:node.displacement.z*scale, + nomSize:node.nomSize, + viz:node.viz, + order:node.order + })), + links: setup.edges + .filter(edge => edge.id) + .map(edge => ({ + source: edge.source, + target: edge.target, + // color:getColor(edge.stress) + })) + }; + + + Graph1 = ForceGraph3D({ controlType: 'orbit' }).backgroundColor(color1) + (document.getElementById('graph1')) + .d3Force('center', null) + .d3Force('charge', null) + .linkWidth(1.0) + .linkOpacity(1.0) + // .nodeThreeObject(({ nomSize,viz,order }) => new THREE.Mesh( + // new THREE.BoxGeometry(scale*nomSize*0.9, scale*nomSize*0.9, scale*nomSize*0.9), + // new THREE.MeshLambertMaterial({ + // color: getColor(order,maxOrder ,0,colormap), + // transparent: true, + // opacity: viz + // }) + // ) + // ) + .nodeThreeObject(node => { + var mesh =new THREE.Mesh( + new THREE.BoxGeometry(scale*node.nomSize*0.9, scale*node.nomSize*0.9, scale*node.nomSize*0.9), + new THREE.MeshLambertMaterial({ + color: getColor(node.order,maxOrder ,0,colormap), + transparent: true, + opacity: node.viz + })); + if(node.viz==0){ + mesh.visible=false; + } + return mesh; + }) + .d3Force('box', () => { + + gData.nodes.forEach(node => { + node.fx=node.px; + node.fy=node.py; + node.fz=node.pz; + + }); + }) + + .cooldownTime(Infinity) + .graphData(gData) + .height(window.innerHeight/3); + // .height(window.innerHeight); + + var count=0; + var totalCount=0; + var increment=true; + var speed=100; + var exaggeration=10000.0; + + + var helper = new THREE.GridHelper( scale*2, scale*2 ); + helper.position.y = 0; + helper.material.opacity = 0.5; + helper.material.transparent = true; + helper.scale.x=1.0*scale + helper.scale.z=1.0*scale + Graph1.scene().add(helper); + + +} + +/////////////utils//////////////////// + +function addEdge(setup,nomSize,orgNomSize,x,y,z,viz){ + + // var source="["+nomSize+","+x+","+y+","+z+"]"; + + // for(var i=-1;i<2;i++){ + // for(var j=-1;j<2;j++){ + // for(var k=-1;k<2;k++){ + // if(((i==0&&j==0)||(i==0&&k==0)||(j==0&&k==0))){ //not same voxel and no diagonals + // if(!(i==0&&j==0&&k==0)){ + // var x1=x+i*nomSize; + // var y1=y+j*nomSize; + // var z1=z+k*nomSize; + // var target="["+nomSize+","+x1+","+y1+","+z1+"]"; + // var node=setup.nodes.find(v => v.id === target); + // if(node!==undefined){ + // if(!(viz==0&&node.viz==0)){ + // setup.edges.push({ id: 'e'+setup.edges.length, source: source, target: target ,stress:0 }); + + // } + // if(orgNomSize!=node.orgNomSize){ + // setup.edges.push({ id: 'e'+setup.edges.length, source: source, target: target ,stress:0 }); + // } + // } + // } + // } + // } + // } + // } + +} + +function getColor(value,min, max,colormap){ + var val=map(value,min,max,1.0,0.5); + color=interpolateLinearly(val, colormap); + // return new THREE.Color(color[0],color[1],color[2]); + return new THREE.Color(color[0],color[1],color[2]).getHex(); + +} + +function interpolateLinearly(x, values) { + // Split values into four lists + var x_values = []; + var r_values = []; + var g_values = []; + var b_values = []; + for (i in values) { + x_values.push(values[i][0]); + r_values.push(values[i][1][0]); + g_values.push(values[i][1][1]); + b_values.push(values[i][1][2]); + } + var i = 1; + while (x_values[i] < x) { + i = i+1; + } + i = i-1; + var width = Math.abs(x_values[i] - x_values[i+1]); + var scaling_factor = (x - x_values[i]) / width; + // Get the new color values though interpolation + var r = r_values[i] + scaling_factor * (r_values[i+1] - r_values[i]) + var g = g_values[i] + scaling_factor * (g_values[i+1] - g_values[i]) + var b = b_values[i] + scaling_factor * (b_values[i+1] - b_values[i]) + return [enforceBounds(r), enforceBounds(g), enforceBounds(b)]; +} + +function enforceBounds(x) { + if (x < 0) { + return 0; + } else if (x > 1){ + return 1; + } else { + return x; + } +} + +function map (value, x1, y1, x2, y2) { + return (value - x1) * (y2 - x2) / (y1 - x1) + x2; +} + + + + + + + + diff --git a/recursive_swarm/js/decision/decision_old.js b/recursive_swarm/js/decision/decision_old.js new file mode 100644 index 0000000000000000000000000000000000000000..816f9e3f91ad0f116a6665434f881146b0ce812d --- /dev/null +++ b/recursive_swarm/js/decision/decision_old.js @@ -0,0 +1,1244 @@ + +// Amira Abdel-Rahman +// (c) Massachusetts Institute of Technology 2020 + + +var buildList=[]; +var voxelIndexList; +var scale,setup; +setup={}; +setup.nodes=[]; +setup.edges=[]; +setup.viz={}; +setup.viz.colorMaps=[YlGnBu,coolwarm, winter ,jet]; +var colormap=YlGnBu; +var maxOrder; + +var Graph,gData; +var Graph1; + +var Robots; +var minCost=Infinity; +var maxCost=0; +var minNodePath= "" ; + +function decisionTree(){ + Robots=[ + null, + { + size:1, + maxNum:4, + num:0 + }, + { + size:2, + maxNum:2, + num:0 + }, + null, + { + size:4, + maxNum:1, + num:0 + } + ]; + scale=400; + + + Robots[1].num++; + setup.nodes.push({ + path:"", + name:"["+Robots[4].num +","+ Robots[2].num+","+ Robots[1].num+"]", + name:"Decision Tree\nR⁴:"+Robots[4].num +", R²:"+ Robots[2].num+", R:"+ Robots[1].num+"", + size:scale, + min:false, + parent:"top", + c:color66, + shape:'dot', + cost:estimateCost(Robots,"") + }); + + + // console.log(estimateCost(Robots,"")); + + decision(setup,Robots,1,""); + + console.log("Min Node:"+minNodePath+"!!!"); + + var node=setup.nodes.filter(n => n.path==minNodePath)[0]; + node.min=true; + while(node.parent != "top"){ + var edge=setup.edges.filter(e => (e.source==node.parent) &&(e.target==node.path))[0]; + edge.min=true; + node=setup.nodes.filter(n => n.path==node.parent)[0]; + } + + var nodes=setup.nodes; + var links=setup.edges; + + Graph(document.getElementById('graph')).graphData({ nodes, links }); + + +} + +function decision(setup,robots,size,name){ + + var cc=estimateCost(robots,name+"b"); + setup.nodes.push({ + path:name+"b", + type:"build", + // name:"expand:"+0, + // name:"["+robots[4].num +","+ robots[2].num+","+ robots[1].num+"] build cost:"+estimateCost(robots,name+"b"), + name:"Build \n Time: "+cc, + size:scale, + parent:name, + min:false, + c:'#56ffcc', + shape:'square', + cost:cc + }); + + setup.edges.push({source: name, target: name+"b",min:false}); + + + if(robots[size].num<robots[size].maxNum){ + var r=JSON.parse(JSON.stringify(robots)); + r[size].num++; + setup.nodes.push({ + path:name+"r", + type:"reproduce", + // name:"reproduce: ["+r[4].num +","+ r[2].num+","+ r[1].num+"]", + name:"Reproduce\nR⁴:"+r[4].num +", R²:"+ r[2].num+", R:"+ r[1].num+"", + size:scale, + parent:name, + min:false, + c:color88, + shape:'star' + + }); + setup.edges.push({source: name, target: name+"r",min:false}); + + //for each robot here propagate decision + decision(setup,r,size,name+"r"); + + } + + if(size<=2 && robots[size*2].num<robots[size*2].maxNum){ + var r=JSON.parse(JSON.stringify(robots)); + r[size*2].num++; + setup.nodes.push({ + path:name+"g", + type:"grow", + // name:"grow: ["+r[4].num +","+ r[2].num+","+ r[1].num+"]", + name:"Evolve\nR⁴:"+r[4].num +", R²:"+ r[2].num+", R:"+ r[1].num+"", + size:scale*0.9, + parent:name, + min:false, + c:color77, + shape:'diamond' + + }); + setup.edges.push({source: name, target: name+"g",min:false});; + decision(setup,r,size*2,name+"g") + + } + + +} + +function estimateCost(robots,path){ + var cost =0; + //fisrt add cost of building robots + cost+=recursionCost(robots); + + var binZ=buildList.listZ[buildList.currentZIndex]; + var binSize=binZ.listSize[binZ.currentSizeIndex]; + var binSDF=binSize.listSDF[binSize.currentSDFIndex]; + + var indexZ=buildList.currentZIndex; + var indexSize=binZ.currentSizeIndex; + var indexSDF=binSize.currentSDFIndex; + + var maxIndexZ=buildList.maxZIndex; + var maxIndexSize=binZ.maxSizeIndex; + var maxIndexSDF=binSize.maxSDFIndex; + + for(var i=0;i<buildList.listZ.length;i++){ //for each z layer bin + binZ=buildList.listZ[i]; + indexZ=i; + maxIndexSize=binZ.maxSizeIndex; + + for(var j=0;j<binZ.listSize.length;j++){ //for each size bin + binSize=binZ.listSize[j]; + indexSize=j; + maxIndexSDF=binSize.maxSDFIndex; + + for(var k=0;k<binSize.listSDF.length;k++){ //for each sdf bin (signed distance field) + binSDF=binSize.listSDF[k]; + indexSDF=k; + var cubesToBuild=[]; + var size=binSize.size; + + if(robots[size].num>0){ + //there is robots same size + cubesToBuild=binSDF.listCubes; + }else if(robots[binSize.size/2].num>0 &&binSize.size>=2 ){ + + //there is no robots same size, divide stock by 2 + for(var l=0;l<binSDF.listCubes.length;l++){ + for(var ii=0;ii<voxelIndexList[2].list.length;ii++){ + var x1=binSDF.listCubes[l].position.x+voxelIndexList[2].list[ii].x; + var y1=binSDF.listCubes[l].position.y+voxelIndexList[2].list[ii].y; + var z1=binSDF.listCubes[l].position.z+voxelIndexList[2].list[ii].z; + var stockBuilt=false; + if(buildList.listZ[i].listSize[j].size==1){ + stockBuilt=true; + } + cubesToBuild.push({ + layerZ:buildList.listZ[i].layerZ, + size:buildList.listZ[i].listSize[j].size, + sdfRank:buildList.listZ[i].listSize[j].listSDF[k].sdfRank, + done:false, + stockBuilt:stockBuilt, + stockAssigned:false, + stockPickedUp:false, + position:new THREE.Vector3( + x1, + y1, + z1) + }); + } + } + size=binSize.size/2; + + }else if(robots[binSize.size/4].num>0&&binSize.size>=4){ + //there is no robots same size, divide stock by 8 + for(var l=0;l<binSDF.listCubes.length;l++){ + for(var ii=0;ii<voxelIndexList[4].list.length;ii++){ + var x1=binSDF.listCubes[l].position.x+voxelIndexList[4].list[ii].x; + var y1=binSDF.listCubes[l].position.y+voxelIndexList[4].list[ii].y; + var z1=binSDF.listCubes[l].position.z+voxelIndexList[4].list[ii].z; + var stockBuilt=false; + if(buildList.listZ[i].listSize[j].size==1){ + stockBuilt=true; + } + cubesToBuild.push({ + layerZ:buildList.listZ[i].layerZ, + size:buildList.listZ[i].listSize[j].size, + sdfRank:buildList.listZ[i].listSize[j].listSDF[k].sdfRank, + done:false, + stockBuilt:stockBuilt, + stockAssigned:false, + stockPickedUp:false, + position:new THREE.Vector3( + x1, + y1, + z1) + }); + } + } + size=binSize.size/4; + + } + + //check how many in parallel + + var numRobotParallel= Math.floor(cubesToBuild.length / robots[size].num); + if((cubesToBuild.length/robots[size].num - Math.floor(cubesToBuild.length/robots[size].num))>0){ + numRobotParallel++; + } + + //get furthest robot + var furthestVoxel=new THREE.Vector3(0,0,0); + + for(var l=0;l<cubesToBuild.length;l++){ //for each cube add location (todo check if int) + if( (cubesToBuild[l].position.x+cubesToBuild[l].position.y+cubesToBuild[l].position.z) + > (furthestVoxel.x+furthestVoxel.y+furthestVoxel.z)){ + furthestVoxel=cubesToBuild[l].position.clone(); + } + } + cost+=(numRobotParallel*2*((furthestVoxel.x+furthestVoxel.y+furthestVoxel.z))); + + } + } + } + + if(cost<minCost){ + minCost=cost; + minNodePath=path; + } + if(cost>maxCost){ + // if(cost!=12126){ + maxCost=cost; + // console.log(maxCost) + + // } + + } + + + return cost; + +} + +function recursionCost(robots){ + //todo fix to more accurate estimate + // return cubeCost(2,2,2)*robots[1].num+cubeCost(4,4,4)*robots[2].num+cubeCost(8,8,8)*robots[4].num; + return cubeCost(1,1,1)*robots[1].num+cubeCost(2,2,2)*robots[2].num+cubeCost(4,4,4)*robots[4].num; + +} + +function cubeCost(x,y,z){ + return 2.0*(((x*x+x)/2)*y*z + ((y*y+y)/2)*x*z + ((z*z+z)/2)*y*x); +} + +///////////////////////////////////////////// + +//the one for vis built sequence no decision tree +function createBuildList(json, setup, scale){ + var offset2=12; + var offset=offset2+8; + var buildSize=32; + var gridSize=buildSize+2*(offset); + var order=0; + + var voxelIndexList=[ + null, + { + size:1, + list:[ + new THREE.Vector3(0,0,0), + + ] + }, + { + size:2, + list:[ + new THREE.Vector3(0,0,0), + new THREE.Vector3(0,1,0), + new THREE.Vector3(1,0,0), + new THREE.Vector3(1,1,0), + new THREE.Vector3(0,0,1), + new THREE.Vector3(0,1,1), + new THREE.Vector3(1,0,1), + new THREE.Vector3(1,1,1) + ] + + }, + null, + { + size:4, + list:[ + new THREE.Vector3(0,0,0), + new THREE.Vector3(0,1,0), + new THREE.Vector3(0,2,0), + new THREE.Vector3(0,3,0), + + new THREE.Vector3(1,0,0), + new THREE.Vector3(1,1,0), + new THREE.Vector3(1,2,0), + new THREE.Vector3(1,3,0), + + new THREE.Vector3(2,0,0), + new THREE.Vector3(2,1,0), + new THREE.Vector3(2,2,0), + new THREE.Vector3(2,3,0), + + new THREE.Vector3(3,0,0), + new THREE.Vector3(3,1,0), + new THREE.Vector3(3,2,0), + new THREE.Vector3(3,3,0), + + + new THREE.Vector3(0,0,1), + new THREE.Vector3(0,1,1), + new THREE.Vector3(0,2,1), + new THREE.Vector3(0,3,1), + + new THREE.Vector3(1,0,1), + // new THREE.Vector3(1,1,1), + // new THREE.Vector3(1,2,1), + new THREE.Vector3(1,3,1), + + new THREE.Vector3(2,0,1), + // new THREE.Vector3(2,1,1), + // new THREE.Vector3(2,2,1), + new THREE.Vector3(2,3,1), + + new THREE.Vector3(3,0,1), + new THREE.Vector3(3,1,1), + new THREE.Vector3(3,2,1), + new THREE.Vector3(3,3,1), + + new THREE.Vector3(0,0,2), + new THREE.Vector3(0,1,2), + new THREE.Vector3(0,2,2), + new THREE.Vector3(0,3,2), + + new THREE.Vector3(1,0,2), + // new THREE.Vector3(1,1,2), + // new THREE.Vector3(1,2,2), + new THREE.Vector3(1,3,2), + + new THREE.Vector3(2,0,2), + // new THREE.Vector3(2,1,2), + // new THREE.Vector3(2,2,2), + new THREE.Vector3(2,3,2), + + new THREE.Vector3(3,0,2), + new THREE.Vector3(3,1,2), + new THREE.Vector3(3,2,2), + new THREE.Vector3(3,3,2), + + + new THREE.Vector3(0,0,3), + new THREE.Vector3(0,1,3), + new THREE.Vector3(0,2,3), + new THREE.Vector3(0,3,3), + + new THREE.Vector3(1,0,3), + new THREE.Vector3(1,1,3), + new THREE.Vector3(1,2,3), + new THREE.Vector3(1,3,3), + + new THREE.Vector3(2,0,3), + new THREE.Vector3(2,1,3), + new THREE.Vector3(2,2,3), + new THREE.Vector3(2,3,3), + + new THREE.Vector3(3,0,3), + new THREE.Vector3(3,1,3), + new THREE.Vector3(3,2,3), + new THREE.Vector3(3,3,3), + + ] + + } + + ]; + + var shift=gridSize/2.0; + + var buildList={ + currentZIndex:0, + maxZIndex:json.length, + listZ:[], + done:false, + availablePickup:[], + listToBuild:[] + + }; + // todo multiply by 4 as smallest size in cubeCone is 0.25 + // y is z and z is y + // shift z by 1 cause sacrificial layer is 0 + // shift x and y to not have negative values + + setup.nodes.push({ + path:"[]", + size:100, + name:"Build \n Sequence", + level:0, + order:order + }); + + for(var i=0;i<json.length;i++){ //for each z layer bin + buildList.listZ.push({ + layerZ:json[i][0][0][0].origin[1]*scale+1, + done:false, + currentSizeIndex:0, + maxSizeIndex:json[i].length, + listSize:[] + }); + + setup.nodes.push({ + path:"["+i+"]", + size:100, + module:"["+i+"]", + // name:"layer:"+i+"", + name:"L:"+i+"", + level:1, + order:order + }); + setup.edges.push({source: "[]", target: "["+i+"]"}); + + for(var j=0;j<json[i].length;j++){ //for each size bin + buildList.listZ[i].listSize.push({ + size:json[i][j][0][0].widths[0]*scale, + layerZ:buildList.listZ[i].layerZ, + done:false, + currentSDFIndex:0, + maxSDFIndex:json[i][j].length, + listSDF:[] + + }); + + setup.nodes.push({ + path:"["+i+","+j+"]", + size:100, + module:"["+i+"]", + // name:"layer:"+i+", size:"+json[i][j][0][0].widths[0]*scale+"", + name:"S:"+(json[i][j][0][0].widths[0]*scale)+"", + level:2, + order:order + }); + setup.edges.push({source: "["+i+"]", target: "["+i+","+j+"]"}); + + for(var k=0;k<json[i][j].length;k++){ //for each sdf bin (signed distance field) + buildList.listZ[i].listSize[j].listSDF.push({ + sdfRank:k, + layerZ:buildList.listZ[i].layerZ, + size:buildList.listZ[i].listSize[j].size, + done:false, + currentCubeIndex:0, + maxCubeIndex:json[i][j][k].length, + listCubes:[] + + + }); + + setup.nodes.push({ + path:"["+i+","+j+","+k+"]", + size:100, + module:"["+i+"]", + // name:"layer:"+i+", size:"+buildList.listZ[i].listSize[j].size+", sdf:"+k+"", + name:"SDF:"+k+"", + level:3, + order:order + }); + setup.edges.push({source: "["+i+","+j+"]", target: "["+i+","+j+","+k+"]"}); + + + for(var l=0;l<json[i][j][k].length;l++){ //for each cube add location (todo check if int) + var stockBuilt=false; + if(buildList.listZ[i].listSize[j].size==1){ + stockBuilt=true; + } + buildList.listZ[i].listSize[j].listSDF[k].listCubes.push({ + layerZ:buildList.listZ[i].layerZ, + size:buildList.listZ[i].listSize[j].size, + sdfRank:buildList.listZ[i].listSize[j].listSDF[k].sdfRank, + done:false, + stockBuilt:stockBuilt, + stockAssigned:false, + stockPickedUp:false, + position:new THREE.Vector3( + json[i][j][k][l].origin[0]*scale+shift, + json[i][j][k][l].origin[2]*scale+shift, + json[i][j][k][l].origin[1]*scale+1) + }); + + setup.nodes.push({ + path:"["+i+","+j+","+k+","+l+"]", + size:200*buildList.listZ[i].listSize[j].size, + module:"["+i+"]", + // name:"layer:"+i+", size:"+buildList.listZ[i].listSize[j].size+", sdf:"+k+", cube:"+l+"", + name:"x:"+json[i][j][k][l].origin[0]*scale+", y:"+json[i][j][k][l].origin[2]*scale+", z:"+(json[i][j][k][l].origin[1]*scale+1.0), + level:4, + order:order + }); + setup.edges.push({source: "["+i+","+j+","+k+"]", target: "["+i+","+j+","+k+","+l+"]"}); + + + + + } + order++; + } + } + } + + maxOrder=order; + + return buildList; +} + +// the one for the simulation +function createBuildList1(json, setup, scale){ + var offset2=12; + var offset=offset2+8; + var buildSize=32; + var gridSize=buildSize+2*(offset); + var opacity=0.9; + var order1=0; + + + var voxelIndexList=[ + null, + { + size:1, + list:[ + new THREE.Vector3(0,0,0), + + ] + }, + { + size:2, + list:[ + new THREE.Vector3(0,0,0), + new THREE.Vector3(0,1,0), + new THREE.Vector3(1,0,0), + new THREE.Vector3(1,1,0), + new THREE.Vector3(0,0,1), + new THREE.Vector3(0,1,1), + new THREE.Vector3(1,0,1), + new THREE.Vector3(1,1,1) + ] + + }, + null, + { + size:4, + list:[ + new THREE.Vector3(0,0,0), + new THREE.Vector3(0,1,0), + new THREE.Vector3(0,2,0), + new THREE.Vector3(0,3,0), + + new THREE.Vector3(1,0,0), + new THREE.Vector3(1,1,0), + new THREE.Vector3(1,2,0), + new THREE.Vector3(1,3,0), + + new THREE.Vector3(2,0,0), + new THREE.Vector3(2,1,0), + new THREE.Vector3(2,2,0), + new THREE.Vector3(2,3,0), + + new THREE.Vector3(3,0,0), + new THREE.Vector3(3,1,0), + new THREE.Vector3(3,2,0), + new THREE.Vector3(3,3,0), + + + new THREE.Vector3(0,0,1), + new THREE.Vector3(0,1,1), + new THREE.Vector3(0,2,1), + new THREE.Vector3(0,3,1), + + new THREE.Vector3(1,0,1), + // new THREE.Vector3(1,1,1), + // new THREE.Vector3(1,2,1), + new THREE.Vector3(1,3,1), + + new THREE.Vector3(2,0,1), + // new THREE.Vector3(2,1,1), + // new THREE.Vector3(2,2,1), + new THREE.Vector3(2,3,1), + + new THREE.Vector3(3,0,1), + new THREE.Vector3(3,1,1), + new THREE.Vector3(3,2,1), + new THREE.Vector3(3,3,1), + + new THREE.Vector3(0,0,2), + new THREE.Vector3(0,1,2), + new THREE.Vector3(0,2,2), + new THREE.Vector3(0,3,2), + + new THREE.Vector3(1,0,2), + // new THREE.Vector3(1,1,2), + // new THREE.Vector3(1,2,2), + new THREE.Vector3(1,3,2), + + new THREE.Vector3(2,0,2), + // new THREE.Vector3(2,1,2), + // new THREE.Vector3(2,2,2), + new THREE.Vector3(2,3,2), + + new THREE.Vector3(3,0,2), + new THREE.Vector3(3,1,2), + new THREE.Vector3(3,2,2), + new THREE.Vector3(3,3,2), + + + new THREE.Vector3(0,0,3), + new THREE.Vector3(0,1,3), + new THREE.Vector3(0,2,3), + new THREE.Vector3(0,3,3), + + new THREE.Vector3(1,0,3), + new THREE.Vector3(1,1,3), + new THREE.Vector3(1,2,3), + new THREE.Vector3(1,3,3), + + new THREE.Vector3(2,0,3), + new THREE.Vector3(2,1,3), + new THREE.Vector3(2,2,3), + new THREE.Vector3(2,3,3), + + new THREE.Vector3(3,0,3), + new THREE.Vector3(3,1,3), + new THREE.Vector3(3,2,3), + new THREE.Vector3(3,3,3), + + ] + + } + + ]; + + var totalNumber=0; + + + var shift=gridSize/2.0; + + var buildList={ + currentZIndex:0, + maxZIndex:json.length, + listZ:[], + done:false, + availablePickup:[], + listToBuild:[] + + }; + // todo multiply by 4 as smallest size in cubeCone is 0.25 + // y is z and z is y + // shift z by 1 cause sacrificial layer is 0 + // shift x and y to not have negative values + + for(var i=0;i<json.length;i++){ //for each z layer bin + buildList.listZ.push({ + layerZ:json[i][0][0][0].origin[1]*scale+1, + done:false, + currentSizeIndex:0, + maxSizeIndex:json[i].length, + listSize:[] + }); + for(var j=0;j<json[i].length;j++){ //for each size bin + buildList.listZ[i].listSize.push({ + size:json[i][j][0][0].widths[0]*scale, + layerZ:buildList.listZ[i].layerZ, + done:false, + currentSDFIndex:0, + maxSDFIndex:json[i][j].length, + listSDF:[] + + }); + for(var k=0;k<json[i][j].length;k++){ //for each sdf bin (signed distance field) + buildList.listZ[i].listSize[j].listSDF.push({ + sdfRank:k, + layerZ:buildList.listZ[i].layerZ, + size:buildList.listZ[i].listSize[j].size, + done:false, + currentCubeIndex:0, + maxCubeIndex:json[i][j][k].length, + listCubes:[] + + + }); + + for(var l=0;l<json[i][j][k].length;l++){ //for each cube add location (todo check if int) + var stockBuilt=false; + totalNumber+=(buildList.listZ[i].listSize[j].size*buildList.listZ[i].listSize[j].size*buildList.listZ[i].listSize[j].size) + + if(buildList.listZ[i].listSize[j].size==1){ + stockBuilt=true; + } + buildList.listZ[i].listSize[j].listSDF[k].listCubes.push({ + layerZ:buildList.listZ[i].layerZ, + size:buildList.listZ[i].listSize[j].size, + sdfRank:buildList.listZ[i].listSize[j].listSDF[k].sdfRank, + done:false, + stockBuilt:stockBuilt, + stockAssigned:false, + stockPickedUp:false, + position:new THREE.Vector3( + json[i][j][k][l].origin[0]*scale+shift, + json[i][j][k][l].origin[2]*scale+shift, + json[i][j][k][l].origin[1]*scale+1) + }); + var nomSize=buildList.listZ[i].listSize[j].size; + var x=json[i][j][k][l].origin[0]*scale; + var y=json[i][j][k][l].origin[1]*scale; + var z=json[i][j][k][l].origin[2]*scale; + + // if(true){ + // if(json[i][j][k][l].origin[2]*scale+nomSize/2.0<0){ + if(json[i][j][k][l].origin[2]*scale+nomSize/2.0<0 || json[i][j][k][l].origin[0]*scale+nomSize/2.0<0){ + setup.nodes.push({ + id:"["+nomSize+","+x+","+y+","+z+"]", + position:{ + x:x+nomSize/2.0, + y:y+nomSize/2.0, + z:z+nomSize/2.0 + }, + displacement:{ + x:0, + y:0, + z:0 + }, + nomSize:nomSize, + orgNomSize:nomSize, + viz:opacity, + order:order1 + }); + + addEdge(setup,nomSize,nomSize,x,y,z,opacity); + + if(nomSize==2){ + for(var ii=0;ii<voxelIndexList[2].list.length;ii++){ + var nomSize1=1; + var x1=x+voxelIndexList[2].list[ii].x; + var y1=y+voxelIndexList[2].list[ii].y; + var z1=z+voxelIndexList[2].list[ii].z; + + setup.nodes.push({ + id:"["+nomSize1+","+x1+","+y1+","+z1+"]", + position:{ + x:x1+nomSize1/2.0, + y:y1+nomSize1/2.0, + z:z1+nomSize1/2.0 + }, + displacement:{ + x:0, + y:0, + z:0 + }, + nomSize:nomSize1, + orgNomSize:nomSize, + viz:0.0, + order:order1 + }); + + addEdge(setup,nomSize1,nomSize,x1,y1,z1,0); + + } + } + + + if(nomSize==4){ + for(var ii=0;ii<voxelIndexList[4].list.length;ii++){ + var nomSize1=1; + var x1=x+voxelIndexList[4].list[ii].x; + var y1=y+voxelIndexList[4].list[ii].y; + var z1=z+voxelIndexList[4].list[ii].z; + + setup.nodes.push({ + id:"["+nomSize1+","+x1+","+y1+","+z1+"]", + position:{ + x:x1+nomSize1/2.0, + y:y1+nomSize1/2.0, + z:z1+nomSize1/2.0 + }, + displacement:{ + x:0, + y:0, + z:0 + }, + nomSize:nomSize1, + orgNomSize:nomSize, + viz:0.0, + order:order1 + }); + + addEdge(setup,nomSize1,nomSize,x1,y1,z1,0); + } + + } + } + } + order1++; + } + } + } + + console.log("total number of blocks="+totalNumber) + + + maxOrder=order1; + console.log(maxOrder) + return buildList; +} + +//the original one +function createBuildList2(json, setup, scale,buildSize){ + var offset2=12; + var offset=offset2+8; + var gridSize=buildSize+2*(offset); + + + voxelIndexList=[ + null, + { + size:1, + list:[ + new THREE.Vector3(0,0,0), + + ] + }, + { + size:2, + list:[ + new THREE.Vector3(0,0,0), + new THREE.Vector3(0,1,0), + new THREE.Vector3(1,0,0), + new THREE.Vector3(1,1,0), + new THREE.Vector3(0,0,1), + new THREE.Vector3(0,1,1), + new THREE.Vector3(1,0,1), + new THREE.Vector3(1,1,1) + ] + + }, + null, + { + size:4, + list:[ + new THREE.Vector3(0,0,0), + new THREE.Vector3(0,1,0), + new THREE.Vector3(0,2,0), + new THREE.Vector3(0,3,0), + + new THREE.Vector3(1,0,0), + new THREE.Vector3(1,1,0), + new THREE.Vector3(1,2,0), + new THREE.Vector3(1,3,0), + + new THREE.Vector3(2,0,0), + new THREE.Vector3(2,1,0), + new THREE.Vector3(2,2,0), + new THREE.Vector3(2,3,0), + + new THREE.Vector3(3,0,0), + new THREE.Vector3(3,1,0), + new THREE.Vector3(3,2,0), + new THREE.Vector3(3,3,0), + + + new THREE.Vector3(0,0,1), + new THREE.Vector3(0,1,1), + new THREE.Vector3(0,2,1), + new THREE.Vector3(0,3,1), + + new THREE.Vector3(1,0,1), + // new THREE.Vector3(1,1,1), + // new THREE.Vector3(1,2,1), + new THREE.Vector3(1,3,1), + + new THREE.Vector3(2,0,1), + // new THREE.Vector3(2,1,1), + // new THREE.Vector3(2,2,1), + new THREE.Vector3(2,3,1), + + new THREE.Vector3(3,0,1), + new THREE.Vector3(3,1,1), + new THREE.Vector3(3,2,1), + new THREE.Vector3(3,3,1), + + new THREE.Vector3(0,0,2), + new THREE.Vector3(0,1,2), + new THREE.Vector3(0,2,2), + new THREE.Vector3(0,3,2), + + new THREE.Vector3(1,0,2), + // new THREE.Vector3(1,1,2), + // new THREE.Vector3(1,2,2), + new THREE.Vector3(1,3,2), + + new THREE.Vector3(2,0,2), + // new THREE.Vector3(2,1,2), + // new THREE.Vector3(2,2,2), + new THREE.Vector3(2,3,2), + + new THREE.Vector3(3,0,2), + new THREE.Vector3(3,1,2), + new THREE.Vector3(3,2,2), + new THREE.Vector3(3,3,2), + + + new THREE.Vector3(0,0,3), + new THREE.Vector3(0,1,3), + new THREE.Vector3(0,2,3), + new THREE.Vector3(0,3,3), + + new THREE.Vector3(1,0,3), + new THREE.Vector3(1,1,3), + new THREE.Vector3(1,2,3), + new THREE.Vector3(1,3,3), + + new THREE.Vector3(2,0,3), + new THREE.Vector3(2,1,3), + new THREE.Vector3(2,2,3), + new THREE.Vector3(2,3,3), + + new THREE.Vector3(3,0,3), + new THREE.Vector3(3,1,3), + new THREE.Vector3(3,2,3), + new THREE.Vector3(3,3,3), + + ] + + } + + ]; + + var shift=gridSize/2.0; + + var buildList={ + currentZIndex:0, + maxZIndex:json.length, + listZ:[], + done:false, + availablePickup:[], + listToBuild:[] + + }; + // todo multiply by 4 as smallest size in cubeCone is 0.25 + // y is z and z is y + // shift z by 1 cause sacrificial layer is 0 + // shift x and y to not have negative values + var totalNumber=0; + for(var i=0;i<json.length;i++){ //for each z layer bin + buildList.listZ.push({ + layerZ:json[i][0][0][0].origin[1]*scale+1, + done:false, + currentSizeIndex:0, + maxSizeIndex:json[i].length, + listSize:[] + }); + for(var j=0;j<json[i].length;j++){ //for each size bin + buildList.listZ[i].listSize.push({ + size:json[i][j][0][0].widths[0]*scale, + layerZ:buildList.listZ[i].layerZ, + done:false, + currentSDFIndex:0, + maxSDFIndex:json[i][j].length, + listSDF:[] + + }); + for(var k=0;k<json[i][j].length;k++){ //for each sdf bin (signed distance field) + buildList.listZ[i].listSize[j].listSDF.push({ + sdfRank:k, + layerZ:buildList.listZ[i].layerZ, + size:buildList.listZ[i].listSize[j].size, + done:false, + currentCubeIndex:0, + maxCubeIndex:json[i][j][k].length, + listCubes:[] + + + }); + + for(var l=0;l<json[i][j][k].length;l++){ //for each cube add location (todo check if int) + var stockBuilt=false; + totalNumber+=(buildList.listZ[i].listSize[j].size*buildList.listZ[i].listSize[j].size*buildList.listZ[i].listSize[j].size) + if(buildList.listZ[i].listSize[j].size==1){ + stockBuilt=true; + } + buildList.listZ[i].listSize[j].listSDF[k].listCubes.push({ + layerZ:buildList.listZ[i].layerZ, + size:buildList.listZ[i].listSize[j].size, + sdfRank:buildList.listZ[i].listSize[j].listSDF[k].sdfRank, + done:false, + stockBuilt:stockBuilt, + stockAssigned:false, + stockPickedUp:false, + position:new THREE.Vector3( + json[i][j][k][l].origin[0]*scale+shift, + json[i][j][k][l].origin[2]*scale+shift, + json[i][j][k][l].origin[1]*scale+1) + }); + + } + } + } + } + console.log("total number of blocks="+totalNumber) + + return buildList; +} + + +function drawGraph(setup){ + scale=10.0; + + gData = { + nodes: setup.nodes.map(node => ({ + id: node.id, + px:node.position.x*scale, + py:node.position.y*scale, + pz:node.position.z*scale, + dx:node.displacement.x*scale, + dy:node.displacement.y*scale, + dz:node.displacement.z*scale, + nomSize:node.nomSize, + viz:node.viz, + order:node.order + })), + links: setup.edges + .filter(edge => edge.id) + .map(edge => ({ + source: edge.source, + target: edge.target, + // color:getColor(edge.stress) + })) + }; + + + Graph1 = ForceGraph3D({ controlType: 'orbit' }).backgroundColor(color2) + (document.getElementById('graph1')) + .d3Force('center', null) + .d3Force('charge', null) + .linkWidth(1.0) + .linkOpacity(1.0) + // .nodeThreeObject(({ nomSize,viz,order }) => new THREE.Mesh( + // new THREE.BoxGeometry(scale*nomSize*0.9, scale*nomSize*0.9, scale*nomSize*0.9), + // new THREE.MeshLambertMaterial({ + // color: getColor(order, maxOrder+1 ,-1,colormap), + // transparent: true, + // opacity: viz + // }) + // ) + // ) + .nodeThreeObject(node => { + var mesh =new THREE.Mesh( + new THREE.BoxGeometry(scale*node.nomSize*0.9, scale*node.nomSize*0.9, scale*node.nomSize*0.9), + new THREE.MeshLambertMaterial({ + color: getColor(node.order,maxOrder ,0,colormap), + transparent: true, + opacity: node.viz + })); + if(node.viz==0){ + mesh.visible=false; + } + return mesh; + }) + .d3Force('box', () => { + + gData.nodes.forEach(node => { + node.fx=node.px; + node.fy=node.py; + node.fz=node.pz; + + }); + }) + + .cooldownTime(Infinity) + .graphData(gData) + // .height(window.innerHeight/3); + .width(1*window.innerWidth/2.1); + // .height(window.innerHeight); + + var count=0; + var totalCount=0; + var increment=true; + var speed=100; + var exaggeration=10000.0; + + + var helper = new THREE.GridHelper( scale*2, scale*2 ); + helper.position.y = 0; + helper.material.opacity = 0.5; + helper.material.transparent = true; + helper.scale.x=1.0*scale; + helper.scale.z=1.0*scale; + Graph1.scene().add(helper); + + var geometry = new THREE.ConeGeometry( scale*10*1.15, scale*16*1.15, 32 ); + var material = new THREE.MeshBasicMaterial( {color: color3} ); + cone = new THREE.Mesh( geometry, material ); + cone.position.y=scale*16*1.15/2.0; + + Graph1.scene().add( cone ); + + + + + +} + +/////////////utils//////////////////// + +function addEdge(setup,nomSize,orgNomSize,x,y,z,viz){ + + // var source="["+nomSize+","+x+","+y+","+z+"]"; + + // for(var i=-1;i<2;i++){ + // for(var j=-1;j<2;j++){ + // for(var k=-1;k<2;k++){ + // if(((i==0&&j==0)||(i==0&&k==0)||(j==0&&k==0))){ //not same voxel and no diagonals + // if(!(i==0&&j==0&&k==0)){ + // var x1=x+i*nomSize; + // var y1=y+j*nomSize; + // var z1=z+k*nomSize; + // var target="["+nomSize+","+x1+","+y1+","+z1+"]"; + // var node=setup.nodes.find(v => v.id === target); + // if(node!==undefined){ + // if(!(viz==0&&node.viz==0)){ + // setup.edges.push({ id: 'e'+setup.edges.length, source: source, target: target ,stress:0 }); + + // } + // if(orgNomSize!=node.orgNomSize){ + // setup.edges.push({ id: 'e'+setup.edges.length, source: source, target: target ,stress:0 }); + // } + // } + // } + // } + // } + // } + // } + +} + +function getColor(value,min, max,colormap){ + var val=map(value,min,max,1.0,0.5); + color=interpolateLinearly(val, colormap); + // return new THREE.Color(color[0],color[1],color[2]); + return new THREE.Color(color[0],color[1],color[2]).getHex(); + +} + +function getColor11(value,min, max,colormap){ + var val=map(value,min,max,0.2,1.0); + color=interpolateLinearly(val, colormap); + c=new THREE.Color(color[0],color[1],color[2]); + // console.log(c.getHexString()) + + // return new THREE.Color(color[0],color[1],color[2]); + return new THREE.Color(color[0],color[1],color[2]).getHexString(); + +} + +function interpolateLinearly(x, values) { + // Split values into four lists + var x_values = []; + var r_values = []; + var g_values = []; + var b_values = []; + for (i in values) { + x_values.push(values[i][0]); + r_values.push(values[i][1][0]); + g_values.push(values[i][1][1]); + b_values.push(values[i][1][2]); + } + var i = 1; + while (x_values[i] < x) { + i = i+1; + } + i = i-1; + var width = Math.abs(x_values[i] - x_values[i+1]); + var scaling_factor = (x - x_values[i]) / width; + // Get the new color values though interpolation + var r = r_values[i] + scaling_factor * (r_values[i+1] - r_values[i]) + var g = g_values[i] + scaling_factor * (g_values[i+1] - g_values[i]) + var b = b_values[i] + scaling_factor * (b_values[i+1] - b_values[i]) + return [enforceBounds(r), enforceBounds(g), enforceBounds(b)]; +} + +function enforceBounds(x) { + if (x < 0) { + return 0; + } else if (x > 1){ + return 1; + } else { + return x; + } +} + +function map (value, x1, y1, x2, y2) { + return (value - x1) * (y2 - x2) / (y1 - x1) + x2; +} + + + + diff --git a/recursive_swarm/js/decision/decision_old_estimate.js b/recursive_swarm/js/decision/decision_old_estimate.js new file mode 100644 index 0000000000000000000000000000000000000000..dda713deb2736d849eee976fbbde374d52251bff --- /dev/null +++ b/recursive_swarm/js/decision/decision_old_estimate.js @@ -0,0 +1,1516 @@ +// Amira Abdel-Rahman +// (c) Massachusetts Institute of Technology 2020 + + + +var buildList=[]; +var voxelIndexList; +var scale,setup; +setup={}; +setup.nodes=[]; +setup.edges=[]; +setup.viz={}; +setup.viz.colorMaps=[YlGnBu,coolwarm, winter ,jet]; +var colormap=YlGnBu; +var maxOrder; + +var Graph,gData; +var Graph1; + +var Robots; +var minCost=Infinity; +var minNodePath= "" ; + +function decisionTree(){ + + + + + Robots=[ + null, + { + size:1, + maxNum:4, + num:0 + }, + { + size:2, + maxNum:4, + num:0 + }, + null,//3 + { + size:4, + maxNum:4, + num:0 + }, + null,//5 + null,//6 + null,//7 + { + size:8, + maxNum:0, + num:0 + }, + null,//9 + null,//10 + null,//11 + null,//12 + null,//13 + null,//14 + null,//15 + { + size:16, + maxNum:0, + num:0 + }, + + ]; + scale=400; + + + Robots[1].num++; + setup.nodes.push({ + path:"", + name:"["+Robots[4].num +","+ Robots[2].num+","+ Robots[1].num+"]", + name:"Decision Tree\nr4:"+Robots[4].num +", r2:"+ Robots[2].num+", r1:"+ Robots[1].num+"", + size:scale, + min:false, + parent:"top", + c:color66, + }); + + + // console.log(estimateCost(Robots,"")); + + decision(setup,Robots,1,""); + + console.log("Min Node:"+minNodePath+"!!!"); + + var node=setup.nodes.filter(n => n.path==minNodePath)[0]; + node.min=true; + while(node.parent != "top"){ + var edge=setup.edges.filter(e => (e.source==node.parent) &&(e.target==node.path))[0]; + edge.min=true; + node=setup.nodes.filter(n => n.path==node.parent)[0]; + } + + var nodes=setup.nodes; + var links=setup.edges; + + Graph(document.getElementById('graph')).graphData({ nodes, links }); + + /// get cost estimate + var allCost=[]; + for(var i=1;i<=4;i++){ + allCost.push([]) + for(var j=0;j<=4;j++){ + allCost[i-1].push([]) + for(var k=0;k<=4;k++){ + var allRobots=[ + null, + { + size:1, + maxNum:i, + num:i + }, + { + size:2, + maxNum:j, + num:j + }, + null,//3 + { + size:4, + maxNum:k, + num:k + }, + null,//5 + null,//6 + null,//7 + { + size:8, + maxNum:0, + num:0 + }, + null,//9 + null,//10 + null,//11 + null,//12 + null,//13 + null,//14 + null,//15 + { + size:16, + maxNum:0, + num:0 + }, + + ]; + allCost[i-1][j].push(estimateCost(allRobots,"no")); + } + } + } + console.log(allCost) + + +} + +function decision(setup,robots,size,name){ + + + setup.nodes.push({ + path:name+"b", + type:"build", + // name:"expand:"+0, + // name:"["+robots[4].num +","+ robots[2].num+","+ robots[1].num+"] build cost:"+estimateCost(robots,name+"b"), + name:"Build \n Time: "+Math.floor(estimateCost(robots,name+"b")), + size:scale, + parent:name, + min:false, + c:'#56ffcc', + }); + setup.edges.push({source: name, target: name+"b",min:false}); + + + if(robots[size].num<robots[size].maxNum){ + var r=JSON.parse(JSON.stringify(robots)); + r[size].num++; + setup.nodes.push({ + path:name+"r", + type:"reproduce", + // name:"reproduce: ["+r[4].num +","+ r[2].num+","+ r[1].num+"]", + name:"Reproduce\nr4:"+r[4].num +", r2:"+ r[2].num+", r1:"+ r[1].num+"", + size:scale, + parent:name, + min:false, + c:color88, + + }); + setup.edges.push({source: name, target: name+"r",min:false}); + + //for each robot here propagate decision + decision(setup,r,size,name+"r"); + + } + + if(size<=2 && robots[size*2].num<robots[size*2].maxNum){ + var r=JSON.parse(JSON.stringify(robots)); + r[size*2].num++; + setup.nodes.push({ + path:name+"g", + type:"grow", + // name:"grow: ["+r[4].num +","+ r[2].num+","+ r[1].num+"]", + name:"Grow\nr4:"+r[4].num +", r2:"+ r[2].num+", r1:"+ r[1].num+"", + size:scale, + parent:name, + min:false, + c:color77, + + }); + setup.edges.push({source: name, target: name+"g",min:false});; + decision(setup,r,size*2,name+"g") + + } + + +} + +function estimateCost(robots,path){ + var cost =0; + //fisrt add cost of building robots + cost+=recursionCost(robots); + + var binZ=buildList.listZ[buildList.currentZIndex]; + var binSize=binZ.listSize[binZ.currentSizeIndex]; + var binSDF=binSize.listSDF[binSize.currentSDFIndex]; + + var indexZ=buildList.currentZIndex; + var indexSize=binZ.currentSizeIndex; + var indexSDF=binSize.currentSDFIndex; + + var maxIndexZ=buildList.maxZIndex; + var maxIndexSize=binZ.maxSizeIndex; + var maxIndexSDF=binSize.maxSDFIndex; + + for(var i=0;i<buildList.listZ.length;i++){ //for each z layer bin + binZ=buildList.listZ[i]; + indexZ=i; + maxIndexSize=binZ.maxSizeIndex; + + for(var j=0;j<binZ.listSize.length;j++){ //for each size bin + binSize=binZ.listSize[j]; + // console.log(binSize.size) + if(binSize.size>=1){ + indexSize=j; + maxIndexSDF=binSize.maxSDFIndex; + + for(var k=0;k<binSize.listSDF.length;k++){ //for each sdf bin (signed distance field) + binSDF=binSize.listSDF[k]; + indexSDF=k; + var cubesToBuild=[]; + var size=binSize.size; + + // console.log(size) + // console.log(voxelIndexList[4]) + + if(robots[size].num>0){ + //there is robots same size + cubesToBuild=binSDF.listCubes; + }else if(robots[binSize.size/2].num>0 &&binSize.size>=2 ){ + + //there is no robots same size, divide stock by 2 + for(var l=0;l<binSDF.listCubes.length;l++){ + for(var ii=0;ii<voxelIndexList[2].list.length;ii++){ + var x1=binSDF.listCubes[l].position.x+voxelIndexList[2].list[ii].x; + var y1=binSDF.listCubes[l].position.y+voxelIndexList[2].list[ii].y; + var z1=binSDF.listCubes[l].position.z+voxelIndexList[2].list[ii].z; + var stockBuilt=false; + if(buildList.listZ[i].listSize[j].size==1){ + stockBuilt=true; + } + cubesToBuild.push({ + layerZ:buildList.listZ[i].layerZ, + size:buildList.listZ[i].listSize[j].size, + sdfRank:buildList.listZ[i].listSize[j].listSDF[k].sdfRank, + done:false, + stockBuilt:stockBuilt, + stockAssigned:false, + stockPickedUp:false, + position:new THREE.Vector3( + x1, + y1, + z1) + }); + } + } + size=binSize.size/2; + + }else if(robots[binSize.size/4].num>0&&binSize.size>=4){ + //there is no robots same size, divide stock by 4 + for(var l=0;l<binSDF.listCubes.length;l++){ + for(var ii=0;ii<voxelIndexList[4].list.length;ii++){ + var x1=binSDF.listCubes[l].position.x+voxelIndexList[4].list[ii].x; + var y1=binSDF.listCubes[l].position.y+voxelIndexList[4].list[ii].y; + var z1=binSDF.listCubes[l].position.z+voxelIndexList[4].list[ii].z; + var stockBuilt=false; + if(buildList.listZ[i].listSize[j].size==1){ + stockBuilt=true; + } + cubesToBuild.push({ + layerZ:buildList.listZ[i].layerZ, + size:buildList.listZ[i].listSize[j].size, + sdfRank:buildList.listZ[i].listSize[j].listSDF[k].sdfRank, + done:false, + stockBuilt:stockBuilt, + stockAssigned:false, + stockPickedUp:false, + position:new THREE.Vector3( + x1, + y1, + z1) + }); + } + } + size=binSize.size/4; + + }else if(robots[binSize.size/8].num>0&&binSize.size>=8){ + //there is no robots same size, divide stock by 8 + for(var l=0;l<binSDF.listCubes.length;l++){ + for(var ii=0;ii<voxelIndexList[8].list.length;ii++){ + var x1=binSDF.listCubes[l].position.x+voxelIndexList[8].list[ii].x; + var y1=binSDF.listCubes[l].position.y+voxelIndexList[8].list[ii].y; + var z1=binSDF.listCubes[l].position.z+voxelIndexList[8].list[ii].z; + var stockBuilt=false; + if(buildList.listZ[i].listSize[j].size==1){ + stockBuilt=true; + } + cubesToBuild.push({ + layerZ:buildList.listZ[i].layerZ, + size:buildList.listZ[i].listSize[j].size, + sdfRank:buildList.listZ[i].listSize[j].listSDF[k].sdfRank, + done:false, + stockBuilt:stockBuilt, + stockAssigned:false, + stockPickedUp:false, + position:new THREE.Vector3( + x1, + y1, + z1) + }); + } + } + size=binSize.size/8; + + }else if(robots[binSize.size/16].num>0&&binSize.size>=16){ + //there is no robots same size, divide stock by 16 + for(var l=0;l<binSDF.listCubes.length;l++){ + for(var ii=0;ii<voxelIndexList[16].list.length;ii++){ + var x1=binSDF.listCubes[l].position.x+voxelIndexList[16].list[ii].x; + var y1=binSDF.listCubes[l].position.y+voxelIndexList[16].list[ii].y; + var z1=binSDF.listCubes[l].position.z+voxelIndexList[16].list[ii].z; + var stockBuilt=false; + if(buildList.listZ[i].listSize[j].size==1){ + stockBuilt=true; + } + cubesToBuild.push({ + layerZ:buildList.listZ[i].layerZ, + size:buildList.listZ[i].listSize[j].size, + sdfRank:buildList.listZ[i].listSize[j].listSDF[k].sdfRank, + done:false, + stockBuilt:stockBuilt, + stockAssigned:false, + stockPickedUp:false, + position:new THREE.Vector3( + x1, + y1, + z1) + }); + } + } + size=binSize.size/16; + + } + + //check how many in parallel + + var numRobotParallel= Math.floor(cubesToBuild.length / robots[size].num); + if((cubesToBuild.length/robots[size].num - Math.floor(cubesToBuild.length/robots[size].num))>0){ + numRobotParallel++; + } + + //get furthest robot + var furthestVoxel=new THREE.Vector3(0,0,0); + + for(var l=0;l<cubesToBuild.length;l++){ //for each cube add location (todo check if int) + if( (cubesToBuild[l].position.x+cubesToBuild[l].position.y+cubesToBuild[l].position.z) + > (furthestVoxel.x+furthestVoxel.y+furthestVoxel.z)){ + furthestVoxel=cubesToBuild[l].position.clone(); + } + } + cost+=(numRobotParallel*2*((furthestVoxel.x+furthestVoxel.y+furthestVoxel.z))); + + } + + }else{ + // console.log("BINSIZE:"+ binSize.size+"!!!!") + } + + } + } + + if(cost<minCost){ + if(path!="no"){ + minCost=cost; + minNodePath=path; + } + } + + + return cost; + +} + +function estimateCost1(robots,path){ + var cost =0; + //fisrt add cost of building robots + cost+=recursionCost(robots); + + var binZ=buildList.listZ[buildList.currentZIndex]; + var binSize=binZ.listSize[binZ.currentSizeIndex]; + var binSDF=binSize.listSDF[binSize.currentSDFIndex]; + + var indexZ=buildList.currentZIndex; + var indexSize=binZ.currentSizeIndex; + var indexSDF=binSize.currentSDFIndex; + + var maxIndexZ=buildList.maxZIndex; + var maxIndexSize=binZ.maxSizeIndex; + var maxIndexSDF=binSize.maxSDFIndex; + + for(var i=0;i<buildList.listZ.length;i++){ //for each z layer bin + binZ=buildList.listZ[i]; + indexZ=i; + maxIndexSize=binZ.maxSizeIndex; + + for(var j=0;j<binZ.listSize.length;j++){ //for each size bin + binSize=binZ.listSize[j]; + indexSize=j; + maxIndexSDF=binSize.maxSDFIndex; + + for(var k=0;k<binSize.listSDF.length;k++){ //for each sdf bin (signed distance field) + binSDF=binSize.listSDF[k]; + indexSDF=k; + var cubesToBuild=[]; + var size=binSize.size; + console.log(size) + + if(robots[size].num>0){ + //there is robots same size + cubesToBuild=binSDF.listCubes; + }else if(robots[binSize.size/2].num>0 &&binSize.size>=2 ){ + + //there is no robots same size, divide stock by 2 + for(var l=0;l<binSDF.listCubes.length;l++){ + for(var ii=0;ii<voxelIndexList[2].list.length;ii++){ + var x1=binSDF.listCubes[l].position.x+voxelIndexList[2].list[ii].x; + var y1=binSDF.listCubes[l].position.y+voxelIndexList[2].list[ii].y; + var z1=binSDF.listCubes[l].position.z+voxelIndexList[2].list[ii].z; + var stockBuilt=false; + if(buildList.listZ[i].listSize[j].size==1){ + stockBuilt=true; + } + cubesToBuild.push({ + layerZ:buildList.listZ[i].layerZ, + size:buildList.listZ[i].listSize[j].size, + sdfRank:buildList.listZ[i].listSize[j].listSDF[k].sdfRank, + done:false, + stockBuilt:stockBuilt, + stockAssigned:false, + stockPickedUp:false, + position:new THREE.Vector3( + x1, + y1, + z1) + }); + } + } + size=binSize.size/2; + + }else if(robots[binSize.size/4].num>0&&binSize.size>=4){ + //there is no robots same size, divide stock by 8 + for(var l=0;l<binSDF.listCubes.length;l++){ + for(var ii=0;ii<voxelIndexList[4].list.length;ii++){ + var x1=binSDF.listCubes[l].position.x+voxelIndexList[4].list[ii].x; + var y1=binSDF.listCubes[l].position.y+voxelIndexList[4].list[ii].y; + var z1=binSDF.listCubes[l].position.z+voxelIndexList[4].list[ii].z; + var stockBuilt=false; + if(buildList.listZ[i].listSize[j].size==1){ + stockBuilt=true; + } + cubesToBuild.push({ + layerZ:buildList.listZ[i].layerZ, + size:buildList.listZ[i].listSize[j].size, + sdfRank:buildList.listZ[i].listSize[j].listSDF[k].sdfRank, + done:false, + stockBuilt:stockBuilt, + stockAssigned:false, + stockPickedUp:false, + position:new THREE.Vector3( + x1, + y1, + z1) + }); + } + } + size=binSize.size/4; + + } + + //check how many in parallel + + var numRobotParallel= Math.floor(cubesToBuild.length / robots[size].num); + if((cubesToBuild.length/robots[size].num - Math.floor(cubesToBuild.length/robots[size].num))>0){ + numRobotParallel++; + } + + //get furthest robot + var furthestVoxel=new THREE.Vector3(0,0,0); + + for(var l=0;l<cubesToBuild.length;l++){ //for each cube add location (todo check if int) + if( (cubesToBuild[l].position.x+cubesToBuild[l].position.y+cubesToBuild[l].position.z) + > (furthestVoxel.x+furthestVoxel.y+furthestVoxel.z)){ + furthestVoxel=cubesToBuild[l].position.clone(); + } + } + cost+=(numRobotParallel*2*((furthestVoxel.x+furthestVoxel.y+furthestVoxel.z))); + + } + } + } + + if(cost<minCost){ + minCost=cost; + minNodePath=path; + } + + + return cost; + +} + +function recursionCost(robots){ + //todo fix to more accurate estimate + // return cubeCost(2,2,2)*robots[1].num+cubeCost(4,4,4)*robots[2].num+cubeCost(8,8,8)*robots[4].num; + return robots[1].num*Math.log2(robots[1].num)+2*robots[2].num*Math.log2(2*robots[2].num)+4*robots[4].num*Math.log2(4*robots[4].num); + return cubeCost(1,1,1)*robots[1].num+cubeCost(2,2,2)*robots[2].num+cubeCost(4,4,4)*robots[4].num; + +} + +function cubeCost(x,y,z){ + return 2.0*(((x*x+x)/2)*y*z + ((y*y+y)/2)*x*z + ((z*z+z)/2)*y*x); +} + +///////////////////////////////////////////// + +//the one for vis built sequence no decision tree +function createBuildList(json, setup, scale){ + var offset2=12; + var offset=offset2+8; + var buildSize=32; + var gridSize=buildSize+2*(offset); + var order=0; + + var voxelIndexList=[ + null, + { + size:1, + list:[ + new THREE.Vector3(0,0,0), + + ] + }, + { + size:2, + list:[ + new THREE.Vector3(0,0,0), + new THREE.Vector3(0,1,0), + new THREE.Vector3(1,0,0), + new THREE.Vector3(1,1,0), + new THREE.Vector3(0,0,1), + new THREE.Vector3(0,1,1), + new THREE.Vector3(1,0,1), + new THREE.Vector3(1,1,1) + ] + + }, + null, + { + size:4, + list:[ + new THREE.Vector3(0,0,0), + new THREE.Vector3(0,1,0), + new THREE.Vector3(0,2,0), + new THREE.Vector3(0,3,0), + + new THREE.Vector3(1,0,0), + new THREE.Vector3(1,1,0), + new THREE.Vector3(1,2,0), + new THREE.Vector3(1,3,0), + + new THREE.Vector3(2,0,0), + new THREE.Vector3(2,1,0), + new THREE.Vector3(2,2,0), + new THREE.Vector3(2,3,0), + + new THREE.Vector3(3,0,0), + new THREE.Vector3(3,1,0), + new THREE.Vector3(3,2,0), + new THREE.Vector3(3,3,0), + + + new THREE.Vector3(0,0,1), + new THREE.Vector3(0,1,1), + new THREE.Vector3(0,2,1), + new THREE.Vector3(0,3,1), + + new THREE.Vector3(1,0,1), + // new THREE.Vector3(1,1,1), + // new THREE.Vector3(1,2,1), + new THREE.Vector3(1,3,1), + + new THREE.Vector3(2,0,1), + // new THREE.Vector3(2,1,1), + // new THREE.Vector3(2,2,1), + new THREE.Vector3(2,3,1), + + new THREE.Vector3(3,0,1), + new THREE.Vector3(3,1,1), + new THREE.Vector3(3,2,1), + new THREE.Vector3(3,3,1), + + new THREE.Vector3(0,0,2), + new THREE.Vector3(0,1,2), + new THREE.Vector3(0,2,2), + new THREE.Vector3(0,3,2), + + new THREE.Vector3(1,0,2), + // new THREE.Vector3(1,1,2), + // new THREE.Vector3(1,2,2), + new THREE.Vector3(1,3,2), + + new THREE.Vector3(2,0,2), + // new THREE.Vector3(2,1,2), + // new THREE.Vector3(2,2,2), + new THREE.Vector3(2,3,2), + + new THREE.Vector3(3,0,2), + new THREE.Vector3(3,1,2), + new THREE.Vector3(3,2,2), + new THREE.Vector3(3,3,2), + + + new THREE.Vector3(0,0,3), + new THREE.Vector3(0,1,3), + new THREE.Vector3(0,2,3), + new THREE.Vector3(0,3,3), + + new THREE.Vector3(1,0,3), + new THREE.Vector3(1,1,3), + new THREE.Vector3(1,2,3), + new THREE.Vector3(1,3,3), + + new THREE.Vector3(2,0,3), + new THREE.Vector3(2,1,3), + new THREE.Vector3(2,2,3), + new THREE.Vector3(2,3,3), + + new THREE.Vector3(3,0,3), + new THREE.Vector3(3,1,3), + new THREE.Vector3(3,2,3), + new THREE.Vector3(3,3,3), + + ] + + } + + ]; + + var shift=gridSize/2.0; + + var buildList={ + currentZIndex:0, + maxZIndex:json.length, + listZ:[], + done:false, + availablePickup:[], + listToBuild:[] + + }; + // todo multiply by 4 as smallest size in cubeCone is 0.25 + // y is z and z is y + // shift z by 1 cause sacrificial layer is 0 + // shift x and y to not have negative values + + setup.nodes.push({ + path:"[]", + size:100, + name:"", + level:0, + order:order + }); + + for(var i=0;i<json.length;i++){ //for each z layer bin + buildList.listZ.push({ + layerZ:json[i][0][0][0].origin[1]*scale+1, + done:false, + currentSizeIndex:0, + maxSizeIndex:json[i].length, + listSize:[] + }); + + setup.nodes.push({ + path:"["+i+"]", + size:100, + module:"["+i+"]", + name:"layer:"+i+"", + level:1, + order:order + }); + setup.edges.push({source: "[]", target: "["+i+"]"}); + + for(var j=0;j<json[i].length;j++){ //for each size bin + buildList.listZ[i].listSize.push({ + size:json[i][j][0][0].widths[0]*scale, + layerZ:buildList.listZ[i].layerZ, + done:false, + currentSDFIndex:0, + maxSDFIndex:json[i][j].length, + listSDF:[] + + }); + + setup.nodes.push({ + path:"["+i+","+j+"]", + size:100, + module:"["+i+"]", + name:"layer:"+i+", size:"+json[i][j][0][0].widths[0]*scale+"", + level:2, + order:order + }); + setup.edges.push({source: "["+i+"]", target: "["+i+","+j+"]"}); + + for(var k=0;k<json[i][j].length;k++){ //for each sdf bin (signed distance field) + buildList.listZ[i].listSize[j].listSDF.push({ + sdfRank:k, + layerZ:buildList.listZ[i].layerZ, + size:buildList.listZ[i].listSize[j].size, + done:false, + currentCubeIndex:0, + maxCubeIndex:json[i][j][k].length, + listCubes:[] + + + }); + + setup.nodes.push({ + path:"["+i+","+j+","+k+"]", + size:100, + module:"["+i+"]", + name:"layer:"+i+", size:"+buildList.listZ[i].listSize[j].size+", sdf:"+k+"", + level:3, + order:order + }); + setup.edges.push({source: "["+i+","+j+"]", target: "["+i+","+j+","+k+"]"}); + + + for(var l=0;l<json[i][j][k].length;l++){ //for each cube add location (todo check if int) + var stockBuilt=false; + if(buildList.listZ[i].listSize[j].size==1){ + stockBuilt=true; + } + buildList.listZ[i].listSize[j].listSDF[k].listCubes.push({ + layerZ:buildList.listZ[i].layerZ, + size:buildList.listZ[i].listSize[j].size, + sdfRank:buildList.listZ[i].listSize[j].listSDF[k].sdfRank, + done:false, + stockBuilt:stockBuilt, + stockAssigned:false, + stockPickedUp:false, + position:new THREE.Vector3( + json[i][j][k][l].origin[0]*scale+shift, + json[i][j][k][l].origin[2]*scale+shift, + json[i][j][k][l].origin[1]*scale+1) + }); + + setup.nodes.push({ + path:"["+i+","+j+","+k+","+l+"]", + size:200*buildList.listZ[i].listSize[j].size, + module:"["+i+"]", + // name:"layer:"+i+", size:"+buildList.listZ[i].listSize[j].size+", sdf:"+k+", cube:"+l+"", + name:"x:"+json[i][j][k][l].origin[0]*scale+", y:"+json[i][j][k][l].origin[2]*scale+", z:"+(json[i][j][k][l].origin[1]*scale+1.0), + level:4, + order:order + }); + setup.edges.push({source: "["+i+","+j+","+k+"]", target: "["+i+","+j+","+k+","+l+"]"}); + + + + + } + order++; + } + } + } + + maxOrder=order; + + return buildList; +} + +// the one for the simulation +function createBuildList1(json, setup, scale){ + var offset2=12; + var offset=offset2+8; + var buildSize=32; + var gridSize=buildSize+2*(offset); + var opacity=0.9; + var order1=0; + + + var voxelIndexList=[ + null, + { + size:1, + list:[ + new THREE.Vector3(0,0,0), + + ] + }, + { + size:2, + list:[ + new THREE.Vector3(0,0,0), + new THREE.Vector3(0,1,0), + new THREE.Vector3(1,0,0), + new THREE.Vector3(1,1,0), + new THREE.Vector3(0,0,1), + new THREE.Vector3(0,1,1), + new THREE.Vector3(1,0,1), + new THREE.Vector3(1,1,1) + ] + + }, + null, + { + size:4, + list:[ + new THREE.Vector3(0,0,0), + new THREE.Vector3(0,1,0), + new THREE.Vector3(0,2,0), + new THREE.Vector3(0,3,0), + + new THREE.Vector3(1,0,0), + new THREE.Vector3(1,1,0), + new THREE.Vector3(1,2,0), + new THREE.Vector3(1,3,0), + + new THREE.Vector3(2,0,0), + new THREE.Vector3(2,1,0), + new THREE.Vector3(2,2,0), + new THREE.Vector3(2,3,0), + + new THREE.Vector3(3,0,0), + new THREE.Vector3(3,1,0), + new THREE.Vector3(3,2,0), + new THREE.Vector3(3,3,0), + + + new THREE.Vector3(0,0,1), + new THREE.Vector3(0,1,1), + new THREE.Vector3(0,2,1), + new THREE.Vector3(0,3,1), + + new THREE.Vector3(1,0,1), + // new THREE.Vector3(1,1,1), + // new THREE.Vector3(1,2,1), + new THREE.Vector3(1,3,1), + + new THREE.Vector3(2,0,1), + // new THREE.Vector3(2,1,1), + // new THREE.Vector3(2,2,1), + new THREE.Vector3(2,3,1), + + new THREE.Vector3(3,0,1), + new THREE.Vector3(3,1,1), + new THREE.Vector3(3,2,1), + new THREE.Vector3(3,3,1), + + new THREE.Vector3(0,0,2), + new THREE.Vector3(0,1,2), + new THREE.Vector3(0,2,2), + new THREE.Vector3(0,3,2), + + new THREE.Vector3(1,0,2), + // new THREE.Vector3(1,1,2), + // new THREE.Vector3(1,2,2), + new THREE.Vector3(1,3,2), + + new THREE.Vector3(2,0,2), + // new THREE.Vector3(2,1,2), + // new THREE.Vector3(2,2,2), + new THREE.Vector3(2,3,2), + + new THREE.Vector3(3,0,2), + new THREE.Vector3(3,1,2), + new THREE.Vector3(3,2,2), + new THREE.Vector3(3,3,2), + + + new THREE.Vector3(0,0,3), + new THREE.Vector3(0,1,3), + new THREE.Vector3(0,2,3), + new THREE.Vector3(0,3,3), + + new THREE.Vector3(1,0,3), + new THREE.Vector3(1,1,3), + new THREE.Vector3(1,2,3), + new THREE.Vector3(1,3,3), + + new THREE.Vector3(2,0,3), + new THREE.Vector3(2,1,3), + new THREE.Vector3(2,2,3), + new THREE.Vector3(2,3,3), + + new THREE.Vector3(3,0,3), + new THREE.Vector3(3,1,3), + new THREE.Vector3(3,2,3), + new THREE.Vector3(3,3,3), + + ] + + } + + ]; + + + + var shift=gridSize/2.0; + + var buildList={ + currentZIndex:0, + maxZIndex:json.length, + listZ:[], + done:false, + availablePickup:[], + listToBuild:[] + + }; + // todo multiply by 4 as smallest size in cubeCone is 0.25 + // y is z and z is y + // shift z by 1 cause sacrificial layer is 0 + // shift x and y to not have negative values + + for(var i=0;i<json.length;i++){ //for each z layer bin + buildList.listZ.push({ + layerZ:json[i][0][0][0].origin[1]*scale+1, + done:false, + currentSizeIndex:0, + maxSizeIndex:json[i].length, + listSize:[] + }); + for(var j=0;j<json[i].length;j++){ //for each size bin + buildList.listZ[i].listSize.push({ + size:json[i][j][0][0].widths[0]*scale, + layerZ:buildList.listZ[i].layerZ, + done:false, + currentSDFIndex:0, + maxSDFIndex:json[i][j].length, + listSDF:[] + + }); + for(var k=0;k<json[i][j].length;k++){ //for each sdf bin (signed distance field) + buildList.listZ[i].listSize[j].listSDF.push({ + sdfRank:k, + layerZ:buildList.listZ[i].layerZ, + size:buildList.listZ[i].listSize[j].size, + done:false, + currentCubeIndex:0, + maxCubeIndex:json[i][j][k].length, + listCubes:[] + + + }); + + for(var l=0;l<json[i][j][k].length;l++){ //for each cube add location (todo check if int) + var stockBuilt=false; + if(buildList.listZ[i].listSize[j].size==1){ + stockBuilt=true; + } + buildList.listZ[i].listSize[j].listSDF[k].listCubes.push({ + layerZ:buildList.listZ[i].layerZ, + size:buildList.listZ[i].listSize[j].size, + sdfRank:buildList.listZ[i].listSize[j].listSDF[k].sdfRank, + done:false, + stockBuilt:stockBuilt, + stockAssigned:false, + stockPickedUp:false, + position:new THREE.Vector3( + json[i][j][k][l].origin[0]*scale+shift, + json[i][j][k][l].origin[2]*scale+shift, + json[i][j][k][l].origin[1]*scale+1) + }); + var nomSize=buildList.listZ[i].listSize[j].size; + var x=json[i][j][k][l].origin[0]*scale; + var y=json[i][j][k][l].origin[1]*scale; + var z=json[i][j][k][l].origin[2]*scale; + + // if(true){ + // if(json[i][j][k][l].origin[2]*scale+nomSize/2.0<0){ + if(json[i][j][k][l].origin[2]*scale+nomSize/2.0<0 || json[i][j][k][l].origin[0]*scale+nomSize/2.0<0){ + setup.nodes.push({ + id:"["+nomSize+","+x+","+y+","+z+"]", + position:{ + x:x+nomSize/2.0, + y:y+nomSize/2.0, + z:z+nomSize/2.0 + }, + displacement:{ + x:0, + y:0, + z:0 + }, + nomSize:nomSize, + orgNomSize:nomSize, + viz:opacity, + order:order1 + }); + + addEdge(setup,nomSize,nomSize,x,y,z,opacity); + + if(nomSize==2){ + for(var ii=0;ii<voxelIndexList[2].list.length;ii++){ + var nomSize1=1; + var x1=x+voxelIndexList[2].list[ii].x; + var y1=y+voxelIndexList[2].list[ii].y; + var z1=z+voxelIndexList[2].list[ii].z; + + setup.nodes.push({ + id:"["+nomSize1+","+x1+","+y1+","+z1+"]", + position:{ + x:x1+nomSize1/2.0, + y:y1+nomSize1/2.0, + z:z1+nomSize1/2.0 + }, + displacement:{ + x:0, + y:0, + z:0 + }, + nomSize:nomSize1, + orgNomSize:nomSize, + viz:0.0, + order:order1 + }); + + addEdge(setup,nomSize1,nomSize,x1,y1,z1,0); + + } + } + + + if(nomSize==4){ + for(var ii=0;ii<voxelIndexList[4].list.length;ii++){ + var nomSize1=1; + var x1=x+voxelIndexList[4].list[ii].x; + var y1=y+voxelIndexList[4].list[ii].y; + var z1=z+voxelIndexList[4].list[ii].z; + + setup.nodes.push({ + id:"["+nomSize1+","+x1+","+y1+","+z1+"]", + position:{ + x:x1+nomSize1/2.0, + y:y1+nomSize1/2.0, + z:z1+nomSize1/2.0 + }, + displacement:{ + x:0, + y:0, + z:0 + }, + nomSize:nomSize1, + orgNomSize:nomSize, + viz:0.0, + order:order1 + }); + + addEdge(setup,nomSize1,nomSize,x1,y1,z1,0); + } + + } + } + } + order1++; + } + } + } + + maxOrder=order1; + console.log(maxOrder) + return buildList; +} + +//the original one +function createBuildList2(json, setup, scale,buildSize){ + var offset2=12; + var offset=offset2+8; + var gridSize=buildSize+2*(offset); + + + voxelIndexList=[ + null, + { + size:1, + list:[ + new THREE.Vector3(0,0,0), + + ] + }, + { + size:2, + list:[ + new THREE.Vector3(0,0,0), + new THREE.Vector3(0,1,0), + new THREE.Vector3(1,0,0), + new THREE.Vector3(1,1,0), + new THREE.Vector3(0,0,1), + new THREE.Vector3(0,1,1), + new THREE.Vector3(1,0,1), + new THREE.Vector3(1,1,1) + ] + + }, + null, + { + size:4, + list:[ + new THREE.Vector3(0,0,0), + new THREE.Vector3(0,1,0), + new THREE.Vector3(0,2,0), + new THREE.Vector3(0,3,0), + + new THREE.Vector3(1,0,0), + new THREE.Vector3(1,1,0), + new THREE.Vector3(1,2,0), + new THREE.Vector3(1,3,0), + + new THREE.Vector3(2,0,0), + new THREE.Vector3(2,1,0), + new THREE.Vector3(2,2,0), + new THREE.Vector3(2,3,0), + + new THREE.Vector3(3,0,0), + new THREE.Vector3(3,1,0), + new THREE.Vector3(3,2,0), + new THREE.Vector3(3,3,0), + + + new THREE.Vector3(0,0,1), + new THREE.Vector3(0,1,1), + new THREE.Vector3(0,2,1), + new THREE.Vector3(0,3,1), + + new THREE.Vector3(1,0,1), + // new THREE.Vector3(1,1,1), + // new THREE.Vector3(1,2,1), + new THREE.Vector3(1,3,1), + + new THREE.Vector3(2,0,1), + // new THREE.Vector3(2,1,1), + // new THREE.Vector3(2,2,1), + new THREE.Vector3(2,3,1), + + new THREE.Vector3(3,0,1), + new THREE.Vector3(3,1,1), + new THREE.Vector3(3,2,1), + new THREE.Vector3(3,3,1), + + new THREE.Vector3(0,0,2), + new THREE.Vector3(0,1,2), + new THREE.Vector3(0,2,2), + new THREE.Vector3(0,3,2), + + new THREE.Vector3(1,0,2), + // new THREE.Vector3(1,1,2), + // new THREE.Vector3(1,2,2), + new THREE.Vector3(1,3,2), + + new THREE.Vector3(2,0,2), + // new THREE.Vector3(2,1,2), + // new THREE.Vector3(2,2,2), + new THREE.Vector3(2,3,2), + + new THREE.Vector3(3,0,2), + new THREE.Vector3(3,1,2), + new THREE.Vector3(3,2,2), + new THREE.Vector3(3,3,2), + + + new THREE.Vector3(0,0,3), + new THREE.Vector3(0,1,3), + new THREE.Vector3(0,2,3), + new THREE.Vector3(0,3,3), + + new THREE.Vector3(1,0,3), + new THREE.Vector3(1,1,3), + new THREE.Vector3(1,2,3), + new THREE.Vector3(1,3,3), + + new THREE.Vector3(2,0,3), + new THREE.Vector3(2,1,3), + new THREE.Vector3(2,2,3), + new THREE.Vector3(2,3,3), + + new THREE.Vector3(3,0,3), + new THREE.Vector3(3,1,3), + new THREE.Vector3(3,2,3), + new THREE.Vector3(3,3,3), + + ] + + }, + null,//5 + null,//6 + null,//7 + { + size:8, + list:[] + }, + null,//9 + null,//10 + null,//11 + null,//12 + null,//13 + null,//14 + null,//15 + { + size:16, + list:[] + }, + + + ]; + + var temp=[]; + for(var i=0;i<voxelIndexList[2].list.length;i++){ + for(var j=0;j<voxelIndexList[2].list.length;j++){ + temp.push( + voxelIndexList[2].list[i].clone().multiplyScalar(2).add(voxelIndexList[2].list[j].clone()) + ); + } + } + voxelIndexList[4].list=temp; + + for(var i=0;i<8;i++){ + for(var j=0;j<8;j++){ + for(var k=0;k<8;k++){ + voxelIndexList[8].list.push(new THREE.Vector3(i,j,k)); + } + } + } + + for(var i=0;i<16;i++){ + for(var j=0;j<16;j++){ + for(var k=0;k<16;k++){ + voxelIndexList[16].list.push(new THREE.Vector3(i,j,k)); + } + } + } + console.log(voxelIndexList) + + var shift=gridSize/2.0; + + var buildList={ + currentZIndex:0, + maxZIndex:json.length, + listZ:[], + done:false, + availablePickup:[], + listToBuild:[] + + }; + // todo multiply by 4 as smallest size in cubeCone is 0.25 + // y is z and z is y + // shift z by 1 cause sacrificial layer is 0 + // shift x and y to not have negative values + + for(var i=0;i<json.length;i++){ //for each z layer bin + buildList.listZ.push({ + layerZ:json[i][0][0][0].origin[1]*scale+1, + done:false, + currentSizeIndex:0, + maxSizeIndex:json[i].length, + listSize:[] + }); + for(var j=0;j<json[i].length;j++){ //for each size bin + buildList.listZ[i].listSize.push({ + size:json[i][j][0][0].widths[0]*scale, + layerZ:buildList.listZ[i].layerZ, + done:false, + currentSDFIndex:0, + maxSDFIndex:json[i][j].length, + listSDF:[] + + }); + for(var k=0;k<json[i][j].length;k++){ //for each sdf bin (signed distance field) + buildList.listZ[i].listSize[j].listSDF.push({ + sdfRank:k, + layerZ:buildList.listZ[i].layerZ, + size:buildList.listZ[i].listSize[j].size, + done:false, + currentCubeIndex:0, + maxCubeIndex:json[i][j][k].length, + listCubes:[] + + + }); + + for(var l=0;l<json[i][j][k].length;l++){ //for each cube add location (todo check if int) + var stockBuilt=false; + if(buildList.listZ[i].listSize[j].size==1){ + stockBuilt=true; + } + buildList.listZ[i].listSize[j].listSDF[k].listCubes.push({ + layerZ:buildList.listZ[i].layerZ, + size:buildList.listZ[i].listSize[j].size, + sdfRank:buildList.listZ[i].listSize[j].listSDF[k].sdfRank, + done:false, + stockBuilt:stockBuilt, + stockAssigned:false, + stockPickedUp:false, + position:new THREE.Vector3( + json[i][j][k][l].origin[0]*scale+shift, + json[i][j][k][l].origin[2]*scale+shift, + json[i][j][k][l].origin[1]*scale+1) + }); + + } + } + } + } + + return buildList; +} + + +function drawGraph(setup){ + scale=10.0; + + gData = { + nodes: setup.nodes.map(node => ({ + id: node.id, + px:node.position.x*scale, + py:node.position.y*scale, + pz:node.position.z*scale, + dx:node.displacement.x*scale, + dy:node.displacement.y*scale, + dz:node.displacement.z*scale, + nomSize:node.nomSize, + viz:node.viz, + order:node.order + })), + links: setup.edges + .filter(edge => edge.id) + .map(edge => ({ + source: edge.source, + target: edge.target, + // color:getColor(edge.stress) + })) + }; + + + Graph1 = ForceGraph3D({ controlType: 'orbit' }).backgroundColor(color1) + (document.getElementById('graph1')) + .d3Force('center', null) + .d3Force('charge', null) + .linkWidth(1.0) + .linkOpacity(1.0) + // .nodeThreeObject(({ nomSize,viz,order }) => new THREE.Mesh( + // new THREE.BoxGeometry(scale*nomSize*0.9, scale*nomSize*0.9, scale*nomSize*0.9), + // new THREE.MeshLambertMaterial({ + // color: getColor(order,maxOrder ,0,colormap), + // transparent: true, + // opacity: viz + // }) + // ) + // ) + .nodeThreeObject(node => { + var mesh =new THREE.Mesh( + new THREE.BoxGeometry(scale*node.nomSize*0.9, scale*node.nomSize*0.9, scale*node.nomSize*0.9), + new THREE.MeshLambertMaterial({ + color: getColor(node.order,maxOrder ,0,colormap), + transparent: true, + opacity: node.viz + })); + if(node.viz==0){ + mesh.visible=false; + } + return mesh; + }) + .d3Force('box', () => { + + gData.nodes.forEach(node => { + node.fx=node.px; + node.fy=node.py; + node.fz=node.pz; + + }); + }) + + .cooldownTime(Infinity) + .graphData(gData) + .height(window.innerHeight/3); + // .height(window.innerHeight); + + var count=0; + var totalCount=0; + var increment=true; + var speed=100; + var exaggeration=10000.0; + + + var helper = new THREE.GridHelper( scale*2, scale*2 ); + helper.position.y = 0; + helper.material.opacity = 0.5; + helper.material.transparent = true; + helper.scale.x=1.0*scale + helper.scale.z=1.0*scale + // Graph1.scene().add(helper); + + +} + +/////////////utils//////////////////// + +function addEdge(setup,nomSize,orgNomSize,x,y,z,viz){ + + // var source="["+nomSize+","+x+","+y+","+z+"]"; + + // for(var i=-1;i<2;i++){ + // for(var j=-1;j<2;j++){ + // for(var k=-1;k<2;k++){ + // if(((i==0&&j==0)||(i==0&&k==0)||(j==0&&k==0))){ //not same voxel and no diagonals + // if(!(i==0&&j==0&&k==0)){ + // var x1=x+i*nomSize; + // var y1=y+j*nomSize; + // var z1=z+k*nomSize; + // var target="["+nomSize+","+x1+","+y1+","+z1+"]"; + // var node=setup.nodes.find(v => v.id === target); + // if(node!==undefined){ + // if(!(viz==0&&node.viz==0)){ + // setup.edges.push({ id: 'e'+setup.edges.length, source: source, target: target ,stress:0 }); + + // } + // if(orgNomSize!=node.orgNomSize){ + // setup.edges.push({ id: 'e'+setup.edges.length, source: source, target: target ,stress:0 }); + // } + // } + // } + // } + // } + // } + // } + +} + +function getColor(value,min, max,colormap){ + var val=map(value,min,max,1.0,0.0); + color=interpolateLinearly(val, colormap); + // return new THREE.Color(color[0],color[1],color[2]); + return new THREE.Color(color[0],color[1],color[2]).getHex(); + +} + +function interpolateLinearly(x, values) { + // Split values into four lists + var x_values = []; + var r_values = []; + var g_values = []; + var b_values = []; + for (i in values) { + x_values.push(values[i][0]); + r_values.push(values[i][1][0]); + g_values.push(values[i][1][1]); + b_values.push(values[i][1][2]); + } + var i = 1; + while (x_values[i] < x) { + i = i+1; + } + i = i-1; + var width = Math.abs(x_values[i] - x_values[i+1]); + var scaling_factor = (x - x_values[i]) / width; + // Get the new color values though interpolation + var r = r_values[i] + scaling_factor * (r_values[i+1] - r_values[i]) + var g = g_values[i] + scaling_factor * (g_values[i+1] - g_values[i]) + var b = b_values[i] + scaling_factor * (b_values[i+1] - b_values[i]) + return [enforceBounds(r), enforceBounds(g), enforceBounds(b)]; +} + +function enforceBounds(x) { + if (x < 0) { + return 0; + } else if (x > 1){ + return 1; + } else { + return x; + } +} + +function map (value, x1, y1, x2, y2) { + return (value - x1) * (y2 - x2) / (y1 - x1) + x2; +} + + + + diff --git a/recursive_swarm/js/swarm.js b/recursive_swarm/js/swarm.js new file mode 100644 index 0000000000000000000000000000000000000000..51c3c228f5999ea094e06b17bced84c3a27438bf --- /dev/null +++ b/recursive_swarm/js/swarm.js @@ -0,0 +1,282 @@ +// Amira Abdel-Rahman +// (c) Massachusetts Institute of Technology 2020 + + + +///////////////////////////TODO/////////////////////////////// +//- change robot to prototype not list +//- change path/steps to class +// you have name the swarm object recursiveSwarms for some functions to work (i'll change that later) + + +///////////////////////////globals/////////////////////////////// +function Swarm(setup){ + ///////////////////////////THREE/////////////////////////////// + // this.container =three.this.container; + // this.camera =three.this.camera; + // this.scene =three.this.scene ; + // this.renderer =three.this.renderer ; + this.setup=setup; + this.container =null; + this.camera =null; + this.scene =null; + this.renderer =null; + this.cameraControls=null; + this.three=setup.three; + this.geometryGui; //todo needed? + this.targetGui;//todo needed? + this.jointsGui;//todo needed? + this.jointsParams;//todo needed? + this.targetParams;//todo needed? + this.geometryParams;//todo needed? + this.end;//todo needed? + this.currentStep; + this.DEG_TO_RAD = Math.PI / 180; + this.RAD_TO_DEG = 180 / Math.PI; + // this.color2=GLOBALS.color2;//kohly + // this.color3=GLOBALS.color3;///*teal*/ + // this.color4= GLOBALS.color4; //red/orange + + ///////////////////////////this.voxels/////////////////////////////// + this.voxel=[]; + this.singleVoxel=null; + this.spacing=setup.voxelSpacing; + this.voxelSpacing=[]; + this.voxelLocations=[]; + this.voxelSlices=[]; + this.voxelSlicesCount=[]; + + this.currentVoxelCount=0; + this.build=[]; + + this.globalZ=0; + this.globalRank=0; + + this.voxelNum=0; + this.gridSize=setup.gridSize; + + this.stepsCap=500; //change with very big simulations + + this.grid=[]; + + this.dataAngles=[]; + + + ///////////////////////////robot/////////////////////////////// + this.numberOfRobots=setup.robotLocations.length; //change number of robots + // this.numberOfRobots=4; + this.numberOfStartLocations=setup.depositLocations.length; + // this.numberOfStartLocations=4; + this.speed=setup.viz.speed; //change to speed up the simulation + this.reducedViz=false; + this.renderInterval=1; + this.renderCounter=0; + + this.THREE1=[]; + this.robotBones = []; + this.joints = []; + this.angles = []; + + this.robotState=[]; + + this.THREERobot; + this.VisualRobot= []; + this.THREESimulationRobot= []; + this.defaultRobotState= []; + this.target = []; + this.control= []; + this.leg= []; + + this.voxelNormal= []; + this.normalAdjustmentVector= []; + + this.startLocations= []; + this.depositLocations= []; + + this.THREE1dir= []; + this.THREE1Pos= []; + + //path + this.targetPositionMesh= []; + this.carriedVoxel= []; + + this.goHome= []; + this.robotScale=[]; + this.labelRenderer=[] + + if(setup.path !== undefined){ + this.pathParams={ + showPath:setup.path.showPath, + cHeight:setup.path.cHeight, + number:setup.path.number + + } + }else{ + this.pathParams={ + showPath:false, + showPath:1.4, + number:20 + + } + + } + + this.waitTime=10; + + if(setup.robotGeometry !== undefined){ + this.robotGeometry={ + leg1: setup.robotGeometry.leg1, + leg2: setup.robotGeometry.leg2, + offset: setup.robotGeometry.offset + + } + }else{ + this.robotGeometry={ + leg1:5, + leg2:5, + offset:2 + + } + + } + + ////////////////////// + + this.steps=[]; + this.path= []; + + this.totalNumberofSteps=[]; + this.guiControls=[]; + this.showGUI= setup.viz.showGUI; + + if(this.showGUI){ + this.saveAngleData=setup.viz.saveAngleData; + }else{ + this.saveAngleData=false; + } + + this.buildType=setup.buildType; + this.hierarchical=setup.hierarchical; + + if(this.buildType=="directions"){ + this.stepsDir=setup.stepsDir; + + } + + for (var i=0; i<this.numberOfRobots;i++){ + this.robotScale.push(setup.robotLocations[i][2]); + this.voxelSpacing.push(setup.voxelSpacing*this.robotScale[i]); + + } + + ///////////////////////function calls/////////////////////////////// + this.declareGlobals(); + + for (var i=0; i<this.numberOfRobots;i++){ + this.robotState[i].leg1Pos=setup.robotLocations[i][0].multiplyScalar(1/this.robotScale[i]); + this.robotState[i].leg2Pos=setup.robotLocations[i][1].multiplyScalar(1/this.robotScale[i]); + + } + for (var i=0; i<this.numberOfStartLocations;i++){ + if(setup.depositLocations[i][0]!=-1){ + this.startLocations[i]=setup.depositLocations[i][0].clone().multiplyScalar(this.spacing); + this.depositLocations[i]=setup.depositLocations[i][0].clone().multiplyScalar(this.spacing); + }else{ + this.startLocations[i]=setup.depositLocations[i][0].clone(); + this.depositLocations[i]=setup.depositLocations[i][0].clone(); + } + } + + this.init(); + this.buildGrid(); //build grid and first sacrificial layer + + //IROS PAPER FREP + if(this.buildType=="frepCube"){ + this.frepCube();//later change string for frep + } + + + if(this.hierarchical&& (this.buildType=="sdfList"||this.buildType=="sdfList1")){ + this.buildList=setup.buildList; + this.buildList.availablePickup=[]; + this.buildList.listToBuild=[]; + this.voxelList=[]; + for (var i=0; i<this.numberOfRobots;i++){ + this.voxelList.push({ + build:{ + list:[], + stockData:[] + }, + toDelete:{ + stockData:[], + robotIndex:-1 + + }, + busy:false, + busyGoingHome:false + }); + } + + this.createHierarchalSDFVoxelList(); + this.inSituAdjustment=[]; + for (var i=0; i<this.numberOfStartLocations;i++){ + this.inSituAdjustment.push(setup.depositLocations[i][1]); + } + } + + if(this.buildType=="list"){ + + this.voxelList=[]; + this.createHierarchalVoxelList(); + + }else if(this.buildType=="recursion"){ + + this.voxelList=[]; + this.createRecursionVoxelList(); + + } + + for( i=0;i<this.numberOfRobots;i++){ + this.loadVoxel(i); + if( this.buildType != "directions"){ + this.buildHelperMeshes(i); + } + + this.setupGUI(i); + this.THREERobotCall(i); + this.defaultRobot(i); + if( this.buildType != "recursion" &&this.buildType != "list"){ + this.startMovement(i,true); + } + } + this.screenshotSaver(); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +function _move(robotIndex){ + recursiveSwarms.move(robotIndex); +} + +function _changeEnd(robotIndex){ + recursiveSwarms.changeEnd(robotIndex); +} + +function _rotateRobot (robotIndex){ + recursiveSwarms.rotateRobot(robotIndex,recursiveSwarms.path[robotIndex].changeRotation[parseInt((recursiveSwarms.path[robotIndex].currentPoint-recursiveSwarms.path[robotIndex].number)/recursiveSwarms.path[robotIndex].number/2)]); +} + +function onWindowResize() { + recursiveSwarms.camera.aspect = window.innerWidth / window.innerHeight; + recursiveSwarms.camera.updateProjectionMatrix(); + + recursiveSwarms.renderer.setSize(window.innerWidth, window.innerHeight); + recursiveSwarms.renderer.render(recursiveSwarms.scene, recursiveSwarms.camera); + // recursiveSwarms.labelRenderer.setSize( window.innerWidth, window.innerHeight ); +} + +function _startMovement(robotIndex,home){ + + recursiveSwarms.startMovement(robotIndex,home); +} + + diff --git a/recursive_swarm/js/swarm_IK.js b/recursive_swarm/js/swarm_IK.js new file mode 100644 index 0000000000000000000000000000000000000000..e4ff5b140dc7f44273562b7f525c79ced5d6cf9e --- /dev/null +++ b/recursive_swarm/js/swarm_IK.js @@ -0,0 +1,208 @@ +// Amira Abdel-Rahman +// (c) Massachusetts Institute of Technology 2020 + + +///////////////////////Inverse Kinematics//////////////////////// +Swarm.prototype.updateAngles= function(robotIndex,saveAngleData=false){ + + this.THREE1[robotIndex].updateMatrixWorld(); + var matrix = new THREE.Matrix4(); + matrix.extractRotation( this.THREE1[robotIndex].matrix ); + + //check rotation + + var vector = this.THREE1[robotIndex].position.clone().sub(this.target[robotIndex].position.clone().add(this.normalAdjustmentVector[robotIndex].clone())); + vector.applyMatrix4(matrix); + + + + if(this.THREE1[robotIndex].rotation.x!=0&&this.THREE1[robotIndex].rotation.x!=180*this.DEG_TO_RAD) + { + vector.x = -vector.x; + vector.add(this.THREE1[robotIndex].position.clone()); + }else if(this.THREE1[robotIndex].rotation.y!=0&&this.THREE1[robotIndex].rotation.y!=180*this.DEG_TO_RAD) + { + vector.y = -vector.y; + vector.add(this.THREE1[robotIndex].position.clone()); + + }else + { + vector = new THREE.Vector3(0,0,0).sub(vector.clone()); + vector.add(this.THREE1[robotIndex].position.clone()); + } + + var origin= new THREE.Vector3(this.THREE1[robotIndex].position.x, this.THREE1[robotIndex].position.y, vector.z); + + var a=this.ik_2d( vector.z-this.THREE1[robotIndex].position.z ,origin.distanceTo(vector) , this.guiControls[robotIndex].leg1, this.guiControls[robotIndex].leg2); + + this.VisualRobot[robotIndex].setAngle(robotIndex,0,Math.atan2( vector.y-this.THREE1[robotIndex].position.y , vector.x-this.THREE1[robotIndex].position.x)); + this.VisualRobot[robotIndex].setAngle(robotIndex,1,a.theta1); + this.VisualRobot[robotIndex].setAngle(robotIndex,2,a.theta2-a.theta1); + this.VisualRobot[robotIndex].setAngle(robotIndex,3,(this.voxelNormal[robotIndex]*this.DEG_TO_RAD)-(a.theta2)); + this.VisualRobot[robotIndex].setAngle(robotIndex,4,Math.atan2( vector.y-this.THREE1[robotIndex].position.y , vector.x-this.THREE1[robotIndex].position.x)); + + if(this.leg[robotIndex]==1) + { + this.guiControls[robotIndex].j1=this.angles[robotIndex][0]*this.RAD_TO_DEG; + this.guiControls[robotIndex].j2=this.angles[robotIndex][1]*this.RAD_TO_DEG; + this.guiControls[robotIndex].j3=this.angles[robotIndex][2]*this.RAD_TO_DEG; + this.guiControls[robotIndex].j4=this.angles[robotIndex][3]*this.RAD_TO_DEG; + this.guiControls[robotIndex].j5=this.angles[robotIndex][4]*this.RAD_TO_DEG; + //later output package + // console.log(this.angles[robotIndex][0]+","+this.angles[robotIndex][1]+","+this.angles[robotIndex][2]+","+this.angles[robotIndex][3]+","+this.angles[robotIndex][4]); + }else + { + this.guiControls[robotIndex].j1=this.angles[robotIndex][4]*this.RAD_TO_DEG; + this.guiControls[robotIndex].j2=this.angles[robotIndex][3]*this.RAD_TO_DEG; + this.guiControls[robotIndex].j3=this.angles[robotIndex][2]*this.RAD_TO_DEG; + this.guiControls[robotIndex].j4=this.angles[robotIndex][1]*this.RAD_TO_DEG; + this.guiControls[robotIndex].j5=this.angles[robotIndex][0]*this.RAD_TO_DEG; + //later output package + // console.log(this.angles[robotIndex][4]+","+this.angles[robotIndex][3]+","+this.angles[robotIndex][2]+","+this.angles[robotIndex][1]+","+this.angles[robotIndex][0]); + } + + + if(saveAngleData) + { + this.fillOutputAngles(robotIndex); + } +}; + +Swarm.prototype.ik_2d= function(x, y, d1, d2) { + let dist = Math.sqrt(x ** 2 + y ** 2); + let theta1 = Math.atan2(y, x) - Math.acos((dist ** 2 + d1 ** 2 - d2 ** 2) / (2 * d1 * dist)); + let theta2 = Math.atan2(y - d1 * Math.sin(theta1), x - d1 * Math.cos(theta1)); + return {theta1, theta2}; +}; + +Swarm.prototype.getNormalAdjustment= function(robotIndex,n,vnormal,forward){//n is normal degree{ + var result=new THREE.Vector3(0,0,0); + if(n==180) + { + return result; + } + var theta=Math.abs(180-n); + var base=2*Math.sin(theta/2*this.DEG_TO_RAD)*this.guiControls[robotIndex].offset; + var x= Math.sin(((180-theta)/2)*this.DEG_TO_RAD)*base; + var y= Math.cos(((180-theta)/2)*this.DEG_TO_RAD)*base; + + result= vnormal.clone().multiplyScalar(-y); + + if(n > 180) + { + var tempV=forward.clone().multiplyScalar(x); + result.add(tempV); + return result; + }else + { + var tempV=forward.clone().multiplyScalar(-x); + result.add(tempV); + return result; + } + +}; + +Swarm.prototype.fillOutputAngles=function(robotIndex){ + var restAngles,outputAngles; + restAngles=[0, 0.4934693946333222, 2.1546538643231488, 0.4934693946333222, 0]; + restAngles=[0, 0, 0, 0, 0]; + + outputAngles=[(this.angles[robotIndex][0]-restAngles[0])*this.RAD_TO_DEG, -(this.angles[robotIndex][1]-restAngles[1])*this.RAD_TO_DEG, (this.angles[robotIndex][2]-restAngles[2])*this.RAD_TO_DEG, -(this.angles[robotIndex][3]- restAngles[3])*this.RAD_TO_DEG,(this.angles[robotIndex][0]-restAngles[0])*this.RAD_TO_DEG]; + + + if(this.leg[robotIndex]==1) + { + + // outputAngles=[ -(angles[1]-restAngles[1])*RAD_TO_DEG, (angles[2]-restAngles[2])*RAD_TO_DEG, -(angles[3]- restAngles[3])*RAD_TO_DEG]; + outputAngles=[(this.angles[robotIndex][0]-restAngles[0])*this.RAD_TO_DEG, (this.angles[robotIndex][1]-restAngles[1])*this.RAD_TO_DEG, (this.angles[robotIndex][2]-restAngles[2])*this.RAD_TO_DEG, (this.angles[robotIndex][3]- restAngles[3])*this.RAD_TO_DEG,(this.angles[robotIndex][0]-restAngles[0])*this.RAD_TO_DEG]; + if(outputAngles[0]>=90) + { + outputAngles[0]=90-outputAngles[0]; + } + if(outputAngles[4]>=90) + { + outputAngles[4]=90-outputAngles[4]; + } + if(outputAngles[0]<=-90) + { + outputAngles[0]=90+outputAngles[0]; + } + if(outputAngles[4]<=-90) + { + outputAngles[4]=90+outputAngles[4]; + } + + + }else + { + + outputAngles=[(this.angles[robotIndex][0]-restAngles[0])*this.RAD_TO_DEG, (this.angles[robotIndex][3]-restAngles[1])*this.RAD_TO_DEG, (this.angles[robotIndex][2]-restAngles[2])*this.RAD_TO_DEG, (this.angles[robotIndex][1]- restAngles[3])*this.RAD_TO_DEG,(this.angles[robotIndex][0]-restAngles[0])*this.RAD_TO_DEG]; + // outputAngles[0]=180-outputAngles[0]-90; + // outputAngles[4]=180-outputAngles[4]-90; + + if(outputAngles[0]>0) + { + outputAngles[0]-=180; + } + if(outputAngles[4]>0) + { + outputAngles[4]-=180; + } + + if(outputAngles[0]<0) + { + outputAngles[0]+=180-90; + outputAngles[0]=-outputAngles[0]; + } + if(outputAngles[4]<0) + { + outputAngles[4]+=180-90; + outputAngles[4]=-outputAngles[4]; + } + // if(outputAngles[0]<=-90) + // { + // outputAngles[0]=90+outputAngles[0]; + // } + // if(outputAngles[4]<=-90) + // { + // outputAngles[4]=90+outputAngles[4]; + // } + + + // if(outputAngles[0]==180||outputAngles[0]==-180) + // { + // outputAngles[0]=0; + // } + // if(outputAngles[4]==180||outputAngles[4]==-180) + // { + // outputAngles[4]=0; + // } + // if (outputAngles[0]<0){ + // outputAngles[0]+=90; + // outputAngles[0]=-outputAngles[0]; + + // } + // if (outputAngles[4]<0){ + // outputAngles[4]+=90; + // outputAngles[4]=-outputAngles[4]; + + // } + + // else if (outputAngles[0]>0) + // { + // outputAngles[0]=-outputAngles[0]+90.0; + // }else + // { + // outputAngles[0]=-outputAngles[0]-90.0; + // } + + // outputAngles[4]=2.0*outputAngles[0]; + } + this.dataAngles.push(outputAngles); //todo change later to multiple robots + this.guiControls[robotIndex].j1=outputAngles[0]; + this.guiControls[robotIndex].j2=outputAngles[1]; + this.guiControls[robotIndex].j3=outputAngles[2]; + this.guiControls[robotIndex].j4=outputAngles[3]; + this.guiControls[robotIndex].j5=outputAngles[4]; + +}; \ No newline at end of file diff --git a/recursive_swarm/js/swarm_bille.js b/recursive_swarm/js/swarm_bille.js new file mode 100644 index 0000000000000000000000000000000000000000..02d16a692885bfd56f08337c1c72a3582f8d6ac2 --- /dev/null +++ b/recursive_swarm/js/swarm_bille.js @@ -0,0 +1,1091 @@ +// Amira Abdel-Rahman +// (c) Massachusetts Institute of Technology 2020 + +function Bille(swarm, inputState,firstLoad=true) { + this.inputState = inputState; + this.swarm = swarm; + this.spacing = swarm.spacing; //general spacing + this.robotScale = this.inputState[2]; + this.voxelSpacing = this.robotScale * swarm.spacing; //spacing based on robot size + + console.log("voxelSpacing:"+this.voxelSpacing) + this.bille = null; + this.billeAngles = null; + this.billePos = null; + this.billePos1 = null; + this.billePosition = null; + + this.billePos = this.swarm.setup.billePos; + this.billePos1 = this.swarm.setup.billePos1; + + this.stepsDirection = this.swarm.setup.stepsDir; //todo remove later based on path planning + + this.targetGui = null; + this.jointsGui = null; + + this.init(); + if(typeof swarm.setup.parametric!== undefined && swarm.setup.parametric){ //parametric Bill-E + this.BilleSize=this.swarm.setup.BilleSize; + if(this.BilleSize.rotatedJoint){ + this.loadRhino(swarm.setup.fileNameRot,true,firstLoad); + } + else{ + this.loadRhino(swarm.setup.fileName,true,firstLoad); + } + } + else{ + this.loadRhino(swarm.setup.fileName,false,firstLoad); + } + + if (swarm.setup.recursion) { + // this.loadBilleRecursion(swarm.setup.fileNameParts); + setTimeout(function () { recursiveBille.loadBilleRecursion(swarm.setup.fileNameParts); }, this.path.timeout += this.path.delay); + } + +} + +Bille.prototype.startMovement = function () { + this.generatePath(this.stepsDirection); +} + +Bille.prototype.init = function () { + this.id = 0; //todo change when you need multiple + this.billeAngles = { + j0: 0.0, + j1: 0.0, + j2: 0.0, + j3: 0.0, + j4: 0.0, + j5: 0.0, + }; + + this.billeTarget = { + x: this.inputState[1].x * this.voxelSpacing, + y: this.inputState[1].y * this.voxelSpacing, + z: this.inputState[1].z * this.voxelSpacing, + rx: 0, + ry: 0, + rz: 0, + targetEnd: "end 1" + }; + + this.bille = new THREE.Group(); + + this.billePosition = this.inputState[0].clone().multiplyScalar(this.voxelSpacing); + + this.bille.position.x = this.billePosition.x; + this.bille.position.y = this.billePosition.y; + this.bille.position.z = this.billePosition.z; + + this.billeDirection = new THREE.Vector3(0, 0, 1); + + this.robotState = { + leg1Pos: this.inputState[1].clone(), + leg2Pos: this.inputState[0].clone(), + up: new THREE.Vector3(0, 0, 1), + forward: new THREE.Vector3(1, 0, 0), //todo change to make it parametric from inputState + }; + this.steps = []; + + this.leg = 1; + this.voxelNormal = 180; + this.normalAdjustmentVector = new THREE.Vector3(0, 0, 0); + + this.path = { + curve: null, + currentPoint: 0, + points: [], + number: this.swarm.pathParams.number, + delay: 1000 / this.swarm.speed, + timeout: 1000, + cHeight: this.swarm.pathParams.cHeight * this.voxelSpacing, + showPath: this.swarm.pathParams.showPath, + normals: [], + changeLegs: [], + changeRotation: [], + normalAdjustments: [], + rotations: [], + j0: [] + }; + + this.totalNumberofSteps = 0; + this.carriedVoxel = []; + + this.flipped = false; + this.loadArrows=[]; + +}; + +Bille.prototype.remove=function(){ + // objects=null; + var selectedObject = this.swarm.scene.getObjectByName("RecursiveBille"); + this.swarm.scene.remove(selectedObject); + // var selectedObject = this.swarm.scene.getObjectByName("loadArrowsGroup"); + // this.swarm.scene.remove(selectedObject); + var selectedObject = this.swarm.scene.getObjectByName("targetBille"); + this.swarm.scene.remove(selectedObject); + var selectedObject = this.swarm.scene.getObjectByName("controlBille"); + this.swarm.scene.remove(selectedObject); + + this.gui.destroy(); + this.lgui.destroy(); +} + +Bille.prototype.loadRhino=function(fileName,parametric,first){ + + if(first){ + let fetchPromise = fetch(fileName); + + rhino3dm().then(async m => { + this.swarm.rhino = m; + + let res = await fetchPromise; + let buffer = await res.arrayBuffer(); + let arr = new Uint8Array(buffer); + let doc = this.swarm.rhino.File3dm.fromByteArray(arr); + this.swarm.rhinoDoc=doc; + + if (parametric){ + this.loadParametric(); + }else{ + this.load(); + } + }); + + }else{ + if (parametric){ + this.loadParametric(); + }else{ + this.load(); + } + } +} + +Bille.prototype.load = function () { + var objects = this.swarm.rhinoDoc.objects(); + + THREE.Object3D.DefaultUp = new THREE.Vector3(0, 0, 1) + + var beta = 0.5; + + var material = new THREE.MeshLambertMaterial({ reflectivity: beta, color: new THREE.Color(0.8, 0.8, 0.8) }); + var material1 = new THREE.MeshLambertMaterial({ reflectivity: beta, color: new THREE.Color(0.3, 0.3, 0.3) }); + var material2 = new THREE.MeshLambertMaterial({ reflectivity: beta, color: new THREE.Color(0.6, 0.6, 0.6) }); + var material3 = new THREE.MeshLambertMaterial({ reflectivity: beta, color: new THREE.Color(0, 0.2, 0) }); + var material4 = new THREE.MeshLambertMaterial({ reflectivity: beta, color: new THREE.Color(0.5, 0.5, 0) }); + var material5 = new THREE.MeshLambertMaterial({ reflectivity: beta, color: new THREE.Color(0.1, 0.1, 0.1) }); + + var material = new THREE.MeshPhysicalMaterial({ metalness: 0.4, reflectivity: 0.5, roughness: 0.5, color: new THREE.Color(1.0, 1.0, 1.0) }); + var material1 = new THREE.MeshPhysicalMaterial({ metalness: 0.4, reflectivity: 0.5, roughness: 0.5, color: new THREE.Color(0.3, 0.3, 0.3) }); + var material2 = new THREE.MeshPhysicalMaterial({ metalness: 0.4, reflectivity: 0.5, roughness: 0.5, color: new THREE.Color(0.6, 0.6, 0.6) }); + var material3 = new THREE.MeshPhysicalMaterial({ metalness: 0.4, reflectivity: 0.5, roughness: 0.5, color: new THREE.Color(0, 0.2, 0) }); + var material4 = new THREE.MeshPhysicalMaterial({ metalness: 0.4, reflectivity: 0.5, roughness: 0.5, color: new THREE.Color(0.5, 0.5, 0) }); + var material5 = new THREE.MeshPhysicalMaterial({ metalness: 0.4, reflectivity: 0.5, roughness: 0.5, color: new THREE.Color(0.1, 0.1, 0.1) }); + + let billeGroupsTemp = [ + new THREE.Group(), + new THREE.Group(), + new THREE.Group(), + new THREE.Group(), + new THREE.Group(), + new THREE.Group(), + new THREE.Group() + ]; + + for (let i = 0; i < objects.count; i++) { + let mesh = objects.get(i).geometry(); + let layer = objects.get(i).attributes().layerIndex; + // console.log(objects.get(i).attributes()) + if (mesh instanceof this.swarm.rhino.Mesh) { + // convert all meshes in 3dm model into threejs objects + + let threeMesh; + + if (objects.get(i).attributes().name == 'grey' || objects.get(i).attributes().name == 'grey1' || objects.get(i).attributes().name == 'grey2' || objects.get(i).attributes().name == 'pcb') { + threeMesh = meshToThreejs(mesh, material1); + + } else if (objects.get(i).attributes().name == 'motors') { + threeMesh = meshToThreejs(mesh, material2); + } else if (objects.get(i).attributes().name == 'controller') { + threeMesh = meshToThreejs(mesh, material3); + } else if (objects.get(i).attributes().name == 'connectors') { + threeMesh = meshToThreejs(mesh, material4); + } else if (objects.get(i).attributes().name == 'battery') { + threeMesh = meshToThreejs(mesh, material5); + } else { + threeMesh = meshToThreejs(mesh, material); + } + // console.log(layer) + threeMesh.position.x += this.billePos[layer - 1].x; + threeMesh.position.y += this.billePos[layer - 1].y; + threeMesh.position.z += this.billePos[layer - 1].z; + + billeGroupsTemp[layer - 1].add(threeMesh); + } + } + + for (let i = 0; i < billeGroupsTemp.length; i++) { + billeGroupsTemp[i].name = "Group:" + i; + } + // billeGroupsTemp[0].add(billeGroupsTemp[6].clone()); + + this.bille.add(billeGroupsTemp[0].clone().add(billeGroupsTemp[1].clone().add(billeGroupsTemp[2].clone().add(billeGroupsTemp[3].clone().add(billeGroupsTemp[4].clone().add(billeGroupsTemp[5].clone())))))); + this.bille.children[0].add(billeGroupsTemp[6].clone()); + + this.bille.name="RecursiveBille"; + this.swarm.scene.add(this.bille); + + console.log("Loaded Bille!"); + + this.GUI(); + // this.jointsGui = jointsGui; + // this.targetGui = targetGui; + + this.createTarget(); + this.updateAngles(); + // this.startMovement(); + + // this.initLoads(); + + + + +}; + +Bille.prototype.loadParametric = function () { + var objects = this.swarm.rhinoDoc.objects(); + + var wrist=0.3; + var bille_parts={ + "g1":new THREE.Vector3(0.0 ,0.0 ,- (1-1)*this.spacing -wrist ),//"g1", + "c1":new THREE.Vector3(0.0 ,0.0 ,- (1-1)*this.spacing-1*wrist),//"c1", + "w1":new THREE.Vector3(0.0 ,0.0 ,- (2-1)*this.spacing-1*wrist),//"w1", + "e1_1":new THREE.Vector3(0.0 ,0.0 ,- (2-1)*this.spacing-2*wrist),//"e1", + "e1_2":new THREE.Vector3(0.0 ,0.0 ,- (2-1)*this.spacing-2*wrist),//"e1", + "v1":new THREE.Vector3(0.0 ,0.0 ,- (3-1)*this.spacing-2*wrist ),//"v1", + "v1":new THREE.Vector3(0.0 ,0.0 ,- (4-1)*this.spacing-2*wrist ),//"v11", + "w2":new THREE.Vector3(0.0 ,0.0 ,- (4-1)*this.spacing-2*wrist ),//"w2", + "v2":new THREE.Vector3(0.0 , this.spacing+wrist ,- (4-1)*this.spacing-2*wrist ),//"v2", + "v2":new THREE.Vector3(0.0 , this.spacing+wrist ,- (5-1)*this.spacing-2*wrist ),//"v22", + "e2_1":new THREE.Vector3(0.0 , this.spacing+wrist ,- (6-1)*this.spacing-2*wrist ),//"e2", + "e2_2":new THREE.Vector3(0.0 , this.spacing+wrist ,- (6-1)*this.spacing-2*wrist ),//"e2", + "w3":new THREE.Vector3(0.0 , this.spacing+wrist ,- (7-1)*this.spacing-2*wrist ),//"w3", + "v3":new THREE.Vector3(0.0 , this.spacing+wrist ,- (7-1)*this.spacing-4*wrist ),//"v3", + "g2":new THREE.Vector3(0.0 , this.spacing+wrist ,- (8-1)*this.spacing-5*wrist ),//"g2", + "e3_1":new THREE.Vector3(0.0 ,-this.spacing+wrist ,- (1-1)*this.spacing -2*wrist ),//"e3", + "e3_2":new THREE.Vector3(0.0 ,-this.spacing+wrist ,- (1-1)*this.spacing -2*wrist ),//"e3", + "g3":new THREE.Vector3(0.0 ,-this.spacing+wrist ,- (1-1)*this.spacing -2*wrist ),//"g3", + + + }; + + THREE.Object3D.DefaultUp = new THREE.Vector3(0, 0, 1) + + var beta = 0.5; + + var material = new THREE.MeshLambertMaterial({ reflectivity: beta, color: new THREE.Color(0.8, 0.8, 0.8) }); + var material1 = new THREE.MeshLambertMaterial({ reflectivity: beta, color: new THREE.Color(0.3, 0.3, 0.3) }); + var material2 = new THREE.MeshLambertMaterial({ reflectivity: beta, color: new THREE.Color(0.6, 0.6, 0.6) }); + var material3 = new THREE.MeshLambertMaterial({ reflectivity: beta, color: new THREE.Color(0, 0.2, 0) }); + var material4 = new THREE.MeshLambertMaterial({ reflectivity: beta, color: new THREE.Color(0.5, 0.5, 0) }); + var material5 = new THREE.MeshLambertMaterial({ reflectivity: beta, color: new THREE.Color(0.1, 0.1, 0.1) }); + + var material = new THREE.MeshPhysicalMaterial({ metalness: 0.4, reflectivity: 0.5, roughness: 0.5, color: new THREE.Color(1.0, 1.0, 1.0) }); + var material1 = new THREE.MeshPhysicalMaterial({ metalness: 0.4, reflectivity: 0.5, roughness: 0.5, color: new THREE.Color(0.3, 0.3, 0.3) }); + var material2 = new THREE.MeshPhysicalMaterial({ metalness: 0.4, reflectivity: 0.5, roughness: 0.5, color: new THREE.Color(0.6, 0.6, 0.6) }); + var material3 = new THREE.MeshPhysicalMaterial({ metalness: 0.4, reflectivity: 0.5, roughness: 0.5, color: new THREE.Color(0, 0.2, 0) }); + var material4 = new THREE.MeshPhysicalMaterial({ metalness: 0.4, reflectivity: 0.5, roughness: 0.5, color: new THREE.Color(0.5, 0.5, 0) }); + var material5 = new THREE.MeshPhysicalMaterial({ metalness: 0.4, reflectivity: 0.5, roughness: 0.5, color: new THREE.Color(0.1, 0.1, 0.1) }); + + let billeGroupsTemp = [ + new THREE.Group(), + new THREE.Group(), + new THREE.Group(), + new THREE.Group(), + new THREE.Group(), + new THREE.Group(), + new THREE.Group() + ]; + + for (let i = 0; i < objects.count; i++) { + let mesh = objects.get(i).geometry(); + let layerIndex = objects.get(i).attributes().layerIndex; + let layerName = this.swarm.rhinoDoc.layers().findIndex(layerIndex).name; + // console.log(objects.get(i).attributes()) + if (mesh instanceof this.swarm.rhino.Mesh) { + // convert all meshes in 3dm model into threejs objects + + let threeMeshes=[]; + let materialChosen=material; + + if (objects.get(i).attributes().name == 'grey' || objects.get(i).attributes().name == 'grey1' || objects.get(i).attributes().name == 'grey2' || objects.get(i).attributes().name == 'pcb') { + materialChosen=material1; + } else if (objects.get(i).attributes().name == 'motors') { + materialChosen=material2; + } else if (objects.get(i).attributes().name == 'controller') { + materialChosen=material3; + } else if (objects.get(i).attributes().name == 'connectors') { + materialChosen=material4; + } else if (objects.get(i).attributes().name == 'battery') { + materialChosen=material5; + } else { + materialChosen=material; + } + + threeMeshes.push(meshToThreejs(mesh, materialChosen)); + + var layer=0 + var add=true; + var wrist=0.3; + if(layerName=="g1"||layerName=="c1"||layerName=="e3_1"||layerName=="v11"){ + layer=0 + + }else if(layerName=="w1"||layerName=="e1_1"||layerName=="v111"){ + layer=1 + if(this.BilleSize.rotatedJoint && (layerName=="v111"||layerName=="e1_1")){ + threeMeshes[0].position.z+=wrist; + }else if(layerName=="v111"){ + add=false; + } + }else if(layerName=="v1"||layerName=="e1_2"||layerName=="w2"){ + layer=2 + if(layerName=="w2"){ + threeMeshes[0].position.z+=this.spacing*(this.BilleSize.legHeight-1); + } + }else if(layerName=="v2"||layerName=="e2_1"){ + layer=3 + if(layerName=="e2_1"){ + threeMeshes[0].position.z+=this.spacing*(this.BilleSize.legHeight-1); + } + }else if(layerName=="e2_2"||layerName=="w3"||layerName=="v222"){ + layer=4 + if(this.BilleSize.rotatedJoint && (layerName=="v222"||layerName=="e2_2")){ + // threeMeshes[0].position.z+=wrist; + }else if(layerName=="v222"){ + add=false; + } + }else if(layerName=="v3"||layerName=="g2"||layerName=="v22"){ + layer=5 + if(layerName=="g2"){ + threeMeshes[0].position.z+=this.spacing*(this.BilleSize.baseHeight-1); + } + }else if(layerName=="e3_2"||layerName=="g3"){ + layer=6 + + }else{ + add=false; + } + + for (var ii=1;ii<this.BilleSize.legHeight;ii++){ + if(layerName=="v1"||layerName=="v2"){ + threeMeshes.push(meshToThreejs(mesh, materialChosen)); + threeMeshes[threeMeshes.length-1].position.z+=this.spacing*(this.BilleSize.legHeight-(threeMeshes.length-1)); + } + } + for (var ii=1;ii<this.BilleSize.baseHeight;ii++){ + if(layerName=="v11"||layerName=="v22"){ + threeMeshes.push(meshToThreejs(mesh, materialChosen)); + threeMeshes[threeMeshes.length-1].position.z+=this.spacing*(this.BilleSize.baseHeight-(threeMeshes.length-1)); + } + } + + if(this.BilleSize.rotatedJoint){ //width should be 1 already but just in case + for (var ii=1;ii<this.BilleSize.width;ii++){ + if(layerName=="v11"||layerName=="v22"){ + for (var kk=0;kk<this.BilleSize.baseHeight;kk++){ + // console.log("ii:"+(this.BilleSize.width-(ii))+" kk:"+(this.BilleSize.baseHeight-(kk))) + threeMeshes.push(meshToThreejs(mesh, materialChosen)); + threeMeshes[threeMeshes.length-1].position.x-=this.spacing*(this.BilleSize.width-(ii)); + threeMeshes[threeMeshes.length-1].position.z+=this.spacing*(this.BilleSize.baseHeight-(kk+1)); + } + } + if(layerName=="v1"){ + for (var kk=0;kk<this.BilleSize.legHeight;kk++){ + threeMeshes.push(meshToThreejs(mesh, materialChosen)); + threeMeshes[threeMeshes.length-1].position.y+=this.spacing*(this.BilleSize.width-(ii)); + threeMeshes[threeMeshes.length-1].position.z+=this.spacing*(this.BilleSize.legHeight-(kk+1)); + + } + }else if(layerName=="v2"){ + for (var kk=0;kk<this.BilleSize.legHeight;kk++){ + threeMeshes.push(meshToThreejs(mesh, materialChosen)); + threeMeshes[threeMeshes.length-1].position.y-=this.spacing*(this.BilleSize.width-(ii)); + threeMeshes[threeMeshes.length-1].position.z+=this.spacing*(this.BilleSize.legHeight-(kk+1)); + } + } + + + if(layerName=="v111"||layerName=="e1_1"||layerName=="e1_2"){ + threeMeshes.push(meshToThreejs(mesh, materialChosen)); + threeMeshes[threeMeshes.length-1].position.y+=this.spacing*(this.BilleSize.width-(ii)); + }else if(layerName=="v222"||layerName=="e2_1"||layerName=="e2_2"){ + threeMeshes.push(meshToThreejs(mesh, materialChosen)); + threeMeshes[threeMeshes.length-1].position.y-=this.spacing*(this.BilleSize.width-(ii)); + }else if(layerName=="g1"||layerName=="e3_1"||layerName=="e3_2"||layerName=="g3"||layerName=="g2"){ + threeMeshes.push(meshToThreejs(mesh, materialChosen)); + threeMeshes[threeMeshes.length-1].position.x-=this.spacing*(this.BilleSize.width-(ii)); + } + if(layerName=="e2_1"){ + threeMeshes[threeMeshes.length-1].position.z+=this.spacing*(this.BilleSize.legHeight-1); + }else if(layerName=="g2"){ + threeMeshes[threeMeshes.length-1].position.z+=this.spacing*(this.BilleSize.baseHeight-1); + } + + } + } + + + + if(add){ + for (var ii=0;ii<threeMeshes.length;ii++){ + threeMeshes[ii].position.x += this.billePos[layer].x; + threeMeshes[ii].position.y += this.billePos[layer].y; + threeMeshes[ii].position.z += this.billePos[layer].z; + billeGroupsTemp[layer].add(threeMeshes[ii]); + } + } + + } + } + + for (let i = 0; i < billeGroupsTemp.length; i++) { + billeGroupsTemp[i].name = "Group:" + i; + } + billeGroupsTemp[0].add(billeGroupsTemp[6].clone()); + + this.bille.add(billeGroupsTemp[0].clone().add(billeGroupsTemp[1].clone().add(billeGroupsTemp[2].clone().add(billeGroupsTemp[3].clone().add(billeGroupsTemp[4].clone().add(billeGroupsTemp[5].clone())))))); + + this.bille.name="RecursiveBille"; + this.swarm.scene.add(this.bille); + + console.log("Loaded Bille!"); + + this.GUI(); + // this.jointsGui = jointsGui; + // this.targetGui = targetGui; + + this.createTarget(); + this.updateAngles(); + // // this.startMovement(); + + // this.initLoads(); + + + +}; + +Bille.prototype.updateAngles = function (getTarget = true) { + if (this.leg == 1) { + if (getTarget) { + this.IK(new THREE.Vector3(this.targetBille.position.x - this.bille.position.x, + this.targetBille.position.y - this.bille.position.y, + this.targetBille.position.z - this.bille.position.z)); + } + // console.log(this.billeAngles) + + for (let i = 0; i < 7; i++) { + var joint = this.swarm.scene.getObjectByName("Group:" + i); + joint.position.x = 0; + joint.position.y = 0; + joint.position.z = 0; + } + + + if (this.path.j0.length > 0 && this.path.currentPoint < this.path.j0.length) { + this.billeAngles.j0 = this.path.j0[this.path.currentPoint]; + } + + this.swarm.scene.getObjectByName("Group:" + 6).rotation.x = this.swarm.DEG_TO_RAD * this.billeAngles.j0; + this.swarm.scene.getObjectByName("Group:" + 1).rotation.z = this.swarm.DEG_TO_RAD * this.billeAngles.j1; + this.swarm.scene.getObjectByName("Group:" + 2).rotation.y = this.swarm.DEG_TO_RAD * this.billeAngles.j2; + this.swarm.scene.getObjectByName("Group:" + 3).rotation.y = this.swarm.DEG_TO_RAD * this.billeAngles.j3; + this.swarm.scene.getObjectByName("Group:" + 4).rotation.y = this.swarm.DEG_TO_RAD * this.billeAngles.j4; + this.swarm.scene.getObjectByName("Group:" + 5).rotation.z = this.swarm.DEG_TO_RAD * this.billeAngles.j5; + + this.swarm.scene.getObjectByName("Group:" + 1).rotation.z -= this.swarm.scene.getObjectByName("Group:" + 0).rotation.z; + + if (this.path.rotations.length > 0 && this.path.currentPoint < this.path.rotations.length) { + this.swarm.scene.getObjectByName("Group:" + 5).rotation.z += this.path.rotations[this.path.currentPoint] * this.swarm.DEG_TO_RAD; + } + + for (let i = 1; i < 7; i++) { + var joint = this.swarm.scene.getObjectByName("Group:" + i); + joint.position.x -= this.billePos1[i].x; + joint.position.y -= this.billePos1[i].y; + joint.position.z -= this.billePos1[i].z; + + } + + } else { + if (getTarget) { + this.IK(new THREE.Vector3(-(this.targetBille.position.x - this.bille.position.x), + -(this.targetBille.position.y - this.bille.position.y), + -(this.targetBille.position.z - this.bille.position.z))); + } + + + for (let i = 0; i < 7; i++) { + var joint = this.swarm.scene.getObjectByName("Group:" + i); + joint.position.x = 0; + joint.position.y = 0; + joint.position.z = 0; + } + + this.swarm.scene.getObjectByName("Group:" + 6).rotation.x = this.swarm.DEG_TO_RAD * this.billeAngles.j0; + this.swarm.scene.getObjectByName("Group:" + 1).rotation.z = this.swarm.DEG_TO_RAD * this.billeAngles.j1; + this.swarm.scene.getObjectByName("Group:" + 2).rotation.y = this.swarm.DEG_TO_RAD * this.billeAngles.j2; + this.swarm.scene.getObjectByName("Group:" + 3).rotation.y = this.swarm.DEG_TO_RAD * this.billeAngles.j3; + this.swarm.scene.getObjectByName("Group:" + 4).rotation.y = this.swarm.DEG_TO_RAD * this.billeAngles.j4; + this.swarm.scene.getObjectByName("Group:" + 5).rotation.z = this.swarm.DEG_TO_RAD * this.billeAngles.j5; + + + if (this.path.rotations.length > 0 && this.path.currentPoint < this.path.rotations.length) { + this.swarm.scene.getObjectByName("Group:" + 0).rotation.z = -this.path.rotations[this.path.currentPoint] * this.swarm.DEG_TO_RAD + this.bille.position.rz; + this.swarm.scene.getObjectByName("Group:" + 1).rotation.z += this.path.rotations[this.path.currentPoint] * this.swarm.DEG_TO_RAD - this.bille.position.rz; + + } else { + this.swarm.scene.getObjectByName("Group:" + 1).rotation.z -= this.swarm.scene.getObjectByName("Group:" + 0).rotation.z; + + } + + for (let i = 1; i < 7; i++) { + var joint = this.swarm.scene.getObjectByName("Group:" + i); + joint.position.x -= this.billePos1[i].x; + joint.position.y -= this.billePos1[i].y; + joint.position.z -= this.billePos1[i].z; + } + + var joint = this.swarm.scene.getObjectByName("Group:" + 0); + joint.position.x = this.targetBille.position.x - this.bille.position.x; + joint.position.y = this.targetBille.position.y - this.bille.position.y; + joint.position.z = this.targetBille.position.z - this.bille.position.z; + + } + for (var i in this.jointsGui.__controllers) { + this.jointsGui.__controllers[i].updateDisplay(); + } + for (var i in this.targetGui.__controllers) { + this.targetGui.__controllers[i].updateDisplay(); + } + + // if(this.loadArrows.length!=0){ + // this.updateLoads(); + // } + +}; + +Bille.prototype.GUI = function () { + this.gui = new dat.GUI(); + + var button = { + 'download csv': function () { + recursiveBille.download_csv(); + }, + 'start movement': function () { + recursiveBille.startMovementDirections(recursiveBille.stepsDirection); + }, + 'pick up': function () { + recursiveBille.startMovementPickup(); + }, + // 'drop off':function(){ + // recursiveBille.startMovementDropOff(); + // }, + // 'create robot':function(){ + // recursiveBille.magic(); + // }, + // 'final':function(){ + // recursiveBille.final(); + // } + }; + + var jointsGui = this.gui.addFolder('Robot Joints'); + var jointsParams = []; + jointsParams.push(jointsGui.add(this.billeAngles, 'j0', -180.0, 180.0).step(0.01)); + jointsParams.push(jointsGui.add(this.billeAngles, 'j1', -180.0, 180.0).step(0.01)); + jointsParams.push(jointsGui.add(this.billeAngles, 'j2', -180.0, 180.0).step(0.01)); + jointsParams.push(jointsGui.add(this.billeAngles, 'j3', -180.0, 180.0).step(0.01)); + jointsParams.push(jointsGui.add(this.billeAngles, 'j4', -180.0, 180.0).step(0.01)); + jointsParams.push(jointsGui.add(this.billeAngles, 'j5', -180.0, 180.0).step(0.01)); + + for (var i = 0; i < jointsParams.length; i++) { + jointsParams[i].onChange(function (value) { + recursiveBille.updateAngles(false); //todo change + + }); + } + + var targetGui = this.gui.addFolder('Target Position'); + var targetParams = []; + // targetParams.push(targetGui.add(this.billeTarget, 'x', -15.0, 15.0).step(0.01).listen()); + // targetParams.push(targetGui.add(this.billeTarget, 'y', -15.0, 15.0).step(0.01).listen()); + // targetParams.push(targetGui.add(this.billeTarget, 'z', -15.0, 15.0).step(0.01).listen()); + // var changeTargetEnd = targetGui.add(this.billeTarget, 'targetEnd', ["end 1", "end 2"]).listen() + targetParams.push(targetGui.add(this.billeTarget, 'x', -15.0, 15.0).step(0.01)); + targetParams.push(targetGui.add(this.billeTarget, 'y', -15.0, 15.0).step(0.01)); + targetParams.push(targetGui.add(this.billeTarget, 'z', -15.0, 15.0).step(0.01)); + var changeTargetEnd = targetGui.add(this.billeTarget, 'targetEnd', ["end 1", "end 2"]) + + // var extraGui =gui.addFolder('Simulation Speed'); + // extraGui.add(this.path, 'delay', 0, 100).step(10).listen(); + + // gui.add(button,"pick up"); + // gui.add(button,"drop off"); + // gui.add(button,"create robot"); + // gui.add(button,"final"); + // gui.add(button,"start movement"); + // gui.add(button,"download csv"); + + for (var i = 0; i < targetParams.length; i++) { + targetParams[i].onChange(function (value) { + + recursiveBille.targetBille.position.x = recursiveBille.billeTarget.x; + recursiveBille.targetBille.position.y = recursiveBille.billeTarget.y; + recursiveBille.targetBille.position.z = recursiveBille.billeTarget.z; + recursiveBille.controlBille.position.x = recursiveBille.billeTarget.x; + recursiveBille.controlBille.position.y = recursiveBille.billeTarget.y; + recursiveBille.controlBille.position.z = recursiveBille.billeTarget.z; + + recursiveBille.updateAngles(); //todo change bille + + }); + } + changeTargetEnd.onChange(function (value) { + recursiveBille.changeEnd(); + }); + + this.jointsGui = jointsGui; + this.targetGui = targetGui; + +}; + +Bille.prototype.IK = function (pos) { + var x1 = pos.x; + var y1 = pos.y; + + var x = x1; + var alt = this.spacing; + var y = pos.y + alt; + var z = pos.z - 0.0; // empirical was pos.z-0.188 + + + var l = Math.sqrt(pos.y ** 2 + pos.x ** 2); + var ll = this.spacing + (10.5 / 102) * this.spacing; //Middle wrist actuator thickness + + + if (pos.y <= 0) { + + var alpha = Math.asin(pos.x / l); + var beta = Math.asin(ll / l); + + var theta = Math.PI / 2 - alpha - beta; + + + var xm = Math.sin(theta) * ll; + var ym = Math.cos(theta) * ll; + + x = Math.sqrt((-pos.y - ym) ** 2 + (pos.x + xm) ** 2); + j1 = -theta; + } else { + var alpha = Math.asin(Math.sqrt(l ** 2 - ll ** 2) / l); + var beta = Math.atan(pos.x / Math.abs(pos.y)); + + var theta = Math.PI - alpha - beta; + + + var xm = Math.sin(theta) * ll; + var ym = Math.cos(theta) * ll; + x = Math.sqrt((pos.y + ym) ** 2 + (pos.x - xm) ** 2); + j1 = theta; + } + + + var j1, j2, j3, j4, j5; + var a = this.spacing * this.robotScale; + var b = this.spacing * this.robotScale; + // console.log(this.robotScale) + + var c = Math.sqrt(x * x + z * z); + + j2 = Math.PI / 2.0 - (Math.atan(z / x) + Math.acos((b * b + c * c - a * a) / (2 * b * c))); + + j3 = Math.acos((a * a + b * b - c * c) / (2 * a * b)); + + j4 = Math.atan(x / z) + Math.acos((a * a + c * c - b * b) / (2 * a * c)); + + + + if (z < 0) { + j4 -= Math.PI; + } + + + this.billeAngles.j1 = j1 * this.swarm.RAD_TO_DEG; + this.billeAngles.j2 = (j2 * this.swarm.RAD_TO_DEG); + this.billeAngles.j3 = 180 - (j3 * this.swarm.RAD_TO_DEG); + this.billeAngles.j4 = 180 - (j4 * this.swarm.RAD_TO_DEG); + if (this.billeAngles.j4 > 360) { + this.billeAngles.j4 -= 360; + } else if (this.billeAngles.j4 > 180) { + this.billeAngles.j4 -= 360; + } + this.billeAngles.j5 = (j1 * this.swarm.RAD_TO_DEG); + + + // console.log(this.path.points.length) +}; + +Bille.prototype.createTarget = function () { + this.targetBille = new THREE.Group(); + this.targetBille.name="targetBille"; + if (this.swarm.showGUI) { + + this.swarm.scene.add(this.targetBille); + } + + this.controlBille = new THREE.TransformControls(this.swarm.camera, this.swarm.renderer.domElement); + this.controlBille.name="controlBille" + this.targetBille.position.x = this.billeTarget.x; + this.targetBille.position.y = this.billeTarget.y; + this.targetBille.position.z = this.billeTarget.z; + + this.controlBille.size = 0.5; + this.controlBille.space = "local"; + // this.targetBille.rotation.y=180*this.DEG_TO_RAD; + // this.targetBille.rotation.z=90*this.DEG_TO_RAD; + // this.control.setSpace( this.control.space === "local" ? "world" : "local" ); + this.controlBille.addEventListener('change', () => { + recursiveBille.billeTarget.x = recursiveBille.targetBille.position.x; //todo change bille + recursiveBille.billeTarget.y = recursiveBille.targetBille.position.y; + recursiveBille.billeTarget.z = recursiveBille.targetBille.position.z; + recursiveBille.updateAngles(); + }); + this.controlBille.attach(this.targetBille); + + if (this.swarm.showGUI) { + this.swarm.scene.add(this.controlBille); + // this.control.visible = false; + + } + +}; + +Bille.prototype.getNormalAdjustment = function (n, vnormal, forward) {//n is normal degree{ + var result = new THREE.Vector3(0, 0, 0); + if (n == 180) { + return result; + } + var theta = Math.abs(180 - n); + var base = 2 * Math.sin(theta / 2 * this.DEG_TO_RAD) * (this.voxelSpacing * 1.5);//TODO fix (offset) + var x = Math.sin(((180 - theta) / 2) * this.DEG_TO_RAD) * base; + var y = Math.cos(((180 - theta) / 2) * this.DEG_TO_RAD) * base; + + result = vnormal.clone().multiplyScalar(-y); + + if (n > 180) { + var tempV = forward.clone().multiplyScalar(x); + result.add(tempV); + return result; + } else { + var tempV = forward.clone().multiplyScalar(-x); + result.add(tempV); + return result; + } + +}; + +Bille.prototype.initLoads= function(){ + this.loadArrowsGroup=new THREE.Group(); + this.loadArrowsGroup.name="loadArrowsGroup"; + + this.loads={ + grip_1:new THREE.Vector3(0,0,0), + control_voxel:new THREE.Vector3(0,0,0), //control voxel + wrist_1:new THREE.Vector3(0,0,0) , // wrist 1 + elbow_1:new THREE.Vector3(0,0,0), // elbow 1 + leg_1:new THREE.Vector3(0,0,0), // leg_1 + wrist_2:new THREE.Vector3(0,0,0) , // wrist 2 + leg_2:new THREE.Vector3(0,0,0), // leg_2 + elbow_2:new THREE.Vector3(0,0,0), // elbow 2 + wrist_3:new THREE.Vector3(0,0,0), //wrist 3 + voxel_1:new THREE.Vector3(0,0,0), //voxel + grip_2:new THREE.Vector3(0,0,0), //grip 3 + elbow_pickup:new THREE.Vector3(0,0,0) //elbow_pickup + + }; + if(typeof this.swarm.setup.parametric!== undefined && this.swarm.setup.parametric){ + var shift=0.3 + + this.loadPosAdjustments=[ + new THREE.Vector3(0,0,-shift),//grip 1 + new THREE.Vector3(0,0,(this.spacing*this.BilleSize.baseHeight)*0.5),//control voxel + new THREE.Vector3(0,0,this.spacing),//wrist 1 + new THREE.Vector3(0.0,0.0,this.spacing*1.5),// elbow 1 + new THREE.Vector3(0,0,this.spacing+this.spacing*0.5*(this.BilleSize.legHeight-1)),// leg 1 + new THREE.Vector3(0,this.spacing*0.5,0),//wrist 2 + new THREE.Vector3(0,0,this.spacing*0.5*(this.BilleSize.legHeight-1)),// leg 2 + new THREE.Vector3(0,0,0), // elbow 2 + new THREE.Vector3(0,0,this.spacing/2+shift), // wrist 3 + + new THREE.Vector3(0,0,(this.spacing*this.BilleSize.baseHeight)-0.5*this.spacing), //voxel + + new THREE.Vector3(0,0,(1+this.BilleSize.baseHeight)*this.spacing-2*shift),//grip 2 + + new THREE.Vector3(0,0,0) //elbow_pickup + + ]; + + }else{ + this.loadPosAdjustments=[ + new THREE.Vector3(0,0,-this.voxelSpacing/this.robotScale*0.1),//grip 1 + new THREE.Vector3(0,0,this.voxelSpacing/this.robotScale*0.5),//control voxel + new THREE.Vector3(0,0,0),//wrist 1 + new THREE.Vector3(0,0,this.voxelSpacing/this.robotScale*0.5),// elbow 1 + new THREE.Vector3(0,0,this.voxelSpacing/this.robotScale*1.5),// leg 1 + new THREE.Vector3(0,this.voxelSpacing/this.robotScale*0.5,0),//wrist 2 + new THREE.Vector3(0,0,this.voxelSpacing/this.robotScale*0.5),// leg 2 + new THREE.Vector3(0,0,0), // elbow 2 + new THREE.Vector3(0,0,-this.voxelSpacing/this.robotScale*0.25), // wrist 3 + new THREE.Vector3(0,0,this.voxelSpacing/this.robotScale*0.25), //voxel + new THREE.Vector3(0,0,this.voxelSpacing/this.robotScale*0.75),//grip 2 + new THREE.Vector3(0,0,0) //elbow_pickup + + ]; + + } + + + + this.weights=[ + 5, //grip 1 + 15, //control voxel + 5, //wrist 1 + 30, // elbow 1 + 20, // leg 1 + 5, // wrist 2 + 20, // leg 2 + 30, // elbow 3 + 5, //wrist 3 + 10, //voxel + 5, //grip 2 + 30 //lower elbow + + ]; + this.torques=[ + new THREE.Vector3(0,0,0), //grip 1 + new THREE.Vector3(0,0,0), //control voxel + new THREE.Vector3(0,0,0), //wrist1 + new THREE.Vector3(0,0,0), // elbow 1 + new THREE.Vector3(0,0,0), // leg 1 + new THREE.Vector3(0,0,0), // wrist 2 + new THREE.Vector3(0,0,0), // leg 2 + new THREE.Vector3(0,0,0), // elbow 3 + new THREE.Vector3(0,0,0), //wrist 3 + new THREE.Vector3(0,0,0), //voxel + new THREE.Vector3(0,0,0), //grip 2 + new THREE.Vector3(0,0,0), //lower elbow + + ]; + + + var currentParent=this.bille.children[this.bille.children.length - 1]; + var length = 1.2; + var hex = 0xff7171; + var dir = new THREE.Vector3( 0, 0, -1 ); + dir.normalize(); + var arrowScale=0.7; + + + + for(var i=0;i<10;i++){ + var origin = currentParent.getWorldPosition(origin).clone().add(this.bille.position); + + var vec=this.loadPosAdjustments[i].clone(); + var q=currentParent.getWorldQuaternion(); + vec.applyQuaternion(q); + + this.loadArrows.push(new THREE.ArrowHelper( dir, origin.clone().add(vec), length, hex,arrowScale,arrowScale )); + + this.loadArrows[i].name="loadArrow:" + i; + this.loadArrowsGroup.add( this.loadArrows[i] ); + if(i!=9 ){ + if(i!=2&&i!=5&&i!=0&&i!=8){ + currentParent=currentParent.children[currentParent.children.length - 1]; + } + } + + + + } + //last wrist + var origin = currentParent.getWorldPosition(origin).clone().add(this.bille.position); + var vec=this.loadPosAdjustments[this.loadPosAdjustments.length-2].clone(); + var q=currentParent.getWorldQuaternion(); + vec.applyQuaternion(q); + this.loadArrows.push(new THREE.ArrowHelper( dir, origin.clone().add(vec), length, hex,arrowScale,arrowScale )); + this.loadArrows[this.loadArrows.length-1].name="loadArrow:" + (this.loadArrows.length-1); + this.loadArrowsGroup.add( this.loadArrows[this.loadArrows.length-1] ); + + + + //pickup elbow + var origin = this.bille.children[0].children[this.bille.children[0].children.length - 2].getWorldPosition().clone().add(this.bille.position); + var vec=this.loadPosAdjustments[this.loadPosAdjustments.length-1].clone(); + var q=currentParent.getWorldQuaternion(); + vec.applyQuaternion(q); + this.loadArrows.push(new THREE.ArrowHelper( dir, origin.clone().add(vec), length, hex,arrowScale,arrowScale )); + this.loadArrows[this.loadArrows.length-1].name="loadArrow:" + (this.loadArrows.length-1); + this.loadArrowsGroup.add( this.loadArrows[this.loadPosAdjustments.length-1] ); + + + + this.swarm.scene.add( this.loadArrowsGroup ); + + this.calcTorque(); + this.loadsGUI(); + +} + +Bille.prototype.updateLoads= function(){ + + var currentParent=this.bille.children[this.bille.children.length - 1]; + + + for(var i=0;i<10;i++){ + + var origin = currentParent.getWorldPosition().clone(); + + var vec=this.loadPosAdjustments[i].clone(); + var q=currentParent.getWorldQuaternion(); + vec.applyQuaternion(q); + + this.loadArrows[i].position.copy(origin.add(vec)) + if(i!=9 ){ + if(i!=2&&i!=5&&i!=0&&i!=8){ + currentParent=currentParent.children[currentParent.children.length - 1]; + } + } + } + + //last wrist + var origin = currentParent.getWorldPosition(origin).clone(); + var vec=this.loadPosAdjustments[this.loadPosAdjustments.length-2].clone(); + var q=currentParent.getWorldQuaternion(); + vec.applyQuaternion(q); + this.loadArrows[this.loadArrows.length-2].position.copy(origin.add(vec)) + + + + var origin = this.bille.children[0].children[this.bille.children[0].children.length - 2].getWorldPosition().clone(); + var vec=this.loadPosAdjustments[this.loadArrows.length-1].clone(); + var q=currentParent.getWorldQuaternion(); + vec.applyQuaternion(q); + this.loadArrows[this.loadArrows.length-1].position.copy(origin.add(vec)) + + this.calcTorque(); + + +} + +Bille.prototype.calcTorque= function(){ + //calculate load + + for(var i=0;i<10;i++){ + this.torques[i]=new THREE.Vector3(0,0,0); + for(var j=i+1;j<10;j++){ + this.torques[i].add(new THREE.Vector3(0,0,-this.weights[j])); + var vec=this.loadArrows[j].position.clone().sub(this.loadArrows[i].position); + var t=new THREE.Vector3(0,0,0); + t.crossVectors(vec,new THREE.Vector3(0,0,-this.weights[j])); + this.torques[i].add(t); + } + + } + + this.loads.grip_1 .copy(this.torques[0]); + this.loads.control_voxel.copy(this.torques[1]); + this.loads.wrist_1 .copy(this.torques[2]); + this.loads.elbow_1 .copy(this.torques[3]); + this.loads.leg_1 .copy(this.torques[4]); + this.loads.wrist_2.copy(this.torques[5]); + this.loads.leg_2 .copy(this.torques[6]); + this.loads.elbow_2 .copy(this.torques[7]); + this.loads.wrist_3 .copy(this.torques[8]); + this.loads.voxel_1 .copy(this.torques[9]); + this.loads.grip_2 .copy(this.torques[10]); + this.loads.elbow_pickup .copy(this.torques[11]); + +} + +Bille.prototype.loadsGUI= function(){ + this.lgui = new dat.GUI(); + var loadGUI = this.lgui.addFolder('Loads'); + + var elbow_pickup=loadGUI.addFolder('elbow_pickup'); + var grip_1 =loadGUI.addFolder('grip_1') + var wrist_1 =loadGUI.addFolder('wrist_1') + var elbow_1 =loadGUI.addFolder('elbow_1') + var wrist_2 =loadGUI.addFolder('wrist_2') + var elbow_2 =loadGUI.addFolder('elbow_2') + var wrist_3 =loadGUI.addFolder('wrist_3') + var grip_2 =loadGUI.addFolder('grip_2') + + elbow_pickup.add(this.loads.elbow_pickup, 'x', 0, 100.0).step(0.01).listen(); + grip_1 .add(this.loads.grip_1 , 'x', 0, 100.0).step(0.01).listen(); + wrist_1 .add(this.loads.wrist_1 , 'x', 0, 100.0).step(0.01).listen(); + elbow_1 .add(this.loads.elbow_1 , 'x', 0, 100.0).step(0.01).listen(); + wrist_2 .add(this.loads.wrist_2 , 'x', 0, 100.0).step(0.01).listen(); + elbow_2 .add(this.loads.elbow_2 , 'x', 0, 100.0).step(0.01).listen(); + wrist_3 .add(this.loads.wrist_3 , 'x', 0, 100.0).step(0.01).listen(); + grip_2 .add(this.loads.grip_2 , 'x', 0, 100.0).step(0.01).listen(); + + elbow_pickup.add(this.loads.elbow_pickup, 'y', 0, 100.0).step(0.01).listen(); + grip_1 .add(this.loads.grip_1 , 'y', 0, 100.0).step(0.01).listen(); + wrist_1 .add(this.loads.wrist_1 , 'y', 0, 100.0).step(0.01).listen(); + elbow_1 .add(this.loads.elbow_1 , 'y', 0, 100.0).step(0.01).listen(); + wrist_2 .add(this.loads.wrist_2 , 'y', 0, 100.0).step(0.01).listen(); + elbow_2 .add(this.loads.elbow_2 , 'y', 0, 100.0).step(0.01).listen(); + wrist_3 .add(this.loads.wrist_3 , 'y', 0, 100.0).step(0.01).listen(); + grip_2 .add(this.loads.grip_2 , 'y', 0, 100.0).step(0.01).listen(); + + elbow_pickup.add(this.loads.elbow_pickup, 'z', 0, 100.0).step(0.01).listen(); + grip_1 .add(this.loads.grip_1 , 'z', 0, 100.0).step(0.01).listen(); + wrist_1 .add(this.loads.wrist_1 , 'z', 0, 100.0).step(0.01).listen(); + elbow_1 .add(this.loads.elbow_1 , 'z', 0, 100.0).step(0.01).listen(); + wrist_2 .add(this.loads.wrist_2 , 'z', 0, 100.0).step(0.01).listen(); + elbow_2 .add(this.loads.elbow_2 , 'z', 0, 100.0).step(0.01).listen(); + wrist_3 .add(this.loads.wrist_3 , 'z', 0, 100.0).step(0.01).listen(); + grip_2 .add(this.loads.grip_2 , 'z', 0, 100.0).step(0.01).listen(); + + + +} + + +//////////////////calls////////////////// + +function meshToThreejs(mesh, material) { + let loader = new THREE.BufferGeometryLoader(); + var geometry = loader.parse(mesh.toThreejsJSON()); + return new THREE.Mesh(geometry, material); +} + +//todo figure out a way to call this. +function move() { + recursiveBille.move(); +} + +function changeEnd() { + recursiveBille.changeEnd(); +} + +function rotateRobot() { + recursiveBille.rotateRobot(recursiveBille.path.changeRotation[parseInt((recursiveBille.path.currentPoint - recursiveBille.path.number) / recursiveBille.path.number / 2)]); + +} + +function pickupPart(num) { + // console.log(num); + recursiveBille.pickupPart(num); +} +////////////////////////////////////////////// + diff --git a/recursive_swarm/js/swarm_bille1.js b/recursive_swarm/js/swarm_bille1.js new file mode 100644 index 0000000000000000000000000000000000000000..edee0ddc275b61ac3bb9d3c206e1200e44e15663 --- /dev/null +++ b/recursive_swarm/js/swarm_bille1.js @@ -0,0 +1,1091 @@ +// Amira Abdel-Rahman +// (c) Massachusetts Institute of Technology 2020 + +function Bille(swarm, inputState,firstLoad=true) { + this.inputState = inputState; + this.swarm = swarm; + this.spacing = swarm.spacing; //general spacing + this.robotScale = this.inputState[2]; + this.voxelSpacing = this.robotScale * swarm.spacing; //spacing based on robot size + + console.log("voxelSpacing:"+this.voxelSpacing) + this.bille = null; + this.billeAngles = null; + this.billePos = null; + this.billePos1 = null; + this.billePosition = null; + + this.billePos = this.swarm.setup.billePos; + this.billePos1 = this.swarm.setup.billePos1; + + this.stepsDirection = this.swarm.setup.stepsDir; //todo remove later based on path planning + + this.targetGui = null; + this.jointsGui = null; + + this.init(); + if(typeof swarm.setup.parametric!== undefined && swarm.setup.parametric){ //parametric Bill-E + this.BilleSize=this.swarm.setup.BilleSize; + if(this.BilleSize.rotatedJoint){ + this.loadRhino(swarm.setup.fileNameRot,true,firstLoad); + } + else{ + this.loadRhino(swarm.setup.fileName,true,firstLoad); + } + } + else{ + this.loadRhino(swarm.setup.fileName,false,firstLoad); + } + + if (swarm.setup.recursion) { + // this.loadBilleRecursion(swarm.setup.fileNameParts); + setTimeout(function () { recursiveBille.loadBilleRecursion(swarm.setup.fileNameParts); }, this.path.timeout += this.path.delay); + } + +} + +Bille.prototype.startMovement = function () { + this.generatePath(this.stepsDirection); +} + +Bille.prototype.init = function () { + this.id = 0; //todo change when you need multiple + this.billeAngles = { + j0: 0.0, + j1: 0.0, + j2: 0.0, + j3: 0.0, + j4: 0.0, + j5: 0.0, + }; + + this.billeTarget = { + x: this.inputState[1].x * this.voxelSpacing, + y: this.inputState[1].y * this.voxelSpacing, + z: this.inputState[1].z * this.voxelSpacing, + rx: 0, + ry: 0, + rz: 0, + targetEnd: "end 1" + }; + + this.bille = new THREE.Group(); + + this.billePosition = this.inputState[0].clone().multiplyScalar(this.voxelSpacing); + + this.bille.position.x = this.billePosition.x; + this.bille.position.y = this.billePosition.y; + this.bille.position.z = this.billePosition.z; + + this.billeDirection = new THREE.Vector3(0, 0, 1); + + this.robotState = { + leg1Pos: this.inputState[1].clone(), + leg2Pos: this.inputState[0].clone(), + up: new THREE.Vector3(0, 0, 1), + forward: new THREE.Vector3(1, 0, 0), //todo change to make it parametric from inputState + }; + this.steps = []; + + this.leg = 1; + this.voxelNormal = 180; + this.normalAdjustmentVector = new THREE.Vector3(0, 0, 0); + + this.path = { + curve: null, + currentPoint: 0, + points: [], + number: this.swarm.pathParams.number, + delay: 1000 / this.swarm.speed, + timeout: 1000, + cHeight: this.swarm.pathParams.cHeight * this.voxelSpacing, + showPath: this.swarm.pathParams.showPath, + normals: [], + changeLegs: [], + changeRotation: [], + normalAdjustments: [], + rotations: [], + j0: [] + }; + + this.totalNumberofSteps = 0; + this.carriedVoxel = []; + + this.flipped = false; + this.loadArrows=[]; + +}; + +Bille.prototype.remove=function(){ + // objects=null; + var selectedObject = this.swarm.scene.getObjectByName("RecursiveBille"); + this.swarm.scene.remove(selectedObject); + var selectedObject = this.swarm.scene.getObjectByName("loadArrowsGroup"); + this.swarm.scene.remove(selectedObject); + var selectedObject = this.swarm.scene.getObjectByName("targetBille"); + this.swarm.scene.remove(selectedObject); + var selectedObject = this.swarm.scene.getObjectByName("controlBille"); + this.swarm.scene.remove(selectedObject); + + this.gui.destroy(); + this.lgui.destroy(); +} + +Bille.prototype.loadRhino=function(fileName,parametric,first){ + + if(first){ + let fetchPromise = fetch(fileName); + + rhino3dm().then(async m => { + this.swarm.rhino = m; + + let res = await fetchPromise; + let buffer = await res.arrayBuffer(); + let arr = new Uint8Array(buffer); + let doc = this.swarm.rhino.File3dm.fromByteArray(arr); + this.swarm.rhinoDoc=doc; + + if (parametric){ + this.loadParametric(); + }else{ + this.load(); + } + }); + + }else{ + if (parametric){ + this.loadParametric(); + }else{ + this.load(); + } + } +} + +Bille.prototype.load = function () { + var objects = this.swarm.rhinoDoc.objects(); + + THREE.Object3D.DefaultUp = new THREE.Vector3(0, 0, 1) + + var beta = 0.5; + + var material = new THREE.MeshLambertMaterial({ reflectivity: beta, color: new THREE.Color(0.8, 0.8, 0.8) }); + var material1 = new THREE.MeshLambertMaterial({ reflectivity: beta, color: new THREE.Color(0.3, 0.3, 0.3) }); + var material2 = new THREE.MeshLambertMaterial({ reflectivity: beta, color: new THREE.Color(0.6, 0.6, 0.6) }); + var material3 = new THREE.MeshLambertMaterial({ reflectivity: beta, color: new THREE.Color(0, 0.2, 0) }); + var material4 = new THREE.MeshLambertMaterial({ reflectivity: beta, color: new THREE.Color(0.5, 0.5, 0) }); + var material5 = new THREE.MeshLambertMaterial({ reflectivity: beta, color: new THREE.Color(0.1, 0.1, 0.1) }); + + var material = new THREE.MeshPhysicalMaterial({ metalness: 0.4, reflectivity: 0.5, roughness: 0.5, color: new THREE.Color(1.0, 1.0, 1.0) }); + var material1 = new THREE.MeshPhysicalMaterial({ metalness: 0.4, reflectivity: 0.5, roughness: 0.5, color: new THREE.Color(0.3, 0.3, 0.3) }); + var material2 = new THREE.MeshPhysicalMaterial({ metalness: 0.4, reflectivity: 0.5, roughness: 0.5, color: new THREE.Color(0.6, 0.6, 0.6) }); + var material3 = new THREE.MeshPhysicalMaterial({ metalness: 0.4, reflectivity: 0.5, roughness: 0.5, color: new THREE.Color(0, 0.2, 0) }); + var material4 = new THREE.MeshPhysicalMaterial({ metalness: 0.4, reflectivity: 0.5, roughness: 0.5, color: new THREE.Color(0.5, 0.5, 0) }); + var material5 = new THREE.MeshPhysicalMaterial({ metalness: 0.4, reflectivity: 0.5, roughness: 0.5, color: new THREE.Color(0.1, 0.1, 0.1) }); + + let billeGroupsTemp = [ + new THREE.Group(), + new THREE.Group(), + new THREE.Group(), + new THREE.Group(), + new THREE.Group(), + new THREE.Group(), + new THREE.Group() + ]; + + for (let i = 0; i < objects.count; i++) { + let mesh = objects.get(i).geometry(); + let layer = objects.get(i).attributes().layerIndex; + // console.log(objects.get(i).attributes()) + if (mesh instanceof this.swarm.rhino.Mesh) { + // convert all meshes in 3dm model into threejs objects + + let threeMesh; + + if (objects.get(i).attributes().name == 'grey' || objects.get(i).attributes().name == 'grey1' || objects.get(i).attributes().name == 'grey2' || objects.get(i).attributes().name == 'pcb') { + threeMesh = meshToThreejs(mesh, material1); + + } else if (objects.get(i).attributes().name == 'motors') { + threeMesh = meshToThreejs(mesh, material2); + } else if (objects.get(i).attributes().name == 'controller') { + threeMesh = meshToThreejs(mesh, material3); + } else if (objects.get(i).attributes().name == 'connectors') { + threeMesh = meshToThreejs(mesh, material4); + } else if (objects.get(i).attributes().name == 'battery') { + threeMesh = meshToThreejs(mesh, material5); + } else { + threeMesh = meshToThreejs(mesh, material); + } + // console.log(layer) + threeMesh.position.x += this.billePos[layer - 1].x; + threeMesh.position.y += this.billePos[layer - 1].y; + threeMesh.position.z += this.billePos[layer - 1].z; + + billeGroupsTemp[layer - 1].add(threeMesh); + } + } + + for (let i = 0; i < billeGroupsTemp.length; i++) { + billeGroupsTemp[i].name = "Group:" + i; + } + billeGroupsTemp[0].add(billeGroupsTemp[6].clone()); + + this.bille.add(billeGroupsTemp[0].clone().add(billeGroupsTemp[1].clone().add(billeGroupsTemp[2].clone().add(billeGroupsTemp[3].clone().add(billeGroupsTemp[4].clone().add(billeGroupsTemp[5].clone())))))); + + + this.bille.name="RecursiveBille"; + this.swarm.scene.add(this.bille); + + console.log("Loaded Bille!"); + + this.GUI(); + // this.jointsGui = jointsGui; + // this.targetGui = targetGui; + + this.createTarget(); + this.updateAngles(); + // this.startMovement(); + + this.initLoads(); + + + + +}; + +Bille.prototype.loadParametric = function () { + var objects = this.swarm.rhinoDoc.objects(); + + var wrist=0.3; + var bille_parts={ + "g1":new THREE.Vector3(0.0 ,0.0 ,- (1-1)*this.spacing -wrist ),//"g1", + "c1":new THREE.Vector3(0.0 ,0.0 ,- (1-1)*this.spacing-1*wrist),//"c1", + "w1":new THREE.Vector3(0.0 ,0.0 ,- (2-1)*this.spacing-1*wrist),//"w1", + "e1_1":new THREE.Vector3(0.0 ,0.0 ,- (2-1)*this.spacing-2*wrist),//"e1", + "e1_2":new THREE.Vector3(0.0 ,0.0 ,- (2-1)*this.spacing-2*wrist),//"e1", + "v1":new THREE.Vector3(0.0 ,0.0 ,- (3-1)*this.spacing-2*wrist ),//"v1", + "v1":new THREE.Vector3(0.0 ,0.0 ,- (4-1)*this.spacing-2*wrist ),//"v11", + "w2":new THREE.Vector3(0.0 ,0.0 ,- (4-1)*this.spacing-2*wrist ),//"w2", + "v2":new THREE.Vector3(0.0 , this.spacing+wrist ,- (4-1)*this.spacing-2*wrist ),//"v2", + "v2":new THREE.Vector3(0.0 , this.spacing+wrist ,- (5-1)*this.spacing-2*wrist ),//"v22", + "e2_1":new THREE.Vector3(0.0 , this.spacing+wrist ,- (6-1)*this.spacing-2*wrist ),//"e2", + "e2_2":new THREE.Vector3(0.0 , this.spacing+wrist ,- (6-1)*this.spacing-2*wrist ),//"e2", + "w3":new THREE.Vector3(0.0 , this.spacing+wrist ,- (7-1)*this.spacing-2*wrist ),//"w3", + "v3":new THREE.Vector3(0.0 , this.spacing+wrist ,- (7-1)*this.spacing-4*wrist ),//"v3", + "g2":new THREE.Vector3(0.0 , this.spacing+wrist ,- (8-1)*this.spacing-5*wrist ),//"g2", + "e3_1":new THREE.Vector3(0.0 ,-this.spacing+wrist ,- (1-1)*this.spacing -2*wrist ),//"e3", + "e3_2":new THREE.Vector3(0.0 ,-this.spacing+wrist ,- (1-1)*this.spacing -2*wrist ),//"e3", + "g3":new THREE.Vector3(0.0 ,-this.spacing+wrist ,- (1-1)*this.spacing -2*wrist ),//"g3", + + + }; + + THREE.Object3D.DefaultUp = new THREE.Vector3(0, 0, 1) + + var beta = 0.5; + + var material = new THREE.MeshLambertMaterial({ reflectivity: beta, color: new THREE.Color(0.8, 0.8, 0.8) }); + var material1 = new THREE.MeshLambertMaterial({ reflectivity: beta, color: new THREE.Color(0.3, 0.3, 0.3) }); + var material2 = new THREE.MeshLambertMaterial({ reflectivity: beta, color: new THREE.Color(0.6, 0.6, 0.6) }); + var material3 = new THREE.MeshLambertMaterial({ reflectivity: beta, color: new THREE.Color(0, 0.2, 0) }); + var material4 = new THREE.MeshLambertMaterial({ reflectivity: beta, color: new THREE.Color(0.5, 0.5, 0) }); + var material5 = new THREE.MeshLambertMaterial({ reflectivity: beta, color: new THREE.Color(0.1, 0.1, 0.1) }); + + var material = new THREE.MeshPhysicalMaterial({ metalness: 0.4, reflectivity: 0.5, roughness: 0.5, color: new THREE.Color(1.0, 1.0, 1.0) }); + var material1 = new THREE.MeshPhysicalMaterial({ metalness: 0.4, reflectivity: 0.5, roughness: 0.5, color: new THREE.Color(0.3, 0.3, 0.3) }); + var material2 = new THREE.MeshPhysicalMaterial({ metalness: 0.4, reflectivity: 0.5, roughness: 0.5, color: new THREE.Color(0.6, 0.6, 0.6) }); + var material3 = new THREE.MeshPhysicalMaterial({ metalness: 0.4, reflectivity: 0.5, roughness: 0.5, color: new THREE.Color(0, 0.2, 0) }); + var material4 = new THREE.MeshPhysicalMaterial({ metalness: 0.4, reflectivity: 0.5, roughness: 0.5, color: new THREE.Color(0.5, 0.5, 0) }); + var material5 = new THREE.MeshPhysicalMaterial({ metalness: 0.4, reflectivity: 0.5, roughness: 0.5, color: new THREE.Color(0.1, 0.1, 0.1) }); + + let billeGroupsTemp = [ + new THREE.Group(), + new THREE.Group(), + new THREE.Group(), + new THREE.Group(), + new THREE.Group(), + new THREE.Group(), + new THREE.Group() + ]; + + for (let i = 0; i < objects.count; i++) { + let mesh = objects.get(i).geometry(); + let layerIndex = objects.get(i).attributes().layerIndex; + let layerName = this.swarm.rhinoDoc.layers().findIndex(layerIndex).name; + // console.log(objects.get(i).attributes()) + if (mesh instanceof this.swarm.rhino.Mesh) { + // convert all meshes in 3dm model into threejs objects + + let threeMeshes=[]; + let materialChosen=material; + + if (objects.get(i).attributes().name == 'grey' || objects.get(i).attributes().name == 'grey1' || objects.get(i).attributes().name == 'grey2' || objects.get(i).attributes().name == 'pcb') { + materialChosen=material1; + } else if (objects.get(i).attributes().name == 'motors') { + materialChosen=material2; + } else if (objects.get(i).attributes().name == 'controller') { + materialChosen=material3; + } else if (objects.get(i).attributes().name == 'connectors') { + materialChosen=material4; + } else if (objects.get(i).attributes().name == 'battery') { + materialChosen=material5; + } else { + materialChosen=material; + } + + threeMeshes.push(meshToThreejs(mesh, materialChosen)); + + var layer=0 + var add=true; + var wrist=0.3; + if(layerName=="g1"||layerName=="c1"||layerName=="e3_1"||layerName=="v11"){ + layer=0 + + }else if(layerName=="w1"||layerName=="e1_1"||layerName=="v111"){ + layer=1 + if(this.BilleSize.rotatedJoint && (layerName=="v111"||layerName=="e1_1")){ + threeMeshes[0].position.z+=wrist; + }else if(layerName=="v111"){ + add=false; + } + }else if(layerName=="v1"||layerName=="e1_2"||layerName=="w2"){ + layer=2 + if(layerName=="w2"){ + threeMeshes[0].position.z+=this.spacing*(this.BilleSize.legHeight-1); + } + }else if(layerName=="v2"||layerName=="e2_1"){ + layer=3 + if(layerName=="e2_1"){ + threeMeshes[0].position.z+=this.spacing*(this.BilleSize.legHeight-1); + } + }else if(layerName=="e2_2"||layerName=="w3"||layerName=="v222"){ + layer=4 + if(this.BilleSize.rotatedJoint && (layerName=="v222"||layerName=="e2_2")){ + // threeMeshes[0].position.z+=wrist; + }else if(layerName=="v222"){ + add=false; + } + }else if(layerName=="v3"||layerName=="g2"||layerName=="v22"){ + layer=5 + if(layerName=="g2"){ + threeMeshes[0].position.z+=this.spacing*(this.BilleSize.baseHeight-1); + } + }else if(layerName=="e3_2"||layerName=="g3"){ + layer=6 + + }else{ + add=false; + } + + for (var ii=1;ii<this.BilleSize.legHeight;ii++){ + if(layerName=="v1"||layerName=="v2"){ + threeMeshes.push(meshToThreejs(mesh, materialChosen)); + threeMeshes[threeMeshes.length-1].position.z+=this.spacing*(this.BilleSize.legHeight-(threeMeshes.length-1)); + } + } + for (var ii=1;ii<this.BilleSize.baseHeight;ii++){ + if(layerName=="v11"||layerName=="v22"){ + threeMeshes.push(meshToThreejs(mesh, materialChosen)); + threeMeshes[threeMeshes.length-1].position.z+=this.spacing*(this.BilleSize.baseHeight-(threeMeshes.length-1)); + } + } + + if(this.BilleSize.rotatedJoint){ //width should be 1 already but just in case + for (var ii=1;ii<this.BilleSize.width;ii++){ + if(layerName=="v11"||layerName=="v22"){ + for (var kk=0;kk<this.BilleSize.baseHeight;kk++){ + // console.log("ii:"+(this.BilleSize.width-(ii))+" kk:"+(this.BilleSize.baseHeight-(kk))) + threeMeshes.push(meshToThreejs(mesh, materialChosen)); + threeMeshes[threeMeshes.length-1].position.x-=this.spacing*(this.BilleSize.width-(ii)); + threeMeshes[threeMeshes.length-1].position.z+=this.spacing*(this.BilleSize.baseHeight-(kk+1)); + } + } + if(layerName=="v1"){ + for (var kk=0;kk<this.BilleSize.legHeight;kk++){ + threeMeshes.push(meshToThreejs(mesh, materialChosen)); + threeMeshes[threeMeshes.length-1].position.y+=this.spacing*(this.BilleSize.width-(ii)); + threeMeshes[threeMeshes.length-1].position.z+=this.spacing*(this.BilleSize.legHeight-(kk+1)); + + } + }else if(layerName=="v2"){ + for (var kk=0;kk<this.BilleSize.legHeight;kk++){ + threeMeshes.push(meshToThreejs(mesh, materialChosen)); + threeMeshes[threeMeshes.length-1].position.y-=this.spacing*(this.BilleSize.width-(ii)); + threeMeshes[threeMeshes.length-1].position.z+=this.spacing*(this.BilleSize.legHeight-(kk+1)); + } + } + + + if(layerName=="v111"||layerName=="e1_1"||layerName=="e1_2"){ + threeMeshes.push(meshToThreejs(mesh, materialChosen)); + threeMeshes[threeMeshes.length-1].position.y+=this.spacing*(this.BilleSize.width-(ii)); + }else if(layerName=="v222"||layerName=="e2_1"||layerName=="e2_2"){ + threeMeshes.push(meshToThreejs(mesh, materialChosen)); + threeMeshes[threeMeshes.length-1].position.y-=this.spacing*(this.BilleSize.width-(ii)); + }else if(layerName=="g1"||layerName=="e3_1"||layerName=="e3_2"||layerName=="g3"||layerName=="g2"){ + threeMeshes.push(meshToThreejs(mesh, materialChosen)); + threeMeshes[threeMeshes.length-1].position.x-=this.spacing*(this.BilleSize.width-(ii)); + } + if(layerName=="e2_1"){ + threeMeshes[threeMeshes.length-1].position.z+=this.spacing*(this.BilleSize.legHeight-1); + }else if(layerName=="g2"){ + threeMeshes[threeMeshes.length-1].position.z+=this.spacing*(this.BilleSize.baseHeight-1); + } + + } + } + + + + if(add){ + for (var ii=0;ii<threeMeshes.length;ii++){ + threeMeshes[ii].position.x += this.billePos[layer].x; + threeMeshes[ii].position.y += this.billePos[layer].y; + threeMeshes[ii].position.z += this.billePos[layer].z; + billeGroupsTemp[layer].add(threeMeshes[ii]); + } + } + + } + } + + for (let i = 0; i < billeGroupsTemp.length; i++) { + billeGroupsTemp[i].name = "Group:" + i; + } + billeGroupsTemp[0].add(billeGroupsTemp[6].clone()); + + this.bille.add(billeGroupsTemp[0].clone().add(billeGroupsTemp[1].clone().add(billeGroupsTemp[2].clone().add(billeGroupsTemp[3].clone().add(billeGroupsTemp[4].clone().add(billeGroupsTemp[5].clone())))))); + + this.bille.name="RecursiveBille"; + this.swarm.scene.add(this.bille); + + console.log("Loaded Bille!"); + + this.GUI(); + // this.jointsGui = jointsGui; + // this.targetGui = targetGui; + + this.createTarget(); + this.updateAngles(); + // // this.startMovement(); + + this.initLoads(); + + + +}; + +Bille.prototype.updateAngles = function (getTarget = true) { + if (this.leg == 1) { + if (getTarget) { + this.IK(new THREE.Vector3(this.targetBille.position.x - this.bille.position.x, + this.targetBille.position.y - this.bille.position.y, + this.targetBille.position.z - this.bille.position.z)); + } + // console.log(this.billeAngles) + + for (let i = 0; i < 7; i++) { + var joint = this.swarm.scene.getObjectByName("Group:" + i); + joint.position.x = 0; + joint.position.y = 0; + joint.position.z = 0; + } + + + if (this.path.j0.length > 0 && this.path.currentPoint < this.path.j0.length) { + this.billeAngles.j0 = this.path.j0[this.path.currentPoint]; + } + + this.swarm.scene.getObjectByName("Group:" + 6).rotation.x = this.swarm.DEG_TO_RAD * this.billeAngles.j0; + this.swarm.scene.getObjectByName("Group:" + 1).rotation.z = this.swarm.DEG_TO_RAD * this.billeAngles.j1; + this.swarm.scene.getObjectByName("Group:" + 2).rotation.y = this.swarm.DEG_TO_RAD * this.billeAngles.j2; + this.swarm.scene.getObjectByName("Group:" + 3).rotation.y = this.swarm.DEG_TO_RAD * this.billeAngles.j3; + this.swarm.scene.getObjectByName("Group:" + 4).rotation.y = this.swarm.DEG_TO_RAD * this.billeAngles.j4; + this.swarm.scene.getObjectByName("Group:" + 5).rotation.z = this.swarm.DEG_TO_RAD * this.billeAngles.j5; + + this.swarm.scene.getObjectByName("Group:" + 1).rotation.z -= this.swarm.scene.getObjectByName("Group:" + 0).rotation.z; + + if (this.path.rotations.length > 0 && this.path.currentPoint < this.path.rotations.length) { + this.swarm.scene.getObjectByName("Group:" + 5).rotation.z += this.path.rotations[this.path.currentPoint] * this.swarm.DEG_TO_RAD; + } + + for (let i = 1; i < 7; i++) { + var joint = this.swarm.scene.getObjectByName("Group:" + i); + joint.position.x -= this.billePos1[i].x; + joint.position.y -= this.billePos1[i].y; + joint.position.z -= this.billePos1[i].z; + + } + + } else { + if (getTarget) { + this.IK(new THREE.Vector3(-(this.targetBille.position.x - this.bille.position.x), + -(this.targetBille.position.y - this.bille.position.y), + -(this.targetBille.position.z - this.bille.position.z))); + } + + + for (let i = 0; i < 7; i++) { + var joint = this.swarm.scene.getObjectByName("Group:" + i); + joint.position.x = 0; + joint.position.y = 0; + joint.position.z = 0; + } + + this.swarm.scene.getObjectByName("Group:" + 6).rotation.x = this.swarm.DEG_TO_RAD * this.billeAngles.j0; + this.swarm.scene.getObjectByName("Group:" + 1).rotation.z = this.swarm.DEG_TO_RAD * this.billeAngles.j1; + this.swarm.scene.getObjectByName("Group:" + 2).rotation.y = this.swarm.DEG_TO_RAD * this.billeAngles.j2; + this.swarm.scene.getObjectByName("Group:" + 3).rotation.y = this.swarm.DEG_TO_RAD * this.billeAngles.j3; + this.swarm.scene.getObjectByName("Group:" + 4).rotation.y = this.swarm.DEG_TO_RAD * this.billeAngles.j4; + this.swarm.scene.getObjectByName("Group:" + 5).rotation.z = this.swarm.DEG_TO_RAD * this.billeAngles.j5; + + + if (this.path.rotations.length > 0 && this.path.currentPoint < this.path.rotations.length) { + this.swarm.scene.getObjectByName("Group:" + 0).rotation.z = -this.path.rotations[this.path.currentPoint] * this.swarm.DEG_TO_RAD + this.bille.position.rz; + this.swarm.scene.getObjectByName("Group:" + 1).rotation.z += this.path.rotations[this.path.currentPoint] * this.swarm.DEG_TO_RAD - this.bille.position.rz; + + } else { + this.swarm.scene.getObjectByName("Group:" + 1).rotation.z -= this.swarm.scene.getObjectByName("Group:" + 0).rotation.z; + + } + + for (let i = 1; i < 7; i++) { + var joint = this.swarm.scene.getObjectByName("Group:" + i); + joint.position.x -= this.billePos1[i].x; + joint.position.y -= this.billePos1[i].y; + joint.position.z -= this.billePos1[i].z; + } + + var joint = this.swarm.scene.getObjectByName("Group:" + 0); + joint.position.x = this.targetBille.position.x - this.bille.position.x; + joint.position.y = this.targetBille.position.y - this.bille.position.y; + joint.position.z = this.targetBille.position.z - this.bille.position.z; + + } + for (var i in this.jointsGui.__controllers) { + this.jointsGui.__controllers[i].updateDisplay(); + } + for (var i in this.targetGui.__controllers) { + this.targetGui.__controllers[i].updateDisplay(); + } + + if(this.loadArrows.length!=0){ + this.updateLoads(); + } + +}; + +Bille.prototype.GUI = function () { + this.gui = new dat.GUI(); + + var button = { + 'download csv': function () { + recursiveBille.download_csv(); + }, + 'start movement': function () { + recursiveBille.startMovementDirections(recursiveBille.stepsDirection); + }, + 'pick up': function () { + recursiveBille.startMovementPickup(); + }, + // 'drop off':function(){ + // recursiveBille.startMovementDropOff(); + // }, + // 'create robot':function(){ + // recursiveBille.magic(); + // }, + // 'final':function(){ + // recursiveBille.final(); + // } + }; + + var jointsGui = this.gui.addFolder('Robot Joints'); + var jointsParams = []; + jointsParams.push(jointsGui.add(this.billeAngles, 'j0', -180.0, 180.0).step(0.01)); + jointsParams.push(jointsGui.add(this.billeAngles, 'j1', -180.0, 180.0).step(0.01)); + jointsParams.push(jointsGui.add(this.billeAngles, 'j2', -180.0, 180.0).step(0.01)); + jointsParams.push(jointsGui.add(this.billeAngles, 'j3', -180.0, 180.0).step(0.01)); + jointsParams.push(jointsGui.add(this.billeAngles, 'j4', -180.0, 180.0).step(0.01)); + jointsParams.push(jointsGui.add(this.billeAngles, 'j5', -180.0, 180.0).step(0.01)); + + for (var i = 0; i < jointsParams.length; i++) { + jointsParams[i].onChange(function (value) { + recursiveBille.updateAngles(false); //todo change + + }); + } + + var targetGui = this.gui.addFolder('Target Position'); + var targetParams = []; + // targetParams.push(targetGui.add(this.billeTarget, 'x', -15.0, 15.0).step(0.01).listen()); + // targetParams.push(targetGui.add(this.billeTarget, 'y', -15.0, 15.0).step(0.01).listen()); + // targetParams.push(targetGui.add(this.billeTarget, 'z', -15.0, 15.0).step(0.01).listen()); + // var changeTargetEnd = targetGui.add(this.billeTarget, 'targetEnd', ["end 1", "end 2"]).listen() + targetParams.push(targetGui.add(this.billeTarget, 'x', -15.0, 15.0).step(0.01)); + targetParams.push(targetGui.add(this.billeTarget, 'y', -15.0, 15.0).step(0.01)); + targetParams.push(targetGui.add(this.billeTarget, 'z', -15.0, 15.0).step(0.01)); + var changeTargetEnd = targetGui.add(this.billeTarget, 'targetEnd', ["end 1", "end 2"]) + + // var extraGui =gui.addFolder('Simulation Speed'); + // extraGui.add(this.path, 'delay', 0, 100).step(10).listen(); + + // gui.add(button,"pick up"); + // gui.add(button,"drop off"); + // gui.add(button,"create robot"); + // gui.add(button,"final"); + // gui.add(button,"start movement"); + // gui.add(button,"download csv"); + + for (var i = 0; i < targetParams.length; i++) { + targetParams[i].onChange(function (value) { + + recursiveBille.targetBille.position.x = recursiveBille.billeTarget.x; + recursiveBille.targetBille.position.y = recursiveBille.billeTarget.y; + recursiveBille.targetBille.position.z = recursiveBille.billeTarget.z; + recursiveBille.controlBille.position.x = recursiveBille.billeTarget.x; + recursiveBille.controlBille.position.y = recursiveBille.billeTarget.y; + recursiveBille.controlBille.position.z = recursiveBille.billeTarget.z; + + recursiveBille.updateAngles(); //todo change bille + + }); + } + changeTargetEnd.onChange(function (value) { + recursiveBille.changeEnd(); + }); + + this.jointsGui = jointsGui; + this.targetGui = targetGui; + +}; + +Bille.prototype.IK = function (pos) { + var x1 = pos.x; + var y1 = pos.y; + + var x = x1; + var alt = this.spacing; + var y = pos.y + alt; + var z = pos.z - 0.0; // empirical was pos.z-0.188 + + + var l = Math.sqrt(pos.y ** 2 + pos.x ** 2); + var ll = this.spacing + (10.5 / 102) * this.spacing; //Middle wrist actuator thickness + + + if (pos.y <= 0) { + + var alpha = Math.asin(pos.x / l); + var beta = Math.asin(ll / l); + + var theta = Math.PI / 2 - alpha - beta; + + + var xm = Math.sin(theta) * ll; + var ym = Math.cos(theta) * ll; + + x = Math.sqrt((-pos.y - ym) ** 2 + (pos.x + xm) ** 2); + j1 = -theta; + } else { + var alpha = Math.asin(Math.sqrt(l ** 2 - ll ** 2) / l); + var beta = Math.atan(pos.x / Math.abs(pos.y)); + + var theta = Math.PI - alpha - beta; + + + var xm = Math.sin(theta) * ll; + var ym = Math.cos(theta) * ll; + x = Math.sqrt((pos.y + ym) ** 2 + (pos.x - xm) ** 2); + j1 = theta; + } + + + var j1, j2, j3, j4, j5; + var a = this.spacing * this.robotScale; + var b = this.spacing * this.robotScale; + // console.log(this.robotScale) + + var c = Math.sqrt(x * x + z * z); + + j2 = Math.PI / 2.0 - (Math.atan(z / x) + Math.acos((b * b + c * c - a * a) / (2 * b * c))); + + j3 = Math.acos((a * a + b * b - c * c) / (2 * a * b)); + + j4 = Math.atan(x / z) + Math.acos((a * a + c * c - b * b) / (2 * a * c)); + + + + if (z < 0) { + j4 -= Math.PI; + } + + + this.billeAngles.j1 = j1 * this.swarm.RAD_TO_DEG; + this.billeAngles.j2 = (j2 * this.swarm.RAD_TO_DEG); + this.billeAngles.j3 = 180 - (j3 * this.swarm.RAD_TO_DEG); + this.billeAngles.j4 = 180 - (j4 * this.swarm.RAD_TO_DEG); + if (this.billeAngles.j4 > 360) { + this.billeAngles.j4 -= 360; + } else if (this.billeAngles.j4 > 180) { + this.billeAngles.j4 -= 360; + } + this.billeAngles.j5 = (j1 * this.swarm.RAD_TO_DEG); + + + // console.log(this.path.points.length) +}; + +Bille.prototype.createTarget = function () { + this.targetBille = new THREE.Group(); + this.targetBille.name="targetBille"; + if (this.swarm.showGUI) { + + this.swarm.scene.add(this.targetBille); + } + + this.controlBille = new THREE.TransformControls(this.swarm.camera, this.swarm.renderer.domElement); + this.controlBille.name="controlBille" + this.targetBille.position.x = this.billeTarget.x; + this.targetBille.position.y = this.billeTarget.y; + this.targetBille.position.z = this.billeTarget.z; + + this.controlBille.size = 0.5; + this.controlBille.space = "local"; + // this.targetBille.rotation.y=180*this.DEG_TO_RAD; + // this.targetBille.rotation.z=90*this.DEG_TO_RAD; + // this.control.setSpace( this.control.space === "local" ? "world" : "local" ); + this.controlBille.addEventListener('change', () => { + recursiveBille.billeTarget.x = recursiveBille.targetBille.position.x; //todo change bille + recursiveBille.billeTarget.y = recursiveBille.targetBille.position.y; + recursiveBille.billeTarget.z = recursiveBille.targetBille.position.z; + recursiveBille.updateAngles(); + }); + this.controlBille.attach(this.targetBille); + + if (this.swarm.showGUI) { + this.swarm.scene.add(this.controlBille); + // this.control.visible = false; + + } + +}; + +Bille.prototype.getNormalAdjustment = function (n, vnormal, forward) {//n is normal degree{ + var result = new THREE.Vector3(0, 0, 0); + if (n == 180) { + return result; + } + var theta = Math.abs(180 - n); + var base = 2 * Math.sin(theta / 2 * this.DEG_TO_RAD) * (this.voxelSpacing * 1.5);//TODO fix (offset) + var x = Math.sin(((180 - theta) / 2) * this.DEG_TO_RAD) * base; + var y = Math.cos(((180 - theta) / 2) * this.DEG_TO_RAD) * base; + + result = vnormal.clone().multiplyScalar(-y); + + if (n > 180) { + var tempV = forward.clone().multiplyScalar(x); + result.add(tempV); + return result; + } else { + var tempV = forward.clone().multiplyScalar(-x); + result.add(tempV); + return result; + } + +}; + +Bille.prototype.initLoads= function(){ + this.loadArrowsGroup=new THREE.Group(); + this.loadArrowsGroup.name="loadArrowsGroup"; + + this.loads={ + grip_1:new THREE.Vector3(0,0,0), + control_voxel:new THREE.Vector3(0,0,0), //control voxel + wrist_1:new THREE.Vector3(0,0,0) , // wrist 1 + elbow_1:new THREE.Vector3(0,0,0), // elbow 1 + leg_1:new THREE.Vector3(0,0,0), // leg_1 + wrist_2:new THREE.Vector3(0,0,0) , // wrist 2 + leg_2:new THREE.Vector3(0,0,0), // leg_2 + elbow_2:new THREE.Vector3(0,0,0), // elbow 2 + wrist_3:new THREE.Vector3(0,0,0), //wrist 3 + voxel_1:new THREE.Vector3(0,0,0), //voxel + grip_2:new THREE.Vector3(0,0,0), //grip 3 + elbow_pickup:new THREE.Vector3(0,0,0) //elbow_pickup + + }; + if(typeof this.swarm.setup.parametric!== undefined && this.swarm.setup.parametric){ + var shift=0.3 + + this.loadPosAdjustments=[ + new THREE.Vector3(0,0,-shift),//grip 1 + new THREE.Vector3(0,0,(this.spacing*this.BilleSize.baseHeight)*0.5),//control voxel + new THREE.Vector3(0,0,this.spacing),//wrist 1 + new THREE.Vector3(0.0,0.0,this.spacing*1.5),// elbow 1 + new THREE.Vector3(0,0,this.spacing+this.spacing*0.5*(this.BilleSize.legHeight-1)),// leg 1 + new THREE.Vector3(0,this.spacing*0.5,0),//wrist 2 + new THREE.Vector3(0,0,this.spacing*0.5*(this.BilleSize.legHeight-1)),// leg 2 + new THREE.Vector3(0,0,0), // elbow 2 + new THREE.Vector3(0,0,this.spacing/2+shift), // wrist 3 + + new THREE.Vector3(0,0,(this.spacing*this.BilleSize.baseHeight)-0.5*this.spacing), //voxel + + new THREE.Vector3(0,0,(1+this.BilleSize.baseHeight)*this.spacing-2*shift),//grip 2 + + new THREE.Vector3(0,0,0) //elbow_pickup + + ]; + + }else{ + this.loadPosAdjustments=[ + new THREE.Vector3(0,0,-this.voxelSpacing/this.robotScale*0.1),//grip 1 + new THREE.Vector3(0,0,this.voxelSpacing/this.robotScale*0.5),//control voxel + new THREE.Vector3(0,0,0),//wrist 1 + new THREE.Vector3(0,0,this.voxelSpacing/this.robotScale*0.5),// elbow 1 + new THREE.Vector3(0,0,this.voxelSpacing/this.robotScale*1.5),// leg 1 + new THREE.Vector3(0,this.voxelSpacing/this.robotScale*0.5,0),//wrist 2 + new THREE.Vector3(0,0,this.voxelSpacing/this.robotScale*0.5),// leg 2 + new THREE.Vector3(0,0,0), // elbow 2 + new THREE.Vector3(0,0,-this.voxelSpacing/this.robotScale*0.25), // wrist 3 + new THREE.Vector3(0,0,this.voxelSpacing/this.robotScale*0.25), //voxel + new THREE.Vector3(0,0,this.voxelSpacing/this.robotScale*0.75),//grip 2 + new THREE.Vector3(0,0,0) //elbow_pickup + + ]; + + } + + + + this.weights=[ + 5, //grip 1 + 15, //control voxel + 5, //wrist 1 + 30, // elbow 1 + 20, // leg 1 + 5, // wrist 2 + 20, // leg 2 + 30, // elbow 3 + 5, //wrist 3 + 10, //voxel + 5, //grip 2 + 30 //lower elbow + + ]; + this.torques=[ + new THREE.Vector3(0,0,0), //grip 1 + new THREE.Vector3(0,0,0), //control voxel + new THREE.Vector3(0,0,0), //wrist1 + new THREE.Vector3(0,0,0), // elbow 1 + new THREE.Vector3(0,0,0), // leg 1 + new THREE.Vector3(0,0,0), // wrist 2 + new THREE.Vector3(0,0,0), // leg 2 + new THREE.Vector3(0,0,0), // elbow 3 + new THREE.Vector3(0,0,0), //wrist 3 + new THREE.Vector3(0,0,0), //voxel + new THREE.Vector3(0,0,0), //grip 2 + new THREE.Vector3(0,0,0), //lower elbow + + ]; + + + var currentParent=this.bille.children[this.bille.children.length - 1]; + var length = 1.2; + var hex = 0xff7171; + var dir = new THREE.Vector3( 0, 0, -1 ); + dir.normalize(); + var arrowScale=0.7; + + + + for(var i=0;i<10;i++){ + var origin = currentParent.getWorldPosition(origin).clone().add(this.bille.position); + + var vec=this.loadPosAdjustments[i].clone(); + var q=currentParent.getWorldQuaternion(); + vec.applyQuaternion(q); + + this.loadArrows.push(new THREE.ArrowHelper( dir, origin.clone().add(vec), length, hex,arrowScale,arrowScale )); + + this.loadArrows[i].name="loadArrow:" + i; + this.loadArrowsGroup.add( this.loadArrows[i] ); + if(i!=9 ){ + if(i!=2&&i!=5&&i!=0&&i!=8){ + currentParent=currentParent.children[currentParent.children.length - 1]; + } + } + + + + } + //last wrist + var origin = currentParent.getWorldPosition(origin).clone().add(this.bille.position); + var vec=this.loadPosAdjustments[this.loadPosAdjustments.length-2].clone(); + var q=currentParent.getWorldQuaternion(); + vec.applyQuaternion(q); + this.loadArrows.push(new THREE.ArrowHelper( dir, origin.clone().add(vec), length, hex,arrowScale,arrowScale )); + this.loadArrows[this.loadArrows.length-1].name="loadArrow:" + (this.loadArrows.length-1); + this.loadArrowsGroup.add( this.loadArrows[this.loadArrows.length-1] ); + + + + //pickup elbow + var origin = this.bille.children[0].children[this.bille.children[0].children.length - 2].getWorldPosition().clone().add(this.bille.position); + var vec=this.loadPosAdjustments[this.loadPosAdjustments.length-1].clone(); + var q=currentParent.getWorldQuaternion(); + vec.applyQuaternion(q); + this.loadArrows.push(new THREE.ArrowHelper( dir, origin.clone().add(vec), length, hex,arrowScale,arrowScale )); + this.loadArrows[this.loadArrows.length-1].name="loadArrow:" + (this.loadArrows.length-1); + this.loadArrowsGroup.add( this.loadArrows[this.loadPosAdjustments.length-1] ); + + + + this.swarm.scene.add( this.loadArrowsGroup ); + + this.calcTorque(); + this.loadsGUI(); + +} + +Bille.prototype.updateLoads= function(){ + + var currentParent=this.bille.children[this.bille.children.length - 1]; + + + for(var i=0;i<10;i++){ + + var origin = currentParent.getWorldPosition().clone(); + + var vec=this.loadPosAdjustments[i].clone(); + var q=currentParent.getWorldQuaternion(); + vec.applyQuaternion(q); + + this.loadArrows[i].position.copy(origin.add(vec)) + if(i!=9 ){ + if(i!=2&&i!=5&&i!=0&&i!=8){ + currentParent=currentParent.children[currentParent.children.length - 1]; + } + } + } + + //last wrist + var origin = currentParent.getWorldPosition(origin).clone(); + var vec=this.loadPosAdjustments[this.loadPosAdjustments.length-2].clone(); + var q=currentParent.getWorldQuaternion(); + vec.applyQuaternion(q); + this.loadArrows[this.loadArrows.length-2].position.copy(origin.add(vec)) + + + + var origin = this.bille.children[0].children[this.bille.children[0].children.length - 2].getWorldPosition().clone(); + var vec=this.loadPosAdjustments[this.loadArrows.length-1].clone(); + var q=currentParent.getWorldQuaternion(); + vec.applyQuaternion(q); + this.loadArrows[this.loadArrows.length-1].position.copy(origin.add(vec)) + + this.calcTorque(); + + +} + +Bille.prototype.calcTorque= function(){ + //calculate load + + for(var i=0;i<10;i++){ + this.torques[i]=new THREE.Vector3(0,0,0); + for(var j=i+1;j<10;j++){ + this.torques[i].add(new THREE.Vector3(0,0,-this.weights[j])); + var vec=this.loadArrows[j].position.clone().sub(this.loadArrows[i].position); + var t=new THREE.Vector3(0,0,0); + t.crossVectors(vec,new THREE.Vector3(0,0,-this.weights[j])); + this.torques[i].add(t); + } + + } + + this.loads.grip_1 .copy(this.torques[0]); + this.loads.control_voxel.copy(this.torques[1]); + this.loads.wrist_1 .copy(this.torques[2]); + this.loads.elbow_1 .copy(this.torques[3]); + this.loads.leg_1 .copy(this.torques[4]); + this.loads.wrist_2.copy(this.torques[5]); + this.loads.leg_2 .copy(this.torques[6]); + this.loads.elbow_2 .copy(this.torques[7]); + this.loads.wrist_3 .copy(this.torques[8]); + this.loads.voxel_1 .copy(this.torques[9]); + this.loads.grip_2 .copy(this.torques[10]); + this.loads.elbow_pickup .copy(this.torques[11]); + +} + +Bille.prototype.loadsGUI= function(){ + this.lgui = new dat.GUI(); + var loadGUI = this.lgui.addFolder('Loads'); + + var elbow_pickup=loadGUI.addFolder('elbow_pickup'); + var grip_1 =loadGUI.addFolder('grip_1') + var wrist_1 =loadGUI.addFolder('wrist_1') + var elbow_1 =loadGUI.addFolder('elbow_1') + var wrist_2 =loadGUI.addFolder('wrist_2') + var elbow_2 =loadGUI.addFolder('elbow_2') + var wrist_3 =loadGUI.addFolder('wrist_3') + var grip_2 =loadGUI.addFolder('grip_2') + + elbow_pickup.add(this.loads.elbow_pickup, 'x', 0, 100.0).step(0.01).listen(); + grip_1 .add(this.loads.grip_1 , 'x', 0, 100.0).step(0.01).listen(); + wrist_1 .add(this.loads.wrist_1 , 'x', 0, 100.0).step(0.01).listen(); + elbow_1 .add(this.loads.elbow_1 , 'x', 0, 100.0).step(0.01).listen(); + wrist_2 .add(this.loads.wrist_2 , 'x', 0, 100.0).step(0.01).listen(); + elbow_2 .add(this.loads.elbow_2 , 'x', 0, 100.0).step(0.01).listen(); + wrist_3 .add(this.loads.wrist_3 , 'x', 0, 100.0).step(0.01).listen(); + grip_2 .add(this.loads.grip_2 , 'x', 0, 100.0).step(0.01).listen(); + + elbow_pickup.add(this.loads.elbow_pickup, 'y', 0, 100.0).step(0.01).listen(); + grip_1 .add(this.loads.grip_1 , 'y', 0, 100.0).step(0.01).listen(); + wrist_1 .add(this.loads.wrist_1 , 'y', 0, 100.0).step(0.01).listen(); + elbow_1 .add(this.loads.elbow_1 , 'y', 0, 100.0).step(0.01).listen(); + wrist_2 .add(this.loads.wrist_2 , 'y', 0, 100.0).step(0.01).listen(); + elbow_2 .add(this.loads.elbow_2 , 'y', 0, 100.0).step(0.01).listen(); + wrist_3 .add(this.loads.wrist_3 , 'y', 0, 100.0).step(0.01).listen(); + grip_2 .add(this.loads.grip_2 , 'y', 0, 100.0).step(0.01).listen(); + + elbow_pickup.add(this.loads.elbow_pickup, 'z', 0, 100.0).step(0.01).listen(); + grip_1 .add(this.loads.grip_1 , 'z', 0, 100.0).step(0.01).listen(); + wrist_1 .add(this.loads.wrist_1 , 'z', 0, 100.0).step(0.01).listen(); + elbow_1 .add(this.loads.elbow_1 , 'z', 0, 100.0).step(0.01).listen(); + wrist_2 .add(this.loads.wrist_2 , 'z', 0, 100.0).step(0.01).listen(); + elbow_2 .add(this.loads.elbow_2 , 'z', 0, 100.0).step(0.01).listen(); + wrist_3 .add(this.loads.wrist_3 , 'z', 0, 100.0).step(0.01).listen(); + grip_2 .add(this.loads.grip_2 , 'z', 0, 100.0).step(0.01).listen(); + + + +} + + +//////////////////calls////////////////// + +function meshToThreejs(mesh, material) { + let loader = new THREE.BufferGeometryLoader(); + var geometry = loader.parse(mesh.toThreejsJSON()); + return new THREE.Mesh(geometry, material); +} + +//todo figure out a way to call this. +function move() { + recursiveBille.move(); +} + +function changeEnd() { + recursiveBille.changeEnd(); +} + +function rotateRobot() { + recursiveBille.rotateRobot(recursiveBille.path.changeRotation[parseInt((recursiveBille.path.currentPoint - recursiveBille.path.number) / recursiveBille.path.number / 2)]); + +} + +function pickupPart(num) { + // console.log(num); + recursiveBille.pickupPart(num); +} +////////////////////////////////////////////// + diff --git a/recursive_swarm/js/swarm_bille_pickup.js b/recursive_swarm/js/swarm_bille_pickup.js new file mode 100644 index 0000000000000000000000000000000000000000..8a33d6ab7c44fad2b3087284a63f4a94f29a10c7 --- /dev/null +++ b/recursive_swarm/js/swarm_bille_pickup.js @@ -0,0 +1,1019 @@ +// Amira Abdel-Rahman +// (c) Massachusetts Institute of Technology 2020 + + +Bille.prototype.loadBilleRecursion= function(fileName){ + + function meshToThreejs(mesh, material) { + var loader = new THREE.BufferGeometryLoader(); + var geometry = loader.parse(mesh.toThreejsJSON()); + return new THREE.Mesh(geometry, material); + } + + var fetchPromise = fetch(fileName); + + rhino3dm().then(async m => { + var rhino = m; + + let res = await fetchPromise; + let buffer = await res.arrayBuffer(); + let arr = new Uint8Array(buffer); + let doc = rhino.File3dm.fromByteArray(arr); + + + var voxelSpacing=this.spacing; + + this.billePosition=new THREE.Vector3(0,0,0); + + // let material = new THREE.MeshLambertMaterial( { color: new THREE.Color( 0.8, 0.8, 0.8 ) } ); + // let material1 = new THREE.MeshLambertMaterial( { color: new THREE.Color( 0.3, 0.3, 0.3 ) } ); + // let material2 = new THREE.MeshLambertMaterial( { color: new THREE.Color( 0.6, 0.6, 0.6 ) } ); + // let material3 = new THREE.MeshLambertMaterial( { color: new THREE.Color( 0, 0.2, 0 ) } ); + // let material4 = new THREE.MeshLambertMaterial( { color: new THREE.Color( 0.5, 0.5, 0 ) } ); + // let material5 = new THREE.MeshLambertMaterial( { color: new THREE.Color( 0.1, 0.1, 0.1 ) } ); + + var material = new THREE.MeshPhysicalMaterial( { metalness: 0.4,reflectivity: 0.5,roughness: 0.5,clearcoat: 0.8,clearcoatRoughness: 0.1,color: new THREE.Color( 1.0, 1.0, 1.0 ) } ); + var material1 = new THREE.MeshPhysicalMaterial( { metalness: 0.4,reflectivity: 0.5,roughness: 0.5,clearcoat: 0.8,clearcoatRoughness: 0.1,color: new THREE.Color( 0.3, 0.3, 0.3 ) } ); + var material2 = new THREE.MeshPhysicalMaterial( { metalness: 0.4,reflectivity: 0.5,roughness: 0.5,clearcoat: 0.8,clearcoatRoughness: 0.1,color: new THREE.Color( 0.6, 0.6, 0.6 ) } ); + var material3 = new THREE.MeshPhysicalMaterial( { metalness: 0.4,reflectivity: 0.5,roughness: 0.5,clearcoat: 0.8,clearcoatRoughness: 0.1,color: new THREE.Color( 0, 0.2, 0 ) } ); + var material4 = new THREE.MeshPhysicalMaterial( { metalness: 0.4,reflectivity: 0.5,roughness: 0.5,clearcoat: 0.8,clearcoatRoughness: 0.1,color: new THREE.Color( 0.5, 0.5, 0 ) } ); + var material5 = new THREE.MeshPhysicalMaterial( { metalness: 0.4,reflectivity: 0.5,roughness: 0.5,clearcoat: 0.8,clearcoatRoughness: 0.1,color: new THREE.Color( 0.1, 0.1, 0.1 ) } ); + + var wrist=0.188; + var billePos=[ + new THREE.Vector3(0.0 ,0.0 ,-this.spacing/2.0- this.spacing -wrist ),//"g1", + new THREE.Vector3(0.0 ,0.0 ,-this.spacing/2.0- this.spacing-1*wrist),//"c1", + new THREE.Vector3(0.0 ,0.0 ,-this.spacing/2.0- 2*this.spacing-1*wrist),//"w1", + new THREE.Vector3(0.0 ,0.0 ,-this.spacing/2.0- 2*this.spacing-2*wrist),//"e1", + + new THREE.Vector3(0.0 ,0.0 ,-this.spacing/2.0- 3*this.spacing-2*wrist ),//"v1", + new THREE.Vector3(0.0 ,0.0 ,-this.spacing/2.0- 4*this.spacing-2*wrist ),//"v11", + new THREE.Vector3(0.0 ,0.0 ,-this.spacing/2.0- 4*this.spacing-2*wrist ),//"w2", + new THREE.Vector3(0.0 , this.spacing+wrist ,-this.spacing/2.0- 4*this.spacing-2*wrist ),//"v2", + new THREE.Vector3(0.0 , this.spacing+wrist ,-this.spacing/2.0- 5*this.spacing-2*wrist ),//"v22", + new THREE.Vector3(0.0 , this.spacing+wrist ,-this.spacing/2.0- 6*this.spacing-2*wrist ),//"e2", + new THREE.Vector3(0.0 , this.spacing+wrist ,-this.spacing/2.0- 7*this.spacing-2*wrist ),//"w3", + new THREE.Vector3(0.0 , this.spacing+wrist ,-this.spacing/2.0- 7*this.spacing-4*wrist ),//"v3", + new THREE.Vector3(0.0 , this.spacing+wrist ,-this.spacing/2.0- 8*this.spacing-5*wrist ),//"g2", + new THREE.Vector3(0.0 ,-this.spacing+wrist ,-this.spacing/2.0 - this.spacing -2*wrist ),//"e3", + new THREE.Vector3(0.0 ,-this.spacing+wrist ,-this.spacing/2.0 - this.spacing -2*wrist ),//"g3", + + + ]; + + this.billeParts=[ + new THREE.Group(), + new THREE.Group(), + new THREE.Group(), + new THREE.Group(), + new THREE.Group(), + new THREE.Group(), + new THREE.Group(), + new THREE.Group(), + new THREE.Group(), + new THREE.Group(), + new THREE.Group(), + new THREE.Group(), + new THREE.Group(), + new THREE.Group(), + new THREE.Group(), + ]; + this.partNames=[ + "g1", + "c1", + "w1", + "e1", + "v1", + "v11", + "w2", + "v2", + "v22", + "e2", + "w3", + "v3", + "g2", + "e3", + "g3", + + ]; + + + + + let objects = doc.objects(); + for (let i = 0; i < objects.count; i++) { + let mesh = objects.get(i).geometry(); + let layer=objects.get(i).attributes().layerIndex; + if(mesh instanceof rhino.Mesh) { + // convert all meshes in 3dm model into threejs objects + let threeMesh; + + if(objects.get(i).attributes().name=='grey'||objects.get(i).attributes().name=='grey1'||objects.get(i).attributes().name=='grey2'||objects.get(i).attributes().name=='pcb'){ + threeMesh = meshToThreejs(mesh, material1); + + }else if(objects.get(i).attributes().name=='motors'){ + threeMesh = meshToThreejs(mesh, material2); + }else if(objects.get(i).attributes().name=='controller'){ + threeMesh = meshToThreejs(mesh, material3); + }else if(objects.get(i).attributes().name=='connectors'){ + threeMesh = meshToThreejs(mesh, material4); + }else if(objects.get(i).attributes().name=='battery'){ + threeMesh = meshToThreejs(mesh, material5); + console.log(objects.get(i).attributes()) + }else{ + threeMesh = meshToThreejs(mesh, material); + } + // console.log(layer) + threeMesh.position.x+=billePos[layer-1].x; + threeMesh.position.y+=billePos[layer-1].y; + threeMesh.position.z+=billePos[layer-1].z; + this.billeParts[layer-1].add(threeMesh); + + } + } + + console.log("Loaded Parts!"); + this.partsInit(); + + + }); + +}; + +Bille.prototype.partsInit=function(){ + this.counter=0; + var stage1=new THREE.Vector3(1,1,1); + var stage2=new THREE.Vector3(1,2,2+0); + + this.createStage(stage1); + this.createStage(stage2); + this.currentPart=[]; + + this.partsPickupLocations=[ //3 accessories, 1 main + new THREE.Vector3(-0+stage2.x,stage2.y,1+stage2.z),//"g1", + new THREE.Vector3(-0+stage1.x,stage1.y,1+stage1.z),//"c1", + + new THREE.Vector3(-5+stage2.x,stage2.y,1+stage2.z),//"w1", + new THREE.Vector3(-5+stage1.x,stage1.y,1+stage1.z),//"e1", + + new THREE.Vector3(-6+stage1.x,stage1.y,1+stage1.z),//"v1", + + new THREE.Vector3(-7+stage1.x,stage1.y,1+stage1.z),//"v11", + new THREE.Vector3(-3+stage2.x,stage2.y,1+stage2.z),//"w2", + + new THREE.Vector3(-2+stage1.x,stage1.y,1+stage1.z),//"v2", + new THREE.Vector3(-3+stage1.x,stage1.y,1+stage1.z),//"v22", + + new THREE.Vector3(-1+stage1.x,stage1.y,1+stage1.z),//"e2", + new THREE.Vector3(-1+stage2.x,stage2.y,1+stage2.z),//"w3", + + new THREE.Vector3(-4+stage1.x,stage1.y,1+stage1.z),//"v3", + new THREE.Vector3(-4+stage2.x,stage2.y,1+stage2.z),//"g2", + + new THREE.Vector3(-8+stage1.x,stage1.y,1+stage1.z),//"e3", + new THREE.Vector3(-8+stage2.x,stage2.y,1+stage2.z),//"g3", + ]; + + + + for(var i=0;i<this.billeParts.length;i++){ + // this.partsPickupLocations.push(new THREE.Vector3(-i,1,1)); + this.placeParts(i); + } + + this.partsOrder=[ + "c1","g1",//0 + "e2","w3",//1 + "v2","",//2 + "v22","w2",//3 + + "v3","g2",//4 + "e1","w1",//5 + "v1","",//6 + "v11","",//7 + + "e3","g3", + + ]; + + + //pickup c1 + //accessorize with g1 + //place at location + + + + this.startMovementPickup(); + +}; + +Bille.prototype.startMovementPickup= function(){ + + var inputState=[new THREE.Vector3(1,0,0),new THREE.Vector3(2,0,0),2]; + + console.log(this.billeDirection) + this.robotState={ + leg1Pos:inputState[1].clone(), + leg2Pos:inputState[0].clone(), + up:new THREE.Vector3(0,0,1), + forward:new THREE.Vector3(1,0,0), //todo change to make it parametric from inputState + }; + + this.resetPath(); + + this.pickup(true); + + setTimeout(function(){ changeEnd(); }, this.path.timeout); + // if(this.leg==1){ + // setTimeout(function(){ changeEnd(); }, this.path.timeout); + + // } + + this.moveLeg(); + + + setTimeout(function(){ changeEnd(); }, this.path.timeout); + setTimeout(function(){ pickupPart(); }, this.path.timeout+=this.path.number/2.0*this.path.delay); + + this.moveLeg(); + + setTimeout(function(){ changeEnd(); }, this.path.timeout); + setTimeout(function(){ pickupPart(); }, this.path.timeout+=this.path.number/2.0*this.path.delay); + + this.moveLeg(); + + for(var i=0;i<this.path.number;i++){ + setTimeout(function(){ recursiveBille.beltAnimation();}, this.path.timeout+i*this.path.delay*2.0); + } + + if(this.counter!=0){ + setTimeout(function(){ changeEnd(); }, this.path.timeout); + } + + setTimeout(function(){ recursiveBille.startMovementDirections([0,4,0,0]); }, this.path.timeout); + setTimeout(function(){ recursiveBille.startMovementDropOff(); }, this.path.timeout+=(this.path.number+2)*this.path.delay*4*2); + + + +}; + +Bille.prototype.startMovementDropOff=function(){ + this.resetPath(); + + if(this.counter==0){ + this.createPickupDropOff0(this.bille.position.clone(),false); + this.createPickupDropOff0(this.bille.position.clone(),true); + + + }else if(this.counter==1){ + this.createPickupDropOff1(this.bille.position.clone(),false); + this.createPickupDropOff1(this.bille.position.clone(),true); + + }else if(this.counter==2){ + this.createPickupDropOff2(this.bille.position.clone(),false); + this.createPickupDropOff2(this.bille.position.clone(),true); + + }else if(this.counter==3){ + this.createPickupDropOff3(this.bille.position.clone(),false); + this.createPickupDropOff3(this.bille.position.clone(),true); + + }else if(this.counter==4){ + this.createPickupDropOff00(this.bille.position.clone(),false); + this.createPickupDropOff00(this.bille.position.clone(),true); + + + }else if(this.counter==5){ + this.createPickupDropOff11(this.bille.position.clone(),false); + this.createPickupDropOff11(this.bille.position.clone(),true); + + }else if(this.counter==6){ + this.createPickupDropOff22(this.bille.position.clone(),false); + this.createPickupDropOff22(this.bille.position.clone(),true); + + }else if(this.counter==7){ + this.createPickupDropOff33(this.bille.position.clone(),false); + this.createPickupDropOff33(this.bille.position.clone(),true); + + } + + setTimeout(function(){ changeEnd(); }, this.path.timeout); + this.moveLeg(); + setTimeout(function(){ recursiveBille.dropPart(); }, this.path.timeout+=this.path.number/2.0*this.path.delay); + setTimeout(function(){ changeEnd(); }, this.path.timeout); + this.moveLeg(); + + + + + if(this.counter!=7){ + + if(this.counter==0){ + this.path.delay=this.path.delay/4.0; + } + + setTimeout(function(){ recursiveBille.startMovementDirections([1,0,5,0]); }, this.path.timeout+=this.path.delay); + setTimeout(function(){ changeEnd();}, this.path.timeout+=(this.path.number+2)*this.path.delay*4*2); + + + + + setTimeout(function(){ recursiveBille.startMovementPickup(); }, this.path.timeout); + }else{ + this.path.delay=this.path.delay*4.0; + setTimeout(function(){ recursiveBille.startMovementDirections([1,0]); }, this.path.timeout+=this.path.delay); + // setTimeout(function(){ recursiveBille.startMovementDirections([0,0,1]); }, this.path.timeout+=this.path.delay); + setTimeout(function(){ recursiveBille.magic()}, this.path.timeout+(this.path.number+2)*this.path.delay*2*2); + + } + + + + this.counter++; + /////////////////////////////////////////////////////////////////////////////////////// + +}; + +Bille.prototype.pickup=function(both){ + //got in front of location + //create path + this.createPickupPath1(this.bille.position.clone(),false); + if(both){ + this.createPickupPath2(this.bille.position.clone(),false); + this.createPickupPathBack(this.bille.position.clone(),true); + + }else{ + this.createPickupPath1(this.bille.position.clone(),true); + } + + +} + +Bille.prototype.createPickupPath1= function(start,reverse){ + + var p1=start.clone(); + + var p2=p1.clone().add(new THREE.Vector3(0 ,-this.spacing ,this.spacing)); + var p3=p2.clone().add(new THREE.Vector3(0 ,-this.spacing ,0.0)); + var p4=p3.clone().add(new THREE.Vector3(-this.spacing ,this.spacing ,0)); + // var p5=p4.clone().add(new THREE.Vector3(0,0,0)); + + if(!reverse){ + //create bezier curve + this.path.curve= new THREE.CubicBezierCurve3 ( + p1, + p2, + p3, + p4 + ); + + }else{ + //create bezier curve + this.path.curve= new THREE.CubicBezierCurve3 ( + p4, + p3, + p2, + p1 + ); + } + + this.dividePickupPath(reverse); +}; + +Bille.prototype.createPickupPath2= function(start,reverse){ + + var p1=start.clone().add(new THREE.Vector3(-this.spacing,-this.spacing ,this.spacing)); + + var p2=p1.clone().add(new THREE.Vector3(0 ,0.0 ,this.spacing+0.9*this.spacing)); + var p3=p2.clone().add(new THREE.Vector3(0 ,this.spacing ,0.0)); + var p4=p3.clone().add(new THREE.Vector3(0 ,0 ,-0.8*this.spacing)); + // var p5=p4.clone().add(new THREE.Vector3(0,0,0)); + + if(!reverse){ + //create bezier curve + this.path.curve= new THREE.CubicBezierCurve3 ( + p1, + p2, + p3, + p4 + ); + + }else{ + //create bezier curve + this.path.curve= new THREE.CubicBezierCurve3 ( + p4, + p3, + p2, + p1 + ); + } + + this.dividePickupPath(reverse); +}; + +Bille.prototype.createPickupPathBack= function(start,reverse){ + + var p1=start.clone(); + + var p2=p1.clone().add(new THREE.Vector3(0 ,0.0 ,1.5*this.spacing)); + var p3=p2.clone().add(new THREE.Vector3( 0 ,0.0 ,1.5*this.spacing+0.1*this.spacing)); + var p4=p3.clone().add(new THREE.Vector3(-this.spacing ,0 ,-1.0*this.spacing)); + // var p5=p4.clone().add(new THREE.Vector3(0,0,0)); + + if(!reverse){ + //create bezier curve + this.path.curve= new THREE.CubicBezierCurve3 ( + p1, + p2, + p3, + p4 + ); + + }else{ + //create bezier curve + this.path.curve= new THREE.CubicBezierCurve3 ( + p4, + p3, + p2, + p1 + ); + } + + this.dividePickupPath(reverse); +}; + +Bille.prototype.createPickupPath11= function(start,reverse){ + + var p1=start.clone(); + + var p2=p1.clone().add(new THREE.Vector3(0 ,0 ,this.spacing)); + var p3=p2.clone().add(new THREE.Vector3(0 ,-this.spacing ,0.0)); + var p4=p3.clone().add(new THREE.Vector3(0 ,this.spacing ,0)); + // var p5=p4.clone().add(new THREE.Vector3(0,0,0)); + + if(!reverse){ + //create bezier curve + this.path.curve= new THREE.CubicBezierCurve3 ( + p1, + p2, + p3, + p4 + ); + + }else{ + //create bezier curve + this.path.curve= new THREE.CubicBezierCurve3 ( + p4, + p3, + p2, + p1 + ); + } + + this.dividePickupPath(reverse); +}; + +Bille.prototype.createPickupPath22= function(start,reverse){ + + var p1=start.clone().add(new THREE.Vector3(0,0 ,this.spacing)); + + var p2=p1.clone().add(new THREE.Vector3(0 ,0.0 ,this.spacing+0.9*this.spacing)); + var p3=p2.clone().add(new THREE.Vector3(0 ,this.spacing ,0.0)); + var p4=p3.clone().add(new THREE.Vector3(0 ,0 ,-0.8*this.spacing)); + // var p5=p4.clone().add(new THREE.Vector3(0,0,0)); + + if(!reverse){ + //create bezier curve + this.path.curve= new THREE.CubicBezierCurve3 ( + p1, + p2, + p3, + p4 + ); + + }else{ + //create bezier curve + this.path.curve= new THREE.CubicBezierCurve3 ( + p4, + p3, + p2, + p1 + ); + } + + this.dividePickupPath(reverse); +}; + +Bille.prototype.createPickupPathBack1= function(start,reverse){ + + var p1=start.clone(); + + var p2=p1.clone().add(new THREE.Vector3(0 ,-this.spacing ,1.5*this.spacing)); + var p3=p2.clone().add(new THREE.Vector3( 0 , 0,1.5*this.spacing+0.1*this.spacing)); + var p4=p3.clone().add(new THREE.Vector3(0 ,this.spacing ,-1.0*this.spacing)); + // var p5=p4.clone().add(new THREE.Vector3(0,0,0)); + + if(!reverse){ + //create bezier curve + this.path.curve= new THREE.CubicBezierCurve3 ( + p1, + p2, + p3, + p4 + ); + + }else{ + //create bezier curve + this.path.curve= new THREE.CubicBezierCurve3 ( + p4, + p3, + p2, + p1 + ); + } + + this.dividePickupPath(reverse); +}; + +Bille.prototype.createPickupDropOff0= function(start,reverse){ //one above + + var p1=start.clone(); + + var p2=p1.clone().add(new THREE.Vector3(0 ,this.spacing,0)); + var p3=p2.clone().add(new THREE.Vector3(-this.spacing ,0 ,this.spacing)); + var p4=p3.clone().add(new THREE.Vector3(0 ,0 ,-this.spacing)); + // var p5=p4.clone().add(new THREE.Vector3(0,0,0)); + + if(!reverse){ + //create bezier curve + this.path.curve= new THREE.CubicBezierCurve3 ( + p1, + p2, + p3, + p4 + ); + + }else{ + //create bezier curve + this.path.curve= new THREE.CubicBezierCurve3 ( + p4, + p3, + p2, + p1 + ); + } + + this.dividePickupPath(reverse); +}; + +Bille.prototype.createPickupDropOff1= function(start,reverse){ //one above + + var p1=start.clone(); + + var p2=p1.clone().add(new THREE.Vector3(0 ,this.spacing,this.spacing)); + var p3=p2.clone().add(new THREE.Vector3(-this.spacing , 0 ,this.spacing)); + var p4=p3.clone().add(new THREE.Vector3(0 ,0 ,-this.spacing)); + // var p5=p4.clone().add(new THREE.Vector3(0,0,0)); + + if(!reverse){ + //create bezier curve + this.path.curve= new THREE.CubicBezierCurve3 ( + p1, + p2, + p3, + p4 + ); + + }else{ + //create bezier curve + this.path.curve= new THREE.CubicBezierCurve3 ( + p4, + p3, + p2, + p1 + ); + } + + this.dividePickupPath(reverse); +}; + +Bille.prototype.createPickupDropOff2= function(start,reverse){ //one above + + var p1=start.clone(); + + var p2=p1.clone().add(new THREE.Vector3(0 ,this.spacing ,1.5*this.spacing)); + var p3=p2.clone().add(new THREE.Vector3(-this.spacing , 0 ,1.5*this.spacing)); + var p4=p3.clone().add(new THREE.Vector3(0 ,0 ,-this.spacing)); + // var p5=p4.clone().add(new THREE.Vector3(0,0,0)); + + if(!reverse){ + //create bezier curve + this.path.curve= new THREE.CubicBezierCurve3 ( + p1, + p2, + p3, + p4 + ); + + }else{ + //create bezier curve + this.path.curve= new THREE.CubicBezierCurve3 ( + p4, + p3, + p2, + p1 + ); + } + + this.dividePickupPath(reverse); +}; + +Bille.prototype.createPickupDropOff3= function(start,reverse){ //one above + + var p1=start.clone(); + + var p2=p1.clone().add(new THREE.Vector3(0 ,this.spacing ,2*this.spacing)); + var p3=p2.clone().add(new THREE.Vector3(-this.spacing , 0 ,1.5*this.spacing)); + var p4=p3.clone().add(new THREE.Vector3(0 ,0 ,-0.5*this.spacing)); + // var p5=p4.clone().add(new THREE.Vector3(0,0,0)); + + if(!reverse){ + //create bezier curve + this.path.curve= new THREE.CubicBezierCurve3 ( + p1, + p2, + p3, + p4 + ); + + }else{ + //create bezier curve + this.path.curve= new THREE.CubicBezierCurve3 ( + p4, + p3, + p2, + p1 + ); + } + + this.dividePickupPath(reverse); +}; + +Bille.prototype.createPickupDropOff00= function(start,reverse){ //one above + + var p1=start.clone(); + + var p2=p1.clone().add(new THREE.Vector3(0 ,0,0)); + var p3=p2.clone().add(new THREE.Vector3(-this.spacing ,0 ,this.spacing)); + var p4=p3.clone().add(new THREE.Vector3(0 ,0 ,-this.spacing)); + // var p5=p4.clone().add(new THREE.Vector3(0,0,0)); + + if(!reverse){ + //create bezier curve + this.path.curve= new THREE.CubicBezierCurve3 ( + p1, + p2, + p3, + p4 + ); + + }else{ + //create bezier curve + this.path.curve= new THREE.CubicBezierCurve3 ( + p4, + p3, + p2, + p1 + ); + } + + this.dividePickupPath(reverse); +}; + +Bille.prototype.createPickupDropOff11= function(start,reverse){ //one above + + var p1=start.clone(); + + var p2=p1.clone().add(new THREE.Vector3(0 ,0,this.spacing)); + var p3=p2.clone().add(new THREE.Vector3(-this.spacing , 0 ,this.spacing)); + var p4=p3.clone().add(new THREE.Vector3(0 ,0 ,-this.spacing)); + // var p5=p4.clone().add(new THREE.Vector3(0,0,0)); + + if(!reverse){ + //create bezier curve + this.path.curve= new THREE.CubicBezierCurve3 ( + p1, + p2, + p3, + p4 + ); + + }else{ + //create bezier curve + this.path.curve= new THREE.CubicBezierCurve3 ( + p4, + p3, + p2, + p1 + ); + } + + this.dividePickupPath(reverse); +}; + +Bille.prototype.createPickupDropOff22= function(start,reverse){ //one above + + var p1=start.clone(); + + var p2=p1.clone().add(new THREE.Vector3(0 ,0 ,1.5*this.spacing)); + var p3=p2.clone().add(new THREE.Vector3(-this.spacing , 0 ,1.5*this.spacing)); + var p4=p3.clone().add(new THREE.Vector3(0 ,0 ,-this.spacing)); + // var p5=p4.clone().add(new THREE.Vector3(0,0,0)); + + if(!reverse){ + //create bezier curve + this.path.curve= new THREE.CubicBezierCurve3 ( + p1, + p2, + p3, + p4 + ); + + }else{ + //create bezier curve + this.path.curve= new THREE.CubicBezierCurve3 ( + p4, + p3, + p2, + p1 + ); + } + + this.dividePickupPath(reverse); +}; + +Bille.prototype.createPickupDropOff33= function(start,reverse){ //one above + + var p1=start.clone(); + + var p2=p1.clone().add(new THREE.Vector3(0 ,0 ,2*this.spacing)); + var p3=p2.clone().add(new THREE.Vector3(-this.spacing , 0 ,1.5*this.spacing)); + var p4=p3.clone().add(new THREE.Vector3(0 ,0 ,-0.5*this.spacing)); + // var p5=p4.clone().add(new THREE.Vector3(0,0,0)); + + if(!reverse){ + //create bezier curve + this.path.curve= new THREE.CubicBezierCurve3 ( + p1, + p2, + p3, + p4 + ); + + }else{ + //create bezier curve + this.path.curve= new THREE.CubicBezierCurve3 ( + p4, + p3, + p2, + p1 + ); + } + + this.dividePickupPath(reverse); +}; + +Bille.prototype.dividePickupPath= function(reverse){ + + //points + var tempPoints=this.path.curve.getSpacedPoints(this.path.number); + + for (var i=0;i<=this.path.number;i++) + { + this.path.normals.push(0); + this.path.normalAdjustments.push(0); + this.path.points.push(tempPoints[i].clone()); + this.path.rotations.push(0); + this.path.j0.push(0); + + if(this.path.showPath) + { + var material = new THREE.MeshLambertMaterial({ color:0xff7171,}); + var geometry = new THREE.SphereGeometry(0.05, 0.05, 0.05); + var mesh = new THREE.Mesh(geometry, material); + mesh.position.x=tempPoints[i].x; + mesh.position.y=tempPoints[i].y; + mesh.position.z=tempPoints[i].z; + this.swarm.scene.add(mesh); + } + } + +}; + +Bille.prototype.pickupPart=function(){ + + if(this.partsOrder[0]!=""){ + this.currentPart.push(this.partsOrder[0]); + var part=this.swarm.scene.getObjectByName( this.partsOrder[0]); + + part.position.x=0; + part.position.y=2*this.spacing; + part.position.z=this.spacing+0.5*this.spacing; + + + this.bille.children[0].children[0].add(part); + + } + + this.partsOrder.shift(); + + +} + +Bille.prototype.pickupPart1=function(){ + + if(this.partsOrder[0]!=""){ + this.currentPart.push(this.partsOrder[0]); + var part=this.swarm.scene.getObjectByName( this.partsOrder[0]); + + part.position.x=0; + part.position.y=1*this.spacing; + part.position.z=this.spacing+0.5*this.spacing; + + + this.bille.children[0].add(part); + + } + + this.partsOrder.shift(); + + +} + +Bille.prototype.dropPart=function(){ + + for(var i=0;i<this.currentPart.length;i++){ + var part=this.swarm.scene.getObjectByName(this.currentPart[i]); + + this.bille.children[0].children[0].remove(part); + + part.position.x=0; + part.position.y=0; + part.position.z=0; + + part.rotation.z=Math.PI/2.0; + + part.position.x=this.bille.position.x-2*this.spacing; + part.position.y=this.bille.position.y+0.2*this.spacing; + part.position.z=this.bille.position.z+this.spacing+0.5*this.spacing; + + // part.rotation.x=this.bille.rotation.x; + // part.rotation.y=this.bille.rotation.y; + // part.rotation.z=this.bille.rotation.z; + + // console.log(part.position); + // console.log(this.bille.position); + this.swarm.scene.add(part) + + } + + this.currentPart=[]; + + +} + +Bille.prototype.createStage=function(pos){ + var material = new THREE.MeshLambertMaterial({ color:new THREE.Color(0.1,0.1,0.1)}); + material.transparent=false; + material.opacity=0.7; + var geometry = new THREE.BoxGeometry(10*this.spacing, this.spacing, 0.4); + var mesh = new THREE.Mesh(geometry, material); + mesh.position.x=pos.x*this.spacing-5*this.spacing+0.5*this.spacing; + mesh.position.y=pos.y*this.spacing; + mesh.position.z=pos.z*this.spacing-0.2; + this.swarm.scene.add(mesh); + +} + +Bille.prototype.placeParts=function(num){ + + // this.swarm.buildSingleVoxelAt(new THREE.Vector3( + // this.partsPickupLocations[num].x*this.spacing, + // this.partsPickupLocations[num].y*this.spacing, + // this.partsPickupLocations[num].z*this.spacing + // )); + + // this.swarm.grid[this.partsPickupLocations[num].x][this.partsPickupLocations[num].y][this.partsPickupLocations[num].z]=true; + // this.swarm.grid[this.partsPickupLocations[num].x][this.partsPickupLocations[num].y][this.partsPickupLocations[num].z+1]=true; + + this.billeParts[num].position.x=(this.partsPickupLocations[num].x)*this.spacing; + this.billeParts[num].position.y=(this.partsPickupLocations[num].y)*this.spacing; + this.billeParts[num].position.z=(this.partsPickupLocations[num].z)*this.spacing+0.5*this.spacing; + this.billeParts[num].name=this.partNames[num]; + this.swarm.scene.add(this.billeParts[num]); + +} + +Bille.prototype.beltAnimation=function(){ + // console.log(list); + var list=this.partsOrder; + + for(var i=0;i<list.length;i++){ + if( list[i]!=""){ + var part=this.swarm.scene.getObjectByName( list[i]); + part.position.x+=this.spacing/this.path.number; + } + + } + +} + +Bille.prototype.magic=function(){ + + for(var i=0;i<this.billeParts.length;i++){ + this.billeParts[i].visible=false; + } + var part=this.swarm.scene.getObjectByName( 'e3'); + part.visible=true; + var part=this.swarm.scene.getObjectByName( 'g3'); + part.visible=true; + this.swarm.scene.add(this.bille.clone()) + + inputState=[new THREE.Vector3(1.5,2,0),new THREE.Vector3(1.5,3,0),2]; + + this.billePosition=inputState[0].clone().multiplyScalar(this.voxelSpacing); + this.bille.position.x=this.billePosition.x; + this.bille.position.y=this.billePosition.y; + this.bille.position.z=this.billePosition.z; + + this.bille.children[0].remove(this.bille.children[0].children[this.bille.children[0].children.length-1]); + + + + + this.billeTarget={ + x:inputState[1].x*this.voxelSpacing, + y:inputState[1].y*this.voxelSpacing-0.81*this.spacing, + z:inputState[1].z*this.voxelSpacing, + rx:0, + ry:0, + rz:0, + targetEnd:"end 1" + }; + this.robotState={ + leg1Pos:inputState[1].clone(), + leg2Pos:inputState[0].clone(), + up:new THREE.Vector3(0,0,1), + forward:new THREE.Vector3(1,0,0), //todo change to make it parametric from inputState + }; + this.targetBille.position.x = this.billeTarget.x; + this.targetBille.position.y = this.billeTarget.y; + this.targetBille.position.z = this.billeTarget.z; + + this.updateAngles(); + + setTimeout(function(){ recursiveBille.startMovementDirections([5,0,0,4,1]); }, this.path.timeout+=2*this.path.delay); + + setTimeout(function(){ changeEnd();}, this.path.timeout+=(this.path.number+2)*this.path.delay*5*2); + + setTimeout(function(){ recursiveBille.finalPickup()}, this.path.timeout+=this.path.delay*2); + + +} + +Bille.prototype.finalPickup=function(){ + + var inputState=[new THREE.Vector3(1,0,0),new THREE.Vector3(2,0,0),2]; + + console.log(this.billeDirection) + this.robotState={ + leg1Pos:inputState[1].clone(), + leg2Pos:inputState[0].clone(), + up:new THREE.Vector3(0,0,1), + forward:new THREE.Vector3(1,0,0), //todo change to make it parametric from inputState + }; + + + this.resetPath(); + + this.createPickupPath11(this.bille.position.clone(),false); + this.createPickupPath22(this.bille.position.clone(),false); + this.createPickupPathBack1(this.bille.position.clone(),true); + + + + setTimeout(function(){ changeEnd(); }, this.path.timeout); + + this.moveLeg(); + + + setTimeout(function(){ changeEnd(); }, this.path.timeout); + setTimeout(function(){ recursiveBille.pickupPart1(); }, this.path.timeout+=this.path.number/2.0*this.path.delay); + + this.moveLeg(); + + setTimeout(function(){ changeEnd(); }, this.path.timeout); + setTimeout(function(){ recursiveBille.pickupPart1(); }, this.path.timeout+=this.path.number/2.0*this.path.delay); + + this.moveLeg(); +} + diff --git a/recursive_swarm/js/swarm_bille_step.js b/recursive_swarm/js/swarm_bille_step.js new file mode 100644 index 0000000000000000000000000000000000000000..c4ae6c351bb53403952f750fbf6be69003f21bb0 --- /dev/null +++ b/recursive_swarm/js/swarm_bille_step.js @@ -0,0 +1,565 @@ +// Amira Abdel-Rahman +// (c) Massachusetts Institute of Technology 2020 + +Bille.prototype.generatePath= function(stepsDirection){ + this.goHome=false; + this.stepsDirection=stepsDirection; + this.resetPath(); + this.getStepsFromDirections(); + this.generatePoints(); +}; + +Bille.prototype.startMovementDirections= function(stepsDirection){ + this.stepsDirection=stepsDirection; + this.resetPath(); + this.startMovement(); + //if generated path + if(this.steps.length>0){ + for(var i=0;i<this.steps.length;i++){ + this.step(i); + } + } +}; + +///////////////////high level steps/////////////////////// +Bille.prototype.getStepsFromDirections= function(){ + // var leg1Pos=new THREE.Vector3(1,0,0); + // var leg2Pos=new THREE.Vector3(0,0,0); + // var up=new THREE.Vector3(0,0,1); + // var forward=new THREE.Vector3(1,0,0); + + for(var i=0;i<this.stepsDirection.length;i++){ + + switch(this.stepsDirection[i]){ + + case 0: + + this.robotState.leg2Pos=this.robotState.leg1Pos.clone(); + this.robotState.leg1Pos.add(this.robotState.forward); + this.steps.push([this.robotState.leg1Pos.clone().multiplyScalar(this.voxelSpacing),this.robotState.leg2Pos.clone().multiplyScalar(this.voxelSpacing),this.robotState.up]); + break; + case 1: + this.robotState.forward=new THREE.Vector3(0,0,0).sub(this.robotState.forward); + // var temp=leg2Pos.clone(); + // leg2Pos=leg1Pos.clone(); + this.robotState.leg1Pos=this.robotState.leg2Pos.clone().add(this.robotState.forward); + this.steps.push([this.robotState.leg1Pos.clone().multiplyScalar(this.voxelSpacing),this.robotState.leg2Pos.clone().multiplyScalar(this.voxelSpacing),this.robotState.up]); + break; + case 2: + this.robotState.leg2Pos=this.robotState.leg1Pos.clone(); + this.robotState.leg1Pos.add(this.robotState.forward.clone().add(this.robotState.up)); + this.steps.push([this.robotState.leg1Pos.clone().multiplyScalar(this.voxelSpacing),this.robotState.leg2Pos.clone().multiplyScalar(this.voxelSpacing),this.robotState.up]); + break; + case 3: + this.robotState.leg2Pos=this.robotState.leg1Pos.clone(); + this.robotState.leg1Pos.add(this.robotState.forward.clone().sub(this.robotState.up)); + this.steps.push([this.robotState.leg1Pos.clone().multiplyScalar(this.voxelSpacing),this.robotState.leg2Pos.clone().multiplyScalar(this.voxelSpacing),this.robotState.up]); + break; + case 4: + this.robotState.leg2Pos=this.robotState.leg1Pos.clone(); + if(this.robotState.forward.x==1) { + this.robotState.forward.y=1; + this.robotState.forward.x=0; + }else if(this.robotState.forward.x==-1) { + this.robotState.forward.y=-1; + this.robotState.forward.x=0; + }else if(this.robotState.forward.y==1) { + this.robotState.forward.x=-1; + this.robotState.forward.y=0; + }else if(this.robotState.forward.y==-1) { + this.robotState.forward.x=1; + this.robotState.forward.y=0; + } + this.robotState.leg1Pos=this.robotState.leg2Pos.clone().add(this.robotState.forward); + this.steps.push([this.robotState.leg1Pos.clone().multiplyScalar(this.voxelSpacing),this.robotState.leg2Pos.clone().multiplyScalar(this.voxelSpacing),this.robotState.up]); + break; + case 5: + this.robotState.leg2Pos=this.robotState.leg1Pos.clone(); + + if(this.robotState.forward.x==1) { + this.robotState.forward.y=-1; + this.robotState.forward.x=0; + }else if(this.robotState.forward.x==-1) { + this.robotState.forward.y=1; + this.robotState.forward.x=0; + }else if(this.robotState.forward.y==1) { + this.robotState.forward.x=1; + this.robotState.forward.y=0; + }else if(this.robotState.forward.y==-1) { + this.robotState.forward.x=-1; + this.robotState.forward.y=0; + } + + this.robotState.leg1Pos=this.robotState.leg2Pos.clone().add(this.robotState.forward); + this.steps.push([this.robotState.leg1Pos.clone().multiplyScalar(this.voxelSpacing),this.robotState.leg2Pos.clone().multiplyScalar(this.voxelSpacing),this.robotState.up]); + break; + + } + + } + this.stepsDirection=[]; + +}; + +Bille.prototype.generatePoints= function(){ + for (var i=0; i<this.steps.length ; i++) + { + var s=this.billeStep(this.steps[i][0],this.steps[i][1],this.steps[i][2]); + this.path.changeLegs.push(s[0]); + this.path.changeRotation.push(s[1]); + } +}; + +Bille.prototype.billeStep= function(stepLeg1,stepLeg2,legsNormal){ + + var changeLegBefore=false; + var leg1Pos=new THREE.Vector3(0,0,0); + var leg2Pos=new THREE.Vector3(0,0,0); + + var pos1=new THREE.Vector3(0,0,0); + var pos2=new THREE.Vector3(0,0,0); + + if(this.path.points.length==0) + { + // pos1.copy(this.target.position); + // pos2.copy(this.THREE1.position); + // console.log(this.targetBille) + pos1.copy(this.targetBille.position); + pos2.copy(this.bille.position); + }else{ + pos1.copy(this.path.points[this.path.points.length-1-1-this.path.number]); + pos2.copy(this.path.points[this.path.points.length-1]); + + } + + //check starting leg based on distance to target + if(pos2.distanceTo(stepLeg1)<pos1.distanceTo(stepLeg1)) + { + changeLegBefore=true; + this.flipped=!this.flipped; + var temp=new THREE.Vector3(0,0,0); + temp.copy(pos1); + pos1.copy(pos2); + pos2.copy(temp); + } + + leg1Pos.copy(pos1); + leg2Pos.copy(pos2); + + // var robotUp=this.billeDirection.clone(); + var robotUp=this.billeDirection.clone(); + var robotLocation=this.billePosition.clone(); + + // console.log(tempV); + var znormal=0; + + var tempV=pos2.clone().sub(pos1); + var tempV1=stepLeg2.clone().sub(stepLeg1); + var tempV2=tempV.clone().sub(tempV1); + // console.log(tempV2); + + if(tempV2.x!=0&&tempV2.y!=0){ + if(tempV2.x<0&&tempV2.y<0 ){ + znormal=-90; + }else if(tempV2.x>0&&tempV2.y>0){ + znormal=90; + }else if(tempV2.x<0&&tempV2.y>0){ + znormal=-90; + }else if(tempV2.x>0&&tempV2.y<0){ + znormal=90; + } + } + // console.log(changeLegBefore) + if(this.flipped){ + znormal=-znormal; + // console.log(znormal) + // console.log(stepLeg1) + // console.log(stepLeg2) + // console.log(legsNormal) + } + + + // if(tempV.x!=0&&tempV.y!=0){ + // if(tempV.x<0&&tempV.y<0 ){ + // znormal=-90; + // }else if(tempV.x>0&&tempV.y>0){ + // znormal=-90; + // }else if(tempV.x<0&&tempV.y>0){ + // znormal=90; + // }else if(tempV.x>0&&tempV.y<0){ + // znormal=90; + // } + // } + + + this.createPath(leg1Pos,stepLeg1,this.billeDirection,legsNormal,znormal,robotUp,robotLocation); + + robotUp=legsNormal; + robotLocation=stepLeg1; + this.createPath(leg2Pos,stepLeg2,this.billeDirection,legsNormal,znormal,robotUp,robotLocation); + + //update previous locations/pos + this.billeDirection = legsNormal.clone(); + this.billePosition=stepLeg2.clone(); + + return [changeLegBefore,legsNormal]; +}; + +/////////////////PATH/////////////////////////// +//todo change to path class +Bille.prototype.resetPath= function(){ + ////////////////////// + this.steps=[]; + this.path.curve=null; + this.path.points=[]; + this.path.normals=[]; + this.path.changeRotation=[]; + this.path.normalAdjustments=[]; + this.path.currentPoint=0; + this.path.timeout=0; + this.path.j0=[]; + this.path.rotations=[]; + this.path.changeLegs=[] + // this.flipped=false; +}; + +Bille.prototype.createPath= function(start,end,snormal,enormal,znormal,robotUp,robotLocation){ + + var p1=start.clone(); + // p1.add(snormal.clone().multiplyScalar(1)); //add if you want to change voxel Location + var p2=new THREE.Vector3(0,0,0); + var p3=new THREE.Vector3(0,0,0); + var p4=end.clone(); + // p4.add(enormal.clone().multiplyScalar(1)); //add if you want to change voxel Location + + var nor = snormal.clone(); + nor.add(enormal); + nor.normalize(); + + + var dir=end.clone().sub(start); + + var temp1=new THREE.Vector3(0,0,0); + var temp2=new THREE.Vector3(0,0,0); + nor.multiplyScalar(this.path.cHeight); + + + temp1.addVectors(start,dir.multiplyScalar(1/3)); + temp2.addVectors(start,dir.multiplyScalar(2)); + + + p2.addVectors(nor,temp1); + p3.addVectors(nor,temp2); + + //create bezier curve + this.path.curve= new THREE.CubicBezierCurve3 ( + p1, + p2, + p3, + p4 + ); + + this.dividePath(snormal.clone(),enormal.clone(),znormal,robotUp,robotLocation); +}; + +Bille.prototype.dividePath= function(snormal,enormal,znormal,robotUp,robotLocation){ + + // console.log(this.robotState.forward) + // console.log(snormal) + // console.log(enormal) + + //points + var d=1/this.path.number; + var tempPoints=this.path.curve.getSpacedPoints(this.path.number); + // console.log(tempPoints) + + var forward=new THREE.Vector3(0,0,0); + var tempV=tempPoints[0].clone().sub(robotLocation); + + + + if(tempV.x!=0 && robotUp.x==0) + { + forward.x=tempV.x; + }else if(tempV.y!=0 && robotUp.y==0) + { + forward.y=tempV.y; + }else if(tempV.z!=0 && robotUp.z==0) + { + forward.z=tempV.z; + } + forward.normalize(); + + + var p1=tempPoints[0]; + var p2=tempPoints[this.path.number]; + var diff=p2.clone().sub(p1); + diff.multiply(snormal); + + //normals + var vnormal1=180; + var vnormal2=180; + if(!snormal.equals(enormal)) + { + + if(diff.x>0||diff.y>0||diff.z>0) + { + if(robotUp.equals(snormal)) + { + vnormal1=180; + vnormal2=90; + + }else + { + vnormal2=180; + vnormal1=90; + + } + + }else if(diff.x<0||diff.y<0||diff.z<0) + { + if(robotUp.equals(snormal)) + { + vnormal1=180; + vnormal2=180+90; + + }else + { + vnormal2=180; + vnormal1=180+90; + + } + } + } + var dn=(vnormal2-vnormal1)/(this.path.number+1); + + + + for (var i=0;i<=this.path.number;i++) + { + this.path.normals.push(vnormal1+i*dn); + this.path.normalAdjustments.push(this.getNormalAdjustment(vnormal1+i*dn,robotUp,forward)); + this.path.points.push(tempPoints[i].clone()); + this.path.rotations.push((i % (this.path.number+1))/(this.path.number+1)*znormal); + this.path.j0.push(0); + + if(this.path.showPath) + { + var material = new THREE.MeshLambertMaterial({ color:0xff7171,}); + var geometry = new THREE.SphereGeometry(0.05, 0.05, 0.05); + var mesh = new THREE.Mesh(geometry, material); + mesh.position.x=tempPoints[i].x; + mesh.position.y=tempPoints[i].y; + mesh.position.z=tempPoints[i].z; + this.swarm.scene.add(mesh); + } + } + +}; + + +///////////////step/////////////////// +Bille.prototype.step= function(i){ + this.totalNumberofSteps++; + + if(this.path.changeLegs[i]) + { + setTimeout(function(){ changeEnd(); }, this.path.timeout); + } + + this.moveLeg();//leg1 + + //rotate bill-e + if(i>0 && !this.path.changeRotation[i].equals(this.path.changeRotation[i-1])) + { + + setTimeout(function(){ rotateRobot(); + }, this.path.timeout); + } + + this.moveLeg();//leg2 + +} + +Bille.prototype.moveLeg= function(){ + var ps= this.path.points.slice(); + + for(var i=0;i<=this.path.number;i++) + { + setTimeout(function(){ move(); }, this.path.timeout+=this.path.delay); + } + setTimeout(function(){ changeEnd(); }, this.path.timeout); + +} + +Bille.prototype.move= function(){ + + this.billeTarget.x=this.path.points[this.path.currentPoint].x; + this.billeTarget.y=this.path.points[this.path.currentPoint].y; + this.billeTarget.z=this.path.points[this.path.currentPoint].z; + this.voxelNormal=this.path.normals[this.path.currentPoint]; + this.normalAdjustmentVector=this.path.normalAdjustments[this.path.currentPoint]; + if(this.swarm.CubicBezierCurve3saveAngleData){ + // this.dataAngles.push([this.path.currentPoint,this.path.points[this.path.currentPoint].x,this.path.points[this.path.currentPoint].y,this.path.points[this.path.currentPoint].z]); + this.updateAngles(); + + }else{ + this.updateAngles(); + } + + this.controlBille.position.x = this.billeTarget.x; + this.controlBille.position.y = this.billeTarget.y; + this.controlBille.position.z = this.billeTarget.z; + + this.targetBille.position.x = this.billeTarget.x; + this.targetBille.position.y = this.billeTarget.y; + this.targetBille.position.z = this.billeTarget.z; + + this.path.currentPoint++; + + if(this.path.currentPoint==this.path.points.length){ + // if(this.goHome){ + + // this.buildVoxelAt(this.robotState.leg1Pos.clone().multiplyScalar(this.voxelSpacing)); + // //go Home + // this.startMovement(true); + + // }else{ + // //go to new Voxel + // this.startMovement(false); + // } + } + +} + +Bille.prototype.changeEnd= function(){ + //TODO: send fix end and unfix end to code + if(this.leg==2) + { + //later output package + // console.log("unfix leg 1, fix leg 2"); + this.leg=1; + this.billeTarget.targetEnd="end 1"; + // if( this.carriedVoxel[0].visible||this.carriedVoxel[1].visible){ + // this.carriedVoxel[1].visible=true; + // this.carriedVoxel[0].visible=false; + + // } + + }else + { + //later output package + // console.log("unfix leg 2, fix leg 1"); + this.leg=2; + this.billeTarget.targetEnd="end 2"; + // if(this.carriedVoxel[0].visible||this.carriedVoxel[1].visible){ + // this.carriedVoxel[0].visible=true; + // this.carriedVoxel[1].visible=false; + // } + } + + var tempPosition=new THREE.Vector3(this.billeTarget.x, + this.billeTarget.y, + this.billeTarget.z); + var tempPosition1=new THREE.Vector3(this.bille.position.x, + this.bille.position.y, + this.bille.position.z); + this.billeTarget.x=tempPosition1.x; + this.billeTarget.y=tempPosition1.y; + this.billeTarget.z=tempPosition1.z; + + this.bille.position.x=tempPosition.x; + this.bille.position.y=tempPosition.y; + this.bille.position.z=tempPosition.z; + + this.targetBille.position.x = this.billeTarget.x; + this.targetBille.position.y = this.billeTarget.y; + this.targetBille.position.z = this.billeTarget.z; + this.controlBille.position.x = this.billeTarget.x; + this.controlBille.position.y = this.billeTarget.y; + this.controlBille.position.z = this.billeTarget.z; + + this.bille.position.rz=this.swarm.scene.getObjectByName( "Group:"+0 ).rotation.z; + + if(this.saveAngleData){ + this.updateAngles(); + this.dataAngles.push(["Lock end",this.leg]); + + + }else{ + this.updateAngles(); + } + + +} + +Bille.prototype.rotateRobot= function(dir){ + console.log("rotate") + + + if(dir===undefined){ + + + + var temp=parseInt((this.path.currentPoint-this.path.number)/this.path.number/2); + if(temp>=this.path.changeRotation.length){ + temp=this.path.changeRotation.length-1; + } + dir=this.path.changeRotation[temp]; + + + + console.log("try to fix errrrooorrr") + + }else{ + var newRotation=this.getRotation(dir).clone(); + this.bille.rotation.x=newRotation.x; + this.bille.rotation.y=newRotation.y; + this.bille.rotation.z=newRotation.z; + + this.voxelNormal=this.path.normals[this.path.currentPoint+1]; + this.normalAdjustmentVector=this.path.normalAdjustments[this.path.currentPoint+1]; + // if(this.saveAngleData){ + // this.updateAngles(true); + + // }else{ + this.updateAngles(); + // } + + } + + + + + +} + +Bille.prototype.getRotation= function(dir){ + var tempRot=new THREE.Vector3(); + if(dir.equals(new THREE.Vector3(0,0,1)) ) + { + tempRot=new THREE.Vector3(0,0,0); + } + else if (dir.equals( new THREE.Vector3(0,0,-1))) + { + tempRot=new THREE.Vector3(180*this.DEG_TO_RAD,0,0); + } + else if (dir.equals( new THREE.Vector3(0,-1,0))) + { + tempRot=new THREE.Vector3(90*this.DEG_TO_RAD,0,0); + } + else if (dir.equals( new THREE.Vector3(0,1,0))) + { + tempRot=new THREE.Vector3(-90*this.DEG_TO_RAD,0,0); + } + else if (dir.equals(new THREE.Vector3(-1,0,0))) + { + tempRot=new THREE.Vector3(0,-90*this.DEG_TO_RAD,0); + } + else if (dir.equals( new THREE.Vector3(1,0,0))) + { + tempRot=new THREE.Vector3(0,90*this.DEG_TO_RAD,0); + } + return tempRot; +} + diff --git a/recursive_swarm/js/swarm_build.js b/recursive_swarm/js/swarm_build.js new file mode 100644 index 0000000000000000000000000000000000000000..a135479bcf2a61fc2d89beeab355b63e7efecff7 --- /dev/null +++ b/recursive_swarm/js/swarm_build.js @@ -0,0 +1,162 @@ +// Amira Abdel-Rahman +// (c) Massachusetts Institute of Technology 2020 + +function createBuildList(json,scale,shift){ //layer first + ///layer first + + var buildList={ + currentZIndex:0, + maxZIndex:json.length, + listZ:[], + done:false, + availablePickup:[], + listToBuild:[] + + }; + // todo multiply by 4 as smallest size in cubeCone is 0.25 + // y is z and z is y + // shift z by 1 cause sacrificial layer is 0 + // shift x and y to not have negative values + + for(var i=0;i<json.length;i++){ //for each z layer bin + buildList.listZ.push({ + layerZ:json[i][0][0][0].origin[1]*scale+1, + done:false, + currentSizeIndex:0, + maxSizeIndex:json[i].length, + listSize:[] + }); + for(var j=0;j<json[i].length;j++){ //for each size bin + buildList.listZ[i].listSize.push({ + size:json[i][j][0][0].widths[0]*scale, + layerZ:buildList.listZ[i].layerZ, + done:false, + currentSDFIndex:0, + maxSDFIndex:json[i][j].length, + listSDF:[] + + }); + for(var k=0;k<json[i][j].length;k++){ //for each sdf bin (signed distance field) + buildList.listZ[i].listSize[j].listSDF.push({ + sdfRank:k, + layerZ:buildList.listZ[i].layerZ, + size:buildList.listZ[i].listSize[j].size, + done:false, + currentCubeIndex:0, + maxCubeIndex:json[i][j][k].length, + listCubes:[] + + + }); + + for(var l=0;l<json[i][j][k].length;l++){ //for each cube add location (todo check if int) + var stockBuilt=false; + if(buildList.listZ[i].listSize[j].size==1){ + stockBuilt=true; + } + buildList.listZ[i].listSize[j].listSDF[k].listCubes.push({ + layerZ:buildList.listZ[i].layerZ, + size:buildList.listZ[i].listSize[j].size, + sdfRank:buildList.listZ[i].listSize[j].listSDF[k].sdfRank, + done:false, + stockBuilt:stockBuilt, + stockAssigned:false, + stockPickedUp:false, + position:new THREE.Vector3( + json[i][j][k][l].origin[0]*scale+shift, + json[i][j][k][l].origin[2]*scale+shift, + json[i][j][k][l].origin[1]*scale+1) + }); + + } + } + } + } + + console.log(buildList) + + return buildList; + + +}; + +function createBuildListSize (json,scale,shift){ //size first + + //size first + + var buildList={ + currentSizeIndex:0, + maxSizeIndex:json.length, + done:false, + availablePickup:[], + listSize:[], + listToBuild:[] + + }; + + // todo multiply by 4 as smallest size in cubeCone is 0.25 + // y is z and z is y + // shift z by 1 cause sacrificial layer is 0 + // shift x and y to not have negative values + + for(var i=0;i<json.length;i++){ //for each z layer bin + buildList.listSize.push({ + size:json[i][0][0][0].widths[0]*scale, + done:false, + currentZIndex:0, + maxZIndex:json[i].length, + listZ:[], + }); + for(var j=0;j<json[i].length;j++){ //for each size bin + buildList.listSize[i].listZ.push({ + + size:buildList.listSize[i].size, + layerZ:json[i][j][0][0].origin[1]*scale+1, + + done:false, + currentSDFIndex:0, + maxSDFIndex:json[i][j].length, + listSDF:[] + + }); + for(var k=0;k<json[i][j].length;k++){ //for each sdf bin (signed distance field) + buildList.listSize[i].listZ[j].listSDF.push({ + sdfRank:k, + layerZ:buildList.listSize[i].listZ[j].layerZ, + size:buildList.listSize[i].size, + done:false, + currentCubeIndex:0, + maxCubeIndex:json[i][j][k].length, + listCubes:[] + + + }); + + for(var l=0;l<json[i][j][k].length;l++){ //for each cube add location (todo check if int) + var stockBuilt=false; + if(buildList.listSize[i].size==1){ + stockBuilt=true; + } + buildList.listSize[i].listZ[j].listSDF[k].listCubes.push({ + layerZ:buildList.listSize[i].listZ[j].layerZ, + size:buildList.listSize[i].size, + sdfRank:buildList.listSize[i].listZ[j].listSDF[k].sdfRank, + done:false, + stockBuilt:stockBuilt, + stockAssigned:false, + stockPickedUp:false, + position:new THREE.Vector3( + json[i][j][k][l].origin[0]*scale+shift, + json[i][j][k][l].origin[2]*scale+shift, + json[i][j][k][l].origin[1]*scale+1) + }); + } + } + } + } + + return buildList; + + + +}; \ No newline at end of file diff --git a/recursive_swarm/js/swarm_control.js b/recursive_swarm/js/swarm_control.js new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/recursive_swarm/js/swarm_geometry.js b/recursive_swarm/js/swarm_geometry.js new file mode 100644 index 0000000000000000000000000000000000000000..14d6907eec33ef9c040c4fd7c1b1c749d8efcc26 --- /dev/null +++ b/recursive_swarm/js/swarm_geometry.js @@ -0,0 +1,375 @@ +// Amira Abdel-Rahman +// (c) Massachusetts Institute of Technology 2020 + +///////////////////////////geometry/////////////////////////////// +Swarm.prototype.declareGlobals= function(){ + for( i=0;i<this.numberOfStartLocations;i++){ + this.startLocations.push(new THREE.Vector3(0,0,0) ); + this.depositLocations.push(new THREE.Vector3(0,0,0) ); + } + for( i=0;i<this.numberOfRobots;i++){ + this.guiControls.push(null); + + this.THREE1.push(new THREE.Vector3(0,0,0) ); + this.robotBones.push([]); + this.joints.push([]); + this.angles.push([0, 0, 0, 0, 0, 0]); + this.robotState.push({ + leg1Pos:new THREE.Vector3(1,0,0), + leg2Pos:new THREE.Vector3(0,0,0), + up:new THREE.Vector3(0,0,1), + forward:new THREE.Vector3(1,0,0), + Z:0, + rank:0 + }); + + // this.THREERobot.push(null); + this.VisualRobot.push(null); + this.THREESimulationRobot.push(null); + // this.geo.push(null); + this.defaultRobotState.push(null); + this.target.push(null); + this.control.push(null); + this.leg.push(1); + this.voxelNormal.push(180); + this.normalAdjustmentVector.push(new THREE.Vector3( 0, 0, 0)); + + this.THREE1dir.push(new THREE.Vector3(0,0,1) ); + this.THREE1Pos.push(new THREE.Vector3(0,0,0) ); + + //path + this.targetPositionMesh.push(new THREE.Vector3(1,0,0)); + this.carriedVoxel.push([]); + + this.goHome.push(true); + this.totalNumberofSteps.push(0); + + ////////////////////// + + this.steps.push([]); + this.path.push({ + curve: null, + currentPoint: 0, + points:[], + number:this.pathParams.number, + delay:1000/this.speed, + timeout:100, + cHeight:this.pathParams.cHeight*this.voxelSpacing[i], + showPath:this.pathParams.showPath, + normals:[], + changeLegs:[], + changeRotation:[], + normalAdjustments:[] + }); + + } +} + +//implemented based on https://github.com/glumb/robot-gui +Swarm.prototype.THREERobotCall= function(robotIndex){ + THREERobot= function (r,robotIndex,V_initial, limits, group) { + this.r=r; + r.THREE1[robotIndex] = new THREE.Group(); + + var colors = [ + 0xaaaaaa, + 0xbbbbbb, + 0xbcbcbc, + 0xcbcbcb, + 0xcccccc, + 0x0, + ]; + + let parentObject = r.THREE1[robotIndex]; + r.robotBones[robotIndex] = []; + r.joints[robotIndex] = []; + + function createCube(x, y, z, w, h, d, min, max, jointNumber) { + var thicken = 1*r.robotScale[robotIndex]; + // var thicken = 1; //for hierachy demo + + var w_thickened = Math.abs(w) + thicken; + var h_thickened = Math.abs(h) + thicken; + var d_thickened = Math.abs(d) + thicken; + + var material = new THREE.MeshLambertMaterial({ color: colors[jointNumber],}); + var geometry = new THREE.CubeGeometry(w_thickened, h_thickened, d_thickened); + var mesh = new THREE.Mesh(geometry, material); + + + + mesh.position.set(w / 2, h / 2, d / 2); + var group = new THREE.Object3D(); + group.position.set(x, y, z); + group.add(mesh); + + // min = min / 180 * Math.PI + // max = max / 180 * Math.PI + + var jointGeo1 = new THREE.CylinderGeometry (0.8*r.robotScale[robotIndex], 0.8*r.robotScale[robotIndex], 0.8 * 2*r.robotScale[robotIndex], 32, 32, false, -min, 2 * Math.PI - max + min) + var jointGeoMax = new THREE.CylinderGeometry(0.8*r.robotScale[robotIndex], 0.8*r.robotScale[robotIndex], 0.8 * 2*r.robotScale[robotIndex], 32, 32, false, -max, max) + var jointGeoMin = new THREE.CylinderGeometry(0.8*r.robotScale[robotIndex], 0.8*r.robotScale[robotIndex], 0.8 * 2*r.robotScale[robotIndex], 32, 32, false, 0, -min) + + + // var jointGeo1 = new THREE.CylinderGeometry (0.8, 0.8, 0.8 * 2, 32, 32, false, -min, 2 * Math.PI - max + min)//for hierachy demo + // var jointGeoMax = new THREE.CylinderGeometry(0.8, 0.8, 0.8 * 2, 32, 32, false, -max, max)//for hierachy demo + // var jointGeoMin = new THREE.CylinderGeometry(0.8, 0.8, 0.8 * 2, 32, 32, false, 0, -min)//for hierachy demo + + + var jointMesh1 = new THREE.Mesh(jointGeo1, new THREE.MeshBasicMaterial({ + color: 0x000000,//0xffbb00, + })); + var jointMeshMax = new THREE.Mesh(jointGeoMax, new THREE.MeshBasicMaterial({ + color: 0x000000,//0x009900, + })); + var jointMeshMin = new THREE.Mesh(jointGeoMin, new THREE.MeshBasicMaterial({ + color: 0x000000,//0xdd2200, + })); + + var joint = new THREE.Group(); + joint.add(jointMeshMax, jointMeshMin, jointMesh1); + + r.joints[robotIndex].push(joint); + + switch (jointNumber) { + case 0: + joint.rotation.x = Math.PI / 2; + break; + case 1: + // joint.rotation.x = Math.PI / 2 + break; + case 2: + // joint.rotation.x = Math.PI / 2 + break; + case 3: + // joint.rotation.z = Math.PI / 2; + break; + case 4: + joint.rotation.x = Math.PI / 2; + break; + } + + group.add(joint); + return group; + } + + let x = 0, + y = 0, + z = 0; + + // V_initial.push([0, 0, 0]) // add a 6th pseudo link for 6 axis + + for (let i = 0; i < V_initial.length; i++) { + var link = V_initial[i]; + + + + var linkGeo = createCube(x, y, z, link[0], link[1], link[2], limits[i][0], limits[i][1], i); + x = link[0]; + y = link[1]; + z = link[2]; + + if(i==1 ||i==2) + { + + r.carriedVoxel[robotIndex].push(r.voxel[robotIndex].clone()); + r.carriedVoxel[robotIndex][r.carriedVoxel[robotIndex].length-1].position.x=x-r.voxelSpacing[robotIndex]/2-0.5; + r.carriedVoxel[robotIndex][r.carriedVoxel[robotIndex].length-1].position.y=y; + r.carriedVoxel[robotIndex][r.carriedVoxel[robotIndex].length-1].position.z=z-2; + linkGeo.add( r.carriedVoxel[robotIndex][r.carriedVoxel[robotIndex].length-1] ); + } + + parentObject.add(linkGeo); + parentObject = linkGeo; + r.robotBones[robotIndex].push(linkGeo); + } + r.carriedVoxel[robotIndex][0].visible=false; + + group.add(r.THREE1[robotIndex]); + }; + + THREERobot.prototype = { + setAngles(robotIndex,angles1) { + this.r.robotBones[robotIndex][0].rotation.z =this.r.angles[robotIndex][0]; + this.r.robotBones[robotIndex][1].rotation.y =this.r.angles[robotIndex][1]; + this.r.robotBones[robotIndex][2].rotation.y =this.r.angles[robotIndex][2]; + this.r.robotBones[robotIndex][3].rotation.y =this.r.angles[robotIndex][3]; + this.r.robotBones[robotIndex][4].rotation.z =this.r.angles[robotIndex][4]; + // this.robotBones[robotIndex][5].rotation.z =this.angles[robotIndex][5]; + }, + + setAngle(robotIndex,index, angle) { + this.r.angles[robotIndex][index] = angle; + this.setAngles(robotIndex,this.r.angles[robotIndex].slice()); + }, + }; +} + +///////////////////////initialization///////////////////////////// +Swarm.prototype.defaultRobot= function(robotIndex){ + localState = { + jointOutOfBound: [false, false, false, false, false, false], + }; + var maxAngleVelocity = 90.0 / (180.0 * Math.PI) / 1000.0; + geo = [ + [0, 0, this.guiControls[robotIndex].offset], + [0, 0, this.guiControls[robotIndex].leg1 ], + [0, 0, this.guiControls[robotIndex].leg2 ], + [0, 0, this.guiControls[robotIndex].offset], + [0, 0, 0], + [0, 0, 0], + ]; + + this.defaultRobotState[robotIndex] = { + target: { + position: { + x: 10, + y: 10, + z: 10, + }, + rotation: { + x: Math.PI, + y: 0, + z: 0, + }, + }, + angles: { + A0: 0, + A1: 0, + A2: 0, + A3: 0, + A4: 0, + A5: 0, + }, + jointOutOfBound: [false, false, false, false, false, false], + maxAngleVelocities: { + J0: maxAngleVelocity, + J1: maxAngleVelocity, + J2: maxAngleVelocity, + J3: maxAngleVelocity, + J4: maxAngleVelocity, + J5: maxAngleVelocity, + }, + jointLimits: { + J0: [-190 / 180 * Math.PI, 190 / 180 * Math.PI], + J1: [-58 / 180 * Math.PI, 90 / 180 * Math.PI], + J2: [-135 / 180 * Math.PI, 40 / 180 * Math.PI], + J3: [-90 / 180 * Math.PI, 75 / 180 * Math.PI], + J4: [-139 / 180 * Math.PI, 20 / 180 * Math.PI], + J5: [-188 / 180 * Math.PI, 181 / 180 * Math.PI], + }, + geometry: { + V0: { + x: geo[0][0], + y: geo[0][1], + z: geo[0][2], + }, + V1: { + x: geo[1][0], + y: geo[1][1], + z: geo[1][2], + }, + V2: { + x: geo[2][0], + y: geo[2][1], + z: geo[2][2], + }, + V3: { + x: geo[3][0], + y: geo[3][1], + z: geo[3][2], + }, + V4: { + x: geo[4][0], + y: geo[4][1], + z: geo[4][2], + }, + }, + }; + + this.THREESimulationRobot[robotIndex] = new THREE.Group(); + this.scene.add(this.THREESimulationRobot[robotIndex]); + + var geometry = Object.values(this.defaultRobotState[robotIndex].geometry).map((val, i, array) => [val.x, val.y, val.z]); + var jointLimits = Object.values(this.defaultRobotState[robotIndex].jointLimits); + + this.VisualRobot[robotIndex] = new THREERobot(this,robotIndex,geometry, jointLimits, this.THREESimulationRobot[robotIndex]); + // varthis.angles = Object.values(this.defaultRobotState.angles); + // this.VisualRobot[robotIndex].setAngles(angles); + var restAngle=60; + // this.VisualRobot[robotIndex].setAngle(0,restAngle/ 180 * Math.PI); + this.VisualRobot[robotIndex].setAngle(robotIndex,1,restAngle*this.RAD_TO_DEG); + this.VisualRobot[robotIndex].setAngle(robotIndex,2,restAngle*this.RAD_TO_DEG); + this.VisualRobot[robotIndex].setAngle(robotIndex,3,restAngle*this.RAD_TO_DEG); + + if(this.showGUI){ + // var target= new THREE.Vector3(this.guiControls[robotIndex].x,this.guiControls[robotIndex].y,this.guiControls[robotIndex].z); + this.updateGUI(robotIndex); + + } + + + this.targetControl(robotIndex); + this.THREE1[robotIndex].position.x=this.robotState[robotIndex].leg2Pos.x*this.voxelSpacing[robotIndex];// /this.robotScale[robotIndex]; + this.THREE1[robotIndex].position.y=this.robotState[robotIndex].leg2Pos.y*this.voxelSpacing[robotIndex];// /this.robotScale[robotIndex]; + this.THREE1[robotIndex].position.z=this.robotState[robotIndex].leg2Pos.z*this.voxelSpacing[robotIndex];// /this.robotScale[robotIndex]; + this.updateAngles(robotIndex); + +} + +Swarm.prototype.updateRobotGeometry= function(robotIndex){ + geo = [ + [0, 0, this.guiControls[robotIndex].offset], + [0, 0, this.guiControls[robotIndex].leg1], + [0, 0, this.guiControls[robotIndex].leg2], + [0, 0, this.guiControls[robotIndex].offset], + [0, 0, 0], + [0, 0, 0], + ]; + + this.defaultRobotState[robotIndex].geometry ={ + V0: { + x: geo[0][0], + y: geo[0][1], + z: geo[0][2], + }, + V1: { + x: geo[1][0], + y: geo[1][1], + z: geo[1][2], + }, + V2: { + x: geo[2][0], + y: geo[2][1], + z: geo[2][2], + }, + V3: { + x: geo[3][0], + y: geo[3][1], + z: geo[3][2], + }, + V4: { + x: geo[4][0], + y: geo[4][1], + z: geo[4][2], + }, + }; + + var geometry = Object.values(this.defaultRobotState[robotIndex].geometry).map((val, i, array) => [val.x, val.y, val.z]); + var jointLimits = Object.values(this.defaultRobotState[robotIndex].jointLimits); + + while (this.THREESimulationRobot[robotIndex].children.length) { + this.THREESimulationRobot[robotIndex].remove(this.THREESimulationRobot[robotIndex].children[0]); + } + + + + + this.VisualRobot[robotIndex] = new THREERobot(this,robotIndex,geometry, jointLimits, this.THREESimulationRobot[robotIndex]); + + this.THREE1[robotIndex].position.x=this.robotState[robotIndex].leg2Pos.x*this.voxelSpacing[robotIndex];///this.robotScale[robotIndex]; + this.THREE1[robotIndex].position.y=this.robotState[robotIndex].leg2Pos.y*this.voxelSpacing[robotIndex];///this.robotScale[robotIndex]; + this.THREE1[robotIndex].position.z=this.robotState[robotIndex].leg2Pos.z*this.voxelSpacing[robotIndex];///this.robotScale[robotIndex]; + + this.updateAngles(robotIndex); +} \ No newline at end of file diff --git a/recursive_swarm/js/swarm_gui.js b/recursive_swarm/js/swarm_gui.js new file mode 100644 index 0000000000000000000000000000000000000000..413f69f12b079467e14e35c3772b2e64c0b16ca1 --- /dev/null +++ b/recursive_swarm/js/swarm_gui.js @@ -0,0 +1,263 @@ +// Amira Abdel-Rahman +// (c) Massachusetts Institute of Technology 2020 + +////////////////////////////////GUI/////////////////////////////// +Swarm.prototype.setupGUI= function(robotIndex){ + var r=this; + //Parameters that can be modified. + this.guiControls[robotIndex] = new function() { + // this.x = r.robotState[robotIndex].leg1Pos.x*r.voxelSpacing[robotIndex]/r.robotScale[robotIndex]; + // this.y = r.robotState[robotIndex].leg1Pos.y*r.voxelSpacing[robotIndex]/r.robotScale[robotIndex]; + // this.z = r.voxelSpacing[robotIndex]/2; + this.x = r.robotState[robotIndex].leg1Pos.x*r.voxelSpacing[robotIndex];///r.robotScale[robotIndex]*2; + this.y = r.robotState[robotIndex].leg1Pos.y*r.voxelSpacing[robotIndex];///r.robotScale[robotIndex]*1; + this.z = r.robotState[robotIndex].leg1Pos.z*r.voxelSpacing[robotIndex];///r.robotScale[robotIndex]*2; + + this.j1 = 0.0; + this.j2 = 0.0; + this.j3 = 0.0; + this.j4 = 0.0; + this.j5 = 0.0; + this.leg1 = r.robotGeometry.leg1 *r.robotScale[robotIndex]; + this.leg2 = r.robotGeometry.leg2 *r.robotScale[robotIndex]; + this.offset = r.robotGeometry.offset *r.robotScale[robotIndex]; + + // this.leg1 = r.robotGeometry.leg1 ;//for hierachy demo + // this.leg2 = r.robotGeometry.leg2 ;//for hierachy demo + // this.offset = r.robotGeometry.offset ;//for hierachy demo + this.targetEnd="end 1"; + this.step=0; + }; + + if(this.showGUI){ + var gui = new dat.GUI(); + var button={ + 'download csv': function() { + download_csv(); + }, + 'start movement':function(){ + if(!recursiveSwarms.hierarchical && recursiveSwarms.buildType=="directions"){ + recursiveSwarms.startMovementDirections(0); + } + } + }; + + this.geometryGui = gui.addFolder('Robot Geometry'); + this.geometryParams=[]; + this.geometryParams.push(this.geometryGui.add(this.guiControls[robotIndex], 'leg1', 1.00, 10.0).step(0.1).listen()); + this.geometryParams.push(this.geometryGui.add(this.guiControls[robotIndex], 'leg2', 1.00, 10.0).step(0.1).listen()); + this.geometryParams.push(this.geometryGui.add(this.guiControls[robotIndex], 'offset', 1.00, 10.0).step(0.1).listen()); + + this.jointsGui = gui.addFolder('Robot Joints'); + this.jointsParams=[]; + this.jointsParams.push(this.jointsGui.add(this.guiControls[robotIndex], 'j1', -180.0, 180.0).step(0.1).listen()); + this.jointsParams.push(this.jointsGui.add(this.guiControls[robotIndex], 'j2', -180.0, 180.0).step(0.1).listen()); + this.jointsParams.push(this.jointsGui.add(this.guiControls[robotIndex], 'j3', -180.0, 180.0).step(0.1).listen()); + this.jointsParams.push(this.jointsGui.add(this.guiControls[robotIndex], 'j4', -180.0, 180.0).step(0.1).listen()); + this.jointsParams.push(this.jointsGui.add(this.guiControls[robotIndex], 'j5', -180.0, 180.0).step(0.1).listen()); + + this.targetGui = gui.addFolder('Target'); + this.targetParams=[]; + this.targetParams.push(this.targetGui.add(this.guiControls[robotIndex], 'x', -10.0*this.voxelSpacing, 10.0*this.voxelSpacing).step(0.1).listen()); + this.targetParams.push(this.targetGui.add(this.guiControls[robotIndex], 'y', -10.0*this.voxelSpacing, 10.0*this.voxelSpacing).step(0.1).listen()); + this.targetParams.push(this.targetGui.add(this.guiControls[robotIndex], 'z', -10.0*this.voxelSpacing, 10.0*this.voxelSpacing).step(0.1).listen()); + + var endtarget= gui.addFolder('Target end'); + this.end=endtarget.add(this.guiControls[robotIndex],'targetEnd',["end 1","end 2"]).listen(); + + // entStep=gui.add(this.guiControls[robotIndex], 'step', 0, this.path[robotIndex].number).step(1.0).listen(); + gui.add(button,"start movement"); + gui.add(button,"download csv"); + + } + + + +} + +Swarm.prototype.updateGUI= function(robotIndex){ + for (var i=0;i<this.targetParams.length;i++) { + this.targetParams[i].onChange(function(value) { + recursiveSwarms.updateAngles(robotIndex); + recursiveSwarms.control[robotIndex].position.x = recursiveSwarms.guiControls[robotIndex].x; + recursiveSwarms.control[robotIndex].position.y = recursiveSwarms.guiControls[robotIndex].y; + recursiveSwarms.control[robotIndex].position.z = recursiveSwarms.guiControls[robotIndex].z; + recursiveSwarms.target[robotIndex].position.x = recursiveSwarms.guiControls[robotIndex].x; + recursiveSwarms.target[robotIndex].position.y = recursiveSwarms.guiControls[robotIndex].y; + recursiveSwarms.target[robotIndex].position.z = recursiveSwarms.guiControls[robotIndex].z; + }); + } + + for (var i=0;i<this.jointsParams.length;i++) { + this.jointsParams[i].onChange(function(value) { + // console.log(value) + // console.log(recursiveSwarms) + if(recursiveSwarms.leg[robotIndex]==1) + { + recursiveSwarms.VisualRobot[robotIndex].setAngle(robotIndex,0,recursiveSwarms.guiControls[robotIndex].j1*recursiveSwarms.DEG_TO_RAD); + recursiveSwarms.VisualRobot[robotIndex].setAngle(robotIndex,1,recursiveSwarms.guiControls[robotIndex].j2*recursiveSwarms.DEG_TO_RAD); + recursiveSwarms.VisualRobot[robotIndex].setAngle(robotIndex,2,recursiveSwarms.guiControls[robotIndex].j3*recursiveSwarms.DEG_TO_RAD); + recursiveSwarms.VisualRobot[robotIndex].setAngle(robotIndex,3,recursiveSwarms.guiControls[robotIndex].j4*recursiveSwarms.DEG_TO_RAD); + recursiveSwarms.VisualRobot[robotIndex].setAngle(robotIndex,4,recursiveSwarms.guiControls[robotIndex].j5*recursiveSwarms.DEG_TO_RAD); + + }else + { + recursiveSwarms.VisualRobot[robotIndex].setAngle(robotIndex,4,recursiveSwarms.guiControls[robotIndex].j1*recursiveSwarms.DEG_TO_RAD); + recursiveSwarms.VisualRobot[robotIndex].setAngle(robotIndex,3,recursiveSwarms.guiControls[robotIndex].j2*recursiveSwarms.DEG_TO_RAD); + recursiveSwarms.VisualRobot[robotIndex].setAngle(robotIndex,2,recursiveSwarms.guiControls[robotIndex].j3*recursiveSwarms.DEG_TO_RAD); + recursiveSwarms.VisualRobot[robotIndex].setAngle(robotIndex,1,recursiveSwarms.guiControls[robotIndex].j4*recursiveSwarms.DEG_TO_RAD); + recursiveSwarms.VisualRobot[robotIndex].setAngle(robotIndex,0,recursiveSwarms.guiControls[robotIndex].j5*recursiveSwarms.DEG_TO_RAD); + + } + + recursiveSwarms.updateTarget(robotIndex); + }); + } + // console.log(this.geometryParams) + // console.log(this.targetParams) + + for (var i=0 ;i<this.geometryParams.length ;i++) { + this.geometryParams[i].onChange(function(value) { + recursiveSwarms.updateRobotGeometry(robotIndex); + }); + } + + // this.currentStep.onChange(function(value) { + // this.step(robotIndex,this.guiControls[robotIndex].step); + // }); + + this.end.onChange(function(value) { + + recursiveSwarms.changeEnd(robotIndex); + }); + + +} + +////////////////////////Target Control//////////////////////////// +Swarm.prototype.targetControl= function(robotIndex){ + this.target[robotIndex] = new THREE.Group(); + if(this.showGUI){ + this.scene.add(this.target[robotIndex]); + } + + this.control[robotIndex] = new THREE.TransformControls(this.camera, this.renderer.domElement); + this.target[robotIndex].position.x = this.guiControls[robotIndex].x; + this.target[robotIndex].position.y = this.guiControls[robotIndex].y; + this.target[robotIndex].position.z = this.guiControls[robotIndex].z; + + this.control[robotIndex].size=0.25; + this.control[robotIndex].space = "local"; + this.target[robotIndex].rotation.y=180*this.DEG_TO_RAD; + this.target[robotIndex].rotation.z=90*this.DEG_TO_RAD; + // this.control[robotIndex].setSpace( this.control[robotIndex].space === "local" ? "world" : "local" ); + this.control[robotIndex].addEventListener('change', () => { + // robotIndex=0; + // console.log(recursiveSwarms) + recursiveSwarms.guiControls[robotIndex].x= recursiveSwarms.target[robotIndex].position.x; + recursiveSwarms.guiControls[robotIndex].y= recursiveSwarms.target[robotIndex].position.y; + recursiveSwarms.guiControls[robotIndex].z= recursiveSwarms.target[robotIndex].position.z; + recursiveSwarms.updateAngles(robotIndex); + }); + this.control[robotIndex].attach(this.target[robotIndex]); + + if(this.showGUI){ + this.scene.add(this.control[robotIndex]); + // this.control[robotIndex].visible = false; + + } + +} + +Swarm.prototype.updateTarget= function(robotIndex){ + var tempPosition=new THREE.Vector3(0,0,0); + + // parent.updateMatrixWorld(); + + // var vector = new THREE.Vector3(); + // vector.setFromMatrixPosition( child.matrixWorld ); + + + // var object=this.THREE1[robotIndex].children[0].children[2].children[2].children[2].children[2]; + // object.updateMatrixWorld(); + // var vector = object.geometry.vertices[i].clone(); + // vector.applyMatrix4( object.matrixWorld ); + + + // tempPosition.x=this.THREE1[robotIndex].parent.parent.children[0].position.x/this.robotScale[robotIndex]; + // tempPosition.y=this.THREE1[robotIndex].parent.parent.children[0].position.y/this.robotScale[robotIndex]; + // tempPosition.z=this.THREE1[robotIndex].parent.parent.children[0].position.z/this.robotScale[robotIndex]; + + tempPosition.x=this.THREE1[robotIndex].parent.parent.children[5].position.x/this.robotScale[robotIndex]; + tempPosition.y=this.THREE1[robotIndex].parent.parent.children[5].position.y/this.robotScale[robotIndex]; + tempPosition.z=this.THREE1[robotIndex].parent.parent.children[5].position.z/this.robotScale[robotIndex]; + + + + + + this.guiControls[robotIndex].x=tempPosition.x; + this.guiControls[robotIndex].y=tempPosition.y; + this.guiControls[robotIndex].z=tempPosition.z; + + this.control[robotIndex].position.x = this.guiControls[robotIndex].x; + this.control[robotIndex].position.y = this.guiControls[robotIndex].y; + this.control[robotIndex].position.z = this.guiControls[robotIndex].z; + + this.target[robotIndex].position.x = this.guiControls[robotIndex].x; + this.target[robotIndex].position.y = this.guiControls[robotIndex].y; + this.target[robotIndex].position.z = this.guiControls[robotIndex].z; +} + + +Swarm.prototype.screenshotSaver=function(){ + function downloadURI(uri, name) { + var link = document.createElement('a'); + link.download = name; + link.href = uri; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + delete link; + } + var button={ + "Save Image":function(){ + // var cnvs = document.getElementById('graph').children[0].children[0].children[0].children[2]; + // console.log(cnvs) + // var ctx = cnvs.getContext('2d'); + // var cnvs = document.getElementById('mynetwork').children[0].children[0]; + // console.log(cnvs) + // var dataURL = cnvs.toDataURL({ pixelRatio: 10 }); + recursiveSwarms.renderer.render(recursiveSwarms.scene, recursiveSwarms.camera); + var dataURL = recursiveSwarms.renderer.domElement.toDataURL({ pixelRatio: 10 }); + + downloadURI(dataURL, 'recursiveSwarms.png'); + + + + } + } + const gui = new dat.GUI(); + gui.add(button,"Save Image"); +} +/////////////////////////////////////////////////////////////////////////////////////////////////// +function download_csv(){ + var csv = 'j1,j2,j3,j4,j5\n'; + recursiveSwarms.dataAngles.forEach(function(row) { + csv += row.join(','); + csv += "\n"; + }); + + + var hiddenElement = document.createElement('a'); + hiddenElement.href = 'data:text/csv;charset=utf-8,' + encodeURI(csv); + hiddenElement.target = '_blank'; + hiddenElement.download = 'angles.csv'; + //hiddenElement.click(); + + document.body.append(hiddenElement); + hiddenElement.click(); + document.body.removeChild(hiddenElement); + + +} diff --git a/recursive_swarm/js/swarm_hierarchy.js b/recursive_swarm/js/swarm_hierarchy.js new file mode 100644 index 0000000000000000000000000000000000000000..0736cea7cd734e6541d290881ae490d1ad5055d0 --- /dev/null +++ b/recursive_swarm/js/swarm_hierarchy.js @@ -0,0 +1,123 @@ +// Amira Abdel-Rahman +// (c) Massachusetts Institute of Technology 2020 + +function loadBilles(fileName,pos,carrying=true,rz=0){ + function meshToThreejs(mesh, material) { + let loader = new THREE.BufferGeometryLoader(); + var geometry = loader.parse(mesh.toThreejsJSON()); + return new THREE.Mesh(geometry, material); + } + + let fetchPromise = fetch(fileName); + + rhino3dm().then(async m => { + let rhino = m; + + let res = await fetchPromise; + let buffer = await res.arrayBuffer(); + let arr = new Uint8Array(buffer); + let doc = rhino.File3dm.fromByteArray(arr); + + THREE.Object3D.DefaultUp = new THREE.Vector3(0,0,1) + // init(); + // let material = new THREE.MeshNormalMaterial(); + + + // let material = new THREE.MeshLambertMaterial( { color: new THREE.Color( 0.8, 0.8, 0.8 ) } ); + // let material1 = new THREE.MeshLambertMaterial( { color: new THREE.Color( 0.3, 0.3, 0.3 ) } ); + // let material2 = new THREE.MeshLambertMaterial( { color: new THREE.Color( 0.6, 0.6, 0.6 ) } ); + // let material3 = new THREE.MeshLambertMaterial( { color: new THREE.Color( 0, 0.2, 0 ) } ); + // let material4 = new THREE.MeshLambertMaterial( { color: new THREE.Color( 0.5, 0.5, 0 ) } ); + // let material5 = new THREE.MeshLambertMaterial( { color: new THREE.Color( 0.1, 0.1, 0.1 ) } ); + var material5 = new THREE.MeshPhysicalMaterial( { metalness: 0.4,reflectivity: 0.5,roughness: 0.5,color: new THREE.Color( 1.0, 1.0, 1.0 ) } ); + + var material = new THREE.MeshPhysicalMaterial( { metalness: 0.4,reflectivity: 0.5,roughness: 0.5,color: new THREE.Color( 1.0, 1.0, 1.0 ) } ); + var material1 = new THREE.MeshPhysicalMaterial( { metalness: 0.4,reflectivity: 0.5,roughness: 0.5,color: new THREE.Color( 0.3, 0.3, 0.3 ) } ); + var material2 = new THREE.MeshPhysicalMaterial( { metalness: 0.4,reflectivity: 0.5,roughness: 0.5,color: new THREE.Color( 0.6, 0.6, 0.6 ) } ); + var material3 = new THREE.MeshPhysicalMaterial( { metalness: 0.4,reflectivity: 0.5,roughness: 0.5,color: new THREE.Color( 0, 0.2, 0 ) } ); + var material4 = new THREE.MeshPhysicalMaterial( { metalness: 0.4,reflectivity: 0.5,roughness: 0.5,color: new THREE.Color( 0.5, 0.5, 0 ) } ); + var material5 = new THREE.MeshPhysicalMaterial( { metalness: 0.4,reflectivity: 0.5,roughness: 0.5,color: new THREE.Color( 0.1, 0.1, 0.1 ) } ); + + // var color= new THREE.Color( 0.5, 0.5, 0.5 ); + // var color= new THREE.Color( 0.5, 0.5, 0.5 ); + + let r=new THREE.Group(); + + let objects = doc.objects(); + for (let i = 0; i < objects.count; i++) { + let mesh = objects.get(i).geometry(); + let layer=objects.get(i).attributes().layerIndex; + // console.log(objects.get(i).attributes()) + if(mesh instanceof rhino.Mesh) { + // convert all meshes in 3dm model into threejs objects + + let threeMesh=new THREE.Group(); + // if(layer==7||layer==2||layer==5){ + // threeMesh = meshToThreejs(mesh, material1); + + // }else{ + // threeMesh = meshToThreejs(mesh, material); + + // } + + if(objects.get(i).attributes().name=='grey'||objects.get(i).attributes().name=='grey1'||objects.get(i).attributes().name=='grey2'||objects.get(i).attributes().name=='pcb'){ + threeMesh = meshToThreejs(mesh, material1); + + }else if(objects.get(i).attributes().name=='motors'){ + threeMesh = meshToThreejs(mesh, material2); + }else if(objects.get(i).attributes().name=='controller'){ + threeMesh = meshToThreejs(mesh, material3); + }else if(objects.get(i).attributes().name=='connectors'){ + threeMesh = meshToThreejs(mesh, material4); + }else if(objects.get(i).attributes().name=='battery'){ + threeMesh = meshToThreejs(mesh, material5); + }else{ + if(layer==8){ + if(carrying){ + threeMesh = meshToThreejs(mesh, material); + + } + + }else{ + threeMesh = meshToThreejs(mesh, material); + } + + } + // console.log(layer) + + + + r.add(threeMesh); + } + } + console.log("loaded bille"); + + // for (let i = 0; i < billeGroupsTemp.length; i++) { + // billeGroupsTemp[i].name="Group:"+i; + // } + // this.bille.add(billeGroupsTemp[0].clone().add(billeGroupsTemp[1].clone().add(billeGroupsTemp[2].clone().add(billeGroupsTemp[3].clone().add(billeGroupsTemp[4].clone().add(billeGroupsTemp[5].clone())))))); + + // this.bille.children[0].add(billeGroupsTemp[6].clone()); + // r.rotation.z=rz; + + r.rotation.z=rz; + r.position.x+=pos.x; + r.position.y+=pos.y; + r.position.z+=pos.z; + + // r.name=""+name; + // name++; + + recursiveSwarms.scene.add(r); + + + + + // recursiveSwarms.render(); + // recursiveSwarms.renderer.render(recursiveSwarms.scene, recursiveSwarms.camera) + + + + }); + +} \ No newline at end of file diff --git a/recursive_swarm/js/swarm_move.js b/recursive_swarm/js/swarm_move.js new file mode 100644 index 0000000000000000000000000000000000000000..1b435f03b66e879dc0f21b9c674cac891166c97e --- /dev/null +++ b/recursive_swarm/js/swarm_move.js @@ -0,0 +1,1392 @@ +// Amira Abdel-Rahman +// (c) Massachusetts Institute of Technology 2020 + +//////////////////////////commands stack//////////////////////////// + +Swarm.prototype.startMovement= function(robotIndex,home){ + if(!this.hierarchical && this.buildType=="frepCube"){ + this.startMovementIROS(robotIndex,home); + }else if(this.hierarchical && this.buildType=="sdfList"){ + this.startMovementHierarchicalSDF(robotIndex,home); + }else if(this.hierarchical && this.buildType=="sdfList1"){ + this.startMovementHierarchicalSDF1(robotIndex,home); + }else if(this.hierarchical && (this.buildType=="list"||this.buildType=="recursion")){ + this.startMovementList(robotIndex,home); + } + +} + +Swarm.prototype.startMovementList= function(robotIndex,home){ + // console.log("robot:"+robotIndex+" home:"+home); + + //if not home + if(!home){ + this.resetPath(robotIndex); + this.voxelBuilderList( + robotIndex,this.robotState[robotIndex].leg1Pos, + this.robotState[robotIndex].leg2Pos, + this.robotState[robotIndex].up, + this.robotState[robotIndex].forward, + this.voxelList[robotIndex].list + ); + this.generatePoints(robotIndex); + + //if generated path + if(this.steps[robotIndex].length>0){ + for(var i=0;i<this.steps[robotIndex].length;i++){ + this.step(robotIndex,i); + } + if(this.voxelList[robotIndex].pickupList!==undefined){ + this.startLocations[robotIndex]=this.depositLocations[this.voxelList[robotIndex].pickupList[0]]; + this.voxelList[robotIndex].pickupList.shift(); + } + this.goHome[robotIndex]=true; + }else{ + // console.log("done") + // this.bille.visible=true; + // for(var i=0;i<9;i++){ + // var joint = this.scene.getObjectByName( "bille" +i); + // joint.visible=false; + + // } + next(); + + + } + + + + } + //go home + else{ + this.resetPath(robotIndex); + this.reloadVoxel( + robotIndex, + this.robotState[robotIndex].leg1Pos, + this.robotState[robotIndex].leg2Pos, + this.robotState[robotIndex].up, + this.robotState[robotIndex].forward); + this.generatePoints(robotIndex); + + for(var i=0;i<this.steps[robotIndex].length;i++){ + this.step(robotIndex,i); + } + + this.goHome[robotIndex]=false; + + if(this.steps[robotIndex].length==0){ + // console.log("nn st") + this.startMovement(robotIndex,false); + } + + } + +} + +Swarm.prototype.voxelBuilderList= function(robotIndex,leg1Pos, leg2Pos, up ,forward,availableVoxels){ + // var availableVoxels=this.voxelSlices[this.robotState[robotIndex].Z]; + + var start=leg1Pos.clone(); + var state; + var succeeded; + var count=0; + + var min=Infinity; + var minIndex= new THREE.Vector3(0,0,0); + var minIndex1= 0; + var robotSize=this.robotScale[robotIndex]; + + + //if there is still voxels in this layer + if(availableVoxels !== undefined){ + if(availableVoxels.length>0){ + minIndex= availableVoxels[minIndex1].clone().multiplyScalar(this.voxelSpacing[robotIndex]); + minIndex.x=minIndex.x/this.robotScale[robotIndex]; + minIndex.y=minIndex.y/this.robotScale[robotIndex]; + minIndex.z=minIndex.z/this.robotScale[robotIndex]; + //for all available voxels + // for(var i=0;i<availableVoxels[this.robotState[robotIndex].rank].length;i++){ + // //if no voxel + // if(!this.voxelAt(availableVoxels[this.robotState[robotIndex].rank][i].clone().multiplyScalar(1/this.voxelSpacing[robotIndex]))){ + // //find min distance + // if(start.distanceTo(availableVoxels[this.robotState[robotIndex].rank][i])<min){ + // min=start.distanceTo(availableVoxels[this.robotState[robotIndex].rank][i]); + // minIndex=availableVoxels[this.robotState[robotIndex].rank][i]; + // } + // } + // } + //change occupancy + //change occupancy + if(this.robotScale[robotIndex]>1){//todo change to accommodate for more sizes + //todo check if + minIndex.z=(availableVoxels[minIndex1].z+(robotSize-1))*this.voxelSpacing[robotIndex]/this.robotScale[robotIndex]; + + + for (var j=0; j<this.voxelIndexList[robotSize].list.length;j++){ + this.grid[availableVoxels[minIndex1].x+this.voxelIndexList[robotSize].list[j].x] + [availableVoxels[minIndex1].y+this.voxelIndexList[robotSize].list[j].y] + [availableVoxels[minIndex1].z+this.voxelIndexList[robotSize].list[j].z-1]=true; + } + + }else{ + this.grid[availableVoxels[minIndex1].x][availableVoxels[minIndex1].y][availableVoxels[minIndex1].z]=true; + + } + //remove from list + this.voxelList[robotIndex].list.shift(); + // this.voxelList[robotIndex].list = availableVoxels.slice(0, minIndex1).concat(availableVoxels.slice(minIndex1 + 1, availableVoxels.length)); + // this.voxelList[robotIndex].list.shift(); + + this.showTargetPosition(robotIndex,minIndex,true); + + state= this.pathPlan(robotIndex,leg1Pos, leg2Pos, up ,forward,minIndex); + + this.robotState[robotIndex].leg1Pos=state[0].clone(); + this.robotState[robotIndex].leg2Pos=state[1].clone(); + this.robotState[robotIndex].up=state[2].clone(); + this.robotState[robotIndex].forward=state[3].clone(); + succeeded=state[4]; + + if(succeeded) + { + return [state[0],state[1],state[2],state[3]]; + + }else + { + // console.log("COULDN'T FIND PATH!!!"); + return false; + } + + }else{ + return false; + } + }else{ + console.log("DONEE!!!"); + return false; + } + +} + +Swarm.prototype.startMovementHierarchicalSDF1= function(robotIndex,goHome){ + + var wait=false; + var robotSize=this.robotScale[robotIndex]; + var log=false; + + //if not home + if(!goHome && !this.buildList.done){ + + //////////////////////////check if task is pending///////////////// + + //if bigger size bill-e at pickup site and ready to delete in situ + if(robotSize>1&& this.voxelList[robotIndex].toDelete.robotIndex!=-1){ + // console.log(robotSize) + // console.log(this.voxelList[robotIndex].toDelete.stockData) + + // console.log(this.startLocations[robotIndex].equals(this.startLocations[this.voxelList[robotIndex].toDelete.robotIndex])) + if(this.robotState[robotIndex].leg1Pos.clone().multiplyScalar(this.voxelSpacing[robotIndex]).equals(this.startLocations[robotIndex])&&this.startLocations[robotIndex].equals(this.startLocations[this.voxelList[robotIndex].toDelete.robotIndex])){ + var pickUp=this.voxelList[robotIndex].toDelete.robotIndex; + + if(this.voxelList[robotIndex].toDelete.stockData.length>1 ){ + //delete voxels from scene + for (var j=0; j<this.voxelIndexList[2].list.length;j++){ + // var loc=this.voxelIndexList[2].list[j].clone() + // .add(this.startLocations[pickUp].clone().multiplyScalar(1/this.voxelSpacing[pickUp])) + // .add(this.inSituAdjustment[pickUp]); + var loc=this.voxelIndexList[2].list[j].clone() + .add(this.startLocations[pickUp].clone().multiplyScalar(1/this.voxelSpacing[pickUp])) + .add(this.inSituAdjustment[pickUp].clone().multiplyScalar(1/this.robotScale[pickUp])); + + this.grid[loc.x][loc.y][loc.z]=false; + + var name='['+loc.x+','+loc.y+','+loc.z+']'; + var obj=this.scene.getObjectByName(name); + this.scene.remove(obj); + + } + + var indexZ= this.voxelList[robotIndex].toDelete.stockData[0]; + var indexSize=this.voxelList[robotIndex].toDelete.stockData[1]; + var indexSDF= this.voxelList[robotIndex].toDelete.stockData[2]; + var indexCube=this.voxelList[robotIndex].toDelete.stockData[3]; + //flag that it is picked up + this.buildList.listSize[indexSize].listZ[indexZ].listSDF[indexSDF].listCubes[indexCube].stockPickedUp=true; + //make smaller billl-e not busy + this.voxelList[pickUp].busy=false; + this.startLocations[robotIndex]=this.depositLocations[robotIndex].clone(); + //remove fag that arrived to pickup + this.voxelList[robotIndex].toDelete={stockData:[],robotIndex:-1}; + + //now get task to build voxel + this.buildList.listSize[indexSize].listZ[indexZ].listSDF[indexSDF].listCubes[indexCube].done=true; + //todo make sure that works.. maybe final location is not the one + this.voxelList[robotIndex].build.list.push({ position:this.buildList.listSize[indexSize].listZ[indexZ].listSDF[indexSDF].listCubes[indexCube].position.clone(), + stockBuilt:true}); + + }else{ + + var indexBiggerRobot=this.voxelList[robotIndex].toDelete.stockData[0]; + if(indexBiggerRobot==robotIndex){ + //delete voxels from scene + for (var j=0; j<this.voxelIndexList[2].list.length;j++){ + // var loc=this.voxelIndexList[2].list[j].clone() + // .add(this.startLocations[pickUp].clone().multiplyScalar(1/this.voxelSpacing[pickUp])) + // .add(this.inSituAdjustment[pickUp]); + var loc=this.voxelIndexList[2].list[j].clone() + .add(this.startLocations[pickUp].clone().multiplyScalar(1/this.voxelSpacing[pickUp])) + .add(this.inSituAdjustment[pickUp].clone().multiplyScalar(1/this.robotScale[pickUp])); + + this.grid[loc.x][loc.y][loc.z]=false; + + var name='['+loc.x+','+loc.y+','+loc.z+']'; + var obj=this.scene.getObjectByName(name); + + + this.scene.remove(obj); + + } + + indexBiggerRobot=robotIndex; + var taskGiven=false; + for(var i=0;i<this.voxelList[indexBiggerRobot].build.list.length;i++){ + if(!this.voxelList[indexBiggerRobot].build.list[i].stockBuilt && !taskGiven){ + // console.log(i) + // console.log(indexBiggerRobot) + + taskGiven=true; + //make smaller bill-e not busy + this.voxelList[pickUp].busy=false; + this.startLocations[robotIndex]=this.depositLocations[robotIndex].clone(); + //remove fag that arrived to pickup + this.voxelList[robotIndex].toDelete={stockData:[],robotIndex:-1}; + + this.voxelList[indexBiggerRobot].build.list[i].stockBuilt=true; + + //todo make sure that works.. maybe final location is not the one + // this.voxelList[robotIndex].build.list.push({ position:this.voxelList[indexBiggerRobot].build.list[i].position.clone(), + // stockBuilt:true}); + + + } + + } + if(!taskGiven){ + // if(log) + if(log) console.log("dcvszv"+robotIndex) + + wait=true; + } + + } + } + + } + + } + + + + //if smaller size bill-e finished building in situ construction and flag available for pickup + //if voxelList has the flag + if(this.voxelList[robotIndex].build.stockData.length>0 &&this.voxelList[robotIndex].build.list.length==0){ + if(this.voxelList[robotIndex].build.stockData.length>1){ + var indexZ=this.voxelList[robotIndex].build.stockData[0]; + var indexSize=this.voxelList[robotIndex].build.stockData[1]; + var indexSDF=this.voxelList[robotIndex].build.stockData[2]; + var indexCube=this.voxelList[robotIndex].build.stockData[3]; + + this.buildList.listSize[indexSize].listZ[indexZ].listSDF[indexSDF].listCubes[indexCube].stockBuilt=true; + + this.voxelList[robotIndex].build.stockData=[]; + var found=false; + for(var i=0;i<this.buildList.availablePickup[robotSize*2].length;i++){ //change available pickup from busy to done + if(this.buildList.availablePickup[robotSize*2][i]==-1 && !found){ + this.buildList.availablePickup[robotSize*2][i]={stockData:[indexZ,indexSize,indexSDF,indexCube],robotIndex:robotIndex}; + found=true; + } + } + if(log) console.log("dvsv"+robotIndex) + + // wait=true; + + }else{ + var indexBiggerRobot=this.voxelList[robotIndex].build.stockData[0]; + this.voxelList[robotIndex].build.stockData=[]; + + var found=false; + for(var i=0;i<this.buildList.availablePickup[robotSize*2].length;i++){ //change available pickup from busy to done + if(this.buildList.availablePickup[robotSize*2][i]==-1 && !found){ + this.buildList.availablePickup[robotSize*2][i]={stockData:[indexBiggerRobot],robotIndex:robotIndex}; + found=true; + } + } + if(log) console.log("xczzc"+robotIndex) + + // wait=true; + + } + + } + + //if stock needed to be built for intermediate bill-es + if(!wait && this.voxelList[robotIndex].build.list.length==0 &&this.buildList.listToBuild[robotSize].length>0&&!this.voxelList[robotIndex].busy&&!this.voxelList[robotIndex].busyGoingHome){ + //build in situ + //hardcoded 2 as it will always be building 8 voxels regardless of the size + var stockBuilt=false; + if(robotSize==1){ + stockBuilt=true; + } + for (var j=0; j<this.voxelIndexList[2].list.length;j++){ + // this.voxelList[robotIndex].build.list.push({ + // position:this.voxelIndexList[2].list[j].clone() + // .add(this.startLocations[robotIndex].clone().multiplyScalar(1/this.voxelSpacing[robotIndex])) + // .add(this.inSituAdjustment[robotIndex]), + // stockBuilt:stockBuilt + // }); + this.voxelList[robotIndex].build.list.push({ + position:this.voxelIndexList[2].list[j].clone().add(new THREE.Vector3(0,0,-1)).multiplyScalar(robotSize).add(new THREE.Vector3(0,0,1)) + .add(this.startLocations[robotIndex].clone().multiplyScalar(1/this.voxelSpacing[robotIndex]*robotSize)) + .add(this.inSituAdjustment[robotIndex].clone().multiplyScalar(1)), + stockBuilt:stockBuilt + }); + } + this.buildList.availablePickup[robotSize*2].push(-1); //for bigger robot to wait and not go home + this.voxelList[robotIndex].build.stockData=[this.buildList.listToBuild[robotSize][0]];//push index at the end to flag when it's done + // console.log(this.buildList.listToBuild[robotSize][0]) + this.voxelList[robotIndex].busy=true; + + this.buildList.listToBuild[robotSize].shift(); + + } + + ////////////////check for new tasks////////////////////////////////////// + //if have no assigned voxels try to assign + if( !wait && this.voxelList[robotIndex].build.list.length==0&& !this.voxelList[robotIndex].busy&&!this.voxelList[robotIndex].busyGoingHome&& !this.buildList.done){ + //find current bin + var binSize=this.buildList.listSize[this.buildList.currentSizeIndex]; + var binZ=binSize.listZ[binSize.currentZIndex]; + var binSDF=binZ.listSDF[binZ.currentSDFIndex]; + + var indexSize=this.buildList.currentSizeIndex; + var indexZ=binSize.currentZIndex; + var indexSDF=binZ.currentSDFIndex; + + var maxIndexSize=this.buildList.maxSizeIndex; + var maxIndexZ=binSize.maxZIndex; + var maxIndexSDF=binZ.maxSDFIndex; + + // if robot size smaller than target bin size + if(robotSize<binSDF.size){ + if(robotSize==binSDF.size/2){ + var gotTask=false; + for(var i=0;i<binSDF.listCubes.length;i++){ + if(!binSDF.listCubes[i].done&&!binSDF.listCubes[i].stockAssigned &&!gotTask){ + gotTask=true; + binSDF.listCubes[i].stockAssigned=true; + this.buildList.listSize[indexSize].listZ[indexZ].listSDF[indexSDF].listCubes[i].stockAssigned=true; + //build in situ + //hardcoded 2 as it will always be building 8 voxels regardless of the size + var stockBuilt=false; + if(robotSize==1){ + stockBuilt=true; + } + + for (var j=0; j<this.voxelIndexList[2].list.length;j++){ + this.voxelList[robotIndex].build.list.push({ + position:this.voxelIndexList[2].list[j].clone().add(new THREE.Vector3(0,0,-1)).multiplyScalar(robotSize).add(new THREE.Vector3(0,0,1)) + .add(this.startLocations[robotIndex].clone().multiplyScalar(1/this.voxelSpacing[robotIndex]*robotSize)) + .add(this.inSituAdjustment[robotIndex].clone().multiplyScalar(1)), + stockBuilt:stockBuilt + }); + } + + this.buildList.availablePickup[binSDF.size].push(-1); //for bigger robot to wait and not go home + this.voxelList[robotIndex].build.stockData=[indexZ,indexSize,indexSDF,i];//push index at the end to flag when it's done + this.voxelList[robotIndex].busy=true; + + //if not size 1 go back later as no stock available + // flag for smaller robots to build stocks + if(robotSize>1){ + //add them in list to build + if(log) console.log("vdsvs"+robotIndex) + + wait=true; + for(var i=0;i<8;i++){ + this.buildList.listToBuild[robotSize/2.0].push(robotIndex); //no need to put robotIndex but why not + } + } + } + } + if(!gotTask){ + if(log) console.log("dssvd"+robotIndex) + wait=true; + } + + }else{ + if(log) console.log("awfawf"+robotIndex) + wait=true; + } + + }else if(binSDF.size==robotSize){ //if same size + var gotTask=false; + var done=true; + for(var i=0;i<binSDF.listCubes.length;i++){ + if(!binSDF.listCubes[i].done){ + done=false; + } + if(!binSDF.listCubes[i].done&&binSDF.listCubes[i].stockBuilt &&!gotTask){ + gotTask=true; + binSDF.listCubes[i].done=true; + this.buildList.listSize[indexSize].listZ[indexZ].listSDF[indexSDF].listCubes[i].done=true; + this.voxelList[robotIndex].build.list.push({position:binSDF.listCubes[i].position.clone(),stockBuilt:true}); + } + } + if(!gotTask){ + if(log) console.log("fefswv"+robotIndex) + wait=true; + } + + //update list + if(done){ + binSDF.done=true; + this.buildList.listSize[indexSize].listZ[indexZ].listSDF[indexSDF].done=true; + binZ.currentSDFIndex++; + console.log("Layer "+(maxIndexZ-indexZ)+", size "+(maxIndexSize-indexSize)+", sdf "+(maxIndexSDF-indexSDF)+" done!"); + if(binZ.currentSDFIndex>=binZ.maxSDFIndex){ + binZ.done=true; + this.buildList.listSize[indexSize].listZ[indexZ].done=true; + console.log("Layer "+(maxIndexZ-indexZ)+", size "+(maxIndexSize-indexSize)+" done!"); + binSize.currentZIndex++; + if(binSize.currentZIndex>=binSize.maxZIndex){ + binSize.done=true; + this.buildList.listSize[indexSize].done=true; + console.log("Size "+(maxIndexSize-indexSize)+" done!"); + this.buildList.currentSizeIndex++; + if(this.buildList.currentSizeIndex>=this.buildList.maxSizeIndex){ + this.buildList.done=true; + console.log("Simulation Done!!!!!!!!!!!!!!") + } + } + } + } + }else{ + if(log) console.log("fdbddfbd"+robotIndex) + wait=true; //later change for two sizes bigger + } + } + + //if has task but stock not ready + if(this.voxelList[robotIndex].build.list.length> 0&& !this.voxelList[robotIndex].build.list[0].stockBuilt){ + if(log) console.log("bhhbj"+robotIndex) + wait=true; + } + + ///////////////////////////if there is task go on///////////////// + //if have assigned voxel + if(!wait && this.voxelList[robotIndex].build.list.length>0){ + this.resetPath(robotIndex); + this.voxelBuilderHierarchicalSDF( + robotIndex,this.robotState[robotIndex].leg1Pos, + this.robotState[robotIndex].leg2Pos, + this.robotState[robotIndex].up, + this.robotState[robotIndex].forward, + this.voxelList[robotIndex].build.list + ); + this.generatePoints(robotIndex); + + //if generated path + if(this.steps[robotIndex].length>0){ + for(var i=0;i<this.steps[robotIndex].length;i++){ + this.step(robotIndex,i); + } + this.goHome[robotIndex]=true; + }else{ + if(log) console.log("gbdfgd "+robotIndex) + + wait=true; + } + + }else if(this.voxelList[robotIndex].build.list.length==0&&!wait){ + if(!this.buildList.done){ + // console.log("jbhb"+robotIndex) + // this.goHome[robotIndex]=true; + setTimeout(function(){ _startMovement(robotIndex,true); }, this.path[robotIndex].timeout+=(this.path[robotIndex].delay*this.waitTime)); + } + // return; + } + + if(this.robotState[robotIndex].leg1Pos.clone().multiplyScalar(this.voxelSpacing[robotIndex]).equals(this.startLocations[robotIndex])){ + this.voxelList[robotIndex].busyGoingHome=false; + } + + //if you have to wait we tigui bokra + if(wait){ + setTimeout(function(){ _startMovement(robotIndex,true); }, this.path[robotIndex].timeout+=(this.path[robotIndex].delay*this.waitTime)); + } + return; + + }else if(goHome){ //go home got get stock + + //////////////////////where to restock? (home or another smaller station)/////////// + var pickUp=-1; + + if(this.robotState[robotIndex].leg1Pos.clone().multiplyScalar(this.voxelSpacing[robotIndex]).equals(this.startLocations[robotIndex])){ + this.voxelList[robotIndex].busyGoingHome=false; + } + if(this.voxelList[robotIndex].busyGoingHome){ + console.log(this.robotState[robotIndex].leg1Pos.clone().multiplyScalar(this.voxelSpacing[robotIndex])); + console.log(this.startLocations[robotIndex]) + } + + if(robotSize>1&&this.buildList.availablePickup[robotSize].length>0){ + if(this.buildList.availablePickup[robotSize][0]==-1){ + if(log) console.log("sscs"+robotIndex) + wait=true; + this.startLocations[robotIndex]=this.depositLocations[robotIndex].clone(); + this.voxelList[robotIndex].busyGoingHome=true; + }else{ + var taskTaken=false; + for(var i=0;i<this.buildList.availablePickup[robotSize].length;i++){ + if(!taskTaken&&this.buildList.availablePickup[robotSize][i]!=-1){ + pickUp=this.buildList.availablePickup[robotSize][i]; + if(pickUp.stockData.length==1){ + if(robotIndex==pickUp.stockData[0]){ + taskTaken=true; + this.startLocations[robotIndex]=this.startLocations[this.buildList.availablePickup[robotSize][i].robotIndex].clone(); + this.buildList.availablePickup[robotSize]=this.buildList.availablePickup[robotSize].slice(0, i).concat(this.buildList.availablePickup[robotSize].slice(i + 1, this.buildList.availablePickup[robotSize].length)); + // this.buildList.availablePickup[robotSize].shift(); + this.voxelList[robotIndex].toDelete=pickUp; + } + }else{ + taskTaken=true; + this.startLocations[robotIndex]=this.startLocations[this.buildList.availablePickup[robotSize][i].robotIndex].clone(); + this.buildList.availablePickup[robotSize]=this.buildList.availablePickup[robotSize].slice(0, i).concat(this.buildList.availablePickup[robotSize].slice(i + 1, this.buildList.availablePickup[robotSize].length)); + // this.buildList.availablePickup[robotSize].shift(); + this.voxelList[robotIndex].toDelete=pickUp; + } + } + } + + } + }else if(robotSize>1){ //no one is busy making smaller bill-es get out of the way + this.startLocations[robotIndex]=this.depositLocations[robotIndex].clone(); + } + // if(wait){ + // setTimeout(function(){ _startMovement(robotIndex,true); }, this.path[robotIndex].timeout+=(this.path[robotIndex].delay*10)); + // return; + + // } + + // if(!wait){ + this.resetPath(robotIndex); + this.reloadVoxel( + robotIndex, + this.robotState[robotIndex].leg1Pos, + this.robotState[robotIndex].leg2Pos, + this.robotState[robotIndex].up, + this.robotState[robotIndex].forward); + this.generatePoints(robotIndex); + + for(var i=0;i<this.steps[robotIndex].length;i++){ + + this.step(robotIndex,i); + } + + this.goHome[robotIndex]=false; + + if(this.steps[robotIndex].length==0){ + + // console.log("nn st") + this.startMovement(robotIndex,false); + } + + + // }else{ + // // console.log("here") + + // setTimeout(function(){ _startMovement(robotIndex,false); }, this.path[robotIndex].timeout+=(this.path[robotIndex].delay*10)); + // } + + return; + + }else{ + console.log("Great job, simulation done!!") + return; + } + + console.log("shouldn't be here"); +} + +Swarm.prototype.voxelBuilderHierarchicalSDF= function(robotIndex,leg1Pos, leg2Pos, up ,forward,availableVoxels){ + + var start=leg1Pos.clone(); + var state; + var succeeded; + var count=0; + + //get point with minimum distance + var min=Infinity; + var minIndex= new THREE.Vector3(0,0,0); + var minIndex1= 0; + var robotSize=this.robotScale[robotIndex]; + + //if there is still voxels in this layer + if(availableVoxels.length>0){ + minIndex= availableVoxels[minIndex1].position.clone().multiplyScalar(this.voxelSpacing[robotIndex]); + minIndex.x=minIndex.x/this.robotScale[robotIndex]; + minIndex.y=minIndex.y/this.robotScale[robotIndex]; + minIndex.z=minIndex.z/this.robotScale[robotIndex]; + + + //change occupancy + if(this.robotScale[robotIndex]>1){//todo change to accommodate for more sizes + //todo check if + minIndex.z=(availableVoxels[minIndex1].position.z+(robotSize-1))*this.voxelSpacing[robotIndex]/this.robotScale[robotIndex]; + + + for (var j=0; j<this.voxelIndexList[robotSize].list.length;j++){ + this.grid[availableVoxels[minIndex1].position.x+this.voxelIndexList[robotSize].list[j].x] + [availableVoxels[minIndex1].position.y+this.voxelIndexList[robotSize].list[j].y] + [availableVoxels[minIndex1].position.z+this.voxelIndexList[robotSize].list[j].z-1]=true; + } + + }else{ + this.grid[availableVoxels[minIndex1].position.x][availableVoxels[minIndex1].position.y][availableVoxels[minIndex1].position.z]=true; + + } + + //remove from list + // this.voxelList[robotIndex].build.list = availableVoxels.slice(0, minIndex1).concat(availableVoxels.slice(minIndex1 + 1, availableVoxels.length)); + this.voxelList[robotIndex].build.list.shift(); + // console.log(this.voxelList[robotIndex]) + + + this.showTargetPosition(robotIndex,minIndex,true); + + state= this.pathPlan(robotIndex,leg1Pos, leg2Pos, up ,forward,minIndex); + + this.robotState[robotIndex].leg1Pos=state[0].clone(); + this.robotState[robotIndex].leg2Pos=state[1].clone(); + this.robotState[robotIndex].up=state[2].clone(); + this.robotState[robotIndex].forward=state[3].clone(); + succeeded=state[4]; + + if(succeeded) + { + return [state[0],state[1],state[2],state[3]]; + + }else + { + console.log("COULDN'T FIND PATH!!!"); + return false; + } + + }else{ + // this.voxelList[robotIndex].assembled=true; + console.log("ROBOT "+robotIndex+" DONEE!!!"); + return false; + } + + console.log("shouldn't be here"); + + +} + +Swarm.prototype.startMovementIROS= function(robotIndex,home){ + // console.log("robot:"+robotIndex+" home:"+home); + + //if not home + if(!home){ + this.resetPath(robotIndex); + this.voxelBuilderIROS( + robotIndex,this.robotState[robotIndex].leg1Pos, + this.robotState[robotIndex].leg2Pos, + this.robotState[robotIndex].up, + this.robotState[robotIndex].forward, + this.voxelSlices[this.robotState[robotIndex].Z] + ); + this.generatePoints(robotIndex); + + //if generated path + if(this.steps[robotIndex].length>0){ + for(var i=0;i<this.steps[robotIndex].length;i++){ + this.step(robotIndex,i); + } + this.goHome[robotIndex]=true; + } + + //update z and rank + if(this.robotState[robotIndex].Z>this.globalZ){ + this.globalZ=this.robotState[robotIndex].Z; + this.globalRank=this.robotState[robotIndex].rank; + }else if(this.robotState[robotIndex].Z<this.globalZ) + { + this.robotState[robotIndex].Z=this.globalZ; + this.robotState[robotIndex].rank=this.globalRank; + }else{ + if(this.robotState[robotIndex].rank>this.globalRank){ + this.globalRank=this.robotState[robotIndex].rank; + }else if(this.robotState[robotIndex].rank<this.globalRank) + { + this.robotState[robotIndex].rank=this.globalRank; + } + } + //if no other z levels + if(this.voxelSlices[this.robotState[robotIndex].Z]!==undefined){ + //if there are voxels + if(this.voxelSlices[this.robotState[robotIndex].Z].length>0){ + if(this.voxelSlicesCount[this.robotState[robotIndex].Z][this.robotState[robotIndex].rank] <this.voxelSlices[this.robotState[robotIndex].Z][this.robotState[robotIndex].rank].length-1){ + this.voxelSlicesCount[this.robotState[robotIndex].Z][this.robotState[robotIndex].rank]++; + // console.log("robot:"+robotIndex+" f"+" home:"+home); + if(!this.goHome[robotIndex]){ + this.startMovement(robotIndex,true); + } + } + else{ + if(this.robotState[robotIndex].rank<this.voxelSlicesCount[this.robotState[robotIndex].Z].length-1){ + this.robotState[robotIndex].rank++; + // this.globalRank++; + // console.log("robot:"+robotIndex+" ff"+" home:"+home); + if(!this.goHome[robotIndex]){ + this.startMovement(robotIndex,true); + } + } + else + { + if(this.robotState[robotIndex].Z<this.voxelSlicesCount.length-1){ + this.robotState[robotIndex].Z++; + this.robotState[robotIndex].rank=0; + + // this.globalZ++; + // this.globalRank=0; + + // console.log("robot:"+robotIndex+" fff"+" home:"+home); + if(!this.goHome[robotIndex]){ + this.startMovement(robotIndex,true); + } + + }else{ + console.log("DONEEE!!!"); + + } + } + } + } + else if(this.robotState[robotIndex].Z<this.voxelSlices.length){ + // console.log("robot:"+robotIndex+" fffff"+" home:"+home); + this.robotState[robotIndex].Z++; + this.robotState[robotIndex].rank=0; + + // this.globalZ++; + // this.globalRank=0; + // console.log("ss"); + this.startMovement(robotIndex,false); + } + }else{ + console.log("DONEE!!!"); + } + + } + //go home + else{ + this.resetPath(robotIndex); + this.reloadVoxel( + robotIndex, + this.robotState[robotIndex].leg1Pos, + this.robotState[robotIndex].leg2Pos, + this.robotState[robotIndex].up, + this.robotState[robotIndex].forward); + this.generatePoints(robotIndex); + + for(var i=0;i<this.steps[robotIndex].length;i++){ + this.step(robotIndex,i); + } + + this.goHome[robotIndex]=false; + + if(this.steps[robotIndex].length==0){ + // console.log("nn st") + this.startMovement(robotIndex,false); + } + + } + +} + +Swarm.prototype.startMovementDirections= function(robotIndex){ + this.goHome[robotIndex]=false; + this.resetPath(robotIndex); + this.getStepsFromDir(robotIndex); + this.generatePoints(robotIndex); + // console.log(this.path[robotIndex].points) + + //if generated path + if(this.steps[robotIndex].length>0){ + for(var i=0;i<this.steps[robotIndex].length;i++){ + this.step(robotIndex,i); + } + } + +} + +Swarm.prototype.closestStartLocation= function(robotPosition){ + robotPosition.x=robotPosition.x*this.spacing; + robotPosition.y=robotPosition.y*this.spacing; + robotPosition.z=robotPosition.z*this.spacing; + var closest=0; + var min=robotPosition.distanceTo(this.startLocations[0]); + for (var i=0;i< this.startLocations.length;i++){ + if(robotPosition.distanceTo(this.startLocations[i])<min) + { + min=robotPosition.distanceTo(this.startLocations[i]); + closest=i; + } + } + return closest; +} + +Swarm.prototype.reloadVoxel= function(robotIndex,leg1Pos, leg2Pos, up ,forward){ //go home + var succeeded; + + this.showTargetPosition(robotIndex,leg1Pos.clone(),false); + + + if(this.robotScale[robotIndex]==2&&this.buildType!="sdfList"&&this.buildType!="sdfList1"){ //if rank 2 pickup from predefined places + // state= this.pathPlan(robotIndex,leg1Pos, leg2Pos, up ,forward,this.voxelList[robotIndex].pickupList[0].clone()); + // this.voxelList[robotIndex].pickupList.shift(); //remove defined location + state= this.pathPlan(robotIndex,leg1Pos, leg2Pos, up ,forward,this.startLocations[robotIndex]); + + }else{ + state= this.pathPlan(robotIndex,leg1Pos, leg2Pos, up ,forward,this.startLocations[robotIndex]); + //closest: + // state= this.pathPlan(robotIndex,leg1Pos, leg2Pos, up ,forward,this.startLocations[this.closestStartLocation(leg1Pos.clone())]); + } + + + this.robotState[robotIndex].leg1Pos=state[0].clone(); + this.robotState[robotIndex].leg2Pos=state[1].clone(); + this.robotState[robotIndex].up=state[2].clone(); + this.robotState[robotIndex].forward=state[3].clone(); + succeeded=state[4]; + + if(succeeded) + { + return [state[0],state[1],state[2],state[3]]; + + }else + { + // console.log("COULDN'T FIND PATH!!!"); + return false; + } + + +} + +Swarm.prototype.voxelBuilderIROS= function(robotIndex,leg1Pos, leg2Pos, up ,forward,availableVoxels){ + // var availableVoxels=this.voxelSlices[this.robotState[robotIndex].Z]; + + var start=leg1Pos.clone(); + var state; + var succeeded; + var count=0; + + //get point with minimum distance + var min=Infinity; + var minIndex= new THREE.Vector3(0,0,0); + + //if there is still voxels in this layer + if(availableVoxels !== undefined){ + if(availableVoxels.length>0){ + //for all available voxels + for(var i=0;i<availableVoxels[this.robotState[robotIndex].rank].length;i++){ + //if no voxel + if(!this.voxelAt(availableVoxels[this.robotState[robotIndex].rank][i].clone().multiplyScalar(1/this.voxelSpacing[robotIndex]))){ + //find min distance + if(start.distanceTo(availableVoxels[this.robotState[robotIndex].rank][i])<min){ + min=start.distanceTo(availableVoxels[this.robotState[robotIndex].rank][i]); + minIndex=availableVoxels[this.robotState[robotIndex].rank][i]; + } + } + } + //change occupancy + this.grid[minIndex.x/this.voxelSpacing[robotIndex]][minIndex.y/this.voxelSpacing[robotIndex]][minIndex.z/this.voxelSpacing[robotIndex]]=true; + + this.showTargetPosition(robotIndex,minIndex,true); + + state= this.pathPlan(robotIndex,leg1Pos, leg2Pos, up ,forward,minIndex); + + this.robotState[robotIndex].leg1Pos=state[0].clone(); + this.robotState[robotIndex].leg2Pos=state[1].clone(); + this.robotState[robotIndex].up=state[2].clone(); + this.robotState[robotIndex].forward=state[3].clone(); + succeeded=state[4]; + + if(succeeded) + { + return [state[0],state[1],state[2],state[3]]; + + }else + { + // console.log("COULDN'T FIND PATH!!!"); + return false; + } + + }else{ + return false; + } + }else{ + console.log("DONEE!!!"); + return false; + } + +} + +Swarm.prototype.startMovementHierarchicalSDF= function(robotIndex,goHome){ + + var wait=false; + var robotSize=this.robotScale[robotIndex]; + var log=false; + + //if not home + if(!goHome && !this.buildList.done){ + + //////////////////////////check if task is pending///////////////// + + //if bigger size bill-e at pickup site and ready to delete in situ + if(robotSize>1&& this.voxelList[robotIndex].toDelete.robotIndex!=-1){ + // console.log(robotSize) + // console.log(this.voxelList[robotIndex].toDelete.stockData) + + // console.log(this.startLocations[robotIndex].equals(this.startLocations[this.voxelList[robotIndex].toDelete.robotIndex])) + if(this.robotState[robotIndex].leg1Pos.clone().multiplyScalar(this.voxelSpacing[robotIndex]).equals(this.startLocations[robotIndex])&&this.startLocations[robotIndex].equals(this.startLocations[this.voxelList[robotIndex].toDelete.robotIndex])){ + var pickUp=this.voxelList[robotIndex].toDelete.robotIndex; + + if(this.voxelList[robotIndex].toDelete.stockData.length>1 ){ + //delete voxels from scene + for (var j=0; j<this.voxelIndexList[2].list.length;j++){ + // var loc=this.voxelIndexList[2].list[j].clone() + // .add(this.startLocations[pickUp].clone().multiplyScalar(1/this.voxelSpacing[pickUp])) + // .add(this.inSituAdjustment[pickUp]); + var loc=this.voxelIndexList[2].list[j].clone() + .add(this.startLocations[pickUp].clone().multiplyScalar(1/this.voxelSpacing[pickUp])) + .add(this.inSituAdjustment[pickUp].clone().multiplyScalar(1/this.robotScale[pickUp])); + + this.grid[loc.x][loc.y][loc.z]=false; + + var name='['+loc.x+','+loc.y+','+loc.z+']'; + var obj=this.scene.getObjectByName(name); + this.scene.remove(obj); + + } + + var indexZ= this.voxelList[robotIndex].toDelete.stockData[0]; + var indexSize=this.voxelList[robotIndex].toDelete.stockData[1]; + var indexSDF= this.voxelList[robotIndex].toDelete.stockData[2]; + var indexCube=this.voxelList[robotIndex].toDelete.stockData[3]; + //flag that it is picked up + this.buildList.listZ[indexZ].listSize[indexSize].listSDF[indexSDF].listCubes[indexCube].stockPickedUp=true; + //make smaller billl-e not busy + this.voxelList[pickUp].busy=false; + this.startLocations[robotIndex]=this.depositLocations[robotIndex].clone(); + //remove fag that arrived to pickup + this.voxelList[robotIndex].toDelete={stockData:[],robotIndex:-1}; + + //now get task to build voxel + this.buildList.listZ[indexZ].listSize[indexSize].listSDF[indexSDF].listCubes[indexCube].done=true; + //todo make sure that works.. maybe final location is not the one + this.voxelList[robotIndex].build.list.push({ position:this.buildList.listZ[indexZ].listSize[indexSize].listSDF[indexSDF].listCubes[indexCube].position.clone(), + stockBuilt:true}); + + }else{ + + var indexBiggerRobot=this.voxelList[robotIndex].toDelete.stockData[0]; + if(indexBiggerRobot==robotIndex){ + //delete voxels from scene + for (var j=0; j<this.voxelIndexList[2].list.length;j++){ + // var loc=this.voxelIndexList[2].list[j].clone() + // .add(this.startLocations[pickUp].clone().multiplyScalar(1/this.voxelSpacing[pickUp])) + // .add(this.inSituAdjustment[pickUp]); + var loc=this.voxelIndexList[2].list[j].clone() + .add(this.startLocations[pickUp].clone().multiplyScalar(1/this.voxelSpacing[pickUp])) + .add(this.inSituAdjustment[pickUp].clone().multiplyScalar(1/this.robotScale[pickUp])); + + this.grid[loc.x][loc.y][loc.z]=false; + + var name='['+loc.x+','+loc.y+','+loc.z+']'; + var obj=this.scene.getObjectByName(name); + + + this.scene.remove(obj); + + } + + indexBiggerRobot=robotIndex; + var taskGiven=false; + for(var i=0;i<this.voxelList[indexBiggerRobot].build.list.length;i++){ + if(!this.voxelList[indexBiggerRobot].build.list[i].stockBuilt && !taskGiven){ + // console.log(i) + // console.log(indexBiggerRobot) + + taskGiven=true; + //make smaller bill-e not busy + this.voxelList[pickUp].busy=false; + this.startLocations[robotIndex]=this.depositLocations[robotIndex].clone(); + //remove fag that arrived to pickup + this.voxelList[robotIndex].toDelete={stockData:[],robotIndex:-1}; + + this.voxelList[indexBiggerRobot].build.list[i].stockBuilt=true; + + //todo make sure that works.. maybe final location is not the one + // this.voxelList[robotIndex].build.list.push({ position:this.voxelList[indexBiggerRobot].build.list[i].position.clone(), + // stockBuilt:true}); + + + } + + } + if(!taskGiven){ + // if(log) + if(log) console.log("dcvszv"+robotIndex) + + wait=true; + } + + } + } + + } + + } + + + + //if smaller size bill-e finished building in situ construction and flag available for pickup + //if voxelList has the flag + if(this.voxelList[robotIndex].build.stockData.length>0 &&this.voxelList[robotIndex].build.list.length==0){ + if(this.voxelList[robotIndex].build.stockData.length>1){ + var indexZ=this.voxelList[robotIndex].build.stockData[0]; + var indexSize=this.voxelList[robotIndex].build.stockData[1]; + var indexSDF=this.voxelList[robotIndex].build.stockData[2]; + var indexCube=this.voxelList[robotIndex].build.stockData[3]; + + this.buildList.listZ[indexZ].listSize[indexSize].listSDF[indexSDF].listCubes[indexCube].stockBuilt=true; + + this.voxelList[robotIndex].build.stockData=[]; + var found=false; + for(var i=0;i<this.buildList.availablePickup[robotSize*2].length;i++){ //change available pickup from busy to done + if(this.buildList.availablePickup[robotSize*2][i]==-1 && !found){ + this.buildList.availablePickup[robotSize*2][i]={stockData:[indexZ,indexSize,indexSDF,indexCube],robotIndex:robotIndex}; + found=true; + } + } + if(log) console.log("dvsv"+robotIndex) + + // wait=true; + + }else{ + var indexBiggerRobot=this.voxelList[robotIndex].build.stockData[0]; + this.voxelList[robotIndex].build.stockData=[]; + + var found=false; + for(var i=0;i<this.buildList.availablePickup[robotSize*2].length;i++){ //change available pickup from busy to done + if(this.buildList.availablePickup[robotSize*2][i]==-1 && !found){ + this.buildList.availablePickup[robotSize*2][i]={stockData:[indexBiggerRobot],robotIndex:robotIndex}; + found=true; + } + } + if(log) console.log("xczzc"+robotIndex) + + // wait=true; + + } + + } + + //if stock needed to be built for intermediate bill-es + if(!wait && this.voxelList[robotIndex].build.list.length==0 &&this.buildList.listToBuild[robotSize].length>0&&!this.voxelList[robotIndex].busy&&!this.voxelList[robotIndex].busyGoingHome){ + //build in situ + //hardcoded 2 as it will always be building 8 voxels regardless of the size + var stockBuilt=false; + if(robotSize==1){ + stockBuilt=true; + } + for (var j=0; j<this.voxelIndexList[2].list.length;j++){ + // this.voxelList[robotIndex].build.list.push({ + // position:this.voxelIndexList[2].list[j].clone() + // .add(this.startLocations[robotIndex].clone().multiplyScalar(1/this.voxelSpacing[robotIndex])) + // .add(this.inSituAdjustment[robotIndex]), + // stockBuilt:stockBuilt + // }); + this.voxelList[robotIndex].build.list.push({ + position:this.voxelIndexList[2].list[j].clone().add(new THREE.Vector3(0,0,-1)).multiplyScalar(robotSize).add(new THREE.Vector3(0,0,1)) + .add(this.startLocations[robotIndex].clone().multiplyScalar(1/this.voxelSpacing[robotIndex]*robotSize)) + .add(this.inSituAdjustment[robotIndex].clone().multiplyScalar(1)), + stockBuilt:stockBuilt + }); + } + this.buildList.availablePickup[robotSize*2].push(-1); //for bigger robot to wait and not go home + this.voxelList[robotIndex].build.stockData=[this.buildList.listToBuild[robotSize][0]];//push index at the end to flag when it's done + // console.log(this.buildList.listToBuild[robotSize][0]) + this.voxelList[robotIndex].busy=true; + + this.buildList.listToBuild[robotSize].shift(); + + } + + ////////////////check for new tasks////////////////////////////////////// + //if have no assigned voxels try to assign + if( !wait && this.voxelList[robotIndex].build.list.length==0&& !this.voxelList[robotIndex].busy&&!this.voxelList[robotIndex].busyGoingHome&& !this.buildList.done){ + //find current bin + var binZ=this.buildList.listZ[this.buildList.currentZIndex]; + var binSize=binZ.listSize[binZ.currentSizeIndex]; + var binSDF=binSize.listSDF[binSize.currentSDFIndex]; + + var indexZ=this.buildList.currentZIndex; + var indexSize=binZ.currentSizeIndex; + var indexSDF=binSize.currentSDFIndex; + + var maxIndexZ=this.buildList.maxZIndex; + var maxIndexSize=binZ.maxSizeIndex; + var maxIndexSDF=binSize.maxSDFIndex; + + // if robot size smaller than target bin size + if(robotSize<binSDF.size){ + if(robotSize==binSDF.size/2){ + var gotTask=false; + for(var i=0;i<binSDF.listCubes.length;i++){ + if(!binSDF.listCubes[i].done&&!binSDF.listCubes[i].stockAssigned &&!gotTask){ + gotTask=true; + binSDF.listCubes[i].stockAssigned=true; + this.buildList.listZ[indexZ].listSize[indexSize].listSDF[indexSDF].listCubes[i].stockAssigned=true; + //build in situ + //hardcoded 2 as it will always be building 8 voxels regardless of the size + var stockBuilt=false; + if(robotSize==1){ + stockBuilt=true; + } + + for (var j=0; j<this.voxelIndexList[2].list.length;j++){ + this.voxelList[robotIndex].build.list.push({ + position:this.voxelIndexList[2].list[j].clone().add(new THREE.Vector3(0,0,-1)).multiplyScalar(robotSize).add(new THREE.Vector3(0,0,1)) + .add(this.startLocations[robotIndex].clone().multiplyScalar(1/this.voxelSpacing[robotIndex]*robotSize)) + .add(this.inSituAdjustment[robotIndex].clone().multiplyScalar(1)), + stockBuilt:stockBuilt + }); + } + + this.buildList.availablePickup[binSDF.size].push(-1); //for bigger robot to wait and not go home + this.voxelList[robotIndex].build.stockData=[indexZ,indexSize,indexSDF,i];//push index at the end to flag when it's done + this.voxelList[robotIndex].busy=true; + + //if not size 1 go back later as no stock available + // flag for smaller robots to build stocks + if(robotSize>1){ + //add them in list to build + if(log) console.log("vdsvs"+robotIndex) + + wait=true; + for(var i=0;i<8;i++){ + this.buildList.listToBuild[robotSize/2.0].push(robotIndex); //no need to put robotIndex but why not + } + } + } + } + if(!gotTask){ + if(log) console.log("dssvd"+robotIndex) + wait=true; + } + + }else{ + if(log) console.log("awfawf"+robotIndex) + wait=true; + } + + }else if(binSDF.size==robotSize){ //if same size + var gotTask=false; + var done=true; + for(var i=0;i<binSDF.listCubes.length;i++){ + if(!binSDF.listCubes[i].done){ + done=false; + } + if(!binSDF.listCubes[i].done&&binSDF.listCubes[i].stockBuilt &&!gotTask){ + gotTask=true; + binSDF.listCubes[i].done=true; + this.buildList.listZ[indexZ].listSize[indexSize].listSDF[indexSDF].listCubes[i].done=true; + this.voxelList[robotIndex].build.list.push({position:binSDF.listCubes[i].position.clone(),stockBuilt:true}); + } + } + if(!gotTask){ + if(log) console.log("fefswv"+robotIndex) + wait=true; + } + + //update list + if(done){ + binSDF.done=true; + this.buildList.listZ[indexZ].listSize[indexSize].listSDF[indexSDF].done=true; + binSize.currentSDFIndex++; + console.log("Layer "+(maxIndexZ-indexZ)+", size "+(maxIndexSize-indexSize)+", sdf "+(maxIndexSDF-indexSDF)+" done!"); + if(binSize.currentSDFIndex>=binSize.maxSDFIndex){ + binSize.done=true; + this.buildList.listZ[indexZ].listSize[indexSize].done=true; + console.log("Layer "+(maxIndexZ-indexZ)+", size "+(maxIndexSize-indexSize)+" done!"); + binZ.currentSizeIndex++; + if(binZ.currentSizeIndex>=binZ.maxSizeIndex){ + binZ.done=true; + this.buildList.listZ[indexZ].done=true; + console.log("Layer "+(maxIndexZ-indexZ)+" done!"); + this.buildList.currentZIndex++; + if(this.buildList.currentZIndex>=this.buildList.maxZIndex){ + this.buildList.done=true; + console.log("Simulation Done!!!!!!!!!!!!!!") + } + } + } + } + }else{ + if(log) console.log("fdbddfbd"+robotIndex) + wait=true; //later change for two sizes bigger + } + } + + //if has task but stock not ready + if(this.voxelList[robotIndex].build.list.length> 0&& !this.voxelList[robotIndex].build.list[0].stockBuilt){ + if(log) console.log("bhhbj"+robotIndex) + wait=true; + } + + ///////////////////////////if there is task go on///////////////// + //if have assigned voxel + if(!wait && this.voxelList[robotIndex].build.list.length>0){ + this.resetPath(robotIndex); + this.voxelBuilderHierarchicalSDF( + robotIndex,this.robotState[robotIndex].leg1Pos, + this.robotState[robotIndex].leg2Pos, + this.robotState[robotIndex].up, + this.robotState[robotIndex].forward, + this.voxelList[robotIndex].build.list + ); + this.generatePoints(robotIndex); + + //if generated path + if(this.steps[robotIndex].length>0){ + for(var i=0;i<this.steps[robotIndex].length;i++){ + this.step(robotIndex,i); + } + this.goHome[robotIndex]=true; + }else{ + if(log) console.log("gbdfgd "+robotIndex) + + wait=true; + } + + }else if(this.voxelList[robotIndex].build.list.length==0&&!wait){ + if(!this.buildList.done){ + // console.log("jbhb"+robotIndex) + // this.goHome[robotIndex]=true; + setTimeout(function(){ _startMovement(robotIndex,true); }, this.path[robotIndex].timeout+=(this.path[robotIndex].delay*this.waitTime)); + } + // return; + } + + if(this.robotState[robotIndex].leg1Pos.clone().multiplyScalar(this.voxelSpacing[robotIndex]).equals(this.startLocations[robotIndex])){ + this.voxelList[robotIndex].busyGoingHome=false; + } + + //if you have to wait we tigui bokra + if(wait){ + setTimeout(function(){ _startMovement(robotIndex,true); }, this.path[robotIndex].timeout+=(this.path[robotIndex].delay*this.waitTime)); + } + return; + + }else if(goHome){ //go home got get stock + + //////////////////////where to restock? (home or another smaller station)/////////// + var pickUp=-1; + + if(this.robotState[robotIndex].leg1Pos.clone().multiplyScalar(this.voxelSpacing[robotIndex]).equals(this.startLocations[robotIndex])){ + this.voxelList[robotIndex].busyGoingHome=false; + } + if(this.voxelList[robotIndex].busyGoingHome){ + console.log(this.robotState[robotIndex].leg1Pos.clone().multiplyScalar(this.voxelSpacing[robotIndex])); + console.log(this.startLocations[robotIndex]) + } + + if(robotSize>1&&this.buildList.availablePickup[robotSize].length>0){ + if(this.buildList.availablePickup[robotSize][0]==-1){ + if(log) console.log("sscs"+robotIndex) + wait=true; + this.startLocations[robotIndex]=this.depositLocations[robotIndex].clone(); + this.voxelList[robotIndex].busyGoingHome=true; + }else{ + var taskTaken=false; + for(var i=0;i<this.buildList.availablePickup[robotSize].length;i++){ + if(!taskTaken&&this.buildList.availablePickup[robotSize][i]!=-1){ + pickUp=this.buildList.availablePickup[robotSize][i]; + if(pickUp.stockData.length==1){ + if(robotIndex==pickUp.stockData[0]){ + taskTaken=true; + this.startLocations[robotIndex]=this.startLocations[this.buildList.availablePickup[robotSize][i].robotIndex].clone(); + this.buildList.availablePickup[robotSize]=this.buildList.availablePickup[robotSize].slice(0, i).concat(this.buildList.availablePickup[robotSize].slice(i + 1, this.buildList.availablePickup[robotSize].length)); + // this.buildList.availablePickup[robotSize].shift(); + this.voxelList[robotIndex].toDelete=pickUp; + } + }else{ + taskTaken=true; + this.startLocations[robotIndex]=this.startLocations[this.buildList.availablePickup[robotSize][i].robotIndex].clone(); + this.buildList.availablePickup[robotSize]=this.buildList.availablePickup[robotSize].slice(0, i).concat(this.buildList.availablePickup[robotSize].slice(i + 1, this.buildList.availablePickup[robotSize].length)); + // this.buildList.availablePickup[robotSize].shift(); + this.voxelList[robotIndex].toDelete=pickUp; + } + } + } + + } + }else if(robotSize>1){ //no one is busy making smaller bill-es get out of the way + this.startLocations[robotIndex]=this.depositLocations[robotIndex].clone(); + } + // if(wait){ + // setTimeout(function(){ _startMovement(robotIndex,true); }, this.path[robotIndex].timeout+=(this.path[robotIndex].delay*10)); + // return; + + // } + + // if(!wait){ + this.resetPath(robotIndex); + this.reloadVoxel( + robotIndex, + this.robotState[robotIndex].leg1Pos, + this.robotState[robotIndex].leg2Pos, + this.robotState[robotIndex].up, + this.robotState[robotIndex].forward); + this.generatePoints(robotIndex); + + for(var i=0;i<this.steps[robotIndex].length;i++){ + + this.step(robotIndex,i); + } + + this.goHome[robotIndex]=false; + + if(this.steps[robotIndex].length==0){ + + // console.log("nn st") + this.startMovement(robotIndex,false); + } + + + // }else{ + // // console.log("here") + + // setTimeout(function(){ _startMovement(robotIndex,false); }, this.path[robotIndex].timeout+=(this.path[robotIndex].delay*10)); + // } + + return; + + }else{ + console.log("Great job, simulation done!!") + return; + } + + console.log("shouldn't be here"); +} diff --git a/recursive_swarm/js/swarm_path.js b/recursive_swarm/js/swarm_path.js new file mode 100644 index 0000000000000000000000000000000000000000..1ebd3191c1dc00d6d4fdbddb158f3f125a9085c2 --- /dev/null +++ b/recursive_swarm/js/swarm_path.js @@ -0,0 +1,357 @@ +// Amira Abdel-Rahman +// (c) Massachusetts Institute of Technology 2020 + +//////////////////////////path planing/////////////////////////// +Swarm.prototype.pathPlan= function(robotIndex,leg1Pos, leg2Pos, up ,forward,targetPos){ + // console.log(targetPos) + + + // if(this.robotScale[robotIndex]==2){ + // console.log(leg1Pos); + // console.log(targetPos); + // } + if(this.voxelAt(robotIndex,targetPos.clone().multiplyScalar(1/this.voxelSpacing[robotIndex]))){ + var succeded=false; + var p0=this.findShortestPath(robotIndex,leg1Pos.clone(), leg2Pos.clone(), up.clone(),forward.clone(), targetPos); + succeded=p0[4]; + this.steps[robotIndex]=this.steps[robotIndex].concat(p0[5]); + if(!succeded){ + + console.log("Robot "+robotIndex+" stuck!!!!!") + console.log(targetPos) + } + return [p0[0] , p0[1] , p0[2] , p0[3] , true]; + if(!succeded) + { + // console.log("see path from neighbours"); + var neighbours=this.getNeighbors(targetPos); + + for(var i=0;i<neighbours.length;i++) + { + var p=this.findShortestPath(robotIndex,leg1Pos.clone(), leg2Pos.clone(), up.clone(),forward.clone(),neighbours[i]); + succeded=p[4]; + if(succeded) + { + var stepsFirst=p[5].slice(); + var p1=this.findShortestPath(robotIndex,p[0], p[1], p[2],p[3],targetPos); + succeded=p[4]; + if(succeded) + { + for(var j=0;j<this.steps[robotIndex].length;j++) + { + stepsFirst.push(p1[5][j]); + } + + this.steps[robotIndex]=this.steps[robotIndex].concat(stepsFirst.slice()); + return [p[0] , p[1] , p[2] , p[3] , true]; + } + } + } + return [leg1Pos, leg2Pos, up ,forward , false]; + } + + } + else + { + console.log("TARGET VOXEL DOESN'T EXIST!"); + console.log(targetPos) + return [leg1Pos, leg2Pos, up ,forward , false]; + + } + console.log("Shouldn't be here"); + + +} + +Swarm.prototype.findShortestPath= function(robotIndex,leg1Pos, leg2Pos, up,forward, targetPos){ + var stepsTemp=[]; + var stepsAlternative=[]; + var orderAlternatives=[[0,1,2],[0,2,1],[1,2,0],[1,0,2],[2,1,0],[2,0,1]]; + for(var i=0;i<orderAlternatives.length;i++) + { + stepsAlternative.push(this.findPath(robotIndex,leg1Pos.clone(), leg2Pos.clone(), up.clone(),forward.clone(), targetPos, orderAlternatives[i]).slice()); + } + stepsAlternative.sort(function(a, b){ + // ASC -> a.length - b.length + // DESC -> b.length - a.length + return a[4].length - b[4].length; + }); + stepsTemp=stepsAlternative[0][4].slice(); + if(stepsTemp.length>this.stepsCap) + { + stepsTemp=[]; + console.log("CAN'T FIND ANY PATH TO THIS POINT"); + return [stepsAlternative[0][0],stepsAlternative[0][1],stepsAlternative[0][2],stepsAlternative[0][3],false,stepsTemp]; + }else + { + return [stepsAlternative[0][0],stepsAlternative[0][1],stepsAlternative[0][2],stepsAlternative[0][3],true,stepsTemp]; + } +} + +Swarm.prototype.findPath= function(robotIndex,leg1Pos, leg2Pos, up, forward, targetPos, order){ + var logg=false; + if (logg) console.log(order); + var stepsTemp=[]; + // leg1Pos.multiplyScalar(1/this.voxelSpacing[robotIndex]); + // leg2Pos.multiplyScalar(1/this.voxelSpacing[robotIndex]); + var difference=this.getDifference(robotIndex,leg1Pos, targetPos); + var forwardAlt=new THREE.Vector3(0,0,0); + var pos=leg1Pos.clone(); + var error=1000; + var counts=0; + + + while(difference[0]!=0||difference[1]!=0||difference[2]!=0 &&counts<error){ + for(var count=0;count<3;count++){ + var i= order[count]; + var startingLeg1Pos=leg1Pos.clone(); + var startingLeg2Pos=leg2Pos.clone(); + var exit=false; + var previousDifference=Math.pow(10, 1000);//infinity + + if(i==0) + { + forwardAlt=new THREE.Vector3(-difference[0],0,0); + forwardAlt.normalize(); + if(up.x==0) + { + forward=forwardAlt.clone(); + } + }else if(i==1) + { + forwardAlt=new THREE.Vector3(0,-difference[1],0); + forwardAlt.normalize(); + if(up.y==0) + { + forward=forwardAlt.clone(); + } + }else if(i==2) + { + forwardAlt=new THREE.Vector3(0,0,-difference[2]); + forwardAlt.normalize(); + if(up.z==0) + { + forward=forwardAlt.clone(); + } + } + var counts2=0; + + while (Math.abs(difference[i])>0 && !exit && counts2<error){ + + if(this.voxelAt(robotIndex,pos.clone().add(forward.clone().add(up)))) + { + if( this.voxelAt(robotIndex, pos.clone().add( forward.clone().add(up.clone().add(up)) ))) + { + //step there //rotate convex + if (logg) console.log("rotate convex"); + leg1Pos=pos.clone().add( forward.clone().add(up.clone().add(up))); + leg2Pos=pos.clone().add(forward.clone().add(up)); + var temp=up.clone(); + up= new THREE.Vector3(0,0,0).sub(forward); + forward=temp.clone(); + stepsTemp.push([leg1Pos.clone().multiplyScalar(this.voxelSpacing[robotIndex]),leg2Pos.clone().multiplyScalar(this.voxelSpacing[robotIndex]),up]); + difference=this.getDifference(robotIndex,leg1Pos, targetPos); + pos=leg1Pos.clone(); + } + else //if pos+forward+up+up empty + { + //step there //step up + if (logg) console.log("step up"); + leg2Pos=leg1Pos.clone(); + leg1Pos=pos.clone().add(forward.clone().add(up)); + stepsTemp.push([leg1Pos.clone().multiplyScalar(this.voxelSpacing[robotIndex]),leg2Pos.clone().multiplyScalar(this.voxelSpacing[robotIndex]),up]); + difference=this.getDifference(robotIndex,leg1Pos, targetPos); + pos=leg1Pos.clone(); + } + } + else //if(pos +foward +up) empty + { + if (this.voxelAt(robotIndex,pos.clone().add(forward.clone()))) + { + //step there //step forward + if (logg) console.log("step forward"); + leg2Pos=leg1Pos.clone(); + leg1Pos=pos.clone().add(forward.clone()); + stepsTemp.push([leg1Pos.clone().multiplyScalar(this.voxelSpacing[robotIndex]),leg2Pos.clone().multiplyScalar(this.voxelSpacing[robotIndex]),up]); + difference=this.getDifference(robotIndex,leg1Pos, targetPos); + pos=leg1Pos.clone(); + } + else //if pos+forward empty + { + if(this.voxelAt(robotIndex,pos.clone().add(forward.clone().sub(up)))) + { + //step there //step down + if (logg) console.log("step down"); + leg2Pos=leg1Pos.clone(); + leg1Pos=pos.clone().add(forward.clone().sub(up)); + stepsTemp.push([leg1Pos.clone().multiplyScalar(this.voxelSpacing[robotIndex]),leg2Pos.clone().multiplyScalar(this.voxelSpacing[robotIndex]),up]); + difference=this.getDifference(robotIndex,leg1Pos, targetPos); + pos=leg1Pos.clone(); + } + else if (this.voxelAt(robotIndex,pos.clone().sub(up))) //pos-up full + { + if (logg) console.log("rotate concave"); + leg2Pos=leg1Pos.clone(); + leg1Pos=pos.clone().sub(up); + var temp=up.clone(); + up= forward.clone(); + forward=new THREE.Vector3(0,0,0).sub(temp); + stepsTemp.push([leg1Pos.clone().multiplyScalar(this.voxelSpacing[robotIndex]),leg2Pos.clone().multiplyScalar(this.voxelSpacing[robotIndex]),up]); + difference=this.getDifference(robotIndex,leg1Pos, targetPos); + pos=leg1Pos.clone(); + } + else + { + if (logg) console.log("fail"); + exit=true; + } + } + } + + if( previousDifference<0 &&difference[i]<=0 ) + { + + if(Math.abs(previousDifference)<Math.abs(difference[i])) + { + exit=true; + if (logg) console.log("exit"); + } + + } + else + { + if(previousDifference<Math.abs(difference[i])) + { + exit=true; + if (logg) console.log("exit"); + } + + } + previousDifference=difference[i]; + if(stepsTemp.length>this.stepsCap)//cap number of steps in case of failure // change later based on complexity of the model + { + exit=true; + if (logg) console.log("Too many steps,choose another alternative"); + } + counts2++; + if(counts2>=error){ + console.log("errrooooorrr robot "+robotIndex+"!!!"); + } + + } + + + } + if(stepsTemp.length>this.stepsCap)//cap number of steps in case of failure // change later based on complexity of the model + { + difference[0]=0; + difference[1]=0; + difference[2]=0; + if (logg) console.log("Too many steps,choose another alternative"); + } + counts++; + if(counts>=error){ + difference[0]=0; + difference[1]=0; + difference[2]=0; + console.log("errrooooorrr robot "+robotIndex+"!!!"); + } + + } + return [leg1Pos, leg2Pos, up,forward,stepsTemp]; + +} + +Swarm.prototype.voxelAt= function(location){ + if(location.x<0||location.y<0||location.z<0||location.x>=this.gridSize||location.y>=this.gridSize||location.z>=this.gridSize) + { + return false; + } + return this.grid[location.x][location.y][location.z]; +} + +Swarm.prototype.voxelAt= function(robotIndex,loc){ + var location=loc.clone(); + location.x=location.x*this.robotScale[robotIndex]; + location.y=location.y*this.robotScale[robotIndex]; + location.z=location.z*this.robotScale[robotIndex]; + // location.z=(location.z-1)*this.robotScale[robotIndex]+1; + + + // console.log(location.z); + + if(location.x<0||location.y<0||location.z<0||location.x>=this.gridSize||location.y>=this.gridSize||location.z>=this.gridSize) + { + return false; + } + if(this.robotScale[robotIndex]>1){ + + // location.z=loc.z*this.robotScale[robotIndex]; + // if(location.z<0){ + // location.z=0; + // } + // if(!this.grid[location.x][location.y][location.z]){ + // console.log(location); + // } + + } + return this.grid[location.x][location.y][location.z]; +} + +Swarm.prototype.getDifference= function(robotIndex,location, targetPos){ + var diff=[]; + diff.push(location.x-targetPos.x/this.voxelSpacing[robotIndex]);//0 + diff.push(location.y-targetPos.y/this.voxelSpacing[robotIndex]);//1 + diff.push(location.z-targetPos.z/this.voxelSpacing[robotIndex]);//2 + return diff.slice(); +} + +Swarm.prototype.getNeighbors= function(targetPos){ + var n=[]; + var t=targetPos.clone().multiplyScalar(1/this.spacing); + // for(var i=-1;i<2;i++) + // { + // for(var j=-1;j<2;j++) + // { + // for(var k=-1;k<2;k++) + // { + // var tt=new THREE.Vector3(t.x+i,t.y+j,t.z+k); + // if(!(tt.equals(t)) && this.voxelAt(tt) ) + // { + // n.push(new THREE.Vector3(tt*this.spacing,tt*this.spacing,tt*this.spacing)); + // } + // } + // } + // } + var tt=new THREE.Vector3(t.x+1,t.y,t.z); + if(this.voxelAt(tt)) + { + n.push(new THREE.Vector3(tt.x*this.spacing,tt.y*this.spacing,tt.z*this.spacing)); + } + tt=new THREE.Vector3(t.x-1,t.y,t.z); + if(this.voxelAt(tt)) + { + n.push(new THREE.Vector3(tt.x*this.spacing,tt.y*this.spacing,tt.z*this.spacing)); + } + tt=new THREE.Vector3(t.x,t.y+1,t.z); + if(this.voxelAt(tt)) + { + n.push(new THREE.Vector3(tt.x*this.spacing,tt.y*this.spacing,tt.z*this.spacing)); + } + tt=new THREE.Vector3(t.x,t.y-1,t.z); + if(this.voxelAt(tt)) + { + n.push(new THREE.Vector3(tt.x*this.spacing,tt.y*this.spacing,tt.z*this.spacing)); + } + tt=new THREE.Vector3(t.x,t.y,t.z+1); + if(this.voxelAt(tt)) + { + n.push(new THREE.Vector3(tt.x*this.spacing,tt.y*this.spacing,tt.z*this.spacing)); + } + tt=new THREE.Vector3(t.x,t.y,t.z-1); + if(this.voxelAt(tt)) + { + n.push(new THREE.Vector3(tt.x*this.spacing,tt.y*this.spacing,tt.z*this.spacing)); + } + return n; +} \ No newline at end of file diff --git a/recursive_swarm/js/swarm_step.js b/recursive_swarm/js/swarm_step.js new file mode 100644 index 0000000000000000000000000000000000000000..637fb75ad99be15de303b4dadab298ec90a1570d --- /dev/null +++ b/recursive_swarm/js/swarm_step.js @@ -0,0 +1,493 @@ +// Amira Abdel-Rahman +// (c) Massachusetts Institute of Technology 2020 + +////////////////////Change Fixed end//////////////////////////// +Swarm.prototype.changeEnd= function(robotIndex){ + //TODO: send fix end and unfix end to code + if(this.leg[robotIndex]==2) + { + //later output package + // console.log("unfix leg 1, fix leg 2"); + this.leg[robotIndex]=1; + this.guiControls[robotIndex].targetEnd="end 1"; + if(this.carriedVoxel[robotIndex][0].visible||this.carriedVoxel[robotIndex][1].visible){ + this.carriedVoxel[robotIndex][1].visible=true; + this.carriedVoxel[robotIndex][0].visible=false; + + } + + }else + { + //later output package + // console.log("unfix leg 2, fix leg 1"); + this.leg[robotIndex]=2; + this.guiControls[robotIndex].targetEnd="end 2"; + if(this.carriedVoxel[robotIndex][0].visible||this.carriedVoxel[robotIndex][1].visible){ + this.carriedVoxel[robotIndex][0].visible=true; + this.carriedVoxel[robotIndex][1].visible=false; + } + } + + var tempPosition=new THREE.Vector3(0,0,0); + tempPosition.x=this.THREE1[robotIndex].position.x; + tempPosition.y=this.THREE1[robotIndex].position.y; + tempPosition.z=this.THREE1[robotIndex].position.z; + + this.THREE1[robotIndex].position.x=this.target[robotIndex].position.x; + this.THREE1[robotIndex].position.y=this.target[robotIndex].position.y; + this.THREE1[robotIndex].position.z=this.target[robotIndex].position.z; + + + this.guiControls[robotIndex].x=tempPosition.x; + this.guiControls[robotIndex].y=tempPosition.y; + this.guiControls[robotIndex].z=tempPosition.z; + + this.control[robotIndex].position.x = this.guiControls[robotIndex].x; + this.control[robotIndex].position.y = this.guiControls[robotIndex].y; + this.control[robotIndex].position.z = this.guiControls[robotIndex].z; + this.target[robotIndex].position.x = this.guiControls[robotIndex].x; + this.target[robotIndex].position.y = this.guiControls[robotIndex].y; + this.target[robotIndex].position.z = this.guiControls[robotIndex].z; + + if(this.saveAngleData){ + this.updateAngles(robotIndex,true); + this.dataAngles.push(["Lock end",this.leg[robotIndex]]); + + + }else{ + this.updateAngles(robotIndex); + } + + +} + +Swarm.prototype.rotateRobot= function(robotIndex,dir){ + + + if(dir===undefined){ + + + + var temp=parseInt((recursiveSwarms.path[robotIndex].currentPoint-recursiveSwarms.path[robotIndex].number)/recursiveSwarms.path[robotIndex].number/2); + if(temp>=recursiveSwarms.path[robotIndex].changeRotation.length){ + temp=recursiveSwarms.path[robotIndex].changeRotation.length-1; + } + dir=recursiveSwarms.path[robotIndex].changeRotation[temp]; + + + + console.log("try to fix errrrooorrr") + + }else{ + var newRotation=this.getRotation(dir).clone(); + this.THREE1[robotIndex].rotation.x=newRotation.x; + this.THREE1[robotIndex].rotation.y=newRotation.y; + this.THREE1[robotIndex].rotation.z=newRotation.z; + + this.voxelNormal[robotIndex]=this.path[robotIndex].normals[this.path[robotIndex].currentPoint+1]; + this.normalAdjustmentVector[robotIndex]=this.path[robotIndex].normalAdjustments[this.path[robotIndex].currentPoint+1]; + // if(this.saveAngleData){ + // this.updateAngles(robotIndex,true); + + // }else{ + this.updateAngles(robotIndex); + // } + + } + + + + + +} + +Swarm.prototype.getRotation= function(dir){ + var tempRot=new THREE.Vector3(); + if(dir.equals(new THREE.Vector3(0,0,1)) ) + { + tempRot=new THREE.Vector3(0,0,0); + } + else if (dir.equals( new THREE.Vector3(0,0,-1))) + { + tempRot=new THREE.Vector3(180*this.DEG_TO_RAD,0,0); + } + else if (dir.equals( new THREE.Vector3(0,-1,0))) + { + tempRot=new THREE.Vector3(90*this.DEG_TO_RAD,0,0); + } + else if (dir.equals( new THREE.Vector3(0,1,0))) + { + tempRot=new THREE.Vector3(-90*this.DEG_TO_RAD,0,0); + } + else if (dir.equals(new THREE.Vector3(-1,0,0))) + { + tempRot=new THREE.Vector3(0,-90*this.DEG_TO_RAD,0); + } + else if (dir.equals( new THREE.Vector3(1,0,0))) + { + tempRot=new THREE.Vector3(0,90*this.DEG_TO_RAD,0); + } + return tempRot; +} + +////////////////////////////////Path//////////////////////////// +Swarm.prototype._createPath= function(robotIndex,start,end,snormal,enormal,robotUp,robotLocation){ + + var p1=start.clone(); + // p1.add(snormal.clone().multiplyScalar(1)); //add if you want to change voxel Location + var p2=new THREE.Vector3(0,0,0); + var p3=new THREE.Vector3(0,0,0); + var p4=end.clone(); + // p4.add(enormal.clone().multiplyScalar(1)); //add if you want to change voxel Location + + var nor = snormal.clone(); + nor.add(enormal); + nor.normalize(); + + var dir=end.clone().sub(start); + + var temp1=new THREE.Vector3(0,0,0); + var temp2=new THREE.Vector3(0,0,0); + nor.multiplyScalar(this.path[robotIndex].cHeight); + + + temp1.addVectors(start,dir.multiplyScalar(1/3)); + temp2.addVectors(start,dir.multiplyScalar(2)); + + + p2.addVectors(nor,temp1); + p3.addVectors(nor,temp2); + + //create bezier curve + this.path[robotIndex].curve= new THREE.CubicBezierCurve3 ( + p1, + p2, + p3, + p4 + ); + + this._dividePath(robotIndex,snormal.clone(),enormal.clone(),robotUp,robotLocation); +} + +Swarm.prototype._dividePath= function(robotIndex,snormal,enormal,robotUp,robotLocation){ + + //points + var d=1/this.path[robotIndex].number; + var tempPoints=this.path[robotIndex].curve.getSpacedPoints(this.path[robotIndex].number); + // console.log(tempPoints) + + var forward=new THREE.Vector3(0,0,0); + var tempV=tempPoints[0].clone().sub(robotLocation); + if(tempV.x!=0 && robotUp.x==0) + { + forward.x=tempV.x; + }else if(tempV.y!=0 && robotUp.y==0) + { + forward.y=tempV.y; + }else if(tempV.z!=0 && robotUp.z==0) + { + forward.z=tempV.z; + } + forward.normalize(); + + var p1=tempPoints[0]; + var p2=tempPoints[this.path[robotIndex].number]; + var diff=p2.clone().sub(p1); + diff.multiply(snormal); + + //normals + var vnormal1=180; + var vnormal2=180; + if(!snormal.equals(enormal)) + { + + if(diff.x>0||diff.y>0||diff.z>0) + { + if(robotUp.equals(snormal)) + { + vnormal1=180; + vnormal2=90; + + }else + { + vnormal2=180; + vnormal1=90; + + } + + }else if(diff.x<0||diff.y<0||diff.z<0) + { + if(robotUp.equals(snormal)) + { + vnormal1=180; + vnormal2=180+90; + + }else + { + vnormal2=180; + vnormal1=180+90; + + } + } + } + var dn=(vnormal2-vnormal1)/(this.path[robotIndex].number+1); + + + + for (var i=0;i<=this.path[robotIndex].number;i++) + { + this.path[robotIndex].normals.push(vnormal1+i*dn); + this.path[robotIndex].normalAdjustments.push(this.getNormalAdjustment(robotIndex,vnormal1+i*dn,robotUp,forward)); + this.path[robotIndex].points.push(tempPoints[i].clone()); + + + if(this.path[robotIndex].showPath) + { + var material = new THREE.MeshLambertMaterial({ color:0xff7171,}); + var geometry = new THREE.SphereGeometry(0.05, 0.05, 0.05); + var mesh = new THREE.Mesh(geometry, material); + mesh.position.x=tempPoints[i].x; + mesh.position.y=tempPoints[i].y; + mesh.position.z=tempPoints[i].z; + this.scene.add(mesh); + } + } + +} + +Swarm.prototype._BilleStep= function(robotIndex,stepLeg1,stepLeg2,legsNormal){ + + var changeLegBefore=false; + var leg1Pos=new THREE.Vector3(0,0,0); + var leg2Pos=new THREE.Vector3(0,0,0); + + var pos1=new THREE.Vector3(0,0,0); + var pos2=new THREE.Vector3(0,0,0); + + if(this.path[robotIndex].points.length==0) + { + pos1.copy(this.target[robotIndex].position); + pos2.copy(this.THREE1[robotIndex].position); + }else{ + pos1.copy(this.path[robotIndex].points[this.path[robotIndex].points.length-1-1-this.path[robotIndex].number]); + pos2.copy(this.path[robotIndex].points[this.path[robotIndex].points.length-1]); + + } + + //check starting leg based on distance to target + if(pos2.distanceTo(stepLeg1)<pos1.distanceTo(stepLeg1)) + { + changeLegBefore=true; + var temp=new THREE.Vector3(0,0,0); + temp.copy(pos1); + pos1.copy(pos2); + pos2.copy(temp); + } + + leg1Pos.copy(pos1); + leg2Pos.copy(pos2); + + // var robotUp=this.THREE1dir[robotIndex].clone(); + var robotUp=this.THREE1dir[robotIndex].clone(); + var robotLocation=this.THREE1Pos[robotIndex].clone(); + + + this._createPath(robotIndex,leg1Pos,stepLeg1,this.THREE1dir[robotIndex],legsNormal,robotUp,robotLocation); + + robotUp=legsNormal; + robotLocation=stepLeg1; + this._createPath(robotIndex,leg2Pos,stepLeg2,this.THREE1dir[robotIndex],legsNormal,robotUp,robotLocation); + + //update previous locations/pos + this.THREE1dir[robotIndex] = legsNormal.clone(); + this.THREE1Pos[robotIndex]=stepLeg2.clone(); + + return [changeLegBefore,legsNormal]; +} + +Swarm.prototype.moveLeg= function(robotIndex){ + var ps= this.path[robotIndex].points.slice(); + + for(var i=0;i<=this.path[robotIndex].number;i++) + { + setTimeout(function(){ _move(robotIndex); }, this.path[robotIndex].timeout+=this.path[robotIndex].delay); + } + setTimeout(function(){ _changeEnd(robotIndex); }, this.path[robotIndex].timeout); + +} + +Swarm.prototype.move= function(robotIndex){ + + this.guiControls[robotIndex].x=this.path[robotIndex].points[this.path[robotIndex].currentPoint].x; + this.guiControls[robotIndex].y=this.path[robotIndex].points[this.path[robotIndex].currentPoint].y; + this.guiControls[robotIndex].z=this.path[robotIndex].points[this.path[robotIndex].currentPoint].z; + this.voxelNormal[robotIndex]=this.path[robotIndex].normals[this.path[robotIndex].currentPoint]; + this.normalAdjustmentVector[robotIndex]=this.path[robotIndex].normalAdjustments[this.path[robotIndex].currentPoint]; + if(this.saveAngleData){ + // this.dataAngles.push([this.path[robotIndex].currentPoint,this.path[robotIndex].points[this.path[robotIndex].currentPoint].x,this.path[robotIndex].points[this.path[robotIndex].currentPoint].y,this.path[robotIndex].points[this.path[robotIndex].currentPoint].z]); + this.updateAngles(robotIndex,true); + + }else{ + this.updateAngles(robotIndex); + } + + this.control[robotIndex].position.x = this.guiControls[robotIndex].x; + this.control[robotIndex].position.y = this.guiControls[robotIndex].y; + this.control[robotIndex].position.z = this.guiControls[robotIndex].z; + + this.target[robotIndex].position.x = this.guiControls[robotIndex].x; + this.target[robotIndex].position.y = this.guiControls[robotIndex].y; + this.target[robotIndex].position.z = this.guiControls[robotIndex].z; + + this.path[robotIndex].currentPoint++; + + if(this.path[robotIndex].currentPoint==this.path[robotIndex].points.length){ + if(this.goHome[robotIndex]){ + + this.buildVoxelAt(robotIndex,this.robotState[robotIndex].leg1Pos.clone().multiplyScalar(this.voxelSpacing[robotIndex])); + //go Home + // console.log("robotIndex:"+robotIndex+" s2s"); + this.startMovement(robotIndex,true); + + }else{ + //go to new Voxel + // console.log("robotIndex:"+robotIndex+" s2s"); + this.startMovement(robotIndex,false); + } + } + +} + +Swarm.prototype.getDirVec= function(direction){ + var vec = new THREE.Vector3(0,0,0); + + switch(direction) + { + case 0: + vec = new THREE.Vector3(1,0,0); + break; + case 1: + vec = new THREE.Vector3(-1,0,0); + break; + case 2: + vec = new THREE.Vector3(0,1,0); + break; + case 3: + vec = new THREE.Vector3(0,-1,0); + break; + } + return vec; + +} + +Swarm.prototype.resetPath= function(robotIndex){ + ////////////////////// + this.steps[robotIndex]=[]; + this.path[robotIndex].curve=null; + this.path[robotIndex].points=[]; + this.path[robotIndex].normals=[]; + this.path[robotIndex].changeRotation=[]; + this.path[robotIndex].normalAdjustments=[]; + this.path[robotIndex].currentPoint=0; + this.path[robotIndex].timeout=0; +} + +Swarm.prototype.getStepsFromDir= function(robotIndex){ + // var leg1Pos=new THREE.Vector3(1,0,0); + // var leg2Pos=new THREE.Vector3(0,0,0); + // var up=new THREE.Vector3(0,0,1); + // var forward=new THREE.Vector3(1,0,0); + + for(var i=0;i<this.stepsDir.length;i++){ + + switch(this.stepsDir[i]){ + + case 0: + this.robotState[robotIndex].leg2Pos=this.robotState[robotIndex].leg1Pos.clone(); + this.robotState[robotIndex].leg1Pos.add(this.robotState[robotIndex].forward); + this.steps[robotIndex].push([this.robotState[robotIndex].leg1Pos.clone().multiplyScalar(this.voxelSpacing[robotIndex]),this.robotState[robotIndex].leg2Pos.clone().multiplyScalar(this.voxelSpacing[robotIndex]),this.robotState[robotIndex].up]); + break; + case 1: + this.robotState[robotIndex].forward=new THREE.Vector3(0,0,0).sub(this.robotState[robotIndex].forward); + // var temp=leg2Pos.clone(); + // leg2Pos=leg1Pos.clone(); + this.robotState[robotIndex].leg1Pos=this.robotState[robotIndex].leg2Pos.clone().add(this.robotState[robotIndex].forward); + this.steps[robotIndex].push([this.robotState[robotIndex].leg1Pos.clone().multiplyScalar(this.voxelSpacing[robotIndex]),this.robotState[robotIndex].leg2Pos.clone().multiplyScalar(this.voxelSpacing[robotIndex]),this.robotState[robotIndex].up]); + break; + case 2: + this.robotState[robotIndex].leg2Pos=this.robotState[robotIndex].leg1Pos.clone(); + this.robotState[robotIndex].leg1Pos.add(this.robotState[robotIndex].forward.clone().add(this.robotState[robotIndex].up)); + this.steps[robotIndex].push([this.robotState[robotIndex].leg1Pos.clone().multiplyScalar(this.voxelSpacing[robotIndex]),this.robotState[robotIndex].leg2Pos.clone().multiplyScalar(this.voxelSpacing[robotIndex]),this.robotState[robotIndex].up]); + break; + case 3: + this.robotState[robotIndex].leg2Pos=this.robotState[robotIndex].leg1Pos.clone(); + this.robotState[robotIndex].leg1Pos.add(this.robotState[robotIndex].forward.clone().sub(this.robotState[robotIndex].up)); + this.steps[robotIndex].push([this.robotState[robotIndex].leg1Pos.clone().multiplyScalar(this.voxelSpacing[robotIndex]),this.robotState[robotIndex].leg2Pos.clone().multiplyScalar(this.voxelSpacing[robotIndex]),this.robotState[robotIndex].up]); + break; + case 4: + this.robotState[robotIndex].leg2Pos=this.robotState[robotIndex].leg1Pos.clone(); + if(this.robotState[robotIndex].forward.x!=0) { + var temp=this.robotState[robotIndex].forward.x; + this.robotState[robotIndex].forward.x=0; + this.robotState[robotIndex].forward.y=temp; + }else { + var temp=this.robotState[robotIndex].forward.y; + this.robotState[robotIndex].forward.y=0; + this.robotState[robotIndex].forward.x=temp; + } + this.robotState[robotIndex].leg1Pos=this.robotState[robotIndex].leg2Pos.clone().add(this.robotState[robotIndex].forward); + this.steps[robotIndex].push([this.robotState[robotIndex].leg1Pos.clone().multiplyScalar(this.voxelSpacing[robotIndex]),this.robotState[robotIndex].leg2Pos.clone().multiplyScalar(this.voxelSpacing[robotIndex]),this.robotState[robotIndex].up]); + break; + case 5: + this.robotState[robotIndex].leg2Pos=this.robotState[robotIndex].leg1Pos.clone(); + if(this.robotState[robotIndex].forward.x!=0) { + var temp=this.robotState[robotIndex].forward.x; + this.robotState[robotIndex].forward.x=0; + this.robotState[robotIndex].forward.y=-temp; + }else { + var temp=this.robotState[robotIndex].forward.y; + this.robotState[robotIndex].forward.y=0; + this.robotState[robotIndex].forward.x=-temp; + } + this.robotState[robotIndex].leg1Pos=this.robotState[robotIndex].leg2Pos.clone().add(this.robotState[robotIndex].forward); + this.steps[robotIndex].push([this.robotState[robotIndex].leg1Pos.clone().multiplyScalar(this.voxelSpacing[robotIndex]),this.robotState[robotIndex].leg2Pos.clone().multiplyScalar(this.voxelSpacing[robotIndex]),this.robotState[robotIndex].up]); + break; + + } + + } + this.stepsDir=[]; + +} + + +Swarm.prototype.generatePoints= function(robotIndex){ + for (var i=0; i<this.steps[robotIndex].length ; i++) + { + var s=this._BilleStep(robotIndex,this.steps[robotIndex][i][0],this.steps[robotIndex][i][1],this.steps[robotIndex][i][2]); + this.path[robotIndex].changeLegs.push(s[0]); + this.path[robotIndex].changeRotation.push(s[1]); + } +} + +Swarm.prototype.step= function(robotIndex,i){ + this.totalNumberofSteps[robotIndex]++; + + if(this.path[robotIndex].changeLegs[i]) + { + setTimeout(function(){ _changeEnd(robotIndex); }, this.path[robotIndex].timeout); + } + + this.moveLeg(robotIndex);//leg1 + + //rotate bill-e + if(i>0 && !this.path[robotIndex].changeRotation[i].equals(this.path[robotIndex].changeRotation[i-1])) + { + + setTimeout(function(){ _rotateRobot(robotIndex); + }, this.path[robotIndex].timeout); + } + + this.moveLeg(robotIndex);//leg2 + +} \ No newline at end of file diff --git a/recursive_swarm/js/swarm_three.js b/recursive_swarm/js/swarm_three.js new file mode 100644 index 0000000000000000000000000000000000000000..10ab381b652264e34d375e4ac1ac0e68d7aec135 --- /dev/null +++ b/recursive_swarm/js/swarm_three.js @@ -0,0 +1,109 @@ +// Amira Abdel-Rahman +// (c) Massachusetts Institute of Technology 2020 + + +// Based on: https://github.com/glumb/robot-gui + +///////////////////////////////scene threejs/////////////////////////////// +Swarm.prototype.init=function() { + this.container = document.getElementById(this.three);// 'webgl' ); // + + //////////// + // this.labelRenderer = new THREE.CSS2DRenderer(); + // this.labelRenderer.setSize( window.innerWidth, window.innerHeight ); + // this.labelRenderer.domElement.style.position = 'absolute'; + // this.labelRenderer.domElement.style.top = '0px'; + // document.body.appendChild( this.labelRenderer.domElement ); + ////////////////// + + this.renderer = new THREE.WebGLRenderer({ + alpha: true,//transparent + antialias: true, // to get smoother output + preserveDrawingBuffer: false, // no screenshot -> faster? + }); + // this.renderer.setClearColor(0x333333); + // this.renderer.setClearColor(0xffffff);// the default + this.renderer.setClearColor( 0x000000, 0 ); //transparent + let width = 3000; + let height= 2000; + this.renderer.setSize(window.innerWidth, window.innerHeight) + // this.renderer.setSize(width, height) + this.container.appendChild( this.renderer.domElement ); + + this.scene = new THREE.Scene(); + + this.camera = new THREE.PerspectiveCamera(35, window.innerWidth / window.innerHeight, 1, 10000) + + this.camera.up.set(0, 0, 0.5); + + this.camera.position.set(200*this.gridSize/40, 200*this.gridSize/40, 200*this.gridSize/40);//general + + + + this.scene.add(this.camera); + + // lights + var light = new THREE.AmbientLight(0xaaaaaa); + this.scene.add(light); + var light2 = new THREE.DirectionalLight(0xaaaaaa); + light2.position.set(1, 1.3, 1).normalize(); + this.scene.add(light2); + + + + this.cameraControls = new THREE.OrbitControls(this.camera, this.renderer.domElement); + + + this.cameraControls.target.set( 0, 0, -50*this.gridSize/30 );//general + + + + // this.cameraControls.addEventListener('change', () => this.renderer.render(this.scene, this.camera)); + this.cameraControls.addEventListener('change', this.render); + + + + window.addEventListener('resize', onWindowResize, false); + + var size = 10; + var step = 20; + + var gridHelper = new THREE.GridHelper(size, step); + gridHelper.rotation.x = Math.PI / 2; + // this.scene.add(gridHelper); + + var axisHelper = new THREE.AxesHelper(5); + var colors = axisHelper.geometry.attributes.color.array; + + colors.set( [ + 0, 1, 0, 0, 1, 0, // x-axis rgb at origin; rgb at end of segment + 1, 0, 0, 1, 0, 0, // y-axis + 0, 0, 1, 0, 0, 1 // z-axis + ] ); + + + + // this.scene.add(axisHelper); + this.animate(); + + ////////////////////load voxel///////////////////////// + this.loadSingleVoxel(); + +} + +Swarm.prototype.animate=function(){ + requestAnimationFrame(this.animate.bind(this)); + this.render(); +} + +Swarm.prototype.render= function() { + if(this.renderCounter>this.renderInterval){ + this.renderer.render(this.scene, this.camera); + // this.labelRenderer.render( this.scene, this.camera ); + this.cameraControls.update(); + this.renderCounter=0; + + } + this.renderCounter++; + +} \ No newline at end of file diff --git a/recursive_swarm/js/swarm_voxel.js b/recursive_swarm/js/swarm_voxel.js new file mode 100644 index 0000000000000000000000000000000000000000..f7ae3fcb87153e43ca5d76b4b5f3dcd7aa3620e1 --- /dev/null +++ b/recursive_swarm/js/swarm_voxel.js @@ -0,0 +1,1057 @@ +// Amira Abdel-Rahman +// (c) Massachusetts Institute of Technology 2020 + +//////////////////////////load Voxels//////////////////////////// +Swarm.prototype.loadVoxel= function(robotIndex){ + var robotSize=this.robotScale[robotIndex]; + + if(this.robotScale[robotIndex]===undefined ||this.robotScale[robotIndex]==1){ + this.voxel.push(this.singleVoxel.clone()); + }else if(this.robotScale[robotIndex]==2){ + var group = new THREE.Group(); + for (var j=0; j<this.voxelIndexList[robotSize].list.length;j++){ + var object1=this.singleVoxel.clone(); + object1.position.x=this.voxelIndexList[robotSize].list[j].x*this.spacing; + object1.position.y=(this.voxelIndexList[robotSize].list[j].y)*this.spacing; + object1.position.z=(this.voxelIndexList[robotSize].list[j].z-2)*this.spacing; + group.add(object1); + } + this.voxel.push(group); + }else if(this.robotScale[robotIndex]==4){ + var group = new THREE.Group(); + for (var j=0; j<this.voxelIndexList[robotSize].list.length;j++){ + var object1=this.singleVoxel.clone(); + object1.position.x=this.voxelIndexList[robotSize].list[j].x*this.spacing; + object1.position.y=(this.voxelIndexList[robotSize].list[j].y)*this.spacing; + object1.position.z=(this.voxelIndexList[robotSize].list[j].z-4)*this.spacing; + group.add(object1); + } + this.voxel.push(group); + } + +}; + +Swarm.prototype.loadSingleVoxel= function(){ + + var geometry = new THREE.BufferGeometry(); + // create a simple square shape. We duplicate the top left and bottom right + // vertices because each vertex needs to appear once per triangle. + var vertices = voxelData; + var normals = voxelNormalData; + var uv = voxelUVData; + + // itemSize = 3 because there are 3 values (components) per vertex + geometry.addAttribute( 'position', new THREE.BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'normal', new THREE.BufferAttribute( normals, 3 ) ); + geometry.addAttribute( 'uv', new THREE.BufferAttribute( uv, 2 ) ); + + if(this.reducedViz){ + geometry=new THREE.BoxGeometry(this.spacing, this.spacing, this.spacing); + + } + + // var material = new THREE.MeshLambertMaterial( { color: 0xbbc3ce } ); + var material = new THREE.MeshBasicMaterial( { color: new THREE.Color(0,0,0) } ); + + + var object = new THREE.Mesh( geometry, material ); + // object.scale.x=0.04; + // object.scale.y=0.04; + // object.scale.z=0.04; + // object.position.z=-1.5; + if(!this.reducedViz){ + object.scale.x=0.5; + object.scale.y=0.5; + object.scale.z=0.5; + object.position.x=-15; + object.position.y=-15; + + } + + + this.singleVoxel=(object); + +}; + +Swarm.prototype.buildGrid= function(){ + //this.build this.grid + for(var i=0;i<this.gridSize;i++){ + var t=[]; + this.grid.push(t) + for(var j=0;j<this.gridSize;j++) + { + var tt=[]; + this.grid[i].push(tt); + for(var k=0;k<this.gridSize;k++) + { + this.grid[i][j].push(false); + } + } + } + //this.build first layer + for(var i=0;i<this.gridSize;i++) + { + for(var j=0;j<this.gridSize;j++) + { + this.buildSingleVoxelAt(new THREE.Vector3(i*this.spacing,j*this.spacing,0)); + this.grid[i][j][0]=true; + } + } + + // for(var i=8;i<this.gridSize-8;i++) + // { + // for(var j=8;j<this.gridSize-8;j++) + // { + // for(var k=1;k<this.gridSize-16;k++) + // { + // this.buildSingleVoxelAt1(new THREE.Vector3(i*this.spacing,j*this.spacing,k*this.spacing)); + // } + // } + // } + + + + +}; + +Swarm.prototype.frepCube= function(){ + // string function= "Math.min(Math.min(Math.min(Math.min(X-(-1),(1)-X),Math.min(Y-(-1),(1)-Y)),Math.min(Z-(-1),(1)-Z)),-(Math.min(Math.min(Math.min(X-(-0.8),(0.8)-X),Math.min(Y-(-0.8),(0.8)-Y)),Math.min(Z-(-0.8),(0.8)-Z))))"; + var maxZslices=[]; + var tempVoxelSlices=[]; + for (var Z=0;Z<this.gridSize;Z++){ + this.voxelSlices.push([]); + tempVoxelSlices.push([]); + this.voxelSlicesCount.push([]); + var max=- Infinity; + var maxIndex=new THREE.Vector3(0,0,0); + for (var Y=0;Y<this.gridSize;Y++) + { + for (var X=0;X<this.gridSize;X++) + { + var func= this.frep(X,Y,Z); + + if(func>=0 && !this.grid[X][Y][Z]) + { + if(func>max) + { + max=func; + maxIndex=new THREE.Vector3(X*this.spacing,Y*this.spacing, Z*this.spacing); + + } + var loc=new THREE.Vector3(X*this.spacing,Y*this.spacing,Z*this.spacing); + tempVoxelSlices[Z].push(loc); + this.voxelNum++; + } + } + } + maxZslices.push(maxIndex);//check if right later + } + + for (var Z=0;Z<this.gridSize;Z++){ + + for(var i=0;i<tempVoxelSlices[Z].length;i++) + { + var rank = Math.ceil(maxZslices[Z].distanceTo(tempVoxelSlices[Z][i]) /this.spacing); + while(this.voxelSlices[Z].length<=rank) + { + this.voxelSlicesCount[Z].push([]); + + this.voxelSlices[Z].push([]); + + this.voxelSlicesCount[Z][this.voxelSlices[Z].length-1]=0; + + this.voxelSlices[Z][this.voxelSlices[Z].length-1]=[]; + } + this.voxelSlices[Z][rank].push(tempVoxelSlices[Z][i]); + } + } + ////////// + // for(var i=0; i<this.numberOfRobots;i++) + // { + // this.buildHelperMeshes(i); + // } + +}; + +Swarm.prototype.frep= function(X,Y,Z){ + // return (3*3-((X-(5))*(X-(5))+(Y-(5))*(Y-(5))+(Z-(3))*(Z-(3)))); //sphere FIX!! + // return Math.min(Math.min(Math.min(Math.min(X-(2),(7)-X),Math.min(Y-(2),(7)-Y)),Math.min(Z-(1),(5)-Z)),-(Math.min(Math.min(Math.min(X-(4),(8)-X),Math.min(Y-(4),(8)-Y)),Math.min(Z-(0),(4)-Z)))); + // return Math.min(Math.min(Math.min(Math.min(X-(2),(5)-X),Math.min(Y-(2),(5)-Y)),Math.min(Z-(1),(5)-Z)),-(Math.min(Math.min(Math.min(X-(3),(6)-X),Math.min(Y-(3),(6)-Y)),Math.min(Z-(0),(4)-Z)))); + // return Math.min(Math.min(Math.min(Math.min(X-(2),(7)-X),Math.min(Y-(2),(7)-Y)),Math.min(Z-(1),(6)-Z)),-(Math.min(Math.min(Math.min(X-(3),(6)-X),Math.min(Y-(3),(6)-Y)),Math.min(Z-(0),(7)-Z))));//empty cube + // return Math.min(((6)-Z),(Math.min((Z-(1)),(((3*(5-(Z-(1)))/5)*(3*(5-(Z-(1)))/5)-((X-(5))*(X-(5))+(Y-(5))*(Y-(5))))))));//CONE + return Math.min(Math.min(Math.min(X-(2),((this.gridSize-3))-X),Math.min(Y-(2),((this.gridSize-3))-Y)),Math.min(Z-(1),((this.gridSize-4))-Z)); //CUBE +}; + +Swarm.prototype.buildSingleVoxelAt= function(loc){ + var object1=this.singleVoxel.clone(); + object1.position.x=loc.x; + object1.position.y=loc.y; + object1.position.z=loc.z-this.spacing/2.0; + + var color1= new THREE.Color( 0.8, 0.8, 0.8 );//0.6 + var material = new THREE.MeshPhysicalMaterial( { metalness: 0.00,reflectivity: 1.0,roughness: 0.5,color: new THREE.Color( 0.9, 0.9, 0.9 ) } ); + + + var material = new THREE.MeshLambertMaterial( { color: color1 } ); + + // // var color = new THREE.Color( 1/this.globalRank, 0, 0 ); + + object1.material=material.clone(); + object1.material.color=color1; + + if(this.reducedViz){ + object1.visible=false; + } + // object1.visible=false; + + + + this.scene.add( object1 ); +}; + +Swarm.prototype.buildSingleVoxelAt1= function(loc){ + var object1=this.singleVoxel.clone(); + object1.position.x=loc.x; + object1.position.y=loc.y; + object1.position.z=loc.z-this.spacing/2.0; + + var color1= new THREE.Color( 0, 0, 0 ); + + var material = new THREE.MeshLambertMaterial( { color: 0xbbc3ce } ); + + // // var color = new THREE.Color( 1/this.globalRank, 0, 0 ); + + object1.material=material.clone(); + object1.material.transparent=true; + object1.material.opacity=0.4; + // object1.material.color=color1; + + if(this.reducedViz){ + object1.visible=false; + } + + + this.scene.add( object1 ); +}; + +Swarm.prototype.buildSingleVoxelAt2= function(loc){ + var object1=this.singleVoxel.clone(); + object1.position.x=loc.x; + object1.position.y=loc.y; + object1.position.z=loc.z-this.spacing/2.0; + + var color1= new THREE.Color( 0.7, 0.7, 0.7 ); + // var color1= new THREE.Color( 0.0, 0.0, 0.0 ); + var material = new THREE.MeshLambertMaterial( { color: color1 } ); + + object1.material=material.clone(); + + if(this.reducedViz){ + object1.visible=false; + } + + this.scene.add( object1 ); +}; + +Swarm.prototype.buildVoxelAt= function(robotIndex,loc){ + var object1=this.voxel[robotIndex].clone(); + object1.name='['+loc.x/this.spacing+','+loc.y/this.spacing+','+loc.z/this.spacing+']'; + + object1.name='['+loc.x/this.voxelSpacing[robotIndex]+','+loc.y/this.voxelSpacing[robotIndex]+','+loc.z/this.voxelSpacing[robotIndex]+']'; + + + if(this.buildType=="recursion"){ + // console.log(this.voxelList[robotIndex].pickupList) + object1=this.billeParts[this.voxelList[robotIndex].pickupList[0]].clone(); + object1.name='bille'+this.voxelList[robotIndex].pickupList[0]; + + } + object1.position.x=loc.x; + object1.position.y=loc.y; + object1.position.z=loc.z-this.spacing/2.0; + + + // var color1= new THREE.Color( 1/this.globalRank, 0, 0 ) + + // var material = new THREE.MeshLambertMaterial( { color: 0xbbc3ce } ); + + // var color = new THREE.Color( 255, 0, 0 ); + + // object1.material=material.clone(); + // object1.material.color=color; + + + this.scene.add( object1 ); +}; + +Swarm.prototype.deleteVoxelAt= function(robotIndex,loc){ //loc is index + // var object1=this.voxel[robotIndex].clone(); + // object1.name='['+loc.x/this.spacing+','+loc.y/this.spacing+','+loc.z/this.spacing+']'; + + var object1=this.scene.getObjectByName('['+loc.x+','+loc.y+','+loc.z+']'); + + this.scene.remove( object1 ); + this.grid[loc.x][loc.y][loc.z]=false; + + + + +}; + +Swarm.prototype.createHierarchalSDFVoxelList=function(){ + this.voxelIndexList=[ + null, + { + size:1, + list:[ + new THREE.Vector3(0,0,0), + + ] + }, + { + size:2, + list:[ + new THREE.Vector3(0,0,1), + new THREE.Vector3(0,1,1), + new THREE.Vector3(1,0,1), + new THREE.Vector3(1,1,1), + new THREE.Vector3(0,0,2), + new THREE.Vector3(0,1,2), + new THREE.Vector3(1,0,2), + new THREE.Vector3(1,1,2) + ] + + }, + null, + { + size:4, + list:[ + // new THREE.Vector3(0,0,1), + // new THREE.Vector3(0,1,1), + // new THREE.Vector3(0,2,1), + // new THREE.Vector3(0,3,1), + + // new THREE.Vector3(1,0,1), + // new THREE.Vector3(1,1,1), + // new THREE.Vector3(1,2,1), + // new THREE.Vector3(1,3,1), + + // new THREE.Vector3(2,0,1), + // new THREE.Vector3(2,1,1), + // new THREE.Vector3(2,2,1), + // new THREE.Vector3(2,3,1), + + // new THREE.Vector3(3,0,1), + // new THREE.Vector3(3,1,1), + // new THREE.Vector3(3,2,1), + // new THREE.Vector3(3,3,1), + + + // new THREE.Vector3(0,0,2), + // new THREE.Vector3(0,1,2), + // new THREE.Vector3(0,2,2), + // new THREE.Vector3(0,3,2), + + // new THREE.Vector3(1,0,2), + // new THREE.Vector3(1,1,2), + // new THREE.Vector3(1,2,2), + // new THREE.Vector3(1,3,2), + + // new THREE.Vector3(2,0,2), + // new THREE.Vector3(2,1,2), + // new THREE.Vector3(2,2,2), + // new THREE.Vector3(2,3,2), + + // new THREE.Vector3(3,0,2), + // new THREE.Vector3(3,1,2), + // new THREE.Vector3(3,2,2), + // new THREE.Vector3(3,3,2), + + // new THREE.Vector3(0,0,3), + // new THREE.Vector3(0,1,3), + // new THREE.Vector3(0,2,3), + // new THREE.Vector3(0,3,3), + + // new THREE.Vector3(1,0,3), + // new THREE.Vector3(1,1,3), + // new THREE.Vector3(1,2,3), + // new THREE.Vector3(1,3,3), + + // new THREE.Vector3(2,0,3), + // new THREE.Vector3(2,1,3), + // new THREE.Vector3(2,2,3), + // new THREE.Vector3(2,3,3), + + // new THREE.Vector3(3,0,3), + // new THREE.Vector3(3,1,3), + // new THREE.Vector3(3,2,3), + // new THREE.Vector3(3,3,3), + + + // new THREE.Vector3(0,0,4), + // new THREE.Vector3(0,1,4), + // new THREE.Vector3(0,2,4), + // new THREE.Vector3(0,3,4), + + // new THREE.Vector3(1,0,4), + // new THREE.Vector3(1,1,4), + // new THREE.Vector3(1,2,4), + // new THREE.Vector3(1,3,4), + + // new THREE.Vector3(2,0,4), + // new THREE.Vector3(2,1,4), + // new THREE.Vector3(2,2,4), + // new THREE.Vector3(2,3,4), + + // new THREE.Vector3(3,0,4), + // new THREE.Vector3(3,1,4), + // new THREE.Vector3(3,2,4), + // new THREE.Vector3(3,3,4), + + ] + + } + + ]; + + for(var i=0;i<this.voxelIndexList[2].list.length;i++){ + for(var j=0;j<this.voxelIndexList[2].list.length;j++){ + this.voxelIndexList[4].list.push( + this.voxelIndexList[2].list[i].clone().add(new THREE.Vector3(0,0,-1)).multiplyScalar(2).add(this.voxelIndexList[2].list[j].clone()) + ); + } + } + + this.buildList.availablePickup=[ + null, + [], + [], + null, + [] + ]; + this.buildList.listToBuild=[ + null, + [], + [], + null, + [] + ]; +}; + +Swarm.prototype.createHierarchalVoxelList=function(){ + this.voxelIndexList=[ + new THREE.Vector3(0,0,1), + new THREE.Vector3(0,1,1), + new THREE.Vector3(1,0,1), + new THREE.Vector3(1,1,1), + new THREE.Vector3(0,0,2), + new THREE.Vector3(0,1,2), + new THREE.Vector3(1,0,2), + new THREE.Vector3(1,1,2) + ]; + // this.voxelIndexList=[ + // new THREE.Vector3(0,0,1), + // new THREE.Vector3(0,1,1), + // new THREE.Vector3(0,2,1), + // new THREE.Vector3(0,3,1), + // new THREE.Vector3(0,4,1), + + // new THREE.Vector3(-1,0,1), + // new THREE.Vector3(-2,0,1), + // new THREE.Vector3(-3,0,1), + + // new THREE.Vector3(1,0,1), + // new THREE.Vector3(2,0,1), + // new THREE.Vector3(3,0,1), + + // new THREE.Vector3(-1,4,1), + // new THREE.Vector3(-2,4,1), + // new THREE.Vector3(-3,4,1), + + // new THREE.Vector3(1,4,0), + // new THREE.Vector3(2,4,0), + // new THREE.Vector3(3,4,0) + // ]; + i=0; + this.voxelList.push({rank:this.robotScale[i],list:[],originalList:[],assembled:false,pickedUp:false}) + for (var j=0; j<this.voxelIndexList.length;j++){ + this.voxelList[i].list.push( + this.voxelIndexList[j].clone() + .add(this.startLocations[i].clone().multiplyScalar(1/this.voxelSpacing[i])) + .add(new THREE.Vector3(-2,-2,0)) + ); + this.voxelList[i].originalList.push(this.voxelList[i].list[j].clone()); + } + i=1; + this.voxelList.push({rank:this.robotScale[i],list:[],originalList:[],assembled:false,pickedUp:false}) + for (var j=0; j<this.voxelIndexList.length;j++){ + this.voxelList[i].list.push( + this.voxelIndexList[j].clone() + .add(this.startLocations[i].clone().multiplyScalar(1/this.voxelSpacing[i])) + .add(new THREE.Vector3(-2,2,0)) + ); + this.voxelList[i].originalList.push(this.voxelList[i].list[j].clone()); + } + i=2; + this.voxelList.push({rank:this.robotScale[i],list:[],originalList:[],assembled:false,pickedUp:false}) + for (var j=0; j<this.voxelIndexList.length;j++){ + this.voxelList[i].list.push( + this.voxelIndexList[j].clone() + .add(this.startLocations[i].clone().multiplyScalar(1/this.voxelSpacing[i])) + .add(new THREE.Vector3(2,-2,0)) + ); + this.voxelList[i].originalList.push(this.voxelList[i].list[j].clone()); + } + // i=3; + // this.voxelList.push({rank:this.robotScale[i],list:[],originalList:[],assembled:false,pickedUp:false}) + // for (var j=0; j<this.voxelIndexList.length;j++){ + // this.voxelList[i].list.push( + // this.voxelIndexList[j].clone() + // .add(this.startLocations[i].clone().multiplyScalar(1/this.voxelSpacing[i])) + // .add(new THREE.Vector3(2,2,0)) + // ); + // this.voxelList[i].originalList.push(this.voxelList[i].list[j].clone()); + // } + // this.voxelIndexList1=[ + // new THREE.Vector3(0,0,1), + // new THREE.Vector3(0,1,1), + + // new THREE.Vector3(1,0,1), + // new THREE.Vector3(1,1,1), + + // new THREE.Vector3(0,0,2), + // new THREE.Vector3(0,1,2), + + // new THREE.Vector3(1,0,2), + // new THREE.Vector3(1,1,2), + + // new THREE.Vector3(2,1,1), + // new THREE.Vector3(2,0,1), + + // new THREE.Vector3(2,1,2), + // new THREE.Vector3(2,0,2), + + // new THREE.Vector3(1,1,3), + // new THREE.Vector3(1,0,3), + + // new THREE.Vector3(1,2,1), + // new THREE.Vector3(1,-1,1), + + // new THREE.Vector3(3,1,1), + // new THREE.Vector3(-1,1,1), + + // new THREE.Vector3( 3,0,1), + // new THREE.Vector3(-1,0,1), + + // // new THREE.Vector3(0,2,1), + // // new THREE.Vector3(2,2,1), + + // // new THREE.Vector3(0,-1,1), + // // new THREE.Vector3(2,-1,1), + + // // new THREE.Vector3(1,3,1), + // // new THREE.Vector3(1,-2,1), + + + // ]; + // i=4; + // this.voxelList.push({rank:this.robotScale[i],list:[],assembled:false,pickedUp:false,pickupList:[]}) + // for (var j=0; j<this.voxelIndexList1.length;j++){ + // var loc=new THREE.Vector3(5,5,0); + // this.voxelList[i].list.push( + // this.voxelIndexList1[j].clone() + // .add(loc) + // .add(new THREE.Vector3(0,0,0)) + // ); + + // } + + this.voxelIndexList=[ + null, + { + size:1, + list:[ + new THREE.Vector3(0,0,0), + + ] + }, + { + size:2, + list:[ + new THREE.Vector3(0,0,1), + new THREE.Vector3(0,1,1), + new THREE.Vector3(1,0,1), + new THREE.Vector3(1,1,1), + new THREE.Vector3(0,0,2), + new THREE.Vector3(0,1,2), + new THREE.Vector3(1,0,2), + new THREE.Vector3(1,1,2) + ] + + }, + null, + { + size:4, + list:[ + // new THREE.Vector3(0,0,1), + // new THREE.Vector3(0,1,1), + // new THREE.Vector3(0,2,1), + // new THREE.Vector3(0,3,1), + + // new THREE.Vector3(1,0,1), + // new THREE.Vector3(1,1,1), + // new THREE.Vector3(1,2,1), + // new THREE.Vector3(1,3,1), + + // new THREE.Vector3(2,0,1), + // new THREE.Vector3(2,1,1), + // new THREE.Vector3(2,2,1), + // new THREE.Vector3(2,3,1), + + // new THREE.Vector3(3,0,1), + // new THREE.Vector3(3,1,1), + // new THREE.Vector3(3,2,1), + // new THREE.Vector3(3,3,1), + + + // new THREE.Vector3(0,0,2), + // new THREE.Vector3(0,1,2), + // new THREE.Vector3(0,2,2), + // new THREE.Vector3(0,3,2), + + // new THREE.Vector3(1,0,2), + // new THREE.Vector3(1,1,2), + // new THREE.Vector3(1,2,2), + // new THREE.Vector3(1,3,2), + + // new THREE.Vector3(2,0,2), + // new THREE.Vector3(2,1,2), + // new THREE.Vector3(2,2,2), + // new THREE.Vector3(2,3,2), + + // new THREE.Vector3(3,0,2), + // new THREE.Vector3(3,1,2), + // new THREE.Vector3(3,2,2), + // new THREE.Vector3(3,3,2), + + // new THREE.Vector3(0,0,3), + // new THREE.Vector3(0,1,3), + // new THREE.Vector3(0,2,3), + // new THREE.Vector3(0,3,3), + + // new THREE.Vector3(1,0,3), + // new THREE.Vector3(1,1,3), + // new THREE.Vector3(1,2,3), + // new THREE.Vector3(1,3,3), + + // new THREE.Vector3(2,0,3), + // new THREE.Vector3(2,1,3), + // new THREE.Vector3(2,2,3), + // new THREE.Vector3(2,3,3), + + // new THREE.Vector3(3,0,3), + // new THREE.Vector3(3,1,3), + // new THREE.Vector3(3,2,3), + // new THREE.Vector3(3,3,3), + + + // new THREE.Vector3(0,0,4), + // new THREE.Vector3(0,1,4), + // new THREE.Vector3(0,2,4), + // new THREE.Vector3(0,3,4), + + // new THREE.Vector3(1,0,4), + // new THREE.Vector3(1,1,4), + // new THREE.Vector3(1,2,4), + // new THREE.Vector3(1,3,4), + + // new THREE.Vector3(2,0,4), + // new THREE.Vector3(2,1,4), + // new THREE.Vector3(2,2,4), + // new THREE.Vector3(2,3,4), + + // new THREE.Vector3(3,0,4), + // new THREE.Vector3(3,1,4), + // new THREE.Vector3(3,2,4), + // new THREE.Vector3(3,3,4), + + ] + + } + + ]; + + for(var i=0;i<this.voxelIndexList[2].list.length;i++){ + for(var j=0;j<this.voxelIndexList[2].list.length;j++){ + this.voxelIndexList[4].list.push( + this.voxelIndexList[2].list[i].clone().add(new THREE.Vector3(0,0,-1)).multiplyScalar(2).add(this.voxelIndexList[2].list[j].clone()) + ); + } + } + console.log(this.voxelList) + + + +}; + +Swarm.prototype.createRecursionVoxelList=function(){ + // this.voxelIndexList=[ + // new THREE.Vector3(0,0,1), + // new THREE.Vector3(0,1,1), + // new THREE.Vector3(1,0,1), + // new THREE.Vector3(1,1,1), + // new THREE.Vector3(0,0,2), + // new THREE.Vector3(0,1,2), + // new THREE.Vector3(1,0,2), + // new THREE.Vector3(1,1,2) + // ]; + + this.voxelIndexList=[ + new THREE.Vector3(7,0,1), + + new THREE.Vector3(6,0,1), + new THREE.Vector3(6,0,2), + new THREE.Vector3(6,1,2), + new THREE.Vector3(6,2,2), + + new THREE.Vector3(5,3,1), + new THREE.Vector3(5,3,2), + new THREE.Vector3(5,2,2), + new THREE.Vector3(5,1,2), + ]; + + this.voxelIndexList=[ + new THREE.Vector3(5,2,1), + + new THREE.Vector3(5,1,1), + new THREE.Vector3(5,1,2), + new THREE.Vector3(6,1,2), + new THREE.Vector3(7,1,2), + + new THREE.Vector3(8,0,1), + new THREE.Vector3(8,0,2), + new THREE.Vector3(7,0,2), + new THREE.Vector3(6,0,2), + ]; + + + var pickupList=[ + 0, + 0, + + 1, + 2, + 3, + 4, + + 5, + 6, + 7, + 8, + ]; + + i=0; + var scafoldList=[ + new THREE.Vector3(6,1,1), + new THREE.Vector3(6,2,1), + new THREE.Vector3(5,1,1), + new THREE.Vector3(5,2,1), + ]; + + var scafoldList=[ + new THREE.Vector3(5,1,1), + new THREE.Vector3(6,1,1), + new THREE.Vector3(5,0,1), + new THREE.Vector3(6,0,1), + ]; + + + + this.voxelList.push({rank:this.robotScale[i],list:[],originalList:[],pickupList:[],assembled:false,pickedUp:false}) + for (var j=0; j<this.voxelIndexList.length;j++){ + this.voxelList[i].list.push( + this.voxelIndexList[j].clone() + .add(this.startLocations[i].clone().multiplyScalar(1/this.voxelSpacing[i])) + .add(new THREE.Vector3(0,0,0)) + ); + this.voxelList[i].originalList.push(this.voxelList[i].list[j].clone()); + } + this.voxelList[i].pickupList=pickupList.slice(); + for (var j=0; j<scafoldList.length;j++){ + var x=scafoldList[j].x+this.startLocations[i].x/this.voxelSpacing[i]; + var y=scafoldList[j].y+this.startLocations[i].y/this.voxelSpacing[i]; + var z=scafoldList[j].z+this.startLocations[i].z/this.voxelSpacing[i]; + this.buildSingleVoxelAt(new THREE.Vector3(x*this.spacing,y*this.spacing,z*this.spacing)); + this.grid[x][y][z]=true; + } + + this.voxelIndexList=[ + null, + { + size:1, + list:[ + new THREE.Vector3(0,0,0), + + ] + }, + { + size:2, + list:[ + new THREE.Vector3(0,0,1), + new THREE.Vector3(0,1,1), + new THREE.Vector3(1,0,1), + new THREE.Vector3(1,1,1), + new THREE.Vector3(0,0,2), + new THREE.Vector3(0,1,2), + new THREE.Vector3(1,0,2), + new THREE.Vector3(1,1,2) + ] + + }, + null, + { + size:4, + list:[ + + ] + + } + + ]; + + for(var i=0;i<this.voxelIndexList[2].list.length;i++){ + for(var j=0;j<this.voxelIndexList[2].list.length;j++){ + this.voxelIndexList[4].list.push( + this.voxelIndexList[2].list[i].clone().add(new THREE.Vector3(0,0,-1)).multiplyScalar(2).add(this.voxelIndexList[2].list[j].clone()) + ); + } + } + console.log(this.voxelList) + + +}; + +//////////////////////////utilities//////////////////////////// +Swarm.prototype.ClosestPointOnLine= function(s ,d ,vPoint ){ + var tempvPoint=new THREE.Vector3(0,0,0); + tempvPoint.copy(vPoint); + var tempD=new THREE.Vector3(0,0,0); + tempD.copy(d); + var temps=new THREE.Vector3(0,0,0); + temps.copy(d); + + + var vVector1 = tempvPoint.sub(temps) ; + + var vVector2 = tempD.normalize(); + + var t = vVector2.dot( vVector1); + + if (t <= 0) + { + return s; + } + + var vVector3 = vVector2.multiplyScalar(t) ; + + var vClosestPoint = temps.add(vVector3); + + return vClosestPoint; +}; + +Swarm.prototype.buildHelperMeshes= function(robotIndex){ + var material = new THREE.MeshLambertMaterial({ color:0xff7171,}); + var geometry = new THREE.SphereGeometry(0.5, 0.5, 0.5); + this.targetPositionMesh[robotIndex] = new THREE.Mesh(geometry, material); + this.scene.add(this.targetPositionMesh[robotIndex]); + + for (var count=0; count<this.numberOfStartLocations;count++) + { + if(this.startLocations[count]!=-1){ + geometry = new THREE.BoxGeometry(this.spacing, this.spacing, this.spacing); + mesh = new THREE.Mesh(geometry, material); + mesh.position.x=this.startLocations[count].x; + mesh.position.y=this.startLocations[count].y; + mesh.position.z=this.startLocations[count].z-this.spacing/2.0; + this.scene.add(mesh); + + } + + } + + // var material = new THREE.MeshLambertMaterial({ color:0xff7171}); + // material.wireframe=true; + + // count=0 + // geometry = new THREE.BoxGeometry(this.spacing*2, this.spacing*6, this.spacing*6); + // mesh = new THREE.Mesh(geometry, material); + // mesh.position.x=this.startLocations[count].x+1*this.spacing; + // mesh.position.y=this.startLocations[count].y+2*this.spacing; + // mesh.position.z=this.startLocations[count].z+3*this.spacing; + // var box = new THREE.BoxHelper( mesh, 0xff7171 ); + // this.scene.add(box); + + // count=1 + // geometry = new THREE.BoxGeometry(this.spacing*2, this.spacing*6, this.spacing*6); + // mesh = new THREE.Mesh(geometry, material); + // mesh.position.x=this.startLocations[count].x+1*this.spacing; + // mesh.position.y=this.startLocations[count].y-2*this.spacing; + // mesh.position.z=this.startLocations[count].z+3*this.spacing; + // var box = new THREE.BoxHelper( mesh, 0xff7171 ); + // this.scene.add(box); + + // count=2 + // geometry = new THREE.BoxGeometry(this.spacing*2, this.spacing*6, this.spacing*6); + // mesh = new THREE.Mesh(geometry, material); + // mesh.position.x=this.startLocations[count].x-1*this.spacing; + // mesh.position.y=this.startLocations[count].y+2*this.spacing; + // mesh.position.z=this.startLocations[count].z+3*this.spacing; + // var box = new THREE.BoxHelper( mesh, 0xff7171 ); + // this.scene.add(box); + + // count=3 + // geometry = new THREE.BoxGeometry(this.spacing*2, this.spacing*6, this.spacing*6); + // mesh = new THREE.Mesh(geometry, material); + // mesh.position.x=this.startLocations[count].x-1*this.spacing; + // mesh.position.y=this.startLocations[count].y-2*this.spacing; + // mesh.position.z=this.startLocations[count].z+3*this.spacing; + // var box = new THREE.BoxHelper( mesh, 0xff7171 ); + // this.scene.add(box); + + // count=4 + // geometry = new THREE.BoxGeometry(this.spacing*3, this.spacing*6, this.spacing*6); + // mesh = new THREE.Mesh(geometry, material); + // mesh.position.x=this.startLocations[count].x-3.5*this.spacing; + // mesh.position.y=this.startLocations[count].y-2*this.spacing; + // mesh.position.z=this.startLocations[count].z+3*this.spacing; + // var box = new THREE.BoxHelper( mesh, 0xff7171 ); + // this.scene.add(box); + + // count=5 + // geometry = new THREE.BoxGeometry(this.spacing*2, this.spacing*6, this.spacing*6); + // mesh = new THREE.Mesh(geometry, material); + // mesh.position.x=this.startLocations[count].x-1*this.spacing; + // mesh.position.y=this.startLocations[count].y-2*this.spacing; + // mesh.position.z=this.startLocations[count].z+3*this.spacing; + // var box = new THREE.BoxHelper( mesh, 0xff7171 ); + // this.scene.add(box); + + // count=6 + // geometry = new THREE.BoxGeometry(this.spacing*3, this.spacing*6, this.spacing*6); + // mesh = new THREE.Mesh(geometry, material); + // mesh.position.x=this.startLocations[count].x-0.5*this.spacing; + // mesh.position.y=this.startLocations[count].y+2*this.spacing; + // mesh.position.z=this.startLocations[count].z+3*this.spacing; + // var box = new THREE.BoxHelper( mesh, 0xff7171 ); + // this.scene.add(box); + + // count=7 + // geometry = new THREE.BoxGeometry(this.spacing*3, this.spacing*6, this.spacing*6); + // mesh = new THREE.Mesh(geometry, material); + // mesh.position.x=this.startLocations[count].x-0.5*this.spacing; + // mesh.position.y=this.startLocations[count].y+2*this.spacing; + // mesh.position.z=this.startLocations[count].z+3*this.spacing; + // var box = new THREE.BoxHelper( mesh, 0xff7171 ); + // this.scene.add(box); + + +}; + +Swarm.prototype.showTargetPosition= function(robotIndex,targetPos,show){ + if(show){ + this.targetPositionMesh[robotIndex].position.x=targetPos.x; + this.targetPositionMesh[robotIndex].position.y=targetPos.y; + this.targetPositionMesh[robotIndex].position.z=targetPos.z; + this.carriedVoxel[robotIndex][1].visible=true; + this.targetPositionMesh[robotIndex].visible=true; + + }else{ + this.carriedVoxel[robotIndex][0].visible=false; + this.carriedVoxel[robotIndex][1].visible=false; + this.targetPositionMesh[robotIndex].visible=false; + } +}; + + +///////////////////bille/////////////// +Swarm.prototype.loadBilleRecursion= function(fileName){ + function meshToThreejs(mesh, material) { + var loader = new THREE.BufferGeometryLoader(); + var geometry = loader.parse(mesh.toThreejsJSON()); + return new THREE.Mesh(geometry, material); + } + + var fetchPromise = fetch(fileName); + + rhino3dm().then(async m => { + console.log('Loaded rhino3dm.'); + var rhino = m; + + var res = await fetchPromise; + var buffer = await res.arrayBuffer(); + var arr = new Uint8Array(buffer); + var doc = rhino.File3dm.fromByteArray(arr); + + THREE.Object3D.DefaultUp = new THREE.Vector3(0,0,1); + // init(); + // let material = new THREE.MeshNormalMaterial(); + + var voxelSpacing=this.spacing; + + this.billePosition=new THREE.Vector3(0,0,0); + + var material = new THREE.MeshLambertMaterial( { color: 0xbbc3ce } ); + + + var billePos=[ + new THREE.Vector3(0,-voxelSpacing,-(1*voxelSpacing)+voxelSpacing/2.0), + + new THREE.Vector3(0,0,-(1*voxelSpacing)+voxelSpacing/2.0), + new THREE.Vector3(0,0,-(2*voxelSpacing)+voxelSpacing/2.0), + new THREE.Vector3(0,0,-(3*voxelSpacing)+voxelSpacing/2.0), + new THREE.Vector3(0,0,-(4*voxelSpacing)+voxelSpacing/2.0), + + new THREE.Vector3(0,(1*voxelSpacing),-(7*voxelSpacing)+voxelSpacing/2.0), + new THREE.Vector3(0,(1*voxelSpacing),-(6*voxelSpacing)+voxelSpacing/2.0), + new THREE.Vector3(0,(1*voxelSpacing),-(5*voxelSpacing)+voxelSpacing/2.0), + new THREE.Vector3(0,(1*voxelSpacing),-(4*voxelSpacing)+voxelSpacing/2.0), + + + ]; + + this.billeParts=[ + new THREE.Group(), + new THREE.Group(), + new THREE.Group(), + new THREE.Group(), + new THREE.Group(), + new THREE.Group(), + new THREE.Group(), + new THREE.Group(), + new THREE.Group(), + ]; + + + + var objects = doc.objects(); + for (var i = 0; i < objects.count; i++) { + var mesh = objects.get(i).geometry(); + var layer=objects.get(i).attributes().layerIndex; + if(mesh instanceof rhino.Mesh) { + // convert all meshes in 3dm model into threejs objects + var threeMesh = meshToThreejs(mesh, material); + // console.log(layer) + threeMesh.position.x+=billePos[layer-1].x; + threeMesh.position.y+=billePos[layer-1].y; + threeMesh.position.z+=billePos[layer-1].z; + this.billeParts[layer-1].add(threeMesh); + + } + } + + this.startMovement(0,true); + + + }); + +}; \ No newline at end of file diff --git a/recursive_swarm/js/voxel.js b/recursive_swarm/js/voxel.js new file mode 100644 index 0000000000000000000000000000000000000000..7591db1c3daff5d7be1505f5ed014eec9dc29b21 --- /dev/null +++ b/recursive_swarm/js/voxel.js @@ -0,0 +1,3 @@ +var voxelData= new Float32Array([-2.8825788497924805,0.03550343960523605,2.8972835540771484,-2.8825788497924805,0.03550343960523605,2.796863555908203,-2.8115720748901367,-0.03550441190600395,2.796863555908203,-2.8825788497924805,0.03550343960523605,2.8972835540771484,-2.8115720748901367,-0.03550441190600395,2.796863555908203,-2.8115720748901367,-0.03550441190600395,2.8972835540771484,-2.8115720748901367,-0.03550441190600395,2.8972835540771484,-2.8115720748901367,-0.03550441190600395,2.796863555908203,0.03550153225660324,2.8115692138671875,2.796863555908203,-2.8115720748901367,-0.03550441190600395,2.8972835540771484,0.03550153225660324,2.8115692138671875,2.796863555908203,0.03550153225660324,2.8115692138671875,2.8972835540771484,0.03550153225660324,2.8115692138671875,2.8972835540771484,0.03550153225660324,2.8115692138671875,2.796863555908203,-0.035506319254636765,2.8825769424438477,2.796863555908203,0.03550153225660324,2.8115692138671875,2.8972835540771484,-0.035506319254636765,2.8825769424438477,2.796863555908203,-0.035506319254636765,2.8825769424438477,2.8972835540771484,-0.035506319254636765,2.8825769424438477,2.8972835540771484,-0.035506319254636765,2.8825769424438477,2.796863555908203,-2.8825788497924805,0.03550343960523605,2.796863555908203,-0.035506319254636765,2.8825769424438477,2.8972835540771484,-2.8825788497924805,0.03550343960523605,2.796863555908203,-2.8825788497924805,0.03550343960523605,2.8972835540771484,-2.8115720748901367,-0.03550441190600395,2.796863555908203,-2.8825788497924805,0.03550343960523605,2.796863555908203,-0.035506319254636765,2.8825769424438477,2.796863555908203,-2.8115720748901367,-0.03550441190600395,2.796863555908203,-0.035506319254636765,2.8825769424438477,2.796863555908203,0.03550153225660324,2.8115692138671875,2.796863555908203,-0.035506319254636765,2.8825769424438477,2.8972835540771484,-2.8825788497924805,0.03550343960523605,2.8972835540771484,-2.8115720748901367,-0.03550441190600395,2.8972835540771484,-0.035506319254636765,2.8825769424438477,2.8972835540771484,-2.8115720748901367,-0.03550441190600395,2.8972835540771484,0.03550153225660324,2.8115692138671875,2.8972835540771484,0.03550153225660324,2.8825769424438477,2.8972835540771484,0.03550153225660324,2.8825769424438477,2.796863555908203,-0.035506319254636765,2.8115692138671875,2.796863555908203,0.03550153225660324,2.8825769424438477,2.8972835540771484,-0.035506319254636765,2.8115692138671875,2.796863555908203,-0.035506319254636765,2.8115692138671875,2.8972835540771484,-0.035506319254636765,2.8115692138671875,2.8972835540771484,-0.035506319254636765,2.8115692138671875,2.796863555908203,2.811568260192871,-0.03550343960523605,2.796863555908203,-0.035506319254636765,2.8115692138671875,2.8972835540771484,2.811568260192871,-0.03550343960523605,2.796863555908203,2.811568260192871,-0.03550343960523605,2.8972835540771484,2.811568260192871,-0.03550343960523605,2.8972835540771484,2.811568260192871,-0.03550343960523605,2.796863555908203,2.8825759887695312,0.03550441190600395,2.796863555908203,2.811568260192871,-0.03550343960523605,2.8972835540771484,2.8825759887695312,0.03550441190600395,2.796863555908203,2.8825759887695312,0.03550441190600395,2.8972835540771484,2.8825759887695312,0.03550441190600395,2.8972835540771484,2.8825759887695312,0.03550441190600395,2.796863555908203,0.03550153225660324,2.8825769424438477,2.796863555908203,2.8825759887695312,0.03550441190600395,2.8972835540771484,0.03550153225660324,2.8825769424438477,2.796863555908203,0.03550153225660324,2.8825769424438477,2.8972835540771484,-0.035506319254636765,2.8115692138671875,2.796863555908203,0.03550153225660324,2.8825769424438477,2.796863555908203,2.8825759887695312,0.03550441190600395,2.796863555908203,-0.035506319254636765,2.8115692138671875,2.796863555908203,2.8825759887695312,0.03550441190600395,2.796863555908203,2.811568260192871,-0.03550343960523605,2.796863555908203,2.8825759887695312,0.03550441190600395,2.8972835540771484,0.03550153225660324,2.8825769424438477,2.8972835540771484,-0.035506319254636765,2.8115692138671875,2.8972835540771484,2.8825759887695312,0.03550441190600395,2.8972835540771484,-0.035506319254636765,2.8115692138671875,2.8972835540771484,2.811568260192871,-0.03550343960523605,2.8972835540771484,2.8825759887695312,-0.03550441190600395,2.8972835540771484,2.8825759887695312,-0.03550441190600395,2.796863555908203,2.811568260192871,0.03550441190600395,2.796863555908203,2.8825759887695312,-0.03550441190600395,2.8972835540771484,2.811568260192871,0.03550441190600395,2.796863555908203,2.811568260192871,0.03550441190600395,2.8972835540771484,2.811568260192871,0.03550441190600395,2.8972835540771484,2.811568260192871,0.03550441190600395,2.796863555908203,-0.035506319254636765,-2.811570167541504,2.796863555908203,2.811568260192871,0.03550441190600395,2.8972835540771484,-0.035506319254636765,-2.811570167541504,2.796863555908203,-0.035506319254636765,-2.811570167541504,2.8972835540771484,-0.035506319254636765,-2.811570167541504,2.8972835540771484,-0.035506319254636765,-2.811570167541504,2.796863555908203,0.03550153225660324,-2.882577896118164,2.796863555908203,-0.035506319254636765,-2.811570167541504,2.8972835540771484,0.03550153225660324,-2.882577896118164,2.796863555908203,0.03550153225660324,-2.882577896118164,2.8972835540771484,0.03550153225660324,-2.882577896118164,2.8972835540771484,0.03550153225660324,-2.882577896118164,2.796863555908203,2.8825759887695312,-0.03550441190600395,2.796863555908203,0.03550153225660324,-2.882577896118164,2.8972835540771484,2.8825759887695312,-0.03550441190600395,2.796863555908203,2.8825759887695312,-0.03550441190600395,2.8972835540771484,2.811568260192871,0.03550441190600395,2.796863555908203,2.8825759887695312,-0.03550441190600395,2.796863555908203,0.03550153225660324,-2.882577896118164,2.796863555908203,2.811568260192871,0.03550441190600395,2.796863555908203,0.03550153225660324,-2.882577896118164,2.796863555908203,-0.035506319254636765,-2.811570167541504,2.796863555908203,0.03550153225660324,-2.882577896118164,2.8972835540771484,2.8825759887695312,-0.03550441190600395,2.8972835540771484,2.811568260192871,0.03550441190600395,2.8972835540771484,0.03550153225660324,-2.882577896118164,2.8972835540771484,2.811568260192871,0.03550441190600395,2.8972835540771484,-0.035506319254636765,-2.811570167541504,2.8972835540771484,-0.33316755294799805,-3,2.3311800956726074,0.33342936635017395,-3,2.331148147583008,0.33343714475631714,-2.9999990463256836,2.9999828338623047,-0.33316755294799805,-3,2.3311800956726074,0.33343714475631714,-2.9999990463256836,2.9999828338623047,-0.33315977454185486,-3,3.0000152587890625,-0.33315977454185486,-3,3.0000152587890625,0.33343714475631714,-2.9999990463256836,2.9999828338623047,0.33343714475631714,-2.332754135131836,2.9999828338623047,-0.33315977454185486,-3,3.0000152587890625,0.33343714475631714,-2.332754135131836,2.9999828338623047,-0.33315977454185486,-2.332754135131836,3.0000152587890625,0.33343714475631714,-2.9999990463256836,2.9999828338623047,0.33342936635017395,-3,2.331148147583008,0.33343714475631714,-2.332754135131836,2.9999828338623047,-0.33315977454185486,-2.332754135131836,3.0000152587890625,-0.33316755294799805,-3,2.3311800956726074,-0.33315977454185486,-3,3.0000152587890625,-0.33316755294799805,-3,2.3311800956726074,0.33343714475631714,-2.332754135131836,2.9999828338623047,0.33342936635017395,-3,2.331148147583008,0.33343714475631714,-2.332754135131836,2.9999828338623047,-0.33316755294799805,-3,2.3311800956726074,-0.33315977454185486,-2.332754135131836,3.0000152587890625,0.3331647217273712,2.9999990463256836,2.3311800956726074,-0.33343222737312317,2.9999990463256836,2.331148147583008,-0.33344194293022156,2.9999990463256836,2.9999828338623047,0.3331647217273712,2.9999990463256836,2.3311800956726074,-0.33344194293022156,2.9999990463256836,2.9999828338623047,0.333156943321228,2.9999990463256836,3.0000152587890625,0.333156943321228,2.9999990463256836,3.0000152587890625,-0.33344194293022156,2.9999990463256836,2.9999828338623047,-0.33344000577926636,2.332752227783203,2.9999828338623047,0.333156943321228,2.9999990463256836,3.0000152587890625,-0.33344000577926636,2.332752227783203,2.9999828338623047,0.333156943321228,2.332754135131836,3.0000152587890625,-0.33344194293022156,2.9999990463256836,2.9999828338623047,-0.33343222737312317,2.9999990463256836,2.331148147583008,-0.33344000577926636,2.332752227783203,2.9999828338623047,0.333156943321228,2.332754135131836,3.0000152587890625,0.3331647217273712,2.9999990463256836,2.3311800956726074,0.333156943321228,2.9999990463256836,3.0000152587890625,0.3331647217273712,2.9999990463256836,2.3311800956726074,-0.33344000577926636,2.332752227783203,2.9999828338623047,-0.33343222737312317,2.9999990463256836,2.331148147583008,-0.33344000577926636,2.332752227783203,2.9999828338623047,0.3331647217273712,2.9999990463256836,2.3311800956726074,0.333156943321228,2.332754135131836,3.0000152587890625,2.999998092651367,-0.33316564559936523,2.3311800956726074,2.999998092651367,0.33342933654785156,2.331148147583008,2.999998092651367,0.33343711495399475,2.9999828338623047,2.999998092651367,-0.33316564559936523,2.3311800956726074,2.999998092651367,0.33343711495399475,2.9999828338623047,2.999998092651367,-0.33315786719322205,3.0000152587890625,2.999998092651367,-0.33315786719322205,3.0000152587890625,2.999998092651367,0.33343711495399475,2.9999828338623047,2.3327512741088867,0.33343711495399475,2.9999828338623047,2.999998092651367,-0.33315786719322205,3.0000152587890625,2.3327512741088867,0.33343711495399475,2.9999828338623047,2.3327512741088867,-0.33315786719322205,3.0000152587890625,2.999998092651367,0.33343711495399475,2.9999828338623047,2.999998092651367,0.33342933654785156,2.331148147583008,2.3327512741088867,0.33343711495399475,2.9999828338623047,2.3327512741088867,-0.33315786719322205,3.0000152587890625,2.999998092651367,-0.33316564559936523,2.3311800956726074,2.999998092651367,-0.33315786719322205,3.0000152587890625,2.999998092651367,-0.33316564559936523,2.3311800956726074,2.3327512741088867,0.33343711495399475,2.9999828338623047,2.999998092651367,0.33342933654785156,2.331148147583008,2.3327512741088867,0.33343711495399475,2.9999828338623047,2.999998092651367,-0.33316564559936523,2.3311800956726074,2.3327512741088867,-0.33315786719322205,3.0000152587890625,-3.000001907348633,0.33316564559936523,2.3311800956726074,-3.000001907348633,-0.33343032002449036,2.331148147583008,-3.000001907348633,-0.33343809843063354,2.9999828338623047,-3.000001907348633,0.33316564559936523,2.3311800956726074,-3.000001907348633,-0.33343809843063354,2.9999828338623047,-3.000001907348633,0.33315688371658325,3.0000152587890625,-3.000001907348633,0.33315688371658325,3.0000152587890625,-3.000001907348633,-0.33343809843063354,2.9999828338623047,-2.3327550888061523,-0.33343711495399475,2.9999828338623047,-3.000001907348633,0.33315688371658325,3.0000152587890625,-2.3327550888061523,-0.33343711495399475,2.9999828338623047,-2.3327550888061523,0.33315688371658325,3.0000152587890625,-3.000001907348633,-0.33343809843063354,2.9999828338623047,-3.000001907348633,-0.33343032002449036,2.331148147583008,-2.3327550888061523,-0.33343711495399475,2.9999828338623047,-2.3327550888061523,0.33315688371658325,3.0000152587890625,-3.000001907348633,0.33316564559936523,2.3311800956726074,-3.000001907348633,0.33315688371658325,3.0000152587890625,-3.000001907348633,0.33316564559936523,2.3311800956726074,-2.3327550888061523,-0.33343711495399475,2.9999828338623047,-3.000001907348633,-0.33343032002449036,2.331148147583008,-2.3327550888061523,-0.33343711495399475,2.9999828338623047,-3.000001907348633,0.33316564559936523,2.3311800956726074,-2.3327550888061523,0.33315688371658325,3.0000152587890625,-0.03550437465310097,-2.882577896118164,2.8972835540771484,-0.03550437465310097,-2.882577896118164,2.796863555908203,0.03550153225660324,-2.811570167541504,2.796863555908203,-0.03550437465310097,-2.882577896118164,2.8972835540771484,0.03550153225660324,-2.811570167541504,2.796863555908203,0.03550153225660324,-2.811570167541504,2.8972835540771484,0.03550153225660324,-2.811570167541504,2.8972835540771484,0.03550153225660324,-2.811570167541504,2.796863555908203,-2.8115711212158203,0.03550343960523605,2.796863555908203,0.03550153225660324,-2.811570167541504,2.8972835540771484,-2.8115711212158203,0.03550343960523605,2.796863555908203,-2.8115711212158203,0.03550343960523605,2.8972835540771484,-2.8115711212158203,0.03550343960523605,2.8972835540771484,-2.8115711212158203,0.03550343960523605,2.796863555908203,-2.8825788497924805,-0.03550441190600395,2.796863555908203,-2.8115711212158203,0.03550343960523605,2.8972835540771484,-2.8825788497924805,-0.03550441190600395,2.796863555908203,-2.8825788497924805,-0.03550441190600395,2.8972835540771484,-2.8825788497924805,-0.03550441190600395,2.8972835540771484,-2.8825788497924805,-0.03550441190600395,2.796863555908203,-0.03550437465310097,-2.882577896118164,2.796863555908203,-2.8825788497924805,-0.03550441190600395,2.8972835540771484,-0.03550437465310097,-2.882577896118164,2.796863555908203,-0.03550437465310097,-2.882577896118164,2.8972835540771484,0.03550153225660324,-2.811570167541504,2.796863555908203,-0.03550437465310097,-2.882577896118164,2.796863555908203,-2.8825788497924805,-0.03550441190600395,2.796863555908203,0.03550153225660324,-2.811570167541504,2.796863555908203,-2.8825788497924805,-0.03550441190600395,2.796863555908203,-2.8115711212158203,0.03550343960523605,2.796863555908203,-2.8825788497924805,-0.03550441190600395,2.8972835540771484,-0.03550437465310097,-2.882577896118164,2.8972835540771484,0.03550153225660324,-2.811570167541504,2.8972835540771484,-2.8825788497924805,-0.03550441190600395,2.8972835540771484,0.03550153225660324,-2.811570167541504,2.8972835540771484,-2.8115711212158203,0.03550343960523605,2.8972835540771484,-3.000001907348633,-0.33316564559936523,-2.3311803340911865,-3.000001907348633,0.33342933654785156,-2.3311479091644287,-3.000001907348633,0.33343809843063354,-2.999983072280884,-3.000001907348633,-0.33316564559936523,-2.3311803340911865,-3.000001907348633,0.33343809843063354,-2.999983072280884,-3.000001907348633,-0.33315786719322205,-3.0000150203704834,-3.000001907348633,-0.33315786719322205,-3.0000150203704834,-3.000001907348633,0.33343809843063354,-2.999983072280884,-2.3327550888061523,0.33343711495399475,-2.999983072280884,-3.000001907348633,-0.33315786719322205,-3.0000150203704834,-2.3327550888061523,0.33343711495399475,-2.999983072280884,-2.3327550888061523,-0.33315786719322205,-3.0000150203704834,-3.000001907348633,0.33343809843063354,-2.999983072280884,-3.000001907348633,0.33342933654785156,-2.3311479091644287,-2.3327550888061523,0.33343711495399475,-2.999983072280884,-2.3327550888061523,-0.33315786719322205,-3.0000150203704834,-3.000001907348633,-0.33316564559936523,-2.3311803340911865,-3.000001907348633,-0.33315786719322205,-3.0000150203704834,-3.000001907348633,-0.33316564559936523,-2.3311803340911865,-2.3327550888061523,0.33343711495399475,-2.999983072280884,-3.000001907348633,0.33342933654785156,-2.3311479091644287,-2.3327550888061523,0.33343711495399475,-2.999983072280884,-3.000001907348633,-0.33316564559936523,-2.3311803340911865,-2.3327550888061523,-0.33315786719322205,-3.0000150203704834,2.999998092651367,0.33316469192504883,-2.3311803340911865,2.999998092651367,-0.33343032002449036,-2.3311479091644287,2.999998092651367,-0.33343809843063354,-2.999983072280884,2.999998092651367,0.33316469192504883,-2.3311803340911865,2.999998092651367,-0.33343809843063354,-2.999983072280884,2.999998092651367,0.33315688371658325,-3.0000150203704834,2.999998092651367,0.33315688371658325,-3.0000150203704834,2.999998092651367,-0.33343809843063354,-2.999983072280884,2.3327512741088867,-0.33343809843063354,-2.999983072280884,2.999998092651367,0.33315688371658325,-3.0000150203704834,2.3327512741088867,-0.33343809843063354,-2.999983072280884,2.3327512741088867,0.33315786719322205,-3.0000150203704834,2.999998092651367,-0.33343809843063354,-2.999983072280884,2.999998092651367,-0.33343032002449036,-2.3311479091644287,2.3327512741088867,-0.33343809843063354,-2.999983072280884,2.3327512741088867,0.33315786719322205,-3.0000150203704834,2.999998092651367,0.33316469192504883,-2.3311803340911865,2.999998092651367,0.33315688371658325,-3.0000150203704834,2.999998092651367,0.33316469192504883,-2.3311803340911865,2.3327512741088867,-0.33343809843063354,-2.999983072280884,2.999998092651367,-0.33343032002449036,-2.3311479091644287,2.3327512741088867,-0.33343809843063354,-2.999983072280884,2.999998092651367,0.33316469192504883,-2.3311803340911865,2.3327512741088867,0.33315786719322205,-3.0000150203704834,-2.3311827182769775,2.9999990463256836,0.3331659138202667,-2.3311495780944824,2.9999990463256836,-0.3334302306175232,-2.9999845027923584,2.9999990463256836,-0.33343827724456787,-2.3311827182769775,2.9999990463256836,0.3331659138202667,-2.9999845027923584,2.9999990463256836,-0.33343827724456787,-3.0000174045562744,2.9999990463256836,0.33315786719322205,-3.0000174045562744,2.9999990463256836,0.33315786719322205,-2.9999845027923584,2.9999990463256836,-0.33343827724456787,-2.9999845027923584,2.332754135131836,-0.33343827724456787,-3.0000174045562744,2.9999990463256836,0.33315786719322205,-2.9999845027923584,2.332754135131836,-0.33343827724456787,-3.0000174045562744,2.332754135131836,0.33315786719322205,-2.9999845027923584,2.9999990463256836,-0.33343827724456787,-2.3311495780944824,2.9999990463256836,-0.3334302306175232,-2.9999845027923584,2.332754135131836,-0.33343827724456787,-3.0000174045562744,2.332754135131836,0.33315786719322205,-2.3311827182769775,2.9999990463256836,0.3331659138202667,-3.0000174045562744,2.9999990463256836,0.33315786719322205,-2.3311827182769775,2.9999990463256836,0.3331659138202667,-2.9999845027923584,2.332754135131836,-0.33343827724456787,-2.3311495780944824,2.9999990463256836,-0.3334302306175232,-2.9999845027923584,2.332754135131836,-0.33343827724456787,-2.3311827182769775,2.9999990463256836,0.3331659138202667,-3.0000174045562744,2.332754135131836,0.33315786719322205,2.331178903579712,2.9999990463256836,-0.3331659138202667,2.3311476707458496,2.9999990463256836,0.3334302306175232,2.9999825954437256,2.9999990463256836,0.33343827724456787,2.331178903579712,2.9999990463256836,-0.3331659138202667,2.9999825954437256,2.9999990463256836,0.33343827724456787,3.000013589859009,2.9999990463256836,-0.33315786719322205,3.000013589859009,2.9999990463256836,-0.33315786719322205,2.9999825954437256,2.9999990463256836,0.33343827724456787,2.9999825954437256,2.332754135131836,0.33343827724456787,3.000013589859009,2.9999990463256836,-0.33315786719322205,2.9999825954437256,2.332754135131836,0.33343827724456787,3.000013589859009,2.332754135131836,-0.33315786719322205,2.9999825954437256,2.9999990463256836,0.33343827724456787,2.3311476707458496,2.9999990463256836,0.3334302306175232,2.9999825954437256,2.332754135131836,0.33343827724456787,3.000013589859009,2.332754135131836,-0.33315786719322205,2.331178903579712,2.9999990463256836,-0.3331659138202667,3.000013589859009,2.9999990463256836,-0.33315786719322205,2.331178903579712,2.9999990463256836,-0.3331659138202667,2.9999825954437256,2.332754135131836,0.33343827724456787,2.3311476707458496,2.9999990463256836,0.3334302306175232,2.9999825954437256,2.332754135131836,0.33343827724456787,2.331178903579712,2.9999990463256836,-0.3331659138202667,3.000013589859009,2.332754135131836,-0.33315786719322205,-0.33316951990127563,2.9999990463256836,-2.3311803340911865,0.33342936635017395,2.9999990463256836,-2.3311479091644287,0.33343714475631714,2.9999990463256836,-2.999983072280884,-0.33316951990127563,2.9999990463256836,-2.3311803340911865,0.33343714475631714,2.9999990463256836,-2.999983072280884,-0.33315977454185486,2.9999990463256836,-3.0000150203704834,-0.33315977454185486,2.9999990463256836,-3.0000150203704834,0.33343714475631714,2.9999990463256836,-2.999983072280884,0.33343714475631714,2.332754135131836,-2.999983072280884,-0.33315977454185486,2.9999990463256836,-3.0000150203704834,0.33343714475631714,2.332754135131836,-2.999983072280884,-0.33316171169281006,2.332754135131836,-3.0000150203704834,0.33343714475631714,2.9999990463256836,-2.999983072280884,0.33342936635017395,2.9999990463256836,-2.3311479091644287,0.33343714475631714,2.332754135131836,-2.999983072280884,-0.33316171169281006,2.332754135131836,-3.0000150203704834,-0.33316951990127563,2.9999990463256836,-2.3311803340911865,-0.33315977454185486,2.9999990463256836,-3.0000150203704834,-0.33316951990127563,2.9999990463256836,-2.3311803340911865,0.33343714475631714,2.332754135131836,-2.999983072280884,0.33342936635017395,2.9999990463256836,-2.3311479091644287,0.33343714475631714,2.332754135131836,-2.999983072280884,-0.33316951990127563,2.9999990463256836,-2.3311803340911865,-0.33316171169281006,2.332754135131836,-3.0000150203704834,0.3331647217273712,-2.9999990463256836,-2.3311803340911865,-0.3334302604198456,-3,-2.3311479091644287,-0.33344000577926636,-3,-2.999983072280884,0.3331647217273712,-2.9999990463256836,-2.3311803340911865,-0.33344000577926636,-3,-2.999983072280884,0.333156943321228,-3,-3.0000150203704834,0.333156943321228,-3,-3.0000150203704834,-0.33344000577926636,-3,-2.999983072280884,-0.33344194293022156,-2.332754135131836,-2.999983072280884,0.333156943321228,-3,-3.0000150203704834,-0.33344194293022156,-2.332754135131836,-2.999983072280884,0.333156943321228,-2.332754135131836,-3.0000150203704834,-0.33344000577926636,-3,-2.999983072280884,-0.3334302604198456,-3,-2.3311479091644287,-0.33344194293022156,-2.332754135131836,-2.999983072280884,0.333156943321228,-2.332754135131836,-3.0000150203704834,0.3331647217273712,-2.9999990463256836,-2.3311803340911865,0.333156943321228,-3,-3.0000150203704834,0.3331647217273712,-2.9999990463256836,-2.3311803340911865,-0.33344194293022156,-2.332754135131836,-2.999983072280884,-0.3334302604198456,-3,-2.3311479091644287,-0.33344194293022156,-2.332754135131836,-2.999983072280884,0.3331647217273712,-2.9999990463256836,-2.3311803340911865,0.333156943321228,-2.332754135131836,-3.0000150203704834,-2.3311827182769775,-2.9999990463256836,-0.3331659138202667,-2.3311495780944824,-2.9999990463256836,0.3334302306175232,-2.9999845027923584,-3,0.33343827724456787,-2.3311827182769775,-2.9999990463256836,-0.3331659138202667,-2.9999845027923584,-3,0.33343827724456787,-3.0000174045562744,-3,-0.33315786719322205,-3.0000174045562744,-3,-0.33315786719322205,-2.9999845027923584,-3,0.33343827724456787,-2.9999845027923584,-2.332754135131836,0.33343827724456787,-3.0000174045562744,-3,-0.33315786719322205,-2.9999845027923584,-2.332754135131836,0.33343827724456787,-3.0000174045562744,-2.332754135131836,-0.33315786719322205,-2.9999845027923584,-3,0.33343827724456787,-2.3311495780944824,-2.9999990463256836,0.3334302306175232,-2.9999845027923584,-2.332754135131836,0.33343827724456787,-3.0000174045562744,-2.332754135131836,-0.33315786719322205,-2.3311827182769775,-2.9999990463256836,-0.3331659138202667,-3.0000174045562744,-3,-0.33315786719322205,-2.3311827182769775,-2.9999990463256836,-0.3331659138202667,-2.9999845027923584,-2.332754135131836,0.33343827724456787,-2.3311495780944824,-2.9999990463256836,0.3334302306175232,-2.9999845027923584,-2.332754135131836,0.33343827724456787,-2.3311827182769775,-2.9999990463256836,-0.3331659138202667,-3.0000174045562744,-2.332754135131836,-0.33315786719322205,2.331178903579712,-3,0.3331659138202667,2.3311476707458496,-3,-0.3334302306175232,2.9999825954437256,-3,-0.33343827724456787,2.331178903579712,-3,0.3331659138202667,2.9999825954437256,-3,-0.33343827724456787,3.000013589859009,-2.9999990463256836,0.33315786719322205,3.000013589859009,-2.9999990463256836,0.33315786719322205,2.9999825954437256,-3,-0.33343827724456787,2.9999825954437256,-2.332754135131836,-0.33343827724456787,3.000013589859009,-2.9999990463256836,0.33315786719322205,2.9999825954437256,-2.332754135131836,-0.33343827724456787,3.000013589859009,-2.332754135131836,0.33315786719322205,2.9999825954437256,-3,-0.33343827724456787,2.3311476707458496,-3,-0.3334302306175232,2.9999825954437256,-2.332754135131836,-0.33343827724456787,3.000013589859009,-2.332754135131836,0.33315786719322205,2.331178903579712,-3,0.3331659138202667,3.000013589859009,-2.9999990463256836,0.33315786719322205,2.331178903579712,-3,0.3331659138202667,2.9999825954437256,-2.332754135131836,-0.33343827724456787,2.3311476707458496,-3,-0.3334302306175232,2.9999825954437256,-2.332754135131836,-0.33343827724456787,2.331178903579712,-3,0.3331659138202667,3.000013589859009,-2.332754135131836,0.33315786719322205,-2.7968649864196777,-2.882577896118164,0.03550359234213829,-2.8972856998443604,-2.882577896118164,0.03550359234213829,-2.8972856998443604,-2.811570167541504,-0.03550419956445694,-2.7968649864196777,-2.882577896118164,0.03550359234213829,-2.8972856998443604,-2.811570167541504,-0.03550419956445694,-2.7968649864196777,-2.811570167541504,-0.03550419956445694,-2.7968649864196777,-2.811570167541504,-0.03550419956445694,-2.8972856998443604,-2.811570167541504,-0.03550419956445694,-2.8972856998443604,0.03550343960523605,2.8115694522857666,-2.7968649864196777,-2.811570167541504,-0.03550419956445694,-2.8972856998443604,0.03550343960523605,2.8115694522857666,-2.7968649864196777,0.03550343960523605,2.8115694522857666,-2.7968649864196777,0.03550343960523605,2.8115694522857666,-2.8972856998443604,0.03550343960523605,2.8115694522857666,-2.8972856998443604,-0.03550441190600395,2.882577419281006,-2.7968649864196777,0.03550343960523605,2.8115694522857666,-2.8972856998443604,-0.03550441190600395,2.882577419281006,-2.7968649864196777,-0.03550441190600395,2.882577419281006,-2.7968649864196777,-0.03550441190600395,2.882577419281006,-2.8972856998443604,-0.03550441190600395,2.882577419281006,-2.8972856998443604,-2.882577896118164,0.03550359234213829,-2.7968649864196777,-0.03550441190600395,2.882577419281006,-2.8972856998443604,-2.882577896118164,0.03550359234213829,-2.7968649864196777,-2.882577896118164,0.03550359234213829,-2.8972856998443604,-2.811570167541504,-0.03550419956445694,-2.8972856998443604,-2.882577896118164,0.03550359234213829,-2.8972856998443604,-0.03550441190600395,2.882577419281006,-2.8972856998443604,-2.811570167541504,-0.03550419956445694,-2.8972856998443604,-0.03550441190600395,2.882577419281006,-2.8972856998443604,0.03550343960523605,2.8115694522857666,-2.7968649864196777,-0.03550441190600395,2.882577419281006,-2.7968649864196777,-2.882577896118164,0.03550359234213829,-2.7968649864196777,-2.811570167541504,-0.03550419956445694,-2.7968649864196777,-0.03550441190600395,2.882577419281006,-2.7968649864196777,-2.811570167541504,-0.03550419956445694,-2.7968649864196777,0.03550343960523605,2.8115694522857666,-2.7968649864196777,-0.03550441190600395,-2.882577896118164,-2.8972856998443604,-0.03550441190600395,-2.882577896118164,-2.8972856998443604,0.03550441190600395,-2.8115696907043457,-2.7968649864196777,-0.03550441190600395,-2.882577896118164,-2.8972856998443604,0.03550441190600395,-2.8115696907043457,-2.7968649864196777,0.03550441190600395,-2.8115696907043457,-2.7968649864196777,0.03550441190600395,-2.8115696907043457,-2.8972856998443604,0.03550441190600395,-2.8115696907043457,-2.8972856998443604,-2.811570167541504,0.035504017025232315,-2.7968649864196777,0.03550441190600395,-2.8115696907043457,-2.8972856998443604,-2.811570167541504,0.035504017025232315,-2.7968649864196777,-2.811570167541504,0.035504017025232315,-2.7968649864196777,-2.811570167541504,0.035504017025232315,-2.8972856998443604,-2.811570167541504,0.035504017025232315,-2.8972856998443604,-2.882577896118164,-0.03550419956445694,-2.7968649864196777,-2.811570167541504,0.035504017025232315,-2.8972856998443604,-2.882577896118164,-0.03550419956445694,-2.7968649864196777,-2.882577896118164,-0.03550419956445694,-2.7968649864196777,-2.882577896118164,-0.03550419956445694,-2.8972856998443604,-2.882577896118164,-0.03550419956445694,-2.8972856998443604,-0.03550441190600395,-2.882577896118164,-2.7968649864196777,-2.882577896118164,-0.03550419956445694,-2.8972856998443604,-0.03550441190600395,-2.882577896118164,-2.7968649864196777,-0.03550441190600395,-2.882577896118164,-2.8972856998443604,0.03550441190600395,-2.8115696907043457,-2.8972856998443604,-0.03550441190600395,-2.882577896118164,-2.8972856998443604,-2.882577896118164,-0.03550419956445694,-2.8972856998443604,0.03550441190600395,-2.8115696907043457,-2.8972856998443604,-2.882577896118164,-0.03550419956445694,-2.8972856998443604,-2.811570167541504,0.035504017025232315,-2.7968649864196777,-2.882577896118164,-0.03550419956445694,-2.7968649864196777,-0.03550441190600395,-2.882577896118164,-2.7968649864196777,0.03550441190600395,-2.8115696907043457,-2.7968649864196777,-2.882577896118164,-0.03550419956445694,-2.7968649864196777,0.03550441190600395,-2.8115696907043457,-2.7968649864196777,-2.811570167541504,0.035504017025232315,-2.7968649864196777,2.8825769424438477,-0.03550334647297859,-2.8972856998443604,2.8825769424438477,-0.03550334647297859,-2.8972856998443604,2.8115692138671875,0.035504382103681564,-2.7968649864196777,2.8825769424438477,-0.03550334647297859,-2.8972856998443604,2.8115692138671875,0.035504382103681564,-2.7968649864196777,2.8115692138671875,0.035504382103681564,-2.7968649864196777,2.8115692138671875,0.035504382103681564,-2.8972856998443604,2.8115692138671875,0.035504382103681564,-2.8972856998443604,-0.03550343960523605,-2.8115694522857666,-2.7968649864196777,2.8115692138671875,0.035504382103681564,-2.8972856998443604,-0.03550343960523605,-2.8115694522857666,-2.7968649864196777,-0.03550343960523605,-2.8115694522857666,-2.7968649864196777,-0.03550343960523605,-2.8115694522857666,-2.8972856998443604,-0.03550343960523605,-2.8115694522857666,-2.8972856998443604,0.03550441190600395,-2.8825769424438477,-2.7968649864196777,-0.03550343960523605,-2.8115694522857666,-2.8972856998443604,0.03550441190600395,-2.8825769424438477,-2.7968649864196777,0.03550441190600395,-2.8825769424438477,-2.7968649864196777,0.03550441190600395,-2.8825769424438477,-2.8972856998443604,0.03550441190600395,-2.8825769424438477,-2.8972856998443604,2.8825769424438477,-0.03550334647297859,-2.7968649864196777,0.03550441190600395,-2.8825769424438477,-2.8972856998443604,2.8825769424438477,-0.03550334647297859,-2.7968649864196777,2.8825769424438477,-0.03550334647297859,-2.8972856998443604,2.8115692138671875,0.035504382103681564,-2.8972856998443604,2.8825769424438477,-0.03550334647297859,-2.8972856998443604,0.03550441190600395,-2.8825769424438477,-2.8972856998443604,2.8115692138671875,0.035504382103681564,-2.8972856998443604,0.03550441190600395,-2.8825769424438477,-2.8972856998443604,-0.03550343960523605,-2.8115694522857666,-2.7968649864196777,0.03550441190600395,-2.8825769424438477,-2.7968649864196777,2.8825769424438477,-0.03550334647297859,-2.7968649864196777,2.8115692138671875,0.035504382103681564,-2.7968649864196777,0.03550441190600395,-2.8825769424438477,-2.7968649864196777,2.8115692138671875,0.035504382103681564,-2.7968649864196777,-0.03550343960523605,-2.8115694522857666,-2.7968649864196777,0.03550343960523605,2.882577419281006,-2.8972856998443604,0.03550343960523605,2.882577419281006,-2.8972856998443604,-0.03550441190600395,2.811569929122925,-2.7968649864196777,0.03550343960523605,2.882577419281006,-2.8972856998443604,-0.03550441190600395,2.811569929122925,-2.7968649864196777,-0.03550441190600395,2.811569929122925,-2.7968649864196777,-0.03550441190600395,2.811569929122925,-2.8972856998443604,-0.03550441190600395,2.811569929122925,-2.8972856998443604,2.8115692138671875,-0.03550383448600769,-2.7968649864196777,-0.03550441190600395,2.811569929122925,-2.8972856998443604,2.8115692138671875,-0.03550383448600769,-2.7968649864196777,2.8115692138671875,-0.03550383448600769,-2.7968649864196777,2.8115692138671875,-0.03550383448600769,-2.8972856998443604,2.8115692138671875,-0.03550383448600769,-2.8972856998443604,2.8825769424438477,0.035503651946783066,-2.7968649864196777,2.8115692138671875,-0.03550383448600769,-2.8972856998443604,2.8825769424438477,0.035503651946783066,-2.7968649864196777,2.8825769424438477,0.035503651946783066,-2.7968649864196777,2.8825769424438477,0.035503651946783066,-2.8972856998443604,2.8825769424438477,0.035503651946783066,-2.8972856998443604,0.03550343960523605,2.882577419281006,-2.7968649864196777,2.8825769424438477,0.035503651946783066,-2.8972856998443604,0.03550343960523605,2.882577419281006,-2.7968649864196777,0.03550343960523605,2.882577419281006,-2.8972856998443604,-0.03550441190600395,2.811569929122925,-2.8972856998443604,0.03550343960523605,2.882577419281006,-2.8972856998443604,2.8825769424438477,0.035503651946783066,-2.8972856998443604,-0.03550441190600395,2.811569929122925,-2.8972856998443604,2.8825769424438477,0.035503651946783066,-2.8972856998443604,2.8115692138671875,-0.03550383448600769,-2.7968649864196777,2.8825769424438477,0.035503651946783066,-2.7968649864196777,0.03550343960523605,2.882577419281006,-2.7968649864196777,-0.03550441190600395,2.811569929122925,-2.7968649864196777,2.8825769424438477,0.035503651946783066,-2.7968649864196777,-0.03550441190600395,2.811569929122925,-2.7968649864196777,2.8115692138671875,-0.03550383448600769,-0.035506319254636765,-2.7968640327453613,2.882577419281006,-0.035506319254636765,-2.8972837924957275,2.882577419281006,0.03550153225660324,-2.8972837924957275,2.811569929122925,-0.035506319254636765,-2.7968640327453613,2.882577419281006,0.03550153225660324,-2.8972837924957275,2.811569929122925,0.03550153225660324,-2.7968640327453613,2.811569929122925,0.03550153225660324,-2.7968640327453613,2.811569929122925,0.03550153225660324,-2.8972837924957275,2.811569929122925,-2.8115711212158203,-2.8972837924957275,-0.03550383448600769,0.03550153225660324,-2.7968640327453613,2.811569929122925,-2.8115711212158203,-2.8972837924957275,-0.03550383448600769,-2.8115711212158203,-2.7968640327453613,-0.03550383448600769,-2.8115711212158203,-2.7968640327453613,-0.03550383448600769,-2.8115711212158203,-2.8972837924957275,-0.03550383448600769,-2.8825788497924805,-2.8972837924957275,0.035503651946783066,-2.8115711212158203,-2.7968640327453613,-0.03550383448600769,-2.8825788497924805,-2.8972837924957275,0.035503651946783066,-2.8825788497924805,-2.7968640327453613,0.035503651946783066,-2.8825788497924805,-2.7968640327453613,0.035503651946783066,-2.8825788497924805,-2.8972837924957275,0.035503651946783066,-0.035506319254636765,-2.8972837924957275,2.882577419281006,-2.8825788497924805,-2.7968640327453613,0.035503651946783066,-0.035506319254636765,-2.8972837924957275,2.882577419281006,-0.035506319254636765,-2.7968640327453613,2.882577419281006,0.03550153225660324,-2.8972837924957275,2.811569929122925,-0.035506319254636765,-2.8972837924957275,2.882577419281006,-2.8825788497924805,-2.8972837924957275,0.035503651946783066,0.03550153225660324,-2.8972837924957275,2.811569929122925,-2.8825788497924805,-2.8972837924957275,0.035503651946783066,-2.8115711212158203,-2.8972837924957275,-0.03550383448600769,-2.8825788497924805,-2.7968640327453613,0.035503651946783066,-0.035506319254636765,-2.7968640327453613,2.882577419281006,0.03550153225660324,-2.7968640327453613,2.811569929122925,-2.8825788497924805,-2.7968640327453613,0.035503651946783066,0.03550153225660324,-2.7968640327453613,2.811569929122925,-2.8115711212158203,-2.7968640327453613,-0.03550383448600769,-2.8825788497924805,-2.7968640327453613,-0.03550334647297859,-2.8825788497924805,-2.8972837924957275,-0.03550334647297859,-2.8115711212158203,-2.8972837924957275,0.035504382103681564,-2.8825788497924805,-2.7968640327453613,-0.03550334647297859,-2.8115711212158203,-2.8972837924957275,0.035504382103681564,-2.8115711212158203,-2.7968640327453613,0.035504382103681564,-2.8115711212158203,-2.7968640327453613,0.035504382103681564,-2.8115711212158203,-2.8972837924957275,0.035504382103681564,0.03550153225660324,-2.8972837924957275,-2.8115694522857666,-2.8115711212158203,-2.7968640327453613,0.035504382103681564,0.03550153225660324,-2.8972837924957275,-2.8115694522857666,0.03550153225660324,-2.7968640327453613,-2.8115694522857666,0.03550153225660324,-2.7968640327453613,-2.8115694522857666,0.03550153225660324,-2.8972837924957275,-2.8115694522857666,-0.035506319254636765,-2.8972837924957275,-2.8825769424438477,0.03550153225660324,-2.7968640327453613,-2.8115694522857666,-0.035506319254636765,-2.8972837924957275,-2.8825769424438477,-0.035506319254636765,-2.7968640327453613,-2.8825769424438477,-0.035506319254636765,-2.7968640327453613,-2.8825769424438477,-0.035506319254636765,-2.8972837924957275,-2.8825769424438477,-2.8825788497924805,-2.8972837924957275,-0.03550334647297859,-0.035506319254636765,-2.7968640327453613,-2.8825769424438477,-2.8825788497924805,-2.8972837924957275,-0.03550334647297859,-2.8825788497924805,-2.7968640327453613,-0.03550334647297859,-2.8115711212158203,-2.8972837924957275,0.035504382103681564,-2.8825788497924805,-2.8972837924957275,-0.03550334647297859,-0.035506319254636765,-2.8972837924957275,-2.8825769424438477,-2.8115711212158203,-2.8972837924957275,0.035504382103681564,-0.035506319254636765,-2.8972837924957275,-2.8825769424438477,0.03550153225660324,-2.8972837924957275,-2.8115694522857666,-0.035506319254636765,-2.7968640327453613,-2.8825769424438477,-2.8825788497924805,-2.7968640327453613,-0.03550334647297859,-2.8115711212158203,-2.7968640327453613,0.035504382103681564,-0.035506319254636765,-2.7968640327453613,-2.8825769424438477,-2.8115711212158203,-2.7968640327453613,0.035504382103681564,0.03550153225660324,-2.7968640327453613,-2.8115694522857666,0.03550153225660324,-2.7968640327453613,-2.882577896118164,0.03550153225660324,-2.8972837924957275,-2.882577896118164,-0.035506319254636765,-2.8972837924957275,-2.8115696907043457,0.03550153225660324,-2.7968640327453613,-2.882577896118164,-0.035506319254636765,-2.8972837924957275,-2.8115696907043457,-0.035506319254636765,-2.7968640327453613,-2.8115696907043457,-0.035506319254636765,-2.7968640327453613,-2.8115696907043457,-0.035506319254636765,-2.8972837924957275,-2.8115696907043457,2.811568260192871,-2.8972837924957275,0.035504017025232315,-0.035506319254636765,-2.7968640327453613,-2.8115696907043457,2.811568260192871,-2.8972837924957275,0.035504017025232315,2.811568260192871,-2.7968640327453613,0.035504017025232315,2.811568260192871,-2.7968640327453613,0.035504017025232315,2.811568260192871,-2.8972837924957275,0.035504017025232315,2.8825759887695312,-2.8972837924957275,-0.03550419956445694,2.811568260192871,-2.7968640327453613,0.035504017025232315,2.8825759887695312,-2.8972837924957275,-0.03550419956445694,2.8825759887695312,-2.7968640327453613,-0.03550419956445694,2.8825759887695312,-2.7968640327453613,-0.03550419956445694,2.8825759887695312,-2.8972837924957275,-0.03550419956445694,0.03550153225660324,-2.8972837924957275,-2.882577896118164,2.8825759887695312,-2.7968640327453613,-0.03550419956445694,0.03550153225660324,-2.8972837924957275,-2.882577896118164,0.03550153225660324,-2.7968640327453613,-2.882577896118164,-0.035506319254636765,-2.8972837924957275,-2.8115696907043457,0.03550153225660324,-2.8972837924957275,-2.882577896118164,2.8825759887695312,-2.8972837924957275,-0.03550419956445694,-0.035506319254636765,-2.8972837924957275,-2.8115696907043457,2.8825759887695312,-2.8972837924957275,-0.03550419956445694,2.811568260192871,-2.8972837924957275,0.035504017025232315,2.8825759887695312,-2.7968640327453613,-0.03550419956445694,0.03550153225660324,-2.7968640327453613,-2.882577896118164,-0.035506319254636765,-2.7968640327453613,-2.8115696907043457,2.8825759887695312,-2.7968640327453613,-0.03550419956445694,-0.035506319254636765,-2.7968640327453613,-2.8115696907043457,2.811568260192871,-2.7968640327453613,0.035504017025232315,2.8825759887695312,-2.7968640327453613,0.03550359234213829,2.8825759887695312,-2.8972837924957275,0.03550359234213829,2.811568260192871,-2.8972837924957275,-0.03550419956445694,2.8825759887695312,-2.7968640327453613,0.03550359234213829,2.811568260192871,-2.8972837924957275,-0.03550419956445694,2.811568260192871,-2.7968640327453613,-0.03550419956445694,2.811568260192871,-2.7968640327453613,-0.03550419956445694,2.811568260192871,-2.8972837924957275,-0.03550419956445694,-0.035506319254636765,-2.8972837924957275,2.8115694522857666,2.811568260192871,-2.7968640327453613,-0.03550419956445694,-0.035506319254636765,-2.8972837924957275,2.8115694522857666,-0.035506319254636765,-2.7968640327453613,2.8115694522857666,-0.035506319254636765,-2.7968640327453613,2.8115694522857666,-0.035506319254636765,-2.8972837924957275,2.8115694522857666,0.03550153225660324,-2.8972837924957275,2.882577419281006,-0.035506319254636765,-2.7968640327453613,2.8115694522857666,0.03550153225660324,-2.8972837924957275,2.882577419281006,0.03550153225660324,-2.7968640327453613,2.882577419281006,0.03550153225660324,-2.7968640327453613,2.882577419281006,0.03550153225660324,-2.8972837924957275,2.882577419281006,2.8825759887695312,-2.8972837924957275,0.03550359234213829,0.03550153225660324,-2.7968640327453613,2.882577419281006,2.8825759887695312,-2.8972837924957275,0.03550359234213829,2.8825759887695312,-2.7968640327453613,0.03550359234213829,2.811568260192871,-2.8972837924957275,-0.03550419956445694,2.8825759887695312,-2.8972837924957275,0.03550359234213829,0.03550153225660324,-2.8972837924957275,2.882577419281006,2.811568260192871,-2.8972837924957275,-0.03550419956445694,0.03550153225660324,-2.8972837924957275,2.882577419281006,-0.035506319254636765,-2.8972837924957275,2.8115694522857666,0.03550153225660324,-2.7968640327453613,2.882577419281006,2.8825759887695312,-2.7968640327453613,0.03550359234213829,2.811568260192871,-2.7968640327453613,-0.03550419956445694,0.03550153225660324,-2.7968640327453613,2.882577419281006,2.811568260192871,-2.7968640327453613,-0.03550419956445694,-0.035506319254636765,-2.7968640327453613,2.8115694522857666,2.7968621253967285,-0.03550441190600395,2.882577419281006,2.8972818851470947,-0.03550441190600395,2.882577419281006,2.8972818851470947,0.03550343960523605,2.811569929122925,2.7968621253967285,-0.03550441190600395,2.882577419281006,2.8972818851470947,0.03550343960523605,2.811569929122925,2.7968621253967285,0.03550343960523605,2.811569929122925,2.7968621253967285,0.03550343960523605,2.811569929122925,2.8972818851470947,0.03550343960523605,2.811569929122925,2.8972818851470947,-2.811570167541504,-0.03550383448600769,2.7968621253967285,0.03550343960523605,2.811569929122925,2.8972818851470947,-2.811570167541504,-0.03550383448600769,2.7968621253967285,-2.811570167541504,-0.03550383448600769,2.7968621253967285,-2.811570167541504,-0.03550383448600769,2.8972818851470947,-2.811570167541504,-0.03550383448600769,2.8972818851470947,-2.882577896118164,0.035503651946783066,2.7968621253967285,-2.811570167541504,-0.03550383448600769,2.8972818851470947,-2.882577896118164,0.035503651946783066,2.7968621253967285,-2.882577896118164,0.035503651946783066,2.7968621253967285,-2.882577896118164,0.035503651946783066,2.8972818851470947,-2.882577896118164,0.035503651946783066,2.8972818851470947,-0.03550441190600395,2.882577419281006,2.7968621253967285,-2.882577896118164,0.035503651946783066,2.8972818851470947,-0.03550441190600395,2.882577419281006,2.7968621253967285,-0.03550441190600395,2.882577419281006,2.8972818851470947,0.03550343960523605,2.811569929122925,2.8972818851470947,-0.03550441190600395,2.882577419281006,2.8972818851470947,-2.882577896118164,0.035503651946783066,2.8972818851470947,0.03550343960523605,2.811569929122925,2.8972818851470947,-2.882577896118164,0.035503651946783066,2.8972818851470947,-2.811570167541504,-0.03550383448600769,2.7968621253967285,-2.882577896118164,0.035503651946783066,2.7968621253967285,-0.03550441190600395,2.882577419281006,2.7968621253967285,0.03550343960523605,2.811569929122925,2.7968621253967285,-2.882577896118164,0.035503651946783066,2.7968621253967285,0.03550343960523605,2.811569929122925,2.7968621253967285,-2.811570167541504,-0.03550383448600769,2.7968621253967285,-2.882577896118164,-0.03550334647297859,2.8972818851470947,-2.882577896118164,-0.03550334647297859,2.8972818851470947,-2.811570167541504,0.035504382103681564,2.7968621253967285,-2.882577896118164,-0.03550334647297859,2.8972818851470947,-2.811570167541504,0.035504382103681564,2.7968621253967285,-2.811570167541504,0.035504382103681564,2.7968621253967285,-2.811570167541504,0.035504382103681564,2.8972818851470947,-2.811570167541504,0.035504382103681564,2.8972818851470947,0.035502467304468155,-2.8115694522857666,2.7968621253967285,-2.811570167541504,0.035504382103681564,2.8972818851470947,0.035502467304468155,-2.8115694522857666,2.7968621253967285,0.035502467304468155,-2.8115694522857666,2.7968621253967285,0.035502467304468155,-2.8115694522857666,2.8972818851470947,0.035502467304468155,-2.8115694522857666,2.8972818851470947,-0.03550538420677185,-2.8825769424438477,2.7968621253967285,0.035502467304468155,-2.8115694522857666,2.8972818851470947,-0.03550538420677185,-2.8825769424438477,2.7968621253967285,-0.03550538420677185,-2.8825769424438477,2.7968621253967285,-0.03550538420677185,-2.8825769424438477,2.8972818851470947,-0.03550538420677185,-2.8825769424438477,2.8972818851470947,-2.882577896118164,-0.03550334647297859,2.7968621253967285,-0.03550538420677185,-2.8825769424438477,2.8972818851470947,-2.882577896118164,-0.03550334647297859,2.7968621253967285,-2.882577896118164,-0.03550334647297859,2.8972818851470947,-2.811570167541504,0.035504382103681564,2.8972818851470947,-2.882577896118164,-0.03550334647297859,2.8972818851470947,-0.03550538420677185,-2.8825769424438477,2.8972818851470947,-2.811570167541504,0.035504382103681564,2.8972818851470947,-0.03550538420677185,-2.8825769424438477,2.8972818851470947,0.035502467304468155,-2.8115694522857666,2.7968621253967285,-0.03550538420677185,-2.8825769424438477,2.7968621253967285,-2.882577896118164,-0.03550334647297859,2.7968621253967285,-2.811570167541504,0.035504382103681564,2.7968621253967285,-0.03550538420677185,-2.8825769424438477,2.7968621253967285,-2.811570167541504,0.035504382103681564,2.7968621253967285,0.035502467304468155,-2.8115694522857666,2.7968621253967285,0.03550343960523605,-2.882577896118164,2.8972818851470947,0.03550343960523605,-2.882577896118164,2.8972818851470947,-0.03550538420677185,-2.8115696907043457,2.7968621253967285,0.03550343960523605,-2.882577896118164,2.8972818851470947,-0.03550538420677185,-2.8115696907043457,2.7968621253967285,-0.03550538420677185,-2.8115696907043457,2.7968621253967285,-0.03550538420677185,-2.8115696907043457,2.8972818851470947,-0.03550538420677185,-2.8115696907043457,2.8972818851470947,2.8115692138671875,0.035504017025232315,2.7968621253967285,-0.03550538420677185,-2.8115696907043457,2.8972818851470947,2.8115692138671875,0.035504017025232315,2.7968621253967285,2.8115692138671875,0.035504017025232315,2.7968621253967285,2.8115692138671875,0.035504017025232315,2.8972818851470947,2.8115692138671875,0.035504017025232315,2.8972818851470947,2.8825769424438477,-0.03550419956445694,2.7968621253967285,2.8115692138671875,0.035504017025232315,2.8972818851470947,2.8825769424438477,-0.03550419956445694,2.7968621253967285,2.8825769424438477,-0.03550419956445694,2.7968621253967285,2.8825769424438477,-0.03550419956445694,2.8972818851470947,2.8825769424438477,-0.03550419956445694,2.8972818851470947,0.03550343960523605,-2.882577896118164,2.7968621253967285,2.8825769424438477,-0.03550419956445694,2.8972818851470947,0.03550343960523605,-2.882577896118164,2.7968621253967285,0.03550343960523605,-2.882577896118164,2.8972818851470947,-0.03550538420677185,-2.8115696907043457,2.8972818851470947,0.03550343960523605,-2.882577896118164,2.8972818851470947,2.8825769424438477,-0.03550419956445694,2.8972818851470947,-0.03550538420677185,-2.8115696907043457,2.8972818851470947,2.8825769424438477,-0.03550419956445694,2.8972818851470947,2.8115692138671875,0.035504017025232315,2.7968621253967285,2.8825769424438477,-0.03550419956445694,2.7968621253967285,0.03550343960523605,-2.882577896118164,2.7968621253967285,-0.03550538420677185,-2.8115696907043457,2.7968621253967285,2.8825769424438477,-0.03550419956445694,2.7968621253967285,-0.03550538420677185,-2.8115696907043457,2.7968621253967285,2.8115692138671875,0.035504017025232315,2.7968621253967285,2.8825769424438477,0.03550359234213829,2.8972818851470947,2.8825769424438477,0.03550359234213829,2.8972818851470947,2.8115692138671875,-0.03550419956445694,2.7968621253967285,2.8825769424438477,0.03550359234213829,2.8972818851470947,2.8115692138671875,-0.03550419956445694,2.7968621253967285,2.8115692138671875,-0.03550419956445694,2.7968621253967285,2.8115692138671875,-0.03550419956445694,2.8972818851470947,2.8115692138671875,-0.03550419956445694,2.8972818851470947,-0.03550441190600395,2.8115694522857666,2.7968621253967285,2.8115692138671875,-0.03550419956445694,2.8972818851470947,-0.03550441190600395,2.8115694522857666,2.7968621253967285,-0.03550441190600395,2.8115694522857666,2.7968621253967285,-0.03550441190600395,2.8115694522857666,2.8972818851470947,-0.03550441190600395,2.8115694522857666,2.8972818851470947,0.03550343960523605,2.882577419281006,2.7968621253967285,-0.03550441190600395,2.8115694522857666,2.8972818851470947,0.03550343960523605,2.882577419281006,2.7968621253967285,0.03550343960523605,2.882577419281006,2.7968621253967285,0.03550343960523605,2.882577419281006,2.8972818851470947,0.03550343960523605,2.882577419281006,2.8972818851470947,2.8825769424438477,0.03550359234213829,2.7968621253967285,0.03550343960523605,2.882577419281006,2.8972818851470947,2.8825769424438477,0.03550359234213829,2.7968621253967285,2.8825769424438477,0.03550359234213829,2.8972818851470947,2.8115692138671875,-0.03550419956445694,2.8972818851470947,2.8825769424438477,0.03550359234213829,2.8972818851470947,0.03550343960523605,2.882577419281006,2.8972818851470947,2.8115692138671875,-0.03550419956445694,2.8972818851470947,0.03550343960523605,2.882577419281006,2.8972818851470947,-0.03550441190600395,2.8115694522857666,2.7968621253967285,0.03550343960523605,2.882577419281006,2.7968621253967285,2.8825769424438477,0.03550359234213829,2.7968621253967285,2.8115692138671875,-0.03550419956445694,2.7968621253967285,0.03550343960523605,2.882577419281006,2.7968621253967285,2.8115692138671875,-0.03550419956445694,2.7968621253967285,-0.03550441190600395,2.8115694522857666,0.03550153225660324,2.796863079071045,2.882577419281006,0.03550153225660324,2.897282838821411,2.882577419281006,-0.035506319254636765,2.897282838821411,2.811569929122925,0.03550153225660324,2.796863079071045,2.882577419281006,-0.035506319254636765,2.897282838821411,2.811569929122925,-0.035506319254636765,2.796863079071045,2.811569929122925,-0.035506319254636765,2.796863079071045,2.811569929122925,-0.035506319254636765,2.897282838821411,2.811569929122925,2.811568260192871,2.897282838821411,-0.03550383448600769,-0.035506319254636765,2.796863079071045,2.811569929122925,2.811568260192871,2.897282838821411,-0.03550383448600769,2.811568260192871,2.796863079071045,-0.03550383448600769,2.811568260192871,2.796863079071045,-0.03550383448600769,2.811568260192871,2.897282838821411,-0.03550383448600769,2.8825759887695312,2.897282838821411,0.035503651946783066,2.811568260192871,2.796863079071045,-0.03550383448600769,2.8825759887695312,2.897282838821411,0.035503651946783066,2.8825759887695312,2.796863079071045,0.035503651946783066,2.8825759887695312,2.796863079071045,0.035503651946783066,2.8825759887695312,2.897282838821411,0.035503651946783066,0.03550153225660324,2.897282838821411,2.882577419281006,2.8825759887695312,2.796863079071045,0.035503651946783066,0.03550153225660324,2.897282838821411,2.882577419281006,0.03550153225660324,2.796863079071045,2.882577419281006,-0.035506319254636765,2.897282838821411,2.811569929122925,0.03550153225660324,2.897282838821411,2.882577419281006,2.8825759887695312,2.897282838821411,0.035503651946783066,-0.035506319254636765,2.897282838821411,2.811569929122925,2.8825759887695312,2.897282838821411,0.035503651946783066,2.811568260192871,2.897282838821411,-0.03550383448600769,2.8825759887695312,2.796863079071045,0.035503651946783066,0.03550153225660324,2.796863079071045,2.882577419281006,-0.035506319254636765,2.796863079071045,2.811569929122925,2.8825759887695312,2.796863079071045,0.035503651946783066,-0.035506319254636765,2.796863079071045,2.811569929122925,2.811568260192871,2.796863079071045,-0.03550383448600769,2.8825759887695312,2.796863079071045,-0.03550334647297859,2.8825759887695312,2.897282838821411,-0.03550334647297859,2.811568260192871,2.897282838821411,0.035504382103681564,2.8825759887695312,2.796863079071045,-0.03550334647297859,2.811568260192871,2.897282838821411,0.035504382103681564,2.811568260192871,2.796863079071045,0.035504382103681564,2.811568260192871,2.796863079071045,0.035504382103681564,2.811568260192871,2.897282838821411,0.035504382103681564,-0.03550437465310097,2.897282838821411,-2.8115694522857666,2.811568260192871,2.796863079071045,0.035504382103681564,-0.03550437465310097,2.897282838821411,-2.8115694522857666,-0.03550437465310097,2.796863079071045,-2.8115694522857666,-0.03550437465310097,2.796863079071045,-2.8115694522857666,-0.03550437465310097,2.897282838821411,-2.8115694522857666,0.03550347685813904,2.897282838821411,-2.8825769424438477,-0.03550437465310097,2.796863079071045,-2.8115694522857666,0.03550347685813904,2.897282838821411,-2.8825769424438477,0.03550347685813904,2.796863079071045,-2.8825769424438477,0.03550347685813904,2.796863079071045,-2.8825769424438477,0.03550347685813904,2.897282838821411,-2.8825769424438477,2.8825759887695312,2.897282838821411,-0.03550334647297859,0.03550347685813904,2.796863079071045,-2.8825769424438477,2.8825759887695312,2.897282838821411,-0.03550334647297859,2.8825759887695312,2.796863079071045,-0.03550334647297859,2.811568260192871,2.897282838821411,0.035504382103681564,2.8825759887695312,2.897282838821411,-0.03550334647297859,0.03550347685813904,2.897282838821411,-2.8825769424438477,2.811568260192871,2.897282838821411,0.035504382103681564,0.03550347685813904,2.897282838821411,-2.8825769424438477,-0.03550437465310097,2.897282838821411,-2.8115694522857666,0.03550347685813904,2.796863079071045,-2.8825769424438477,2.8825759887695312,2.796863079071045,-0.03550334647297859,2.811568260192871,2.796863079071045,0.035504382103681564,0.03550347685813904,2.796863079071045,-2.8825769424438477,2.811568260192871,2.796863079071045,0.035504382103681564,-0.03550437465310097,2.796863079071045,-2.8115694522857666,-0.035506319254636765,2.796863079071045,-2.882577896118164,-0.035506319254636765,2.897282838821411,-2.882577896118164,0.03550347685813904,2.897282838821411,-2.8115696907043457,-0.035506319254636765,2.796863079071045,-2.882577896118164,0.03550347685813904,2.897282838821411,-2.8115696907043457,0.03550347685813904,2.796863079071045,-2.8115696907043457,0.03550347685813904,2.796863079071045,-2.8115696907043457,0.03550347685813904,2.897282838821411,-2.8115696907043457,-2.8115711212158203,2.897282838821411,0.035504017025232315,0.03550347685813904,2.796863079071045,-2.8115696907043457,-2.8115711212158203,2.897282838821411,0.035504017025232315,-2.8115711212158203,2.796863079071045,0.035504017025232315,-2.8115711212158203,2.796863079071045,0.035504017025232315,-2.8115711212158203,2.897282838821411,0.035504017025232315,-2.8825788497924805,2.897282838821411,-0.03550419956445694,-2.8115711212158203,2.796863079071045,0.035504017025232315,-2.8825788497924805,2.897282838821411,-0.03550419956445694,-2.8825788497924805,2.796863079071045,-0.03550419956445694,-2.8825788497924805,2.796863079071045,-0.03550419956445694,-2.8825788497924805,2.897282838821411,-0.03550419956445694,-0.035506319254636765,2.897282838821411,-2.882577896118164,-2.8825788497924805,2.796863079071045,-0.03550419956445694,-0.035506319254636765,2.897282838821411,-2.882577896118164,-0.035506319254636765,2.796863079071045,-2.882577896118164,0.03550347685813904,2.897282838821411,-2.8115696907043457,-0.035506319254636765,2.897282838821411,-2.882577896118164,-2.8825788497924805,2.897282838821411,-0.03550419956445694,0.03550347685813904,2.897282838821411,-2.8115696907043457,-2.8825788497924805,2.897282838821411,-0.03550419956445694,-2.8115711212158203,2.897282838821411,0.035504017025232315,-2.8825788497924805,2.796863079071045,-0.03550419956445694,-0.035506319254636765,2.796863079071045,-2.882577896118164,0.03550347685813904,2.796863079071045,-2.8115696907043457,-2.8825788497924805,2.796863079071045,-0.03550419956445694,0.03550347685813904,2.796863079071045,-2.8115696907043457,-2.8115711212158203,2.796863079071045,0.035504017025232315,-2.8825788497924805,2.796863079071045,0.03550359234213829,-2.8825788497924805,2.897282838821411,0.03550359234213829,-2.8115711212158203,2.897282838821411,-0.03550419956445694,-2.8825788497924805,2.796863079071045,0.03550359234213829,-2.8115711212158203,2.897282838821411,-0.03550419956445694,-2.8115711212158203,2.796863079071045,-0.03550419956445694,-2.8115711212158203,2.796863079071045,-0.03550419956445694,-2.8115711212158203,2.897282838821411,-0.03550419956445694,0.03550153225660324,2.897282838821411,2.8115694522857666,-2.8115711212158203,2.796863079071045,-0.03550419956445694,0.03550153225660324,2.897282838821411,2.8115694522857666,0.03550153225660324,2.796863079071045,2.8115694522857666,0.03550153225660324,2.796863079071045,2.8115694522857666,0.03550153225660324,2.897282838821411,2.8115694522857666,-0.035506319254636765,2.897282838821411,2.882577419281006,0.03550153225660324,2.796863079071045,2.8115694522857666,-0.035506319254636765,2.897282838821411,2.882577419281006,-0.035506319254636765,2.796863079071045,2.882577419281006,-0.035506319254636765,2.796863079071045,2.882577419281006,-0.035506319254636765,2.897282838821411,2.882577419281006,-2.8825788497924805,2.897282838821411,0.03550359234213829,-0.035506319254636765,2.796863079071045,2.882577419281006,-2.8825788497924805,2.897282838821411,0.03550359234213829,-2.8825788497924805,2.796863079071045,0.03550359234213829,-2.8115711212158203,2.897282838821411,-0.03550419956445694,-2.8825788497924805,2.897282838821411,0.03550359234213829,-0.035506319254636765,2.897282838821411,2.882577419281006,-2.8115711212158203,2.897282838821411,-0.03550419956445694,-0.035506319254636765,2.897282838821411,2.882577419281006,0.03550153225660324,2.897282838821411,2.8115694522857666,-0.035506319254636765,2.796863079071045,2.882577419281006,-2.8825788497924805,2.796863079071045,0.03550359234213829,-2.8115711212158203,2.796863079071045,-0.03550419956445694,-0.035506319254636765,2.796863079071045,2.882577419281006,-2.8115711212158203,2.796863079071045,-0.03550419956445694,0.03550153225660324,2.796863079071045,2.8115694522857666,-0.03550437465310097,-2.882577896118164,-2.8972837924957275,0.03550153225660324,-2.811570167541504,-2.8972837924957275,0.03550153225660324,-2.811570167541504,-2.7968637943267822,-0.03550437465310097,-2.882577896118164,-2.8972837924957275,0.03550153225660324,-2.811570167541504,-2.7968637943267822,-0.03550437465310097,-2.882577896118164,-2.7968637943267822,0.03550153225660324,-2.811570167541504,-2.8972837924957275,-2.8115711212158203,0.03550343960523605,-2.8972837924957275,-2.8115711212158203,0.03550343960523605,-2.7968637943267822,0.03550153225660324,-2.811570167541504,-2.8972837924957275,-2.8115711212158203,0.03550343960523605,-2.7968637943267822,0.03550153225660324,-2.811570167541504,-2.7968637943267822,-2.8115711212158203,0.03550343960523605,-2.8972837924957275,-2.8825788497924805,-0.03550441190600395,-2.8972837924957275,-2.8825788497924805,-0.03550441190600395,-2.7968637943267822,-2.8115711212158203,0.03550343960523605,-2.8972837924957275,-2.8825788497924805,-0.03550441190600395,-2.7968637943267822,-2.8115711212158203,0.03550343960523605,-2.7968637943267822,-2.8825788497924805,-0.03550441190600395,-2.8972837924957275,-0.03550437465310097,-2.882577896118164,-2.8972837924957275,-0.03550437465310097,-2.882577896118164,-2.7968637943267822,-2.8825788497924805,-0.03550441190600395,-2.8972837924957275,-0.03550437465310097,-2.882577896118164,-2.7968637943267822,-2.8825788497924805,-0.03550441190600395,-2.7968637943267822,0.03550153225660324,-2.811570167541504,-2.7968637943267822,-2.8115711212158203,0.03550343960523605,-2.7968637943267822,-2.8825788497924805,-0.03550441190600395,-2.7968637943267822,0.03550153225660324,-2.811570167541504,-2.7968637943267822,-2.8825788497924805,-0.03550441190600395,-2.7968637943267822,-0.03550437465310097,-2.882577896118164,-2.7968637943267822,-2.8825788497924805,-0.03550441190600395,-2.8972837924957275,-2.8115711212158203,0.03550343960523605,-2.8972837924957275,0.03550153225660324,-2.811570167541504,-2.8972837924957275,-2.8825788497924805,-0.03550441190600395,-2.8972837924957275,0.03550153225660324,-2.811570167541504,-2.8972837924957275,-0.03550437465310097,-2.882577896118164,-2.8972837924957275,2.8825759887695312,-0.03550441190600395,-2.8972837924957275,2.811568260192871,0.03550441190600395,-2.8972837924957275,2.811568260192871,0.03550441190600395,-2.7968637943267822,2.8825759887695312,-0.03550441190600395,-2.8972837924957275,2.811568260192871,0.03550441190600395,-2.7968637943267822,2.8825759887695312,-0.03550441190600395,-2.7968637943267822,2.811568260192871,0.03550441190600395,-2.8972837924957275,-0.035506319254636765,-2.811570167541504,-2.8972837924957275,-0.035506319254636765,-2.811570167541504,-2.7968637943267822,2.811568260192871,0.03550441190600395,-2.8972837924957275,-0.035506319254636765,-2.811570167541504,-2.7968637943267822,2.811568260192871,0.03550441190600395,-2.7968637943267822,-0.035506319254636765,-2.811570167541504,-2.8972837924957275,0.03550153225660324,-2.882577896118164,-2.8972837924957275,0.03550153225660324,-2.882577896118164,-2.7968637943267822,-0.035506319254636765,-2.811570167541504,-2.8972837924957275,0.03550153225660324,-2.882577896118164,-2.7968637943267822,-0.035506319254636765,-2.811570167541504,-2.7968637943267822,0.03550153225660324,-2.882577896118164,-2.8972837924957275,2.8825759887695312,-0.03550441190600395,-2.8972837924957275,2.8825759887695312,-0.03550441190600395,-2.7968637943267822,0.03550153225660324,-2.882577896118164,-2.8972837924957275,2.8825759887695312,-0.03550441190600395,-2.7968637943267822,0.03550153225660324,-2.882577896118164,-2.7968637943267822,2.811568260192871,0.03550441190600395,-2.7968637943267822,-0.035506319254636765,-2.811570167541504,-2.7968637943267822,0.03550153225660324,-2.882577896118164,-2.7968637943267822,2.811568260192871,0.03550441190600395,-2.7968637943267822,0.03550153225660324,-2.882577896118164,-2.7968637943267822,2.8825759887695312,-0.03550441190600395,-2.7968637943267822,0.03550153225660324,-2.882577896118164,-2.8972837924957275,-0.035506319254636765,-2.811570167541504,-2.8972837924957275,2.811568260192871,0.03550441190600395,-2.8972837924957275,0.03550153225660324,-2.882577896118164,-2.8972837924957275,2.811568260192871,0.03550441190600395,-2.8972837924957275,2.8825759887695312,-0.03550441190600395,-2.8972837924957275,0.03550153225660324,2.8825769424438477,-2.8972837924957275,-0.035506319254636765,2.8115692138671875,-2.8972837924957275,-0.035506319254636765,2.8115692138671875,-2.7968637943267822,0.03550153225660324,2.8825769424438477,-2.8972837924957275,-0.035506319254636765,2.8115692138671875,-2.7968637943267822,0.03550153225660324,2.8825769424438477,-2.7968637943267822,-0.035506319254636765,2.8115692138671875,-2.8972837924957275,2.811568260192871,-0.03550343960523605,-2.8972837924957275,2.811568260192871,-0.03550343960523605,-2.7968637943267822,-0.035506319254636765,2.8115692138671875,-2.8972837924957275,2.811568260192871,-0.03550343960523605,-2.7968637943267822,-0.035506319254636765,2.8115692138671875,-2.7968637943267822,2.811568260192871,-0.03550343960523605,-2.8972837924957275,2.8825759887695312,0.03550441190600395,-2.8972837924957275,2.8825759887695312,0.03550441190600395,-2.7968637943267822,2.811568260192871,-0.03550343960523605,-2.8972837924957275,2.8825759887695312,0.03550441190600395,-2.7968637943267822,2.811568260192871,-0.03550343960523605,-2.7968637943267822,2.8825759887695312,0.03550441190600395,-2.8972837924957275,0.03550153225660324,2.8825769424438477,-2.8972837924957275,0.03550153225660324,2.8825769424438477,-2.7968637943267822,2.8825759887695312,0.03550441190600395,-2.8972837924957275,0.03550153225660324,2.8825769424438477,-2.7968637943267822,2.8825759887695312,0.03550441190600395,-2.7968637943267822,-0.035506319254636765,2.8115692138671875,-2.7968637943267822,2.811568260192871,-0.03550343960523605,-2.7968637943267822,2.8825759887695312,0.03550441190600395,-2.7968637943267822,-0.035506319254636765,2.8115692138671875,-2.7968637943267822,2.8825759887695312,0.03550441190600395,-2.7968637943267822,0.03550153225660324,2.8825769424438477,-2.7968637943267822,2.8825759887695312,0.03550441190600395,-2.8972837924957275,2.811568260192871,-0.03550343960523605,-2.8972837924957275,-0.035506319254636765,2.8115692138671875,-2.8972837924957275,2.8825759887695312,0.03550441190600395,-2.8972837924957275,-0.035506319254636765,2.8115692138671875,-2.8972837924957275,0.03550153225660324,2.8825769424438477,-2.8972837924957275,-2.8825788497924805,0.03550343960523605,-2.8972837924957275,-2.8115720748901367,-0.03550441190600395,-2.8972837924957275,-2.8115720748901367,-0.03550441190600395,-2.7968637943267822,-2.8825788497924805,0.03550343960523605,-2.8972837924957275,-2.8115720748901367,-0.03550441190600395,-2.7968637943267822,-2.8825788497924805,0.03550343960523605,-2.7968637943267822,-2.8115720748901367,-0.03550441190600395,-2.8972837924957275,0.03550153225660324,2.8115692138671875,-2.8972837924957275,0.03550153225660324,2.8115692138671875,-2.7968637943267822,-2.8115720748901367,-0.03550441190600395,-2.8972837924957275,0.03550153225660324,2.8115692138671875,-2.7968637943267822,-2.8115720748901367,-0.03550441190600395,-2.7968637943267822,0.03550153225660324,2.8115692138671875,-2.8972837924957275,-0.035506319254636765,2.8825769424438477,-2.8972837924957275,-0.035506319254636765,2.8825769424438477,-2.7968637943267822,0.03550153225660324,2.8115692138671875,-2.8972837924957275,-0.035506319254636765,2.8825769424438477,-2.7968637943267822,0.03550153225660324,2.8115692138671875,-2.7968637943267822,-0.035506319254636765,2.8825769424438477,-2.8972837924957275,-2.8825788497924805,0.03550343960523605,-2.8972837924957275,-2.8825788497924805,0.03550343960523605,-2.7968637943267822,-0.035506319254636765,2.8825769424438477,-2.8972837924957275,-2.8825788497924805,0.03550343960523605,-2.7968637943267822,-0.035506319254636765,2.8825769424438477,-2.7968637943267822,-2.8115720748901367,-0.03550441190600395,-2.7968637943267822,0.03550153225660324,2.8115692138671875,-2.7968637943267822,-0.035506319254636765,2.8825769424438477,-2.7968637943267822,-2.8115720748901367,-0.03550441190600395,-2.7968637943267822,-0.035506319254636765,2.8825769424438477,-2.7968637943267822,-2.8825788497924805,0.03550343960523605,-2.7968637943267822,-0.035506319254636765,2.8825769424438477,-2.8972837924957275,0.03550153225660324,2.8115692138671875,-2.8972837924957275,-2.8115720748901367,-0.03550441190600395,-2.8972837924957275,-0.035506319254636765,2.8825769424438477,-2.8972837924957275,-2.8115720748901367,-0.03550441190600395,-2.8972837924957275,-2.8825788497924805,0.03550343960523605,-2.8972837924957275]); +var voxelNormalData= new Float32Array([-0.7071115970611572,-0.7071019411087036,0,-0.7071115970611572,-0.7071019411087036,0,-0.7071115970611572,-0.7071019411087036,0,-0.7071115970611572,-0.7071019411087036,0,-0.7071115970611572,-0.7071019411087036,0,-0.7071115970611572,-0.7071019411087036,0,0.7071067690849304,-0.7071067690849304,0,0.7071067690849304,-0.7071067690849304,0,0.7071067690849304,-0.7071067690849304,0,0.7071067690849304,-0.7071067690849304,0,0.7071067690849304,-0.7071067690849304,0,0.7071067690849304,-0.7071067690849304,0,0.7071067690849304,0.7071067690849304,0,0.7071067690849304,0.7071067690849304,0,0.7071067690849304,0.7071067690849304,0,0.7071067690849304,0.7071067690849304,0,0.7071067690849304,0.7071067690849304,0,0.7071067690849304,0.7071067690849304,0,-0.70710688829422,0.7071066498756409,0,-0.70710688829422,0.7071066498756409,0,-0.70710688829422,0.7071066498756409,0,-0.70710688829422,0.7071066498756409,0,-0.70710688829422,0.7071066498756409,0,-0.70710688829422,0.7071066498756409,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,-0.7071067690849304,0.7071067690849304,0,-0.7071067690849304,0.7071067690849304,0,-0.7071067690849304,0.7071067690849304,0,-0.7071067690849304,0.7071067690849304,0,-0.7071067690849304,0.7071067690849304,0,-0.7071067690849304,0.7071067690849304,0,-0.7071065306663513,-0.7071070075035095,0,-0.7071065306663513,-0.7071070075035095,0,-0.7071065306663513,-0.7071070075035095,0,-0.7071065306663513,-0.7071070075035095,0,-0.7071065306663513,-0.7071070075035095,0,-0.7071065306663513,-0.7071070075035095,0,0.7071067690849304,-0.7071067690849304,0,0.7071067690849304,-0.7071067690849304,0,0.7071067690849304,-0.7071067690849304,0,0.7071067690849304,-0.7071067690849304,0,0.7071067690849304,-0.7071067690849304,0,0.7071067690849304,-0.7071067690849304,0,0.7071065306663513,0.7071070075035095,0,0.7071065306663513,0.7071070075035095,0,0.7071065306663513,0.7071070075035095,0,0.7071065306663513,0.7071070075035095,0,0.7071065306663513,0.7071070075035095,0,0.7071065306663513,0.7071070075035095,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0.7071115970611572,0.7071019411087036,0,0.7071115970611572,0.7071019411087036,0,0.7071115970611572,0.7071019411087036,0,0.7071115970611572,0.7071019411087036,0,0.7071115970611572,0.7071019411087036,0,0.7071115970611572,0.7071019411087036,0,-0.7071067690849304,0.7071067690849304,0,-0.7071067690849304,0.7071067690849304,0,-0.7071067690849304,0.7071067690849304,0,-0.7071067690849304,0.7071067690849304,0,-0.7071067690849304,0.7071067690849304,0,-0.7071067690849304,0.7071067690849304,0,-0.7071067690849304,-0.7071067690849304,0,-0.7071067690849304,-0.7071067690849304,0,-0.7071067690849304,-0.7071067690849304,0,-0.7071067690849304,-0.7071067690849304,0,-0.7071067690849304,-0.7071067690849304,0,-0.7071067690849304,-0.7071067690849304,0,0.7071066498756409,-0.70710688829422,0,0.7071066498756409,-0.70710688829422,0,0.7071066498756409,-0.70710688829422,0,0.7071066498756409,-0.70710688829422,0,0.7071066498756409,-0.70710688829422,0,0.7071066498756409,-0.70710688829422,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,7.007459196239907e-11,-1,0.0000014547739510817337,7.007459196239907e-11,-1,0.0000014547739510817337,7.007459196239907e-11,-1,0.0000014547739510817337,0.0000014596579376302543,-1,-1.6987774034693537e-11,0.0000014596579376302543,-1,-1.6987774034693537e-11,0.0000014596579376302543,-1,-1.6987774034693537e-11,0.00004853362770518288,0,1,0.00004853362770518288,0,1,0.00004853362770518288,0,1,0.00004853362770518288,0,1,0.00004853362770518288,0,1,0.00004853362770518288,0,1,1,0,-0.00001163819160865387,1,0,-0.00001163819160865387,1,0,-0.00001163819160865387,-1,0,0.000011638187970675062,-1,0,0.000011638187970675062,-1,0,0.000011638187970675062,-0.000034019893064396456,0.7079471945762634,-0.706265389919281,-0.000034019893064396456,0.7079471945762634,-0.706265389919281,-0.000034019893064396456,0.7079471945762634,-0.706265389919281,-0.00003427761475904845,0.707947313785553,-0.7062652111053467,-0.00003427761475904845,0.707947313785553,-0.7062652111053467,-0.00003427761475904845,0.707947313785553,-0.7062652111053467,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0.000048533485824009404,-1.415465661347426e-10,1,-0.000048533485824009404,-1.415465661347426e-10,1,-0.000048533485824009404,-1.415465661347426e-10,1,-0.00004853362770518288,0,1,-0.00004853362770518288,0,1,-0.00004853362770518288,0,1,-1,-0.0000029164723400754156,-0.000014547739738191012,-1,-0.0000029164723400754156,-0.000014547739738191012,-1,-0.0000029164723400754156,-0.000014547739738191012,1,0,0.000011638187970675062,1,0,0.000011638187970675062,1,0,0.000011638187970675062,0.000034019918530248106,-0.7079466581344604,-0.7062658667564392,0.000034019918530248106,-0.7079466581344604,-0.7062658667564392,0.000034019918530248106,-0.7079466581344604,-0.7062658667564392,0.00003634431050159037,-0.707947850227356,-0.7062647342681885,0.00003634431050159037,-0.707947850227356,-0.7062647342681885,0.00003634431050159037,-0.707947850227356,-0.7062647342681885,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0.00004853376958635636,1,0,0.00004853376958635636,1,0,0.00004853376958635636,1,0,0.00004853376958635636,1,0,0.00004853376958635636,1,0,0.00004853376958635636,1,0,1,-0.00001163819160865387,0,1,-0.00001163819160865387,0,1,-0.00001163819160865387,0,-1,0.000011638187970675062,0,-1,0.000011638187970675062,0,-1,0.000011638187970675062,-0.7079466581344604,-0.0000340200167556759,-0.7062658667564392,-0.7079466581344604,-0.0000340200167556759,-0.7062658667564392,-0.7079466581344604,-0.0000340200167556759,-0.7062658667564392,-0.7079468369483948,-0.00003427773845032789,-0.7062657475471497,-0.7079468369483948,-0.00003427773845032789,-0.7062657475471497,-0.7079468369483948,-0.00003427773845032789,-0.7062657475471497,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,7.077369246211163e-11,-0.00004853376958635636,1,7.077369246211163e-11,-0.00004853376958635636,1,7.077369246211163e-11,-0.00004853376958635636,1,0,-0.00004853383870795369,1,0,-0.00004853383870795369,1,0,-0.00004853383870795369,1,0.0000014582361700377078,-1,-0.00001163819160865387,0.0000014582361700377078,-1,-0.00001163819160865387,0.0000014582361700377078,-1,-0.00001163819160865387,0,1,0.000013092961125948932,0,1,0.000013092961125948932,0,1,0.000013092961125948932,0.7079466581344604,0.000034019969461951405,-0.7062658667564392,0.7079466581344604,0.000034019969461951405,-0.7062658667564392,0.7079466581344604,0.000034019969461951405,-0.7062658667564392,0.7079468369483948,0.00003427778938203119,-0.7062657475471497,0.7079468369483948,0.00003427778938203119,-0.7062657475471497,0.7079468369483948,0.00003427778938203119,-0.7062657475471497,0.7071164846420288,-0.7070971131324768,0,0.7071164846420288,-0.7070971131324768,0,0.7071164846420288,-0.7070971131324768,0,0.7071164846420288,-0.7070971131324768,0,0.7071164846420288,-0.7070971131324768,0,0.7071164846420288,-0.7070971131324768,0,0.70710688829422,0.7071066498756409,0,0.70710688829422,0.7071066498756409,0,0.70710688829422,0.7071066498756409,0,0.70710688829422,0.7071066498756409,0,0.70710688829422,0.7071066498756409,0,0.70710688829422,0.7071066498756409,0,-0.7071067690849304,0.7071067690849304,0,-0.7071067690849304,0.7071067690849304,0,-0.7071067690849304,0.7071067690849304,0,-0.7071067690849304,0.7071067690849304,0,-0.7071067690849304,0.7071067690849304,0,-0.7071067690849304,0.7071067690849304,0,-0.7071066498756409,-0.70710688829422,0,-0.7071066498756409,-0.70710688829422,0,-0.7071066498756409,-0.70710688829422,0,-0.7071066498756409,-0.70710688829422,0,-0.7071066498756409,-0.70710688829422,0,-0.7071066498756409,-0.70710688829422,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,7.024145848300023e-11,0.000048168782086577266,-1,7.024145848300023e-11,0.000048168782086577266,-1,7.024145848300023e-11,0.000048168782086577266,-1,0,0.00004816885484615341,-1,0,0.00004816885484615341,-1,0,0.00004816885484615341,-1,0.0000014582361700377078,1,0.000013092961125948932,0.0000014582361700377078,1,0.000013092961125948932,0.0000014582361700377078,1,0.000013092961125948932,0,-1,-0.00001163819160865387,0,-1,-0.00001163819160865387,0,-1,-0.00001163819160865387,0.7079468369483948,-0.00003427773845032789,0.7062657475471497,0.7079468369483948,-0.00003427773845032789,0.7062657475471497,0.7079468369483948,-0.00003427773845032789,0.7062657475471497,0.7079466581344604,-0.0000340200167556759,0.7062658667564392,0.7079466581344604,-0.0000340200167556759,0.7062658667564392,0.7079466581344604,-0.0000340200167556759,0.7062658667564392,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-0.00004816885484615341,-1,0,-0.00004816885484615341,-1,0,-0.00004816885484615341,-1,-7.024145848300023e-11,-0.000048168782086577266,-1,-7.024145848300023e-11,-0.000048168782086577266,-1,-7.024145848300023e-11,-0.000048168782086577266,-1,0,-1,0.000011638187970675062,0,-1,0.000011638187970675062,0,-1,0.000011638187970675062,0.0000014582361700377078,1,-0.00001163819160865387,0.0000014582361700377078,1,-0.00001163819160865387,0.0000014582361700377078,1,-0.00001163819160865387,-0.7079468369483948,0.00003427773845032789,0.7062657475471497,-0.7079468369483948,0.00003427773845032789,0.7062657475471497,-0.7079468369483948,0.00003427773845032789,0.7062657475471497,-0.7079466581344604,0.000034019969461951405,0.7062658667564392,-0.7079466581344604,0.000034019969461951405,0.7062658667564392,-0.7079466581344604,0.000034019969461951405,0.7062658667564392,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-1,0,-0.00004962843013345264,-1,0,-0.00004962843013345264,-1,0,-0.00004962843013345264,-1,0,-0.00004962843013345264,-1,0,-0.00004962843013345264,-1,0,-0.00004962843013345264,0.00001207007790071657,0,-1,0.00001207007790071657,0,-1,0.00001207007790071657,0,-1,-0.000012047346899635158,0,1,-0.000012047346899635158,0,1,-0.000012047346899635158,0,1,0.706264853477478,-0.7079477310180664,0.00003505081622279249,0.706264853477478,-0.7079477310180664,0.00003505081622279249,0.706264853477478,-0.7079477310180664,0.00003505081622279249,0.706264853477478,-0.7079477310180664,0.00003505081622279249,0.706264853477478,-0.7079477310180664,0.00003505081622279249,0.706264853477478,-0.7079477310180664,0.00003505081622279249,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0.00004670911221182905,1,0,0.00004670911221182905,1,0,0.00004670911221182905,1,0,0.00004670911221182905,1,0,0.00004670911221182905,1,0,0.00004670911221182905,-0.000012047346899635158,0,1,-0.000012047346899635158,0,1,-0.000012047346899635158,0,1,0.00001207007790071657,0,-1,0.00001207007790071657,0,-1,0.00001207007790071657,0,-1,-0.706264853477478,-0.7079477310180664,-0.000032989002647809684,-0.706264853477478,-0.7079477310180664,-0.000032989002647809684,-0.706264853477478,-0.7079477310180664,-0.000032989002647809684,-0.706264853477478,-0.7079477310180664,-0.000032989002647809684,-0.706264853477478,-0.7079477310180664,-0.000032989002647809684,-0.706264853477478,-0.7079477310180664,-0.000032989002647809684,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0.00004816871296497993,0,-1,0.00004816871296497993,0,-1,0.00004816871296497993,0,-1,0.000048168571083806455,-1.4048270879918334e-10,-1,0.000048168571083806455,-1.4048270879918334e-10,-1,0.000048168571083806455,-1.4048270879918334e-10,-1,1,0,0.000011638187970675062,1,0,0.000011638187970675062,1,0,0.000011638187970675062,-1,0.000002916480752901407,-0.000014547739738191012,-1,0.000002916480752901407,-0.000014547739738191012,-1,0.000002916480752901407,-0.000014547739738191012,-0.0000342774874297902,-0.707947850227356,0.7062647342681885,-0.0000342774874297902,-0.707947850227356,0.7062647342681885,-0.0000342774874297902,-0.707947850227356,0.7062647342681885,-0.000034019769373117015,-0.7079477310180664,0.706264853477478,-0.000034019769373117015,-0.7079477310180664,0.706264853477478,-0.000034019769373117015,-0.7079477310180664,0.706264853477478,0.0000014596622577300877,-1,-2.1234779559731187e-11,0.0000014596622577300877,-1,-2.1234779559731187e-11,0.0000014596622577300877,-1,-2.1234779559731187e-11,7.007459196239907e-11,-1,0.0000014547739510817337,7.007459196239907e-11,-1,0.0000014547739510817337,7.007459196239907e-11,-1,0.0000014547739510817337,-0.00004816871296497993,-1.4048291696600046e-10,-1,-0.00004816871296497993,-1.4048291696600046e-10,-1,-0.00004816871296497993,-1.4048291696600046e-10,-1,-0.000048168571083806455,0,-1,-0.000048168571083806455,0,-1,-0.000048168571083806455,0,-1,-1,-0.0000029164764328015735,0.000014547734281222802,-1,-0.0000029164764328015735,0.000014547734281222802,-1,-0.0000029164764328015735,0.000014547734281222802,1,0,-0.00001163819160865387,1,0,-0.00001163819160865387,1,0,-0.00001163819160865387,0.000033244348742300645,0.707947313785553,0.7062652111053467,0.000033244348742300645,0.707947313785553,0.7062652111053467,0.000033244348742300645,0.707947313785553,0.7062652111053467,0.000034019769373117015,0.7079477310180664,0.706264853477478,0.000034019769373117015,0.7079477310180664,0.706264853477478,0.000034019769373117015,0.7079477310180664,0.706264853477478,0.0000014547739510817337,-1,-7.219815023606913e-11,0.0000014547739510817337,-1,-7.219815023606913e-11,0.0000014547739510817337,-1,-7.219815023606913e-11,0.0000014547739510817337,-1,-7.219815023606913e-11,0.0000014547739510817337,-1,-7.219815023606913e-11,0.0000014547739510817337,-1,-7.219815023606913e-11,-1,0,0.00004962843013345264,-1,0,0.00004962843013345264,-1,0,0.00004962843013345264,-1,0,0.00004962843013345264,-1,0,0.00004962843013345264,-1,0,0.00004962843013345264,0.000012047346899635158,0,1,0.000012047346899635158,0,1,0.000012047346899635158,0,1,-0.00001207007790071657,0,-1,-0.00001207007790071657,0,-1,-0.00001207007790071657,0,-1,0.706264853477478,0.7079477310180664,-0.00003505081622279249,0.706264853477478,0.7079477310180664,-0.00003505081622279249,0.706264853477478,0.7079477310180664,-0.00003505081622279249,0.706264853477478,0.7079477310180664,-0.00003505081622279249,0.706264853477478,0.7079477310180664,-0.00003505081622279249,0.706264853477478,0.7079477310180664,-0.00003505081622279249,0,-1,0,0,-1,0,0,-1,0,0.0000014547915725415805,-1,0.0000014595917718907003,0.0000014547915725415805,-1,0.0000014595917718907003,0.0000014547915725415805,-1,0.0000014595917718907003,1,0,-0.000046709108573850244,1,0,-0.000046709108573850244,1,0,-0.000046709108573850244,1,0,-0.000046709108573850244,1,0,-0.000046709108573850244,1,0,-0.000046709108573850244,-0.00001207007790071657,0,-1,-0.00001207007790071657,0,-1,-0.00001207007790071657,0,-1,0.000012047346899635158,0,1,0.000012047346899635158,0,1,0.000012047346899635158,0,1,-0.706265389919281,0.7079471945762634,0.000032989028113661334,-0.706265389919281,0.7079471945762634,0.000032989028113661334,-0.706265389919281,0.7079471945762634,0.000032989028113661334,-0.706265389919281,0.7079471945762634,0.00003298902447568253,-0.706265389919281,0.7079471945762634,0.00003298902447568253,-0.706265389919281,0.7079471945762634,0.00003298902447568253,0,-0.7071064710617065,-0.7071070671081543,0,-0.7071064710617065,-0.7071070671081543,0,-0.7071064710617065,-0.7071070671081543,0,-0.7071064710617065,-0.7071070671081543,0,-0.7071064710617065,-0.7071070671081543,0,-0.7071064710617065,-0.7071070671081543,0,0.7071068286895752,-0.7071067690849304,0,0.7071068286895752,-0.7071067690849304,0,0.7071068286895752,-0.7071067690849304,0,0.7071068286895752,-0.7071067690849304,0,0.7071068286895752,-0.7071067690849304,0,0.7071068286895752,-0.7071067690849304,0,0.7071067690849304,0.7071067690849304,0,0.7071067690849304,0.7071067690849304,0,0.7071067690849304,0.7071067690849304,0,0.7071067690849304,0.7071067690849304,0,0.7071067690849304,0.7071067690849304,0,0.7071067690849304,0.7071067690849304,0,-0.7071068286895752,0.7071067690849304,0,-0.7071068286895752,0.7071067690849304,0,-0.7071068286895752,0.7071067690849304,0,-0.7071068286895752,0.7071067690849304,0,-0.7071068286895752,0.7071067690849304,0,-0.7071068286895752,0.7071067690849304,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0.7071043848991394,-0.7071092128753662,0,0.7071043848991394,-0.7071092128753662,0,0.7071043848991394,-0.7071092128753662,0,0.7071043848991394,-0.7071092128753662,0,0.7071043848991394,-0.7071092128753662,0,0.7071043848991394,-0.7071092128753662,0,0.7071066498756409,0.70710688829422,0,0.7071066498756409,0.70710688829422,0,0.7071066498756409,0.70710688829422,0,0.7071066498756409,0.70710688829422,0,0.7071066498756409,0.70710688829422,0,0.7071066498756409,0.70710688829422,0,-0.7071086168289185,0.7071049809455872,0,-0.7071086168289185,0.7071049809455872,0,-0.7071086168289185,0.7071049809455872,0,-0.7071086168289185,0.7071049809455872,0,-0.7071086168289185,0.7071049809455872,0,-0.7071086168289185,0.7071049809455872,0,-0.7071068286895752,-0.7071067690849304,0,-0.7071068286895752,-0.7071067690849304,0,-0.7071068286895752,-0.7071067690849304,0,-0.7071068286895752,-0.7071067690849304,0,-0.7071068286895752,-0.7071067690849304,0,-0.7071068286895752,-0.7071067690849304,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0.7071061730384827,0.7071073651313782,0,0.7071061730384827,0.7071073651313782,0,0.7071061730384827,0.7071073651313782,0,0.7071061730384827,0.7071073651313782,0,0.7071061730384827,0.7071073651313782,0,0.7071061730384827,0.7071073651313782,0,-0.7071069478988647,0.7071066498756409,0,-0.7071069478988647,0.7071066498756409,0,-0.7071069478988647,0.7071066498756409,0,-0.7071069478988647,0.7071066498756409,0,-0.7071069478988647,0.7071066498756409,0,-0.7071069478988647,0.7071066498756409,0,-0.7071055769920349,-0.7071080207824707,0,-0.7071055769920349,-0.7071080207824707,0,-0.7071055769920349,-0.7071080207824707,0,-0.7071055769920349,-0.7071080207824707,0,-0.7071055769920349,-0.7071080207824707,0,-0.7071055769920349,-0.7071080207824707,0,0.7071069478988647,-0.7071066498756409,0,0.7071069478988647,-0.7071066498756409,0,0.7071069478988647,-0.7071066498756409,0,0.7071069478988647,-0.7071066498756409,0,0.7071069478988647,-0.7071066498756409,0,0.7071069478988647,-0.7071066498756409,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-0.7071043848991394,0.7071092128753662,0,-0.7071043848991394,0.7071092128753662,0,-0.7071043848991394,0.7071092128753662,0,-0.7071043848991394,0.7071092128753662,0,-0.7071043848991394,0.7071092128753662,0,-0.7071043848991394,0.7071092128753662,0,-0.7071068286895752,-0.7071067690849304,0,-0.7071068286895752,-0.7071067690849304,0,-0.7071068286895752,-0.7071067690849304,0,-0.7071068286895752,-0.7071067690849304,0,-0.7071068286895752,-0.7071067690849304,0,-0.7071068286895752,-0.7071067690849304,0,0.7071049809455872,-0.7071086168289185,0,0.7071049809455872,-0.7071086168289185,0,0.7071049809455872,-0.7071086168289185,0,0.7071049809455872,-0.7071086168289185,0,0.7071049809455872,-0.7071086168289185,0,0.7071049809455872,-0.7071086168289185,0,0.7071068286895752,0.7071067690849304,0,0.7071068286895752,0.7071067690849304,0,0.7071068286895752,0.7071067690849304,0,0.7071068286895752,0.7071067690849304,0,0.7071068286895752,0.7071067690849304,0,0.7071068286895752,0.7071067690849304,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0.7071043848991394,0,0.7071092128753662,0.7071043848991394,0,0.7071092128753662,0.7071043848991394,0,0.7071092128753662,0.7071043848991394,0,0.7071092128753662,0.7071043848991394,0,0.7071092128753662,0.7071043848991394,0,0.7071092128753662,0.7071069478988647,0,-0.7071065902709961,0.7071069478988647,0,-0.7071065902709961,0.7071069478988647,0,-0.7071065902709961,0.7071069478988647,0,-0.7071065902709961,0.7071069478988647,0,-0.7071065902709961,0.7071069478988647,0,-0.7071065902709961,-0.7071049809455872,0,-0.7071086168289185,-0.7071049809455872,0,-0.7071086168289185,-0.7071049809455872,0,-0.7071086168289185,-0.7071049809455872,0,-0.7071086168289185,-0.7071049809455872,0,-0.7071086168289185,-0.7071049809455872,0,-0.7071086168289185,-0.7071069478988647,0,0.7071066498756409,-0.7071069478988647,0,0.7071066498756409,-0.7071069478988647,0,0.7071066498756409,-0.7071069478988647,0,0.7071066498756409,-0.7071069478988647,0,0.7071066498756409,-0.7071069478988647,0,0.7071066498756409,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0.7071061730384827,0,0.7071073651313782,-0.7071061730384827,0,0.7071073651313782,-0.7071061730384827,0,0.7071073651313782,-0.7071061730384827,0,0.7071073651313782,-0.7071061730384827,0,0.7071073651313782,-0.7071061730384827,0,0.7071073651313782,0.7071069478988647,0,0.7071066498756409,0.7071069478988647,0,0.7071066498756409,0.7071069478988647,0,0.7071066498756409,0.7071069478988647,0,0.7071066498756409,0.7071069478988647,0,0.7071066498756409,0.7071069478988647,0,0.7071066498756409,0.7071055769920349,0,-0.7071080207824707,0.7071055769920349,0,-0.7071080207824707,0.7071055769920349,0,-0.7071080207824707,0.7071055769920349,0,-0.7071080207824707,0.7071055769920349,0,-0.7071080207824707,0.7071055769920349,0,-0.7071080207824707,-0.7071069478988647,0,-0.7071066498756409,-0.7071069478988647,0,-0.7071066498756409,-0.7071069478988647,0,-0.7071066498756409,-0.7071069478988647,0,-0.7071066498756409,-0.7071069478988647,0,-0.7071066498756409,-0.7071069478988647,0,-0.7071066498756409,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0.7071092128753662,0,-0.7071043848991394,-0.7071092128753662,0,-0.7071043848991394,-0.7071092128753662,0,-0.7071043848991394,-0.7071092128753662,0,-0.7071043848991394,-0.7071092128753662,0,-0.7071043848991394,-0.7071092128753662,0,-0.7071043848991394,-0.7071066498756409,0,0.70710688829422,-0.7071066498756409,0,0.70710688829422,-0.7071066498756409,0,0.70710688829422,-0.7071066498756409,0,0.70710688829422,-0.7071066498756409,0,0.70710688829422,-0.7071066498756409,0,0.70710688829422,0.7071086168289185,0,0.7071049809455872,0.7071086168289185,0,0.7071049809455872,0.7071086168289185,0,0.7071049809455872,0.7071086168289185,0,0.7071049809455872,0.7071086168289185,0,0.7071049809455872,0.7071086168289185,0,0.7071049809455872,0.7071067094802856,0,-0.70710688829422,0.7071067094802856,0,-0.70710688829422,0.7071067094802856,0,-0.70710688829422,0.7071067094802856,0,-0.70710688829422,0.7071067094802856,0,-0.70710688829422,0.7071067094802856,0,-0.70710688829422,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0.7071064710617065,0,-0.7071070671081543,0.7071064710617065,0,-0.7071070671081543,0.7071064710617065,0,-0.7071070671081543,0.7071064710617065,0,-0.7071070671081543,0.7071064710617065,0,-0.7071070671081543,0.7071064710617065,0,-0.7071070671081543,-0.7071067094802856,0,-0.70710688829422,-0.7071067094802856,0,-0.70710688829422,-0.7071067094802856,0,-0.70710688829422,-0.7071067094802856,0,-0.70710688829422,-0.7071067094802856,0,-0.70710688829422,-0.7071067094802856,0,-0.70710688829422,-0.7071067690849304,0,0.7071067690849304,-0.7071067690849304,0,0.7071067690849304,-0.7071067690849304,0,0.7071067690849304,-0.7071067690849304,0,0.7071067690849304,-0.7071067690849304,0,0.7071067690849304,-0.7071067690849304,0,0.7071067690849304,0.7071067094802856,0,0.70710688829422,0.7071067094802856,0,0.70710688829422,0.7071067094802856,0,0.70710688829422,0.7071067094802856,0,0.70710688829422,0.7071067094802856,0,0.70710688829422,0.7071067094802856,0,0.70710688829422,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0.7071043848991394,0.7071092128753662,0,0.7071043848991394,0.7071092128753662,0,0.7071043848991394,0.7071092128753662,0,0.7071043848991394,0.7071092128753662,0,0.7071043848991394,0.7071092128753662,0,0.7071043848991394,0.7071092128753662,0,0.7071068286895752,-0.7071067690849304,0,0.7071068286895752,-0.7071067690849304,0,0.7071068286895752,-0.7071067690849304,0,0.7071068286895752,-0.7071067690849304,0,0.7071068286895752,-0.7071067690849304,0,0.7071068286895752,-0.7071067690849304,0,-0.7071049809455872,-0.7071086168289185,0,-0.7071049809455872,-0.7071086168289185,0,-0.7071049809455872,-0.7071086168289185,0,-0.7071049809455872,-0.7071086168289185,0,-0.7071049809455872,-0.7071086168289185,0,-0.7071049809455872,-0.7071086168289185,0,-0.7071068286895752,0.7071067690849304,0,-0.7071068286895752,0.7071067690849304,0,-0.7071068286895752,0.7071067690849304,0,-0.7071068286895752,0.7071067690849304,0,-0.7071068286895752,0.7071067690849304,0,-0.7071068286895752,0.7071067690849304,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,-0.7071061730384827,0.7071073651313782,0,-0.7071061730384827,0.7071073651313782,0,-0.7071061730384827,0.7071073651313782,0,-0.7071061730384827,0.7071073651313782,0,-0.7071061730384827,0.7071073651313782,0,-0.7071061730384827,0.7071073651313782,0,0.7071069478988647,0.7071066498756409,0,0.7071069478988647,0.7071066498756409,0,0.7071069478988647,0.7071066498756409,0,0.7071069478988647,0.7071066498756409,0,0.7071069478988647,0.7071066498756409,0,0.7071069478988647,0.7071066498756409,0,0.7071055769920349,-0.7071080207824707,0,0.7071055769920349,-0.7071080207824707,0,0.7071055769920349,-0.7071080207824707,0,0.7071055769920349,-0.7071080207824707,0,0.7071055769920349,-0.7071080207824707,0,0.7071055769920349,-0.7071080207824707,0,-0.7071069478988647,-0.7071066498756409,0,-0.7071069478988647,-0.7071066498756409,0,-0.7071069478988647,-0.7071066498756409,0,-0.7071069478988647,-0.7071066498756409,0,-0.7071069478988647,-0.7071066498756409,0,-0.7071069478988647,-0.7071066498756409,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,-0.7071043848991394,-0.7071092128753662,0,-0.7071043848991394,-0.7071092128753662,0,-0.7071043848991394,-0.7071092128753662,0,-0.7071043848991394,-0.7071092128753662,0,-0.7071043848991394,-0.7071092128753662,0,-0.7071043848991394,-0.7071092128753662,0,-0.7071066498756409,0.70710688829422,0,-0.7071066498756409,0.70710688829422,0,-0.7071066498756409,0.70710688829422,0,-0.7071066498756409,0.70710688829422,0,-0.7071066498756409,0.70710688829422,0,-0.7071066498756409,0.70710688829422,0,0.7071086168289185,0.7071049809455872,0,0.7071086168289185,0.7071049809455872,0,0.7071086168289185,0.7071049809455872,0,0.7071086168289185,0.7071049809455872,0,0.7071086168289185,0.7071049809455872,0,0.7071086168289185,0.7071049809455872,0,0.7071068286895752,-0.7071067690849304,0,0.7071068286895752,-0.7071067690849304,0,0.7071068286895752,-0.7071067690849304,0,0.7071068286895752,-0.7071067690849304,0,0.7071068286895752,-0.7071067690849304,0,0.7071068286895752,-0.7071067690849304,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,0.7071064710617065,-0.7071070671081543,0,0.7071064710617065,-0.7071070671081543,0,0.7071064710617065,-0.7071070671081543,0,0.7071064710617065,-0.7071070671081543,0,0.7071064710617065,-0.7071070671081543,0,0.7071064710617065,-0.7071070671081543,0,-0.7071068286895752,-0.7071067690849304,0,-0.7071068286895752,-0.7071067690849304,0,-0.7071068286895752,-0.7071067690849304,0,-0.7071068286895752,-0.7071067690849304,0,-0.7071068286895752,-0.7071067690849304,0,-0.7071068286895752,-0.7071067690849304,0,-0.7071067690849304,0.7071067690849304,0,-0.7071067690849304,0.7071067690849304,0,-0.7071067690849304,0.7071067690849304,0,-0.7071067690849304,0.7071067690849304,0,-0.7071067690849304,0.7071067690849304,0,-0.7071067690849304,0.7071067690849304,0,0.7071068286895752,0.7071067690849304,0,0.7071068286895752,0.7071067690849304,0,0.7071068286895752,0.7071067690849304,0,0.7071068286895752,0.7071067690849304,0,0.7071068286895752,0.7071067690849304,0,0.7071068286895752,0.7071067690849304,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-0.7071043848991394,0,0.7071092128753662,-0.7071043848991394,0,0.7071092128753662,-0.7071043848991394,0,0.7071092128753662,-0.7071043848991394,0,0.7071092128753662,-0.7071043848991394,0,0.7071092128753662,-0.7071043848991394,0,0.7071092128753662,-0.7071067094802856,0,-0.70710688829422,-0.7071067094802856,0,-0.70710688829422,-0.7071067094802856,0,-0.70710688829422,-0.7071067094802856,0,-0.70710688829422,-0.7071067094802856,0,-0.70710688829422,-0.7071067094802856,0,-0.70710688829422,0.7071049809455872,0,-0.7071086168289185,0.7071049809455872,0,-0.7071086168289185,0.7071049809455872,0,-0.7071086168289185,0.7071049809455872,0,-0.7071086168289185,0.7071049809455872,0,-0.7071086168289185,0.7071049809455872,0,-0.7071086168289185,0.7071067094802856,0,0.70710688829422,0.7071067094802856,0,0.70710688829422,0.7071067094802856,0,0.70710688829422,0.7071067094802856,0,0.70710688829422,0.7071067094802856,0,0.70710688829422,0.7071067094802856,0,0.70710688829422,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0.7071061730384827,0,0.7071073651313782,0.7071061730384827,0,0.7071073651313782,0.7071061730384827,0,0.7071073651313782,0.7071061730384827,0,0.7071073651313782,0.7071061730384827,0,0.7071073651313782,0.7071061730384827,0,0.7071073651313782,-0.7071069478988647,0,0.7071066498756409,-0.7071069478988647,0,0.7071066498756409,-0.7071069478988647,0,0.7071066498756409,-0.7071069478988647,0,0.7071066498756409,-0.7071069478988647,0,0.7071066498756409,-0.7071069478988647,0,0.7071066498756409,-0.7071055769920349,0,-0.7071080207824707,-0.7071055769920349,0,-0.7071080207824707,-0.7071055769920349,0,-0.7071080207824707,-0.7071055769920349,0,-0.7071080207824707,-0.7071055769920349,0,-0.7071080207824707,-0.7071055769920349,0,-0.7071080207824707,0.7071069478988647,0,-0.7071066498756409,0.7071069478988647,0,-0.7071066498756409,0.7071069478988647,0,-0.7071066498756409,0.7071069478988647,0,-0.7071066498756409,0.7071069478988647,0,-0.7071066498756409,0.7071069478988647,0,-0.7071066498756409,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0.7070994973182678,0,-0.707114040851593,0.7070994973182678,0,-0.707114040851593,0.7070994973182678,0,-0.707114040851593,0.7070994973182678,0,-0.707114040851593,0.7070994973182678,0,-0.707114040851593,0.7070994973182678,0,-0.707114040851593,0.7071066498756409,0,0.70710688829422,0.7071066498756409,0,0.70710688829422,0.7071066498756409,0,0.70710688829422,0.7071066498756409,0,0.70710688829422,0.7071066498756409,0,0.70710688829422,0.7071066498756409,0,0.70710688829422,-0.7071086168289185,0,0.7071049809455872,-0.7071086168289185,0,0.7071049809455872,-0.7071086168289185,0,0.7071049809455872,-0.7071086168289185,0,0.7071049809455872,-0.7071086168289185,0,0.7071049809455872,-0.7071086168289185,0,0.7071049809455872,-0.7071069478988647,0,-0.7071066498756409,-0.7071069478988647,0,-0.7071066498756409,-0.7071069478988647,0,-0.7071066498756409,-0.7071069478988647,0,-0.7071066498756409,-0.7071069478988647,0,-0.7071066498756409,-0.7071069478988647,0,-0.7071066498756409,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-0.7071064710617065,0,-0.7071070671081543,-0.7071064710617065,0,-0.7071070671081543,-0.7071064710617065,0,-0.7071070671081543,-0.7071064710617065,0,-0.7071070671081543,-0.7071064710617065,0,-0.7071070671081543,-0.7071064710617065,0,-0.7071070671081543,0.7071069478988647,0,-0.7071066498756409,0.7071069478988647,0,-0.7071066498756409,0.7071069478988647,0,-0.7071066498756409,0.7071069478988647,0,-0.7071066498756409,0.7071069478988647,0,-0.7071066498756409,0.7071069478988647,0,-0.7071066498756409,0.7071067690849304,0,0.7071067690849304,0.7071067690849304,0,0.7071067690849304,0.7071067690849304,0,0.7071067690849304,0.7071067690849304,0,0.7071067690849304,0.7071067690849304,0,0.7071067690849304,0.7071067690849304,0,0.7071067690849304,-0.7071069478988647,0,0.7071066498756409,-0.7071069478988647,0,0.7071066498756409,-0.7071069478988647,0,0.7071066498756409,-0.7071069478988647,0,0.7071066498756409,-0.7071069478988647,0,0.7071066498756409,-0.7071069478988647,0,0.7071066498756409,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0.7071164846420288,-0.7070971131324768,0,0.7071164846420288,-0.7070971131324768,0,0.7071164846420288,-0.7070971131324768,0,0.7071164846420288,-0.7070971131324768,0,0.7071164846420288,-0.7070971131324768,0,0.7071164846420288,-0.7070971131324768,0,0.70710688829422,0.7071066498756409,0,0.70710688829422,0.7071066498756409,0,0.70710688829422,0.7071066498756409,0,0.70710688829422,0.7071066498756409,0,0.70710688829422,0.7071066498756409,0,0.70710688829422,0.7071066498756409,0,-0.7071067690849304,0.7071067690849304,0,-0.7071067690849304,0.7071067690849304,0,-0.7071067690849304,0.7071067690849304,0,-0.7071067690849304,0.7071067690849304,0,-0.7071067690849304,0.7071067690849304,0,-0.7071067690849304,0.7071067690849304,0,-0.7071066498756409,-0.70710688829422,0,-0.7071066498756409,-0.70710688829422,0,-0.7071066498756409,-0.70710688829422,0,-0.7071066498756409,-0.70710688829422,0,-0.7071066498756409,-0.70710688829422,0,-0.7071066498756409,-0.70710688829422,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0.7071115970611572,0.7071019411087036,0,0.7071115970611572,0.7071019411087036,0,0.7071115970611572,0.7071019411087036,0,0.7071115970611572,0.7071019411087036,0,0.7071115970611572,0.7071019411087036,0,0.7071115970611572,0.7071019411087036,0,-0.7071067690849304,0.7071067690849304,0,-0.7071067690849304,0.7071067690849304,0,-0.7071067690849304,0.7071067690849304,0,-0.7071067690849304,0.7071067690849304,0,-0.7071067690849304,0.7071067690849304,0,-0.7071067690849304,0.7071067690849304,0,-0.7071067690849304,-0.7071067690849304,0,-0.7071067690849304,-0.7071067690849304,0,-0.7071067690849304,-0.7071067690849304,0,-0.7071067690849304,-0.7071067690849304,0,-0.7071067690849304,-0.7071067690849304,0,-0.7071067690849304,-0.7071067690849304,0,0.7071066498756409,-0.70710688829422,0,0.7071066498756409,-0.70710688829422,0,0.7071066498756409,-0.70710688829422,0,0.7071066498756409,-0.70710688829422,0,0.7071066498756409,-0.70710688829422,0,0.7071066498756409,-0.70710688829422,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,-0.7071067690849304,0.7071067690849304,0,-0.7071067690849304,0.7071067690849304,0,-0.7071067690849304,0.7071067690849304,0,-0.7071067690849304,0.7071067690849304,0,-0.7071067690849304,0.7071067690849304,0,-0.7071067690849304,0.7071067690849304,0,-0.7071065306663513,-0.7071070075035095,0,-0.7071065306663513,-0.7071070075035095,0,-0.7071065306663513,-0.7071070075035095,0,-0.7071065306663513,-0.7071070075035095,0,-0.7071065306663513,-0.7071070075035095,0,-0.7071065306663513,-0.7071070075035095,0,0.7071067690849304,-0.7071067690849304,0,0.7071067690849304,-0.7071067690849304,0,0.7071067690849304,-0.7071067690849304,0,0.7071067690849304,-0.7071067690849304,0,0.7071067690849304,-0.7071067690849304,0,0.7071067690849304,-0.7071067690849304,0,0.7071065306663513,0.7071070075035095,0,0.7071065306663513,0.7071070075035095,0,0.7071065306663513,0.7071070075035095,0,0.7071065306663513,0.7071070075035095,0,0.7071065306663513,0.7071070075035095,0,0.7071065306663513,0.7071070075035095,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,-0.7071115970611572,-0.7071019411087036,0,-0.7071115970611572,-0.7071019411087036,0,-0.7071115970611572,-0.7071019411087036,0,-0.7071115970611572,-0.7071019411087036,0,-0.7071115970611572,-0.7071019411087036,0,-0.7071115970611572,-0.7071019411087036,0,0.7071067690849304,-0.7071067690849304,0,0.7071067690849304,-0.7071067690849304,0,0.7071067690849304,-0.7071067690849304,0,0.7071067690849304,-0.7071067690849304,0,0.7071067690849304,-0.7071067690849304,0,0.7071067690849304,-0.7071067690849304,0,0.7071067690849304,0.7071067690849304,0,0.7071067690849304,0.7071067690849304,0,0.7071067690849304,0.7071067690849304,0,0.7071067690849304,0.7071067690849304,0,0.7071067690849304,0.7071067690849304,0,0.7071067690849304,0.7071067690849304,0,-0.70710688829422,0.7071066498756409,0,-0.70710688829422,0.7071066498756409,0,-0.70710688829422,0.7071066498756409,0,-0.70710688829422,0.7071066498756409,0,-0.70710688829422,0.7071066498756409,0,-0.70710688829422,0.7071066498756409,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1]); +var voxelUVData= new Float32Array([]); \ No newline at end of file diff --git a/recursive_swarm/lib/CSS2DRenderer.js b/recursive_swarm/lib/CSS2DRenderer.js new file mode 100644 index 0000000000000000000000000000000000000000..5075e45160b3027a1d281b44ed2fa8372d07aa88 --- /dev/null +++ b/recursive_swarm/lib/CSS2DRenderer.js @@ -0,0 +1,192 @@ +THREE.CSS2DObject = function ( element ) { + + THREE.Object3D.call( this ); + + this.element = element || document.createElement( 'div' ); + + this.element.style.position = 'absolute'; + + this.addEventListener( 'removed', function () { + + this.traverse( function ( object ) { + + if ( object.element instanceof Element && object.element.parentNode !== null ) { + + object.element.parentNode.removeChild( object.element ); + + } + + } ); + + } ); + +}; + +THREE.CSS2DObject.prototype = Object.assign( Object.create( THREE.Object3D.prototype ), { + + constructor: THREE.CSS2DObject, + + copy: function ( source, recursive ) { + + THREE.Object3D.prototype.copy.call( this, source, recursive ); + + this.element = source.element.cloneNode( true ); + + return this; + + } + +} ); + +// + +THREE.CSS2DRenderer = function () { + + var _this = this; + + var _width, _height; + var _widthHalf, _heightHalf; + + var vector = new THREE.Vector3(); + var viewMatrix = new THREE.Matrix4(); + var viewProjectionMatrix = new THREE.Matrix4(); + + var cache = { + objects: new WeakMap() + }; + + var domElement = document.createElement( 'div' ); + domElement.style.overflow = 'hidden'; + + this.domElement = domElement; + + this.getSize = function () { + + return { + width: _width, + height: _height + }; + + }; + + this.setSize = function ( width, height ) { + + _width = width; + _height = height; + + _widthHalf = _width / 2; + _heightHalf = _height / 2; + + domElement.style.width = width + 'px'; + domElement.style.height = height + 'px'; + + }; + + var renderObject = function ( object, scene, camera ) { + + if ( object instanceof THREE.CSS2DObject ) { + + object.onBeforeRender( _this, scene, camera ); + + vector.setFromMatrixPosition( object.matrixWorld ); + vector.applyMatrix4( viewProjectionMatrix ); + + var element = object.element; + var style = 'translate(-50%,-50%) translate(' + ( vector.x * _widthHalf + _widthHalf ) + 'px,' + ( - vector.y * _heightHalf + _heightHalf ) + 'px)'; + + element.style.WebkitTransform = style; + element.style.MozTransform = style; + element.style.oTransform = style; + element.style.transform = style; + + element.style.display = ( object.visible && vector.z >= - 1 && vector.z <= 1 ) ? '' : 'none'; + + var objectData = { + distanceToCameraSquared: getDistanceToSquared( camera, object ) + }; + + cache.objects.set( object, objectData ); + + if ( element.parentNode !== domElement ) { + + domElement.appendChild( element ); + + } + + object.onAfterRender( _this, scene, camera ); + + } + + for ( var i = 0, l = object.children.length; i < l; i ++ ) { + + renderObject( object.children[ i ], scene, camera ); + + } + + }; + + var getDistanceToSquared = function () { + + var a = new THREE.Vector3(); + var b = new THREE.Vector3(); + + return function ( object1, object2 ) { + + a.setFromMatrixPosition( object1.matrixWorld ); + b.setFromMatrixPosition( object2.matrixWorld ); + + return a.distanceToSquared( b ); + + }; + + }(); + + var filterAndFlatten = function ( scene ) { + + var result = []; + + scene.traverse( function ( object ) { + + if ( object instanceof THREE.CSS2DObject ) result.push( object ); + + } ); + + return result; + + }; + + var zOrder = function ( scene ) { + + var sorted = filterAndFlatten( scene ).sort( function ( a, b ) { + + var distanceA = cache.objects.get( a ).distanceToCameraSquared; + var distanceB = cache.objects.get( b ).distanceToCameraSquared; + + return distanceA - distanceB; + + } ); + + var zMax = sorted.length; + + for ( var i = 0, l = sorted.length; i < l; i ++ ) { + + sorted[ i ].element.style.zIndex = zMax - i; + + } + + }; + + this.render = function ( scene, camera ) { + + if ( scene.autoUpdate === true ) scene.updateMatrixWorld(); + if ( camera.parent === null ) camera.updateMatrixWorld(); + + viewMatrix.copy( camera.matrixWorldInverse ); + viewProjectionMatrix.multiplyMatrices( camera.projectionMatrix, viewMatrix ); + + renderObject( scene, scene, camera ); + zOrder( scene ); + + }; + +}; diff --git a/recursive_swarm/lib/CopyShader.js b/recursive_swarm/lib/CopyShader.js new file mode 100644 index 0000000000000000000000000000000000000000..8f34f8d49098c4e9d28ad6261cb082626ea66913 --- /dev/null +++ b/recursive_swarm/lib/CopyShader.js @@ -0,0 +1,46 @@ +/** + * @author alteredq / http://alteredqualia.com/ + * + * Full-screen textured quad shader + */ + +THREE.CopyShader = { + + uniforms: { + + "tDiffuse": { value: null }, + "opacity": { value: 1.0 } + + }, + + vertexShader: [ + + "varying vec2 vUv;", + + "void main() {", + + "vUv = uv;", + "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", + + "}" + + ].join( "\n" ), + + fragmentShader: [ + + "uniform float opacity;", + + "uniform sampler2D tDiffuse;", + + "varying vec2 vUv;", + + "void main() {", + + "vec4 texel = texture2D( tDiffuse, vUv );", + "gl_FragColor = opacity * texel;", + + "}" + + ].join( "\n" ) + +}; \ No newline at end of file diff --git a/recursive_swarm/lib/EffectComposer.js b/recursive_swarm/lib/EffectComposer.js new file mode 100644 index 0000000000000000000000000000000000000000..4dac97f6825d315bc5a83e2b847d5bf93f1bce2b --- /dev/null +++ b/recursive_swarm/lib/EffectComposer.js @@ -0,0 +1,176 @@ +/** + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.EffectComposer = function ( renderer, renderTarget ) { + + this.renderer = renderer; + + if ( renderTarget === undefined ) { + + var parameters = { + minFilter: THREE.LinearFilter, + magFilter: THREE.LinearFilter, + format: THREE.RGBAFormat, + stencilBuffer: false + }; + var size = renderer.getSize(); + renderTarget = new THREE.WebGLRenderTarget( size.width, size.height, parameters ); + renderTarget.texture.name = "EffectComposer.rt1"; + } + + this.renderTarget1 = renderTarget; + this.renderTarget2 = renderTarget.clone(); + this.renderTarget2.texture.name = "EffectComposer.rt2"; + + this.writeBuffer = this.renderTarget1; + this.readBuffer = this.renderTarget2; + + this.passes = []; + + if ( THREE.CopyShader === undefined ) + console.error( "THREE.EffectComposer relies on THREE.CopyShader" ); + + this.copyPass = new THREE.ShaderPass( THREE.CopyShader ); + +}; + +Object.assign( THREE.EffectComposer.prototype, { + + swapBuffers: function() { + + var tmp = this.readBuffer; + this.readBuffer = this.writeBuffer; + this.writeBuffer = tmp; + + }, + + addPass: function ( pass ) { + + this.passes.push( pass ); + + var size = this.renderer.getSize(); + pass.setSize( size.width, size.height ); + + }, + + insertPass: function ( pass, index ) { + + this.passes.splice( index, 0, pass ); + + }, + + render: function ( delta ) { + + var maskActive = false; + + var pass, i, il = this.passes.length; + + for ( i = 0; i < il; i ++ ) { + + pass = this.passes[ i ]; + + if ( pass.enabled === false ) continue; + + pass.render( this.renderer, this.writeBuffer, this.readBuffer, delta, maskActive ); + + if ( pass.needsSwap ) { + + if ( maskActive ) { + + var context = this.renderer.context; + + context.stencilFunc( context.NOTEQUAL, 1, 0xffffffff ); + + this.copyPass.render( this.renderer, this.writeBuffer, this.readBuffer, delta ); + + context.stencilFunc( context.EQUAL, 1, 0xffffffff ); + + } + + this.swapBuffers(); + + } + + if ( THREE.MaskPass !== undefined ) { + + if ( pass instanceof THREE.MaskPass ) { + + maskActive = true; + + } else if ( pass instanceof THREE.ClearMaskPass ) { + + maskActive = false; + + } + + } + + } + + }, + + reset: function ( renderTarget ) { + + if ( renderTarget === undefined ) { + + var size = this.renderer.getSize(); + + renderTarget = this.renderTarget1.clone(); + renderTarget.setSize( size.width, size.height ); + + } + + this.renderTarget1.dispose(); + this.renderTarget2.dispose(); + this.renderTarget1 = renderTarget; + this.renderTarget2 = renderTarget.clone(); + + this.writeBuffer = this.renderTarget1; + this.readBuffer = this.renderTarget2; + + }, + + setSize: function ( width, height ) { + + this.renderTarget1.setSize( width, height ); + this.renderTarget2.setSize( width, height ); + + for ( var i = 0; i < this.passes.length; i ++ ) { + + this.passes[i].setSize( width, height ); + + } + + } + +} ); + + +THREE.Pass = function () { + + // if set to true, the pass is processed by the composer + this.enabled = true; + + // if set to true, the pass indicates to swap read and write buffer after rendering + this.needsSwap = true; + + // if set to true, the pass clears its buffer before rendering + this.clear = false; + + // if set to true, the result of the pass is rendered to screen + this.renderToScreen = false; + +}; + +Object.assign( THREE.Pass.prototype, { + + setSize: function( width, height ) {}, + + render: function ( renderer, writeBuffer, readBuffer, delta, maskActive ) { + + console.error( "THREE.Pass: .render() must be implemented in derived pass." ); + + } + +} ); \ No newline at end of file diff --git a/recursive_swarm/lib/GPUComputationRenderer.js b/recursive_swarm/lib/GPUComputationRenderer.js new file mode 100644 index 0000000000000000000000000000000000000000..3c64d7c7c7bb0683d76ab0547621434f2cc2994e --- /dev/null +++ b/recursive_swarm/lib/GPUComputationRenderer.js @@ -0,0 +1,370 @@ +/** + * @author yomboprime https://github.com/yomboprime + * + * GPUComputationRenderer, based on SimulationRenderer by zz85 + * + * The GPUComputationRenderer uses the concept of variables. These variables are RGBA float textures that hold 4 floats + * for each compute element (texel) + * + * Each variable has a fragment shader that defines the computation made to obtain the variable in question. + * You can use as many variables you need, and make dependencies so you can use textures of other variables in the shader + * (the sampler uniforms are added automatically) Most of the variables will need themselves as dependency. + * + * The renderer has actually two render targets per variable, to make ping-pong. Textures from the current frame are used + * as inputs to render the textures of the next frame. + * + * The render targets of the variables can be used as input textures for your visualization shaders. + * + * Variable names should be valid identifiers and should not collide with THREE GLSL used identifiers. + * a common approach could be to use 'texture' prefixing the variable name; i.e texturePosition, textureVelocity... + * + * The size of the computation (sizeX * sizeY) is defined as 'resolution' automatically in the shader. For example: + * #DEFINE resolution vec2( 1024.0, 1024.0 ) + * + * ------------- + * + * Basic use: + * + * // Initialization... + * + * // Create computation renderer + * var gpuCompute = new GPUComputationRenderer( 1024, 1024, renderer ); + * + * // Create initial state float textures + * var pos0 = gpuCompute.createTexture(); + * var vel0 = gpuCompute.createTexture(); + * // and fill in here the texture data... + * + * // Add texture variables + * var velVar = gpuCompute.addVariable( "textureVelocity", fragmentShaderVel, pos0 ); + * var posVar = gpuCompute.addVariable( "texturePosition", fragmentShaderPos, vel0 ); + * + * // Add variable dependencies + * gpuCompute.setVariableDependencies( velVar, [ velVar, posVar ] ); + * gpuCompute.setVariableDependencies( posVar, [ velVar, posVar ] ); + * + * // Add custom uniforms + * velVar.material.uniforms.time = { value: 0.0 }; + * + * // Check for completeness + * var error = gpuCompute.init(); + * if ( error !== null ) { + * console.error( error ); + * } + * + * + * // In each frame... + * + * // Compute! + * gpuCompute.compute(); + * + * // Update texture uniforms in your visualization materials with the gpu renderer output + * myMaterial.uniforms.myTexture.value = gpuCompute.getCurrentRenderTarget( posVar ).texture; + * + * // Do your rendering + * renderer.render( myScene, myCamera ); + * + * ------------- + * + * Also, you can use utility functions to create ShaderMaterial and perform computations (rendering between textures) + * Note that the shaders can have multiple input textures. + * + * var myFilter1 = gpuCompute.createShaderMaterial( myFilterFragmentShader1, { theTexture: { value: null } } ); + * var myFilter2 = gpuCompute.createShaderMaterial( myFilterFragmentShader2, { theTexture: { value: null } } ); + * + * var inputTexture = gpuCompute.createTexture(); + * + * // Fill in here inputTexture... + * + * myFilter1.uniforms.theTexture.value = inputTexture; + * + * var myRenderTarget = gpuCompute.createRenderTarget(); + * myFilter2.uniforms.theTexture.value = myRenderTarget.texture; + * + * var outputRenderTarget = gpuCompute.createRenderTarget(); + * + * // Now use the output texture where you want: + * myMaterial.uniforms.map.value = outputRenderTarget.texture; + * + * // And compute each frame, before rendering to screen: + * gpuCompute.doRenderTarget( myFilter1, myRenderTarget ); + * gpuCompute.doRenderTarget( myFilter2, outputRenderTarget ); + * + * + * + * @param {int} sizeX Computation problem size is always 2d: sizeX * sizeY elements. + * @param {int} sizeY Computation problem size is always 2d: sizeX * sizeY elements. + * @param {WebGLRenderer} renderer The renderer + */ + +function GPUComputationRenderer( sizeX, sizeY, renderer ) { + + this.variables = []; + + this.currentTextureIndex = 0; + + var scene = new THREE.Scene(); + + var camera = new THREE.Camera(); + camera.position.z = 1; + + var passThruUniforms = { + texture: { value: null } + }; + + var passThruShader = createShaderMaterial( getPassThroughFragmentShader(), passThruUniforms ); + + var mesh = new THREE.Mesh( new THREE.PlaneBufferGeometry( 2, 2 ), passThruShader ); + scene.add( mesh ); + + + this.addVariable = function( variableName, computeFragmentShader, initialValueTexture ) { + + var material = this.createShaderMaterial( computeFragmentShader ); + + var variable = { + name: variableName, + initialValueTexture: initialValueTexture, + material: material, + dependencies: null, + renderTargets: [], + wrapS: null, + wrapT: null, + minFilter: THREE.NearestFilter, + magFilter: THREE.NearestFilter + }; + + this.variables.push( variable ); + + return variable; + + }; + + this.setVariableDependencies = function( variable, dependencies ) { + + variable.dependencies = dependencies; + + }; + + this.init = function() { + + if ( ! renderer.extensions.get( "OES_texture_float" ) ) { + + return "No OES_texture_float support for float textures."; + + } + + if ( renderer.capabilities.maxVertexTextures === 0 ) { + + return "No support for vertex shader textures."; + + } + + for ( var i = 0; i < this.variables.length; i++ ) { + + var variable = this.variables[ i ]; + + // Creates rendertargets and initialize them with input texture + variable.renderTargets[ 0 ] = this.createRenderTarget( sizeX, sizeY, variable.wrapS, variable.wrapT, variable.minFilter, variable.magFilter ); + variable.renderTargets[ 1 ] = this.createRenderTarget( sizeX, sizeY, variable.wrapS, variable.wrapT, variable.minFilter, variable.magFilter ); + this.renderTexture( variable.initialValueTexture, variable.renderTargets[ 0 ] ); + this.renderTexture( variable.initialValueTexture, variable.renderTargets[ 1 ] ); + + // Adds dependencies uniforms to the ShaderMaterial + var material = variable.material; + var uniforms = material.uniforms; + if ( variable.dependencies !== null ) { + + for ( var d = 0; d < variable.dependencies.length; d++ ) { + + var depVar = variable.dependencies[ d ]; + + if ( depVar.name !== variable.name ) { + + // Checks if variable exists + var found = false; + for ( var j = 0; j < this.variables.length; j++ ) { + + if ( depVar.name === this.variables[ j ].name ) { + found = true; + break; + } + + } + if ( ! found ) { + return "Variable dependency not found. Variable=" + variable.name + ", dependency=" + depVar.name; + } + + } + + uniforms[ depVar.name ] = { value: null }; + + material.fragmentShader = "\nuniform sampler2D " + depVar.name + ";\n" + material.fragmentShader; + + } + } + } + + this.currentTextureIndex = 0; + + return null; + + }; + + this.compute = function() { + + var currentTextureIndex = this.currentTextureIndex; + var nextTextureIndex = this.currentTextureIndex === 0 ? 1 : 0; + + for ( var i = 0, il = this.variables.length; i < il; i++ ) { + + var variable = this.variables[ i ]; + + // Sets texture dependencies uniforms + if ( variable.dependencies !== null ) { + + var uniforms = variable.material.uniforms; + for ( var d = 0, dl = variable.dependencies.length; d < dl; d++ ) { + + var depVar = variable.dependencies[ d ]; + + uniforms[ depVar.name ].value = depVar.renderTargets[ currentTextureIndex ].texture; + + } + + } + + // Performs the computation for this variable + this.doRenderTarget( variable.material, variable.renderTargets[ nextTextureIndex ] ); + + } + + this.currentTextureIndex = nextTextureIndex; + }; + + this.getCurrentRenderTarget = function( variable ) { + + return variable.renderTargets[ this.currentTextureIndex ]; + + }; + + this.getAlternateRenderTarget = function( variable ) { + + return variable.renderTargets[ this.currentTextureIndex === 0 ? 1 : 0 ]; + + }; + + function addResolutionDefine( materialShader ) { + + materialShader.defines.resolution = 'vec2( ' + sizeX.toFixed( 1 ) + ', ' + sizeY.toFixed( 1 ) + " )"; + + } + this.addResolutionDefine = addResolutionDefine; + + + // The following functions can be used to compute things manually + + function createShaderMaterial( computeFragmentShader, uniforms ) { + + uniforms = uniforms || {}; + + var material = new THREE.ShaderMaterial( { + uniforms: uniforms, + vertexShader: getPassThroughVertexShader(), + fragmentShader: computeFragmentShader + } ); + + addResolutionDefine( material ); + + return material; + } + this.createShaderMaterial = createShaderMaterial; + + this.createRenderTarget = function( sizeXTexture, sizeYTexture, wrapS, wrapT, minFilter, magFilter ) { + + sizeXTexture = sizeXTexture || sizeX; + sizeYTexture = sizeYTexture || sizeY; + + wrapS = wrapS || THREE.ClampToEdgeWrapping; + wrapT = wrapT || THREE.ClampToEdgeWrapping; + + minFilter = minFilter || THREE.NearestFilter; + magFilter = magFilter || THREE.NearestFilter; + + var renderTarget = new THREE.WebGLRenderTarget( sizeXTexture, sizeYTexture, { + wrapS: wrapS, + wrapT: wrapT, + minFilter: minFilter, + magFilter: magFilter, + format: THREE.RGBAFormat, + type: ( /(iPad|iPhone|iPod)/g.test( navigator.userAgent ) ) ? THREE.HalfFloatType : THREE.FloatType, + stencilBuffer: false + } ); + + return renderTarget; + + }; + + this.createTexture = function( sizeXTexture, sizeYTexture ) { + + sizeXTexture = sizeXTexture || sizeX; + sizeYTexture = sizeYTexture || sizeY; + + var a = new Float32Array( sizeXTexture * sizeYTexture * 4 ); + var texture = new THREE.DataTexture( a, sizeX, sizeY, THREE.RGBAFormat, THREE.FloatType ); + texture.needsUpdate = true; + + return texture; + + }; + + + this.renderTexture = function( input, output ) { + + // Takes a texture, and render out in rendertarget + // input = Texture + // output = RenderTarget + + passThruUniforms.texture.value = input; + + this.doRenderTarget( passThruShader, output); + + passThruUniforms.texture.value = null; + + }; + + this.doRenderTarget = function( material, output ) { + + mesh.material = material; + renderer.render( scene, camera, output ); + mesh.material = passThruShader; + + }; + + // Shaders + + function getPassThroughVertexShader() { + + return "void main() {\n" + + "\n" + + " gl_Position = vec4( position, 1.0 );\n" + + "\n" + + "}\n"; + + } + + function getPassThroughFragmentShader() { + + return "uniform sampler2D texture;\n" + + "\n" + + "void main() {\n" + + "\n" + + " vec2 uv = gl_FragCoord.xy / resolution.xy;\n" + + "\n" + + " gl_FragColor = texture2D( texture, uv );\n" + + "\n" + + "}\n"; + + } + +} diff --git a/recursive_swarm/lib/LoaderSupport.js b/recursive_swarm/lib/LoaderSupport.js new file mode 100644 index 0000000000000000000000000000000000000000..3143f7f36d4557ea9ef3572c48308c67dcb5b8ae --- /dev/null +++ b/recursive_swarm/lib/LoaderSupport.js @@ -0,0 +1,1572 @@ +/** + * @author Kai Salmen / https://kaisalmen.de + * Development repository: https://github.com/kaisalmen/WWOBJLoader + */ + +'use strict'; + +if ( THREE.LoaderSupport === undefined ) { THREE.LoaderSupport = {} } + +/** + * Validation functions. + * @class + */ +THREE.LoaderSupport.Validator = { + /** + * If given input is null or undefined, false is returned otherwise true. + * + * @param input Can be anything + * @returns {boolean} + */ + isValid: function( input ) { + return ( input !== null && input !== undefined ); + }, + /** + * If given input is null or undefined, the defaultValue is returned otherwise the given input. + * + * @param input Can be anything + * @param defaultValue Can be anything + * @returns {*} + */ + verifyInput: function( input, defaultValue ) { + return ( input === null || input === undefined ) ? defaultValue : input; + } +}; + + +/** + * Logging wrapper for console. + * @class + * + * @param {boolean} enabled=true Tell if logger is enabled. + * @param {boolean} debug=false Toggle debug logging. + */ +THREE.LoaderSupport.ConsoleLogger = (function () { + + function ConsoleLogger( enabled, debug ) { + this.enabled = enabled !== false; + this.debug = debug === true; + } + + /** + * Enable or disable debug logging. + * @memberOf THREE.LoaderSupport.ConsoleLogger + * + * @param {boolean} debug True or False + */ + ConsoleLogger.prototype.setDebug = function ( debug ) { + this.debug = debug === true; + }; + + /** + * Returns if is enabled and debug. + * @memberOf THREE.LoaderSupport.ConsoleLogger + * + * @returns {boolean} + */ + ConsoleLogger.prototype.isDebug = function () { + return this.isEnabled() && this.debug; + }; + + /** + * Enable or disable info, debug and time logging. + * @memberOf THREE.LoaderSupport.ConsoleLogger + * + * @param {boolean} enabled True or False + */ + ConsoleLogger.prototype.setEnabled = function ( enabled ) { + this.enabled = enabled === true; + }; + + /** + * Returns if is enabled. + * @memberOf THREE.LoaderSupport.ConsoleLogger + * + * @returns {boolean} + */ + ConsoleLogger.prototype.isEnabled = function () { + return this.enabled; + }; + + /** + * Log a debug message if enabled and debug is set. + * @memberOf THREE.LoaderSupport.ConsoleLogger + * + * @param {string} message Message to log + */ + ConsoleLogger.prototype.logDebug = function ( message ) { + if ( this.enabled && this.debug ) console.info( message ); + }; + + /** + * Log an info message if enabled. + * @memberOf THREE.LoaderSupport.ConsoleLogger + * + * @param {string} message Message to log + */ + ConsoleLogger.prototype.logInfo = function ( message ) { + if ( this.enabled ) console.info( message ); + }; + + /** + * Log a warn message (always). + * @memberOf THREE.LoaderSupport.ConsoleLogger + * + * @param {string} message Message to log + */ + ConsoleLogger.prototype.logWarn = function ( message ) { + console.warn( message ); + }; + + /** + * Log an error message (always). + * @memberOf THREE.LoaderSupport.ConsoleLogger + * + * @param {string} message Message to log + */ + ConsoleLogger.prototype.logError = function ( message ) { + console.error( message ); + }; + + /** + * Start time measurement with provided id. + * @memberOf THREE.LoaderSupport.ConsoleLogger + * + * @param {string} id Time identification + */ + ConsoleLogger.prototype.logTimeStart = function ( id ) { + if ( this.enabled ) console.time( id ); + }; + + /** + * Stop time measurement started with provided id. + * @memberOf THREE.LoaderSupport.ConsoleLogger + * + * @param {string} id Time identification + */ + ConsoleLogger.prototype.logTimeEnd = function ( id ) { + if ( this.enabled ) console.timeEnd( id ); + }; + + return ConsoleLogger; +})(); + +/** + * Callbacks utilized by loaders and builder. + * @class + */ +THREE.LoaderSupport.Callbacks = (function () { + + var Validator = THREE.LoaderSupport.Validator; + + function Callbacks() { + this.onProgress = null; + this.onMeshAlter = null; + this.onLoad = null; + this.onLoadMaterials = null; + } + + /** + * Register callback function that is invoked by internal function "announceProgress" to print feedback. + * @memberOf THREE.LoaderSupport.Callbacks + * + * @param {callback} callbackOnProgress Callback function for described functionality + */ + Callbacks.prototype.setCallbackOnProgress = function ( callbackOnProgress ) { + this.onProgress = Validator.verifyInput( callbackOnProgress, this.onProgress ); + }; + + /** + * Register callback function that is called every time a mesh was loaded. + * Use {@link THREE.LoaderSupport.LoadedMeshUserOverride} for alteration instructions (geometry, material or disregard mesh). + * @memberOf THREE.LoaderSupport.Callbacks + * + * @param {callback} callbackOnMeshAlter Callback function for described functionality + */ + Callbacks.prototype.setCallbackOnMeshAlter = function ( callbackOnMeshAlter ) { + this.onMeshAlter = Validator.verifyInput( callbackOnMeshAlter, this.onMeshAlter ); + }; + + /** + * Register callback function that is called once loading of the complete OBJ file is completed. + * @memberOf THREE.LoaderSupport.Callbacks + * + * @param {callback} callbackOnLoad Callback function for described functionality + */ + Callbacks.prototype.setCallbackOnLoad = function ( callbackOnLoad ) { + this.onLoad = Validator.verifyInput( callbackOnLoad, this.onLoad ); + }; + + /** + * Register callback function that is called when materials have been loaded. + * @memberOf THREE.LoaderSupport.Callbacks + * + * @param {callback} callbackOnLoadMaterials Callback function for described functionality + */ + Callbacks.prototype.setCallbackOnLoadMaterials = function ( callbackOnLoadMaterials ) { + this.onLoadMaterials = Validator.verifyInput( callbackOnLoadMaterials, this.onLoadMaterials ); + }; + + return Callbacks; +})(); + + +/** + * Object to return by callback onMeshAlter. Used to disregard a certain mesh or to return one to many meshes. + * @class + * + * @param {boolean} disregardMesh=false Tell implementation to completely disregard this mesh + * @param {boolean} disregardMesh=false Tell implementation that mesh(es) have been altered or added + */ +THREE.LoaderSupport.LoadedMeshUserOverride = (function () { + + function LoadedMeshUserOverride( disregardMesh, alteredMesh ) { + this.disregardMesh = disregardMesh === true; + this.alteredMesh = alteredMesh === true; + this.meshes = []; + } + + /** + * Add a mesh created within callback. + * + * @memberOf THREE.OBJLoader2.LoadedMeshUserOverride + * + * @param {THREE.Mesh} mesh + */ + LoadedMeshUserOverride.prototype.addMesh = function ( mesh ) { + this.meshes.push( mesh ); + this.alteredMesh = true; + }; + + /** + * Answers if mesh shall be disregarded completely. + * + * @returns {boolean} + */ + LoadedMeshUserOverride.prototype.isDisregardMesh = function () { + return this.disregardMesh; + }; + + /** + * Answers if new mesh(es) were created. + * + * @returns {boolean} + */ + LoadedMeshUserOverride.prototype.providesAlteredMeshes = function () { + return this.alteredMesh; + }; + + return LoadedMeshUserOverride; +})(); + + +/** + * A resource description used by {@link THREE.LoaderSupport.PrepData} and others. + * @class + * + * @param {string} url URL to the file + * @param {string} extension The file extension (type) + */ +THREE.LoaderSupport.ResourceDescriptor = (function () { + + var Validator = THREE.LoaderSupport.Validator; + + function ResourceDescriptor( url, extension ) { + var urlParts = url.split( '/' ); + + if ( urlParts.length < 2 ) { + + this.path = null; + this.name = url; + this.url = url; + + } else { + + this.path = Validator.verifyInput( urlParts.slice( 0, urlParts.length - 1).join( '/' ) + '/', null ); + this.name = Validator.verifyInput( urlParts[ urlParts.length - 1 ], null ); + this.url = url; + + } + this.extension = Validator.verifyInput( extension, "default" ); + this.extension = this.extension.trim(); + this.content = null; + } + + /** + * Set the content of this resource (String) + * @memberOf THREE.LoaderSupport.ResourceDescriptor + * + * @param {Object} content The file content as arraybuffer or text + */ + ResourceDescriptor.prototype.setContent = function ( content ) { + this.content = Validator.verifyInput( content, null ); + }; + + return ResourceDescriptor; +})(); + + +/** + * Configuration instructions to be used by run method. + * @class + */ +THREE.LoaderSupport.PrepData = (function () { + + var Validator = THREE.LoaderSupport.Validator; + + function PrepData( modelName ) { + this.modelName = Validator.verifyInput( modelName, '' ); + this.resources = []; + this.streamMeshesTo = null; + this.materialPerSmoothingGroup = false; + this.useIndices = false; + this.disregardNormals = false; + this.callbacks = new THREE.LoaderSupport.Callbacks(); + this.crossOrigin; + this.useAsync = false; + } + + /** + * Set the node where the loaded objects will be attached directly. + * @memberOf THREE.LoaderSupport.PrepData + * + * @param {THREE.Object3D} streamMeshesTo Object already attached to scenegraph where new meshes will be attached to + */ + PrepData.prototype.setStreamMeshesTo = function ( streamMeshesTo ) { + this.streamMeshesTo = Validator.verifyInput( streamMeshesTo, null ); + }; + + /** + * Tells whether a material shall be created per smoothing group. + * @memberOf THREE.LoaderSupport.PrepData + * + * @param {boolean} materialPerSmoothingGroup=false + */ + PrepData.prototype.setMaterialPerSmoothingGroup = function ( materialPerSmoothingGroup ) { + this.materialPerSmoothingGroup = materialPerSmoothingGroup === true; + }; + + /** + * Tells whether indices should be used + * @memberOf THREE.LoaderSupport.PrepData + * + * @param {boolean} useIndices=false + */ + PrepData.prototype.setUseIndices = function ( useIndices ) { + this.useIndices = useIndices === true; + }; + + /** + * Tells whether normals should be completely disregarded and regenerated. + * @memberOf THREE.LoaderSupport.PrepData + * + * @param {boolean} disregardNormals=false + */ + PrepData.prototype.setDisregardNormals = function ( disregardNormals ) { + this.disregardNormals = disregardNormals === true; + }; + + /** + * Returns all callbacks as {@link THREE.LoaderSupport.Callbacks} + * @memberOf THREE.LoaderSupport.PrepData + * + * @returns {THREE.LoaderSupport.Callbacks} + */ + PrepData.prototype.getCallbacks = function () { + return this.callbacks; + }; + + /** + * Sets the CORS string to be used. + * @memberOf THREE.LoaderSupport.PrepData + * + * @param {string} crossOrigin CORS value + */ + PrepData.prototype.setCrossOrigin = function ( crossOrigin ) { + this.crossOrigin = crossOrigin; + }; + + /** + * Add a resource description. + * @memberOf THREE.LoaderSupport.PrepData + * + * @param {THREE.LoaderSupport.ResourceDescriptor} + */ + PrepData.prototype.addResource = function ( resource ) { + this.resources.push( resource ); + }; + + /** + * If true uses async loading with worker, if false loads data synchronously. + * @memberOf THREE.LoaderSupport.PrepData + * + * @param {boolean} useAsync + */ + PrepData.prototype.setUseAsync = function ( useAsync ) { + this.useAsync = useAsync === true; + }; + + /** + * Clones this object and returns it afterwards. + * @memberOf THREE.LoaderSupport.PrepData + * + * @returns {@link THREE.LoaderSupport.PrepData} + */ + PrepData.prototype.clone = function () { + var clone = new THREE.LoaderSupport.PrepData( this.modelName ); + clone.resources = this.resources; + clone.streamMeshesTo = this.streamMeshesTo; + clone.materialPerSmoothingGroup = this.materialPerSmoothingGroup; + clone.useIndices = this.useIndices; + clone.disregardNormals = this.disregardNormals; + clone.callbacks = this.callbacks; + clone.crossOrigin = this.crossOrigin; + clone.useAsync = this.useAsync; + return clone; + }; + + return PrepData; +})(); + +/** + * Builds one or many THREE.Mesh from one raw set of Arraybuffers, materialGroup descriptions and further parameters. + * Supports vertex, vertexColor, normal, uv and index buffers. + * @class + */ +THREE.LoaderSupport.Builder = (function () { + + var LOADER_BUILDER_VERSION = '1.1.1'; + + var Validator = THREE.LoaderSupport.Validator; + var ConsoleLogger = THREE.LoaderSupport.ConsoleLogger; + + function Builder( logger ) { + this.logger = Validator.verifyInput( logger, new ConsoleLogger() ); + this.logger.logInfo( 'Using THREE.LoaderSupport.Builder version: ' + LOADER_BUILDER_VERSION ); + this.callbacks = new THREE.LoaderSupport.Callbacks(); + this.materials = []; + } + + /** + * Set materials loaded by any supplier of an Array of {@link THREE.Material}. + * @memberOf THREE.LoaderSupport.Builder + * + * @param {THREE.Material[]} materials Array of {@link THREE.Material} + */ + Builder.prototype.setMaterials = function ( materials ) { + var payload = { + cmd: 'materialData', + materials: { + materialCloneInstructions: null, + serializedMaterials: null, + runtimeMaterials: Validator.isValid( this.callbacks.onLoadMaterials ) ? this.callbacks.onLoadMaterials( materials ) : materials + } + }; + this.updateMaterials( payload ); + }; + + Builder.prototype._setCallbacks = function ( callbacks ) { + if ( Validator.isValid( callbacks.onProgress ) ) this.callbacks.setCallbackOnProgress( callbacks.onProgress ); + if ( Validator.isValid( callbacks.onMeshAlter ) ) this.callbacks.setCallbackOnMeshAlter( callbacks.onMeshAlter ); + if ( Validator.isValid( callbacks.onLoad ) ) this.callbacks.setCallbackOnLoad( callbacks.onLoad ); + if ( Validator.isValid( callbacks.onLoadMaterials ) ) this.callbacks.setCallbackOnLoadMaterials( callbacks.onLoadMaterials ); + }; + + /** + * Delegates processing of the payload (mesh building or material update) to the corresponding functions (BW-compatibility). + * @memberOf THREE.LoaderSupport.Builder + * + * @param {Object} payload Raw Mesh or Material descriptions. + * @returns {THREE.Mesh[]} mesh Array of {@link THREE.Mesh} or null in case of material update + */ + Builder.prototype.processPayload = function ( payload ) { + if ( payload.cmd === 'meshData' ) { + + return this.buildMeshes( payload ); + + } else if ( payload.cmd === 'materialData' ) { + + this.updateMaterials( payload ); + return null; + + } + }; + + /** + * Builds one or multiple meshes from the data described in the payload (buffers, params, material info). + * @memberOf THREE.LoaderSupport.Builder + * + * @param {Object} meshPayload Raw mesh description (buffers, params, materials) used to build one to many meshes. + * @returns {THREE.Mesh[]} mesh Array of {@link THREE.Mesh} + */ + Builder.prototype.buildMeshes = function ( meshPayload ) { + var meshName = meshPayload.params.meshName; + + var bufferGeometry = new THREE.BufferGeometry(); + bufferGeometry.addAttribute( 'position', new THREE.BufferAttribute( new Float32Array( meshPayload.buffers.vertices ), 3 ) ); + if ( Validator.isValid( meshPayload.buffers.indices ) ) { + + bufferGeometry.setIndex( new THREE.BufferAttribute( new Uint32Array( meshPayload.buffers.indices ), 1 )); + + } + var haveVertexColors = Validator.isValid( meshPayload.buffers.colors ); + if ( haveVertexColors ) { + + bufferGeometry.addAttribute( 'color', new THREE.BufferAttribute( new Float32Array( meshPayload.buffers.colors ), 3 ) ); + + } + if ( Validator.isValid( meshPayload.buffers.normals ) ) { + + bufferGeometry.addAttribute( 'normal', new THREE.BufferAttribute( new Float32Array( meshPayload.buffers.normals ), 3 ) ); + + } else { + + bufferGeometry.computeVertexNormals(); + + } + if ( Validator.isValid( meshPayload.buffers.uvs ) ) { + + bufferGeometry.addAttribute( 'uv', new THREE.BufferAttribute( new Float32Array( meshPayload.buffers.uvs ), 2 ) ); + + } + + var material, materialName, key; + var materialNames = meshPayload.materials.materialNames; + var createMultiMaterial = meshPayload.materials.multiMaterial; + var multiMaterials = []; + for ( key in materialNames ) { + + materialName = materialNames[ key ]; + material = this.materials[ materialName ]; + if ( createMultiMaterial ) multiMaterials.push( material ); + + } + if ( createMultiMaterial ) { + + material = multiMaterials; + var materialGroups = meshPayload.materials.materialGroups; + var materialGroup; + for ( key in materialGroups ) { + + materialGroup = materialGroups[ key ]; + bufferGeometry.addGroup( materialGroup.start, materialGroup.count, materialGroup.index ); + + } + + } + + var meshes = []; + var mesh; + var callbackOnMeshAlter = this.callbacks.onMeshAlter; + var callbackOnMeshAlterResult; + var useOrgMesh = true; + if ( Validator.isValid( callbackOnMeshAlter ) ) { + + callbackOnMeshAlterResult = callbackOnMeshAlter( + { + detail: { + meshName: meshName, + bufferGeometry: bufferGeometry, + material: material + } + } + ); + if ( Validator.isValid( callbackOnMeshAlterResult ) ) { + + if ( ! callbackOnMeshAlterResult.isDisregardMesh() && callbackOnMeshAlterResult.providesAlteredMeshes() ) { + + for ( var i in callbackOnMeshAlterResult.meshes ) { + + meshes.push( callbackOnMeshAlterResult.meshes[ i ] ); + + } + + } + useOrgMesh = false; + + } + + } + if ( useOrgMesh ) { + + mesh = new THREE.Mesh( bufferGeometry, material ); + mesh.name = meshName; + meshes.push( mesh ); + + } + + var progressMessage; + if ( Validator.isValid( meshes ) && meshes.length > 0 ) { + + var meshNames = []; + for ( var i in meshes ) { + + mesh = meshes[ i ]; + meshNames[ i ] = mesh.name; + + } + progressMessage = 'Adding mesh(es) (' + meshNames.length + ': ' + meshNames + ') from input mesh: ' + meshName; + progressMessage += ' (' + ( meshPayload.progress.numericalValue * 100 ).toFixed( 2 ) + '%)'; + + } else { + + progressMessage = 'Not adding mesh: ' + meshName; + progressMessage += ' (' + ( meshPayload.progress.numericalValue * 100 ).toFixed( 2 ) + '%)'; + + } + var callbackOnProgress = this.callbacks.onProgress; + if ( Validator.isValid( callbackOnProgress ) ) { + + var event = new CustomEvent( 'BuilderEvent', { + detail: { + type: 'progress', + modelName: meshPayload.params.meshName, + text: progressMessage, + numericalValue: meshPayload.progress.numericalValue + } + } ); + callbackOnProgress( event ); + + } + + return meshes; + }; + + /** + * Updates the materials with contained material objects (sync) or from alteration instructions (async). + * @memberOf THREE.LoaderSupport.Builder + * + * @param {Object} materialPayload Material update instructions + */ + Builder.prototype.updateMaterials = function ( materialPayload ) { + var material, materialName; + var materialCloneInstructions = materialPayload.materials.materialCloneInstructions; + if ( Validator.isValid( materialCloneInstructions ) ) { + + var materialNameOrg = materialCloneInstructions.materialNameOrg; + var materialOrg = this.materials[ materialNameOrg ]; + material = materialOrg.clone(); + + materialName = materialCloneInstructions.materialName; + material.name = materialName; + + var materialProperties = materialCloneInstructions.materialProperties; + for ( var key in materialProperties ) { + + if ( material.hasOwnProperty( key ) && materialProperties.hasOwnProperty( key ) ) material[ key ] = materialProperties[ key ]; + + } + this.materials[ materialName ] = material; + + } + + var materials = materialPayload.materials.serializedMaterials; + if ( Validator.isValid( materials ) && Object.keys( materials ).length > 0 ) { + + var loader = new THREE.MaterialLoader(); + var materialJson; + for ( materialName in materials ) { + + materialJson = materials[ materialName ]; + if ( Validator.isValid( materialJson ) ) { + + material = loader.parse( materialJson ); + this.logger.logInfo( 'De-serialized material with name "' + materialName + '" will be added.' ); + this.materials[ materialName ] = material; + } + + } + + } + + materials = materialPayload.materials.runtimeMaterials; + if ( Validator.isValid( materials ) && Object.keys( materials ).length > 0 ) { + + for ( materialName in materials ) { + + material = materials[ materialName ]; + this.logger.logInfo( 'Material with name "' + materialName + '" will be added.' ); + this.materials[ materialName ] = material; + + } + + } + }; + + /** + * Returns the mapping object of material name and corresponding jsonified material. + * + * @returns {Object} Map of Materials in JSON representation + */ + Builder.prototype.getMaterialsJSON = function () { + var materialsJSON = {}; + var material; + for ( var materialName in this.materials ) { + + material = this.materials[ materialName ]; + materialsJSON[ materialName ] = material.toJSON(); + } + + return materialsJSON; + }; + + /** + * Returns the mapping object of material name and corresponding material. + * + * @returns {Object} Map of {@link THREE.Material} + */ + Builder.prototype.getMaterials = function () { + return this.materials; + }; + + return Builder; +})(); + +/** + * Base class to be used by loaders. + * @class + * + * @param {THREE.DefaultLoadingManager} [manager] The loadingManager for the loader to use. Default is {@link THREE.DefaultLoadingManager} + * @param {THREE.LoaderSupport.ConsoleLogger} logger logger to be used + */ +THREE.LoaderSupport.LoaderBase = (function () { + + var Validator = THREE.LoaderSupport.Validator; + var ConsoleLogger = THREE.LoaderSupport.ConsoleLogger; + + function LoaderBase( manager, logger ) { + this.manager = Validator.verifyInput( manager, THREE.DefaultLoadingManager ); + this.logger = Validator.verifyInput( logger, new ConsoleLogger() ); + + this.modelName = ''; + this.instanceNo = 0; + this.path = ''; + this.useIndices = false; + this.disregardNormals = false; + + this.loaderRootNode = new THREE.Group(); + this.builder = new THREE.LoaderSupport.Builder( this.logger ); + this._createDefaultMaterials(); + this.callbacks = new THREE.LoaderSupport.Callbacks(); + }; + + LoaderBase.prototype._createDefaultMaterials = function () { + var defaultMaterial = new THREE.MeshStandardMaterial( { color: 0xDCF1FF } ); + defaultMaterial.name = 'defaultMaterial'; + + var vertexColorMaterial = new THREE.MeshStandardMaterial( { color: 0xDCF1FF } ); + vertexColorMaterial.name = 'vertexColorMaterial'; + vertexColorMaterial.vertexColors = THREE.VertexColors; + + var runtimeMaterials = {}; + runtimeMaterials[ defaultMaterial.name ] = defaultMaterial; + runtimeMaterials[ vertexColorMaterial.name ] = vertexColorMaterial; + + this.builder.updateMaterials( + { + cmd: 'materialData', + materials: { + materialCloneInstructions: null, + serializedMaterials: null, + runtimeMaterials: runtimeMaterials + } + } + ); + }; + + LoaderBase.prototype._applyPrepData = function ( prepData ) { + if ( Validator.isValid( prepData ) ) { + + this.setModelName( prepData.modelName ); + this.setStreamMeshesTo( prepData.streamMeshesTo ); + this.builder.setMaterials( prepData.materials ); + this.setUseIndices( prepData.useIndices ); + this.setDisregardNormals( prepData.disregardNormals ); + + this._setCallbacks( prepData.getCallbacks() ); + } + }; + + LoaderBase.prototype._setCallbacks = function ( callbacks ) { + if ( Validator.isValid( callbacks.onProgress ) ) this.callbacks.setCallbackOnProgress( callbacks.onProgress ); + if ( Validator.isValid( callbacks.onMeshAlter ) ) this.callbacks.setCallbackOnMeshAlter( callbacks.onMeshAlter ); + if ( Validator.isValid( callbacks.onLoad ) ) this.callbacks.setCallbackOnLoad( callbacks.onLoad ); + if ( Validator.isValid( callbacks.onLoadMaterials ) ) this.callbacks.setCallbackOnLoadMaterials( callbacks.onLoadMaterials ); + + this.builder._setCallbacks( this.callbacks ); + }; + + /** + * Provides access to console logging wrapper. + * + * @returns {THREE.LoaderSupport.ConsoleLogger} + */ + LoaderBase.prototype.getLogger = function () { + return this.logger; + }; + + /** + * Set the name of the model. + * @memberOf THREE.LoaderSupport.LoaderBase + * + * @param {string} modelName + */ + LoaderBase.prototype.setModelName = function ( modelName ) { + this.modelName = Validator.verifyInput( modelName, this.modelName ); + }; + + /** + * The URL of the base path. + * @memberOf THREE.LoaderSupport.LoaderBase + * + * @param {string} path URL + */ + LoaderBase.prototype.setPath = function ( path ) { + this.path = Validator.verifyInput( path, this.path ); + }; + + /** + * Set the node where the loaded objects will be attached directly. + * @memberOf THREE.LoaderSupport.LoaderBase + * + * @param {THREE.Object3D} streamMeshesTo Object already attached to scenegraph where new meshes will be attached to + */ + LoaderBase.prototype.setStreamMeshesTo = function ( streamMeshesTo ) { + this.loaderRootNode = Validator.verifyInput( streamMeshesTo, this.loaderRootNode ); + }; + + /** + * Set materials loaded by MTLLoader or any other supplier of an Array of {@link THREE.Material}. + * @memberOf THREE.LoaderSupport.LoaderBase + * + * @param {THREE.Material[]} materials Array of {@link THREE.Material} + */ + LoaderBase.prototype.setMaterials = function ( materials ) { + this.builder.setMaterials( materials ); + }; + + /** + * Instructs loaders to create indexed {@link THREE.BufferGeometry}. + * @memberOf THREE.LoaderSupport.LoaderBase + * + * @param {boolean} useIndices=false + */ + LoaderBase.prototype.setUseIndices = function ( useIndices ) { + this.useIndices = useIndices === true; + }; + + /** + * Tells whether normals should be completely disregarded and regenerated. + * @memberOf THREE.LoaderSupport.LoaderBase + * + * @param {boolean} disregardNormals=false + */ + LoaderBase.prototype.setDisregardNormals = function ( disregardNormals ) { + this.disregardNormals = disregardNormals === true; + }; + + /** + * Announce feedback which is give to the registered callbacks. + * @memberOf THREE.LoaderSupport.LoaderBase + * @private + * + * @param {string} type The type of event + * @param {string} text Textual description of the event + * @param {number} numericalValue Numerical value describing the progress + */ + LoaderBase.prototype.onProgress = function ( type, text, numericalValue ) { + var content = Validator.isValid( text ) ? text: ''; + var event = { + detail: { + type: type, + modelName: this.modelName, + instanceNo: this.instanceNo, + text: content, + numericalValue: numericalValue + } + }; + + if ( Validator.isValid( this.callbacks.onProgress ) ) this.callbacks.onProgress( event ); + + this.logger.logDebug( content ); + }; + + return LoaderBase; +})(); + +/** + * Default implementation of the WorkerRunner responsible for creation and configuration of the parser within the worker. + * + * @class + */ +THREE.LoaderSupport.WorkerRunnerRefImpl = (function () { + + function WorkerRunnerRefImpl() { + var scope = this; + var scopedRunner = function( event ) { + scope.processMessage( event.data ); + }; + self.addEventListener( 'message', scopedRunner, false ); + } + + /** + * Applies values from parameter object via set functions or via direct assignment. + * @memberOf THREE.LoaderSupport.WorkerRunnerRefImpl + * + * @param {Object} parser The parser instance + * @param {Object} params The parameter object + */ + WorkerRunnerRefImpl.prototype.applyProperties = function ( parser, params ) { + var property, funcName, values; + for ( property in params ) { + funcName = 'set' + property.substring( 0, 1 ).toLocaleUpperCase() + property.substring( 1 ); + values = params[ property ]; + + if ( typeof parser[ funcName ] === 'function' ) { + + parser[ funcName ]( values ); + + } else if ( parser.hasOwnProperty( property ) ) { + + parser[ property ] = values; + + } + } + }; + + /** + * Configures the Parser implementation according the supplied configuration object. + * @memberOf THREE.LoaderSupport.WorkerRunnerRefImpl + * + * @param {Object} payload Raw mesh description (buffers, params, materials) used to build one to many meshes. + */ + WorkerRunnerRefImpl.prototype.processMessage = function ( payload ) { + var logEnabled = payload.logger.enabled; + var logDebug = payload.logger.enabled; + if ( payload.cmd === 'run' ) { + + var callbacks = { + callbackBuilder: function ( payload ) { + self.postMessage( payload ); + }, + callbackProgress: function ( text ) { + if ( logEnabled && logDebug ) console.debug( 'WorkerRunner: progress: ' + text ); + } + }; + + // Parser is expected to be named as such + var parser = new Parser(); + if ( typeof parser[ 'setLogConfig' ] === 'function' ) parser.setLogConfig( logEnabled, logDebug ); + this.applyProperties( parser, payload.params ); + this.applyProperties( parser, payload.materials ); + this.applyProperties( parser, callbacks ); + parser.workerScope = self; + parser.parse( payload.data.input, payload.data.options ); + + if ( logEnabled ) console.log( 'WorkerRunner: Run complete!' ); + + callbacks.callbackBuilder( { + cmd: 'complete', + msg: 'WorkerRunner completed run.' + } ); + + } else { + + console.error( 'WorkerRunner: Received unknown command: ' + payload.cmd ); + + } + }; + + return WorkerRunnerRefImpl; +})(); + +/** + * This class provides means to transform existing parser code into a web worker. It defines a simple communication protocol + * which allows to configure the worker and receive raw mesh data during execution. + * @class + * + * @param {THREE.LoaderSupport.ConsoleLogger} logger logger to be used + */ +THREE.LoaderSupport.WorkerSupport = (function () { + + var WORKER_SUPPORT_VERSION = '2.0.1'; + + var Validator = THREE.LoaderSupport.Validator; + + var LoaderWorker = (function () { + + function LoaderWorker( logger ) { + this.logger = Validator.verifyInput( logger, new THREE.LoaderSupport.ConsoleLogger() ); + this._reset(); + } + + LoaderWorker.prototype._reset = function () { + this.worker = null; + this.runnerImplName = null; + this.callbacks = { + builder: null, + onLoad: null + }; + this.terminateRequested = false; + this.queuedMessage = null; + this.started = false; + }; + + LoaderWorker.prototype.initWorker = function ( code, runnerImplName ) { + this.runnerImplName = runnerImplName; + var blob = new Blob( [ code ], { type: 'application/javascript' } ); + this.worker = new Worker( window.URL.createObjectURL( blob ) ); + this.worker.onmessage = this._receiveWorkerMessage; + + // set referemce to this, then processing in worker scope within "_receiveWorkerMessage" can access members + this.worker.runtimeRef = this; + + // process stored queuedMessage + this._postMessage(); + }; + + /** + * Executed in worker scope + */ + LoaderWorker.prototype._receiveWorkerMessage = function ( e ) { + var payload = e.data; + switch ( payload.cmd ) { + case 'meshData': + case 'materialData': + case 'imageData': + this.runtimeRef.callbacks.builder( payload ); + break; + + case 'complete': + this.runtimeRef.queuedMessage = null; + this.started = false; + this.runtimeRef.callbacks.onLoad( payload.msg ); + + if ( this.runtimeRef.terminateRequested ) { + + this.runtimeRef.logger.logInfo( 'WorkerSupport [' + this.runtimeRef.runnerImplName + ']: Run is complete. Terminating application on request!' ); + this.runtimeRef._terminate(); + + } + break; + + case 'error': + this.runtimeRef.logger.logError( 'WorkerSupport [' + this.runtimeRef.runnerImplName + ']: Reported error: ' + payload.msg ); + this.runtimeRef.queuedMessage = null; + this.started = false; + this.runtimeRef.callbacks.onLoad( payload.msg ); + + if ( this.runtimeRef.terminateRequested ) { + + this.runtimeRef.logger.logInfo( 'WorkerSupport [' + this.runtimeRef.runnerImplName + ']: Run reported error. Terminating application on request!' ); + this.runtimeRef._terminate(); + + } + break; + + default: + this.runtimeRef.logger.logError( 'WorkerSupport [' + this.runtimeRef.runnerImplName + ']: Received unknown command: ' + payload.cmd ); + break; + + } + }; + + LoaderWorker.prototype.setCallbacks = function ( builder, onLoad ) { + this.callbacks.builder = Validator.verifyInput( builder, this.callbacks.builder ); + this.callbacks.onLoad = Validator.verifyInput( onLoad, this.callbacks.onLoad ); + }; + + LoaderWorker.prototype.run = function( payload ) { + if ( Validator.isValid( this.queuedMessage ) ) { + + console.warn( 'Already processing message. Rejecting new run instruction' ); + return; + + } else { + + this.queuedMessage = payload; + this.started = true; + + } + if ( ! Validator.isValid( this.callbacks.builder ) ) throw 'Unable to run as no "builder" callback is set.'; + if ( ! Validator.isValid( this.callbacks.onLoad ) ) throw 'Unable to run as no "onLoad" callback is set.'; + if ( payload.cmd !== 'run' ) payload.cmd = 'run'; + if ( Validator.isValid( payload.logger ) ) { + + payload.logger.enabled = Validator.verifyInput( payload.logger.enabled, true ); + payload.logger.debug = Validator.verifyInput( payload.logger.debug, false ); + + } else { + + payload.logger = { + enabled: true, + debug: false + } + + } + this._postMessage(); + }; + + LoaderWorker.prototype._postMessage = function () { + if ( Validator.isValid( this.queuedMessage ) && Validator.isValid( this.worker ) ) { + + if ( this.queuedMessage.data.input instanceof ArrayBuffer ) { + + this.worker.postMessage( this.queuedMessage, [ this.queuedMessage.data.input ] ); + + } else { + + this.worker.postMessage( this.queuedMessage ); + + } + + } + }; + + LoaderWorker.prototype.setTerminateRequested = function ( terminateRequested ) { + this.terminateRequested = terminateRequested === true; + if ( this.terminateRequested && Validator.isValid( this.worker ) && ! Validator.isValid( this.queuedMessage ) && this.started ) { + + this.logger.logInfo( 'Worker is terminated immediately as it is not running!' ); + this._terminate(); + + } + }; + + LoaderWorker.prototype._terminate = function () { + this.worker.terminate(); + this._reset(); + }; + + return LoaderWorker; + + })(); + + function WorkerSupport( logger ) { + this.logger = Validator.verifyInput( logger, new THREE.LoaderSupport.ConsoleLogger() ); + this.logger.logInfo( 'Using THREE.LoaderSupport.WorkerSupport version: ' + WORKER_SUPPORT_VERSION ); + + // check worker support first + if ( window.Worker === undefined ) throw "This browser does not support web workers!"; + if ( window.Blob === undefined ) throw "This browser does not support Blob!"; + if ( typeof window.URL.createObjectURL !== 'function' ) throw "This browser does not support Object creation from URL!"; + + this.loaderWorker = new LoaderWorker( this.logger ); + } + + /** + * Validate the status of worker code and the derived worker. + * @memberOf THREE.LoaderSupport.WorkerSupport + * + * @param {Function} functionCodeBuilder Function that is invoked with funcBuildObject and funcBuildSingelton that allows stringification of objects and singletons. + * @param {String[]} libLocations URL of libraries that shall be added to worker code relative to libPath + * @param {String} libPath Base path used for loading libraries + * @param {THREE.LoaderSupport.WorkerRunnerRefImpl} runnerImpl The default worker parser wrapper implementation (communication and execution). An extended class could be passed here. + */ + WorkerSupport.prototype.validate = function ( functionCodeBuilder, libLocations, libPath, runnerImpl ) { + if ( Validator.isValid( this.loaderWorker.worker ) ) return; + + this.logger.logInfo( 'WorkerSupport: Building worker code...' ); + this.logger.logTimeStart( 'buildWebWorkerCode' ); + + if ( Validator.isValid( runnerImpl ) ) { + + this.logger.logInfo( 'WorkerSupport: Using "' + runnerImpl.name + '" as Runncer class for worker.' ); + + } else { + + runnerImpl = THREE.LoaderSupport.WorkerRunnerRefImpl; + this.logger.logInfo( 'WorkerSupport: Using DEFAULT "THREE.LoaderSupport.WorkerRunnerRefImpl" as Runncer class for worker.' ); + + } + + var userWorkerCode = functionCodeBuilder( buildObject, buildSingelton ); + userWorkerCode += buildSingelton( runnerImpl.name, runnerImpl.name, runnerImpl ); + userWorkerCode += 'new ' + runnerImpl.name + '();\n\n'; + + var scope = this; + if ( Validator.isValid( libLocations ) && libLocations.length > 0 ) { + + var libsContent = ''; + var loadAllLibraries = function ( path, locations ) { + if ( locations.length === 0 ) { + + scope.loaderWorker.initWorker( libsContent + userWorkerCode, scope.logger, runnerImpl.name ); + scope.logger.logTimeEnd( 'buildWebWorkerCode' ); + + } else { + + var loadedLib = function ( contentAsString ) { + libsContent += contentAsString; + loadAllLibraries( path, locations ); + }; + + var fileLoader = new THREE.FileLoader(); + fileLoader.setPath( path ); + fileLoader.setResponseType( 'text' ); + fileLoader.load( locations[ 0 ], loadedLib ); + locations.shift(); + + } + }; + loadAllLibraries( libPath, libLocations ); + + } else { + + this.loaderWorker.initWorker( userWorkerCode, this.logger, runnerImpl.name ); + this.logger.logTimeEnd( 'buildWebWorkerCode' ); + + } + }; + + /** + * Specify functions that should be build when new raw mesh data becomes available and when the parser is finished. + * @memberOf THREE.LoaderSupport.WorkerSupport + * + * @param {Function} builder The builder function. Default is {@link THREE.LoaderSupport.Builder}. + * @param {Function} onLoad The function that is called when parsing is complete. + */ + WorkerSupport.prototype.setCallbacks = function ( builder, onLoad ) { + this.loaderWorker.setCallbacks( builder, onLoad ); + }; + + /** + * Runs the parser with the provided configuration. + * @memberOf THREE.LoaderSupport.WorkerSupport + * + * @param {Object} payload Raw mesh description (buffers, params, materials) used to build one to many meshes. + */ + WorkerSupport.prototype.run = function ( payload ) { + this.loaderWorker.run( payload ); + }; + + /** + * Request termination of worker once parser is finished. + * @memberOf THREE.LoaderSupport.WorkerSupport + * + * @param {boolean} terminateRequested True or false. + */ + WorkerSupport.prototype.setTerminateRequested = function ( terminateRequested ) { + this.loaderWorker.setTerminateRequested( terminateRequested ); + }; + + var buildObject = function ( fullName, object ) { + var objectString = fullName + ' = {\n'; + var part; + for ( var name in object ) { + + part = object[ name ]; + if ( typeof( part ) === 'string' || part instanceof String ) { + + part = part.replace( '\n', '\\n' ); + part = part.replace( '\r', '\\r' ); + objectString += '\t' + name + ': "' + part + '",\n'; + + } else if ( part instanceof Array ) { + + objectString += '\t' + name + ': [' + part + '],\n'; + + } else if ( Number.isInteger( part ) ) { + + objectString += '\t' + name + ': ' + part + ',\n'; + + } else if ( typeof part === 'function' ) { + + objectString += '\t' + name + ': ' + part + ',\n'; + + } + + } + objectString += '}\n\n'; + + return objectString; + }; + + var buildSingelton = function ( fullName, internalName, object ) { + var objectString = fullName + ' = (function () {\n\n'; + objectString += '\t' + object.prototype.constructor.toString() + '\n\n'; + objectString = objectString.replace( object.name, internalName ); + + var funcString; + var objectPart; + for ( var name in object.prototype ) { + + objectPart = object.prototype[ name ]; + if ( typeof objectPart === 'function' ) { + + funcString = objectPart.toString(); + objectString += '\t' + internalName + '.prototype.' + name + ' = ' + funcString + ';\n\n'; + + } + + } + objectString += '\treturn ' + internalName + ';\n'; + objectString += '})();\n\n'; + + return objectString; + }; + + return WorkerSupport; + +})(); + +/** + * Orchestrate loading of multiple OBJ files/data from an instruction queue with a configurable amount of workers (1-16). + * Workflow: + * prepareWorkers + * enqueueForRun + * processQueue + * tearDown (to force stop) + * + * @class + * + * @param {string} classDef Class definition to be used for construction + * @param {THREE.LoaderSupport.ConsoleLogger} logger logger to be used + */ +THREE.LoaderSupport.WorkerDirector = (function () { + + var LOADER_WORKER_DIRECTOR_VERSION = '2.1.0'; + + var Validator = THREE.LoaderSupport.Validator; + + var MAX_WEB_WORKER = 16; + var MAX_QUEUE_SIZE = 8192; + + function WorkerDirector( classDef, logger ) { + this.logger = Validator.verifyInput( logger, new THREE.LoaderSupport.ConsoleLogger() ); + this.logger.logInfo( 'Using THREE.LoaderSupport.WorkerDirector version: ' + LOADER_WORKER_DIRECTOR_VERSION ); + + this.maxQueueSize = MAX_QUEUE_SIZE ; + this.maxWebWorkers = MAX_WEB_WORKER; + this.crossOrigin = null; + + if ( ! Validator.isValid( classDef ) ) throw 'Provided invalid classDef: ' + classDef; + + this.workerDescription = { + classDef: classDef, + globalCallbacks: {}, + workerSupports: {} + }; + this.objectsCompleted = 0; + this.instructionQueue = []; + this.instructionQueuePointer = 0; + + this.callbackOnFinishedProcessing = null; + } + + /** + * Returns the maximum length of the instruction queue. + * @memberOf THREE.LoaderSupport.WorkerDirector + * + * @returns {number} + */ + WorkerDirector.prototype.getMaxQueueSize = function () { + return this.maxQueueSize; + }; + + /** + * Returns the maximum number of workers. + * @memberOf THREE.LoaderSupport.WorkerDirector + * + * @returns {number} + */ + WorkerDirector.prototype.getMaxWebWorkers = function () { + return this.maxWebWorkers; + }; + + /** + * Sets the CORS string to be used. + * @memberOf THREE.LoaderSupport.WorkerDirector + * + * @param {string} crossOrigin CORS value + */ + WorkerDirector.prototype.setCrossOrigin = function ( crossOrigin ) { + this.crossOrigin = crossOrigin; + }; + + /** + * Create or destroy workers according limits. Set the name and register callbacks for dynamically created web workers. + * @memberOf THREE.LoaderSupport.WorkerDirector + * + * @param {THREE.OBJLoader2.WWOBJLoader2.PrepDataCallbacks} globalCallbacks Register global callbacks used by all web workers + * @param {number} maxQueueSize Set the maximum size of the instruction queue (1-1024) + * @param {number} maxWebWorkers Set the maximum amount of workers (1-16) + */ + WorkerDirector.prototype.prepareWorkers = function ( globalCallbacks, maxQueueSize, maxWebWorkers ) { + if ( Validator.isValid( globalCallbacks ) ) this.workerDescription.globalCallbacks = globalCallbacks; + this.maxQueueSize = Math.min( maxQueueSize, MAX_QUEUE_SIZE ); + this.maxWebWorkers = Math.min( maxWebWorkers, MAX_WEB_WORKER ); + this.maxWebWorkers = Math.min( this.maxWebWorkers, this.maxQueueSize ); + this.objectsCompleted = 0; + this.instructionQueue = []; + this.instructionQueuePointer = 0; + + for ( var instanceNo = 0; instanceNo < this.maxWebWorkers; instanceNo++ ) { + + this.workerDescription.workerSupports[ instanceNo ] = { + instanceNo: instanceNo, + inUse: false, + terminateRequested: false, + workerSupport: new THREE.LoaderSupport.WorkerSupport( this.logger ), + loader: null + }; + + } + }; + + /** + * Store run instructions in internal instructionQueue. + * @memberOf THREE.LoaderSupport.WorkerDirector + * + * @param {THREE.LoaderSupport.PrepData} prepData + */ + WorkerDirector.prototype.enqueueForRun = function ( prepData ) { + if ( this.instructionQueue.length < this.maxQueueSize ) { + this.instructionQueue.push( prepData ); + } + }; + + /** + * Returns if any workers are running. + * + * @memberOf THREE.LoaderSupport.WorkerDirector + * @returns {boolean} + */ + WorkerDirector.prototype.isRunning = function () { + var wsKeys = Object.keys( this.workerDescription.workerSupports ); + return ( ( this.instructionQueue.length > 0 && this.instructionQueuePointer < this.instructionQueue.length ) || wsKeys.length > 0 ); + }; + + /** + * Process the instructionQueue until it is depleted. + * @memberOf THREE.LoaderSupport.WorkerDirector + */ + WorkerDirector.prototype.processQueue = function () { + var prepData, supportDesc; + for ( var instanceNo in this.workerDescription.workerSupports ) { + + supportDesc = this.workerDescription.workerSupports[ instanceNo ]; + if ( ! supportDesc.inUse ) { + + if ( this.instructionQueuePointer < this.instructionQueue.length ) { + + prepData = this.instructionQueue[ this.instructionQueuePointer ]; + this._kickWorkerRun( prepData, supportDesc ); + this.instructionQueuePointer++; + + } else { + + this._deregister( supportDesc ); + + } + + } + + } + + if ( ! this.isRunning() && this.callbackOnFinishedProcessing !== null ) { + + this.callbackOnFinishedProcessing(); + this.callbackOnFinishedProcessing = null; + + } + }; + + WorkerDirector.prototype._kickWorkerRun = function( prepData, supportDesc ) { + supportDesc.inUse = true; + supportDesc.workerSupport.setTerminateRequested( supportDesc.terminateRequested ); + + this.logger.logInfo( '\nAssigning next item from queue to worker (queue length: ' + this.instructionQueue.length + ')\n\n' ); + + var scope = this; + var prepDataCallbacks = prepData.getCallbacks(); + var globalCallbacks = this.workerDescription.globalCallbacks; + var wrapperOnLoad = function ( event ) { + if ( Validator.isValid( globalCallbacks.onLoad ) ) globalCallbacks.onLoad( event ); + if ( Validator.isValid( prepDataCallbacks.onLoad ) ) prepDataCallbacks.onLoad( event ); + scope.objectsCompleted++; + supportDesc.inUse = false; + + scope.processQueue(); + }; + + var wrapperOnProgress = function ( event ) { + if ( Validator.isValid( globalCallbacks.onProgress ) ) globalCallbacks.onProgress( event ); + if ( Validator.isValid( prepDataCallbacks.onProgress ) ) prepDataCallbacks.onProgress( event ); + }; + + var wrapperOnMeshAlter = function ( event ) { + if ( Validator.isValid( globalCallbacks.onMeshAlter ) ) globalCallbacks.onMeshAlter( event ); + if ( Validator.isValid( prepDataCallbacks.onMeshAlter ) ) prepDataCallbacks.onMeshAlter( event ); + }; + + supportDesc.loader = this._buildLoader( supportDesc.instanceNo ); + + var updatedCallbacks = new THREE.LoaderSupport.Callbacks(); + updatedCallbacks.setCallbackOnLoad( wrapperOnLoad ); + updatedCallbacks.setCallbackOnProgress( wrapperOnProgress ); + updatedCallbacks.setCallbackOnMeshAlter( wrapperOnMeshAlter ); + prepData.callbacks = updatedCallbacks; + + supportDesc.loader.run( prepData, supportDesc.workerSupport ); + }; + + WorkerDirector.prototype._buildLoader = function ( instanceNo ) { + var classDef = this.workerDescription.classDef; + var loader = Object.create( classDef.prototype ); + this.workerDescription.classDef.call( loader, THREE.DefaultLoadingManager, this.logger ); + + // verify that all required functions are implemented + if ( ! loader.hasOwnProperty( 'instanceNo' ) ) throw classDef.name + ' has no property "instanceNo".'; + loader.instanceNo = instanceNo; + + if ( ! loader.hasOwnProperty( 'workerSupport' ) ) { + + throw classDef.name + ' has no property "workerSupport".'; + + } + if ( typeof loader.run !== 'function' ) throw classDef.name + ' has no function "run".'; + if ( ! loader.hasOwnProperty( 'callbacks' ) || ! Validator.isValid( loader.callbacks ) ) { + + this.logger.logWarn( classDef.name + ' has an invalid property "callbacks". Will change to "THREE.LoaderSupport.Callbacks"' ); + loader.callbacks = new THREE.LoaderSupport.Callbacks(); + + } + return loader; + }; + + WorkerDirector.prototype._deregister = function ( supportDesc ) { + if ( Validator.isValid( supportDesc ) ) { + + supportDesc.workerSupport.setTerminateRequested( true ); + this.logger.logInfo( 'Requested termination of worker #' + supportDesc.instanceNo + '.' ); + + var loaderCallbacks = supportDesc.loader.callbacks; + if ( Validator.isValid( loaderCallbacks.onProgress ) ) loaderCallbacks.onProgress( { detail: { text: '' } } ); + delete this.workerDescription.workerSupports[ supportDesc.instanceNo ]; + + } + }; + + /** + * Terminate all workers. + * @memberOf THREE.LoaderSupport.WorkerDirector + * + * @param {callback} callbackOnFinishedProcessing Function called once all workers finished processing. + */ + WorkerDirector.prototype.tearDown = function ( callbackOnFinishedProcessing ) { + this.logger.logInfo( 'WorkerDirector received the deregister call. Terminating all workers!' ); + + this.instructionQueuePointer = this.instructionQueue.length; + this.callbackOnFinishedProcessing = Validator.verifyInput( callbackOnFinishedProcessing, null ); + + for ( var name in this.workerDescription.workerSupports ) { + + this.workerDescription.workerSupports[ name ].terminateRequested = true; + + } + }; + + return WorkerDirector; + +})(); diff --git a/recursive_swarm/lib/MTLLoader.js b/recursive_swarm/lib/MTLLoader.js new file mode 100644 index 0000000000000000000000000000000000000000..152e0a69dc0604a3688f7c940c106d7ccdc189e4 --- /dev/null +++ b/recursive_swarm/lib/MTLLoader.js @@ -0,0 +1,540 @@ +/** + * Loads a Wavefront .mtl file specifying materials + * + * @author angelxuanchang + */ + +THREE.MTLLoader = function ( manager ) { + + this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager; + +}; + +THREE.MTLLoader.prototype = { + + constructor: THREE.MTLLoader, + + /** + * Loads and parses a MTL asset from a URL. + * + * @param {String} url - URL to the MTL file. + * @param {Function} [onLoad] - Callback invoked with the loaded object. + * @param {Function} [onProgress] - Callback for download progress. + * @param {Function} [onError] - Callback for download errors. + * + * @see setPath setTexturePath + * + * @note In order for relative texture references to resolve correctly + * you must call setPath and/or setTexturePath explicitly prior to load. + */ + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new THREE.FileLoader( this.manager ); + loader.setPath( this.path ); + loader.load( url, function ( text ) { + + onLoad( scope.parse( text ) ); + + }, onProgress, onError ); + + }, + + /** + * Set base path for resolving references. + * If set this path will be prepended to each loaded and found reference. + * + * @see setTexturePath + * @param {String} path + * + * @example + * mtlLoader.setPath( 'assets/obj/' ); + * mtlLoader.load( 'my.mtl', ... ); + */ + setPath: function ( path ) { + + this.path = path; + + }, + + /** + * Set base path for resolving texture references. + * If set this path will be prepended found texture reference. + * If not set and setPath is, it will be used as texture base path. + * + * @see setPath + * @param {String} path + * + * @example + * mtlLoader.setPath( 'assets/obj/' ); + * mtlLoader.setTexturePath( 'assets/textures/' ); + * mtlLoader.load( 'my.mtl', ... ); + */ + setTexturePath: function ( path ) { + + this.texturePath = path; + + }, + + setBaseUrl: function ( path ) { + + console.warn( 'THREE.MTLLoader: .setBaseUrl() is deprecated. Use .setTexturePath( path ) for texture path or .setPath( path ) for general base path instead.' ); + + this.setTexturePath( path ); + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + + }, + + setMaterialOptions: function ( value ) { + + this.materialOptions = value; + + }, + + /** + * Parses a MTL file. + * + * @param {String} text - Content of MTL file + * @return {THREE.MTLLoader.MaterialCreator} + * + * @see setPath setTexturePath + * + * @note In order for relative texture references to resolve correctly + * you must call setPath and/or setTexturePath explicitly prior to parse. + */ + parse: function ( text ) { + + var lines = text.split( '\n' ); + var info = {}; + var delimiter_pattern = /\s+/; + var materialsInfo = {}; + + for ( var i = 0; i < lines.length; i ++ ) { + + var line = lines[ i ]; + line = line.trim(); + + if ( line.length === 0 || line.charAt( 0 ) === '#' ) { + + // Blank line or comment ignore + continue; + + } + + var pos = line.indexOf( ' ' ); + + var key = ( pos >= 0 ) ? line.substring( 0, pos ) : line; + key = key.toLowerCase(); + + var value = ( pos >= 0 ) ? line.substring( pos + 1 ) : ''; + value = value.trim(); + + if ( key === 'newmtl' ) { + + // New material + + info = { name: value }; + materialsInfo[ value ] = info; + + } else if ( info ) { + + if ( key === 'ka' || key === 'kd' || key === 'ks' ) { + + var ss = value.split( delimiter_pattern, 3 ); + info[ key ] = [ parseFloat( ss[ 0 ] ), parseFloat( ss[ 1 ] ), parseFloat( ss[ 2 ] ) ]; + + } else { + + info[ key ] = value; + + } + + } + + } + + var materialCreator = new THREE.MTLLoader.MaterialCreator( this.texturePath || this.path, this.materialOptions ); + materialCreator.setCrossOrigin( this.crossOrigin ); + materialCreator.setManager( this.manager ); + materialCreator.setMaterials( materialsInfo ); + return materialCreator; + + } + +}; + +/** + * Create a new THREE-MTLLoader.MaterialCreator + * @param baseUrl - Url relative to which textures are loaded + * @param options - Set of options on how to construct the materials + * side: Which side to apply the material + * THREE.FrontSide (default), THREE.BackSide, THREE.DoubleSide + * wrap: What type of wrapping to apply for textures + * THREE.RepeatWrapping (default), THREE.ClampToEdgeWrapping, THREE.MirroredRepeatWrapping + * normalizeRGB: RGBs need to be normalized to 0-1 from 0-255 + * Default: false, assumed to be already normalized + * ignoreZeroRGBs: Ignore values of RGBs (Ka,Kd,Ks) that are all 0's + * Default: false + * @constructor + */ + +THREE.MTLLoader.MaterialCreator = function ( baseUrl, options ) { + + this.baseUrl = baseUrl || ''; + this.options = options; + this.materialsInfo = {}; + this.materials = {}; + this.materialsArray = []; + this.nameLookup = {}; + + this.side = ( this.options && this.options.side ) ? this.options.side : THREE.FrontSide; + this.wrap = ( this.options && this.options.wrap ) ? this.options.wrap : THREE.RepeatWrapping; + +}; + +THREE.MTLLoader.MaterialCreator.prototype = { + + constructor: THREE.MTLLoader.MaterialCreator, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + + }, + + setManager: function ( value ) { + + this.manager = value; + + }, + + setMaterials: function ( materialsInfo ) { + + this.materialsInfo = this.convert( materialsInfo ); + this.materials = {}; + this.materialsArray = []; + this.nameLookup = {}; + + }, + + convert: function ( materialsInfo ) { + + if ( ! this.options ) return materialsInfo; + + var converted = {}; + + for ( var mn in materialsInfo ) { + + // Convert materials info into normalized form based on options + + var mat = materialsInfo[ mn ]; + + var covmat = {}; + + converted[ mn ] = covmat; + + for ( var prop in mat ) { + + var save = true; + var value = mat[ prop ]; + var lprop = prop.toLowerCase(); + + switch ( lprop ) { + + case 'kd': + case 'ka': + case 'ks': + + // Diffuse color (color under white light) using RGB values + + if ( this.options && this.options.normalizeRGB ) { + + value = [ value[ 0 ] / 255, value[ 1 ] / 255, value[ 2 ] / 255 ]; + + } + + if ( this.options && this.options.ignoreZeroRGBs ) { + + if ( value[ 0 ] === 0 && value[ 1 ] === 0 && value[ 2 ] === 0 ) { + + // ignore + + save = false; + + } + + } + + break; + + default: + + break; + + } + + if ( save ) { + + covmat[ lprop ] = value; + + } + + } + + } + + return converted; + + }, + + preload: function () { + + for ( var mn in this.materialsInfo ) { + + this.create( mn ); + + } + + }, + + getIndex: function ( materialName ) { + + return this.nameLookup[ materialName ]; + + }, + + getAsArray: function () { + + var index = 0; + + for ( var mn in this.materialsInfo ) { + + this.materialsArray[ index ] = this.create( mn ); + this.nameLookup[ mn ] = index; + index ++; + + } + + return this.materialsArray; + + }, + + create: function ( materialName ) { + + if ( this.materials[ materialName ] === undefined ) { + + this.createMaterial_( materialName ); + + } + + return this.materials[ materialName ]; + + }, + + createMaterial_: function ( materialName ) { + + // Create material + + var scope = this; + var mat = this.materialsInfo[ materialName ]; + var params = { + + name: materialName, + side: this.side + + }; + + function resolveURL( baseUrl, url ) { + + if ( typeof url !== 'string' || url === '' ) + return ''; + + // Absolute URL + if ( /^https?:\/\//i.test( url ) ) return url; + + return baseUrl + url; + + } + + function setMapForType( mapType, value ) { + + if ( params[ mapType ] ) return; // Keep the first encountered texture + + var texParams = scope.getTextureParams( value, params ); + var map = scope.loadTexture( resolveURL( scope.baseUrl, texParams.url ) ); + + map.repeat.copy( texParams.scale ); + map.offset.copy( texParams.offset ); + + map.wrapS = scope.wrap; + map.wrapT = scope.wrap; + + params[ mapType ] = map; + + } + + for ( var prop in mat ) { + + var value = mat[ prop ]; + + if ( value === '' ) continue; + + switch ( prop.toLowerCase() ) { + + // Ns is material specular exponent + + case 'kd': + + // Diffuse color (color under white light) using RGB values + + params.color = new THREE.Color().fromArray( value ); + + break; + + case 'ks': + + // Specular color (color when light is reflected from shiny surface) using RGB values + params.specular = new THREE.Color().fromArray( value ); + + break; + + case 'map_kd': + + // Diffuse texture map + + setMapForType( "map", value ); + + break; + + case 'map_ks': + + // Specular map + + setMapForType( "specularMap", value ); + + break; + + case 'map_bump': + case 'bump': + + // Bump texture map + + setMapForType( "bumpMap", value ); + + break; + + case 'ns': + + // The specular exponent (defines the focus of the specular highlight) + // A high exponent results in a tight, concentrated highlight. Ns values normally range from 0 to 1000. + + params.shininess = parseFloat( value ); + + break; + + case 'd': + + if ( value < 1 ) { + + params.opacity = value; + params.transparent = true; + + } + + break; + + case 'Tr': + + if ( value > 0 ) { + + params.opacity = 1 - value; + params.transparent = true; + + } + + break; + + default: + break; + + } + + } + + this.materials[ materialName ] = new THREE.MeshPhongMaterial( params ); + return this.materials[ materialName ]; + + }, + + getTextureParams: function ( value, matParams ) { + + var texParams = { + + scale: new THREE.Vector2( 1, 1 ), + offset: new THREE.Vector2( 0, 0 ) + + }; + + var items = value.split( /\s+/ ); + var pos; + + pos = items.indexOf( '-bm' ); + + if ( pos >= 0 ) { + + matParams.bumpScale = parseFloat( items[ pos + 1 ] ); + items.splice( pos, 2 ); + + } + + pos = items.indexOf( '-s' ); + + if ( pos >= 0 ) { + + texParams.scale.set( parseFloat( items[ pos + 1 ] ), parseFloat( items[ pos + 2 ] ) ); + items.splice( pos, 4 ); // we expect 3 parameters here! + + } + + pos = items.indexOf( '-o' ); + + if ( pos >= 0 ) { + + texParams.offset.set( parseFloat( items[ pos + 1 ] ), parseFloat( items[ pos + 2 ] ) ); + items.splice( pos, 4 ); // we expect 3 parameters here! + + } + + texParams.url = items.join( ' ' ).trim(); + return texParams; + + }, + + loadTexture: function ( url, mapping, onLoad, onProgress, onError ) { + + var texture; + var loader = THREE.Loader.Handlers.get( url ); + var manager = ( this.manager !== undefined ) ? this.manager : THREE.DefaultLoadingManager; + + if ( loader === null ) { + + loader = new THREE.TextureLoader( manager ); + + } + + if ( loader.setCrossOrigin ) loader.setCrossOrigin( this.crossOrigin ); + texture = loader.load( url, onLoad, onProgress, onError ); + + if ( mapping !== undefined ) texture.mapping = mapping; + + return texture; + + } + +}; \ No newline at end of file diff --git a/recursive_swarm/lib/MaskPass.js b/recursive_swarm/lib/MaskPass.js new file mode 100644 index 0000000000000000000000000000000000000000..a79834591d8795e21a79c4f77240865966157d58 --- /dev/null +++ b/recursive_swarm/lib/MaskPass.js @@ -0,0 +1,97 @@ +/** + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.MaskPass = function ( scene, camera ) { + + THREE.Pass.call( this ); + + this.scene = scene; + this.camera = camera; + + this.clear = true; + this.needsSwap = false; + + this.inverse = false; + +}; + +THREE.MaskPass.prototype = Object.assign( Object.create( THREE.Pass.prototype ), { + + constructor: THREE.MaskPass, + + render: function ( renderer, writeBuffer, readBuffer, delta, maskActive ) { + + var context = renderer.context; + var state = renderer.state; + + // don't update color or depth + + state.buffers.color.setMask( false ); + state.buffers.depth.setMask( false ); + + // lock buffers + + state.buffers.color.setLocked( true ); + state.buffers.depth.setLocked( true ); + + // set up stencil + + var writeValue, clearValue; + + if ( this.inverse ) { + + writeValue = 0; + clearValue = 1; + + } else { + + writeValue = 1; + clearValue = 0; + + } + + state.buffers.stencil.setTest( true ); + state.buffers.stencil.setOp( context.REPLACE, context.REPLACE, context.REPLACE ); + state.buffers.stencil.setFunc( context.ALWAYS, writeValue, 0xffffffff ); + state.buffers.stencil.setClear( clearValue ); + + // draw into the stencil buffer + + renderer.render( this.scene, this.camera, readBuffer, this.clear ); + renderer.render( this.scene, this.camera, writeBuffer, this.clear ); + + // unlock color and depth buffer for subsequent rendering + + state.buffers.color.setLocked( false ); + state.buffers.depth.setLocked( false ); + + // only render where stencil is set to 1 + + state.buffers.stencil.setFunc( context.EQUAL, 1, 0xffffffff ); // draw if == 1 + state.buffers.stencil.setOp( context.KEEP, context.KEEP, context.KEEP ); + + } + +} ); + + +THREE.ClearMaskPass = function () { + + THREE.Pass.call( this ); + + this.needsSwap = false; + +}; + +THREE.ClearMaskPass.prototype = Object.create( THREE.Pass.prototype ); + +Object.assign( THREE.ClearMaskPass.prototype, { + + render: function ( renderer, writeBuffer, readBuffer, delta, maskActive ) { + + renderer.state.buffers.stencil.setTest( false ); + + } + +} ); \ No newline at end of file diff --git a/recursive_swarm/lib/OBJLoader.js b/recursive_swarm/lib/OBJLoader.js new file mode 100644 index 0000000000000000000000000000000000000000..cfe309a7789e3504c1e5a24d0ec6e918b963dfe8 --- /dev/null +++ b/recursive_swarm/lib/OBJLoader.js @@ -0,0 +1,791 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.OBJLoader = ( function () { + + // o object_name | g group_name + var object_pattern = /^[og]\s*(.+)?/; + // mtllib file_reference + var material_library_pattern = /^mtllib /; + // usemtl material_name + var material_use_pattern = /^usemtl /; + + function ParserState() { + + var state = { + objects: [], + object: {}, + + vertices: [], + normals: [], + colors: [], + uvs: [], + + materialLibraries: [], + + startObject: function ( name, fromDeclaration ) { + + // If the current object (initial from reset) is not from a g/o declaration in the parsed + // file. We need to use it for the first parsed g/o to keep things in sync. + if ( this.object && this.object.fromDeclaration === false ) { + + this.object.name = name; + this.object.fromDeclaration = ( fromDeclaration !== false ); + return; + + } + + var previousMaterial = ( this.object && typeof this.object.currentMaterial === 'function' ? this.object.currentMaterial() : undefined ); + + if ( this.object && typeof this.object._finalize === 'function' ) { + + this.object._finalize( true ); + + } + + this.object = { + name: name || '', + fromDeclaration: ( fromDeclaration !== false ), + + geometry: { + vertices: [], + normals: [], + colors: [], + uvs: [] + }, + materials: [], + smooth: true, + + startMaterial: function ( name, libraries ) { + + var previous = this._finalize( false ); + + // New usemtl declaration overwrites an inherited material, except if faces were declared + // after the material, then it must be preserved for proper MultiMaterial continuation. + if ( previous && ( previous.inherited || previous.groupCount <= 0 ) ) { + + this.materials.splice( previous.index, 1 ); + + } + + var material = { + index: this.materials.length, + name: name || '', + mtllib: ( Array.isArray( libraries ) && libraries.length > 0 ? libraries[ libraries.length - 1 ] : '' ), + smooth: ( previous !== undefined ? previous.smooth : this.smooth ), + groupStart: ( previous !== undefined ? previous.groupEnd : 0 ), + groupEnd: - 1, + groupCount: - 1, + inherited: false, + + clone: function ( index ) { + + var cloned = { + index: ( typeof index === 'number' ? index : this.index ), + name: this.name, + mtllib: this.mtllib, + smooth: this.smooth, + groupStart: 0, + groupEnd: - 1, + groupCount: - 1, + inherited: false + }; + cloned.clone = this.clone.bind( cloned ); + return cloned; + + } + }; + + this.materials.push( material ); + + return material; + + }, + + currentMaterial: function () { + + if ( this.materials.length > 0 ) { + + return this.materials[ this.materials.length - 1 ]; + + } + + return undefined; + + }, + + _finalize: function ( end ) { + + var lastMultiMaterial = this.currentMaterial(); + if ( lastMultiMaterial && lastMultiMaterial.groupEnd === - 1 ) { + + lastMultiMaterial.groupEnd = this.geometry.vertices.length / 3; + lastMultiMaterial.groupCount = lastMultiMaterial.groupEnd - lastMultiMaterial.groupStart; + lastMultiMaterial.inherited = false; + + } + + // Ignore objects tail materials if no face declarations followed them before a new o/g started. + if ( end && this.materials.length > 1 ) { + + for ( var mi = this.materials.length - 1; mi >= 0; mi -- ) { + + if ( this.materials[ mi ].groupCount <= 0 ) { + + this.materials.splice( mi, 1 ); + + } + + } + + } + + // Guarantee at least one empty material, this makes the creation later more straight forward. + if ( end && this.materials.length === 0 ) { + + this.materials.push( { + name: '', + smooth: this.smooth + } ); + + } + + return lastMultiMaterial; + + } + }; + + // Inherit previous objects material. + // Spec tells us that a declared material must be set to all objects until a new material is declared. + // If a usemtl declaration is encountered while this new object is being parsed, it will + // overwrite the inherited material. Exception being that there was already face declarations + // to the inherited material, then it will be preserved for proper MultiMaterial continuation. + + if ( previousMaterial && previousMaterial.name && typeof previousMaterial.clone === 'function' ) { + + var declared = previousMaterial.clone( 0 ); + declared.inherited = true; + this.object.materials.push( declared ); + + } + + this.objects.push( this.object ); + + }, + + finalize: function () { + + if ( this.object && typeof this.object._finalize === 'function' ) { + + this.object._finalize( true ); + + } + + }, + + parseVertexIndex: function ( value, len ) { + + var index = parseInt( value, 10 ); + return ( index >= 0 ? index - 1 : index + len / 3 ) * 3; + + }, + + parseNormalIndex: function ( value, len ) { + + var index = parseInt( value, 10 ); + return ( index >= 0 ? index - 1 : index + len / 3 ) * 3; + + }, + + parseUVIndex: function ( value, len ) { + + var index = parseInt( value, 10 ); + return ( index >= 0 ? index - 1 : index + len / 2 ) * 2; + + }, + + addVertex: function ( a, b, c ) { + + var src = this.vertices; + var dst = this.object.geometry.vertices; + + dst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] ); + dst.push( src[ b + 0 ], src[ b + 1 ], src[ b + 2 ] ); + dst.push( src[ c + 0 ], src[ c + 1 ], src[ c + 2 ] ); + + }, + + addVertexPoint: function ( a ) { + + var src = this.vertices; + var dst = this.object.geometry.vertices; + + dst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] ); + + }, + + addVertexLine: function ( a ) { + + var src = this.vertices; + var dst = this.object.geometry.vertices; + + dst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] ); + + }, + + addNormal: function ( a, b, c ) { + + var src = this.normals; + var dst = this.object.geometry.normals; + + dst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] ); + dst.push( src[ b + 0 ], src[ b + 1 ], src[ b + 2 ] ); + dst.push( src[ c + 0 ], src[ c + 1 ], src[ c + 2 ] ); + + }, + + addColor: function ( a, b, c ) { + + var src = this.colors; + var dst = this.object.geometry.colors; + + dst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] ); + dst.push( src[ b + 0 ], src[ b + 1 ], src[ b + 2 ] ); + dst.push( src[ c + 0 ], src[ c + 1 ], src[ c + 2 ] ); + + }, + + addUV: function ( a, b, c ) { + + var src = this.uvs; + var dst = this.object.geometry.uvs; + + dst.push( src[ a + 0 ], src[ a + 1 ] ); + dst.push( src[ b + 0 ], src[ b + 1 ] ); + dst.push( src[ c + 0 ], src[ c + 1 ] ); + + }, + + addUVLine: function ( a ) { + + var src = this.uvs; + var dst = this.object.geometry.uvs; + + dst.push( src[ a + 0 ], src[ a + 1 ] ); + + }, + + addFace: function ( a, b, c, ua, ub, uc, na, nb, nc ) { + + var vLen = this.vertices.length; + + var ia = this.parseVertexIndex( a, vLen ); + var ib = this.parseVertexIndex( b, vLen ); + var ic = this.parseVertexIndex( c, vLen ); + + this.addVertex( ia, ib, ic ); + + if ( ua !== undefined && ua !== '' ) { + + var uvLen = this.uvs.length; + ia = this.parseUVIndex( ua, uvLen ); + ib = this.parseUVIndex( ub, uvLen ); + ic = this.parseUVIndex( uc, uvLen ); + this.addUV( ia, ib, ic ); + + } + + if ( na !== undefined && na !== '' ) { + + // Normals are many times the same. If so, skip function call and parseInt. + var nLen = this.normals.length; + ia = this.parseNormalIndex( na, nLen ); + + ib = na === nb ? ia : this.parseNormalIndex( nb, nLen ); + ic = na === nc ? ia : this.parseNormalIndex( nc, nLen ); + + this.addNormal( ia, ib, ic ); + + } + + if ( this.colors.length > 0 ) { + + this.addColor( ia, ib, ic ); + + } + + }, + + addPointGeometry: function ( vertices ) { + + this.object.geometry.type = 'Points'; + + var vLen = this.vertices.length; + + for ( var vi = 0, l = vertices.length; vi < l; vi ++ ) { + + this.addVertexPoint( this.parseVertexIndex( vertices[ vi ], vLen ) ); + + } + + }, + + addLineGeometry: function ( vertices, uvs ) { + + this.object.geometry.type = 'Line'; + + var vLen = this.vertices.length; + var uvLen = this.uvs.length; + + for ( var vi = 0, l = vertices.length; vi < l; vi ++ ) { + + this.addVertexLine( this.parseVertexIndex( vertices[ vi ], vLen ) ); + + } + + for ( var uvi = 0, l = uvs.length; uvi < l; uvi ++ ) { + + this.addUVLine( this.parseUVIndex( uvs[ uvi ], uvLen ) ); + + } + + } + + }; + + state.startObject( '', false ); + + return state; + + } + + // + + function OBJLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager; + + this.materials = null; + + } + + OBJLoader.prototype = { + + constructor: OBJLoader, + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new THREE.FileLoader( scope.manager ); + loader.setPath( this.path ); + loader.load( url, function ( text ) { + + onLoad( scope.parse( text ) ); + + }, onProgress, onError ); + + }, + + setPath: function ( value ) { + + this.path = value; + + }, + + setMaterials: function ( materials ) { + + this.materials = materials; + + return this; + + }, + + parse: function ( text ) { + + console.time( 'OBJLoader' ); + + var state = new ParserState(); + + if ( text.indexOf( '\r\n' ) !== - 1 ) { + + // This is faster than String.split with regex that splits on both + text = text.replace( /\r\n/g, '\n' ); + + } + + if ( text.indexOf( '\\\n' ) !== - 1 ) { + + // join lines separated by a line continuation character (\) + text = text.replace( /\\\n/g, '' ); + + } + + var lines = text.split( '\n' ); + var line = '', lineFirstChar = ''; + var lineLength = 0; + var result = []; + + // Faster to just trim left side of the line. Use if available. + var trimLeft = ( typeof ''.trimLeft === 'function' ); + + for ( var i = 0, l = lines.length; i < l; i ++ ) { + + line = lines[ i ]; + + line = trimLeft ? line.trimLeft() : line.trim(); + + lineLength = line.length; + + if ( lineLength === 0 ) continue; + + lineFirstChar = line.charAt( 0 ); + + // @todo invoke passed in handler if any + if ( lineFirstChar === '#' ) continue; + + if ( lineFirstChar === 'v' ) { + + var data = line.split( /\s+/ ); + + switch ( data[ 0 ] ) { + + case 'v': + state.vertices.push( + parseFloat( data[ 1 ] ), + parseFloat( data[ 2 ] ), + parseFloat( data[ 3 ] ) + ); + if ( data.length === 8 ) { + + state.colors.push( + parseFloat( data[ 4 ] ), + parseFloat( data[ 5 ] ), + parseFloat( data[ 6 ] ) + + ); + + } + break; + case 'vn': + state.normals.push( + parseFloat( data[ 1 ] ), + parseFloat( data[ 2 ] ), + parseFloat( data[ 3 ] ) + ); + break; + case 'vt': + state.uvs.push( + parseFloat( data[ 1 ] ), + parseFloat( data[ 2 ] ) + ); + break; + + } + + } else if ( lineFirstChar === 'f' ) { + + var lineData = line.substr( 1 ).trim(); + var vertexData = lineData.split( /\s+/ ); + var faceVertices = []; + + // Parse the face vertex data into an easy to work with format + + for ( var j = 0, jl = vertexData.length; j < jl; j ++ ) { + + var vertex = vertexData[ j ]; + + if ( vertex.length > 0 ) { + + var vertexParts = vertex.split( '/' ); + faceVertices.push( vertexParts ); + + } + + } + + // Draw an edge between the first vertex and all subsequent vertices to form an n-gon + + var v1 = faceVertices[ 0 ]; + + for ( var j = 1, jl = faceVertices.length - 1; j < jl; j ++ ) { + + var v2 = faceVertices[ j ]; + var v3 = faceVertices[ j + 1 ]; + + state.addFace( + v1[ 0 ], v2[ 0 ], v3[ 0 ], + v1[ 1 ], v2[ 1 ], v3[ 1 ], + v1[ 2 ], v2[ 2 ], v3[ 2 ] + ); + + } + + } else if ( lineFirstChar === 'l' ) { + + var lineParts = line.substring( 1 ).trim().split( " " ); + var lineVertices = [], lineUVs = []; + + if ( line.indexOf( "/" ) === - 1 ) { + + lineVertices = lineParts; + + } else { + + for ( var li = 0, llen = lineParts.length; li < llen; li ++ ) { + + var parts = lineParts[ li ].split( "/" ); + + if ( parts[ 0 ] !== "" ) lineVertices.push( parts[ 0 ] ); + if ( parts[ 1 ] !== "" ) lineUVs.push( parts[ 1 ] ); + + } + + } + state.addLineGeometry( lineVertices, lineUVs ); + + } else if ( lineFirstChar === 'p' ) { + + var lineData = line.substr( 1 ).trim(); + var pointData = lineData.split( " " ); + + state.addPointGeometry( pointData ); + + } else if ( ( result = object_pattern.exec( line ) ) !== null ) { + + // o object_name + // or + // g group_name + + // WORKAROUND: https://bugs.chromium.org/p/v8/issues/detail?id=2869 + // var name = result[ 0 ].substr( 1 ).trim(); + var name = ( " " + result[ 0 ].substr( 1 ).trim() ).substr( 1 ); + + state.startObject( name ); + + } else if ( material_use_pattern.test( line ) ) { + + // material + + state.object.startMaterial( line.substring( 7 ).trim(), state.materialLibraries ); + + } else if ( material_library_pattern.test( line ) ) { + + // mtl file + + state.materialLibraries.push( line.substring( 7 ).trim() ); + + } else if ( lineFirstChar === 's' ) { + + result = line.split( ' ' ); + + // smooth shading + + // @todo Handle files that have varying smooth values for a set of faces inside one geometry, + // but does not define a usemtl for each face set. + // This should be detected and a dummy material created (later MultiMaterial and geometry groups). + // This requires some care to not create extra material on each smooth value for "normal" obj files. + // where explicit usemtl defines geometry groups. + // Example asset: examples/models/obj/cerberus/Cerberus.obj + + /* + * http://paulbourke.net/dataformats/obj/ + * or + * http://www.cs.utah.edu/~boulos/cs3505/obj_spec.pdf + * + * From chapter "Grouping" Syntax explanation "s group_number": + * "group_number is the smoothing group number. To turn off smoothing groups, use a value of 0 or off. + * Polygonal elements use group numbers to put elements in different smoothing groups. For free-form + * surfaces, smoothing groups are either turned on or off; there is no difference between values greater + * than 0." + */ + if ( result.length > 1 ) { + + var value = result[ 1 ].trim().toLowerCase(); + state.object.smooth = ( value !== '0' && value !== 'off' ); + + } else { + + // ZBrush can produce "s" lines #11707 + state.object.smooth = true; + + } + var material = state.object.currentMaterial(); + if ( material ) material.smooth = state.object.smooth; + + } else { + + // Handle null terminated files without exception + if ( line === '\0' ) continue; + + throw new Error( 'THREE.OBJLoader: Unexpected line: "' + line + '"' ); + + } + + } + + state.finalize(); + + var container = new THREE.Group(); + container.materialLibraries = [].concat( state.materialLibraries ); + + for ( var i = 0, l = state.objects.length; i < l; i ++ ) { + + var object = state.objects[ i ]; + var geometry = object.geometry; + var materials = object.materials; + var isLine = ( geometry.type === 'Line' ); + var isPoints = ( geometry.type === 'Points' ); + var hasVertexColors = false; + + // Skip o/g line declarations that did not follow with any faces + if ( geometry.vertices.length === 0 ) continue; + + var buffergeometry = new THREE.BufferGeometry(); + + buffergeometry.addAttribute( 'position', new THREE.Float32BufferAttribute( geometry.vertices, 3 ) ); + + if ( geometry.normals.length > 0 ) { + + buffergeometry.addAttribute( 'normal', new THREE.Float32BufferAttribute( geometry.normals, 3 ) ); + + } else { + + buffergeometry.computeVertexNormals(); + + } + + if ( geometry.colors.length > 0 ) { + + hasVertexColors = true; + buffergeometry.addAttribute( 'color', new THREE.Float32BufferAttribute( geometry.colors, 3 ) ); + + } + + if ( geometry.uvs.length > 0 ) { + + buffergeometry.addAttribute( 'uv', new THREE.Float32BufferAttribute( geometry.uvs, 2 ) ); + + } + + // Create materials + + var createdMaterials = []; + + for ( var mi = 0, miLen = materials.length; mi < miLen; mi ++ ) { + + var sourceMaterial = materials[ mi ]; + var material = undefined; + + if ( this.materials !== null ) { + + material = this.materials.create( sourceMaterial.name ); + + // mtl etc. loaders probably can't create line materials correctly, copy properties to a line material. + if ( isLine && material && ! ( material instanceof THREE.LineBasicMaterial ) ) { + + var materialLine = new THREE.LineBasicMaterial(); + materialLine.copy( material ); + materialLine.lights = false; // TOFIX + material = materialLine; + + } else if ( isPoints && material && ! ( material instanceof THREE.PointsMaterial ) ) { + + var materialPoints = new THREE.PointsMaterial( { size: 10, sizeAttenuation: false } ); + materialLine.copy( material ); + material = materialPoints; + + } + + } + + if ( ! material ) { + + if ( isLine ) { + + material = new THREE.LineBasicMaterial(); + + } else if ( isPoints ) { + + material = new THREE.PointsMaterial( { size: 1, sizeAttenuation: false } ); + + } else { + + material = new THREE.MeshPhongMaterial(); + + } + + material.name = sourceMaterial.name; + + } + + material.flatShading = sourceMaterial.smooth ? false : true; + material.vertexColors = hasVertexColors ? THREE.VertexColors : THREE.NoColors; + + createdMaterials.push( material ); + + } + + // Create mesh + + var mesh; + + if ( createdMaterials.length > 1 ) { + + for ( var mi = 0, miLen = materials.length; mi < miLen; mi ++ ) { + + var sourceMaterial = materials[ mi ]; + buffergeometry.addGroup( sourceMaterial.groupStart, sourceMaterial.groupCount, mi ); + + } + + if ( isLine ) { + + mesh = new THREE.LineSegments( buffergeometry, createdMaterials ); + + } else if ( isPoints ) { + + mesh = new THREE.Points( buffergeometry, createdMaterials ); + + } else { + + mesh = new THREE.Mesh( buffergeometry, createdMaterials ); + + } + + } else { + + if ( isLine ) { + + mesh = new THREE.LineSegments( buffergeometry, createdMaterials[ 0 ] ); + + } else if ( isPoints ) { + + mesh = new THREE.Points( buffergeometry, createdMaterials[ 0 ] ); + + } else { + + mesh = new THREE.Mesh( buffergeometry, createdMaterials[ 0 ] ); + + } + + } + + mesh.name = object.name; + + container.add( mesh ); + + } + + console.timeEnd( 'OBJLoader' ); + + return container; + + } + + }; + + return OBJLoader; + +} )(); diff --git a/recursive_swarm/lib/OBJLoader2.js b/recursive_swarm/lib/OBJLoader2.js new file mode 100644 index 0000000000000000000000000000000000000000..03fd9e5fc42ba4b06a745e1b96b75e53ace963d1 --- /dev/null +++ b/recursive_swarm/lib/OBJLoader2.js @@ -0,0 +1,1219 @@ +/** + * @author Kai Salmen / https://kaisalmen.de + * Development repository: https://github.com/kaisalmen/WWOBJLoader + */ + +'use strict'; + +if ( THREE.OBJLoader2 === undefined ) { THREE.OBJLoader2 = {} } + +if ( THREE.LoaderSupport === undefined ) console.error( '"THREE.LoaderSupport" is not available. "THREE.OBJLoader2" requires it. Please include "LoaderSupport.js" in your HTML.' ); + +/** + * Use this class to load OBJ data from files or to parse OBJ data from an arraybuffer + * @class + * + * @param {THREE.DefaultLoadingManager} [manager] The loadingManager for the loader to use. Default is {@link THREE.DefaultLoadingManager} + * @param {THREE.LoaderSupport.ConsoleLogger} logger logger to be used + */ +THREE.OBJLoader2 = (function () { + + var OBJLOADER2_VERSION = '2.3.1'; + var Validator = THREE.LoaderSupport.Validator; + + OBJLoader2.prototype = Object.create( THREE.LoaderSupport.LoaderBase.prototype ); + OBJLoader2.prototype.constructor = OBJLoader2; + + function OBJLoader2( manager, logger ) { + THREE.LoaderSupport.LoaderBase.call( this, manager, logger ); + this.logger.logInfo( 'Using THREE.OBJLoader2 version: ' + OBJLOADER2_VERSION ); + + this.materialPerSmoothingGroup = false; + + this.workerSupport = null; + this.terminateWorkerOnLoad = true; + } + + /** + * Tells whether a material shall be created per smoothing group. + * @memberOf THREE.OBJLoader2 + * + * @param {boolean} materialPerSmoothingGroup=false + */ + OBJLoader2.prototype.setMaterialPerSmoothingGroup = function ( materialPerSmoothingGroup ) { + this.materialPerSmoothingGroup = materialPerSmoothingGroup === true; + }; + + /** + * Run the loader according the provided instructions. + * @memberOf THREE.OBJLoader2 + * + * @param {THREE.LoaderSupport.PrepData} prepData All parameters and resources required for execution + * @param {THREE.LoaderSupport.WorkerSupport} [workerSupportExternal] Use pre-existing WorkerSupport + */ + OBJLoader2.prototype.run = function ( prepData, workerSupportExternal ) { + this._applyPrepData( prepData ); + var available = this.checkResourceDescriptorFiles( prepData.resources, + [ + { ext: "obj", type: "Uint8Array", ignore: false }, + { ext: "mtl", type: "String", ignore: false }, + { ext: "zip", type: "String", ignore: true } + ] + ); + if ( Validator.isValid( workerSupportExternal ) ) { + + this.terminateWorkerOnLoad = false; + this.workerSupport = workerSupportExternal; + this.logger = workerSupportExternal.logger; + + } + var scope = this; + var onMaterialsLoaded = function ( materials ) { + scope.builder.setMaterials( materials ); + + if ( Validator.isValid( available.obj.content ) ) { + + if ( prepData.useAsync ) { + + scope.parseAsync( available.obj.content, scope.callbacks.onLoad ); + + } else { + + scope.parse( available.obj.content ); + + } + } else { + + scope.setPath( available.obj.path ); + scope.load( available.obj.name, scope.callbacks.onLoad, null, null, scope.callbacks.onMeshAlter, prepData.useAsync ); + + } + }; + + this._loadMtl( available.mtl, onMaterialsLoaded, prepData.crossOrigin ); + }; + + OBJLoader2.prototype._applyPrepData = function ( prepData ) { + THREE.LoaderSupport.LoaderBase.prototype._applyPrepData.call( this, prepData ); + + if ( Validator.isValid( prepData ) ) { + + this.setMaterialPerSmoothingGroup( prepData.materialPerSmoothingGroup ); + + } + }; + + /** + * Parses OBJ data synchronously from arraybuffer or string. + * @memberOf THREE.OBJLoader2 + * + * @param {arraybuffer|string} content OBJ data as Uint8Array or String + */ + OBJLoader2.prototype.parse = function ( content ) { + this.logger.logTimeStart( 'OBJLoader2 parse: ' + this.modelName ); + + var parser = new Parser(); + parser.setLogConfig( this.logger.enabled, this.logger.debug ); + parser.setMaterialPerSmoothingGroup( this.materialPerSmoothingGroup ); + parser.setUseIndices( this.useIndices ); + parser.setDisregardNormals( this.disregardNormals ); + // sync code works directly on the material references + parser.setMaterials( this.builder.getMaterials() ); + + var scope = this; + var onMeshLoaded = function ( payload ) { + var meshes = scope.builder.processPayload( payload ); + var mesh; + for ( var i in meshes ) { + mesh = meshes[ i ]; + scope.loaderRootNode.add( mesh ); + } + }; + parser.setCallbackBuilder( onMeshLoaded ); + var onProgressScoped = function ( text, numericalValue ) { + scope.onProgress( 'progressParse', text, numericalValue ); + }; + parser.setCallbackProgress( onProgressScoped ); + + if ( content instanceof ArrayBuffer || content instanceof Uint8Array ) { + + this.logger.logInfo( 'Parsing arrayBuffer...' ); + parser.parse( content ); + + } else if ( typeof( content ) === 'string' || content instanceof String ) { + + this.logger.logInfo( 'Parsing text...' ); + parser.parseText( content ); + + } else { + + throw 'Provided content was neither of type String nor Uint8Array! Aborting...'; + + } + this.logger.logTimeEnd( 'OBJLoader2 parse: ' + this.modelName ); + + return this.loaderRootNode; + }; + + /** + * Parses OBJ content asynchronously from arraybuffer. + * @memberOf THREE.OBJLoader2 + * + * @param {arraybuffer} content OBJ data as Uint8Array + * @param {callback} onLoad Called after worker successfully completed loading + */ + OBJLoader2.prototype.parseAsync = function ( content, onLoad ) { + this.logger.logTimeStart( 'OBJLoader2 parseAsync: ' + this.modelName ); + + var scope = this; + var scopedOnLoad = function () { + onLoad( + { + detail: { + loaderRootNode: scope.loaderRootNode, + modelName: scope.modelName, + instanceNo: scope.instanceNo + } + } + ); + scope.logger.logTimeEnd( 'OBJLoader2 parseAsync: ' + scope.modelName ); + }; + var scopedOnMeshLoaded = function ( payload ) { + var meshes = scope.builder.processPayload( payload ); + var mesh; + for ( var i in meshes ) { + mesh = meshes[ i ]; + scope.loaderRootNode.add( mesh ); + } + }; + + this.workerSupport = Validator.verifyInput( this.workerSupport, new THREE.LoaderSupport.WorkerSupport( this.logger ) ); + var buildCode = function ( funcBuildObject, funcBuildSingleton ) { + var workerCode = ''; + workerCode += '/**\n'; + workerCode += ' * This code was constructed by OBJLoader2 buildCode.\n'; + workerCode += ' */\n\n'; + workerCode += 'THREE = { LoaderSupport: {} };\n\n'; + workerCode += funcBuildObject( 'THREE.LoaderSupport.Validator', Validator ); + workerCode += funcBuildSingleton( 'THREE.LoaderSupport.ConsoleLogger', THREE.LoaderSupport.ConsoleLogger ); + workerCode += funcBuildSingleton( 'THREE.LoaderSupport.LoaderBase', THREE.LoaderSupport.LoaderBase ); + workerCode += funcBuildSingleton( 'Parser', Parser ); + + return workerCode; + }; + this.workerSupport.validate( buildCode, 'Parser' ); + this.workerSupport.setCallbacks( scopedOnMeshLoaded, scopedOnLoad ); + if ( scope.terminateWorkerOnLoad ) this.workerSupport.setTerminateRequested( true ); + + var materialNames = {}; + var materials = this.builder.getMaterials(); + for ( var materialName in materials ) { + + materialNames[ materialName ] = materialName; + + } + this.workerSupport.run( + { + params: { + useAsync: true, + materialPerSmoothingGroup: this.materialPerSmoothingGroup, + useIndices: this.useIndices, + disregardNormals: this.disregardNormals + }, + logger: { + debug: this.logger.debug, + enabled: this.logger.enabled + }, + materials: { + // in async case only material names are supplied to parser + materials: materialNames + }, + data: { + input: content, + options: null + } + } + ); + }; + + + /** + * Parse OBJ data either from ArrayBuffer or string + * @class + */ + var Parser = (function () { + + function Parser() { + this.callbackProgress = null; + this.callbackBuilder = null; + + this.materials = {}; + this.useAsync = false; + this.materialPerSmoothingGroup = false; + this.useIndices = false; + this.disregardNormals = false; + + this.vertices = []; + this.colors = []; + this.normals = []; + this.uvs = []; + + this.rawMesh = { + objectName: '', + groupName: '', + activeMtlName: '', + mtllibName: '', + + // reset with new mesh + faceType: -1, + subGroups: [], + subGroupInUse: null, + smoothingGroup: { + splitMaterials: false, + normalized: -1, + real: -1 + }, + counts: { + doubleIndicesCount: 0, + faceCount: 0, + mtlCount: 0, + smoothingGroupCount: 0 + } + }; + + this.inputObjectCount = 1; + this.outputObjectCount = 1; + this.globalCounts = { + vertices: 0, + faces: 0, + doubleIndicesCount: 0, + currentByte: 0, + totalBytes: 0 + }; + this.logger = new THREE.LoaderSupport.ConsoleLogger(); + } + + Parser.prototype.resetRawMesh = function () { + // faces are stored according combined index of group, material and smoothingGroup (0 or not) + this.rawMesh.subGroups = []; + this.rawMesh.subGroupInUse = null; + this.rawMesh.smoothingGroup.normalized = -1; + this.rawMesh.smoothingGroup.real = -1; + + // this default index is required as it is possible to define faces without 'g' or 'usemtl' + this.pushSmoothingGroup( 1 ); + + this.rawMesh.counts.doubleIndicesCount = 0; + this.rawMesh.counts.faceCount = 0; + this.rawMesh.counts.mtlCount = 0; + this.rawMesh.counts.smoothingGroupCount = 0; + }; + + Parser.prototype.setUseAsync = function ( useAsync ) { + this.useAsync = useAsync; + }; + + Parser.prototype.setMaterialPerSmoothingGroup = function ( materialPerSmoothingGroup ) { + this.materialPerSmoothingGroup = materialPerSmoothingGroup; + }; + + Parser.prototype.setUseIndices = function ( useIndices ) { + this.useIndices = useIndices; + }; + + Parser.prototype.setDisregardNormals = function ( disregardNormals ) { + this.disregardNormals = disregardNormals; + }; + + Parser.prototype.setMaterials = function ( materials ) { + this.materials = THREE.LoaderSupport.Validator.verifyInput( materials, this.materials ); + this.materials = THREE.LoaderSupport.Validator.verifyInput( this.materials, {} ); + }; + + Parser.prototype.setCallbackBuilder = function ( callbackBuilder ) { + if ( ! THREE.LoaderSupport.Validator.isValid( callbackBuilder ) ) throw 'Unable to run as no "builder" callback is set.'; + this.callbackBuilder = callbackBuilder; + }; + + Parser.prototype.setCallbackProgress = function ( callbackProgress ) { + this.callbackProgress = callbackProgress; + }; + + Parser.prototype.setLogConfig = function ( enabled, debug ) { + this.logger.setEnabled( enabled ); + this.logger.setDebug( debug ); + }; + + Parser.prototype.configure = function () { + this.pushSmoothingGroup( 1 ); + + if ( this.logger.isEnabled() ) { + + var matKeys = Object.keys( this.materials ); + var matNames = ( matKeys.length > 0 ) ? '\n\tmaterialNames:\n\t\t- ' + matKeys.join( '\n\t\t- ' ) : '\n\tmaterialNames: None'; + var printedConfig = 'OBJLoader2.Parser configuration:' + + matNames + + '\n\tuseAsync: ' + this.useAsync + + '\n\tmaterialPerSmoothingGroup: ' + this.materialPerSmoothingGroup + + '\n\tuseIndices: ' + this.useIndices + + '\n\tdisregardNormals: ' + this.disregardNormals + + '\n\tcallbackBuilderName: ' + this.callbackBuilder.name + + '\n\tcallbackProgressName: ' + this.callbackProgress.name; + this.logger.logInfo( printedConfig ); + } + }; + + /** + * Parse the provided arraybuffer + * @memberOf Parser + * + * @param {Uint8Array} arrayBuffer OBJ data as Uint8Array + */ + Parser.prototype.parse = function ( arrayBuffer ) { + this.logger.logTimeStart( 'OBJLoader2.Parser.parse' ); + this.configure(); + + var arrayBufferView = new Uint8Array( arrayBuffer ); + var length = arrayBufferView.byteLength; + this.globalCounts.totalBytes = length; + var buffer = new Array( 128 ); + var bufferPointer = 0; + var slashSpacePattern = new Array( 16 ); + var slashSpacePatternPointer = 0; + var code; + var word = ''; + var i = 0; + for ( ; i < length; i++ ) { + + code = arrayBufferView[ i ]; + switch ( code ) { + // space + case 32: + if ( word.length > 0 ) buffer[ bufferPointer++ ] = word; + slashSpacePattern[ slashSpacePatternPointer++ ] = 0; + word = ''; + break; + // slash + case 47: + if ( word.length > 0 ) buffer[ bufferPointer++ ] = word; + slashSpacePattern[ slashSpacePatternPointer++ ] = 1; + word = ''; + break; + + // LF + case 10: + if ( word.length > 0 ) buffer[ bufferPointer++ ] = word; + word = ''; + this.globalCounts.currentByte = i; + this.processLine( buffer, bufferPointer, slashSpacePattern, slashSpacePatternPointer ); + bufferPointer = 0; + slashSpacePatternPointer = 0; + break; + + // CR + case 13: + break; + + default: + word += String.fromCharCode( code ); + break; + } + } + this.finalizeParsing(); + this.logger.logTimeEnd( 'OBJLoader2.Parser.parse' ); + }; + + /** + * Parse the provided text + * @memberOf Parser + * + * @param {string} text OBJ data as string + */ + Parser.prototype.parseText = function ( text ) { + this.logger.logTimeStart( 'OBJLoader2.Parser.parseText' ); + this.configure(); + + var length = text.length; + this.globalCounts.totalBytes = length; + var buffer = new Array( 128 ); + var bufferPointer = 0; + var slashSpacePattern = new Array( 16 ); + var slashSpacePatternPointer = 0; + var char; + var word = ''; + var i = 0; + for ( ; i < length; i++ ) { + + char = text[ i ]; + switch ( char ) { + case ' ': + if ( word.length > 0 ) buffer[ bufferPointer++ ] = word; + slashSpacePattern[ slashSpacePatternPointer++ ] = 0; + word = ''; + break; + + case '/': + if ( word.length > 0 ) buffer[ bufferPointer++ ] = word; + slashSpacePattern[ slashSpacePatternPointer++ ] = 1; + word = ''; + break; + + case '\n': + if ( word.length > 0 ) buffer[ bufferPointer++ ] = word; + word = ''; + this.globalCounts.currentByte = i; + this.processLine( buffer, bufferPointer, slashSpacePattern, slashSpacePatternPointer ); + bufferPointer = 0; + slashSpacePatternPointer = 0; + break; + + case '\r': + break; + + default: + word += char; + } + } + this.finalizeParsing(); + this.logger.logTimeEnd( 'OBJLoader2.Parser.parseText' ); + }; + + Parser.prototype.processLine = function ( buffer, bufferPointer, slashSpacePattern, slashSpacePatternPointer ) { + if ( bufferPointer < 1 ) return; + + var countSlashes = function ( slashSpacePattern, slashSpacePatternPointer ) { + var slashesCount = 0; + for ( var i = 0; i < slashSpacePatternPointer; i++ ) { + slashesCount += slashSpacePattern[ i ]; + } + return slashesCount; + }; + + var concatStringBuffer = function ( buffer, bufferPointer, slashSpacePattern ) { + var concatBuffer = ''; + if ( bufferPointer === 2 ) { + + concatBuffer = buffer[ 1 ]; + + } else { + + var bufferLength = bufferPointer - 1; + for ( var i = 1; i < bufferLength; i++ ) { + + concatBuffer += buffer[ i ] + ( slashSpacePattern[ i ] === 0 ? ' ' : '/' ); + + } + concatBuffer += buffer[ bufferLength ]; + + } + return concatBuffer; + }; + + var flushStringBuffer = function ( buffer, bufferPointer ) { + for ( var i = 0; i < bufferPointer; i++ ) { + buffer[ i ] = ''; + } + }; + + switch ( buffer[ 0 ] ) { + case 'v': + this.vertices.push( parseFloat( buffer[ 1 ] ) ); + this.vertices.push( parseFloat( buffer[ 2 ] ) ); + this.vertices.push( parseFloat( buffer[ 3 ] ) ); + if ( bufferPointer > 4 ) { + + this.colors.push( parseFloat( buffer[ 4 ] ) ); + this.colors.push( parseFloat( buffer[ 5 ] ) ); + this.colors.push( parseFloat( buffer[ 6 ] ) ); + + } + break; + + case 'vt': + this.uvs.push( parseFloat( buffer[ 1 ] ) ); + this.uvs.push( parseFloat( buffer[ 2 ] ) ); + break; + + case 'vn': + this.normals.push( parseFloat( buffer[ 1 ] ) ); + this.normals.push( parseFloat( buffer[ 2 ] ) ); + this.normals.push( parseFloat( buffer[ 3 ] ) ); + break; + + case 'f': + var slashesCount = countSlashes( slashSpacePattern, slashSpacePatternPointer ); + var bufferLength = bufferPointer - 1; + + // "f vertex ..." + if ( slashesCount === 0 ) { + + this.checkFaceType( 0 ); + + // "f vertex/uv ..." + } else if ( bufferLength === slashesCount * 2 ) { + + this.checkFaceType( 1 ); + + // "f vertex/uv/normal ..." + } else if ( bufferLength * 2 === slashesCount * 3 ) { + + this.checkFaceType( 2 ); + + // "f vertex//normal ..." + } else { + + this.checkFaceType( 3 ); + + } + this.processFaces( buffer, bufferLength ); + break; + + case 'l': + this.checkFaceType( 4 ); + this.processLinesOrPoints( buffer, bufferPointer, countSlashes( slashSpacePattern, slashSpacePatternPointer ) ); + break; + + case 'p': + this.checkFaceType( 5 ); + this.processLinesOrPoints( buffer, bufferPointer, 0 ); + break; + + case 's': + this.pushSmoothingGroup( buffer[ 1 ] ); + flushStringBuffer( buffer, bufferPointer ); + break; + + case 'g': + // 'g' leads to creation of mesh if valid data (faces declaration was done before), otherwise only groupName gets set + this.processCompletedMesh(); + this.rawMesh.groupName = THREE.LoaderSupport.Validator.verifyInput( concatStringBuffer( buffer, bufferPointer, slashSpacePattern ), '' ); + flushStringBuffer( buffer, bufferPointer ); + break; + + case 'o': + // 'o' is pure meta-information and does not result in creation of new meshes + this.rawMesh.objectName = THREE.LoaderSupport.Validator.verifyInput( concatStringBuffer( buffer, bufferPointer, slashSpacePattern ), '' ); + flushStringBuffer( buffer, bufferPointer ); + break; + + case 'mtllib': + this.rawMesh.mtllibName = THREE.LoaderSupport.Validator.verifyInput( concatStringBuffer( buffer, bufferPointer, slashSpacePattern ), '' ); + flushStringBuffer( buffer, bufferPointer ); + break; + + case 'usemtl': + var mtlName = concatStringBuffer( buffer, bufferPointer, slashSpacePattern ); + if ( this.rawMesh.activeMtlName !== mtlName && THREE.LoaderSupport.Validator.isValid( mtlName ) ) { + + this.rawMesh.activeMtlName = mtlName; + this.rawMesh.counts.mtlCount++; + this.checkSubGroup(); + + } + flushStringBuffer( buffer, bufferPointer ); + break; + + default: + break; + } + }; + + Parser.prototype.pushSmoothingGroup = function ( smoothingGroup ) { + var smoothingGroupInt = parseInt( smoothingGroup ); + if ( isNaN( smoothingGroupInt ) ) { + smoothingGroupInt = smoothingGroup === "off" ? 0 : 1; + } + + var smoothCheck = this.rawMesh.smoothingGroup.normalized; + this.rawMesh.smoothingGroup.normalized = this.rawMesh.smoothingGroup.splitMaterials ? smoothingGroupInt : ( smoothingGroupInt === 0 ) ? 0 : 1; + this.rawMesh.smoothingGroup.real = smoothingGroupInt; + + if ( smoothCheck !== smoothingGroupInt ) { + + this.rawMesh.counts.smoothingGroupCount++; + this.checkSubGroup(); + + } + }; + + /** + * Expanded faceTypes include all four face types, both line types and the point type + * faceType = 0: "f vertex ..." + * faceType = 1: "f vertex/uv ..." + * faceType = 2: "f vertex/uv/normal ..." + * faceType = 3: "f vertex//normal ..." + * faceType = 4: "l vertex/uv ..." or "l vertex ..." + * faceType = 5: "p vertex ..." + */ + Parser.prototype.checkFaceType = function ( faceType ) { + if ( this.rawMesh.faceType !== faceType ) { + + this.processCompletedMesh(); + this.rawMesh.faceType = faceType; + this.checkSubGroup(); + + } + }; + + Parser.prototype.checkSubGroup = function () { + var index = this.rawMesh.activeMtlName + '|' + this.rawMesh.smoothingGroup.normalized; + this.rawMesh.subGroupInUse = this.rawMesh.subGroups[ index ]; + + if ( ! THREE.LoaderSupport.Validator.isValid( this.rawMesh.subGroupInUse ) ) { + + this.rawMesh.subGroupInUse = { + index: index, + objectName: this.rawMesh.objectName, + groupName: this.rawMesh.groupName, + materialName: this.rawMesh.activeMtlName, + smoothingGroup: this.rawMesh.smoothingGroup.normalized, + vertices: [], + indexMappingsCount: 0, + indexMappings: [], + indices: [], + colors: [], + uvs: [], + normals: [] + }; + this.rawMesh.subGroups[ index ] = this.rawMesh.subGroupInUse; + + } + }; + + Parser.prototype.processFaces = function ( buffer, bufferLength ) { + var i, length; + + // "f vertex ..." + if ( this.rawMesh.faceType === 0 ) { + + for ( i = 2, length = bufferLength; i < length; i ++ ) { + + this.buildFace( buffer[ 1 ] ); + this.buildFace( buffer[ i ] ); + this.buildFace( buffer[ i + 1 ] ); + + } + + // "f vertex/uv ..." + } else if ( this.rawMesh.faceType === 1 ) { + + for ( i = 3, length = bufferLength - 2; i < length; i += 2 ) { + + this.buildFace( buffer[ 1 ], buffer[ 2 ] ); + this.buildFace( buffer[ i ], buffer[ i + 1 ] ); + this.buildFace( buffer[ i + 2 ], buffer[ i + 3 ] ); + + } + + // "f vertex/uv/normal ..." + } else if ( this.rawMesh.faceType === 2 ) { + + for ( i = 4, length = bufferLength - 3; i < length; i += 3 ) { + + this.buildFace( buffer[ 1 ], buffer[ 2 ], buffer[ 3 ] ); + this.buildFace( buffer[ i ], buffer[ i + 1 ], buffer[ i + 2 ] ); + this.buildFace( buffer[ i + 3 ], buffer[ i + 4 ], buffer[ i + 5 ] ); + + } + + // "f vertex//normal ..." + } else { + + for ( i = 3, length = bufferLength - 2; i < length; i += 2 ) { + + this.buildFace( buffer[ 1 ], undefined, buffer[ 2 ] ); + this.buildFace( buffer[ i ], undefined, buffer[ i + 1 ] ); + this.buildFace( buffer[ i + 2 ], undefined, buffer[ i + 3 ] ); + + } + + } + }; + + Parser.prototype.buildFace = function ( faceIndexV, faceIndexU, faceIndexN ) { + if ( this.disregardNormals ) faceIndexN = undefined; + var scope = this; + var updateSubGroupInUse = function () { + + var faceIndexVi = parseInt( faceIndexV ); + var indexPointerV = 3 * ( faceIndexVi > 0 ? faceIndexVi - 1 : faceIndexVi + scope.vertices.length / 3 ); + + var vertices = scope.rawMesh.subGroupInUse.vertices; + vertices.push( scope.vertices[ indexPointerV++ ] ); + vertices.push( scope.vertices[ indexPointerV++ ] ); + vertices.push( scope.vertices[ indexPointerV ] ); + + var indexPointerC = scope.colors.length > 0 ? indexPointerV : null; + if ( indexPointerC !== null ) { + + var colors = scope.rawMesh.subGroupInUse.colors; + colors.push( scope.colors[ indexPointerC++ ] ); + colors.push( scope.colors[ indexPointerC++ ] ); + colors.push( scope.colors[ indexPointerC ] ); + + } + + if ( faceIndexU ) { + + var faceIndexUi = parseInt( faceIndexU ); + var indexPointerU = 2 * ( faceIndexUi > 0 ? faceIndexUi - 1 : faceIndexUi + scope.uvs.length / 2 ); + var uvs = scope.rawMesh.subGroupInUse.uvs; + uvs.push( scope.uvs[ indexPointerU++ ] ); + uvs.push( scope.uvs[ indexPointerU ] ); + + } + if ( faceIndexN ) { + + var faceIndexNi = parseInt( faceIndexN ); + var indexPointerN = 3 * ( faceIndexNi > 0 ? faceIndexNi - 1 : faceIndexNi + scope.normals.length / 3 ); + var normals = scope.rawMesh.subGroupInUse.normals; + normals.push( scope.normals[ indexPointerN++ ] ); + normals.push( scope.normals[ indexPointerN++ ] ); + normals.push( scope.normals[ indexPointerN ] ); + + } + }; + + if ( this.useIndices ) { + + var mappingName = faceIndexV + ( faceIndexU ? '_' + faceIndexU : '_n' ) + ( faceIndexN ? '_' + faceIndexN : '_n' ); + var indicesPointer = this.rawMesh.subGroupInUse.indexMappings[ mappingName ]; + if ( THREE.LoaderSupport.Validator.isValid( indicesPointer ) ) { + + this.rawMesh.counts.doubleIndicesCount++; + + } else { + + indicesPointer = this.rawMesh.subGroupInUse.vertices.length / 3; + updateSubGroupInUse(); + this.rawMesh.subGroupInUse.indexMappings[ mappingName ] = indicesPointer; + this.rawMesh.subGroupInUse.indexMappingsCount++; + + } + this.rawMesh.subGroupInUse.indices.push( indicesPointer ); + + } else { + + updateSubGroupInUse(); + + } + this.rawMesh.counts.faceCount++; + }; + + /* + * Support for lines with or without texture or Points (just Vertex). + * First element in indexArray is the line/point identification + * + * : "l vertex/uv vertex/uv ..." + * 1: "l vertex vertex ..." + */ + Parser.prototype.processLinesOrPoints = function ( buffer, bufferPointer, slashCount ) { + var i = 1; + var length; + var bufferLength = bufferPointer - 1; + + if ( bufferLength === slashCount * 2 ) { + + for ( length = bufferPointer; i < length; i += 2 ) this.buildFace( buffer[ i ], buffer[ i + 1 ] ); + + } else { + + for ( length = bufferPointer; i < length; i ++ ) this.buildFace( buffer[ i ] ); + + } + }; + + Parser.prototype.createRawMeshReport = function ( inputObjectCount ) { + return 'Input Object number: ' + inputObjectCount + + '\n\tObject name: ' + this.rawMesh.objectName + + '\n\tGroup name: ' + this.rawMesh.groupName + + '\n\tMtllib name: ' + this.rawMesh.mtllibName + + '\n\tVertex count: ' + this.vertices.length / 3 + + '\n\tNormal count: ' + this.normals.length / 3 + + '\n\tUV count: ' + this.uvs.length / 2 + + '\n\tSmoothingGroup count: ' + this.rawMesh.counts.smoothingGroupCount + + '\n\tMaterial count: ' + this.rawMesh.counts.mtlCount + + '\n\tReal MeshOutputGroup count: ' + this.rawMesh.subGroups.length; + }; + + /** + * Clear any empty subGroup and calculate absolute vertex, normal and uv counts + */ + Parser.prototype.finalizeRawMesh = function () { + var meshOutputGroupTemp = []; + var meshOutputGroup; + var absoluteVertexCount = 0; + var absoluteIndexMappingsCount = 0; + var absoluteIndexCount = 0; + var absoluteColorCount = 0; + var absoluteNormalCount = 0; + var absoluteUvCount = 0; + var indices; + for ( var name in this.rawMesh.subGroups ) { + + meshOutputGroup = this.rawMesh.subGroups[ name ]; + if ( meshOutputGroup.vertices.length > 0 ) { + + indices = meshOutputGroup.indices; + if ( indices.length > 0 && absoluteIndexMappingsCount > 0 ) { + + for ( var i in indices ) indices[ i ] = indices[ i ] + absoluteIndexMappingsCount; + + } + meshOutputGroupTemp.push( meshOutputGroup ); + absoluteVertexCount += meshOutputGroup.vertices.length; + absoluteIndexMappingsCount += meshOutputGroup.indexMappingsCount; + absoluteIndexCount += meshOutputGroup.indices.length; + absoluteColorCount += meshOutputGroup.colors.length; + absoluteUvCount += meshOutputGroup.uvs.length; + absoluteNormalCount += meshOutputGroup.normals.length; + + } + } + + // do not continue if no result + var result = null; + if ( meshOutputGroupTemp.length > 0 ) { + + result = { + name: this.rawMesh.groupName !== '' ? this.rawMesh.groupName : this.rawMesh.objectName, + subGroups: meshOutputGroupTemp, + absoluteVertexCount: absoluteVertexCount, + absoluteIndexCount: absoluteIndexCount, + absoluteColorCount: absoluteColorCount, + absoluteNormalCount: absoluteNormalCount, + absoluteUvCount: absoluteUvCount, + faceCount: this.rawMesh.counts.faceCount, + doubleIndicesCount: this.rawMesh.counts.doubleIndicesCount + }; + + } + return result; + }; + + Parser.prototype.processCompletedMesh = function () { + var result = this.finalizeRawMesh(); + if ( THREE.LoaderSupport.Validator.isValid( result ) ) { + + if ( this.colors.length > 0 && this.colors.length !== this.vertices.length ) { + + throw 'Vertex Colors were detected, but vertex count and color count do not match!'; + + } + if ( this.logger.isDebug() ) this.logger.logDebug( this.createRawMeshReport( this.inputObjectCount ) ); + this.inputObjectCount++; + + this.buildMesh( result ); + var progressBytesPercent = this.globalCounts.currentByte / this.globalCounts.totalBytes; + this.callbackProgress( 'Completed [o: ' + this.rawMesh.objectName + ' g:' + this.rawMesh.groupName + '] Total progress: ' + ( progressBytesPercent * 100 ).toFixed( 2 ) + '%', progressBytesPercent ); + this.resetRawMesh(); + return true; + + } else { + + return false; + } + }; + + /** + * SubGroups are transformed to too intermediate format that is forwarded to the Builder. + * It is ensured that SubGroups only contain objects with vertices (no need to check). + * + * @param result + */ + Parser.prototype.buildMesh = function ( result ) { + var meshOutputGroups = result.subGroups; + + var vertexFA = new Float32Array( result.absoluteVertexCount ); + this.globalCounts.vertices += result.absoluteVertexCount / 3; + this.globalCounts.faces += result.faceCount; + this.globalCounts.doubleIndicesCount += result.doubleIndicesCount; + var indexUA = ( result.absoluteIndexCount > 0 ) ? new Uint32Array( result.absoluteIndexCount ) : null; + var colorFA = ( result.absoluteColorCount > 0 ) ? new Float32Array( result.absoluteColorCount ) : null; + var normalFA = ( result.absoluteNormalCount > 0 ) ? new Float32Array( result.absoluteNormalCount ) : null; + var uvFA = ( result.absoluteUvCount > 0 ) ? new Float32Array( result.absoluteUvCount ) : null; + var haveVertexColors = THREE.LoaderSupport.Validator.isValid( colorFA ); + + var meshOutputGroup; + var materialNames = []; + + var createMultiMaterial = ( meshOutputGroups.length > 1 ); + var materialIndex = 0; + var materialIndexMapping = []; + var selectedMaterialIndex; + var materialGroup; + var materialGroups = []; + + var vertexFAOffset = 0; + var indexUAOffset = 0; + var colorFAOffset = 0; + var normalFAOffset = 0; + var uvFAOffset = 0; + var materialGroupOffset = 0; + var materialGroupLength = 0; + + var materialOrg, material, materialName, materialNameOrg; + // only one specific face type + for ( var oodIndex in meshOutputGroups ) { + + if ( ! meshOutputGroups.hasOwnProperty( oodIndex ) ) continue; + meshOutputGroup = meshOutputGroups[ oodIndex ]; + + materialNameOrg = meshOutputGroup.materialName; + if ( this.rawMesh.faceType < 4 ) { + + materialName = materialNameOrg + ( haveVertexColors ? '_vertexColor' : '' ) + ( meshOutputGroup.smoothingGroup === 0 ? '_flat' : '' ); + + + } else { + + materialName = this.rawMesh.faceType === 4 ? 'defaultLineMaterial' : 'defaultPointMaterial'; + + } + materialOrg = this.materials[ materialNameOrg ]; + material = this.materials[ materialName ]; + + // both original and derived names do not lead to an existing material => need to use a default material + if ( ! THREE.LoaderSupport.Validator.isValid( materialOrg ) && ! THREE.LoaderSupport.Validator.isValid( material ) ) { + + var defaultMaterialName = haveVertexColors ? 'defaultVertexColorMaterial' : 'defaultMaterial'; + materialOrg = this.materials[ defaultMaterialName ]; + this.logger.logWarn( 'object_group "' + meshOutputGroup.objectName + '_' + + meshOutputGroup.groupName + '" was defined with unresolvable material "' + + materialNameOrg + '"! Assigning "' + defaultMaterialName + '".' ); + materialNameOrg = defaultMaterialName; + + // if names are identical then there is no need for later manipulation + if ( materialNameOrg === materialName ) { + + material = materialOrg; + materialName = defaultMaterialName; + + } + + } + if ( ! THREE.LoaderSupport.Validator.isValid( material ) ) { + + var materialCloneInstructions = { + materialNameOrg: materialNameOrg, + materialName: materialName, + materialProperties: { + vertexColors: haveVertexColors ? 2 : 0, + flatShading: meshOutputGroup.smoothingGroup === 0 + } + }; + var payload = { + cmd: 'materialData', + materials: { + materialCloneInstructions: materialCloneInstructions + } + }; + this.callbackBuilder( payload ); + + // fake entry for async; sync Parser always works on material references (Builder update directly visible here) + if ( this.useAsync ) this.materials[ materialName ] = materialCloneInstructions; + + } + + if ( createMultiMaterial ) { + + // re-use material if already used before. Reduces materials array size and eliminates duplicates + selectedMaterialIndex = materialIndexMapping[ materialName ]; + if ( ! selectedMaterialIndex ) { + + selectedMaterialIndex = materialIndex; + materialIndexMapping[ materialName ] = materialIndex; + materialNames.push( materialName ); + materialIndex++; + + } + materialGroupLength = this.useIndices ? meshOutputGroup.indices.length : meshOutputGroup.vertices.length / 3; + materialGroup = { + start: materialGroupOffset, + count: materialGroupLength, + index: selectedMaterialIndex + }; + materialGroups.push( materialGroup ); + materialGroupOffset += materialGroupLength; + + } else { + + materialNames.push( materialName ); + + } + + vertexFA.set( meshOutputGroup.vertices, vertexFAOffset ); + vertexFAOffset += meshOutputGroup.vertices.length; + + if ( indexUA ) { + + indexUA.set( meshOutputGroup.indices, indexUAOffset ); + indexUAOffset += meshOutputGroup.indices.length; + + } + + if ( colorFA ) { + + colorFA.set( meshOutputGroup.colors, colorFAOffset ); + colorFAOffset += meshOutputGroup.colors.length; + + } + + if ( normalFA ) { + + normalFA.set( meshOutputGroup.normals, normalFAOffset ); + normalFAOffset += meshOutputGroup.normals.length; + + } + if ( uvFA ) { + + uvFA.set( meshOutputGroup.uvs, uvFAOffset ); + uvFAOffset += meshOutputGroup.uvs.length; + + } + + if ( this.logger.isDebug() ) { + var materialIndexLine = THREE.LoaderSupport.Validator.isValid( selectedMaterialIndex ) ? '\n\t\tmaterialIndex: ' + selectedMaterialIndex : ''; + var createdReport = '\tOutput Object no.: ' + this.outputObjectCount + + '\n\t\tgroupName: ' + meshOutputGroup.groupName + + '\n\t\tIndex: ' + meshOutputGroup.index + + '\n\t\tfaceType: ' + this.rawMesh.faceType + + '\n\t\tmaterialName: ' + meshOutputGroup.materialName + + '\n\t\tsmoothingGroup: ' + meshOutputGroup.smoothingGroup + + materialIndexLine + + '\n\t\tobjectName: ' + meshOutputGroup.objectName + + '\n\t\t#vertices: ' + meshOutputGroup.vertices.length / 3 + + '\n\t\t#indices: ' + meshOutputGroup.indices.length + + '\n\t\t#colors: ' + meshOutputGroup.colors.length / 3 + + '\n\t\t#uvs: ' + meshOutputGroup.uvs.length / 2 + + '\n\t\t#normals: ' + meshOutputGroup.normals.length / 3; + this.logger.logDebug( createdReport ); + } + + } + + this.outputObjectCount++; + this.callbackBuilder( + { + cmd: 'meshData', + progress: { + numericalValue: this.globalCounts.currentByte / this.globalCounts.totalBytes + }, + params: { + meshName: result.name + }, + materials: { + multiMaterial: createMultiMaterial, + materialNames: materialNames, + materialGroups: materialGroups + }, + buffers: { + vertices: vertexFA, + indices: indexUA, + colors: colorFA, + normals: normalFA, + uvs: uvFA + }, + // 0: mesh, 1: line, 2: point + geometryType: this.rawMesh.faceType < 4 ? 0 : ( this.rawMesh.faceType === 4 ) ? 1 : 2 + }, + [ vertexFA.buffer ], + THREE.LoaderSupport.Validator.isValid( indexUA ) ? [ indexUA.buffer ] : null, + THREE.LoaderSupport.Validator.isValid( colorFA ) ? [ colorFA.buffer ] : null, + THREE.LoaderSupport.Validator.isValid( normalFA ) ? [ normalFA.buffer ] : null, + THREE.LoaderSupport.Validator.isValid( uvFA ) ? [ uvFA.buffer ] : null + ); + }; + + Parser.prototype.finalizeParsing = function () { + this.logger.logInfo( 'Global output object count: ' + this.outputObjectCount ); + if ( this.processCompletedMesh() && this.logger.isEnabled() ) { + + var parserFinalReport = 'Overall counts: ' + + '\n\tVertices: ' + this.globalCounts.vertices + + '\n\tFaces: ' + this.globalCounts.faces + + '\n\tMultiple definitions: ' + this.globalCounts.doubleIndicesCount; + this.logger.logInfo( parserFinalReport ); + + } + }; + + return Parser; + })(); + + /** + * Utility method for loading an mtl file according resource description. Provide url or content. + * @memberOf THREE.OBJLoader2 + * + * @param {string} url URL to the file + * @param {Object} content The file content as arraybuffer or text + * @param {function} callbackOnLoad Callback to be called after successful load + * @param {string} [crossOrigin] CORS value + * @param {Object} [materialOptions] Set material loading options for MTLLoader + */ + OBJLoader2.prototype.loadMtl = function ( url, content, callbackOnLoad, crossOrigin, materialOptions ) { + var resource = new THREE.LoaderSupport.ResourceDescriptor( url, 'MTL' ); + resource.setContent( content ); + this._loadMtl( resource, callbackOnLoad, crossOrigin, materialOptions ); + }; + + + OBJLoader2.prototype._loadMtl = function ( resource, callbackOnLoad, crossOrigin, materialOptions ) { + if ( THREE.MTLLoader === undefined ) console.error( '"THREE.MTLLoader" is not available. "THREE.OBJLoader2" requires it for loading MTL files.' ); + if ( Validator.isValid( resource ) ) this.logger.logTimeStart( 'Loading MTL: ' + resource.name ); + + var materials = []; + var scope = this; + var processMaterials = function ( materialCreator ) { + var materialCreatorMaterials = []; + if ( Validator.isValid( materialCreator ) ) { + + materialCreator.preload(); + materialCreatorMaterials = materialCreator.materials; + for ( var materialName in materialCreatorMaterials ) { + + if ( materialCreatorMaterials.hasOwnProperty( materialName ) ) { + + materials[ materialName ] = materialCreatorMaterials[ materialName ]; + + } + } + } + + if ( Validator.isValid( resource ) ) scope.logger.logTimeEnd( 'Loading MTL: ' + resource.name ); + callbackOnLoad( materials, materialCreator ); + }; + + var mtlLoader = new THREE.MTLLoader( this.manager ); + crossOrigin = Validator.verifyInput( crossOrigin, 'anonymous' ); + mtlLoader.setCrossOrigin( crossOrigin ); + if ( Validator.isValid( materialOptions ) ) mtlLoader.setMaterialOptions( materialOptions ); + + // fast-fail + if ( ! Validator.isValid( resource ) || ( ! Validator.isValid( resource.content ) && ! Validator.isValid( resource.url ) ) ) { + + processMaterials(); + + } else { + + mtlLoader.setPath( resource.path ); + if ( Validator.isValid( resource.content ) ) { + + processMaterials( Validator.isValid( resource.content ) ? mtlLoader.parse( resource.content ) : null ); + + } else if ( Validator.isValid( resource.url ) ) { + + var onError = function ( event ) { + var output = 'Error occurred while downloading "' + resource.url + '"'; + scope.logger.logError( output, event instanceof ProgressEvent ? [ 'Status: ' + event.currentTarget.statusText ] : null ); + throw output; + }; + + mtlLoader.load( resource.name, processMaterials, undefined, onError ); + + } + } + }; + + return OBJLoader2; +})(); diff --git a/recursive_swarm/lib/ObjectLoader.js b/recursive_swarm/lib/ObjectLoader.js new file mode 100644 index 0000000000000000000000000000000000000000..bf7dbe138a1522d2419454a87747065ce00da86a --- /dev/null +++ b/recursive_swarm/lib/ObjectLoader.js @@ -0,0 +1,886 @@ +import { + UVMapping, + CubeReflectionMapping, + CubeRefractionMapping, + EquirectangularReflectionMapping, + EquirectangularRefractionMapping, + SphericalReflectionMapping, + CubeUVReflectionMapping, + CubeUVRefractionMapping, + + RepeatWrapping, + ClampToEdgeWrapping, + MirroredRepeatWrapping, + + NearestFilter, + NearestMipMapNearestFilter, + NearestMipMapLinearFilter, + LinearFilter, + LinearMipMapNearestFilter, + LinearMipMapLinearFilter +} from '../constants.js'; +import { Color } from '../math/Color.js'; +import { Object3D } from '../core/Object3D.js'; +import { Group } from '../objects/Group.js'; +import { Sprite } from '../objects/Sprite.js'; +import { Points } from '../objects/Points.js'; +import { Line } from '../objects/Line.js'; +import { LineLoop } from '../objects/LineLoop.js'; +import { LineSegments } from '../objects/LineSegments.js'; +import { LOD } from '../objects/LOD.js'; +import { Mesh } from '../objects/Mesh.js'; +import { SkinnedMesh } from '../objects/SkinnedMesh.js'; +import { Shape } from '../extras/core/Shape.js'; +import { Fog } from '../scenes/Fog.js'; +import { FogExp2 } from '../scenes/FogExp2.js'; +import { HemisphereLight } from '../lights/HemisphereLight.js'; +import { SpotLight } from '../lights/SpotLight.js'; +import { PointLight } from '../lights/PointLight.js'; +import { DirectionalLight } from '../lights/DirectionalLight.js'; +import { AmbientLight } from '../lights/AmbientLight.js'; +import { RectAreaLight } from '../lights/RectAreaLight.js'; +import { OrthographicCamera } from '../cameras/OrthographicCamera.js'; +import { PerspectiveCamera } from '../cameras/PerspectiveCamera.js'; +import { Scene } from '../scenes/Scene.js'; +import { Texture } from '../textures/Texture.js'; +import { ImageLoader } from './ImageLoader.js'; +import { LoadingManager, DefaultLoadingManager } from './LoadingManager.js'; +import { AnimationClip } from '../animation/AnimationClip.js'; +import { MaterialLoader } from './MaterialLoader.js'; +import { BufferGeometryLoader } from './BufferGeometryLoader.js'; +import { JSONLoader } from './JSONLoader.js'; +import { FileLoader } from './FileLoader.js'; +import * as Geometries from '../geometries/Geometries.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function ObjectLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + this.texturePath = ''; + +} + +Object.assign( ObjectLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + if ( this.texturePath === '' ) { + + this.texturePath = url.substring( 0, url.lastIndexOf( '/' ) + 1 ); + + } + + var scope = this; + + var loader = new FileLoader( scope.manager ); + loader.load( url, function ( text ) { + + var json = null; + + try { + + json = JSON.parse( text ); + + } catch ( error ) { + + if ( onError !== undefined ) onError( error ); + + console.error( 'THREE:ObjectLoader: Can\'t parse ' + url + '.', error.message ); + + return; + + } + + var metadata = json.metadata; + + if ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) { + + console.error( 'THREE.ObjectLoader: Can\'t load ' + url + '. Use THREE.JSONLoader instead.' ); + return; + + } + + scope.parse( json, onLoad ); + + }, onProgress, onError ); + + }, + + setTexturePath: function ( value ) { + + this.texturePath = value; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + + }, + + parse: function ( json, onLoad ) { + + var shapes = this.parseShape( json.shapes ); + var geometries = this.parseGeometries( json.geometries, shapes ); + + var images = this.parseImages( json.images, function () { + + if ( onLoad !== undefined ) onLoad( object ); + + } ); + + var textures = this.parseTextures( json.textures, images ); + var materials = this.parseMaterials( json.materials, textures ); + + var object = this.parseObject( json.object, geometries, materials ); + + if ( json.animations ) { + + object.animations = this.parseAnimations( json.animations ); + + } + + if ( json.images === undefined || json.images.length === 0 ) { + + if ( onLoad !== undefined ) onLoad( object ); + + } + + return object; + + }, + + parseShape: function ( json ) { + + var shapes = {}; + + if ( json !== undefined ) { + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var shape = new Shape().fromJSON( json[ i ] ); + + shapes[ shape.uuid ] = shape; + + } + + } + + return shapes; + + }, + + parseGeometries: function ( json, shapes ) { + + var geometries = {}; + + if ( json !== undefined ) { + + var geometryLoader = new JSONLoader(); + var bufferGeometryLoader = new BufferGeometryLoader(); + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var geometry; + var data = json[ i ]; + + switch ( data.type ) { + + case 'PlaneGeometry': + case 'PlaneBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.width, + data.height, + data.widthSegments, + data.heightSegments + ); + + break; + + case 'BoxGeometry': + case 'BoxBufferGeometry': + case 'CubeGeometry': // backwards compatible + + geometry = new Geometries[ data.type ]( + data.width, + data.height, + data.depth, + data.widthSegments, + data.heightSegments, + data.depthSegments + ); + + break; + + case 'CircleGeometry': + case 'CircleBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.segments, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'CylinderGeometry': + case 'CylinderBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radiusTop, + data.radiusBottom, + data.height, + data.radialSegments, + data.heightSegments, + data.openEnded, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'ConeGeometry': + case 'ConeBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.height, + data.radialSegments, + data.heightSegments, + data.openEnded, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'SphereGeometry': + case 'SphereBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.widthSegments, + data.heightSegments, + data.phiStart, + data.phiLength, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'DodecahedronGeometry': + case 'DodecahedronBufferGeometry': + case 'IcosahedronGeometry': + case 'IcosahedronBufferGeometry': + case 'OctahedronGeometry': + case 'OctahedronBufferGeometry': + case 'TetrahedronGeometry': + case 'TetrahedronBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.detail + ); + + break; + + case 'RingGeometry': + case 'RingBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.innerRadius, + data.outerRadius, + data.thetaSegments, + data.phiSegments, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'TorusGeometry': + case 'TorusBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.tube, + data.radialSegments, + data.tubularSegments, + data.arc + ); + + break; + + case 'TorusKnotGeometry': + case 'TorusKnotBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.tube, + data.tubularSegments, + data.radialSegments, + data.p, + data.q + ); + + break; + + case 'LatheGeometry': + case 'LatheBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.points, + data.segments, + data.phiStart, + data.phiLength + ); + + break; + + case 'PolyhedronGeometry': + case 'PolyhedronBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.vertices, + data.indices, + data.radius, + data.details + ); + + break; + + case 'ShapeGeometry': + case 'ShapeBufferGeometry': + + var geometryShapes = []; + + for ( var i = 0, l = data.shapes.length; i < l; i ++ ) { + + var shape = shapes[ data.shapes[ i ] ]; + + geometryShapes.push( shape ); + + } + + geometry = new Geometries[ data.type ]( + geometryShapes, + data.curveSegments + ); + + break; + + case 'BufferGeometry': + + geometry = bufferGeometryLoader.parse( data ); + + break; + + case 'Geometry': + + geometry = geometryLoader.parse( data, this.texturePath ).geometry; + + break; + + default: + + console.warn( 'THREE.ObjectLoader: Unsupported geometry type "' + data.type + '"' ); + + continue; + + } + + geometry.uuid = data.uuid; + + if ( data.name !== undefined ) geometry.name = data.name; + + geometries[ data.uuid ] = geometry; + + } + + } + + return geometries; + + }, + + parseMaterials: function ( json, textures ) { + + var materials = {}; + + if ( json !== undefined ) { + + var loader = new MaterialLoader(); + loader.setTextures( textures ); + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var data = json[ i ]; + + if ( data.type === 'MultiMaterial' ) { + + // Deprecated + + var array = []; + + for ( var j = 0; j < data.materials.length; j ++ ) { + + array.push( loader.parse( data.materials[ j ] ) ); + + } + + materials[ data.uuid ] = array; + + } else { + + materials[ data.uuid ] = loader.parse( data ); + + } + + } + + } + + return materials; + + }, + + parseAnimations: function ( json ) { + + var animations = []; + + for ( var i = 0; i < json.length; i ++ ) { + + var clip = AnimationClip.parse( json[ i ] ); + + animations.push( clip ); + + } + + return animations; + + }, + + parseImages: function ( json, onLoad ) { + + var scope = this; + var images = {}; + + function loadImage( url ) { + + scope.manager.itemStart( url ); + + return loader.load( url, function () { + + scope.manager.itemEnd( url ); + + }, undefined, function () { + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + } ); + + } + + if ( json !== undefined && json.length > 0 ) { + + var manager = new LoadingManager( onLoad ); + + var loader = new ImageLoader( manager ); + loader.setCrossOrigin( this.crossOrigin ); + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var image = json[ i ]; + var path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test( image.url ) ? image.url : scope.texturePath + image.url; + + images[ image.uuid ] = loadImage( path ); + + } + + } + + return images; + + }, + + parseTextures: function ( json, images ) { + + function parseConstant( value, type ) { + + if ( typeof value === 'number' ) return value; + + console.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value ); + + return type[ value ]; + + } + + var textures = {}; + + if ( json !== undefined ) { + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var data = json[ i ]; + + if ( data.image === undefined ) { + + console.warn( 'THREE.ObjectLoader: No "image" specified for', data.uuid ); + + } + + if ( images[ data.image ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined image', data.image ); + + } + + var texture = new Texture( images[ data.image ] ); + texture.needsUpdate = true; + + texture.uuid = data.uuid; + + if ( data.name !== undefined ) texture.name = data.name; + + if ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TEXTURE_MAPPING ); + + if ( data.offset !== undefined ) texture.offset.fromArray( data.offset ); + if ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat ); + if ( data.center !== undefined ) texture.center.fromArray( data.center ); + if ( data.rotation !== undefined ) texture.rotation = data.rotation; + + if ( data.wrap !== undefined ) { + + texture.wrapS = parseConstant( data.wrap[ 0 ], TEXTURE_WRAPPING ); + texture.wrapT = parseConstant( data.wrap[ 1 ], TEXTURE_WRAPPING ); + + } + + if ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TEXTURE_FILTER ); + if ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TEXTURE_FILTER ); + if ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy; + + if ( data.flipY !== undefined ) texture.flipY = data.flipY; + + textures[ data.uuid ] = texture; + + } + + } + + return textures; + + }, + + parseObject: function ( data, geometries, materials ) { + + var object; + + function getGeometry( name ) { + + if ( geometries[ name ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined geometry', name ); + + } + + return geometries[ name ]; + + } + + function getMaterial( name ) { + + if ( name === undefined ) return undefined; + + if ( Array.isArray( name ) ) { + + var array = []; + + for ( var i = 0, l = name.length; i < l; i ++ ) { + + var uuid = name[ i ]; + + if ( materials[ uuid ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined material', uuid ); + + } + + array.push( materials[ uuid ] ); + + } + + return array; + + } + + if ( materials[ name ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined material', name ); + + } + + return materials[ name ]; + + } + + switch ( data.type ) { + + case 'Scene': + + object = new Scene(); + + if ( data.background !== undefined ) { + + if ( Number.isInteger( data.background ) ) { + + object.background = new Color( data.background ); + + } + + } + + if ( data.fog !== undefined ) { + + if ( data.fog.type === 'Fog' ) { + + object.fog = new Fog( data.fog.color, data.fog.near, data.fog.far ); + + } else if ( data.fog.type === 'FogExp2' ) { + + object.fog = new FogExp2( data.fog.color, data.fog.density ); + + } + + } + + break; + + case 'PerspectiveCamera': + + object = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far ); + + if ( data.focus !== undefined ) object.focus = data.focus; + if ( data.zoom !== undefined ) object.zoom = data.zoom; + if ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge; + if ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset; + if ( data.view !== undefined ) object.view = Object.assign( {}, data.view ); + + break; + + case 'OrthographicCamera': + + object = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far ); + + break; + + case 'AmbientLight': + + object = new AmbientLight( data.color, data.intensity ); + + break; + + case 'DirectionalLight': + + object = new DirectionalLight( data.color, data.intensity ); + + break; + + case 'PointLight': + + object = new PointLight( data.color, data.intensity, data.distance, data.decay ); + + break; + + case 'RectAreaLight': + + object = new RectAreaLight( data.color, data.intensity, data.width, data.height ); + + break; + + case 'SpotLight': + + object = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay ); + + break; + + case 'HemisphereLight': + + object = new HemisphereLight( data.color, data.groundColor, data.intensity ); + + break; + + case 'SkinnedMesh': + + console.warn( 'THREE.ObjectLoader.parseObject() does not support SkinnedMesh yet.' ); + + case 'Mesh': + + var geometry = getGeometry( data.geometry ); + var material = getMaterial( data.material ); + + if ( geometry.bones && geometry.bones.length > 0 ) { + + object = new SkinnedMesh( geometry, material ); + + } else { + + object = new Mesh( geometry, material ); + + } + + break; + + case 'LOD': + + object = new LOD(); + + break; + + case 'Line': + + object = new Line( getGeometry( data.geometry ), getMaterial( data.material ), data.mode ); + + break; + + case 'LineLoop': + + object = new LineLoop( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'LineSegments': + + object = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'PointCloud': + case 'Points': + + object = new Points( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'Sprite': + + object = new Sprite( getMaterial( data.material ) ); + + break; + + case 'Group': + + object = new Group(); + + break; + + default: + + object = new Object3D(); + + } + + object.uuid = data.uuid; + + if ( data.name !== undefined ) object.name = data.name; + if ( data.matrix !== undefined ) { + + object.matrix.fromArray( data.matrix ); + object.matrix.decompose( object.position, object.quaternion, object.scale ); + + } else { + + if ( data.position !== undefined ) object.position.fromArray( data.position ); + if ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation ); + if ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion ); + if ( data.scale !== undefined ) object.scale.fromArray( data.scale ); + + } + + if ( data.castShadow !== undefined ) object.castShadow = data.castShadow; + if ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow; + + if ( data.shadow ) { + + if ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias; + if ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius; + if ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize ); + if ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera ); + + } + + if ( data.visible !== undefined ) object.visible = data.visible; + if ( data.userData !== undefined ) object.userData = data.userData; + + if ( data.children !== undefined ) { + + var children = data.children; + + for ( var i = 0; i < children.length; i ++ ) { + + object.add( this.parseObject( children[ i ], geometries, materials ) ); + + } + + } + + if ( data.type === 'LOD' ) { + + var levels = data.levels; + + for ( var l = 0; l < levels.length; l ++ ) { + + var level = levels[ l ]; + var child = object.getObjectByProperty( 'uuid', level.object ); + + if ( child !== undefined ) { + + object.addLevel( child, level.distance ); + + } + + } + + } + + return object; + + } + +} ); + +var TEXTURE_MAPPING = { + UVMapping: UVMapping, + CubeReflectionMapping: CubeReflectionMapping, + CubeRefractionMapping: CubeRefractionMapping, + EquirectangularReflectionMapping: EquirectangularReflectionMapping, + EquirectangularRefractionMapping: EquirectangularRefractionMapping, + SphericalReflectionMapping: SphericalReflectionMapping, + CubeUVReflectionMapping: CubeUVReflectionMapping, + CubeUVRefractionMapping: CubeUVRefractionMapping +}; + +var TEXTURE_WRAPPING = { + RepeatWrapping: RepeatWrapping, + ClampToEdgeWrapping: ClampToEdgeWrapping, + MirroredRepeatWrapping: MirroredRepeatWrapping +}; + +var TEXTURE_FILTER = { + NearestFilter: NearestFilter, + NearestMipMapNearestFilter: NearestMipMapNearestFilter, + NearestMipMapLinearFilter: NearestMipMapLinearFilter, + LinearFilter: LinearFilter, + LinearMipMapNearestFilter: LinearMipMapNearestFilter, + LinearMipMapLinearFilter: LinearMipMapLinearFilter +}; + + +export { ObjectLoader }; diff --git a/recursive_swarm/lib/OrbitControls.js b/recursive_swarm/lib/OrbitControls.js new file mode 100644 index 0000000000000000000000000000000000000000..d3d2464e7d5ba02357829f0c688af7c5d5e85743 --- /dev/null +++ b/recursive_swarm/lib/OrbitControls.js @@ -0,0 +1,1016 @@ +/** + * @author qiao / https://github.com/qiao + * @author mrdoob / http://mrdoob.com + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author erich666 / http://erichaines.com + */ + +// This set of controls performs orbiting, dollying (zooming), and panning. +// Unlike TrackballControls, it maintains the "up" direction object.up (+Y by default). +// +// Orbit - left mouse / touch: one finger move +// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish +// Pan - right mouse, or arrow keys / touch: three finger swipe + +THREE.OrbitControls = function ( object, domElement ) { + + this.object = object; + + this.domElement = ( domElement !== undefined ) ? domElement : document; + + // Set to false to disable this control + this.enabled = true; + + // "target" sets the location of focus, where the object orbits around + this.target = new THREE.Vector3(); + + // How far you can dolly in and out ( PerspectiveCamera only ) + this.minDistance = 0; + this.maxDistance = Infinity; + + // How far you can zoom in and out ( OrthographicCamera only ) + this.minZoom = 0; + this.maxZoom = Infinity; + + // How far you can orbit vertically, upper and lower limits. + // Range is 0 to Math.PI radians. + this.minPolarAngle = 0; // radians + this.maxPolarAngle = Math.PI; // radians + + // How far you can orbit horizontally, upper and lower limits. + // If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ]. + this.minAzimuthAngle = - Infinity; // radians + this.maxAzimuthAngle = Infinity; // radians + + // Set to true to enable damping (inertia) + // If damping is enabled, you must call controls.update() in your animation loop + this.enableDamping = false; + this.dampingFactor = 0.25; + + // This option actually enables dollying in and out; left as "zoom" for backwards compatibility. + // Set to false to disable zooming + this.enableZoom = true; + this.zoomSpeed = 1.0; + + // Set to false to disable rotating + this.enableRotate = true; + this.rotateSpeed = 1.0; + + // Set to false to disable panning + this.enablePan = true; + this.keyPanSpeed = 7.0; // pixels moved per arrow key push + + // Set to true to automatically rotate around the target + // If auto-rotate is enabled, you must call controls.update() in your animation loop + this.autoRotate = false; + this.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60 + + // Set to false to disable use of the keys + this.enableKeys = true; + + // The four arrow keys + this.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 }; + + // Mouse buttons + this.mouseButtons = { ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT }; + + // for reset + this.target0 = this.target.clone(); + this.position0 = this.object.position.clone(); + this.zoom0 = this.object.zoom; + + // + // public methods + // + + this.getPolarAngle = function () { + + return spherical.phi; + + }; + + this.getAzimuthalAngle = function () { + + return spherical.theta; + + }; + + this.reset = function () { + + scope.target.copy( scope.target0 ); + scope.object.position.copy( scope.position0 ); + scope.object.zoom = scope.zoom0; + + scope.object.updateProjectionMatrix(); + scope.dispatchEvent( changeEvent ); + + scope.update(); + + state = STATE.NONE; + + }; + + // this method is exposed, but perhaps it would be better if we can make it private... + this.update = function () { + + var offset = new THREE.Vector3(); + + // so camera.up is the orbit axis + var quat = new THREE.Quaternion().setFromUnitVectors( object.up, new THREE.Vector3( 0, 1, 0 ) ); + var quatInverse = quat.clone().inverse(); + + var lastPosition = new THREE.Vector3(); + var lastQuaternion = new THREE.Quaternion(); + + return function update() { + + var position = scope.object.position; + + offset.copy( position ).sub( scope.target ); + + // rotate offset to "y-axis-is-up" space + offset.applyQuaternion( quat ); + + // angle from z-axis around y-axis + spherical.setFromVector3( offset ); + + if ( scope.autoRotate && state === STATE.NONE ) { + + rotateLeft( getAutoRotationAngle() ); + + } + + spherical.theta += sphericalDelta.theta; + spherical.phi += sphericalDelta.phi; + + // restrict theta to be between desired limits + spherical.theta = Math.max( scope.minAzimuthAngle, Math.min( scope.maxAzimuthAngle, spherical.theta ) ); + + // restrict phi to be between desired limits + spherical.phi = Math.max( scope.minPolarAngle, Math.min( scope.maxPolarAngle, spherical.phi ) ); + + spherical.makeSafe(); + + + spherical.radius *= scale; + + // restrict radius to be between desired limits + spherical.radius = Math.max( scope.minDistance, Math.min( scope.maxDistance, spherical.radius ) ); + + // move target to panned location + scope.target.add( panOffset ); + + offset.setFromSpherical( spherical ); + + // rotate offset back to "camera-up-vector-is-up" space + offset.applyQuaternion( quatInverse ); + + position.copy( scope.target ).add( offset ); + + scope.object.lookAt( scope.target ); + + if ( scope.enableDamping === true ) { + + sphericalDelta.theta *= ( 1 - scope.dampingFactor ); + sphericalDelta.phi *= ( 1 - scope.dampingFactor ); + + } else { + + sphericalDelta.set( 0, 0, 0 ); + + } + + scale = 1; + panOffset.set( 0, 0, 0 ); + + // update condition is: + // min(camera displacement, camera rotation in radians)^2 > EPS + // using small-angle approximation cos(x/2) = 1 - x^2 / 8 + + if ( zoomChanged || + lastPosition.distanceToSquared( scope.object.position ) > EPS || + 8 * ( 1 - lastQuaternion.dot( scope.object.quaternion ) ) > EPS ) { + + scope.dispatchEvent( changeEvent ); + + lastPosition.copy( scope.object.position ); + lastQuaternion.copy( scope.object.quaternion ); + zoomChanged = false; + + return true; + + } + + return false; + + }; + + }(); + + this.dispose = function () { + + scope.domElement.removeEventListener( 'contextmenu', onContextMenu, false ); + scope.domElement.removeEventListener( 'mousedown', onMouseDown, false ); + scope.domElement.removeEventListener( 'wheel', onMouseWheel, false ); + + scope.domElement.removeEventListener( 'touchstart', onTouchStart, false ); + scope.domElement.removeEventListener( 'touchend', onTouchEnd, false ); + scope.domElement.removeEventListener( 'touchmove', onTouchMove, false ); + + document.removeEventListener( 'mousemove', onMouseMove, false ); + document.removeEventListener( 'mouseup', onMouseUp, false ); + + window.removeEventListener( 'keydown', onKeyDown, false ); + + //scope.dispatchEvent( { type: 'dispose' } ); // should this be added here? + + }; + + // + // internals + // + + var scope = this; + + var changeEvent = { type: 'change' }; + var startEvent = { type: 'start' }; + var endEvent = { type: 'end' }; + + var STATE = { NONE: - 1, ROTATE: 0, DOLLY: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_DOLLY: 4, TOUCH_PAN: 5 }; + + var state = STATE.NONE; + + var EPS = 0.000001; + + // current position in spherical coordinates + var spherical = new THREE.Spherical(); + var sphericalDelta = new THREE.Spherical(); + + var scale = 1; + var panOffset = new THREE.Vector3(); + var zoomChanged = false; + + var rotateStart = new THREE.Vector2(); + var rotateEnd = new THREE.Vector2(); + var rotateDelta = new THREE.Vector2(); + + var panStart = new THREE.Vector2(); + var panEnd = new THREE.Vector2(); + var panDelta = new THREE.Vector2(); + + var dollyStart = new THREE.Vector2(); + var dollyEnd = new THREE.Vector2(); + var dollyDelta = new THREE.Vector2(); + + function getAutoRotationAngle() { + + return 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed; + + } + + function getZoomScale() { + + return Math.pow( 0.95, scope.zoomSpeed ); + + } + + function rotateLeft( angle ) { + + sphericalDelta.theta -= angle; + + } + + function rotateUp( angle ) { + + sphericalDelta.phi -= angle; + + } + + var panLeft = function () { + + var v = new THREE.Vector3(); + + return function panLeft( distance, objectMatrix ) { + + v.setFromMatrixColumn( objectMatrix, 0 ); // get X column of objectMatrix + v.multiplyScalar( - distance ); + + panOffset.add( v ); + + }; + + }(); + + var panUp = function () { + + var v = new THREE.Vector3(); + + return function panUp( distance, objectMatrix ) { + + v.setFromMatrixColumn( objectMatrix, 1 ); // get Y column of objectMatrix + v.multiplyScalar( distance ); + + panOffset.add( v ); + + }; + + }(); + + // deltaX and deltaY are in pixels; right and down are positive + var pan = function () { + + var offset = new THREE.Vector3(); + + return function pan( deltaX, deltaY ) { + + var element = scope.domElement === document ? scope.domElement.body : scope.domElement; + + if ( scope.object instanceof THREE.PerspectiveCamera ) { + + // perspective + var position = scope.object.position; + offset.copy( position ).sub( scope.target ); + var targetDistance = offset.length(); + + // half of the fov is center to top of screen + targetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 ); + + // we actually don't use screenWidth, since perspective camera is fixed to screen height + panLeft( 2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix ); + panUp( 2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix ); + + } else if ( scope.object instanceof THREE.OrthographicCamera ) { + + // orthographic + panLeft( deltaX * ( scope.object.right - scope.object.left ) / scope.object.zoom / element.clientWidth, scope.object.matrix ); + panUp( deltaY * ( scope.object.top - scope.object.bottom ) / scope.object.zoom / element.clientHeight, scope.object.matrix ); + + } else { + + // camera neither orthographic nor perspective + console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' ); + scope.enablePan = false; + + } + + }; + + }(); + + function dollyIn( dollyScale ) { + + if ( scope.object instanceof THREE.PerspectiveCamera ) { + + scale /= dollyScale; + + } else if ( scope.object instanceof THREE.OrthographicCamera ) { + + scope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom * dollyScale ) ); + scope.object.updateProjectionMatrix(); + zoomChanged = true; + + } else { + + console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' ); + scope.enableZoom = false; + + } + + } + + function dollyOut( dollyScale ) { + + if ( scope.object instanceof THREE.PerspectiveCamera ) { + + scale *= dollyScale; + + } else if ( scope.object instanceof THREE.OrthographicCamera ) { + + scope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom / dollyScale ) ); + scope.object.updateProjectionMatrix(); + zoomChanged = true; + + } else { + + console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' ); + scope.enableZoom = false; + + } + + } + + // + // event callbacks - update the object state + // + + function handleMouseDownRotate( event ) { + + //console.log( 'handleMouseDownRotate' ); + + rotateStart.set( event.clientX, event.clientY ); + + } + + function handleMouseDownDolly( event ) { + + //console.log( 'handleMouseDownDolly' ); + + dollyStart.set( event.clientX, event.clientY ); + + } + + function handleMouseDownPan( event ) { + + //console.log( 'handleMouseDownPan' ); + + panStart.set( event.clientX, event.clientY ); + + } + + function handleMouseMoveRotate( event ) { + + //console.log( 'handleMouseMoveRotate' ); + + rotateEnd.set( event.clientX, event.clientY ); + rotateDelta.subVectors( rotateEnd, rotateStart ); + + var element = scope.domElement === document ? scope.domElement.body : scope.domElement; + + // rotating across whole screen goes 360 degrees around + rotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed ); + + // rotating up and down along whole screen attempts to go 360, but limited to 180 + rotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed ); + + rotateStart.copy( rotateEnd ); + + scope.update(); + + } + + function handleMouseMoveDolly( event ) { + + //console.log( 'handleMouseMoveDolly' ); + + dollyEnd.set( event.clientX, event.clientY ); + + dollyDelta.subVectors( dollyEnd, dollyStart ); + + if ( dollyDelta.y > 0 ) { + + dollyIn( getZoomScale() ); + + } else if ( dollyDelta.y < 0 ) { + + dollyOut( getZoomScale() ); + + } + + dollyStart.copy( dollyEnd ); + + scope.update(); + + } + + function handleMouseMovePan( event ) { + + //console.log( 'handleMouseMovePan' ); + + panEnd.set( event.clientX, event.clientY ); + + panDelta.subVectors( panEnd, panStart ); + + pan( panDelta.x, panDelta.y ); + + panStart.copy( panEnd ); + + scope.update(); + + } + + function handleMouseUp( event ) { + + // console.log( 'handleMouseUp' ); + + } + + function handleMouseWheel( event ) { + + // console.log( 'handleMouseWheel' ); + + if ( event.deltaY < 0 ) { + + dollyOut( getZoomScale() ); + + } else if ( event.deltaY > 0 ) { + + dollyIn( getZoomScale() ); + + } + + scope.update(); + + } + + function handleKeyDown( event ) { + + //console.log( 'handleKeyDown' ); + + switch ( event.keyCode ) { + + case scope.keys.UP: + pan( 0, scope.keyPanSpeed ); + scope.update(); + break; + + case scope.keys.BOTTOM: + pan( 0, - scope.keyPanSpeed ); + scope.update(); + break; + + case scope.keys.LEFT: + pan( scope.keyPanSpeed, 0 ); + scope.update(); + break; + + case scope.keys.RIGHT: + pan( - scope.keyPanSpeed, 0 ); + scope.update(); + break; + + } + + } + + function handleTouchStartRotate( event ) { + + //console.log( 'handleTouchStartRotate' ); + + rotateStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); + + } + + function handleTouchStartDolly( event ) { + + //console.log( 'handleTouchStartDolly' ); + + var dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX; + var dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY; + + var distance = Math.sqrt( dx * dx + dy * dy ); + + dollyStart.set( 0, distance ); + + } + + function handleTouchStartPan( event ) { + + //console.log( 'handleTouchStartPan' ); + + panStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); + + } + + function handleTouchMoveRotate( event ) { + + //console.log( 'handleTouchMoveRotate' ); + + rotateEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); + rotateDelta.subVectors( rotateEnd, rotateStart ); + + var element = scope.domElement === document ? scope.domElement.body : scope.domElement; + + // rotating across whole screen goes 360 degrees around + rotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed ); + + // rotating up and down along whole screen attempts to go 360, but limited to 180 + rotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed ); + + rotateStart.copy( rotateEnd ); + + scope.update(); + + } + + function handleTouchMoveDolly( event ) { + + //console.log( 'handleTouchMoveDolly' ); + + var dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX; + var dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY; + + var distance = Math.sqrt( dx * dx + dy * dy ); + + dollyEnd.set( 0, distance ); + + dollyDelta.subVectors( dollyEnd, dollyStart ); + + if ( dollyDelta.y > 0 ) { + + dollyOut( getZoomScale() ); + + } else if ( dollyDelta.y < 0 ) { + + dollyIn( getZoomScale() ); + + } + + dollyStart.copy( dollyEnd ); + + scope.update(); + + } + + function handleTouchMovePan( event ) { + + //console.log( 'handleTouchMovePan' ); + + panEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); + + panDelta.subVectors( panEnd, panStart ); + + pan( panDelta.x, panDelta.y ); + + panStart.copy( panEnd ); + + scope.update(); + + } + + function handleTouchEnd( event ) { + + //console.log( 'handleTouchEnd' ); + + } + + // + // event handlers - FSM: listen for events and reset state + // + + function onMouseDown( event ) { + + if ( scope.enabled === false ) return; + + event.preventDefault(); + + if ( event.button === scope.mouseButtons.ORBIT ) { + + if ( scope.enableRotate === false ) return; + + handleMouseDownRotate( event ); + + state = STATE.ROTATE; + + } else if ( event.button === scope.mouseButtons.ZOOM ) { + + if ( scope.enableZoom === false ) return; + + handleMouseDownDolly( event ); + + state = STATE.DOLLY; + + } else if ( event.button === scope.mouseButtons.PAN ) { + + if ( scope.enablePan === false ) return; + + handleMouseDownPan( event ); + + state = STATE.PAN; + + } + + if ( state !== STATE.NONE ) { + + document.addEventListener( 'mousemove', onMouseMove, false ); + document.addEventListener( 'mouseup', onMouseUp, false ); + + scope.dispatchEvent( startEvent ); + + } + + } + + function onMouseMove( event ) { + + if ( scope.enabled === false ) return; + + event.preventDefault(); + + if ( state === STATE.ROTATE ) { + + if ( scope.enableRotate === false ) return; + + handleMouseMoveRotate( event ); + + } else if ( state === STATE.DOLLY ) { + + if ( scope.enableZoom === false ) return; + + handleMouseMoveDolly( event ); + + } else if ( state === STATE.PAN ) { + + if ( scope.enablePan === false ) return; + + handleMouseMovePan( event ); + + } + + } + + function onMouseUp( event ) { + + if ( scope.enabled === false ) return; + + handleMouseUp( event ); + + document.removeEventListener( 'mousemove', onMouseMove, false ); + document.removeEventListener( 'mouseup', onMouseUp, false ); + + scope.dispatchEvent( endEvent ); + + state = STATE.NONE; + + } + + function onMouseWheel( event ) { + + if ( scope.enabled === false || scope.enableZoom === false || ( state !== STATE.NONE && state !== STATE.ROTATE ) ) return; + + event.preventDefault(); + event.stopPropagation(); + + handleMouseWheel( event ); + + scope.dispatchEvent( startEvent ); // not sure why these are here... + scope.dispatchEvent( endEvent ); + + } + + function onKeyDown( event ) { + + if ( scope.enabled === false || scope.enableKeys === false || scope.enablePan === false ) return; + + handleKeyDown( event ); + + } + + function onTouchStart( event ) { + + if ( scope.enabled === false ) return; + + switch ( event.touches.length ) { + + case 1: // one-fingered touch: rotate + + if ( scope.enableRotate === false ) return; + + handleTouchStartRotate( event ); + + state = STATE.TOUCH_ROTATE; + + break; + + case 2: // two-fingered touch: dolly + + if ( scope.enableZoom === false ) return; + + handleTouchStartDolly( event ); + + state = STATE.TOUCH_DOLLY; + + break; + + case 3: // three-fingered touch: pan + + if ( scope.enablePan === false ) return; + + handleTouchStartPan( event ); + + state = STATE.TOUCH_PAN; + + break; + + default: + + state = STATE.NONE; + + } + + if ( state !== STATE.NONE ) { + + scope.dispatchEvent( startEvent ); + + } + + } + + function onTouchMove( event ) { + + if ( scope.enabled === false ) return; + + event.preventDefault(); + event.stopPropagation(); + + switch ( event.touches.length ) { + + case 1: // one-fingered touch: rotate + + if ( scope.enableRotate === false ) return; + if ( state !== STATE.TOUCH_ROTATE ) return; // is this needed?... + + handleTouchMoveRotate( event ); + + break; + + case 2: // two-fingered touch: dolly + + if ( scope.enableZoom === false ) return; + if ( state !== STATE.TOUCH_DOLLY ) return; // is this needed?... + + handleTouchMoveDolly( event ); + + break; + + case 3: // three-fingered touch: pan + + if ( scope.enablePan === false ) return; + if ( state !== STATE.TOUCH_PAN ) return; // is this needed?... + + handleTouchMovePan( event ); + + break; + + default: + + state = STATE.NONE; + + } + + } + + function onTouchEnd( event ) { + + if ( scope.enabled === false ) return; + + handleTouchEnd( event ); + + scope.dispatchEvent( endEvent ); + + state = STATE.NONE; + + } + + function onContextMenu( event ) { + + event.preventDefault(); + + } + + // + + scope.domElement.addEventListener( 'contextmenu', onContextMenu, false ); + + scope.domElement.addEventListener( 'mousedown', onMouseDown, false ); + scope.domElement.addEventListener( 'wheel', onMouseWheel, false ); + + scope.domElement.addEventListener( 'touchstart', onTouchStart, false ); + scope.domElement.addEventListener( 'touchend', onTouchEnd, false ); + scope.domElement.addEventListener( 'touchmove', onTouchMove, false ); + + window.addEventListener( 'keydown', onKeyDown, false ); + + // force an update at start + + this.update(); + +}; + +THREE.OrbitControls.prototype = Object.create( THREE.EventDispatcher.prototype ); +THREE.OrbitControls.prototype.constructor = THREE.OrbitControls; + +Object.defineProperties( THREE.OrbitControls.prototype, { + + center: { + + get: function () { + + console.warn( 'THREE.OrbitControls: .center has been renamed to .target' ); + return this.target; + + } + + }, + + // backward compatibility + + noZoom: { + + get: function () { + + console.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' ); + return ! this.enableZoom; + + }, + + set: function ( value ) { + + console.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' ); + this.enableZoom = ! value; + + } + + }, + + noRotate: { + + get: function () { + + console.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' ); + return ! this.enableRotate; + + }, + + set: function ( value ) { + + console.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' ); + this.enableRotate = ! value; + + } + + }, + + noPan: { + + get: function () { + + console.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' ); + return ! this.enablePan; + + }, + + set: function ( value ) { + + console.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' ); + this.enablePan = ! value; + + } + + }, + + noKeys: { + + get: function () { + + console.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' ); + return ! this.enableKeys; + + }, + + set: function ( value ) { + + console.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' ); + this.enableKeys = ! value; + + } + + }, + + staticMoving: { + + get: function () { + + console.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' ); + return ! this.enableDamping; + + }, + + set: function ( value ) { + + console.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' ); + this.enableDamping = ! value; + + } + + }, + + dynamicDampingFactor: { + + get: function () { + + console.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' ); + return this.dampingFactor; + + }, + + set: function ( value ) { + + console.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' ); + this.dampingFactor = value; + + } + + } + +} ); \ No newline at end of file diff --git a/recursive_swarm/lib/RGBShiftShader.js b/recursive_swarm/lib/RGBShiftShader.js new file mode 100644 index 0000000000000000000000000000000000000000..fe5a343ef238bf824b8a029e5dcbca4bf5fcd265 --- /dev/null +++ b/recursive_swarm/lib/RGBShiftShader.js @@ -0,0 +1,56 @@ +/** + * @author felixturner / http://airtight.cc/ + * + * RGB Shift Shader + * Shifts red and blue channels from center in opposite directions + * Ported from http://kriss.cx/tom/2009/05/rgb-shift/ + * by Tom Butterworth / http://kriss.cx/tom/ + * + * amount: shift distance (1 is width of input) + * angle: shift angle in radians + */ + +THREE.RGBShiftShader = { + + uniforms: { + + "tDiffuse": { value: null }, + "amount": { value: 0.005 }, + "angle": { value: 0.0 } + + }, + + vertexShader: [ + + "varying vec2 vUv;", + + "void main() {", + + "vUv = uv;", + "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", + + "}" + + ].join( "\n" ), + + fragmentShader: [ + + "uniform sampler2D tDiffuse;", + "uniform float amount;", + "uniform float angle;", + + "varying vec2 vUv;", + + "void main() {", + + "vec2 offset = amount * vec2( cos(angle), sin(angle));", + "vec4 cr = texture2D(tDiffuse, vUv + offset);", + "vec4 cga = texture2D(tDiffuse, vUv);", + "vec4 cb = texture2D(tDiffuse, vUv - offset);", + "gl_FragColor = vec4(cr.r, cga.g, cb.b, cga.a);", + + "}" + + ].join( "\n" ) + +}; \ No newline at end of file diff --git a/recursive_swarm/lib/RenderPass.js b/recursive_swarm/lib/RenderPass.js new file mode 100644 index 0000000000000000000000000000000000000000..94186562860d2f490ba8ad327ad93bac1e387be7 --- /dev/null +++ b/recursive_swarm/lib/RenderPass.js @@ -0,0 +1,63 @@ +/** + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.RenderPass = function ( scene, camera, overrideMaterial, clearColor, clearAlpha ) { + + THREE.Pass.call( this ); + + this.scene = scene; + this.camera = camera; + + this.overrideMaterial = overrideMaterial; + + this.clearColor = clearColor; + this.clearAlpha = ( clearAlpha !== undefined ) ? clearAlpha : 0; + + this.clear = true; + this.clearDepth = false; + this.needsSwap = false; + +}; + +THREE.RenderPass.prototype = Object.assign( Object.create( THREE.Pass.prototype ), { + + constructor: THREE.RenderPass, + + render: function ( renderer, writeBuffer, readBuffer, delta, maskActive ) { + + var oldAutoClear = renderer.autoClear; + renderer.autoClear = false; + + this.scene.overrideMaterial = this.overrideMaterial; + + var oldClearColor, oldClearAlpha; + + if ( this.clearColor ) { + + oldClearColor = renderer.getClearColor().getHex(); + oldClearAlpha = renderer.getClearAlpha(); + + renderer.setClearColor( this.clearColor, this.clearAlpha ); + + } + + if ( this.clearDepth ) { + + renderer.clearDepth(); + + } + + renderer.render( this.scene, this.camera, this.renderToScreen ? null : readBuffer, this.clear ); + + if ( this.clearColor ) { + + renderer.setClearColor( oldClearColor, oldClearAlpha ); + + } + + this.scene.overrideMaterial = null; + renderer.autoClear = oldAutoClear; + } + +} ); \ No newline at end of file diff --git a/recursive_swarm/lib/STLLoader.js b/recursive_swarm/lib/STLLoader.js new file mode 100644 index 0000000000000000000000000000000000000000..704a9ce6ca8a5f51aa46d6037eaef5e6612d4e61 --- /dev/null +++ b/recursive_swarm/lib/STLLoader.js @@ -0,0 +1,389 @@ +console.warn( "THREE.STLLoader: As part of the transition to ES6 Modules, the files in 'examples/js' were deprecated in May 2020 (r117) and will be deleted in December 2020 (r124). You can find more information about developing using ES6 Modules in https://threejs.org/docs/#manual/en/introduction/Installation." ); +/** + * Description: A THREE loader for STL ASCII files, as created by Solidworks and other CAD programs. + * + * Supports both binary and ASCII encoded files, with automatic detection of type. + * + * The loader returns a non-indexed buffer geometry. + * + * Limitations: + * Binary decoding supports "Magics" color format (http://en.wikipedia.org/wiki/STL_(file_format)#Color_in_binary_STL). + * There is perhaps some question as to how valid it is to always assume little-endian-ness. + * ASCII decoding assumes file is UTF-8. + * + * Usage: + * var loader = new THREE.STLLoader(); + * loader.load( './models/stl/slotted_disk.stl', function ( geometry ) { + * scene.add( new THREE.Mesh( geometry ) ); + * }); + * + * For binary STLs geometry might contain colors for vertices. To use it: + * // use the same code to load STL as above + * if (geometry.hasColors) { + * material = new THREE.MeshPhongMaterial({ opacity: geometry.alpha, vertexColors: true }); + * } else { .... } + * var mesh = new THREE.Mesh( geometry, material ); + * + * For ASCII STLs containing multiple solids, each solid is assigned to a different group. + * Groups can be used to assign a different color by defining an array of materials with the same length of + * geometry.groups and passing it to the Mesh constructor: + * + * var mesh = new THREE.Mesh( geometry, material ); + * + * For example: + * + * var materials = []; + * var nGeometryGroups = geometry.groups.length; + * + * var colorMap = ...; // Some logic to index colors. + * + * for (var i = 0; i < nGeometryGroups; i++) { + * + * var material = new THREE.MeshPhongMaterial({ + * color: colorMap[i], + * wireframe: false + * }); + * + * } + * + * materials.push(material); + * var mesh = new THREE.Mesh(geometry, materials); + */ + + +THREE.STLLoader = function ( manager ) { + + THREE.Loader.call( this, manager ); + +}; + +THREE.STLLoader.prototype = Object.assign( Object.create( THREE.Loader.prototype ), { + + constructor: THREE.STLLoader, + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new THREE.FileLoader( scope.manager ); + loader.setPath( scope.path ); + loader.setResponseType( 'arraybuffer' ); + loader.setRequestHeader( this.requestHeader ); + loader.load( url, function ( text ) { + + try { + + onLoad( scope.parse( text ) ); + + } catch ( e ) { + + if ( onError ) { + + onError( e ); + + } else { + + console.error( e ); + + } + + scope.manager.itemError( url ); + + } + + }, onProgress, onError ); + + }, + + parse: function ( data ) { + + function isBinary( data ) { + + var expect, face_size, n_faces, reader; + reader = new DataView( data ); + face_size = ( 32 / 8 * 3 ) + ( ( 32 / 8 * 3 ) * 3 ) + ( 16 / 8 ); + n_faces = reader.getUint32( 80, true ); + expect = 80 + ( 32 / 8 ) + ( n_faces * face_size ); + + if ( expect === reader.byteLength ) { + + return true; + + } + + // An ASCII STL data must begin with 'solid ' as the first six bytes. + // However, ASCII STLs lacking the SPACE after the 'd' are known to be + // plentiful. So, check the first 5 bytes for 'solid'. + + // Several encodings, such as UTF-8, precede the text with up to 5 bytes: + // https://en.wikipedia.org/wiki/Byte_order_mark#Byte_order_marks_by_encoding + // Search for "solid" to start anywhere after those prefixes. + + // US-ASCII ordinal values for 's', 'o', 'l', 'i', 'd' + + var solid = [ 115, 111, 108, 105, 100 ]; + + for ( var off = 0; off < 5; off ++ ) { + + // If "solid" text is matched to the current offset, declare it to be an ASCII STL. + + if ( matchDataViewAt( solid, reader, off ) ) return false; + + } + + // Couldn't find "solid" text at the beginning; it is binary STL. + + return true; + + } + + function matchDataViewAt( query, reader, offset ) { + + // Check if each byte in query matches the corresponding byte from the current offset + + for ( var i = 0, il = query.length; i < il; i ++ ) { + + if ( query[ i ] !== reader.getUint8( offset + i, false ) ) return false; + + } + + return true; + + } + + function parseBinary( data ) { + + var reader = new DataView( data ); + var faces = reader.getUint32( 80, true ); + + var r, g, b, hasColors = false, colors; + var defaultR, defaultG, defaultB, alpha; + + // process STL header + // check for default color in header ("COLOR=rgba" sequence). + + for ( var index = 0; index < 80 - 10; index ++ ) { + + if ( ( reader.getUint32( index, false ) == 0x434F4C4F /*COLO*/ ) && + ( reader.getUint8( index + 4 ) == 0x52 /*'R'*/ ) && + ( reader.getUint8( index + 5 ) == 0x3D /*'='*/ ) ) { + + hasColors = true; + colors = new Float32Array( faces * 3 * 3 ); + + defaultR = reader.getUint8( index + 6 ) / 255; + defaultG = reader.getUint8( index + 7 ) / 255; + defaultB = reader.getUint8( index + 8 ) / 255; + alpha = reader.getUint8( index + 9 ) / 255; + + } + + } + + var dataOffset = 84; + var faceLength = 12 * 4 + 2; + + var geometry = new THREE.BufferGeometry(); + + var vertices = new Float32Array( faces * 3 * 3 ); + var normals = new Float32Array( faces * 3 * 3 ); + + for ( var face = 0; face < faces; face ++ ) { + + var start = dataOffset + face * faceLength; + var normalX = reader.getFloat32( start, true ); + var normalY = reader.getFloat32( start + 4, true ); + var normalZ = reader.getFloat32( start + 8, true ); + + if ( hasColors ) { + + var packedColor = reader.getUint16( start + 48, true ); + + if ( ( packedColor & 0x8000 ) === 0 ) { + + // facet has its own unique color + + r = ( packedColor & 0x1F ) / 31; + g = ( ( packedColor >> 5 ) & 0x1F ) / 31; + b = ( ( packedColor >> 10 ) & 0x1F ) / 31; + + } else { + + r = defaultR; + g = defaultG; + b = defaultB; + + } + + } + + for ( var i = 1; i <= 3; i ++ ) { + + var vertexstart = start + i * 12; + var componentIdx = ( face * 3 * 3 ) + ( ( i - 1 ) * 3 ); + + vertices[ componentIdx ] = reader.getFloat32( vertexstart, true ); + vertices[ componentIdx + 1 ] = reader.getFloat32( vertexstart + 4, true ); + vertices[ componentIdx + 2 ] = reader.getFloat32( vertexstart + 8, true ); + + normals[ componentIdx ] = normalX; + normals[ componentIdx + 1 ] = normalY; + normals[ componentIdx + 2 ] = normalZ; + + if ( hasColors ) { + + colors[ componentIdx ] = r; + colors[ componentIdx + 1 ] = g; + colors[ componentIdx + 2 ] = b; + + } + + } + + } + + geometry.setAttribute( 'position', new THREE.BufferAttribute( vertices, 3 ) ); + geometry.setAttribute( 'normal', new THREE.BufferAttribute( normals, 3 ) ); + + if ( hasColors ) { + + geometry.setAttribute( 'color', new THREE.BufferAttribute( colors, 3 ) ); + geometry.hasColors = true; + geometry.alpha = alpha; + + } + + return geometry; + + } + + function parseASCII( data ) { + + var geometry = new THREE.BufferGeometry(); + var patternSolid = /solid([\s\S]*?)endsolid/g; + var patternFace = /facet([\s\S]*?)endfacet/g; + var faceCounter = 0; + + var patternFloat = /[\s]+([+-]?(?:\d*)(?:\.\d*)?(?:[eE][+-]?\d+)?)/.source; + var patternVertex = new RegExp( 'vertex' + patternFloat + patternFloat + patternFloat, 'g' ); + var patternNormal = new RegExp( 'normal' + patternFloat + patternFloat + patternFloat, 'g' ); + + var vertices = []; + var normals = []; + + var normal = new THREE.Vector3(); + + var result; + + var groupCount = 0; + var startVertex = 0; + var endVertex = 0; + + while ( ( result = patternSolid.exec( data ) ) !== null ) { + + startVertex = endVertex; + + var solid = result[ 0 ]; + + while ( ( result = patternFace.exec( solid ) ) !== null ) { + + var vertexCountPerFace = 0; + var normalCountPerFace = 0; + + var text = result[ 0 ]; + + while ( ( result = patternNormal.exec( text ) ) !== null ) { + + normal.x = parseFloat( result[ 1 ] ); + normal.y = parseFloat( result[ 2 ] ); + normal.z = parseFloat( result[ 3 ] ); + normalCountPerFace ++; + + } + + while ( ( result = patternVertex.exec( text ) ) !== null ) { + + vertices.push( parseFloat( result[ 1 ] ), parseFloat( result[ 2 ] ), parseFloat( result[ 3 ] ) ); + normals.push( normal.x, normal.y, normal.z ); + vertexCountPerFace ++; + endVertex ++; + + } + + // every face have to own ONE valid normal + + if ( normalCountPerFace !== 1 ) { + + console.error( 'THREE.STLLoader: Something isn\'t right with the normal of face number ' + faceCounter ); + + } + + // each face have to own THREE valid vertices + + if ( vertexCountPerFace !== 3 ) { + + console.error( 'THREE.STLLoader: Something isn\'t right with the vertices of face number ' + faceCounter ); + + } + + faceCounter ++; + + } + + var start = startVertex; + var count = endVertex - startVertex; + + geometry.addGroup( start, count, groupCount ); + groupCount ++; + + } + + geometry.setAttribute( 'position', new THREE.Float32BufferAttribute( vertices, 3 ) ); + geometry.setAttribute( 'normal', new THREE.Float32BufferAttribute( normals, 3 ) ); + + return geometry; + + } + + function ensureString( buffer ) { + + if ( typeof buffer !== 'string' ) { + + return THREE.LoaderUtils.decodeText( new Uint8Array( buffer ) ); + + } + + return buffer; + + } + + function ensureBinary( buffer ) { + + if ( typeof buffer === 'string' ) { + + var array_buffer = new Uint8Array( buffer.length ); + for ( var i = 0; i < buffer.length; i ++ ) { + + array_buffer[ i ] = buffer.charCodeAt( i ) & 0xff; // implicitly assumes little-endian + + } + + return array_buffer.buffer || array_buffer; + + } else { + + return buffer; + + } + + } + + // start + + var binData = ensureBinary( data ); + + return isBinary( binData ) ? parseBinary( binData ) : parseASCII( ensureString( data ) ); + + } + +} ); diff --git a/recursive_swarm/lib/SaveSVG.min.js b/recursive_swarm/lib/SaveSVG.min.js new file mode 100644 index 0000000000000000000000000000000000000000..e56d431386fdf698e836286f177bc11704bf19b4 --- /dev/null +++ b/recursive_swarm/lib/SaveSVG.min.js @@ -0,0 +1,2 @@ +// v1.0.0 Copyright 2020 Akul Mehta +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t=t||self).SaveSVG={})}(this,(function(t){"use strict";var e={data:""},i={data:[]};async function n(t){var i=window.location.href;(i=i.split("/")).pop(),i=i.join("/"),i+="/";await function(t){return new Promise((function(e,i){var n=new XMLHttpRequest;n.onreadystatechange=function(){4==n.readyState&&(200==n.status?e(n.responseText):i(n))},n.open("GET",t),n.overrideMimeType("text/plain; charset=x-user-defined"),n.send()}))}(i+t).then((function(t){e.data+=t})).catch((function(t){}))}function r(t){e.data.replace(/\/\*.*\*\//g,"").replace(/\r?\n|\r/g,"").split("}").forEach((function(e){if(""!=e.trim()){var i=e.split("{"),n=i[0].trim();i[1].split(";").forEach((function(e){if(""!=e.trim()){var i=e.split(":"),r=i[0].trim(),a=i[1].trim();"font-weight"==r?d3.select("#"+t).selectAll(n).each((function(t,e){this.getAttribute(r)||this.style[r]===a||d3.select(this).style(r+"",a+"")})):d3.select("#"+t).selectAll(n).each((function(t,e){this.getAttribute(r)||this.style[r]||d3.select(this).style(r+"",a+"")}))}}))}}))}async function a(t){await d3.xml(t).then((function(t){return i.data=[].map.call(t.querySelectorAll("symbol"),(function(t){return{id:t.getAttribute("id"),viewBox:t.getAttribute("viewBox"),innerhtml:t.innerHTML.replace(/\n|\t/g,"").trim()}})),i.data}))}async function l(t){d3.selectAll(`#${t} use`).each((function(t){var e=this.getAttribute("href");if(null===e&&(e=this.getAttribute("xlink:href")),null!==e){var n={id:e.split("#")[1],x:this.getAttribute("x"),y:this.getAttribute("y"),height:this.getAttribute("height"),width:this.getAttribute("width")},r=i.data.find(t=>t.id==n.id);d3.select(this.parentNode).append("svg").attr("id",n.id).attr("x",n.x).attr("y",n.y).attr("height",n.height).attr("width",n.width).attr("viewBox",r.viewBox).html(r.innerhtml).lower()}})).remove()}t.readCSSFile=n,t.readUSE=a,t.replacecss=r,t.replaceuse=l,t.save=async function(t,e,i){null!==e&&(await n(e),r(t)),null!==i&&(await a(i),l(t));var s=document.getElementById(t);s.setAttribute("xmlns","http://www.w3.org/2000/svg"),s.setAttribute("xmlns:xlink","http://www.w3.org/1999/xlink"),s=document.getElementById(t).outerHTML;var o=new Blob([s],{type:"image/svg+xml;charset=utf-8"}),c=URL.createObjectURL(o),d=document.createElement("a");d.href=c,d.download="Figure.svg",document.body.appendChild(d),d.click(),document.body.removeChild(d)},t.svgStyle=e,t.useArr=i,Object.defineProperty(t,"__esModule",{value:!0})})); diff --git a/recursive_swarm/lib/ShaderPass.js b/recursive_swarm/lib/ShaderPass.js new file mode 100644 index 0000000000000000000000000000000000000000..e24da659819ff9b933948aa6bf1583f8266a2d6b --- /dev/null +++ b/recursive_swarm/lib/ShaderPass.js @@ -0,0 +1,67 @@ +/** + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.ShaderPass = function ( shader, textureID ) { + + THREE.Pass.call( this ); + + this.textureID = ( textureID !== undefined ) ? textureID : "tDiffuse"; + + if ( shader instanceof THREE.ShaderMaterial ) { + + this.uniforms = shader.uniforms; + + this.material = shader; + + } else if ( shader ) { + + this.uniforms = THREE.UniformsUtils.clone( shader.uniforms ); + + this.material = new THREE.ShaderMaterial( { + + defines: shader.defines || {}, + uniforms: this.uniforms, + vertexShader: shader.vertexShader, + fragmentShader: shader.fragmentShader + + } ); + + } + + this.camera = new THREE.OrthographicCamera( - 1, 1, 1, - 1, 0, 1 ); + this.scene = new THREE.Scene(); + + this.quad = new THREE.Mesh( new THREE.PlaneBufferGeometry( 2, 2 ), null ); + this.quad.frustumCulled = false; // Avoid getting clipped + this.scene.add( this.quad ); + +}; + +THREE.ShaderPass.prototype = Object.assign( Object.create( THREE.Pass.prototype ), { + + constructor: THREE.ShaderPass, + + render: function( renderer, writeBuffer, readBuffer, delta, maskActive ) { + + if ( this.uniforms[ this.textureID ] ) { + + this.uniforms[ this.textureID ].value = readBuffer.texture; + + } + + this.quad.material = this.material; + + if ( this.renderToScreen ) { + + renderer.render( this.scene, this.camera ); + + } else { + + renderer.render( this.scene, this.camera, writeBuffer, this.clear ); + + } + + } + +} ); \ No newline at end of file diff --git a/recursive_swarm/lib/TransformControls.js b/recursive_swarm/lib/TransformControls.js new file mode 100644 index 0000000000000000000000000000000000000000..4c1bbd38d392c79671340b4bf0e46bcd2efa9b49 --- /dev/null +++ b/recursive_swarm/lib/TransformControls.js @@ -0,0 +1,1138 @@ +/** + * @author arodic / https://github.com/arodic + */ + /*jshint sub:true*/ + +( function () { + + 'use strict'; + + + var GizmoMaterial = function ( parameters ) { + + THREE.MeshBasicMaterial.call( this ); + + this.depthTest = false; + this.depthWrite = false; + this.side = THREE.FrontSide; + this.transparent = true; + + this.setValues( parameters ); + + this.oldColor = this.color.clone(); + this.oldOpacity = this.opacity; + + this.highlight = function( highlighted ) { + + if ( highlighted ) { + + this.color.setRGB( 1, 1, 0 ); + this.opacity = 1; + + } else { + + this.color.copy( this.oldColor ); + this.opacity = this.oldOpacity; + + } + + }; + + }; + + GizmoMaterial.prototype = Object.create( THREE.MeshBasicMaterial.prototype ); + GizmoMaterial.prototype.constructor = GizmoMaterial; + + + var GizmoLineMaterial = function ( parameters ) { + + THREE.LineBasicMaterial.call( this ); + + this.depthTest = false; + this.depthWrite = false; + this.transparent = true; + this.linewidth = 1; + + this.setValues( parameters ); + + this.oldColor = this.color.clone(); + this.oldOpacity = this.opacity; + + this.highlight = function( highlighted ) { + + if ( highlighted ) { + + this.color.setRGB( 1, 1, 0 ); + this.opacity = 1; + + } else { + + this.color.copy( this.oldColor ); + this.opacity = this.oldOpacity; + + } + + }; + + }; + + GizmoLineMaterial.prototype = Object.create( THREE.LineBasicMaterial.prototype ); + GizmoLineMaterial.prototype.constructor = GizmoLineMaterial; + + + var pickerMaterial = new GizmoMaterial( { visible: false, transparent: false } ); + + + THREE.TransformGizmo = function () { + + var scope = this; + + this.init = function () { + + THREE.Object3D.call( this ); + + this.handles = new THREE.Object3D(); + this.pickers = new THREE.Object3D(); + this.planes = new THREE.Object3D(); + + this.add( this.handles ); + this.add( this.pickers ); + this.add( this.planes ); + + //// PLANES + + var planeGeometry = new THREE.PlaneBufferGeometry( 50, 50, 2, 2 ); + var planeMaterial = new THREE.MeshBasicMaterial( { visible: false, side: THREE.DoubleSide } ); + + var planes = { + "XY": new THREE.Mesh( planeGeometry, planeMaterial ), + "YZ": new THREE.Mesh( planeGeometry, planeMaterial ), + "XZ": new THREE.Mesh( planeGeometry, planeMaterial ), + "XYZE": new THREE.Mesh( planeGeometry, planeMaterial ) + }; + + this.activePlane = planes[ "XYZE" ]; + + planes[ "YZ" ].rotation.set( 0, Math.PI / 2, 0 ); + planes[ "XZ" ].rotation.set( - Math.PI / 2, 0, 0 ); + + for ( var i in planes ) { + + planes[ i ].name = i; + this.planes.add( planes[ i ] ); + this.planes[ i ] = planes[ i ]; + + } + + //// HANDLES AND PICKERS + + var setupGizmos = function( gizmoMap, parent ) { + + for ( var name in gizmoMap ) { + + for ( i = gizmoMap[ name ].length; i --; ) { + + var object = gizmoMap[ name ][ i ][ 0 ]; + var position = gizmoMap[ name ][ i ][ 1 ]; + var rotation = gizmoMap[ name ][ i ][ 2 ]; + + object.name = name; + + if ( position ) object.position.set( position[ 0 ], position[ 1 ], position[ 2 ] ); + if ( rotation ) object.rotation.set( rotation[ 0 ], rotation[ 1 ], rotation[ 2 ] ); + + parent.add( object ); + + } + + } + + }; + + setupGizmos( this.handleGizmos, this.handles ); + setupGizmos( this.pickerGizmos, this.pickers ); + + // reset Transformations + + this.traverse( function ( child ) { + + if ( child instanceof THREE.Mesh ) { + + child.updateMatrix(); + + var tempGeometry = child.geometry.clone(); + tempGeometry.applyMatrix( child.matrix ); + child.geometry = tempGeometry; + + child.position.set( 0, 0, 0 ); + child.rotation.set( 0, 0, 0 ); + child.scale.set( 1, 1, 1 ); + + } + + } ); + + }; + + this.highlight = function ( axis ) { + + this.traverse( function( child ) { + + if ( child.material && child.material.highlight ) { + + if ( child.name === axis ) { + + child.material.highlight( true ); + + } else { + + child.material.highlight( false ); + + } + + } + + } ); + + }; + + }; + + THREE.TransformGizmo.prototype = Object.create( THREE.Object3D.prototype ); + THREE.TransformGizmo.prototype.constructor = THREE.TransformGizmo; + + THREE.TransformGizmo.prototype.update = function ( rotation, eye ) { + + var vec1 = new THREE.Vector3( 0, 0, 0 ); + var vec2 = new THREE.Vector3( 0, 1, 0 ); + var lookAtMatrix = new THREE.Matrix4(); + + this.traverse( function( child ) { + + if ( child.name.search( "E" ) !== - 1 ) { + + child.quaternion.setFromRotationMatrix( lookAtMatrix.lookAt( eye, vec1, vec2 ) ); + + } else if ( child.name.search( "X" ) !== - 1 || child.name.search( "Y" ) !== - 1 || child.name.search( "Z" ) !== - 1 ) { + + child.quaternion.setFromEuler( rotation ); + + } + + } ); + + }; + + THREE.TransformGizmoTranslate = function () { + + THREE.TransformGizmo.call( this ); + + var arrowGeometry = new THREE.Geometry(); + var mesh = new THREE.Mesh( new THREE.CylinderGeometry( 0, 0.05, 0.2, 12, 1, false ) ); + mesh.position.y = 0.5; + mesh.updateMatrix(); + + arrowGeometry.merge( mesh.geometry, mesh.matrix ); + + var lineXGeometry = new THREE.BufferGeometry(); + lineXGeometry.addAttribute( 'position', new THREE.Float32BufferAttribute( [ 0, 0, 0, 1, 0, 0 ], 3 ) ); + + var lineYGeometry = new THREE.BufferGeometry(); + lineYGeometry.addAttribute( 'position', new THREE.Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) ); + + var lineZGeometry = new THREE.BufferGeometry(); + lineZGeometry.addAttribute( 'position', new THREE.Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) ); + + this.handleGizmos = { + + X: [ + [ new THREE.Mesh( arrowGeometry, new GizmoMaterial( { color: 0xff0000 } ) ), [ 0.5, 0, 0 ], [ 0, 0, - Math.PI / 2 ] ], + [ new THREE.Line( lineXGeometry, new GizmoLineMaterial( { color: 0xff0000 } ) ) ] + ], + + Y: [ + [ new THREE.Mesh( arrowGeometry, new GizmoMaterial( { color: 0x00ff00 } ) ), [ 0, 0.5, 0 ] ], + [ new THREE.Line( lineYGeometry, new GizmoLineMaterial( { color: 0x00ff00 } ) ) ] + ], + + Z: [ + [ new THREE.Mesh( arrowGeometry, new GizmoMaterial( { color: 0x0000ff } ) ), [ 0, 0, 0.5 ], [ Math.PI / 2, 0, 0 ] ], + [ new THREE.Line( lineZGeometry, new GizmoLineMaterial( { color: 0x0000ff } ) ) ] + ], + + XYZ: [ + [ new THREE.Mesh( new THREE.OctahedronGeometry( 0.1, 0 ), new GizmoMaterial( { color: 0xffffff, opacity: 0.25 } ) ), [ 0, 0, 0 ], [ 0, 0, 0 ] ] + ], + + XY: [ + [ new THREE.Mesh( new THREE.PlaneBufferGeometry( 0.29, 0.29 ), new GizmoMaterial( { color: 0xffff00, opacity: 0.25 } ) ), [ 0.15, 0.15, 0 ] ] + ], + + YZ: [ + [ new THREE.Mesh( new THREE.PlaneBufferGeometry( 0.29, 0.29 ), new GizmoMaterial( { color: 0x00ffff, opacity: 0.25 } ) ), [ 0, 0.15, 0.15 ], [ 0, Math.PI / 2, 0 ] ] + ], + + XZ: [ + [ new THREE.Mesh( new THREE.PlaneBufferGeometry( 0.29, 0.29 ), new GizmoMaterial( { color: 0xff00ff, opacity: 0.25 } ) ), [ 0.15, 0, 0.15 ], [ - Math.PI / 2, 0, 0 ] ] + ] + + }; + + this.pickerGizmos = { + + X: [ + [ new THREE.Mesh( new THREE.CylinderGeometry( 0.2, 0, 1, 4, 1, false ), pickerMaterial ), [ 0.6, 0, 0 ], [ 0, 0, - Math.PI / 2 ] ] + ], + + Y: [ + [ new THREE.Mesh( new THREE.CylinderGeometry( 0.2, 0, 1, 4, 1, false ), pickerMaterial ), [ 0, 0.6, 0 ] ] + ], + + Z: [ + [ new THREE.Mesh( new THREE.CylinderGeometry( 0.2, 0, 1, 4, 1, false ), pickerMaterial ), [ 0, 0, 0.6 ], [ Math.PI / 2, 0, 0 ] ] + ], + + XYZ: [ + [ new THREE.Mesh( new THREE.OctahedronGeometry( 0.2, 0 ), pickerMaterial ) ] + ], + + XY: [ + [ new THREE.Mesh( new THREE.PlaneBufferGeometry( 0.4, 0.4 ), pickerMaterial ), [ 0.2, 0.2, 0 ] ] + ], + + YZ: [ + [ new THREE.Mesh( new THREE.PlaneBufferGeometry( 0.4, 0.4 ), pickerMaterial ), [ 0, 0.2, 0.2 ], [ 0, Math.PI / 2, 0 ] ] + ], + + XZ: [ + [ new THREE.Mesh( new THREE.PlaneBufferGeometry( 0.4, 0.4 ), pickerMaterial ), [ 0.2, 0, 0.2 ], [ - Math.PI / 2, 0, 0 ] ] + ] + + }; + + this.setActivePlane = function ( axis, eye ) { + + var tempMatrix = new THREE.Matrix4(); + eye.applyMatrix4( tempMatrix.getInverse( tempMatrix.extractRotation( this.planes[ "XY" ].matrixWorld ) ) ); + + if ( axis === "X" ) { + + this.activePlane = this.planes[ "XY" ]; + + if ( Math.abs( eye.y ) > Math.abs( eye.z ) ) this.activePlane = this.planes[ "XZ" ]; + + } + + if ( axis === "Y" ) { + + this.activePlane = this.planes[ "XY" ]; + + if ( Math.abs( eye.x ) > Math.abs( eye.z ) ) this.activePlane = this.planes[ "YZ" ]; + + } + + if ( axis === "Z" ) { + + this.activePlane = this.planes[ "XZ" ]; + + if ( Math.abs( eye.x ) > Math.abs( eye.y ) ) this.activePlane = this.planes[ "YZ" ]; + + } + + if ( axis === "XYZ" ) this.activePlane = this.planes[ "XYZE" ]; + + if ( axis === "XY" ) this.activePlane = this.planes[ "XY" ]; + + if ( axis === "YZ" ) this.activePlane = this.planes[ "YZ" ]; + + if ( axis === "XZ" ) this.activePlane = this.planes[ "XZ" ]; + + }; + + this.init(); + + }; + + THREE.TransformGizmoTranslate.prototype = Object.create( THREE.TransformGizmo.prototype ); + THREE.TransformGizmoTranslate.prototype.constructor = THREE.TransformGizmoTranslate; + + THREE.TransformGizmoRotate = function () { + + THREE.TransformGizmo.call( this ); + + var CircleGeometry = function ( radius, facing, arc ) { + + var geometry = new THREE.BufferGeometry(); + var vertices = []; + arc = arc ? arc : 1; + + for ( var i = 0; i <= 64 * arc; ++ i ) { + + if ( facing === 'x' ) vertices.push( 0, Math.cos( i / 32 * Math.PI ) * radius, Math.sin( i / 32 * Math.PI ) * radius ); + if ( facing === 'y' ) vertices.push( Math.cos( i / 32 * Math.PI ) * radius, 0, Math.sin( i / 32 * Math.PI ) * radius ); + if ( facing === 'z' ) vertices.push( Math.sin( i / 32 * Math.PI ) * radius, Math.cos( i / 32 * Math.PI ) * radius, 0 ); + + } + + geometry.addAttribute( 'position', new THREE.Float32BufferAttribute( vertices, 3 ) ); + return geometry; + + }; + + this.handleGizmos = { + + X: [ + [ new THREE.Line( new CircleGeometry( 1, 'x', 0.5 ), new GizmoLineMaterial( { color: 0xff0000 } ) ) ] + ], + + Y: [ + [ new THREE.Line( new CircleGeometry( 1, 'y', 0.5 ), new GizmoLineMaterial( { color: 0x00ff00 } ) ) ] + ], + + Z: [ + [ new THREE.Line( new CircleGeometry( 1, 'z', 0.5 ), new GizmoLineMaterial( { color: 0x0000ff } ) ) ] + ], + + E: [ + [ new THREE.Line( new CircleGeometry( 1.25, 'z', 1 ), new GizmoLineMaterial( { color: 0xcccc00 } ) ) ] + ], + + XYZE: [ + [ new THREE.Line( new CircleGeometry( 1, 'z', 1 ), new GizmoLineMaterial( { color: 0x787878 } ) ) ] + ] + + }; + + this.pickerGizmos = { + + X: [ + [ new THREE.Mesh( new THREE.TorusGeometry( 1, 0.12, 4, 12, Math.PI ), pickerMaterial ), [ 0, 0, 0 ], [ 0, - Math.PI / 2, - Math.PI / 2 ] ] + ], + + Y: [ + [ new THREE.Mesh( new THREE.TorusGeometry( 1, 0.12, 4, 12, Math.PI ), pickerMaterial ), [ 0, 0, 0 ], [ Math.PI / 2, 0, 0 ] ] + ], + + Z: [ + [ new THREE.Mesh( new THREE.TorusGeometry( 1, 0.12, 4, 12, Math.PI ), pickerMaterial ), [ 0, 0, 0 ], [ 0, 0, - Math.PI / 2 ] ] + ], + + E: [ + [ new THREE.Mesh( new THREE.TorusGeometry( 1.25, 0.12, 2, 24 ), pickerMaterial ) ] + ], + + XYZE: [ + [ new THREE.Mesh( new THREE.Geometry() ) ]// TODO + ] + + }; + + this.setActivePlane = function ( axis ) { + + if ( axis === "E" ) this.activePlane = this.planes[ "XYZE" ]; + + if ( axis === "X" ) this.activePlane = this.planes[ "YZ" ]; + + if ( axis === "Y" ) this.activePlane = this.planes[ "XZ" ]; + + if ( axis === "Z" ) this.activePlane = this.planes[ "XY" ]; + + }; + + this.update = function ( rotation, eye2 ) { + + THREE.TransformGizmo.prototype.update.apply( this, arguments ); + + var group = { + + handles: this[ "handles" ], + pickers: this[ "pickers" ], + + }; + + var tempMatrix = new THREE.Matrix4(); + var worldRotation = new THREE.Euler( 0, 0, 1 ); + var tempQuaternion = new THREE.Quaternion(); + var unitX = new THREE.Vector3( 1, 0, 0 ); + var unitY = new THREE.Vector3( 0, 1, 0 ); + var unitZ = new THREE.Vector3( 0, 0, 1 ); + var quaternionX = new THREE.Quaternion(); + var quaternionY = new THREE.Quaternion(); + var quaternionZ = new THREE.Quaternion(); + var eye = eye2.clone(); + + worldRotation.copy( this.planes[ "XY" ].rotation ); + tempQuaternion.setFromEuler( worldRotation ); + + tempMatrix.makeRotationFromQuaternion( tempQuaternion ).getInverse( tempMatrix ); + eye.applyMatrix4( tempMatrix ); + + this.traverse( function( child ) { + + tempQuaternion.setFromEuler( worldRotation ); + + if ( child.name === "X" ) { + + quaternionX.setFromAxisAngle( unitX, Math.atan2( - eye.y, eye.z ) ); + tempQuaternion.multiplyQuaternions( tempQuaternion, quaternionX ); + child.quaternion.copy( tempQuaternion ); + + } + + if ( child.name === "Y" ) { + + quaternionY.setFromAxisAngle( unitY, Math.atan2( eye.x, eye.z ) ); + tempQuaternion.multiplyQuaternions( tempQuaternion, quaternionY ); + child.quaternion.copy( tempQuaternion ); + + } + + if ( child.name === "Z" ) { + + quaternionZ.setFromAxisAngle( unitZ, Math.atan2( eye.y, eye.x ) ); + tempQuaternion.multiplyQuaternions( tempQuaternion, quaternionZ ); + child.quaternion.copy( tempQuaternion ); + + } + + } ); + + }; + + this.init(); + + }; + + THREE.TransformGizmoRotate.prototype = Object.create( THREE.TransformGizmo.prototype ); + THREE.TransformGizmoRotate.prototype.constructor = THREE.TransformGizmoRotate; + + THREE.TransformGizmoScale = function () { + + THREE.TransformGizmo.call( this ); + + var arrowGeometry = new THREE.Geometry(); + var mesh = new THREE.Mesh( new THREE.BoxGeometry( 0.125, 0.125, 0.125 ) ); + mesh.position.y = 0.5; + mesh.updateMatrix(); + + arrowGeometry.merge( mesh.geometry, mesh.matrix ); + + var lineXGeometry = new THREE.BufferGeometry(); + lineXGeometry.addAttribute( 'position', new THREE.Float32BufferAttribute( [ 0, 0, 0, 1, 0, 0 ], 3 ) ); + + var lineYGeometry = new THREE.BufferGeometry(); + lineYGeometry.addAttribute( 'position', new THREE.Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) ); + + var lineZGeometry = new THREE.BufferGeometry(); + lineZGeometry.addAttribute( 'position', new THREE.Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) ); + + this.handleGizmos = { + + X: [ + [ new THREE.Mesh( arrowGeometry, new GizmoMaterial( { color: 0xff0000 } ) ), [ 0.5, 0, 0 ], [ 0, 0, - Math.PI / 2 ] ], + [ new THREE.Line( lineXGeometry, new GizmoLineMaterial( { color: 0xff0000 } ) ) ] + ], + + Y: [ + [ new THREE.Mesh( arrowGeometry, new GizmoMaterial( { color: 0x00ff00 } ) ), [ 0, 0.5, 0 ] ], + [ new THREE.Line( lineYGeometry, new GizmoLineMaterial( { color: 0x00ff00 } ) ) ] + ], + + Z: [ + [ new THREE.Mesh( arrowGeometry, new GizmoMaterial( { color: 0x0000ff } ) ), [ 0, 0, 0.5 ], [ Math.PI / 2, 0, 0 ] ], + [ new THREE.Line( lineZGeometry, new GizmoLineMaterial( { color: 0x0000ff } ) ) ] + ], + + XYZ: [ + [ new THREE.Mesh( new THREE.BoxGeometry( 0.125, 0.125, 0.125 ), new GizmoMaterial( { color: 0xffffff, opacity: 0.25 } ) ) ] + ] + + }; + + this.pickerGizmos = { + + X: [ + [ new THREE.Mesh( new THREE.CylinderGeometry( 0.2, 0, 1, 4, 1, false ), pickerMaterial ), [ 0.6, 0, 0 ], [ 0, 0, - Math.PI / 2 ] ] + ], + + Y: [ + [ new THREE.Mesh( new THREE.CylinderGeometry( 0.2, 0, 1, 4, 1, false ), pickerMaterial ), [ 0, 0.6, 0 ] ] + ], + + Z: [ + [ new THREE.Mesh( new THREE.CylinderGeometry( 0.2, 0, 1, 4, 1, false ), pickerMaterial ), [ 0, 0, 0.6 ], [ Math.PI / 2, 0, 0 ] ] + ], + + XYZ: [ + [ new THREE.Mesh( new THREE.BoxGeometry( 0.4, 0.4, 0.4 ), pickerMaterial ) ] + ] + + }; + + this.setActivePlane = function ( axis, eye ) { + + var tempMatrix = new THREE.Matrix4(); + eye.applyMatrix4( tempMatrix.getInverse( tempMatrix.extractRotation( this.planes[ "XY" ].matrixWorld ) ) ); + + if ( axis === "X" ) { + + this.activePlane = this.planes[ "XY" ]; + if ( Math.abs( eye.y ) > Math.abs( eye.z ) ) this.activePlane = this.planes[ "XZ" ]; + + } + + if ( axis === "Y" ) { + + this.activePlane = this.planes[ "XY" ]; + if ( Math.abs( eye.x ) > Math.abs( eye.z ) ) this.activePlane = this.planes[ "YZ" ]; + + } + + if ( axis === "Z" ) { + + this.activePlane = this.planes[ "XZ" ]; + if ( Math.abs( eye.x ) > Math.abs( eye.y ) ) this.activePlane = this.planes[ "YZ" ]; + + } + + if ( axis === "XYZ" ) this.activePlane = this.planes[ "XYZE" ]; + + }; + + this.init(); + + }; + + THREE.TransformGizmoScale.prototype = Object.create( THREE.TransformGizmo.prototype ); + THREE.TransformGizmoScale.prototype.constructor = THREE.TransformGizmoScale; + + THREE.TransformControls = function ( camera, domElement ) { + + // TODO: Make non-uniform scale and rotate play nice in hierarchies + // TODO: ADD RXYZ contol + + THREE.Object3D.call( this ); + + domElement = ( domElement !== undefined ) ? domElement : document; + + this.object = undefined; + this.visible = false; + this.translationSnap = null; + this.rotationSnap = null; + this.space = "world"; + this.size = 1; + this.axis = null; + + var scope = this; + + var _mode = "translate"; + var _dragging = false; + var _plane = "XY"; + var _gizmo = { + + "translate": new THREE.TransformGizmoTranslate(), + "rotate": new THREE.TransformGizmoRotate(), + "scale": new THREE.TransformGizmoScale() + }; + + for ( var type in _gizmo ) { + + var gizmoObj = _gizmo[ type ]; + + gizmoObj.visible = ( type === _mode ); + this.add( gizmoObj ); + + } + + var changeEvent = { type: "change" }; + var mouseDownEvent = { type: "mouseDown" }; + var mouseUpEvent = { type: "mouseUp", mode: _mode }; + var objectChangeEvent = { type: "objectChange" }; + + var ray = new THREE.Raycaster(); + var pointerVector = new THREE.Vector2(); + + var point = new THREE.Vector3(); + var offset = new THREE.Vector3(); + + var rotation = new THREE.Vector3(); + var offsetRotation = new THREE.Vector3(); + var scale = 1; + + var lookAtMatrix = new THREE.Matrix4(); + var eye = new THREE.Vector3(); + + var tempMatrix = new THREE.Matrix4(); + var tempVector = new THREE.Vector3(); + var tempQuaternion = new THREE.Quaternion(); + var unitX = new THREE.Vector3( 1, 0, 0 ); + var unitY = new THREE.Vector3( 0, 1, 0 ); + var unitZ = new THREE.Vector3( 0, 0, 1 ); + + var quaternionXYZ = new THREE.Quaternion(); + var quaternionX = new THREE.Quaternion(); + var quaternionY = new THREE.Quaternion(); + var quaternionZ = new THREE.Quaternion(); + var quaternionE = new THREE.Quaternion(); + + var oldPosition = new THREE.Vector3(); + var oldScale = new THREE.Vector3(); + var oldRotationMatrix = new THREE.Matrix4(); + + var parentRotationMatrix = new THREE.Matrix4(); + var parentScale = new THREE.Vector3(); + + var worldPosition = new THREE.Vector3(); + var worldRotation = new THREE.Euler(); + var worldRotationMatrix = new THREE.Matrix4(); + var camPosition = new THREE.Vector3(); + var camRotation = new THREE.Euler(); + + domElement.addEventListener( "mousedown", onPointerDown, false ); + domElement.addEventListener( "touchstart", onPointerDown, false ); + + domElement.addEventListener( "mousemove", onPointerHover, false ); + domElement.addEventListener( "touchmove", onPointerHover, false ); + + domElement.addEventListener( "mousemove", onPointerMove, false ); + domElement.addEventListener( "touchmove", onPointerMove, false ); + + domElement.addEventListener( "mouseup", onPointerUp, false ); + domElement.addEventListener( "mouseout", onPointerUp, false ); + domElement.addEventListener( "touchend", onPointerUp, false ); + domElement.addEventListener( "touchcancel", onPointerUp, false ); + domElement.addEventListener( "touchleave", onPointerUp, false ); + + this.dispose = function () { + + domElement.removeEventListener( "mousedown", onPointerDown ); + domElement.removeEventListener( "touchstart", onPointerDown ); + + domElement.removeEventListener( "mousemove", onPointerHover ); + domElement.removeEventListener( "touchmove", onPointerHover ); + + domElement.removeEventListener( "mousemove", onPointerMove ); + domElement.removeEventListener( "touchmove", onPointerMove ); + + domElement.removeEventListener( "mouseup", onPointerUp ); + domElement.removeEventListener( "mouseout", onPointerUp ); + domElement.removeEventListener( "touchend", onPointerUp ); + domElement.removeEventListener( "touchcancel", onPointerUp ); + domElement.removeEventListener( "touchleave", onPointerUp ); + + }; + + this.attach = function ( object ) { + + this.object = object; + this.visible = true; + this.update(); + + }; + + this.detach = function () { + + this.object = undefined; + this.visible = false; + this.axis = null; + + }; + + this.getMode = function () { + + return _mode; + + }; + + this.setMode = function ( mode ) { + + _mode = mode ? mode : _mode; + + if ( _mode === "scale" ) scope.space = "local"; + + for ( var type in _gizmo ) _gizmo[ type ].visible = ( type === _mode ); + + this.update(); + scope.dispatchEvent( changeEvent ); + + }; + + this.setTranslationSnap = function ( translationSnap ) { + + scope.translationSnap = translationSnap; + + }; + + this.setRotationSnap = function ( rotationSnap ) { + + scope.rotationSnap = rotationSnap; + + }; + + this.setSize = function ( size ) { + + scope.size = size; + this.update(); + scope.dispatchEvent( changeEvent ); + + }; + + this.setSpace = function ( space ) { + + scope.space = space; + this.update(); + scope.dispatchEvent( changeEvent ); + + }; + + this.update = function () { + + if ( scope.object === undefined ) return; + + scope.object.updateMatrixWorld(); + worldPosition.setFromMatrixPosition( scope.object.matrixWorld ); + worldRotation.setFromRotationMatrix( tempMatrix.extractRotation( scope.object.matrixWorld ) ); + + camera.updateMatrixWorld(); + camPosition.setFromMatrixPosition( camera.matrixWorld ); + camRotation.setFromRotationMatrix( tempMatrix.extractRotation( camera.matrixWorld ) ); + + scale = worldPosition.distanceTo( camPosition ) / 6 * scope.size; + this.position.copy( worldPosition ); + this.scale.set( scale, scale, scale ); + + eye.copy( camPosition ).sub( worldPosition ).normalize(); + + if ( scope.space === "local" ) { + + _gizmo[ _mode ].update( worldRotation, eye ); + + } else if ( scope.space === "world" ) { + + _gizmo[ _mode ].update( new THREE.Euler(), eye ); + + } + + _gizmo[ _mode ].highlight( scope.axis ); + + }; + + function onPointerHover( event ) { + + if ( scope.object === undefined || _dragging === true || ( event.button !== undefined && event.button !== 0 ) ) return; + + var pointer = event.changedTouches ? event.changedTouches[ 0 ] : event; + + var intersect = intersectObjects( pointer, _gizmo[ _mode ].pickers.children ); + + var axis = null; + + if ( intersect ) { + + axis = intersect.object.name; + + event.preventDefault(); + + } + + if ( scope.axis !== axis ) { + + scope.axis = axis; + scope.update(); + scope.dispatchEvent( changeEvent ); + + } + + } + + function onPointerDown( event ) { + + if ( scope.object === undefined || _dragging === true || ( event.button !== undefined && event.button !== 0 ) ) return; + + var pointer = event.changedTouches ? event.changedTouches[ 0 ] : event; + + if ( pointer.button === 0 || pointer.button === undefined ) { + + var intersect = intersectObjects( pointer, _gizmo[ _mode ].pickers.children ); + + if ( intersect ) { + + event.preventDefault(); + event.stopPropagation(); + + scope.dispatchEvent( mouseDownEvent ); + + scope.axis = intersect.object.name; + + scope.update(); + + eye.copy( camPosition ).sub( worldPosition ).normalize(); + + _gizmo[ _mode ].setActivePlane( scope.axis, eye ); + + var planeIntersect = intersectObjects( pointer, [ _gizmo[ _mode ].activePlane ] ); + + if ( planeIntersect ) { + + oldPosition.copy( scope.object.position ); + oldScale.copy( scope.object.scale ); + + oldRotationMatrix.extractRotation( scope.object.matrix ); + worldRotationMatrix.extractRotation( scope.object.matrixWorld ); + + parentRotationMatrix.extractRotation( scope.object.parent.matrixWorld ); + parentScale.setFromMatrixScale( tempMatrix.getInverse( scope.object.parent.matrixWorld ) ); + + offset.copy( planeIntersect.point ); + + } + + } + + } + + _dragging = true; + + } + + function onPointerMove( event ) { + + if ( scope.object === undefined || scope.axis === null || _dragging === false || ( event.button !== undefined && event.button !== 0 ) ) return; + + var pointer = event.changedTouches ? event.changedTouches[ 0 ] : event; + + var planeIntersect = intersectObjects( pointer, [ _gizmo[ _mode ].activePlane ] ); + + if ( planeIntersect === false ) return; + + event.preventDefault(); + event.stopPropagation(); + + point.copy( planeIntersect.point ); + + if ( _mode === "translate" ) { + + point.sub( offset ); + point.multiply( parentScale ); + + if ( scope.space === "local" ) { + + point.applyMatrix4( tempMatrix.getInverse( worldRotationMatrix ) ); + + if ( scope.axis.search( "X" ) === - 1 ) point.x = 0; + if ( scope.axis.search( "Y" ) === - 1 ) point.y = 0; + if ( scope.axis.search( "Z" ) === - 1 ) point.z = 0; + + point.applyMatrix4( oldRotationMatrix ); + + scope.object.position.copy( oldPosition ); + scope.object.position.add( point ); + + } + + if ( scope.space === "world" || scope.axis.search( "XYZ" ) !== - 1 ) { + + if ( scope.axis.search( "X" ) === - 1 ) point.x = 0; + if ( scope.axis.search( "Y" ) === - 1 ) point.y = 0; + if ( scope.axis.search( "Z" ) === - 1 ) point.z = 0; + + point.applyMatrix4( tempMatrix.getInverse( parentRotationMatrix ) ); + + scope.object.position.copy( oldPosition ); + scope.object.position.add( point ); + + } + + if ( scope.translationSnap !== null ) { + + if ( scope.space === "local" ) { + + scope.object.position.applyMatrix4( tempMatrix.getInverse( worldRotationMatrix ) ); + + } + + if ( scope.axis.search( "X" ) !== - 1 ) scope.object.position.x = Math.round( scope.object.position.x / scope.translationSnap ) * scope.translationSnap; + if ( scope.axis.search( "Y" ) !== - 1 ) scope.object.position.y = Math.round( scope.object.position.y / scope.translationSnap ) * scope.translationSnap; + if ( scope.axis.search( "Z" ) !== - 1 ) scope.object.position.z = Math.round( scope.object.position.z / scope.translationSnap ) * scope.translationSnap; + + if ( scope.space === "local" ) { + + scope.object.position.applyMatrix4( worldRotationMatrix ); + + } + + } + + } else if ( _mode === "scale" ) { + + point.sub( offset ); + point.multiply( parentScale ); + + if ( scope.space === "local" ) { + + if ( scope.axis === "XYZ" ) { + + scale = 1 + ( ( point.y ) / 50 ); + + scope.object.scale.x = oldScale.x * scale; + scope.object.scale.y = oldScale.y * scale; + scope.object.scale.z = oldScale.z * scale; + + } else { + + point.applyMatrix4( tempMatrix.getInverse( worldRotationMatrix ) ); + + if ( scope.axis === "X" ) scope.object.scale.x = oldScale.x * ( 1 + point.x / 50 ); + if ( scope.axis === "Y" ) scope.object.scale.y = oldScale.y * ( 1 + point.y / 50 ); + if ( scope.axis === "Z" ) scope.object.scale.z = oldScale.z * ( 1 + point.z / 50 ); + + } + + } + + } else if ( _mode === "rotate" ) { + + point.sub( worldPosition ); + point.multiply( parentScale ); + tempVector.copy( offset ).sub( worldPosition ); + tempVector.multiply( parentScale ); + + if ( scope.axis === "E" ) { + + point.applyMatrix4( tempMatrix.getInverse( lookAtMatrix ) ); + tempVector.applyMatrix4( tempMatrix.getInverse( lookAtMatrix ) ); + + rotation.set( Math.atan2( point.z, point.y ), Math.atan2( point.x, point.z ), Math.atan2( point.y, point.x ) ); + offsetRotation.set( Math.atan2( tempVector.z, tempVector.y ), Math.atan2( tempVector.x, tempVector.z ), Math.atan2( tempVector.y, tempVector.x ) ); + + tempQuaternion.setFromRotationMatrix( tempMatrix.getInverse( parentRotationMatrix ) ); + + quaternionE.setFromAxisAngle( eye, rotation.z - offsetRotation.z ); + quaternionXYZ.setFromRotationMatrix( worldRotationMatrix ); + + tempQuaternion.multiplyQuaternions( tempQuaternion, quaternionE ); + tempQuaternion.multiplyQuaternions( tempQuaternion, quaternionXYZ ); + + scope.object.quaternion.copy( tempQuaternion ); + + } else if ( scope.axis === "XYZE" ) { + + quaternionE.setFromEuler( point.clone().cross( tempVector ).normalize() ); // rotation axis + + tempQuaternion.setFromRotationMatrix( tempMatrix.getInverse( parentRotationMatrix ) ); + quaternionX.setFromAxisAngle( quaternionE, - point.clone().angleTo( tempVector ) ); + quaternionXYZ.setFromRotationMatrix( worldRotationMatrix ); + + tempQuaternion.multiplyQuaternions( tempQuaternion, quaternionX ); + tempQuaternion.multiplyQuaternions( tempQuaternion, quaternionXYZ ); + + scope.object.quaternion.copy( tempQuaternion ); + + } else if ( scope.space === "local" ) { + + point.applyMatrix4( tempMatrix.getInverse( worldRotationMatrix ) ); + + tempVector.applyMatrix4( tempMatrix.getInverse( worldRotationMatrix ) ); + + rotation.set( Math.atan2( point.z, point.y ), Math.atan2( point.x, point.z ), Math.atan2( point.y, point.x ) ); + offsetRotation.set( Math.atan2( tempVector.z, tempVector.y ), Math.atan2( tempVector.x, tempVector.z ), Math.atan2( tempVector.y, tempVector.x ) ); + + quaternionXYZ.setFromRotationMatrix( oldRotationMatrix ); + + if ( scope.rotationSnap !== null ) { + + quaternionX.setFromAxisAngle( unitX, Math.round( ( rotation.x - offsetRotation.x ) / scope.rotationSnap ) * scope.rotationSnap ); + quaternionY.setFromAxisAngle( unitY, Math.round( ( rotation.y - offsetRotation.y ) / scope.rotationSnap ) * scope.rotationSnap ); + quaternionZ.setFromAxisAngle( unitZ, Math.round( ( rotation.z - offsetRotation.z ) / scope.rotationSnap ) * scope.rotationSnap ); + + } else { + + quaternionX.setFromAxisAngle( unitX, rotation.x - offsetRotation.x ); + quaternionY.setFromAxisAngle( unitY, rotation.y - offsetRotation.y ); + quaternionZ.setFromAxisAngle( unitZ, rotation.z - offsetRotation.z ); + + } + + if ( scope.axis === "X" ) quaternionXYZ.multiplyQuaternions( quaternionXYZ, quaternionX ); + if ( scope.axis === "Y" ) quaternionXYZ.multiplyQuaternions( quaternionXYZ, quaternionY ); + if ( scope.axis === "Z" ) quaternionXYZ.multiplyQuaternions( quaternionXYZ, quaternionZ ); + + scope.object.quaternion.copy( quaternionXYZ ); + + } else if ( scope.space === "world" ) { + + rotation.set( Math.atan2( point.z, point.y ), Math.atan2( point.x, point.z ), Math.atan2( point.y, point.x ) ); + offsetRotation.set( Math.atan2( tempVector.z, tempVector.y ), Math.atan2( tempVector.x, tempVector.z ), Math.atan2( tempVector.y, tempVector.x ) ); + + tempQuaternion.setFromRotationMatrix( tempMatrix.getInverse( parentRotationMatrix ) ); + + if ( scope.rotationSnap !== null ) { + + quaternionX.setFromAxisAngle( unitX, Math.round( ( rotation.x - offsetRotation.x ) / scope.rotationSnap ) * scope.rotationSnap ); + quaternionY.setFromAxisAngle( unitY, Math.round( ( rotation.y - offsetRotation.y ) / scope.rotationSnap ) * scope.rotationSnap ); + quaternionZ.setFromAxisAngle( unitZ, Math.round( ( rotation.z - offsetRotation.z ) / scope.rotationSnap ) * scope.rotationSnap ); + + } else { + + quaternionX.setFromAxisAngle( unitX, rotation.x - offsetRotation.x ); + quaternionY.setFromAxisAngle( unitY, rotation.y - offsetRotation.y ); + quaternionZ.setFromAxisAngle( unitZ, rotation.z - offsetRotation.z ); + + } + + quaternionXYZ.setFromRotationMatrix( worldRotationMatrix ); + + if ( scope.axis === "X" ) tempQuaternion.multiplyQuaternions( tempQuaternion, quaternionX ); + if ( scope.axis === "Y" ) tempQuaternion.multiplyQuaternions( tempQuaternion, quaternionY ); + if ( scope.axis === "Z" ) tempQuaternion.multiplyQuaternions( tempQuaternion, quaternionZ ); + + tempQuaternion.multiplyQuaternions( tempQuaternion, quaternionXYZ ); + + scope.object.quaternion.copy( tempQuaternion ); + + } + + } + + scope.update(); + scope.dispatchEvent( changeEvent ); + scope.dispatchEvent( objectChangeEvent ); + + } + + function onPointerUp( event ) { + + if ( event.button !== undefined && event.button !== 0 ) return; + + if ( _dragging && ( scope.axis !== null ) ) { + + mouseUpEvent.simulationMode = _mode; + scope.dispatchEvent( mouseUpEvent ) + + } + + _dragging = false; + onPointerHover( event ); + + } + + function intersectObjects( pointer, objects ) { + + var rect = domElement.getBoundingClientRect(); + var x = ( pointer.clientX - rect.left ) / rect.width; + var y = ( pointer.clientY - rect.top ) / rect.height; + + pointerVector.set( ( x * 2 ) - 1, - ( y * 2 ) + 1 ); + ray.setFromCamera( pointerVector, camera ); + + var intersections = ray.intersectObjects( objects, true ); + return intersections[ 0 ] ? intersections[ 0 ] : false; + + } + + }; + + THREE.TransformControls.prototype = Object.create( THREE.Object3D.prototype ); + THREE.TransformControls.prototype.constructor = THREE.TransformControls; + +}() ); diff --git a/recursive_swarm/lib/Tween.min.js b/recursive_swarm/lib/Tween.min.js new file mode 100644 index 0000000000000000000000000000000000000000..c712b17c2633ff9339dc6519550a24bb169124ba --- /dev/null +++ b/recursive_swarm/lib/Tween.min.js @@ -0,0 +1,2 @@ +var TWEEN=TWEEN||function(){var n=[];return{getAll:function(){return n},removeAll:function(){n=[]},add:function(t){n.push(t)},remove:function(t){var r=n.indexOf(t);-1!==r&&n.splice(r,1)},update:function(t,r){if(0===n.length)return!1;var i=0;for(t=void 0!==t?t:TWEEN.now();i<n.length;)n[i].update(t)||r?i++:n.splice(i,1);return!0}}}();!function(){void 0===this.window&&void 0!==this.process?TWEEN.now=function(){var n=process.hrtime();return 1e3*n[0]+n[1]/1e3}:void 0!==this.window&&void 0!==window.performance&&void 0!==window.performance.now?TWEEN.now=window.performance.now.bind(window.performance):void 0!==Date.now?TWEEN.now=Date.now:TWEEN.now=function(){return(new Date).getTime()}}(),TWEEN.Tween=function(n){var t=n,r={},i={},o={},u=1e3,e=0,a=!1,f=!1,c=!1,s=0,h=null,l=TWEEN.Easing.Linear.None,E=TWEEN.Interpolation.Linear,p=[],d=null,v=!1,w=null,I=null,M=null;for(var T in n)r[T]=parseFloat(n[T],10);this.to=function(n,t){return void 0!==t&&(u=t),i=n,this},this.start=function(n){TWEEN.add(this),f=!0,v=!1,h=void 0!==n?n:TWEEN.now(),h+=s;for(var u in i){if(i[u]instanceof Array){if(0===i[u].length)continue;i[u]=[t[u]].concat(i[u])}void 0!==r[u]&&(r[u]=t[u],r[u]instanceof Array==!1&&(r[u]*=1),o[u]=r[u]||0)}return this},this.stop=function(){return f?(TWEEN.remove(this),f=!1,null!==M&&M.call(t),this.stopChainedTweens(),this):this},this.stopChainedTweens=function(){for(var n=0,t=p.length;t>n;n++)p[n].stop()},this.delay=function(n){return s=n,this},this.repeat=function(n){return e=n,this},this.yoyo=function(n){return a=n,this},this.easing=function(n){return l=n,this},this.interpolation=function(n){return E=n,this},this.chain=function(){return p=arguments,this},this.onStart=function(n){return d=n,this},this.onUpdate=function(n){return w=n,this},this.onComplete=function(n){return I=n,this},this.onStop=function(n){return M=n,this},this.update=function(n){var f,M,T;if(h>n)return!0;v===!1&&(null!==d&&d.call(t),v=!0),M=(n-h)/u,M=M>1?1:M,T=l(M);for(f in i)if(void 0!==r[f]){var N=r[f]||0,W=i[f];W instanceof Array?t[f]=E(W,T):("string"==typeof W&&(W="+"===W.charAt(0)||"-"===W.charAt(0)?N+parseFloat(W,10):parseFloat(W,10)),"number"==typeof W&&(t[f]=N+(W-N)*T))}if(null!==w&&w.call(t,T),1===M){if(e>0){isFinite(e)&&e--;for(f in o){if("string"==typeof i[f]&&(o[f]=o[f]+parseFloat(i[f],10)),a){var O=o[f];o[f]=i[f],i[f]=O}r[f]=o[f]}return a&&(c=!c),h=n+s,!0}null!==I&&I.call(t);for(var m=0,g=p.length;g>m;m++)p[m].start(h+u);return!1}return!0}},TWEEN.Easing={Linear:{None:function(n){return n}},Quadratic:{In:function(n){return n*n},Out:function(n){return n*(2-n)},InOut:function(n){return(n*=2)<1?.5*n*n:-.5*(--n*(n-2)-1)}},Cubic:{In:function(n){return n*n*n},Out:function(n){return--n*n*n+1},InOut:function(n){return(n*=2)<1?.5*n*n*n:.5*((n-=2)*n*n+2)}},Quartic:{In:function(n){return n*n*n*n},Out:function(n){return 1- --n*n*n*n},InOut:function(n){return(n*=2)<1?.5*n*n*n*n:-.5*((n-=2)*n*n*n-2)}},Quintic:{In:function(n){return n*n*n*n*n},Out:function(n){return--n*n*n*n*n+1},InOut:function(n){return(n*=2)<1?.5*n*n*n*n*n:.5*((n-=2)*n*n*n*n+2)}},Sinusoidal:{In:function(n){return 1-Math.cos(n*Math.PI/2)},Out:function(n){return Math.sin(n*Math.PI/2)},InOut:function(n){return.5*(1-Math.cos(Math.PI*n))}},Exponential:{In:function(n){return 0===n?0:Math.pow(1024,n-1)},Out:function(n){return 1===n?1:1-Math.pow(2,-10*n)},InOut:function(n){return 0===n?0:1===n?1:(n*=2)<1?.5*Math.pow(1024,n-1):.5*(-Math.pow(2,-10*(n-1))+2)}},Circular:{In:function(n){return 1-Math.sqrt(1-n*n)},Out:function(n){return Math.sqrt(1- --n*n)},InOut:function(n){return(n*=2)<1?-.5*(Math.sqrt(1-n*n)-1):.5*(Math.sqrt(1-(n-=2)*n)+1)}},Elastic:{In:function(n){return 0===n?0:1===n?1:-Math.pow(2,10*(n-1))*Math.sin(5*(n-1.1)*Math.PI)},Out:function(n){return 0===n?0:1===n?1:Math.pow(2,-10*n)*Math.sin(5*(n-.1)*Math.PI)+1},InOut:function(n){return 0===n?0:1===n?1:(n*=2,1>n?-.5*Math.pow(2,10*(n-1))*Math.sin(5*(n-1.1)*Math.PI):.5*Math.pow(2,-10*(n-1))*Math.sin(5*(n-1.1)*Math.PI)+1)}},Back:{In:function(n){var t=1.70158;return n*n*((t+1)*n-t)},Out:function(n){var t=1.70158;return--n*n*((t+1)*n+t)+1},InOut:function(n){var t=2.5949095;return(n*=2)<1?.5*(n*n*((t+1)*n-t)):.5*((n-=2)*n*((t+1)*n+t)+2)}},Bounce:{In:function(n){return 1-TWEEN.Easing.Bounce.Out(1-n)},Out:function(n){return 1/2.75>n?7.5625*n*n:2/2.75>n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75>n?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375},InOut:function(n){return.5>n?.5*TWEEN.Easing.Bounce.In(2*n):.5*TWEEN.Easing.Bounce.Out(2*n-1)+.5}}},TWEEN.Interpolation={Linear:function(n,t){var r=n.length-1,i=r*t,o=Math.floor(i),u=TWEEN.Interpolation.Utils.Linear;return 0>t?u(n[0],n[1],i):t>1?u(n[r],n[r-1],r-i):u(n[o],n[o+1>r?r:o+1],i-o)},Bezier:function(n,t){for(var r=0,i=n.length-1,o=Math.pow,u=TWEEN.Interpolation.Utils.Bernstein,e=0;i>=e;e++)r+=o(1-t,i-e)*o(t,e)*n[e]*u(i,e);return r},CatmullRom:function(n,t){var r=n.length-1,i=r*t,o=Math.floor(i),u=TWEEN.Interpolation.Utils.CatmullRom;return n[0]===n[r]?(0>t&&(o=Math.floor(i=r*(1+t))),u(n[(o-1+r)%r],n[o],n[(o+1)%r],n[(o+2)%r],i-o)):0>t?n[0]-(u(n[0],n[0],n[1],n[1],-i)-n[0]):t>1?n[r]-(u(n[r],n[r],n[r-1],n[r-1],i-r)-n[r]):u(n[o?o-1:0],n[o],n[o+1>r?r:o+1],n[o+2>r?r:o+2],i-o)},Utils:{Linear:function(n,t,r){return(t-n)*r+n},Bernstein:function(n,t){var r=TWEEN.Interpolation.Utils.Factorial;return r(n)/r(t)/r(n-t)},Factorial:function(){var n=[1];return function(t){var r=1;if(n[t])return n[t];for(var i=t;i>1;i--)r*=i;return n[t]=r,r}}(),CatmullRom:function(n,t,r,i,o){var u=.5*(r-n),e=.5*(i-t),a=o*o,f=o*a;return(2*t-2*r+u+e)*f+(-3*t+3*r-2*u-e)*a+u*o+t}}},function(n){"function"==typeof define&&define.amd?define([],function(){return TWEEN}):"undefined"!=typeof module&&"object"==typeof exports?module.exports=TWEEN:void 0!==n&&(n.TWEEN=TWEEN)}(this); +//# sourceMappingURL=Tween.min.js.map \ No newline at end of file diff --git a/recursive_swarm/lib/VignetteShader.js b/recursive_swarm/lib/VignetteShader.js new file mode 100644 index 0000000000000000000000000000000000000000..9bf8323e2d126eca26ae5c41aa424cbf08f0ad6d --- /dev/null +++ b/recursive_swarm/lib/VignetteShader.js @@ -0,0 +1,63 @@ +/** + * @author alteredq / http://alteredqualia.com/ + * + * Vignette shader + * based on PaintEffect postprocess from ro.me + * http://code.google.com/p/3-dreams-of-black/source/browse/deploy/js/effects/PaintEffect.js + */ + +THREE.VignetteShader = { + + uniforms: { + + "tDiffuse": { value: null }, + "offset": { value: 1.0 }, + "darkness": { value: 1.0 } + + }, + + vertexShader: [ + + "varying vec2 vUv;", + + "void main() {", + + "vUv = uv;", + "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", + + "}" + + ].join( "\n" ), + + fragmentShader: [ + + "uniform float offset;", + "uniform float darkness;", + + "uniform sampler2D tDiffuse;", + + "varying vec2 vUv;", + + "void main() {", + + // Eskil's vignette + + "vec4 texel = texture2D( tDiffuse, vUv );", + "vec2 uv = ( vUv - vec2( 0.5 ) ) * vec2( offset );", + "gl_FragColor = vec4( mix( texel.rgb, vec3( 1.0 - darkness ), dot( uv, uv ) ), texel.a );", + + /* + // alternative version from glfx.js + // this one makes more "dusty" look (as opposed to "burned") + + "vec4 color = texture2D( tDiffuse, vUv );", + "float dist = distance( vUv, vec2( 0.5 ) );", + "color.rgb *= smoothstep( 0.8, offset * 0.799, dist *( darkness + offset ) );", + "gl_FragColor = color;", + */ + + "}" + + ].join( "\n" ) + +}; \ No newline at end of file diff --git a/recursive_swarm/lib/binascii.js b/recursive_swarm/lib/binascii.js new file mode 100644 index 0000000000000000000000000000000000000000..15d924eacc20977099095d84d8c608163d827348 --- /dev/null +++ b/recursive_swarm/lib/binascii.js @@ -0,0 +1,33 @@ + +// Based on https://docs.python.org/2/library/binascii.html +// var binascii = (function(){ + + var hexlify = function(str) { + var result = ''; + var padding = '00'; + for (var i=0, l=str.length; i<l; i++) { + var digit = str.charCodeAt(i).toString(16); + var padded = (padding+digit).slice(-2); + result += padded; + } + return result; + }; + + var unhexlify = function(str) { + var result = ''; + for (var i=0, l=str.length; i<l; i+=2) { + result += String.fromCharCode(parseInt(str.substr(i, 2), 16)); + } + return result; + }; + + +// return { +// b2a_hex: hexlify, +// hexlify: hexlify, + +// a2b_hex: unhexlify, +// unhexlify: unhexlify +// }; + +// })(); diff --git a/recursive_swarm/lib/canvas.svg b/recursive_swarm/lib/canvas.svg new file mode 100644 index 0000000000000000000000000000000000000000..b550a9bbdac87e69b6e6379a7747a6dccccceda9 Binary files /dev/null and b/recursive_swarm/lib/canvas.svg differ diff --git a/recursive_swarm/lib/canvas2svg.js b/recursive_swarm/lib/canvas2svg.js new file mode 100644 index 0000000000000000000000000000000000000000..5ce04ed533eae3c9e68118ec4be7976792e72870 --- /dev/null +++ b/recursive_swarm/lib/canvas2svg.js @@ -0,0 +1,1307 @@ +/*!! + * Canvas 2 Svg v1.0.19 + * A low level canvas to SVG converter. Uses a mock canvas context to build an SVG document. + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/mit-license.php + * + * Author: + * Kerry Liu + * + * Copyright (c) 2014 Gliffy Inc. + */ + +;(function () { + "use strict"; + + var STYLES, ctx, CanvasGradient, CanvasPattern, namedEntities; + + //helper function to format a string + function format(str, args) { + var keys = Object.keys(args), i; + for (i=0; i<keys.length; i++) { + str = str.replace(new RegExp("\\{" + keys[i] + "\\}", "gi"), args[keys[i]]); + } + return str; + } + + //helper function that generates a random string + function randomString(holder) { + var chars, randomstring, i; + if (!holder) { + throw new Error("cannot create a random attribute name for an undefined object"); + } + chars = "ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz"; + randomstring = ""; + do { + randomstring = ""; + for (i = 0; i < 12; i++) { + randomstring += chars[Math.floor(Math.random() * chars.length)]; + } + } while (holder[randomstring]); + return randomstring; + } + + //helper function to map named to numbered entities + function createNamedToNumberedLookup(items, radix) { + var i, entity, lookup = {}, base10, base16; + items = items.split(','); + radix = radix || 10; + // Map from named to numbered entities. + for (i = 0; i < items.length; i += 2) { + entity = '&' + items[i + 1] + ';'; + base10 = parseInt(items[i], radix); + lookup[entity] = '&#'+base10+';'; + } + //FF and IE need to create a regex from hex values ie == \xa0 + lookup["\\xa0"] = ' '; + return lookup; + } + + //helper function to map canvas-textAlign to svg-textAnchor + function getTextAnchor(textAlign) { + //TODO: support rtl languages + var mapping = {"left":"start", "right":"end", "center":"middle", "start":"start", "end":"end"}; + return mapping[textAlign] || mapping.start; + } + + //helper function to map canvas-textBaseline to svg-dominantBaseline + function getDominantBaseline(textBaseline) { + //INFO: not supported in all browsers + var mapping = {"alphabetic": "alphabetic", "hanging": "hanging", "top":"text-before-edge", "bottom":"text-after-edge", "middle":"central"}; + return mapping[textBaseline] || mapping.alphabetic; + } + + // Unpack entities lookup where the numbers are in radix 32 to reduce the size + // entity mapping courtesy of tinymce + namedEntities = createNamedToNumberedLookup( + '50,nbsp,51,iexcl,52,cent,53,pound,54,curren,55,yen,56,brvbar,57,sect,58,uml,59,copy,' + + '5a,ordf,5b,laquo,5c,not,5d,shy,5e,reg,5f,macr,5g,deg,5h,plusmn,5i,sup2,5j,sup3,5k,acute,' + + '5l,micro,5m,para,5n,middot,5o,cedil,5p,sup1,5q,ordm,5r,raquo,5s,frac14,5t,frac12,5u,frac34,' + + '5v,iquest,60,Agrave,61,Aacute,62,Acirc,63,Atilde,64,Auml,65,Aring,66,AElig,67,Ccedil,' + + '68,Egrave,69,Eacute,6a,Ecirc,6b,Euml,6c,Igrave,6d,Iacute,6e,Icirc,6f,Iuml,6g,ETH,6h,Ntilde,' + + '6i,Ograve,6j,Oacute,6k,Ocirc,6l,Otilde,6m,Ouml,6n,times,6o,Oslash,6p,Ugrave,6q,Uacute,' + + '6r,Ucirc,6s,Uuml,6t,Yacute,6u,THORN,6v,szlig,70,agrave,71,aacute,72,acirc,73,atilde,74,auml,' + + '75,aring,76,aelig,77,ccedil,78,egrave,79,eacute,7a,ecirc,7b,euml,7c,igrave,7d,iacute,7e,icirc,' + + '7f,iuml,7g,eth,7h,ntilde,7i,ograve,7j,oacute,7k,ocirc,7l,otilde,7m,ouml,7n,divide,7o,oslash,' + + '7p,ugrave,7q,uacute,7r,ucirc,7s,uuml,7t,yacute,7u,thorn,7v,yuml,ci,fnof,sh,Alpha,si,Beta,' + + 'sj,Gamma,sk,Delta,sl,Epsilon,sm,Zeta,sn,Eta,so,Theta,sp,Iota,sq,Kappa,sr,Lambda,ss,Mu,' + + 'st,Nu,su,Xi,sv,Omicron,t0,Pi,t1,Rho,t3,Sigma,t4,Tau,t5,Upsilon,t6,Phi,t7,Chi,t8,Psi,' + + 't9,Omega,th,alpha,ti,beta,tj,gamma,tk,delta,tl,epsilon,tm,zeta,tn,eta,to,theta,tp,iota,' + + 'tq,kappa,tr,lambda,ts,mu,tt,nu,tu,xi,tv,omicron,u0,pi,u1,rho,u2,sigmaf,u3,sigma,u4,tau,' + + 'u5,upsilon,u6,phi,u7,chi,u8,psi,u9,omega,uh,thetasym,ui,upsih,um,piv,812,bull,816,hellip,' + + '81i,prime,81j,Prime,81u,oline,824,frasl,88o,weierp,88h,image,88s,real,892,trade,89l,alefsym,' + + '8cg,larr,8ch,uarr,8ci,rarr,8cj,darr,8ck,harr,8dl,crarr,8eg,lArr,8eh,uArr,8ei,rArr,8ej,dArr,' + + '8ek,hArr,8g0,forall,8g2,part,8g3,exist,8g5,empty,8g7,nabla,8g8,isin,8g9,notin,8gb,ni,8gf,prod,' + + '8gh,sum,8gi,minus,8gn,lowast,8gq,radic,8gt,prop,8gu,infin,8h0,ang,8h7,and,8h8,or,8h9,cap,8ha,cup,' + + '8hb,int,8hk,there4,8hs,sim,8i5,cong,8i8,asymp,8j0,ne,8j1,equiv,8j4,le,8j5,ge,8k2,sub,8k3,sup,8k4,' + + 'nsub,8k6,sube,8k7,supe,8kl,oplus,8kn,otimes,8l5,perp,8m5,sdot,8o8,lceil,8o9,rceil,8oa,lfloor,8ob,' + + 'rfloor,8p9,lang,8pa,rang,9ea,loz,9j0,spades,9j3,clubs,9j5,hearts,9j6,diams,ai,OElig,aj,oelig,b0,' + + 'Scaron,b1,scaron,bo,Yuml,m6,circ,ms,tilde,802,ensp,803,emsp,809,thinsp,80c,zwnj,80d,zwj,80e,lrm,' + + '80f,rlm,80j,ndash,80k,mdash,80o,lsquo,80p,rsquo,80q,sbquo,80s,ldquo,80t,rdquo,80u,bdquo,810,dagger,' + + '811,Dagger,81g,permil,81p,lsaquo,81q,rsaquo,85c,euro', 32); + + + //Some basic mappings for attributes and default values. + STYLES = { + "strokeStyle":{ + svgAttr : "stroke", //corresponding svg attribute + canvas : "#000000", //canvas default + svg : "none", //svg default + apply : "stroke" //apply on stroke() or fill() + }, + "fillStyle":{ + svgAttr : "fill", + canvas : "#000000", + svg : null, //svg default is black, but we need to special case this to handle canvas stroke without fill + apply : "fill" + }, + "lineCap":{ + svgAttr : "stroke-linecap", + canvas : "butt", + svg : "butt", + apply : "stroke" + }, + "lineJoin":{ + svgAttr : "stroke-linejoin", + canvas : "miter", + svg : "miter", + apply : "stroke" + }, + "miterLimit":{ + svgAttr : "stroke-miterlimit", + canvas : 10, + svg : 4, + apply : "stroke" + }, + "lineWidth":{ + svgAttr : "stroke-width", + canvas : 1, + svg : 1, + apply : "stroke" + }, + "globalAlpha": { + svgAttr : "opacity", + canvas : 1, + svg : 1, + apply : "fill stroke" + }, + "font":{ + //font converts to multiple svg attributes, there is custom logic for this + canvas : "10px sans-serif" + }, + "shadowColor":{ + canvas : "#000000" + }, + "shadowOffsetX":{ + canvas : 0 + }, + "shadowOffsetY":{ + canvas : 0 + }, + "shadowBlur":{ + canvas : 0 + }, + "textAlign":{ + canvas : "start" + }, + "textBaseline":{ + canvas : "alphabetic" + }, + "lineDash" : { + svgAttr : "stroke-dasharray", + canvas : [], + svg : null, + apply : "stroke" + } + }; + + /** + * + * @param gradientNode - reference to the gradient + * @constructor + */ + CanvasGradient = function (gradientNode, ctx) { + this.__root = gradientNode; + this.__ctx = ctx; + }; + + /** + * Adds a color stop to the gradient root + */ + CanvasGradient.prototype.addColorStop = function (offset, color) { + var stop = this.__ctx.__createElement("stop"), regex, matches; + stop.setAttribute("offset", offset); + if (color.indexOf("rgba") !== -1) { + //separate alpha value, since webkit can't handle it + regex = /rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d?\.?\d*)\s*\)/gi; + matches = regex.exec(color); + stop.setAttribute("stop-color", format("rgb({r},{g},{b})", {r:matches[1], g:matches[2], b:matches[3]})); + stop.setAttribute("stop-opacity", matches[4]); + } else { + stop.setAttribute("stop-color", color); + } + this.__root.appendChild(stop); + }; + + CanvasPattern = function (pattern, ctx) { + this.__root = pattern; + this.__ctx = ctx; + }; + + /** + * The mock canvas context + * @param o - options include: + * ctx - existing Context2D to wrap around + * width - width of your canvas (defaults to 500) + * height - height of your canvas (defaults to 500) + * embedImages - enables embedding images as data URLs (defaults to false) + * document - the document object (defaults to the current document) + */ + ctx = function (o) { + var defaultOptions = { width:500, height:500, embedImages : false}, options; + + //keep support for this way of calling C2S: new C2S(width,height) + if (arguments.length > 1) { + options = defaultOptions; + options.width = arguments[0]; + options.height = arguments[1]; + } else if ( !o ) { + options = defaultOptions; + } else { + options = o; + } + + if (!(this instanceof ctx)) { + //did someone call this without new? + return new ctx(options); + } + + //setup options + this.width = options.width || defaultOptions.width; + this.height = options.height || defaultOptions.height; + this.embedImages = options.embedImages !== undefined ? options.embedImages : defaultOptions.embedImages; + + this.canvas = this; ///point back to this instance! + this.__document = options.document || document; + + // allow passing in an existing context to wrap around + // if a context is passed in, we know a canvas already exist + if (options.ctx) { + this.__ctx = options.ctx; + } else { + this.__canvas = this.__document.createElement("canvas"); + this.__ctx = this.__canvas.getContext("2d"); + } + + this.__setDefaultStyles(); + this.__stack = [this.__getStyleState()]; + this.__groupStack = []; + + //the root svg element + this.__root = this.__document.createElementNS("http://www.w3.org/2000/svg", "svg"); + this.__root.setAttribute("version", 1.1); + this.__root.setAttribute("xmlns", "http://www.w3.org/2000/svg"); + this.__root.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:xlink", "http://www.w3.org/1999/xlink"); + this.__root.setAttribute("width", this.width); + this.__root.setAttribute("height", this.height); + + //make sure we don't generate the same ids in defs + this.__ids = {}; + + //defs tag + this.__defs = this.__document.createElementNS("http://www.w3.org/2000/svg", "defs"); + this.__root.appendChild(this.__defs); + + //also add a group child. the svg element can't use the transform attribute + this.__currentElement = this.__document.createElementNS("http://www.w3.org/2000/svg", "g"); + this.__root.appendChild(this.__currentElement); + }; + + + /** + * Creates the specified svg element + * @private + */ + ctx.prototype.__createElement = function (elementName, properties, resetFill) { + if (typeof properties === "undefined") { + properties = {}; + } + + var element = this.__document.createElementNS("http://www.w3.org/2000/svg", elementName), + keys = Object.keys(properties), i, key; + if (resetFill) { + //if fill or stroke is not specified, the svg element should not display. By default SVG's fill is black. + element.setAttribute("fill", "none"); + element.setAttribute("stroke", "none"); + } + for (i=0; i<keys.length; i++) { + key = keys[i]; + element.setAttribute(key, properties[key]); + } + return element; + }; + + /** + * Applies default canvas styles to the context + * @private + */ + ctx.prototype.__setDefaultStyles = function () { + //default 2d canvas context properties see:http://www.w3.org/TR/2dcontext/ + var keys = Object.keys(STYLES), i, key; + for (i=0; i<keys.length; i++) { + key = keys[i]; + this[key] = STYLES[key].canvas; + } + }; + + /** + * Applies styles on restore + * @param styleState + * @private + */ + ctx.prototype.__applyStyleState = function (styleState) { + var keys = Object.keys(styleState), i, key; + for (i=0; i<keys.length; i++) { + key = keys[i]; + this[key] = styleState[key]; + } + }; + + /** + * Gets the current style state + * @return {Object} + * @private + */ + ctx.prototype.__getStyleState = function () { + var i, styleState = {}, keys = Object.keys(STYLES), key; + for (i=0; i<keys.length; i++) { + key = keys[i]; + styleState[key] = this[key]; + } + return styleState; + }; + + /** + * Apples the current styles to the current SVG element. On "ctx.fill" or "ctx.stroke" + * @param type + * @private + */ + ctx.prototype.__applyStyleToCurrentElement = function (type) { + var currentElement = this.__currentElement; + var currentStyleGroup = this.__currentElementsToStyle; + if (currentStyleGroup) { + currentElement.setAttribute(type, ""); + currentElement = currentStyleGroup.element; + currentStyleGroup.children.forEach(function (node) { + node.setAttribute(type, ""); + }) + } + + var keys = Object.keys(STYLES), i, style, value, id, regex, matches; + for (i = 0; i < keys.length; i++) { + style = STYLES[keys[i]]; + value = this[keys[i]]; + if (style.apply) { + //is this a gradient or pattern? + if (value instanceof CanvasPattern) { + //pattern + if (value.__ctx) { + //copy over defs + while(value.__ctx.__defs.childNodes.length) { + id = value.__ctx.__defs.childNodes[0].getAttribute("id"); + this.__ids[id] = id; + this.__defs.appendChild(value.__ctx.__defs.childNodes[0]); + } + } + currentElement.setAttribute(style.apply, format("url(#{id})", {id:value.__root.getAttribute("id")})); + } + else if (value instanceof CanvasGradient) { + //gradient + currentElement.setAttribute(style.apply, format("url(#{id})", {id:value.__root.getAttribute("id")})); + } else if (style.apply.indexOf(type)!==-1 && style.svg !== value) { + if ((style.svgAttr === "stroke" || style.svgAttr === "fill") && value.indexOf("rgba") !== -1) { + //separate alpha value, since illustrator can't handle it + regex = /rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d?\.?\d*)\s*\)/gi; + matches = regex.exec(value); + currentElement.setAttribute(style.svgAttr, format("rgb({r},{g},{b})", {r:matches[1], g:matches[2], b:matches[3]})); + //should take globalAlpha here + var opacity = matches[4]; + var globalAlpha = this.globalAlpha; + if (globalAlpha != null) { + opacity *= globalAlpha; + } + currentElement.setAttribute(style.svgAttr+"-opacity", opacity); + } else { + var attr = style.svgAttr; + if (keys[i] === 'globalAlpha') { + attr = type+'-'+style.svgAttr; + if (currentElement.getAttribute(attr)) { + //fill-opacity or stroke-opacity has already been set by stroke or fill. + continue; + } + } + //otherwise only update attribute if right type, and not svg default + currentElement.setAttribute(attr, value); + } + } + } + } + }; + + /** + * Will return the closest group or svg node. May return the current element. + * @private + */ + ctx.prototype.__closestGroupOrSvg = function (node) { + node = node || this.__currentElement; + if (node.nodeName === "g" || node.nodeName === "svg") { + return node; + } else { + return this.__closestGroupOrSvg(node.parentNode); + } + }; + + function startRequest() + { + outstandingRequests++; + } + + function completeRequest() + { + outstandingRequests--; + if(outstandingRequests == 0) + { + completeCallbacks.forEach(function(callback) + { + callback(); + }); + completeCallbacks = []; + } + } + + var outstandingRequests = 0; + var completeCallbacks = []; + + function toDataUrl(url, callback){ + var xhr = new XMLHttpRequest(); + xhr.open('get', url); + xhr.responseType = 'blob'; + xhr.onload = function(){ + var fr = new FileReader(); + + fr.onload = function() + { + callback(this.result); + completeRequest(); + }; + + fr.onerror = function(e) + { + console.error("error reading image " + url, e); + completeRequest(); + }; + + fr.readAsDataURL(xhr.response); // async call + }; + xhr.onerror = function(e){ + console.error("error loading image " + url + " status " + e.target.status); + completeRequest(); + }; + startRequest(); + xhr.send(); + } + + /** + * Waits for all outstanding asyc calls such as image download + * @param callback - will be called when complete + */ + ctx.prototype.waitForComplete = function (callback) + { + if(outstandingRequests > 0) + { + completeCallbacks.push(callback); + return; + } + callback(); + }; + + /** + * Returns the serialized value of the svg so far + * @param fixNamedEntities - Standalone SVG doesn't support named entities, which document.createTextNode encodes. + * If true, we attempt to find all named entities and encode it as a numeric entity. + * @return serialized svg + */ + ctx.prototype.getSerializedSvg = function (fixNamedEntities) { + var serialized = new XMLSerializer().serializeToString(this.__root), + keys, i, key, value, regexp, xmlns; + + //IE search for a duplicate xmnls because they didn't implement setAttributeNS correctly + xmlns = /xmlns="http:\/\/www\.w3\.org\/2000\/svg".+xmlns="http:\/\/www\.w3\.org\/2000\/svg/gi; + if (xmlns.test(serialized)) { + serialized = serialized.replace('xmlns="http://www.w3.org/2000/svg','xmlns:xlink="http://www.w3.org/1999/xlink'); + } + + if (fixNamedEntities) { + keys = Object.keys(namedEntities); + //loop over each named entity and replace with the proper equivalent. + for (i=0; i<keys.length; i++) { + key = keys[i]; + value = namedEntities[key]; + regexp = new RegExp(key, "gi"); + if (regexp.test(serialized)) { + serialized = serialized.replace(regexp, value); + } + } + } + + return serialized; + }; + + + /** + * Returns the root svg + * @return + */ + ctx.prototype.getSvg = function () { + return this.__root; + }; + /** + * Will generate a group tag. + */ + ctx.prototype.save = function () { + var group = this.__createElement("g"); + var parent = this.__closestGroupOrSvg(); + this.__groupStack.push(parent); + parent.appendChild(group); + this.__currentElement = group; + this.__stack.push(this.__getStyleState()); + }; + /** + * Sets current element to parent, or just root if already root + */ + ctx.prototype.restore = function () { + this.__currentElement = this.__groupStack.pop(); + this.__currentElementsToStyle = null; + //Clearing canvas will make the poped group invalid, currentElement is set to the root group node. + if (!this.__currentElement) { + this.__currentElement = this.__root.childNodes[1]; + } + var state = this.__stack.pop(); + this.__applyStyleState(state); + }; + + /** + * Helper method to add transform + * @private + */ + ctx.prototype.__addTransform = function (t) { + //if the current element has siblings, add another group + var parent = this.__closestGroupOrSvg(); + if (parent.childNodes.length > 0) { + if (this.__currentElement.nodeName === "path") { + if (!this.__currentElementsToStyle) this.__currentElementsToStyle = {element: parent, children: []}; + this.__currentElementsToStyle.children.push(this.__currentElement) + this.__applyCurrentDefaultPath(); + } + + var group = this.__createElement("g"); + parent.appendChild(group); + this.__currentElement = group; + } + + var transform = this.__currentElement.getAttribute("transform"); + if (transform) { + transform += " "; + } else { + transform = ""; + } + transform += t; + this.__currentElement.setAttribute("transform", transform); + }; + + /** + * scales the current element + */ + ctx.prototype.scale = function (x, y) { + if (y === undefined) { + y = x; + } + this.__addTransform(format("scale({x},{y})", {x:x, y:y})); + }; + + /** + * rotates the current element + */ + ctx.prototype.rotate = function (angle) { + var degrees = (angle * 180 / Math.PI); + this.__addTransform(format("rotate({angle},{cx},{cy})", {angle:degrees, cx:0, cy:0})); + }; + + /** + * translates the current element + */ + ctx.prototype.translate = function (x, y) { + this.__addTransform(format("translate({x},{y})", {x:x,y:y})); + }; + + /** + * applies a transform to the current element + */ + ctx.prototype.transform = function (a, b, c, d, e, f) { + this.__addTransform(format("matrix({a},{b},{c},{d},{e},{f})", {a:a, b:b, c:c, d:d, e:e, f:f})); + }; + + /** + * Create a new Path Element + */ + ctx.prototype.beginPath = function () { + var path, parent; + + // Note that there is only one current default path, it is not part of the drawing state. + // See also: https://html.spec.whatwg.org/multipage/scripting.html#current-default-path + this.__currentDefaultPath = ""; + this.__currentPosition = {}; + + path = this.__createElement("path", {}, true); + parent = this.__closestGroupOrSvg(); + parent.appendChild(path); + this.__currentElement = path; + }; + + /** + * Helper function to apply currentDefaultPath to current path element + * @private + */ + ctx.prototype.__applyCurrentDefaultPath = function () { + var currentElement = this.__currentElement; + if (currentElement.nodeName === "path") { + currentElement.setAttribute("d", this.__currentDefaultPath); + } else { + console.error("Attempted to apply path command to node", currentElement.nodeName); + } + }; + + /** + * Helper function to add path command + * @private + */ + ctx.prototype.__addPathCommand = function (command) { + this.__currentDefaultPath += " "; + this.__currentDefaultPath += command; + }; + + /** + * Adds the move command to the current path element, + * if the currentPathElement is not empty create a new path element + */ + ctx.prototype.moveTo = function (x,y) { + if (this.__currentElement.nodeName !== "path") { + this.beginPath(); + } + + // creates a new subpath with the given point + this.__currentPosition = {x: x, y: y}; + this.__addPathCommand(format("M {x} {y}", {x:x, y:y})); + }; + + /** + * Closes the current path + */ + ctx.prototype.closePath = function () { + if (this.__currentDefaultPath) { + this.__addPathCommand("Z"); + } + }; + + /** + * Adds a line to command + */ + ctx.prototype.lineTo = function (x, y) { + this.__currentPosition = {x: x, y: y}; + if (this.__currentDefaultPath.indexOf('M') > -1) { + this.__addPathCommand(format("L {x} {y}", {x:x, y:y})); + } else { + this.__addPathCommand(format("M {x} {y}", {x:x, y:y})); + } + }; + + /** + * Add a bezier command + */ + ctx.prototype.bezierCurveTo = function (cp1x, cp1y, cp2x, cp2y, x, y) { + this.__currentPosition = {x: x, y: y}; + this.__addPathCommand(format("C {cp1x} {cp1y} {cp2x} {cp2y} {x} {y}", + {cp1x:cp1x, cp1y:cp1y, cp2x:cp2x, cp2y:cp2y, x:x, y:y})); + }; + + /** + * Adds a quadratic curve to command + */ + ctx.prototype.quadraticCurveTo = function (cpx, cpy, x, y) { + this.__currentPosition = {x: x, y: y}; + this.__addPathCommand(format("Q {cpx} {cpy} {x} {y}", {cpx:cpx, cpy:cpy, x:x, y:y})); + }; + + + /** + * Return a new normalized vector of given vector + */ + var normalize = function (vector) { + var len = Math.sqrt(vector[0] * vector[0] + vector[1] * vector[1]); + return [vector[0] / len, vector[1] / len]; + }; + + /** + * Adds the arcTo to the current path + * + * @see http://www.w3.org/TR/2015/WD-2dcontext-20150514/#dom-context-2d-arcto + */ + ctx.prototype.arcTo = function (x1, y1, x2, y2, radius) { + // Let the point (x0, y0) be the last point in the subpath. + var x0 = this.__currentPosition && this.__currentPosition.x; + var y0 = this.__currentPosition && this.__currentPosition.y; + + // First ensure there is a subpath for (x1, y1). + if (typeof x0 == "undefined" || typeof y0 == "undefined") { + return; + } + + // Negative values for radius must cause the implementation to throw an IndexSizeError exception. + if (radius < 0) { + throw new Error("IndexSizeError: The radius provided (" + radius + ") is negative."); + } + + // If the point (x0, y0) is equal to the point (x1, y1), + // or if the point (x1, y1) is equal to the point (x2, y2), + // or if the radius radius is zero, + // then the method must add the point (x1, y1) to the subpath, + // and connect that point to the previous point (x0, y0) by a straight line. + if (((x0 === x1) && (y0 === y1)) + || ((x1 === x2) && (y1 === y2)) + || (radius === 0)) { + this.lineTo(x1, y1); + return; + } + + // Otherwise, if the points (x0, y0), (x1, y1), and (x2, y2) all lie on a single straight line, + // then the method must add the point (x1, y1) to the subpath, + // and connect that point to the previous point (x0, y0) by a straight line. + var unit_vec_p1_p0 = normalize([x0 - x1, y0 - y1]); + var unit_vec_p1_p2 = normalize([x2 - x1, y2 - y1]); + if (unit_vec_p1_p0[0] * unit_vec_p1_p2[1] === unit_vec_p1_p0[1] * unit_vec_p1_p2[0]) { + this.lineTo(x1, y1); + return; + } + + // Otherwise, let The Arc be the shortest arc given by circumference of the circle that has radius radius, + // and that has one point tangent to the half-infinite line that crosses the point (x0, y0) and ends at the point (x1, y1), + // and that has a different point tangent to the half-infinite line that ends at the point (x1, y1), and crosses the point (x2, y2). + // The points at which this circle touches these two lines are called the start and end tangent points respectively. + + // note that both vectors are unit vectors, so the length is 1 + var cos = (unit_vec_p1_p0[0] * unit_vec_p1_p2[0] + unit_vec_p1_p0[1] * unit_vec_p1_p2[1]); + var theta = Math.acos(Math.abs(cos)); + + // Calculate origin + var unit_vec_p1_origin = normalize([ + unit_vec_p1_p0[0] + unit_vec_p1_p2[0], + unit_vec_p1_p0[1] + unit_vec_p1_p2[1] + ]); + var len_p1_origin = radius / Math.sin(theta / 2); + var x = x1 + len_p1_origin * unit_vec_p1_origin[0]; + var y = y1 + len_p1_origin * unit_vec_p1_origin[1]; + + // Calculate start angle and end angle + // rotate 90deg clockwise (note that y axis points to its down) + var unit_vec_origin_start_tangent = [ + -unit_vec_p1_p0[1], + unit_vec_p1_p0[0] + ]; + // rotate 90deg counter clockwise (note that y axis points to its down) + var unit_vec_origin_end_tangent = [ + unit_vec_p1_p2[1], + -unit_vec_p1_p2[0] + ]; + var getAngle = function (vector) { + // get angle (clockwise) between vector and (1, 0) + var x = vector[0]; + var y = vector[1]; + if (y >= 0) { // note that y axis points to its down + return Math.acos(x); + } else { + return -Math.acos(x); + } + }; + var startAngle = getAngle(unit_vec_origin_start_tangent); + var endAngle = getAngle(unit_vec_origin_end_tangent); + + // Connect the point (x0, y0) to the start tangent point by a straight line + this.lineTo(x + unit_vec_origin_start_tangent[0] * radius, + y + unit_vec_origin_start_tangent[1] * radius); + + // Connect the start tangent point to the end tangent point by arc + // and adding the end tangent point to the subpath. + this.arc(x, y, radius, startAngle, endAngle); + }; + + /** + * Sets the stroke property on the current element + */ + ctx.prototype.stroke = function () { + if (this.__currentElement.nodeName === "path") { + this.__currentElement.setAttribute("paint-order", "fill stroke markers"); + } + this.__applyCurrentDefaultPath(); + this.__applyStyleToCurrentElement("stroke"); + }; + + /** + * Sets fill properties on the current element + */ + ctx.prototype.fill = function () { + if (this.__currentElement.nodeName === "path") { + this.__currentElement.setAttribute("paint-order", "stroke fill markers"); + } + this.__applyCurrentDefaultPath(); + this.__applyStyleToCurrentElement("fill"); + }; + + /** + * Adds a rectangle to the path. + */ + ctx.prototype.rect = function (x, y, width, height) { + if (this.__currentElement.nodeName !== "path") { + this.beginPath(); + } + this.moveTo(x, y); + this.lineTo(x+width, y); + this.lineTo(x+width, y+height); + this.lineTo(x, y+height); + this.lineTo(x, y); + this.closePath(); + }; + + + /** + * adds a rectangle element + */ + ctx.prototype.fillRect = function (x, y, width, height) { + var rect, parent; + rect = this.__createElement("rect", { + x : x, + y : y, + width : width, + height : height + }, true); + parent = this.__closestGroupOrSvg(); + parent.appendChild(rect); + this.__currentElement = rect; + this.__applyStyleToCurrentElement("fill"); + }; + + /** + * Draws a rectangle with no fill + * @param x + * @param y + * @param width + * @param height + */ + ctx.prototype.strokeRect = function (x, y, width, height) { + var rect, parent; + rect = this.__createElement("rect", { + x : x, + y : y, + width : width, + height : height + }, true); + parent = this.__closestGroupOrSvg(); + parent.appendChild(rect); + this.__currentElement = rect; + this.__applyStyleToCurrentElement("stroke"); + }; + + + /** + * Clear entire canvas: + * 1. save current transforms + * 2. remove all the childNodes of the root g element + */ + ctx.prototype.__clearCanvas = function () { + var current = this.__closestGroupOrSvg(), + transform = current.getAttribute("transform"); + var rootGroup = this.__root.childNodes[1]; + var childNodes = rootGroup.childNodes; + for (var i = childNodes.length - 1; i >= 0; i--) { + if (childNodes[i]) { + rootGroup.removeChild(childNodes[i]); + } + } + this.__currentElement = rootGroup; + //reset __groupStack as all the child group nodes are all removed. + this.__groupStack = []; + if (transform) { + this.__addTransform(transform); + } + }; + + /** + * "Clears" a canvas by just drawing a white rectangle in the current group. + */ + ctx.prototype.clearRect = function (x, y, width, height) { + //clear entire canvas + if (x === 0 && y === 0 && width === this.width && height === this.height) { + this.__clearCanvas(); + return; + } + var rect, parent = this.__closestGroupOrSvg(); + rect = this.__createElement("rect", { + x : x, + y : y, + width : width, + height : height, + fill : "#FFFFFF" + }, true); + parent.appendChild(rect); + }; + + /** + * Adds a linear gradient to a defs tag. + * Returns a canvas gradient object that has a reference to it's parent def + */ + ctx.prototype.createLinearGradient = function (x1, y1, x2, y2) { + var grad = this.__createElement("linearGradient", { + id : randomString(this.__ids), + x1 : x1+"px", + x2 : x2+"px", + y1 : y1+"px", + y2 : y2+"px", + "gradientUnits" : "userSpaceOnUse" + }, false); + this.__defs.appendChild(grad); + return new CanvasGradient(grad, this); + }; + + /** + * Adds a radial gradient to a defs tag. + * Returns a canvas gradient object that has a reference to it's parent def + */ + ctx.prototype.createRadialGradient = function (x0, y0, r0, x1, y1, r1) { + var grad = this.__createElement("radialGradient", { + id : randomString(this.__ids), + cx : x1+"px", + cy : y1+"px", + r : r1+"px", + fx : x0+"px", + fy : y0+"px", + "gradientUnits" : "userSpaceOnUse" + }, false); + this.__defs.appendChild(grad); + return new CanvasGradient(grad, this); + + }; + + /** + * Parses the font string and returns svg mapping + * @private + */ + ctx.prototype.__parseFont = function () { + var regex = /^\s*(?=(?:(?:[-a-z]+\s*){0,2}(italic|oblique))?)(?=(?:(?:[-a-z]+\s*){0,2}(small-caps))?)(?=(?:(?:[-a-z]+\s*){0,2}(bold(?:er)?|lighter|[1-9]00))?)(?:(?:normal|\1|\2|\3)\s*){0,3}((?:xx?-)?(?:small|large)|medium|smaller|larger|[.\d]+(?:\%|in|[cem]m|ex|p[ctx]))(?:\s*\/\s*(normal|[.\d]+(?:\%|in|[cem]m|ex|p[ctx])))?\s*([-,\'\"\sa-z0-9]+?)\s*$/i; + var fontPart = regex.exec( this.font ); + var data = { + style : fontPart[1] || 'normal', + size : fontPart[4] || '10px', + family : fontPart[6] || 'sans-serif', + weight: fontPart[3] || 'normal', + decoration : fontPart[2] || 'normal', + href : null + }; + + //canvas doesn't support underline natively, but we can pass this attribute + if (this.__fontUnderline === "underline") { + data.decoration = "underline"; + } + + //canvas also doesn't support linking, but we can pass this as well + if (this.__fontHref) { + data.href = this.__fontHref; + } + + return data; + }; + + /** + * Helper to link text fragments + * @param font + * @param element + * @return {*} + * @private + */ + ctx.prototype.__wrapTextLink = function (font, element) { + if (font.href) { + var a = this.__createElement("a"); + a.setAttributeNS("http://www.w3.org/1999/xlink", "xlink:href", font.href); + a.appendChild(element); + return a; + } + return element; + }; + + /** + * Fills or strokes text + * @param text + * @param x + * @param y + * @param action - stroke or fill + * @private + */ + ctx.prototype.__applyText = function (text, x, y, action) { + var font = this.__parseFont(), + parent = this.__closestGroupOrSvg(), + textElement = this.__createElement("text", { + "font-family" : font.family, + "font-size" : font.size, + "font-style" : font.style, + "font-weight" : font.weight, + "text-decoration" : font.decoration, + "x" : x, + "y" : y, + "text-anchor": getTextAnchor(this.textAlign), + "dominant-baseline": getDominantBaseline(this.textBaseline) + }, true); + + textElement.appendChild(this.__document.createTextNode(text)); + this.__currentElement = textElement; + this.__applyStyleToCurrentElement(action); + parent.appendChild(this.__wrapTextLink(font,textElement)); + }; + + /** + * Creates a text element + * @param text + * @param x + * @param y + */ + ctx.prototype.fillText = function (text, x, y) { + this.__applyText(text, x, y, "fill"); + }; + + /** + * Strokes text + * @param text + * @param x + * @param y + */ + ctx.prototype.strokeText = function (text, x, y) { + this.__applyText(text, x, y, "stroke"); + }; + + /** + * No need to implement this for svg. + * @param text + * @return {TextMetrics} + */ + ctx.prototype.measureText = function (text) { + this.__ctx.font = this.font; + return this.__ctx.measureText(text); + }; + + /** + * Arc command! + */ + ctx.prototype.arc = function (x, y, radius, startAngle, endAngle, counterClockwise) { + // in canvas no circle is drawn if no angle is provided. + if (startAngle === endAngle) { + return; + } + startAngle = startAngle % (2*Math.PI); + endAngle = endAngle % (2*Math.PI); + if (startAngle === endAngle) { + //circle time! subtract some of the angle so svg is happy (svg elliptical arc can't draw a full circle) + endAngle = ((endAngle + (2*Math.PI)) - 0.001 * (counterClockwise ? -1 : 1)) % (2*Math.PI); + } + var endX = x+radius*Math.cos(endAngle), + endY = y+radius*Math.sin(endAngle), + startX = x+radius*Math.cos(startAngle), + startY = y+radius*Math.sin(startAngle), + sweepFlag = counterClockwise ? 0 : 1, + largeArcFlag = 0, + diff = endAngle - startAngle; + + // https://github.com/gliffy/canvas2svg/issues/4 + if (diff < 0) { + diff += 2*Math.PI; + } + + if (counterClockwise) { + largeArcFlag = diff > Math.PI ? 0 : 1; + } else { + largeArcFlag = diff > Math.PI ? 1 : 0; + } + + this.lineTo(startX, startY); + this.__addPathCommand(format("A {rx} {ry} {xAxisRotation} {largeArcFlag} {sweepFlag} {endX} {endY}", + {rx:radius, ry:radius, xAxisRotation:0, largeArcFlag:largeArcFlag, sweepFlag:sweepFlag, endX:endX, endY:endY})); + + this.__currentPosition = {x: endX, y: endY}; + }; + + /** + * Generates a ClipPath from the clip command. + */ + ctx.prototype.clip = function () { + var group = this.__closestGroupOrSvg(), + clipPath = this.__createElement("clipPath"), + id = randomString(this.__ids), + newGroup = this.__createElement("g"); + + this.__applyCurrentDefaultPath(); + group.removeChild(this.__currentElement); + clipPath.setAttribute("id", id); + clipPath.appendChild(this.__currentElement); + + this.__defs.appendChild(clipPath); + + //set the clip path to this group + group.setAttribute("clip-path", format("url(#{id})", {id:id})); + + //clip paths can be scaled and transformed, we need to add another wrapper group to avoid later transformations + // to this path + group.appendChild(newGroup); + + this.__currentElement = newGroup; + + }; + + /** + * Draws a canvas, image or mock context to this canvas. + * Note that all svg dom manipulation uses node.childNodes rather than node.children for IE support. + * http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#dom-context-2d-drawimage + */ + ctx.prototype.drawImage = function () { + //convert arguments to a real array + var args = Array.prototype.slice.call(arguments), + image=args[0], + dx, dy, dw, dh, sx=0, sy=0, sw, sh, parent, svg, defs, group, + currentElement, svgImage, canvas, context, id; + + if (args.length === 3) { + dx = args[1]; + dy = args[2]; + sw = image.width; + sh = image.height; + dw = sw; + dh = sh; + } else if (args.length === 5) { + dx = args[1]; + dy = args[2]; + dw = args[3]; + dh = args[4]; + sw = image.width; + sh = image.height; + } else if (args.length === 9) { + sx = args[1]; + sy = args[2]; + sw = args[3]; + sh = args[4]; + dx = args[5]; + dy = args[6]; + dw = args[7]; + dh = args[8]; + } else { + throw new Error("Invalid number of arguments passed to drawImage: " + arguments.length); + } + + parent = this.__closestGroupOrSvg(); + currentElement = this.__currentElement; + var translateDirective = "translate(" + dx + ", " + dy + ")"; + if (image instanceof ctx) { + //canvas2svg mock canvas context. In the future we may want to clone nodes instead. + //also I'm currently ignoring dw, dh, sw, sh, sx, sy for a mock context. + svg = image.getSvg().cloneNode(true); + if (svg.childNodes && svg.childNodes.length > 1) { + defs = svg.childNodes[0]; + while(defs.childNodes.length) { + id = defs.childNodes[0].getAttribute("id"); + this.__ids[id] = id; + this.__defs.appendChild(defs.childNodes[0]); + } + group = svg.childNodes[1]; + if (group) { + //save original transform + var originTransform = group.getAttribute("transform"); + var transformDirective; + if (originTransform) { + transformDirective = originTransform+" "+translateDirective; + } else { + transformDirective = translateDirective; + } + group.setAttribute("transform", transformDirective); + parent.appendChild(group); + } + } + } else if (image.nodeName === "CANVAS" || image.nodeName === "IMG") { + //canvas or image + svgImage = this.__createElement("image"); + svgImage.setAttribute("width", dw); + svgImage.setAttribute("height", dh); + svgImage.setAttribute("preserveAspectRatio", "none"); + + if (sx || sy || sw !== image.width || sh !== image.height) { + //crop the image using a temporary canvas + canvas = this.__document.createElement("canvas"); + canvas.width = dw; + canvas.height = dh; + context = canvas.getContext("2d"); + context.drawImage(image, sx, sy, sw, sh, 0, 0, dw, dh); + image = canvas; + } + + if (image.nodeName === "CANVAS") { + svgImage.setAttributeNS("http://www.w3.org/1999/xlink", "xlink:href", image.toDataURL()); + } + else if(this.embedImages) + { + var orgSvgImage = svgImage; + svgImage = this.__createElement("use"); + svgImage.setAttribute("width", dw); + svgImage.setAttribute("height", dh); + var imageUrl = image.getAttribute("src"); + svgImage.setAttributeNS("http://www.w3.org/1999/xlink", "xlink:href", "#" + imageUrl); + //if the image has not been dseen before download and add to defs for reuse + if(!this.__ids[imageUrl]) + { + this.__ids[imageUrl] = imageUrl; + orgSvgImage.setAttribute("id", imageUrl); + this.__defs.appendChild(orgSvgImage); + toDataUrl(image.getAttribute("src"), + function(dataUrl) + { + orgSvgImage.setAttributeNS("http://www.w3.org/1999/xlink", "xlink:href", dataUrl); + }); + } + } + else + { + svgImage.setAttributeNS("http://www.w3.org/1999/xlink", "xlink:href", image.getAttribute("src")); + } + + svgImage.setAttribute("transform", translateDirective); + + parent.appendChild(svgImage); + } + }; + + /** + * Generates a pattern tag + */ + ctx.prototype.createPattern = function (image, repetition) { + var pattern = this.__document.createElementNS("http://www.w3.org/2000/svg", "pattern"), id = randomString(this.__ids), + img; + pattern.setAttribute("id", id); + pattern.setAttribute("width", image.width); + pattern.setAttribute("height", image.height); + if (image.nodeName === "CANVAS" || image.nodeName === "IMG") { + img = this.__document.createElementNS("http://www.w3.org/2000/svg", "image"); + img.setAttribute("width", image.width); + img.setAttribute("height", image.height); + img.setAttributeNS("http://www.w3.org/1999/xlink", "xlink:href", + image.nodeName === "CANVAS" ? image.toDataURL() : image.getAttribute("src")); + pattern.appendChild(img); + this.__defs.appendChild(pattern); + } else if (image instanceof ctx) { + pattern.appendChild(image.__root.childNodes[1]); + this.__defs.appendChild(pattern); + } + return new CanvasPattern(pattern, this); + }; + + ctx.prototype.setLineDash = function (dashArray) { + if (dashArray && dashArray.length > 0) { + this.lineDash = dashArray.join(","); + } else { + this.lineDash = null; + } + }; + + /** + * Not yet implemented + */ + ctx.prototype.drawFocusRing = function () {}; + ctx.prototype.createImageData = function () {}; + ctx.prototype.getImageData = function () {}; + ctx.prototype.putImageData = function () {}; + ctx.prototype.globalCompositeOperation = function () {}; + ctx.prototype.setTransform = function () {}; + + //add options for alternative namespace + if (typeof window === "object") { + window.C2S = ctx; + } + + // CommonJS/Browserify + if (typeof module === "object" && typeof module.exports === "object") { + module.exports = ctx; + } + +}()); diff --git a/recursive_swarm/lib/dat.gui.min.js b/recursive_swarm/lib/dat.gui.min.js new file mode 100644 index 0000000000000000000000000000000000000000..8f07c7b0edc595f8c7ed98a941d39a19e0408a8d --- /dev/null +++ b/recursive_swarm/lib/dat.gui.min.js @@ -0,0 +1,2 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.dat=t():e.dat=t()}(this,function(){return function(e){function t(o){if(n[o])return n[o].exports;var i=n[o]={exports:{},id:o,loaded:!1};return e[o].call(i.exports,i,i.exports,t),i.loaded=!0,i.exports}var n={};return t.m=e,t.c=n,t.p="",t(0)}([function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}var i=n(1),r=o(i);e.exports=r["default"]},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}t.__esModule=!0;var i=n(2),r=o(i),a=n(6),l=o(a),s=n(3),u=o(s),d=n(7),c=o(d),f=n(8),_=o(f),p=n(10),h=o(p),m=n(11),b=o(m),g=n(12),v=o(g),y=n(13),w=o(y),x=n(14),E=o(x),C=n(15),A=o(C),S=n(16),k=o(S),O=n(9),T=o(O),R=n(17),L=o(R);t["default"]={color:{Color:r["default"],math:l["default"],interpret:u["default"]},controllers:{Controller:c["default"],BooleanController:_["default"],OptionController:h["default"],StringController:b["default"],NumberController:v["default"],NumberControllerBox:w["default"],NumberControllerSlider:E["default"],FunctionController:A["default"],ColorController:k["default"]},dom:{dom:T["default"]},gui:{GUI:L["default"]},GUI:L["default"]}},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t,n){Object.defineProperty(e,t,{get:function(){return"RGB"===this.__state.space?this.__state[t]:(h.recalculateRGB(this,t,n),this.__state[t])},set:function(e){"RGB"!==this.__state.space&&(h.recalculateRGB(this,t,n),this.__state.space="RGB"),this.__state[t]=e}})}function a(e,t){Object.defineProperty(e,t,{get:function(){return"HSV"===this.__state.space?this.__state[t]:(h.recalculateHSV(this),this.__state[t])},set:function(e){"HSV"!==this.__state.space&&(h.recalculateHSV(this),this.__state.space="HSV"),this.__state[t]=e}})}t.__esModule=!0;var l=n(3),s=o(l),u=n(6),d=o(u),c=n(4),f=o(c),_=n(5),p=o(_),h=function(){function e(){if(i(this,e),this.__state=s["default"].apply(this,arguments),this.__state===!1)throw new Error("Failed to interpret color arguments");this.__state.a=this.__state.a||1}return e.prototype.toString=function(){return(0,f["default"])(this)},e.prototype.toHexString=function(){return(0,f["default"])(this,!0)},e.prototype.toOriginal=function(){return this.__state.conversion.write(this)},e}();h.recalculateRGB=function(e,t,n){if("HEX"===e.__state.space)e.__state[t]=d["default"].component_from_hex(e.__state.hex,n);else{if("HSV"!==e.__state.space)throw new Error("Corrupted color state");p["default"].extend(e.__state,d["default"].hsv_to_rgb(e.__state.h,e.__state.s,e.__state.v))}},h.recalculateHSV=function(e){var t=d["default"].rgb_to_hsv(e.r,e.g,e.b);p["default"].extend(e.__state,{s:t.s,v:t.v}),p["default"].isNaN(t.h)?p["default"].isUndefined(e.__state.h)&&(e.__state.h=0):e.__state.h=t.h},h.COMPONENTS=["r","g","b","h","s","v","hex","a"],r(h.prototype,"r",2),r(h.prototype,"g",1),r(h.prototype,"b",0),a(h.prototype,"h"),a(h.prototype,"s"),a(h.prototype,"v"),Object.defineProperty(h.prototype,"a",{get:function(){return this.__state.a},set:function(e){this.__state.a=e}}),Object.defineProperty(h.prototype,"hex",{get:function(){return"HEX"!==!this.__state.space&&(this.__state.hex=d["default"].rgb_to_hex(this.r,this.g,this.b)),this.__state.hex},set:function(e){this.__state.space="HEX",this.__state.hex=e}}),t["default"]=h},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}t.__esModule=!0;var i=n(4),r=o(i),a=n(5),l=o(a),s=[{litmus:l["default"].isString,conversions:{THREE_CHAR_HEX:{read:function(e){var t=e.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);return null!==t&&{space:"HEX",hex:parseInt("0x"+t[1].toString()+t[1].toString()+t[2].toString()+t[2].toString()+t[3].toString()+t[3].toString(),0)}},write:r["default"]},SIX_CHAR_HEX:{read:function(e){var t=e.match(/^#([A-F0-9]{6})$/i);return null!==t&&{space:"HEX",hex:parseInt("0x"+t[1].toString(),0)}},write:r["default"]},CSS_RGB:{read:function(e){var t=e.match(/^rgb\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/);return null!==t&&{space:"RGB",r:parseFloat(t[1]),g:parseFloat(t[2]),b:parseFloat(t[3])}},write:r["default"]},CSS_RGBA:{read:function(e){var t=e.match(/^rgba\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/);return null!==t&&{space:"RGB",r:parseFloat(t[1]),g:parseFloat(t[2]),b:parseFloat(t[3]),a:parseFloat(t[4])}},write:r["default"]}}},{litmus:l["default"].isNumber,conversions:{HEX:{read:function(e){return{space:"HEX",hex:e,conversionName:"HEX"}},write:function(e){return e.hex}}}},{litmus:l["default"].isArray,conversions:{RGB_ARRAY:{read:function(e){return 3===e.length&&{space:"RGB",r:e[0],g:e[1],b:e[2]}},write:function(e){return[e.r,e.g,e.b]}},RGBA_ARRAY:{read:function(e){return 4===e.length&&{space:"RGB",r:e[0],g:e[1],b:e[2],a:e[3]}},write:function(e){return[e.r,e.g,e.b,e.a]}}}},{litmus:l["default"].isObject,conversions:{RGBA_OBJ:{read:function(e){return!!(l["default"].isNumber(e.r)&&l["default"].isNumber(e.g)&&l["default"].isNumber(e.b)&&l["default"].isNumber(e.a))&&{space:"RGB",r:e.r,g:e.g,b:e.b,a:e.a}},write:function(e){return{r:e.r,g:e.g,b:e.b,a:e.a}}},RGB_OBJ:{read:function(e){return!!(l["default"].isNumber(e.r)&&l["default"].isNumber(e.g)&&l["default"].isNumber(e.b))&&{space:"RGB",r:e.r,g:e.g,b:e.b}},write:function(e){return{r:e.r,g:e.g,b:e.b}}},HSVA_OBJ:{read:function(e){return!!(l["default"].isNumber(e.h)&&l["default"].isNumber(e.s)&&l["default"].isNumber(e.v)&&l["default"].isNumber(e.a))&&{space:"HSV",h:e.h,s:e.s,v:e.v,a:e.a}},write:function(e){return{h:e.h,s:e.s,v:e.v,a:e.a}}},HSV_OBJ:{read:function(e){return!!(l["default"].isNumber(e.h)&&l["default"].isNumber(e.s)&&l["default"].isNumber(e.v))&&{space:"HSV",h:e.h,s:e.s,v:e.v}},write:function(e){return{h:e.h,s:e.s,v:e.v}}}}}],u=void 0,d=void 0,c=function(){d=!1;var e=arguments.length>1?l["default"].toArray(arguments):arguments[0];return l["default"].each(s,function(t){if(t.litmus(e))return l["default"].each(t.conversions,function(t,n){if(u=t.read(e),d===!1&&u!==!1)return d=u,u.conversionName=n,u.conversion=t,l["default"].BREAK}),l["default"].BREAK}),d};t["default"]=c},function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e,t){var n=e.__state.conversionName.toString(),o=Math.round(e.r),i=Math.round(e.g),r=Math.round(e.b),a=e.a,l=Math.round(e.h),s=e.s.toFixed(1),u=e.v.toFixed(1);if(t||"THREE_CHAR_HEX"===n||"SIX_CHAR_HEX"===n){for(var d=e.hex.toString(16);d.length<6;)d="0"+d;return"#"+d}return"CSS_RGB"===n?"rgb("+o+","+i+","+r+")":"CSS_RGBA"===n?"rgba("+o+","+i+","+r+","+a+")":"HEX"===n?"0x"+e.hex.toString(16):"RGB_ARRAY"===n?"["+o+","+i+","+r+"]":"RGBA_ARRAY"===n?"["+o+","+i+","+r+","+a+"]":"RGB_OBJ"===n?"{r:"+o+",g:"+i+",b:"+r+"}":"RGBA_OBJ"===n?"{r:"+o+",g:"+i+",b:"+r+",a:"+a+"}":"HSV_OBJ"===n?"{h:"+l+",s:"+s+",v:"+u+"}":"HSVA_OBJ"===n?"{h:"+l+",s:"+s+",v:"+u+",a:"+a+"}":"unknown format"}},function(e,t){"use strict";t.__esModule=!0;var n=Array.prototype.forEach,o=Array.prototype.slice,i={BREAK:{},extend:function(e){return this.each(o.call(arguments,1),function(t){var n=this.isObject(t)?Object.keys(t):[];n.forEach(function(n){this.isUndefined(t[n])||(e[n]=t[n])}.bind(this))},this),e},defaults:function(e){return this.each(o.call(arguments,1),function(t){var n=this.isObject(t)?Object.keys(t):[];n.forEach(function(n){this.isUndefined(e[n])&&(e[n]=t[n])}.bind(this))},this),e},compose:function(){var e=o.call(arguments);return function(){for(var t=o.call(arguments),n=e.length-1;n>=0;n--)t=[e[n].apply(this,t)];return t[0]}},each:function(e,t,o){if(e)if(n&&e.forEach&&e.forEach===n)e.forEach(t,o);else if(e.length===e.length+0){var i=void 0,r=void 0;for(i=0,r=e.length;i<r;i++)if(i in e&&t.call(o,e[i],i)===this.BREAK)return}else for(var a in e)if(t.call(o,e[a],a)===this.BREAK)return},defer:function(e){setTimeout(e,0)},debounce:function(e,t,n){var o=void 0;return function(){function i(){o=null,n||e.apply(r,a)}var r=this,a=arguments,l=n||!o;clearTimeout(o),o=setTimeout(i,t),l&&e.apply(r,a)}},toArray:function(e){return e.toArray?e.toArray():o.call(e)},isUndefined:function(e){return void 0===e},isNull:function(e){return null===e},isNaN:function(e){function t(t){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}(function(e){return isNaN(e)}),isArray:Array.isArray||function(e){return e.constructor===Array},isObject:function(e){return e===Object(e)},isNumber:function(e){return e===e+0},isString:function(e){return e===e+""},isBoolean:function(e){return e===!1||e===!0},isFunction:function(e){return"[object Function]"===Object.prototype.toString.call(e)}};t["default"]=i},function(e,t){"use strict";t.__esModule=!0;var n=void 0,o={hsv_to_rgb:function(e,t,n){var o=Math.floor(e/60)%6,i=e/60-Math.floor(e/60),r=n*(1-t),a=n*(1-i*t),l=n*(1-(1-i)*t),s=[[n,l,r],[a,n,r],[r,n,l],[r,a,n],[l,r,n],[n,r,a]][o];return{r:255*s[0],g:255*s[1],b:255*s[2]}},rgb_to_hsv:function(e,t,n){var o=Math.min(e,t,n),i=Math.max(e,t,n),r=i-o,a=void 0,l=void 0;return 0===i?{h:NaN,s:0,v:0}:(l=r/i,a=e===i?(t-n)/r:t===i?2+(n-e)/r:4+(e-t)/r,a/=6,a<0&&(a+=1),{h:360*a,s:l,v:i/255})},rgb_to_hex:function(e,t,n){var o=this.hex_with_component(0,2,e);return o=this.hex_with_component(o,1,t),o=this.hex_with_component(o,0,n)},component_from_hex:function(e,t){return e>>8*t&255},hex_with_component:function(e,t,o){return o<<(n=8*t)|e&~(255<<n)}};t["default"]=o},function(e,t){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var o=function(){function e(t,o){n(this,e),this.initialValue=t[o],this.domElement=document.createElement("div"),this.object=t,this.property=o,this.__onChange=void 0,this.__onFinishChange=void 0}return e.prototype.onChange=function(e){return this.__onChange=e,this},e.prototype.onFinishChange=function(e){return this.__onFinishChange=e,this},e.prototype.setValue=function(e){return this.object[this.property]=e,this.__onChange&&this.__onChange.call(this,e),this.updateDisplay(),this},e.prototype.getValue=function(){return this.object[this.property]},e.prototype.updateDisplay=function(){return this},e.prototype.isModified=function(){return this.initialValue!==this.getValue()},e}();t["default"]=o},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var l=n(7),s=o(l),u=n(9),d=o(u),c=function(e){function t(n,o){function a(){s.setValue(!s.__prev)}i(this,t);var l=r(this,e.call(this,n,o)),s=l;return l.__prev=l.getValue(),l.__checkbox=document.createElement("input"),l.__checkbox.setAttribute("type","checkbox"),d["default"].bind(l.__checkbox,"change",a,!1),l.domElement.appendChild(l.__checkbox),l.updateDisplay(),l}return a(t,e),t.prototype.setValue=function(t){var n=e.prototype.setValue.call(this,t);return this.__onFinishChange&&this.__onFinishChange.call(this,this.getValue()),this.__prev=this.getValue(),n},t.prototype.updateDisplay=function(){return this.getValue()===!0?(this.__checkbox.setAttribute("checked","checked"),this.__checkbox.checked=!0,this.__prev=!0):(this.__checkbox.checked=!1,this.__prev=!1),e.prototype.updateDisplay.call(this)},t}(s["default"]);t["default"]=c},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}function i(e){if("0"===e||a["default"].isUndefined(e))return 0;var t=e.match(u);return a["default"].isNull(t)?0:parseFloat(t[1])}t.__esModule=!0;var r=n(5),a=o(r),l={HTMLEvents:["change"],MouseEvents:["click","mousemove","mousedown","mouseup","mouseover"],KeyboardEvents:["keydown"]},s={};a["default"].each(l,function(e,t){a["default"].each(e,function(e){s[e]=t})});var u=/(\d+(\.\d+)?)px/,d={makeSelectable:function(e,t){void 0!==e&&void 0!==e.style&&(e.onselectstart=t?function(){return!1}:function(){},e.style.MozUserSelect=t?"auto":"none",e.style.KhtmlUserSelect=t?"auto":"none",e.unselectable=t?"on":"off")},makeFullscreen:function(e,t,n){var o=n,i=t;a["default"].isUndefined(i)&&(i=!0),a["default"].isUndefined(o)&&(o=!0),e.style.position="absolute",i&&(e.style.left=0,e.style.right=0),o&&(e.style.top=0,e.style.bottom=0)},fakeEvent:function(e,t,n,o){var i=n||{},r=s[t];if(!r)throw new Error("Event type "+t+" not supported.");var l=document.createEvent(r);switch(r){case"MouseEvents":var u=i.x||i.clientX||0,d=i.y||i.clientY||0;l.initMouseEvent(t,i.bubbles||!1,i.cancelable||!0,window,i.clickCount||1,0,0,u,d,!1,!1,!1,!1,0,null);break;case"KeyboardEvents":var c=l.initKeyboardEvent||l.initKeyEvent;a["default"].defaults(i,{cancelable:!0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,keyCode:void 0,charCode:void 0}),c(t,i.bubbles||!1,i.cancelable,window,i.ctrlKey,i.altKey,i.shiftKey,i.metaKey,i.keyCode,i.charCode);break;default:l.initEvent(t,i.bubbles||!1,i.cancelable||!0)}a["default"].defaults(l,o),e.dispatchEvent(l)},bind:function(e,t,n,o){var i=o||!1;return e.addEventListener?e.addEventListener(t,n,i):e.attachEvent&&e.attachEvent("on"+t,n),d},unbind:function(e,t,n,o){var i=o||!1;return e.removeEventListener?e.removeEventListener(t,n,i):e.detachEvent&&e.detachEvent("on"+t,n),d},addClass:function(e,t){if(void 0===e.className)e.className=t;else if(e.className!==t){var n=e.className.split(/ +/);n.indexOf(t)===-1&&(n.push(t),e.className=n.join(" ").replace(/^\s+/,"").replace(/\s+$/,""))}return d},removeClass:function(e,t){if(t)if(e.className===t)e.removeAttribute("class");else{var n=e.className.split(/ +/),o=n.indexOf(t);o!==-1&&(n.splice(o,1),e.className=n.join(" "))}else e.className=void 0;return d},hasClass:function(e,t){return new RegExp("(?:^|\\s+)"+t+"(?:\\s+|$)").test(e.className)||!1},getWidth:function(e){var t=getComputedStyle(e);return i(t["border-left-width"])+i(t["border-right-width"])+i(t["padding-left"])+i(t["padding-right"])+i(t.width)},getHeight:function(e){var t=getComputedStyle(e);return i(t["border-top-width"])+i(t["border-bottom-width"])+i(t["padding-top"])+i(t["padding-bottom"])+i(t.height)},getOffset:function(e){var t=e,n={left:0,top:0};if(t.offsetParent)do n.left+=t.offsetLeft,n.top+=t.offsetTop,t=t.offsetParent;while(t);return n},isActive:function(e){return e===document.activeElement&&(e.type||e.href)}};t["default"]=d},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var l=n(7),s=o(l),u=n(9),d=o(u),c=n(5),f=o(c),_=function(e){function t(n,o,a){i(this,t);var l=r(this,e.call(this,n,o)),s=a,u=l;return l.__select=document.createElement("select"),f["default"].isArray(s)&&!function(){var e={};f["default"].each(s,function(t){e[t]=t}),s=e}(),f["default"].each(s,function(e,t){var n=document.createElement("option");n.innerHTML=t,n.setAttribute("value",e),u.__select.appendChild(n)}),l.updateDisplay(),d["default"].bind(l.__select,"change",function(){var e=this.options[this.selectedIndex].value;u.setValue(e)}),l.domElement.appendChild(l.__select),l}return a(t,e),t.prototype.setValue=function(t){var n=e.prototype.setValue.call(this,t);return this.__onFinishChange&&this.__onFinishChange.call(this,this.getValue()),n},t.prototype.updateDisplay=function(){return d["default"].isActive(this.__select)?this:(this.__select.value=this.getValue(),e.prototype.updateDisplay.call(this))},t}(s["default"]);t["default"]=_},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var l=n(7),s=o(l),u=n(9),d=o(u),c=function(e){function t(n,o){function a(){u.setValue(u.__input.value)}function l(){u.__onFinishChange&&u.__onFinishChange.call(u,u.getValue())}i(this,t);var s=r(this,e.call(this,n,o)),u=s;return s.__input=document.createElement("input"),s.__input.setAttribute("type","text"),d["default"].bind(s.__input,"keyup",a),d["default"].bind(s.__input,"change",a),d["default"].bind(s.__input,"blur",l),d["default"].bind(s.__input,"keydown",function(e){13===e.keyCode&&this.blur()}),s.updateDisplay(),s.domElement.appendChild(s.__input),s}return a(t,e),t.prototype.updateDisplay=function(){return d["default"].isActive(this.__input)||(this.__input.value=this.getValue()),e.prototype.updateDisplay.call(this)},t}(s["default"]);t["default"]=c},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function l(e){var t=e.toString();return t.indexOf(".")>-1?t.length-t.indexOf(".")-1:0}t.__esModule=!0;var s=n(7),u=o(s),d=n(5),c=o(d),f=function(e){function t(n,o,a){i(this,t);var s=r(this,e.call(this,n,o)),u=a||{};return s.__min=u.min,s.__max=u.max,s.__step=u.step,c["default"].isUndefined(s.__step)?0===s.initialValue?s.__impliedStep=1:s.__impliedStep=Math.pow(10,Math.floor(Math.log(Math.abs(s.initialValue))/Math.LN10))/10:s.__impliedStep=s.__step,s.__precision=l(s.__impliedStep),s}return a(t,e),t.prototype.setValue=function(t){var n=t;return void 0!==this.__min&&n<this.__min?n=this.__min:void 0!==this.__max&&n>this.__max&&(n=this.__max),void 0!==this.__step&&n%this.__step!==0&&(n=Math.round(n/this.__step)*this.__step),e.prototype.setValue.call(this,n)},t.prototype.min=function(e){return this.__min=e,this},t.prototype.max=function(e){return this.__max=e,this},t.prototype.step=function(e){return this.__step=e,this.__impliedStep=e,this.__precision=l(e),this},t}(u["default"]);t["default"]=f},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function l(e,t){var n=Math.pow(10,t);return Math.round(e*n)/n}t.__esModule=!0;var s=n(12),u=o(s),d=n(9),c=o(d),f=n(5),_=o(f),p=function(e){function t(n,o,a){function l(){var e=parseFloat(m.__input.value);_["default"].isNaN(e)||m.setValue(e)}function s(){m.__onFinishChange&&m.__onFinishChange.call(m,m.getValue())}function u(){s()}function d(e){var t=b-e.clientY;m.setValue(m.getValue()+t*m.__impliedStep),b=e.clientY}function f(){c["default"].unbind(window,"mousemove",d),c["default"].unbind(window,"mouseup",f),s()}function p(e){c["default"].bind(window,"mousemove",d),c["default"].bind(window,"mouseup",f),b=e.clientY}i(this,t);var h=r(this,e.call(this,n,o,a));h.__truncationSuspended=!1;var m=h,b=void 0;return h.__input=document.createElement("input"),h.__input.setAttribute("type","text"),c["default"].bind(h.__input,"change",l),c["default"].bind(h.__input,"blur",u),c["default"].bind(h.__input,"mousedown",p),c["default"].bind(h.__input,"keydown",function(e){13===e.keyCode&&(m.__truncationSuspended=!0,this.blur(),m.__truncationSuspended=!1,s())}),h.updateDisplay(),h.domElement.appendChild(h.__input),h}return a(t,e),t.prototype.updateDisplay=function(){return this.__input.value=this.__truncationSuspended?this.getValue():l(this.getValue(),this.__precision),e.prototype.updateDisplay.call(this)},t}(u["default"]);t["default"]=p},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function l(e,t,n,o,i){return o+(i-o)*((e-t)/(n-t))}t.__esModule=!0;var s=n(12),u=o(s),d=n(9),c=o(d),f=function(e){function t(n,o,a,s,u){function d(e){document.activeElement.blur(),c["default"].bind(window,"mousemove",f),c["default"].bind(window,"mouseup",_),f(e)}function f(e){e.preventDefault();var t=h.__background.getBoundingClientRect();return h.setValue(l(e.clientX,t.left,t.right,h.__min,h.__max)),!1}function _(){c["default"].unbind(window,"mousemove",f),c["default"].unbind(window,"mouseup",_),h.__onFinishChange&&h.__onFinishChange.call(h,h.getValue())}i(this,t);var p=r(this,e.call(this,n,o,{min:a,max:s,step:u})),h=p;return p.__background=document.createElement("div"),p.__foreground=document.createElement("div"),c["default"].bind(p.__background,"mousedown",d),c["default"].addClass(p.__background,"slider"),c["default"].addClass(p.__foreground,"slider-fg"),p.updateDisplay(),p.__background.appendChild(p.__foreground),p.domElement.appendChild(p.__background),p}return a(t,e),t.prototype.updateDisplay=function(){var t=(this.getValue()-this.__min)/(this.__max-this.__min);return this.__foreground.style.width=100*t+"%",e.prototype.updateDisplay.call(this)},t}(u["default"]);t["default"]=f},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var l=n(7),s=o(l),u=n(9),d=o(u),c=function(e){function t(n,o,a){i(this,t);var l=r(this,e.call(this,n,o)),s=l;return l.__button=document.createElement("div"),l.__button.innerHTML=void 0===a?"Fire":a,d["default"].bind(l.__button,"click",function(e){return e.preventDefault(),s.fire(),!1}),d["default"].addClass(l.__button,"button"),l.domElement.appendChild(l.__button),l}return a(t,e),t.prototype.fire=function(){this.__onChange&&this.__onChange.call(this),this.getValue().call(this.object),this.__onFinishChange&&this.__onFinishChange.call(this,this.getValue())},t}(s["default"]);t["default"]=c},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function l(e,t,n,o){e.style.background="",g["default"].each(y,function(i){e.style.cssText+="background: "+i+"linear-gradient("+t+", "+n+" 0%, "+o+" 100%); "})}function s(e){e.style.background="",e.style.cssText+="background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);",e.style.cssText+="background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);",e.style.cssText+="background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);",e.style.cssText+="background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);",e.style.cssText+="background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);"}t.__esModule=!0;var u=n(7),d=o(u),c=n(9),f=o(c),_=n(2),p=o(_),h=n(3),m=o(h),b=n(5),g=o(b),v=function(e){function t(n,o){function a(e){h(e),f["default"].bind(window,"mousemove",h),f["default"].bind(window,"mouseup",u)}function u(){f["default"].unbind(window,"mousemove",h),f["default"].unbind(window,"mouseup",u),_()}function d(){var e=(0,m["default"])(this.value);e!==!1?(y.__color.__state=e,y.setValue(y.__color.toOriginal())):this.value=y.__color.toString()}function c(){f["default"].unbind(window,"mousemove",b),f["default"].unbind(window,"mouseup",c),_()}function _(){y.__onFinishChange&&y.__onFinishChange.call(y,y.__color.toOriginal())}function h(e){e.preventDefault();var t=y.__saturation_field.getBoundingClientRect(),n=(e.clientX-t.left)/(t.right-t.left),o=1-(e.clientY-t.top)/(t.bottom-t.top);return o>1?o=1:o<0&&(o=0),n>1?n=1:n<0&&(n=0),y.__color.v=o,y.__color.s=n,y.setValue(y.__color.toOriginal()),!1}function b(e){e.preventDefault();var t=y.__hue_field.getBoundingClientRect(),n=1-(e.clientY-t.top)/(t.bottom-t.top);return n>1?n=1:n<0&&(n=0),y.__color.h=360*n,y.setValue(y.__color.toOriginal()),!1}i(this,t);var v=r(this,e.call(this,n,o));v.__color=new p["default"](v.getValue()),v.__temp=new p["default"](0);var y=v;v.domElement=document.createElement("div"),f["default"].makeSelectable(v.domElement,!1),v.__selector=document.createElement("div"),v.__selector.className="selector",v.__saturation_field=document.createElement("div"),v.__saturation_field.className="saturation-field",v.__field_knob=document.createElement("div"),v.__field_knob.className="field-knob",v.__field_knob_border="2px solid ",v.__hue_knob=document.createElement("div"),v.__hue_knob.className="hue-knob",v.__hue_field=document.createElement("div"),v.__hue_field.className="hue-field",v.__input=document.createElement("input"),v.__input.type="text",v.__input_textShadow="0 1px 1px ",f["default"].bind(v.__input,"keydown",function(e){13===e.keyCode&&d.call(this)}),f["default"].bind(v.__input,"blur",d),f["default"].bind(v.__selector,"mousedown",function(){f["default"].addClass(this,"drag").bind(window,"mouseup",function(){f["default"].removeClass(y.__selector,"drag")})});var w=document.createElement("div");return g["default"].extend(v.__selector.style,{width:"122px",height:"102px",padding:"3px",backgroundColor:"#222",boxShadow:"0px 1px 3px rgba(0,0,0,0.3)"}),g["default"].extend(v.__field_knob.style,{position:"absolute",width:"12px",height:"12px",border:v.__field_knob_border+(v.__color.v<.5?"#fff":"#000"),boxShadow:"0px 1px 3px rgba(0,0,0,0.5)",borderRadius:"12px",zIndex:1}),g["default"].extend(v.__hue_knob.style,{position:"absolute",width:"15px",height:"2px",borderRight:"4px solid #fff",zIndex:1}),g["default"].extend(v.__saturation_field.style,{width:"100px",height:"100px",border:"1px solid #555",marginRight:"3px",display:"inline-block",cursor:"pointer"}),g["default"].extend(w.style,{width:"100%",height:"100%",background:"none"}),l(w,"top","rgba(0,0,0,0)","#000"),g["default"].extend(v.__hue_field.style,{width:"15px",height:"100px",border:"1px solid #555",cursor:"ns-resize",position:"absolute",top:"3px",right:"3px"}),s(v.__hue_field),g["default"].extend(v.__input.style,{outline:"none",textAlign:"center",color:"#fff",border:0,fontWeight:"bold",textShadow:v.__input_textShadow+"rgba(0,0,0,0.7)"}),f["default"].bind(v.__saturation_field,"mousedown",a),f["default"].bind(v.__field_knob,"mousedown",a),f["default"].bind(v.__hue_field,"mousedown",function(e){b(e),f["default"].bind(window,"mousemove",b),f["default"].bind(window,"mouseup",c)}),v.__saturation_field.appendChild(w),v.__selector.appendChild(v.__field_knob),v.__selector.appendChild(v.__saturation_field),v.__selector.appendChild(v.__hue_field),v.__hue_field.appendChild(v.__hue_knob),v.domElement.appendChild(v.__input),v.domElement.appendChild(v.__selector),v.updateDisplay(),v}return a(t,e),t.prototype.updateDisplay=function(){var e=(0,m["default"])(this.getValue());if(e!==!1){var t=!1;g["default"].each(p["default"].COMPONENTS,function(n){if(!g["default"].isUndefined(e[n])&&!g["default"].isUndefined(this.__color.__state[n])&&e[n]!==this.__color.__state[n])return t=!0,{}},this),t&&g["default"].extend(this.__color.__state,e)}g["default"].extend(this.__temp.__state,this.__color.__state),this.__temp.a=1;var n=this.__color.v<.5||this.__color.s>.5?255:0,o=255-n;g["default"].extend(this.__field_knob.style,{marginLeft:100*this.__color.s-7+"px",marginTop:100*(1-this.__color.v)-7+"px",backgroundColor:this.__temp.toHexString(),border:this.__field_knob_border+"rgb("+n+","+n+","+n+")"}),this.__hue_knob.style.marginTop=100*(1-this.__color.h/360)+"px",this.__temp.s=1,this.__temp.v=1,l(this.__saturation_field,"left","#fff",this.__temp.toHexString()),this.__input.value=this.__color.toString(),g["default"].extend(this.__input.style,{backgroundColor:this.__color.toHexString(),color:"rgb("+n+","+n+","+n+")",textShadow:this.__input_textShadow+"rgba("+o+","+o+","+o+",.7)"})},t}(d["default"]),y=["-moz-","-o-","-webkit-","-ms-",""];t["default"]=v},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}function i(e,t,n){var o=document.createElement("li");return t&&o.appendChild(t),n?e.__ul.insertBefore(o,n):e.__ul.appendChild(o),e.onResize(),o}function r(e,t){var n=e.__preset_select[e.__preset_select.selectedIndex];t?n.innerHTML=n.value+"*":n.innerHTML=n.value}function a(e,t,n){if(n.__li=t,n.__gui=e,U["default"].extend(n,{options:function(t){if(arguments.length>1){var o=n.__li.nextElementSibling;return n.remove(),s(e,n.object,n.property,{before:o,factoryArgs:[U["default"].toArray(arguments)]})}if(U["default"].isArray(t)||U["default"].isObject(t)){var i=n.__li.nextElementSibling;return n.remove(),s(e,n.object,n.property,{before:i,factoryArgs:[t]})}},name:function(e){return n.__li.firstElementChild.firstElementChild.innerHTML=e, +n},listen:function(){return n.__gui.listen(n),n},remove:function(){return n.__gui.remove(n),n}}),n instanceof M["default"])!function(){var e=new B["default"](n.object,n.property,{min:n.__min,max:n.__max,step:n.__step});U["default"].each(["updateDisplay","onChange","onFinishChange","step"],function(t){var o=n[t],i=e[t];n[t]=e[t]=function(){var t=Array.prototype.slice.call(arguments);return i.apply(e,t),o.apply(n,t)}}),z["default"].addClass(t,"has-slider"),n.domElement.insertBefore(e.domElement,n.domElement.firstElementChild)}();else if(n instanceof B["default"]){var o=function(t){if(U["default"].isNumber(n.__min)&&U["default"].isNumber(n.__max)){var o=n.__li.firstElementChild.firstElementChild.innerHTML,i=n.__gui.__listening.indexOf(n)>-1;n.remove();var r=s(e,n.object,n.property,{before:n.__li.nextElementSibling,factoryArgs:[n.__min,n.__max,n.__step]});return r.name(o),i&&r.listen(),r}return t};n.min=U["default"].compose(o,n.min),n.max=U["default"].compose(o,n.max)}else n instanceof O["default"]?(z["default"].bind(t,"click",function(){z["default"].fakeEvent(n.__checkbox,"click")}),z["default"].bind(n.__checkbox,"click",function(e){e.stopPropagation()})):n instanceof R["default"]?(z["default"].bind(t,"click",function(){z["default"].fakeEvent(n.__button,"click")}),z["default"].bind(t,"mouseover",function(){z["default"].addClass(n.__button,"hover")}),z["default"].bind(t,"mouseout",function(){z["default"].removeClass(n.__button,"hover")})):n instanceof j["default"]&&(z["default"].addClass(t,"color"),n.updateDisplay=U["default"].compose(function(e){return t.style.borderLeftColor=n.__color.toString(),e},n.updateDisplay),n.updateDisplay());n.setValue=U["default"].compose(function(t){return e.getRoot().__preset_select&&n.isModified()&&r(e.getRoot(),!0),t},n.setValue)}function l(e,t){var n=e.getRoot(),o=n.__rememberedObjects.indexOf(t.object);if(o!==-1){var i=n.__rememberedObjectIndecesToControllers[o];if(void 0===i&&(i={},n.__rememberedObjectIndecesToControllers[o]=i),i[t.property]=t,n.load&&n.load.remembered){var r=n.load.remembered,a=void 0;if(r[e.preset])a=r[e.preset];else{if(!r[Q])return;a=r[Q]}if(a[o]&&void 0!==a[o][t.property]){var l=a[o][t.property];t.initialValue=l,t.setValue(l)}}}}function s(e,t,n,o){if(void 0===t[n])throw new Error('Object "'+t+'" has no property "'+n+'"');var r=void 0;if(o.color)r=new j["default"](t,n);else{var s=[t,n].concat(o.factoryArgs);r=C["default"].apply(e,s)}o.before instanceof S["default"]&&(o.before=o.before.__li),l(e,r),z["default"].addClass(r.domElement,"c");var u=document.createElement("span");z["default"].addClass(u,"property-name"),u.innerHTML=r.property;var d=document.createElement("div");d.appendChild(u),d.appendChild(r.domElement);var c=i(e,d,o.before);return z["default"].addClass(c,oe.CLASS_CONTROLLER_ROW),r instanceof j["default"]?z["default"].addClass(c,"color"):z["default"].addClass(c,g(r.getValue())),a(e,c,r),e.__controllers.push(r),r}function u(e,t){return document.location.href+"."+t}function d(e,t,n){var o=document.createElement("option");o.innerHTML=t,o.value=t,e.__preset_select.appendChild(o),n&&(e.__preset_select.selectedIndex=e.__preset_select.length-1)}function c(e,t){t.style.display=e.useLocalStorage?"block":"none"}function f(e){var t=e.__save_row=document.createElement("li");z["default"].addClass(e.domElement,"has-save"),e.__ul.insertBefore(t,e.__ul.firstChild),z["default"].addClass(t,"save-row");var n=document.createElement("span");n.innerHTML=" ",z["default"].addClass(n,"button gears");var o=document.createElement("span");o.innerHTML="Save",z["default"].addClass(o,"button"),z["default"].addClass(o,"save");var i=document.createElement("span");i.innerHTML="New",z["default"].addClass(i,"button"),z["default"].addClass(i,"save-as");var r=document.createElement("span");r.innerHTML="Revert",z["default"].addClass(r,"button"),z["default"].addClass(r,"revert");var a=e.__preset_select=document.createElement("select");e.load&&e.load.remembered?U["default"].each(e.load.remembered,function(t,n){d(e,n,n===e.preset)}):d(e,Q,!1),z["default"].bind(a,"change",function(){for(var t=0;t<e.__preset_select.length;t++)e.__preset_select[t].innerHTML=e.__preset_select[t].value;e.preset=this.value}),t.appendChild(a),t.appendChild(n),t.appendChild(o),t.appendChild(i),t.appendChild(r),q&&!function(){var t=document.getElementById("dg-local-explain"),n=document.getElementById("dg-local-storage"),o=document.getElementById("dg-save-locally");o.style.display="block","true"===localStorage.getItem(u(e,"isLocal"))&&n.setAttribute("checked","checked"),c(e,t),z["default"].bind(n,"change",function(){e.useLocalStorage=!e.useLocalStorage,c(e,t)})}();var l=document.getElementById("dg-new-constructor");z["default"].bind(l,"keydown",function(e){!e.metaKey||67!==e.which&&67!==e.keyCode||Z.hide()}),z["default"].bind(n,"click",function(){l.innerHTML=JSON.stringify(e.getSaveObject(),void 0,2),Z.show(),l.focus(),l.select()}),z["default"].bind(o,"click",function(){e.save()}),z["default"].bind(i,"click",function(){var t=prompt("Enter a new preset name.");t&&e.saveAs(t)}),z["default"].bind(r,"click",function(){e.revert()})}function _(e){function t(t){return t.preventDefault(),e.width+=i-t.clientX,e.onResize(),i=t.clientX,!1}function n(){z["default"].removeClass(e.__closeButton,oe.CLASS_DRAG),z["default"].unbind(window,"mousemove",t),z["default"].unbind(window,"mouseup",n)}function o(o){return o.preventDefault(),i=o.clientX,z["default"].addClass(e.__closeButton,oe.CLASS_DRAG),z["default"].bind(window,"mousemove",t),z["default"].bind(window,"mouseup",n),!1}var i=void 0;e.__resize_handle=document.createElement("div"),U["default"].extend(e.__resize_handle.style,{width:"6px",marginLeft:"-3px",height:"200px",cursor:"ew-resize",position:"absolute"}),z["default"].bind(e.__resize_handle,"mousedown",o),z["default"].bind(e.__closeButton,"mousedown",o),e.domElement.insertBefore(e.__resize_handle,e.domElement.firstElementChild)}function p(e,t){e.domElement.style.width=t+"px",e.__save_row&&e.autoPlace&&(e.__save_row.style.width=t+"px"),e.__closeButton&&(e.__closeButton.style.width=t+"px")}function h(e,t){var n={};return U["default"].each(e.__rememberedObjects,function(o,i){var r={},a=e.__rememberedObjectIndecesToControllers[i];U["default"].each(a,function(e,n){r[n]=t?e.initialValue:e.getValue()}),n[i]=r}),n}function m(e){for(var t=0;t<e.__preset_select.length;t++)e.__preset_select[t].value===e.preset&&(e.__preset_select.selectedIndex=t)}function b(e){0!==e.length&&D["default"].call(window,function(){b(e)}),U["default"].each(e,function(e){e.updateDisplay()})}var g="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol?"symbol":typeof e},v=n(18),y=o(v),w=n(19),x=o(w),E=n(20),C=o(E),A=n(7),S=o(A),k=n(8),O=o(k),T=n(15),R=o(T),L=n(13),B=o(L),N=n(14),M=o(N),H=n(16),j=o(H),P=n(21),D=o(P),V=n(22),F=o(V),I=n(9),z=o(I),G=n(5),U=o(G),X=n(23),K=o(X);y["default"].inject(K["default"]);var Y="dg",J=72,W=20,Q="Default",q=function(){try{return"localStorage"in window&&null!==window.localStorage}catch(e){return!1}}(),Z=void 0,$=!0,ee=void 0,te=!1,ne=[],oe=function ie(e){function t(){var e=n.getRoot();e.width+=1,U["default"].defer(function(){e.width-=1})}var n=this,o=e||{};this.domElement=document.createElement("div"),this.__ul=document.createElement("ul"),this.domElement.appendChild(this.__ul),z["default"].addClass(this.domElement,Y),this.__folders={},this.__controllers=[],this.__rememberedObjects=[],this.__rememberedObjectIndecesToControllers=[],this.__listening=[],o=U["default"].defaults(o,{closeOnTop:!1,autoPlace:!0,width:ie.DEFAULT_WIDTH}),o=U["default"].defaults(o,{resizable:o.autoPlace,hideable:o.autoPlace}),U["default"].isUndefined(o.load)?o.load={preset:Q}:o.preset&&(o.load.preset=o.preset),U["default"].isUndefined(o.parent)&&o.hideable&&ne.push(this),o.resizable=U["default"].isUndefined(o.parent)&&o.resizable,o.autoPlace&&U["default"].isUndefined(o.scrollable)&&(o.scrollable=!0);var r=q&&"true"===localStorage.getItem(u(this,"isLocal")),a=void 0;if(Object.defineProperties(this,{parent:{get:function(){return o.parent}},scrollable:{get:function(){return o.scrollable}},autoPlace:{get:function(){return o.autoPlace}},closeOnTop:{get:function(){return o.closeOnTop}},preset:{get:function(){return n.parent?n.getRoot().preset:o.load.preset},set:function(e){n.parent?n.getRoot().preset=e:o.load.preset=e,m(this),n.revert()}},width:{get:function(){return o.width},set:function(e){o.width=e,p(n,e)}},name:{get:function(){return o.name},set:function(e){o.name=e,titleRowName&&(titleRowName.innerHTML=o.name)}},closed:{get:function(){return o.closed},set:function(e){o.closed=e,o.closed?z["default"].addClass(n.__ul,ie.CLASS_CLOSED):z["default"].removeClass(n.__ul,ie.CLASS_CLOSED),this.onResize(),n.__closeButton&&(n.__closeButton.innerHTML=e?ie.TEXT_OPEN:ie.TEXT_CLOSED)}},load:{get:function(){return o.load}},useLocalStorage:{get:function(){return r},set:function(e){q&&(r=e,e?z["default"].bind(window,"unload",a):z["default"].unbind(window,"unload",a),localStorage.setItem(u(n,"isLocal"),e))}}}),U["default"].isUndefined(o.parent)){if(o.closed=!1,z["default"].addClass(this.domElement,ie.CLASS_MAIN),z["default"].makeSelectable(this.domElement,!1),q&&r){n.useLocalStorage=!0;var l=localStorage.getItem(u(this,"gui"));l&&(o.load=JSON.parse(l))}this.__closeButton=document.createElement("div"),this.__closeButton.innerHTML=ie.TEXT_CLOSED,z["default"].addClass(this.__closeButton,ie.CLASS_CLOSE_BUTTON),o.closeOnTop?(z["default"].addClass(this.__closeButton,ie.CLASS_CLOSE_TOP),this.domElement.insertBefore(this.__closeButton,this.domElement.childNodes[0])):(z["default"].addClass(this.__closeButton,ie.CLASS_CLOSE_BOTTOM),this.domElement.appendChild(this.__closeButton)),z["default"].bind(this.__closeButton,"click",function(){n.closed=!n.closed})}else{void 0===o.closed&&(o.closed=!0);var s=document.createTextNode(o.name);z["default"].addClass(s,"controller-name");var d=i(n,s),c=function(e){return e.preventDefault(),n.closed=!n.closed,!1};z["default"].addClass(this.__ul,ie.CLASS_CLOSED),z["default"].addClass(d,"title"),z["default"].bind(d,"click",c),o.closed||(this.closed=!1)}o.autoPlace&&(U["default"].isUndefined(o.parent)&&($&&(ee=document.createElement("div"),z["default"].addClass(ee,Y),z["default"].addClass(ee,ie.CLASS_AUTO_PLACE_CONTAINER),document.body.appendChild(ee),$=!1),ee.appendChild(this.domElement),z["default"].addClass(this.domElement,ie.CLASS_AUTO_PLACE)),this.parent||p(n,o.width)),this.__resizeHandler=function(){n.onResizeDebounced()},z["default"].bind(window,"resize",this.__resizeHandler),z["default"].bind(this.__ul,"webkitTransitionEnd",this.__resizeHandler),z["default"].bind(this.__ul,"transitionend",this.__resizeHandler),z["default"].bind(this.__ul,"oTransitionEnd",this.__resizeHandler),this.onResize(),o.resizable&&_(this),a=function(){q&&"true"===localStorage.getItem(u(n,"isLocal"))&&localStorage.setItem(u(n,"gui"),JSON.stringify(n.getSaveObject()))},this.saveToLocalStorageIfPossible=a,o.parent||t()};oe.toggleHide=function(){te=!te,U["default"].each(ne,function(e){e.domElement.style.display=te?"none":""})},oe.CLASS_AUTO_PLACE="a",oe.CLASS_AUTO_PLACE_CONTAINER="ac",oe.CLASS_MAIN="main",oe.CLASS_CONTROLLER_ROW="cr",oe.CLASS_TOO_TALL="taller-than-window",oe.CLASS_CLOSED="closed",oe.CLASS_CLOSE_BUTTON="close-button",oe.CLASS_CLOSE_TOP="close-top",oe.CLASS_CLOSE_BOTTOM="close-bottom",oe.CLASS_DRAG="drag",oe.DEFAULT_WIDTH=245,oe.TEXT_CLOSED="Close Controls",oe.TEXT_OPEN="Open Controls",oe._keydownHandler=function(e){"text"===document.activeElement.type||e.which!==J&&e.keyCode!==J||oe.toggleHide()},z["default"].bind(window,"keydown",oe._keydownHandler,!1),U["default"].extend(oe.prototype,{add:function(e,t){return s(this,e,t,{factoryArgs:Array.prototype.slice.call(arguments,2)})},addColor:function(e,t){return s(this,e,t,{color:!0})},remove:function(e){this.__ul.removeChild(e.__li),this.__controllers.splice(this.__controllers.indexOf(e),1);var t=this;U["default"].defer(function(){t.onResize()})},destroy:function(){this.autoPlace&&ee.removeChild(this.domElement),z["default"].unbind(window,"keydown",oe._keydownHandler,!1),z["default"].unbind(window,"resize",this.__resizeHandler),this.saveToLocalStorageIfPossible&&z["default"].unbind(window,"unload",this.saveToLocalStorageIfPossible)},addFolder:function(e){if(void 0!==this.__folders[e])throw new Error('You already have a folder in this GUI by the name "'+e+'"');var t={name:e,parent:this};t.autoPlace=this.autoPlace,this.load&&this.load.folders&&this.load.folders[e]&&(t.closed=this.load.folders[e].closed,t.load=this.load.folders[e]);var n=new oe(t);this.__folders[e]=n;var o=i(this,n.domElement);return z["default"].addClass(o,"folder"),n},open:function(){this.closed=!1},close:function(){this.closed=!0},onResize:function(){var e=this.getRoot();if(e.scrollable){var t=z["default"].getOffset(e.__ul).top,n=0;U["default"].each(e.__ul.childNodes,function(t){e.autoPlace&&t===e.__save_row||(n+=z["default"].getHeight(t))}),window.innerHeight-t-W<n?(z["default"].addClass(e.domElement,oe.CLASS_TOO_TALL),e.__ul.style.height=window.innerHeight-t-W+"px"):(z["default"].removeClass(e.domElement,oe.CLASS_TOO_TALL),e.__ul.style.height="auto")}e.__resize_handle&&U["default"].defer(function(){e.__resize_handle.style.height=e.__ul.offsetHeight+"px"}),e.__closeButton&&(e.__closeButton.style.width=e.width+"px")},onResizeDebounced:U["default"].debounce(function(){this.onResize()},50),remember:function(){if(U["default"].isUndefined(Z)&&(Z=new F["default"],Z.domElement.innerHTML=x["default"]),this.parent)throw new Error("You can only call remember on a top level GUI.");var e=this;U["default"].each(Array.prototype.slice.call(arguments),function(t){0===e.__rememberedObjects.length&&f(e),e.__rememberedObjects.indexOf(t)===-1&&e.__rememberedObjects.push(t)}),this.autoPlace&&p(this,this.width)},getRoot:function(){for(var e=this;e.parent;)e=e.parent;return e},getSaveObject:function(){var e=this.load;return e.closed=this.closed,this.__rememberedObjects.length>0&&(e.preset=this.preset,e.remembered||(e.remembered={}),e.remembered[this.preset]=h(this)),e.folders={},U["default"].each(this.__folders,function(t,n){e.folders[n]=t.getSaveObject()}),e},save:function(){this.load.remembered||(this.load.remembered={}),this.load.remembered[this.preset]=h(this),r(this,!1),this.saveToLocalStorageIfPossible()},saveAs:function(e){this.load.remembered||(this.load.remembered={},this.load.remembered[Q]=h(this,!0)),this.load.remembered[e]=h(this),this.preset=e,d(this,e,!0),this.saveToLocalStorageIfPossible()},revert:function(e){U["default"].each(this.__controllers,function(t){this.getRoot().load.remembered?l(e||this.getRoot(),t):t.setValue(t.initialValue),t.__onFinishChange&&t.__onFinishChange.call(t,t.getValue())},this),U["default"].each(this.__folders,function(e){e.revert(e)}),e||r(this.getRoot(),!1)},listen:function(e){var t=0===this.__listening.length;this.__listening.push(e),t&&b(this.__listening)},updateDisplay:function(){U["default"].each(this.__controllers,function(e){e.updateDisplay()}),U["default"].each(this.__folders,function(e){e.updateDisplay()})}}),e.exports=oe},function(e,t){"use strict";e.exports={load:function(e,t){var n=t||document,o=n.createElement("link");o.type="text/css",o.rel="stylesheet",o.href=e,n.getElementsByTagName("head")[0].appendChild(o)},inject:function(e,t){var n=t||document,o=document.createElement("style");o.type="text/css",o.innerHTML=e;var i=n.getElementsByTagName("head")[0];try{i.appendChild(o)}catch(r){}}}},function(e,t){e.exports="<div id=dg-save class=\"dg dialogue\"> Here's the new load parameter for your <code>GUI</code>'s constructor: <textarea id=dg-new-constructor></textarea> <div id=dg-save-locally> <input id=dg-local-storage type=checkbox /> Automatically save values to <code>localStorage</code> on exit. <div id=dg-local-explain>The values saved to <code>localStorage</code> will override those passed to <code>dat.GUI</code>'s constructor. This makes it easier to work incrementally, but <code>localStorage</code> is fragile, and your friends may not see the same values you do. </div> </div> </div>"},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}t.__esModule=!0;var i=n(10),r=o(i),a=n(13),l=o(a),s=n(14),u=o(s),d=n(11),c=o(d),f=n(15),_=o(f),p=n(8),h=o(p),m=n(5),b=o(m),g=function(e,t){var n=e[t];return b["default"].isArray(arguments[2])||b["default"].isObject(arguments[2])?new r["default"](e,t,arguments[2]):b["default"].isNumber(n)?b["default"].isNumber(arguments[2])&&b["default"].isNumber(arguments[3])?b["default"].isNumber(arguments[4])?new u["default"](e,t,arguments[2],arguments[3],arguments[4]):new u["default"](e,t,arguments[2],arguments[3]):b["default"].isNumber(arguments[4])?new l["default"](e,t,{min:arguments[2],max:arguments[3],step:arguments[4]}):new l["default"](e,t,{min:arguments[2],max:arguments[3]}):b["default"].isString(n)?new c["default"](e,t):b["default"].isFunction(n)?new _["default"](e,t,""):b["default"].isBoolean(n)?new h["default"](e,t):null};t["default"]=g},function(e,t){"use strict";function n(e){setTimeout(e,1e3/60)}t.__esModule=!0,t["default"]=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||n},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var r=n(9),a=o(r),l=n(5),s=o(l),u=function(){function e(){i(this,e),this.backgroundElement=document.createElement("div"),s["default"].extend(this.backgroundElement.style,{backgroundColor:"rgba(0,0,0,0.8)",top:0,left:0,display:"none",zIndex:"1000",opacity:0,WebkitTransition:"opacity 0.2s linear",transition:"opacity 0.2s linear"}),a["default"].makeFullscreen(this.backgroundElement),this.backgroundElement.style.position="fixed",this.domElement=document.createElement("div"),s["default"].extend(this.domElement.style,{position:"fixed",display:"none",zIndex:"1001",opacity:0,WebkitTransition:"-webkit-transform 0.2s ease-out, opacity 0.2s linear",transition:"transform 0.2s ease-out, opacity 0.2s linear"}),document.body.appendChild(this.backgroundElement),document.body.appendChild(this.domElement);var t=this;a["default"].bind(this.backgroundElement,"click",function(){t.hide()})}return e.prototype.show=function(){var e=this;this.backgroundElement.style.display="block",this.domElement.style.display="block",this.domElement.style.opacity=0,this.domElement.style.webkitTransform="scale(1.1)",this.layout(),s["default"].defer(function(){e.backgroundElement.style.opacity=1,e.domElement.style.opacity=1,e.domElement.style.webkitTransform="scale(1)"})},e.prototype.hide=function t(){var e=this,t=function n(){e.domElement.style.display="none",e.backgroundElement.style.display="none",a["default"].unbind(e.domElement,"webkitTransitionEnd",n),a["default"].unbind(e.domElement,"transitionend",n),a["default"].unbind(e.domElement,"oTransitionEnd",n)};a["default"].bind(this.domElement,"webkitTransitionEnd",t),a["default"].bind(this.domElement,"transitionend",t),a["default"].bind(this.domElement,"oTransitionEnd",t),this.backgroundElement.style.opacity=0,this.domElement.style.opacity=0,this.domElement.style.webkitTransform="scale(1.1)"},e.prototype.layout=function(){this.domElement.style.left=window.innerWidth/2-a["default"].getWidth(this.domElement)/2+"px",this.domElement.style.top=window.innerHeight/2-a["default"].getHeight(this.domElement)/2+"px"},e}();t["default"]=u},function(e,t,n){t=e.exports=n(24)(),t.push([e.id,".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity .1s linear;transition:opacity .1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1!important}.dg.main .close-button.drag,.dg.main:hover .close-button{opacity:1}.dg.main .close-button{-webkit-transition:opacity .1s linear;transition:opacity .1s linear;border:0;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button.close-top{position:relative}.dg.main .close-button.close-bottom{position:absolute}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-x:hidden}.dg.a.has-save>ul.close-top{margin-top:0}.dg.a.has-save>ul.close-bottom{margin-top:27px}.dg.a.has-save>ul.closed{margin-top:0}.dg.a .save-row{top:0;z-index:1002}.dg.a .save-row.close-top{position:relative}.dg.a .save-row.close-bottom{position:fixed}.dg li{-webkit-transition:height .1s ease-out;transition:height .1s ease-out;-webkit-transition:overflow .1s linear;transition:overflow .1s linear}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;overflow:visible;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid transparent}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li>*{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%;position:relative}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:7px}.dg .c select{margin-top:5px}.dg .cr.boolean,.dg .cr.boolean *,.dg .cr.function,.dg .cr.function *,.dg .cr.function .property-name{cursor:pointer}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco,monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px Lucida Grande,sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid hsla(0,0%,100%,.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.color{border-left:3px solid}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2fa1d6}.dg .cr.number input[type=text]{color:#2fa1d6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.boolean:hover,.dg .cr.function:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2fa1d6;max-width:100%}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}",""])},function(e,t){e.exports=function(){var e=[];return e.toString=function(){for(var e=[],t=0;t<this.length;t++){var n=this[t];n[2]?e.push("@media "+n[2]+"{"+n[1]+"}"):e.push(n[1])}return e.join("")},e.i=function(t,n){"string"==typeof t&&(t=[[null,t,""]]);for(var o={},i=0;i<this.length;i++){var r=this[i][0];"number"==typeof r&&(o[r]=!0)}for(i=0;i<t.length;i++){var a=t[i];"number"==typeof a[0]&&o[a[0]]||(n&&!a[2]?a[2]=n:n&&(a[2]="("+a[2]+") and ("+n+")"),e.push(a))}},e}}])}); \ No newline at end of file diff --git a/recursive_swarm/lib/js-colormaps.js b/recursive_swarm/lib/js-colormaps.js new file mode 100644 index 0000000000000000000000000000000000000000..cbc99710a55ec7c175fd2edda1d5d873eb0c7462 --- /dev/null +++ b/recursive_swarm/lib/js-colormaps.js @@ -0,0 +1,77 @@ +// Diverging +var BrBG = [[0.000, [0.329, 0.188, 0.020]], [0.002, [0.329, 0.188, 0.020]], [0.004, [0.338, 0.193, 0.020]], [0.006, [0.338, 0.193, 0.020]], [0.008, [0.347, 0.198, 0.021]], [0.010, [0.347, 0.198, 0.021]], [0.012, [0.355, 0.203, 0.022]], [0.014, [0.355, 0.203, 0.022]], [0.016, [0.364, 0.209, 0.023]], [0.018, [0.364, 0.209, 0.023]], [0.020, [0.372, 0.214, 0.023]], [0.022, [0.372, 0.214, 0.023]], [0.023, [0.381, 0.219, 0.024]], [0.025, [0.381, 0.219, 0.024]], [0.027, [0.390, 0.224, 0.025]], [0.029, [0.390, 0.224, 0.025]], [0.031, [0.398, 0.229, 0.026]], [0.033, [0.398, 0.229, 0.026]], [0.035, [0.407, 0.234, 0.027]], [0.037, [0.407, 0.234, 0.027]], [0.039, [0.416, 0.239, 0.027]], [0.041, [0.416, 0.239, 0.027]], [0.043, [0.424, 0.244, 0.028]], [0.045, [0.424, 0.244, 0.028]], [0.047, [0.433, 0.249, 0.029]], [0.049, [0.433, 0.249, 0.029]], [0.051, [0.441, 0.254, 0.030]], [0.053, [0.441, 0.254, 0.030]], [0.055, [0.450, 0.259, 0.030]], [0.057, [0.450, 0.259, 0.030]], [0.059, [0.459, 0.264, 0.031]], [0.061, [0.459, 0.264, 0.031]], [0.063, [0.467, 0.269, 0.032]], [0.065, [0.467, 0.269, 0.032]], [0.067, [0.476, 0.275, 0.033]], [0.068, [0.476, 0.275, 0.033]], [0.070, [0.484, 0.280, 0.033]], [0.072, [0.484, 0.280, 0.033]], [0.074, [0.493, 0.285, 0.034]], [0.076, [0.493, 0.285, 0.034]], [0.078, [0.502, 0.290, 0.035]], [0.080, [0.502, 0.290, 0.035]], [0.082, [0.510, 0.295, 0.036]], [0.084, [0.510, 0.295, 0.036]], [0.086, [0.519, 0.300, 0.037]], [0.088, [0.519, 0.300, 0.037]], [0.090, [0.527, 0.305, 0.037]], [0.092, [0.527, 0.305, 0.037]], [0.094, [0.536, 0.310, 0.038]], [0.096, [0.536, 0.310, 0.038]], [0.098, [0.545, 0.315, 0.039]], [0.100, [0.545, 0.315, 0.039]], [0.102, [0.553, 0.321, 0.042]], [0.104, [0.553, 0.321, 0.042]], [0.106, [0.561, 0.329, 0.047]], [0.108, [0.561, 0.329, 0.047]], [0.110, [0.569, 0.336, 0.053]], [0.112, [0.569, 0.336, 0.053]], [0.114, [0.576, 0.343, 0.058]], [0.115, [0.576, 0.343, 0.058]], [0.117, [0.584, 0.351, 0.063]], [0.119, [0.584, 0.351, 0.063]], [0.121, [0.592, 0.358, 0.069]], [0.123, [0.592, 0.358, 0.069]], [0.125, [0.600, 0.366, 0.074]], [0.127, [0.600, 0.366, 0.074]], [0.129, [0.608, 0.373, 0.080]], [0.131, [0.608, 0.373, 0.080]], [0.133, [0.616, 0.380, 0.085]], [0.135, [0.616, 0.380, 0.085]], [0.137, [0.624, 0.388, 0.090]], [0.139, [0.624, 0.388, 0.090]], [0.141, [0.631, 0.395, 0.096]], [0.143, [0.631, 0.395, 0.096]], [0.145, [0.639, 0.403, 0.101]], [0.147, [0.639, 0.403, 0.101]], [0.149, [0.647, 0.410, 0.106]], [0.151, [0.647, 0.410, 0.106]], [0.153, [0.655, 0.417, 0.112]], [0.155, [0.655, 0.417, 0.112]], [0.157, [0.663, 0.425, 0.117]], [0.159, [0.663, 0.425, 0.117]], [0.160, [0.671, 0.432, 0.123]], [0.162, [0.671, 0.432, 0.123]], [0.164, [0.678, 0.439, 0.128]], [0.166, [0.678, 0.439, 0.128]], [0.168, [0.686, 0.447, 0.133]], [0.170, [0.686, 0.447, 0.133]], [0.172, [0.694, 0.454, 0.139]], [0.174, [0.694, 0.454, 0.139]], [0.176, [0.702, 0.462, 0.144]], [0.178, [0.702, 0.462, 0.144]], [0.180, [0.710, 0.469, 0.150]], [0.182, [0.710, 0.469, 0.150]], [0.184, [0.718, 0.476, 0.155]], [0.186, [0.718, 0.476, 0.155]], [0.188, [0.725, 0.484, 0.160]], [0.190, [0.725, 0.484, 0.160]], [0.192, [0.733, 0.491, 0.166]], [0.194, [0.733, 0.491, 0.166]], [0.196, [0.741, 0.499, 0.171]], [0.198, [0.741, 0.499, 0.171]], [0.200, [0.749, 0.506, 0.176]], [0.202, [0.749, 0.506, 0.176]], [0.204, [0.754, 0.516, 0.189]], [0.205, [0.754, 0.516, 0.189]], [0.207, [0.759, 0.526, 0.201]], [0.209, [0.759, 0.526, 0.201]], [0.211, [0.764, 0.536, 0.213]], [0.213, [0.764, 0.536, 0.213]], [0.215, [0.769, 0.546, 0.226]], [0.217, [0.769, 0.546, 0.226]], [0.219, [0.774, 0.556, 0.238]], [0.221, [0.774, 0.556, 0.238]], [0.223, [0.779, 0.566, 0.250]], [0.225, [0.779, 0.566, 0.250]], [0.227, [0.783, 0.576, 0.263]], [0.229, [0.783, 0.576, 0.263]], [0.231, [0.788, 0.586, 0.275]], [0.233, [0.788, 0.586, 0.275]], [0.235, [0.793, 0.596, 0.287]], [0.237, [0.793, 0.596, 0.287]], [0.239, [0.798, 0.606, 0.300]], [0.241, [0.798, 0.606, 0.300]], [0.243, [0.803, 0.616, 0.312]], [0.245, [0.803, 0.616, 0.312]], [0.247, [0.808, 0.626, 0.324]], [0.249, [0.808, 0.626, 0.324]], [0.250, [0.813, 0.636, 0.336]], [0.252, [0.813, 0.636, 0.336]], [0.254, [0.818, 0.646, 0.349]], [0.256, [0.818, 0.646, 0.349]], [0.258, [0.823, 0.656, 0.361]], [0.260, [0.823, 0.656, 0.361]], [0.262, [0.828, 0.666, 0.373]], [0.264, [0.828, 0.666, 0.373]], [0.266, [0.833, 0.676, 0.386]], [0.268, [0.833, 0.676, 0.386]], [0.270, [0.838, 0.686, 0.398]], [0.272, [0.838, 0.686, 0.398]], [0.274, [0.843, 0.696, 0.410]], [0.276, [0.843, 0.696, 0.410]], [0.278, [0.847, 0.706, 0.423]], [0.280, [0.847, 0.706, 0.423]], [0.282, [0.852, 0.716, 0.435]], [0.284, [0.852, 0.716, 0.435]], [0.286, [0.857, 0.726, 0.447]], [0.288, [0.857, 0.726, 0.447]], [0.290, [0.862, 0.736, 0.459]], [0.292, [0.862, 0.736, 0.459]], [0.294, [0.867, 0.746, 0.472]], [0.295, [0.867, 0.746, 0.472]], [0.297, [0.872, 0.756, 0.484]], [0.299, [0.872, 0.756, 0.484]], [0.301, [0.876, 0.764, 0.496]], [0.303, [0.876, 0.764, 0.496]], [0.305, [0.880, 0.770, 0.506]], [0.307, [0.880, 0.770, 0.506]], [0.309, [0.883, 0.775, 0.517]], [0.311, [0.883, 0.775, 0.517]], [0.313, [0.887, 0.781, 0.528]], [0.315, [0.887, 0.781, 0.528]], [0.317, [0.890, 0.787, 0.539]], [0.319, [0.890, 0.787, 0.539]], [0.321, [0.894, 0.793, 0.549]], [0.323, [0.894, 0.793, 0.549]], [0.325, [0.898, 0.799, 0.560]], [0.327, [0.898, 0.799, 0.560]], [0.329, [0.901, 0.805, 0.571]], [0.331, [0.901, 0.805, 0.571]], [0.333, [0.905, 0.810, 0.582]], [0.335, [0.905, 0.810, 0.582]], [0.337, [0.908, 0.816, 0.592]], [0.339, [0.908, 0.816, 0.592]], [0.341, [0.912, 0.822, 0.603]], [0.342, [0.912, 0.822, 0.603]], [0.344, [0.915, 0.828, 0.614]], [0.346, [0.915, 0.828, 0.614]], [0.348, [0.919, 0.834, 0.625]], [0.350, [0.919, 0.834, 0.625]], [0.352, [0.922, 0.840, 0.636]], [0.354, [0.922, 0.840, 0.636]], [0.356, [0.926, 0.846, 0.646]], [0.358, [0.926, 0.846, 0.646]], [0.360, [0.929, 0.851, 0.657]], [0.362, [0.929, 0.851, 0.657]], [0.364, [0.933, 0.857, 0.668]], [0.366, [0.933, 0.857, 0.668]], [0.368, [0.936, 0.863, 0.679]], [0.370, [0.936, 0.863, 0.679]], [0.372, [0.940, 0.869, 0.689]], [0.374, [0.940, 0.869, 0.689]], [0.376, [0.943, 0.875, 0.700]], [0.378, [0.943, 0.875, 0.700]], [0.380, [0.947, 0.881, 0.711]], [0.382, [0.947, 0.881, 0.711]], [0.384, [0.951, 0.886, 0.722]], [0.386, [0.951, 0.886, 0.722]], [0.387, [0.954, 0.892, 0.732]], [0.389, [0.954, 0.892, 0.732]], [0.391, [0.958, 0.898, 0.743]], [0.393, [0.958, 0.898, 0.743]], [0.395, [0.961, 0.904, 0.754]], [0.397, [0.961, 0.904, 0.754]], [0.399, [0.965, 0.910, 0.765]], [0.401, [0.965, 0.910, 0.765]], [0.403, [0.965, 0.912, 0.772]], [0.405, [0.965, 0.912, 0.772]], [0.407, [0.964, 0.914, 0.780]], [0.409, [0.964, 0.914, 0.780]], [0.411, [0.964, 0.916, 0.788]], [0.413, [0.964, 0.916, 0.788]], [0.415, [0.964, 0.918, 0.795]], [0.417, [0.964, 0.918, 0.795]], [0.419, [0.964, 0.920, 0.803]], [0.421, [0.964, 0.920, 0.803]], [0.423, [0.964, 0.922, 0.811]], [0.425, [0.964, 0.922, 0.811]], [0.427, [0.964, 0.924, 0.819]], [0.429, [0.964, 0.924, 0.819]], [0.431, [0.963, 0.926, 0.826]], [0.432, [0.963, 0.926, 0.826]], [0.434, [0.963, 0.928, 0.834]], [0.436, [0.963, 0.928, 0.834]], [0.438, [0.963, 0.930, 0.842]], [0.440, [0.963, 0.930, 0.842]], [0.442, [0.963, 0.932, 0.849]], [0.444, [0.963, 0.932, 0.849]], [0.446, [0.963, 0.934, 0.857]], [0.448, [0.963, 0.934, 0.857]], [0.450, [0.963, 0.936, 0.865]], [0.452, [0.963, 0.936, 0.865]], [0.454, [0.963, 0.938, 0.872]], [0.456, [0.963, 0.938, 0.872]], [0.458, [0.962, 0.940, 0.880]], [0.460, [0.962, 0.940, 0.880]], [0.462, [0.962, 0.942, 0.888]], [0.464, [0.962, 0.942, 0.888]], [0.466, [0.962, 0.944, 0.895]], [0.468, [0.962, 0.944, 0.895]], [0.470, [0.962, 0.946, 0.903]], [0.472, [0.962, 0.946, 0.903]], [0.474, [0.962, 0.948, 0.911]], [0.476, [0.962, 0.948, 0.911]], [0.477, [0.962, 0.950, 0.918]], [0.479, [0.962, 0.950, 0.918]], [0.481, [0.961, 0.952, 0.926]], [0.483, [0.961, 0.952, 0.926]], [0.485, [0.961, 0.954, 0.934]], [0.487, [0.961, 0.954, 0.934]], [0.489, [0.961, 0.956, 0.942]], [0.491, [0.961, 0.956, 0.942]], [0.493, [0.961, 0.958, 0.949]], [0.495, [0.961, 0.958, 0.949]], [0.497, [0.961, 0.960, 0.957]], [0.499, [0.961, 0.960, 0.957]], [0.501, [0.957, 0.960, 0.960]], [0.503, [0.957, 0.960, 0.960]], [0.505, [0.950, 0.958, 0.957]], [0.507, [0.950, 0.958, 0.957]], [0.509, [0.943, 0.957, 0.955]], [0.511, [0.943, 0.957, 0.955]], [0.513, [0.936, 0.955, 0.952]], [0.515, [0.936, 0.955, 0.952]], [0.517, [0.929, 0.953, 0.950]], [0.519, [0.929, 0.953, 0.950]], [0.521, [0.922, 0.951, 0.947]], [0.523, [0.922, 0.951, 0.947]], [0.524, [0.915, 0.950, 0.945]], [0.526, [0.915, 0.950, 0.945]], [0.528, [0.908, 0.948, 0.942]], [0.530, [0.908, 0.948, 0.942]], [0.532, [0.901, 0.946, 0.940]], [0.534, [0.901, 0.946, 0.940]], [0.536, [0.894, 0.945, 0.937]], [0.538, [0.894, 0.945, 0.937]], [0.540, [0.887, 0.943, 0.935]], [0.542, [0.887, 0.943, 0.935]], [0.544, [0.879, 0.941, 0.932]], [0.546, [0.879, 0.941, 0.932]], [0.548, [0.872, 0.940, 0.930]], [0.550, [0.872, 0.940, 0.930]], [0.552, [0.865, 0.938, 0.928]], [0.554, [0.865, 0.938, 0.928]], [0.556, [0.858, 0.936, 0.925]], [0.558, [0.858, 0.936, 0.925]], [0.560, [0.851, 0.935, 0.923]], [0.562, [0.851, 0.935, 0.923]], [0.564, [0.844, 0.933, 0.920]], [0.566, [0.844, 0.933, 0.920]], [0.568, [0.837, 0.931, 0.918]], [0.569, [0.837, 0.931, 0.918]], [0.571, [0.830, 0.929, 0.915]], [0.573, [0.830, 0.929, 0.915]], [0.575, [0.823, 0.928, 0.913]], [0.577, [0.823, 0.928, 0.913]], [0.579, [0.816, 0.926, 0.910]], [0.581, [0.816, 0.926, 0.910]], [0.583, [0.809, 0.924, 0.908]], [0.585, [0.809, 0.924, 0.908]], [0.587, [0.802, 0.923, 0.905]], [0.589, [0.802, 0.923, 0.905]], [0.591, [0.795, 0.921, 0.903]], [0.593, [0.795, 0.921, 0.903]], [0.595, [0.787, 0.919, 0.900]], [0.597, [0.787, 0.919, 0.900]], [0.599, [0.780, 0.918, 0.898]], [0.601, [0.780, 0.918, 0.898]], [0.603, [0.769, 0.913, 0.893]], [0.605, [0.769, 0.913, 0.893]], [0.607, [0.759, 0.909, 0.887]], [0.609, [0.759, 0.909, 0.887]], [0.611, [0.748, 0.904, 0.881]], [0.613, [0.748, 0.904, 0.881]], [0.614, [0.737, 0.900, 0.876]], [0.616, [0.737, 0.900, 0.876]], [0.618, [0.726, 0.895, 0.870]], [0.620, [0.726, 0.895, 0.870]], [0.622, [0.715, 0.891, 0.865]], [0.624, [0.715, 0.891, 0.865]], [0.626, [0.704, 0.886, 0.859]], [0.628, [0.704, 0.886, 0.859]], [0.630, [0.693, 0.882, 0.854]], [0.632, [0.693, 0.882, 0.854]], [0.634, [0.682, 0.878, 0.848]], [0.636, [0.682, 0.878, 0.848]], [0.638, [0.671, 0.873, 0.843]], [0.640, [0.671, 0.873, 0.843]], [0.642, [0.660, 0.869, 0.837]], [0.644, [0.660, 0.869, 0.837]], [0.646, [0.649, 0.864, 0.832]], [0.648, [0.649, 0.864, 0.832]], [0.650, [0.638, 0.860, 0.826]], [0.652, [0.638, 0.860, 0.826]], [0.654, [0.628, 0.855, 0.821]], [0.656, [0.628, 0.855, 0.821]], [0.658, [0.617, 0.851, 0.815]], [0.659, [0.617, 0.851, 0.815]], [0.661, [0.606, 0.846, 0.809]], [0.663, [0.606, 0.846, 0.809]], [0.665, [0.595, 0.842, 0.804]], [0.667, [0.595, 0.842, 0.804]], [0.669, [0.584, 0.837, 0.798]], [0.671, [0.584, 0.837, 0.798]], [0.673, [0.573, 0.833, 0.793]], [0.675, [0.573, 0.833, 0.793]], [0.677, [0.562, 0.828, 0.787]], [0.679, [0.562, 0.828, 0.787]], [0.681, [0.551, 0.824, 0.782]], [0.683, [0.551, 0.824, 0.782]], [0.685, [0.540, 0.820, 0.776]], [0.687, [0.540, 0.820, 0.776]], [0.689, [0.529, 0.815, 0.771]], [0.691, [0.529, 0.815, 0.771]], [0.693, [0.518, 0.811, 0.765]], [0.695, [0.518, 0.811, 0.765]], [0.697, [0.507, 0.806, 0.760]], [0.699, [0.507, 0.806, 0.760]], [0.701, [0.496, 0.800, 0.753]], [0.703, [0.496, 0.800, 0.753]], [0.705, [0.485, 0.791, 0.745]], [0.706, [0.485, 0.791, 0.745]], [0.708, [0.473, 0.783, 0.738]], [0.710, [0.473, 0.783, 0.738]], [0.712, [0.462, 0.775, 0.730]], [0.714, [0.462, 0.775, 0.730]], [0.716, [0.450, 0.767, 0.722]], [0.718, [0.450, 0.767, 0.722]], [0.720, [0.439, 0.758, 0.715]], [0.722, [0.439, 0.758, 0.715]], [0.724, [0.427, 0.750, 0.707]], [0.726, [0.427, 0.750, 0.707]], [0.728, [0.415, 0.742, 0.699]], [0.730, [0.415, 0.742, 0.699]], [0.732, [0.404, 0.733, 0.692]], [0.734, [0.404, 0.733, 0.692]], [0.736, [0.392, 0.725, 0.684]], [0.738, [0.392, 0.725, 0.684]], [0.740, [0.381, 0.717, 0.676]], [0.742, [0.381, 0.717, 0.676]], [0.744, [0.369, 0.708, 0.668]], [0.746, [0.369, 0.708, 0.668]], [0.748, [0.358, 0.700, 0.661]], [0.750, [0.358, 0.700, 0.661]], [0.751, [0.346, 0.692, 0.653]], [0.753, [0.346, 0.692, 0.653]], [0.755, [0.335, 0.684, 0.645]], [0.757, [0.335, 0.684, 0.645]], [0.759, [0.323, 0.675, 0.638]], [0.761, [0.323, 0.675, 0.638]], [0.763, [0.312, 0.667, 0.630]], [0.765, [0.312, 0.667, 0.630]], [0.767, [0.300, 0.659, 0.622]], [0.769, [0.300, 0.659, 0.622]], [0.771, [0.289, 0.650, 0.615]], [0.773, [0.289, 0.650, 0.615]], [0.775, [0.277, 0.642, 0.607]], [0.777, [0.277, 0.642, 0.607]], [0.779, [0.266, 0.634, 0.599]], [0.781, [0.266, 0.634, 0.599]], [0.783, [0.254, 0.625, 0.592]], [0.785, [0.254, 0.625, 0.592]], [0.787, [0.242, 0.617, 0.584]], [0.789, [0.242, 0.617, 0.584]], [0.791, [0.231, 0.609, 0.576]], [0.793, [0.231, 0.609, 0.576]], [0.795, [0.219, 0.600, 0.568]], [0.796, [0.219, 0.600, 0.568]], [0.798, [0.208, 0.592, 0.561]], [0.800, [0.208, 0.592, 0.561]], [0.802, [0.200, 0.585, 0.553]], [0.804, [0.200, 0.585, 0.553]], [0.806, [0.192, 0.577, 0.546]], [0.808, [0.192, 0.577, 0.546]], [0.810, [0.184, 0.570, 0.538]], [0.812, [0.184, 0.570, 0.538]], [0.814, [0.176, 0.562, 0.531]], [0.816, [0.176, 0.562, 0.531]], [0.818, [0.168, 0.554, 0.523]], [0.820, [0.168, 0.554, 0.523]], [0.822, [0.160, 0.547, 0.516]], [0.824, [0.160, 0.547, 0.516]], [0.826, [0.152, 0.539, 0.508]], [0.828, [0.152, 0.539, 0.508]], [0.830, [0.144, 0.532, 0.500]], [0.832, [0.144, 0.532, 0.500]], [0.834, [0.136, 0.524, 0.493]], [0.836, [0.136, 0.524, 0.493]], [0.838, [0.128, 0.517, 0.485]], [0.840, [0.128, 0.517, 0.485]], [0.841, [0.120, 0.509, 0.478]], [0.843, [0.120, 0.509, 0.478]], [0.845, [0.112, 0.502, 0.470]], [0.847, [0.112, 0.502, 0.470]], [0.849, [0.104, 0.494, 0.463]], [0.851, [0.104, 0.494, 0.463]], [0.853, [0.096, 0.487, 0.455]], [0.855, [0.096, 0.487, 0.455]], [0.857, [0.088, 0.479, 0.448]], [0.859, [0.088, 0.479, 0.448]], [0.861, [0.080, 0.472, 0.440]], [0.863, [0.080, 0.472, 0.440]], [0.865, [0.072, 0.464, 0.433]], [0.867, [0.072, 0.464, 0.433]], [0.869, [0.064, 0.457, 0.425]], [0.871, [0.064, 0.457, 0.425]], [0.873, [0.056, 0.449, 0.418]], [0.875, [0.056, 0.449, 0.418]], [0.877, [0.048, 0.441, 0.410]], [0.879, [0.048, 0.441, 0.410]], [0.881, [0.040, 0.434, 0.403]], [0.883, [0.040, 0.434, 0.403]], [0.885, [0.032, 0.426, 0.395]], [0.886, [0.032, 0.426, 0.395]], [0.888, [0.024, 0.419, 0.387]], [0.890, [0.024, 0.419, 0.387]], [0.892, [0.016, 0.411, 0.380]], [0.894, [0.016, 0.411, 0.380]], [0.896, [0.008, 0.404, 0.372]], [0.898, [0.008, 0.404, 0.372]], [0.900, [0.004, 0.397, 0.365]], [0.902, [0.004, 0.397, 0.365]], [0.904, [0.004, 0.390, 0.358]], [0.906, [0.004, 0.390, 0.358]], [0.908, [0.004, 0.384, 0.351]], [0.910, [0.004, 0.384, 0.351]], [0.912, [0.003, 0.377, 0.344]], [0.914, [0.003, 0.377, 0.344]], [0.916, [0.003, 0.371, 0.337]], [0.918, [0.003, 0.371, 0.337]], [0.920, [0.003, 0.364, 0.330]], [0.922, [0.003, 0.364, 0.330]], [0.924, [0.003, 0.358, 0.323]], [0.926, [0.003, 0.358, 0.323]], [0.928, [0.003, 0.352, 0.316]], [0.930, [0.003, 0.352, 0.316]], [0.932, [0.003, 0.345, 0.308]], [0.933, [0.003, 0.345, 0.308]], [0.935, [0.002, 0.339, 0.301]], [0.937, [0.002, 0.339, 0.301]], [0.939, [0.002, 0.332, 0.294]], [0.941, [0.002, 0.332, 0.294]], [0.943, [0.002, 0.326, 0.287]], [0.945, [0.002, 0.326, 0.287]], [0.947, [0.002, 0.319, 0.280]], [0.949, [0.002, 0.319, 0.280]], [0.951, [0.002, 0.313, 0.273]], [0.953, [0.002, 0.313, 0.273]], [0.955, [0.002, 0.306, 0.266]], [0.957, [0.002, 0.306, 0.266]], [0.959, [0.002, 0.300, 0.259]], [0.961, [0.002, 0.300, 0.259]], [0.963, [0.001, 0.293, 0.252]], [0.965, [0.001, 0.293, 0.252]], [0.967, [0.001, 0.287, 0.245]], [0.969, [0.001, 0.287, 0.245]], [0.971, [0.001, 0.281, 0.238]], [0.973, [0.001, 0.281, 0.238]], [0.975, [0.001, 0.274, 0.231]], [0.977, [0.001, 0.274, 0.231]], [0.978, [0.001, 0.268, 0.224]], [0.980, [0.001, 0.268, 0.224]], [0.982, [0.001, 0.261, 0.217]], [0.984, [0.001, 0.261, 0.217]], [0.986, [0.000, 0.255, 0.209]], [0.988, [0.000, 0.255, 0.209]], [0.990, [0.000, 0.248, 0.202]], [0.992, [0.000, 0.248, 0.202]], [0.994, [0.000, 0.242, 0.195]], [0.996, [0.000, 0.242, 0.195]], [0.998, [0.000, 0.235, 0.188]], [1.000, [0.000, 0.235, 0.188]]]; +var PRGn = [[0.000, [0.251, 0.000, 0.294]], [0.002, [0.251, 0.000, 0.294]], [0.004, [0.259, 0.006, 0.303]], [0.006, [0.259, 0.006, 0.303]], [0.008, [0.268, 0.013, 0.311]], [0.010, [0.268, 0.013, 0.311]], [0.012, [0.276, 0.019, 0.320]], [0.014, [0.276, 0.019, 0.320]], [0.016, [0.284, 0.026, 0.329]], [0.018, [0.284, 0.026, 0.329]], [0.020, [0.293, 0.032, 0.337]], [0.022, [0.293, 0.032, 0.337]], [0.023, [0.301, 0.039, 0.346]], [0.025, [0.301, 0.039, 0.346]], [0.027, [0.309, 0.045, 0.354]], [0.029, [0.309, 0.045, 0.354]], [0.031, [0.317, 0.052, 0.363]], [0.033, [0.317, 0.052, 0.363]], [0.035, [0.326, 0.058, 0.372]], [0.037, [0.326, 0.058, 0.372]], [0.039, [0.334, 0.065, 0.380]], [0.041, [0.334, 0.065, 0.380]], [0.043, [0.342, 0.071, 0.389]], [0.045, [0.342, 0.071, 0.389]], [0.047, [0.351, 0.078, 0.397]], [0.049, [0.351, 0.078, 0.397]], [0.051, [0.359, 0.084, 0.406]], [0.053, [0.359, 0.084, 0.406]], [0.055, [0.367, 0.090, 0.415]], [0.057, [0.367, 0.090, 0.415]], [0.059, [0.376, 0.097, 0.423]], [0.061, [0.376, 0.097, 0.423]], [0.063, [0.384, 0.103, 0.432]], [0.065, [0.384, 0.103, 0.432]], [0.067, [0.392, 0.110, 0.441]], [0.068, [0.392, 0.110, 0.441]], [0.070, [0.400, 0.116, 0.449]], [0.072, [0.400, 0.116, 0.449]], [0.074, [0.409, 0.123, 0.458]], [0.076, [0.409, 0.123, 0.458]], [0.078, [0.417, 0.129, 0.466]], [0.080, [0.417, 0.129, 0.466]], [0.082, [0.425, 0.136, 0.475]], [0.084, [0.425, 0.136, 0.475]], [0.086, [0.434, 0.142, 0.484]], [0.088, [0.434, 0.142, 0.484]], [0.090, [0.442, 0.149, 0.492]], [0.092, [0.442, 0.149, 0.492]], [0.094, [0.450, 0.155, 0.501]], [0.096, [0.450, 0.155, 0.501]], [0.098, [0.459, 0.161, 0.509]], [0.100, [0.459, 0.161, 0.509]], [0.102, [0.465, 0.170, 0.517]], [0.104, [0.465, 0.170, 0.517]], [0.106, [0.471, 0.181, 0.523]], [0.108, [0.471, 0.181, 0.523]], [0.110, [0.476, 0.192, 0.529]], [0.112, [0.476, 0.192, 0.529]], [0.114, [0.482, 0.202, 0.535]], [0.115, [0.482, 0.202, 0.535]], [0.117, [0.487, 0.213, 0.541]], [0.119, [0.487, 0.213, 0.541]], [0.121, [0.492, 0.224, 0.548]], [0.123, [0.492, 0.224, 0.548]], [0.125, [0.498, 0.235, 0.554]], [0.127, [0.498, 0.235, 0.554]], [0.129, [0.503, 0.245, 0.560]], [0.131, [0.503, 0.245, 0.560]], [0.133, [0.508, 0.256, 0.566]], [0.135, [0.508, 0.256, 0.566]], [0.137, [0.514, 0.267, 0.572]], [0.139, [0.514, 0.267, 0.572]], [0.141, [0.519, 0.278, 0.578]], [0.143, [0.519, 0.278, 0.578]], [0.145, [0.525, 0.289, 0.584]], [0.147, [0.525, 0.289, 0.584]], [0.149, [0.530, 0.299, 0.591]], [0.151, [0.530, 0.299, 0.591]], [0.153, [0.535, 0.310, 0.597]], [0.155, [0.535, 0.310, 0.597]], [0.157, [0.541, 0.321, 0.603]], [0.159, [0.541, 0.321, 0.603]], [0.160, [0.546, 0.332, 0.609]], [0.162, [0.546, 0.332, 0.609]], [0.164, [0.552, 0.342, 0.615]], [0.166, [0.552, 0.342, 0.615]], [0.168, [0.557, 0.353, 0.621]], [0.170, [0.557, 0.353, 0.621]], [0.172, [0.562, 0.364, 0.628]], [0.174, [0.562, 0.364, 0.628]], [0.176, [0.568, 0.375, 0.634]], [0.178, [0.568, 0.375, 0.634]], [0.180, [0.573, 0.385, 0.640]], [0.182, [0.573, 0.385, 0.640]], [0.184, [0.578, 0.396, 0.646]], [0.186, [0.578, 0.396, 0.646]], [0.188, [0.584, 0.407, 0.652]], [0.190, [0.584, 0.407, 0.652]], [0.192, [0.589, 0.418, 0.658]], [0.194, [0.589, 0.418, 0.658]], [0.196, [0.595, 0.428, 0.664]], [0.198, [0.595, 0.428, 0.664]], [0.200, [0.600, 0.439, 0.671]], [0.202, [0.600, 0.439, 0.671]], [0.204, [0.606, 0.447, 0.676]], [0.205, [0.606, 0.447, 0.676]], [0.207, [0.613, 0.456, 0.682]], [0.209, [0.613, 0.456, 0.682]], [0.211, [0.619, 0.464, 0.687]], [0.213, [0.619, 0.464, 0.687]], [0.215, [0.625, 0.472, 0.693]], [0.217, [0.625, 0.472, 0.693]], [0.219, [0.632, 0.480, 0.698]], [0.221, [0.632, 0.480, 0.698]], [0.223, [0.638, 0.488, 0.704]], [0.225, [0.638, 0.488, 0.704]], [0.227, [0.644, 0.496, 0.709]], [0.229, [0.644, 0.496, 0.709]], [0.231, [0.650, 0.504, 0.715]], [0.233, [0.650, 0.504, 0.715]], [0.235, [0.657, 0.513, 0.720]], [0.237, [0.657, 0.513, 0.720]], [0.239, [0.663, 0.521, 0.726]], [0.241, [0.663, 0.521, 0.726]], [0.243, [0.669, 0.529, 0.731]], [0.245, [0.669, 0.529, 0.731]], [0.247, [0.676, 0.537, 0.737]], [0.249, [0.676, 0.537, 0.737]], [0.250, [0.682, 0.545, 0.743]], [0.252, [0.682, 0.545, 0.743]], [0.254, [0.688, 0.553, 0.748]], [0.256, [0.688, 0.553, 0.748]], [0.258, [0.695, 0.561, 0.754]], [0.260, [0.695, 0.561, 0.754]], [0.262, [0.701, 0.570, 0.759]], [0.264, [0.701, 0.570, 0.759]], [0.266, [0.707, 0.578, 0.765]], [0.268, [0.707, 0.578, 0.765]], [0.270, [0.713, 0.586, 0.770]], [0.272, [0.713, 0.586, 0.770]], [0.274, [0.720, 0.594, 0.776]], [0.276, [0.720, 0.594, 0.776]], [0.278, [0.726, 0.602, 0.781]], [0.280, [0.726, 0.602, 0.781]], [0.282, [0.732, 0.610, 0.787]], [0.284, [0.732, 0.610, 0.787]], [0.286, [0.739, 0.619, 0.792]], [0.288, [0.739, 0.619, 0.792]], [0.290, [0.745, 0.627, 0.798]], [0.292, [0.745, 0.627, 0.798]], [0.294, [0.751, 0.635, 0.803]], [0.295, [0.751, 0.635, 0.803]], [0.297, [0.758, 0.643, 0.809]], [0.299, [0.758, 0.643, 0.809]], [0.301, [0.764, 0.651, 0.814]], [0.303, [0.764, 0.651, 0.814]], [0.305, [0.769, 0.658, 0.818]], [0.307, [0.769, 0.658, 0.818]], [0.309, [0.775, 0.665, 0.821]], [0.311, [0.775, 0.665, 0.821]], [0.313, [0.781, 0.672, 0.825]], [0.315, [0.781, 0.672, 0.825]], [0.317, [0.786, 0.680, 0.829]], [0.319, [0.786, 0.680, 0.829]], [0.321, [0.792, 0.687, 0.833]], [0.323, [0.792, 0.687, 0.833]], [0.325, [0.798, 0.694, 0.837]], [0.327, [0.798, 0.694, 0.837]], [0.329, [0.803, 0.701, 0.841]], [0.331, [0.803, 0.701, 0.841]], [0.333, [0.809, 0.708, 0.844]], [0.335, [0.809, 0.708, 0.844]], [0.337, [0.815, 0.716, 0.848]], [0.339, [0.815, 0.716, 0.848]], [0.341, [0.821, 0.723, 0.852]], [0.342, [0.821, 0.723, 0.852]], [0.344, [0.826, 0.730, 0.856]], [0.346, [0.826, 0.730, 0.856]], [0.348, [0.832, 0.737, 0.860]], [0.350, [0.832, 0.737, 0.860]], [0.352, [0.838, 0.745, 0.864]], [0.354, [0.838, 0.745, 0.864]], [0.356, [0.843, 0.752, 0.868]], [0.358, [0.843, 0.752, 0.868]], [0.360, [0.849, 0.759, 0.871]], [0.362, [0.849, 0.759, 0.871]], [0.364, [0.855, 0.766, 0.875]], [0.366, [0.855, 0.766, 0.875]], [0.368, [0.860, 0.774, 0.879]], [0.370, [0.860, 0.774, 0.879]], [0.372, [0.866, 0.781, 0.883]], [0.374, [0.866, 0.781, 0.883]], [0.376, [0.872, 0.788, 0.887]], [0.378, [0.872, 0.788, 0.887]], [0.380, [0.877, 0.795, 0.891]], [0.382, [0.877, 0.795, 0.891]], [0.384, [0.883, 0.802, 0.894]], [0.386, [0.883, 0.802, 0.894]], [0.387, [0.889, 0.810, 0.898]], [0.389, [0.889, 0.810, 0.898]], [0.391, [0.895, 0.817, 0.902]], [0.393, [0.895, 0.817, 0.902]], [0.395, [0.900, 0.824, 0.906]], [0.397, [0.900, 0.824, 0.906]], [0.399, [0.906, 0.831, 0.910]], [0.401, [0.906, 0.831, 0.910]], [0.403, [0.908, 0.837, 0.912]], [0.405, [0.908, 0.837, 0.912]], [0.407, [0.911, 0.842, 0.914]], [0.409, [0.911, 0.842, 0.914]], [0.411, [0.913, 0.848, 0.917]], [0.413, [0.913, 0.848, 0.917]], [0.415, [0.916, 0.853, 0.919]], [0.417, [0.916, 0.853, 0.919]], [0.419, [0.918, 0.858, 0.921]], [0.421, [0.918, 0.858, 0.921]], [0.423, [0.921, 0.864, 0.924]], [0.425, [0.921, 0.864, 0.924]], [0.427, [0.923, 0.869, 0.926]], [0.429, [0.923, 0.869, 0.926]], [0.431, [0.926, 0.874, 0.928]], [0.432, [0.926, 0.874, 0.928]], [0.434, [0.928, 0.880, 0.931]], [0.436, [0.928, 0.880, 0.931]], [0.438, [0.930, 0.885, 0.933]], [0.440, [0.930, 0.885, 0.933]], [0.442, [0.933, 0.891, 0.935]], [0.444, [0.933, 0.891, 0.935]], [0.446, [0.935, 0.896, 0.937]], [0.448, [0.935, 0.896, 0.937]], [0.450, [0.938, 0.901, 0.940]], [0.452, [0.938, 0.901, 0.940]], [0.454, [0.940, 0.907, 0.942]], [0.456, [0.940, 0.907, 0.942]], [0.458, [0.943, 0.912, 0.944]], [0.460, [0.943, 0.912, 0.944]], [0.462, [0.945, 0.917, 0.947]], [0.464, [0.945, 0.917, 0.947]], [0.466, [0.948, 0.923, 0.949]], [0.468, [0.948, 0.923, 0.949]], [0.470, [0.950, 0.928, 0.951]], [0.472, [0.950, 0.928, 0.951]], [0.474, [0.953, 0.934, 0.954]], [0.476, [0.953, 0.934, 0.954]], [0.477, [0.955, 0.939, 0.956]], [0.479, [0.955, 0.939, 0.956]], [0.481, [0.958, 0.944, 0.958]], [0.483, [0.958, 0.944, 0.958]], [0.485, [0.960, 0.950, 0.961]], [0.487, [0.960, 0.950, 0.961]], [0.489, [0.962, 0.955, 0.963]], [0.491, [0.962, 0.955, 0.963]], [0.493, [0.965, 0.961, 0.965]], [0.495, [0.965, 0.961, 0.965]], [0.497, [0.967, 0.966, 0.967]], [0.499, [0.967, 0.966, 0.967]], [0.501, [0.966, 0.968, 0.966]], [0.503, [0.966, 0.968, 0.966]], [0.505, [0.962, 0.967, 0.960]], [0.507, [0.962, 0.967, 0.960]], [0.509, [0.957, 0.966, 0.955]], [0.511, [0.957, 0.966, 0.955]], [0.513, [0.952, 0.965, 0.949]], [0.515, [0.952, 0.965, 0.949]], [0.517, [0.948, 0.964, 0.944]], [0.519, [0.948, 0.964, 0.944]], [0.521, [0.943, 0.963, 0.938]], [0.523, [0.943, 0.963, 0.938]], [0.524, [0.939, 0.962, 0.933]], [0.526, [0.939, 0.962, 0.933]], [0.528, [0.934, 0.961, 0.927]], [0.530, [0.934, 0.961, 0.927]], [0.532, [0.929, 0.959, 0.922]], [0.534, [0.929, 0.959, 0.922]], [0.536, [0.925, 0.958, 0.916]], [0.538, [0.925, 0.958, 0.916]], [0.540, [0.920, 0.957, 0.910]], [0.542, [0.920, 0.957, 0.910]], [0.544, [0.916, 0.956, 0.905]], [0.546, [0.916, 0.956, 0.905]], [0.548, [0.911, 0.955, 0.899]], [0.550, [0.911, 0.955, 0.899]], [0.552, [0.906, 0.954, 0.894]], [0.554, [0.906, 0.954, 0.894]], [0.556, [0.902, 0.953, 0.888]], [0.558, [0.902, 0.953, 0.888]], [0.560, [0.897, 0.952, 0.883]], [0.562, [0.897, 0.952, 0.883]], [0.564, [0.893, 0.951, 0.877]], [0.566, [0.893, 0.951, 0.877]], [0.568, [0.888, 0.950, 0.872]], [0.569, [0.888, 0.950, 0.872]], [0.571, [0.883, 0.949, 0.866]], [0.573, [0.883, 0.949, 0.866]], [0.575, [0.879, 0.948, 0.861]], [0.577, [0.879, 0.948, 0.861]], [0.579, [0.874, 0.947, 0.855]], [0.581, [0.874, 0.947, 0.855]], [0.583, [0.869, 0.945, 0.850]], [0.585, [0.869, 0.945, 0.850]], [0.587, [0.865, 0.944, 0.844]], [0.589, [0.865, 0.944, 0.844]], [0.591, [0.860, 0.943, 0.839]], [0.593, [0.860, 0.943, 0.839]], [0.595, [0.856, 0.942, 0.833]], [0.597, [0.856, 0.942, 0.833]], [0.599, [0.851, 0.941, 0.827]], [0.601, [0.851, 0.941, 0.827]], [0.603, [0.843, 0.938, 0.820]], [0.605, [0.843, 0.938, 0.820]], [0.607, [0.835, 0.935, 0.812]], [0.609, [0.835, 0.935, 0.812]], [0.611, [0.827, 0.931, 0.804]], [0.613, [0.827, 0.931, 0.804]], [0.614, [0.820, 0.928, 0.796]], [0.616, [0.820, 0.928, 0.796]], [0.618, [0.812, 0.925, 0.788]], [0.620, [0.812, 0.925, 0.788]], [0.622, [0.804, 0.922, 0.780]], [0.624, [0.804, 0.922, 0.780]], [0.626, [0.796, 0.919, 0.773]], [0.628, [0.796, 0.919, 0.773]], [0.630, [0.788, 0.915, 0.765]], [0.632, [0.788, 0.915, 0.765]], [0.634, [0.780, 0.912, 0.757]], [0.636, [0.780, 0.912, 0.757]], [0.638, [0.773, 0.909, 0.749]], [0.640, [0.773, 0.909, 0.749]], [0.642, [0.765, 0.906, 0.741]], [0.644, [0.765, 0.906, 0.741]], [0.646, [0.757, 0.902, 0.733]], [0.648, [0.757, 0.902, 0.733]], [0.650, [0.749, 0.899, 0.725]], [0.652, [0.749, 0.899, 0.725]], [0.654, [0.741, 0.896, 0.718]], [0.656, [0.741, 0.896, 0.718]], [0.658, [0.733, 0.893, 0.710]], [0.659, [0.733, 0.893, 0.710]], [0.661, [0.725, 0.890, 0.702]], [0.663, [0.725, 0.890, 0.702]], [0.665, [0.718, 0.886, 0.694]], [0.667, [0.718, 0.886, 0.694]], [0.669, [0.710, 0.883, 0.686]], [0.671, [0.710, 0.883, 0.686]], [0.673, [0.702, 0.880, 0.678]], [0.675, [0.702, 0.880, 0.678]], [0.677, [0.694, 0.877, 0.671]], [0.679, [0.694, 0.877, 0.671]], [0.681, [0.686, 0.873, 0.663]], [0.683, [0.686, 0.873, 0.663]], [0.685, [0.678, 0.870, 0.655]], [0.687, [0.678, 0.870, 0.655]], [0.689, [0.671, 0.867, 0.647]], [0.691, [0.671, 0.867, 0.647]], [0.693, [0.663, 0.864, 0.639]], [0.695, [0.663, 0.864, 0.639]], [0.697, [0.655, 0.860, 0.631]], [0.699, [0.655, 0.860, 0.631]], [0.701, [0.645, 0.855, 0.623]], [0.703, [0.645, 0.855, 0.623]], [0.705, [0.633, 0.848, 0.613]], [0.706, [0.633, 0.848, 0.613]], [0.708, [0.622, 0.842, 0.603]], [0.710, [0.622, 0.842, 0.603]], [0.712, [0.610, 0.835, 0.594]], [0.714, [0.610, 0.835, 0.594]], [0.716, [0.598, 0.828, 0.584]], [0.718, [0.598, 0.828, 0.584]], [0.720, [0.587, 0.821, 0.574]], [0.722, [0.587, 0.821, 0.574]], [0.724, [0.575, 0.814, 0.564]], [0.726, [0.575, 0.814, 0.564]], [0.728, [0.563, 0.807, 0.555]], [0.730, [0.563, 0.807, 0.555]], [0.732, [0.552, 0.800, 0.545]], [0.734, [0.552, 0.800, 0.545]], [0.736, [0.540, 0.793, 0.535]], [0.738, [0.540, 0.793, 0.535]], [0.740, [0.528, 0.786, 0.526]], [0.742, [0.528, 0.786, 0.526]], [0.744, [0.517, 0.779, 0.516]], [0.746, [0.517, 0.779, 0.516]], [0.748, [0.505, 0.772, 0.506]], [0.750, [0.505, 0.772, 0.506]], [0.751, [0.493, 0.765, 0.497]], [0.753, [0.493, 0.765, 0.497]], [0.755, [0.482, 0.758, 0.487]], [0.757, [0.482, 0.758, 0.487]], [0.759, [0.470, 0.752, 0.477]], [0.761, [0.470, 0.752, 0.477]], [0.763, [0.458, 0.745, 0.468]], [0.765, [0.458, 0.745, 0.468]], [0.767, [0.446, 0.738, 0.458]], [0.769, [0.446, 0.738, 0.458]], [0.771, [0.435, 0.731, 0.448]], [0.773, [0.435, 0.731, 0.448]], [0.775, [0.423, 0.724, 0.439]], [0.777, [0.423, 0.724, 0.439]], [0.779, [0.411, 0.717, 0.429]], [0.781, [0.411, 0.717, 0.429]], [0.783, [0.400, 0.710, 0.419]], [0.785, [0.400, 0.710, 0.419]], [0.787, [0.388, 0.703, 0.409]], [0.789, [0.388, 0.703, 0.409]], [0.791, [0.376, 0.696, 0.400]], [0.793, [0.376, 0.696, 0.400]], [0.795, [0.365, 0.689, 0.390]], [0.796, [0.365, 0.689, 0.390]], [0.798, [0.353, 0.682, 0.380]], [0.800, [0.353, 0.682, 0.380]], [0.802, [0.343, 0.674, 0.374]], [0.804, [0.343, 0.674, 0.374]], [0.806, [0.334, 0.666, 0.367]], [0.808, [0.334, 0.666, 0.367]], [0.810, [0.324, 0.657, 0.361]], [0.812, [0.324, 0.657, 0.361]], [0.814, [0.314, 0.649, 0.355]], [0.816, [0.314, 0.649, 0.355]], [0.818, [0.304, 0.641, 0.348]], [0.820, [0.304, 0.641, 0.348]], [0.822, [0.295, 0.633, 0.342]], [0.824, [0.295, 0.633, 0.342]], [0.826, [0.285, 0.624, 0.335]], [0.828, [0.285, 0.624, 0.335]], [0.830, [0.275, 0.616, 0.329]], [0.832, [0.275, 0.616, 0.329]], [0.834, [0.266, 0.608, 0.322]], [0.836, [0.266, 0.608, 0.322]], [0.838, [0.256, 0.599, 0.316]], [0.840, [0.256, 0.599, 0.316]], [0.841, [0.246, 0.591, 0.309]], [0.843, [0.246, 0.591, 0.309]], [0.845, [0.237, 0.583, 0.303]], [0.847, [0.237, 0.583, 0.303]], [0.849, [0.227, 0.574, 0.296]], [0.851, [0.227, 0.574, 0.296]], [0.853, [0.217, 0.566, 0.290]], [0.855, [0.217, 0.566, 0.290]], [0.857, [0.208, 0.558, 0.284]], [0.859, [0.208, 0.558, 0.284]], [0.861, [0.198, 0.549, 0.277]], [0.863, [0.198, 0.549, 0.277]], [0.865, [0.188, 0.541, 0.271]], [0.867, [0.188, 0.541, 0.271]], [0.869, [0.179, 0.533, 0.264]], [0.871, [0.179, 0.533, 0.264]], [0.873, [0.169, 0.525, 0.258]], [0.875, [0.169, 0.525, 0.258]], [0.877, [0.159, 0.516, 0.251]], [0.879, [0.159, 0.516, 0.251]], [0.881, [0.149, 0.508, 0.245]], [0.883, [0.149, 0.508, 0.245]], [0.885, [0.140, 0.500, 0.238]], [0.886, [0.140, 0.500, 0.238]], [0.888, [0.130, 0.491, 0.232]], [0.890, [0.130, 0.491, 0.232]], [0.892, [0.120, 0.483, 0.225]], [0.894, [0.120, 0.483, 0.225]], [0.896, [0.111, 0.475, 0.219]], [0.898, [0.111, 0.475, 0.219]], [0.900, [0.104, 0.467, 0.214]], [0.902, [0.104, 0.467, 0.214]], [0.904, [0.100, 0.459, 0.209]], [0.906, [0.100, 0.459, 0.209]], [0.908, [0.096, 0.451, 0.205]], [0.910, [0.096, 0.451, 0.205]], [0.912, [0.091, 0.443, 0.201]], [0.914, [0.091, 0.443, 0.201]], [0.916, [0.087, 0.435, 0.196]], [0.918, [0.087, 0.435, 0.196]], [0.920, [0.083, 0.427, 0.192]], [0.922, [0.083, 0.427, 0.192]], [0.924, [0.079, 0.419, 0.188]], [0.926, [0.079, 0.419, 0.188]], [0.928, [0.075, 0.411, 0.183]], [0.930, [0.075, 0.411, 0.183]], [0.932, [0.071, 0.403, 0.179]], [0.933, [0.071, 0.403, 0.179]], [0.935, [0.066, 0.395, 0.175]], [0.937, [0.066, 0.395, 0.175]], [0.939, [0.062, 0.387, 0.170]], [0.941, [0.062, 0.387, 0.170]], [0.943, [0.058, 0.379, 0.166]], [0.945, [0.058, 0.379, 0.166]], [0.947, [0.054, 0.371, 0.162]], [0.949, [0.054, 0.371, 0.162]], [0.951, [0.050, 0.363, 0.158]], [0.953, [0.050, 0.363, 0.158]], [0.955, [0.046, 0.355, 0.153]], [0.957, [0.046, 0.355, 0.153]], [0.959, [0.042, 0.347, 0.149]], [0.961, [0.042, 0.347, 0.149]], [0.963, [0.037, 0.339, 0.145]], [0.965, [0.037, 0.339, 0.145]], [0.967, [0.033, 0.331, 0.140]], [0.969, [0.033, 0.331, 0.140]], [0.971, [0.029, 0.323, 0.136]], [0.973, [0.029, 0.323, 0.136]], [0.975, [0.025, 0.315, 0.132]], [0.977, [0.025, 0.315, 0.132]], [0.978, [0.021, 0.307, 0.127]], [0.980, [0.021, 0.307, 0.127]], [0.982, [0.017, 0.299, 0.123]], [0.984, [0.017, 0.299, 0.123]], [0.986, [0.012, 0.291, 0.119]], [0.988, [0.012, 0.291, 0.119]], [0.990, [0.008, 0.283, 0.114]], [0.992, [0.008, 0.283, 0.114]], [0.994, [0.004, 0.275, 0.110]], [0.996, [0.004, 0.275, 0.110]], [0.998, [0.000, 0.267, 0.106]], [1.000, [0.000, 0.267, 0.106]]]; +var PiYG = [[0.000, [0.557, 0.004, 0.322]], [0.002, [0.557, 0.004, 0.322]], [0.004, [0.565, 0.008, 0.328]], [0.006, [0.565, 0.008, 0.328]], [0.008, [0.574, 0.012, 0.335]], [0.010, [0.574, 0.012, 0.335]], [0.012, [0.582, 0.016, 0.341]], [0.014, [0.582, 0.016, 0.341]], [0.016, [0.591, 0.020, 0.348]], [0.018, [0.591, 0.020, 0.348]], [0.020, [0.599, 0.024, 0.355]], [0.022, [0.599, 0.024, 0.355]], [0.023, [0.608, 0.028, 0.361]], [0.025, [0.608, 0.028, 0.361]], [0.027, [0.616, 0.032, 0.368]], [0.029, [0.616, 0.032, 0.368]], [0.031, [0.625, 0.036, 0.374]], [0.033, [0.625, 0.036, 0.374]], [0.035, [0.633, 0.040, 0.381]], [0.037, [0.633, 0.040, 0.381]], [0.039, [0.641, 0.044, 0.388]], [0.041, [0.641, 0.044, 0.388]], [0.043, [0.650, 0.048, 0.394]], [0.045, [0.650, 0.048, 0.394]], [0.047, [0.658, 0.052, 0.401]], [0.049, [0.658, 0.052, 0.401]], [0.051, [0.667, 0.056, 0.408]], [0.053, [0.667, 0.056, 0.408]], [0.055, [0.675, 0.060, 0.414]], [0.057, [0.675, 0.060, 0.414]], [0.059, [0.684, 0.064, 0.421]], [0.061, [0.684, 0.064, 0.421]], [0.063, [0.692, 0.068, 0.427]], [0.065, [0.692, 0.068, 0.427]], [0.067, [0.701, 0.072, 0.434]], [0.068, [0.701, 0.072, 0.434]], [0.070, [0.709, 0.076, 0.441]], [0.072, [0.709, 0.076, 0.441]], [0.074, [0.718, 0.080, 0.447]], [0.076, [0.718, 0.080, 0.447]], [0.078, [0.726, 0.084, 0.454]], [0.080, [0.726, 0.084, 0.454]], [0.082, [0.734, 0.088, 0.460]], [0.084, [0.734, 0.088, 0.460]], [0.086, [0.743, 0.092, 0.467]], [0.088, [0.743, 0.092, 0.467]], [0.090, [0.751, 0.096, 0.474]], [0.092, [0.751, 0.096, 0.474]], [0.094, [0.760, 0.100, 0.480]], [0.096, [0.760, 0.100, 0.480]], [0.098, [0.768, 0.104, 0.487]], [0.100, [0.768, 0.104, 0.487]], [0.102, [0.774, 0.113, 0.494]], [0.104, [0.774, 0.113, 0.494]], [0.106, [0.778, 0.127, 0.501]], [0.108, [0.778, 0.127, 0.501]], [0.110, [0.782, 0.141, 0.509]], [0.112, [0.782, 0.141, 0.509]], [0.114, [0.786, 0.155, 0.517]], [0.115, [0.786, 0.155, 0.517]], [0.117, [0.790, 0.170, 0.524]], [0.119, [0.790, 0.170, 0.524]], [0.121, [0.794, 0.184, 0.532]], [0.123, [0.794, 0.184, 0.532]], [0.125, [0.798, 0.198, 0.539]], [0.127, [0.798, 0.198, 0.539]], [0.129, [0.801, 0.212, 0.547]], [0.131, [0.801, 0.212, 0.547]], [0.133, [0.805, 0.226, 0.554]], [0.135, [0.805, 0.226, 0.554]], [0.137, [0.809, 0.240, 0.562]], [0.139, [0.809, 0.240, 0.562]], [0.141, [0.813, 0.254, 0.569]], [0.143, [0.813, 0.254, 0.569]], [0.145, [0.817, 0.269, 0.577]], [0.147, [0.817, 0.269, 0.577]], [0.149, [0.821, 0.283, 0.584]], [0.151, [0.821, 0.283, 0.584]], [0.153, [0.824, 0.297, 0.592]], [0.155, [0.824, 0.297, 0.592]], [0.157, [0.828, 0.311, 0.599]], [0.159, [0.828, 0.311, 0.599]], [0.160, [0.832, 0.325, 0.607]], [0.162, [0.832, 0.325, 0.607]], [0.164, [0.836, 0.339, 0.615]], [0.166, [0.836, 0.339, 0.615]], [0.168, [0.840, 0.353, 0.622]], [0.170, [0.840, 0.353, 0.622]], [0.172, [0.844, 0.368, 0.630]], [0.174, [0.844, 0.368, 0.630]], [0.176, [0.848, 0.382, 0.637]], [0.178, [0.848, 0.382, 0.637]], [0.180, [0.851, 0.396, 0.645]], [0.182, [0.851, 0.396, 0.645]], [0.184, [0.855, 0.410, 0.652]], [0.186, [0.855, 0.410, 0.652]], [0.188, [0.859, 0.424, 0.660]], [0.190, [0.859, 0.424, 0.660]], [0.192, [0.863, 0.438, 0.667]], [0.194, [0.863, 0.438, 0.667]], [0.196, [0.867, 0.453, 0.675]], [0.198, [0.867, 0.453, 0.675]], [0.200, [0.871, 0.467, 0.682]], [0.202, [0.871, 0.467, 0.682]], [0.204, [0.874, 0.476, 0.689]], [0.205, [0.874, 0.476, 0.689]], [0.207, [0.876, 0.486, 0.696]], [0.209, [0.876, 0.486, 0.696]], [0.211, [0.879, 0.496, 0.703]], [0.213, [0.879, 0.496, 0.703]], [0.215, [0.882, 0.505, 0.709]], [0.217, [0.882, 0.505, 0.709]], [0.219, [0.885, 0.515, 0.716]], [0.221, [0.885, 0.515, 0.716]], [0.223, [0.888, 0.525, 0.723]], [0.225, [0.888, 0.525, 0.723]], [0.227, [0.891, 0.534, 0.730]], [0.229, [0.891, 0.534, 0.730]], [0.231, [0.894, 0.544, 0.736]], [0.233, [0.894, 0.544, 0.736]], [0.235, [0.897, 0.554, 0.743]], [0.237, [0.897, 0.554, 0.743]], [0.239, [0.900, 0.564, 0.750]], [0.241, [0.900, 0.564, 0.750]], [0.243, [0.903, 0.573, 0.757]], [0.245, [0.903, 0.573, 0.757]], [0.247, [0.906, 0.583, 0.764]], [0.249, [0.906, 0.583, 0.764]], [0.250, [0.909, 0.593, 0.770]], [0.252, [0.909, 0.593, 0.770]], [0.254, [0.911, 0.602, 0.777]], [0.256, [0.911, 0.602, 0.777]], [0.258, [0.914, 0.612, 0.784]], [0.260, [0.914, 0.612, 0.784]], [0.262, [0.917, 0.622, 0.791]], [0.264, [0.917, 0.622, 0.791]], [0.266, [0.920, 0.631, 0.797]], [0.268, [0.920, 0.631, 0.797]], [0.270, [0.923, 0.641, 0.804]], [0.272, [0.923, 0.641, 0.804]], [0.274, [0.926, 0.651, 0.811]], [0.276, [0.926, 0.651, 0.811]], [0.278, [0.929, 0.660, 0.818]], [0.280, [0.929, 0.660, 0.818]], [0.282, [0.932, 0.670, 0.824]], [0.284, [0.932, 0.670, 0.824]], [0.286, [0.935, 0.680, 0.831]], [0.288, [0.935, 0.680, 0.831]], [0.290, [0.938, 0.690, 0.838]], [0.292, [0.938, 0.690, 0.838]], [0.294, [0.941, 0.699, 0.845]], [0.295, [0.941, 0.699, 0.845]], [0.297, [0.944, 0.709, 0.852]], [0.299, [0.944, 0.709, 0.852]], [0.301, [0.946, 0.717, 0.857]], [0.303, [0.946, 0.717, 0.857]], [0.305, [0.948, 0.723, 0.860]], [0.307, [0.948, 0.723, 0.860]], [0.309, [0.950, 0.730, 0.863]], [0.311, [0.950, 0.730, 0.863]], [0.313, [0.952, 0.736, 0.866]], [0.315, [0.952, 0.736, 0.866]], [0.317, [0.953, 0.743, 0.869]], [0.319, [0.953, 0.743, 0.869]], [0.321, [0.955, 0.749, 0.873]], [0.323, [0.955, 0.749, 0.873]], [0.325, [0.957, 0.756, 0.876]], [0.327, [0.957, 0.756, 0.876]], [0.329, [0.959, 0.762, 0.879]], [0.331, [0.959, 0.762, 0.879]], [0.333, [0.961, 0.769, 0.882]], [0.335, [0.961, 0.769, 0.882]], [0.337, [0.963, 0.775, 0.886]], [0.339, [0.963, 0.775, 0.886]], [0.341, [0.964, 0.782, 0.889]], [0.342, [0.964, 0.782, 0.889]], [0.344, [0.966, 0.788, 0.892]], [0.346, [0.966, 0.788, 0.892]], [0.348, [0.968, 0.794, 0.895]], [0.350, [0.968, 0.794, 0.895]], [0.352, [0.970, 0.801, 0.899]], [0.354, [0.970, 0.801, 0.899]], [0.356, [0.972, 0.807, 0.902]], [0.358, [0.972, 0.807, 0.902]], [0.360, [0.974, 0.814, 0.905]], [0.362, [0.974, 0.814, 0.905]], [0.364, [0.976, 0.820, 0.908]], [0.366, [0.976, 0.820, 0.908]], [0.368, [0.977, 0.827, 0.911]], [0.370, [0.977, 0.827, 0.911]], [0.372, [0.979, 0.833, 0.915]], [0.374, [0.979, 0.833, 0.915]], [0.376, [0.981, 0.840, 0.918]], [0.378, [0.981, 0.840, 0.918]], [0.380, [0.983, 0.846, 0.921]], [0.382, [0.983, 0.846, 0.921]], [0.384, [0.985, 0.853, 0.924]], [0.386, [0.985, 0.853, 0.924]], [0.387, [0.987, 0.859, 0.928]], [0.389, [0.987, 0.859, 0.928]], [0.391, [0.988, 0.866, 0.931]], [0.393, [0.988, 0.866, 0.931]], [0.395, [0.990, 0.872, 0.934]], [0.397, [0.990, 0.872, 0.934]], [0.399, [0.992, 0.878, 0.937]], [0.401, [0.992, 0.878, 0.937]], [0.403, [0.991, 0.882, 0.938]], [0.405, [0.991, 0.882, 0.938]], [0.407, [0.990, 0.886, 0.940]], [0.409, [0.990, 0.886, 0.940]], [0.411, [0.989, 0.889, 0.941]], [0.413, [0.989, 0.889, 0.941]], [0.415, [0.988, 0.893, 0.942]], [0.417, [0.988, 0.893, 0.942]], [0.419, [0.988, 0.896, 0.943]], [0.421, [0.988, 0.896, 0.943]], [0.423, [0.987, 0.900, 0.945]], [0.425, [0.987, 0.900, 0.945]], [0.427, [0.986, 0.903, 0.946]], [0.429, [0.986, 0.903, 0.946]], [0.431, [0.985, 0.907, 0.947]], [0.432, [0.985, 0.907, 0.947]], [0.434, [0.984, 0.910, 0.948]], [0.436, [0.984, 0.910, 0.948]], [0.438, [0.983, 0.914, 0.950]], [0.440, [0.983, 0.914, 0.950]], [0.442, [0.982, 0.917, 0.951]], [0.444, [0.982, 0.917, 0.951]], [0.446, [0.981, 0.921, 0.952]], [0.448, [0.981, 0.921, 0.952]], [0.450, [0.980, 0.924, 0.953]], [0.452, [0.980, 0.924, 0.953]], [0.454, [0.979, 0.928, 0.954]], [0.456, [0.979, 0.928, 0.954]], [0.458, [0.978, 0.931, 0.956]], [0.460, [0.978, 0.931, 0.956]], [0.462, [0.977, 0.935, 0.957]], [0.464, [0.977, 0.935, 0.957]], [0.466, [0.976, 0.939, 0.958]], [0.468, [0.976, 0.939, 0.958]], [0.470, [0.976, 0.942, 0.959]], [0.472, [0.976, 0.942, 0.959]], [0.474, [0.975, 0.946, 0.961]], [0.476, [0.975, 0.946, 0.961]], [0.477, [0.974, 0.949, 0.962]], [0.479, [0.974, 0.949, 0.962]], [0.481, [0.973, 0.953, 0.963]], [0.483, [0.973, 0.953, 0.963]], [0.485, [0.972, 0.956, 0.964]], [0.487, [0.972, 0.956, 0.964]], [0.489, [0.971, 0.960, 0.966]], [0.491, [0.971, 0.960, 0.966]], [0.493, [0.970, 0.963, 0.967]], [0.495, [0.970, 0.963, 0.967]], [0.497, [0.969, 0.967, 0.968]], [0.499, [0.969, 0.967, 0.968]], [0.501, [0.967, 0.968, 0.966]], [0.503, [0.967, 0.968, 0.966]], [0.505, [0.965, 0.968, 0.960]], [0.507, [0.965, 0.968, 0.960]], [0.509, [0.962, 0.968, 0.954]], [0.511, [0.962, 0.968, 0.954]], [0.513, [0.959, 0.968, 0.948]], [0.515, [0.959, 0.968, 0.948]], [0.517, [0.957, 0.967, 0.942]], [0.519, [0.957, 0.967, 0.942]], [0.521, [0.954, 0.967, 0.936]], [0.523, [0.954, 0.967, 0.936]], [0.524, [0.952, 0.967, 0.930]], [0.526, [0.952, 0.967, 0.930]], [0.528, [0.949, 0.966, 0.924]], [0.530, [0.949, 0.966, 0.924]], [0.532, [0.946, 0.966, 0.918]], [0.534, [0.946, 0.966, 0.918]], [0.536, [0.944, 0.966, 0.912]], [0.538, [0.944, 0.966, 0.912]], [0.540, [0.941, 0.965, 0.906]], [0.542, [0.941, 0.965, 0.906]], [0.544, [0.939, 0.965, 0.900]], [0.546, [0.939, 0.965, 0.900]], [0.548, [0.936, 0.965, 0.894]], [0.550, [0.936, 0.965, 0.894]], [0.552, [0.933, 0.964, 0.888]], [0.554, [0.933, 0.964, 0.888]], [0.556, [0.931, 0.964, 0.882]], [0.558, [0.931, 0.964, 0.882]], [0.560, [0.928, 0.964, 0.876]], [0.562, [0.928, 0.964, 0.876]], [0.564, [0.925, 0.964, 0.870]], [0.566, [0.925, 0.964, 0.870]], [0.568, [0.923, 0.963, 0.864]], [0.569, [0.923, 0.963, 0.864]], [0.571, [0.920, 0.963, 0.858]], [0.573, [0.920, 0.963, 0.858]], [0.575, [0.918, 0.963, 0.852]], [0.577, [0.918, 0.963, 0.852]], [0.579, [0.915, 0.962, 0.846]], [0.581, [0.915, 0.962, 0.846]], [0.583, [0.912, 0.962, 0.840]], [0.585, [0.912, 0.962, 0.840]], [0.587, [0.910, 0.962, 0.834]], [0.589, [0.910, 0.962, 0.834]], [0.591, [0.907, 0.961, 0.828]], [0.593, [0.907, 0.961, 0.828]], [0.595, [0.905, 0.961, 0.822]], [0.597, [0.905, 0.961, 0.822]], [0.599, [0.902, 0.961, 0.816]], [0.601, [0.902, 0.961, 0.816]], [0.603, [0.895, 0.958, 0.804]], [0.605, [0.895, 0.958, 0.804]], [0.607, [0.888, 0.955, 0.793]], [0.609, [0.888, 0.955, 0.793]], [0.611, [0.881, 0.952, 0.782]], [0.613, [0.881, 0.952, 0.782]], [0.614, [0.874, 0.948, 0.770]], [0.616, [0.874, 0.948, 0.770]], [0.618, [0.867, 0.945, 0.759]], [0.620, [0.867, 0.945, 0.759]], [0.622, [0.860, 0.942, 0.747]], [0.624, [0.860, 0.942, 0.747]], [0.626, [0.852, 0.939, 0.736]], [0.628, [0.852, 0.939, 0.736]], [0.630, [0.845, 0.936, 0.725]], [0.632, [0.845, 0.936, 0.725]], [0.634, [0.838, 0.933, 0.713]], [0.636, [0.838, 0.933, 0.713]], [0.638, [0.831, 0.930, 0.702]], [0.640, [0.831, 0.930, 0.702]], [0.642, [0.824, 0.927, 0.691]], [0.644, [0.824, 0.927, 0.691]], [0.646, [0.817, 0.924, 0.679]], [0.648, [0.817, 0.924, 0.679]], [0.650, [0.810, 0.921, 0.668]], [0.652, [0.810, 0.921, 0.668]], [0.654, [0.803, 0.918, 0.656]], [0.656, [0.803, 0.918, 0.656]], [0.658, [0.796, 0.915, 0.645]], [0.659, [0.796, 0.915, 0.645]], [0.661, [0.789, 0.912, 0.634]], [0.663, [0.789, 0.912, 0.634]], [0.665, [0.782, 0.908, 0.622]], [0.667, [0.782, 0.908, 0.622]], [0.669, [0.775, 0.905, 0.611]], [0.671, [0.775, 0.905, 0.611]], [0.673, [0.768, 0.902, 0.599]], [0.675, [0.768, 0.902, 0.599]], [0.677, [0.760, 0.899, 0.588]], [0.679, [0.760, 0.899, 0.588]], [0.681, [0.753, 0.896, 0.577]], [0.683, [0.753, 0.896, 0.577]], [0.685, [0.746, 0.893, 0.565]], [0.687, [0.746, 0.893, 0.565]], [0.689, [0.739, 0.890, 0.554]], [0.691, [0.739, 0.890, 0.554]], [0.693, [0.732, 0.887, 0.543]], [0.695, [0.732, 0.887, 0.543]], [0.697, [0.725, 0.884, 0.531]], [0.699, [0.725, 0.884, 0.531]], [0.701, [0.717, 0.880, 0.520]], [0.703, [0.717, 0.880, 0.520]], [0.705, [0.708, 0.874, 0.510]], [0.706, [0.708, 0.874, 0.510]], [0.708, [0.700, 0.868, 0.499]], [0.710, [0.700, 0.868, 0.499]], [0.712, [0.691, 0.862, 0.488]], [0.714, [0.691, 0.862, 0.488]], [0.716, [0.682, 0.857, 0.478]], [0.718, [0.682, 0.857, 0.478]], [0.720, [0.673, 0.851, 0.467]], [0.722, [0.673, 0.851, 0.467]], [0.724, [0.665, 0.845, 0.457]], [0.726, [0.665, 0.845, 0.457]], [0.728, [0.656, 0.840, 0.446]], [0.730, [0.656, 0.840, 0.446]], [0.732, [0.647, 0.834, 0.435]], [0.734, [0.647, 0.834, 0.435]], [0.736, [0.638, 0.828, 0.425]], [0.738, [0.638, 0.828, 0.425]], [0.740, [0.630, 0.823, 0.414]], [0.742, [0.630, 0.823, 0.414]], [0.744, [0.621, 0.817, 0.403]], [0.746, [0.621, 0.817, 0.403]], [0.748, [0.612, 0.811, 0.393]], [0.750, [0.612, 0.811, 0.393]], [0.751, [0.603, 0.806, 0.382]], [0.753, [0.603, 0.806, 0.382]], [0.755, [0.594, 0.800, 0.372]], [0.757, [0.594, 0.800, 0.372]], [0.759, [0.586, 0.794, 0.361]], [0.761, [0.586, 0.794, 0.361]], [0.763, [0.577, 0.788, 0.350]], [0.765, [0.577, 0.788, 0.350]], [0.767, [0.568, 0.783, 0.340]], [0.769, [0.568, 0.783, 0.340]], [0.771, [0.559, 0.777, 0.329]], [0.773, [0.559, 0.777, 0.329]], [0.775, [0.551, 0.771, 0.319]], [0.777, [0.551, 0.771, 0.319]], [0.779, [0.542, 0.766, 0.308]], [0.781, [0.542, 0.766, 0.308]], [0.783, [0.533, 0.760, 0.297]], [0.785, [0.533, 0.760, 0.297]], [0.787, [0.524, 0.754, 0.287]], [0.789, [0.524, 0.754, 0.287]], [0.791, [0.516, 0.749, 0.276]], [0.793, [0.516, 0.749, 0.276]], [0.795, [0.507, 0.743, 0.266]], [0.796, [0.507, 0.743, 0.266]], [0.798, [0.498, 0.737, 0.255]], [0.800, [0.498, 0.737, 0.255]], [0.802, [0.490, 0.731, 0.250]], [0.804, [0.490, 0.731, 0.250]], [0.806, [0.483, 0.724, 0.245]], [0.808, [0.483, 0.724, 0.245]], [0.810, [0.475, 0.718, 0.240]], [0.812, [0.475, 0.718, 0.240]], [0.814, [0.467, 0.711, 0.235]], [0.816, [0.467, 0.711, 0.235]], [0.818, [0.460, 0.705, 0.230]], [0.820, [0.460, 0.705, 0.230]], [0.822, [0.452, 0.699, 0.225]], [0.824, [0.452, 0.699, 0.225]], [0.826, [0.444, 0.692, 0.220]], [0.828, [0.444, 0.692, 0.220]], [0.830, [0.437, 0.686, 0.216]], [0.832, [0.437, 0.686, 0.216]], [0.834, [0.429, 0.679, 0.211]], [0.836, [0.429, 0.679, 0.211]], [0.838, [0.421, 0.673, 0.206]], [0.840, [0.421, 0.673, 0.206]], [0.841, [0.413, 0.666, 0.201]], [0.843, [0.413, 0.666, 0.201]], [0.845, [0.406, 0.660, 0.196]], [0.847, [0.406, 0.660, 0.196]], [0.849, [0.398, 0.653, 0.191]], [0.851, [0.398, 0.653, 0.191]], [0.853, [0.390, 0.647, 0.186]], [0.855, [0.390, 0.647, 0.186]], [0.857, [0.383, 0.640, 0.181]], [0.859, [0.383, 0.640, 0.181]], [0.861, [0.375, 0.634, 0.176]], [0.863, [0.375, 0.634, 0.176]], [0.865, [0.367, 0.627, 0.171]], [0.867, [0.367, 0.627, 0.171]], [0.869, [0.360, 0.621, 0.166]], [0.871, [0.360, 0.621, 0.166]], [0.873, [0.352, 0.615, 0.161]], [0.875, [0.352, 0.615, 0.161]], [0.877, [0.344, 0.608, 0.156]], [0.879, [0.344, 0.608, 0.156]], [0.881, [0.337, 0.602, 0.152]], [0.883, [0.337, 0.602, 0.152]], [0.885, [0.329, 0.595, 0.147]], [0.886, [0.329, 0.595, 0.147]], [0.888, [0.321, 0.589, 0.142]], [0.890, [0.321, 0.589, 0.142]], [0.892, [0.313, 0.582, 0.137]], [0.894, [0.313, 0.582, 0.137]], [0.896, [0.306, 0.576, 0.132]], [0.898, [0.306, 0.576, 0.132]], [0.900, [0.299, 0.569, 0.129]], [0.902, [0.299, 0.569, 0.129]], [0.904, [0.293, 0.562, 0.128]], [0.906, [0.293, 0.562, 0.128]], [0.908, [0.287, 0.555, 0.126]], [0.910, [0.287, 0.555, 0.126]], [0.912, [0.282, 0.548, 0.125]], [0.914, [0.282, 0.548, 0.125]], [0.916, [0.276, 0.541, 0.124]], [0.918, [0.276, 0.541, 0.124]], [0.920, [0.270, 0.534, 0.123]], [0.922, [0.270, 0.534, 0.123]], [0.924, [0.264, 0.527, 0.121]], [0.926, [0.264, 0.527, 0.121]], [0.928, [0.258, 0.519, 0.120]], [0.930, [0.258, 0.519, 0.120]], [0.932, [0.252, 0.512, 0.119]], [0.933, [0.252, 0.512, 0.119]], [0.935, [0.246, 0.505, 0.118]], [0.937, [0.246, 0.505, 0.118]], [0.939, [0.241, 0.498, 0.116]], [0.941, [0.241, 0.498, 0.116]], [0.943, [0.235, 0.491, 0.115]], [0.945, [0.235, 0.491, 0.115]], [0.947, [0.229, 0.484, 0.114]], [0.949, [0.229, 0.484, 0.114]], [0.951, [0.223, 0.477, 0.113]], [0.953, [0.223, 0.477, 0.113]], [0.955, [0.217, 0.470, 0.112]], [0.957, [0.217, 0.470, 0.112]], [0.959, [0.211, 0.463, 0.110]], [0.961, [0.211, 0.463, 0.110]], [0.963, [0.206, 0.456, 0.109]], [0.965, [0.206, 0.456, 0.109]], [0.967, [0.200, 0.449, 0.108]], [0.969, [0.200, 0.449, 0.108]], [0.971, [0.194, 0.442, 0.107]], [0.973, [0.194, 0.442, 0.107]], [0.975, [0.188, 0.435, 0.105]], [0.977, [0.188, 0.435, 0.105]], [0.978, [0.182, 0.428, 0.104]], [0.980, [0.182, 0.428, 0.104]], [0.982, [0.176, 0.420, 0.103]], [0.984, [0.176, 0.420, 0.103]], [0.986, [0.170, 0.413, 0.102]], [0.988, [0.170, 0.413, 0.102]], [0.990, [0.165, 0.406, 0.100]], [0.992, [0.165, 0.406, 0.100]], [0.994, [0.159, 0.399, 0.099]], [0.996, [0.159, 0.399, 0.099]], [0.998, [0.153, 0.392, 0.098]], [1.000, [0.153, 0.392, 0.098]]]; +var PuOr = [[0.000, [0.498, 0.231, 0.031]], [0.002, [0.498, 0.231, 0.031]], [0.004, [0.506, 0.236, 0.031]], [0.006, [0.506, 0.236, 0.031]], [0.008, [0.514, 0.240, 0.031]], [0.010, [0.514, 0.240, 0.031]], [0.012, [0.522, 0.245, 0.030]], [0.014, [0.522, 0.245, 0.030]], [0.016, [0.530, 0.249, 0.030]], [0.018, [0.530, 0.249, 0.030]], [0.020, [0.538, 0.254, 0.030]], [0.022, [0.538, 0.254, 0.030]], [0.023, [0.546, 0.258, 0.030]], [0.025, [0.546, 0.258, 0.030]], [0.027, [0.554, 0.263, 0.029]], [0.029, [0.554, 0.263, 0.029]], [0.031, [0.562, 0.267, 0.029]], [0.033, [0.562, 0.267, 0.029]], [0.035, [0.570, 0.272, 0.029]], [0.037, [0.570, 0.272, 0.029]], [0.039, [0.578, 0.276, 0.028]], [0.041, [0.578, 0.276, 0.028]], [0.043, [0.586, 0.280, 0.028]], [0.045, [0.586, 0.280, 0.028]], [0.047, [0.594, 0.285, 0.028]], [0.049, [0.594, 0.285, 0.028]], [0.051, [0.602, 0.289, 0.027]], [0.053, [0.602, 0.289, 0.027]], [0.055, [0.610, 0.294, 0.027]], [0.057, [0.610, 0.294, 0.027]], [0.059, [0.618, 0.298, 0.027]], [0.061, [0.618, 0.298, 0.027]], [0.063, [0.626, 0.303, 0.026]], [0.065, [0.626, 0.303, 0.026]], [0.067, [0.634, 0.307, 0.026]], [0.068, [0.634, 0.307, 0.026]], [0.070, [0.642, 0.312, 0.026]], [0.072, [0.642, 0.312, 0.026]], [0.074, [0.650, 0.316, 0.026]], [0.076, [0.650, 0.316, 0.026]], [0.078, [0.658, 0.321, 0.025]], [0.080, [0.658, 0.321, 0.025]], [0.082, [0.666, 0.325, 0.025]], [0.084, [0.666, 0.325, 0.025]], [0.086, [0.674, 0.329, 0.025]], [0.088, [0.674, 0.329, 0.025]], [0.090, [0.682, 0.334, 0.024]], [0.092, [0.682, 0.334, 0.024]], [0.094, [0.690, 0.338, 0.024]], [0.096, [0.690, 0.338, 0.024]], [0.098, [0.698, 0.343, 0.024]], [0.100, [0.698, 0.343, 0.024]], [0.102, [0.705, 0.348, 0.025]], [0.104, [0.705, 0.348, 0.025]], [0.106, [0.712, 0.355, 0.027]], [0.108, [0.712, 0.355, 0.027]], [0.110, [0.719, 0.361, 0.029]], [0.112, [0.719, 0.361, 0.029]], [0.114, [0.726, 0.368, 0.031]], [0.115, [0.726, 0.368, 0.031]], [0.117, [0.733, 0.374, 0.033]], [0.119, [0.733, 0.374, 0.033]], [0.121, [0.740, 0.381, 0.035]], [0.123, [0.740, 0.381, 0.035]], [0.125, [0.747, 0.387, 0.038]], [0.127, [0.747, 0.387, 0.038]], [0.129, [0.754, 0.394, 0.040]], [0.131, [0.754, 0.394, 0.040]], [0.133, [0.761, 0.400, 0.042]], [0.135, [0.761, 0.400, 0.042]], [0.137, [0.768, 0.406, 0.044]], [0.139, [0.768, 0.406, 0.044]], [0.141, [0.775, 0.413, 0.046]], [0.143, [0.775, 0.413, 0.046]], [0.145, [0.782, 0.419, 0.048]], [0.147, [0.782, 0.419, 0.048]], [0.149, [0.788, 0.426, 0.050]], [0.151, [0.788, 0.426, 0.050]], [0.153, [0.795, 0.432, 0.053]], [0.155, [0.795, 0.432, 0.053]], [0.157, [0.802, 0.439, 0.055]], [0.159, [0.802, 0.439, 0.055]], [0.160, [0.809, 0.445, 0.057]], [0.162, [0.809, 0.445, 0.057]], [0.164, [0.816, 0.452, 0.059]], [0.166, [0.816, 0.452, 0.059]], [0.168, [0.823, 0.458, 0.061]], [0.170, [0.823, 0.458, 0.061]], [0.172, [0.830, 0.465, 0.063]], [0.174, [0.830, 0.465, 0.063]], [0.176, [0.837, 0.471, 0.066]], [0.178, [0.837, 0.471, 0.066]], [0.180, [0.844, 0.478, 0.068]], [0.182, [0.844, 0.478, 0.068]], [0.184, [0.851, 0.484, 0.070]], [0.186, [0.851, 0.484, 0.070]], [0.188, [0.858, 0.490, 0.072]], [0.190, [0.858, 0.490, 0.072]], [0.192, [0.865, 0.497, 0.074]], [0.194, [0.865, 0.497, 0.074]], [0.196, [0.872, 0.503, 0.076]], [0.198, [0.872, 0.503, 0.076]], [0.200, [0.878, 0.510, 0.078]], [0.202, [0.878, 0.510, 0.078]], [0.204, [0.883, 0.518, 0.091]], [0.205, [0.883, 0.518, 0.091]], [0.207, [0.887, 0.526, 0.103]], [0.209, [0.887, 0.526, 0.103]], [0.211, [0.892, 0.535, 0.115]], [0.213, [0.892, 0.535, 0.115]], [0.215, [0.896, 0.543, 0.127]], [0.217, [0.896, 0.543, 0.127]], [0.219, [0.901, 0.551, 0.139]], [0.221, [0.901, 0.551, 0.139]], [0.223, [0.905, 0.560, 0.151]], [0.225, [0.905, 0.560, 0.151]], [0.227, [0.910, 0.568, 0.163]], [0.229, [0.910, 0.568, 0.163]], [0.231, [0.914, 0.576, 0.176]], [0.233, [0.914, 0.576, 0.176]], [0.235, [0.919, 0.585, 0.188]], [0.237, [0.919, 0.585, 0.188]], [0.239, [0.923, 0.593, 0.200]], [0.241, [0.923, 0.593, 0.200]], [0.243, [0.927, 0.601, 0.212]], [0.245, [0.927, 0.601, 0.212]], [0.247, [0.932, 0.609, 0.224]], [0.249, [0.932, 0.609, 0.224]], [0.250, [0.936, 0.618, 0.236]], [0.252, [0.936, 0.618, 0.236]], [0.254, [0.941, 0.626, 0.249]], [0.256, [0.941, 0.626, 0.249]], [0.258, [0.945, 0.634, 0.261]], [0.260, [0.945, 0.634, 0.261]], [0.262, [0.950, 0.643, 0.273]], [0.264, [0.950, 0.643, 0.273]], [0.266, [0.954, 0.651, 0.285]], [0.268, [0.954, 0.651, 0.285]], [0.270, [0.959, 0.659, 0.297]], [0.272, [0.959, 0.659, 0.297]], [0.274, [0.963, 0.668, 0.309]], [0.276, [0.963, 0.668, 0.309]], [0.278, [0.968, 0.676, 0.321]], [0.280, [0.968, 0.676, 0.321]], [0.282, [0.972, 0.684, 0.334]], [0.284, [0.972, 0.684, 0.334]], [0.286, [0.977, 0.693, 0.346]], [0.288, [0.977, 0.693, 0.346]], [0.290, [0.981, 0.701, 0.358]], [0.292, [0.981, 0.701, 0.358]], [0.294, [0.985, 0.709, 0.370]], [0.295, [0.985, 0.709, 0.370]], [0.297, [0.990, 0.717, 0.382]], [0.299, [0.990, 0.717, 0.382]], [0.301, [0.992, 0.725, 0.395]], [0.303, [0.992, 0.725, 0.395]], [0.305, [0.992, 0.731, 0.407]], [0.307, [0.992, 0.731, 0.407]], [0.309, [0.993, 0.737, 0.420]], [0.311, [0.993, 0.737, 0.420]], [0.313, [0.993, 0.743, 0.433]], [0.315, [0.993, 0.743, 0.433]], [0.317, [0.993, 0.749, 0.446]], [0.319, [0.993, 0.749, 0.446]], [0.321, [0.993, 0.755, 0.458]], [0.323, [0.993, 0.755, 0.458]], [0.325, [0.993, 0.762, 0.471]], [0.327, [0.993, 0.762, 0.471]], [0.329, [0.993, 0.768, 0.484]], [0.331, [0.993, 0.768, 0.484]], [0.333, [0.993, 0.774, 0.497]], [0.335, [0.993, 0.774, 0.497]], [0.337, [0.994, 0.780, 0.509]], [0.339, [0.994, 0.780, 0.509]], [0.341, [0.994, 0.786, 0.522]], [0.342, [0.994, 0.786, 0.522]], [0.344, [0.994, 0.792, 0.535]], [0.346, [0.994, 0.792, 0.535]], [0.348, [0.994, 0.798, 0.548]], [0.350, [0.994, 0.798, 0.548]], [0.352, [0.994, 0.805, 0.561]], [0.354, [0.994, 0.805, 0.561]], [0.356, [0.994, 0.811, 0.573]], [0.358, [0.994, 0.811, 0.573]], [0.360, [0.995, 0.817, 0.586]], [0.362, [0.995, 0.817, 0.586]], [0.364, [0.995, 0.823, 0.599]], [0.366, [0.995, 0.823, 0.599]], [0.368, [0.995, 0.829, 0.612]], [0.370, [0.995, 0.829, 0.612]], [0.372, [0.995, 0.835, 0.624]], [0.374, [0.995, 0.835, 0.624]], [0.376, [0.995, 0.842, 0.637]], [0.378, [0.995, 0.842, 0.637]], [0.380, [0.995, 0.848, 0.650]], [0.382, [0.995, 0.848, 0.650]], [0.384, [0.995, 0.854, 0.663]], [0.386, [0.995, 0.854, 0.663]], [0.387, [0.996, 0.860, 0.675]], [0.389, [0.996, 0.860, 0.675]], [0.391, [0.996, 0.866, 0.688]], [0.393, [0.996, 0.866, 0.688]], [0.395, [0.996, 0.872, 0.701]], [0.397, [0.996, 0.872, 0.701]], [0.399, [0.996, 0.878, 0.714]], [0.401, [0.996, 0.878, 0.714]], [0.403, [0.995, 0.882, 0.724]], [0.405, [0.995, 0.882, 0.724]], [0.407, [0.994, 0.886, 0.734]], [0.409, [0.994, 0.886, 0.734]], [0.411, [0.993, 0.889, 0.744]], [0.413, [0.993, 0.889, 0.744]], [0.415, [0.992, 0.893, 0.754]], [0.417, [0.992, 0.893, 0.754]], [0.419, [0.991, 0.896, 0.764]], [0.421, [0.991, 0.896, 0.764]], [0.423, [0.990, 0.900, 0.774]], [0.425, [0.990, 0.900, 0.774]], [0.427, [0.989, 0.903, 0.784]], [0.429, [0.989, 0.903, 0.784]], [0.431, [0.987, 0.907, 0.794]], [0.432, [0.987, 0.907, 0.794]], [0.434, [0.986, 0.910, 0.804]], [0.436, [0.986, 0.910, 0.804]], [0.438, [0.985, 0.914, 0.814]], [0.440, [0.985, 0.914, 0.814]], [0.442, [0.984, 0.917, 0.824]], [0.444, [0.984, 0.917, 0.824]], [0.446, [0.983, 0.921, 0.834]], [0.448, [0.983, 0.921, 0.834]], [0.450, [0.982, 0.924, 0.844]], [0.452, [0.982, 0.924, 0.844]], [0.454, [0.981, 0.928, 0.854]], [0.456, [0.981, 0.928, 0.854]], [0.458, [0.980, 0.931, 0.864]], [0.460, [0.980, 0.931, 0.864]], [0.462, [0.979, 0.935, 0.874]], [0.464, [0.979, 0.935, 0.874]], [0.466, [0.978, 0.939, 0.884]], [0.468, [0.978, 0.939, 0.884]], [0.470, [0.977, 0.942, 0.894]], [0.472, [0.977, 0.942, 0.894]], [0.474, [0.976, 0.946, 0.904]], [0.476, [0.976, 0.946, 0.904]], [0.477, [0.975, 0.949, 0.914]], [0.479, [0.975, 0.949, 0.914]], [0.481, [0.973, 0.953, 0.924]], [0.483, [0.973, 0.953, 0.924]], [0.485, [0.972, 0.956, 0.934]], [0.487, [0.972, 0.956, 0.934]], [0.489, [0.971, 0.960, 0.944]], [0.491, [0.971, 0.960, 0.944]], [0.493, [0.970, 0.963, 0.954]], [0.495, [0.970, 0.963, 0.954]], [0.497, [0.969, 0.967, 0.964]], [0.499, [0.969, 0.967, 0.964]], [0.501, [0.966, 0.966, 0.968]], [0.503, [0.966, 0.966, 0.968]], [0.505, [0.961, 0.962, 0.966]], [0.507, [0.961, 0.962, 0.966]], [0.509, [0.957, 0.957, 0.964]], [0.511, [0.957, 0.957, 0.964]], [0.513, [0.952, 0.953, 0.962]], [0.515, [0.952, 0.953, 0.962]], [0.517, [0.947, 0.949, 0.960]], [0.519, [0.947, 0.949, 0.960]], [0.521, [0.942, 0.944, 0.958]], [0.523, [0.942, 0.944, 0.958]], [0.524, [0.938, 0.940, 0.957]], [0.526, [0.938, 0.940, 0.957]], [0.528, [0.933, 0.935, 0.955]], [0.530, [0.933, 0.935, 0.955]], [0.532, [0.928, 0.931, 0.953]], [0.534, [0.928, 0.931, 0.953]], [0.536, [0.923, 0.926, 0.951]], [0.538, [0.923, 0.926, 0.951]], [0.540, [0.919, 0.922, 0.949]], [0.542, [0.919, 0.922, 0.949]], [0.544, [0.914, 0.917, 0.947]], [0.546, [0.914, 0.917, 0.947]], [0.548, [0.909, 0.913, 0.946]], [0.550, [0.909, 0.913, 0.946]], [0.552, [0.904, 0.908, 0.944]], [0.554, [0.904, 0.908, 0.944]], [0.556, [0.900, 0.904, 0.942]], [0.558, [0.900, 0.904, 0.942]], [0.560, [0.895, 0.900, 0.940]], [0.562, [0.895, 0.900, 0.940]], [0.564, [0.890, 0.895, 0.938]], [0.566, [0.890, 0.895, 0.938]], [0.568, [0.885, 0.891, 0.936]], [0.569, [0.885, 0.891, 0.936]], [0.571, [0.880, 0.886, 0.934]], [0.573, [0.880, 0.886, 0.934]], [0.575, [0.876, 0.882, 0.933]], [0.577, [0.876, 0.882, 0.933]], [0.579, [0.871, 0.877, 0.931]], [0.581, [0.871, 0.877, 0.931]], [0.583, [0.866, 0.873, 0.929]], [0.585, [0.866, 0.873, 0.929]], [0.587, [0.861, 0.868, 0.927]], [0.589, [0.861, 0.868, 0.927]], [0.591, [0.857, 0.864, 0.925]], [0.593, [0.857, 0.864, 0.925]], [0.595, [0.852, 0.859, 0.923]], [0.597, [0.852, 0.859, 0.923]], [0.599, [0.847, 0.855, 0.922]], [0.601, [0.847, 0.855, 0.922]], [0.603, [0.841, 0.848, 0.918]], [0.605, [0.841, 0.848, 0.918]], [0.607, [0.835, 0.840, 0.914]], [0.609, [0.835, 0.840, 0.914]], [0.611, [0.830, 0.833, 0.910]], [0.613, [0.830, 0.833, 0.910]], [0.614, [0.824, 0.826, 0.906]], [0.616, [0.824, 0.826, 0.906]], [0.618, [0.818, 0.819, 0.902]], [0.620, [0.818, 0.819, 0.902]], [0.622, [0.812, 0.812, 0.899]], [0.624, [0.812, 0.812, 0.899]], [0.626, [0.806, 0.804, 0.895]], [0.628, [0.806, 0.804, 0.895]], [0.630, [0.800, 0.797, 0.891]], [0.632, [0.800, 0.797, 0.891]], [0.634, [0.794, 0.790, 0.887]], [0.636, [0.794, 0.790, 0.887]], [0.638, [0.789, 0.783, 0.883]], [0.640, [0.789, 0.783, 0.883]], [0.642, [0.783, 0.775, 0.879]], [0.644, [0.783, 0.775, 0.879]], [0.646, [0.777, 0.768, 0.875]], [0.648, [0.777, 0.768, 0.875]], [0.650, [0.771, 0.761, 0.872]], [0.652, [0.771, 0.761, 0.872]], [0.654, [0.765, 0.754, 0.868]], [0.656, [0.765, 0.754, 0.868]], [0.658, [0.759, 0.746, 0.864]], [0.659, [0.759, 0.746, 0.864]], [0.661, [0.754, 0.739, 0.860]], [0.663, [0.754, 0.739, 0.860]], [0.665, [0.748, 0.732, 0.856]], [0.667, [0.748, 0.732, 0.856]], [0.669, [0.742, 0.725, 0.852]], [0.671, [0.742, 0.725, 0.852]], [0.673, [0.736, 0.718, 0.849]], [0.675, [0.736, 0.718, 0.849]], [0.677, [0.730, 0.710, 0.845]], [0.679, [0.730, 0.710, 0.845]], [0.681, [0.724, 0.703, 0.841]], [0.683, [0.724, 0.703, 0.841]], [0.685, [0.718, 0.696, 0.837]], [0.687, [0.718, 0.696, 0.837]], [0.689, [0.713, 0.689, 0.833]], [0.691, [0.713, 0.689, 0.833]], [0.693, [0.707, 0.681, 0.829]], [0.695, [0.707, 0.681, 0.829]], [0.697, [0.701, 0.674, 0.825]], [0.699, [0.701, 0.674, 0.825]], [0.701, [0.694, 0.666, 0.821]], [0.703, [0.694, 0.666, 0.821]], [0.705, [0.687, 0.658, 0.815]], [0.706, [0.687, 0.658, 0.815]], [0.708, [0.679, 0.649, 0.809]], [0.710, [0.679, 0.649, 0.809]], [0.712, [0.671, 0.640, 0.803]], [0.714, [0.671, 0.640, 0.803]], [0.716, [0.663, 0.632, 0.797]], [0.718, [0.663, 0.632, 0.797]], [0.720, [0.656, 0.623, 0.791]], [0.722, [0.656, 0.623, 0.791]], [0.724, [0.648, 0.615, 0.786]], [0.726, [0.648, 0.615, 0.786]], [0.728, [0.640, 0.606, 0.780]], [0.730, [0.640, 0.606, 0.780]], [0.732, [0.633, 0.597, 0.774]], [0.734, [0.633, 0.597, 0.774]], [0.736, [0.625, 0.589, 0.768]], [0.738, [0.625, 0.589, 0.768]], [0.740, [0.617, 0.580, 0.762]], [0.742, [0.617, 0.580, 0.762]], [0.744, [0.610, 0.572, 0.756]], [0.746, [0.610, 0.572, 0.756]], [0.748, [0.602, 0.563, 0.750]], [0.750, [0.602, 0.563, 0.750]], [0.751, [0.594, 0.554, 0.745]], [0.753, [0.594, 0.554, 0.745]], [0.755, [0.587, 0.546, 0.739]], [0.757, [0.587, 0.546, 0.739]], [0.759, [0.579, 0.537, 0.733]], [0.761, [0.579, 0.537, 0.733]], [0.763, [0.571, 0.528, 0.727]], [0.765, [0.571, 0.528, 0.727]], [0.767, [0.563, 0.520, 0.721]], [0.769, [0.563, 0.520, 0.721]], [0.771, [0.556, 0.511, 0.715]], [0.773, [0.556, 0.511, 0.715]], [0.775, [0.548, 0.503, 0.710]], [0.777, [0.548, 0.503, 0.710]], [0.779, [0.540, 0.494, 0.704]], [0.781, [0.540, 0.494, 0.704]], [0.783, [0.533, 0.485, 0.698]], [0.785, [0.533, 0.485, 0.698]], [0.787, [0.525, 0.477, 0.692]], [0.789, [0.525, 0.477, 0.692]], [0.791, [0.517, 0.468, 0.686]], [0.793, [0.517, 0.468, 0.686]], [0.795, [0.510, 0.460, 0.680]], [0.796, [0.510, 0.460, 0.680]], [0.798, [0.502, 0.451, 0.675]], [0.800, [0.502, 0.451, 0.675]], [0.802, [0.495, 0.439, 0.669]], [0.804, [0.495, 0.439, 0.669]], [0.806, [0.488, 0.428, 0.663]], [0.808, [0.488, 0.428, 0.663]], [0.810, [0.482, 0.416, 0.658]], [0.812, [0.482, 0.416, 0.658]], [0.814, [0.475, 0.404, 0.652]], [0.816, [0.475, 0.404, 0.652]], [0.818, [0.468, 0.393, 0.647]], [0.820, [0.468, 0.393, 0.647]], [0.822, [0.461, 0.381, 0.641]], [0.824, [0.461, 0.381, 0.641]], [0.826, [0.455, 0.369, 0.636]], [0.828, [0.455, 0.369, 0.636]], [0.830, [0.448, 0.357, 0.630]], [0.832, [0.448, 0.357, 0.630]], [0.834, [0.441, 0.346, 0.625]], [0.836, [0.441, 0.346, 0.625]], [0.838, [0.434, 0.334, 0.619]], [0.840, [0.434, 0.334, 0.619]], [0.841, [0.428, 0.322, 0.614]], [0.843, [0.428, 0.322, 0.614]], [0.845, [0.421, 0.311, 0.608]], [0.847, [0.421, 0.311, 0.608]], [0.849, [0.414, 0.299, 0.603]], [0.851, [0.414, 0.299, 0.603]], [0.853, [0.407, 0.287, 0.597]], [0.855, [0.407, 0.287, 0.597]], [0.857, [0.400, 0.276, 0.591]], [0.859, [0.400, 0.276, 0.591]], [0.861, [0.394, 0.264, 0.586]], [0.863, [0.394, 0.264, 0.586]], [0.865, [0.387, 0.252, 0.580]], [0.867, [0.387, 0.252, 0.580]], [0.869, [0.380, 0.241, 0.575]], [0.871, [0.380, 0.241, 0.575]], [0.873, [0.373, 0.229, 0.569]], [0.875, [0.373, 0.229, 0.569]], [0.877, [0.367, 0.217, 0.564]], [0.879, [0.367, 0.217, 0.564]], [0.881, [0.360, 0.206, 0.558]], [0.883, [0.360, 0.206, 0.558]], [0.885, [0.353, 0.194, 0.553]], [0.886, [0.353, 0.194, 0.553]], [0.888, [0.346, 0.182, 0.547]], [0.890, [0.346, 0.182, 0.547]], [0.892, [0.340, 0.170, 0.542]], [0.894, [0.340, 0.170, 0.542]], [0.896, [0.333, 0.159, 0.536]], [0.898, [0.333, 0.159, 0.536]], [0.900, [0.326, 0.150, 0.529]], [0.902, [0.326, 0.150, 0.529]], [0.904, [0.320, 0.144, 0.519]], [0.906, [0.320, 0.144, 0.519]], [0.908, [0.314, 0.138, 0.510]], [0.910, [0.314, 0.138, 0.510]], [0.912, [0.308, 0.132, 0.500]], [0.914, [0.308, 0.132, 0.500]], [0.916, [0.302, 0.126, 0.491]], [0.918, [0.302, 0.126, 0.491]], [0.920, [0.296, 0.120, 0.482]], [0.922, [0.296, 0.120, 0.482]], [0.924, [0.290, 0.114, 0.472]], [0.926, [0.290, 0.114, 0.472]], [0.928, [0.284, 0.108, 0.463]], [0.930, [0.284, 0.108, 0.463]], [0.932, [0.278, 0.102, 0.454]], [0.933, [0.278, 0.102, 0.454]], [0.935, [0.272, 0.096, 0.444]], [0.937, [0.272, 0.096, 0.444]], [0.939, [0.266, 0.090, 0.435]], [0.941, [0.266, 0.090, 0.435]], [0.943, [0.260, 0.084, 0.425]], [0.945, [0.260, 0.084, 0.425]], [0.947, [0.254, 0.078, 0.416]], [0.949, [0.254, 0.078, 0.416]], [0.951, [0.248, 0.072, 0.407]], [0.953, [0.248, 0.072, 0.407]], [0.955, [0.242, 0.066, 0.397]], [0.957, [0.242, 0.066, 0.397]], [0.959, [0.236, 0.060, 0.388]], [0.961, [0.236, 0.060, 0.388]], [0.963, [0.230, 0.054, 0.379]], [0.965, [0.230, 0.054, 0.379]], [0.967, [0.224, 0.048, 0.369]], [0.969, [0.224, 0.048, 0.369]], [0.971, [0.218, 0.042, 0.360]], [0.973, [0.218, 0.042, 0.360]], [0.975, [0.212, 0.036, 0.350]], [0.977, [0.212, 0.036, 0.350]], [0.978, [0.206, 0.030, 0.341]], [0.980, [0.206, 0.030, 0.341]], [0.982, [0.200, 0.024, 0.332]], [0.984, [0.200, 0.024, 0.332]], [0.986, [0.194, 0.018, 0.322]], [0.988, [0.194, 0.018, 0.322]], [0.990, [0.188, 0.012, 0.313]], [0.992, [0.188, 0.012, 0.313]], [0.994, [0.182, 0.006, 0.303]], [0.996, [0.182, 0.006, 0.303]], [0.998, [0.176, 0.000, 0.294]], [1.000, [0.176, 0.000, 0.294]]]; +var RdBu = [[0.000, [0.404, 0.000, 0.122]], [0.002, [0.404, 0.000, 0.122]], [0.004, [0.415, 0.004, 0.123]], [0.006, [0.415, 0.004, 0.123]], [0.008, [0.427, 0.007, 0.125]], [0.010, [0.427, 0.007, 0.125]], [0.012, [0.439, 0.011, 0.127]], [0.014, [0.439, 0.011, 0.127]], [0.016, [0.450, 0.015, 0.129]], [0.018, [0.450, 0.015, 0.129]], [0.020, [0.462, 0.018, 0.131]], [0.022, [0.462, 0.018, 0.131]], [0.023, [0.473, 0.022, 0.133]], [0.025, [0.473, 0.022, 0.133]], [0.027, [0.485, 0.026, 0.134]], [0.029, [0.485, 0.026, 0.134]], [0.031, [0.496, 0.030, 0.136]], [0.033, [0.496, 0.030, 0.136]], [0.035, [0.508, 0.033, 0.138]], [0.037, [0.508, 0.033, 0.138]], [0.039, [0.519, 0.037, 0.140]], [0.041, [0.519, 0.037, 0.140]], [0.043, [0.531, 0.041, 0.142]], [0.045, [0.531, 0.041, 0.142]], [0.047, [0.542, 0.044, 0.144]], [0.049, [0.542, 0.044, 0.144]], [0.051, [0.554, 0.048, 0.146]], [0.053, [0.554, 0.048, 0.146]], [0.055, [0.565, 0.052, 0.147]], [0.057, [0.565, 0.052, 0.147]], [0.059, [0.577, 0.055, 0.149]], [0.061, [0.577, 0.055, 0.149]], [0.063, [0.588, 0.059, 0.151]], [0.065, [0.588, 0.059, 0.151]], [0.067, [0.600, 0.063, 0.153]], [0.068, [0.600, 0.063, 0.153]], [0.070, [0.612, 0.066, 0.155]], [0.072, [0.612, 0.066, 0.155]], [0.074, [0.623, 0.070, 0.157]], [0.076, [0.623, 0.070, 0.157]], [0.078, [0.635, 0.074, 0.158]], [0.080, [0.635, 0.074, 0.158]], [0.082, [0.646, 0.078, 0.160]], [0.084, [0.646, 0.078, 0.160]], [0.086, [0.658, 0.081, 0.162]], [0.088, [0.658, 0.081, 0.162]], [0.090, [0.669, 0.085, 0.164]], [0.092, [0.669, 0.085, 0.164]], [0.094, [0.681, 0.089, 0.166]], [0.096, [0.681, 0.089, 0.166]], [0.098, [0.692, 0.092, 0.168]], [0.100, [0.692, 0.092, 0.168]], [0.102, [0.701, 0.100, 0.171]], [0.104, [0.701, 0.100, 0.171]], [0.106, [0.706, 0.111, 0.176]], [0.108, [0.706, 0.111, 0.176]], [0.110, [0.712, 0.122, 0.182]], [0.112, [0.712, 0.122, 0.182]], [0.114, [0.717, 0.133, 0.187]], [0.115, [0.717, 0.133, 0.187]], [0.117, [0.723, 0.144, 0.192]], [0.119, [0.723, 0.144, 0.192]], [0.121, [0.728, 0.155, 0.197]], [0.123, [0.728, 0.155, 0.197]], [0.125, [0.734, 0.166, 0.203]], [0.127, [0.734, 0.166, 0.203]], [0.129, [0.740, 0.177, 0.208]], [0.131, [0.740, 0.177, 0.208]], [0.133, [0.745, 0.188, 0.213]], [0.135, [0.745, 0.188, 0.213]], [0.137, [0.751, 0.199, 0.218]], [0.139, [0.751, 0.199, 0.218]], [0.141, [0.756, 0.210, 0.224]], [0.143, [0.756, 0.210, 0.224]], [0.145, [0.762, 0.221, 0.229]], [0.147, [0.762, 0.221, 0.229]], [0.149, [0.767, 0.233, 0.234]], [0.151, [0.767, 0.233, 0.234]], [0.153, [0.773, 0.244, 0.239]], [0.155, [0.773, 0.244, 0.239]], [0.157, [0.778, 0.255, 0.244]], [0.159, [0.778, 0.255, 0.244]], [0.160, [0.784, 0.266, 0.250]], [0.162, [0.784, 0.266, 0.250]], [0.164, [0.789, 0.277, 0.255]], [0.166, [0.789, 0.277, 0.255]], [0.168, [0.795, 0.288, 0.260]], [0.170, [0.795, 0.288, 0.260]], [0.172, [0.800, 0.299, 0.265]], [0.174, [0.800, 0.299, 0.265]], [0.176, [0.806, 0.310, 0.271]], [0.178, [0.806, 0.310, 0.271]], [0.180, [0.812, 0.321, 0.276]], [0.182, [0.812, 0.321, 0.276]], [0.184, [0.817, 0.332, 0.281]], [0.186, [0.817, 0.332, 0.281]], [0.188, [0.823, 0.343, 0.286]], [0.190, [0.823, 0.343, 0.286]], [0.192, [0.828, 0.354, 0.292]], [0.194, [0.828, 0.354, 0.292]], [0.196, [0.834, 0.365, 0.297]], [0.198, [0.834, 0.365, 0.297]], [0.200, [0.839, 0.376, 0.302]], [0.202, [0.839, 0.376, 0.302]], [0.204, [0.844, 0.387, 0.310]], [0.205, [0.844, 0.387, 0.310]], [0.207, [0.848, 0.398, 0.318]], [0.209, [0.848, 0.398, 0.318]], [0.211, [0.853, 0.408, 0.326]], [0.213, [0.853, 0.408, 0.326]], [0.215, [0.858, 0.419, 0.335]], [0.217, [0.858, 0.419, 0.335]], [0.219, [0.862, 0.430, 0.343]], [0.221, [0.862, 0.430, 0.343]], [0.223, [0.867, 0.440, 0.351]], [0.225, [0.867, 0.440, 0.351]], [0.227, [0.872, 0.451, 0.359]], [0.229, [0.872, 0.451, 0.359]], [0.231, [0.876, 0.461, 0.367]], [0.233, [0.876, 0.461, 0.367]], [0.235, [0.881, 0.472, 0.375]], [0.237, [0.881, 0.472, 0.375]], [0.239, [0.885, 0.483, 0.383]], [0.241, [0.885, 0.483, 0.383]], [0.243, [0.890, 0.493, 0.392]], [0.245, [0.890, 0.493, 0.392]], [0.247, [0.895, 0.504, 0.400]], [0.249, [0.895, 0.504, 0.400]], [0.250, [0.899, 0.514, 0.408]], [0.252, [0.899, 0.514, 0.408]], [0.254, [0.904, 0.525, 0.416]], [0.256, [0.904, 0.525, 0.416]], [0.258, [0.908, 0.536, 0.424]], [0.260, [0.908, 0.536, 0.424]], [0.262, [0.913, 0.546, 0.432]], [0.264, [0.913, 0.546, 0.432]], [0.266, [0.918, 0.557, 0.441]], [0.268, [0.918, 0.557, 0.441]], [0.270, [0.922, 0.567, 0.449]], [0.272, [0.922, 0.567, 0.449]], [0.274, [0.927, 0.578, 0.457]], [0.276, [0.927, 0.578, 0.457]], [0.278, [0.931, 0.589, 0.465]], [0.280, [0.931, 0.589, 0.465]], [0.282, [0.936, 0.599, 0.473]], [0.284, [0.936, 0.599, 0.473]], [0.286, [0.941, 0.610, 0.481]], [0.288, [0.941, 0.610, 0.481]], [0.290, [0.945, 0.621, 0.489]], [0.292, [0.945, 0.621, 0.489]], [0.294, [0.950, 0.631, 0.498]], [0.295, [0.950, 0.631, 0.498]], [0.297, [0.955, 0.642, 0.506]], [0.299, [0.955, 0.642, 0.506]], [0.301, [0.958, 0.651, 0.515]], [0.303, [0.958, 0.651, 0.515]], [0.305, [0.959, 0.660, 0.526]], [0.307, [0.959, 0.660, 0.526]], [0.309, [0.960, 0.668, 0.536]], [0.311, [0.960, 0.668, 0.536]], [0.313, [0.962, 0.676, 0.547]], [0.315, [0.962, 0.676, 0.547]], [0.317, [0.963, 0.684, 0.558]], [0.319, [0.963, 0.684, 0.558]], [0.321, [0.964, 0.693, 0.568]], [0.323, [0.964, 0.693, 0.568]], [0.325, [0.966, 0.701, 0.579]], [0.327, [0.966, 0.701, 0.579]], [0.329, [0.967, 0.709, 0.589]], [0.331, [0.967, 0.709, 0.589]], [0.333, [0.969, 0.718, 0.600]], [0.335, [0.969, 0.718, 0.600]], [0.337, [0.970, 0.726, 0.611]], [0.339, [0.970, 0.726, 0.611]], [0.341, [0.971, 0.734, 0.621]], [0.342, [0.971, 0.734, 0.621]], [0.344, [0.973, 0.743, 0.632]], [0.346, [0.973, 0.743, 0.632]], [0.348, [0.974, 0.751, 0.642]], [0.350, [0.974, 0.751, 0.642]], [0.352, [0.976, 0.759, 0.653]], [0.354, [0.976, 0.759, 0.653]], [0.356, [0.977, 0.767, 0.664]], [0.358, [0.977, 0.767, 0.664]], [0.360, [0.978, 0.776, 0.674]], [0.362, [0.978, 0.776, 0.674]], [0.364, [0.980, 0.784, 0.685]], [0.366, [0.980, 0.784, 0.685]], [0.368, [0.981, 0.792, 0.696]], [0.370, [0.981, 0.792, 0.696]], [0.372, [0.982, 0.801, 0.706]], [0.374, [0.982, 0.801, 0.706]], [0.376, [0.984, 0.809, 0.717]], [0.378, [0.984, 0.809, 0.717]], [0.380, [0.985, 0.817, 0.727]], [0.382, [0.985, 0.817, 0.727]], [0.384, [0.987, 0.826, 0.738]], [0.386, [0.987, 0.826, 0.738]], [0.387, [0.988, 0.834, 0.749]], [0.389, [0.988, 0.834, 0.749]], [0.391, [0.989, 0.842, 0.759]], [0.393, [0.989, 0.842, 0.759]], [0.395, [0.991, 0.851, 0.770]], [0.397, [0.991, 0.851, 0.770]], [0.399, [0.992, 0.859, 0.780]], [0.401, [0.992, 0.859, 0.780]], [0.403, [0.991, 0.863, 0.788]], [0.405, [0.991, 0.863, 0.788]], [0.407, [0.990, 0.867, 0.795]], [0.409, [0.990, 0.867, 0.795]], [0.411, [0.989, 0.872, 0.803]], [0.413, [0.989, 0.872, 0.803]], [0.415, [0.988, 0.876, 0.810]], [0.417, [0.988, 0.876, 0.810]], [0.419, [0.988, 0.880, 0.817]], [0.421, [0.988, 0.880, 0.817]], [0.423, [0.987, 0.885, 0.825]], [0.425, [0.987, 0.885, 0.825]], [0.427, [0.986, 0.889, 0.832]], [0.429, [0.986, 0.889, 0.832]], [0.431, [0.985, 0.893, 0.839]], [0.432, [0.985, 0.893, 0.839]], [0.434, [0.984, 0.898, 0.847]], [0.436, [0.984, 0.898, 0.847]], [0.438, [0.983, 0.902, 0.854]], [0.440, [0.983, 0.902, 0.854]], [0.442, [0.982, 0.906, 0.862]], [0.444, [0.982, 0.906, 0.862]], [0.446, [0.981, 0.910, 0.869]], [0.448, [0.981, 0.910, 0.869]], [0.450, [0.980, 0.915, 0.876]], [0.452, [0.980, 0.915, 0.876]], [0.454, [0.979, 0.919, 0.884]], [0.456, [0.979, 0.919, 0.884]], [0.458, [0.978, 0.923, 0.891]], [0.460, [0.978, 0.923, 0.891]], [0.462, [0.977, 0.928, 0.899]], [0.464, [0.977, 0.928, 0.899]], [0.466, [0.976, 0.932, 0.906]], [0.468, [0.976, 0.932, 0.906]], [0.470, [0.976, 0.936, 0.913]], [0.472, [0.976, 0.936, 0.913]], [0.474, [0.975, 0.941, 0.921]], [0.476, [0.975, 0.941, 0.921]], [0.477, [0.974, 0.945, 0.928]], [0.479, [0.974, 0.945, 0.928]], [0.481, [0.973, 0.949, 0.935]], [0.483, [0.973, 0.949, 0.935]], [0.485, [0.972, 0.954, 0.943]], [0.487, [0.972, 0.954, 0.943]], [0.489, [0.971, 0.958, 0.950]], [0.491, [0.971, 0.958, 0.950]], [0.493, [0.970, 0.962, 0.958]], [0.495, [0.970, 0.962, 0.958]], [0.497, [0.969, 0.966, 0.965]], [0.499, [0.969, 0.966, 0.965]], [0.501, [0.966, 0.967, 0.968]], [0.503, [0.966, 0.967, 0.968]], [0.505, [0.960, 0.964, 0.967]], [0.507, [0.960, 0.964, 0.967]], [0.509, [0.954, 0.962, 0.966]], [0.511, [0.954, 0.962, 0.966]], [0.513, [0.948, 0.959, 0.965]], [0.515, [0.948, 0.959, 0.965]], [0.517, [0.942, 0.956, 0.964]], [0.519, [0.942, 0.956, 0.964]], [0.521, [0.936, 0.953, 0.963]], [0.523, [0.936, 0.953, 0.963]], [0.524, [0.931, 0.951, 0.962]], [0.526, [0.931, 0.951, 0.962]], [0.528, [0.925, 0.948, 0.961]], [0.530, [0.925, 0.948, 0.961]], [0.532, [0.919, 0.945, 0.959]], [0.534, [0.919, 0.945, 0.959]], [0.536, [0.913, 0.942, 0.958]], [0.538, [0.913, 0.942, 0.958]], [0.540, [0.907, 0.940, 0.957]], [0.542, [0.907, 0.940, 0.957]], [0.544, [0.901, 0.937, 0.956]], [0.546, [0.901, 0.937, 0.956]], [0.548, [0.896, 0.934, 0.955]], [0.550, [0.896, 0.934, 0.955]], [0.552, [0.890, 0.931, 0.954]], [0.554, [0.890, 0.931, 0.954]], [0.556, [0.884, 0.928, 0.953]], [0.558, [0.884, 0.928, 0.953]], [0.560, [0.878, 0.926, 0.952]], [0.562, [0.878, 0.926, 0.952]], [0.564, [0.872, 0.923, 0.951]], [0.566, [0.872, 0.923, 0.951]], [0.568, [0.866, 0.920, 0.950]], [0.569, [0.866, 0.920, 0.950]], [0.571, [0.861, 0.917, 0.949]], [0.573, [0.861, 0.917, 0.949]], [0.575, [0.855, 0.915, 0.948]], [0.577, [0.855, 0.915, 0.948]], [0.579, [0.849, 0.912, 0.947]], [0.581, [0.849, 0.912, 0.947]], [0.583, [0.843, 0.909, 0.945]], [0.585, [0.843, 0.909, 0.945]], [0.587, [0.837, 0.906, 0.944]], [0.589, [0.837, 0.906, 0.944]], [0.591, [0.831, 0.904, 0.943]], [0.593, [0.831, 0.904, 0.943]], [0.595, [0.825, 0.901, 0.942]], [0.597, [0.825, 0.901, 0.942]], [0.599, [0.820, 0.898, 0.941]], [0.601, [0.820, 0.898, 0.941]], [0.603, [0.810, 0.893, 0.938]], [0.605, [0.810, 0.893, 0.938]], [0.607, [0.800, 0.888, 0.936]], [0.609, [0.800, 0.888, 0.936]], [0.611, [0.791, 0.883, 0.933]], [0.613, [0.791, 0.883, 0.933]], [0.614, [0.781, 0.878, 0.930]], [0.616, [0.781, 0.878, 0.930]], [0.618, [0.771, 0.873, 0.927]], [0.620, [0.771, 0.873, 0.927]], [0.622, [0.761, 0.869, 0.925]], [0.624, [0.761, 0.869, 0.925]], [0.626, [0.752, 0.864, 0.922]], [0.628, [0.752, 0.864, 0.922]], [0.630, [0.742, 0.859, 0.919]], [0.632, [0.742, 0.859, 0.919]], [0.634, [0.732, 0.854, 0.916]], [0.636, [0.732, 0.854, 0.916]], [0.638, [0.723, 0.849, 0.913]], [0.640, [0.723, 0.849, 0.913]], [0.642, [0.713, 0.844, 0.911]], [0.644, [0.713, 0.844, 0.911]], [0.646, [0.703, 0.839, 0.908]], [0.648, [0.703, 0.839, 0.908]], [0.650, [0.694, 0.834, 0.905]], [0.652, [0.694, 0.834, 0.905]], [0.654, [0.684, 0.829, 0.902]], [0.656, [0.684, 0.829, 0.902]], [0.658, [0.674, 0.824, 0.900]], [0.659, [0.674, 0.824, 0.900]], [0.661, [0.665, 0.819, 0.897]], [0.663, [0.665, 0.819, 0.897]], [0.665, [0.655, 0.814, 0.894]], [0.667, [0.655, 0.814, 0.894]], [0.669, [0.645, 0.809, 0.891]], [0.671, [0.645, 0.809, 0.891]], [0.673, [0.636, 0.805, 0.889]], [0.675, [0.636, 0.805, 0.889]], [0.677, [0.626, 0.800, 0.886]], [0.679, [0.626, 0.800, 0.886]], [0.681, [0.616, 0.795, 0.883]], [0.683, [0.616, 0.795, 0.883]], [0.685, [0.606, 0.790, 0.880]], [0.687, [0.606, 0.790, 0.880]], [0.689, [0.597, 0.785, 0.878]], [0.691, [0.597, 0.785, 0.878]], [0.693, [0.587, 0.780, 0.875]], [0.695, [0.587, 0.780, 0.875]], [0.697, [0.577, 0.775, 0.872]], [0.699, [0.577, 0.775, 0.872]], [0.701, [0.566, 0.769, 0.869]], [0.703, [0.566, 0.769, 0.869]], [0.705, [0.554, 0.761, 0.864]], [0.706, [0.554, 0.761, 0.864]], [0.708, [0.542, 0.753, 0.860]], [0.710, [0.542, 0.753, 0.860]], [0.712, [0.530, 0.746, 0.856]], [0.714, [0.530, 0.746, 0.856]], [0.716, [0.518, 0.738, 0.852]], [0.718, [0.518, 0.738, 0.852]], [0.720, [0.506, 0.730, 0.848]], [0.722, [0.506, 0.730, 0.848]], [0.724, [0.494, 0.723, 0.844]], [0.726, [0.494, 0.723, 0.844]], [0.728, [0.481, 0.715, 0.839]], [0.730, [0.481, 0.715, 0.839]], [0.732, [0.469, 0.707, 0.835]], [0.734, [0.469, 0.707, 0.835]], [0.736, [0.457, 0.700, 0.831]], [0.738, [0.457, 0.700, 0.831]], [0.740, [0.445, 0.692, 0.827]], [0.742, [0.445, 0.692, 0.827]], [0.744, [0.433, 0.684, 0.823]], [0.746, [0.433, 0.684, 0.823]], [0.748, [0.421, 0.676, 0.819]], [0.750, [0.421, 0.676, 0.819]], [0.751, [0.409, 0.669, 0.815]], [0.753, [0.409, 0.669, 0.815]], [0.755, [0.396, 0.661, 0.810]], [0.757, [0.396, 0.661, 0.810]], [0.759, [0.384, 0.653, 0.806]], [0.761, [0.384, 0.653, 0.806]], [0.763, [0.372, 0.646, 0.802]], [0.765, [0.372, 0.646, 0.802]], [0.767, [0.360, 0.638, 0.798]], [0.769, [0.360, 0.638, 0.798]], [0.771, [0.348, 0.630, 0.794]], [0.773, [0.348, 0.630, 0.794]], [0.775, [0.336, 0.623, 0.790]], [0.777, [0.336, 0.623, 0.790]], [0.779, [0.323, 0.615, 0.785]], [0.781, [0.323, 0.615, 0.785]], [0.783, [0.311, 0.607, 0.781]], [0.785, [0.311, 0.607, 0.781]], [0.787, [0.299, 0.600, 0.777]], [0.789, [0.299, 0.600, 0.777]], [0.791, [0.287, 0.592, 0.773]], [0.793, [0.287, 0.592, 0.773]], [0.795, [0.275, 0.584, 0.769]], [0.796, [0.275, 0.584, 0.769]], [0.798, [0.263, 0.576, 0.765]], [0.800, [0.263, 0.576, 0.765]], [0.802, [0.258, 0.570, 0.761]], [0.804, [0.258, 0.570, 0.761]], [0.806, [0.252, 0.563, 0.758]], [0.808, [0.252, 0.563, 0.758]], [0.810, [0.247, 0.556, 0.754]], [0.812, [0.247, 0.556, 0.754]], [0.814, [0.242, 0.549, 0.751]], [0.816, [0.242, 0.549, 0.751]], [0.818, [0.237, 0.542, 0.747]], [0.820, [0.237, 0.542, 0.747]], [0.822, [0.231, 0.535, 0.743]], [0.824, [0.231, 0.535, 0.743]], [0.826, [0.226, 0.528, 0.740]], [0.828, [0.226, 0.528, 0.740]], [0.830, [0.221, 0.521, 0.736]], [0.832, [0.221, 0.521, 0.736]], [0.834, [0.216, 0.514, 0.733]], [0.836, [0.216, 0.514, 0.733]], [0.838, [0.210, 0.507, 0.729]], [0.840, [0.210, 0.507, 0.729]], [0.841, [0.205, 0.500, 0.726]], [0.843, [0.205, 0.500, 0.726]], [0.845, [0.200, 0.493, 0.722]], [0.847, [0.200, 0.493, 0.722]], [0.849, [0.195, 0.487, 0.719]], [0.851, [0.195, 0.487, 0.719]], [0.853, [0.190, 0.480, 0.715]], [0.855, [0.190, 0.480, 0.715]], [0.857, [0.184, 0.473, 0.712]], [0.859, [0.184, 0.473, 0.712]], [0.861, [0.179, 0.466, 0.708]], [0.863, [0.179, 0.466, 0.708]], [0.865, [0.174, 0.459, 0.705]], [0.867, [0.174, 0.459, 0.705]], [0.869, [0.169, 0.452, 0.701]], [0.871, [0.169, 0.452, 0.701]], [0.873, [0.163, 0.445, 0.698]], [0.875, [0.163, 0.445, 0.698]], [0.877, [0.158, 0.438, 0.694]], [0.879, [0.158, 0.438, 0.694]], [0.881, [0.153, 0.431, 0.690]], [0.883, [0.153, 0.431, 0.690]], [0.885, [0.148, 0.424, 0.687]], [0.886, [0.148, 0.424, 0.687]], [0.888, [0.142, 0.417, 0.683]], [0.890, [0.142, 0.417, 0.683]], [0.892, [0.137, 0.410, 0.680]], [0.894, [0.137, 0.410, 0.680]], [0.896, [0.132, 0.403, 0.676]], [0.898, [0.132, 0.403, 0.676]], [0.900, [0.127, 0.396, 0.669]], [0.902, [0.127, 0.396, 0.669]], [0.904, [0.123, 0.388, 0.657]], [0.906, [0.123, 0.388, 0.657]], [0.908, [0.119, 0.379, 0.646]], [0.910, [0.119, 0.379, 0.646]], [0.912, [0.114, 0.371, 0.634]], [0.914, [0.114, 0.371, 0.634]], [0.916, [0.110, 0.363, 0.623]], [0.918, [0.110, 0.363, 0.623]], [0.920, [0.106, 0.354, 0.611]], [0.922, [0.106, 0.354, 0.611]], [0.924, [0.101, 0.346, 0.600]], [0.926, [0.101, 0.346, 0.600]], [0.928, [0.097, 0.338, 0.588]], [0.930, [0.097, 0.338, 0.588]], [0.932, [0.093, 0.329, 0.576]], [0.933, [0.093, 0.329, 0.576]], [0.935, [0.089, 0.321, 0.565]], [0.937, [0.089, 0.321, 0.565]], [0.939, [0.084, 0.313, 0.553]], [0.941, [0.084, 0.313, 0.553]], [0.943, [0.080, 0.304, 0.542]], [0.945, [0.080, 0.304, 0.542]], [0.947, [0.076, 0.296, 0.530]], [0.949, [0.076, 0.296, 0.530]], [0.951, [0.071, 0.288, 0.519]], [0.953, [0.071, 0.288, 0.519]], [0.955, [0.067, 0.280, 0.507]], [0.957, [0.067, 0.280, 0.507]], [0.959, [0.063, 0.271, 0.496]], [0.961, [0.063, 0.271, 0.496]], [0.963, [0.058, 0.263, 0.484]], [0.965, [0.058, 0.263, 0.484]], [0.967, [0.054, 0.255, 0.473]], [0.969, [0.054, 0.255, 0.473]], [0.971, [0.050, 0.246, 0.461]], [0.973, [0.050, 0.246, 0.461]], [0.975, [0.045, 0.238, 0.450]], [0.977, [0.045, 0.238, 0.450]], [0.978, [0.041, 0.230, 0.438]], [0.980, [0.041, 0.230, 0.438]], [0.982, [0.037, 0.221, 0.427]], [0.984, [0.037, 0.221, 0.427]], [0.986, [0.033, 0.213, 0.415]], [0.988, [0.033, 0.213, 0.415]], [0.990, [0.028, 0.205, 0.403]], [0.992, [0.028, 0.205, 0.403]], [0.994, [0.024, 0.197, 0.392]], [0.996, [0.024, 0.197, 0.392]], [0.998, [0.020, 0.188, 0.380]], [1.000, [0.020, 0.188, 0.380]]]; +var RdGy = [[0.000, [0.404, 0.000, 0.122]], [0.002, [0.404, 0.000, 0.122]], [0.004, [0.415, 0.004, 0.123]], [0.006, [0.415, 0.004, 0.123]], [0.008, [0.427, 0.007, 0.125]], [0.010, [0.427, 0.007, 0.125]], [0.012, [0.439, 0.011, 0.127]], [0.014, [0.439, 0.011, 0.127]], [0.016, [0.450, 0.015, 0.129]], [0.018, [0.450, 0.015, 0.129]], [0.020, [0.462, 0.018, 0.131]], [0.022, [0.462, 0.018, 0.131]], [0.023, [0.473, 0.022, 0.133]], [0.025, [0.473, 0.022, 0.133]], [0.027, [0.485, 0.026, 0.134]], [0.029, [0.485, 0.026, 0.134]], [0.031, [0.496, 0.030, 0.136]], [0.033, [0.496, 0.030, 0.136]], [0.035, [0.508, 0.033, 0.138]], [0.037, [0.508, 0.033, 0.138]], [0.039, [0.519, 0.037, 0.140]], [0.041, [0.519, 0.037, 0.140]], [0.043, [0.531, 0.041, 0.142]], [0.045, [0.531, 0.041, 0.142]], [0.047, [0.542, 0.044, 0.144]], [0.049, [0.542, 0.044, 0.144]], [0.051, [0.554, 0.048, 0.146]], [0.053, [0.554, 0.048, 0.146]], [0.055, [0.565, 0.052, 0.147]], [0.057, [0.565, 0.052, 0.147]], [0.059, [0.577, 0.055, 0.149]], [0.061, [0.577, 0.055, 0.149]], [0.063, [0.588, 0.059, 0.151]], [0.065, [0.588, 0.059, 0.151]], [0.067, [0.600, 0.063, 0.153]], [0.068, [0.600, 0.063, 0.153]], [0.070, [0.612, 0.066, 0.155]], [0.072, [0.612, 0.066, 0.155]], [0.074, [0.623, 0.070, 0.157]], [0.076, [0.623, 0.070, 0.157]], [0.078, [0.635, 0.074, 0.158]], [0.080, [0.635, 0.074, 0.158]], [0.082, [0.646, 0.078, 0.160]], [0.084, [0.646, 0.078, 0.160]], [0.086, [0.658, 0.081, 0.162]], [0.088, [0.658, 0.081, 0.162]], [0.090, [0.669, 0.085, 0.164]], [0.092, [0.669, 0.085, 0.164]], [0.094, [0.681, 0.089, 0.166]], [0.096, [0.681, 0.089, 0.166]], [0.098, [0.692, 0.092, 0.168]], [0.100, [0.692, 0.092, 0.168]], [0.102, [0.701, 0.100, 0.171]], [0.104, [0.701, 0.100, 0.171]], [0.106, [0.706, 0.111, 0.176]], [0.108, [0.706, 0.111, 0.176]], [0.110, [0.712, 0.122, 0.182]], [0.112, [0.712, 0.122, 0.182]], [0.114, [0.717, 0.133, 0.187]], [0.115, [0.717, 0.133, 0.187]], [0.117, [0.723, 0.144, 0.192]], [0.119, [0.723, 0.144, 0.192]], [0.121, [0.728, 0.155, 0.197]], [0.123, [0.728, 0.155, 0.197]], [0.125, [0.734, 0.166, 0.203]], [0.127, [0.734, 0.166, 0.203]], [0.129, [0.740, 0.177, 0.208]], [0.131, [0.740, 0.177, 0.208]], [0.133, [0.745, 0.188, 0.213]], [0.135, [0.745, 0.188, 0.213]], [0.137, [0.751, 0.199, 0.218]], [0.139, [0.751, 0.199, 0.218]], [0.141, [0.756, 0.210, 0.224]], [0.143, [0.756, 0.210, 0.224]], [0.145, [0.762, 0.221, 0.229]], [0.147, [0.762, 0.221, 0.229]], [0.149, [0.767, 0.233, 0.234]], [0.151, [0.767, 0.233, 0.234]], [0.153, [0.773, 0.244, 0.239]], [0.155, [0.773, 0.244, 0.239]], [0.157, [0.778, 0.255, 0.244]], [0.159, [0.778, 0.255, 0.244]], [0.160, [0.784, 0.266, 0.250]], [0.162, [0.784, 0.266, 0.250]], [0.164, [0.789, 0.277, 0.255]], [0.166, [0.789, 0.277, 0.255]], [0.168, [0.795, 0.288, 0.260]], [0.170, [0.795, 0.288, 0.260]], [0.172, [0.800, 0.299, 0.265]], [0.174, [0.800, 0.299, 0.265]], [0.176, [0.806, 0.310, 0.271]], [0.178, [0.806, 0.310, 0.271]], [0.180, [0.812, 0.321, 0.276]], [0.182, [0.812, 0.321, 0.276]], [0.184, [0.817, 0.332, 0.281]], [0.186, [0.817, 0.332, 0.281]], [0.188, [0.823, 0.343, 0.286]], [0.190, [0.823, 0.343, 0.286]], [0.192, [0.828, 0.354, 0.292]], [0.194, [0.828, 0.354, 0.292]], [0.196, [0.834, 0.365, 0.297]], [0.198, [0.834, 0.365, 0.297]], [0.200, [0.839, 0.376, 0.302]], [0.202, [0.839, 0.376, 0.302]], [0.204, [0.844, 0.387, 0.310]], [0.205, [0.844, 0.387, 0.310]], [0.207, [0.848, 0.398, 0.318]], [0.209, [0.848, 0.398, 0.318]], [0.211, [0.853, 0.408, 0.326]], [0.213, [0.853, 0.408, 0.326]], [0.215, [0.858, 0.419, 0.335]], [0.217, [0.858, 0.419, 0.335]], [0.219, [0.862, 0.430, 0.343]], [0.221, [0.862, 0.430, 0.343]], [0.223, [0.867, 0.440, 0.351]], [0.225, [0.867, 0.440, 0.351]], [0.227, [0.872, 0.451, 0.359]], [0.229, [0.872, 0.451, 0.359]], [0.231, [0.876, 0.461, 0.367]], [0.233, [0.876, 0.461, 0.367]], [0.235, [0.881, 0.472, 0.375]], [0.237, [0.881, 0.472, 0.375]], [0.239, [0.885, 0.483, 0.383]], [0.241, [0.885, 0.483, 0.383]], [0.243, [0.890, 0.493, 0.392]], [0.245, [0.890, 0.493, 0.392]], [0.247, [0.895, 0.504, 0.400]], [0.249, [0.895, 0.504, 0.400]], [0.250, [0.899, 0.514, 0.408]], [0.252, [0.899, 0.514, 0.408]], [0.254, [0.904, 0.525, 0.416]], [0.256, [0.904, 0.525, 0.416]], [0.258, [0.908, 0.536, 0.424]], [0.260, [0.908, 0.536, 0.424]], [0.262, [0.913, 0.546, 0.432]], [0.264, [0.913, 0.546, 0.432]], [0.266, [0.918, 0.557, 0.441]], [0.268, [0.918, 0.557, 0.441]], [0.270, [0.922, 0.567, 0.449]], [0.272, [0.922, 0.567, 0.449]], [0.274, [0.927, 0.578, 0.457]], [0.276, [0.927, 0.578, 0.457]], [0.278, [0.931, 0.589, 0.465]], [0.280, [0.931, 0.589, 0.465]], [0.282, [0.936, 0.599, 0.473]], [0.284, [0.936, 0.599, 0.473]], [0.286, [0.941, 0.610, 0.481]], [0.288, [0.941, 0.610, 0.481]], [0.290, [0.945, 0.621, 0.489]], [0.292, [0.945, 0.621, 0.489]], [0.294, [0.950, 0.631, 0.498]], [0.295, [0.950, 0.631, 0.498]], [0.297, [0.955, 0.642, 0.506]], [0.299, [0.955, 0.642, 0.506]], [0.301, [0.958, 0.651, 0.515]], [0.303, [0.958, 0.651, 0.515]], [0.305, [0.959, 0.660, 0.526]], [0.307, [0.959, 0.660, 0.526]], [0.309, [0.960, 0.668, 0.536]], [0.311, [0.960, 0.668, 0.536]], [0.313, [0.962, 0.676, 0.547]], [0.315, [0.962, 0.676, 0.547]], [0.317, [0.963, 0.684, 0.558]], [0.319, [0.963, 0.684, 0.558]], [0.321, [0.964, 0.693, 0.568]], [0.323, [0.964, 0.693, 0.568]], [0.325, [0.966, 0.701, 0.579]], [0.327, [0.966, 0.701, 0.579]], [0.329, [0.967, 0.709, 0.589]], [0.331, [0.967, 0.709, 0.589]], [0.333, [0.969, 0.718, 0.600]], [0.335, [0.969, 0.718, 0.600]], [0.337, [0.970, 0.726, 0.611]], [0.339, [0.970, 0.726, 0.611]], [0.341, [0.971, 0.734, 0.621]], [0.342, [0.971, 0.734, 0.621]], [0.344, [0.973, 0.743, 0.632]], [0.346, [0.973, 0.743, 0.632]], [0.348, [0.974, 0.751, 0.642]], [0.350, [0.974, 0.751, 0.642]], [0.352, [0.976, 0.759, 0.653]], [0.354, [0.976, 0.759, 0.653]], [0.356, [0.977, 0.767, 0.664]], [0.358, [0.977, 0.767, 0.664]], [0.360, [0.978, 0.776, 0.674]], [0.362, [0.978, 0.776, 0.674]], [0.364, [0.980, 0.784, 0.685]], [0.366, [0.980, 0.784, 0.685]], [0.368, [0.981, 0.792, 0.696]], [0.370, [0.981, 0.792, 0.696]], [0.372, [0.982, 0.801, 0.706]], [0.374, [0.982, 0.801, 0.706]], [0.376, [0.984, 0.809, 0.717]], [0.378, [0.984, 0.809, 0.717]], [0.380, [0.985, 0.817, 0.727]], [0.382, [0.985, 0.817, 0.727]], [0.384, [0.987, 0.826, 0.738]], [0.386, [0.987, 0.826, 0.738]], [0.387, [0.988, 0.834, 0.749]], [0.389, [0.988, 0.834, 0.749]], [0.391, [0.989, 0.842, 0.759]], [0.393, [0.989, 0.842, 0.759]], [0.395, [0.991, 0.851, 0.770]], [0.397, [0.991, 0.851, 0.770]], [0.399, [0.992, 0.859, 0.780]], [0.401, [0.992, 0.859, 0.780]], [0.403, [0.992, 0.864, 0.789]], [0.405, [0.992, 0.864, 0.789]], [0.407, [0.993, 0.870, 0.798]], [0.409, [0.993, 0.870, 0.798]], [0.411, [0.993, 0.875, 0.806]], [0.413, [0.993, 0.875, 0.806]], [0.415, [0.993, 0.881, 0.815]], [0.417, [0.993, 0.881, 0.815]], [0.419, [0.994, 0.887, 0.823]], [0.421, [0.994, 0.887, 0.823]], [0.423, [0.994, 0.892, 0.832]], [0.425, [0.994, 0.892, 0.832]], [0.427, [0.994, 0.898, 0.841]], [0.429, [0.994, 0.898, 0.841]], [0.431, [0.995, 0.903, 0.849]], [0.432, [0.995, 0.903, 0.849]], [0.434, [0.995, 0.909, 0.858]], [0.436, [0.995, 0.909, 0.858]], [0.438, [0.995, 0.914, 0.867]], [0.440, [0.995, 0.914, 0.867]], [0.442, [0.996, 0.920, 0.875]], [0.444, [0.996, 0.920, 0.875]], [0.446, [0.996, 0.925, 0.884]], [0.448, [0.996, 0.925, 0.884]], [0.450, [0.996, 0.931, 0.892]], [0.452, [0.996, 0.931, 0.892]], [0.454, [0.996, 0.936, 0.901]], [0.456, [0.996, 0.936, 0.901]], [0.458, [0.997, 0.942, 0.910]], [0.460, [0.997, 0.942, 0.910]], [0.462, [0.997, 0.947, 0.918]], [0.464, [0.997, 0.947, 0.918]], [0.466, [0.997, 0.953, 0.927]], [0.468, [0.997, 0.953, 0.927]], [0.470, [0.998, 0.958, 0.935]], [0.472, [0.998, 0.958, 0.935]], [0.474, [0.998, 0.964, 0.944]], [0.476, [0.998, 0.964, 0.944]], [0.477, [0.998, 0.970, 0.953]], [0.479, [0.998, 0.970, 0.953]], [0.481, [0.999, 0.975, 0.961]], [0.483, [0.999, 0.975, 0.961]], [0.485, [0.999, 0.981, 0.970]], [0.487, [0.999, 0.981, 0.970]], [0.489, [0.999, 0.986, 0.978]], [0.491, [0.999, 0.986, 0.978]], [0.493, [1.000, 0.992, 0.987]], [0.495, [1.000, 0.992, 0.987]], [0.497, [1.000, 0.997, 0.996]], [0.499, [1.000, 0.997, 0.996]], [0.501, [0.998, 0.998, 0.998]], [0.503, [0.998, 0.998, 0.998]], [0.505, [0.993, 0.993, 0.993]], [0.507, [0.993, 0.993, 0.993]], [0.509, [0.988, 0.988, 0.988]], [0.511, [0.988, 0.988, 0.988]], [0.513, [0.983, 0.983, 0.983]], [0.515, [0.983, 0.983, 0.983]], [0.517, [0.979, 0.979, 0.979]], [0.519, [0.979, 0.979, 0.979]], [0.521, [0.974, 0.974, 0.974]], [0.523, [0.974, 0.974, 0.974]], [0.524, [0.969, 0.969, 0.969]], [0.526, [0.969, 0.969, 0.969]], [0.528, [0.964, 0.964, 0.964]], [0.530, [0.964, 0.964, 0.964]], [0.532, [0.959, 0.959, 0.959]], [0.534, [0.959, 0.959, 0.959]], [0.536, [0.955, 0.955, 0.955]], [0.538, [0.955, 0.955, 0.955]], [0.540, [0.950, 0.950, 0.950]], [0.542, [0.950, 0.950, 0.950]], [0.544, [0.945, 0.945, 0.945]], [0.546, [0.945, 0.945, 0.945]], [0.548, [0.940, 0.940, 0.940]], [0.550, [0.940, 0.940, 0.940]], [0.552, [0.936, 0.936, 0.936]], [0.554, [0.936, 0.936, 0.936]], [0.556, [0.931, 0.931, 0.931]], [0.558, [0.931, 0.931, 0.931]], [0.560, [0.926, 0.926, 0.926]], [0.562, [0.926, 0.926, 0.926]], [0.564, [0.921, 0.921, 0.921]], [0.566, [0.921, 0.921, 0.921]], [0.568, [0.917, 0.917, 0.917]], [0.569, [0.917, 0.917, 0.917]], [0.571, [0.912, 0.912, 0.912]], [0.573, [0.912, 0.912, 0.912]], [0.575, [0.907, 0.907, 0.907]], [0.577, [0.907, 0.907, 0.907]], [0.579, [0.902, 0.902, 0.902]], [0.581, [0.902, 0.902, 0.902]], [0.583, [0.898, 0.898, 0.898]], [0.585, [0.898, 0.898, 0.898]], [0.587, [0.893, 0.893, 0.893]], [0.589, [0.893, 0.893, 0.893]], [0.591, [0.888, 0.888, 0.888]], [0.593, [0.888, 0.888, 0.888]], [0.595, [0.883, 0.883, 0.883]], [0.597, [0.883, 0.883, 0.883]], [0.599, [0.878, 0.878, 0.878]], [0.601, [0.878, 0.878, 0.878]], [0.603, [0.873, 0.873, 0.873]], [0.605, [0.873, 0.873, 0.873]], [0.607, [0.867, 0.867, 0.867]], [0.609, [0.867, 0.867, 0.867]], [0.611, [0.861, 0.861, 0.861]], [0.613, [0.861, 0.861, 0.861]], [0.614, [0.855, 0.855, 0.855]], [0.616, [0.855, 0.855, 0.855]], [0.618, [0.849, 0.849, 0.849]], [0.620, [0.849, 0.849, 0.849]], [0.622, [0.843, 0.843, 0.843]], [0.624, [0.843, 0.843, 0.843]], [0.626, [0.838, 0.838, 0.838]], [0.628, [0.838, 0.838, 0.838]], [0.630, [0.832, 0.832, 0.832]], [0.632, [0.832, 0.832, 0.832]], [0.634, [0.826, 0.826, 0.826]], [0.636, [0.826, 0.826, 0.826]], [0.638, [0.820, 0.820, 0.820]], [0.640, [0.820, 0.820, 0.820]], [0.642, [0.814, 0.814, 0.814]], [0.644, [0.814, 0.814, 0.814]], [0.646, [0.808, 0.808, 0.808]], [0.648, [0.808, 0.808, 0.808]], [0.650, [0.802, 0.802, 0.802]], [0.652, [0.802, 0.802, 0.802]], [0.654, [0.797, 0.797, 0.797]], [0.656, [0.797, 0.797, 0.797]], [0.658, [0.791, 0.791, 0.791]], [0.659, [0.791, 0.791, 0.791]], [0.661, [0.785, 0.785, 0.785]], [0.663, [0.785, 0.785, 0.785]], [0.665, [0.779, 0.779, 0.779]], [0.667, [0.779, 0.779, 0.779]], [0.669, [0.773, 0.773, 0.773]], [0.671, [0.773, 0.773, 0.773]], [0.673, [0.767, 0.767, 0.767]], [0.675, [0.767, 0.767, 0.767]], [0.677, [0.762, 0.762, 0.762]], [0.679, [0.762, 0.762, 0.762]], [0.681, [0.756, 0.756, 0.756]], [0.683, [0.756, 0.756, 0.756]], [0.685, [0.750, 0.750, 0.750]], [0.687, [0.750, 0.750, 0.750]], [0.689, [0.744, 0.744, 0.744]], [0.691, [0.744, 0.744, 0.744]], [0.693, [0.738, 0.738, 0.738]], [0.695, [0.738, 0.738, 0.738]], [0.697, [0.732, 0.732, 0.732]], [0.699, [0.732, 0.732, 0.732]], [0.701, [0.725, 0.725, 0.725]], [0.703, [0.725, 0.725, 0.725]], [0.705, [0.718, 0.718, 0.718]], [0.706, [0.718, 0.718, 0.718]], [0.708, [0.710, 0.710, 0.710]], [0.710, [0.710, 0.710, 0.710]], [0.712, [0.702, 0.702, 0.702]], [0.714, [0.702, 0.702, 0.702]], [0.716, [0.694, 0.694, 0.694]], [0.718, [0.694, 0.694, 0.694]], [0.720, [0.686, 0.686, 0.686]], [0.722, [0.686, 0.686, 0.686]], [0.724, [0.678, 0.678, 0.678]], [0.726, [0.678, 0.678, 0.678]], [0.728, [0.671, 0.671, 0.671]], [0.730, [0.671, 0.671, 0.671]], [0.732, [0.663, 0.663, 0.663]], [0.734, [0.663, 0.663, 0.663]], [0.736, [0.655, 0.655, 0.655]], [0.738, [0.655, 0.655, 0.655]], [0.740, [0.647, 0.647, 0.647]], [0.742, [0.647, 0.647, 0.647]], [0.744, [0.639, 0.639, 0.639]], [0.746, [0.639, 0.639, 0.639]], [0.748, [0.631, 0.631, 0.631]], [0.750, [0.631, 0.631, 0.631]], [0.751, [0.624, 0.624, 0.624]], [0.753, [0.624, 0.624, 0.624]], [0.755, [0.616, 0.616, 0.616]], [0.757, [0.616, 0.616, 0.616]], [0.759, [0.608, 0.608, 0.608]], [0.761, [0.608, 0.608, 0.608]], [0.763, [0.600, 0.600, 0.600]], [0.765, [0.600, 0.600, 0.600]], [0.767, [0.592, 0.592, 0.592]], [0.769, [0.592, 0.592, 0.592]], [0.771, [0.584, 0.584, 0.584]], [0.773, [0.584, 0.584, 0.584]], [0.775, [0.576, 0.576, 0.576]], [0.777, [0.576, 0.576, 0.576]], [0.779, [0.569, 0.569, 0.569]], [0.781, [0.569, 0.569, 0.569]], [0.783, [0.561, 0.561, 0.561]], [0.785, [0.561, 0.561, 0.561]], [0.787, [0.553, 0.553, 0.553]], [0.789, [0.553, 0.553, 0.553]], [0.791, [0.545, 0.545, 0.545]], [0.793, [0.545, 0.545, 0.545]], [0.795, [0.537, 0.537, 0.537]], [0.796, [0.537, 0.537, 0.537]], [0.798, [0.529, 0.529, 0.529]], [0.800, [0.529, 0.529, 0.529]], [0.802, [0.520, 0.520, 0.520]], [0.804, [0.520, 0.520, 0.520]], [0.806, [0.512, 0.512, 0.512]], [0.808, [0.512, 0.512, 0.512]], [0.810, [0.503, 0.503, 0.503]], [0.812, [0.503, 0.503, 0.503]], [0.814, [0.494, 0.494, 0.494]], [0.816, [0.494, 0.494, 0.494]], [0.818, [0.485, 0.485, 0.485]], [0.820, [0.485, 0.485, 0.485]], [0.822, [0.476, 0.476, 0.476]], [0.824, [0.476, 0.476, 0.476]], [0.826, [0.467, 0.467, 0.467]], [0.828, [0.467, 0.467, 0.467]], [0.830, [0.458, 0.458, 0.458]], [0.832, [0.458, 0.458, 0.458]], [0.834, [0.449, 0.449, 0.449]], [0.836, [0.449, 0.449, 0.449]], [0.838, [0.440, 0.440, 0.440]], [0.840, [0.440, 0.440, 0.440]], [0.841, [0.431, 0.431, 0.431]], [0.843, [0.431, 0.431, 0.431]], [0.845, [0.422, 0.422, 0.422]], [0.847, [0.422, 0.422, 0.422]], [0.849, [0.413, 0.413, 0.413]], [0.851, [0.413, 0.413, 0.413]], [0.853, [0.405, 0.405, 0.405]], [0.855, [0.405, 0.405, 0.405]], [0.857, [0.396, 0.396, 0.396]], [0.859, [0.396, 0.396, 0.396]], [0.861, [0.387, 0.387, 0.387]], [0.863, [0.387, 0.387, 0.387]], [0.865, [0.378, 0.378, 0.378]], [0.867, [0.378, 0.378, 0.378]], [0.869, [0.369, 0.369, 0.369]], [0.871, [0.369, 0.369, 0.369]], [0.873, [0.360, 0.360, 0.360]], [0.875, [0.360, 0.360, 0.360]], [0.877, [0.351, 0.351, 0.351]], [0.879, [0.351, 0.351, 0.351]], [0.881, [0.342, 0.342, 0.342]], [0.883, [0.342, 0.342, 0.342]], [0.885, [0.333, 0.333, 0.333]], [0.886, [0.333, 0.333, 0.333]], [0.888, [0.324, 0.324, 0.324]], [0.890, [0.324, 0.324, 0.324]], [0.892, [0.315, 0.315, 0.315]], [0.894, [0.315, 0.315, 0.315]], [0.896, [0.306, 0.306, 0.306]], [0.898, [0.306, 0.306, 0.306]], [0.900, [0.298, 0.298, 0.298]], [0.902, [0.298, 0.298, 0.298]], [0.904, [0.290, 0.290, 0.290]], [0.906, [0.290, 0.290, 0.290]], [0.908, [0.282, 0.282, 0.282]], [0.910, [0.282, 0.282, 0.282]], [0.912, [0.275, 0.275, 0.275]], [0.914, [0.275, 0.275, 0.275]], [0.916, [0.267, 0.267, 0.267]], [0.918, [0.267, 0.267, 0.267]], [0.920, [0.259, 0.259, 0.259]], [0.922, [0.259, 0.259, 0.259]], [0.924, [0.251, 0.251, 0.251]], [0.926, [0.251, 0.251, 0.251]], [0.928, [0.243, 0.243, 0.243]], [0.930, [0.243, 0.243, 0.243]], [0.932, [0.235, 0.235, 0.235]], [0.933, [0.235, 0.235, 0.235]], [0.935, [0.227, 0.227, 0.227]], [0.937, [0.227, 0.227, 0.227]], [0.939, [0.220, 0.220, 0.220]], [0.941, [0.220, 0.220, 0.220]], [0.943, [0.212, 0.212, 0.212]], [0.945, [0.212, 0.212, 0.212]], [0.947, [0.204, 0.204, 0.204]], [0.949, [0.204, 0.204, 0.204]], [0.951, [0.196, 0.196, 0.196]], [0.953, [0.196, 0.196, 0.196]], [0.955, [0.188, 0.188, 0.188]], [0.957, [0.188, 0.188, 0.188]], [0.959, [0.180, 0.180, 0.180]], [0.961, [0.180, 0.180, 0.180]], [0.963, [0.173, 0.173, 0.173]], [0.965, [0.173, 0.173, 0.173]], [0.967, [0.165, 0.165, 0.165]], [0.969, [0.165, 0.165, 0.165]], [0.971, [0.157, 0.157, 0.157]], [0.973, [0.157, 0.157, 0.157]], [0.975, [0.149, 0.149, 0.149]], [0.977, [0.149, 0.149, 0.149]], [0.978, [0.141, 0.141, 0.141]], [0.980, [0.141, 0.141, 0.141]], [0.982, [0.133, 0.133, 0.133]], [0.984, [0.133, 0.133, 0.133]], [0.986, [0.125, 0.125, 0.125]], [0.988, [0.125, 0.125, 0.125]], [0.990, [0.118, 0.118, 0.118]], [0.992, [0.118, 0.118, 0.118]], [0.994, [0.110, 0.110, 0.110]], [0.996, [0.110, 0.110, 0.110]], [0.998, [0.102, 0.102, 0.102]], [1.000, [0.102, 0.102, 0.102]]]; +var RdYlBu = [[0.000, [0.647, 0.000, 0.149]], [0.002, [0.647, 0.000, 0.149]], [0.004, [0.655, 0.007, 0.149]], [0.006, [0.655, 0.007, 0.149]], [0.008, [0.662, 0.015, 0.149]], [0.010, [0.662, 0.015, 0.149]], [0.012, [0.670, 0.022, 0.149]], [0.014, [0.670, 0.022, 0.149]], [0.016, [0.678, 0.030, 0.150]], [0.018, [0.678, 0.030, 0.150]], [0.020, [0.686, 0.037, 0.150]], [0.022, [0.686, 0.037, 0.150]], [0.023, [0.693, 0.044, 0.150]], [0.025, [0.693, 0.044, 0.150]], [0.027, [0.701, 0.052, 0.150]], [0.029, [0.701, 0.052, 0.150]], [0.031, [0.709, 0.059, 0.150]], [0.033, [0.709, 0.059, 0.150]], [0.035, [0.716, 0.066, 0.150]], [0.037, [0.716, 0.066, 0.150]], [0.039, [0.724, 0.074, 0.151]], [0.041, [0.724, 0.074, 0.151]], [0.043, [0.732, 0.081, 0.151]], [0.045, [0.732, 0.081, 0.151]], [0.047, [0.739, 0.089, 0.151]], [0.049, [0.739, 0.089, 0.151]], [0.051, [0.747, 0.096, 0.151]], [0.053, [0.747, 0.096, 0.151]], [0.055, [0.755, 0.103, 0.151]], [0.057, [0.755, 0.103, 0.151]], [0.059, [0.762, 0.111, 0.151]], [0.061, [0.762, 0.111, 0.151]], [0.063, [0.770, 0.118, 0.151]], [0.065, [0.770, 0.118, 0.151]], [0.067, [0.778, 0.125, 0.152]], [0.068, [0.778, 0.125, 0.152]], [0.070, [0.785, 0.133, 0.152]], [0.072, [0.785, 0.133, 0.152]], [0.074, [0.793, 0.140, 0.152]], [0.076, [0.793, 0.140, 0.152]], [0.078, [0.801, 0.148, 0.152]], [0.080, [0.801, 0.148, 0.152]], [0.082, [0.809, 0.155, 0.152]], [0.084, [0.809, 0.155, 0.152]], [0.086, [0.816, 0.162, 0.152]], [0.088, [0.816, 0.162, 0.152]], [0.090, [0.824, 0.170, 0.153]], [0.092, [0.824, 0.170, 0.153]], [0.094, [0.832, 0.177, 0.153]], [0.096, [0.832, 0.177, 0.153]], [0.098, [0.839, 0.185, 0.153]], [0.100, [0.839, 0.185, 0.153]], [0.102, [0.845, 0.193, 0.155]], [0.104, [0.845, 0.193, 0.155]], [0.106, [0.850, 0.202, 0.159]], [0.108, [0.850, 0.202, 0.159]], [0.110, [0.854, 0.212, 0.164]], [0.112, [0.854, 0.212, 0.164]], [0.114, [0.859, 0.221, 0.168]], [0.115, [0.859, 0.221, 0.168]], [0.117, [0.863, 0.230, 0.172]], [0.119, [0.863, 0.230, 0.172]], [0.121, [0.868, 0.240, 0.177]], [0.123, [0.868, 0.240, 0.177]], [0.125, [0.872, 0.249, 0.181]], [0.127, [0.872, 0.249, 0.181]], [0.129, [0.877, 0.259, 0.185]], [0.131, [0.877, 0.259, 0.185]], [0.133, [0.881, 0.268, 0.190]], [0.135, [0.881, 0.268, 0.190]], [0.137, [0.886, 0.277, 0.194]], [0.139, [0.886, 0.277, 0.194]], [0.141, [0.890, 0.287, 0.198]], [0.143, [0.890, 0.287, 0.198]], [0.145, [0.894, 0.296, 0.202]], [0.147, [0.894, 0.296, 0.202]], [0.149, [0.899, 0.305, 0.207]], [0.151, [0.899, 0.305, 0.207]], [0.153, [0.903, 0.315, 0.211]], [0.155, [0.903, 0.315, 0.211]], [0.157, [0.908, 0.324, 0.215]], [0.159, [0.908, 0.324, 0.215]], [0.160, [0.912, 0.334, 0.220]], [0.162, [0.912, 0.334, 0.220]], [0.164, [0.917, 0.343, 0.224]], [0.166, [0.917, 0.343, 0.224]], [0.168, [0.921, 0.352, 0.228]], [0.170, [0.921, 0.352, 0.228]], [0.172, [0.926, 0.362, 0.233]], [0.174, [0.926, 0.362, 0.233]], [0.176, [0.930, 0.371, 0.237]], [0.178, [0.930, 0.371, 0.237]], [0.180, [0.935, 0.381, 0.241]], [0.182, [0.935, 0.381, 0.241]], [0.184, [0.939, 0.390, 0.246]], [0.186, [0.939, 0.390, 0.246]], [0.188, [0.943, 0.399, 0.250]], [0.190, [0.943, 0.399, 0.250]], [0.192, [0.948, 0.409, 0.254]], [0.194, [0.948, 0.409, 0.254]], [0.196, [0.952, 0.418, 0.258]], [0.198, [0.952, 0.418, 0.258]], [0.200, [0.957, 0.427, 0.263]], [0.202, [0.957, 0.427, 0.263]], [0.204, [0.958, 0.437, 0.267]], [0.205, [0.958, 0.437, 0.267]], [0.207, [0.960, 0.447, 0.272]], [0.209, [0.960, 0.447, 0.272]], [0.211, [0.961, 0.457, 0.277]], [0.213, [0.961, 0.457, 0.277]], [0.215, [0.962, 0.467, 0.281]], [0.217, [0.962, 0.467, 0.281]], [0.219, [0.964, 0.477, 0.286]], [0.221, [0.964, 0.477, 0.286]], [0.223, [0.965, 0.487, 0.290]], [0.225, [0.965, 0.487, 0.290]], [0.227, [0.967, 0.497, 0.295]], [0.229, [0.967, 0.497, 0.295]], [0.231, [0.968, 0.507, 0.300]], [0.233, [0.968, 0.507, 0.300]], [0.235, [0.969, 0.517, 0.304]], [0.237, [0.969, 0.517, 0.304]], [0.239, [0.971, 0.527, 0.309]], [0.241, [0.971, 0.527, 0.309]], [0.243, [0.972, 0.537, 0.313]], [0.245, [0.972, 0.537, 0.313]], [0.247, [0.973, 0.547, 0.318]], [0.249, [0.973, 0.547, 0.318]], [0.250, [0.975, 0.557, 0.323]], [0.252, [0.975, 0.557, 0.323]], [0.254, [0.976, 0.567, 0.327]], [0.256, [0.976, 0.567, 0.327]], [0.258, [0.978, 0.577, 0.332]], [0.260, [0.978, 0.577, 0.332]], [0.262, [0.979, 0.587, 0.337]], [0.264, [0.979, 0.587, 0.337]], [0.266, [0.980, 0.597, 0.341]], [0.268, [0.980, 0.597, 0.341]], [0.270, [0.982, 0.607, 0.346]], [0.272, [0.982, 0.607, 0.346]], [0.274, [0.983, 0.617, 0.350]], [0.276, [0.983, 0.617, 0.350]], [0.278, [0.985, 0.627, 0.355]], [0.280, [0.985, 0.627, 0.355]], [0.282, [0.986, 0.637, 0.360]], [0.284, [0.986, 0.637, 0.360]], [0.286, [0.987, 0.647, 0.364]], [0.288, [0.987, 0.647, 0.364]], [0.290, [0.989, 0.657, 0.369]], [0.292, [0.989, 0.657, 0.369]], [0.294, [0.990, 0.667, 0.373]], [0.295, [0.990, 0.667, 0.373]], [0.297, [0.991, 0.677, 0.378]], [0.299, [0.991, 0.677, 0.378]], [0.301, [0.992, 0.686, 0.384]], [0.303, [0.992, 0.686, 0.384]], [0.305, [0.992, 0.694, 0.391]], [0.307, [0.992, 0.694, 0.391]], [0.309, [0.993, 0.702, 0.398]], [0.311, [0.993, 0.702, 0.398]], [0.313, [0.993, 0.709, 0.406]], [0.315, [0.993, 0.709, 0.406]], [0.317, [0.993, 0.717, 0.413]], [0.319, [0.993, 0.717, 0.413]], [0.321, [0.993, 0.725, 0.420]], [0.323, [0.993, 0.725, 0.420]], [0.325, [0.993, 0.732, 0.427]], [0.327, [0.993, 0.732, 0.427]], [0.329, [0.993, 0.740, 0.435]], [0.331, [0.993, 0.740, 0.435]], [0.333, [0.993, 0.748, 0.442]], [0.335, [0.993, 0.748, 0.442]], [0.337, [0.994, 0.755, 0.449]], [0.339, [0.994, 0.755, 0.449]], [0.341, [0.994, 0.763, 0.456]], [0.342, [0.994, 0.763, 0.456]], [0.344, [0.994, 0.771, 0.464]], [0.346, [0.994, 0.771, 0.464]], [0.348, [0.994, 0.778, 0.471]], [0.350, [0.994, 0.778, 0.471]], [0.352, [0.994, 0.786, 0.478]], [0.354, [0.994, 0.786, 0.478]], [0.356, [0.994, 0.794, 0.485]], [0.358, [0.994, 0.794, 0.485]], [0.360, [0.995, 0.802, 0.492]], [0.362, [0.995, 0.802, 0.492]], [0.364, [0.995, 0.809, 0.500]], [0.366, [0.995, 0.809, 0.500]], [0.368, [0.995, 0.817, 0.507]], [0.370, [0.995, 0.817, 0.507]], [0.372, [0.995, 0.825, 0.514]], [0.374, [0.995, 0.825, 0.514]], [0.376, [0.995, 0.832, 0.521]], [0.378, [0.995, 0.832, 0.521]], [0.380, [0.995, 0.840, 0.529]], [0.382, [0.995, 0.840, 0.529]], [0.384, [0.995, 0.848, 0.536]], [0.386, [0.995, 0.848, 0.536]], [0.387, [0.996, 0.855, 0.543]], [0.389, [0.996, 0.855, 0.543]], [0.391, [0.996, 0.863, 0.550]], [0.393, [0.996, 0.863, 0.550]], [0.395, [0.996, 0.871, 0.557]], [0.397, [0.996, 0.871, 0.557]], [0.399, [0.996, 0.878, 0.565]], [0.401, [0.996, 0.878, 0.565]], [0.403, [0.996, 0.883, 0.572]], [0.405, [0.996, 0.883, 0.572]], [0.407, [0.996, 0.888, 0.579]], [0.409, [0.996, 0.888, 0.579]], [0.411, [0.997, 0.893, 0.586]], [0.413, [0.997, 0.893, 0.586]], [0.415, [0.997, 0.898, 0.594]], [0.417, [0.997, 0.898, 0.594]], [0.419, [0.997, 0.902, 0.601]], [0.421, [0.997, 0.902, 0.601]], [0.423, [0.997, 0.907, 0.608]], [0.425, [0.997, 0.907, 0.608]], [0.427, [0.997, 0.912, 0.615]], [0.429, [0.997, 0.912, 0.615]], [0.431, [0.997, 0.917, 0.623]], [0.432, [0.997, 0.917, 0.623]], [0.434, [0.997, 0.921, 0.630]], [0.436, [0.997, 0.921, 0.630]], [0.438, [0.998, 0.926, 0.637]], [0.440, [0.998, 0.926, 0.637]], [0.442, [0.998, 0.931, 0.644]], [0.444, [0.998, 0.931, 0.644]], [0.446, [0.998, 0.936, 0.651]], [0.448, [0.998, 0.936, 0.651]], [0.450, [0.998, 0.940, 0.659]], [0.452, [0.998, 0.940, 0.659]], [0.454, [0.998, 0.945, 0.666]], [0.456, [0.998, 0.945, 0.666]], [0.458, [0.998, 0.950, 0.673]], [0.460, [0.998, 0.950, 0.673]], [0.462, [0.999, 0.955, 0.680]], [0.464, [0.999, 0.955, 0.680]], [0.466, [0.999, 0.959, 0.688]], [0.468, [0.999, 0.959, 0.688]], [0.470, [0.999, 0.964, 0.695]], [0.472, [0.999, 0.964, 0.695]], [0.474, [0.999, 0.969, 0.702]], [0.476, [0.999, 0.969, 0.702]], [0.477, [0.999, 0.974, 0.709]], [0.479, [0.999, 0.974, 0.709]], [0.481, [0.999, 0.979, 0.716]], [0.483, [0.999, 0.979, 0.716]], [0.485, [0.999, 0.983, 0.724]], [0.487, [0.999, 0.983, 0.724]], [0.489, [1.000, 0.988, 0.731]], [0.491, [1.000, 0.988, 0.731]], [0.493, [1.000, 0.993, 0.738]], [0.495, [1.000, 0.993, 0.738]], [0.497, [1.000, 0.998, 0.745]], [0.499, [1.000, 0.998, 0.745]], [0.501, [0.998, 0.999, 0.753]], [0.503, [0.998, 0.999, 0.753]], [0.505, [0.993, 0.997, 0.762]], [0.507, [0.993, 0.997, 0.762]], [0.509, [0.988, 0.995, 0.771]], [0.511, [0.988, 0.995, 0.771]], [0.513, [0.983, 0.994, 0.780]], [0.515, [0.983, 0.994, 0.780]], [0.517, [0.979, 0.992, 0.788]], [0.519, [0.979, 0.992, 0.788]], [0.521, [0.974, 0.990, 0.797]], [0.523, [0.974, 0.990, 0.797]], [0.524, [0.969, 0.988, 0.806]], [0.526, [0.969, 0.988, 0.806]], [0.528, [0.964, 0.986, 0.815]], [0.530, [0.964, 0.986, 0.815]], [0.532, [0.959, 0.984, 0.824]], [0.534, [0.959, 0.984, 0.824]], [0.536, [0.955, 0.982, 0.832]], [0.538, [0.955, 0.982, 0.832]], [0.540, [0.950, 0.981, 0.841]], [0.542, [0.950, 0.981, 0.841]], [0.544, [0.945, 0.979, 0.850]], [0.546, [0.945, 0.979, 0.850]], [0.548, [0.940, 0.977, 0.859]], [0.550, [0.940, 0.977, 0.859]], [0.552, [0.936, 0.975, 0.867]], [0.554, [0.936, 0.975, 0.867]], [0.556, [0.931, 0.973, 0.876]], [0.558, [0.931, 0.973, 0.876]], [0.560, [0.926, 0.971, 0.885]], [0.562, [0.926, 0.971, 0.885]], [0.564, [0.921, 0.970, 0.894]], [0.566, [0.921, 0.970, 0.894]], [0.568, [0.917, 0.968, 0.902]], [0.569, [0.917, 0.968, 0.902]], [0.571, [0.912, 0.966, 0.911]], [0.573, [0.912, 0.966, 0.911]], [0.575, [0.907, 0.964, 0.920]], [0.577, [0.907, 0.964, 0.920]], [0.579, [0.902, 0.962, 0.929]], [0.581, [0.902, 0.962, 0.929]], [0.583, [0.898, 0.960, 0.937]], [0.585, [0.898, 0.960, 0.937]], [0.587, [0.893, 0.958, 0.946]], [0.589, [0.893, 0.958, 0.946]], [0.591, [0.888, 0.957, 0.955]], [0.593, [0.888, 0.957, 0.955]], [0.595, [0.883, 0.955, 0.964]], [0.597, [0.883, 0.955, 0.964]], [0.599, [0.878, 0.953, 0.973]], [0.601, [0.878, 0.953, 0.973]], [0.603, [0.870, 0.949, 0.970]], [0.605, [0.870, 0.949, 0.970]], [0.607, [0.862, 0.945, 0.968]], [0.609, [0.862, 0.945, 0.968]], [0.611, [0.854, 0.941, 0.966]], [0.613, [0.854, 0.941, 0.966]], [0.614, [0.846, 0.937, 0.963]], [0.616, [0.846, 0.937, 0.963]], [0.618, [0.838, 0.933, 0.961]], [0.620, [0.838, 0.933, 0.961]], [0.622, [0.830, 0.929, 0.959]], [0.624, [0.830, 0.929, 0.959]], [0.626, [0.821, 0.925, 0.956]], [0.628, [0.821, 0.925, 0.956]], [0.630, [0.813, 0.921, 0.954]], [0.632, [0.813, 0.921, 0.954]], [0.634, [0.805, 0.917, 0.952]], [0.636, [0.805, 0.917, 0.952]], [0.638, [0.797, 0.913, 0.949]], [0.640, [0.797, 0.913, 0.949]], [0.642, [0.789, 0.909, 0.947]], [0.644, [0.789, 0.909, 0.947]], [0.646, [0.781, 0.905, 0.945]], [0.648, [0.781, 0.905, 0.945]], [0.650, [0.772, 0.901, 0.943]], [0.652, [0.772, 0.901, 0.943]], [0.654, [0.764, 0.897, 0.940]], [0.656, [0.764, 0.897, 0.940]], [0.658, [0.756, 0.893, 0.938]], [0.659, [0.756, 0.893, 0.938]], [0.661, [0.748, 0.889, 0.936]], [0.663, [0.748, 0.889, 0.936]], [0.665, [0.740, 0.885, 0.933]], [0.667, [0.740, 0.885, 0.933]], [0.669, [0.732, 0.881, 0.931]], [0.671, [0.732, 0.881, 0.931]], [0.673, [0.724, 0.877, 0.929]], [0.675, [0.724, 0.877, 0.929]], [0.677, [0.715, 0.873, 0.926]], [0.679, [0.715, 0.873, 0.926]], [0.681, [0.707, 0.869, 0.924]], [0.683, [0.707, 0.869, 0.924]], [0.685, [0.699, 0.865, 0.922]], [0.687, [0.699, 0.865, 0.922]], [0.689, [0.691, 0.861, 0.919]], [0.691, [0.691, 0.861, 0.919]], [0.693, [0.683, 0.857, 0.917]], [0.695, [0.683, 0.857, 0.917]], [0.697, [0.675, 0.853, 0.915]], [0.699, [0.675, 0.853, 0.915]], [0.701, [0.666, 0.848, 0.912]], [0.703, [0.666, 0.848, 0.912]], [0.705, [0.658, 0.841, 0.908]], [0.706, [0.658, 0.841, 0.908]], [0.708, [0.649, 0.834, 0.904]], [0.710, [0.649, 0.834, 0.904]], [0.712, [0.641, 0.827, 0.901]], [0.714, [0.641, 0.827, 0.901]], [0.716, [0.633, 0.821, 0.897]], [0.718, [0.633, 0.821, 0.897]], [0.720, [0.624, 0.814, 0.893]], [0.722, [0.624, 0.814, 0.893]], [0.724, [0.616, 0.807, 0.890]], [0.726, [0.616, 0.807, 0.890]], [0.728, [0.607, 0.800, 0.886]], [0.730, [0.607, 0.800, 0.886]], [0.732, [0.599, 0.793, 0.882]], [0.734, [0.599, 0.793, 0.882]], [0.736, [0.590, 0.787, 0.879]], [0.738, [0.590, 0.787, 0.879]], [0.740, [0.582, 0.780, 0.875]], [0.742, [0.582, 0.780, 0.875]], [0.744, [0.573, 0.773, 0.871]], [0.746, [0.573, 0.773, 0.871]], [0.748, [0.565, 0.766, 0.868]], [0.750, [0.565, 0.766, 0.868]], [0.751, [0.556, 0.760, 0.864]], [0.753, [0.556, 0.760, 0.864]], [0.755, [0.548, 0.753, 0.860]], [0.757, [0.548, 0.753, 0.860]], [0.759, [0.539, 0.746, 0.857]], [0.761, [0.539, 0.746, 0.857]], [0.763, [0.531, 0.739, 0.853]], [0.765, [0.531, 0.739, 0.853]], [0.767, [0.523, 0.733, 0.849]], [0.769, [0.523, 0.733, 0.849]], [0.771, [0.514, 0.726, 0.845]], [0.773, [0.514, 0.726, 0.845]], [0.775, [0.506, 0.719, 0.842]], [0.777, [0.506, 0.719, 0.842]], [0.779, [0.497, 0.712, 0.838]], [0.781, [0.497, 0.712, 0.838]], [0.783, [0.489, 0.705, 0.834]], [0.785, [0.489, 0.705, 0.834]], [0.787, [0.480, 0.699, 0.831]], [0.789, [0.480, 0.699, 0.831]], [0.791, [0.472, 0.692, 0.827]], [0.793, [0.472, 0.692, 0.827]], [0.795, [0.463, 0.685, 0.823]], [0.796, [0.463, 0.685, 0.823]], [0.798, [0.455, 0.678, 0.820]], [0.800, [0.455, 0.678, 0.820]], [0.802, [0.448, 0.670, 0.815]], [0.804, [0.448, 0.670, 0.815]], [0.806, [0.440, 0.661, 0.811]], [0.808, [0.440, 0.661, 0.811]], [0.810, [0.433, 0.653, 0.806]], [0.812, [0.433, 0.653, 0.806]], [0.814, [0.426, 0.644, 0.802]], [0.816, [0.426, 0.644, 0.802]], [0.818, [0.419, 0.635, 0.797]], [0.820, [0.419, 0.635, 0.797]], [0.822, [0.412, 0.627, 0.793]], [0.824, [0.412, 0.627, 0.793]], [0.826, [0.404, 0.618, 0.788]], [0.828, [0.404, 0.618, 0.788]], [0.830, [0.397, 0.610, 0.784]], [0.832, [0.397, 0.610, 0.784]], [0.834, [0.390, 0.601, 0.779]], [0.836, [0.390, 0.601, 0.779]], [0.838, [0.383, 0.592, 0.775]], [0.840, [0.383, 0.592, 0.775]], [0.841, [0.375, 0.584, 0.771]], [0.843, [0.375, 0.584, 0.771]], [0.845, [0.368, 0.575, 0.766]], [0.847, [0.368, 0.575, 0.766]], [0.849, [0.361, 0.566, 0.762]], [0.851, [0.361, 0.566, 0.762]], [0.853, [0.354, 0.558, 0.757]], [0.855, [0.354, 0.558, 0.757]], [0.857, [0.346, 0.549, 0.753]], [0.859, [0.346, 0.549, 0.753]], [0.861, [0.339, 0.541, 0.748]], [0.863, [0.339, 0.541, 0.748]], [0.865, [0.332, 0.532, 0.744]], [0.867, [0.332, 0.532, 0.744]], [0.869, [0.325, 0.523, 0.739]], [0.871, [0.325, 0.523, 0.739]], [0.873, [0.318, 0.515, 0.735]], [0.875, [0.318, 0.515, 0.735]], [0.877, [0.310, 0.506, 0.730]], [0.879, [0.310, 0.506, 0.730]], [0.881, [0.303, 0.498, 0.726]], [0.883, [0.303, 0.498, 0.726]], [0.885, [0.296, 0.489, 0.721]], [0.886, [0.296, 0.489, 0.721]], [0.888, [0.289, 0.480, 0.717]], [0.890, [0.289, 0.480, 0.717]], [0.892, [0.281, 0.472, 0.713]], [0.894, [0.281, 0.472, 0.713]], [0.896, [0.274, 0.463, 0.708]], [0.898, [0.274, 0.463, 0.708]], [0.900, [0.269, 0.454, 0.703]], [0.902, [0.269, 0.454, 0.703]], [0.904, [0.266, 0.444, 0.699]], [0.906, [0.266, 0.444, 0.699]], [0.908, [0.263, 0.435, 0.694]], [0.910, [0.263, 0.435, 0.694]], [0.912, [0.260, 0.425, 0.689]], [0.914, [0.260, 0.425, 0.689]], [0.916, [0.257, 0.415, 0.684]], [0.918, [0.257, 0.415, 0.684]], [0.920, [0.254, 0.406, 0.680]], [0.922, [0.254, 0.406, 0.680]], [0.924, [0.251, 0.396, 0.675]], [0.926, [0.251, 0.396, 0.675]], [0.928, [0.248, 0.386, 0.670]], [0.930, [0.248, 0.386, 0.670]], [0.932, [0.244, 0.376, 0.665]], [0.933, [0.244, 0.376, 0.665]], [0.935, [0.241, 0.367, 0.661]], [0.937, [0.241, 0.367, 0.661]], [0.939, [0.238, 0.357, 0.656]], [0.941, [0.238, 0.357, 0.656]], [0.943, [0.235, 0.347, 0.651]], [0.945, [0.235, 0.347, 0.651]], [0.947, [0.232, 0.338, 0.646]], [0.949, [0.232, 0.338, 0.646]], [0.951, [0.229, 0.328, 0.642]], [0.953, [0.229, 0.328, 0.642]], [0.955, [0.226, 0.318, 0.637]], [0.957, [0.226, 0.318, 0.637]], [0.959, [0.223, 0.309, 0.632]], [0.961, [0.223, 0.309, 0.632]], [0.963, [0.220, 0.299, 0.627]], [0.965, [0.220, 0.299, 0.627]], [0.967, [0.217, 0.289, 0.622]], [0.969, [0.217, 0.289, 0.622]], [0.971, [0.214, 0.280, 0.618]], [0.973, [0.214, 0.280, 0.618]], [0.975, [0.211, 0.270, 0.613]], [0.977, [0.211, 0.270, 0.613]], [0.978, [0.208, 0.260, 0.608]], [0.980, [0.208, 0.260, 0.608]], [0.982, [0.204, 0.251, 0.603]], [0.984, [0.204, 0.251, 0.603]], [0.986, [0.201, 0.241, 0.599]], [0.988, [0.201, 0.241, 0.599]], [0.990, [0.198, 0.231, 0.594]], [0.992, [0.198, 0.231, 0.594]], [0.994, [0.195, 0.221, 0.589]], [0.996, [0.195, 0.221, 0.589]], [0.998, [0.192, 0.212, 0.584]], [1.000, [0.192, 0.212, 0.584]]]; +var RdYlGn = [[0.000, [0.647, 0.000, 0.149]], [0.002, [0.647, 0.000, 0.149]], [0.004, [0.655, 0.007, 0.149]], [0.006, [0.655, 0.007, 0.149]], [0.008, [0.662, 0.015, 0.149]], [0.010, [0.662, 0.015, 0.149]], [0.012, [0.670, 0.022, 0.149]], [0.014, [0.670, 0.022, 0.149]], [0.016, [0.678, 0.030, 0.150]], [0.018, [0.678, 0.030, 0.150]], [0.020, [0.686, 0.037, 0.150]], [0.022, [0.686, 0.037, 0.150]], [0.023, [0.693, 0.044, 0.150]], [0.025, [0.693, 0.044, 0.150]], [0.027, [0.701, 0.052, 0.150]], [0.029, [0.701, 0.052, 0.150]], [0.031, [0.709, 0.059, 0.150]], [0.033, [0.709, 0.059, 0.150]], [0.035, [0.716, 0.066, 0.150]], [0.037, [0.716, 0.066, 0.150]], [0.039, [0.724, 0.074, 0.151]], [0.041, [0.724, 0.074, 0.151]], [0.043, [0.732, 0.081, 0.151]], [0.045, [0.732, 0.081, 0.151]], [0.047, [0.739, 0.089, 0.151]], [0.049, [0.739, 0.089, 0.151]], [0.051, [0.747, 0.096, 0.151]], [0.053, [0.747, 0.096, 0.151]], [0.055, [0.755, 0.103, 0.151]], [0.057, [0.755, 0.103, 0.151]], [0.059, [0.762, 0.111, 0.151]], [0.061, [0.762, 0.111, 0.151]], [0.063, [0.770, 0.118, 0.151]], [0.065, [0.770, 0.118, 0.151]], [0.067, [0.778, 0.125, 0.152]], [0.068, [0.778, 0.125, 0.152]], [0.070, [0.785, 0.133, 0.152]], [0.072, [0.785, 0.133, 0.152]], [0.074, [0.793, 0.140, 0.152]], [0.076, [0.793, 0.140, 0.152]], [0.078, [0.801, 0.148, 0.152]], [0.080, [0.801, 0.148, 0.152]], [0.082, [0.809, 0.155, 0.152]], [0.084, [0.809, 0.155, 0.152]], [0.086, [0.816, 0.162, 0.152]], [0.088, [0.816, 0.162, 0.152]], [0.090, [0.824, 0.170, 0.153]], [0.092, [0.824, 0.170, 0.153]], [0.094, [0.832, 0.177, 0.153]], [0.096, [0.832, 0.177, 0.153]], [0.098, [0.839, 0.185, 0.153]], [0.100, [0.839, 0.185, 0.153]], [0.102, [0.845, 0.193, 0.155]], [0.104, [0.845, 0.193, 0.155]], [0.106, [0.850, 0.202, 0.159]], [0.108, [0.850, 0.202, 0.159]], [0.110, [0.854, 0.212, 0.164]], [0.112, [0.854, 0.212, 0.164]], [0.114, [0.859, 0.221, 0.168]], [0.115, [0.859, 0.221, 0.168]], [0.117, [0.863, 0.230, 0.172]], [0.119, [0.863, 0.230, 0.172]], [0.121, [0.868, 0.240, 0.177]], [0.123, [0.868, 0.240, 0.177]], [0.125, [0.872, 0.249, 0.181]], [0.127, [0.872, 0.249, 0.181]], [0.129, [0.877, 0.259, 0.185]], [0.131, [0.877, 0.259, 0.185]], [0.133, [0.881, 0.268, 0.190]], [0.135, [0.881, 0.268, 0.190]], [0.137, [0.886, 0.277, 0.194]], [0.139, [0.886, 0.277, 0.194]], [0.141, [0.890, 0.287, 0.198]], [0.143, [0.890, 0.287, 0.198]], [0.145, [0.894, 0.296, 0.202]], [0.147, [0.894, 0.296, 0.202]], [0.149, [0.899, 0.305, 0.207]], [0.151, [0.899, 0.305, 0.207]], [0.153, [0.903, 0.315, 0.211]], [0.155, [0.903, 0.315, 0.211]], [0.157, [0.908, 0.324, 0.215]], [0.159, [0.908, 0.324, 0.215]], [0.160, [0.912, 0.334, 0.220]], [0.162, [0.912, 0.334, 0.220]], [0.164, [0.917, 0.343, 0.224]], [0.166, [0.917, 0.343, 0.224]], [0.168, [0.921, 0.352, 0.228]], [0.170, [0.921, 0.352, 0.228]], [0.172, [0.926, 0.362, 0.233]], [0.174, [0.926, 0.362, 0.233]], [0.176, [0.930, 0.371, 0.237]], [0.178, [0.930, 0.371, 0.237]], [0.180, [0.935, 0.381, 0.241]], [0.182, [0.935, 0.381, 0.241]], [0.184, [0.939, 0.390, 0.246]], [0.186, [0.939, 0.390, 0.246]], [0.188, [0.943, 0.399, 0.250]], [0.190, [0.943, 0.399, 0.250]], [0.192, [0.948, 0.409, 0.254]], [0.194, [0.948, 0.409, 0.254]], [0.196, [0.952, 0.418, 0.258]], [0.198, [0.952, 0.418, 0.258]], [0.200, [0.957, 0.427, 0.263]], [0.202, [0.957, 0.427, 0.263]], [0.204, [0.958, 0.437, 0.267]], [0.205, [0.958, 0.437, 0.267]], [0.207, [0.960, 0.447, 0.272]], [0.209, [0.960, 0.447, 0.272]], [0.211, [0.961, 0.457, 0.277]], [0.213, [0.961, 0.457, 0.277]], [0.215, [0.962, 0.467, 0.281]], [0.217, [0.962, 0.467, 0.281]], [0.219, [0.964, 0.477, 0.286]], [0.221, [0.964, 0.477, 0.286]], [0.223, [0.965, 0.487, 0.290]], [0.225, [0.965, 0.487, 0.290]], [0.227, [0.967, 0.497, 0.295]], [0.229, [0.967, 0.497, 0.295]], [0.231, [0.968, 0.507, 0.300]], [0.233, [0.968, 0.507, 0.300]], [0.235, [0.969, 0.517, 0.304]], [0.237, [0.969, 0.517, 0.304]], [0.239, [0.971, 0.527, 0.309]], [0.241, [0.971, 0.527, 0.309]], [0.243, [0.972, 0.537, 0.313]], [0.245, [0.972, 0.537, 0.313]], [0.247, [0.973, 0.547, 0.318]], [0.249, [0.973, 0.547, 0.318]], [0.250, [0.975, 0.557, 0.323]], [0.252, [0.975, 0.557, 0.323]], [0.254, [0.976, 0.567, 0.327]], [0.256, [0.976, 0.567, 0.327]], [0.258, [0.978, 0.577, 0.332]], [0.260, [0.978, 0.577, 0.332]], [0.262, [0.979, 0.587, 0.337]], [0.264, [0.979, 0.587, 0.337]], [0.266, [0.980, 0.597, 0.341]], [0.268, [0.980, 0.597, 0.341]], [0.270, [0.982, 0.607, 0.346]], [0.272, [0.982, 0.607, 0.346]], [0.274, [0.983, 0.617, 0.350]], [0.276, [0.983, 0.617, 0.350]], [0.278, [0.985, 0.627, 0.355]], [0.280, [0.985, 0.627, 0.355]], [0.282, [0.986, 0.637, 0.360]], [0.284, [0.986, 0.637, 0.360]], [0.286, [0.987, 0.647, 0.364]], [0.288, [0.987, 0.647, 0.364]], [0.290, [0.989, 0.657, 0.369]], [0.292, [0.989, 0.657, 0.369]], [0.294, [0.990, 0.667, 0.373]], [0.295, [0.990, 0.667, 0.373]], [0.297, [0.991, 0.677, 0.378]], [0.299, [0.991, 0.677, 0.378]], [0.301, [0.992, 0.686, 0.384]], [0.303, [0.992, 0.686, 0.384]], [0.305, [0.992, 0.694, 0.390]], [0.307, [0.992, 0.694, 0.390]], [0.309, [0.993, 0.702, 0.397]], [0.311, [0.993, 0.702, 0.397]], [0.313, [0.993, 0.709, 0.403]], [0.315, [0.993, 0.709, 0.403]], [0.317, [0.993, 0.717, 0.409]], [0.319, [0.993, 0.717, 0.409]], [0.321, [0.993, 0.725, 0.416]], [0.323, [0.993, 0.725, 0.416]], [0.325, [0.993, 0.732, 0.422]], [0.327, [0.993, 0.732, 0.422]], [0.329, [0.993, 0.740, 0.429]], [0.331, [0.993, 0.740, 0.429]], [0.333, [0.993, 0.748, 0.435]], [0.335, [0.993, 0.748, 0.435]], [0.337, [0.994, 0.755, 0.442]], [0.339, [0.994, 0.755, 0.442]], [0.341, [0.994, 0.763, 0.448]], [0.342, [0.994, 0.763, 0.448]], [0.344, [0.994, 0.771, 0.455]], [0.346, [0.994, 0.771, 0.455]], [0.348, [0.994, 0.778, 0.461]], [0.350, [0.994, 0.778, 0.461]], [0.352, [0.994, 0.786, 0.468]], [0.354, [0.994, 0.786, 0.468]], [0.356, [0.994, 0.794, 0.474]], [0.358, [0.994, 0.794, 0.474]], [0.360, [0.995, 0.802, 0.481]], [0.362, [0.995, 0.802, 0.481]], [0.364, [0.995, 0.809, 0.487]], [0.366, [0.995, 0.809, 0.487]], [0.368, [0.995, 0.817, 0.493]], [0.370, [0.995, 0.817, 0.493]], [0.372, [0.995, 0.825, 0.500]], [0.374, [0.995, 0.825, 0.500]], [0.376, [0.995, 0.832, 0.506]], [0.378, [0.995, 0.832, 0.506]], [0.380, [0.995, 0.840, 0.513]], [0.382, [0.995, 0.840, 0.513]], [0.384, [0.995, 0.848, 0.519]], [0.386, [0.995, 0.848, 0.519]], [0.387, [0.996, 0.855, 0.526]], [0.389, [0.996, 0.855, 0.526]], [0.391, [0.996, 0.863, 0.532]], [0.393, [0.996, 0.863, 0.532]], [0.395, [0.996, 0.871, 0.539]], [0.397, [0.996, 0.871, 0.539]], [0.399, [0.996, 0.878, 0.545]], [0.401, [0.996, 0.878, 0.545]], [0.403, [0.996, 0.883, 0.553]], [0.405, [0.996, 0.883, 0.553]], [0.407, [0.996, 0.888, 0.561]], [0.409, [0.996, 0.888, 0.561]], [0.411, [0.997, 0.893, 0.569]], [0.413, [0.997, 0.893, 0.569]], [0.415, [0.997, 0.898, 0.577]], [0.417, [0.997, 0.898, 0.577]], [0.419, [0.997, 0.902, 0.585]], [0.421, [0.997, 0.902, 0.585]], [0.423, [0.997, 0.907, 0.593]], [0.425, [0.997, 0.907, 0.593]], [0.427, [0.997, 0.912, 0.601]], [0.429, [0.997, 0.912, 0.601]], [0.431, [0.997, 0.917, 0.609]], [0.432, [0.997, 0.917, 0.609]], [0.434, [0.997, 0.921, 0.617]], [0.436, [0.997, 0.921, 0.617]], [0.438, [0.998, 0.926, 0.625]], [0.440, [0.998, 0.926, 0.625]], [0.442, [0.998, 0.931, 0.633]], [0.444, [0.998, 0.931, 0.633]], [0.446, [0.998, 0.936, 0.641]], [0.448, [0.998, 0.936, 0.641]], [0.450, [0.998, 0.940, 0.649]], [0.452, [0.998, 0.940, 0.649]], [0.454, [0.998, 0.945, 0.657]], [0.456, [0.998, 0.945, 0.657]], [0.458, [0.998, 0.950, 0.665]], [0.460, [0.998, 0.950, 0.665]], [0.462, [0.999, 0.955, 0.673]], [0.464, [0.999, 0.955, 0.673]], [0.466, [0.999, 0.959, 0.681]], [0.468, [0.999, 0.959, 0.681]], [0.470, [0.999, 0.964, 0.689]], [0.472, [0.999, 0.964, 0.689]], [0.474, [0.999, 0.969, 0.697]], [0.476, [0.999, 0.969, 0.697]], [0.477, [0.999, 0.974, 0.705]], [0.479, [0.999, 0.974, 0.705]], [0.481, [0.999, 0.979, 0.713]], [0.483, [0.999, 0.979, 0.713]], [0.485, [0.999, 0.983, 0.721]], [0.487, [0.999, 0.983, 0.721]], [0.489, [1.000, 0.988, 0.729]], [0.491, [1.000, 0.988, 0.729]], [0.493, [1.000, 0.993, 0.737]], [0.495, [1.000, 0.993, 0.737]], [0.497, [1.000, 0.998, 0.745]], [0.499, [1.000, 0.998, 0.745]], [0.501, [0.997, 0.999, 0.745]], [0.503, [0.997, 0.999, 0.745]], [0.505, [0.991, 0.996, 0.737]], [0.507, [0.991, 0.996, 0.737]], [0.509, [0.985, 0.994, 0.729]], [0.511, [0.985, 0.994, 0.729]], [0.513, [0.980, 0.991, 0.721]], [0.515, [0.980, 0.991, 0.721]], [0.517, [0.974, 0.989, 0.713]], [0.519, [0.974, 0.989, 0.713]], [0.521, [0.968, 0.986, 0.705]], [0.523, [0.968, 0.986, 0.705]], [0.524, [0.962, 0.984, 0.697]], [0.526, [0.962, 0.984, 0.697]], [0.528, [0.956, 0.982, 0.689]], [0.530, [0.956, 0.982, 0.689]], [0.532, [0.950, 0.979, 0.681]], [0.534, [0.950, 0.979, 0.681]], [0.536, [0.944, 0.977, 0.673]], [0.538, [0.944, 0.977, 0.673]], [0.540, [0.939, 0.974, 0.665]], [0.542, [0.939, 0.974, 0.665]], [0.544, [0.933, 0.972, 0.657]], [0.546, [0.933, 0.972, 0.657]], [0.548, [0.927, 0.969, 0.649]], [0.550, [0.927, 0.969, 0.649]], [0.552, [0.921, 0.967, 0.641]], [0.554, [0.921, 0.967, 0.641]], [0.556, [0.915, 0.964, 0.633]], [0.558, [0.915, 0.964, 0.633]], [0.560, [0.909, 0.962, 0.625]], [0.562, [0.909, 0.962, 0.625]], [0.564, [0.904, 0.959, 0.617]], [0.566, [0.904, 0.959, 0.617]], [0.568, [0.898, 0.957, 0.609]], [0.569, [0.898, 0.957, 0.609]], [0.571, [0.892, 0.954, 0.601]], [0.573, [0.892, 0.954, 0.601]], [0.575, [0.886, 0.952, 0.593]], [0.577, [0.886, 0.952, 0.593]], [0.579, [0.880, 0.950, 0.585]], [0.581, [0.880, 0.950, 0.585]], [0.583, [0.874, 0.947, 0.577]], [0.585, [0.874, 0.947, 0.577]], [0.587, [0.869, 0.945, 0.569]], [0.589, [0.869, 0.945, 0.569]], [0.591, [0.863, 0.942, 0.561]], [0.593, [0.863, 0.942, 0.561]], [0.595, [0.857, 0.940, 0.553]], [0.597, [0.857, 0.940, 0.553]], [0.599, [0.851, 0.937, 0.545]], [0.601, [0.851, 0.937, 0.545]], [0.603, [0.843, 0.934, 0.540]], [0.605, [0.843, 0.934, 0.540]], [0.607, [0.835, 0.930, 0.535]], [0.609, [0.835, 0.930, 0.535]], [0.611, [0.827, 0.927, 0.530]], [0.613, [0.827, 0.927, 0.530]], [0.614, [0.820, 0.924, 0.525]], [0.616, [0.820, 0.924, 0.525]], [0.618, [0.812, 0.920, 0.520]], [0.620, [0.812, 0.920, 0.520]], [0.622, [0.804, 0.917, 0.515]], [0.624, [0.804, 0.917, 0.515]], [0.626, [0.796, 0.914, 0.510]], [0.628, [0.796, 0.914, 0.510]], [0.630, [0.788, 0.910, 0.504]], [0.632, [0.788, 0.910, 0.504]], [0.634, [0.780, 0.907, 0.499]], [0.636, [0.780, 0.907, 0.499]], [0.638, [0.773, 0.903, 0.494]], [0.640, [0.773, 0.903, 0.494]], [0.642, [0.765, 0.900, 0.489]], [0.644, [0.765, 0.900, 0.489]], [0.646, [0.757, 0.897, 0.484]], [0.648, [0.757, 0.897, 0.484]], [0.650, [0.749, 0.893, 0.479]], [0.652, [0.749, 0.893, 0.479]], [0.654, [0.741, 0.890, 0.474]], [0.656, [0.741, 0.890, 0.474]], [0.658, [0.733, 0.887, 0.469]], [0.659, [0.733, 0.887, 0.469]], [0.661, [0.725, 0.883, 0.464]], [0.663, [0.725, 0.883, 0.464]], [0.665, [0.718, 0.880, 0.459]], [0.667, [0.718, 0.880, 0.459]], [0.669, [0.710, 0.876, 0.454]], [0.671, [0.710, 0.876, 0.454]], [0.673, [0.702, 0.873, 0.449]], [0.675, [0.702, 0.873, 0.449]], [0.677, [0.694, 0.870, 0.444]], [0.679, [0.694, 0.870, 0.444]], [0.681, [0.686, 0.866, 0.439]], [0.683, [0.686, 0.866, 0.439]], [0.685, [0.678, 0.863, 0.433]], [0.687, [0.678, 0.863, 0.433]], [0.689, [0.671, 0.859, 0.428]], [0.691, [0.671, 0.859, 0.428]], [0.693, [0.663, 0.856, 0.423]], [0.695, [0.663, 0.856, 0.423]], [0.697, [0.655, 0.853, 0.418]], [0.699, [0.655, 0.853, 0.418]], [0.701, [0.646, 0.849, 0.415]], [0.703, [0.646, 0.849, 0.415]], [0.705, [0.636, 0.845, 0.414]], [0.706, [0.636, 0.845, 0.414]], [0.708, [0.626, 0.840, 0.413]], [0.710, [0.626, 0.840, 0.413]], [0.712, [0.617, 0.836, 0.412]], [0.714, [0.617, 0.836, 0.412]], [0.716, [0.607, 0.832, 0.411]], [0.718, [0.607, 0.832, 0.411]], [0.720, [0.597, 0.827, 0.410]], [0.722, [0.597, 0.827, 0.410]], [0.724, [0.587, 0.823, 0.409]], [0.726, [0.587, 0.823, 0.409]], [0.728, [0.577, 0.819, 0.408]], [0.730, [0.577, 0.819, 0.408]], [0.732, [0.567, 0.814, 0.407]], [0.734, [0.567, 0.814, 0.407]], [0.736, [0.557, 0.810, 0.405]], [0.738, [0.557, 0.810, 0.405]], [0.740, [0.548, 0.806, 0.404]], [0.742, [0.548, 0.806, 0.404]], [0.744, [0.538, 0.801, 0.403]], [0.746, [0.538, 0.801, 0.403]], [0.748, [0.528, 0.797, 0.402]], [0.750, [0.528, 0.797, 0.402]], [0.751, [0.518, 0.793, 0.401]], [0.753, [0.518, 0.793, 0.401]], [0.755, [0.508, 0.789, 0.400]], [0.757, [0.508, 0.789, 0.400]], [0.759, [0.498, 0.784, 0.399]], [0.761, [0.498, 0.784, 0.399]], [0.763, [0.489, 0.780, 0.398]], [0.765, [0.489, 0.780, 0.398]], [0.767, [0.479, 0.776, 0.397]], [0.769, [0.479, 0.776, 0.397]], [0.771, [0.469, 0.771, 0.396]], [0.773, [0.469, 0.771, 0.396]], [0.775, [0.459, 0.767, 0.395]], [0.777, [0.459, 0.767, 0.395]], [0.779, [0.449, 0.763, 0.394]], [0.781, [0.449, 0.763, 0.394]], [0.783, [0.439, 0.758, 0.393]], [0.785, [0.439, 0.758, 0.393]], [0.787, [0.430, 0.754, 0.391]], [0.789, [0.430, 0.754, 0.391]], [0.791, [0.420, 0.750, 0.390]], [0.793, [0.420, 0.750, 0.390]], [0.795, [0.410, 0.745, 0.389]], [0.796, [0.410, 0.745, 0.389]], [0.798, [0.400, 0.741, 0.388]], [0.800, [0.400, 0.741, 0.388]], [0.802, [0.388, 0.735, 0.385]], [0.804, [0.388, 0.735, 0.385]], [0.806, [0.377, 0.730, 0.382]], [0.808, [0.377, 0.730, 0.382]], [0.810, [0.365, 0.724, 0.379]], [0.812, [0.365, 0.724, 0.379]], [0.814, [0.353, 0.718, 0.377]], [0.816, [0.353, 0.718, 0.377]], [0.818, [0.342, 0.713, 0.374]], [0.820, [0.342, 0.713, 0.374]], [0.822, [0.330, 0.707, 0.371]], [0.824, [0.330, 0.707, 0.371]], [0.826, [0.318, 0.701, 0.368]], [0.828, [0.318, 0.701, 0.368]], [0.830, [0.306, 0.696, 0.365]], [0.832, [0.306, 0.696, 0.365]], [0.834, [0.295, 0.690, 0.362]], [0.836, [0.295, 0.690, 0.362]], [0.838, [0.283, 0.684, 0.359]], [0.840, [0.283, 0.684, 0.359]], [0.841, [0.271, 0.679, 0.356]], [0.843, [0.271, 0.679, 0.356]], [0.845, [0.260, 0.673, 0.353]], [0.847, [0.260, 0.673, 0.353]], [0.849, [0.248, 0.667, 0.350]], [0.851, [0.248, 0.667, 0.350]], [0.853, [0.236, 0.662, 0.347]], [0.855, [0.236, 0.662, 0.347]], [0.857, [0.225, 0.656, 0.344]], [0.859, [0.225, 0.656, 0.344]], [0.861, [0.213, 0.650, 0.341]], [0.863, [0.213, 0.650, 0.341]], [0.865, [0.201, 0.644, 0.339]], [0.867, [0.201, 0.644, 0.339]], [0.869, [0.190, 0.639, 0.336]], [0.871, [0.190, 0.639, 0.336]], [0.873, [0.178, 0.633, 0.333]], [0.875, [0.178, 0.633, 0.333]], [0.877, [0.166, 0.627, 0.330]], [0.879, [0.166, 0.627, 0.330]], [0.881, [0.155, 0.622, 0.327]], [0.883, [0.155, 0.622, 0.327]], [0.885, [0.143, 0.616, 0.324]], [0.886, [0.143, 0.616, 0.324]], [0.888, [0.131, 0.610, 0.321]], [0.890, [0.131, 0.610, 0.321]], [0.892, [0.119, 0.605, 0.318]], [0.894, [0.119, 0.605, 0.318]], [0.896, [0.108, 0.599, 0.315]], [0.898, [0.108, 0.599, 0.315]], [0.900, [0.100, 0.592, 0.312]], [0.902, [0.100, 0.592, 0.312]], [0.904, [0.096, 0.585, 0.308]], [0.906, [0.096, 0.585, 0.308]], [0.908, [0.092, 0.578, 0.304]], [0.910, [0.092, 0.578, 0.304]], [0.912, [0.088, 0.570, 0.300]], [0.914, [0.088, 0.570, 0.300]], [0.916, [0.084, 0.563, 0.296]], [0.918, [0.084, 0.563, 0.296]], [0.920, [0.080, 0.555, 0.293]], [0.922, [0.080, 0.555, 0.293]], [0.924, [0.076, 0.548, 0.289]], [0.926, [0.076, 0.548, 0.289]], [0.928, [0.072, 0.541, 0.285]], [0.930, [0.072, 0.541, 0.285]], [0.932, [0.068, 0.533, 0.281]], [0.933, [0.068, 0.533, 0.281]], [0.935, [0.064, 0.526, 0.277]], [0.937, [0.064, 0.526, 0.277]], [0.939, [0.060, 0.519, 0.273]], [0.941, [0.060, 0.519, 0.273]], [0.943, [0.056, 0.511, 0.270]], [0.945, [0.056, 0.511, 0.270]], [0.947, [0.052, 0.504, 0.266]], [0.949, [0.052, 0.504, 0.266]], [0.951, [0.048, 0.496, 0.262]], [0.953, [0.048, 0.496, 0.262]], [0.955, [0.044, 0.489, 0.258]], [0.957, [0.044, 0.489, 0.258]], [0.959, [0.040, 0.482, 0.254]], [0.961, [0.040, 0.482, 0.254]], [0.963, [0.036, 0.474, 0.250]], [0.965, [0.036, 0.474, 0.250]], [0.967, [0.032, 0.467, 0.246]], [0.969, [0.032, 0.467, 0.246]], [0.971, [0.028, 0.460, 0.243]], [0.973, [0.028, 0.460, 0.243]], [0.975, [0.024, 0.452, 0.239]], [0.977, [0.024, 0.452, 0.239]], [0.978, [0.020, 0.445, 0.235]], [0.980, [0.020, 0.445, 0.235]], [0.982, [0.016, 0.437, 0.231]], [0.984, [0.016, 0.437, 0.231]], [0.986, [0.012, 0.430, 0.227]], [0.988, [0.012, 0.430, 0.227]], [0.990, [0.008, 0.423, 0.223]], [0.992, [0.008, 0.423, 0.223]], [0.994, [0.004, 0.415, 0.220]], [0.996, [0.004, 0.415, 0.220]], [0.998, [0.000, 0.408, 0.216]], [1.000, [0.000, 0.408, 0.216]]]; +var Spectral = [[0.000, [0.620, 0.004, 0.259]], [0.002, [0.620, 0.004, 0.259]], [0.004, [0.628, 0.013, 0.261]], [0.006, [0.628, 0.013, 0.261]], [0.008, [0.637, 0.023, 0.263]], [0.010, [0.637, 0.023, 0.263]], [0.012, [0.645, 0.032, 0.265]], [0.014, [0.645, 0.032, 0.265]], [0.016, [0.653, 0.041, 0.267]], [0.018, [0.653, 0.041, 0.267]], [0.020, [0.662, 0.051, 0.269]], [0.022, [0.662, 0.051, 0.269]], [0.023, [0.670, 0.060, 0.271]], [0.025, [0.670, 0.060, 0.271]], [0.027, [0.679, 0.070, 0.273]], [0.029, [0.679, 0.070, 0.273]], [0.031, [0.687, 0.079, 0.275]], [0.033, [0.687, 0.079, 0.275]], [0.035, [0.696, 0.088, 0.277]], [0.037, [0.696, 0.088, 0.277]], [0.039, [0.704, 0.098, 0.279]], [0.041, [0.704, 0.098, 0.279]], [0.043, [0.713, 0.107, 0.281]], [0.045, [0.713, 0.107, 0.281]], [0.047, [0.721, 0.116, 0.283]], [0.049, [0.721, 0.116, 0.283]], [0.051, [0.730, 0.126, 0.285]], [0.053, [0.730, 0.126, 0.285]], [0.055, [0.738, 0.135, 0.287]], [0.057, [0.738, 0.135, 0.287]], [0.059, [0.746, 0.145, 0.289]], [0.061, [0.746, 0.145, 0.289]], [0.063, [0.755, 0.154, 0.291]], [0.065, [0.755, 0.154, 0.291]], [0.067, [0.763, 0.163, 0.293]], [0.068, [0.763, 0.163, 0.293]], [0.070, [0.772, 0.173, 0.295]], [0.072, [0.772, 0.173, 0.295]], [0.074, [0.780, 0.182, 0.297]], [0.076, [0.780, 0.182, 0.297]], [0.078, [0.789, 0.192, 0.299]], [0.080, [0.789, 0.192, 0.299]], [0.082, [0.797, 0.201, 0.301]], [0.084, [0.797, 0.201, 0.301]], [0.086, [0.806, 0.210, 0.303]], [0.088, [0.806, 0.210, 0.303]], [0.090, [0.814, 0.220, 0.305]], [0.092, [0.814, 0.220, 0.305]], [0.094, [0.823, 0.229, 0.307]], [0.096, [0.823, 0.229, 0.307]], [0.098, [0.831, 0.238, 0.309]], [0.100, [0.831, 0.238, 0.309]], [0.102, [0.838, 0.247, 0.309]], [0.104, [0.838, 0.247, 0.309]], [0.106, [0.842, 0.254, 0.307]], [0.108, [0.842, 0.254, 0.307]], [0.110, [0.847, 0.261, 0.305]], [0.112, [0.847, 0.261, 0.305]], [0.114, [0.852, 0.268, 0.303]], [0.115, [0.852, 0.268, 0.303]], [0.117, [0.857, 0.276, 0.301]], [0.119, [0.857, 0.276, 0.301]], [0.121, [0.862, 0.283, 0.300]], [0.123, [0.862, 0.283, 0.300]], [0.125, [0.866, 0.290, 0.298]], [0.127, [0.866, 0.290, 0.298]], [0.129, [0.871, 0.297, 0.296]], [0.131, [0.871, 0.297, 0.296]], [0.133, [0.876, 0.305, 0.294]], [0.135, [0.876, 0.305, 0.294]], [0.137, [0.881, 0.312, 0.292]], [0.139, [0.881, 0.312, 0.292]], [0.141, [0.885, 0.319, 0.290]], [0.143, [0.885, 0.319, 0.290]], [0.145, [0.890, 0.326, 0.289]], [0.147, [0.890, 0.326, 0.289]], [0.149, [0.895, 0.333, 0.287]], [0.151, [0.895, 0.333, 0.287]], [0.153, [0.900, 0.341, 0.285]], [0.155, [0.900, 0.341, 0.285]], [0.157, [0.904, 0.348, 0.283]], [0.159, [0.904, 0.348, 0.283]], [0.160, [0.909, 0.355, 0.281]], [0.162, [0.909, 0.355, 0.281]], [0.164, [0.914, 0.362, 0.279]], [0.166, [0.914, 0.362, 0.279]], [0.168, [0.919, 0.370, 0.278]], [0.170, [0.919, 0.370, 0.278]], [0.172, [0.923, 0.377, 0.276]], [0.174, [0.923, 0.377, 0.276]], [0.176, [0.928, 0.384, 0.274]], [0.178, [0.928, 0.384, 0.274]], [0.180, [0.933, 0.391, 0.272]], [0.182, [0.933, 0.391, 0.272]], [0.184, [0.938, 0.399, 0.270]], [0.186, [0.938, 0.399, 0.270]], [0.188, [0.943, 0.406, 0.268]], [0.190, [0.943, 0.406, 0.268]], [0.192, [0.947, 0.413, 0.266]], [0.194, [0.947, 0.413, 0.266]], [0.196, [0.952, 0.420, 0.265]], [0.198, [0.952, 0.420, 0.265]], [0.200, [0.957, 0.427, 0.263]], [0.202, [0.957, 0.427, 0.263]], [0.204, [0.958, 0.437, 0.267]], [0.205, [0.958, 0.437, 0.267]], [0.207, [0.960, 0.447, 0.272]], [0.209, [0.960, 0.447, 0.272]], [0.211, [0.961, 0.457, 0.277]], [0.213, [0.961, 0.457, 0.277]], [0.215, [0.962, 0.467, 0.281]], [0.217, [0.962, 0.467, 0.281]], [0.219, [0.964, 0.477, 0.286]], [0.221, [0.964, 0.477, 0.286]], [0.223, [0.965, 0.487, 0.290]], [0.225, [0.965, 0.487, 0.290]], [0.227, [0.967, 0.497, 0.295]], [0.229, [0.967, 0.497, 0.295]], [0.231, [0.968, 0.507, 0.300]], [0.233, [0.968, 0.507, 0.300]], [0.235, [0.969, 0.517, 0.304]], [0.237, [0.969, 0.517, 0.304]], [0.239, [0.971, 0.527, 0.309]], [0.241, [0.971, 0.527, 0.309]], [0.243, [0.972, 0.537, 0.313]], [0.245, [0.972, 0.537, 0.313]], [0.247, [0.973, 0.547, 0.318]], [0.249, [0.973, 0.547, 0.318]], [0.250, [0.975, 0.557, 0.323]], [0.252, [0.975, 0.557, 0.323]], [0.254, [0.976, 0.567, 0.327]], [0.256, [0.976, 0.567, 0.327]], [0.258, [0.978, 0.577, 0.332]], [0.260, [0.978, 0.577, 0.332]], [0.262, [0.979, 0.587, 0.337]], [0.264, [0.979, 0.587, 0.337]], [0.266, [0.980, 0.597, 0.341]], [0.268, [0.980, 0.597, 0.341]], [0.270, [0.982, 0.607, 0.346]], [0.272, [0.982, 0.607, 0.346]], [0.274, [0.983, 0.617, 0.350]], [0.276, [0.983, 0.617, 0.350]], [0.278, [0.985, 0.627, 0.355]], [0.280, [0.985, 0.627, 0.355]], [0.282, [0.986, 0.637, 0.360]], [0.284, [0.986, 0.637, 0.360]], [0.286, [0.987, 0.647, 0.364]], [0.288, [0.987, 0.647, 0.364]], [0.290, [0.989, 0.657, 0.369]], [0.292, [0.989, 0.657, 0.369]], [0.294, [0.990, 0.667, 0.373]], [0.295, [0.990, 0.667, 0.373]], [0.297, [0.991, 0.677, 0.378]], [0.299, [0.991, 0.677, 0.378]], [0.301, [0.992, 0.686, 0.384]], [0.303, [0.992, 0.686, 0.384]], [0.305, [0.992, 0.694, 0.390]], [0.307, [0.992, 0.694, 0.390]], [0.309, [0.993, 0.702, 0.397]], [0.311, [0.993, 0.702, 0.397]], [0.313, [0.993, 0.709, 0.403]], [0.315, [0.993, 0.709, 0.403]], [0.317, [0.993, 0.717, 0.409]], [0.319, [0.993, 0.717, 0.409]], [0.321, [0.993, 0.725, 0.416]], [0.323, [0.993, 0.725, 0.416]], [0.325, [0.993, 0.732, 0.422]], [0.327, [0.993, 0.732, 0.422]], [0.329, [0.993, 0.740, 0.429]], [0.331, [0.993, 0.740, 0.429]], [0.333, [0.993, 0.748, 0.435]], [0.335, [0.993, 0.748, 0.435]], [0.337, [0.994, 0.755, 0.442]], [0.339, [0.994, 0.755, 0.442]], [0.341, [0.994, 0.763, 0.448]], [0.342, [0.994, 0.763, 0.448]], [0.344, [0.994, 0.771, 0.455]], [0.346, [0.994, 0.771, 0.455]], [0.348, [0.994, 0.778, 0.461]], [0.350, [0.994, 0.778, 0.461]], [0.352, [0.994, 0.786, 0.468]], [0.354, [0.994, 0.786, 0.468]], [0.356, [0.994, 0.794, 0.474]], [0.358, [0.994, 0.794, 0.474]], [0.360, [0.995, 0.802, 0.481]], [0.362, [0.995, 0.802, 0.481]], [0.364, [0.995, 0.809, 0.487]], [0.366, [0.995, 0.809, 0.487]], [0.368, [0.995, 0.817, 0.493]], [0.370, [0.995, 0.817, 0.493]], [0.372, [0.995, 0.825, 0.500]], [0.374, [0.995, 0.825, 0.500]], [0.376, [0.995, 0.832, 0.506]], [0.378, [0.995, 0.832, 0.506]], [0.380, [0.995, 0.840, 0.513]], [0.382, [0.995, 0.840, 0.513]], [0.384, [0.995, 0.848, 0.519]], [0.386, [0.995, 0.848, 0.519]], [0.387, [0.996, 0.855, 0.526]], [0.389, [0.996, 0.855, 0.526]], [0.391, [0.996, 0.863, 0.532]], [0.393, [0.996, 0.863, 0.532]], [0.395, [0.996, 0.871, 0.539]], [0.397, [0.996, 0.871, 0.539]], [0.399, [0.996, 0.878, 0.545]], [0.401, [0.996, 0.878, 0.545]], [0.403, [0.996, 0.883, 0.553]], [0.405, [0.996, 0.883, 0.553]], [0.407, [0.996, 0.888, 0.561]], [0.409, [0.996, 0.888, 0.561]], [0.411, [0.997, 0.893, 0.569]], [0.413, [0.997, 0.893, 0.569]], [0.415, [0.997, 0.898, 0.577]], [0.417, [0.997, 0.898, 0.577]], [0.419, [0.997, 0.902, 0.585]], [0.421, [0.997, 0.902, 0.585]], [0.423, [0.997, 0.907, 0.593]], [0.425, [0.997, 0.907, 0.593]], [0.427, [0.997, 0.912, 0.601]], [0.429, [0.997, 0.912, 0.601]], [0.431, [0.997, 0.917, 0.609]], [0.432, [0.997, 0.917, 0.609]], [0.434, [0.997, 0.921, 0.617]], [0.436, [0.997, 0.921, 0.617]], [0.438, [0.998, 0.926, 0.625]], [0.440, [0.998, 0.926, 0.625]], [0.442, [0.998, 0.931, 0.633]], [0.444, [0.998, 0.931, 0.633]], [0.446, [0.998, 0.936, 0.641]], [0.448, [0.998, 0.936, 0.641]], [0.450, [0.998, 0.940, 0.649]], [0.452, [0.998, 0.940, 0.649]], [0.454, [0.998, 0.945, 0.657]], [0.456, [0.998, 0.945, 0.657]], [0.458, [0.998, 0.950, 0.665]], [0.460, [0.998, 0.950, 0.665]], [0.462, [0.999, 0.955, 0.673]], [0.464, [0.999, 0.955, 0.673]], [0.466, [0.999, 0.959, 0.681]], [0.468, [0.999, 0.959, 0.681]], [0.470, [0.999, 0.964, 0.689]], [0.472, [0.999, 0.964, 0.689]], [0.474, [0.999, 0.969, 0.697]], [0.476, [0.999, 0.969, 0.697]], [0.477, [0.999, 0.974, 0.705]], [0.479, [0.999, 0.974, 0.705]], [0.481, [0.999, 0.979, 0.713]], [0.483, [0.999, 0.979, 0.713]], [0.485, [0.999, 0.983, 0.721]], [0.487, [0.999, 0.983, 0.721]], [0.489, [1.000, 0.988, 0.729]], [0.491, [1.000, 0.988, 0.729]], [0.493, [1.000, 0.993, 0.737]], [0.495, [1.000, 0.993, 0.737]], [0.497, [1.000, 0.998, 0.745]], [0.499, [1.000, 0.998, 0.745]], [0.501, [0.998, 0.999, 0.746]], [0.503, [0.998, 0.999, 0.746]], [0.505, [0.994, 0.998, 0.740]], [0.507, [0.994, 0.998, 0.740]], [0.509, [0.990, 0.996, 0.734]], [0.511, [0.990, 0.996, 0.734]], [0.513, [0.987, 0.995, 0.728]], [0.515, [0.987, 0.995, 0.728]], [0.517, [0.983, 0.993, 0.722]], [0.519, [0.983, 0.993, 0.722]], [0.521, [0.979, 0.992, 0.716]], [0.523, [0.979, 0.992, 0.716]], [0.524, [0.975, 0.990, 0.710]], [0.526, [0.975, 0.990, 0.710]], [0.528, [0.971, 0.988, 0.704]], [0.530, [0.971, 0.988, 0.704]], [0.532, [0.967, 0.987, 0.698]], [0.534, [0.967, 0.987, 0.698]], [0.536, [0.963, 0.985, 0.692]], [0.538, [0.963, 0.985, 0.692]], [0.540, [0.960, 0.984, 0.686]], [0.542, [0.960, 0.984, 0.686]], [0.544, [0.956, 0.982, 0.680]], [0.546, [0.956, 0.982, 0.680]], [0.548, [0.952, 0.981, 0.674]], [0.550, [0.952, 0.981, 0.674]], [0.552, [0.948, 0.979, 0.668]], [0.554, [0.948, 0.979, 0.668]], [0.556, [0.944, 0.978, 0.662]], [0.558, [0.944, 0.978, 0.662]], [0.560, [0.940, 0.976, 0.656]], [0.562, [0.940, 0.976, 0.656]], [0.564, [0.937, 0.975, 0.650]], [0.566, [0.937, 0.975, 0.650]], [0.568, [0.933, 0.973, 0.644]], [0.569, [0.933, 0.973, 0.644]], [0.571, [0.929, 0.972, 0.638]], [0.573, [0.929, 0.972, 0.638]], [0.575, [0.925, 0.970, 0.632]], [0.577, [0.925, 0.970, 0.632]], [0.579, [0.921, 0.968, 0.626]], [0.581, [0.921, 0.968, 0.626]], [0.583, [0.917, 0.967, 0.620]], [0.585, [0.917, 0.967, 0.620]], [0.587, [0.913, 0.965, 0.614]], [0.589, [0.913, 0.965, 0.614]], [0.591, [0.910, 0.964, 0.608]], [0.593, [0.910, 0.964, 0.608]], [0.595, [0.906, 0.962, 0.602]], [0.597, [0.906, 0.962, 0.602]], [0.599, [0.902, 0.961, 0.596]], [0.601, [0.902, 0.961, 0.596]], [0.603, [0.893, 0.957, 0.598]], [0.605, [0.893, 0.957, 0.598]], [0.607, [0.884, 0.953, 0.600]], [0.609, [0.884, 0.953, 0.600]], [0.611, [0.875, 0.950, 0.602]], [0.613, [0.875, 0.950, 0.602]], [0.614, [0.866, 0.946, 0.603]], [0.616, [0.866, 0.946, 0.603]], [0.618, [0.857, 0.942, 0.605]], [0.620, [0.857, 0.942, 0.605]], [0.622, [0.848, 0.939, 0.607]], [0.624, [0.848, 0.939, 0.607]], [0.626, [0.838, 0.935, 0.609]], [0.628, [0.838, 0.935, 0.609]], [0.630, [0.829, 0.931, 0.611]], [0.632, [0.829, 0.931, 0.611]], [0.634, [0.820, 0.928, 0.613]], [0.636, [0.820, 0.928, 0.613]], [0.638, [0.811, 0.924, 0.615]], [0.640, [0.811, 0.924, 0.615]], [0.642, [0.802, 0.920, 0.616]], [0.644, [0.802, 0.920, 0.616]], [0.646, [0.793, 0.916, 0.618]], [0.648, [0.793, 0.916, 0.618]], [0.650, [0.784, 0.913, 0.620]], [0.652, [0.784, 0.913, 0.620]], [0.654, [0.775, 0.909, 0.622]], [0.656, [0.775, 0.909, 0.622]], [0.658, [0.766, 0.905, 0.624]], [0.659, [0.766, 0.905, 0.624]], [0.661, [0.757, 0.902, 0.626]], [0.663, [0.757, 0.902, 0.626]], [0.665, [0.748, 0.898, 0.627]], [0.667, [0.748, 0.898, 0.627]], [0.669, [0.739, 0.894, 0.629]], [0.671, [0.739, 0.894, 0.629]], [0.673, [0.730, 0.891, 0.631]], [0.675, [0.730, 0.891, 0.631]], [0.677, [0.720, 0.887, 0.633]], [0.679, [0.720, 0.887, 0.633]], [0.681, [0.711, 0.883, 0.635]], [0.683, [0.711, 0.883, 0.635]], [0.685, [0.702, 0.880, 0.637]], [0.687, [0.702, 0.880, 0.637]], [0.689, [0.693, 0.876, 0.639]], [0.691, [0.693, 0.876, 0.639]], [0.693, [0.684, 0.872, 0.640]], [0.695, [0.684, 0.872, 0.640]], [0.697, [0.675, 0.869, 0.642]], [0.699, [0.675, 0.869, 0.642]], [0.701, [0.665, 0.865, 0.643]], [0.703, [0.665, 0.865, 0.643]], [0.705, [0.655, 0.860, 0.643]], [0.706, [0.655, 0.860, 0.643]], [0.708, [0.644, 0.856, 0.644]], [0.710, [0.644, 0.856, 0.644]], [0.712, [0.633, 0.852, 0.644]], [0.714, [0.633, 0.852, 0.644]], [0.716, [0.623, 0.848, 0.644]], [0.718, [0.623, 0.848, 0.644]], [0.720, [0.612, 0.844, 0.644]], [0.722, [0.612, 0.844, 0.644]], [0.724, [0.602, 0.840, 0.644]], [0.726, [0.602, 0.840, 0.644]], [0.728, [0.591, 0.836, 0.644]], [0.730, [0.591, 0.836, 0.644]], [0.732, [0.580, 0.831, 0.644]], [0.734, [0.580, 0.831, 0.644]], [0.736, [0.570, 0.827, 0.645]], [0.738, [0.570, 0.827, 0.645]], [0.740, [0.559, 0.823, 0.645]], [0.742, [0.559, 0.823, 0.645]], [0.744, [0.549, 0.819, 0.645]], [0.746, [0.549, 0.819, 0.645]], [0.748, [0.538, 0.815, 0.645]], [0.750, [0.538, 0.815, 0.645]], [0.751, [0.527, 0.811, 0.645]], [0.753, [0.527, 0.811, 0.645]], [0.755, [0.517, 0.806, 0.645]], [0.757, [0.517, 0.806, 0.645]], [0.759, [0.506, 0.802, 0.646]], [0.761, [0.506, 0.802, 0.646]], [0.763, [0.496, 0.798, 0.646]], [0.765, [0.496, 0.798, 0.646]], [0.767, [0.485, 0.794, 0.646]], [0.769, [0.485, 0.794, 0.646]], [0.771, [0.474, 0.790, 0.646]], [0.773, [0.474, 0.790, 0.646]], [0.775, [0.464, 0.786, 0.646]], [0.777, [0.464, 0.786, 0.646]], [0.779, [0.453, 0.782, 0.646]], [0.781, [0.453, 0.782, 0.646]], [0.783, [0.442, 0.777, 0.646]], [0.785, [0.442, 0.777, 0.646]], [0.787, [0.432, 0.773, 0.647]], [0.789, [0.432, 0.773, 0.647]], [0.791, [0.421, 0.769, 0.647]], [0.793, [0.421, 0.769, 0.647]], [0.795, [0.411, 0.765, 0.647]], [0.796, [0.411, 0.765, 0.647]], [0.798, [0.400, 0.761, 0.647]], [0.800, [0.400, 0.761, 0.647]], [0.802, [0.392, 0.752, 0.651]], [0.804, [0.392, 0.752, 0.651]], [0.806, [0.384, 0.743, 0.654]], [0.808, [0.384, 0.743, 0.654]], [0.810, [0.376, 0.734, 0.658]], [0.812, [0.376, 0.734, 0.658]], [0.814, [0.368, 0.725, 0.662]], [0.816, [0.368, 0.725, 0.662]], [0.818, [0.360, 0.716, 0.666]], [0.820, [0.360, 0.716, 0.666]], [0.822, [0.352, 0.707, 0.669]], [0.824, [0.352, 0.707, 0.669]], [0.826, [0.344, 0.698, 0.673]], [0.828, [0.344, 0.698, 0.673]], [0.830, [0.336, 0.689, 0.677]], [0.832, [0.336, 0.689, 0.677]], [0.834, [0.328, 0.681, 0.680]], [0.836, [0.328, 0.681, 0.680]], [0.838, [0.320, 0.672, 0.684]], [0.840, [0.320, 0.672, 0.684]], [0.841, [0.312, 0.663, 0.688]], [0.843, [0.312, 0.663, 0.688]], [0.845, [0.304, 0.654, 0.691]], [0.847, [0.304, 0.654, 0.691]], [0.849, [0.296, 0.645, 0.695]], [0.851, [0.296, 0.645, 0.695]], [0.853, [0.288, 0.636, 0.699]], [0.855, [0.288, 0.636, 0.699]], [0.857, [0.280, 0.627, 0.702]], [0.859, [0.280, 0.627, 0.702]], [0.861, [0.272, 0.618, 0.706]], [0.863, [0.272, 0.618, 0.706]], [0.865, [0.264, 0.609, 0.710]], [0.867, [0.264, 0.609, 0.710]], [0.869, [0.256, 0.600, 0.713]], [0.871, [0.256, 0.600, 0.713]], [0.873, [0.248, 0.591, 0.717]], [0.875, [0.248, 0.591, 0.717]], [0.877, [0.240, 0.582, 0.721]], [0.879, [0.240, 0.582, 0.721]], [0.881, [0.232, 0.573, 0.725]], [0.883, [0.232, 0.573, 0.725]], [0.885, [0.224, 0.565, 0.728]], [0.886, [0.224, 0.565, 0.728]], [0.888, [0.216, 0.556, 0.732]], [0.890, [0.216, 0.556, 0.732]], [0.892, [0.208, 0.547, 0.736]], [0.894, [0.208, 0.547, 0.736]], [0.896, [0.200, 0.538, 0.739]], [0.898, [0.200, 0.538, 0.739]], [0.900, [0.199, 0.529, 0.739]], [0.902, [0.199, 0.529, 0.739]], [0.904, [0.206, 0.520, 0.735]], [0.906, [0.206, 0.520, 0.735]], [0.908, [0.213, 0.511, 0.731]], [0.910, [0.213, 0.511, 0.731]], [0.912, [0.220, 0.503, 0.727]], [0.914, [0.220, 0.503, 0.727]], [0.916, [0.227, 0.494, 0.722]], [0.918, [0.227, 0.494, 0.722]], [0.920, [0.233, 0.485, 0.718]], [0.922, [0.233, 0.485, 0.718]], [0.924, [0.240, 0.476, 0.714]], [0.926, [0.240, 0.476, 0.714]], [0.928, [0.247, 0.468, 0.710]], [0.930, [0.247, 0.468, 0.710]], [0.932, [0.254, 0.459, 0.706]], [0.933, [0.254, 0.459, 0.706]], [0.935, [0.260, 0.450, 0.702]], [0.937, [0.260, 0.450, 0.702]], [0.939, [0.267, 0.441, 0.698]], [0.941, [0.267, 0.441, 0.698]], [0.943, [0.274, 0.433, 0.693]], [0.945, [0.274, 0.433, 0.693]], [0.947, [0.281, 0.424, 0.689]], [0.949, [0.281, 0.424, 0.689]], [0.951, [0.287, 0.415, 0.685]], [0.953, [0.287, 0.415, 0.685]], [0.955, [0.294, 0.406, 0.681]], [0.957, [0.294, 0.406, 0.681]], [0.959, [0.301, 0.397, 0.677]], [0.961, [0.301, 0.397, 0.677]], [0.963, [0.308, 0.389, 0.673]], [0.965, [0.308, 0.389, 0.673]], [0.967, [0.314, 0.380, 0.669]], [0.969, [0.314, 0.380, 0.669]], [0.971, [0.321, 0.371, 0.664]], [0.973, [0.321, 0.371, 0.664]], [0.975, [0.328, 0.362, 0.660]], [0.977, [0.328, 0.362, 0.660]], [0.978, [0.335, 0.354, 0.656]], [0.980, [0.335, 0.354, 0.656]], [0.982, [0.342, 0.345, 0.652]], [0.984, [0.342, 0.345, 0.652]], [0.986, [0.348, 0.336, 0.648]], [0.988, [0.348, 0.336, 0.648]], [0.990, [0.355, 0.327, 0.644]], [0.992, [0.355, 0.327, 0.644]], [0.994, [0.362, 0.319, 0.639]], [0.996, [0.362, 0.319, 0.639]], [0.998, [0.369, 0.310, 0.635]], [1.000, [0.369, 0.310, 0.635]]]; +var bwr = [[0.000, [0.000, 0.000, 1.000]], [0.002, [0.000, 0.000, 1.000]], [0.004, [0.008, 0.008, 1.000]], [0.006, [0.008, 0.008, 1.000]], [0.008, [0.016, 0.016, 1.000]], [0.010, [0.016, 0.016, 1.000]], [0.012, [0.024, 0.024, 1.000]], [0.014, [0.024, 0.024, 1.000]], [0.016, [0.031, 0.031, 1.000]], [0.018, [0.031, 0.031, 1.000]], [0.020, [0.039, 0.039, 1.000]], [0.022, [0.039, 0.039, 1.000]], [0.023, [0.047, 0.047, 1.000]], [0.025, [0.047, 0.047, 1.000]], [0.027, [0.055, 0.055, 1.000]], [0.029, [0.055, 0.055, 1.000]], [0.031, [0.063, 0.063, 1.000]], [0.033, [0.063, 0.063, 1.000]], [0.035, [0.071, 0.071, 1.000]], [0.037, [0.071, 0.071, 1.000]], [0.039, [0.078, 0.078, 1.000]], [0.041, [0.078, 0.078, 1.000]], [0.043, [0.086, 0.086, 1.000]], [0.045, [0.086, 0.086, 1.000]], [0.047, [0.094, 0.094, 1.000]], [0.049, [0.094, 0.094, 1.000]], [0.051, [0.102, 0.102, 1.000]], [0.053, [0.102, 0.102, 1.000]], [0.055, [0.110, 0.110, 1.000]], [0.057, [0.110, 0.110, 1.000]], [0.059, [0.118, 0.118, 1.000]], [0.061, [0.118, 0.118, 1.000]], [0.063, [0.125, 0.125, 1.000]], [0.065, [0.125, 0.125, 1.000]], [0.067, [0.133, 0.133, 1.000]], [0.068, [0.133, 0.133, 1.000]], [0.070, [0.141, 0.141, 1.000]], [0.072, [0.141, 0.141, 1.000]], [0.074, [0.149, 0.149, 1.000]], [0.076, [0.149, 0.149, 1.000]], [0.078, [0.157, 0.157, 1.000]], [0.080, [0.157, 0.157, 1.000]], [0.082, [0.165, 0.165, 1.000]], [0.084, [0.165, 0.165, 1.000]], [0.086, [0.173, 0.173, 1.000]], [0.088, [0.173, 0.173, 1.000]], [0.090, [0.180, 0.180, 1.000]], [0.092, [0.180, 0.180, 1.000]], [0.094, [0.188, 0.188, 1.000]], [0.096, [0.188, 0.188, 1.000]], [0.098, [0.196, 0.196, 1.000]], [0.100, [0.196, 0.196, 1.000]], [0.102, [0.204, 0.204, 1.000]], [0.104, [0.204, 0.204, 1.000]], [0.106, [0.212, 0.212, 1.000]], [0.108, [0.212, 0.212, 1.000]], [0.110, [0.220, 0.220, 1.000]], [0.112, [0.220, 0.220, 1.000]], [0.114, [0.227, 0.227, 1.000]], [0.115, [0.227, 0.227, 1.000]], [0.117, [0.235, 0.235, 1.000]], [0.119, [0.235, 0.235, 1.000]], [0.121, [0.243, 0.243, 1.000]], [0.123, [0.243, 0.243, 1.000]], [0.125, [0.251, 0.251, 1.000]], [0.127, [0.251, 0.251, 1.000]], [0.129, [0.259, 0.259, 1.000]], [0.131, [0.259, 0.259, 1.000]], [0.133, [0.267, 0.267, 1.000]], [0.135, [0.267, 0.267, 1.000]], [0.137, [0.275, 0.275, 1.000]], [0.139, [0.275, 0.275, 1.000]], [0.141, [0.282, 0.282, 1.000]], [0.143, [0.282, 0.282, 1.000]], [0.145, [0.290, 0.290, 1.000]], [0.147, [0.290, 0.290, 1.000]], [0.149, [0.298, 0.298, 1.000]], [0.151, [0.298, 0.298, 1.000]], [0.153, [0.306, 0.306, 1.000]], [0.155, [0.306, 0.306, 1.000]], [0.157, [0.314, 0.314, 1.000]], [0.159, [0.314, 0.314, 1.000]], [0.160, [0.322, 0.322, 1.000]], [0.162, [0.322, 0.322, 1.000]], [0.164, [0.329, 0.329, 1.000]], [0.166, [0.329, 0.329, 1.000]], [0.168, [0.337, 0.337, 1.000]], [0.170, [0.337, 0.337, 1.000]], [0.172, [0.345, 0.345, 1.000]], [0.174, [0.345, 0.345, 1.000]], [0.176, [0.353, 0.353, 1.000]], [0.178, [0.353, 0.353, 1.000]], [0.180, [0.361, 0.361, 1.000]], [0.182, [0.361, 0.361, 1.000]], [0.184, [0.369, 0.369, 1.000]], [0.186, [0.369, 0.369, 1.000]], [0.188, [0.376, 0.376, 1.000]], [0.190, [0.376, 0.376, 1.000]], [0.192, [0.384, 0.384, 1.000]], [0.194, [0.384, 0.384, 1.000]], [0.196, [0.392, 0.392, 1.000]], [0.198, [0.392, 0.392, 1.000]], [0.200, [0.400, 0.400, 1.000]], [0.202, [0.400, 0.400, 1.000]], [0.204, [0.408, 0.408, 1.000]], [0.205, [0.408, 0.408, 1.000]], [0.207, [0.416, 0.416, 1.000]], [0.209, [0.416, 0.416, 1.000]], [0.211, [0.424, 0.424, 1.000]], [0.213, [0.424, 0.424, 1.000]], [0.215, [0.431, 0.431, 1.000]], [0.217, [0.431, 0.431, 1.000]], [0.219, [0.439, 0.439, 1.000]], [0.221, [0.439, 0.439, 1.000]], [0.223, [0.447, 0.447, 1.000]], [0.225, [0.447, 0.447, 1.000]], [0.227, [0.455, 0.455, 1.000]], [0.229, [0.455, 0.455, 1.000]], [0.231, [0.463, 0.463, 1.000]], [0.233, [0.463, 0.463, 1.000]], [0.235, [0.471, 0.471, 1.000]], [0.237, [0.471, 0.471, 1.000]], [0.239, [0.478, 0.478, 1.000]], [0.241, [0.478, 0.478, 1.000]], [0.243, [0.486, 0.486, 1.000]], [0.245, [0.486, 0.486, 1.000]], [0.247, [0.494, 0.494, 1.000]], [0.249, [0.494, 0.494, 1.000]], [0.250, [0.502, 0.502, 1.000]], [0.252, [0.502, 0.502, 1.000]], [0.254, [0.510, 0.510, 1.000]], [0.256, [0.510, 0.510, 1.000]], [0.258, [0.518, 0.518, 1.000]], [0.260, [0.518, 0.518, 1.000]], [0.262, [0.525, 0.525, 1.000]], [0.264, [0.525, 0.525, 1.000]], [0.266, [0.533, 0.533, 1.000]], [0.268, [0.533, 0.533, 1.000]], [0.270, [0.541, 0.541, 1.000]], [0.272, [0.541, 0.541, 1.000]], [0.274, [0.549, 0.549, 1.000]], [0.276, [0.549, 0.549, 1.000]], [0.278, [0.557, 0.557, 1.000]], [0.280, [0.557, 0.557, 1.000]], [0.282, [0.565, 0.565, 1.000]], [0.284, [0.565, 0.565, 1.000]], [0.286, [0.573, 0.573, 1.000]], [0.288, [0.573, 0.573, 1.000]], [0.290, [0.580, 0.580, 1.000]], [0.292, [0.580, 0.580, 1.000]], [0.294, [0.588, 0.588, 1.000]], [0.295, [0.588, 0.588, 1.000]], [0.297, [0.596, 0.596, 1.000]], [0.299, [0.596, 0.596, 1.000]], [0.301, [0.604, 0.604, 1.000]], [0.303, [0.604, 0.604, 1.000]], [0.305, [0.612, 0.612, 1.000]], [0.307, [0.612, 0.612, 1.000]], [0.309, [0.620, 0.620, 1.000]], [0.311, [0.620, 0.620, 1.000]], [0.313, [0.627, 0.627, 1.000]], [0.315, [0.627, 0.627, 1.000]], [0.317, [0.635, 0.635, 1.000]], [0.319, [0.635, 0.635, 1.000]], [0.321, [0.643, 0.643, 1.000]], [0.323, [0.643, 0.643, 1.000]], [0.325, [0.651, 0.651, 1.000]], [0.327, [0.651, 0.651, 1.000]], [0.329, [0.659, 0.659, 1.000]], [0.331, [0.659, 0.659, 1.000]], [0.333, [0.667, 0.667, 1.000]], [0.335, [0.667, 0.667, 1.000]], [0.337, [0.675, 0.675, 1.000]], [0.339, [0.675, 0.675, 1.000]], [0.341, [0.682, 0.682, 1.000]], [0.342, [0.682, 0.682, 1.000]], [0.344, [0.690, 0.690, 1.000]], [0.346, [0.690, 0.690, 1.000]], [0.348, [0.698, 0.698, 1.000]], [0.350, [0.698, 0.698, 1.000]], [0.352, [0.706, 0.706, 1.000]], [0.354, [0.706, 0.706, 1.000]], [0.356, [0.714, 0.714, 1.000]], [0.358, [0.714, 0.714, 1.000]], [0.360, [0.722, 0.722, 1.000]], [0.362, [0.722, 0.722, 1.000]], [0.364, [0.729, 0.729, 1.000]], [0.366, [0.729, 0.729, 1.000]], [0.368, [0.737, 0.737, 1.000]], [0.370, [0.737, 0.737, 1.000]], [0.372, [0.745, 0.745, 1.000]], [0.374, [0.745, 0.745, 1.000]], [0.376, [0.753, 0.753, 1.000]], [0.378, [0.753, 0.753, 1.000]], [0.380, [0.761, 0.761, 1.000]], [0.382, [0.761, 0.761, 1.000]], [0.384, [0.769, 0.769, 1.000]], [0.386, [0.769, 0.769, 1.000]], [0.387, [0.776, 0.776, 1.000]], [0.389, [0.776, 0.776, 1.000]], [0.391, [0.784, 0.784, 1.000]], [0.393, [0.784, 0.784, 1.000]], [0.395, [0.792, 0.792, 1.000]], [0.397, [0.792, 0.792, 1.000]], [0.399, [0.800, 0.800, 1.000]], [0.401, [0.800, 0.800, 1.000]], [0.403, [0.808, 0.808, 1.000]], [0.405, [0.808, 0.808, 1.000]], [0.407, [0.816, 0.816, 1.000]], [0.409, [0.816, 0.816, 1.000]], [0.411, [0.824, 0.824, 1.000]], [0.413, [0.824, 0.824, 1.000]], [0.415, [0.831, 0.831, 1.000]], [0.417, [0.831, 0.831, 1.000]], [0.419, [0.839, 0.839, 1.000]], [0.421, [0.839, 0.839, 1.000]], [0.423, [0.847, 0.847, 1.000]], [0.425, [0.847, 0.847, 1.000]], [0.427, [0.855, 0.855, 1.000]], [0.429, [0.855, 0.855, 1.000]], [0.431, [0.863, 0.863, 1.000]], [0.432, [0.863, 0.863, 1.000]], [0.434, [0.871, 0.871, 1.000]], [0.436, [0.871, 0.871, 1.000]], [0.438, [0.878, 0.878, 1.000]], [0.440, [0.878, 0.878, 1.000]], [0.442, [0.886, 0.886, 1.000]], [0.444, [0.886, 0.886, 1.000]], [0.446, [0.894, 0.894, 1.000]], [0.448, [0.894, 0.894, 1.000]], [0.450, [0.902, 0.902, 1.000]], [0.452, [0.902, 0.902, 1.000]], [0.454, [0.910, 0.910, 1.000]], [0.456, [0.910, 0.910, 1.000]], [0.458, [0.918, 0.918, 1.000]], [0.460, [0.918, 0.918, 1.000]], [0.462, [0.925, 0.925, 1.000]], [0.464, [0.925, 0.925, 1.000]], [0.466, [0.933, 0.933, 1.000]], [0.468, [0.933, 0.933, 1.000]], [0.470, [0.941, 0.941, 1.000]], [0.472, [0.941, 0.941, 1.000]], [0.474, [0.949, 0.949, 1.000]], [0.476, [0.949, 0.949, 1.000]], [0.477, [0.957, 0.957, 1.000]], [0.479, [0.957, 0.957, 1.000]], [0.481, [0.965, 0.965, 1.000]], [0.483, [0.965, 0.965, 1.000]], [0.485, [0.973, 0.973, 1.000]], [0.487, [0.973, 0.973, 1.000]], [0.489, [0.980, 0.980, 1.000]], [0.491, [0.980, 0.980, 1.000]], [0.493, [0.988, 0.988, 1.000]], [0.495, [0.988, 0.988, 1.000]], [0.497, [0.996, 0.996, 1.000]], [0.499, [0.996, 0.996, 1.000]], [0.501, [1.000, 0.996, 0.996]], [0.503, [1.000, 0.996, 0.996]], [0.505, [1.000, 0.988, 0.988]], [0.507, [1.000, 0.988, 0.988]], [0.509, [1.000, 0.980, 0.980]], [0.511, [1.000, 0.980, 0.980]], [0.513, [1.000, 0.973, 0.973]], [0.515, [1.000, 0.973, 0.973]], [0.517, [1.000, 0.965, 0.965]], [0.519, [1.000, 0.965, 0.965]], [0.521, [1.000, 0.957, 0.957]], [0.523, [1.000, 0.957, 0.957]], [0.524, [1.000, 0.949, 0.949]], [0.526, [1.000, 0.949, 0.949]], [0.528, [1.000, 0.941, 0.941]], [0.530, [1.000, 0.941, 0.941]], [0.532, [1.000, 0.933, 0.933]], [0.534, [1.000, 0.933, 0.933]], [0.536, [1.000, 0.925, 0.925]], [0.538, [1.000, 0.925, 0.925]], [0.540, [1.000, 0.918, 0.918]], [0.542, [1.000, 0.918, 0.918]], [0.544, [1.000, 0.910, 0.910]], [0.546, [1.000, 0.910, 0.910]], [0.548, [1.000, 0.902, 0.902]], [0.550, [1.000, 0.902, 0.902]], [0.552, [1.000, 0.894, 0.894]], [0.554, [1.000, 0.894, 0.894]], [0.556, [1.000, 0.886, 0.886]], [0.558, [1.000, 0.886, 0.886]], [0.560, [1.000, 0.878, 0.878]], [0.562, [1.000, 0.878, 0.878]], [0.564, [1.000, 0.871, 0.871]], [0.566, [1.000, 0.871, 0.871]], [0.568, [1.000, 0.863, 0.863]], [0.569, [1.000, 0.863, 0.863]], [0.571, [1.000, 0.855, 0.855]], [0.573, [1.000, 0.855, 0.855]], [0.575, [1.000, 0.847, 0.847]], [0.577, [1.000, 0.847, 0.847]], [0.579, [1.000, 0.839, 0.839]], [0.581, [1.000, 0.839, 0.839]], [0.583, [1.000, 0.831, 0.831]], [0.585, [1.000, 0.831, 0.831]], [0.587, [1.000, 0.824, 0.824]], [0.589, [1.000, 0.824, 0.824]], [0.591, [1.000, 0.816, 0.816]], [0.593, [1.000, 0.816, 0.816]], [0.595, [1.000, 0.808, 0.808]], [0.597, [1.000, 0.808, 0.808]], [0.599, [1.000, 0.800, 0.800]], [0.601, [1.000, 0.800, 0.800]], [0.603, [1.000, 0.792, 0.792]], [0.605, [1.000, 0.792, 0.792]], [0.607, [1.000, 0.784, 0.784]], [0.609, [1.000, 0.784, 0.784]], [0.611, [1.000, 0.776, 0.776]], [0.613, [1.000, 0.776, 0.776]], [0.614, [1.000, 0.769, 0.769]], [0.616, [1.000, 0.769, 0.769]], [0.618, [1.000, 0.761, 0.761]], [0.620, [1.000, 0.761, 0.761]], [0.622, [1.000, 0.753, 0.753]], [0.624, [1.000, 0.753, 0.753]], [0.626, [1.000, 0.745, 0.745]], [0.628, [1.000, 0.745, 0.745]], [0.630, [1.000, 0.737, 0.737]], [0.632, [1.000, 0.737, 0.737]], [0.634, [1.000, 0.729, 0.729]], [0.636, [1.000, 0.729, 0.729]], [0.638, [1.000, 0.722, 0.722]], [0.640, [1.000, 0.722, 0.722]], [0.642, [1.000, 0.714, 0.714]], [0.644, [1.000, 0.714, 0.714]], [0.646, [1.000, 0.706, 0.706]], [0.648, [1.000, 0.706, 0.706]], [0.650, [1.000, 0.698, 0.698]], [0.652, [1.000, 0.698, 0.698]], [0.654, [1.000, 0.690, 0.690]], [0.656, [1.000, 0.690, 0.690]], [0.658, [1.000, 0.682, 0.682]], [0.659, [1.000, 0.682, 0.682]], [0.661, [1.000, 0.675, 0.675]], [0.663, [1.000, 0.675, 0.675]], [0.665, [1.000, 0.667, 0.667]], [0.667, [1.000, 0.667, 0.667]], [0.669, [1.000, 0.659, 0.659]], [0.671, [1.000, 0.659, 0.659]], [0.673, [1.000, 0.651, 0.651]], [0.675, [1.000, 0.651, 0.651]], [0.677, [1.000, 0.643, 0.643]], [0.679, [1.000, 0.643, 0.643]], [0.681, [1.000, 0.635, 0.635]], [0.683, [1.000, 0.635, 0.635]], [0.685, [1.000, 0.627, 0.627]], [0.687, [1.000, 0.627, 0.627]], [0.689, [1.000, 0.620, 0.620]], [0.691, [1.000, 0.620, 0.620]], [0.693, [1.000, 0.612, 0.612]], [0.695, [1.000, 0.612, 0.612]], [0.697, [1.000, 0.604, 0.604]], [0.699, [1.000, 0.604, 0.604]], [0.701, [1.000, 0.596, 0.596]], [0.703, [1.000, 0.596, 0.596]], [0.705, [1.000, 0.588, 0.588]], [0.706, [1.000, 0.588, 0.588]], [0.708, [1.000, 0.580, 0.580]], [0.710, [1.000, 0.580, 0.580]], [0.712, [1.000, 0.573, 0.573]], [0.714, [1.000, 0.573, 0.573]], [0.716, [1.000, 0.565, 0.565]], [0.718, [1.000, 0.565, 0.565]], [0.720, [1.000, 0.557, 0.557]], [0.722, [1.000, 0.557, 0.557]], [0.724, [1.000, 0.549, 0.549]], [0.726, [1.000, 0.549, 0.549]], [0.728, [1.000, 0.541, 0.541]], [0.730, [1.000, 0.541, 0.541]], [0.732, [1.000, 0.533, 0.533]], [0.734, [1.000, 0.533, 0.533]], [0.736, [1.000, 0.525, 0.525]], [0.738, [1.000, 0.525, 0.525]], [0.740, [1.000, 0.518, 0.518]], [0.742, [1.000, 0.518, 0.518]], [0.744, [1.000, 0.510, 0.510]], [0.746, [1.000, 0.510, 0.510]], [0.748, [1.000, 0.502, 0.502]], [0.750, [1.000, 0.502, 0.502]], [0.751, [1.000, 0.494, 0.494]], [0.753, [1.000, 0.494, 0.494]], [0.755, [1.000, 0.486, 0.486]], [0.757, [1.000, 0.486, 0.486]], [0.759, [1.000, 0.478, 0.478]], [0.761, [1.000, 0.478, 0.478]], [0.763, [1.000, 0.471, 0.471]], [0.765, [1.000, 0.471, 0.471]], [0.767, [1.000, 0.463, 0.463]], [0.769, [1.000, 0.463, 0.463]], [0.771, [1.000, 0.455, 0.455]], [0.773, [1.000, 0.455, 0.455]], [0.775, [1.000, 0.447, 0.447]], [0.777, [1.000, 0.447, 0.447]], [0.779, [1.000, 0.439, 0.439]], [0.781, [1.000, 0.439, 0.439]], [0.783, [1.000, 0.431, 0.431]], [0.785, [1.000, 0.431, 0.431]], [0.787, [1.000, 0.424, 0.424]], [0.789, [1.000, 0.424, 0.424]], [0.791, [1.000, 0.416, 0.416]], [0.793, [1.000, 0.416, 0.416]], [0.795, [1.000, 0.408, 0.408]], [0.796, [1.000, 0.408, 0.408]], [0.798, [1.000, 0.400, 0.400]], [0.800, [1.000, 0.400, 0.400]], [0.802, [1.000, 0.392, 0.392]], [0.804, [1.000, 0.392, 0.392]], [0.806, [1.000, 0.384, 0.384]], [0.808, [1.000, 0.384, 0.384]], [0.810, [1.000, 0.376, 0.376]], [0.812, [1.000, 0.376, 0.376]], [0.814, [1.000, 0.369, 0.369]], [0.816, [1.000, 0.369, 0.369]], [0.818, [1.000, 0.361, 0.361]], [0.820, [1.000, 0.361, 0.361]], [0.822, [1.000, 0.353, 0.353]], [0.824, [1.000, 0.353, 0.353]], [0.826, [1.000, 0.345, 0.345]], [0.828, [1.000, 0.345, 0.345]], [0.830, [1.000, 0.337, 0.337]], [0.832, [1.000, 0.337, 0.337]], [0.834, [1.000, 0.329, 0.329]], [0.836, [1.000, 0.329, 0.329]], [0.838, [1.000, 0.322, 0.322]], [0.840, [1.000, 0.322, 0.322]], [0.841, [1.000, 0.314, 0.314]], [0.843, [1.000, 0.314, 0.314]], [0.845, [1.000, 0.306, 0.306]], [0.847, [1.000, 0.306, 0.306]], [0.849, [1.000, 0.298, 0.298]], [0.851, [1.000, 0.298, 0.298]], [0.853, [1.000, 0.290, 0.290]], [0.855, [1.000, 0.290, 0.290]], [0.857, [1.000, 0.282, 0.282]], [0.859, [1.000, 0.282, 0.282]], [0.861, [1.000, 0.275, 0.275]], [0.863, [1.000, 0.275, 0.275]], [0.865, [1.000, 0.267, 0.267]], [0.867, [1.000, 0.267, 0.267]], [0.869, [1.000, 0.259, 0.259]], [0.871, [1.000, 0.259, 0.259]], [0.873, [1.000, 0.251, 0.251]], [0.875, [1.000, 0.251, 0.251]], [0.877, [1.000, 0.243, 0.243]], [0.879, [1.000, 0.243, 0.243]], [0.881, [1.000, 0.235, 0.235]], [0.883, [1.000, 0.235, 0.235]], [0.885, [1.000, 0.227, 0.227]], [0.886, [1.000, 0.227, 0.227]], [0.888, [1.000, 0.220, 0.220]], [0.890, [1.000, 0.220, 0.220]], [0.892, [1.000, 0.212, 0.212]], [0.894, [1.000, 0.212, 0.212]], [0.896, [1.000, 0.204, 0.204]], [0.898, [1.000, 0.204, 0.204]], [0.900, [1.000, 0.196, 0.196]], [0.902, [1.000, 0.196, 0.196]], [0.904, [1.000, 0.188, 0.188]], [0.906, [1.000, 0.188, 0.188]], [0.908, [1.000, 0.180, 0.180]], [0.910, [1.000, 0.180, 0.180]], [0.912, [1.000, 0.173, 0.173]], [0.914, [1.000, 0.173, 0.173]], [0.916, [1.000, 0.165, 0.165]], [0.918, [1.000, 0.165, 0.165]], [0.920, [1.000, 0.157, 0.157]], [0.922, [1.000, 0.157, 0.157]], [0.924, [1.000, 0.149, 0.149]], [0.926, [1.000, 0.149, 0.149]], [0.928, [1.000, 0.141, 0.141]], [0.930, [1.000, 0.141, 0.141]], [0.932, [1.000, 0.133, 0.133]], [0.933, [1.000, 0.133, 0.133]], [0.935, [1.000, 0.125, 0.125]], [0.937, [1.000, 0.125, 0.125]], [0.939, [1.000, 0.118, 0.118]], [0.941, [1.000, 0.118, 0.118]], [0.943, [1.000, 0.110, 0.110]], [0.945, [1.000, 0.110, 0.110]], [0.947, [1.000, 0.102, 0.102]], [0.949, [1.000, 0.102, 0.102]], [0.951, [1.000, 0.094, 0.094]], [0.953, [1.000, 0.094, 0.094]], [0.955, [1.000, 0.086, 0.086]], [0.957, [1.000, 0.086, 0.086]], [0.959, [1.000, 0.078, 0.078]], [0.961, [1.000, 0.078, 0.078]], [0.963, [1.000, 0.071, 0.071]], [0.965, [1.000, 0.071, 0.071]], [0.967, [1.000, 0.063, 0.063]], [0.969, [1.000, 0.063, 0.063]], [0.971, [1.000, 0.055, 0.055]], [0.973, [1.000, 0.055, 0.055]], [0.975, [1.000, 0.047, 0.047]], [0.977, [1.000, 0.047, 0.047]], [0.978, [1.000, 0.039, 0.039]], [0.980, [1.000, 0.039, 0.039]], [0.982, [1.000, 0.031, 0.031]], [0.984, [1.000, 0.031, 0.031]], [0.986, [1.000, 0.024, 0.024]], [0.988, [1.000, 0.024, 0.024]], [0.990, [1.000, 0.016, 0.016]], [0.992, [1.000, 0.016, 0.016]], [0.994, [1.000, 0.008, 0.008]], [0.996, [1.000, 0.008, 0.008]], [0.998, [1.000, 0.000, 0.000]], [1.000, [1.000, 0.000, 0.000]]]; +var coolwarm = [[0.000, [0.230, 0.299, 0.754]], [0.002, [0.230, 0.299, 0.754]], [0.004, [0.234, 0.306, 0.760]], [0.006, [0.234, 0.306, 0.760]], [0.008, [0.239, 0.312, 0.766]], [0.010, [0.239, 0.312, 0.766]], [0.012, [0.244, 0.319, 0.772]], [0.014, [0.244, 0.319, 0.772]], [0.016, [0.248, 0.326, 0.778]], [0.018, [0.248, 0.326, 0.778]], [0.020, [0.253, 0.333, 0.784]], [0.022, [0.253, 0.333, 0.784]], [0.023, [0.257, 0.340, 0.790]], [0.025, [0.257, 0.340, 0.790]], [0.027, [0.262, 0.346, 0.796]], [0.029, [0.262, 0.346, 0.796]], [0.031, [0.266, 0.353, 0.802]], [0.033, [0.266, 0.353, 0.802]], [0.035, [0.271, 0.360, 0.807]], [0.037, [0.271, 0.360, 0.807]], [0.039, [0.276, 0.367, 0.813]], [0.041, [0.276, 0.367, 0.813]], [0.043, [0.281, 0.373, 0.818]], [0.045, [0.281, 0.373, 0.818]], [0.047, [0.285, 0.380, 0.823]], [0.049, [0.285, 0.380, 0.823]], [0.051, [0.290, 0.387, 0.829]], [0.053, [0.290, 0.387, 0.829]], [0.055, [0.295, 0.394, 0.834]], [0.057, [0.295, 0.394, 0.834]], [0.059, [0.299, 0.400, 0.840]], [0.061, [0.299, 0.400, 0.840]], [0.063, [0.304, 0.407, 0.845]], [0.065, [0.304, 0.407, 0.845]], [0.067, [0.309, 0.413, 0.850]], [0.068, [0.309, 0.413, 0.850]], [0.070, [0.314, 0.420, 0.855]], [0.072, [0.314, 0.420, 0.855]], [0.074, [0.319, 0.427, 0.860]], [0.076, [0.319, 0.427, 0.860]], [0.078, [0.324, 0.433, 0.865]], [0.080, [0.324, 0.433, 0.865]], [0.082, [0.329, 0.440, 0.870]], [0.084, [0.329, 0.440, 0.870]], [0.086, [0.333, 0.446, 0.874]], [0.088, [0.333, 0.446, 0.874]], [0.090, [0.338, 0.453, 0.879]], [0.092, [0.338, 0.453, 0.879]], [0.094, [0.343, 0.459, 0.884]], [0.096, [0.343, 0.459, 0.884]], [0.098, [0.348, 0.466, 0.888]], [0.100, [0.348, 0.466, 0.888]], [0.102, [0.353, 0.472, 0.893]], [0.104, [0.353, 0.472, 0.893]], [0.106, [0.358, 0.478, 0.897]], [0.108, [0.358, 0.478, 0.897]], [0.110, [0.363, 0.485, 0.901]], [0.112, [0.363, 0.485, 0.901]], [0.114, [0.369, 0.491, 0.905]], [0.115, [0.369, 0.491, 0.905]], [0.117, [0.374, 0.497, 0.909]], [0.119, [0.374, 0.497, 0.909]], [0.121, [0.379, 0.504, 0.914]], [0.123, [0.379, 0.504, 0.914]], [0.125, [0.384, 0.510, 0.918]], [0.127, [0.384, 0.510, 0.918]], [0.129, [0.389, 0.516, 0.921]], [0.131, [0.389, 0.516, 0.921]], [0.133, [0.394, 0.522, 0.925]], [0.135, [0.394, 0.522, 0.925]], [0.137, [0.399, 0.529, 0.928]], [0.139, [0.399, 0.529, 0.928]], [0.141, [0.404, 0.535, 0.932]], [0.143, [0.404, 0.535, 0.932]], [0.145, [0.410, 0.541, 0.936]], [0.147, [0.410, 0.541, 0.936]], [0.149, [0.415, 0.547, 0.939]], [0.151, [0.415, 0.547, 0.939]], [0.153, [0.420, 0.553, 0.943]], [0.155, [0.420, 0.553, 0.943]], [0.157, [0.425, 0.559, 0.946]], [0.159, [0.425, 0.559, 0.946]], [0.160, [0.431, 0.565, 0.949]], [0.162, [0.431, 0.565, 0.949]], [0.164, [0.436, 0.571, 0.952]], [0.166, [0.436, 0.571, 0.952]], [0.168, [0.441, 0.577, 0.955]], [0.170, [0.441, 0.577, 0.955]], [0.172, [0.446, 0.582, 0.957]], [0.174, [0.446, 0.582, 0.957]], [0.176, [0.452, 0.588, 0.960]], [0.178, [0.452, 0.588, 0.960]], [0.180, [0.457, 0.594, 0.963]], [0.182, [0.457, 0.594, 0.963]], [0.184, [0.462, 0.600, 0.966]], [0.186, [0.462, 0.600, 0.966]], [0.188, [0.468, 0.606, 0.969]], [0.190, [0.468, 0.606, 0.969]], [0.192, [0.473, 0.611, 0.971]], [0.194, [0.473, 0.611, 0.971]], [0.196, [0.478, 0.617, 0.973]], [0.198, [0.478, 0.617, 0.973]], [0.200, [0.484, 0.622, 0.975]], [0.202, [0.484, 0.622, 0.975]], [0.204, [0.489, 0.628, 0.977]], [0.205, [0.489, 0.628, 0.977]], [0.207, [0.495, 0.633, 0.979]], [0.209, [0.495, 0.633, 0.979]], [0.211, [0.500, 0.639, 0.981]], [0.213, [0.500, 0.639, 0.981]], [0.215, [0.505, 0.644, 0.983]], [0.217, [0.505, 0.644, 0.983]], [0.219, [0.511, 0.649, 0.985]], [0.221, [0.511, 0.649, 0.985]], [0.223, [0.516, 0.654, 0.986]], [0.225, [0.516, 0.654, 0.986]], [0.227, [0.522, 0.660, 0.988]], [0.229, [0.522, 0.660, 0.988]], [0.231, [0.527, 0.665, 0.989]], [0.233, [0.527, 0.665, 0.989]], [0.235, [0.533, 0.670, 0.990]], [0.237, [0.533, 0.670, 0.990]], [0.239, [0.538, 0.675, 0.992]], [0.241, [0.538, 0.675, 0.992]], [0.243, [0.543, 0.680, 0.993]], [0.245, [0.543, 0.680, 0.993]], [0.247, [0.549, 0.685, 0.994]], [0.249, [0.549, 0.685, 0.994]], [0.250, [0.554, 0.690, 0.996]], [0.252, [0.554, 0.690, 0.996]], [0.254, [0.560, 0.695, 0.996]], [0.256, [0.560, 0.695, 0.996]], [0.258, [0.565, 0.699, 0.997]], [0.260, [0.565, 0.699, 0.997]], [0.262, [0.571, 0.704, 0.997]], [0.264, [0.571, 0.704, 0.997]], [0.266, [0.576, 0.709, 0.998]], [0.268, [0.576, 0.709, 0.998]], [0.270, [0.581, 0.713, 0.998]], [0.272, [0.581, 0.713, 0.998]], [0.274, [0.587, 0.718, 0.999]], [0.276, [0.587, 0.718, 0.999]], [0.278, [0.592, 0.723, 0.999]], [0.280, [0.592, 0.723, 0.999]], [0.282, [0.598, 0.727, 1.000]], [0.284, [0.598, 0.727, 1.000]], [0.286, [0.603, 0.732, 1.000]], [0.288, [0.603, 0.732, 1.000]], [0.290, [0.609, 0.736, 0.999]], [0.292, [0.609, 0.736, 0.999]], [0.294, [0.614, 0.740, 0.999]], [0.295, [0.614, 0.740, 0.999]], [0.297, [0.619, 0.744, 0.999]], [0.299, [0.619, 0.744, 0.999]], [0.301, [0.625, 0.748, 0.999]], [0.303, [0.625, 0.748, 0.999]], [0.305, [0.630, 0.753, 0.999]], [0.307, [0.630, 0.753, 0.999]], [0.309, [0.635, 0.757, 0.998]], [0.311, [0.635, 0.757, 0.998]], [0.313, [0.641, 0.761, 0.998]], [0.315, [0.641, 0.761, 0.998]], [0.317, [0.646, 0.764, 0.997]], [0.319, [0.646, 0.764, 0.997]], [0.321, [0.651, 0.768, 0.996]], [0.323, [0.651, 0.768, 0.996]], [0.325, [0.657, 0.772, 0.995]], [0.327, [0.657, 0.772, 0.995]], [0.329, [0.662, 0.775, 0.994]], [0.331, [0.662, 0.775, 0.994]], [0.333, [0.667, 0.779, 0.993]], [0.335, [0.667, 0.779, 0.993]], [0.337, [0.673, 0.783, 0.992]], [0.339, [0.673, 0.783, 0.992]], [0.341, [0.678, 0.787, 0.991]], [0.342, [0.678, 0.787, 0.991]], [0.344, [0.683, 0.790, 0.990]], [0.346, [0.683, 0.790, 0.990]], [0.348, [0.688, 0.793, 0.988]], [0.350, [0.688, 0.793, 0.988]], [0.352, [0.693, 0.796, 0.986]], [0.354, [0.693, 0.796, 0.986]], [0.356, [0.698, 0.799, 0.985]], [0.358, [0.698, 0.799, 0.985]], [0.360, [0.704, 0.803, 0.983]], [0.362, [0.704, 0.803, 0.983]], [0.364, [0.709, 0.806, 0.981]], [0.366, [0.709, 0.806, 0.981]], [0.368, [0.714, 0.809, 0.979]], [0.370, [0.714, 0.809, 0.979]], [0.372, [0.719, 0.812, 0.978]], [0.374, [0.719, 0.812, 0.978]], [0.376, [0.724, 0.815, 0.976]], [0.378, [0.724, 0.815, 0.976]], [0.380, [0.729, 0.817, 0.973]], [0.382, [0.729, 0.817, 0.973]], [0.384, [0.734, 0.820, 0.971]], [0.386, [0.734, 0.820, 0.971]], [0.387, [0.739, 0.823, 0.968]], [0.389, [0.739, 0.823, 0.968]], [0.391, [0.744, 0.825, 0.966]], [0.393, [0.744, 0.825, 0.966]], [0.395, [0.749, 0.828, 0.963]], [0.397, [0.749, 0.828, 0.963]], [0.399, [0.754, 0.830, 0.961]], [0.401, [0.754, 0.830, 0.961]], [0.403, [0.759, 0.833, 0.958]], [0.405, [0.759, 0.833, 0.958]], [0.407, [0.763, 0.835, 0.956]], [0.409, [0.763, 0.835, 0.956]], [0.411, [0.768, 0.837, 0.952]], [0.413, [0.768, 0.837, 0.952]], [0.415, [0.773, 0.839, 0.949]], [0.417, [0.773, 0.839, 0.949]], [0.419, [0.777, 0.841, 0.946]], [0.421, [0.777, 0.841, 0.946]], [0.423, [0.782, 0.843, 0.943]], [0.425, [0.782, 0.843, 0.943]], [0.427, [0.787, 0.845, 0.940]], [0.429, [0.787, 0.845, 0.940]], [0.431, [0.791, 0.847, 0.937]], [0.432, [0.791, 0.847, 0.937]], [0.434, [0.796, 0.849, 0.933]], [0.436, [0.796, 0.849, 0.933]], [0.438, [0.801, 0.850, 0.930]], [0.440, [0.801, 0.850, 0.930]], [0.442, [0.805, 0.852, 0.926]], [0.444, [0.805, 0.852, 0.926]], [0.446, [0.809, 0.853, 0.922]], [0.448, [0.809, 0.853, 0.922]], [0.450, [0.814, 0.854, 0.918]], [0.452, [0.814, 0.854, 0.918]], [0.454, [0.818, 0.856, 0.915]], [0.456, [0.818, 0.856, 0.915]], [0.458, [0.822, 0.857, 0.911]], [0.460, [0.822, 0.857, 0.911]], [0.462, [0.827, 0.858, 0.907]], [0.464, [0.827, 0.858, 0.907]], [0.466, [0.831, 0.860, 0.903]], [0.468, [0.831, 0.860, 0.903]], [0.470, [0.835, 0.861, 0.899]], [0.472, [0.835, 0.861, 0.899]], [0.474, [0.839, 0.861, 0.894]], [0.476, [0.839, 0.861, 0.894]], [0.477, [0.843, 0.862, 0.890]], [0.479, [0.843, 0.862, 0.890]], [0.481, [0.847, 0.862, 0.886]], [0.483, [0.847, 0.862, 0.886]], [0.485, [0.851, 0.863, 0.881]], [0.487, [0.851, 0.863, 0.881]], [0.489, [0.855, 0.864, 0.877]], [0.491, [0.855, 0.864, 0.877]], [0.493, [0.859, 0.864, 0.872]], [0.495, [0.859, 0.864, 0.872]], [0.497, [0.863, 0.865, 0.868]], [0.499, [0.863, 0.865, 0.868]], [0.501, [0.867, 0.864, 0.863]], [0.503, [0.867, 0.864, 0.863]], [0.505, [0.871, 0.862, 0.857]], [0.507, [0.871, 0.862, 0.857]], [0.509, [0.876, 0.860, 0.851]], [0.511, [0.876, 0.860, 0.851]], [0.513, [0.880, 0.858, 0.846]], [0.515, [0.880, 0.858, 0.846]], [0.517, [0.884, 0.856, 0.840]], [0.519, [0.884, 0.856, 0.840]], [0.521, [0.888, 0.854, 0.835]], [0.523, [0.888, 0.854, 0.835]], [0.524, [0.892, 0.852, 0.829]], [0.526, [0.892, 0.852, 0.829]], [0.528, [0.896, 0.850, 0.823]], [0.530, [0.896, 0.850, 0.823]], [0.532, [0.900, 0.848, 0.818]], [0.534, [0.900, 0.848, 0.818]], [0.536, [0.903, 0.845, 0.812]], [0.538, [0.903, 0.845, 0.812]], [0.540, [0.906, 0.842, 0.806]], [0.542, [0.906, 0.842, 0.806]], [0.544, [0.909, 0.839, 0.800]], [0.546, [0.909, 0.839, 0.800]], [0.548, [0.913, 0.837, 0.795]], [0.550, [0.913, 0.837, 0.795]], [0.552, [0.916, 0.834, 0.789]], [0.554, [0.916, 0.834, 0.789]], [0.556, [0.919, 0.831, 0.783]], [0.558, [0.919, 0.831, 0.783]], [0.560, [0.923, 0.829, 0.777]], [0.562, [0.923, 0.829, 0.777]], [0.564, [0.926, 0.826, 0.771]], [0.566, [0.926, 0.826, 0.771]], [0.568, [0.928, 0.822, 0.765]], [0.569, [0.928, 0.822, 0.765]], [0.571, [0.931, 0.819, 0.759]], [0.573, [0.931, 0.819, 0.759]], [0.575, [0.933, 0.816, 0.753]], [0.577, [0.933, 0.816, 0.753]], [0.579, [0.936, 0.812, 0.747]], [0.581, [0.936, 0.812, 0.747]], [0.583, [0.938, 0.809, 0.741]], [0.585, [0.938, 0.809, 0.741]], [0.587, [0.941, 0.806, 0.735]], [0.589, [0.941, 0.806, 0.735]], [0.591, [0.943, 0.802, 0.729]], [0.593, [0.943, 0.802, 0.729]], [0.595, [0.946, 0.799, 0.723]], [0.597, [0.946, 0.799, 0.723]], [0.599, [0.947, 0.795, 0.717]], [0.601, [0.947, 0.795, 0.717]], [0.603, [0.949, 0.791, 0.711]], [0.605, [0.949, 0.791, 0.711]], [0.607, [0.951, 0.787, 0.705]], [0.609, [0.951, 0.787, 0.705]], [0.611, [0.953, 0.783, 0.699]], [0.613, [0.953, 0.783, 0.699]], [0.614, [0.955, 0.779, 0.693]], [0.616, [0.955, 0.779, 0.693]], [0.618, [0.956, 0.775, 0.686]], [0.620, [0.956, 0.775, 0.686]], [0.622, [0.958, 0.771, 0.680]], [0.624, [0.958, 0.771, 0.680]], [0.626, [0.960, 0.767, 0.674]], [0.628, [0.960, 0.767, 0.674]], [0.630, [0.961, 0.763, 0.668]], [0.632, [0.961, 0.763, 0.668]], [0.634, [0.962, 0.758, 0.662]], [0.636, [0.962, 0.758, 0.662]], [0.638, [0.963, 0.754, 0.656]], [0.640, [0.963, 0.754, 0.656]], [0.642, [0.964, 0.749, 0.649]], [0.644, [0.964, 0.749, 0.649]], [0.646, [0.965, 0.745, 0.643]], [0.648, [0.965, 0.745, 0.643]], [0.650, [0.966, 0.740, 0.637]], [0.652, [0.966, 0.740, 0.637]], [0.654, [0.967, 0.736, 0.631]], [0.656, [0.967, 0.736, 0.631]], [0.658, [0.968, 0.731, 0.625]], [0.659, [0.968, 0.731, 0.625]], [0.661, [0.968, 0.726, 0.618]], [0.663, [0.968, 0.726, 0.618]], [0.665, [0.968, 0.721, 0.612]], [0.667, [0.968, 0.721, 0.612]], [0.669, [0.969, 0.716, 0.606]], [0.671, [0.969, 0.716, 0.606]], [0.673, [0.969, 0.711, 0.600]], [0.675, [0.969, 0.711, 0.600]], [0.677, [0.969, 0.706, 0.594]], [0.679, [0.969, 0.706, 0.594]], [0.681, [0.970, 0.701, 0.588]], [0.683, [0.970, 0.701, 0.588]], [0.685, [0.970, 0.696, 0.581]], [0.687, [0.970, 0.696, 0.581]], [0.689, [0.970, 0.690, 0.575]], [0.691, [0.970, 0.690, 0.575]], [0.693, [0.969, 0.685, 0.569]], [0.695, [0.969, 0.685, 0.569]], [0.697, [0.969, 0.679, 0.563]], [0.699, [0.969, 0.679, 0.563]], [0.701, [0.968, 0.674, 0.557]], [0.703, [0.968, 0.674, 0.557]], [0.705, [0.968, 0.668, 0.550]], [0.706, [0.968, 0.668, 0.550]], [0.708, [0.968, 0.663, 0.544]], [0.710, [0.968, 0.663, 0.544]], [0.712, [0.967, 0.657, 0.538]], [0.714, [0.967, 0.657, 0.538]], [0.716, [0.967, 0.652, 0.532]], [0.718, [0.967, 0.652, 0.532]], [0.720, [0.966, 0.646, 0.526]], [0.722, [0.966, 0.646, 0.526]], [0.724, [0.965, 0.640, 0.520]], [0.726, [0.965, 0.640, 0.520]], [0.728, [0.964, 0.634, 0.514]], [0.730, [0.964, 0.634, 0.514]], [0.732, [0.963, 0.628, 0.508]], [0.734, [0.963, 0.628, 0.508]], [0.736, [0.962, 0.622, 0.502]], [0.738, [0.962, 0.622, 0.502]], [0.740, [0.960, 0.616, 0.495]], [0.742, [0.960, 0.616, 0.495]], [0.744, [0.959, 0.610, 0.489]], [0.746, [0.959, 0.610, 0.489]], [0.748, [0.958, 0.604, 0.483]], [0.750, [0.958, 0.604, 0.483]], [0.751, [0.957, 0.598, 0.477]], [0.753, [0.957, 0.598, 0.477]], [0.755, [0.955, 0.592, 0.471]], [0.757, [0.955, 0.592, 0.471]], [0.759, [0.953, 0.585, 0.465]], [0.761, [0.953, 0.585, 0.465]], [0.763, [0.951, 0.579, 0.459]], [0.765, [0.951, 0.579, 0.459]], [0.767, [0.949, 0.572, 0.453]], [0.769, [0.949, 0.572, 0.453]], [0.771, [0.948, 0.566, 0.447]], [0.773, [0.948, 0.566, 0.447]], [0.775, [0.946, 0.560, 0.442]], [0.777, [0.946, 0.560, 0.442]], [0.779, [0.944, 0.553, 0.436]], [0.781, [0.944, 0.553, 0.436]], [0.783, [0.942, 0.546, 0.430]], [0.785, [0.942, 0.546, 0.430]], [0.787, [0.939, 0.540, 0.424]], [0.789, [0.939, 0.540, 0.424]], [0.791, [0.937, 0.533, 0.418]], [0.793, [0.937, 0.533, 0.418]], [0.795, [0.934, 0.526, 0.412]], [0.796, [0.934, 0.526, 0.412]], [0.798, [0.932, 0.519, 0.406]], [0.800, [0.932, 0.519, 0.406]], [0.802, [0.929, 0.512, 0.401]], [0.804, [0.929, 0.512, 0.401]], [0.806, [0.927, 0.505, 0.395]], [0.808, [0.927, 0.505, 0.395]], [0.810, [0.924, 0.499, 0.389]], [0.812, [0.924, 0.499, 0.389]], [0.814, [0.921, 0.491, 0.383]], [0.816, [0.921, 0.491, 0.383]], [0.818, [0.918, 0.484, 0.378]], [0.820, [0.918, 0.484, 0.378]], [0.822, [0.915, 0.477, 0.372]], [0.824, [0.915, 0.477, 0.372]], [0.826, [0.912, 0.470, 0.367]], [0.828, [0.912, 0.470, 0.367]], [0.830, [0.909, 0.462, 0.361]], [0.832, [0.909, 0.462, 0.361]], [0.834, [0.906, 0.455, 0.355]], [0.836, [0.906, 0.455, 0.355]], [0.838, [0.903, 0.448, 0.350]], [0.840, [0.903, 0.448, 0.350]], [0.841, [0.900, 0.441, 0.344]], [0.843, [0.900, 0.441, 0.344]], [0.845, [0.896, 0.433, 0.339]], [0.847, [0.896, 0.433, 0.339]], [0.849, [0.892, 0.425, 0.333]], [0.851, [0.892, 0.425, 0.333]], [0.853, [0.888, 0.418, 0.328]], [0.855, [0.888, 0.418, 0.328]], [0.857, [0.885, 0.410, 0.323]], [0.859, [0.885, 0.410, 0.323]], [0.861, [0.881, 0.402, 0.317]], [0.863, [0.881, 0.402, 0.317]], [0.865, [0.877, 0.395, 0.312]], [0.867, [0.877, 0.395, 0.312]], [0.869, [0.873, 0.387, 0.306]], [0.871, [0.873, 0.387, 0.306]], [0.873, [0.870, 0.379, 0.301]], [0.875, [0.870, 0.379, 0.301]], [0.877, [0.865, 0.371, 0.296]], [0.879, [0.865, 0.371, 0.296]], [0.881, [0.861, 0.363, 0.291]], [0.883, [0.861, 0.363, 0.291]], [0.885, [0.857, 0.355, 0.285]], [0.886, [0.857, 0.355, 0.285]], [0.888, [0.852, 0.346, 0.280]], [0.890, [0.852, 0.346, 0.280]], [0.892, [0.848, 0.338, 0.275]], [0.894, [0.848, 0.338, 0.275]], [0.896, [0.844, 0.330, 0.270]], [0.898, [0.844, 0.330, 0.270]], [0.900, [0.839, 0.322, 0.265]], [0.902, [0.839, 0.322, 0.265]], [0.904, [0.835, 0.314, 0.260]], [0.906, [0.835, 0.314, 0.260]], [0.908, [0.830, 0.305, 0.255]], [0.910, [0.830, 0.305, 0.255]], [0.912, [0.825, 0.296, 0.250]], [0.914, [0.825, 0.296, 0.250]], [0.916, [0.820, 0.287, 0.245]], [0.918, [0.820, 0.287, 0.245]], [0.920, [0.816, 0.278, 0.240]], [0.922, [0.816, 0.278, 0.240]], [0.924, [0.811, 0.269, 0.235]], [0.926, [0.811, 0.269, 0.235]], [0.928, [0.806, 0.260, 0.231]], [0.930, [0.806, 0.260, 0.231]], [0.932, [0.801, 0.251, 0.226]], [0.933, [0.801, 0.251, 0.226]], [0.935, [0.796, 0.242, 0.221]], [0.937, [0.796, 0.242, 0.221]], [0.939, [0.791, 0.231, 0.216]], [0.941, [0.791, 0.231, 0.216]], [0.943, [0.785, 0.221, 0.212]], [0.945, [0.785, 0.221, 0.212]], [0.947, [0.780, 0.210, 0.207]], [0.949, [0.780, 0.210, 0.207]], [0.951, [0.774, 0.200, 0.203]], [0.953, [0.774, 0.200, 0.203]], [0.955, [0.769, 0.189, 0.198]], [0.957, [0.769, 0.189, 0.198]], [0.959, [0.764, 0.179, 0.193]], [0.961, [0.764, 0.179, 0.193]], [0.963, [0.758, 0.168, 0.189]], [0.965, [0.758, 0.168, 0.189]], [0.967, [0.753, 0.158, 0.184]], [0.969, [0.753, 0.158, 0.184]], [0.971, [0.747, 0.140, 0.180]], [0.973, [0.747, 0.140, 0.180]], [0.975, [0.741, 0.122, 0.176]], [0.977, [0.741, 0.122, 0.176]], [0.978, [0.735, 0.104, 0.171]], [0.980, [0.735, 0.104, 0.171]], [0.982, [0.729, 0.087, 0.167]], [0.984, [0.729, 0.087, 0.167]], [0.986, [0.723, 0.069, 0.163]], [0.988, [0.723, 0.069, 0.163]], [0.990, [0.717, 0.051, 0.159]], [0.992, [0.717, 0.051, 0.159]], [0.994, [0.712, 0.033, 0.154]], [0.996, [0.712, 0.033, 0.154]], [0.998, [0.706, 0.016, 0.150]], [1.000, [0.706, 0.016, 0.150]]]; +var seismic = [[0.000, [0.000, 0.000, 0.300]], [0.002, [0.000, 0.000, 0.300]], [0.004, [0.000, 0.000, 0.311]], [0.006, [0.000, 0.000, 0.311]], [0.008, [0.000, 0.000, 0.322]], [0.010, [0.000, 0.000, 0.322]], [0.012, [0.000, 0.000, 0.333]], [0.014, [0.000, 0.000, 0.333]], [0.016, [0.000, 0.000, 0.344]], [0.018, [0.000, 0.000, 0.344]], [0.020, [0.000, 0.000, 0.355]], [0.022, [0.000, 0.000, 0.355]], [0.023, [0.000, 0.000, 0.366]], [0.025, [0.000, 0.000, 0.366]], [0.027, [0.000, 0.000, 0.377]], [0.029, [0.000, 0.000, 0.377]], [0.031, [0.000, 0.000, 0.388]], [0.033, [0.000, 0.000, 0.388]], [0.035, [0.000, 0.000, 0.399]], [0.037, [0.000, 0.000, 0.399]], [0.039, [0.000, 0.000, 0.410]], [0.041, [0.000, 0.000, 0.410]], [0.043, [0.000, 0.000, 0.421]], [0.045, [0.000, 0.000, 0.421]], [0.047, [0.000, 0.000, 0.432]], [0.049, [0.000, 0.000, 0.432]], [0.051, [0.000, 0.000, 0.443]], [0.053, [0.000, 0.000, 0.443]], [0.055, [0.000, 0.000, 0.454]], [0.057, [0.000, 0.000, 0.454]], [0.059, [0.000, 0.000, 0.465]], [0.061, [0.000, 0.000, 0.465]], [0.063, [0.000, 0.000, 0.476]], [0.065, [0.000, 0.000, 0.476]], [0.067, [0.000, 0.000, 0.487]], [0.068, [0.000, 0.000, 0.487]], [0.070, [0.000, 0.000, 0.498]], [0.072, [0.000, 0.000, 0.498]], [0.074, [0.000, 0.000, 0.509]], [0.076, [0.000, 0.000, 0.509]], [0.078, [0.000, 0.000, 0.520]], [0.080, [0.000, 0.000, 0.520]], [0.082, [0.000, 0.000, 0.531]], [0.084, [0.000, 0.000, 0.531]], [0.086, [0.000, 0.000, 0.542]], [0.088, [0.000, 0.000, 0.542]], [0.090, [0.000, 0.000, 0.553]], [0.092, [0.000, 0.000, 0.553]], [0.094, [0.000, 0.000, 0.564]], [0.096, [0.000, 0.000, 0.564]], [0.098, [0.000, 0.000, 0.575]], [0.100, [0.000, 0.000, 0.575]], [0.102, [0.000, 0.000, 0.585]], [0.104, [0.000, 0.000, 0.585]], [0.106, [0.000, 0.000, 0.596]], [0.108, [0.000, 0.000, 0.596]], [0.110, [0.000, 0.000, 0.607]], [0.112, [0.000, 0.000, 0.607]], [0.114, [0.000, 0.000, 0.618]], [0.115, [0.000, 0.000, 0.618]], [0.117, [0.000, 0.000, 0.629]], [0.119, [0.000, 0.000, 0.629]], [0.121, [0.000, 0.000, 0.640]], [0.123, [0.000, 0.000, 0.640]], [0.125, [0.000, 0.000, 0.651]], [0.127, [0.000, 0.000, 0.651]], [0.129, [0.000, 0.000, 0.662]], [0.131, [0.000, 0.000, 0.662]], [0.133, [0.000, 0.000, 0.673]], [0.135, [0.000, 0.000, 0.673]], [0.137, [0.000, 0.000, 0.684]], [0.139, [0.000, 0.000, 0.684]], [0.141, [0.000, 0.000, 0.695]], [0.143, [0.000, 0.000, 0.695]], [0.145, [0.000, 0.000, 0.706]], [0.147, [0.000, 0.000, 0.706]], [0.149, [0.000, 0.000, 0.717]], [0.151, [0.000, 0.000, 0.717]], [0.153, [0.000, 0.000, 0.728]], [0.155, [0.000, 0.000, 0.728]], [0.157, [0.000, 0.000, 0.739]], [0.159, [0.000, 0.000, 0.739]], [0.160, [0.000, 0.000, 0.750]], [0.162, [0.000, 0.000, 0.750]], [0.164, [0.000, 0.000, 0.761]], [0.166, [0.000, 0.000, 0.761]], [0.168, [0.000, 0.000, 0.772]], [0.170, [0.000, 0.000, 0.772]], [0.172, [0.000, 0.000, 0.783]], [0.174, [0.000, 0.000, 0.783]], [0.176, [0.000, 0.000, 0.794]], [0.178, [0.000, 0.000, 0.794]], [0.180, [0.000, 0.000, 0.805]], [0.182, [0.000, 0.000, 0.805]], [0.184, [0.000, 0.000, 0.816]], [0.186, [0.000, 0.000, 0.816]], [0.188, [0.000, 0.000, 0.827]], [0.190, [0.000, 0.000, 0.827]], [0.192, [0.000, 0.000, 0.838]], [0.194, [0.000, 0.000, 0.838]], [0.196, [0.000, 0.000, 0.849]], [0.198, [0.000, 0.000, 0.849]], [0.200, [0.000, 0.000, 0.860]], [0.202, [0.000, 0.000, 0.860]], [0.204, [0.000, 0.000, 0.871]], [0.205, [0.000, 0.000, 0.871]], [0.207, [0.000, 0.000, 0.882]], [0.209, [0.000, 0.000, 0.882]], [0.211, [0.000, 0.000, 0.893]], [0.213, [0.000, 0.000, 0.893]], [0.215, [0.000, 0.000, 0.904]], [0.217, [0.000, 0.000, 0.904]], [0.219, [0.000, 0.000, 0.915]], [0.221, [0.000, 0.000, 0.915]], [0.223, [0.000, 0.000, 0.926]], [0.225, [0.000, 0.000, 0.926]], [0.227, [0.000, 0.000, 0.937]], [0.229, [0.000, 0.000, 0.937]], [0.231, [0.000, 0.000, 0.948]], [0.233, [0.000, 0.000, 0.948]], [0.235, [0.000, 0.000, 0.959]], [0.237, [0.000, 0.000, 0.959]], [0.239, [0.000, 0.000, 0.970]], [0.241, [0.000, 0.000, 0.970]], [0.243, [0.000, 0.000, 0.981]], [0.245, [0.000, 0.000, 0.981]], [0.247, [0.000, 0.000, 0.992]], [0.249, [0.000, 0.000, 0.992]], [0.250, [0.004, 0.004, 1.000]], [0.252, [0.004, 0.004, 1.000]], [0.254, [0.020, 0.020, 1.000]], [0.256, [0.020, 0.020, 1.000]], [0.258, [0.035, 0.035, 1.000]], [0.260, [0.035, 0.035, 1.000]], [0.262, [0.051, 0.051, 1.000]], [0.264, [0.051, 0.051, 1.000]], [0.266, [0.067, 0.067, 1.000]], [0.268, [0.067, 0.067, 1.000]], [0.270, [0.082, 0.082, 1.000]], [0.272, [0.082, 0.082, 1.000]], [0.274, [0.098, 0.098, 1.000]], [0.276, [0.098, 0.098, 1.000]], [0.278, [0.114, 0.114, 1.000]], [0.280, [0.114, 0.114, 1.000]], [0.282, [0.129, 0.129, 1.000]], [0.284, [0.129, 0.129, 1.000]], [0.286, [0.145, 0.145, 1.000]], [0.288, [0.145, 0.145, 1.000]], [0.290, [0.161, 0.161, 1.000]], [0.292, [0.161, 0.161, 1.000]], [0.294, [0.176, 0.176, 1.000]], [0.295, [0.176, 0.176, 1.000]], [0.297, [0.192, 0.192, 1.000]], [0.299, [0.192, 0.192, 1.000]], [0.301, [0.208, 0.208, 1.000]], [0.303, [0.208, 0.208, 1.000]], [0.305, [0.224, 0.224, 1.000]], [0.307, [0.224, 0.224, 1.000]], [0.309, [0.239, 0.239, 1.000]], [0.311, [0.239, 0.239, 1.000]], [0.313, [0.255, 0.255, 1.000]], [0.315, [0.255, 0.255, 1.000]], [0.317, [0.271, 0.271, 1.000]], [0.319, [0.271, 0.271, 1.000]], [0.321, [0.286, 0.286, 1.000]], [0.323, [0.286, 0.286, 1.000]], [0.325, [0.302, 0.302, 1.000]], [0.327, [0.302, 0.302, 1.000]], [0.329, [0.318, 0.318, 1.000]], [0.331, [0.318, 0.318, 1.000]], [0.333, [0.333, 0.333, 1.000]], [0.335, [0.333, 0.333, 1.000]], [0.337, [0.349, 0.349, 1.000]], [0.339, [0.349, 0.349, 1.000]], [0.341, [0.365, 0.365, 1.000]], [0.342, [0.365, 0.365, 1.000]], [0.344, [0.380, 0.380, 1.000]], [0.346, [0.380, 0.380, 1.000]], [0.348, [0.396, 0.396, 1.000]], [0.350, [0.396, 0.396, 1.000]], [0.352, [0.412, 0.412, 1.000]], [0.354, [0.412, 0.412, 1.000]], [0.356, [0.427, 0.427, 1.000]], [0.358, [0.427, 0.427, 1.000]], [0.360, [0.443, 0.443, 1.000]], [0.362, [0.443, 0.443, 1.000]], [0.364, [0.459, 0.459, 1.000]], [0.366, [0.459, 0.459, 1.000]], [0.368, [0.475, 0.475, 1.000]], [0.370, [0.475, 0.475, 1.000]], [0.372, [0.490, 0.490, 1.000]], [0.374, [0.490, 0.490, 1.000]], [0.376, [0.506, 0.506, 1.000]], [0.378, [0.506, 0.506, 1.000]], [0.380, [0.522, 0.522, 1.000]], [0.382, [0.522, 0.522, 1.000]], [0.384, [0.537, 0.537, 1.000]], [0.386, [0.537, 0.537, 1.000]], [0.387, [0.553, 0.553, 1.000]], [0.389, [0.553, 0.553, 1.000]], [0.391, [0.569, 0.569, 1.000]], [0.393, [0.569, 0.569, 1.000]], [0.395, [0.584, 0.584, 1.000]], [0.397, [0.584, 0.584, 1.000]], [0.399, [0.600, 0.600, 1.000]], [0.401, [0.600, 0.600, 1.000]], [0.403, [0.616, 0.616, 1.000]], [0.405, [0.616, 0.616, 1.000]], [0.407, [0.631, 0.631, 1.000]], [0.409, [0.631, 0.631, 1.000]], [0.411, [0.647, 0.647, 1.000]], [0.413, [0.647, 0.647, 1.000]], [0.415, [0.663, 0.663, 1.000]], [0.417, [0.663, 0.663, 1.000]], [0.419, [0.678, 0.678, 1.000]], [0.421, [0.678, 0.678, 1.000]], [0.423, [0.694, 0.694, 1.000]], [0.425, [0.694, 0.694, 1.000]], [0.427, [0.710, 0.710, 1.000]], [0.429, [0.710, 0.710, 1.000]], [0.431, [0.725, 0.725, 1.000]], [0.432, [0.725, 0.725, 1.000]], [0.434, [0.741, 0.741, 1.000]], [0.436, [0.741, 0.741, 1.000]], [0.438, [0.757, 0.757, 1.000]], [0.440, [0.757, 0.757, 1.000]], [0.442, [0.773, 0.773, 1.000]], [0.444, [0.773, 0.773, 1.000]], [0.446, [0.788, 0.788, 1.000]], [0.448, [0.788, 0.788, 1.000]], [0.450, [0.804, 0.804, 1.000]], [0.452, [0.804, 0.804, 1.000]], [0.454, [0.820, 0.820, 1.000]], [0.456, [0.820, 0.820, 1.000]], [0.458, [0.835, 0.835, 1.000]], [0.460, [0.835, 0.835, 1.000]], [0.462, [0.851, 0.851, 1.000]], [0.464, [0.851, 0.851, 1.000]], [0.466, [0.867, 0.867, 1.000]], [0.468, [0.867, 0.867, 1.000]], [0.470, [0.882, 0.882, 1.000]], [0.472, [0.882, 0.882, 1.000]], [0.474, [0.898, 0.898, 1.000]], [0.476, [0.898, 0.898, 1.000]], [0.477, [0.914, 0.914, 1.000]], [0.479, [0.914, 0.914, 1.000]], [0.481, [0.929, 0.929, 1.000]], [0.483, [0.929, 0.929, 1.000]], [0.485, [0.945, 0.945, 1.000]], [0.487, [0.945, 0.945, 1.000]], [0.489, [0.961, 0.961, 1.000]], [0.491, [0.961, 0.961, 1.000]], [0.493, [0.976, 0.976, 1.000]], [0.495, [0.976, 0.976, 1.000]], [0.497, [0.992, 0.992, 1.000]], [0.499, [0.992, 0.992, 1.000]], [0.501, [1.000, 0.992, 0.992]], [0.503, [1.000, 0.992, 0.992]], [0.505, [1.000, 0.976, 0.976]], [0.507, [1.000, 0.976, 0.976]], [0.509, [1.000, 0.961, 0.961]], [0.511, [1.000, 0.961, 0.961]], [0.513, [1.000, 0.945, 0.945]], [0.515, [1.000, 0.945, 0.945]], [0.517, [1.000, 0.929, 0.929]], [0.519, [1.000, 0.929, 0.929]], [0.521, [1.000, 0.914, 0.914]], [0.523, [1.000, 0.914, 0.914]], [0.524, [1.000, 0.898, 0.898]], [0.526, [1.000, 0.898, 0.898]], [0.528, [1.000, 0.882, 0.882]], [0.530, [1.000, 0.882, 0.882]], [0.532, [1.000, 0.867, 0.867]], [0.534, [1.000, 0.867, 0.867]], [0.536, [1.000, 0.851, 0.851]], [0.538, [1.000, 0.851, 0.851]], [0.540, [1.000, 0.835, 0.835]], [0.542, [1.000, 0.835, 0.835]], [0.544, [1.000, 0.820, 0.820]], [0.546, [1.000, 0.820, 0.820]], [0.548, [1.000, 0.804, 0.804]], [0.550, [1.000, 0.804, 0.804]], [0.552, [1.000, 0.788, 0.788]], [0.554, [1.000, 0.788, 0.788]], [0.556, [1.000, 0.773, 0.773]], [0.558, [1.000, 0.773, 0.773]], [0.560, [1.000, 0.757, 0.757]], [0.562, [1.000, 0.757, 0.757]], [0.564, [1.000, 0.741, 0.741]], [0.566, [1.000, 0.741, 0.741]], [0.568, [1.000, 0.725, 0.725]], [0.569, [1.000, 0.725, 0.725]], [0.571, [1.000, 0.710, 0.710]], [0.573, [1.000, 0.710, 0.710]], [0.575, [1.000, 0.694, 0.694]], [0.577, [1.000, 0.694, 0.694]], [0.579, [1.000, 0.678, 0.678]], [0.581, [1.000, 0.678, 0.678]], [0.583, [1.000, 0.663, 0.663]], [0.585, [1.000, 0.663, 0.663]], [0.587, [1.000, 0.647, 0.647]], [0.589, [1.000, 0.647, 0.647]], [0.591, [1.000, 0.631, 0.631]], [0.593, [1.000, 0.631, 0.631]], [0.595, [1.000, 0.616, 0.616]], [0.597, [1.000, 0.616, 0.616]], [0.599, [1.000, 0.600, 0.600]], [0.601, [1.000, 0.600, 0.600]], [0.603, [1.000, 0.584, 0.584]], [0.605, [1.000, 0.584, 0.584]], [0.607, [1.000, 0.569, 0.569]], [0.609, [1.000, 0.569, 0.569]], [0.611, [1.000, 0.553, 0.553]], [0.613, [1.000, 0.553, 0.553]], [0.614, [1.000, 0.537, 0.537]], [0.616, [1.000, 0.537, 0.537]], [0.618, [1.000, 0.522, 0.522]], [0.620, [1.000, 0.522, 0.522]], [0.622, [1.000, 0.506, 0.506]], [0.624, [1.000, 0.506, 0.506]], [0.626, [1.000, 0.490, 0.490]], [0.628, [1.000, 0.490, 0.490]], [0.630, [1.000, 0.475, 0.475]], [0.632, [1.000, 0.475, 0.475]], [0.634, [1.000, 0.459, 0.459]], [0.636, [1.000, 0.459, 0.459]], [0.638, [1.000, 0.443, 0.443]], [0.640, [1.000, 0.443, 0.443]], [0.642, [1.000, 0.427, 0.427]], [0.644, [1.000, 0.427, 0.427]], [0.646, [1.000, 0.412, 0.412]], [0.648, [1.000, 0.412, 0.412]], [0.650, [1.000, 0.396, 0.396]], [0.652, [1.000, 0.396, 0.396]], [0.654, [1.000, 0.380, 0.380]], [0.656, [1.000, 0.380, 0.380]], [0.658, [1.000, 0.365, 0.365]], [0.659, [1.000, 0.365, 0.365]], [0.661, [1.000, 0.349, 0.349]], [0.663, [1.000, 0.349, 0.349]], [0.665, [1.000, 0.333, 0.333]], [0.667, [1.000, 0.333, 0.333]], [0.669, [1.000, 0.318, 0.318]], [0.671, [1.000, 0.318, 0.318]], [0.673, [1.000, 0.302, 0.302]], [0.675, [1.000, 0.302, 0.302]], [0.677, [1.000, 0.286, 0.286]], [0.679, [1.000, 0.286, 0.286]], [0.681, [1.000, 0.271, 0.271]], [0.683, [1.000, 0.271, 0.271]], [0.685, [1.000, 0.255, 0.255]], [0.687, [1.000, 0.255, 0.255]], [0.689, [1.000, 0.239, 0.239]], [0.691, [1.000, 0.239, 0.239]], [0.693, [1.000, 0.224, 0.224]], [0.695, [1.000, 0.224, 0.224]], [0.697, [1.000, 0.208, 0.208]], [0.699, [1.000, 0.208, 0.208]], [0.701, [1.000, 0.192, 0.192]], [0.703, [1.000, 0.192, 0.192]], [0.705, [1.000, 0.176, 0.176]], [0.706, [1.000, 0.176, 0.176]], [0.708, [1.000, 0.161, 0.161]], [0.710, [1.000, 0.161, 0.161]], [0.712, [1.000, 0.145, 0.145]], [0.714, [1.000, 0.145, 0.145]], [0.716, [1.000, 0.129, 0.129]], [0.718, [1.000, 0.129, 0.129]], [0.720, [1.000, 0.114, 0.114]], [0.722, [1.000, 0.114, 0.114]], [0.724, [1.000, 0.098, 0.098]], [0.726, [1.000, 0.098, 0.098]], [0.728, [1.000, 0.082, 0.082]], [0.730, [1.000, 0.082, 0.082]], [0.732, [1.000, 0.067, 0.067]], [0.734, [1.000, 0.067, 0.067]], [0.736, [1.000, 0.051, 0.051]], [0.738, [1.000, 0.051, 0.051]], [0.740, [1.000, 0.035, 0.035]], [0.742, [1.000, 0.035, 0.035]], [0.744, [1.000, 0.020, 0.020]], [0.746, [1.000, 0.020, 0.020]], [0.748, [1.000, 0.004, 0.004]], [0.750, [1.000, 0.004, 0.004]], [0.751, [0.994, 0.000, 0.000]], [0.753, [0.994, 0.000, 0.000]], [0.755, [0.986, 0.000, 0.000]], [0.757, [0.986, 0.000, 0.000]], [0.759, [0.978, 0.000, 0.000]], [0.761, [0.978, 0.000, 0.000]], [0.763, [0.971, 0.000, 0.000]], [0.765, [0.971, 0.000, 0.000]], [0.767, [0.963, 0.000, 0.000]], [0.769, [0.963, 0.000, 0.000]], [0.771, [0.955, 0.000, 0.000]], [0.773, [0.955, 0.000, 0.000]], [0.775, [0.947, 0.000, 0.000]], [0.777, [0.947, 0.000, 0.000]], [0.779, [0.939, 0.000, 0.000]], [0.781, [0.939, 0.000, 0.000]], [0.783, [0.931, 0.000, 0.000]], [0.785, [0.931, 0.000, 0.000]], [0.787, [0.924, 0.000, 0.000]], [0.789, [0.924, 0.000, 0.000]], [0.791, [0.916, 0.000, 0.000]], [0.793, [0.916, 0.000, 0.000]], [0.795, [0.908, 0.000, 0.000]], [0.796, [0.908, 0.000, 0.000]], [0.798, [0.900, 0.000, 0.000]], [0.800, [0.900, 0.000, 0.000]], [0.802, [0.892, 0.000, 0.000]], [0.804, [0.892, 0.000, 0.000]], [0.806, [0.884, 0.000, 0.000]], [0.808, [0.884, 0.000, 0.000]], [0.810, [0.876, 0.000, 0.000]], [0.812, [0.876, 0.000, 0.000]], [0.814, [0.869, 0.000, 0.000]], [0.816, [0.869, 0.000, 0.000]], [0.818, [0.861, 0.000, 0.000]], [0.820, [0.861, 0.000, 0.000]], [0.822, [0.853, 0.000, 0.000]], [0.824, [0.853, 0.000, 0.000]], [0.826, [0.845, 0.000, 0.000]], [0.828, [0.845, 0.000, 0.000]], [0.830, [0.837, 0.000, 0.000]], [0.832, [0.837, 0.000, 0.000]], [0.834, [0.829, 0.000, 0.000]], [0.836, [0.829, 0.000, 0.000]], [0.838, [0.822, 0.000, 0.000]], [0.840, [0.822, 0.000, 0.000]], [0.841, [0.814, 0.000, 0.000]], [0.843, [0.814, 0.000, 0.000]], [0.845, [0.806, 0.000, 0.000]], [0.847, [0.806, 0.000, 0.000]], [0.849, [0.798, 0.000, 0.000]], [0.851, [0.798, 0.000, 0.000]], [0.853, [0.790, 0.000, 0.000]], [0.855, [0.790, 0.000, 0.000]], [0.857, [0.782, 0.000, 0.000]], [0.859, [0.782, 0.000, 0.000]], [0.861, [0.775, 0.000, 0.000]], [0.863, [0.775, 0.000, 0.000]], [0.865, [0.767, 0.000, 0.000]], [0.867, [0.767, 0.000, 0.000]], [0.869, [0.759, 0.000, 0.000]], [0.871, [0.759, 0.000, 0.000]], [0.873, [0.751, 0.000, 0.000]], [0.875, [0.751, 0.000, 0.000]], [0.877, [0.743, 0.000, 0.000]], [0.879, [0.743, 0.000, 0.000]], [0.881, [0.735, 0.000, 0.000]], [0.883, [0.735, 0.000, 0.000]], [0.885, [0.727, 0.000, 0.000]], [0.886, [0.727, 0.000, 0.000]], [0.888, [0.720, 0.000, 0.000]], [0.890, [0.720, 0.000, 0.000]], [0.892, [0.712, 0.000, 0.000]], [0.894, [0.712, 0.000, 0.000]], [0.896, [0.704, 0.000, 0.000]], [0.898, [0.704, 0.000, 0.000]], [0.900, [0.696, 0.000, 0.000]], [0.902, [0.696, 0.000, 0.000]], [0.904, [0.688, 0.000, 0.000]], [0.906, [0.688, 0.000, 0.000]], [0.908, [0.680, 0.000, 0.000]], [0.910, [0.680, 0.000, 0.000]], [0.912, [0.673, 0.000, 0.000]], [0.914, [0.673, 0.000, 0.000]], [0.916, [0.665, 0.000, 0.000]], [0.918, [0.665, 0.000, 0.000]], [0.920, [0.657, 0.000, 0.000]], [0.922, [0.657, 0.000, 0.000]], [0.924, [0.649, 0.000, 0.000]], [0.926, [0.649, 0.000, 0.000]], [0.928, [0.641, 0.000, 0.000]], [0.930, [0.641, 0.000, 0.000]], [0.932, [0.633, 0.000, 0.000]], [0.933, [0.633, 0.000, 0.000]], [0.935, [0.625, 0.000, 0.000]], [0.937, [0.625, 0.000, 0.000]], [0.939, [0.618, 0.000, 0.000]], [0.941, [0.618, 0.000, 0.000]], [0.943, [0.610, 0.000, 0.000]], [0.945, [0.610, 0.000, 0.000]], [0.947, [0.602, 0.000, 0.000]], [0.949, [0.602, 0.000, 0.000]], [0.951, [0.594, 0.000, 0.000]], [0.953, [0.594, 0.000, 0.000]], [0.955, [0.586, 0.000, 0.000]], [0.957, [0.586, 0.000, 0.000]], [0.959, [0.578, 0.000, 0.000]], [0.961, [0.578, 0.000, 0.000]], [0.963, [0.571, 0.000, 0.000]], [0.965, [0.571, 0.000, 0.000]], [0.967, [0.563, 0.000, 0.000]], [0.969, [0.563, 0.000, 0.000]], [0.971, [0.555, 0.000, 0.000]], [0.973, [0.555, 0.000, 0.000]], [0.975, [0.547, 0.000, 0.000]], [0.977, [0.547, 0.000, 0.000]], [0.978, [0.539, 0.000, 0.000]], [0.980, [0.539, 0.000, 0.000]], [0.982, [0.531, 0.000, 0.000]], [0.984, [0.531, 0.000, 0.000]], [0.986, [0.524, 0.000, 0.000]], [0.988, [0.524, 0.000, 0.000]], [0.990, [0.516, 0.000, 0.000]], [0.992, [0.516, 0.000, 0.000]], [0.994, [0.508, 0.000, 0.000]], [0.996, [0.508, 0.000, 0.000]], [0.998, [0.500, 0.000, 0.000]], [1.000, [0.500, 0.000, 0.000]]]; + +// Qualitative +var Accent = [[0.000, [0.498, 0.788, 0.498]], [0.002, [0.498, 0.788, 0.498]], [0.004, [0.505, 0.785, 0.507]], [0.006, [0.505, 0.785, 0.507]], [0.008, [0.512, 0.782, 0.516]], [0.010, [0.512, 0.782, 0.516]], [0.012, [0.518, 0.780, 0.525]], [0.014, [0.518, 0.780, 0.525]], [0.016, [0.525, 0.777, 0.535]], [0.018, [0.525, 0.777, 0.535]], [0.020, [0.532, 0.774, 0.544]], [0.022, [0.532, 0.774, 0.544]], [0.023, [0.539, 0.771, 0.553]], [0.025, [0.539, 0.771, 0.553]], [0.027, [0.546, 0.768, 0.562]], [0.029, [0.546, 0.768, 0.562]], [0.031, [0.552, 0.765, 0.571]], [0.033, [0.552, 0.765, 0.571]], [0.035, [0.559, 0.762, 0.580]], [0.037, [0.559, 0.762, 0.580]], [0.039, [0.566, 0.759, 0.590]], [0.041, [0.566, 0.759, 0.590]], [0.043, [0.573, 0.756, 0.599]], [0.045, [0.573, 0.756, 0.599]], [0.047, [0.579, 0.753, 0.608]], [0.049, [0.579, 0.753, 0.608]], [0.051, [0.586, 0.750, 0.617]], [0.053, [0.586, 0.750, 0.617]], [0.055, [0.593, 0.748, 0.626]], [0.057, [0.593, 0.748, 0.626]], [0.059, [0.600, 0.745, 0.635]], [0.061, [0.600, 0.745, 0.635]], [0.063, [0.607, 0.742, 0.644]], [0.065, [0.607, 0.742, 0.644]], [0.067, [0.613, 0.739, 0.654]], [0.068, [0.613, 0.739, 0.654]], [0.070, [0.620, 0.736, 0.663]], [0.072, [0.620, 0.736, 0.663]], [0.074, [0.627, 0.733, 0.672]], [0.076, [0.627, 0.733, 0.672]], [0.078, [0.634, 0.730, 0.681]], [0.080, [0.634, 0.730, 0.681]], [0.082, [0.640, 0.727, 0.690]], [0.084, [0.640, 0.727, 0.690]], [0.086, [0.647, 0.724, 0.699]], [0.088, [0.647, 0.724, 0.699]], [0.090, [0.654, 0.721, 0.708]], [0.092, [0.654, 0.721, 0.708]], [0.094, [0.661, 0.718, 0.718]], [0.096, [0.661, 0.718, 0.718]], [0.098, [0.668, 0.716, 0.727]], [0.100, [0.668, 0.716, 0.727]], [0.102, [0.674, 0.713, 0.736]], [0.104, [0.674, 0.713, 0.736]], [0.106, [0.681, 0.710, 0.745]], [0.108, [0.681, 0.710, 0.745]], [0.110, [0.688, 0.707, 0.754]], [0.112, [0.688, 0.707, 0.754]], [0.114, [0.695, 0.704, 0.763]], [0.115, [0.695, 0.704, 0.763]], [0.117, [0.701, 0.701, 0.773]], [0.119, [0.701, 0.701, 0.773]], [0.121, [0.708, 0.698, 0.782]], [0.123, [0.708, 0.698, 0.782]], [0.125, [0.715, 0.695, 0.791]], [0.127, [0.715, 0.695, 0.791]], [0.129, [0.722, 0.692, 0.800]], [0.131, [0.722, 0.692, 0.800]], [0.133, [0.729, 0.689, 0.809]], [0.135, [0.729, 0.689, 0.809]], [0.137, [0.735, 0.687, 0.818]], [0.139, [0.735, 0.687, 0.818]], [0.141, [0.742, 0.684, 0.827]], [0.143, [0.742, 0.684, 0.827]], [0.145, [0.749, 0.683, 0.827]], [0.147, [0.749, 0.683, 0.827]], [0.149, [0.756, 0.685, 0.818]], [0.151, [0.756, 0.685, 0.818]], [0.153, [0.763, 0.687, 0.810]], [0.155, [0.763, 0.687, 0.810]], [0.157, [0.769, 0.689, 0.801]], [0.159, [0.769, 0.689, 0.801]], [0.160, [0.776, 0.691, 0.793]], [0.162, [0.776, 0.691, 0.793]], [0.164, [0.783, 0.693, 0.785]], [0.166, [0.783, 0.693, 0.785]], [0.168, [0.790, 0.695, 0.776]], [0.170, [0.790, 0.695, 0.776]], [0.172, [0.796, 0.697, 0.768]], [0.174, [0.796, 0.697, 0.768]], [0.176, [0.803, 0.699, 0.759]], [0.178, [0.803, 0.699, 0.759]], [0.180, [0.810, 0.701, 0.751]], [0.182, [0.810, 0.701, 0.751]], [0.184, [0.817, 0.703, 0.743]], [0.186, [0.817, 0.703, 0.743]], [0.188, [0.824, 0.705, 0.734]], [0.190, [0.824, 0.705, 0.734]], [0.192, [0.830, 0.707, 0.726]], [0.194, [0.830, 0.707, 0.726]], [0.196, [0.837, 0.709, 0.717]], [0.198, [0.837, 0.709, 0.717]], [0.200, [0.844, 0.711, 0.709]], [0.202, [0.844, 0.711, 0.709]], [0.204, [0.851, 0.713, 0.701]], [0.205, [0.851, 0.713, 0.701]], [0.207, [0.857, 0.714, 0.692]], [0.209, [0.857, 0.714, 0.692]], [0.211, [0.864, 0.716, 0.684]], [0.213, [0.864, 0.716, 0.684]], [0.215, [0.871, 0.718, 0.675]], [0.217, [0.871, 0.718, 0.675]], [0.219, [0.878, 0.720, 0.667]], [0.221, [0.878, 0.720, 0.667]], [0.223, [0.885, 0.722, 0.659]], [0.225, [0.885, 0.722, 0.659]], [0.227, [0.891, 0.724, 0.650]], [0.229, [0.891, 0.724, 0.650]], [0.231, [0.898, 0.726, 0.642]], [0.233, [0.898, 0.726, 0.642]], [0.235, [0.905, 0.728, 0.633]], [0.237, [0.905, 0.728, 0.633]], [0.239, [0.912, 0.730, 0.625]], [0.241, [0.912, 0.730, 0.625]], [0.243, [0.919, 0.732, 0.617]], [0.245, [0.919, 0.732, 0.617]], [0.247, [0.925, 0.734, 0.608]], [0.249, [0.925, 0.734, 0.608]], [0.250, [0.932, 0.736, 0.600]], [0.252, [0.932, 0.736, 0.600]], [0.254, [0.939, 0.738, 0.591]], [0.256, [0.939, 0.738, 0.591]], [0.258, [0.946, 0.740, 0.583]], [0.260, [0.946, 0.740, 0.583]], [0.262, [0.952, 0.742, 0.575]], [0.264, [0.952, 0.742, 0.575]], [0.266, [0.959, 0.744, 0.566]], [0.268, [0.959, 0.744, 0.566]], [0.270, [0.966, 0.745, 0.558]], [0.272, [0.966, 0.745, 0.558]], [0.274, [0.973, 0.747, 0.549]], [0.276, [0.973, 0.747, 0.549]], [0.278, [0.980, 0.749, 0.541]], [0.280, [0.980, 0.749, 0.541]], [0.282, [0.986, 0.751, 0.533]], [0.284, [0.986, 0.751, 0.533]], [0.286, [0.992, 0.754, 0.526]], [0.288, [0.992, 0.754, 0.526]], [0.290, [0.992, 0.761, 0.528]], [0.292, [0.992, 0.761, 0.528]], [0.294, [0.993, 0.767, 0.530]], [0.295, [0.993, 0.767, 0.530]], [0.297, [0.993, 0.774, 0.532]], [0.299, [0.993, 0.774, 0.532]], [0.301, [0.993, 0.781, 0.534]], [0.303, [0.993, 0.781, 0.534]], [0.305, [0.993, 0.788, 0.536]], [0.307, [0.993, 0.788, 0.536]], [0.309, [0.993, 0.795, 0.538]], [0.311, [0.993, 0.795, 0.538]], [0.313, [0.994, 0.801, 0.540]], [0.315, [0.994, 0.801, 0.540]], [0.317, [0.994, 0.808, 0.542]], [0.319, [0.994, 0.808, 0.542]], [0.321, [0.994, 0.815, 0.544]], [0.323, [0.994, 0.815, 0.544]], [0.325, [0.994, 0.822, 0.546]], [0.327, [0.994, 0.822, 0.546]], [0.329, [0.995, 0.829, 0.548]], [0.331, [0.995, 0.829, 0.548]], [0.333, [0.995, 0.835, 0.550]], [0.335, [0.995, 0.835, 0.550]], [0.337, [0.995, 0.842, 0.552]], [0.339, [0.995, 0.842, 0.552]], [0.341, [0.995, 0.849, 0.554]], [0.342, [0.995, 0.849, 0.554]], [0.344, [0.995, 0.856, 0.556]], [0.346, [0.995, 0.856, 0.556]], [0.348, [0.996, 0.862, 0.559]], [0.350, [0.996, 0.862, 0.559]], [0.352, [0.996, 0.869, 0.561]], [0.354, [0.996, 0.869, 0.561]], [0.356, [0.996, 0.876, 0.563]], [0.358, [0.996, 0.876, 0.563]], [0.360, [0.996, 0.883, 0.565]], [0.362, [0.996, 0.883, 0.565]], [0.364, [0.996, 0.890, 0.567]], [0.366, [0.996, 0.890, 0.567]], [0.368, [0.997, 0.896, 0.569]], [0.370, [0.997, 0.896, 0.569]], [0.372, [0.997, 0.903, 0.571]], [0.374, [0.997, 0.903, 0.571]], [0.376, [0.997, 0.910, 0.573]], [0.378, [0.997, 0.910, 0.573]], [0.380, [0.997, 0.917, 0.575]], [0.382, [0.997, 0.917, 0.575]], [0.384, [0.998, 0.923, 0.577]], [0.386, [0.998, 0.923, 0.577]], [0.387, [0.998, 0.930, 0.579]], [0.389, [0.998, 0.930, 0.579]], [0.391, [0.998, 0.937, 0.581]], [0.393, [0.998, 0.937, 0.581]], [0.395, [0.998, 0.944, 0.583]], [0.397, [0.998, 0.944, 0.583]], [0.399, [0.998, 0.951, 0.585]], [0.401, [0.998, 0.951, 0.585]], [0.403, [0.999, 0.957, 0.587]], [0.405, [0.999, 0.957, 0.587]], [0.407, [0.999, 0.964, 0.589]], [0.409, [0.999, 0.964, 0.589]], [0.411, [0.999, 0.971, 0.591]], [0.413, [0.999, 0.971, 0.591]], [0.415, [0.999, 0.978, 0.593]], [0.417, [0.999, 0.978, 0.593]], [0.419, [1.000, 0.984, 0.595]], [0.421, [1.000, 0.984, 0.595]], [0.423, [1.000, 0.991, 0.597]], [0.425, [1.000, 0.991, 0.597]], [0.427, [1.000, 0.998, 0.599]], [0.429, [1.000, 0.998, 0.599]], [0.431, [0.985, 0.989, 0.602]], [0.432, [0.985, 0.989, 0.602]], [0.434, [0.963, 0.973, 0.604]], [0.436, [0.963, 0.973, 0.604]], [0.438, [0.942, 0.957, 0.607]], [0.440, [0.942, 0.957, 0.607]], [0.442, [0.920, 0.941, 0.609]], [0.444, [0.920, 0.941, 0.609]], [0.446, [0.899, 0.925, 0.612]], [0.448, [0.899, 0.925, 0.612]], [0.450, [0.878, 0.910, 0.614]], [0.452, [0.878, 0.910, 0.614]], [0.454, [0.856, 0.894, 0.617]], [0.456, [0.856, 0.894, 0.617]], [0.458, [0.835, 0.878, 0.619]], [0.460, [0.835, 0.878, 0.619]], [0.462, [0.813, 0.862, 0.622]], [0.464, [0.813, 0.862, 0.622]], [0.466, [0.792, 0.846, 0.624]], [0.468, [0.792, 0.846, 0.624]], [0.470, [0.770, 0.830, 0.627]], [0.472, [0.770, 0.830, 0.627]], [0.474, [0.749, 0.815, 0.629]], [0.476, [0.749, 0.815, 0.629]], [0.477, [0.728, 0.799, 0.631]], [0.479, [0.728, 0.799, 0.631]], [0.481, [0.706, 0.783, 0.634]], [0.483, [0.706, 0.783, 0.634]], [0.485, [0.685, 0.767, 0.636]], [0.487, [0.685, 0.767, 0.636]], [0.489, [0.663, 0.751, 0.639]], [0.491, [0.663, 0.751, 0.639]], [0.493, [0.642, 0.736, 0.641]], [0.495, [0.642, 0.736, 0.641]], [0.497, [0.621, 0.720, 0.644]], [0.499, [0.621, 0.720, 0.644]], [0.501, [0.599, 0.704, 0.646]], [0.503, [0.599, 0.704, 0.646]], [0.505, [0.578, 0.688, 0.649]], [0.507, [0.578, 0.688, 0.649]], [0.509, [0.556, 0.672, 0.651]], [0.511, [0.556, 0.672, 0.651]], [0.513, [0.535, 0.656, 0.654]], [0.515, [0.535, 0.656, 0.654]], [0.517, [0.513, 0.641, 0.656]], [0.519, [0.513, 0.641, 0.656]], [0.521, [0.492, 0.625, 0.659]], [0.523, [0.492, 0.625, 0.659]], [0.524, [0.471, 0.609, 0.661]], [0.526, [0.471, 0.609, 0.661]], [0.528, [0.449, 0.593, 0.664]], [0.530, [0.449, 0.593, 0.664]], [0.532, [0.428, 0.577, 0.666]], [0.534, [0.428, 0.577, 0.666]], [0.536, [0.406, 0.561, 0.669]], [0.538, [0.406, 0.561, 0.669]], [0.540, [0.385, 0.546, 0.671]], [0.542, [0.385, 0.546, 0.671]], [0.544, [0.363, 0.530, 0.674]], [0.546, [0.363, 0.530, 0.674]], [0.548, [0.342, 0.514, 0.676]], [0.550, [0.342, 0.514, 0.676]], [0.552, [0.321, 0.498, 0.679]], [0.554, [0.321, 0.498, 0.679]], [0.556, [0.299, 0.482, 0.681]], [0.558, [0.299, 0.482, 0.681]], [0.560, [0.278, 0.466, 0.683]], [0.562, [0.278, 0.466, 0.683]], [0.564, [0.256, 0.451, 0.686]], [0.566, [0.256, 0.451, 0.686]], [0.568, [0.235, 0.435, 0.688]], [0.569, [0.235, 0.435, 0.688]], [0.571, [0.225, 0.420, 0.689]], [0.573, [0.225, 0.420, 0.689]], [0.575, [0.245, 0.409, 0.683]], [0.577, [0.245, 0.409, 0.683]], [0.579, [0.265, 0.397, 0.678]], [0.581, [0.265, 0.397, 0.678]], [0.583, [0.285, 0.386, 0.673]], [0.585, [0.285, 0.386, 0.673]], [0.587, [0.304, 0.375, 0.668]], [0.589, [0.304, 0.375, 0.668]], [0.591, [0.324, 0.363, 0.662]], [0.593, [0.324, 0.363, 0.662]], [0.595, [0.344, 0.352, 0.657]], [0.597, [0.344, 0.352, 0.657]], [0.599, [0.364, 0.340, 0.652]], [0.601, [0.364, 0.340, 0.652]], [0.603, [0.384, 0.329, 0.646]], [0.605, [0.384, 0.329, 0.646]], [0.607, [0.404, 0.318, 0.641]], [0.609, [0.404, 0.318, 0.641]], [0.611, [0.423, 0.306, 0.636]], [0.613, [0.423, 0.306, 0.636]], [0.614, [0.443, 0.295, 0.631]], [0.616, [0.443, 0.295, 0.631]], [0.618, [0.463, 0.283, 0.625]], [0.620, [0.463, 0.283, 0.625]], [0.622, [0.483, 0.272, 0.620]], [0.624, [0.483, 0.272, 0.620]], [0.626, [0.503, 0.261, 0.615]], [0.628, [0.503, 0.261, 0.615]], [0.630, [0.522, 0.249, 0.610]], [0.632, [0.522, 0.249, 0.610]], [0.634, [0.542, 0.238, 0.604]], [0.636, [0.542, 0.238, 0.604]], [0.638, [0.562, 0.226, 0.599]], [0.640, [0.562, 0.226, 0.599]], [0.642, [0.582, 0.215, 0.594]], [0.644, [0.582, 0.215, 0.594]], [0.646, [0.602, 0.203, 0.588]], [0.648, [0.602, 0.203, 0.588]], [0.650, [0.621, 0.192, 0.583]], [0.652, [0.621, 0.192, 0.583]], [0.654, [0.641, 0.181, 0.578]], [0.656, [0.641, 0.181, 0.578]], [0.658, [0.661, 0.169, 0.573]], [0.659, [0.661, 0.169, 0.573]], [0.661, [0.681, 0.158, 0.567]], [0.663, [0.681, 0.158, 0.567]], [0.665, [0.701, 0.146, 0.562]], [0.667, [0.701, 0.146, 0.562]], [0.669, [0.720, 0.135, 0.557]], [0.671, [0.720, 0.135, 0.557]], [0.673, [0.740, 0.124, 0.552]], [0.675, [0.740, 0.124, 0.552]], [0.677, [0.760, 0.112, 0.546]], [0.679, [0.760, 0.112, 0.546]], [0.681, [0.780, 0.101, 0.541]], [0.683, [0.780, 0.101, 0.541]], [0.685, [0.800, 0.089, 0.536]], [0.687, [0.800, 0.089, 0.536]], [0.689, [0.820, 0.078, 0.530]], [0.691, [0.820, 0.078, 0.530]], [0.693, [0.839, 0.067, 0.525]], [0.695, [0.839, 0.067, 0.525]], [0.697, [0.859, 0.055, 0.520]], [0.699, [0.859, 0.055, 0.520]], [0.701, [0.879, 0.044, 0.515]], [0.703, [0.879, 0.044, 0.515]], [0.705, [0.899, 0.032, 0.509]], [0.706, [0.899, 0.032, 0.509]], [0.708, [0.919, 0.021, 0.504]], [0.710, [0.919, 0.021, 0.504]], [0.712, [0.938, 0.009, 0.499]], [0.714, [0.938, 0.009, 0.499]], [0.716, [0.937, 0.016, 0.488]], [0.718, [0.937, 0.016, 0.488]], [0.720, [0.931, 0.026, 0.477]], [0.722, [0.931, 0.026, 0.477]], [0.724, [0.926, 0.035, 0.466]], [0.726, [0.926, 0.035, 0.466]], [0.728, [0.921, 0.045, 0.455]], [0.730, [0.921, 0.045, 0.455]], [0.732, [0.916, 0.054, 0.444]], [0.734, [0.916, 0.054, 0.444]], [0.736, [0.910, 0.064, 0.432]], [0.738, [0.910, 0.064, 0.432]], [0.740, [0.905, 0.074, 0.421]], [0.742, [0.905, 0.074, 0.421]], [0.744, [0.900, 0.083, 0.410]], [0.746, [0.900, 0.083, 0.410]], [0.748, [0.894, 0.093, 0.399]], [0.750, [0.894, 0.093, 0.399]], [0.751, [0.889, 0.102, 0.388]], [0.753, [0.889, 0.102, 0.388]], [0.755, [0.884, 0.112, 0.376]], [0.757, [0.884, 0.112, 0.376]], [0.759, [0.879, 0.121, 0.365]], [0.761, [0.879, 0.121, 0.365]], [0.763, [0.873, 0.131, 0.354]], [0.765, [0.873, 0.131, 0.354]], [0.767, [0.868, 0.141, 0.343]], [0.769, [0.868, 0.141, 0.343]], [0.771, [0.863, 0.150, 0.332]], [0.773, [0.863, 0.150, 0.332]], [0.775, [0.858, 0.160, 0.321]], [0.777, [0.858, 0.160, 0.321]], [0.779, [0.852, 0.169, 0.309]], [0.781, [0.852, 0.169, 0.309]], [0.783, [0.847, 0.179, 0.298]], [0.785, [0.847, 0.179, 0.298]], [0.787, [0.842, 0.189, 0.287]], [0.789, [0.842, 0.189, 0.287]], [0.791, [0.836, 0.198, 0.276]], [0.793, [0.836, 0.198, 0.276]], [0.795, [0.831, 0.208, 0.265]], [0.796, [0.831, 0.208, 0.265]], [0.798, [0.826, 0.217, 0.253]], [0.800, [0.826, 0.217, 0.253]], [0.802, [0.821, 0.227, 0.242]], [0.804, [0.821, 0.227, 0.242]], [0.806, [0.815, 0.236, 0.231]], [0.808, [0.815, 0.236, 0.231]], [0.810, [0.810, 0.246, 0.220]], [0.812, [0.810, 0.246, 0.220]], [0.814, [0.805, 0.256, 0.209]], [0.816, [0.805, 0.256, 0.209]], [0.818, [0.800, 0.265, 0.197]], [0.820, [0.800, 0.265, 0.197]], [0.822, [0.794, 0.275, 0.186]], [0.824, [0.794, 0.275, 0.186]], [0.826, [0.789, 0.284, 0.175]], [0.828, [0.789, 0.284, 0.175]], [0.830, [0.784, 0.294, 0.164]], [0.832, [0.784, 0.294, 0.164]], [0.834, [0.778, 0.303, 0.153]], [0.836, [0.778, 0.303, 0.153]], [0.838, [0.773, 0.313, 0.141]], [0.840, [0.773, 0.313, 0.141]], [0.841, [0.768, 0.323, 0.130]], [0.843, [0.768, 0.323, 0.130]], [0.845, [0.763, 0.332, 0.119]], [0.847, [0.763, 0.332, 0.119]], [0.849, [0.757, 0.342, 0.108]], [0.851, [0.757, 0.342, 0.108]], [0.853, [0.752, 0.351, 0.097]], [0.855, [0.752, 0.351, 0.097]], [0.857, [0.745, 0.357, 0.094]], [0.859, [0.745, 0.357, 0.094]], [0.861, [0.735, 0.359, 0.102]], [0.863, [0.735, 0.359, 0.102]], [0.865, [0.726, 0.360, 0.111]], [0.867, [0.726, 0.360, 0.111]], [0.869, [0.716, 0.361, 0.119]], [0.871, [0.716, 0.361, 0.119]], [0.873, [0.707, 0.362, 0.128]], [0.875, [0.707, 0.362, 0.128]], [0.877, [0.697, 0.363, 0.136]], [0.879, [0.697, 0.363, 0.136]], [0.881, [0.687, 0.364, 0.145]], [0.883, [0.687, 0.364, 0.145]], [0.885, [0.678, 0.366, 0.153]], [0.886, [0.678, 0.366, 0.153]], [0.888, [0.668, 0.367, 0.162]], [0.890, [0.668, 0.367, 0.162]], [0.892, [0.659, 0.368, 0.170]], [0.894, [0.659, 0.368, 0.170]], [0.896, [0.649, 0.369, 0.179]], [0.898, [0.649, 0.369, 0.179]], [0.900, [0.640, 0.370, 0.187]], [0.902, [0.640, 0.370, 0.187]], [0.904, [0.630, 0.372, 0.196]], [0.906, [0.630, 0.372, 0.196]], [0.908, [0.620, 0.373, 0.204]], [0.910, [0.620, 0.373, 0.204]], [0.912, [0.611, 0.374, 0.213]], [0.914, [0.611, 0.374, 0.213]], [0.916, [0.601, 0.375, 0.221]], [0.918, [0.601, 0.375, 0.221]], [0.920, [0.592, 0.376, 0.230]], [0.922, [0.592, 0.376, 0.230]], [0.924, [0.582, 0.378, 0.238]], [0.926, [0.582, 0.378, 0.238]], [0.928, [0.572, 0.379, 0.247]], [0.930, [0.572, 0.379, 0.247]], [0.932, [0.563, 0.380, 0.255]], [0.933, [0.563, 0.380, 0.255]], [0.935, [0.553, 0.381, 0.264]], [0.937, [0.553, 0.381, 0.264]], [0.939, [0.544, 0.382, 0.272]], [0.941, [0.544, 0.382, 0.272]], [0.943, [0.534, 0.383, 0.281]], [0.945, [0.534, 0.383, 0.281]], [0.947, [0.525, 0.385, 0.289]], [0.949, [0.525, 0.385, 0.289]], [0.951, [0.515, 0.386, 0.298]], [0.953, [0.515, 0.386, 0.298]], [0.955, [0.505, 0.387, 0.306]], [0.957, [0.505, 0.387, 0.306]], [0.959, [0.496, 0.388, 0.315]], [0.961, [0.496, 0.388, 0.315]], [0.963, [0.486, 0.389, 0.323]], [0.965, [0.486, 0.389, 0.323]], [0.967, [0.477, 0.391, 0.332]], [0.969, [0.477, 0.391, 0.332]], [0.971, [0.467, 0.392, 0.340]], [0.973, [0.467, 0.392, 0.340]], [0.975, [0.457, 0.393, 0.349]], [0.977, [0.457, 0.393, 0.349]], [0.978, [0.448, 0.394, 0.357]], [0.980, [0.448, 0.394, 0.357]], [0.982, [0.438, 0.395, 0.366]], [0.984, [0.438, 0.395, 0.366]], [0.986, [0.429, 0.396, 0.374]], [0.988, [0.429, 0.396, 0.374]], [0.990, [0.419, 0.398, 0.383]], [0.992, [0.419, 0.398, 0.383]], [0.994, [0.410, 0.399, 0.391]], [0.996, [0.410, 0.399, 0.391]], [0.998, [0.400, 0.400, 0.400]], [1.000, [0.400, 0.400, 0.400]]]; +var Dark2 = [[0.000, [0.106, 0.620, 0.467]], [0.002, [0.106, 0.620, 0.467]], [0.004, [0.126, 0.613, 0.454]], [0.006, [0.126, 0.613, 0.454]], [0.008, [0.147, 0.606, 0.441]], [0.010, [0.147, 0.606, 0.441]], [0.012, [0.167, 0.599, 0.429]], [0.014, [0.167, 0.599, 0.429]], [0.016, [0.188, 0.592, 0.416]], [0.018, [0.188, 0.592, 0.416]], [0.020, [0.208, 0.586, 0.404]], [0.022, [0.208, 0.586, 0.404]], [0.023, [0.229, 0.579, 0.391]], [0.025, [0.229, 0.579, 0.391]], [0.027, [0.249, 0.572, 0.379]], [0.029, [0.249, 0.572, 0.379]], [0.031, [0.270, 0.565, 0.366]], [0.033, [0.270, 0.565, 0.366]], [0.035, [0.290, 0.559, 0.353]], [0.037, [0.290, 0.559, 0.353]], [0.039, [0.310, 0.552, 0.341]], [0.041, [0.310, 0.552, 0.341]], [0.043, [0.331, 0.545, 0.328]], [0.045, [0.331, 0.545, 0.328]], [0.047, [0.351, 0.538, 0.316]], [0.049, [0.351, 0.538, 0.316]], [0.051, [0.372, 0.531, 0.303]], [0.053, [0.372, 0.531, 0.303]], [0.055, [0.392, 0.525, 0.290]], [0.057, [0.392, 0.525, 0.290]], [0.059, [0.413, 0.518, 0.278]], [0.061, [0.413, 0.518, 0.278]], [0.063, [0.433, 0.511, 0.265]], [0.065, [0.433, 0.511, 0.265]], [0.067, [0.454, 0.504, 0.253]], [0.068, [0.454, 0.504, 0.253]], [0.070, [0.474, 0.498, 0.240]], [0.072, [0.474, 0.498, 0.240]], [0.074, [0.495, 0.491, 0.227]], [0.076, [0.495, 0.491, 0.227]], [0.078, [0.515, 0.484, 0.215]], [0.080, [0.515, 0.484, 0.215]], [0.082, [0.535, 0.477, 0.202]], [0.084, [0.535, 0.477, 0.202]], [0.086, [0.556, 0.470, 0.190]], [0.088, [0.556, 0.470, 0.190]], [0.090, [0.576, 0.464, 0.177]], [0.092, [0.576, 0.464, 0.177]], [0.094, [0.597, 0.457, 0.164]], [0.096, [0.597, 0.457, 0.164]], [0.098, [0.617, 0.450, 0.152]], [0.100, [0.617, 0.450, 0.152]], [0.102, [0.638, 0.443, 0.139]], [0.104, [0.638, 0.443, 0.139]], [0.106, [0.658, 0.436, 0.127]], [0.108, [0.658, 0.436, 0.127]], [0.110, [0.679, 0.430, 0.114]], [0.112, [0.679, 0.430, 0.114]], [0.114, [0.699, 0.423, 0.101]], [0.115, [0.699, 0.423, 0.101]], [0.117, [0.719, 0.416, 0.089]], [0.119, [0.719, 0.416, 0.089]], [0.121, [0.740, 0.409, 0.076]], [0.123, [0.740, 0.409, 0.076]], [0.125, [0.760, 0.403, 0.064]], [0.127, [0.760, 0.403, 0.064]], [0.129, [0.781, 0.396, 0.051]], [0.131, [0.781, 0.396, 0.051]], [0.133, [0.801, 0.389, 0.038]], [0.135, [0.801, 0.389, 0.038]], [0.137, [0.822, 0.382, 0.026]], [0.139, [0.822, 0.382, 0.026]], [0.141, [0.842, 0.375, 0.013]], [0.143, [0.842, 0.375, 0.013]], [0.145, [0.845, 0.374, 0.019]], [0.147, [0.845, 0.374, 0.019]], [0.149, [0.834, 0.375, 0.038]], [0.151, [0.834, 0.375, 0.038]], [0.153, [0.823, 0.377, 0.057]], [0.155, [0.823, 0.377, 0.057]], [0.157, [0.813, 0.379, 0.076]], [0.159, [0.813, 0.379, 0.076]], [0.160, [0.802, 0.381, 0.095]], [0.162, [0.802, 0.381, 0.095]], [0.164, [0.791, 0.383, 0.114]], [0.166, [0.791, 0.383, 0.114]], [0.168, [0.780, 0.385, 0.133]], [0.170, [0.780, 0.385, 0.133]], [0.172, [0.769, 0.386, 0.152]], [0.174, [0.769, 0.386, 0.152]], [0.176, [0.759, 0.388, 0.171]], [0.178, [0.759, 0.388, 0.171]], [0.180, [0.748, 0.390, 0.190]], [0.182, [0.748, 0.390, 0.190]], [0.184, [0.737, 0.392, 0.209]], [0.186, [0.737, 0.392, 0.209]], [0.188, [0.726, 0.394, 0.228]], [0.190, [0.726, 0.394, 0.228]], [0.192, [0.716, 0.396, 0.247]], [0.194, [0.716, 0.396, 0.247]], [0.196, [0.705, 0.397, 0.266]], [0.198, [0.705, 0.397, 0.266]], [0.200, [0.694, 0.399, 0.285]], [0.202, [0.694, 0.399, 0.285]], [0.204, [0.683, 0.401, 0.305]], [0.205, [0.683, 0.401, 0.305]], [0.207, [0.673, 0.403, 0.324]], [0.209, [0.673, 0.403, 0.324]], [0.211, [0.662, 0.405, 0.343]], [0.213, [0.662, 0.405, 0.343]], [0.215, [0.651, 0.407, 0.362]], [0.217, [0.651, 0.407, 0.362]], [0.219, [0.640, 0.408, 0.381]], [0.221, [0.640, 0.408, 0.381]], [0.223, [0.630, 0.410, 0.400]], [0.225, [0.630, 0.410, 0.400]], [0.227, [0.619, 0.412, 0.419]], [0.229, [0.619, 0.412, 0.419]], [0.231, [0.608, 0.414, 0.438]], [0.233, [0.608, 0.414, 0.438]], [0.235, [0.597, 0.416, 0.457]], [0.237, [0.597, 0.416, 0.457]], [0.239, [0.586, 0.418, 0.476]], [0.241, [0.586, 0.418, 0.476]], [0.243, [0.576, 0.419, 0.495]], [0.245, [0.576, 0.419, 0.495]], [0.247, [0.565, 0.421, 0.514]], [0.249, [0.565, 0.421, 0.514]], [0.250, [0.554, 0.423, 0.533]], [0.252, [0.554, 0.423, 0.533]], [0.254, [0.543, 0.425, 0.552]], [0.256, [0.543, 0.425, 0.552]], [0.258, [0.533, 0.427, 0.571]], [0.260, [0.533, 0.427, 0.571]], [0.262, [0.522, 0.428, 0.590]], [0.264, [0.522, 0.428, 0.590]], [0.266, [0.511, 0.430, 0.609]], [0.268, [0.511, 0.430, 0.609]], [0.270, [0.500, 0.432, 0.628]], [0.272, [0.500, 0.432, 0.628]], [0.274, [0.490, 0.434, 0.648]], [0.276, [0.490, 0.434, 0.648]], [0.278, [0.479, 0.436, 0.667]], [0.280, [0.479, 0.436, 0.667]], [0.282, [0.468, 0.438, 0.686]], [0.284, [0.468, 0.438, 0.686]], [0.286, [0.461, 0.438, 0.701]], [0.288, [0.461, 0.438, 0.701]], [0.290, [0.473, 0.430, 0.697]], [0.292, [0.473, 0.430, 0.697]], [0.294, [0.485, 0.423, 0.693]], [0.295, [0.485, 0.423, 0.693]], [0.297, [0.497, 0.415, 0.688]], [0.299, [0.497, 0.415, 0.688]], [0.301, [0.510, 0.408, 0.684]], [0.303, [0.510, 0.408, 0.684]], [0.305, [0.522, 0.400, 0.679]], [0.307, [0.522, 0.400, 0.679]], [0.309, [0.534, 0.392, 0.675]], [0.311, [0.534, 0.392, 0.675]], [0.313, [0.546, 0.385, 0.670]], [0.315, [0.546, 0.385, 0.670]], [0.317, [0.559, 0.377, 0.666]], [0.319, [0.559, 0.377, 0.666]], [0.321, [0.571, 0.369, 0.662]], [0.323, [0.571, 0.369, 0.662]], [0.325, [0.583, 0.362, 0.657]], [0.327, [0.583, 0.362, 0.657]], [0.329, [0.596, 0.354, 0.653]], [0.331, [0.596, 0.354, 0.653]], [0.333, [0.608, 0.346, 0.648]], [0.335, [0.608, 0.346, 0.648]], [0.337, [0.620, 0.339, 0.644]], [0.339, [0.620, 0.339, 0.644]], [0.341, [0.632, 0.331, 0.640]], [0.342, [0.632, 0.331, 0.640]], [0.344, [0.645, 0.323, 0.635]], [0.346, [0.645, 0.323, 0.635]], [0.348, [0.657, 0.316, 0.631]], [0.350, [0.657, 0.316, 0.631]], [0.352, [0.669, 0.308, 0.626]], [0.354, [0.669, 0.308, 0.626]], [0.356, [0.681, 0.301, 0.622]], [0.358, [0.681, 0.301, 0.622]], [0.360, [0.694, 0.293, 0.617]], [0.362, [0.694, 0.293, 0.617]], [0.364, [0.706, 0.285, 0.613]], [0.366, [0.706, 0.285, 0.613]], [0.368, [0.718, 0.278, 0.609]], [0.370, [0.718, 0.278, 0.609]], [0.372, [0.731, 0.270, 0.604]], [0.374, [0.731, 0.270, 0.604]], [0.376, [0.743, 0.262, 0.600]], [0.378, [0.743, 0.262, 0.600]], [0.380, [0.755, 0.255, 0.595]], [0.382, [0.755, 0.255, 0.595]], [0.384, [0.767, 0.247, 0.591]], [0.386, [0.767, 0.247, 0.591]], [0.387, [0.780, 0.239, 0.587]], [0.389, [0.780, 0.239, 0.587]], [0.391, [0.792, 0.232, 0.582]], [0.393, [0.792, 0.232, 0.582]], [0.395, [0.804, 0.224, 0.578]], [0.397, [0.804, 0.224, 0.578]], [0.399, [0.816, 0.216, 0.573]], [0.401, [0.816, 0.216, 0.573]], [0.403, [0.829, 0.209, 0.569]], [0.405, [0.829, 0.209, 0.569]], [0.407, [0.841, 0.201, 0.565]], [0.409, [0.841, 0.201, 0.565]], [0.411, [0.853, 0.194, 0.560]], [0.413, [0.853, 0.194, 0.560]], [0.415, [0.866, 0.186, 0.556]], [0.417, [0.866, 0.186, 0.556]], [0.419, [0.878, 0.178, 0.551]], [0.421, [0.878, 0.178, 0.551]], [0.423, [0.890, 0.171, 0.547]], [0.425, [0.890, 0.171, 0.547]], [0.427, [0.902, 0.163, 0.542]], [0.429, [0.902, 0.163, 0.542]], [0.431, [0.896, 0.170, 0.533]], [0.432, [0.896, 0.170, 0.533]], [0.434, [0.882, 0.184, 0.521]], [0.436, [0.882, 0.184, 0.521]], [0.438, [0.868, 0.197, 0.510]], [0.440, [0.868, 0.197, 0.510]], [0.442, [0.854, 0.211, 0.498]], [0.444, [0.854, 0.211, 0.498]], [0.446, [0.840, 0.224, 0.486]], [0.448, [0.840, 0.224, 0.486]], [0.450, [0.827, 0.238, 0.475]], [0.452, [0.827, 0.238, 0.475]], [0.454, [0.813, 0.251, 0.463]], [0.456, [0.813, 0.251, 0.463]], [0.458, [0.799, 0.265, 0.451]], [0.460, [0.799, 0.265, 0.451]], [0.462, [0.785, 0.278, 0.440]], [0.464, [0.785, 0.278, 0.440]], [0.466, [0.771, 0.292, 0.428]], [0.468, [0.771, 0.292, 0.428]], [0.470, [0.757, 0.305, 0.417]], [0.472, [0.757, 0.305, 0.417]], [0.474, [0.743, 0.318, 0.405]], [0.476, [0.743, 0.318, 0.405]], [0.477, [0.729, 0.332, 0.393]], [0.479, [0.729, 0.332, 0.393]], [0.481, [0.715, 0.345, 0.382]], [0.483, [0.715, 0.345, 0.382]], [0.485, [0.702, 0.359, 0.370]], [0.487, [0.702, 0.359, 0.370]], [0.489, [0.688, 0.372, 0.358]], [0.491, [0.688, 0.372, 0.358]], [0.493, [0.674, 0.386, 0.347]], [0.495, [0.674, 0.386, 0.347]], [0.497, [0.660, 0.399, 0.335]], [0.499, [0.660, 0.399, 0.335]], [0.501, [0.646, 0.413, 0.324]], [0.503, [0.646, 0.413, 0.324]], [0.505, [0.632, 0.426, 0.312]], [0.507, [0.632, 0.426, 0.312]], [0.509, [0.618, 0.440, 0.300]], [0.511, [0.618, 0.440, 0.300]], [0.513, [0.604, 0.453, 0.289]], [0.515, [0.604, 0.453, 0.289]], [0.517, [0.590, 0.466, 0.277]], [0.519, [0.590, 0.466, 0.277]], [0.521, [0.577, 0.480, 0.265]], [0.523, [0.577, 0.480, 0.265]], [0.524, [0.563, 0.493, 0.254]], [0.526, [0.563, 0.493, 0.254]], [0.528, [0.549, 0.507, 0.242]], [0.530, [0.549, 0.507, 0.242]], [0.532, [0.535, 0.520, 0.231]], [0.534, [0.535, 0.520, 0.231]], [0.536, [0.521, 0.534, 0.219]], [0.538, [0.521, 0.534, 0.219]], [0.540, [0.507, 0.547, 0.207]], [0.542, [0.507, 0.547, 0.207]], [0.544, [0.493, 0.561, 0.196]], [0.546, [0.493, 0.561, 0.196]], [0.548, [0.479, 0.574, 0.184]], [0.550, [0.479, 0.574, 0.184]], [0.552, [0.465, 0.588, 0.172]], [0.554, [0.465, 0.588, 0.172]], [0.556, [0.452, 0.601, 0.161]], [0.558, [0.452, 0.601, 0.161]], [0.560, [0.438, 0.614, 0.149]], [0.562, [0.438, 0.614, 0.149]], [0.564, [0.424, 0.628, 0.138]], [0.566, [0.424, 0.628, 0.138]], [0.568, [0.410, 0.641, 0.126]], [0.569, [0.410, 0.641, 0.126]], [0.571, [0.404, 0.651, 0.117]], [0.573, [0.404, 0.651, 0.117]], [0.575, [0.418, 0.652, 0.114]], [0.577, [0.418, 0.652, 0.114]], [0.579, [0.431, 0.652, 0.111]], [0.581, [0.431, 0.652, 0.111]], [0.583, [0.445, 0.653, 0.108]], [0.585, [0.445, 0.653, 0.108]], [0.587, [0.459, 0.653, 0.105]], [0.589, [0.459, 0.653, 0.105]], [0.591, [0.473, 0.654, 0.102]], [0.593, [0.473, 0.654, 0.102]], [0.595, [0.487, 0.654, 0.099]], [0.597, [0.487, 0.654, 0.099]], [0.599, [0.500, 0.655, 0.096]], [0.601, [0.500, 0.655, 0.096]], [0.603, [0.514, 0.655, 0.093]], [0.605, [0.514, 0.655, 0.093]], [0.607, [0.528, 0.656, 0.090]], [0.609, [0.528, 0.656, 0.090]], [0.611, [0.542, 0.657, 0.087]], [0.613, [0.542, 0.657, 0.087]], [0.614, [0.556, 0.657, 0.084]], [0.616, [0.556, 0.657, 0.084]], [0.618, [0.569, 0.658, 0.081]], [0.620, [0.569, 0.658, 0.081]], [0.622, [0.583, 0.658, 0.078]], [0.624, [0.583, 0.658, 0.078]], [0.626, [0.597, 0.659, 0.075]], [0.628, [0.597, 0.659, 0.075]], [0.630, [0.611, 0.659, 0.072]], [0.632, [0.611, 0.659, 0.072]], [0.634, [0.624, 0.660, 0.069]], [0.636, [0.624, 0.660, 0.069]], [0.638, [0.638, 0.660, 0.066]], [0.640, [0.638, 0.660, 0.066]], [0.642, [0.652, 0.661, 0.063]], [0.644, [0.652, 0.661, 0.063]], [0.646, [0.666, 0.661, 0.060]], [0.648, [0.666, 0.661, 0.060]], [0.650, [0.680, 0.662, 0.057]], [0.652, [0.680, 0.662, 0.057]], [0.654, [0.693, 0.662, 0.053]], [0.656, [0.693, 0.662, 0.053]], [0.658, [0.707, 0.663, 0.050]], [0.659, [0.707, 0.663, 0.050]], [0.661, [0.721, 0.664, 0.047]], [0.663, [0.721, 0.664, 0.047]], [0.665, [0.735, 0.664, 0.044]], [0.667, [0.735, 0.664, 0.044]], [0.669, [0.748, 0.665, 0.041]], [0.671, [0.748, 0.665, 0.041]], [0.673, [0.762, 0.665, 0.038]], [0.675, [0.762, 0.665, 0.038]], [0.677, [0.776, 0.666, 0.035]], [0.679, [0.776, 0.666, 0.035]], [0.681, [0.790, 0.666, 0.032]], [0.683, [0.790, 0.666, 0.032]], [0.685, [0.804, 0.667, 0.029]], [0.687, [0.804, 0.667, 0.029]], [0.689, [0.817, 0.667, 0.026]], [0.691, [0.817, 0.667, 0.026]], [0.693, [0.831, 0.668, 0.023]], [0.695, [0.831, 0.668, 0.023]], [0.697, [0.845, 0.668, 0.020]], [0.699, [0.845, 0.668, 0.020]], [0.701, [0.859, 0.669, 0.017]], [0.703, [0.859, 0.669, 0.017]], [0.705, [0.872, 0.669, 0.014]], [0.706, [0.872, 0.669, 0.014]], [0.708, [0.886, 0.670, 0.011]], [0.710, [0.886, 0.670, 0.011]], [0.712, [0.900, 0.671, 0.008]], [0.714, [0.900, 0.671, 0.008]], [0.716, [0.896, 0.666, 0.010]], [0.718, [0.896, 0.666, 0.010]], [0.720, [0.889, 0.660, 0.013]], [0.722, [0.889, 0.660, 0.013]], [0.724, [0.882, 0.654, 0.016]], [0.726, [0.882, 0.654, 0.016]], [0.728, [0.875, 0.649, 0.019]], [0.730, [0.875, 0.649, 0.019]], [0.732, [0.868, 0.643, 0.022]], [0.734, [0.868, 0.643, 0.022]], [0.736, [0.862, 0.637, 0.025]], [0.738, [0.862, 0.637, 0.025]], [0.740, [0.855, 0.631, 0.028]], [0.742, [0.855, 0.631, 0.028]], [0.744, [0.848, 0.626, 0.031]], [0.746, [0.848, 0.626, 0.031]], [0.748, [0.841, 0.620, 0.034]], [0.750, [0.841, 0.620, 0.034]], [0.751, [0.834, 0.614, 0.036]], [0.753, [0.834, 0.614, 0.036]], [0.755, [0.827, 0.609, 0.039]], [0.757, [0.827, 0.609, 0.039]], [0.759, [0.820, 0.603, 0.042]], [0.761, [0.820, 0.603, 0.042]], [0.763, [0.813, 0.597, 0.045]], [0.765, [0.813, 0.597, 0.045]], [0.767, [0.806, 0.592, 0.048]], [0.769, [0.806, 0.592, 0.048]], [0.771, [0.800, 0.586, 0.051]], [0.773, [0.800, 0.586, 0.051]], [0.775, [0.793, 0.580, 0.054]], [0.777, [0.793, 0.580, 0.054]], [0.779, [0.786, 0.574, 0.057]], [0.781, [0.786, 0.574, 0.057]], [0.783, [0.779, 0.569, 0.060]], [0.785, [0.779, 0.569, 0.060]], [0.787, [0.772, 0.563, 0.063]], [0.789, [0.772, 0.563, 0.063]], [0.791, [0.765, 0.557, 0.066]], [0.793, [0.765, 0.557, 0.066]], [0.795, [0.758, 0.552, 0.068]], [0.796, [0.758, 0.552, 0.068]], [0.798, [0.751, 0.546, 0.071]], [0.800, [0.751, 0.546, 0.071]], [0.802, [0.744, 0.540, 0.074]], [0.804, [0.744, 0.540, 0.074]], [0.806, [0.738, 0.534, 0.077]], [0.808, [0.738, 0.534, 0.077]], [0.810, [0.731, 0.529, 0.080]], [0.812, [0.731, 0.529, 0.080]], [0.814, [0.724, 0.523, 0.083]], [0.816, [0.724, 0.523, 0.083]], [0.818, [0.717, 0.517, 0.086]], [0.820, [0.717, 0.517, 0.086]], [0.822, [0.710, 0.512, 0.089]], [0.824, [0.710, 0.512, 0.089]], [0.826, [0.703, 0.506, 0.092]], [0.828, [0.703, 0.506, 0.092]], [0.830, [0.696, 0.500, 0.095]], [0.832, [0.696, 0.500, 0.095]], [0.834, [0.689, 0.495, 0.098]], [0.836, [0.689, 0.495, 0.098]], [0.838, [0.682, 0.489, 0.100]], [0.840, [0.682, 0.489, 0.100]], [0.841, [0.676, 0.483, 0.103]], [0.843, [0.676, 0.483, 0.103]], [0.845, [0.669, 0.477, 0.106]], [0.847, [0.669, 0.477, 0.106]], [0.849, [0.662, 0.472, 0.109]], [0.851, [0.662, 0.472, 0.109]], [0.853, [0.655, 0.466, 0.112]], [0.855, [0.655, 0.466, 0.112]], [0.857, [0.648, 0.462, 0.117]], [0.859, [0.648, 0.462, 0.117]], [0.861, [0.641, 0.460, 0.125]], [0.863, [0.641, 0.460, 0.125]], [0.865, [0.634, 0.459, 0.133]], [0.867, [0.634, 0.459, 0.133]], [0.869, [0.627, 0.457, 0.141]], [0.871, [0.627, 0.457, 0.141]], [0.873, [0.620, 0.455, 0.149]], [0.875, [0.620, 0.455, 0.149]], [0.877, [0.614, 0.453, 0.156]], [0.879, [0.614, 0.453, 0.156]], [0.881, [0.607, 0.452, 0.164]], [0.883, [0.607, 0.452, 0.164]], [0.885, [0.600, 0.450, 0.172]], [0.886, [0.600, 0.450, 0.172]], [0.888, [0.593, 0.448, 0.180]], [0.890, [0.593, 0.448, 0.180]], [0.892, [0.586, 0.447, 0.188]], [0.894, [0.586, 0.447, 0.188]], [0.896, [0.579, 0.445, 0.196]], [0.898, [0.579, 0.445, 0.196]], [0.900, [0.572, 0.443, 0.204]], [0.902, [0.572, 0.443, 0.204]], [0.904, [0.565, 0.441, 0.211]], [0.906, [0.565, 0.441, 0.211]], [0.908, [0.558, 0.440, 0.219]], [0.910, [0.558, 0.440, 0.219]], [0.912, [0.552, 0.438, 0.227]], [0.914, [0.552, 0.438, 0.227]], [0.916, [0.545, 0.436, 0.235]], [0.918, [0.545, 0.436, 0.235]], [0.920, [0.538, 0.434, 0.243]], [0.922, [0.538, 0.434, 0.243]], [0.924, [0.531, 0.433, 0.251]], [0.926, [0.531, 0.433, 0.251]], [0.928, [0.524, 0.431, 0.259]], [0.930, [0.524, 0.431, 0.259]], [0.932, [0.517, 0.429, 0.266]], [0.933, [0.517, 0.429, 0.266]], [0.935, [0.510, 0.428, 0.274]], [0.937, [0.510, 0.428, 0.274]], [0.939, [0.503, 0.426, 0.282]], [0.941, [0.503, 0.426, 0.282]], [0.943, [0.496, 0.424, 0.290]], [0.945, [0.496, 0.424, 0.290]], [0.947, [0.490, 0.422, 0.298]], [0.949, [0.490, 0.422, 0.298]], [0.951, [0.483, 0.421, 0.306]], [0.953, [0.483, 0.421, 0.306]], [0.955, [0.476, 0.419, 0.314]], [0.957, [0.476, 0.419, 0.314]], [0.959, [0.469, 0.417, 0.321]], [0.961, [0.469, 0.417, 0.321]], [0.963, [0.462, 0.416, 0.329]], [0.965, [0.462, 0.416, 0.329]], [0.967, [0.455, 0.414, 0.337]], [0.969, [0.455, 0.414, 0.337]], [0.971, [0.448, 0.412, 0.345]], [0.973, [0.448, 0.412, 0.345]], [0.975, [0.441, 0.410, 0.353]], [0.977, [0.441, 0.410, 0.353]], [0.978, [0.434, 0.409, 0.361]], [0.980, [0.434, 0.409, 0.361]], [0.982, [0.428, 0.407, 0.369]], [0.984, [0.428, 0.407, 0.369]], [0.986, [0.421, 0.405, 0.376]], [0.988, [0.421, 0.405, 0.376]], [0.990, [0.414, 0.403, 0.384]], [0.992, [0.414, 0.403, 0.384]], [0.994, [0.407, 0.402, 0.392]], [0.996, [0.407, 0.402, 0.392]], [0.998, [0.400, 0.400, 0.400]], [1.000, [0.400, 0.400, 0.400]]]; +var Paired = [[0.000, [0.651, 0.808, 0.890]], [0.002, [0.651, 0.808, 0.890]], [0.004, [0.628, 0.793, 0.882]], [0.006, [0.628, 0.793, 0.882]], [0.008, [0.605, 0.779, 0.874]], [0.010, [0.605, 0.779, 0.874]], [0.012, [0.582, 0.764, 0.866]], [0.014, [0.582, 0.764, 0.866]], [0.016, [0.560, 0.750, 0.858]], [0.018, [0.560, 0.750, 0.858]], [0.020, [0.537, 0.735, 0.850]], [0.022, [0.537, 0.735, 0.850]], [0.023, [0.514, 0.721, 0.842]], [0.025, [0.514, 0.721, 0.842]], [0.027, [0.491, 0.706, 0.835]], [0.029, [0.491, 0.706, 0.835]], [0.031, [0.468, 0.691, 0.827]], [0.033, [0.468, 0.691, 0.827]], [0.035, [0.445, 0.677, 0.819]], [0.037, [0.445, 0.677, 0.819]], [0.039, [0.423, 0.662, 0.811]], [0.041, [0.423, 0.662, 0.811]], [0.043, [0.400, 0.648, 0.803]], [0.045, [0.400, 0.648, 0.803]], [0.047, [0.377, 0.633, 0.795]], [0.049, [0.377, 0.633, 0.795]], [0.051, [0.354, 0.619, 0.787]], [0.053, [0.354, 0.619, 0.787]], [0.055, [0.331, 0.604, 0.779]], [0.057, [0.331, 0.604, 0.779]], [0.059, [0.308, 0.590, 0.771]], [0.061, [0.308, 0.590, 0.771]], [0.063, [0.286, 0.575, 0.763]], [0.065, [0.286, 0.575, 0.763]], [0.067, [0.263, 0.561, 0.755]], [0.068, [0.263, 0.561, 0.755]], [0.070, [0.240, 0.546, 0.747]], [0.072, [0.240, 0.546, 0.747]], [0.074, [0.217, 0.531, 0.739]], [0.076, [0.217, 0.531, 0.739]], [0.078, [0.194, 0.517, 0.731]], [0.080, [0.194, 0.517, 0.731]], [0.082, [0.171, 0.502, 0.723]], [0.084, [0.171, 0.502, 0.723]], [0.086, [0.149, 0.488, 0.715]], [0.088, [0.149, 0.488, 0.715]], [0.090, [0.126, 0.473, 0.707]], [0.092, [0.126, 0.473, 0.707]], [0.094, [0.142, 0.485, 0.700]], [0.096, [0.142, 0.485, 0.700]], [0.098, [0.167, 0.502, 0.693]], [0.100, [0.167, 0.502, 0.693]], [0.102, [0.192, 0.520, 0.686]], [0.104, [0.192, 0.520, 0.686]], [0.106, [0.217, 0.537, 0.679]], [0.108, [0.217, 0.537, 0.679]], [0.110, [0.241, 0.555, 0.672]], [0.112, [0.241, 0.555, 0.672]], [0.114, [0.266, 0.572, 0.665]], [0.115, [0.266, 0.572, 0.665]], [0.117, [0.291, 0.589, 0.657]], [0.119, [0.291, 0.589, 0.657]], [0.121, [0.316, 0.607, 0.650]], [0.123, [0.316, 0.607, 0.650]], [0.125, [0.341, 0.624, 0.643]], [0.127, [0.341, 0.624, 0.643]], [0.129, [0.366, 0.642, 0.636]], [0.131, [0.366, 0.642, 0.636]], [0.133, [0.391, 0.659, 0.629]], [0.135, [0.391, 0.659, 0.629]], [0.137, [0.415, 0.677, 0.622]], [0.139, [0.415, 0.677, 0.622]], [0.141, [0.440, 0.694, 0.615]], [0.143, [0.440, 0.694, 0.615]], [0.145, [0.465, 0.711, 0.608]], [0.147, [0.465, 0.711, 0.608]], [0.149, [0.490, 0.729, 0.601]], [0.151, [0.490, 0.729, 0.601]], [0.153, [0.515, 0.746, 0.593]], [0.155, [0.515, 0.746, 0.593]], [0.157, [0.540, 0.764, 0.586]], [0.159, [0.540, 0.764, 0.586]], [0.160, [0.565, 0.781, 0.579]], [0.162, [0.565, 0.781, 0.579]], [0.164, [0.590, 0.798, 0.572]], [0.166, [0.590, 0.798, 0.572]], [0.168, [0.614, 0.816, 0.565]], [0.170, [0.614, 0.816, 0.565]], [0.172, [0.639, 0.833, 0.558]], [0.174, [0.639, 0.833, 0.558]], [0.176, [0.664, 0.851, 0.551]], [0.178, [0.664, 0.851, 0.551]], [0.180, [0.689, 0.868, 0.544]], [0.182, [0.689, 0.868, 0.544]], [0.184, [0.684, 0.868, 0.531]], [0.186, [0.684, 0.868, 0.531]], [0.188, [0.663, 0.857, 0.515]], [0.190, [0.663, 0.857, 0.515]], [0.192, [0.641, 0.846, 0.499]], [0.194, [0.641, 0.846, 0.499]], [0.196, [0.620, 0.836, 0.483]], [0.198, [0.620, 0.836, 0.483]], [0.200, [0.598, 0.825, 0.467]], [0.202, [0.598, 0.825, 0.467]], [0.204, [0.577, 0.814, 0.452]], [0.205, [0.577, 0.814, 0.452]], [0.207, [0.555, 0.804, 0.436]], [0.209, [0.555, 0.804, 0.436]], [0.211, [0.534, 0.793, 0.420]], [0.213, [0.534, 0.793, 0.420]], [0.215, [0.512, 0.782, 0.404]], [0.217, [0.512, 0.782, 0.404]], [0.219, [0.491, 0.772, 0.388]], [0.221, [0.491, 0.772, 0.388]], [0.223, [0.470, 0.761, 0.372]], [0.225, [0.470, 0.761, 0.372]], [0.227, [0.448, 0.750, 0.356]], [0.229, [0.448, 0.750, 0.356]], [0.231, [0.427, 0.740, 0.340]], [0.233, [0.427, 0.740, 0.340]], [0.235, [0.405, 0.729, 0.324]], [0.237, [0.405, 0.729, 0.324]], [0.239, [0.384, 0.719, 0.308]], [0.241, [0.384, 0.719, 0.308]], [0.243, [0.362, 0.708, 0.293]], [0.245, [0.362, 0.708, 0.293]], [0.247, [0.341, 0.697, 0.277]], [0.249, [0.341, 0.697, 0.277]], [0.250, [0.319, 0.687, 0.261]], [0.252, [0.319, 0.687, 0.261]], [0.254, [0.298, 0.676, 0.245]], [0.256, [0.298, 0.676, 0.245]], [0.258, [0.276, 0.665, 0.229]], [0.260, [0.276, 0.665, 0.229]], [0.262, [0.255, 0.655, 0.213]], [0.264, [0.255, 0.655, 0.213]], [0.266, [0.233, 0.644, 0.197]], [0.268, [0.233, 0.644, 0.197]], [0.270, [0.212, 0.633, 0.181]], [0.272, [0.212, 0.633, 0.181]], [0.274, [0.215, 0.627, 0.181]], [0.276, [0.215, 0.627, 0.181]], [0.278, [0.249, 0.626, 0.199]], [0.280, [0.249, 0.626, 0.199]], [0.282, [0.283, 0.625, 0.218]], [0.284, [0.283, 0.625, 0.218]], [0.286, [0.317, 0.624, 0.236]], [0.288, [0.317, 0.624, 0.236]], [0.290, [0.351, 0.623, 0.255]], [0.292, [0.351, 0.623, 0.255]], [0.294, [0.385, 0.622, 0.273]], [0.295, [0.385, 0.622, 0.273]], [0.297, [0.418, 0.621, 0.292]], [0.299, [0.418, 0.621, 0.292]], [0.301, [0.452, 0.620, 0.310]], [0.303, [0.452, 0.620, 0.310]], [0.305, [0.486, 0.619, 0.328]], [0.307, [0.486, 0.619, 0.328]], [0.309, [0.520, 0.618, 0.347]], [0.311, [0.520, 0.618, 0.347]], [0.313, [0.554, 0.617, 0.365]], [0.315, [0.554, 0.617, 0.365]], [0.317, [0.588, 0.616, 0.384]], [0.319, [0.588, 0.616, 0.384]], [0.321, [0.621, 0.615, 0.402]], [0.323, [0.621, 0.615, 0.402]], [0.325, [0.655, 0.614, 0.421]], [0.327, [0.655, 0.614, 0.421]], [0.329, [0.689, 0.613, 0.439]], [0.331, [0.689, 0.613, 0.439]], [0.333, [0.723, 0.612, 0.458]], [0.335, [0.723, 0.612, 0.458]], [0.337, [0.757, 0.611, 0.476]], [0.339, [0.757, 0.611, 0.476]], [0.341, [0.791, 0.610, 0.494]], [0.342, [0.791, 0.610, 0.494]], [0.344, [0.824, 0.609, 0.513]], [0.346, [0.824, 0.609, 0.513]], [0.348, [0.858, 0.608, 0.531]], [0.350, [0.858, 0.608, 0.531]], [0.352, [0.892, 0.607, 0.550]], [0.354, [0.892, 0.607, 0.550]], [0.356, [0.926, 0.606, 0.568]], [0.358, [0.926, 0.606, 0.568]], [0.360, [0.960, 0.605, 0.587]], [0.362, [0.960, 0.605, 0.587]], [0.364, [0.983, 0.598, 0.594]], [0.366, [0.983, 0.598, 0.594]], [0.368, [0.979, 0.576, 0.573]], [0.370, [0.979, 0.576, 0.573]], [0.372, [0.975, 0.555, 0.552]], [0.374, [0.975, 0.555, 0.552]], [0.376, [0.971, 0.533, 0.531]], [0.378, [0.971, 0.533, 0.531]], [0.380, [0.967, 0.511, 0.510]], [0.382, [0.967, 0.511, 0.510]], [0.384, [0.963, 0.490, 0.489]], [0.386, [0.963, 0.490, 0.489]], [0.387, [0.959, 0.468, 0.467]], [0.389, [0.959, 0.468, 0.467]], [0.391, [0.955, 0.446, 0.446]], [0.393, [0.955, 0.446, 0.446]], [0.395, [0.951, 0.425, 0.425]], [0.397, [0.951, 0.425, 0.425]], [0.399, [0.947, 0.403, 0.404]], [0.401, [0.947, 0.403, 0.404]], [0.403, [0.943, 0.381, 0.383]], [0.405, [0.943, 0.381, 0.383]], [0.407, [0.939, 0.360, 0.362]], [0.409, [0.939, 0.360, 0.362]], [0.411, [0.934, 0.338, 0.340]], [0.413, [0.934, 0.338, 0.340]], [0.415, [0.930, 0.317, 0.319]], [0.417, [0.930, 0.317, 0.319]], [0.419, [0.926, 0.295, 0.298]], [0.421, [0.926, 0.295, 0.298]], [0.423, [0.922, 0.273, 0.277]], [0.425, [0.922, 0.273, 0.277]], [0.427, [0.918, 0.252, 0.256]], [0.429, [0.918, 0.252, 0.256]], [0.431, [0.914, 0.230, 0.235]], [0.432, [0.914, 0.230, 0.235]], [0.434, [0.910, 0.208, 0.214]], [0.436, [0.910, 0.208, 0.214]], [0.438, [0.906, 0.187, 0.192]], [0.440, [0.906, 0.187, 0.192]], [0.442, [0.902, 0.165, 0.171]], [0.444, [0.902, 0.165, 0.171]], [0.446, [0.898, 0.143, 0.150]], [0.448, [0.898, 0.143, 0.150]], [0.450, [0.894, 0.122, 0.129]], [0.452, [0.894, 0.122, 0.129]], [0.454, [0.891, 0.104, 0.111]], [0.456, [0.891, 0.104, 0.111]], [0.458, [0.895, 0.132, 0.125]], [0.460, [0.895, 0.132, 0.125]], [0.462, [0.899, 0.160, 0.139]], [0.464, [0.899, 0.160, 0.139]], [0.466, [0.904, 0.188, 0.153]], [0.468, [0.904, 0.188, 0.153]], [0.470, [0.908, 0.216, 0.167]], [0.472, [0.908, 0.216, 0.167]], [0.474, [0.913, 0.244, 0.181]], [0.476, [0.913, 0.244, 0.181]], [0.477, [0.917, 0.272, 0.195]], [0.479, [0.917, 0.272, 0.195]], [0.481, [0.921, 0.300, 0.209]], [0.483, [0.921, 0.300, 0.209]], [0.485, [0.926, 0.328, 0.223]], [0.487, [0.926, 0.328, 0.223]], [0.489, [0.930, 0.356, 0.237]], [0.491, [0.930, 0.356, 0.237]], [0.493, [0.935, 0.384, 0.251]], [0.495, [0.935, 0.384, 0.251]], [0.497, [0.939, 0.412, 0.266]], [0.499, [0.939, 0.412, 0.266]], [0.501, [0.943, 0.439, 0.280]], [0.503, [0.943, 0.439, 0.280]], [0.505, [0.948, 0.467, 0.294]], [0.507, [0.948, 0.467, 0.294]], [0.509, [0.952, 0.495, 0.308]], [0.511, [0.952, 0.495, 0.308]], [0.513, [0.957, 0.523, 0.322]], [0.515, [0.957, 0.523, 0.322]], [0.517, [0.961, 0.551, 0.336]], [0.519, [0.961, 0.551, 0.336]], [0.521, [0.965, 0.579, 0.350]], [0.523, [0.965, 0.579, 0.350]], [0.524, [0.970, 0.607, 0.364]], [0.526, [0.970, 0.607, 0.364]], [0.528, [0.974, 0.635, 0.378]], [0.530, [0.974, 0.635, 0.378]], [0.532, [0.979, 0.663, 0.392]], [0.534, [0.979, 0.663, 0.392]], [0.536, [0.983, 0.691, 0.406]], [0.538, [0.983, 0.691, 0.406]], [0.540, [0.987, 0.719, 0.420]], [0.542, [0.987, 0.719, 0.420]], [0.544, [0.992, 0.746, 0.434]], [0.546, [0.992, 0.746, 0.434]], [0.548, [0.992, 0.739, 0.418]], [0.550, [0.992, 0.739, 0.418]], [0.552, [0.993, 0.728, 0.399]], [0.554, [0.993, 0.728, 0.399]], [0.556, [0.993, 0.718, 0.381]], [0.558, [0.993, 0.718, 0.381]], [0.560, [0.993, 0.707, 0.362]], [0.562, [0.993, 0.707, 0.362]], [0.564, [0.994, 0.696, 0.343]], [0.566, [0.994, 0.696, 0.343]], [0.568, [0.994, 0.685, 0.324]], [0.569, [0.994, 0.685, 0.324]], [0.571, [0.994, 0.674, 0.306]], [0.573, [0.994, 0.674, 0.306]], [0.575, [0.995, 0.663, 0.287]], [0.577, [0.995, 0.663, 0.287]], [0.579, [0.995, 0.653, 0.268]], [0.581, [0.995, 0.653, 0.268]], [0.583, [0.996, 0.642, 0.249]], [0.585, [0.996, 0.642, 0.249]], [0.587, [0.996, 0.631, 0.230]], [0.589, [0.996, 0.631, 0.230]], [0.591, [0.996, 0.620, 0.212]], [0.593, [0.996, 0.620, 0.212]], [0.595, [0.997, 0.609, 0.193]], [0.597, [0.997, 0.609, 0.193]], [0.599, [0.997, 0.598, 0.174]], [0.601, [0.997, 0.598, 0.174]], [0.603, [0.997, 0.588, 0.155]], [0.605, [0.997, 0.588, 0.155]], [0.607, [0.998, 0.577, 0.137]], [0.609, [0.998, 0.577, 0.137]], [0.611, [0.998, 0.566, 0.118]], [0.613, [0.998, 0.566, 0.118]], [0.614, [0.998, 0.555, 0.099]], [0.616, [0.998, 0.555, 0.099]], [0.618, [0.999, 0.544, 0.080]], [0.620, [0.999, 0.544, 0.080]], [0.622, [0.999, 0.533, 0.061]], [0.624, [0.999, 0.533, 0.061]], [0.626, [0.999, 0.523, 0.043]], [0.628, [0.999, 0.523, 0.043]], [0.630, [1.000, 0.512, 0.024]], [0.632, [1.000, 0.512, 0.024]], [0.634, [1.000, 0.501, 0.005]], [0.636, [1.000, 0.501, 0.005]], [0.638, [0.993, 0.504, 0.026]], [0.640, [0.993, 0.504, 0.026]], [0.642, [0.985, 0.513, 0.063]], [0.644, [0.985, 0.513, 0.063]], [0.646, [0.976, 0.522, 0.099]], [0.648, [0.976, 0.522, 0.099]], [0.650, [0.967, 0.530, 0.135]], [0.652, [0.967, 0.530, 0.135]], [0.654, [0.958, 0.539, 0.171]], [0.656, [0.958, 0.539, 0.171]], [0.658, [0.949, 0.547, 0.207]], [0.659, [0.949, 0.547, 0.207]], [0.661, [0.940, 0.556, 0.244]], [0.663, [0.940, 0.556, 0.244]], [0.665, [0.931, 0.565, 0.280]], [0.667, [0.931, 0.565, 0.280]], [0.669, [0.922, 0.573, 0.316]], [0.671, [0.922, 0.573, 0.316]], [0.673, [0.913, 0.582, 0.352]], [0.675, [0.913, 0.582, 0.352]], [0.677, [0.904, 0.591, 0.388]], [0.679, [0.904, 0.591, 0.388]], [0.681, [0.895, 0.599, 0.425]], [0.683, [0.895, 0.599, 0.425]], [0.685, [0.886, 0.608, 0.461]], [0.687, [0.886, 0.608, 0.461]], [0.689, [0.877, 0.616, 0.497]], [0.691, [0.877, 0.616, 0.497]], [0.693, [0.868, 0.625, 0.533]], [0.695, [0.868, 0.625, 0.533]], [0.697, [0.859, 0.634, 0.569]], [0.699, [0.859, 0.634, 0.569]], [0.701, [0.850, 0.642, 0.606]], [0.703, [0.850, 0.642, 0.606]], [0.705, [0.841, 0.651, 0.642]], [0.706, [0.841, 0.651, 0.642]], [0.708, [0.832, 0.660, 0.678]], [0.710, [0.832, 0.660, 0.678]], [0.712, [0.823, 0.668, 0.714]], [0.714, [0.823, 0.668, 0.714]], [0.716, [0.814, 0.677, 0.750]], [0.718, [0.814, 0.677, 0.750]], [0.720, [0.805, 0.685, 0.787]], [0.722, [0.805, 0.685, 0.787]], [0.724, [0.796, 0.694, 0.823]], [0.726, [0.796, 0.694, 0.823]], [0.728, [0.783, 0.687, 0.834]], [0.730, [0.783, 0.687, 0.834]], [0.732, [0.767, 0.667, 0.824]], [0.734, [0.767, 0.667, 0.824]], [0.736, [0.751, 0.648, 0.813]], [0.738, [0.751, 0.648, 0.813]], [0.740, [0.735, 0.628, 0.803]], [0.742, [0.735, 0.628, 0.803]], [0.744, [0.718, 0.608, 0.793]], [0.746, [0.718, 0.608, 0.793]], [0.748, [0.702, 0.588, 0.783]], [0.750, [0.702, 0.588, 0.783]], [0.751, [0.686, 0.568, 0.773]], [0.753, [0.686, 0.568, 0.773]], [0.755, [0.670, 0.549, 0.763]], [0.757, [0.670, 0.549, 0.763]], [0.759, [0.653, 0.529, 0.752]], [0.761, [0.653, 0.529, 0.752]], [0.763, [0.637, 0.509, 0.742]], [0.765, [0.637, 0.509, 0.742]], [0.767, [0.621, 0.489, 0.732]], [0.769, [0.621, 0.489, 0.732]], [0.771, [0.605, 0.470, 0.722]], [0.773, [0.605, 0.470, 0.722]], [0.775, [0.588, 0.450, 0.712]], [0.777, [0.588, 0.450, 0.712]], [0.779, [0.572, 0.430, 0.702]], [0.781, [0.572, 0.430, 0.702]], [0.783, [0.556, 0.410, 0.692]], [0.785, [0.556, 0.410, 0.692]], [0.787, [0.540, 0.390, 0.681]], [0.789, [0.540, 0.390, 0.681]], [0.791, [0.523, 0.371, 0.671]], [0.793, [0.523, 0.371, 0.671]], [0.795, [0.507, 0.351, 0.661]], [0.796, [0.507, 0.351, 0.661]], [0.798, [0.491, 0.331, 0.651]], [0.800, [0.491, 0.331, 0.651]], [0.802, [0.475, 0.311, 0.641]], [0.804, [0.475, 0.311, 0.641]], [0.806, [0.459, 0.291, 0.631]], [0.808, [0.459, 0.291, 0.631]], [0.810, [0.442, 0.272, 0.621]], [0.812, [0.442, 0.272, 0.621]], [0.814, [0.426, 0.252, 0.610]], [0.816, [0.426, 0.252, 0.610]], [0.818, [0.425, 0.251, 0.604]], [0.820, [0.425, 0.251, 0.604]], [0.822, [0.450, 0.284, 0.604]], [0.824, [0.450, 0.284, 0.604]], [0.826, [0.475, 0.317, 0.604]], [0.828, [0.475, 0.317, 0.604]], [0.830, [0.500, 0.350, 0.603]], [0.832, [0.500, 0.350, 0.603]], [0.834, [0.526, 0.382, 0.603]], [0.836, [0.526, 0.382, 0.603]], [0.838, [0.551, 0.415, 0.603]], [0.840, [0.551, 0.415, 0.603]], [0.841, [0.576, 0.448, 0.603]], [0.843, [0.576, 0.448, 0.603]], [0.845, [0.601, 0.481, 0.603]], [0.847, [0.601, 0.481, 0.603]], [0.849, [0.626, 0.514, 0.603]], [0.851, [0.626, 0.514, 0.603]], [0.853, [0.652, 0.547, 0.602]], [0.855, [0.652, 0.547, 0.602]], [0.857, [0.677, 0.579, 0.602]], [0.859, [0.677, 0.579, 0.602]], [0.861, [0.702, 0.612, 0.602]], [0.863, [0.702, 0.612, 0.602]], [0.865, [0.727, 0.645, 0.602]], [0.867, [0.727, 0.645, 0.602]], [0.869, [0.753, 0.678, 0.602]], [0.871, [0.753, 0.678, 0.602]], [0.873, [0.778, 0.711, 0.601]], [0.875, [0.778, 0.711, 0.601]], [0.877, [0.803, 0.743, 0.601]], [0.879, [0.803, 0.743, 0.601]], [0.881, [0.828, 0.776, 0.601]], [0.883, [0.828, 0.776, 0.601]], [0.885, [0.853, 0.809, 0.601]], [0.886, [0.853, 0.809, 0.601]], [0.888, [0.879, 0.842, 0.601]], [0.890, [0.879, 0.842, 0.601]], [0.892, [0.904, 0.875, 0.601]], [0.894, [0.904, 0.875, 0.601]], [0.896, [0.929, 0.908, 0.600]], [0.898, [0.929, 0.908, 0.600]], [0.900, [0.954, 0.940, 0.600]], [0.902, [0.954, 0.940, 0.600]], [0.904, [0.979, 0.973, 0.600]], [0.906, [0.979, 0.973, 0.600]], [0.908, [0.998, 0.995, 0.597]], [0.910, [0.998, 0.995, 0.597]], [0.912, [0.984, 0.967, 0.577]], [0.914, [0.984, 0.967, 0.577]], [0.916, [0.971, 0.939, 0.558]], [0.918, [0.971, 0.939, 0.558]], [0.920, [0.958, 0.911, 0.539]], [0.922, [0.958, 0.911, 0.539]], [0.924, [0.945, 0.883, 0.520]], [0.926, [0.945, 0.883, 0.520]], [0.928, [0.932, 0.854, 0.501]], [0.930, [0.932, 0.854, 0.501]], [0.932, [0.918, 0.826, 0.482]], [0.933, [0.918, 0.826, 0.482]], [0.935, [0.905, 0.798, 0.463]], [0.937, [0.905, 0.798, 0.463]], [0.939, [0.892, 0.770, 0.444]], [0.941, [0.892, 0.770, 0.444]], [0.943, [0.879, 0.742, 0.424]], [0.945, [0.879, 0.742, 0.424]], [0.947, [0.866, 0.714, 0.405]], [0.949, [0.866, 0.714, 0.405]], [0.951, [0.852, 0.686, 0.386]], [0.953, [0.852, 0.686, 0.386]], [0.955, [0.839, 0.658, 0.367]], [0.957, [0.839, 0.658, 0.367]], [0.959, [0.826, 0.630, 0.348]], [0.961, [0.826, 0.630, 0.348]], [0.963, [0.813, 0.602, 0.329]], [0.965, [0.813, 0.602, 0.329]], [0.967, [0.800, 0.574, 0.310]], [0.969, [0.800, 0.574, 0.310]], [0.971, [0.786, 0.546, 0.291]], [0.973, [0.786, 0.546, 0.291]], [0.975, [0.773, 0.518, 0.272]], [0.977, [0.773, 0.518, 0.272]], [0.978, [0.760, 0.489, 0.252]], [0.980, [0.760, 0.489, 0.252]], [0.982, [0.747, 0.461, 0.233]], [0.984, [0.747, 0.461, 0.233]], [0.986, [0.734, 0.433, 0.214]], [0.988, [0.734, 0.433, 0.214]], [0.990, [0.721, 0.405, 0.195]], [0.992, [0.721, 0.405, 0.195]], [0.994, [0.707, 0.377, 0.176]], [0.996, [0.707, 0.377, 0.176]], [0.998, [0.694, 0.349, 0.157]], [1.000, [0.694, 0.349, 0.157]]]; +var Pastel1 = [[0.000, [0.984, 0.706, 0.682]], [0.002, [0.984, 0.706, 0.682]], [0.004, [0.975, 0.709, 0.689]], [0.006, [0.975, 0.709, 0.689]], [0.008, [0.967, 0.712, 0.695]], [0.010, [0.967, 0.712, 0.695]], [0.012, [0.958, 0.715, 0.702]], [0.014, [0.958, 0.715, 0.702]], [0.016, [0.949, 0.718, 0.708]], [0.018, [0.949, 0.718, 0.708]], [0.020, [0.940, 0.721, 0.715]], [0.022, [0.940, 0.721, 0.715]], [0.023, [0.931, 0.724, 0.721]], [0.025, [0.931, 0.724, 0.721]], [0.027, [0.922, 0.727, 0.728]], [0.029, [0.922, 0.727, 0.728]], [0.031, [0.913, 0.730, 0.735]], [0.033, [0.913, 0.730, 0.735]], [0.035, [0.905, 0.734, 0.741]], [0.037, [0.905, 0.734, 0.741]], [0.039, [0.896, 0.737, 0.748]], [0.041, [0.896, 0.737, 0.748]], [0.043, [0.887, 0.740, 0.754]], [0.045, [0.887, 0.740, 0.754]], [0.047, [0.878, 0.743, 0.761]], [0.049, [0.878, 0.743, 0.761]], [0.051, [0.869, 0.746, 0.767]], [0.053, [0.869, 0.746, 0.767]], [0.055, [0.860, 0.749, 0.774]], [0.057, [0.860, 0.749, 0.774]], [0.059, [0.851, 0.752, 0.780]], [0.061, [0.851, 0.752, 0.780]], [0.063, [0.843, 0.755, 0.787]], [0.065, [0.843, 0.755, 0.787]], [0.067, [0.834, 0.758, 0.793]], [0.068, [0.834, 0.758, 0.793]], [0.070, [0.825, 0.761, 0.800]], [0.072, [0.825, 0.761, 0.800]], [0.074, [0.816, 0.764, 0.806]], [0.076, [0.816, 0.764, 0.806]], [0.078, [0.807, 0.767, 0.813]], [0.080, [0.807, 0.767, 0.813]], [0.082, [0.798, 0.770, 0.819]], [0.084, [0.798, 0.770, 0.819]], [0.086, [0.789, 0.774, 0.826]], [0.088, [0.789, 0.774, 0.826]], [0.090, [0.781, 0.777, 0.832]], [0.092, [0.781, 0.777, 0.832]], [0.094, [0.772, 0.780, 0.839]], [0.096, [0.772, 0.780, 0.839]], [0.098, [0.763, 0.783, 0.845]], [0.100, [0.763, 0.783, 0.845]], [0.102, [0.754, 0.786, 0.852]], [0.104, [0.754, 0.786, 0.852]], [0.106, [0.745, 0.789, 0.858]], [0.108, [0.745, 0.789, 0.858]], [0.110, [0.736, 0.792, 0.865]], [0.112, [0.736, 0.792, 0.865]], [0.114, [0.727, 0.795, 0.871]], [0.115, [0.727, 0.795, 0.871]], [0.117, [0.719, 0.798, 0.878]], [0.119, [0.719, 0.798, 0.878]], [0.121, [0.710, 0.801, 0.884]], [0.123, [0.710, 0.801, 0.884]], [0.125, [0.702, 0.804, 0.890]], [0.127, [0.702, 0.804, 0.890]], [0.129, [0.705, 0.808, 0.886]], [0.131, [0.705, 0.808, 0.886]], [0.133, [0.708, 0.812, 0.882]], [0.135, [0.708, 0.812, 0.882]], [0.137, [0.712, 0.815, 0.879]], [0.139, [0.712, 0.815, 0.879]], [0.141, [0.715, 0.819, 0.875]], [0.143, [0.715, 0.819, 0.875]], [0.145, [0.718, 0.823, 0.871]], [0.147, [0.718, 0.823, 0.871]], [0.149, [0.721, 0.827, 0.868]], [0.151, [0.721, 0.827, 0.868]], [0.153, [0.724, 0.830, 0.864]], [0.155, [0.724, 0.830, 0.864]], [0.157, [0.727, 0.834, 0.860]], [0.159, [0.727, 0.834, 0.860]], [0.160, [0.730, 0.838, 0.857]], [0.162, [0.730, 0.838, 0.857]], [0.164, [0.733, 0.841, 0.853]], [0.166, [0.733, 0.841, 0.853]], [0.168, [0.736, 0.845, 0.849]], [0.170, [0.736, 0.845, 0.849]], [0.172, [0.739, 0.849, 0.845]], [0.174, [0.739, 0.849, 0.845]], [0.176, [0.742, 0.852, 0.842]], [0.178, [0.742, 0.852, 0.842]], [0.180, [0.745, 0.856, 0.838]], [0.182, [0.745, 0.856, 0.838]], [0.184, [0.748, 0.860, 0.834]], [0.186, [0.748, 0.860, 0.834]], [0.188, [0.752, 0.863, 0.831]], [0.190, [0.752, 0.863, 0.831]], [0.192, [0.755, 0.867, 0.827]], [0.194, [0.755, 0.867, 0.827]], [0.196, [0.758, 0.871, 0.823]], [0.198, [0.758, 0.871, 0.823]], [0.200, [0.761, 0.875, 0.820]], [0.202, [0.761, 0.875, 0.820]], [0.204, [0.764, 0.878, 0.816]], [0.205, [0.764, 0.878, 0.816]], [0.207, [0.767, 0.882, 0.812]], [0.209, [0.767, 0.882, 0.812]], [0.211, [0.770, 0.886, 0.809]], [0.213, [0.770, 0.886, 0.809]], [0.215, [0.773, 0.889, 0.805]], [0.217, [0.773, 0.889, 0.805]], [0.219, [0.776, 0.893, 0.801]], [0.221, [0.776, 0.893, 0.801]], [0.223, [0.779, 0.897, 0.797]], [0.225, [0.779, 0.897, 0.797]], [0.227, [0.782, 0.900, 0.794]], [0.229, [0.782, 0.900, 0.794]], [0.231, [0.785, 0.904, 0.790]], [0.233, [0.785, 0.904, 0.790]], [0.235, [0.788, 0.908, 0.786]], [0.237, [0.788, 0.908, 0.786]], [0.239, [0.792, 0.911, 0.783]], [0.241, [0.792, 0.911, 0.783]], [0.243, [0.795, 0.915, 0.779]], [0.245, [0.795, 0.915, 0.779]], [0.247, [0.798, 0.919, 0.775]], [0.249, [0.798, 0.919, 0.775]], [0.250, [0.801, 0.921, 0.774]], [0.252, [0.801, 0.921, 0.774]], [0.254, [0.803, 0.917, 0.777]], [0.256, [0.803, 0.917, 0.777]], [0.258, [0.805, 0.913, 0.781]], [0.260, [0.805, 0.913, 0.781]], [0.262, [0.807, 0.909, 0.785]], [0.264, [0.807, 0.909, 0.785]], [0.266, [0.809, 0.905, 0.789]], [0.268, [0.809, 0.905, 0.789]], [0.270, [0.812, 0.901, 0.793]], [0.272, [0.812, 0.901, 0.793]], [0.274, [0.814, 0.897, 0.796]], [0.276, [0.814, 0.897, 0.796]], [0.278, [0.816, 0.893, 0.800]], [0.280, [0.816, 0.893, 0.800]], [0.282, [0.818, 0.889, 0.804]], [0.284, [0.818, 0.889, 0.804]], [0.286, [0.820, 0.885, 0.808]], [0.288, [0.820, 0.885, 0.808]], [0.290, [0.823, 0.881, 0.812]], [0.292, [0.823, 0.881, 0.812]], [0.294, [0.825, 0.877, 0.815]], [0.295, [0.825, 0.877, 0.815]], [0.297, [0.827, 0.873, 0.819]], [0.299, [0.827, 0.873, 0.819]], [0.301, [0.829, 0.869, 0.823]], [0.303, [0.829, 0.869, 0.823]], [0.305, [0.832, 0.865, 0.827]], [0.307, [0.832, 0.865, 0.827]], [0.309, [0.834, 0.862, 0.831]], [0.311, [0.834, 0.862, 0.831]], [0.313, [0.836, 0.858, 0.835]], [0.315, [0.836, 0.858, 0.835]], [0.317, [0.838, 0.854, 0.838]], [0.319, [0.838, 0.854, 0.838]], [0.321, [0.840, 0.850, 0.842]], [0.323, [0.840, 0.850, 0.842]], [0.325, [0.843, 0.846, 0.846]], [0.327, [0.843, 0.846, 0.846]], [0.329, [0.845, 0.842, 0.850]], [0.331, [0.845, 0.842, 0.850]], [0.333, [0.847, 0.838, 0.854]], [0.335, [0.847, 0.838, 0.854]], [0.337, [0.849, 0.834, 0.857]], [0.339, [0.849, 0.834, 0.857]], [0.341, [0.851, 0.830, 0.861]], [0.342, [0.851, 0.830, 0.861]], [0.344, [0.854, 0.826, 0.865]], [0.346, [0.854, 0.826, 0.865]], [0.348, [0.856, 0.822, 0.869]], [0.350, [0.856, 0.822, 0.869]], [0.352, [0.858, 0.818, 0.873]], [0.354, [0.858, 0.818, 0.873]], [0.356, [0.860, 0.814, 0.876]], [0.358, [0.860, 0.814, 0.876]], [0.360, [0.863, 0.810, 0.880]], [0.362, [0.863, 0.810, 0.880]], [0.364, [0.865, 0.806, 0.884]], [0.366, [0.865, 0.806, 0.884]], [0.368, [0.867, 0.802, 0.888]], [0.370, [0.867, 0.802, 0.888]], [0.372, [0.869, 0.799, 0.892]], [0.374, [0.869, 0.799, 0.892]], [0.376, [0.872, 0.797, 0.891]], [0.378, [0.872, 0.797, 0.891]], [0.380, [0.876, 0.798, 0.884]], [0.382, [0.876, 0.798, 0.884]], [0.384, [0.880, 0.800, 0.876]], [0.386, [0.880, 0.800, 0.876]], [0.387, [0.884, 0.802, 0.868]], [0.389, [0.884, 0.802, 0.868]], [0.391, [0.888, 0.804, 0.861]], [0.393, [0.888, 0.804, 0.861]], [0.395, [0.892, 0.805, 0.853]], [0.397, [0.892, 0.805, 0.853]], [0.399, [0.896, 0.807, 0.845]], [0.401, [0.896, 0.807, 0.845]], [0.403, [0.900, 0.809, 0.838]], [0.405, [0.900, 0.809, 0.838]], [0.407, [0.904, 0.811, 0.830]], [0.409, [0.904, 0.811, 0.830]], [0.411, [0.907, 0.812, 0.823]], [0.413, [0.907, 0.812, 0.823]], [0.415, [0.911, 0.814, 0.815]], [0.417, [0.911, 0.814, 0.815]], [0.419, [0.915, 0.816, 0.807]], [0.421, [0.915, 0.816, 0.807]], [0.423, [0.919, 0.817, 0.800]], [0.425, [0.919, 0.817, 0.800]], [0.427, [0.923, 0.819, 0.792]], [0.429, [0.923, 0.819, 0.792]], [0.431, [0.927, 0.821, 0.784]], [0.432, [0.927, 0.821, 0.784]], [0.434, [0.931, 0.823, 0.777]], [0.436, [0.931, 0.823, 0.777]], [0.438, [0.935, 0.824, 0.769]], [0.440, [0.935, 0.824, 0.769]], [0.442, [0.939, 0.826, 0.762]], [0.444, [0.939, 0.826, 0.762]], [0.446, [0.943, 0.828, 0.754]], [0.448, [0.943, 0.828, 0.754]], [0.450, [0.947, 0.829, 0.746]], [0.452, [0.947, 0.829, 0.746]], [0.454, [0.951, 0.831, 0.739]], [0.456, [0.951, 0.831, 0.739]], [0.458, [0.955, 0.833, 0.731]], [0.460, [0.955, 0.833, 0.731]], [0.462, [0.959, 0.835, 0.723]], [0.464, [0.959, 0.835, 0.723]], [0.466, [0.963, 0.836, 0.716]], [0.468, [0.963, 0.836, 0.716]], [0.470, [0.967, 0.838, 0.708]], [0.472, [0.967, 0.838, 0.708]], [0.474, [0.970, 0.840, 0.701]], [0.476, [0.970, 0.840, 0.701]], [0.477, [0.974, 0.842, 0.693]], [0.479, [0.974, 0.842, 0.693]], [0.481, [0.978, 0.843, 0.685]], [0.483, [0.978, 0.843, 0.685]], [0.485, [0.982, 0.845, 0.678]], [0.487, [0.982, 0.845, 0.678]], [0.489, [0.986, 0.847, 0.670]], [0.491, [0.986, 0.847, 0.670]], [0.493, [0.990, 0.848, 0.662]], [0.495, [0.990, 0.848, 0.662]], [0.497, [0.994, 0.850, 0.655]], [0.499, [0.994, 0.850, 0.655]], [0.501, [0.996, 0.853, 0.653]], [0.503, [0.996, 0.853, 0.653]], [0.505, [0.996, 0.858, 0.658]], [0.507, [0.996, 0.858, 0.658]], [0.509, [0.996, 0.863, 0.663]], [0.511, [0.996, 0.863, 0.663]], [0.513, [0.997, 0.867, 0.667]], [0.515, [0.997, 0.867, 0.667]], [0.517, [0.997, 0.872, 0.672]], [0.519, [0.997, 0.872, 0.672]], [0.521, [0.997, 0.877, 0.677]], [0.523, [0.997, 0.877, 0.677]], [0.524, [0.997, 0.881, 0.681]], [0.526, [0.997, 0.881, 0.681]], [0.528, [0.997, 0.886, 0.686]], [0.530, [0.997, 0.886, 0.686]], [0.532, [0.997, 0.891, 0.691]], [0.534, [0.997, 0.891, 0.691]], [0.536, [0.997, 0.895, 0.695]], [0.538, [0.997, 0.895, 0.695]], [0.540, [0.997, 0.900, 0.700]], [0.542, [0.997, 0.900, 0.700]], [0.544, [0.997, 0.905, 0.705]], [0.546, [0.997, 0.905, 0.705]], [0.548, [0.998, 0.909, 0.709]], [0.550, [0.998, 0.909, 0.709]], [0.552, [0.998, 0.914, 0.714]], [0.554, [0.998, 0.914, 0.714]], [0.556, [0.998, 0.919, 0.719]], [0.558, [0.998, 0.919, 0.719]], [0.560, [0.998, 0.923, 0.723]], [0.562, [0.998, 0.923, 0.723]], [0.564, [0.998, 0.928, 0.728]], [0.566, [0.998, 0.928, 0.728]], [0.568, [0.998, 0.933, 0.733]], [0.569, [0.998, 0.933, 0.733]], [0.571, [0.998, 0.937, 0.737]], [0.573, [0.998, 0.937, 0.737]], [0.575, [0.998, 0.942, 0.742]], [0.577, [0.998, 0.942, 0.742]], [0.579, [0.999, 0.947, 0.747]], [0.581, [0.999, 0.947, 0.747]], [0.583, [0.999, 0.951, 0.751]], [0.585, [0.999, 0.951, 0.751]], [0.587, [0.999, 0.956, 0.756]], [0.589, [0.999, 0.956, 0.756]], [0.591, [0.999, 0.961, 0.761]], [0.593, [0.999, 0.961, 0.761]], [0.595, [0.999, 0.966, 0.766]], [0.597, [0.999, 0.966, 0.766]], [0.599, [0.999, 0.970, 0.770]], [0.601, [0.999, 0.970, 0.770]], [0.603, [0.999, 0.975, 0.775]], [0.605, [0.999, 0.975, 0.775]], [0.607, [0.999, 0.980, 0.780]], [0.609, [0.999, 0.980, 0.780]], [0.611, [1.000, 0.984, 0.784]], [0.613, [1.000, 0.984, 0.784]], [0.614, [1.000, 0.989, 0.789]], [0.616, [1.000, 0.989, 0.789]], [0.618, [1.000, 0.994, 0.794]], [0.620, [1.000, 0.994, 0.794]], [0.622, [1.000, 0.998, 0.798]], [0.624, [1.000, 0.998, 0.798]], [0.626, [0.998, 0.997, 0.799]], [0.628, [0.998, 0.997, 0.799]], [0.630, [0.995, 0.992, 0.797]], [0.632, [0.995, 0.992, 0.797]], [0.634, [0.992, 0.987, 0.795]], [0.636, [0.992, 0.987, 0.795]], [0.638, [0.988, 0.983, 0.793]], [0.640, [0.988, 0.983, 0.793]], [0.642, [0.985, 0.978, 0.791]], [0.644, [0.985, 0.978, 0.791]], [0.646, [0.982, 0.973, 0.790]], [0.648, [0.982, 0.973, 0.790]], [0.650, [0.979, 0.968, 0.788]], [0.652, [0.979, 0.968, 0.788]], [0.654, [0.976, 0.963, 0.786]], [0.656, [0.976, 0.963, 0.786]], [0.658, [0.972, 0.959, 0.784]], [0.659, [0.972, 0.959, 0.784]], [0.661, [0.969, 0.954, 0.782]], [0.663, [0.969, 0.954, 0.782]], [0.665, [0.966, 0.949, 0.780]], [0.667, [0.966, 0.949, 0.780]], [0.669, [0.963, 0.944, 0.779]], [0.671, [0.963, 0.944, 0.779]], [0.673, [0.960, 0.939, 0.777]], [0.675, [0.960, 0.939, 0.777]], [0.677, [0.956, 0.935, 0.775]], [0.679, [0.956, 0.935, 0.775]], [0.681, [0.953, 0.930, 0.773]], [0.683, [0.953, 0.930, 0.773]], [0.685, [0.950, 0.925, 0.771]], [0.687, [0.950, 0.925, 0.771]], [0.689, [0.947, 0.920, 0.769]], [0.691, [0.947, 0.920, 0.769]], [0.693, [0.944, 0.915, 0.767]], [0.695, [0.944, 0.915, 0.767]], [0.697, [0.940, 0.911, 0.766]], [0.699, [0.940, 0.911, 0.766]], [0.701, [0.937, 0.906, 0.764]], [0.703, [0.937, 0.906, 0.764]], [0.705, [0.934, 0.901, 0.762]], [0.706, [0.934, 0.901, 0.762]], [0.708, [0.931, 0.896, 0.760]], [0.710, [0.931, 0.896, 0.760]], [0.712, [0.928, 0.891, 0.758]], [0.714, [0.928, 0.891, 0.758]], [0.716, [0.924, 0.887, 0.756]], [0.718, [0.924, 0.887, 0.756]], [0.720, [0.921, 0.882, 0.755]], [0.722, [0.921, 0.882, 0.755]], [0.724, [0.918, 0.877, 0.753]], [0.726, [0.918, 0.877, 0.753]], [0.728, [0.915, 0.872, 0.751]], [0.730, [0.915, 0.872, 0.751]], [0.732, [0.912, 0.867, 0.749]], [0.734, [0.912, 0.867, 0.749]], [0.736, [0.908, 0.863, 0.747]], [0.738, [0.908, 0.863, 0.747]], [0.740, [0.905, 0.858, 0.745]], [0.742, [0.905, 0.858, 0.745]], [0.744, [0.902, 0.853, 0.743]], [0.746, [0.902, 0.853, 0.743]], [0.748, [0.899, 0.848, 0.742]], [0.750, [0.899, 0.848, 0.742]], [0.751, [0.900, 0.847, 0.746]], [0.753, [0.900, 0.847, 0.746]], [0.755, [0.903, 0.847, 0.751]], [0.757, [0.903, 0.847, 0.751]], [0.759, [0.906, 0.848, 0.757]], [0.761, [0.906, 0.848, 0.757]], [0.763, [0.909, 0.848, 0.763]], [0.765, [0.909, 0.848, 0.763]], [0.767, [0.912, 0.848, 0.769]], [0.769, [0.912, 0.848, 0.769]], [0.771, [0.915, 0.848, 0.774]], [0.773, [0.915, 0.848, 0.774]], [0.775, [0.918, 0.849, 0.780]], [0.777, [0.918, 0.849, 0.780]], [0.779, [0.921, 0.849, 0.786]], [0.781, [0.921, 0.849, 0.786]], [0.783, [0.924, 0.849, 0.792]], [0.785, [0.924, 0.849, 0.792]], [0.787, [0.927, 0.849, 0.798]], [0.789, [0.927, 0.849, 0.798]], [0.791, [0.930, 0.850, 0.803]], [0.793, [0.930, 0.850, 0.803]], [0.795, [0.933, 0.850, 0.809]], [0.796, [0.933, 0.850, 0.809]], [0.798, [0.936, 0.850, 0.815]], [0.800, [0.936, 0.850, 0.815]], [0.802, [0.939, 0.850, 0.821]], [0.804, [0.939, 0.850, 0.821]], [0.806, [0.942, 0.851, 0.826]], [0.808, [0.942, 0.851, 0.826]], [0.810, [0.945, 0.851, 0.832]], [0.812, [0.945, 0.851, 0.832]], [0.814, [0.947, 0.851, 0.838]], [0.816, [0.947, 0.851, 0.838]], [0.818, [0.950, 0.851, 0.844]], [0.820, [0.950, 0.851, 0.844]], [0.822, [0.953, 0.852, 0.850]], [0.824, [0.953, 0.852, 0.850]], [0.826, [0.956, 0.852, 0.855]], [0.828, [0.956, 0.852, 0.855]], [0.830, [0.959, 0.852, 0.861]], [0.832, [0.959, 0.852, 0.861]], [0.834, [0.962, 0.852, 0.867]], [0.836, [0.962, 0.852, 0.867]], [0.838, [0.965, 0.853, 0.873]], [0.840, [0.965, 0.853, 0.873]], [0.841, [0.968, 0.853, 0.879]], [0.843, [0.968, 0.853, 0.879]], [0.845, [0.971, 0.853, 0.884]], [0.847, [0.971, 0.853, 0.884]], [0.849, [0.974, 0.853, 0.890]], [0.851, [0.974, 0.853, 0.890]], [0.853, [0.977, 0.854, 0.896]], [0.855, [0.977, 0.854, 0.896]], [0.857, [0.980, 0.854, 0.902]], [0.859, [0.980, 0.854, 0.902]], [0.861, [0.983, 0.854, 0.907]], [0.863, [0.983, 0.854, 0.907]], [0.865, [0.986, 0.854, 0.913]], [0.867, [0.986, 0.854, 0.913]], [0.869, [0.989, 0.855, 0.919]], [0.871, [0.989, 0.855, 0.919]], [0.873, [0.992, 0.855, 0.925]], [0.875, [0.992, 0.855, 0.925]], [0.877, [0.991, 0.857, 0.926]], [0.879, [0.991, 0.857, 0.926]], [0.881, [0.990, 0.860, 0.927]], [0.883, [0.990, 0.860, 0.927]], [0.885, [0.988, 0.863, 0.928]], [0.886, [0.988, 0.863, 0.928]], [0.888, [0.987, 0.866, 0.928]], [0.890, [0.987, 0.866, 0.928]], [0.892, [0.986, 0.869, 0.929]], [0.894, [0.986, 0.869, 0.929]], [0.896, [0.984, 0.872, 0.930]], [0.898, [0.984, 0.872, 0.930]], [0.900, [0.983, 0.875, 0.931]], [0.902, [0.983, 0.875, 0.931]], [0.904, [0.981, 0.878, 0.931]], [0.906, [0.981, 0.878, 0.931]], [0.908, [0.980, 0.881, 0.932]], [0.910, [0.980, 0.881, 0.932]], [0.912, [0.979, 0.884, 0.933]], [0.914, [0.979, 0.884, 0.933]], [0.916, [0.977, 0.887, 0.934]], [0.918, [0.977, 0.887, 0.934]], [0.920, [0.976, 0.890, 0.934]], [0.922, [0.976, 0.890, 0.934]], [0.924, [0.975, 0.893, 0.935]], [0.926, [0.975, 0.893, 0.935]], [0.928, [0.973, 0.896, 0.936]], [0.930, [0.973, 0.896, 0.936]], [0.932, [0.972, 0.899, 0.936]], [0.933, [0.972, 0.899, 0.936]], [0.935, [0.971, 0.902, 0.937]], [0.937, [0.971, 0.902, 0.937]], [0.939, [0.969, 0.905, 0.938]], [0.941, [0.969, 0.905, 0.938]], [0.943, [0.968, 0.908, 0.939]], [0.945, [0.968, 0.908, 0.939]], [0.947, [0.967, 0.911, 0.939]], [0.949, [0.967, 0.911, 0.939]], [0.951, [0.965, 0.914, 0.940]], [0.953, [0.965, 0.914, 0.940]], [0.955, [0.964, 0.917, 0.941]], [0.957, [0.964, 0.917, 0.941]], [0.959, [0.963, 0.919, 0.942]], [0.961, [0.963, 0.919, 0.942]], [0.963, [0.961, 0.922, 0.942]], [0.965, [0.961, 0.922, 0.942]], [0.967, [0.960, 0.925, 0.943]], [0.969, [0.960, 0.925, 0.943]], [0.971, [0.958, 0.928, 0.944]], [0.973, [0.958, 0.928, 0.944]], [0.975, [0.957, 0.931, 0.945]], [0.977, [0.957, 0.931, 0.945]], [0.978, [0.956, 0.934, 0.945]], [0.980, [0.956, 0.934, 0.945]], [0.982, [0.954, 0.937, 0.946]], [0.984, [0.954, 0.937, 0.946]], [0.986, [0.953, 0.940, 0.947]], [0.988, [0.953, 0.940, 0.947]], [0.990, [0.952, 0.943, 0.948]], [0.992, [0.952, 0.943, 0.948]], [0.994, [0.950, 0.946, 0.948]], [0.996, [0.950, 0.946, 0.948]], [0.998, [0.949, 0.949, 0.949]], [1.000, [0.949, 0.949, 0.949]]]; +var Pastel2 = [[0.000, [0.702, 0.886, 0.804]], [0.002, [0.702, 0.886, 0.804]], [0.004, [0.710, 0.884, 0.800]], [0.006, [0.710, 0.884, 0.800]], [0.008, [0.718, 0.882, 0.797]], [0.010, [0.718, 0.882, 0.797]], [0.012, [0.726, 0.879, 0.793]], [0.014, [0.726, 0.879, 0.793]], [0.016, [0.734, 0.877, 0.790]], [0.018, [0.734, 0.877, 0.790]], [0.020, [0.742, 0.875, 0.786]], [0.022, [0.742, 0.875, 0.786]], [0.023, [0.750, 0.873, 0.783]], [0.025, [0.750, 0.873, 0.783]], [0.027, [0.758, 0.870, 0.779]], [0.029, [0.758, 0.870, 0.779]], [0.031, [0.766, 0.868, 0.776]], [0.033, [0.766, 0.868, 0.776]], [0.035, [0.774, 0.866, 0.772]], [0.037, [0.774, 0.866, 0.772]], [0.039, [0.782, 0.864, 0.768]], [0.041, [0.782, 0.864, 0.768]], [0.043, [0.790, 0.861, 0.765]], [0.045, [0.790, 0.861, 0.765]], [0.047, [0.798, 0.859, 0.761]], [0.049, [0.798, 0.859, 0.761]], [0.051, [0.806, 0.857, 0.758]], [0.053, [0.806, 0.857, 0.758]], [0.055, [0.813, 0.855, 0.754]], [0.057, [0.813, 0.855, 0.754]], [0.059, [0.821, 0.852, 0.751]], [0.061, [0.821, 0.852, 0.751]], [0.063, [0.829, 0.850, 0.747]], [0.065, [0.829, 0.850, 0.747]], [0.067, [0.837, 0.848, 0.744]], [0.068, [0.837, 0.848, 0.744]], [0.070, [0.845, 0.846, 0.740]], [0.072, [0.845, 0.846, 0.740]], [0.074, [0.853, 0.843, 0.736]], [0.076, [0.853, 0.843, 0.736]], [0.078, [0.861, 0.841, 0.733]], [0.080, [0.861, 0.841, 0.733]], [0.082, [0.869, 0.839, 0.729]], [0.084, [0.869, 0.839, 0.729]], [0.086, [0.877, 0.837, 0.726]], [0.088, [0.877, 0.837, 0.726]], [0.090, [0.885, 0.834, 0.722]], [0.092, [0.885, 0.834, 0.722]], [0.094, [0.893, 0.832, 0.719]], [0.096, [0.893, 0.832, 0.719]], [0.098, [0.901, 0.830, 0.715]], [0.100, [0.901, 0.830, 0.715]], [0.102, [0.909, 0.827, 0.712]], [0.104, [0.909, 0.827, 0.712]], [0.106, [0.917, 0.825, 0.708]], [0.108, [0.917, 0.825, 0.708]], [0.110, [0.925, 0.823, 0.704]], [0.112, [0.925, 0.823, 0.704]], [0.114, [0.933, 0.821, 0.701]], [0.115, [0.933, 0.821, 0.701]], [0.117, [0.941, 0.818, 0.697]], [0.119, [0.941, 0.818, 0.697]], [0.121, [0.949, 0.816, 0.694]], [0.123, [0.949, 0.816, 0.694]], [0.125, [0.957, 0.814, 0.690]], [0.127, [0.957, 0.814, 0.690]], [0.129, [0.965, 0.812, 0.687]], [0.131, [0.965, 0.812, 0.687]], [0.133, [0.973, 0.809, 0.683]], [0.135, [0.973, 0.809, 0.683]], [0.137, [0.981, 0.807, 0.680]], [0.139, [0.981, 0.807, 0.680]], [0.141, [0.989, 0.805, 0.676]], [0.143, [0.989, 0.805, 0.676]], [0.145, [0.989, 0.804, 0.678]], [0.147, [0.989, 0.804, 0.678]], [0.149, [0.984, 0.805, 0.685]], [0.151, [0.984, 0.805, 0.685]], [0.153, [0.978, 0.806, 0.691]], [0.155, [0.978, 0.806, 0.691]], [0.157, [0.973, 0.807, 0.698]], [0.159, [0.973, 0.807, 0.698]], [0.160, [0.968, 0.808, 0.704]], [0.162, [0.968, 0.808, 0.704]], [0.164, [0.962, 0.809, 0.710]], [0.166, [0.962, 0.809, 0.710]], [0.168, [0.957, 0.810, 0.717]], [0.170, [0.957, 0.810, 0.717]], [0.172, [0.951, 0.810, 0.723]], [0.174, [0.951, 0.810, 0.723]], [0.176, [0.946, 0.811, 0.730]], [0.178, [0.946, 0.811, 0.730]], [0.180, [0.941, 0.812, 0.736]], [0.182, [0.941, 0.812, 0.736]], [0.184, [0.935, 0.813, 0.743]], [0.186, [0.935, 0.813, 0.743]], [0.188, [0.930, 0.814, 0.749]], [0.190, [0.930, 0.814, 0.749]], [0.192, [0.924, 0.815, 0.756]], [0.194, [0.924, 0.815, 0.756]], [0.196, [0.919, 0.816, 0.762]], [0.198, [0.919, 0.816, 0.762]], [0.200, [0.914, 0.816, 0.769]], [0.202, [0.914, 0.816, 0.769]], [0.204, [0.908, 0.817, 0.775]], [0.205, [0.908, 0.817, 0.775]], [0.207, [0.903, 0.818, 0.782]], [0.209, [0.903, 0.818, 0.782]], [0.211, [0.898, 0.819, 0.788]], [0.213, [0.898, 0.819, 0.788]], [0.215, [0.892, 0.820, 0.794]], [0.217, [0.892, 0.820, 0.794]], [0.219, [0.887, 0.821, 0.801]], [0.221, [0.887, 0.821, 0.801]], [0.223, [0.881, 0.822, 0.807]], [0.225, [0.881, 0.822, 0.807]], [0.227, [0.876, 0.822, 0.814]], [0.229, [0.876, 0.822, 0.814]], [0.231, [0.871, 0.823, 0.820]], [0.233, [0.871, 0.823, 0.820]], [0.235, [0.865, 0.824, 0.827]], [0.237, [0.865, 0.824, 0.827]], [0.239, [0.860, 0.825, 0.833]], [0.241, [0.860, 0.825, 0.833]], [0.243, [0.855, 0.826, 0.840]], [0.245, [0.855, 0.826, 0.840]], [0.247, [0.849, 0.827, 0.846]], [0.249, [0.849, 0.827, 0.846]], [0.250, [0.844, 0.828, 0.853]], [0.252, [0.844, 0.828, 0.853]], [0.254, [0.838, 0.829, 0.859]], [0.256, [0.838, 0.829, 0.859]], [0.258, [0.833, 0.829, 0.866]], [0.260, [0.833, 0.829, 0.866]], [0.262, [0.828, 0.830, 0.872]], [0.264, [0.828, 0.830, 0.872]], [0.266, [0.822, 0.831, 0.878]], [0.268, [0.822, 0.831, 0.878]], [0.270, [0.817, 0.832, 0.885]], [0.272, [0.817, 0.832, 0.885]], [0.274, [0.811, 0.833, 0.891]], [0.276, [0.811, 0.833, 0.891]], [0.278, [0.806, 0.834, 0.898]], [0.280, [0.806, 0.834, 0.898]], [0.282, [0.801, 0.835, 0.904]], [0.284, [0.801, 0.835, 0.904]], [0.286, [0.797, 0.835, 0.910]], [0.288, [0.797, 0.835, 0.910]], [0.290, [0.801, 0.834, 0.909]], [0.292, [0.801, 0.834, 0.909]], [0.294, [0.806, 0.833, 0.909]], [0.295, [0.806, 0.833, 0.909]], [0.297, [0.810, 0.832, 0.908]], [0.299, [0.810, 0.832, 0.908]], [0.301, [0.814, 0.830, 0.908]], [0.303, [0.814, 0.830, 0.908]], [0.305, [0.819, 0.829, 0.908]], [0.307, [0.819, 0.829, 0.908]], [0.309, [0.823, 0.828, 0.907]], [0.311, [0.823, 0.828, 0.907]], [0.313, [0.828, 0.827, 0.907]], [0.315, [0.828, 0.827, 0.907]], [0.317, [0.832, 0.826, 0.906]], [0.319, [0.832, 0.826, 0.906]], [0.321, [0.836, 0.824, 0.906]], [0.323, [0.836, 0.824, 0.906]], [0.325, [0.841, 0.823, 0.905]], [0.327, [0.841, 0.823, 0.905]], [0.329, [0.845, 0.822, 0.905]], [0.331, [0.845, 0.822, 0.905]], [0.333, [0.850, 0.821, 0.905]], [0.335, [0.850, 0.821, 0.905]], [0.337, [0.854, 0.820, 0.904]], [0.339, [0.854, 0.820, 0.904]], [0.341, [0.859, 0.819, 0.904]], [0.342, [0.859, 0.819, 0.904]], [0.344, [0.863, 0.817, 0.903]], [0.346, [0.863, 0.817, 0.903]], [0.348, [0.867, 0.816, 0.903]], [0.350, [0.867, 0.816, 0.903]], [0.352, [0.872, 0.815, 0.902]], [0.354, [0.872, 0.815, 0.902]], [0.356, [0.876, 0.814, 0.902]], [0.358, [0.876, 0.814, 0.902]], [0.360, [0.881, 0.813, 0.902]], [0.362, [0.881, 0.813, 0.902]], [0.364, [0.885, 0.811, 0.901]], [0.366, [0.885, 0.811, 0.901]], [0.368, [0.889, 0.810, 0.901]], [0.370, [0.889, 0.810, 0.901]], [0.372, [0.894, 0.809, 0.900]], [0.374, [0.894, 0.809, 0.900]], [0.376, [0.898, 0.808, 0.900]], [0.378, [0.898, 0.808, 0.900]], [0.380, [0.903, 0.807, 0.899]], [0.382, [0.903, 0.807, 0.899]], [0.384, [0.907, 0.806, 0.899]], [0.386, [0.907, 0.806, 0.899]], [0.387, [0.911, 0.804, 0.899]], [0.389, [0.911, 0.804, 0.899]], [0.391, [0.916, 0.803, 0.898]], [0.393, [0.916, 0.803, 0.898]], [0.395, [0.920, 0.802, 0.898]], [0.397, [0.920, 0.802, 0.898]], [0.399, [0.925, 0.801, 0.897]], [0.401, [0.925, 0.801, 0.897]], [0.403, [0.929, 0.800, 0.897]], [0.405, [0.929, 0.800, 0.897]], [0.407, [0.934, 0.798, 0.896]], [0.409, [0.934, 0.798, 0.896]], [0.411, [0.938, 0.797, 0.896]], [0.413, [0.938, 0.797, 0.896]], [0.415, [0.942, 0.796, 0.896]], [0.417, [0.942, 0.796, 0.896]], [0.419, [0.947, 0.795, 0.895]], [0.421, [0.947, 0.795, 0.895]], [0.423, [0.951, 0.794, 0.895]], [0.425, [0.951, 0.794, 0.895]], [0.427, [0.956, 0.792, 0.894]], [0.429, [0.956, 0.792, 0.894]], [0.431, [0.956, 0.795, 0.892]], [0.432, [0.956, 0.795, 0.892]], [0.434, [0.954, 0.800, 0.889]], [0.436, [0.954, 0.800, 0.889]], [0.438, [0.953, 0.805, 0.886]], [0.440, [0.953, 0.805, 0.886]], [0.442, [0.951, 0.809, 0.883]], [0.444, [0.951, 0.809, 0.883]], [0.446, [0.950, 0.814, 0.880]], [0.448, [0.950, 0.814, 0.880]], [0.450, [0.948, 0.819, 0.878]], [0.452, [0.948, 0.819, 0.878]], [0.454, [0.947, 0.823, 0.875]], [0.456, [0.947, 0.823, 0.875]], [0.458, [0.945, 0.828, 0.872]], [0.460, [0.945, 0.828, 0.872]], [0.462, [0.944, 0.832, 0.869]], [0.464, [0.944, 0.832, 0.869]], [0.466, [0.942, 0.837, 0.866]], [0.468, [0.942, 0.837, 0.866]], [0.470, [0.941, 0.842, 0.863]], [0.472, [0.941, 0.842, 0.863]], [0.474, [0.939, 0.846, 0.860]], [0.476, [0.939, 0.846, 0.860]], [0.477, [0.938, 0.851, 0.857]], [0.479, [0.938, 0.851, 0.857]], [0.481, [0.936, 0.856, 0.854]], [0.483, [0.936, 0.856, 0.854]], [0.485, [0.935, 0.860, 0.851]], [0.487, [0.935, 0.860, 0.851]], [0.489, [0.933, 0.865, 0.848]], [0.491, [0.933, 0.865, 0.848]], [0.493, [0.932, 0.870, 0.846]], [0.495, [0.932, 0.870, 0.846]], [0.497, [0.930, 0.874, 0.843]], [0.499, [0.930, 0.874, 0.843]], [0.501, [0.929, 0.879, 0.840]], [0.503, [0.929, 0.879, 0.840]], [0.505, [0.927, 0.883, 0.837]], [0.507, [0.927, 0.883, 0.837]], [0.509, [0.926, 0.888, 0.834]], [0.511, [0.926, 0.888, 0.834]], [0.513, [0.924, 0.893, 0.831]], [0.515, [0.924, 0.893, 0.831]], [0.517, [0.923, 0.897, 0.828]], [0.519, [0.923, 0.897, 0.828]], [0.521, [0.921, 0.902, 0.825]], [0.523, [0.921, 0.902, 0.825]], [0.524, [0.920, 0.907, 0.822]], [0.526, [0.920, 0.907, 0.822]], [0.528, [0.918, 0.911, 0.819]], [0.530, [0.918, 0.911, 0.819]], [0.532, [0.917, 0.916, 0.816]], [0.534, [0.917, 0.916, 0.816]], [0.536, [0.915, 0.920, 0.814]], [0.538, [0.915, 0.920, 0.814]], [0.540, [0.914, 0.925, 0.811]], [0.542, [0.914, 0.925, 0.811]], [0.544, [0.912, 0.930, 0.808]], [0.546, [0.912, 0.930, 0.808]], [0.548, [0.911, 0.934, 0.805]], [0.550, [0.911, 0.934, 0.805]], [0.552, [0.909, 0.939, 0.802]], [0.554, [0.909, 0.939, 0.802]], [0.556, [0.908, 0.944, 0.799]], [0.558, [0.908, 0.944, 0.799]], [0.560, [0.906, 0.948, 0.796]], [0.562, [0.906, 0.948, 0.796]], [0.564, [0.905, 0.953, 0.793]], [0.566, [0.905, 0.953, 0.793]], [0.568, [0.903, 0.957, 0.790]], [0.569, [0.903, 0.957, 0.790]], [0.571, [0.903, 0.961, 0.787]], [0.573, [0.903, 0.961, 0.787]], [0.575, [0.905, 0.960, 0.784]], [0.577, [0.905, 0.960, 0.784]], [0.579, [0.908, 0.960, 0.782]], [0.581, [0.908, 0.960, 0.782]], [0.583, [0.911, 0.960, 0.779]], [0.585, [0.911, 0.960, 0.779]], [0.587, [0.913, 0.959, 0.776]], [0.589, [0.913, 0.959, 0.776]], [0.591, [0.916, 0.959, 0.773]], [0.593, [0.916, 0.959, 0.773]], [0.595, [0.919, 0.959, 0.770]], [0.597, [0.919, 0.959, 0.770]], [0.599, [0.922, 0.958, 0.767]], [0.601, [0.922, 0.958, 0.767]], [0.603, [0.924, 0.958, 0.764]], [0.605, [0.924, 0.958, 0.764]], [0.607, [0.927, 0.958, 0.761]], [0.609, [0.927, 0.958, 0.761]], [0.611, [0.930, 0.957, 0.758]], [0.613, [0.930, 0.957, 0.758]], [0.614, [0.932, 0.957, 0.755]], [0.616, [0.932, 0.957, 0.755]], [0.618, [0.935, 0.957, 0.753]], [0.620, [0.935, 0.957, 0.753]], [0.622, [0.938, 0.956, 0.750]], [0.624, [0.938, 0.956, 0.750]], [0.626, [0.940, 0.956, 0.747]], [0.628, [0.940, 0.956, 0.747]], [0.630, [0.943, 0.956, 0.744]], [0.632, [0.943, 0.956, 0.744]], [0.634, [0.946, 0.956, 0.741]], [0.636, [0.946, 0.956, 0.741]], [0.638, [0.948, 0.955, 0.738]], [0.640, [0.948, 0.955, 0.738]], [0.642, [0.951, 0.955, 0.735]], [0.644, [0.951, 0.955, 0.735]], [0.646, [0.954, 0.955, 0.732]], [0.648, [0.954, 0.955, 0.732]], [0.650, [0.957, 0.954, 0.729]], [0.652, [0.957, 0.954, 0.729]], [0.654, [0.959, 0.954, 0.726]], [0.656, [0.959, 0.954, 0.726]], [0.658, [0.962, 0.954, 0.723]], [0.659, [0.962, 0.954, 0.723]], [0.661, [0.965, 0.953, 0.721]], [0.663, [0.965, 0.953, 0.721]], [0.665, [0.967, 0.953, 0.718]], [0.667, [0.967, 0.953, 0.718]], [0.669, [0.970, 0.953, 0.715]], [0.671, [0.970, 0.953, 0.715]], [0.673, [0.973, 0.952, 0.712]], [0.675, [0.973, 0.952, 0.712]], [0.677, [0.975, 0.952, 0.709]], [0.679, [0.975, 0.952, 0.709]], [0.681, [0.978, 0.952, 0.706]], [0.683, [0.978, 0.952, 0.706]], [0.685, [0.981, 0.951, 0.703]], [0.687, [0.981, 0.951, 0.703]], [0.689, [0.983, 0.951, 0.700]], [0.691, [0.983, 0.951, 0.700]], [0.693, [0.986, 0.951, 0.697]], [0.695, [0.986, 0.951, 0.697]], [0.697, [0.989, 0.950, 0.694]], [0.699, [0.989, 0.950, 0.694]], [0.701, [0.992, 0.950, 0.691]], [0.703, [0.992, 0.950, 0.691]], [0.705, [0.994, 0.950, 0.689]], [0.706, [0.994, 0.950, 0.689]], [0.708, [0.997, 0.949, 0.686]], [0.710, [0.997, 0.949, 0.686]], [0.712, [1.000, 0.949, 0.683]], [0.714, [1.000, 0.949, 0.683]], [0.716, [0.999, 0.948, 0.685]], [0.718, [0.999, 0.948, 0.685]], [0.720, [0.997, 0.946, 0.688]], [0.722, [0.997, 0.946, 0.688]], [0.724, [0.996, 0.944, 0.692]], [0.726, [0.996, 0.944, 0.692]], [0.728, [0.994, 0.942, 0.695]], [0.730, [0.994, 0.942, 0.695]], [0.732, [0.993, 0.941, 0.698]], [0.734, [0.993, 0.941, 0.698]], [0.736, [0.991, 0.939, 0.701]], [0.738, [0.991, 0.939, 0.701]], [0.740, [0.990, 0.937, 0.704]], [0.742, [0.990, 0.937, 0.704]], [0.744, [0.988, 0.935, 0.708]], [0.746, [0.988, 0.935, 0.708]], [0.748, [0.987, 0.934, 0.711]], [0.750, [0.987, 0.934, 0.711]], [0.751, [0.985, 0.932, 0.714]], [0.753, [0.985, 0.932, 0.714]], [0.755, [0.984, 0.930, 0.717]], [0.757, [0.984, 0.930, 0.717]], [0.759, [0.982, 0.929, 0.721]], [0.761, [0.982, 0.929, 0.721]], [0.763, [0.981, 0.927, 0.724]], [0.765, [0.981, 0.927, 0.724]], [0.767, [0.979, 0.925, 0.727]], [0.769, [0.979, 0.925, 0.727]], [0.771, [0.978, 0.923, 0.730]], [0.773, [0.978, 0.923, 0.730]], [0.775, [0.976, 0.922, 0.734]], [0.777, [0.976, 0.922, 0.734]], [0.779, [0.975, 0.920, 0.737]], [0.781, [0.975, 0.920, 0.737]], [0.783, [0.973, 0.918, 0.740]], [0.785, [0.973, 0.918, 0.740]], [0.787, [0.972, 0.917, 0.743]], [0.789, [0.972, 0.917, 0.743]], [0.791, [0.970, 0.915, 0.746]], [0.793, [0.970, 0.915, 0.746]], [0.795, [0.969, 0.913, 0.750]], [0.796, [0.969, 0.913, 0.750]], [0.798, [0.967, 0.911, 0.753]], [0.800, [0.967, 0.911, 0.753]], [0.802, [0.966, 0.910, 0.756]], [0.804, [0.966, 0.910, 0.756]], [0.806, [0.964, 0.908, 0.759]], [0.808, [0.964, 0.908, 0.759]], [0.810, [0.963, 0.906, 0.763]], [0.812, [0.963, 0.906, 0.763]], [0.814, [0.961, 0.904, 0.766]], [0.816, [0.961, 0.904, 0.766]], [0.818, [0.960, 0.903, 0.769]], [0.820, [0.960, 0.903, 0.769]], [0.822, [0.958, 0.901, 0.772]], [0.824, [0.958, 0.901, 0.772]], [0.826, [0.957, 0.899, 0.776]], [0.828, [0.957, 0.899, 0.776]], [0.830, [0.955, 0.898, 0.779]], [0.832, [0.955, 0.898, 0.779]], [0.834, [0.953, 0.896, 0.782]], [0.836, [0.953, 0.896, 0.782]], [0.838, [0.952, 0.894, 0.785]], [0.840, [0.952, 0.894, 0.785]], [0.841, [0.950, 0.892, 0.788]], [0.843, [0.950, 0.892, 0.788]], [0.845, [0.949, 0.891, 0.792]], [0.847, [0.949, 0.891, 0.792]], [0.849, [0.947, 0.889, 0.795]], [0.851, [0.947, 0.889, 0.795]], [0.853, [0.946, 0.887, 0.798]], [0.855, [0.946, 0.887, 0.798]], [0.857, [0.943, 0.885, 0.800]], [0.859, [0.943, 0.885, 0.800]], [0.861, [0.939, 0.883, 0.800]], [0.863, [0.939, 0.883, 0.800]], [0.865, [0.935, 0.881, 0.800]], [0.867, [0.935, 0.881, 0.800]], [0.869, [0.931, 0.878, 0.800]], [0.871, [0.931, 0.878, 0.800]], [0.873, [0.927, 0.876, 0.800]], [0.875, [0.927, 0.876, 0.800]], [0.877, [0.923, 0.873, 0.800]], [0.879, [0.923, 0.873, 0.800]], [0.881, [0.919, 0.871, 0.800]], [0.883, [0.919, 0.871, 0.800]], [0.885, [0.916, 0.869, 0.800]], [0.886, [0.916, 0.869, 0.800]], [0.888, [0.912, 0.866, 0.800]], [0.890, [0.912, 0.866, 0.800]], [0.892, [0.908, 0.864, 0.800]], [0.894, [0.908, 0.864, 0.800]], [0.896, [0.904, 0.862, 0.800]], [0.898, [0.904, 0.862, 0.800]], [0.900, [0.900, 0.859, 0.800]], [0.902, [0.900, 0.859, 0.800]], [0.904, [0.896, 0.857, 0.800]], [0.906, [0.896, 0.857, 0.800]], [0.908, [0.892, 0.854, 0.800]], [0.910, [0.892, 0.854, 0.800]], [0.912, [0.888, 0.852, 0.800]], [0.914, [0.888, 0.852, 0.800]], [0.916, [0.884, 0.850, 0.800]], [0.918, [0.884, 0.850, 0.800]], [0.920, [0.880, 0.847, 0.800]], [0.922, [0.880, 0.847, 0.800]], [0.924, [0.876, 0.845, 0.800]], [0.926, [0.876, 0.845, 0.800]], [0.928, [0.872, 0.843, 0.800]], [0.930, [0.872, 0.843, 0.800]], [0.932, [0.868, 0.840, 0.800]], [0.933, [0.868, 0.840, 0.800]], [0.935, [0.864, 0.838, 0.800]], [0.937, [0.864, 0.838, 0.800]], [0.939, [0.860, 0.836, 0.800]], [0.941, [0.860, 0.836, 0.800]], [0.943, [0.856, 0.833, 0.800]], [0.945, [0.856, 0.833, 0.800]], [0.947, [0.852, 0.831, 0.800]], [0.949, [0.852, 0.831, 0.800]], [0.951, [0.848, 0.828, 0.800]], [0.953, [0.848, 0.828, 0.800]], [0.955, [0.844, 0.826, 0.800]], [0.957, [0.844, 0.826, 0.800]], [0.959, [0.840, 0.824, 0.800]], [0.961, [0.840, 0.824, 0.800]], [0.963, [0.836, 0.821, 0.800]], [0.965, [0.836, 0.821, 0.800]], [0.967, [0.832, 0.819, 0.800]], [0.969, [0.832, 0.819, 0.800]], [0.971, [0.828, 0.817, 0.800]], [0.973, [0.828, 0.817, 0.800]], [0.975, [0.824, 0.814, 0.800]], [0.977, [0.824, 0.814, 0.800]], [0.978, [0.820, 0.812, 0.800]], [0.980, [0.820, 0.812, 0.800]], [0.982, [0.816, 0.809, 0.800]], [0.984, [0.816, 0.809, 0.800]], [0.986, [0.812, 0.807, 0.800]], [0.988, [0.812, 0.807, 0.800]], [0.990, [0.808, 0.805, 0.800]], [0.992, [0.808, 0.805, 0.800]], [0.994, [0.804, 0.802, 0.800]], [0.996, [0.804, 0.802, 0.800]], [0.998, [0.800, 0.800, 0.800]], [1.000, [0.800, 0.800, 0.800]]]; +var Set1 = [[0.000, [0.894, 0.102, 0.110]], [0.002, [0.894, 0.102, 0.110]], [0.004, [0.873, 0.114, 0.129]], [0.006, [0.873, 0.114, 0.129]], [0.008, [0.852, 0.127, 0.148]], [0.010, [0.852, 0.127, 0.148]], [0.012, [0.830, 0.139, 0.167]], [0.014, [0.830, 0.139, 0.167]], [0.016, [0.809, 0.151, 0.187]], [0.018, [0.809, 0.151, 0.187]], [0.020, [0.788, 0.163, 0.206]], [0.022, [0.788, 0.163, 0.206]], [0.023, [0.766, 0.176, 0.225]], [0.025, [0.766, 0.176, 0.225]], [0.027, [0.745, 0.188, 0.244]], [0.029, [0.745, 0.188, 0.244]], [0.031, [0.724, 0.200, 0.263]], [0.033, [0.724, 0.200, 0.263]], [0.035, [0.703, 0.213, 0.283]], [0.037, [0.703, 0.213, 0.283]], [0.039, [0.681, 0.225, 0.302]], [0.041, [0.681, 0.225, 0.302]], [0.043, [0.660, 0.237, 0.321]], [0.045, [0.660, 0.237, 0.321]], [0.047, [0.639, 0.250, 0.340]], [0.049, [0.639, 0.250, 0.340]], [0.051, [0.617, 0.262, 0.359]], [0.053, [0.617, 0.262, 0.359]], [0.055, [0.596, 0.274, 0.379]], [0.057, [0.596, 0.274, 0.379]], [0.059, [0.575, 0.287, 0.398]], [0.061, [0.575, 0.287, 0.398]], [0.063, [0.554, 0.299, 0.417]], [0.065, [0.554, 0.299, 0.417]], [0.067, [0.532, 0.311, 0.436]], [0.068, [0.532, 0.311, 0.436]], [0.070, [0.511, 0.323, 0.455]], [0.072, [0.511, 0.323, 0.455]], [0.074, [0.490, 0.336, 0.474]], [0.076, [0.490, 0.336, 0.474]], [0.078, [0.468, 0.348, 0.494]], [0.080, [0.468, 0.348, 0.494]], [0.082, [0.447, 0.360, 0.513]], [0.084, [0.447, 0.360, 0.513]], [0.086, [0.426, 0.373, 0.532]], [0.088, [0.426, 0.373, 0.532]], [0.090, [0.405, 0.385, 0.551]], [0.092, [0.405, 0.385, 0.551]], [0.094, [0.383, 0.397, 0.570]], [0.096, [0.383, 0.397, 0.570]], [0.098, [0.362, 0.410, 0.590]], [0.100, [0.362, 0.410, 0.590]], [0.102, [0.341, 0.422, 0.609]], [0.104, [0.341, 0.422, 0.609]], [0.106, [0.319, 0.434, 0.628]], [0.108, [0.319, 0.434, 0.628]], [0.110, [0.298, 0.446, 0.647]], [0.112, [0.298, 0.446, 0.647]], [0.114, [0.277, 0.459, 0.666]], [0.115, [0.277, 0.459, 0.666]], [0.117, [0.256, 0.471, 0.686]], [0.119, [0.256, 0.471, 0.686]], [0.121, [0.234, 0.483, 0.705]], [0.123, [0.234, 0.483, 0.705]], [0.125, [0.216, 0.495, 0.720]], [0.127, [0.216, 0.495, 0.720]], [0.129, [0.219, 0.501, 0.706]], [0.131, [0.219, 0.501, 0.706]], [0.133, [0.221, 0.507, 0.693]], [0.135, [0.221, 0.507, 0.693]], [0.137, [0.224, 0.513, 0.679]], [0.139, [0.224, 0.513, 0.679]], [0.141, [0.227, 0.519, 0.666]], [0.143, [0.227, 0.519, 0.666]], [0.145, [0.230, 0.525, 0.652]], [0.147, [0.230, 0.525, 0.652]], [0.149, [0.232, 0.531, 0.639]], [0.151, [0.232, 0.531, 0.639]], [0.153, [0.235, 0.537, 0.625]], [0.155, [0.235, 0.537, 0.625]], [0.157, [0.238, 0.543, 0.612]], [0.159, [0.238, 0.543, 0.612]], [0.160, [0.240, 0.549, 0.598]], [0.162, [0.240, 0.549, 0.598]], [0.164, [0.243, 0.555, 0.585]], [0.166, [0.243, 0.555, 0.585]], [0.168, [0.246, 0.561, 0.571]], [0.170, [0.246, 0.561, 0.571]], [0.172, [0.249, 0.567, 0.557]], [0.174, [0.249, 0.567, 0.557]], [0.176, [0.251, 0.573, 0.544]], [0.178, [0.251, 0.573, 0.544]], [0.180, [0.254, 0.579, 0.530]], [0.182, [0.254, 0.579, 0.530]], [0.184, [0.257, 0.585, 0.517]], [0.186, [0.257, 0.585, 0.517]], [0.188, [0.259, 0.591, 0.503]], [0.190, [0.259, 0.591, 0.503]], [0.192, [0.262, 0.597, 0.490]], [0.194, [0.262, 0.597, 0.490]], [0.196, [0.265, 0.603, 0.476]], [0.198, [0.265, 0.603, 0.476]], [0.200, [0.267, 0.609, 0.463]], [0.202, [0.267, 0.609, 0.463]], [0.204, [0.270, 0.615, 0.449]], [0.205, [0.270, 0.615, 0.449]], [0.207, [0.273, 0.621, 0.436]], [0.209, [0.273, 0.621, 0.436]], [0.211, [0.276, 0.627, 0.422]], [0.213, [0.276, 0.627, 0.422]], [0.215, [0.278, 0.634, 0.409]], [0.217, [0.278, 0.634, 0.409]], [0.219, [0.281, 0.640, 0.395]], [0.221, [0.281, 0.640, 0.395]], [0.223, [0.284, 0.646, 0.382]], [0.225, [0.284, 0.646, 0.382]], [0.227, [0.286, 0.652, 0.368]], [0.229, [0.286, 0.652, 0.368]], [0.231, [0.289, 0.658, 0.354]], [0.233, [0.289, 0.658, 0.354]], [0.235, [0.292, 0.664, 0.341]], [0.237, [0.292, 0.664, 0.341]], [0.239, [0.295, 0.670, 0.327]], [0.241, [0.295, 0.670, 0.327]], [0.243, [0.297, 0.676, 0.314]], [0.245, [0.297, 0.676, 0.314]], [0.247, [0.300, 0.682, 0.300]], [0.249, [0.300, 0.682, 0.300]], [0.250, [0.304, 0.683, 0.293]], [0.252, [0.304, 0.683, 0.293]], [0.254, [0.313, 0.671, 0.304]], [0.256, [0.313, 0.671, 0.304]], [0.258, [0.323, 0.659, 0.315]], [0.260, [0.323, 0.659, 0.315]], [0.262, [0.332, 0.647, 0.326]], [0.264, [0.332, 0.647, 0.326]], [0.266, [0.341, 0.636, 0.337]], [0.268, [0.341, 0.636, 0.337]], [0.270, [0.350, 0.624, 0.348]], [0.272, [0.350, 0.624, 0.348]], [0.274, [0.360, 0.612, 0.359]], [0.276, [0.360, 0.612, 0.359]], [0.278, [0.369, 0.600, 0.370]], [0.280, [0.369, 0.600, 0.370]], [0.282, [0.378, 0.588, 0.381]], [0.284, [0.378, 0.588, 0.381]], [0.286, [0.387, 0.576, 0.391]], [0.288, [0.387, 0.576, 0.391]], [0.290, [0.397, 0.564, 0.402]], [0.292, [0.397, 0.564, 0.402]], [0.294, [0.406, 0.552, 0.413]], [0.295, [0.406, 0.552, 0.413]], [0.297, [0.415, 0.540, 0.424]], [0.299, [0.415, 0.540, 0.424]], [0.301, [0.424, 0.528, 0.435]], [0.303, [0.424, 0.528, 0.435]], [0.305, [0.433, 0.516, 0.446]], [0.307, [0.433, 0.516, 0.446]], [0.309, [0.443, 0.504, 0.457]], [0.311, [0.443, 0.504, 0.457]], [0.313, [0.452, 0.492, 0.468]], [0.315, [0.452, 0.492, 0.468]], [0.317, [0.461, 0.480, 0.479]], [0.319, [0.461, 0.480, 0.479]], [0.321, [0.470, 0.468, 0.490]], [0.323, [0.470, 0.468, 0.490]], [0.325, [0.480, 0.457, 0.501]], [0.327, [0.480, 0.457, 0.501]], [0.329, [0.489, 0.445, 0.512]], [0.331, [0.489, 0.445, 0.512]], [0.333, [0.498, 0.433, 0.523]], [0.335, [0.498, 0.433, 0.523]], [0.337, [0.507, 0.421, 0.534]], [0.339, [0.507, 0.421, 0.534]], [0.341, [0.516, 0.409, 0.545]], [0.342, [0.516, 0.409, 0.545]], [0.344, [0.526, 0.397, 0.556]], [0.346, [0.526, 0.397, 0.556]], [0.348, [0.535, 0.385, 0.567]], [0.350, [0.535, 0.385, 0.567]], [0.352, [0.544, 0.373, 0.578]], [0.354, [0.544, 0.373, 0.578]], [0.356, [0.553, 0.361, 0.589]], [0.358, [0.553, 0.361, 0.589]], [0.360, [0.563, 0.349, 0.600]], [0.362, [0.563, 0.349, 0.600]], [0.364, [0.572, 0.337, 0.610]], [0.366, [0.572, 0.337, 0.610]], [0.368, [0.581, 0.325, 0.621]], [0.370, [0.581, 0.325, 0.621]], [0.372, [0.590, 0.313, 0.632]], [0.374, [0.590, 0.313, 0.632]], [0.376, [0.601, 0.308, 0.632]], [0.378, [0.601, 0.308, 0.632]], [0.380, [0.614, 0.314, 0.612]], [0.382, [0.614, 0.314, 0.612]], [0.384, [0.626, 0.320, 0.592]], [0.386, [0.626, 0.320, 0.592]], [0.387, [0.639, 0.326, 0.572]], [0.389, [0.639, 0.326, 0.572]], [0.391, [0.652, 0.332, 0.551]], [0.393, [0.652, 0.332, 0.551]], [0.395, [0.664, 0.338, 0.531]], [0.397, [0.664, 0.338, 0.531]], [0.399, [0.677, 0.344, 0.511]], [0.401, [0.677, 0.344, 0.511]], [0.403, [0.690, 0.350, 0.491]], [0.405, [0.690, 0.350, 0.491]], [0.407, [0.702, 0.356, 0.471]], [0.409, [0.702, 0.356, 0.471]], [0.411, [0.715, 0.362, 0.451]], [0.413, [0.715, 0.362, 0.451]], [0.415, [0.728, 0.368, 0.431]], [0.417, [0.728, 0.368, 0.431]], [0.419, [0.740, 0.374, 0.411]], [0.421, [0.740, 0.374, 0.411]], [0.423, [0.753, 0.380, 0.391]], [0.425, [0.753, 0.380, 0.391]], [0.427, [0.766, 0.387, 0.371]], [0.429, [0.766, 0.387, 0.371]], [0.431, [0.778, 0.393, 0.351]], [0.432, [0.778, 0.393, 0.351]], [0.434, [0.791, 0.399, 0.331]], [0.436, [0.791, 0.399, 0.331]], [0.438, [0.804, 0.405, 0.311]], [0.440, [0.804, 0.405, 0.311]], [0.442, [0.816, 0.411, 0.291]], [0.444, [0.816, 0.411, 0.291]], [0.446, [0.829, 0.417, 0.271]], [0.448, [0.829, 0.417, 0.271]], [0.450, [0.842, 0.423, 0.251]], [0.452, [0.842, 0.423, 0.251]], [0.454, [0.854, 0.429, 0.231]], [0.456, [0.854, 0.429, 0.231]], [0.458, [0.867, 0.435, 0.211]], [0.460, [0.867, 0.435, 0.211]], [0.462, [0.880, 0.441, 0.191]], [0.464, [0.880, 0.441, 0.191]], [0.466, [0.892, 0.447, 0.170]], [0.468, [0.892, 0.447, 0.170]], [0.470, [0.905, 0.453, 0.150]], [0.472, [0.905, 0.453, 0.150]], [0.474, [0.918, 0.459, 0.130]], [0.476, [0.918, 0.459, 0.130]], [0.477, [0.930, 0.465, 0.110]], [0.479, [0.930, 0.465, 0.110]], [0.481, [0.943, 0.471, 0.090]], [0.483, [0.943, 0.471, 0.090]], [0.485, [0.956, 0.477, 0.070]], [0.487, [0.956, 0.477, 0.070]], [0.489, [0.968, 0.483, 0.050]], [0.491, [0.968, 0.483, 0.050]], [0.493, [0.981, 0.489, 0.030]], [0.495, [0.981, 0.489, 0.030]], [0.497, [0.994, 0.495, 0.010]], [0.499, [0.994, 0.495, 0.010]], [0.501, [1.000, 0.506, 0.003]], [0.503, [1.000, 0.506, 0.003]], [0.505, [1.000, 0.522, 0.009]], [0.507, [1.000, 0.522, 0.009]], [0.509, [1.000, 0.537, 0.016]], [0.511, [1.000, 0.537, 0.016]], [0.513, [1.000, 0.553, 0.022]], [0.515, [1.000, 0.553, 0.022]], [0.517, [1.000, 0.569, 0.028]], [0.519, [1.000, 0.569, 0.028]], [0.521, [1.000, 0.585, 0.035]], [0.523, [1.000, 0.585, 0.035]], [0.524, [1.000, 0.600, 0.041]], [0.526, [1.000, 0.600, 0.041]], [0.528, [1.000, 0.616, 0.047]], [0.530, [1.000, 0.616, 0.047]], [0.532, [1.000, 0.632, 0.053]], [0.534, [1.000, 0.632, 0.053]], [0.536, [1.000, 0.648, 0.060]], [0.538, [1.000, 0.648, 0.060]], [0.540, [1.000, 0.663, 0.066]], [0.542, [1.000, 0.663, 0.066]], [0.544, [1.000, 0.679, 0.072]], [0.546, [1.000, 0.679, 0.072]], [0.548, [1.000, 0.695, 0.078]], [0.550, [1.000, 0.695, 0.078]], [0.552, [1.000, 0.711, 0.085]], [0.554, [1.000, 0.711, 0.085]], [0.556, [1.000, 0.726, 0.091]], [0.558, [1.000, 0.726, 0.091]], [0.560, [1.000, 0.742, 0.097]], [0.562, [1.000, 0.742, 0.097]], [0.564, [1.000, 0.758, 0.104]], [0.566, [1.000, 0.758, 0.104]], [0.568, [1.000, 0.774, 0.110]], [0.569, [1.000, 0.774, 0.110]], [0.571, [1.000, 0.789, 0.116]], [0.573, [1.000, 0.789, 0.116]], [0.575, [1.000, 0.805, 0.122]], [0.577, [1.000, 0.805, 0.122]], [0.579, [1.000, 0.821, 0.129]], [0.581, [1.000, 0.821, 0.129]], [0.583, [1.000, 0.837, 0.135]], [0.585, [1.000, 0.837, 0.135]], [0.587, [1.000, 0.852, 0.141]], [0.589, [1.000, 0.852, 0.141]], [0.591, [1.000, 0.868, 0.147]], [0.593, [1.000, 0.868, 0.147]], [0.595, [1.000, 0.884, 0.154]], [0.597, [1.000, 0.884, 0.154]], [0.599, [1.000, 0.900, 0.160]], [0.601, [1.000, 0.900, 0.160]], [0.603, [1.000, 0.915, 0.166]], [0.605, [1.000, 0.915, 0.166]], [0.607, [1.000, 0.931, 0.173]], [0.609, [1.000, 0.931, 0.173]], [0.611, [1.000, 0.947, 0.179]], [0.613, [1.000, 0.947, 0.179]], [0.614, [1.000, 0.963, 0.185]], [0.616, [1.000, 0.963, 0.185]], [0.618, [1.000, 0.978, 0.191]], [0.620, [1.000, 0.978, 0.191]], [0.622, [1.000, 0.994, 0.198]], [0.624, [1.000, 0.994, 0.198]], [0.626, [0.993, 0.987, 0.199]], [0.628, [0.993, 0.987, 0.199]], [0.630, [0.982, 0.966, 0.198]], [0.632, [0.982, 0.966, 0.198]], [0.634, [0.971, 0.945, 0.196]], [0.636, [0.971, 0.945, 0.196]], [0.638, [0.960, 0.925, 0.195]], [0.640, [0.960, 0.925, 0.195]], [0.642, [0.949, 0.904, 0.194]], [0.644, [0.949, 0.904, 0.194]], [0.646, [0.938, 0.883, 0.192]], [0.648, [0.938, 0.883, 0.192]], [0.650, [0.927, 0.862, 0.191]], [0.652, [0.927, 0.862, 0.191]], [0.654, [0.917, 0.841, 0.190]], [0.656, [0.917, 0.841, 0.190]], [0.658, [0.906, 0.821, 0.188]], [0.659, [0.906, 0.821, 0.188]], [0.661, [0.895, 0.800, 0.187]], [0.663, [0.895, 0.800, 0.187]], [0.665, [0.884, 0.779, 0.186]], [0.667, [0.884, 0.779, 0.186]], [0.669, [0.873, 0.758, 0.184]], [0.671, [0.873, 0.758, 0.184]], [0.673, [0.862, 0.738, 0.183]], [0.675, [0.862, 0.738, 0.183]], [0.677, [0.851, 0.717, 0.182]], [0.679, [0.851, 0.717, 0.182]], [0.681, [0.840, 0.696, 0.180]], [0.683, [0.840, 0.696, 0.180]], [0.685, [0.829, 0.675, 0.179]], [0.687, [0.829, 0.675, 0.179]], [0.689, [0.818, 0.654, 0.178]], [0.691, [0.818, 0.654, 0.178]], [0.693, [0.807, 0.634, 0.176]], [0.695, [0.807, 0.634, 0.176]], [0.697, [0.796, 0.613, 0.175]], [0.699, [0.796, 0.613, 0.175]], [0.701, [0.785, 0.592, 0.173]], [0.703, [0.785, 0.592, 0.173]], [0.705, [0.774, 0.571, 0.172]], [0.706, [0.774, 0.571, 0.172]], [0.708, [0.763, 0.550, 0.171]], [0.710, [0.763, 0.550, 0.171]], [0.712, [0.752, 0.530, 0.169]], [0.714, [0.752, 0.530, 0.169]], [0.716, [0.741, 0.509, 0.168]], [0.718, [0.741, 0.509, 0.168]], [0.720, [0.730, 0.488, 0.167]], [0.722, [0.730, 0.488, 0.167]], [0.724, [0.719, 0.467, 0.165]], [0.726, [0.719, 0.467, 0.165]], [0.728, [0.708, 0.446, 0.164]], [0.730, [0.708, 0.446, 0.164]], [0.732, [0.698, 0.426, 0.163]], [0.734, [0.698, 0.426, 0.163]], [0.736, [0.687, 0.405, 0.161]], [0.738, [0.687, 0.405, 0.161]], [0.740, [0.676, 0.384, 0.160]], [0.742, [0.676, 0.384, 0.160]], [0.744, [0.665, 0.363, 0.159]], [0.746, [0.665, 0.363, 0.159]], [0.748, [0.654, 0.342, 0.157]], [0.750, [0.654, 0.342, 0.157]], [0.751, [0.658, 0.341, 0.171]], [0.753, [0.658, 0.341, 0.171]], [0.755, [0.668, 0.347, 0.189]], [0.757, [0.668, 0.347, 0.189]], [0.759, [0.678, 0.352, 0.208]], [0.761, [0.678, 0.352, 0.208]], [0.763, [0.688, 0.357, 0.227]], [0.765, [0.688, 0.357, 0.227]], [0.767, [0.698, 0.362, 0.245]], [0.769, [0.698, 0.362, 0.245]], [0.771, [0.708, 0.368, 0.264]], [0.773, [0.708, 0.368, 0.264]], [0.775, [0.718, 0.373, 0.282]], [0.777, [0.718, 0.373, 0.282]], [0.779, [0.728, 0.378, 0.301]], [0.781, [0.728, 0.378, 0.301]], [0.783, [0.738, 0.384, 0.319]], [0.785, [0.738, 0.384, 0.319]], [0.787, [0.748, 0.389, 0.338]], [0.789, [0.748, 0.389, 0.338]], [0.791, [0.758, 0.394, 0.357]], [0.793, [0.758, 0.394, 0.357]], [0.795, [0.768, 0.399, 0.375]], [0.796, [0.768, 0.399, 0.375]], [0.798, [0.778, 0.405, 0.394]], [0.800, [0.778, 0.405, 0.394]], [0.802, [0.788, 0.410, 0.412]], [0.804, [0.788, 0.410, 0.412]], [0.806, [0.798, 0.415, 0.431]], [0.808, [0.798, 0.415, 0.431]], [0.810, [0.808, 0.421, 0.449]], [0.812, [0.808, 0.421, 0.449]], [0.814, [0.818, 0.426, 0.468]], [0.816, [0.818, 0.426, 0.468]], [0.818, [0.828, 0.431, 0.487]], [0.820, [0.828, 0.431, 0.487]], [0.822, [0.838, 0.436, 0.505]], [0.824, [0.838, 0.436, 0.505]], [0.826, [0.848, 0.442, 0.524]], [0.828, [0.848, 0.442, 0.524]], [0.830, [0.858, 0.447, 0.542]], [0.832, [0.858, 0.447, 0.542]], [0.834, [0.868, 0.452, 0.561]], [0.836, [0.868, 0.452, 0.561]], [0.838, [0.878, 0.458, 0.580]], [0.840, [0.878, 0.458, 0.580]], [0.841, [0.888, 0.463, 0.598]], [0.843, [0.888, 0.463, 0.598]], [0.845, [0.898, 0.468, 0.617]], [0.847, [0.898, 0.468, 0.617]], [0.849, [0.908, 0.473, 0.635]], [0.851, [0.908, 0.473, 0.635]], [0.853, [0.918, 0.479, 0.654]], [0.855, [0.918, 0.479, 0.654]], [0.857, [0.928, 0.484, 0.672]], [0.859, [0.928, 0.484, 0.672]], [0.861, [0.937, 0.489, 0.691]], [0.863, [0.937, 0.489, 0.691]], [0.865, [0.947, 0.495, 0.710]], [0.867, [0.947, 0.495, 0.710]], [0.869, [0.957, 0.500, 0.728]], [0.871, [0.957, 0.500, 0.728]], [0.873, [0.967, 0.505, 0.747]], [0.875, [0.967, 0.505, 0.747]], [0.877, [0.959, 0.508, 0.745]], [0.879, [0.959, 0.508, 0.745]], [0.881, [0.947, 0.511, 0.740]], [0.883, [0.947, 0.511, 0.740]], [0.885, [0.935, 0.514, 0.736]], [0.886, [0.935, 0.514, 0.736]], [0.888, [0.924, 0.517, 0.731]], [0.890, [0.924, 0.517, 0.731]], [0.892, [0.912, 0.520, 0.726]], [0.894, [0.912, 0.520, 0.726]], [0.896, [0.901, 0.523, 0.722]], [0.898, [0.901, 0.523, 0.722]], [0.900, [0.889, 0.526, 0.717]], [0.902, [0.889, 0.526, 0.717]], [0.904, [0.878, 0.529, 0.712]], [0.906, [0.878, 0.529, 0.712]], [0.908, [0.866, 0.532, 0.708]], [0.910, [0.866, 0.532, 0.708]], [0.912, [0.854, 0.535, 0.703]], [0.914, [0.854, 0.535, 0.703]], [0.916, [0.843, 0.538, 0.698]], [0.918, [0.843, 0.538, 0.698]], [0.920, [0.831, 0.541, 0.694]], [0.922, [0.831, 0.541, 0.694]], [0.924, [0.820, 0.544, 0.689]], [0.926, [0.820, 0.544, 0.689]], [0.928, [0.808, 0.547, 0.684]], [0.930, [0.808, 0.547, 0.684]], [0.932, [0.797, 0.550, 0.679]], [0.933, [0.797, 0.550, 0.679]], [0.935, [0.785, 0.553, 0.675]], [0.937, [0.785, 0.553, 0.675]], [0.939, [0.773, 0.556, 0.670]], [0.941, [0.773, 0.556, 0.670]], [0.943, [0.762, 0.559, 0.665]], [0.945, [0.762, 0.559, 0.665]], [0.947, [0.750, 0.562, 0.661]], [0.949, [0.750, 0.562, 0.661]], [0.951, [0.739, 0.565, 0.656]], [0.953, [0.739, 0.565, 0.656]], [0.955, [0.727, 0.568, 0.651]], [0.957, [0.727, 0.568, 0.651]], [0.959, [0.716, 0.570, 0.647]], [0.961, [0.716, 0.570, 0.647]], [0.963, [0.704, 0.573, 0.642]], [0.965, [0.704, 0.573, 0.642]], [0.967, [0.693, 0.576, 0.637]], [0.969, [0.693, 0.576, 0.637]], [0.971, [0.681, 0.579, 0.633]], [0.973, [0.681, 0.579, 0.633]], [0.975, [0.669, 0.582, 0.628]], [0.977, [0.669, 0.582, 0.628]], [0.978, [0.658, 0.585, 0.623]], [0.980, [0.658, 0.585, 0.623]], [0.982, [0.646, 0.588, 0.619]], [0.984, [0.646, 0.588, 0.619]], [0.986, [0.635, 0.591, 0.614]], [0.988, [0.635, 0.591, 0.614]], [0.990, [0.623, 0.594, 0.609]], [0.992, [0.623, 0.594, 0.609]], [0.994, [0.612, 0.597, 0.605]], [0.996, [0.612, 0.597, 0.605]], [0.998, [0.600, 0.600, 0.600]], [1.000, [0.600, 0.600, 0.600]]]; +var Set2 = [[0.000, [0.400, 0.761, 0.647]], [0.002, [0.400, 0.761, 0.647]], [0.004, [0.416, 0.755, 0.640]], [0.006, [0.416, 0.755, 0.640]], [0.008, [0.432, 0.749, 0.633]], [0.010, [0.432, 0.749, 0.633]], [0.012, [0.448, 0.744, 0.625]], [0.014, [0.448, 0.744, 0.625]], [0.016, [0.465, 0.738, 0.618]], [0.018, [0.465, 0.738, 0.618]], [0.020, [0.481, 0.732, 0.611]], [0.022, [0.481, 0.732, 0.611]], [0.023, [0.497, 0.727, 0.604]], [0.025, [0.497, 0.727, 0.604]], [0.027, [0.513, 0.721, 0.597]], [0.029, [0.513, 0.721, 0.597]], [0.031, [0.529, 0.715, 0.589]], [0.033, [0.529, 0.715, 0.589]], [0.035, [0.545, 0.709, 0.582]], [0.037, [0.545, 0.709, 0.582]], [0.039, [0.561, 0.704, 0.575]], [0.041, [0.561, 0.704, 0.575]], [0.043, [0.578, 0.698, 0.568]], [0.045, [0.578, 0.698, 0.568]], [0.047, [0.594, 0.692, 0.561]], [0.049, [0.594, 0.692, 0.561]], [0.051, [0.610, 0.687, 0.553]], [0.053, [0.610, 0.687, 0.553]], [0.055, [0.626, 0.681, 0.546]], [0.057, [0.626, 0.681, 0.546]], [0.059, [0.642, 0.675, 0.539]], [0.061, [0.642, 0.675, 0.539]], [0.063, [0.658, 0.669, 0.532]], [0.065, [0.658, 0.669, 0.532]], [0.067, [0.675, 0.664, 0.524]], [0.068, [0.675, 0.664, 0.524]], [0.070, [0.691, 0.658, 0.517]], [0.072, [0.691, 0.658, 0.517]], [0.074, [0.707, 0.652, 0.510]], [0.076, [0.707, 0.652, 0.510]], [0.078, [0.723, 0.647, 0.503]], [0.080, [0.723, 0.647, 0.503]], [0.082, [0.739, 0.641, 0.496]], [0.084, [0.739, 0.641, 0.496]], [0.086, [0.755, 0.635, 0.488]], [0.088, [0.755, 0.635, 0.488]], [0.090, [0.771, 0.630, 0.481]], [0.092, [0.771, 0.630, 0.481]], [0.094, [0.788, 0.624, 0.474]], [0.096, [0.788, 0.624, 0.474]], [0.098, [0.804, 0.618, 0.467]], [0.100, [0.804, 0.618, 0.467]], [0.102, [0.820, 0.612, 0.460]], [0.104, [0.820, 0.612, 0.460]], [0.106, [0.836, 0.607, 0.452]], [0.108, [0.836, 0.607, 0.452]], [0.110, [0.852, 0.601, 0.445]], [0.112, [0.852, 0.601, 0.445]], [0.114, [0.868, 0.595, 0.438]], [0.115, [0.868, 0.595, 0.438]], [0.117, [0.884, 0.590, 0.431]], [0.119, [0.884, 0.590, 0.431]], [0.121, [0.901, 0.584, 0.423]], [0.123, [0.901, 0.584, 0.423]], [0.125, [0.917, 0.578, 0.416]], [0.127, [0.917, 0.578, 0.416]], [0.129, [0.933, 0.573, 0.409]], [0.131, [0.933, 0.573, 0.409]], [0.133, [0.949, 0.567, 0.402]], [0.135, [0.949, 0.567, 0.402]], [0.137, [0.965, 0.561, 0.395]], [0.139, [0.965, 0.561, 0.395]], [0.141, [0.981, 0.555, 0.387]], [0.143, [0.981, 0.555, 0.387]], [0.145, [0.981, 0.554, 0.391]], [0.147, [0.981, 0.554, 0.391]], [0.149, [0.969, 0.556, 0.402]], [0.151, [0.969, 0.556, 0.402]], [0.153, [0.958, 0.558, 0.413]], [0.155, [0.958, 0.558, 0.413]], [0.157, [0.946, 0.560, 0.425]], [0.159, [0.946, 0.560, 0.425]], [0.160, [0.934, 0.562, 0.436]], [0.162, [0.934, 0.562, 0.436]], [0.164, [0.922, 0.564, 0.447]], [0.166, [0.922, 0.564, 0.447]], [0.168, [0.910, 0.566, 0.459]], [0.170, [0.910, 0.566, 0.459]], [0.172, [0.898, 0.568, 0.470]], [0.174, [0.898, 0.568, 0.470]], [0.176, [0.886, 0.570, 0.481]], [0.178, [0.886, 0.570, 0.481]], [0.180, [0.874, 0.573, 0.493]], [0.182, [0.874, 0.573, 0.493]], [0.184, [0.862, 0.575, 0.504]], [0.186, [0.862, 0.575, 0.504]], [0.188, [0.850, 0.577, 0.515]], [0.190, [0.850, 0.577, 0.515]], [0.192, [0.838, 0.579, 0.526]], [0.194, [0.838, 0.579, 0.526]], [0.196, [0.826, 0.581, 0.538]], [0.198, [0.826, 0.581, 0.538]], [0.200, [0.814, 0.583, 0.549]], [0.202, [0.814, 0.583, 0.549]], [0.204, [0.802, 0.585, 0.560]], [0.205, [0.802, 0.585, 0.560]], [0.207, [0.790, 0.587, 0.572]], [0.209, [0.790, 0.587, 0.572]], [0.211, [0.778, 0.589, 0.583]], [0.213, [0.778, 0.589, 0.583]], [0.215, [0.766, 0.591, 0.594]], [0.217, [0.766, 0.591, 0.594]], [0.219, [0.754, 0.593, 0.606]], [0.221, [0.754, 0.593, 0.606]], [0.223, [0.742, 0.595, 0.617]], [0.225, [0.742, 0.595, 0.617]], [0.227, [0.730, 0.597, 0.628]], [0.229, [0.730, 0.597, 0.628]], [0.231, [0.719, 0.599, 0.639]], [0.233, [0.719, 0.599, 0.639]], [0.235, [0.707, 0.601, 0.651]], [0.237, [0.707, 0.601, 0.651]], [0.239, [0.695, 0.603, 0.662]], [0.241, [0.695, 0.603, 0.662]], [0.243, [0.683, 0.605, 0.673]], [0.245, [0.683, 0.605, 0.673]], [0.247, [0.671, 0.607, 0.685]], [0.249, [0.671, 0.607, 0.685]], [0.250, [0.659, 0.609, 0.696]], [0.252, [0.659, 0.609, 0.696]], [0.254, [0.647, 0.611, 0.707]], [0.256, [0.647, 0.611, 0.707]], [0.258, [0.635, 0.613, 0.719]], [0.260, [0.635, 0.613, 0.719]], [0.262, [0.623, 0.615, 0.730]], [0.264, [0.623, 0.615, 0.730]], [0.266, [0.611, 0.618, 0.741]], [0.268, [0.611, 0.618, 0.741]], [0.270, [0.599, 0.620, 0.752]], [0.272, [0.599, 0.620, 0.752]], [0.274, [0.587, 0.622, 0.764]], [0.276, [0.587, 0.622, 0.764]], [0.278, [0.575, 0.624, 0.775]], [0.280, [0.575, 0.624, 0.775]], [0.282, [0.563, 0.626, 0.786]], [0.284, [0.563, 0.626, 0.786]], [0.286, [0.554, 0.627, 0.796]], [0.288, [0.554, 0.627, 0.796]], [0.290, [0.564, 0.625, 0.795]], [0.292, [0.564, 0.625, 0.795]], [0.294, [0.574, 0.622, 0.794]], [0.295, [0.574, 0.622, 0.794]], [0.297, [0.583, 0.620, 0.793]], [0.299, [0.583, 0.620, 0.793]], [0.301, [0.593, 0.618, 0.793]], [0.303, [0.593, 0.618, 0.793]], [0.305, [0.603, 0.615, 0.792]], [0.307, [0.603, 0.615, 0.792]], [0.309, [0.612, 0.613, 0.791]], [0.311, [0.612, 0.613, 0.791]], [0.313, [0.622, 0.611, 0.790]], [0.315, [0.622, 0.611, 0.790]], [0.317, [0.632, 0.608, 0.789]], [0.319, [0.632, 0.608, 0.789]], [0.321, [0.642, 0.606, 0.788]], [0.323, [0.642, 0.606, 0.788]], [0.325, [0.651, 0.603, 0.787]], [0.327, [0.651, 0.603, 0.787]], [0.329, [0.661, 0.601, 0.786]], [0.331, [0.661, 0.601, 0.786]], [0.333, [0.671, 0.599, 0.786]], [0.335, [0.671, 0.599, 0.786]], [0.337, [0.680, 0.596, 0.785]], [0.339, [0.680, 0.596, 0.785]], [0.341, [0.690, 0.594, 0.784]], [0.342, [0.690, 0.594, 0.784]], [0.344, [0.700, 0.592, 0.783]], [0.346, [0.700, 0.592, 0.783]], [0.348, [0.709, 0.589, 0.782]], [0.350, [0.709, 0.589, 0.782]], [0.352, [0.719, 0.587, 0.781]], [0.354, [0.719, 0.587, 0.781]], [0.356, [0.729, 0.584, 0.780]], [0.358, [0.729, 0.584, 0.780]], [0.360, [0.738, 0.582, 0.780]], [0.362, [0.738, 0.582, 0.780]], [0.364, [0.748, 0.580, 0.779]], [0.366, [0.748, 0.580, 0.779]], [0.368, [0.758, 0.577, 0.778]], [0.370, [0.758, 0.577, 0.778]], [0.372, [0.767, 0.575, 0.777]], [0.374, [0.767, 0.575, 0.777]], [0.376, [0.777, 0.573, 0.776]], [0.378, [0.777, 0.573, 0.776]], [0.380, [0.787, 0.570, 0.775]], [0.382, [0.787, 0.570, 0.775]], [0.384, [0.797, 0.568, 0.774]], [0.386, [0.797, 0.568, 0.774]], [0.387, [0.806, 0.566, 0.774]], [0.389, [0.806, 0.566, 0.774]], [0.391, [0.816, 0.563, 0.773]], [0.393, [0.816, 0.563, 0.773]], [0.395, [0.826, 0.561, 0.772]], [0.397, [0.826, 0.561, 0.772]], [0.399, [0.835, 0.558, 0.771]], [0.401, [0.835, 0.558, 0.771]], [0.403, [0.845, 0.556, 0.770]], [0.405, [0.845, 0.556, 0.770]], [0.407, [0.855, 0.554, 0.769]], [0.409, [0.855, 0.554, 0.769]], [0.411, [0.864, 0.551, 0.768]], [0.413, [0.864, 0.551, 0.768]], [0.415, [0.874, 0.549, 0.768]], [0.417, [0.874, 0.549, 0.768]], [0.419, [0.884, 0.547, 0.767]], [0.421, [0.884, 0.547, 0.767]], [0.423, [0.893, 0.544, 0.766]], [0.425, [0.893, 0.544, 0.766]], [0.427, [0.903, 0.542, 0.765]], [0.429, [0.903, 0.542, 0.765]], [0.431, [0.901, 0.547, 0.756]], [0.432, [0.901, 0.547, 0.756]], [0.434, [0.894, 0.556, 0.744]], [0.436, [0.894, 0.556, 0.744]], [0.438, [0.887, 0.564, 0.732]], [0.440, [0.887, 0.564, 0.732]], [0.442, [0.880, 0.572, 0.720]], [0.444, [0.880, 0.572, 0.720]], [0.446, [0.873, 0.581, 0.708]], [0.448, [0.873, 0.581, 0.708]], [0.450, [0.866, 0.589, 0.696]], [0.452, [0.866, 0.589, 0.696]], [0.454, [0.859, 0.598, 0.684]], [0.456, [0.859, 0.598, 0.684]], [0.458, [0.852, 0.606, 0.673]], [0.460, [0.852, 0.606, 0.673]], [0.462, [0.845, 0.614, 0.661]], [0.464, [0.845, 0.614, 0.661]], [0.466, [0.838, 0.623, 0.649]], [0.468, [0.838, 0.623, 0.649]], [0.470, [0.831, 0.631, 0.637]], [0.472, [0.831, 0.631, 0.637]], [0.474, [0.824, 0.640, 0.625]], [0.476, [0.824, 0.640, 0.625]], [0.477, [0.817, 0.648, 0.613]], [0.479, [0.817, 0.648, 0.613]], [0.481, [0.810, 0.656, 0.601]], [0.483, [0.810, 0.656, 0.601]], [0.485, [0.803, 0.665, 0.589]], [0.487, [0.803, 0.665, 0.589]], [0.489, [0.796, 0.673, 0.577]], [0.491, [0.796, 0.673, 0.577]], [0.493, [0.789, 0.682, 0.565]], [0.495, [0.789, 0.682, 0.565]], [0.497, [0.782, 0.690, 0.553]], [0.499, [0.782, 0.690, 0.553]], [0.501, [0.775, 0.698, 0.541]], [0.503, [0.775, 0.698, 0.541]], [0.505, [0.768, 0.707, 0.529]], [0.507, [0.768, 0.707, 0.529]], [0.509, [0.761, 0.715, 0.517]], [0.511, [0.761, 0.715, 0.517]], [0.513, [0.754, 0.724, 0.505]], [0.515, [0.754, 0.724, 0.505]], [0.517, [0.747, 0.732, 0.493]], [0.519, [0.747, 0.732, 0.493]], [0.521, [0.740, 0.740, 0.481]], [0.523, [0.740, 0.740, 0.481]], [0.524, [0.733, 0.749, 0.469]], [0.526, [0.733, 0.749, 0.469]], [0.528, [0.726, 0.757, 0.457]], [0.530, [0.726, 0.757, 0.457]], [0.532, [0.719, 0.765, 0.445]], [0.534, [0.719, 0.765, 0.445]], [0.536, [0.712, 0.774, 0.434]], [0.538, [0.712, 0.774, 0.434]], [0.540, [0.705, 0.782, 0.422]], [0.542, [0.705, 0.782, 0.422]], [0.544, [0.698, 0.791, 0.410]], [0.546, [0.698, 0.791, 0.410]], [0.548, [0.691, 0.799, 0.398]], [0.550, [0.691, 0.799, 0.398]], [0.552, [0.684, 0.807, 0.386]], [0.554, [0.684, 0.807, 0.386]], [0.556, [0.677, 0.816, 0.374]], [0.558, [0.677, 0.816, 0.374]], [0.560, [0.670, 0.824, 0.362]], [0.562, [0.670, 0.824, 0.362]], [0.564, [0.663, 0.833, 0.350]], [0.566, [0.663, 0.833, 0.350]], [0.568, [0.656, 0.841, 0.338]], [0.569, [0.656, 0.841, 0.338]], [0.571, [0.654, 0.847, 0.328]], [0.573, [0.654, 0.847, 0.328]], [0.575, [0.663, 0.847, 0.324]], [0.577, [0.663, 0.847, 0.324]], [0.579, [0.673, 0.847, 0.320]], [0.581, [0.673, 0.847, 0.320]], [0.583, [0.682, 0.847, 0.316]], [0.585, [0.682, 0.847, 0.316]], [0.587, [0.692, 0.848, 0.312]], [0.589, [0.692, 0.848, 0.312]], [0.591, [0.702, 0.848, 0.308]], [0.593, [0.702, 0.848, 0.308]], [0.595, [0.711, 0.848, 0.304]], [0.597, [0.711, 0.848, 0.304]], [0.599, [0.721, 0.848, 0.300]], [0.601, [0.721, 0.848, 0.300]], [0.603, [0.730, 0.848, 0.296]], [0.605, [0.730, 0.848, 0.296]], [0.607, [0.740, 0.848, 0.292]], [0.609, [0.740, 0.848, 0.292]], [0.611, [0.750, 0.848, 0.288]], [0.613, [0.750, 0.848, 0.288]], [0.614, [0.759, 0.848, 0.284]], [0.616, [0.759, 0.848, 0.284]], [0.618, [0.769, 0.848, 0.280]], [0.620, [0.769, 0.848, 0.280]], [0.622, [0.778, 0.848, 0.276]], [0.624, [0.778, 0.848, 0.276]], [0.626, [0.788, 0.849, 0.273]], [0.628, [0.788, 0.849, 0.273]], [0.630, [0.797, 0.849, 0.269]], [0.632, [0.797, 0.849, 0.269]], [0.634, [0.807, 0.849, 0.265]], [0.636, [0.807, 0.849, 0.265]], [0.638, [0.817, 0.849, 0.261]], [0.640, [0.817, 0.849, 0.261]], [0.642, [0.826, 0.849, 0.257]], [0.644, [0.826, 0.849, 0.257]], [0.646, [0.836, 0.849, 0.253]], [0.648, [0.836, 0.849, 0.253]], [0.650, [0.845, 0.849, 0.249]], [0.652, [0.845, 0.849, 0.249]], [0.654, [0.855, 0.849, 0.245]], [0.656, [0.855, 0.849, 0.245]], [0.658, [0.864, 0.849, 0.241]], [0.659, [0.864, 0.849, 0.241]], [0.661, [0.874, 0.850, 0.237]], [0.663, [0.874, 0.850, 0.237]], [0.665, [0.884, 0.850, 0.233]], [0.667, [0.884, 0.850, 0.233]], [0.669, [0.893, 0.850, 0.229]], [0.671, [0.893, 0.850, 0.229]], [0.673, [0.903, 0.850, 0.225]], [0.675, [0.903, 0.850, 0.225]], [0.677, [0.912, 0.850, 0.221]], [0.679, [0.912, 0.850, 0.221]], [0.681, [0.922, 0.850, 0.217]], [0.683, [0.922, 0.850, 0.217]], [0.685, [0.932, 0.850, 0.213]], [0.687, [0.932, 0.850, 0.213]], [0.689, [0.941, 0.850, 0.209]], [0.691, [0.941, 0.850, 0.209]], [0.693, [0.951, 0.850, 0.205]], [0.695, [0.951, 0.850, 0.205]], [0.697, [0.960, 0.851, 0.201]], [0.699, [0.960, 0.851, 0.201]], [0.701, [0.970, 0.851, 0.197]], [0.703, [0.970, 0.851, 0.197]], [0.705, [0.979, 0.851, 0.193]], [0.706, [0.979, 0.851, 0.193]], [0.708, [0.989, 0.851, 0.189]], [0.710, [0.989, 0.851, 0.189]], [0.712, [0.999, 0.851, 0.185]], [0.714, [0.999, 0.851, 0.185]], [0.716, [0.998, 0.849, 0.194]], [0.718, [0.998, 0.849, 0.194]], [0.720, [0.995, 0.847, 0.205]], [0.722, [0.995, 0.847, 0.205]], [0.724, [0.992, 0.845, 0.215]], [0.726, [0.992, 0.845, 0.215]], [0.728, [0.989, 0.842, 0.226]], [0.730, [0.989, 0.842, 0.226]], [0.732, [0.986, 0.840, 0.237]], [0.734, [0.986, 0.840, 0.237]], [0.736, [0.984, 0.838, 0.248]], [0.738, [0.984, 0.838, 0.248]], [0.740, [0.981, 0.835, 0.259]], [0.742, [0.981, 0.835, 0.259]], [0.744, [0.978, 0.833, 0.270]], [0.746, [0.978, 0.833, 0.270]], [0.748, [0.975, 0.831, 0.281]], [0.750, [0.975, 0.831, 0.281]], [0.751, [0.972, 0.829, 0.291]], [0.753, [0.972, 0.829, 0.291]], [0.755, [0.970, 0.826, 0.302]], [0.757, [0.970, 0.826, 0.302]], [0.759, [0.967, 0.824, 0.313]], [0.761, [0.967, 0.824, 0.313]], [0.763, [0.964, 0.822, 0.324]], [0.765, [0.964, 0.822, 0.324]], [0.767, [0.961, 0.820, 0.335]], [0.769, [0.961, 0.820, 0.335]], [0.771, [0.958, 0.817, 0.346]], [0.773, [0.958, 0.817, 0.346]], [0.775, [0.956, 0.815, 0.357]], [0.777, [0.956, 0.815, 0.357]], [0.779, [0.953, 0.813, 0.368]], [0.781, [0.953, 0.813, 0.368]], [0.783, [0.950, 0.811, 0.378]], [0.785, [0.950, 0.811, 0.378]], [0.787, [0.947, 0.808, 0.389]], [0.789, [0.947, 0.808, 0.389]], [0.791, [0.944, 0.806, 0.400]], [0.793, [0.944, 0.806, 0.400]], [0.795, [0.942, 0.804, 0.411]], [0.796, [0.942, 0.804, 0.411]], [0.798, [0.939, 0.802, 0.422]], [0.800, [0.939, 0.802, 0.422]], [0.802, [0.936, 0.799, 0.433]], [0.804, [0.936, 0.799, 0.433]], [0.806, [0.933, 0.797, 0.444]], [0.808, [0.933, 0.797, 0.444]], [0.810, [0.930, 0.795, 0.455]], [0.812, [0.930, 0.795, 0.455]], [0.814, [0.928, 0.793, 0.465]], [0.816, [0.928, 0.793, 0.465]], [0.818, [0.925, 0.790, 0.476]], [0.820, [0.925, 0.790, 0.476]], [0.822, [0.922, 0.788, 0.487]], [0.824, [0.922, 0.788, 0.487]], [0.826, [0.919, 0.786, 0.498]], [0.828, [0.919, 0.786, 0.498]], [0.830, [0.916, 0.783, 0.509]], [0.832, [0.916, 0.783, 0.509]], [0.834, [0.914, 0.781, 0.520]], [0.836, [0.914, 0.781, 0.520]], [0.838, [0.911, 0.779, 0.531]], [0.840, [0.911, 0.779, 0.531]], [0.841, [0.908, 0.777, 0.542]], [0.843, [0.908, 0.777, 0.542]], [0.845, [0.905, 0.774, 0.552]], [0.847, [0.905, 0.774, 0.552]], [0.849, [0.902, 0.772, 0.563]], [0.851, [0.902, 0.772, 0.563]], [0.853, [0.900, 0.770, 0.574]], [0.855, [0.900, 0.770, 0.574]], [0.857, [0.896, 0.768, 0.582]], [0.859, [0.896, 0.768, 0.582]], [0.861, [0.890, 0.766, 0.585]], [0.863, [0.890, 0.766, 0.585]], [0.865, [0.885, 0.764, 0.588]], [0.867, [0.885, 0.764, 0.588]], [0.869, [0.880, 0.762, 0.592]], [0.871, [0.880, 0.762, 0.592]], [0.873, [0.874, 0.761, 0.595]], [0.875, [0.874, 0.761, 0.595]], [0.877, [0.869, 0.759, 0.599]], [0.879, [0.869, 0.759, 0.599]], [0.881, [0.863, 0.757, 0.602]], [0.883, [0.863, 0.757, 0.602]], [0.885, [0.858, 0.755, 0.605]], [0.886, [0.858, 0.755, 0.605]], [0.888, [0.853, 0.753, 0.609]], [0.890, [0.853, 0.753, 0.609]], [0.892, [0.847, 0.751, 0.612]], [0.894, [0.847, 0.751, 0.612]], [0.896, [0.842, 0.750, 0.615]], [0.898, [0.842, 0.750, 0.615]], [0.900, [0.837, 0.748, 0.619]], [0.902, [0.837, 0.748, 0.619]], [0.904, [0.831, 0.746, 0.622]], [0.906, [0.831, 0.746, 0.622]], [0.908, [0.826, 0.744, 0.625]], [0.910, [0.826, 0.744, 0.625]], [0.912, [0.820, 0.742, 0.629]], [0.914, [0.820, 0.742, 0.629]], [0.916, [0.815, 0.740, 0.632]], [0.918, [0.815, 0.740, 0.632]], [0.920, [0.810, 0.739, 0.635]], [0.922, [0.810, 0.739, 0.635]], [0.924, [0.804, 0.737, 0.639]], [0.926, [0.804, 0.737, 0.639]], [0.928, [0.799, 0.735, 0.642]], [0.930, [0.799, 0.735, 0.642]], [0.932, [0.793, 0.733, 0.645]], [0.933, [0.793, 0.733, 0.645]], [0.935, [0.788, 0.731, 0.649]], [0.937, [0.788, 0.731, 0.649]], [0.939, [0.783, 0.729, 0.652]], [0.941, [0.783, 0.729, 0.652]], [0.943, [0.777, 0.728, 0.655]], [0.945, [0.777, 0.728, 0.655]], [0.947, [0.772, 0.726, 0.659]], [0.949, [0.772, 0.726, 0.659]], [0.951, [0.767, 0.724, 0.662]], [0.953, [0.767, 0.724, 0.662]], [0.955, [0.761, 0.722, 0.665]], [0.957, [0.761, 0.722, 0.665]], [0.959, [0.756, 0.720, 0.669]], [0.961, [0.756, 0.720, 0.669]], [0.963, [0.750, 0.718, 0.672]], [0.965, [0.750, 0.718, 0.672]], [0.967, [0.745, 0.717, 0.675]], [0.969, [0.745, 0.717, 0.675]], [0.971, [0.740, 0.715, 0.679]], [0.973, [0.740, 0.715, 0.679]], [0.975, [0.734, 0.713, 0.682]], [0.977, [0.734, 0.713, 0.682]], [0.978, [0.729, 0.711, 0.685]], [0.980, [0.729, 0.711, 0.685]], [0.982, [0.723, 0.709, 0.689]], [0.984, [0.723, 0.709, 0.689]], [0.986, [0.718, 0.707, 0.692]], [0.988, [0.718, 0.707, 0.692]], [0.990, [0.713, 0.706, 0.695]], [0.992, [0.713, 0.706, 0.695]], [0.994, [0.707, 0.704, 0.699]], [0.996, [0.707, 0.704, 0.699]], [0.998, [0.702, 0.702, 0.702]], [1.000, [0.702, 0.702, 0.702]]]; +var Set3 = [[0.000, [0.553, 0.827, 0.780]], [0.002, [0.553, 0.827, 0.780]], [0.004, [0.572, 0.835, 0.777]], [0.006, [0.572, 0.835, 0.777]], [0.008, [0.592, 0.842, 0.774]], [0.010, [0.592, 0.842, 0.774]], [0.012, [0.611, 0.850, 0.770]], [0.014, [0.611, 0.850, 0.770]], [0.016, [0.630, 0.857, 0.767]], [0.018, [0.630, 0.857, 0.767]], [0.020, [0.649, 0.865, 0.763]], [0.022, [0.649, 0.865, 0.763]], [0.023, [0.669, 0.872, 0.760]], [0.025, [0.669, 0.872, 0.760]], [0.027, [0.688, 0.880, 0.757]], [0.029, [0.688, 0.880, 0.757]], [0.031, [0.707, 0.887, 0.753]], [0.033, [0.707, 0.887, 0.753]], [0.035, [0.727, 0.894, 0.750]], [0.037, [0.727, 0.894, 0.750]], [0.039, [0.746, 0.902, 0.747]], [0.041, [0.746, 0.902, 0.747]], [0.043, [0.765, 0.909, 0.743]], [0.045, [0.765, 0.909, 0.743]], [0.047, [0.784, 0.917, 0.740]], [0.049, [0.784, 0.917, 0.740]], [0.051, [0.804, 0.924, 0.736]], [0.053, [0.804, 0.924, 0.736]], [0.055, [0.823, 0.932, 0.733]], [0.057, [0.823, 0.932, 0.733]], [0.059, [0.842, 0.939, 0.730]], [0.061, [0.842, 0.939, 0.730]], [0.063, [0.861, 0.947, 0.726]], [0.065, [0.861, 0.947, 0.726]], [0.067, [0.881, 0.954, 0.723]], [0.068, [0.881, 0.954, 0.723]], [0.070, [0.900, 0.961, 0.719]], [0.072, [0.900, 0.961, 0.719]], [0.074, [0.919, 0.969, 0.716]], [0.076, [0.919, 0.969, 0.716]], [0.078, [0.939, 0.976, 0.713]], [0.080, [0.939, 0.976, 0.713]], [0.082, [0.958, 0.984, 0.709]], [0.084, [0.958, 0.984, 0.709]], [0.086, [0.977, 0.991, 0.706]], [0.088, [0.977, 0.991, 0.706]], [0.090, [0.996, 0.999, 0.703]], [0.092, [0.996, 0.999, 0.703]], [0.094, [0.991, 0.990, 0.707]], [0.096, [0.991, 0.990, 0.707]], [0.098, [0.980, 0.979, 0.714]], [0.100, [0.980, 0.979, 0.714]], [0.102, [0.969, 0.967, 0.721]], [0.104, [0.969, 0.967, 0.721]], [0.106, [0.958, 0.955, 0.727]], [0.108, [0.958, 0.955, 0.727]], [0.110, [0.947, 0.944, 0.734]], [0.112, [0.947, 0.944, 0.734]], [0.114, [0.936, 0.932, 0.740]], [0.115, [0.936, 0.932, 0.740]], [0.117, [0.925, 0.920, 0.747]], [0.119, [0.925, 0.920, 0.747]], [0.121, [0.914, 0.909, 0.754]], [0.123, [0.914, 0.909, 0.754]], [0.125, [0.903, 0.897, 0.760]], [0.127, [0.903, 0.897, 0.760]], [0.129, [0.892, 0.885, 0.767]], [0.131, [0.892, 0.885, 0.767]], [0.133, [0.881, 0.874, 0.773]], [0.135, [0.881, 0.874, 0.773]], [0.137, [0.870, 0.862, 0.780]], [0.139, [0.870, 0.862, 0.780]], [0.141, [0.859, 0.850, 0.787]], [0.143, [0.859, 0.850, 0.787]], [0.145, [0.848, 0.839, 0.793]], [0.147, [0.848, 0.839, 0.793]], [0.149, [0.837, 0.827, 0.800]], [0.151, [0.837, 0.827, 0.800]], [0.153, [0.826, 0.815, 0.806]], [0.155, [0.826, 0.815, 0.806]], [0.157, [0.815, 0.804, 0.813]], [0.159, [0.815, 0.804, 0.813]], [0.160, [0.804, 0.792, 0.820]], [0.162, [0.804, 0.792, 0.820]], [0.164, [0.793, 0.780, 0.826]], [0.166, [0.793, 0.780, 0.826]], [0.168, [0.782, 0.769, 0.833]], [0.170, [0.782, 0.769, 0.833]], [0.172, [0.771, 0.757, 0.839]], [0.174, [0.771, 0.757, 0.839]], [0.176, [0.760, 0.745, 0.846]], [0.178, [0.760, 0.745, 0.846]], [0.180, [0.749, 0.734, 0.853]], [0.182, [0.749, 0.734, 0.853]], [0.184, [0.752, 0.723, 0.844]], [0.186, [0.752, 0.723, 0.844]], [0.188, [0.762, 0.713, 0.826]], [0.190, [0.762, 0.713, 0.826]], [0.192, [0.772, 0.704, 0.809]], [0.194, [0.772, 0.704, 0.809]], [0.196, [0.783, 0.694, 0.791]], [0.198, [0.783, 0.694, 0.791]], [0.200, [0.793, 0.684, 0.773]], [0.202, [0.793, 0.684, 0.773]], [0.204, [0.803, 0.674, 0.756]], [0.205, [0.803, 0.674, 0.756]], [0.207, [0.814, 0.664, 0.738]], [0.209, [0.814, 0.664, 0.738]], [0.211, [0.824, 0.654, 0.721]], [0.213, [0.824, 0.654, 0.721]], [0.215, [0.834, 0.645, 0.703]], [0.217, [0.834, 0.645, 0.703]], [0.219, [0.845, 0.635, 0.685]], [0.221, [0.845, 0.635, 0.685]], [0.223, [0.855, 0.625, 0.668]], [0.225, [0.855, 0.625, 0.668]], [0.227, [0.865, 0.615, 0.650]], [0.229, [0.865, 0.615, 0.650]], [0.231, [0.875, 0.605, 0.633]], [0.233, [0.875, 0.605, 0.633]], [0.235, [0.886, 0.596, 0.615]], [0.237, [0.886, 0.596, 0.615]], [0.239, [0.896, 0.586, 0.597]], [0.241, [0.896, 0.586, 0.597]], [0.243, [0.906, 0.576, 0.580]], [0.245, [0.906, 0.576, 0.580]], [0.247, [0.917, 0.566, 0.562]], [0.249, [0.917, 0.566, 0.562]], [0.250, [0.927, 0.556, 0.545]], [0.252, [0.927, 0.556, 0.545]], [0.254, [0.937, 0.547, 0.527]], [0.256, [0.937, 0.547, 0.527]], [0.258, [0.948, 0.537, 0.509]], [0.260, [0.948, 0.537, 0.509]], [0.262, [0.958, 0.527, 0.492]], [0.264, [0.958, 0.527, 0.492]], [0.266, [0.968, 0.517, 0.474]], [0.268, [0.968, 0.517, 0.474]], [0.270, [0.979, 0.507, 0.457]], [0.272, [0.979, 0.507, 0.457]], [0.274, [0.975, 0.506, 0.455]], [0.276, [0.975, 0.506, 0.455]], [0.278, [0.954, 0.514, 0.471]], [0.280, [0.954, 0.514, 0.471]], [0.282, [0.933, 0.522, 0.487]], [0.284, [0.933, 0.522, 0.487]], [0.286, [0.912, 0.531, 0.504]], [0.288, [0.912, 0.531, 0.504]], [0.290, [0.892, 0.539, 0.520]], [0.292, [0.892, 0.539, 0.520]], [0.294, [0.871, 0.547, 0.537]], [0.295, [0.871, 0.547, 0.537]], [0.297, [0.850, 0.555, 0.553]], [0.299, [0.850, 0.555, 0.553]], [0.301, [0.829, 0.564, 0.569]], [0.303, [0.829, 0.564, 0.569]], [0.305, [0.808, 0.572, 0.586]], [0.307, [0.808, 0.572, 0.586]], [0.309, [0.788, 0.580, 0.602]], [0.311, [0.788, 0.580, 0.602]], [0.313, [0.767, 0.589, 0.619]], [0.315, [0.767, 0.589, 0.619]], [0.317, [0.746, 0.597, 0.635]], [0.319, [0.746, 0.597, 0.635]], [0.321, [0.725, 0.605, 0.651]], [0.323, [0.725, 0.605, 0.651]], [0.325, [0.704, 0.613, 0.668]], [0.327, [0.704, 0.613, 0.668]], [0.329, [0.684, 0.622, 0.684]], [0.331, [0.684, 0.622, 0.684]], [0.333, [0.663, 0.630, 0.701]], [0.335, [0.663, 0.630, 0.701]], [0.337, [0.642, 0.638, 0.717]], [0.339, [0.642, 0.638, 0.717]], [0.341, [0.621, 0.647, 0.733]], [0.342, [0.621, 0.647, 0.733]], [0.344, [0.600, 0.655, 0.750]], [0.346, [0.600, 0.655, 0.750]], [0.348, [0.580, 0.663, 0.766]], [0.350, [0.580, 0.663, 0.766]], [0.352, [0.559, 0.672, 0.783]], [0.354, [0.559, 0.672, 0.783]], [0.356, [0.538, 0.680, 0.799]], [0.358, [0.538, 0.680, 0.799]], [0.360, [0.517, 0.688, 0.816]], [0.362, [0.517, 0.688, 0.816]], [0.364, [0.508, 0.694, 0.822]], [0.366, [0.508, 0.694, 0.822]], [0.368, [0.529, 0.695, 0.803]], [0.370, [0.529, 0.695, 0.803]], [0.372, [0.550, 0.695, 0.784]], [0.374, [0.550, 0.695, 0.784]], [0.376, [0.571, 0.696, 0.765]], [0.378, [0.571, 0.696, 0.765]], [0.380, [0.592, 0.696, 0.746]], [0.382, [0.592, 0.696, 0.746]], [0.384, [0.613, 0.697, 0.727]], [0.386, [0.613, 0.697, 0.727]], [0.387, [0.635, 0.697, 0.708]], [0.389, [0.635, 0.697, 0.708]], [0.391, [0.656, 0.698, 0.688]], [0.393, [0.656, 0.698, 0.688]], [0.395, [0.677, 0.698, 0.669]], [0.397, [0.677, 0.698, 0.669]], [0.399, [0.698, 0.699, 0.650]], [0.401, [0.698, 0.699, 0.650]], [0.403, [0.719, 0.699, 0.631]], [0.405, [0.719, 0.699, 0.631]], [0.407, [0.740, 0.700, 0.612]], [0.409, [0.740, 0.700, 0.612]], [0.411, [0.761, 0.700, 0.593]], [0.413, [0.761, 0.700, 0.593]], [0.415, [0.783, 0.701, 0.574]], [0.417, [0.783, 0.701, 0.574]], [0.419, [0.804, 0.701, 0.555]], [0.421, [0.804, 0.701, 0.555]], [0.423, [0.825, 0.702, 0.536]], [0.425, [0.825, 0.702, 0.536]], [0.427, [0.846, 0.702, 0.516]], [0.429, [0.846, 0.702, 0.516]], [0.431, [0.867, 0.703, 0.497]], [0.432, [0.867, 0.703, 0.497]], [0.434, [0.888, 0.703, 0.478]], [0.436, [0.888, 0.703, 0.478]], [0.438, [0.909, 0.704, 0.459]], [0.440, [0.909, 0.704, 0.459]], [0.442, [0.931, 0.704, 0.440]], [0.444, [0.931, 0.704, 0.440]], [0.446, [0.952, 0.705, 0.421]], [0.448, [0.952, 0.705, 0.421]], [0.450, [0.973, 0.705, 0.402]], [0.452, [0.973, 0.705, 0.402]], [0.454, [0.991, 0.707, 0.384]], [0.456, [0.991, 0.707, 0.384]], [0.458, [0.979, 0.714, 0.386]], [0.460, [0.979, 0.714, 0.386]], [0.462, [0.966, 0.721, 0.387]], [0.464, [0.966, 0.721, 0.387]], [0.466, [0.953, 0.728, 0.388]], [0.468, [0.953, 0.728, 0.388]], [0.470, [0.941, 0.735, 0.389]], [0.472, [0.941, 0.735, 0.389]], [0.474, [0.928, 0.742, 0.390]], [0.476, [0.928, 0.742, 0.390]], [0.477, [0.916, 0.749, 0.392]], [0.479, [0.916, 0.749, 0.392]], [0.481, [0.903, 0.756, 0.393]], [0.483, [0.903, 0.756, 0.393]], [0.485, [0.891, 0.763, 0.394]], [0.487, [0.891, 0.763, 0.394]], [0.489, [0.878, 0.770, 0.395]], [0.491, [0.878, 0.770, 0.395]], [0.493, [0.866, 0.778, 0.396]], [0.495, [0.866, 0.778, 0.396]], [0.497, [0.853, 0.785, 0.397]], [0.499, [0.853, 0.785, 0.397]], [0.501, [0.841, 0.792, 0.399]], [0.503, [0.841, 0.792, 0.399]], [0.505, [0.828, 0.799, 0.400]], [0.507, [0.828, 0.799, 0.400]], [0.509, [0.816, 0.806, 0.401]], [0.511, [0.816, 0.806, 0.401]], [0.513, [0.803, 0.813, 0.402]], [0.515, [0.803, 0.813, 0.402]], [0.517, [0.791, 0.820, 0.403]], [0.519, [0.791, 0.820, 0.403]], [0.521, [0.778, 0.827, 0.405]], [0.523, [0.778, 0.827, 0.405]], [0.524, [0.766, 0.834, 0.406]], [0.526, [0.766, 0.834, 0.406]], [0.528, [0.753, 0.842, 0.407]], [0.530, [0.753, 0.842, 0.407]], [0.532, [0.741, 0.849, 0.408]], [0.534, [0.741, 0.849, 0.408]], [0.536, [0.728, 0.856, 0.409]], [0.538, [0.728, 0.856, 0.409]], [0.540, [0.716, 0.863, 0.410]], [0.542, [0.716, 0.863, 0.410]], [0.544, [0.703, 0.870, 0.412]], [0.546, [0.703, 0.870, 0.412]], [0.548, [0.713, 0.868, 0.431]], [0.550, [0.713, 0.868, 0.431]], [0.552, [0.726, 0.865, 0.452]], [0.554, [0.726, 0.865, 0.452]], [0.556, [0.738, 0.862, 0.473]], [0.558, [0.738, 0.862, 0.473]], [0.560, [0.750, 0.859, 0.494]], [0.562, [0.750, 0.859, 0.494]], [0.564, [0.763, 0.856, 0.515]], [0.566, [0.763, 0.856, 0.515]], [0.568, [0.775, 0.854, 0.536]], [0.569, [0.775, 0.854, 0.536]], [0.571, [0.787, 0.851, 0.557]], [0.573, [0.787, 0.851, 0.557]], [0.575, [0.800, 0.848, 0.578]], [0.577, [0.800, 0.848, 0.578]], [0.579, [0.812, 0.845, 0.599]], [0.581, [0.812, 0.845, 0.599]], [0.583, [0.824, 0.842, 0.620]], [0.585, [0.824, 0.842, 0.620]], [0.587, [0.837, 0.839, 0.641]], [0.589, [0.837, 0.839, 0.641]], [0.591, [0.849, 0.836, 0.662]], [0.593, [0.849, 0.836, 0.662]], [0.595, [0.861, 0.833, 0.683]], [0.597, [0.861, 0.833, 0.683]], [0.599, [0.874, 0.831, 0.704]], [0.601, [0.874, 0.831, 0.704]], [0.603, [0.886, 0.828, 0.725]], [0.605, [0.886, 0.828, 0.725]], [0.607, [0.898, 0.825, 0.745]], [0.609, [0.898, 0.825, 0.745]], [0.611, [0.911, 0.822, 0.766]], [0.613, [0.911, 0.822, 0.766]], [0.614, [0.923, 0.819, 0.787]], [0.616, [0.923, 0.819, 0.787]], [0.618, [0.935, 0.816, 0.808]], [0.620, [0.935, 0.816, 0.808]], [0.622, [0.948, 0.813, 0.829]], [0.624, [0.948, 0.813, 0.829]], [0.626, [0.960, 0.810, 0.850]], [0.628, [0.960, 0.810, 0.850]], [0.630, [0.973, 0.808, 0.871]], [0.632, [0.973, 0.808, 0.871]], [0.634, [0.985, 0.805, 0.892]], [0.636, [0.985, 0.805, 0.892]], [0.638, [0.984, 0.805, 0.897]], [0.640, [0.984, 0.805, 0.897]], [0.642, [0.978, 0.807, 0.895]], [0.644, [0.978, 0.807, 0.895]], [0.646, [0.972, 0.809, 0.893]], [0.648, [0.972, 0.809, 0.893]], [0.650, [0.966, 0.811, 0.890]], [0.652, [0.966, 0.811, 0.890]], [0.654, [0.960, 0.814, 0.888]], [0.656, [0.960, 0.814, 0.888]], [0.658, [0.954, 0.816, 0.886]], [0.659, [0.954, 0.816, 0.886]], [0.661, [0.948, 0.818, 0.884]], [0.663, [0.948, 0.818, 0.884]], [0.665, [0.942, 0.820, 0.882]], [0.667, [0.942, 0.820, 0.882]], [0.669, [0.937, 0.822, 0.880]], [0.671, [0.937, 0.822, 0.880]], [0.673, [0.931, 0.824, 0.878]], [0.675, [0.931, 0.824, 0.878]], [0.677, [0.925, 0.826, 0.876]], [0.679, [0.925, 0.826, 0.876]], [0.681, [0.919, 0.828, 0.874]], [0.683, [0.919, 0.828, 0.874]], [0.685, [0.913, 0.830, 0.872]], [0.687, [0.913, 0.830, 0.872]], [0.689, [0.907, 0.832, 0.870]], [0.691, [0.907, 0.832, 0.870]], [0.693, [0.901, 0.834, 0.868]], [0.695, [0.901, 0.834, 0.868]], [0.697, [0.895, 0.836, 0.866]], [0.699, [0.895, 0.836, 0.866]], [0.701, [0.889, 0.838, 0.864]], [0.703, [0.889, 0.838, 0.864]], [0.705, [0.883, 0.840, 0.862]], [0.706, [0.883, 0.840, 0.862]], [0.708, [0.877, 0.842, 0.860]], [0.710, [0.877, 0.842, 0.860]], [0.712, [0.871, 0.844, 0.858]], [0.714, [0.871, 0.844, 0.858]], [0.716, [0.866, 0.846, 0.856]], [0.718, [0.866, 0.846, 0.856]], [0.720, [0.860, 0.848, 0.854]], [0.722, [0.860, 0.848, 0.854]], [0.724, [0.854, 0.850, 0.852]], [0.726, [0.854, 0.850, 0.852]], [0.728, [0.848, 0.843, 0.848]], [0.730, [0.848, 0.843, 0.848]], [0.732, [0.843, 0.828, 0.844]], [0.734, [0.843, 0.828, 0.844]], [0.736, [0.838, 0.813, 0.839]], [0.738, [0.838, 0.813, 0.839]], [0.740, [0.834, 0.798, 0.834]], [0.742, [0.834, 0.798, 0.834]], [0.744, [0.829, 0.783, 0.829]], [0.746, [0.829, 0.783, 0.829]], [0.748, [0.824, 0.767, 0.825]], [0.750, [0.824, 0.767, 0.825]], [0.751, [0.819, 0.752, 0.820]], [0.753, [0.819, 0.752, 0.820]], [0.755, [0.814, 0.737, 0.815]], [0.757, [0.814, 0.737, 0.815]], [0.759, [0.809, 0.722, 0.811]], [0.761, [0.809, 0.722, 0.811]], [0.763, [0.804, 0.707, 0.806]], [0.765, [0.804, 0.707, 0.806]], [0.767, [0.799, 0.692, 0.801]], [0.769, [0.799, 0.692, 0.801]], [0.771, [0.794, 0.677, 0.796]], [0.773, [0.794, 0.677, 0.796]], [0.775, [0.789, 0.662, 0.792]], [0.777, [0.789, 0.662, 0.792]], [0.779, [0.785, 0.647, 0.787]], [0.781, [0.785, 0.647, 0.787]], [0.783, [0.780, 0.632, 0.782]], [0.785, [0.780, 0.632, 0.782]], [0.787, [0.775, 0.617, 0.777]], [0.789, [0.775, 0.617, 0.777]], [0.791, [0.770, 0.602, 0.773]], [0.793, [0.770, 0.602, 0.773]], [0.795, [0.765, 0.587, 0.768]], [0.796, [0.765, 0.587, 0.768]], [0.798, [0.760, 0.572, 0.763]], [0.800, [0.760, 0.572, 0.763]], [0.802, [0.755, 0.557, 0.758]], [0.804, [0.755, 0.557, 0.758]], [0.806, [0.750, 0.542, 0.754]], [0.808, [0.750, 0.542, 0.754]], [0.810, [0.745, 0.527, 0.749]], [0.812, [0.745, 0.527, 0.749]], [0.814, [0.740, 0.512, 0.744]], [0.816, [0.740, 0.512, 0.744]], [0.818, [0.738, 0.509, 0.742]], [0.820, [0.738, 0.509, 0.742]], [0.822, [0.741, 0.527, 0.743]], [0.824, [0.741, 0.527, 0.743]], [0.826, [0.744, 0.545, 0.744]], [0.828, [0.744, 0.545, 0.744]], [0.830, [0.746, 0.563, 0.746]], [0.832, [0.746, 0.563, 0.746]], [0.834, [0.749, 0.581, 0.747]], [0.836, [0.749, 0.581, 0.747]], [0.838, [0.752, 0.599, 0.748]], [0.840, [0.752, 0.599, 0.748]], [0.841, [0.754, 0.617, 0.750]], [0.843, [0.754, 0.617, 0.750]], [0.845, [0.757, 0.635, 0.751]], [0.847, [0.757, 0.635, 0.751]], [0.849, [0.760, 0.653, 0.752]], [0.851, [0.760, 0.653, 0.752]], [0.853, [0.763, 0.671, 0.754]], [0.855, [0.763, 0.671, 0.754]], [0.857, [0.765, 0.690, 0.755]], [0.859, [0.765, 0.690, 0.755]], [0.861, [0.768, 0.708, 0.757]], [0.863, [0.768, 0.708, 0.757]], [0.865, [0.771, 0.726, 0.758]], [0.867, [0.771, 0.726, 0.758]], [0.869, [0.773, 0.744, 0.759]], [0.871, [0.773, 0.744, 0.759]], [0.873, [0.776, 0.762, 0.761]], [0.875, [0.776, 0.762, 0.761]], [0.877, [0.779, 0.780, 0.762]], [0.879, [0.779, 0.780, 0.762]], [0.881, [0.782, 0.798, 0.763]], [0.883, [0.782, 0.798, 0.763]], [0.885, [0.784, 0.816, 0.765]], [0.886, [0.784, 0.816, 0.765]], [0.888, [0.787, 0.834, 0.766]], [0.890, [0.787, 0.834, 0.766]], [0.892, [0.790, 0.852, 0.767]], [0.894, [0.790, 0.852, 0.767]], [0.896, [0.792, 0.871, 0.769]], [0.898, [0.792, 0.871, 0.769]], [0.900, [0.795, 0.889, 0.770]], [0.902, [0.795, 0.889, 0.770]], [0.904, [0.798, 0.907, 0.771]], [0.906, [0.798, 0.907, 0.771]], [0.908, [0.802, 0.922, 0.770]], [0.910, [0.802, 0.922, 0.770]], [0.912, [0.810, 0.922, 0.755]], [0.914, [0.810, 0.922, 0.755]], [0.916, [0.819, 0.922, 0.741]], [0.918, [0.819, 0.922, 0.741]], [0.920, [0.827, 0.923, 0.726]], [0.922, [0.827, 0.923, 0.726]], [0.924, [0.836, 0.923, 0.712]], [0.926, [0.836, 0.923, 0.712]], [0.928, [0.845, 0.923, 0.697]], [0.930, [0.845, 0.923, 0.697]], [0.932, [0.853, 0.924, 0.683]], [0.933, [0.853, 0.924, 0.683]], [0.935, [0.862, 0.924, 0.668]], [0.937, [0.862, 0.924, 0.668]], [0.939, [0.871, 0.924, 0.654]], [0.941, [0.871, 0.924, 0.654]], [0.943, [0.879, 0.925, 0.639]], [0.945, [0.879, 0.925, 0.639]], [0.947, [0.888, 0.925, 0.624]], [0.949, [0.888, 0.925, 0.624]], [0.951, [0.896, 0.925, 0.610]], [0.953, [0.896, 0.925, 0.610]], [0.955, [0.905, 0.926, 0.595]], [0.957, [0.905, 0.926, 0.595]], [0.959, [0.914, 0.926, 0.581]], [0.961, [0.914, 0.926, 0.581]], [0.963, [0.922, 0.926, 0.566]], [0.965, [0.922, 0.926, 0.566]], [0.967, [0.931, 0.927, 0.552]], [0.969, [0.931, 0.927, 0.552]], [0.971, [0.940, 0.927, 0.537]], [0.973, [0.940, 0.927, 0.537]], [0.975, [0.948, 0.927, 0.523]], [0.977, [0.948, 0.927, 0.523]], [0.978, [0.957, 0.928, 0.508]], [0.980, [0.957, 0.928, 0.508]], [0.982, [0.965, 0.928, 0.493]], [0.984, [0.965, 0.928, 0.493]], [0.986, [0.974, 0.928, 0.479]], [0.988, [0.974, 0.928, 0.479]], [0.990, [0.983, 0.929, 0.464]], [0.992, [0.983, 0.929, 0.464]], [0.994, [0.991, 0.929, 0.450]], [0.996, [0.991, 0.929, 0.450]], [0.998, [1.000, 0.929, 0.435]], [1.000, [1.000, 0.929, 0.435]]]; + +// Sequential +var Blues = [[0.000, [0.969, 0.984, 1.000]], [0.002, [0.969, 0.984, 1.000]], [0.004, [0.966, 0.982, 0.999]], [0.006, [0.966, 0.982, 0.999]], [0.008, [0.962, 0.980, 0.998]], [0.010, [0.962, 0.980, 0.998]], [0.012, [0.959, 0.978, 0.997]], [0.014, [0.959, 0.978, 0.997]], [0.016, [0.956, 0.976, 0.996]], [0.018, [0.956, 0.976, 0.996]], [0.020, [0.953, 0.974, 0.995]], [0.022, [0.953, 0.974, 0.995]], [0.023, [0.950, 0.973, 0.994]], [0.025, [0.950, 0.973, 0.994]], [0.027, [0.947, 0.971, 0.993]], [0.029, [0.947, 0.971, 0.993]], [0.031, [0.944, 0.969, 0.992]], [0.033, [0.944, 0.969, 0.992]], [0.035, [0.941, 0.967, 0.991]], [0.037, [0.941, 0.967, 0.991]], [0.039, [0.938, 0.965, 0.990]], [0.041, [0.938, 0.965, 0.990]], [0.043, [0.935, 0.963, 0.989]], [0.045, [0.935, 0.963, 0.989]], [0.047, [0.932, 0.961, 0.988]], [0.049, [0.932, 0.961, 0.988]], [0.051, [0.929, 0.959, 0.987]], [0.053, [0.929, 0.959, 0.987]], [0.055, [0.926, 0.957, 0.986]], [0.057, [0.926, 0.957, 0.986]], [0.059, [0.922, 0.955, 0.985]], [0.061, [0.922, 0.955, 0.985]], [0.063, [0.919, 0.953, 0.984]], [0.065, [0.919, 0.953, 0.984]], [0.067, [0.916, 0.951, 0.983]], [0.068, [0.916, 0.951, 0.983]], [0.070, [0.913, 0.949, 0.982]], [0.072, [0.913, 0.949, 0.982]], [0.074, [0.910, 0.947, 0.981]], [0.076, [0.910, 0.947, 0.981]], [0.078, [0.907, 0.945, 0.980]], [0.080, [0.907, 0.945, 0.980]], [0.082, [0.904, 0.943, 0.979]], [0.084, [0.904, 0.943, 0.979]], [0.086, [0.901, 0.941, 0.978]], [0.088, [0.901, 0.941, 0.978]], [0.090, [0.898, 0.939, 0.977]], [0.092, [0.898, 0.939, 0.977]], [0.094, [0.895, 0.937, 0.976]], [0.096, [0.895, 0.937, 0.976]], [0.098, [0.892, 0.935, 0.975]], [0.100, [0.892, 0.935, 0.975]], [0.102, [0.889, 0.933, 0.974]], [0.104, [0.889, 0.933, 0.974]], [0.106, [0.886, 0.931, 0.973]], [0.108, [0.886, 0.931, 0.973]], [0.110, [0.883, 0.929, 0.972]], [0.112, [0.883, 0.929, 0.972]], [0.114, [0.879, 0.927, 0.971]], [0.115, [0.879, 0.927, 0.971]], [0.117, [0.876, 0.925, 0.970]], [0.119, [0.876, 0.925, 0.970]], [0.121, [0.873, 0.923, 0.969]], [0.123, [0.873, 0.923, 0.969]], [0.125, [0.870, 0.921, 0.969]], [0.127, [0.870, 0.921, 0.969]], [0.129, [0.867, 0.919, 0.968]], [0.131, [0.867, 0.919, 0.968]], [0.133, [0.864, 0.917, 0.967]], [0.135, [0.864, 0.917, 0.967]], [0.137, [0.861, 0.915, 0.966]], [0.139, [0.861, 0.915, 0.966]], [0.141, [0.858, 0.913, 0.965]], [0.143, [0.858, 0.913, 0.965]], [0.145, [0.855, 0.911, 0.964]], [0.147, [0.855, 0.911, 0.964]], [0.149, [0.853, 0.910, 0.963]], [0.151, [0.853, 0.910, 0.963]], [0.153, [0.850, 0.908, 0.962]], [0.155, [0.850, 0.908, 0.962]], [0.157, [0.847, 0.906, 0.961]], [0.159, [0.847, 0.906, 0.961]], [0.160, [0.844, 0.904, 0.960]], [0.162, [0.844, 0.904, 0.960]], [0.164, [0.841, 0.902, 0.959]], [0.166, [0.841, 0.902, 0.959]], [0.168, [0.838, 0.900, 0.958]], [0.170, [0.838, 0.900, 0.958]], [0.172, [0.835, 0.898, 0.957]], [0.174, [0.835, 0.898, 0.957]], [0.176, [0.832, 0.896, 0.956]], [0.178, [0.832, 0.896, 0.956]], [0.180, [0.829, 0.894, 0.955]], [0.182, [0.829, 0.894, 0.955]], [0.184, [0.826, 0.892, 0.954]], [0.186, [0.826, 0.892, 0.954]], [0.188, [0.823, 0.890, 0.953]], [0.190, [0.823, 0.890, 0.953]], [0.192, [0.820, 0.888, 0.952]], [0.194, [0.820, 0.888, 0.952]], [0.196, [0.817, 0.886, 0.951]], [0.198, [0.817, 0.886, 0.951]], [0.200, [0.814, 0.884, 0.950]], [0.202, [0.814, 0.884, 0.950]], [0.204, [0.811, 0.882, 0.949]], [0.205, [0.811, 0.882, 0.949]], [0.207, [0.808, 0.880, 0.948]], [0.209, [0.808, 0.880, 0.948]], [0.211, [0.805, 0.878, 0.947]], [0.213, [0.805, 0.878, 0.947]], [0.215, [0.802, 0.876, 0.946]], [0.217, [0.802, 0.876, 0.946]], [0.219, [0.799, 0.874, 0.945]], [0.221, [0.799, 0.874, 0.945]], [0.223, [0.796, 0.872, 0.944]], [0.225, [0.796, 0.872, 0.944]], [0.227, [0.793, 0.870, 0.943]], [0.229, [0.793, 0.870, 0.943]], [0.231, [0.790, 0.868, 0.942]], [0.233, [0.790, 0.868, 0.942]], [0.235, [0.788, 0.866, 0.941]], [0.237, [0.788, 0.866, 0.941]], [0.239, [0.785, 0.864, 0.940]], [0.241, [0.785, 0.864, 0.940]], [0.243, [0.782, 0.862, 0.939]], [0.245, [0.782, 0.862, 0.939]], [0.247, [0.779, 0.860, 0.938]], [0.249, [0.779, 0.860, 0.938]], [0.250, [0.775, 0.858, 0.937]], [0.252, [0.775, 0.858, 0.937]], [0.254, [0.770, 0.856, 0.935]], [0.256, [0.770, 0.856, 0.935]], [0.258, [0.765, 0.854, 0.933]], [0.260, [0.765, 0.854, 0.933]], [0.262, [0.760, 0.852, 0.932]], [0.264, [0.760, 0.852, 0.932]], [0.266, [0.756, 0.850, 0.930]], [0.268, [0.756, 0.850, 0.930]], [0.270, [0.751, 0.848, 0.928]], [0.272, [0.751, 0.848, 0.928]], [0.274, [0.746, 0.846, 0.926]], [0.276, [0.746, 0.846, 0.926]], [0.278, [0.741, 0.844, 0.925]], [0.280, [0.741, 0.844, 0.925]], [0.282, [0.736, 0.842, 0.923]], [0.284, [0.736, 0.842, 0.923]], [0.286, [0.731, 0.839, 0.921]], [0.288, [0.731, 0.839, 0.921]], [0.290, [0.726, 0.837, 0.920]], [0.292, [0.726, 0.837, 0.920]], [0.294, [0.721, 0.835, 0.918]], [0.295, [0.721, 0.835, 0.918]], [0.297, [0.716, 0.833, 0.916]], [0.299, [0.716, 0.833, 0.916]], [0.301, [0.711, 0.831, 0.914]], [0.303, [0.711, 0.831, 0.914]], [0.305, [0.706, 0.829, 0.913]], [0.307, [0.706, 0.829, 0.913]], [0.309, [0.701, 0.827, 0.911]], [0.311, [0.701, 0.827, 0.911]], [0.313, [0.697, 0.825, 0.909]], [0.315, [0.697, 0.825, 0.909]], [0.317, [0.692, 0.823, 0.908]], [0.319, [0.692, 0.823, 0.908]], [0.321, [0.687, 0.821, 0.906]], [0.323, [0.687, 0.821, 0.906]], [0.325, [0.682, 0.819, 0.904]], [0.327, [0.682, 0.819, 0.904]], [0.329, [0.677, 0.816, 0.902]], [0.331, [0.677, 0.816, 0.902]], [0.333, [0.672, 0.814, 0.901]], [0.335, [0.672, 0.814, 0.901]], [0.337, [0.667, 0.812, 0.899]], [0.339, [0.667, 0.812, 0.899]], [0.341, [0.662, 0.810, 0.897]], [0.342, [0.662, 0.810, 0.897]], [0.344, [0.657, 0.808, 0.895]], [0.346, [0.657, 0.808, 0.895]], [0.348, [0.652, 0.806, 0.894]], [0.350, [0.652, 0.806, 0.894]], [0.352, [0.647, 0.804, 0.892]], [0.354, [0.647, 0.804, 0.892]], [0.356, [0.642, 0.802, 0.890]], [0.358, [0.642, 0.802, 0.890]], [0.360, [0.637, 0.800, 0.889]], [0.362, [0.637, 0.800, 0.889]], [0.364, [0.633, 0.798, 0.887]], [0.366, [0.633, 0.798, 0.887]], [0.368, [0.628, 0.796, 0.885]], [0.370, [0.628, 0.796, 0.885]], [0.372, [0.623, 0.793, 0.883]], [0.374, [0.623, 0.793, 0.883]], [0.376, [0.617, 0.791, 0.882]], [0.378, [0.617, 0.791, 0.882]], [0.380, [0.611, 0.787, 0.880]], [0.382, [0.611, 0.787, 0.880]], [0.384, [0.605, 0.784, 0.879]], [0.386, [0.605, 0.784, 0.879]], [0.387, [0.598, 0.781, 0.878]], [0.389, [0.598, 0.781, 0.878]], [0.391, [0.592, 0.777, 0.876]], [0.393, [0.592, 0.777, 0.876]], [0.395, [0.586, 0.774, 0.875]], [0.397, [0.586, 0.774, 0.875]], [0.399, [0.580, 0.770, 0.874]], [0.401, [0.580, 0.770, 0.874]], [0.403, [0.573, 0.767, 0.872]], [0.405, [0.573, 0.767, 0.872]], [0.407, [0.567, 0.763, 0.871]], [0.409, [0.567, 0.763, 0.871]], [0.411, [0.561, 0.760, 0.870]], [0.413, [0.561, 0.760, 0.870]], [0.415, [0.555, 0.756, 0.868]], [0.417, [0.555, 0.756, 0.868]], [0.419, [0.548, 0.753, 0.867]], [0.421, [0.548, 0.753, 0.867]], [0.423, [0.542, 0.750, 0.866]], [0.425, [0.542, 0.750, 0.866]], [0.427, [0.536, 0.746, 0.864]], [0.429, [0.536, 0.746, 0.864]], [0.431, [0.529, 0.743, 0.863]], [0.432, [0.529, 0.743, 0.863]], [0.434, [0.523, 0.739, 0.862]], [0.436, [0.523, 0.739, 0.862]], [0.438, [0.517, 0.736, 0.860]], [0.440, [0.517, 0.736, 0.860]], [0.442, [0.511, 0.732, 0.859]], [0.444, [0.511, 0.732, 0.859]], [0.446, [0.504, 0.729, 0.857]], [0.448, [0.504, 0.729, 0.857]], [0.450, [0.498, 0.725, 0.856]], [0.452, [0.498, 0.725, 0.856]], [0.454, [0.492, 0.722, 0.855]], [0.456, [0.492, 0.722, 0.855]], [0.458, [0.485, 0.719, 0.853]], [0.460, [0.485, 0.719, 0.853]], [0.462, [0.479, 0.715, 0.852]], [0.464, [0.479, 0.715, 0.852]], [0.466, [0.473, 0.712, 0.851]], [0.468, [0.473, 0.712, 0.851]], [0.470, [0.467, 0.708, 0.849]], [0.472, [0.467, 0.708, 0.849]], [0.474, [0.460, 0.705, 0.848]], [0.476, [0.460, 0.705, 0.848]], [0.477, [0.454, 0.701, 0.847]], [0.479, [0.454, 0.701, 0.847]], [0.481, [0.448, 0.698, 0.845]], [0.483, [0.448, 0.698, 0.845]], [0.485, [0.442, 0.694, 0.844]], [0.487, [0.442, 0.694, 0.844]], [0.489, [0.435, 0.691, 0.843]], [0.491, [0.435, 0.691, 0.843]], [0.493, [0.429, 0.688, 0.841]], [0.495, [0.429, 0.688, 0.841]], [0.497, [0.423, 0.684, 0.840]], [0.499, [0.423, 0.684, 0.840]], [0.501, [0.417, 0.681, 0.838]], [0.503, [0.417, 0.681, 0.838]], [0.505, [0.412, 0.677, 0.836]], [0.507, [0.412, 0.677, 0.836]], [0.509, [0.407, 0.674, 0.834]], [0.511, [0.407, 0.674, 0.834]], [0.513, [0.402, 0.670, 0.832]], [0.515, [0.402, 0.670, 0.832]], [0.517, [0.397, 0.667, 0.830]], [0.519, [0.397, 0.667, 0.830]], [0.521, [0.392, 0.663, 0.828]], [0.523, [0.392, 0.663, 0.828]], [0.524, [0.387, 0.660, 0.826]], [0.526, [0.387, 0.660, 0.826]], [0.528, [0.382, 0.657, 0.824]], [0.530, [0.382, 0.657, 0.824]], [0.532, [0.377, 0.653, 0.822]], [0.534, [0.377, 0.653, 0.822]], [0.536, [0.372, 0.650, 0.821]], [0.538, [0.372, 0.650, 0.821]], [0.540, [0.367, 0.646, 0.819]], [0.542, [0.367, 0.646, 0.819]], [0.544, [0.362, 0.643, 0.817]], [0.546, [0.362, 0.643, 0.817]], [0.548, [0.357, 0.639, 0.815]], [0.550, [0.357, 0.639, 0.815]], [0.552, [0.352, 0.636, 0.813]], [0.554, [0.352, 0.636, 0.813]], [0.556, [0.346, 0.632, 0.811]], [0.558, [0.346, 0.632, 0.811]], [0.560, [0.341, 0.629, 0.809]], [0.562, [0.341, 0.629, 0.809]], [0.564, [0.336, 0.626, 0.807]], [0.566, [0.336, 0.626, 0.807]], [0.568, [0.331, 0.622, 0.805]], [0.569, [0.331, 0.622, 0.805]], [0.571, [0.326, 0.619, 0.803]], [0.573, [0.326, 0.619, 0.803]], [0.575, [0.321, 0.615, 0.801]], [0.577, [0.321, 0.615, 0.801]], [0.579, [0.316, 0.612, 0.799]], [0.581, [0.316, 0.612, 0.799]], [0.583, [0.311, 0.608, 0.797]], [0.585, [0.311, 0.608, 0.797]], [0.587, [0.306, 0.605, 0.795]], [0.589, [0.306, 0.605, 0.795]], [0.591, [0.301, 0.601, 0.793]], [0.593, [0.301, 0.601, 0.793]], [0.595, [0.296, 0.598, 0.791]], [0.597, [0.296, 0.598, 0.791]], [0.599, [0.291, 0.595, 0.789]], [0.601, [0.291, 0.595, 0.789]], [0.603, [0.286, 0.591, 0.787]], [0.605, [0.286, 0.591, 0.787]], [0.607, [0.281, 0.588, 0.785]], [0.609, [0.281, 0.588, 0.785]], [0.611, [0.276, 0.584, 0.783]], [0.613, [0.276, 0.584, 0.783]], [0.614, [0.271, 0.581, 0.781]], [0.616, [0.271, 0.581, 0.781]], [0.618, [0.266, 0.577, 0.779]], [0.620, [0.266, 0.577, 0.779]], [0.622, [0.261, 0.574, 0.777]], [0.624, [0.261, 0.574, 0.777]], [0.626, [0.256, 0.570, 0.775]], [0.628, [0.256, 0.570, 0.775]], [0.630, [0.252, 0.566, 0.773]], [0.632, [0.252, 0.566, 0.773]], [0.634, [0.248, 0.562, 0.771]], [0.636, [0.248, 0.562, 0.771]], [0.638, [0.244, 0.558, 0.769]], [0.640, [0.244, 0.558, 0.769]], [0.642, [0.240, 0.554, 0.767]], [0.644, [0.240, 0.554, 0.767]], [0.646, [0.236, 0.550, 0.765]], [0.648, [0.236, 0.550, 0.765]], [0.650, [0.232, 0.546, 0.763]], [0.652, [0.232, 0.546, 0.763]], [0.654, [0.228, 0.542, 0.761]], [0.656, [0.228, 0.542, 0.761]], [0.658, [0.224, 0.538, 0.758]], [0.659, [0.224, 0.538, 0.758]], [0.661, [0.220, 0.533, 0.756]], [0.663, [0.220, 0.533, 0.756]], [0.665, [0.216, 0.529, 0.754]], [0.667, [0.216, 0.529, 0.754]], [0.669, [0.212, 0.525, 0.752]], [0.671, [0.212, 0.525, 0.752]], [0.673, [0.208, 0.521, 0.750]], [0.675, [0.208, 0.521, 0.750]], [0.677, [0.204, 0.517, 0.748]], [0.679, [0.204, 0.517, 0.748]], [0.681, [0.199, 0.513, 0.746]], [0.683, [0.199, 0.513, 0.746]], [0.685, [0.195, 0.509, 0.744]], [0.687, [0.195, 0.509, 0.744]], [0.689, [0.191, 0.505, 0.742]], [0.691, [0.191, 0.505, 0.742]], [0.693, [0.187, 0.501, 0.740]], [0.695, [0.187, 0.501, 0.740]], [0.697, [0.183, 0.497, 0.738]], [0.699, [0.183, 0.497, 0.738]], [0.701, [0.179, 0.493, 0.735]], [0.703, [0.179, 0.493, 0.735]], [0.705, [0.175, 0.489, 0.733]], [0.706, [0.175, 0.489, 0.733]], [0.708, [0.171, 0.485, 0.731]], [0.710, [0.171, 0.485, 0.731]], [0.712, [0.167, 0.481, 0.729]], [0.714, [0.167, 0.481, 0.729]], [0.716, [0.163, 0.477, 0.727]], [0.718, [0.163, 0.477, 0.727]], [0.720, [0.159, 0.473, 0.725]], [0.722, [0.159, 0.473, 0.725]], [0.724, [0.155, 0.469, 0.723]], [0.726, [0.155, 0.469, 0.723]], [0.728, [0.151, 0.464, 0.721]], [0.730, [0.151, 0.464, 0.721]], [0.732, [0.147, 0.460, 0.719]], [0.734, [0.147, 0.460, 0.719]], [0.736, [0.143, 0.456, 0.717]], [0.738, [0.143, 0.456, 0.717]], [0.740, [0.139, 0.452, 0.715]], [0.742, [0.139, 0.452, 0.715]], [0.744, [0.134, 0.448, 0.712]], [0.746, [0.134, 0.448, 0.712]], [0.748, [0.130, 0.444, 0.710]], [0.750, [0.130, 0.444, 0.710]], [0.751, [0.127, 0.440, 0.707]], [0.753, [0.127, 0.440, 0.707]], [0.755, [0.124, 0.436, 0.704]], [0.757, [0.124, 0.436, 0.704]], [0.759, [0.121, 0.432, 0.701]], [0.761, [0.121, 0.432, 0.701]], [0.763, [0.118, 0.428, 0.698]], [0.765, [0.118, 0.428, 0.698]], [0.767, [0.115, 0.424, 0.695]], [0.769, [0.115, 0.424, 0.695]], [0.771, [0.112, 0.420, 0.692]], [0.773, [0.112, 0.420, 0.692]], [0.775, [0.109, 0.417, 0.689]], [0.777, [0.109, 0.417, 0.689]], [0.779, [0.106, 0.413, 0.686]], [0.781, [0.106, 0.413, 0.686]], [0.783, [0.102, 0.409, 0.683]], [0.785, [0.102, 0.409, 0.683]], [0.787, [0.099, 0.405, 0.680]], [0.789, [0.099, 0.405, 0.680]], [0.791, [0.096, 0.401, 0.677]], [0.793, [0.096, 0.401, 0.677]], [0.795, [0.093, 0.397, 0.674]], [0.796, [0.093, 0.397, 0.674]], [0.798, [0.090, 0.393, 0.671]], [0.800, [0.090, 0.393, 0.671]], [0.802, [0.087, 0.389, 0.668]], [0.804, [0.087, 0.389, 0.668]], [0.806, [0.084, 0.385, 0.664]], [0.808, [0.084, 0.385, 0.664]], [0.810, [0.081, 0.381, 0.661]], [0.812, [0.081, 0.381, 0.661]], [0.814, [0.078, 0.377, 0.658]], [0.816, [0.078, 0.377, 0.658]], [0.818, [0.075, 0.373, 0.655]], [0.820, [0.075, 0.373, 0.655]], [0.822, [0.072, 0.369, 0.652]], [0.824, [0.072, 0.369, 0.652]], [0.826, [0.069, 0.365, 0.649]], [0.828, [0.069, 0.365, 0.649]], [0.830, [0.066, 0.361, 0.646]], [0.832, [0.066, 0.361, 0.646]], [0.834, [0.063, 0.358, 0.643]], [0.836, [0.063, 0.358, 0.643]], [0.838, [0.059, 0.354, 0.640]], [0.840, [0.059, 0.354, 0.640]], [0.841, [0.056, 0.350, 0.637]], [0.843, [0.056, 0.350, 0.637]], [0.845, [0.053, 0.346, 0.634]], [0.847, [0.053, 0.346, 0.634]], [0.849, [0.050, 0.342, 0.631]], [0.851, [0.050, 0.342, 0.631]], [0.853, [0.047, 0.338, 0.628]], [0.855, [0.047, 0.338, 0.628]], [0.857, [0.044, 0.334, 0.624]], [0.859, [0.044, 0.334, 0.624]], [0.861, [0.041, 0.330, 0.621]], [0.863, [0.041, 0.330, 0.621]], [0.865, [0.038, 0.326, 0.618]], [0.867, [0.038, 0.326, 0.618]], [0.869, [0.035, 0.322, 0.615]], [0.871, [0.035, 0.322, 0.615]], [0.873, [0.032, 0.318, 0.612]], [0.875, [0.032, 0.318, 0.612]], [0.877, [0.031, 0.314, 0.606]], [0.879, [0.031, 0.314, 0.606]], [0.881, [0.031, 0.310, 0.600]], [0.883, [0.031, 0.310, 0.600]], [0.885, [0.031, 0.306, 0.594]], [0.886, [0.031, 0.306, 0.594]], [0.888, [0.031, 0.302, 0.588]], [0.890, [0.031, 0.302, 0.588]], [0.892, [0.031, 0.298, 0.582]], [0.894, [0.031, 0.298, 0.582]], [0.896, [0.031, 0.294, 0.576]], [0.898, [0.031, 0.294, 0.576]], [0.900, [0.031, 0.290, 0.570]], [0.902, [0.031, 0.290, 0.570]], [0.904, [0.031, 0.286, 0.564]], [0.906, [0.031, 0.286, 0.564]], [0.908, [0.031, 0.282, 0.558]], [0.910, [0.031, 0.282, 0.558]], [0.912, [0.031, 0.278, 0.552]], [0.914, [0.031, 0.278, 0.552]], [0.916, [0.031, 0.273, 0.546]], [0.918, [0.031, 0.273, 0.546]], [0.920, [0.031, 0.269, 0.540]], [0.922, [0.031, 0.269, 0.540]], [0.924, [0.031, 0.265, 0.534]], [0.926, [0.031, 0.265, 0.534]], [0.928, [0.031, 0.261, 0.528]], [0.930, [0.031, 0.261, 0.528]], [0.932, [0.031, 0.257, 0.522]], [0.933, [0.031, 0.257, 0.522]], [0.935, [0.031, 0.253, 0.516]], [0.937, [0.031, 0.253, 0.516]], [0.939, [0.031, 0.249, 0.510]], [0.941, [0.031, 0.249, 0.510]], [0.943, [0.031, 0.245, 0.504]], [0.945, [0.031, 0.245, 0.504]], [0.947, [0.031, 0.241, 0.498]], [0.949, [0.031, 0.241, 0.498]], [0.951, [0.031, 0.237, 0.492]], [0.953, [0.031, 0.237, 0.492]], [0.955, [0.031, 0.233, 0.486]], [0.957, [0.031, 0.233, 0.486]], [0.959, [0.031, 0.229, 0.480]], [0.961, [0.031, 0.229, 0.480]], [0.963, [0.031, 0.225, 0.474]], [0.965, [0.031, 0.225, 0.474]], [0.967, [0.031, 0.221, 0.468]], [0.969, [0.031, 0.221, 0.468]], [0.971, [0.031, 0.217, 0.462]], [0.973, [0.031, 0.217, 0.462]], [0.975, [0.031, 0.213, 0.456]], [0.977, [0.031, 0.213, 0.456]], [0.978, [0.031, 0.209, 0.450]], [0.980, [0.031, 0.209, 0.450]], [0.982, [0.031, 0.204, 0.444]], [0.984, [0.031, 0.204, 0.444]], [0.986, [0.031, 0.200, 0.438]], [0.988, [0.031, 0.200, 0.438]], [0.990, [0.031, 0.196, 0.432]], [0.992, [0.031, 0.196, 0.432]], [0.994, [0.031, 0.192, 0.426]], [0.996, [0.031, 0.192, 0.426]], [0.998, [0.031, 0.188, 0.420]], [1.000, [0.031, 0.188, 0.420]]]; +var BuGn = [[0.000, [0.969, 0.988, 0.992]], [0.002, [0.969, 0.988, 0.992]], [0.004, [0.966, 0.987, 0.992]], [0.006, [0.966, 0.987, 0.992]], [0.008, [0.964, 0.987, 0.991]], [0.010, [0.964, 0.987, 0.991]], [0.012, [0.962, 0.986, 0.991]], [0.014, [0.962, 0.986, 0.991]], [0.016, [0.960, 0.985, 0.990]], [0.018, [0.960, 0.985, 0.990]], [0.020, [0.958, 0.984, 0.990]], [0.022, [0.958, 0.984, 0.990]], [0.023, [0.955, 0.983, 0.989]], [0.025, [0.955, 0.983, 0.989]], [0.027, [0.953, 0.982, 0.989]], [0.029, [0.953, 0.982, 0.989]], [0.031, [0.951, 0.981, 0.988]], [0.033, [0.951, 0.981, 0.988]], [0.035, [0.949, 0.980, 0.988]], [0.037, [0.949, 0.980, 0.988]], [0.039, [0.946, 0.980, 0.987]], [0.041, [0.946, 0.980, 0.987]], [0.043, [0.944, 0.979, 0.987]], [0.045, [0.944, 0.979, 0.987]], [0.047, [0.942, 0.978, 0.986]], [0.049, [0.942, 0.978, 0.986]], [0.051, [0.940, 0.977, 0.986]], [0.053, [0.940, 0.977, 0.986]], [0.055, [0.938, 0.976, 0.985]], [0.057, [0.938, 0.976, 0.985]], [0.059, [0.935, 0.975, 0.985]], [0.061, [0.935, 0.975, 0.985]], [0.063, [0.933, 0.974, 0.984]], [0.065, [0.933, 0.974, 0.984]], [0.067, [0.931, 0.974, 0.984]], [0.068, [0.931, 0.974, 0.984]], [0.070, [0.929, 0.973, 0.983]], [0.072, [0.929, 0.973, 0.983]], [0.074, [0.927, 0.972, 0.983]], [0.076, [0.927, 0.972, 0.983]], [0.078, [0.924, 0.971, 0.982]], [0.080, [0.924, 0.971, 0.982]], [0.082, [0.922, 0.970, 0.982]], [0.084, [0.922, 0.970, 0.982]], [0.086, [0.920, 0.969, 0.981]], [0.088, [0.920, 0.969, 0.981]], [0.090, [0.918, 0.968, 0.981]], [0.092, [0.918, 0.968, 0.981]], [0.094, [0.915, 0.968, 0.980]], [0.096, [0.915, 0.968, 0.980]], [0.098, [0.913, 0.967, 0.980]], [0.100, [0.913, 0.967, 0.980]], [0.102, [0.911, 0.966, 0.979]], [0.104, [0.911, 0.966, 0.979]], [0.106, [0.909, 0.965, 0.979]], [0.108, [0.909, 0.965, 0.979]], [0.110, [0.907, 0.964, 0.978]], [0.112, [0.907, 0.964, 0.978]], [0.114, [0.904, 0.963, 0.978]], [0.115, [0.904, 0.963, 0.978]], [0.117, [0.902, 0.962, 0.977]], [0.119, [0.902, 0.962, 0.977]], [0.121, [0.900, 0.962, 0.977]], [0.123, [0.900, 0.962, 0.977]], [0.125, [0.898, 0.961, 0.976]], [0.127, [0.898, 0.961, 0.976]], [0.129, [0.895, 0.960, 0.974]], [0.131, [0.895, 0.960, 0.974]], [0.133, [0.892, 0.958, 0.972]], [0.135, [0.892, 0.958, 0.972]], [0.137, [0.888, 0.957, 0.969]], [0.139, [0.888, 0.957, 0.969]], [0.141, [0.885, 0.956, 0.967]], [0.143, [0.885, 0.956, 0.967]], [0.145, [0.882, 0.955, 0.964]], [0.147, [0.882, 0.955, 0.964]], [0.149, [0.879, 0.954, 0.962]], [0.151, [0.879, 0.954, 0.962]], [0.153, [0.876, 0.953, 0.960]], [0.155, [0.876, 0.953, 0.960]], [0.157, [0.873, 0.952, 0.957]], [0.159, [0.873, 0.952, 0.957]], [0.160, [0.870, 0.951, 0.955]], [0.162, [0.870, 0.951, 0.955]], [0.164, [0.867, 0.950, 0.953]], [0.166, [0.867, 0.950, 0.953]], [0.168, [0.864, 0.948, 0.950]], [0.170, [0.864, 0.948, 0.950]], [0.172, [0.861, 0.947, 0.948]], [0.174, [0.861, 0.947, 0.948]], [0.176, [0.858, 0.946, 0.946]], [0.178, [0.858, 0.946, 0.946]], [0.180, [0.855, 0.945, 0.943]], [0.182, [0.855, 0.945, 0.943]], [0.184, [0.852, 0.944, 0.941]], [0.186, [0.852, 0.944, 0.941]], [0.188, [0.848, 0.943, 0.939]], [0.190, [0.848, 0.943, 0.939]], [0.192, [0.845, 0.942, 0.936]], [0.194, [0.845, 0.942, 0.936]], [0.196, [0.842, 0.941, 0.934]], [0.198, [0.842, 0.941, 0.934]], [0.200, [0.839, 0.940, 0.932]], [0.202, [0.839, 0.940, 0.932]], [0.204, [0.836, 0.939, 0.929]], [0.205, [0.836, 0.939, 0.929]], [0.207, [0.833, 0.937, 0.927]], [0.209, [0.833, 0.937, 0.927]], [0.211, [0.830, 0.936, 0.925]], [0.213, [0.830, 0.936, 0.925]], [0.215, [0.827, 0.935, 0.922]], [0.217, [0.827, 0.935, 0.922]], [0.219, [0.824, 0.934, 0.920]], [0.221, [0.824, 0.934, 0.920]], [0.223, [0.821, 0.933, 0.918]], [0.225, [0.821, 0.933, 0.918]], [0.227, [0.818, 0.932, 0.915]], [0.229, [0.818, 0.932, 0.915]], [0.231, [0.815, 0.931, 0.913]], [0.233, [0.815, 0.931, 0.913]], [0.235, [0.812, 0.930, 0.911]], [0.237, [0.812, 0.930, 0.911]], [0.239, [0.808, 0.929, 0.908]], [0.241, [0.808, 0.929, 0.908]], [0.243, [0.805, 0.927, 0.906]], [0.245, [0.805, 0.927, 0.906]], [0.247, [0.802, 0.926, 0.904]], [0.249, [0.802, 0.926, 0.904]], [0.250, [0.798, 0.925, 0.901]], [0.252, [0.798, 0.925, 0.901]], [0.254, [0.792, 0.922, 0.898]], [0.256, [0.792, 0.922, 0.898]], [0.258, [0.786, 0.920, 0.894]], [0.260, [0.786, 0.920, 0.894]], [0.262, [0.780, 0.917, 0.890]], [0.264, [0.780, 0.917, 0.890]], [0.266, [0.773, 0.915, 0.887]], [0.268, [0.773, 0.915, 0.887]], [0.270, [0.767, 0.913, 0.883]], [0.272, [0.767, 0.913, 0.883]], [0.274, [0.761, 0.910, 0.880]], [0.276, [0.761, 0.910, 0.880]], [0.278, [0.755, 0.908, 0.876]], [0.280, [0.755, 0.908, 0.876]], [0.282, [0.748, 0.905, 0.873]], [0.284, [0.748, 0.905, 0.873]], [0.286, [0.742, 0.903, 0.869]], [0.288, [0.742, 0.903, 0.869]], [0.290, [0.736, 0.900, 0.865]], [0.292, [0.736, 0.900, 0.865]], [0.294, [0.729, 0.898, 0.862]], [0.295, [0.729, 0.898, 0.862]], [0.297, [0.723, 0.895, 0.858]], [0.299, [0.723, 0.895, 0.858]], [0.301, [0.717, 0.893, 0.855]], [0.303, [0.717, 0.893, 0.855]], [0.305, [0.711, 0.890, 0.851]], [0.307, [0.711, 0.890, 0.851]], [0.309, [0.704, 0.888, 0.848]], [0.311, [0.704, 0.888, 0.848]], [0.313, [0.698, 0.886, 0.844]], [0.315, [0.698, 0.886, 0.844]], [0.317, [0.692, 0.883, 0.840]], [0.319, [0.692, 0.883, 0.840]], [0.321, [0.685, 0.881, 0.837]], [0.323, [0.685, 0.881, 0.837]], [0.325, [0.679, 0.878, 0.833]], [0.327, [0.679, 0.878, 0.833]], [0.329, [0.673, 0.876, 0.830]], [0.331, [0.673, 0.876, 0.830]], [0.333, [0.667, 0.873, 0.826]], [0.335, [0.667, 0.873, 0.826]], [0.337, [0.660, 0.871, 0.823]], [0.339, [0.660, 0.871, 0.823]], [0.341, [0.654, 0.868, 0.819]], [0.342, [0.654, 0.868, 0.819]], [0.344, [0.648, 0.866, 0.815]], [0.346, [0.648, 0.866, 0.815]], [0.348, [0.642, 0.863, 0.812]], [0.350, [0.642, 0.863, 0.812]], [0.352, [0.635, 0.861, 0.808]], [0.354, [0.635, 0.861, 0.808]], [0.356, [0.629, 0.858, 0.805]], [0.358, [0.629, 0.858, 0.805]], [0.360, [0.623, 0.856, 0.801]], [0.362, [0.623, 0.856, 0.801]], [0.364, [0.616, 0.854, 0.798]], [0.366, [0.616, 0.854, 0.798]], [0.368, [0.610, 0.851, 0.794]], [0.370, [0.610, 0.851, 0.794]], [0.372, [0.604, 0.849, 0.790]], [0.374, [0.604, 0.849, 0.790]], [0.376, [0.598, 0.846, 0.787]], [0.378, [0.598, 0.846, 0.787]], [0.380, [0.591, 0.843, 0.782]], [0.382, [0.591, 0.843, 0.782]], [0.384, [0.585, 0.841, 0.777]], [0.386, [0.585, 0.841, 0.777]], [0.387, [0.579, 0.838, 0.773]], [0.389, [0.579, 0.838, 0.773]], [0.391, [0.573, 0.835, 0.768]], [0.393, [0.573, 0.835, 0.768]], [0.395, [0.566, 0.833, 0.764]], [0.397, [0.566, 0.833, 0.764]], [0.399, [0.560, 0.830, 0.759]], [0.401, [0.560, 0.830, 0.759]], [0.403, [0.554, 0.827, 0.755]], [0.405, [0.554, 0.827, 0.755]], [0.407, [0.547, 0.824, 0.750]], [0.409, [0.547, 0.824, 0.750]], [0.411, [0.541, 0.822, 0.746]], [0.413, [0.541, 0.822, 0.746]], [0.415, [0.535, 0.819, 0.741]], [0.417, [0.535, 0.819, 0.741]], [0.419, [0.529, 0.816, 0.736]], [0.421, [0.529, 0.816, 0.736]], [0.423, [0.522, 0.814, 0.732]], [0.425, [0.522, 0.814, 0.732]], [0.427, [0.516, 0.811, 0.727]], [0.429, [0.516, 0.811, 0.727]], [0.431, [0.510, 0.808, 0.723]], [0.432, [0.510, 0.808, 0.723]], [0.434, [0.504, 0.805, 0.718]], [0.436, [0.504, 0.805, 0.718]], [0.438, [0.497, 0.803, 0.714]], [0.440, [0.497, 0.803, 0.714]], [0.442, [0.491, 0.800, 0.709]], [0.444, [0.491, 0.800, 0.709]], [0.446, [0.485, 0.797, 0.705]], [0.448, [0.485, 0.797, 0.705]], [0.450, [0.478, 0.795, 0.700]], [0.452, [0.478, 0.795, 0.700]], [0.454, [0.472, 0.792, 0.695]], [0.456, [0.472, 0.792, 0.695]], [0.458, [0.466, 0.789, 0.691]], [0.460, [0.466, 0.789, 0.691]], [0.462, [0.460, 0.786, 0.686]], [0.464, [0.460, 0.786, 0.686]], [0.466, [0.453, 0.784, 0.682]], [0.468, [0.453, 0.784, 0.682]], [0.470, [0.447, 0.781, 0.677]], [0.472, [0.447, 0.781, 0.677]], [0.474, [0.441, 0.778, 0.673]], [0.476, [0.441, 0.778, 0.673]], [0.477, [0.435, 0.776, 0.668]], [0.479, [0.435, 0.776, 0.668]], [0.481, [0.428, 0.773, 0.664]], [0.483, [0.428, 0.773, 0.664]], [0.485, [0.422, 0.770, 0.659]], [0.487, [0.422, 0.770, 0.659]], [0.489, [0.416, 0.768, 0.655]], [0.491, [0.416, 0.768, 0.655]], [0.493, [0.409, 0.765, 0.650]], [0.495, [0.409, 0.765, 0.650]], [0.497, [0.403, 0.762, 0.645]], [0.499, [0.403, 0.762, 0.645]], [0.501, [0.398, 0.760, 0.640]], [0.503, [0.398, 0.760, 0.640]], [0.505, [0.393, 0.757, 0.635]], [0.507, [0.393, 0.757, 0.635]], [0.509, [0.389, 0.755, 0.629]], [0.511, [0.389, 0.755, 0.629]], [0.513, [0.384, 0.752, 0.623]], [0.515, [0.384, 0.752, 0.623]], [0.517, [0.380, 0.750, 0.618]], [0.519, [0.380, 0.750, 0.618]], [0.521, [0.375, 0.747, 0.612]], [0.523, [0.375, 0.747, 0.612]], [0.524, [0.370, 0.745, 0.606]], [0.526, [0.370, 0.745, 0.606]], [0.528, [0.366, 0.742, 0.601]], [0.530, [0.366, 0.742, 0.601]], [0.532, [0.361, 0.740, 0.595]], [0.534, [0.361, 0.740, 0.595]], [0.536, [0.357, 0.737, 0.589]], [0.538, [0.357, 0.737, 0.589]], [0.540, [0.352, 0.735, 0.584]], [0.542, [0.352, 0.735, 0.584]], [0.544, [0.348, 0.732, 0.578]], [0.546, [0.348, 0.732, 0.578]], [0.548, [0.343, 0.730, 0.572]], [0.550, [0.343, 0.730, 0.572]], [0.552, [0.339, 0.728, 0.567]], [0.554, [0.339, 0.728, 0.567]], [0.556, [0.334, 0.725, 0.561]], [0.558, [0.334, 0.725, 0.561]], [0.560, [0.329, 0.723, 0.555]], [0.562, [0.329, 0.723, 0.555]], [0.564, [0.325, 0.720, 0.550]], [0.566, [0.325, 0.720, 0.550]], [0.568, [0.320, 0.718, 0.544]], [0.569, [0.320, 0.718, 0.544]], [0.571, [0.316, 0.715, 0.538]], [0.573, [0.316, 0.715, 0.538]], [0.575, [0.311, 0.713, 0.533]], [0.577, [0.311, 0.713, 0.533]], [0.579, [0.307, 0.710, 0.527]], [0.581, [0.307, 0.710, 0.527]], [0.583, [0.302, 0.708, 0.521]], [0.585, [0.302, 0.708, 0.521]], [0.587, [0.298, 0.705, 0.516]], [0.589, [0.298, 0.705, 0.516]], [0.591, [0.293, 0.703, 0.510]], [0.593, [0.293, 0.703, 0.510]], [0.595, [0.288, 0.700, 0.504]], [0.597, [0.288, 0.700, 0.504]], [0.599, [0.284, 0.698, 0.499]], [0.601, [0.284, 0.698, 0.499]], [0.603, [0.279, 0.696, 0.493]], [0.605, [0.279, 0.696, 0.493]], [0.607, [0.275, 0.693, 0.488]], [0.609, [0.275, 0.693, 0.488]], [0.611, [0.270, 0.691, 0.482]], [0.613, [0.270, 0.691, 0.482]], [0.614, [0.266, 0.688, 0.476]], [0.616, [0.266, 0.688, 0.476]], [0.618, [0.261, 0.686, 0.471]], [0.620, [0.261, 0.686, 0.471]], [0.622, [0.257, 0.683, 0.465]], [0.624, [0.257, 0.683, 0.465]], [0.626, [0.253, 0.680, 0.459]], [0.628, [0.253, 0.680, 0.459]], [0.630, [0.249, 0.675, 0.453]], [0.632, [0.249, 0.675, 0.453]], [0.634, [0.245, 0.671, 0.447]], [0.636, [0.245, 0.671, 0.447]], [0.638, [0.242, 0.667, 0.441]], [0.640, [0.242, 0.667, 0.441]], [0.642, [0.238, 0.662, 0.435]], [0.644, [0.238, 0.662, 0.435]], [0.646, [0.234, 0.658, 0.429]], [0.648, [0.234, 0.658, 0.429]], [0.650, [0.230, 0.654, 0.423]], [0.652, [0.230, 0.654, 0.423]], [0.654, [0.227, 0.650, 0.417]], [0.656, [0.227, 0.650, 0.417]], [0.658, [0.223, 0.645, 0.411]], [0.659, [0.223, 0.645, 0.411]], [0.661, [0.219, 0.641, 0.405]], [0.663, [0.219, 0.641, 0.405]], [0.665, [0.216, 0.637, 0.399]], [0.667, [0.216, 0.637, 0.399]], [0.669, [0.212, 0.632, 0.393]], [0.671, [0.212, 0.632, 0.393]], [0.673, [0.208, 0.628, 0.387]], [0.675, [0.208, 0.628, 0.387]], [0.677, [0.205, 0.624, 0.381]], [0.679, [0.205, 0.624, 0.381]], [0.681, [0.201, 0.619, 0.375]], [0.683, [0.201, 0.619, 0.375]], [0.685, [0.197, 0.615, 0.369]], [0.687, [0.197, 0.615, 0.369]], [0.689, [0.194, 0.611, 0.363]], [0.691, [0.194, 0.611, 0.363]], [0.693, [0.190, 0.606, 0.356]], [0.695, [0.190, 0.606, 0.356]], [0.697, [0.186, 0.602, 0.350]], [0.699, [0.186, 0.602, 0.350]], [0.701, [0.182, 0.598, 0.344]], [0.703, [0.182, 0.598, 0.344]], [0.705, [0.179, 0.594, 0.338]], [0.706, [0.179, 0.594, 0.338]], [0.708, [0.175, 0.589, 0.332]], [0.710, [0.175, 0.589, 0.332]], [0.712, [0.171, 0.585, 0.326]], [0.714, [0.171, 0.585, 0.326]], [0.716, [0.168, 0.581, 0.320]], [0.718, [0.168, 0.581, 0.320]], [0.720, [0.164, 0.576, 0.314]], [0.722, [0.164, 0.576, 0.314]], [0.724, [0.160, 0.572, 0.308]], [0.726, [0.160, 0.572, 0.308]], [0.728, [0.157, 0.568, 0.302]], [0.730, [0.157, 0.568, 0.302]], [0.732, [0.153, 0.563, 0.296]], [0.734, [0.153, 0.563, 0.296]], [0.736, [0.149, 0.559, 0.290]], [0.738, [0.149, 0.559, 0.290]], [0.740, [0.146, 0.555, 0.284]], [0.742, [0.146, 0.555, 0.284]], [0.744, [0.142, 0.550, 0.278]], [0.746, [0.142, 0.550, 0.278]], [0.748, [0.138, 0.546, 0.272]], [0.750, [0.138, 0.546, 0.272]], [0.751, [0.134, 0.542, 0.268]], [0.753, [0.134, 0.542, 0.268]], [0.755, [0.130, 0.539, 0.265]], [0.757, [0.130, 0.539, 0.265]], [0.759, [0.125, 0.535, 0.262]], [0.761, [0.125, 0.535, 0.262]], [0.763, [0.121, 0.531, 0.259]], [0.765, [0.121, 0.531, 0.259]], [0.767, [0.117, 0.528, 0.256]], [0.769, [0.117, 0.528, 0.256]], [0.771, [0.112, 0.524, 0.253]], [0.773, [0.112, 0.524, 0.253]], [0.775, [0.108, 0.520, 0.250]], [0.777, [0.108, 0.520, 0.250]], [0.779, [0.104, 0.516, 0.247]], [0.781, [0.104, 0.516, 0.247]], [0.783, [0.100, 0.513, 0.244]], [0.785, [0.100, 0.513, 0.244]], [0.787, [0.095, 0.509, 0.241]], [0.789, [0.095, 0.509, 0.241]], [0.791, [0.091, 0.505, 0.238]], [0.793, [0.091, 0.505, 0.238]], [0.795, [0.087, 0.502, 0.234]], [0.796, [0.087, 0.502, 0.234]], [0.798, [0.082, 0.498, 0.231]], [0.800, [0.082, 0.498, 0.231]], [0.802, [0.078, 0.494, 0.228]], [0.804, [0.078, 0.494, 0.228]], [0.806, [0.074, 0.491, 0.225]], [0.808, [0.074, 0.491, 0.225]], [0.810, [0.069, 0.487, 0.222]], [0.812, [0.069, 0.487, 0.222]], [0.814, [0.065, 0.483, 0.219]], [0.816, [0.065, 0.483, 0.219]], [0.818, [0.061, 0.480, 0.216]], [0.820, [0.061, 0.480, 0.216]], [0.822, [0.057, 0.476, 0.213]], [0.824, [0.057, 0.476, 0.213]], [0.826, [0.052, 0.472, 0.210]], [0.828, [0.052, 0.472, 0.210]], [0.830, [0.048, 0.469, 0.207]], [0.832, [0.048, 0.469, 0.207]], [0.834, [0.044, 0.465, 0.204]], [0.836, [0.044, 0.465, 0.204]], [0.838, [0.039, 0.461, 0.201]], [0.840, [0.039, 0.461, 0.201]], [0.841, [0.035, 0.457, 0.198]], [0.843, [0.035, 0.457, 0.198]], [0.845, [0.031, 0.454, 0.194]], [0.847, [0.031, 0.454, 0.194]], [0.849, [0.026, 0.450, 0.191]], [0.851, [0.026, 0.450, 0.191]], [0.853, [0.022, 0.446, 0.188]], [0.855, [0.022, 0.446, 0.188]], [0.857, [0.018, 0.443, 0.185]], [0.859, [0.018, 0.443, 0.185]], [0.861, [0.013, 0.439, 0.182]], [0.863, [0.013, 0.439, 0.182]], [0.865, [0.009, 0.435, 0.179]], [0.867, [0.009, 0.435, 0.179]], [0.869, [0.005, 0.432, 0.176]], [0.871, [0.005, 0.432, 0.176]], [0.873, [0.001, 0.428, 0.173]], [0.875, [0.001, 0.428, 0.173]], [0.877, [0.000, 0.423, 0.171]], [0.879, [0.000, 0.423, 0.171]], [0.881, [0.000, 0.418, 0.169]], [0.883, [0.000, 0.418, 0.169]], [0.885, [0.000, 0.413, 0.167]], [0.886, [0.000, 0.413, 0.167]], [0.888, [0.000, 0.408, 0.164]], [0.890, [0.000, 0.408, 0.164]], [0.892, [0.000, 0.403, 0.162]], [0.894, [0.000, 0.403, 0.162]], [0.896, [0.000, 0.398, 0.160]], [0.898, [0.000, 0.398, 0.160]], [0.900, [0.000, 0.393, 0.158]], [0.902, [0.000, 0.393, 0.158]], [0.904, [0.000, 0.388, 0.156]], [0.906, [0.000, 0.388, 0.156]], [0.908, [0.000, 0.383, 0.154]], [0.910, [0.000, 0.383, 0.154]], [0.912, [0.000, 0.378, 0.152]], [0.914, [0.000, 0.378, 0.152]], [0.916, [0.000, 0.373, 0.150]], [0.918, [0.000, 0.373, 0.150]], [0.920, [0.000, 0.368, 0.148]], [0.922, [0.000, 0.368, 0.148]], [0.924, [0.000, 0.363, 0.146]], [0.926, [0.000, 0.363, 0.146]], [0.928, [0.000, 0.357, 0.144]], [0.930, [0.000, 0.357, 0.144]], [0.932, [0.000, 0.352, 0.141]], [0.933, [0.000, 0.352, 0.141]], [0.935, [0.000, 0.347, 0.139]], [0.937, [0.000, 0.347, 0.139]], [0.939, [0.000, 0.342, 0.137]], [0.941, [0.000, 0.342, 0.137]], [0.943, [0.000, 0.337, 0.135]], [0.945, [0.000, 0.337, 0.135]], [0.947, [0.000, 0.332, 0.133]], [0.949, [0.000, 0.332, 0.133]], [0.951, [0.000, 0.327, 0.131]], [0.953, [0.000, 0.327, 0.131]], [0.955, [0.000, 0.322, 0.129]], [0.957, [0.000, 0.322, 0.129]], [0.959, [0.000, 0.317, 0.127]], [0.961, [0.000, 0.317, 0.127]], [0.963, [0.000, 0.312, 0.125]], [0.965, [0.000, 0.312, 0.125]], [0.967, [0.000, 0.307, 0.123]], [0.969, [0.000, 0.307, 0.123]], [0.971, [0.000, 0.302, 0.121]], [0.973, [0.000, 0.302, 0.121]], [0.975, [0.000, 0.297, 0.118]], [0.977, [0.000, 0.297, 0.118]], [0.978, [0.000, 0.292, 0.116]], [0.980, [0.000, 0.292, 0.116]], [0.982, [0.000, 0.287, 0.114]], [0.984, [0.000, 0.287, 0.114]], [0.986, [0.000, 0.282, 0.112]], [0.988, [0.000, 0.282, 0.112]], [0.990, [0.000, 0.277, 0.110]], [0.992, [0.000, 0.277, 0.110]], [0.994, [0.000, 0.272, 0.108]], [0.996, [0.000, 0.272, 0.108]], [0.998, [0.000, 0.267, 0.106]], [1.000, [0.000, 0.267, 0.106]]]; +var BuPu = [[0.000, [0.969, 0.988, 0.992]], [0.002, [0.969, 0.988, 0.992]], [0.004, [0.966, 0.986, 0.991]], [0.006, [0.966, 0.986, 0.991]], [0.008, [0.963, 0.984, 0.990]], [0.010, [0.963, 0.984, 0.990]], [0.012, [0.960, 0.982, 0.989]], [0.014, [0.960, 0.982, 0.989]], [0.016, [0.957, 0.980, 0.988]], [0.018, [0.957, 0.980, 0.988]], [0.020, [0.954, 0.978, 0.987]], [0.022, [0.954, 0.978, 0.987]], [0.023, [0.952, 0.976, 0.986]], [0.025, [0.952, 0.976, 0.986]], [0.027, [0.949, 0.974, 0.984]], [0.029, [0.949, 0.974, 0.984]], [0.031, [0.946, 0.972, 0.983]], [0.033, [0.946, 0.972, 0.983]], [0.035, [0.943, 0.971, 0.982]], [0.037, [0.943, 0.971, 0.982]], [0.039, [0.940, 0.969, 0.981]], [0.041, [0.940, 0.969, 0.981]], [0.043, [0.938, 0.967, 0.980]], [0.045, [0.938, 0.967, 0.980]], [0.047, [0.935, 0.965, 0.979]], [0.049, [0.935, 0.965, 0.979]], [0.051, [0.932, 0.963, 0.978]], [0.053, [0.932, 0.963, 0.978]], [0.055, [0.929, 0.961, 0.977]], [0.057, [0.929, 0.961, 0.977]], [0.059, [0.926, 0.959, 0.976]], [0.061, [0.926, 0.959, 0.976]], [0.063, [0.923, 0.957, 0.974]], [0.065, [0.923, 0.957, 0.974]], [0.067, [0.921, 0.955, 0.973]], [0.068, [0.921, 0.955, 0.973]], [0.070, [0.918, 0.953, 0.972]], [0.072, [0.918, 0.953, 0.972]], [0.074, [0.915, 0.951, 0.971]], [0.076, [0.915, 0.951, 0.971]], [0.078, [0.912, 0.949, 0.970]], [0.080, [0.912, 0.949, 0.970]], [0.082, [0.909, 0.947, 0.969]], [0.084, [0.909, 0.947, 0.969]], [0.086, [0.906, 0.945, 0.968]], [0.088, [0.906, 0.945, 0.968]], [0.090, [0.904, 0.943, 0.967]], [0.092, [0.904, 0.943, 0.967]], [0.094, [0.901, 0.941, 0.966]], [0.096, [0.901, 0.941, 0.966]], [0.098, [0.898, 0.939, 0.964]], [0.100, [0.898, 0.939, 0.964]], [0.102, [0.895, 0.937, 0.963]], [0.104, [0.895, 0.937, 0.963]], [0.106, [0.892, 0.935, 0.962]], [0.108, [0.892, 0.935, 0.962]], [0.110, [0.889, 0.933, 0.961]], [0.112, [0.889, 0.933, 0.961]], [0.114, [0.887, 0.931, 0.960]], [0.115, [0.887, 0.931, 0.960]], [0.117, [0.884, 0.929, 0.959]], [0.119, [0.884, 0.929, 0.959]], [0.121, [0.881, 0.927, 0.958]], [0.123, [0.881, 0.927, 0.958]], [0.125, [0.878, 0.925, 0.957]], [0.127, [0.878, 0.925, 0.957]], [0.129, [0.874, 0.922, 0.955]], [0.131, [0.874, 0.922, 0.955]], [0.133, [0.870, 0.919, 0.953]], [0.135, [0.870, 0.919, 0.953]], [0.137, [0.866, 0.916, 0.951]], [0.139, [0.866, 0.916, 0.951]], [0.141, [0.862, 0.913, 0.950]], [0.143, [0.862, 0.913, 0.950]], [0.145, [0.858, 0.910, 0.948]], [0.147, [0.858, 0.910, 0.948]], [0.149, [0.854, 0.907, 0.946]], [0.151, [0.854, 0.907, 0.946]], [0.153, [0.850, 0.904, 0.945]], [0.155, [0.850, 0.904, 0.945]], [0.157, [0.845, 0.900, 0.943]], [0.159, [0.845, 0.900, 0.943]], [0.160, [0.841, 0.897, 0.941]], [0.162, [0.841, 0.897, 0.941]], [0.164, [0.837, 0.894, 0.939]], [0.166, [0.837, 0.894, 0.939]], [0.168, [0.833, 0.891, 0.938]], [0.170, [0.833, 0.891, 0.938]], [0.172, [0.829, 0.888, 0.936]], [0.174, [0.829, 0.888, 0.936]], [0.176, [0.825, 0.885, 0.934]], [0.178, [0.825, 0.885, 0.934]], [0.180, [0.821, 0.882, 0.933]], [0.182, [0.821, 0.882, 0.933]], [0.184, [0.817, 0.879, 0.931]], [0.186, [0.817, 0.879, 0.931]], [0.188, [0.813, 0.876, 0.929]], [0.190, [0.813, 0.876, 0.929]], [0.192, [0.809, 0.873, 0.927]], [0.194, [0.809, 0.873, 0.927]], [0.196, [0.805, 0.870, 0.926]], [0.198, [0.805, 0.870, 0.926]], [0.200, [0.801, 0.867, 0.924]], [0.202, [0.801, 0.867, 0.924]], [0.204, [0.797, 0.864, 0.922]], [0.205, [0.797, 0.864, 0.922]], [0.207, [0.793, 0.861, 0.920]], [0.209, [0.793, 0.861, 0.920]], [0.211, [0.789, 0.857, 0.919]], [0.213, [0.789, 0.857, 0.919]], [0.215, [0.785, 0.854, 0.917]], [0.217, [0.785, 0.854, 0.917]], [0.219, [0.780, 0.851, 0.915]], [0.221, [0.780, 0.851, 0.915]], [0.223, [0.776, 0.848, 0.914]], [0.225, [0.776, 0.848, 0.914]], [0.227, [0.772, 0.845, 0.912]], [0.229, [0.772, 0.845, 0.912]], [0.231, [0.768, 0.842, 0.910]], [0.233, [0.768, 0.842, 0.910]], [0.235, [0.764, 0.839, 0.908]], [0.237, [0.764, 0.839, 0.908]], [0.239, [0.760, 0.836, 0.907]], [0.241, [0.760, 0.836, 0.907]], [0.243, [0.756, 0.833, 0.905]], [0.245, [0.756, 0.833, 0.905]], [0.247, [0.752, 0.830, 0.903]], [0.249, [0.752, 0.830, 0.903]], [0.250, [0.748, 0.827, 0.902]], [0.252, [0.748, 0.827, 0.902]], [0.254, [0.744, 0.824, 0.900]], [0.256, [0.744, 0.824, 0.900]], [0.258, [0.740, 0.821, 0.899]], [0.260, [0.740, 0.821, 0.899]], [0.262, [0.736, 0.818, 0.897]], [0.264, [0.736, 0.818, 0.897]], [0.266, [0.732, 0.815, 0.896]], [0.268, [0.732, 0.815, 0.896]], [0.270, [0.728, 0.813, 0.894]], [0.272, [0.728, 0.813, 0.894]], [0.274, [0.724, 0.810, 0.893]], [0.276, [0.724, 0.810, 0.893]], [0.278, [0.720, 0.807, 0.891]], [0.280, [0.720, 0.807, 0.891]], [0.282, [0.716, 0.804, 0.890]], [0.284, [0.716, 0.804, 0.890]], [0.286, [0.711, 0.801, 0.888]], [0.288, [0.711, 0.801, 0.888]], [0.290, [0.707, 0.798, 0.887]], [0.292, [0.707, 0.798, 0.887]], [0.294, [0.703, 0.796, 0.885]], [0.295, [0.703, 0.796, 0.885]], [0.297, [0.699, 0.793, 0.884]], [0.299, [0.699, 0.793, 0.884]], [0.301, [0.695, 0.790, 0.882]], [0.303, [0.695, 0.790, 0.882]], [0.305, [0.691, 0.787, 0.881]], [0.307, [0.691, 0.787, 0.881]], [0.309, [0.687, 0.784, 0.879]], [0.311, [0.687, 0.784, 0.879]], [0.313, [0.683, 0.781, 0.878]], [0.315, [0.683, 0.781, 0.878]], [0.317, [0.679, 0.779, 0.876]], [0.319, [0.679, 0.779, 0.876]], [0.321, [0.675, 0.776, 0.875]], [0.323, [0.675, 0.776, 0.875]], [0.325, [0.671, 0.773, 0.874]], [0.327, [0.671, 0.773, 0.874]], [0.329, [0.667, 0.770, 0.872]], [0.331, [0.667, 0.770, 0.872]], [0.333, [0.663, 0.767, 0.871]], [0.335, [0.663, 0.767, 0.871]], [0.337, [0.659, 0.764, 0.869]], [0.339, [0.659, 0.764, 0.869]], [0.341, [0.655, 0.762, 0.868]], [0.342, [0.655, 0.762, 0.868]], [0.344, [0.651, 0.759, 0.866]], [0.346, [0.651, 0.759, 0.866]], [0.348, [0.647, 0.756, 0.865]], [0.350, [0.647, 0.756, 0.865]], [0.352, [0.642, 0.753, 0.863]], [0.354, [0.642, 0.753, 0.863]], [0.356, [0.638, 0.750, 0.862]], [0.358, [0.638, 0.750, 0.862]], [0.360, [0.634, 0.748, 0.860]], [0.362, [0.634, 0.748, 0.860]], [0.364, [0.630, 0.745, 0.859]], [0.366, [0.630, 0.745, 0.859]], [0.368, [0.626, 0.742, 0.857]], [0.370, [0.626, 0.742, 0.857]], [0.372, [0.622, 0.739, 0.856]], [0.374, [0.622, 0.739, 0.856]], [0.376, [0.619, 0.736, 0.854]], [0.378, [0.619, 0.736, 0.854]], [0.380, [0.617, 0.731, 0.852]], [0.382, [0.617, 0.731, 0.852]], [0.384, [0.614, 0.726, 0.849]], [0.386, [0.614, 0.726, 0.849]], [0.387, [0.612, 0.721, 0.847]], [0.389, [0.612, 0.721, 0.847]], [0.391, [0.610, 0.717, 0.844]], [0.393, [0.610, 0.717, 0.844]], [0.395, [0.608, 0.712, 0.842]], [0.397, [0.608, 0.712, 0.842]], [0.399, [0.605, 0.707, 0.839]], [0.401, [0.605, 0.707, 0.839]], [0.403, [0.603, 0.703, 0.837]], [0.405, [0.603, 0.703, 0.837]], [0.407, [0.601, 0.698, 0.834]], [0.409, [0.601, 0.698, 0.834]], [0.411, [0.599, 0.693, 0.832]], [0.413, [0.599, 0.693, 0.832]], [0.415, [0.597, 0.689, 0.829]], [0.417, [0.597, 0.689, 0.829]], [0.419, [0.594, 0.684, 0.827]], [0.421, [0.594, 0.684, 0.827]], [0.423, [0.592, 0.679, 0.824]], [0.425, [0.592, 0.679, 0.824]], [0.427, [0.590, 0.675, 0.822]], [0.429, [0.590, 0.675, 0.822]], [0.431, [0.588, 0.670, 0.820]], [0.432, [0.588, 0.670, 0.820]], [0.434, [0.586, 0.665, 0.817]], [0.436, [0.586, 0.665, 0.817]], [0.438, [0.583, 0.661, 0.815]], [0.440, [0.583, 0.661, 0.815]], [0.442, [0.581, 0.656, 0.812]], [0.444, [0.581, 0.656, 0.812]], [0.446, [0.579, 0.651, 0.810]], [0.448, [0.579, 0.651, 0.810]], [0.450, [0.577, 0.647, 0.807]], [0.452, [0.577, 0.647, 0.807]], [0.454, [0.574, 0.642, 0.805]], [0.456, [0.574, 0.642, 0.805]], [0.458, [0.572, 0.637, 0.802]], [0.460, [0.572, 0.637, 0.802]], [0.462, [0.570, 0.633, 0.800]], [0.464, [0.570, 0.633, 0.800]], [0.466, [0.568, 0.628, 0.797]], [0.468, [0.568, 0.628, 0.797]], [0.470, [0.566, 0.623, 0.795]], [0.472, [0.566, 0.623, 0.795]], [0.474, [0.563, 0.619, 0.792]], [0.476, [0.563, 0.619, 0.792]], [0.477, [0.561, 0.614, 0.790]], [0.479, [0.561, 0.614, 0.790]], [0.481, [0.559, 0.609, 0.788]], [0.483, [0.559, 0.609, 0.788]], [0.485, [0.557, 0.605, 0.785]], [0.487, [0.557, 0.605, 0.785]], [0.489, [0.555, 0.600, 0.783]], [0.491, [0.555, 0.600, 0.783]], [0.493, [0.552, 0.595, 0.780]], [0.495, [0.552, 0.595, 0.780]], [0.497, [0.550, 0.591, 0.778]], [0.499, [0.550, 0.591, 0.778]], [0.501, [0.549, 0.586, 0.775]], [0.503, [0.549, 0.586, 0.775]], [0.505, [0.549, 0.580, 0.773]], [0.507, [0.549, 0.580, 0.773]], [0.509, [0.549, 0.575, 0.770]], [0.511, [0.549, 0.575, 0.770]], [0.513, [0.549, 0.570, 0.767]], [0.515, [0.549, 0.570, 0.767]], [0.517, [0.549, 0.564, 0.765]], [0.519, [0.549, 0.564, 0.765]], [0.521, [0.549, 0.559, 0.762]], [0.523, [0.549, 0.559, 0.762]], [0.524, [0.549, 0.554, 0.760]], [0.526, [0.549, 0.554, 0.760]], [0.528, [0.549, 0.549, 0.757]], [0.530, [0.549, 0.549, 0.757]], [0.532, [0.549, 0.543, 0.755]], [0.534, [0.549, 0.543, 0.755]], [0.536, [0.549, 0.538, 0.752]], [0.538, [0.549, 0.538, 0.752]], [0.540, [0.549, 0.533, 0.749]], [0.542, [0.549, 0.533, 0.749]], [0.544, [0.549, 0.527, 0.747]], [0.546, [0.549, 0.527, 0.747]], [0.548, [0.549, 0.522, 0.744]], [0.550, [0.549, 0.522, 0.744]], [0.552, [0.549, 0.517, 0.742]], [0.554, [0.549, 0.517, 0.742]], [0.556, [0.549, 0.512, 0.739]], [0.558, [0.549, 0.512, 0.739]], [0.560, [0.549, 0.506, 0.736]], [0.562, [0.549, 0.506, 0.736]], [0.564, [0.549, 0.501, 0.734]], [0.566, [0.549, 0.501, 0.734]], [0.568, [0.549, 0.496, 0.731]], [0.569, [0.549, 0.496, 0.731]], [0.571, [0.549, 0.490, 0.729]], [0.573, [0.549, 0.490, 0.729]], [0.575, [0.549, 0.485, 0.726]], [0.577, [0.549, 0.485, 0.726]], [0.579, [0.549, 0.480, 0.724]], [0.581, [0.549, 0.480, 0.724]], [0.583, [0.549, 0.474, 0.721]], [0.585, [0.549, 0.474, 0.721]], [0.587, [0.549, 0.469, 0.718]], [0.589, [0.549, 0.469, 0.718]], [0.591, [0.549, 0.464, 0.716]], [0.593, [0.549, 0.464, 0.716]], [0.595, [0.549, 0.459, 0.713]], [0.597, [0.549, 0.459, 0.713]], [0.599, [0.549, 0.453, 0.711]], [0.601, [0.549, 0.453, 0.711]], [0.603, [0.549, 0.448, 0.708]], [0.605, [0.549, 0.448, 0.708]], [0.607, [0.549, 0.443, 0.705]], [0.609, [0.549, 0.443, 0.705]], [0.611, [0.549, 0.437, 0.703]], [0.613, [0.549, 0.437, 0.703]], [0.614, [0.549, 0.432, 0.700]], [0.616, [0.549, 0.432, 0.700]], [0.618, [0.549, 0.427, 0.698]], [0.620, [0.549, 0.427, 0.698]], [0.622, [0.549, 0.422, 0.695]], [0.624, [0.549, 0.422, 0.695]], [0.626, [0.549, 0.416, 0.693]], [0.628, [0.549, 0.416, 0.693]], [0.630, [0.548, 0.411, 0.690]], [0.632, [0.548, 0.411, 0.690]], [0.634, [0.548, 0.406, 0.688]], [0.636, [0.548, 0.406, 0.688]], [0.638, [0.547, 0.401, 0.685]], [0.640, [0.547, 0.401, 0.685]], [0.642, [0.547, 0.396, 0.683]], [0.644, [0.547, 0.396, 0.683]], [0.646, [0.546, 0.391, 0.680]], [0.648, [0.546, 0.391, 0.680]], [0.650, [0.546, 0.385, 0.678]], [0.652, [0.546, 0.385, 0.678]], [0.654, [0.545, 0.380, 0.675]], [0.656, [0.545, 0.380, 0.675]], [0.658, [0.545, 0.375, 0.673]], [0.659, [0.545, 0.375, 0.673]], [0.661, [0.544, 0.370, 0.670]], [0.663, [0.544, 0.370, 0.670]], [0.665, [0.544, 0.365, 0.668]], [0.667, [0.544, 0.365, 0.668]], [0.669, [0.543, 0.360, 0.666]], [0.671, [0.543, 0.360, 0.666]], [0.673, [0.543, 0.354, 0.663]], [0.675, [0.543, 0.354, 0.663]], [0.677, [0.542, 0.349, 0.661]], [0.679, [0.542, 0.349, 0.661]], [0.681, [0.542, 0.344, 0.658]], [0.683, [0.542, 0.344, 0.658]], [0.685, [0.541, 0.339, 0.656]], [0.687, [0.541, 0.339, 0.656]], [0.689, [0.541, 0.334, 0.653]], [0.691, [0.541, 0.334, 0.653]], [0.693, [0.540, 0.329, 0.651]], [0.695, [0.540, 0.329, 0.651]], [0.697, [0.540, 0.323, 0.648]], [0.699, [0.540, 0.323, 0.648]], [0.701, [0.539, 0.318, 0.646]], [0.703, [0.539, 0.318, 0.646]], [0.705, [0.539, 0.313, 0.643]], [0.706, [0.539, 0.313, 0.643]], [0.708, [0.538, 0.308, 0.641]], [0.710, [0.538, 0.308, 0.641]], [0.712, [0.538, 0.303, 0.638]], [0.714, [0.538, 0.303, 0.638]], [0.716, [0.537, 0.298, 0.636]], [0.718, [0.537, 0.298, 0.636]], [0.720, [0.537, 0.292, 0.634]], [0.722, [0.537, 0.292, 0.634]], [0.724, [0.536, 0.287, 0.631]], [0.726, [0.536, 0.287, 0.631]], [0.728, [0.536, 0.282, 0.629]], [0.730, [0.536, 0.282, 0.629]], [0.732, [0.535, 0.277, 0.626]], [0.734, [0.535, 0.277, 0.626]], [0.736, [0.535, 0.272, 0.624]], [0.738, [0.535, 0.272, 0.624]], [0.740, [0.534, 0.267, 0.621]], [0.742, [0.534, 0.267, 0.621]], [0.744, [0.534, 0.261, 0.619]], [0.746, [0.534, 0.261, 0.619]], [0.748, [0.533, 0.256, 0.616]], [0.750, [0.533, 0.256, 0.616]], [0.751, [0.533, 0.250, 0.613]], [0.753, [0.533, 0.250, 0.613]], [0.755, [0.532, 0.244, 0.609]], [0.757, [0.532, 0.244, 0.609]], [0.759, [0.531, 0.238, 0.605]], [0.761, [0.531, 0.238, 0.605]], [0.763, [0.530, 0.232, 0.600]], [0.765, [0.530, 0.232, 0.600]], [0.767, [0.529, 0.226, 0.596]], [0.769, [0.529, 0.226, 0.596]], [0.771, [0.528, 0.220, 0.592]], [0.773, [0.528, 0.220, 0.592]], [0.775, [0.528, 0.213, 0.588]], [0.777, [0.528, 0.213, 0.588]], [0.779, [0.527, 0.207, 0.584]], [0.781, [0.527, 0.207, 0.584]], [0.783, [0.526, 0.201, 0.580]], [0.785, [0.526, 0.201, 0.580]], [0.787, [0.525, 0.195, 0.576]], [0.789, [0.525, 0.195, 0.576]], [0.791, [0.524, 0.189, 0.572]], [0.793, [0.524, 0.189, 0.572]], [0.795, [0.523, 0.183, 0.568]], [0.796, [0.523, 0.183, 0.568]], [0.798, [0.522, 0.176, 0.564]], [0.800, [0.522, 0.176, 0.564]], [0.802, [0.521, 0.170, 0.560]], [0.804, [0.521, 0.170, 0.560]], [0.806, [0.521, 0.164, 0.556]], [0.808, [0.521, 0.164, 0.556]], [0.810, [0.520, 0.158, 0.552]], [0.812, [0.520, 0.158, 0.552]], [0.814, [0.519, 0.152, 0.548]], [0.816, [0.519, 0.152, 0.548]], [0.818, [0.518, 0.146, 0.544]], [0.820, [0.518, 0.146, 0.544]], [0.822, [0.517, 0.140, 0.540]], [0.824, [0.517, 0.140, 0.540]], [0.826, [0.516, 0.133, 0.536]], [0.828, [0.516, 0.133, 0.536]], [0.830, [0.515, 0.127, 0.531]], [0.832, [0.515, 0.127, 0.531]], [0.834, [0.515, 0.121, 0.527]], [0.836, [0.515, 0.121, 0.527]], [0.838, [0.514, 0.115, 0.523]], [0.840, [0.514, 0.115, 0.523]], [0.841, [0.513, 0.109, 0.519]], [0.843, [0.513, 0.109, 0.519]], [0.845, [0.512, 0.103, 0.515]], [0.847, [0.512, 0.103, 0.515]], [0.849, [0.511, 0.097, 0.511]], [0.851, [0.511, 0.097, 0.511]], [0.853, [0.510, 0.090, 0.507]], [0.855, [0.510, 0.090, 0.507]], [0.857, [0.509, 0.084, 0.503]], [0.859, [0.509, 0.084, 0.503]], [0.861, [0.509, 0.078, 0.499]], [0.863, [0.509, 0.078, 0.499]], [0.865, [0.508, 0.072, 0.495]], [0.867, [0.508, 0.072, 0.495]], [0.869, [0.507, 0.066, 0.491]], [0.871, [0.507, 0.066, 0.491]], [0.873, [0.506, 0.060, 0.487]], [0.875, [0.506, 0.060, 0.487]], [0.877, [0.500, 0.057, 0.481]], [0.879, [0.500, 0.057, 0.481]], [0.881, [0.494, 0.055, 0.475]], [0.883, [0.494, 0.055, 0.475]], [0.885, [0.487, 0.054, 0.469]], [0.886, [0.487, 0.054, 0.469]], [0.888, [0.481, 0.052, 0.463]], [0.890, [0.481, 0.052, 0.463]], [0.892, [0.475, 0.050, 0.457]], [0.894, [0.475, 0.050, 0.457]], [0.896, [0.468, 0.048, 0.451]], [0.898, [0.468, 0.048, 0.451]], [0.900, [0.462, 0.046, 0.445]], [0.902, [0.462, 0.046, 0.445]], [0.904, [0.456, 0.044, 0.439]], [0.906, [0.456, 0.044, 0.439]], [0.908, [0.449, 0.042, 0.433]], [0.910, [0.449, 0.042, 0.433]], [0.912, [0.443, 0.041, 0.427]], [0.914, [0.443, 0.041, 0.427]], [0.916, [0.436, 0.039, 0.421]], [0.918, [0.436, 0.039, 0.421]], [0.920, [0.430, 0.037, 0.415]], [0.922, [0.430, 0.037, 0.415]], [0.924, [0.424, 0.035, 0.409]], [0.926, [0.424, 0.035, 0.409]], [0.928, [0.417, 0.033, 0.403]], [0.930, [0.417, 0.033, 0.403]], [0.932, [0.411, 0.031, 0.397]], [0.933, [0.411, 0.031, 0.397]], [0.935, [0.404, 0.030, 0.391]], [0.937, [0.404, 0.030, 0.391]], [0.939, [0.398, 0.028, 0.385]], [0.941, [0.398, 0.028, 0.385]], [0.943, [0.392, 0.026, 0.379]], [0.945, [0.392, 0.026, 0.379]], [0.947, [0.385, 0.024, 0.372]], [0.949, [0.385, 0.024, 0.372]], [0.951, [0.379, 0.022, 0.366]], [0.953, [0.379, 0.022, 0.366]], [0.955, [0.372, 0.020, 0.360]], [0.957, [0.372, 0.020, 0.360]], [0.959, [0.366, 0.018, 0.354]], [0.961, [0.366, 0.018, 0.354]], [0.963, [0.360, 0.017, 0.348]], [0.965, [0.360, 0.017, 0.348]], [0.967, [0.353, 0.015, 0.342]], [0.969, [0.353, 0.015, 0.342]], [0.971, [0.347, 0.013, 0.336]], [0.973, [0.347, 0.013, 0.336]], [0.975, [0.340, 0.011, 0.330]], [0.977, [0.340, 0.011, 0.330]], [0.978, [0.334, 0.009, 0.324]], [0.980, [0.334, 0.009, 0.324]], [0.982, [0.328, 0.007, 0.318]], [0.984, [0.328, 0.007, 0.318]], [0.986, [0.321, 0.006, 0.312]], [0.988, [0.321, 0.006, 0.312]], [0.990, [0.315, 0.004, 0.306]], [0.992, [0.315, 0.004, 0.306]], [0.994, [0.308, 0.002, 0.300]], [0.996, [0.308, 0.002, 0.300]], [0.998, [0.302, 0.000, 0.294]], [1.000, [0.302, 0.000, 0.294]]]; +var GnBu = [[0.000, [0.969, 0.988, 0.941]], [0.002, [0.969, 0.988, 0.941]], [0.004, [0.966, 0.987, 0.939]], [0.006, [0.966, 0.987, 0.939]], [0.008, [0.963, 0.986, 0.936]], [0.010, [0.963, 0.986, 0.936]], [0.012, [0.960, 0.985, 0.933]], [0.014, [0.960, 0.985, 0.933]], [0.016, [0.957, 0.984, 0.931]], [0.018, [0.957, 0.984, 0.931]], [0.020, [0.954, 0.983, 0.928]], [0.022, [0.954, 0.983, 0.928]], [0.023, [0.952, 0.982, 0.926]], [0.025, [0.952, 0.982, 0.926]], [0.027, [0.949, 0.980, 0.923]], [0.029, [0.949, 0.980, 0.923]], [0.031, [0.946, 0.979, 0.921]], [0.033, [0.946, 0.979, 0.921]], [0.035, [0.943, 0.978, 0.918]], [0.037, [0.943, 0.978, 0.918]], [0.039, [0.940, 0.977, 0.915]], [0.041, [0.940, 0.977, 0.915]], [0.043, [0.938, 0.976, 0.913]], [0.045, [0.938, 0.976, 0.913]], [0.047, [0.935, 0.975, 0.910]], [0.049, [0.935, 0.975, 0.910]], [0.051, [0.932, 0.974, 0.908]], [0.053, [0.932, 0.974, 0.908]], [0.055, [0.929, 0.973, 0.905]], [0.057, [0.929, 0.973, 0.905]], [0.059, [0.926, 0.972, 0.902]], [0.061, [0.926, 0.972, 0.902]], [0.063, [0.923, 0.971, 0.900]], [0.065, [0.923, 0.971, 0.900]], [0.067, [0.921, 0.969, 0.897]], [0.068, [0.921, 0.969, 0.897]], [0.070, [0.918, 0.968, 0.895]], [0.072, [0.918, 0.968, 0.895]], [0.074, [0.915, 0.967, 0.892]], [0.076, [0.915, 0.967, 0.892]], [0.078, [0.912, 0.966, 0.890]], [0.080, [0.912, 0.966, 0.890]], [0.082, [0.909, 0.965, 0.887]], [0.084, [0.909, 0.965, 0.887]], [0.086, [0.906, 0.964, 0.884]], [0.088, [0.906, 0.964, 0.884]], [0.090, [0.904, 0.963, 0.882]], [0.092, [0.904, 0.963, 0.882]], [0.094, [0.901, 0.962, 0.879]], [0.096, [0.901, 0.962, 0.879]], [0.098, [0.898, 0.961, 0.877]], [0.100, [0.898, 0.961, 0.877]], [0.102, [0.895, 0.959, 0.874]], [0.104, [0.895, 0.959, 0.874]], [0.106, [0.892, 0.958, 0.871]], [0.108, [0.892, 0.958, 0.871]], [0.110, [0.889, 0.957, 0.869]], [0.112, [0.889, 0.957, 0.869]], [0.114, [0.887, 0.956, 0.866]], [0.115, [0.887, 0.956, 0.866]], [0.117, [0.884, 0.955, 0.864]], [0.119, [0.884, 0.955, 0.864]], [0.121, [0.881, 0.954, 0.861]], [0.123, [0.881, 0.954, 0.861]], [0.125, [0.878, 0.953, 0.858]], [0.127, [0.878, 0.953, 0.858]], [0.129, [0.876, 0.952, 0.856]], [0.131, [0.876, 0.952, 0.856]], [0.133, [0.873, 0.951, 0.853]], [0.135, [0.873, 0.951, 0.853]], [0.137, [0.871, 0.950, 0.850]], [0.139, [0.871, 0.950, 0.850]], [0.141, [0.868, 0.949, 0.848]], [0.143, [0.868, 0.949, 0.848]], [0.145, [0.866, 0.948, 0.845]], [0.147, [0.866, 0.948, 0.845]], [0.149, [0.863, 0.947, 0.842]], [0.151, [0.863, 0.947, 0.842]], [0.153, [0.861, 0.946, 0.840]], [0.155, [0.861, 0.946, 0.840]], [0.157, [0.858, 0.945, 0.837]], [0.159, [0.858, 0.945, 0.837]], [0.160, [0.856, 0.944, 0.834]], [0.162, [0.856, 0.944, 0.834]], [0.164, [0.854, 0.943, 0.831]], [0.166, [0.854, 0.943, 0.831]], [0.168, [0.851, 0.942, 0.829]], [0.170, [0.851, 0.942, 0.829]], [0.172, [0.849, 0.941, 0.826]], [0.174, [0.849, 0.941, 0.826]], [0.176, [0.846, 0.940, 0.823]], [0.178, [0.846, 0.940, 0.823]], [0.180, [0.844, 0.939, 0.821]], [0.182, [0.844, 0.939, 0.821]], [0.184, [0.841, 0.938, 0.818]], [0.186, [0.841, 0.938, 0.818]], [0.188, [0.839, 0.937, 0.815]], [0.190, [0.839, 0.937, 0.815]], [0.192, [0.836, 0.936, 0.812]], [0.194, [0.836, 0.936, 0.812]], [0.196, [0.834, 0.935, 0.810]], [0.198, [0.834, 0.935, 0.810]], [0.200, [0.831, 0.934, 0.807]], [0.202, [0.831, 0.934, 0.807]], [0.204, [0.829, 0.933, 0.804]], [0.205, [0.829, 0.933, 0.804]], [0.207, [0.826, 0.932, 0.802]], [0.209, [0.826, 0.932, 0.802]], [0.211, [0.824, 0.931, 0.799]], [0.213, [0.824, 0.931, 0.799]], [0.215, [0.822, 0.930, 0.796]], [0.217, [0.822, 0.930, 0.796]], [0.219, [0.819, 0.929, 0.794]], [0.221, [0.819, 0.929, 0.794]], [0.223, [0.817, 0.928, 0.791]], [0.225, [0.817, 0.928, 0.791]], [0.227, [0.814, 0.927, 0.788]], [0.229, [0.814, 0.927, 0.788]], [0.231, [0.812, 0.926, 0.785]], [0.233, [0.812, 0.926, 0.785]], [0.235, [0.809, 0.925, 0.783]], [0.237, [0.809, 0.925, 0.783]], [0.239, [0.807, 0.924, 0.780]], [0.241, [0.807, 0.924, 0.780]], [0.243, [0.804, 0.923, 0.777]], [0.245, [0.804, 0.923, 0.777]], [0.247, [0.802, 0.922, 0.775]], [0.249, [0.802, 0.922, 0.775]], [0.250, [0.799, 0.921, 0.772]], [0.252, [0.799, 0.921, 0.772]], [0.254, [0.794, 0.919, 0.770]], [0.256, [0.794, 0.919, 0.770]], [0.258, [0.790, 0.918, 0.768]], [0.260, [0.790, 0.918, 0.768]], [0.262, [0.786, 0.916, 0.766]], [0.264, [0.786, 0.916, 0.766]], [0.266, [0.781, 0.914, 0.764]], [0.268, [0.781, 0.914, 0.764]], [0.270, [0.777, 0.913, 0.762]], [0.272, [0.777, 0.913, 0.762]], [0.274, [0.772, 0.911, 0.760]], [0.276, [0.772, 0.911, 0.760]], [0.278, [0.768, 0.909, 0.758]], [0.280, [0.768, 0.909, 0.758]], [0.282, [0.763, 0.907, 0.756]], [0.284, [0.763, 0.907, 0.756]], [0.286, [0.759, 0.906, 0.754]], [0.288, [0.759, 0.906, 0.754]], [0.290, [0.755, 0.904, 0.752]], [0.292, [0.755, 0.904, 0.752]], [0.294, [0.750, 0.902, 0.750]], [0.295, [0.750, 0.902, 0.750]], [0.297, [0.746, 0.900, 0.748]], [0.299, [0.746, 0.900, 0.748]], [0.301, [0.741, 0.899, 0.746]], [0.303, [0.741, 0.899, 0.746]], [0.305, [0.737, 0.897, 0.744]], [0.307, [0.737, 0.897, 0.744]], [0.309, [0.732, 0.895, 0.743]], [0.311, [0.732, 0.895, 0.743]], [0.313, [0.728, 0.894, 0.741]], [0.315, [0.728, 0.894, 0.741]], [0.317, [0.724, 0.892, 0.739]], [0.319, [0.724, 0.892, 0.739]], [0.321, [0.719, 0.890, 0.737]], [0.323, [0.719, 0.890, 0.737]], [0.325, [0.715, 0.888, 0.735]], [0.327, [0.715, 0.888, 0.735]], [0.329, [0.710, 0.887, 0.733]], [0.331, [0.710, 0.887, 0.733]], [0.333, [0.706, 0.885, 0.731]], [0.335, [0.706, 0.885, 0.731]], [0.337, [0.701, 0.883, 0.729]], [0.339, [0.701, 0.883, 0.729]], [0.341, [0.697, 0.882, 0.727]], [0.342, [0.697, 0.882, 0.727]], [0.344, [0.693, 0.880, 0.725]], [0.346, [0.693, 0.880, 0.725]], [0.348, [0.688, 0.878, 0.723]], [0.350, [0.688, 0.878, 0.723]], [0.352, [0.684, 0.876, 0.721]], [0.354, [0.684, 0.876, 0.721]], [0.356, [0.679, 0.875, 0.719]], [0.358, [0.679, 0.875, 0.719]], [0.360, [0.675, 0.873, 0.717]], [0.362, [0.675, 0.873, 0.717]], [0.364, [0.670, 0.871, 0.715]], [0.366, [0.670, 0.871, 0.715]], [0.368, [0.666, 0.869, 0.713]], [0.370, [0.666, 0.869, 0.713]], [0.372, [0.662, 0.868, 0.711]], [0.374, [0.662, 0.868, 0.711]], [0.376, [0.657, 0.866, 0.710]], [0.378, [0.657, 0.866, 0.710]], [0.380, [0.651, 0.864, 0.712]], [0.382, [0.651, 0.864, 0.712]], [0.384, [0.646, 0.862, 0.714]], [0.386, [0.646, 0.862, 0.714]], [0.387, [0.640, 0.860, 0.716]], [0.389, [0.640, 0.860, 0.716]], [0.391, [0.635, 0.858, 0.718]], [0.393, [0.635, 0.858, 0.718]], [0.395, [0.629, 0.855, 0.720]], [0.397, [0.629, 0.855, 0.720]], [0.399, [0.624, 0.853, 0.722]], [0.401, [0.624, 0.853, 0.722]], [0.403, [0.618, 0.851, 0.723]], [0.405, [0.618, 0.851, 0.723]], [0.407, [0.612, 0.849, 0.725]], [0.409, [0.612, 0.849, 0.725]], [0.411, [0.607, 0.847, 0.727]], [0.413, [0.607, 0.847, 0.727]], [0.415, [0.601, 0.845, 0.729]], [0.417, [0.601, 0.845, 0.729]], [0.419, [0.596, 0.843, 0.731]], [0.421, [0.596, 0.843, 0.731]], [0.423, [0.590, 0.841, 0.733]], [0.425, [0.590, 0.841, 0.733]], [0.427, [0.585, 0.839, 0.734]], [0.429, [0.585, 0.839, 0.734]], [0.431, [0.579, 0.837, 0.736]], [0.432, [0.579, 0.837, 0.736]], [0.434, [0.574, 0.835, 0.738]], [0.436, [0.574, 0.835, 0.738]], [0.438, [0.568, 0.832, 0.740]], [0.440, [0.568, 0.832, 0.740]], [0.442, [0.563, 0.830, 0.742]], [0.444, [0.563, 0.830, 0.742]], [0.446, [0.557, 0.828, 0.744]], [0.448, [0.557, 0.828, 0.744]], [0.450, [0.552, 0.826, 0.746]], [0.452, [0.552, 0.826, 0.746]], [0.454, [0.546, 0.824, 0.747]], [0.456, [0.546, 0.824, 0.747]], [0.458, [0.540, 0.822, 0.749]], [0.460, [0.540, 0.822, 0.749]], [0.462, [0.535, 0.820, 0.751]], [0.464, [0.535, 0.820, 0.751]], [0.466, [0.529, 0.818, 0.753]], [0.468, [0.529, 0.818, 0.753]], [0.470, [0.524, 0.816, 0.755]], [0.472, [0.524, 0.816, 0.755]], [0.474, [0.518, 0.814, 0.757]], [0.476, [0.518, 0.814, 0.757]], [0.477, [0.513, 0.812, 0.758]], [0.479, [0.513, 0.812, 0.758]], [0.481, [0.507, 0.809, 0.760]], [0.483, [0.507, 0.809, 0.760]], [0.485, [0.502, 0.807, 0.762]], [0.487, [0.502, 0.807, 0.762]], [0.489, [0.496, 0.805, 0.764]], [0.491, [0.496, 0.805, 0.764]], [0.493, [0.491, 0.803, 0.766]], [0.495, [0.491, 0.803, 0.766]], [0.497, [0.485, 0.801, 0.768]], [0.499, [0.485, 0.801, 0.768]], [0.501, [0.480, 0.798, 0.770]], [0.503, [0.480, 0.798, 0.770]], [0.505, [0.474, 0.795, 0.771]], [0.507, [0.474, 0.795, 0.771]], [0.509, [0.469, 0.792, 0.773]], [0.511, [0.469, 0.792, 0.773]], [0.513, [0.463, 0.789, 0.775]], [0.515, [0.463, 0.789, 0.775]], [0.517, [0.457, 0.786, 0.777]], [0.519, [0.457, 0.786, 0.777]], [0.521, [0.452, 0.783, 0.779]], [0.523, [0.452, 0.783, 0.779]], [0.524, [0.446, 0.780, 0.781]], [0.526, [0.446, 0.780, 0.781]], [0.528, [0.441, 0.777, 0.782]], [0.530, [0.441, 0.777, 0.782]], [0.532, [0.435, 0.774, 0.784]], [0.534, [0.435, 0.774, 0.784]], [0.536, [0.430, 0.771, 0.786]], [0.538, [0.430, 0.771, 0.786]], [0.540, [0.424, 0.768, 0.788]], [0.542, [0.424, 0.768, 0.788]], [0.544, [0.419, 0.765, 0.790]], [0.546, [0.419, 0.765, 0.790]], [0.548, [0.413, 0.762, 0.792]], [0.550, [0.413, 0.762, 0.792]], [0.552, [0.408, 0.758, 0.794]], [0.554, [0.408, 0.758, 0.794]], [0.556, [0.402, 0.755, 0.795]], [0.558, [0.402, 0.755, 0.795]], [0.560, [0.397, 0.752, 0.797]], [0.562, [0.397, 0.752, 0.797]], [0.564, [0.391, 0.749, 0.799]], [0.566, [0.391, 0.749, 0.799]], [0.568, [0.385, 0.746, 0.801]], [0.569, [0.385, 0.746, 0.801]], [0.571, [0.380, 0.743, 0.803]], [0.573, [0.380, 0.743, 0.803]], [0.575, [0.374, 0.740, 0.805]], [0.577, [0.374, 0.740, 0.805]], [0.579, [0.369, 0.737, 0.806]], [0.581, [0.369, 0.737, 0.806]], [0.583, [0.363, 0.734, 0.808]], [0.585, [0.363, 0.734, 0.808]], [0.587, [0.358, 0.731, 0.810]], [0.589, [0.358, 0.731, 0.810]], [0.591, [0.352, 0.728, 0.812]], [0.593, [0.352, 0.728, 0.812]], [0.595, [0.347, 0.725, 0.814]], [0.597, [0.347, 0.725, 0.814]], [0.599, [0.341, 0.722, 0.816]], [0.601, [0.341, 0.722, 0.816]], [0.603, [0.336, 0.718, 0.818]], [0.605, [0.336, 0.718, 0.818]], [0.607, [0.330, 0.715, 0.819]], [0.609, [0.330, 0.715, 0.819]], [0.611, [0.325, 0.712, 0.821]], [0.613, [0.325, 0.712, 0.821]], [0.614, [0.319, 0.709, 0.823]], [0.616, [0.319, 0.709, 0.823]], [0.618, [0.313, 0.706, 0.825]], [0.620, [0.313, 0.706, 0.825]], [0.622, [0.308, 0.703, 0.827]], [0.624, [0.308, 0.703, 0.827]], [0.626, [0.303, 0.699, 0.826]], [0.628, [0.303, 0.699, 0.826]], [0.630, [0.299, 0.694, 0.823]], [0.632, [0.299, 0.694, 0.823]], [0.634, [0.295, 0.689, 0.821]], [0.636, [0.295, 0.689, 0.821]], [0.638, [0.290, 0.685, 0.818]], [0.640, [0.290, 0.685, 0.818]], [0.642, [0.286, 0.680, 0.816]], [0.644, [0.286, 0.680, 0.816]], [0.646, [0.282, 0.675, 0.813]], [0.648, [0.282, 0.675, 0.813]], [0.650, [0.277, 0.670, 0.810]], [0.652, [0.277, 0.670, 0.810]], [0.654, [0.273, 0.665, 0.808]], [0.656, [0.273, 0.665, 0.808]], [0.658, [0.269, 0.661, 0.805]], [0.659, [0.269, 0.661, 0.805]], [0.661, [0.264, 0.656, 0.803]], [0.663, [0.264, 0.656, 0.803]], [0.665, [0.260, 0.651, 0.800]], [0.667, [0.260, 0.651, 0.800]], [0.669, [0.256, 0.646, 0.797]], [0.671, [0.256, 0.646, 0.797]], [0.673, [0.252, 0.641, 0.795]], [0.675, [0.252, 0.641, 0.795]], [0.677, [0.247, 0.637, 0.792]], [0.679, [0.247, 0.637, 0.792]], [0.681, [0.243, 0.632, 0.790]], [0.683, [0.243, 0.632, 0.790]], [0.685, [0.239, 0.627, 0.787]], [0.687, [0.239, 0.627, 0.787]], [0.689, [0.234, 0.622, 0.784]], [0.691, [0.234, 0.622, 0.784]], [0.693, [0.230, 0.617, 0.782]], [0.695, [0.230, 0.617, 0.782]], [0.697, [0.226, 0.613, 0.779]], [0.699, [0.226, 0.613, 0.779]], [0.701, [0.221, 0.608, 0.777]], [0.703, [0.221, 0.608, 0.777]], [0.705, [0.217, 0.603, 0.774]], [0.706, [0.217, 0.603, 0.774]], [0.708, [0.213, 0.598, 0.772]], [0.710, [0.213, 0.598, 0.772]], [0.712, [0.208, 0.593, 0.769]], [0.714, [0.208, 0.593, 0.769]], [0.716, [0.204, 0.589, 0.766]], [0.718, [0.204, 0.589, 0.766]], [0.720, [0.200, 0.584, 0.764]], [0.722, [0.200, 0.584, 0.764]], [0.724, [0.196, 0.579, 0.761]], [0.726, [0.196, 0.579, 0.761]], [0.728, [0.191, 0.574, 0.759]], [0.730, [0.191, 0.574, 0.759]], [0.732, [0.187, 0.569, 0.756]], [0.734, [0.187, 0.569, 0.756]], [0.736, [0.183, 0.565, 0.753]], [0.738, [0.183, 0.565, 0.753]], [0.740, [0.178, 0.560, 0.751]], [0.742, [0.178, 0.560, 0.751]], [0.744, [0.174, 0.555, 0.748]], [0.746, [0.174, 0.555, 0.748]], [0.748, [0.170, 0.550, 0.746]], [0.750, [0.170, 0.550, 0.746]], [0.751, [0.165, 0.546, 0.743]], [0.753, [0.165, 0.546, 0.743]], [0.755, [0.161, 0.541, 0.741]], [0.757, [0.161, 0.541, 0.741]], [0.759, [0.157, 0.537, 0.739]], [0.761, [0.157, 0.537, 0.739]], [0.763, [0.152, 0.532, 0.737]], [0.765, [0.152, 0.532, 0.737]], [0.767, [0.148, 0.528, 0.735]], [0.769, [0.148, 0.528, 0.735]], [0.771, [0.144, 0.524, 0.732]], [0.773, [0.144, 0.524, 0.732]], [0.775, [0.140, 0.519, 0.730]], [0.777, [0.140, 0.519, 0.730]], [0.779, [0.135, 0.515, 0.728]], [0.781, [0.135, 0.515, 0.728]], [0.783, [0.131, 0.510, 0.726]], [0.785, [0.131, 0.510, 0.726]], [0.787, [0.127, 0.506, 0.724]], [0.789, [0.127, 0.506, 0.724]], [0.791, [0.122, 0.501, 0.721]], [0.793, [0.122, 0.501, 0.721]], [0.795, [0.118, 0.497, 0.719]], [0.796, [0.118, 0.497, 0.719]], [0.798, [0.114, 0.493, 0.717]], [0.800, [0.114, 0.493, 0.717]], [0.802, [0.109, 0.488, 0.715]], [0.804, [0.109, 0.488, 0.715]], [0.806, [0.105, 0.484, 0.712]], [0.808, [0.105, 0.484, 0.712]], [0.810, [0.101, 0.479, 0.710]], [0.812, [0.101, 0.479, 0.710]], [0.814, [0.097, 0.475, 0.708]], [0.816, [0.097, 0.475, 0.708]], [0.818, [0.092, 0.470, 0.706]], [0.820, [0.092, 0.470, 0.706]], [0.822, [0.088, 0.466, 0.704]], [0.824, [0.088, 0.466, 0.704]], [0.826, [0.084, 0.462, 0.701]], [0.828, [0.084, 0.462, 0.701]], [0.830, [0.079, 0.457, 0.699]], [0.832, [0.079, 0.457, 0.699]], [0.834, [0.075, 0.453, 0.697]], [0.836, [0.075, 0.453, 0.697]], [0.838, [0.071, 0.448, 0.695]], [0.840, [0.071, 0.448, 0.695]], [0.841, [0.066, 0.444, 0.693]], [0.843, [0.066, 0.444, 0.693]], [0.845, [0.062, 0.439, 0.690]], [0.847, [0.062, 0.439, 0.690]], [0.849, [0.058, 0.435, 0.688]], [0.851, [0.058, 0.435, 0.688]], [0.853, [0.053, 0.431, 0.686]], [0.855, [0.053, 0.431, 0.686]], [0.857, [0.049, 0.426, 0.684]], [0.859, [0.049, 0.426, 0.684]], [0.861, [0.045, 0.422, 0.681]], [0.863, [0.045, 0.422, 0.681]], [0.865, [0.041, 0.417, 0.679]], [0.867, [0.041, 0.417, 0.679]], [0.869, [0.036, 0.413, 0.677]], [0.871, [0.036, 0.413, 0.677]], [0.873, [0.032, 0.408, 0.675]], [0.875, [0.032, 0.408, 0.675]], [0.877, [0.031, 0.404, 0.670]], [0.879, [0.031, 0.404, 0.670]], [0.881, [0.031, 0.399, 0.665]], [0.883, [0.031, 0.399, 0.665]], [0.885, [0.031, 0.394, 0.659]], [0.886, [0.031, 0.394, 0.659]], [0.888, [0.031, 0.389, 0.654]], [0.890, [0.031, 0.389, 0.654]], [0.892, [0.031, 0.384, 0.649]], [0.894, [0.031, 0.384, 0.649]], [0.896, [0.031, 0.379, 0.643]], [0.898, [0.031, 0.379, 0.643]], [0.900, [0.031, 0.374, 0.638]], [0.902, [0.031, 0.374, 0.638]], [0.904, [0.031, 0.369, 0.633]], [0.906, [0.031, 0.369, 0.633]], [0.908, [0.031, 0.364, 0.628]], [0.910, [0.031, 0.364, 0.628]], [0.912, [0.031, 0.359, 0.622]], [0.914, [0.031, 0.359, 0.622]], [0.916, [0.031, 0.354, 0.617]], [0.918, [0.031, 0.354, 0.617]], [0.920, [0.031, 0.349, 0.612]], [0.922, [0.031, 0.349, 0.612]], [0.924, [0.031, 0.344, 0.606]], [0.926, [0.031, 0.344, 0.606]], [0.928, [0.031, 0.340, 0.601]], [0.930, [0.031, 0.340, 0.601]], [0.932, [0.031, 0.335, 0.596]], [0.933, [0.031, 0.335, 0.596]], [0.935, [0.031, 0.330, 0.591]], [0.937, [0.031, 0.330, 0.591]], [0.939, [0.031, 0.325, 0.585]], [0.941, [0.031, 0.325, 0.585]], [0.943, [0.031, 0.320, 0.580]], [0.945, [0.031, 0.320, 0.580]], [0.947, [0.031, 0.315, 0.575]], [0.949, [0.031, 0.315, 0.575]], [0.951, [0.031, 0.310, 0.569]], [0.953, [0.031, 0.310, 0.569]], [0.955, [0.031, 0.305, 0.564]], [0.957, [0.031, 0.305, 0.564]], [0.959, [0.031, 0.300, 0.559]], [0.961, [0.031, 0.300, 0.559]], [0.963, [0.031, 0.295, 0.553]], [0.965, [0.031, 0.295, 0.553]], [0.967, [0.031, 0.290, 0.548]], [0.969, [0.031, 0.290, 0.548]], [0.971, [0.031, 0.285, 0.543]], [0.973, [0.031, 0.285, 0.543]], [0.975, [0.031, 0.281, 0.538]], [0.977, [0.031, 0.281, 0.538]], [0.978, [0.031, 0.276, 0.532]], [0.980, [0.031, 0.276, 0.532]], [0.982, [0.031, 0.271, 0.527]], [0.984, [0.031, 0.271, 0.527]], [0.986, [0.031, 0.266, 0.522]], [0.988, [0.031, 0.266, 0.522]], [0.990, [0.031, 0.261, 0.516]], [0.992, [0.031, 0.261, 0.516]], [0.994, [0.031, 0.256, 0.511]], [0.996, [0.031, 0.256, 0.511]], [0.998, [0.031, 0.251, 0.506]], [1.000, [0.031, 0.251, 0.506]]]; +var Greens = [[0.000, [0.969, 0.988, 0.961]], [0.002, [0.969, 0.988, 0.961]], [0.004, [0.966, 0.987, 0.958]], [0.006, [0.966, 0.987, 0.958]], [0.008, [0.964, 0.987, 0.956]], [0.010, [0.964, 0.987, 0.956]], [0.012, [0.962, 0.986, 0.953]], [0.014, [0.962, 0.986, 0.953]], [0.016, [0.960, 0.985, 0.950]], [0.018, [0.960, 0.985, 0.950]], [0.020, [0.958, 0.984, 0.948]], [0.022, [0.958, 0.984, 0.948]], [0.023, [0.955, 0.983, 0.945]], [0.025, [0.955, 0.983, 0.945]], [0.027, [0.953, 0.982, 0.943]], [0.029, [0.953, 0.982, 0.943]], [0.031, [0.951, 0.981, 0.940]], [0.033, [0.951, 0.981, 0.940]], [0.035, [0.949, 0.980, 0.938]], [0.037, [0.949, 0.980, 0.938]], [0.039, [0.946, 0.980, 0.935]], [0.041, [0.946, 0.980, 0.935]], [0.043, [0.944, 0.979, 0.932]], [0.045, [0.944, 0.979, 0.932]], [0.047, [0.942, 0.978, 0.930]], [0.049, [0.942, 0.978, 0.930]], [0.051, [0.940, 0.977, 0.927]], [0.053, [0.940, 0.977, 0.927]], [0.055, [0.938, 0.976, 0.925]], [0.057, [0.938, 0.976, 0.925]], [0.059, [0.935, 0.975, 0.922]], [0.061, [0.935, 0.975, 0.922]], [0.063, [0.933, 0.974, 0.919]], [0.065, [0.933, 0.974, 0.919]], [0.067, [0.931, 0.974, 0.917]], [0.068, [0.931, 0.974, 0.917]], [0.070, [0.929, 0.973, 0.914]], [0.072, [0.929, 0.973, 0.914]], [0.074, [0.927, 0.972, 0.912]], [0.076, [0.927, 0.972, 0.912]], [0.078, [0.924, 0.971, 0.909]], [0.080, [0.924, 0.971, 0.909]], [0.082, [0.922, 0.970, 0.907]], [0.084, [0.922, 0.970, 0.907]], [0.086, [0.920, 0.969, 0.904]], [0.088, [0.920, 0.969, 0.904]], [0.090, [0.918, 0.968, 0.901]], [0.092, [0.918, 0.968, 0.901]], [0.094, [0.915, 0.968, 0.899]], [0.096, [0.915, 0.968, 0.899]], [0.098, [0.913, 0.967, 0.896]], [0.100, [0.913, 0.967, 0.896]], [0.102, [0.911, 0.966, 0.894]], [0.104, [0.911, 0.966, 0.894]], [0.106, [0.909, 0.965, 0.891]], [0.108, [0.909, 0.965, 0.891]], [0.110, [0.907, 0.964, 0.888]], [0.112, [0.907, 0.964, 0.888]], [0.114, [0.904, 0.963, 0.886]], [0.115, [0.904, 0.963, 0.886]], [0.117, [0.902, 0.962, 0.883]], [0.119, [0.902, 0.962, 0.883]], [0.121, [0.900, 0.962, 0.881]], [0.123, [0.900, 0.962, 0.881]], [0.125, [0.898, 0.961, 0.878]], [0.127, [0.898, 0.961, 0.878]], [0.129, [0.894, 0.959, 0.874]], [0.131, [0.894, 0.959, 0.874]], [0.133, [0.890, 0.958, 0.870]], [0.135, [0.890, 0.958, 0.870]], [0.137, [0.887, 0.956, 0.866]], [0.139, [0.887, 0.956, 0.866]], [0.141, [0.883, 0.955, 0.862]], [0.143, [0.883, 0.955, 0.862]], [0.145, [0.879, 0.953, 0.858]], [0.147, [0.879, 0.953, 0.858]], [0.149, [0.875, 0.952, 0.854]], [0.151, [0.875, 0.952, 0.854]], [0.153, [0.872, 0.950, 0.850]], [0.155, [0.872, 0.950, 0.850]], [0.157, [0.868, 0.949, 0.846]], [0.159, [0.868, 0.949, 0.846]], [0.160, [0.864, 0.947, 0.843]], [0.162, [0.864, 0.947, 0.843]], [0.164, [0.861, 0.946, 0.839]], [0.166, [0.861, 0.946, 0.839]], [0.168, [0.857, 0.944, 0.835]], [0.170, [0.857, 0.944, 0.835]], [0.172, [0.853, 0.943, 0.831]], [0.174, [0.853, 0.943, 0.831]], [0.176, [0.850, 0.941, 0.827]], [0.178, [0.850, 0.941, 0.827]], [0.180, [0.846, 0.940, 0.823]], [0.182, [0.846, 0.940, 0.823]], [0.184, [0.842, 0.938, 0.819]], [0.186, [0.842, 0.938, 0.819]], [0.188, [0.839, 0.937, 0.815]], [0.190, [0.839, 0.937, 0.815]], [0.192, [0.835, 0.936, 0.811]], [0.194, [0.835, 0.936, 0.811]], [0.196, [0.831, 0.934, 0.807]], [0.198, [0.831, 0.934, 0.807]], [0.200, [0.827, 0.933, 0.803]], [0.202, [0.827, 0.933, 0.803]], [0.204, [0.824, 0.931, 0.799]], [0.205, [0.824, 0.931, 0.799]], [0.207, [0.820, 0.930, 0.795]], [0.209, [0.820, 0.930, 0.795]], [0.211, [0.816, 0.928, 0.791]], [0.213, [0.816, 0.928, 0.791]], [0.215, [0.813, 0.927, 0.787]], [0.217, [0.813, 0.927, 0.787]], [0.219, [0.809, 0.925, 0.783]], [0.221, [0.809, 0.925, 0.783]], [0.223, [0.805, 0.924, 0.780]], [0.225, [0.805, 0.924, 0.780]], [0.227, [0.802, 0.922, 0.776]], [0.229, [0.802, 0.922, 0.776]], [0.231, [0.798, 0.921, 0.772]], [0.233, [0.798, 0.921, 0.772]], [0.235, [0.794, 0.919, 0.768]], [0.237, [0.794, 0.919, 0.768]], [0.239, [0.791, 0.918, 0.764]], [0.241, [0.791, 0.918, 0.764]], [0.243, [0.787, 0.916, 0.760]], [0.245, [0.787, 0.916, 0.760]], [0.247, [0.783, 0.915, 0.756]], [0.249, [0.783, 0.915, 0.756]], [0.250, [0.779, 0.913, 0.752]], [0.252, [0.779, 0.913, 0.752]], [0.254, [0.775, 0.911, 0.747]], [0.256, [0.775, 0.911, 0.747]], [0.258, [0.770, 0.909, 0.743]], [0.260, [0.770, 0.909, 0.743]], [0.262, [0.765, 0.907, 0.738]], [0.264, [0.765, 0.907, 0.738]], [0.266, [0.761, 0.905, 0.734]], [0.268, [0.761, 0.905, 0.734]], [0.270, [0.756, 0.903, 0.729]], [0.272, [0.756, 0.903, 0.729]], [0.274, [0.751, 0.901, 0.724]], [0.276, [0.751, 0.901, 0.724]], [0.278, [0.746, 0.899, 0.720]], [0.280, [0.746, 0.899, 0.720]], [0.282, [0.742, 0.897, 0.715]], [0.284, [0.742, 0.897, 0.715]], [0.286, [0.737, 0.896, 0.711]], [0.288, [0.737, 0.896, 0.711]], [0.290, [0.732, 0.894, 0.706]], [0.292, [0.732, 0.894, 0.706]], [0.294, [0.728, 0.892, 0.702]], [0.295, [0.728, 0.892, 0.702]], [0.297, [0.723, 0.890, 0.697]], [0.299, [0.723, 0.890, 0.697]], [0.301, [0.718, 0.888, 0.693]], [0.303, [0.718, 0.888, 0.693]], [0.305, [0.714, 0.886, 0.688]], [0.307, [0.714, 0.886, 0.688]], [0.309, [0.709, 0.884, 0.684]], [0.311, [0.709, 0.884, 0.684]], [0.313, [0.704, 0.882, 0.679]], [0.315, [0.704, 0.882, 0.679]], [0.317, [0.700, 0.880, 0.674]], [0.319, [0.700, 0.880, 0.674]], [0.321, [0.695, 0.878, 0.670]], [0.323, [0.695, 0.878, 0.670]], [0.325, [0.690, 0.876, 0.665]], [0.327, [0.690, 0.876, 0.665]], [0.329, [0.686, 0.874, 0.661]], [0.331, [0.686, 0.874, 0.661]], [0.333, [0.681, 0.872, 0.656]], [0.335, [0.681, 0.872, 0.656]], [0.337, [0.676, 0.870, 0.652]], [0.339, [0.676, 0.870, 0.652]], [0.341, [0.672, 0.868, 0.647]], [0.342, [0.672, 0.868, 0.647]], [0.344, [0.667, 0.866, 0.643]], [0.346, [0.667, 0.866, 0.643]], [0.348, [0.662, 0.864, 0.638]], [0.350, [0.662, 0.864, 0.638]], [0.352, [0.658, 0.862, 0.633]], [0.354, [0.658, 0.862, 0.633]], [0.356, [0.653, 0.860, 0.629]], [0.358, [0.653, 0.860, 0.629]], [0.360, [0.648, 0.858, 0.624]], [0.362, [0.648, 0.858, 0.624]], [0.364, [0.644, 0.856, 0.620]], [0.366, [0.644, 0.856, 0.620]], [0.368, [0.639, 0.854, 0.615]], [0.370, [0.639, 0.854, 0.615]], [0.372, [0.634, 0.852, 0.611]], [0.374, [0.634, 0.852, 0.611]], [0.376, [0.629, 0.850, 0.606]], [0.378, [0.629, 0.850, 0.606]], [0.380, [0.624, 0.847, 0.602]], [0.382, [0.624, 0.847, 0.602]], [0.384, [0.618, 0.845, 0.597]], [0.386, [0.618, 0.845, 0.597]], [0.387, [0.613, 0.842, 0.592]], [0.389, [0.613, 0.842, 0.592]], [0.391, [0.607, 0.840, 0.588]], [0.393, [0.607, 0.840, 0.588]], [0.395, [0.602, 0.837, 0.583]], [0.397, [0.602, 0.837, 0.583]], [0.399, [0.596, 0.835, 0.579]], [0.401, [0.596, 0.835, 0.579]], [0.403, [0.591, 0.832, 0.574]], [0.405, [0.591, 0.832, 0.574]], [0.407, [0.585, 0.829, 0.570]], [0.409, [0.585, 0.829, 0.570]], [0.411, [0.579, 0.827, 0.565]], [0.413, [0.579, 0.827, 0.565]], [0.415, [0.574, 0.824, 0.561]], [0.417, [0.574, 0.824, 0.561]], [0.419, [0.568, 0.822, 0.556]], [0.421, [0.568, 0.822, 0.556]], [0.423, [0.563, 0.819, 0.552]], [0.425, [0.563, 0.819, 0.552]], [0.427, [0.557, 0.816, 0.547]], [0.429, [0.557, 0.816, 0.547]], [0.431, [0.552, 0.814, 0.542]], [0.432, [0.552, 0.814, 0.542]], [0.434, [0.546, 0.811, 0.538]], [0.436, [0.546, 0.811, 0.538]], [0.438, [0.541, 0.809, 0.533]], [0.440, [0.541, 0.809, 0.533]], [0.442, [0.535, 0.806, 0.529]], [0.444, [0.535, 0.806, 0.529]], [0.446, [0.530, 0.804, 0.524]], [0.448, [0.530, 0.804, 0.524]], [0.450, [0.524, 0.801, 0.520]], [0.452, [0.524, 0.801, 0.520]], [0.454, [0.519, 0.798, 0.515]], [0.456, [0.519, 0.798, 0.515]], [0.458, [0.513, 0.796, 0.511]], [0.460, [0.513, 0.796, 0.511]], [0.462, [0.507, 0.793, 0.506]], [0.464, [0.507, 0.793, 0.506]], [0.466, [0.502, 0.791, 0.501]], [0.468, [0.502, 0.791, 0.501]], [0.470, [0.496, 0.788, 0.497]], [0.472, [0.496, 0.788, 0.497]], [0.474, [0.491, 0.785, 0.492]], [0.476, [0.491, 0.785, 0.492]], [0.477, [0.485, 0.783, 0.488]], [0.479, [0.485, 0.783, 0.488]], [0.481, [0.480, 0.780, 0.483]], [0.483, [0.480, 0.780, 0.483]], [0.485, [0.474, 0.778, 0.479]], [0.487, [0.474, 0.778, 0.479]], [0.489, [0.469, 0.775, 0.474]], [0.491, [0.469, 0.775, 0.474]], [0.493, [0.463, 0.773, 0.470]], [0.495, [0.463, 0.773, 0.470]], [0.497, [0.458, 0.770, 0.465]], [0.499, [0.458, 0.770, 0.465]], [0.501, [0.452, 0.767, 0.461]], [0.503, [0.452, 0.767, 0.461]], [0.505, [0.445, 0.764, 0.458]], [0.507, [0.445, 0.764, 0.458]], [0.509, [0.439, 0.761, 0.455]], [0.511, [0.439, 0.761, 0.455]], [0.513, [0.433, 0.758, 0.452]], [0.515, [0.433, 0.758, 0.452]], [0.517, [0.427, 0.755, 0.449]], [0.519, [0.427, 0.755, 0.449]], [0.521, [0.420, 0.752, 0.446]], [0.523, [0.420, 0.752, 0.446]], [0.524, [0.414, 0.749, 0.443]], [0.526, [0.414, 0.749, 0.443]], [0.528, [0.408, 0.746, 0.440]], [0.530, [0.408, 0.746, 0.440]], [0.532, [0.402, 0.742, 0.437]], [0.534, [0.402, 0.742, 0.437]], [0.536, [0.395, 0.739, 0.434]], [0.538, [0.395, 0.739, 0.434]], [0.540, [0.389, 0.736, 0.430]], [0.542, [0.389, 0.736, 0.430]], [0.544, [0.383, 0.733, 0.427]], [0.546, [0.383, 0.733, 0.427]], [0.548, [0.376, 0.730, 0.424]], [0.550, [0.376, 0.730, 0.424]], [0.552, [0.370, 0.727, 0.421]], [0.554, [0.370, 0.727, 0.421]], [0.556, [0.364, 0.724, 0.418]], [0.558, [0.364, 0.724, 0.418]], [0.560, [0.358, 0.721, 0.415]], [0.562, [0.358, 0.721, 0.415]], [0.564, [0.351, 0.718, 0.412]], [0.566, [0.351, 0.718, 0.412]], [0.568, [0.345, 0.715, 0.409]], [0.569, [0.345, 0.715, 0.409]], [0.571, [0.339, 0.712, 0.406]], [0.573, [0.339, 0.712, 0.406]], [0.575, [0.333, 0.709, 0.403]], [0.577, [0.333, 0.709, 0.403]], [0.579, [0.326, 0.706, 0.400]], [0.581, [0.326, 0.706, 0.400]], [0.583, [0.320, 0.702, 0.397]], [0.585, [0.320, 0.702, 0.397]], [0.587, [0.314, 0.699, 0.394]], [0.589, [0.314, 0.699, 0.394]], [0.591, [0.307, 0.696, 0.390]], [0.593, [0.307, 0.696, 0.390]], [0.595, [0.301, 0.693, 0.387]], [0.597, [0.301, 0.693, 0.387]], [0.599, [0.295, 0.690, 0.384]], [0.601, [0.295, 0.690, 0.384]], [0.603, [0.289, 0.687, 0.381]], [0.605, [0.289, 0.687, 0.381]], [0.607, [0.282, 0.684, 0.378]], [0.609, [0.282, 0.684, 0.378]], [0.611, [0.276, 0.681, 0.375]], [0.613, [0.276, 0.681, 0.375]], [0.614, [0.270, 0.678, 0.372]], [0.616, [0.270, 0.678, 0.372]], [0.618, [0.264, 0.675, 0.369]], [0.620, [0.264, 0.675, 0.369]], [0.622, [0.257, 0.672, 0.366]], [0.624, [0.257, 0.672, 0.366]], [0.626, [0.253, 0.668, 0.363]], [0.628, [0.253, 0.668, 0.363]], [0.630, [0.249, 0.664, 0.360]], [0.632, [0.249, 0.664, 0.360]], [0.634, [0.245, 0.660, 0.357]], [0.636, [0.245, 0.660, 0.357]], [0.638, [0.242, 0.656, 0.354]], [0.640, [0.242, 0.656, 0.354]], [0.642, [0.238, 0.652, 0.351]], [0.644, [0.238, 0.652, 0.351]], [0.646, [0.234, 0.648, 0.348]], [0.648, [0.234, 0.648, 0.348]], [0.650, [0.230, 0.645, 0.345]], [0.652, [0.230, 0.645, 0.345]], [0.654, [0.227, 0.641, 0.342]], [0.656, [0.227, 0.641, 0.342]], [0.658, [0.223, 0.637, 0.339]], [0.659, [0.223, 0.637, 0.339]], [0.661, [0.219, 0.633, 0.336]], [0.663, [0.219, 0.633, 0.336]], [0.665, [0.216, 0.629, 0.333]], [0.667, [0.216, 0.629, 0.333]], [0.669, [0.212, 0.625, 0.330]], [0.671, [0.212, 0.625, 0.330]], [0.673, [0.208, 0.621, 0.327]], [0.675, [0.208, 0.621, 0.327]], [0.677, [0.205, 0.617, 0.324]], [0.679, [0.205, 0.617, 0.324]], [0.681, [0.201, 0.613, 0.322]], [0.683, [0.201, 0.613, 0.322]], [0.685, [0.197, 0.609, 0.319]], [0.687, [0.197, 0.609, 0.319]], [0.689, [0.194, 0.605, 0.316]], [0.691, [0.194, 0.605, 0.316]], [0.693, [0.190, 0.601, 0.313]], [0.695, [0.190, 0.601, 0.313]], [0.697, [0.186, 0.597, 0.310]], [0.699, [0.186, 0.597, 0.310]], [0.701, [0.182, 0.593, 0.307]], [0.703, [0.182, 0.593, 0.307]], [0.705, [0.179, 0.589, 0.304]], [0.706, [0.179, 0.589, 0.304]], [0.708, [0.175, 0.585, 0.301]], [0.710, [0.175, 0.585, 0.301]], [0.712, [0.171, 0.582, 0.298]], [0.714, [0.171, 0.582, 0.298]], [0.716, [0.168, 0.578, 0.295]], [0.718, [0.168, 0.578, 0.295]], [0.720, [0.164, 0.574, 0.292]], [0.722, [0.164, 0.574, 0.292]], [0.724, [0.160, 0.570, 0.289]], [0.726, [0.160, 0.570, 0.289]], [0.728, [0.157, 0.566, 0.286]], [0.730, [0.157, 0.566, 0.286]], [0.732, [0.153, 0.562, 0.283]], [0.734, [0.153, 0.562, 0.283]], [0.736, [0.149, 0.558, 0.280]], [0.738, [0.149, 0.558, 0.280]], [0.740, [0.146, 0.554, 0.277]], [0.742, [0.146, 0.554, 0.277]], [0.744, [0.142, 0.550, 0.274]], [0.746, [0.142, 0.550, 0.274]], [0.748, [0.138, 0.546, 0.271]], [0.750, [0.138, 0.546, 0.271]], [0.751, [0.134, 0.542, 0.268]], [0.753, [0.134, 0.542, 0.268]], [0.755, [0.130, 0.539, 0.265]], [0.757, [0.130, 0.539, 0.265]], [0.759, [0.125, 0.535, 0.262]], [0.761, [0.125, 0.535, 0.262]], [0.763, [0.121, 0.531, 0.259]], [0.765, [0.121, 0.531, 0.259]], [0.767, [0.117, 0.528, 0.256]], [0.769, [0.117, 0.528, 0.256]], [0.771, [0.112, 0.524, 0.253]], [0.773, [0.112, 0.524, 0.253]], [0.775, [0.108, 0.520, 0.250]], [0.777, [0.108, 0.520, 0.250]], [0.779, [0.104, 0.516, 0.247]], [0.781, [0.104, 0.516, 0.247]], [0.783, [0.100, 0.513, 0.244]], [0.785, [0.100, 0.513, 0.244]], [0.787, [0.095, 0.509, 0.241]], [0.789, [0.095, 0.509, 0.241]], [0.791, [0.091, 0.505, 0.238]], [0.793, [0.091, 0.505, 0.238]], [0.795, [0.087, 0.502, 0.234]], [0.796, [0.087, 0.502, 0.234]], [0.798, [0.082, 0.498, 0.231]], [0.800, [0.082, 0.498, 0.231]], [0.802, [0.078, 0.494, 0.228]], [0.804, [0.078, 0.494, 0.228]], [0.806, [0.074, 0.491, 0.225]], [0.808, [0.074, 0.491, 0.225]], [0.810, [0.069, 0.487, 0.222]], [0.812, [0.069, 0.487, 0.222]], [0.814, [0.065, 0.483, 0.219]], [0.816, [0.065, 0.483, 0.219]], [0.818, [0.061, 0.480, 0.216]], [0.820, [0.061, 0.480, 0.216]], [0.822, [0.057, 0.476, 0.213]], [0.824, [0.057, 0.476, 0.213]], [0.826, [0.052, 0.472, 0.210]], [0.828, [0.052, 0.472, 0.210]], [0.830, [0.048, 0.469, 0.207]], [0.832, [0.048, 0.469, 0.207]], [0.834, [0.044, 0.465, 0.204]], [0.836, [0.044, 0.465, 0.204]], [0.838, [0.039, 0.461, 0.201]], [0.840, [0.039, 0.461, 0.201]], [0.841, [0.035, 0.457, 0.198]], [0.843, [0.035, 0.457, 0.198]], [0.845, [0.031, 0.454, 0.194]], [0.847, [0.031, 0.454, 0.194]], [0.849, [0.026, 0.450, 0.191]], [0.851, [0.026, 0.450, 0.191]], [0.853, [0.022, 0.446, 0.188]], [0.855, [0.022, 0.446, 0.188]], [0.857, [0.018, 0.443, 0.185]], [0.859, [0.018, 0.443, 0.185]], [0.861, [0.013, 0.439, 0.182]], [0.863, [0.013, 0.439, 0.182]], [0.865, [0.009, 0.435, 0.179]], [0.867, [0.009, 0.435, 0.179]], [0.869, [0.005, 0.432, 0.176]], [0.871, [0.005, 0.432, 0.176]], [0.873, [0.001, 0.428, 0.173]], [0.875, [0.001, 0.428, 0.173]], [0.877, [0.000, 0.423, 0.171]], [0.879, [0.000, 0.423, 0.171]], [0.881, [0.000, 0.418, 0.169]], [0.883, [0.000, 0.418, 0.169]], [0.885, [0.000, 0.413, 0.167]], [0.886, [0.000, 0.413, 0.167]], [0.888, [0.000, 0.408, 0.164]], [0.890, [0.000, 0.408, 0.164]], [0.892, [0.000, 0.403, 0.162]], [0.894, [0.000, 0.403, 0.162]], [0.896, [0.000, 0.398, 0.160]], [0.898, [0.000, 0.398, 0.160]], [0.900, [0.000, 0.393, 0.158]], [0.902, [0.000, 0.393, 0.158]], [0.904, [0.000, 0.388, 0.156]], [0.906, [0.000, 0.388, 0.156]], [0.908, [0.000, 0.383, 0.154]], [0.910, [0.000, 0.383, 0.154]], [0.912, [0.000, 0.378, 0.152]], [0.914, [0.000, 0.378, 0.152]], [0.916, [0.000, 0.373, 0.150]], [0.918, [0.000, 0.373, 0.150]], [0.920, [0.000, 0.368, 0.148]], [0.922, [0.000, 0.368, 0.148]], [0.924, [0.000, 0.363, 0.146]], [0.926, [0.000, 0.363, 0.146]], [0.928, [0.000, 0.357, 0.144]], [0.930, [0.000, 0.357, 0.144]], [0.932, [0.000, 0.352, 0.141]], [0.933, [0.000, 0.352, 0.141]], [0.935, [0.000, 0.347, 0.139]], [0.937, [0.000, 0.347, 0.139]], [0.939, [0.000, 0.342, 0.137]], [0.941, [0.000, 0.342, 0.137]], [0.943, [0.000, 0.337, 0.135]], [0.945, [0.000, 0.337, 0.135]], [0.947, [0.000, 0.332, 0.133]], [0.949, [0.000, 0.332, 0.133]], [0.951, [0.000, 0.327, 0.131]], [0.953, [0.000, 0.327, 0.131]], [0.955, [0.000, 0.322, 0.129]], [0.957, [0.000, 0.322, 0.129]], [0.959, [0.000, 0.317, 0.127]], [0.961, [0.000, 0.317, 0.127]], [0.963, [0.000, 0.312, 0.125]], [0.965, [0.000, 0.312, 0.125]], [0.967, [0.000, 0.307, 0.123]], [0.969, [0.000, 0.307, 0.123]], [0.971, [0.000, 0.302, 0.121]], [0.973, [0.000, 0.302, 0.121]], [0.975, [0.000, 0.297, 0.118]], [0.977, [0.000, 0.297, 0.118]], [0.978, [0.000, 0.292, 0.116]], [0.980, [0.000, 0.292, 0.116]], [0.982, [0.000, 0.287, 0.114]], [0.984, [0.000, 0.287, 0.114]], [0.986, [0.000, 0.282, 0.112]], [0.988, [0.000, 0.282, 0.112]], [0.990, [0.000, 0.277, 0.110]], [0.992, [0.000, 0.277, 0.110]], [0.994, [0.000, 0.272, 0.108]], [0.996, [0.000, 0.272, 0.108]], [0.998, [0.000, 0.267, 0.106]], [1.000, [0.000, 0.267, 0.106]]]; +var Greys = [[0.000, [1.000, 1.000, 1.000]], [0.002, [1.000, 1.000, 1.000]], [0.004, [0.998, 0.998, 0.998]], [0.006, [0.998, 0.998, 0.998]], [0.008, [0.996, 0.996, 0.996]], [0.010, [0.996, 0.996, 0.996]], [0.012, [0.994, 0.994, 0.994]], [0.014, [0.994, 0.994, 0.994]], [0.016, [0.993, 0.993, 0.993]], [0.018, [0.993, 0.993, 0.993]], [0.020, [0.991, 0.991, 0.991]], [0.022, [0.991, 0.991, 0.991]], [0.023, [0.989, 0.989, 0.989]], [0.025, [0.989, 0.989, 0.989]], [0.027, [0.987, 0.987, 0.987]], [0.029, [0.987, 0.987, 0.987]], [0.031, [0.985, 0.985, 0.985]], [0.033, [0.985, 0.985, 0.985]], [0.035, [0.983, 0.983, 0.983]], [0.037, [0.983, 0.983, 0.983]], [0.039, [0.982, 0.982, 0.982]], [0.041, [0.982, 0.982, 0.982]], [0.043, [0.980, 0.980, 0.980]], [0.045, [0.980, 0.980, 0.980]], [0.047, [0.978, 0.978, 0.978]], [0.049, [0.978, 0.978, 0.978]], [0.051, [0.976, 0.976, 0.976]], [0.053, [0.976, 0.976, 0.976]], [0.055, [0.974, 0.974, 0.974]], [0.057, [0.974, 0.974, 0.974]], [0.059, [0.972, 0.972, 0.972]], [0.061, [0.972, 0.972, 0.972]], [0.063, [0.970, 0.970, 0.970]], [0.065, [0.970, 0.970, 0.970]], [0.067, [0.969, 0.969, 0.969]], [0.068, [0.969, 0.969, 0.969]], [0.070, [0.967, 0.967, 0.967]], [0.072, [0.967, 0.967, 0.967]], [0.074, [0.965, 0.965, 0.965]], [0.076, [0.965, 0.965, 0.965]], [0.078, [0.963, 0.963, 0.963]], [0.080, [0.963, 0.963, 0.963]], [0.082, [0.961, 0.961, 0.961]], [0.084, [0.961, 0.961, 0.961]], [0.086, [0.959, 0.959, 0.959]], [0.088, [0.959, 0.959, 0.959]], [0.090, [0.958, 0.958, 0.958]], [0.092, [0.958, 0.958, 0.958]], [0.094, [0.956, 0.956, 0.956]], [0.096, [0.956, 0.956, 0.956]], [0.098, [0.954, 0.954, 0.954]], [0.100, [0.954, 0.954, 0.954]], [0.102, [0.952, 0.952, 0.952]], [0.104, [0.952, 0.952, 0.952]], [0.106, [0.950, 0.950, 0.950]], [0.108, [0.950, 0.950, 0.950]], [0.110, [0.948, 0.948, 0.948]], [0.112, [0.948, 0.948, 0.948]], [0.114, [0.946, 0.946, 0.946]], [0.115, [0.946, 0.946, 0.946]], [0.117, [0.945, 0.945, 0.945]], [0.119, [0.945, 0.945, 0.945]], [0.121, [0.943, 0.943, 0.943]], [0.123, [0.943, 0.943, 0.943]], [0.125, [0.941, 0.941, 0.941]], [0.127, [0.941, 0.941, 0.941]], [0.129, [0.938, 0.938, 0.938]], [0.131, [0.938, 0.938, 0.938]], [0.133, [0.935, 0.935, 0.935]], [0.135, [0.935, 0.935, 0.935]], [0.137, [0.932, 0.932, 0.932]], [0.139, [0.932, 0.932, 0.932]], [0.141, [0.930, 0.930, 0.930]], [0.143, [0.930, 0.930, 0.930]], [0.145, [0.927, 0.927, 0.927]], [0.147, [0.927, 0.927, 0.927]], [0.149, [0.924, 0.924, 0.924]], [0.151, [0.924, 0.924, 0.924]], [0.153, [0.921, 0.921, 0.921]], [0.155, [0.921, 0.921, 0.921]], [0.157, [0.918, 0.918, 0.918]], [0.159, [0.918, 0.918, 0.918]], [0.160, [0.915, 0.915, 0.915]], [0.162, [0.915, 0.915, 0.915]], [0.164, [0.913, 0.913, 0.913]], [0.166, [0.913, 0.913, 0.913]], [0.168, [0.910, 0.910, 0.910]], [0.170, [0.910, 0.910, 0.910]], [0.172, [0.907, 0.907, 0.907]], [0.174, [0.907, 0.907, 0.907]], [0.176, [0.904, 0.904, 0.904]], [0.178, [0.904, 0.904, 0.904]], [0.180, [0.901, 0.901, 0.901]], [0.182, [0.901, 0.901, 0.901]], [0.184, [0.898, 0.898, 0.898]], [0.186, [0.898, 0.898, 0.898]], [0.188, [0.896, 0.896, 0.896]], [0.190, [0.896, 0.896, 0.896]], [0.192, [0.893, 0.893, 0.893]], [0.194, [0.893, 0.893, 0.893]], [0.196, [0.890, 0.890, 0.890]], [0.198, [0.890, 0.890, 0.890]], [0.200, [0.887, 0.887, 0.887]], [0.202, [0.887, 0.887, 0.887]], [0.204, [0.884, 0.884, 0.884]], [0.205, [0.884, 0.884, 0.884]], [0.207, [0.881, 0.881, 0.881]], [0.209, [0.881, 0.881, 0.881]], [0.211, [0.879, 0.879, 0.879]], [0.213, [0.879, 0.879, 0.879]], [0.215, [0.876, 0.876, 0.876]], [0.217, [0.876, 0.876, 0.876]], [0.219, [0.873, 0.873, 0.873]], [0.221, [0.873, 0.873, 0.873]], [0.223, [0.870, 0.870, 0.870]], [0.225, [0.870, 0.870, 0.870]], [0.227, [0.867, 0.867, 0.867]], [0.229, [0.867, 0.867, 0.867]], [0.231, [0.864, 0.864, 0.864]], [0.233, [0.864, 0.864, 0.864]], [0.235, [0.862, 0.862, 0.862]], [0.237, [0.862, 0.862, 0.862]], [0.239, [0.859, 0.859, 0.859]], [0.241, [0.859, 0.859, 0.859]], [0.243, [0.856, 0.856, 0.856]], [0.245, [0.856, 0.856, 0.856]], [0.247, [0.853, 0.853, 0.853]], [0.249, [0.853, 0.853, 0.853]], [0.250, [0.850, 0.850, 0.850]], [0.252, [0.850, 0.850, 0.850]], [0.254, [0.847, 0.847, 0.847]], [0.256, [0.847, 0.847, 0.847]], [0.258, [0.843, 0.843, 0.843]], [0.260, [0.843, 0.843, 0.843]], [0.262, [0.840, 0.840, 0.840]], [0.264, [0.840, 0.840, 0.840]], [0.266, [0.836, 0.836, 0.836]], [0.268, [0.836, 0.836, 0.836]], [0.270, [0.833, 0.833, 0.833]], [0.272, [0.833, 0.833, 0.833]], [0.274, [0.829, 0.829, 0.829]], [0.276, [0.829, 0.829, 0.829]], [0.278, [0.826, 0.826, 0.826]], [0.280, [0.826, 0.826, 0.826]], [0.282, [0.823, 0.823, 0.823]], [0.284, [0.823, 0.823, 0.823]], [0.286, [0.819, 0.819, 0.819]], [0.288, [0.819, 0.819, 0.819]], [0.290, [0.816, 0.816, 0.816]], [0.292, [0.816, 0.816, 0.816]], [0.294, [0.812, 0.812, 0.812]], [0.295, [0.812, 0.812, 0.812]], [0.297, [0.809, 0.809, 0.809]], [0.299, [0.809, 0.809, 0.809]], [0.301, [0.805, 0.805, 0.805]], [0.303, [0.805, 0.805, 0.805]], [0.305, [0.802, 0.802, 0.802]], [0.307, [0.802, 0.802, 0.802]], [0.309, [0.798, 0.798, 0.798]], [0.311, [0.798, 0.798, 0.798]], [0.313, [0.795, 0.795, 0.795]], [0.315, [0.795, 0.795, 0.795]], [0.317, [0.792, 0.792, 0.792]], [0.319, [0.792, 0.792, 0.792]], [0.321, [0.788, 0.788, 0.788]], [0.323, [0.788, 0.788, 0.788]], [0.325, [0.785, 0.785, 0.785]], [0.327, [0.785, 0.785, 0.785]], [0.329, [0.781, 0.781, 0.781]], [0.331, [0.781, 0.781, 0.781]], [0.333, [0.778, 0.778, 0.778]], [0.335, [0.778, 0.778, 0.778]], [0.337, [0.774, 0.774, 0.774]], [0.339, [0.774, 0.774, 0.774]], [0.341, [0.771, 0.771, 0.771]], [0.342, [0.771, 0.771, 0.771]], [0.344, [0.767, 0.767, 0.767]], [0.346, [0.767, 0.767, 0.767]], [0.348, [0.764, 0.764, 0.764]], [0.350, [0.764, 0.764, 0.764]], [0.352, [0.761, 0.761, 0.761]], [0.354, [0.761, 0.761, 0.761]], [0.356, [0.757, 0.757, 0.757]], [0.358, [0.757, 0.757, 0.757]], [0.360, [0.754, 0.754, 0.754]], [0.362, [0.754, 0.754, 0.754]], [0.364, [0.750, 0.750, 0.750]], [0.366, [0.750, 0.750, 0.750]], [0.368, [0.747, 0.747, 0.747]], [0.370, [0.747, 0.747, 0.747]], [0.372, [0.743, 0.743, 0.743]], [0.374, [0.743, 0.743, 0.743]], [0.376, [0.739, 0.739, 0.739]], [0.378, [0.739, 0.739, 0.739]], [0.380, [0.735, 0.735, 0.735]], [0.382, [0.735, 0.735, 0.735]], [0.384, [0.730, 0.730, 0.730]], [0.386, [0.730, 0.730, 0.730]], [0.387, [0.725, 0.725, 0.725]], [0.389, [0.725, 0.725, 0.725]], [0.391, [0.720, 0.720, 0.720]], [0.393, [0.720, 0.720, 0.720]], [0.395, [0.715, 0.715, 0.715]], [0.397, [0.715, 0.715, 0.715]], [0.399, [0.711, 0.711, 0.711]], [0.401, [0.711, 0.711, 0.711]], [0.403, [0.706, 0.706, 0.706]], [0.405, [0.706, 0.706, 0.706]], [0.407, [0.701, 0.701, 0.701]], [0.409, [0.701, 0.701, 0.701]], [0.411, [0.696, 0.696, 0.696]], [0.413, [0.696, 0.696, 0.696]], [0.415, [0.691, 0.691, 0.691]], [0.417, [0.691, 0.691, 0.691]], [0.419, [0.687, 0.687, 0.687]], [0.421, [0.687, 0.687, 0.687]], [0.423, [0.682, 0.682, 0.682]], [0.425, [0.682, 0.682, 0.682]], [0.427, [0.677, 0.677, 0.677]], [0.429, [0.677, 0.677, 0.677]], [0.431, [0.672, 0.672, 0.672]], [0.432, [0.672, 0.672, 0.672]], [0.434, [0.667, 0.667, 0.667]], [0.436, [0.667, 0.667, 0.667]], [0.438, [0.663, 0.663, 0.663]], [0.440, [0.663, 0.663, 0.663]], [0.442, [0.658, 0.658, 0.658]], [0.444, [0.658, 0.658, 0.658]], [0.446, [0.653, 0.653, 0.653]], [0.448, [0.653, 0.653, 0.653]], [0.450, [0.648, 0.648, 0.648]], [0.452, [0.648, 0.648, 0.648]], [0.454, [0.643, 0.643, 0.643]], [0.456, [0.643, 0.643, 0.643]], [0.458, [0.639, 0.639, 0.639]], [0.460, [0.639, 0.639, 0.639]], [0.462, [0.634, 0.634, 0.634]], [0.464, [0.634, 0.634, 0.634]], [0.466, [0.629, 0.629, 0.629]], [0.468, [0.629, 0.629, 0.629]], [0.470, [0.624, 0.624, 0.624]], [0.472, [0.624, 0.624, 0.624]], [0.474, [0.619, 0.619, 0.619]], [0.476, [0.619, 0.619, 0.619]], [0.477, [0.615, 0.615, 0.615]], [0.479, [0.615, 0.615, 0.615]], [0.481, [0.610, 0.610, 0.610]], [0.483, [0.610, 0.610, 0.610]], [0.485, [0.605, 0.605, 0.605]], [0.487, [0.605, 0.605, 0.605]], [0.489, [0.600, 0.600, 0.600]], [0.491, [0.600, 0.600, 0.600]], [0.493, [0.595, 0.595, 0.595]], [0.495, [0.595, 0.595, 0.595]], [0.497, [0.591, 0.591, 0.591]], [0.499, [0.591, 0.591, 0.591]], [0.501, [0.586, 0.586, 0.586]], [0.503, [0.586, 0.586, 0.586]], [0.505, [0.582, 0.582, 0.582]], [0.507, [0.582, 0.582, 0.582]], [0.509, [0.577, 0.577, 0.577]], [0.511, [0.577, 0.577, 0.577]], [0.513, [0.573, 0.573, 0.573]], [0.515, [0.573, 0.573, 0.573]], [0.517, [0.569, 0.569, 0.569]], [0.519, [0.569, 0.569, 0.569]], [0.521, [0.565, 0.565, 0.565]], [0.523, [0.565, 0.565, 0.565]], [0.524, [0.560, 0.560, 0.560]], [0.526, [0.560, 0.560, 0.560]], [0.528, [0.556, 0.556, 0.556]], [0.530, [0.556, 0.556, 0.556]], [0.532, [0.552, 0.552, 0.552]], [0.534, [0.552, 0.552, 0.552]], [0.536, [0.547, 0.547, 0.547]], [0.538, [0.547, 0.547, 0.547]], [0.540, [0.543, 0.543, 0.543]], [0.542, [0.543, 0.543, 0.543]], [0.544, [0.539, 0.539, 0.539]], [0.546, [0.539, 0.539, 0.539]], [0.548, [0.534, 0.534, 0.534]], [0.550, [0.534, 0.534, 0.534]], [0.552, [0.530, 0.530, 0.530]], [0.554, [0.530, 0.530, 0.530]], [0.556, [0.526, 0.526, 0.526]], [0.558, [0.526, 0.526, 0.526]], [0.560, [0.521, 0.521, 0.521]], [0.562, [0.521, 0.521, 0.521]], [0.564, [0.517, 0.517, 0.517]], [0.566, [0.517, 0.517, 0.517]], [0.568, [0.513, 0.513, 0.513]], [0.569, [0.513, 0.513, 0.513]], [0.571, [0.509, 0.509, 0.509]], [0.573, [0.509, 0.509, 0.509]], [0.575, [0.504, 0.504, 0.504]], [0.577, [0.504, 0.504, 0.504]], [0.579, [0.500, 0.500, 0.500]], [0.581, [0.500, 0.500, 0.500]], [0.583, [0.496, 0.496, 0.496]], [0.585, [0.496, 0.496, 0.496]], [0.587, [0.491, 0.491, 0.491]], [0.589, [0.491, 0.491, 0.491]], [0.591, [0.487, 0.487, 0.487]], [0.593, [0.487, 0.487, 0.487]], [0.595, [0.483, 0.483, 0.483]], [0.597, [0.483, 0.483, 0.483]], [0.599, [0.478, 0.478, 0.478]], [0.601, [0.478, 0.478, 0.478]], [0.603, [0.474, 0.474, 0.474]], [0.605, [0.474, 0.474, 0.474]], [0.607, [0.470, 0.470, 0.470]], [0.609, [0.470, 0.470, 0.470]], [0.611, [0.466, 0.466, 0.466]], [0.613, [0.466, 0.466, 0.466]], [0.614, [0.461, 0.461, 0.461]], [0.616, [0.461, 0.461, 0.461]], [0.618, [0.457, 0.457, 0.457]], [0.620, [0.457, 0.457, 0.457]], [0.622, [0.453, 0.453, 0.453]], [0.624, [0.453, 0.453, 0.453]], [0.626, [0.448, 0.448, 0.448]], [0.628, [0.448, 0.448, 0.448]], [0.630, [0.444, 0.444, 0.444]], [0.632, [0.444, 0.444, 0.444]], [0.634, [0.440, 0.440, 0.440]], [0.636, [0.440, 0.440, 0.440]], [0.638, [0.436, 0.436, 0.436]], [0.640, [0.436, 0.436, 0.436]], [0.642, [0.432, 0.432, 0.432]], [0.644, [0.432, 0.432, 0.432]], [0.646, [0.428, 0.428, 0.428]], [0.648, [0.428, 0.428, 0.428]], [0.650, [0.424, 0.424, 0.424]], [0.652, [0.424, 0.424, 0.424]], [0.654, [0.420, 0.420, 0.420]], [0.656, [0.420, 0.420, 0.420]], [0.658, [0.416, 0.416, 0.416]], [0.659, [0.416, 0.416, 0.416]], [0.661, [0.412, 0.412, 0.412]], [0.663, [0.412, 0.412, 0.412]], [0.665, [0.408, 0.408, 0.408]], [0.667, [0.408, 0.408, 0.408]], [0.669, [0.404, 0.404, 0.404]], [0.671, [0.404, 0.404, 0.404]], [0.673, [0.400, 0.400, 0.400]], [0.675, [0.400, 0.400, 0.400]], [0.677, [0.396, 0.396, 0.396]], [0.679, [0.396, 0.396, 0.396]], [0.681, [0.392, 0.392, 0.392]], [0.683, [0.392, 0.392, 0.392]], [0.685, [0.388, 0.388, 0.388]], [0.687, [0.388, 0.388, 0.388]], [0.689, [0.383, 0.383, 0.383]], [0.691, [0.383, 0.383, 0.383]], [0.693, [0.379, 0.379, 0.379]], [0.695, [0.379, 0.379, 0.379]], [0.697, [0.375, 0.375, 0.375]], [0.699, [0.375, 0.375, 0.375]], [0.701, [0.371, 0.371, 0.371]], [0.703, [0.371, 0.371, 0.371]], [0.705, [0.367, 0.367, 0.367]], [0.706, [0.367, 0.367, 0.367]], [0.708, [0.363, 0.363, 0.363]], [0.710, [0.363, 0.363, 0.363]], [0.712, [0.359, 0.359, 0.359]], [0.714, [0.359, 0.359, 0.359]], [0.716, [0.355, 0.355, 0.355]], [0.718, [0.355, 0.355, 0.355]], [0.720, [0.351, 0.351, 0.351]], [0.722, [0.351, 0.351, 0.351]], [0.724, [0.347, 0.347, 0.347]], [0.726, [0.347, 0.347, 0.347]], [0.728, [0.343, 0.343, 0.343]], [0.730, [0.343, 0.343, 0.343]], [0.732, [0.339, 0.339, 0.339]], [0.734, [0.339, 0.339, 0.339]], [0.736, [0.335, 0.335, 0.335]], [0.738, [0.335, 0.335, 0.335]], [0.740, [0.331, 0.331, 0.331]], [0.742, [0.331, 0.331, 0.331]], [0.744, [0.327, 0.327, 0.327]], [0.746, [0.327, 0.327, 0.327]], [0.748, [0.323, 0.323, 0.323]], [0.750, [0.323, 0.323, 0.323]], [0.751, [0.317, 0.317, 0.317]], [0.753, [0.317, 0.317, 0.317]], [0.755, [0.312, 0.312, 0.312]], [0.757, [0.312, 0.312, 0.312]], [0.759, [0.306, 0.306, 0.306]], [0.761, [0.306, 0.306, 0.306]], [0.763, [0.301, 0.301, 0.301]], [0.765, [0.301, 0.301, 0.301]], [0.767, [0.295, 0.295, 0.295]], [0.769, [0.295, 0.295, 0.295]], [0.771, [0.290, 0.290, 0.290]], [0.773, [0.290, 0.290, 0.290]], [0.775, [0.284, 0.284, 0.284]], [0.777, [0.284, 0.284, 0.284]], [0.779, [0.279, 0.279, 0.279]], [0.781, [0.279, 0.279, 0.279]], [0.783, [0.273, 0.273, 0.273]], [0.785, [0.273, 0.273, 0.273]], [0.787, [0.268, 0.268, 0.268]], [0.789, [0.268, 0.268, 0.268]], [0.791, [0.262, 0.262, 0.262]], [0.793, [0.262, 0.262, 0.262]], [0.795, [0.257, 0.257, 0.257]], [0.796, [0.257, 0.257, 0.257]], [0.798, [0.251, 0.251, 0.251]], [0.800, [0.251, 0.251, 0.251]], [0.802, [0.245, 0.245, 0.245]], [0.804, [0.245, 0.245, 0.245]], [0.806, [0.240, 0.240, 0.240]], [0.808, [0.240, 0.240, 0.240]], [0.810, [0.234, 0.234, 0.234]], [0.812, [0.234, 0.234, 0.234]], [0.814, [0.229, 0.229, 0.229]], [0.816, [0.229, 0.229, 0.229]], [0.818, [0.223, 0.223, 0.223]], [0.820, [0.223, 0.223, 0.223]], [0.822, [0.218, 0.218, 0.218]], [0.824, [0.218, 0.218, 0.218]], [0.826, [0.212, 0.212, 0.212]], [0.828, [0.212, 0.212, 0.212]], [0.830, [0.207, 0.207, 0.207]], [0.832, [0.207, 0.207, 0.207]], [0.834, [0.201, 0.201, 0.201]], [0.836, [0.201, 0.201, 0.201]], [0.838, [0.196, 0.196, 0.196]], [0.840, [0.196, 0.196, 0.196]], [0.841, [0.190, 0.190, 0.190]], [0.843, [0.190, 0.190, 0.190]], [0.845, [0.185, 0.185, 0.185]], [0.847, [0.185, 0.185, 0.185]], [0.849, [0.179, 0.179, 0.179]], [0.851, [0.179, 0.179, 0.179]], [0.853, [0.173, 0.173, 0.173]], [0.855, [0.173, 0.173, 0.173]], [0.857, [0.168, 0.168, 0.168]], [0.859, [0.168, 0.168, 0.168]], [0.861, [0.162, 0.162, 0.162]], [0.863, [0.162, 0.162, 0.162]], [0.865, [0.157, 0.157, 0.157]], [0.867, [0.157, 0.157, 0.157]], [0.869, [0.151, 0.151, 0.151]], [0.871, [0.151, 0.151, 0.151]], [0.873, [0.146, 0.146, 0.146]], [0.875, [0.146, 0.146, 0.146]], [0.877, [0.141, 0.141, 0.141]], [0.879, [0.141, 0.141, 0.141]], [0.881, [0.137, 0.137, 0.137]], [0.883, [0.137, 0.137, 0.137]], [0.885, [0.132, 0.132, 0.132]], [0.886, [0.132, 0.132, 0.132]], [0.888, [0.127, 0.127, 0.127]], [0.890, [0.127, 0.127, 0.127]], [0.892, [0.123, 0.123, 0.123]], [0.894, [0.123, 0.123, 0.123]], [0.896, [0.118, 0.118, 0.118]], [0.898, [0.118, 0.118, 0.118]], [0.900, [0.114, 0.114, 0.114]], [0.902, [0.114, 0.114, 0.114]], [0.904, [0.109, 0.109, 0.109]], [0.906, [0.109, 0.109, 0.109]], [0.908, [0.105, 0.105, 0.105]], [0.910, [0.105, 0.105, 0.105]], [0.912, [0.100, 0.100, 0.100]], [0.914, [0.100, 0.100, 0.100]], [0.916, [0.096, 0.096, 0.096]], [0.918, [0.096, 0.096, 0.096]], [0.920, [0.091, 0.091, 0.091]], [0.922, [0.091, 0.091, 0.091]], [0.924, [0.086, 0.086, 0.086]], [0.926, [0.086, 0.086, 0.086]], [0.928, [0.082, 0.082, 0.082]], [0.930, [0.082, 0.082, 0.082]], [0.932, [0.077, 0.077, 0.077]], [0.933, [0.077, 0.077, 0.077]], [0.935, [0.073, 0.073, 0.073]], [0.937, [0.073, 0.073, 0.073]], [0.939, [0.068, 0.068, 0.068]], [0.941, [0.068, 0.068, 0.068]], [0.943, [0.064, 0.064, 0.064]], [0.945, [0.064, 0.064, 0.064]], [0.947, [0.059, 0.059, 0.059]], [0.949, [0.059, 0.059, 0.059]], [0.951, [0.055, 0.055, 0.055]], [0.953, [0.055, 0.055, 0.055]], [0.955, [0.050, 0.050, 0.050]], [0.957, [0.050, 0.050, 0.050]], [0.959, [0.046, 0.046, 0.046]], [0.961, [0.046, 0.046, 0.046]], [0.963, [0.041, 0.041, 0.041]], [0.965, [0.041, 0.041, 0.041]], [0.967, [0.036, 0.036, 0.036]], [0.969, [0.036, 0.036, 0.036]], [0.971, [0.032, 0.032, 0.032]], [0.973, [0.032, 0.032, 0.032]], [0.975, [0.027, 0.027, 0.027]], [0.977, [0.027, 0.027, 0.027]], [0.978, [0.023, 0.023, 0.023]], [0.980, [0.023, 0.023, 0.023]], [0.982, [0.018, 0.018, 0.018]], [0.984, [0.018, 0.018, 0.018]], [0.986, [0.014, 0.014, 0.014]], [0.988, [0.014, 0.014, 0.014]], [0.990, [0.009, 0.009, 0.009]], [0.992, [0.009, 0.009, 0.009]], [0.994, [0.005, 0.005, 0.005]], [0.996, [0.005, 0.005, 0.005]], [0.998, [0.000, 0.000, 0.000]], [1.000, [0.000, 0.000, 0.000]]]; +var OrRd = [[0.000, [1.000, 0.969, 0.925]], [0.002, [1.000, 0.969, 0.925]], [0.004, [1.000, 0.967, 0.921]], [0.006, [1.000, 0.967, 0.921]], [0.008, [1.000, 0.965, 0.917]], [0.010, [1.000, 0.965, 0.917]], [0.012, [1.000, 0.963, 0.912]], [0.014, [1.000, 0.963, 0.912]], [0.016, [1.000, 0.961, 0.908]], [0.018, [1.000, 0.961, 0.908]], [0.020, [0.999, 0.959, 0.903]], [0.022, [0.999, 0.959, 0.903]], [0.023, [0.999, 0.958, 0.899]], [0.025, [0.999, 0.958, 0.899]], [0.027, [0.999, 0.956, 0.894]], [0.029, [0.999, 0.956, 0.894]], [0.031, [0.999, 0.954, 0.890]], [0.033, [0.999, 0.954, 0.890]], [0.035, [0.999, 0.952, 0.886]], [0.037, [0.999, 0.952, 0.886]], [0.039, [0.999, 0.950, 0.881]], [0.041, [0.999, 0.950, 0.881]], [0.043, [0.999, 0.948, 0.877]], [0.045, [0.999, 0.948, 0.877]], [0.047, [0.999, 0.946, 0.872]], [0.049, [0.999, 0.946, 0.872]], [0.051, [0.998, 0.945, 0.868]], [0.053, [0.998, 0.945, 0.868]], [0.055, [0.998, 0.943, 0.863]], [0.057, [0.998, 0.943, 0.863]], [0.059, [0.998, 0.941, 0.859]], [0.061, [0.998, 0.941, 0.859]], [0.063, [0.998, 0.939, 0.855]], [0.065, [0.998, 0.939, 0.855]], [0.067, [0.998, 0.937, 0.850]], [0.068, [0.998, 0.937, 0.850]], [0.070, [0.998, 0.935, 0.846]], [0.072, [0.998, 0.935, 0.846]], [0.074, [0.998, 0.934, 0.841]], [0.076, [0.998, 0.934, 0.841]], [0.078, [0.998, 0.932, 0.837]], [0.080, [0.998, 0.932, 0.837]], [0.082, [0.997, 0.930, 0.832]], [0.084, [0.997, 0.930, 0.832]], [0.086, [0.997, 0.928, 0.828]], [0.088, [0.997, 0.928, 0.828]], [0.090, [0.997, 0.926, 0.824]], [0.092, [0.997, 0.926, 0.824]], [0.094, [0.997, 0.924, 0.819]], [0.096, [0.997, 0.924, 0.819]], [0.098, [0.997, 0.922, 0.815]], [0.100, [0.997, 0.922, 0.815]], [0.102, [0.997, 0.921, 0.810]], [0.104, [0.997, 0.921, 0.810]], [0.106, [0.997, 0.919, 0.806]], [0.108, [0.997, 0.919, 0.806]], [0.110, [0.997, 0.917, 0.801]], [0.112, [0.997, 0.917, 0.801]], [0.114, [0.996, 0.915, 0.797]], [0.115, [0.996, 0.915, 0.797]], [0.117, [0.996, 0.913, 0.793]], [0.119, [0.996, 0.913, 0.793]], [0.121, [0.996, 0.911, 0.788]], [0.123, [0.996, 0.911, 0.788]], [0.125, [0.996, 0.909, 0.784]], [0.127, [0.996, 0.909, 0.784]], [0.129, [0.996, 0.907, 0.779]], [0.131, [0.996, 0.907, 0.779]], [0.133, [0.996, 0.905, 0.773]], [0.135, [0.996, 0.905, 0.773]], [0.137, [0.996, 0.902, 0.768]], [0.139, [0.996, 0.902, 0.768]], [0.141, [0.996, 0.900, 0.763]], [0.143, [0.996, 0.900, 0.763]], [0.145, [0.995, 0.897, 0.758]], [0.147, [0.995, 0.897, 0.758]], [0.149, [0.995, 0.895, 0.753]], [0.151, [0.995, 0.895, 0.753]], [0.153, [0.995, 0.892, 0.747]], [0.155, [0.995, 0.892, 0.747]], [0.157, [0.995, 0.890, 0.742]], [0.159, [0.995, 0.890, 0.742]], [0.160, [0.995, 0.887, 0.737]], [0.162, [0.995, 0.887, 0.737]], [0.164, [0.995, 0.885, 0.732]], [0.166, [0.995, 0.885, 0.732]], [0.168, [0.995, 0.882, 0.727]], [0.170, [0.995, 0.882, 0.727]], [0.172, [0.995, 0.880, 0.722]], [0.174, [0.995, 0.880, 0.722]], [0.176, [0.994, 0.878, 0.716]], [0.178, [0.994, 0.878, 0.716]], [0.180, [0.994, 0.875, 0.711]], [0.182, [0.994, 0.875, 0.711]], [0.184, [0.994, 0.873, 0.706]], [0.186, [0.994, 0.873, 0.706]], [0.188, [0.994, 0.870, 0.701]], [0.190, [0.994, 0.870, 0.701]], [0.192, [0.994, 0.868, 0.696]], [0.194, [0.994, 0.868, 0.696]], [0.196, [0.994, 0.865, 0.691]], [0.198, [0.994, 0.865, 0.691]], [0.200, [0.994, 0.863, 0.685]], [0.202, [0.994, 0.863, 0.685]], [0.204, [0.994, 0.860, 0.680]], [0.205, [0.994, 0.860, 0.680]], [0.207, [0.993, 0.858, 0.675]], [0.209, [0.993, 0.858, 0.675]], [0.211, [0.993, 0.855, 0.670]], [0.213, [0.993, 0.855, 0.670]], [0.215, [0.993, 0.853, 0.665]], [0.217, [0.993, 0.853, 0.665]], [0.219, [0.993, 0.850, 0.660]], [0.221, [0.993, 0.850, 0.660]], [0.223, [0.993, 0.848, 0.654]], [0.225, [0.993, 0.848, 0.654]], [0.227, [0.993, 0.846, 0.649]], [0.229, [0.993, 0.846, 0.649]], [0.231, [0.993, 0.843, 0.644]], [0.233, [0.993, 0.843, 0.644]], [0.235, [0.993, 0.841, 0.639]], [0.237, [0.993, 0.841, 0.639]], [0.239, [0.992, 0.838, 0.634]], [0.241, [0.992, 0.838, 0.634]], [0.243, [0.992, 0.836, 0.629]], [0.245, [0.992, 0.836, 0.629]], [0.247, [0.992, 0.833, 0.623]], [0.249, [0.992, 0.833, 0.623]], [0.250, [0.992, 0.831, 0.619]], [0.252, [0.992, 0.831, 0.619]], [0.254, [0.992, 0.828, 0.616]], [0.256, [0.992, 0.828, 0.616]], [0.258, [0.992, 0.824, 0.612]], [0.260, [0.992, 0.824, 0.612]], [0.262, [0.992, 0.821, 0.609]], [0.264, [0.992, 0.821, 0.609]], [0.266, [0.992, 0.818, 0.606]], [0.268, [0.992, 0.818, 0.606]], [0.270, [0.992, 0.815, 0.603]], [0.272, [0.992, 0.815, 0.603]], [0.274, [0.992, 0.812, 0.600]], [0.276, [0.992, 0.812, 0.600]], [0.278, [0.992, 0.809, 0.596]], [0.280, [0.992, 0.809, 0.596]], [0.282, [0.992, 0.806, 0.593]], [0.284, [0.992, 0.806, 0.593]], [0.286, [0.992, 0.803, 0.590]], [0.288, [0.992, 0.803, 0.590]], [0.290, [0.992, 0.800, 0.587]], [0.292, [0.992, 0.800, 0.587]], [0.294, [0.992, 0.797, 0.584]], [0.295, [0.992, 0.797, 0.584]], [0.297, [0.992, 0.794, 0.580]], [0.299, [0.992, 0.794, 0.580]], [0.301, [0.992, 0.791, 0.577]], [0.303, [0.992, 0.791, 0.577]], [0.305, [0.992, 0.788, 0.574]], [0.307, [0.992, 0.788, 0.574]], [0.309, [0.992, 0.784, 0.571]], [0.311, [0.992, 0.784, 0.571]], [0.313, [0.992, 0.781, 0.568]], [0.315, [0.992, 0.781, 0.568]], [0.317, [0.992, 0.778, 0.564]], [0.319, [0.992, 0.778, 0.564]], [0.321, [0.992, 0.775, 0.561]], [0.323, [0.992, 0.775, 0.561]], [0.325, [0.992, 0.772, 0.558]], [0.327, [0.992, 0.772, 0.558]], [0.329, [0.992, 0.769, 0.555]], [0.331, [0.992, 0.769, 0.555]], [0.333, [0.992, 0.766, 0.552]], [0.335, [0.992, 0.766, 0.552]], [0.337, [0.992, 0.763, 0.548]], [0.339, [0.992, 0.763, 0.548]], [0.341, [0.992, 0.760, 0.545]], [0.342, [0.992, 0.760, 0.545]], [0.344, [0.992, 0.757, 0.542]], [0.346, [0.992, 0.757, 0.542]], [0.348, [0.992, 0.754, 0.539]], [0.350, [0.992, 0.754, 0.539]], [0.352, [0.992, 0.751, 0.536]], [0.354, [0.992, 0.751, 0.536]], [0.356, [0.992, 0.748, 0.532]], [0.358, [0.992, 0.748, 0.532]], [0.360, [0.992, 0.744, 0.529]], [0.362, [0.992, 0.744, 0.529]], [0.364, [0.992, 0.741, 0.526]], [0.366, [0.992, 0.741, 0.526]], [0.368, [0.992, 0.738, 0.523]], [0.370, [0.992, 0.738, 0.523]], [0.372, [0.992, 0.735, 0.520]], [0.374, [0.992, 0.735, 0.520]], [0.376, [0.992, 0.731, 0.516]], [0.378, [0.992, 0.731, 0.516]], [0.380, [0.992, 0.726, 0.510]], [0.382, [0.992, 0.726, 0.510]], [0.384, [0.992, 0.720, 0.505]], [0.386, [0.992, 0.720, 0.505]], [0.387, [0.992, 0.714, 0.500]], [0.389, [0.992, 0.714, 0.500]], [0.391, [0.992, 0.709, 0.495]], [0.393, [0.992, 0.709, 0.495]], [0.395, [0.991, 0.703, 0.489]], [0.397, [0.991, 0.703, 0.489]], [0.399, [0.991, 0.697, 0.484]], [0.401, [0.991, 0.697, 0.484]], [0.403, [0.991, 0.692, 0.479]], [0.405, [0.991, 0.692, 0.479]], [0.407, [0.991, 0.686, 0.473]], [0.409, [0.991, 0.686, 0.473]], [0.411, [0.991, 0.680, 0.468]], [0.413, [0.991, 0.680, 0.468]], [0.415, [0.991, 0.675, 0.463]], [0.417, [0.991, 0.675, 0.463]], [0.419, [0.991, 0.669, 0.457]], [0.421, [0.991, 0.669, 0.457]], [0.423, [0.991, 0.663, 0.452]], [0.425, [0.991, 0.663, 0.452]], [0.427, [0.991, 0.658, 0.447]], [0.429, [0.991, 0.658, 0.447]], [0.431, [0.990, 0.652, 0.442]], [0.432, [0.990, 0.652, 0.442]], [0.434, [0.990, 0.646, 0.436]], [0.436, [0.990, 0.646, 0.436]], [0.438, [0.990, 0.641, 0.431]], [0.440, [0.990, 0.641, 0.431]], [0.442, [0.990, 0.635, 0.426]], [0.444, [0.990, 0.635, 0.426]], [0.446, [0.990, 0.629, 0.420]], [0.448, [0.990, 0.629, 0.420]], [0.450, [0.990, 0.624, 0.415]], [0.452, [0.990, 0.624, 0.415]], [0.454, [0.990, 0.618, 0.410]], [0.456, [0.990, 0.618, 0.410]], [0.458, [0.990, 0.612, 0.405]], [0.460, [0.990, 0.612, 0.405]], [0.462, [0.989, 0.607, 0.399]], [0.464, [0.989, 0.607, 0.399]], [0.466, [0.989, 0.601, 0.394]], [0.468, [0.989, 0.601, 0.394]], [0.470, [0.989, 0.595, 0.389]], [0.472, [0.989, 0.595, 0.389]], [0.474, [0.989, 0.590, 0.383]], [0.476, [0.989, 0.590, 0.383]], [0.477, [0.989, 0.584, 0.378]], [0.479, [0.989, 0.584, 0.378]], [0.481, [0.989, 0.578, 0.373]], [0.483, [0.989, 0.578, 0.373]], [0.485, [0.989, 0.573, 0.368]], [0.487, [0.989, 0.573, 0.368]], [0.489, [0.989, 0.567, 0.362]], [0.491, [0.989, 0.567, 0.362]], [0.493, [0.988, 0.561, 0.357]], [0.495, [0.988, 0.561, 0.357]], [0.497, [0.988, 0.556, 0.352]], [0.499, [0.988, 0.556, 0.352]], [0.501, [0.987, 0.550, 0.348]], [0.503, [0.987, 0.550, 0.348]], [0.505, [0.986, 0.546, 0.346]], [0.507, [0.986, 0.546, 0.346]], [0.509, [0.984, 0.541, 0.344]], [0.511, [0.984, 0.541, 0.344]], [0.513, [0.983, 0.536, 0.342]], [0.515, [0.983, 0.536, 0.342]], [0.517, [0.981, 0.531, 0.340]], [0.519, [0.981, 0.531, 0.340]], [0.521, [0.979, 0.526, 0.338]], [0.523, [0.979, 0.526, 0.338]], [0.524, [0.978, 0.521, 0.335]], [0.526, [0.978, 0.521, 0.335]], [0.528, [0.976, 0.516, 0.333]], [0.530, [0.976, 0.516, 0.333]], [0.532, [0.975, 0.511, 0.331]], [0.534, [0.975, 0.511, 0.331]], [0.536, [0.973, 0.506, 0.329]], [0.538, [0.973, 0.506, 0.329]], [0.540, [0.971, 0.501, 0.327]], [0.542, [0.971, 0.501, 0.327]], [0.544, [0.970, 0.496, 0.325]], [0.546, [0.970, 0.496, 0.325]], [0.548, [0.968, 0.491, 0.323]], [0.550, [0.968, 0.491, 0.323]], [0.552, [0.967, 0.487, 0.321]], [0.554, [0.967, 0.487, 0.321]], [0.556, [0.965, 0.482, 0.319]], [0.558, [0.965, 0.482, 0.319]], [0.560, [0.963, 0.477, 0.317]], [0.562, [0.963, 0.477, 0.317]], [0.564, [0.962, 0.472, 0.315]], [0.566, [0.962, 0.472, 0.315]], [0.568, [0.960, 0.467, 0.312]], [0.569, [0.960, 0.467, 0.312]], [0.571, [0.959, 0.462, 0.310]], [0.573, [0.959, 0.462, 0.310]], [0.575, [0.957, 0.457, 0.308]], [0.577, [0.957, 0.457, 0.308]], [0.579, [0.955, 0.452, 0.306]], [0.581, [0.955, 0.452, 0.306]], [0.583, [0.954, 0.447, 0.304]], [0.585, [0.954, 0.447, 0.304]], [0.587, [0.952, 0.442, 0.302]], [0.589, [0.952, 0.442, 0.302]], [0.591, [0.951, 0.437, 0.300]], [0.593, [0.951, 0.437, 0.300]], [0.595, [0.949, 0.432, 0.298]], [0.597, [0.949, 0.432, 0.298]], [0.599, [0.947, 0.427, 0.296]], [0.601, [0.947, 0.427, 0.296]], [0.603, [0.946, 0.423, 0.294]], [0.605, [0.946, 0.423, 0.294]], [0.607, [0.944, 0.418, 0.292]], [0.609, [0.944, 0.418, 0.292]], [0.611, [0.943, 0.413, 0.289]], [0.613, [0.943, 0.413, 0.289]], [0.614, [0.941, 0.408, 0.287]], [0.616, [0.941, 0.408, 0.287]], [0.618, [0.939, 0.403, 0.285]], [0.620, [0.939, 0.403, 0.285]], [0.622, [0.938, 0.398, 0.283]], [0.624, [0.938, 0.398, 0.283]], [0.626, [0.935, 0.392, 0.279]], [0.628, [0.935, 0.392, 0.279]], [0.630, [0.932, 0.385, 0.274]], [0.632, [0.932, 0.385, 0.274]], [0.634, [0.930, 0.379, 0.269]], [0.636, [0.930, 0.379, 0.269]], [0.638, [0.927, 0.372, 0.264]], [0.640, [0.927, 0.372, 0.264]], [0.642, [0.924, 0.366, 0.259]], [0.644, [0.924, 0.366, 0.259]], [0.646, [0.921, 0.359, 0.254]], [0.648, [0.921, 0.359, 0.254]], [0.650, [0.918, 0.353, 0.249]], [0.652, [0.918, 0.353, 0.249]], [0.654, [0.915, 0.346, 0.244]], [0.656, [0.915, 0.346, 0.244]], [0.658, [0.912, 0.340, 0.239]], [0.659, [0.912, 0.340, 0.239]], [0.661, [0.909, 0.333, 0.234]], [0.663, [0.909, 0.333, 0.234]], [0.665, [0.906, 0.327, 0.229]], [0.667, [0.906, 0.327, 0.229]], [0.669, [0.903, 0.320, 0.224]], [0.671, [0.903, 0.320, 0.224]], [0.673, [0.900, 0.314, 0.219]], [0.675, [0.900, 0.314, 0.219]], [0.677, [0.897, 0.307, 0.214]], [0.679, [0.897, 0.307, 0.214]], [0.681, [0.894, 0.301, 0.209]], [0.683, [0.894, 0.301, 0.209]], [0.685, [0.891, 0.294, 0.204]], [0.687, [0.891, 0.294, 0.204]], [0.689, [0.888, 0.288, 0.198]], [0.691, [0.888, 0.288, 0.198]], [0.693, [0.885, 0.281, 0.193]], [0.695, [0.885, 0.281, 0.193]], [0.697, [0.882, 0.275, 0.188]], [0.699, [0.882, 0.275, 0.188]], [0.701, [0.879, 0.268, 0.183]], [0.703, [0.879, 0.268, 0.183]], [0.705, [0.876, 0.262, 0.178]], [0.706, [0.876, 0.262, 0.178]], [0.708, [0.873, 0.255, 0.173]], [0.710, [0.873, 0.255, 0.173]], [0.712, [0.870, 0.249, 0.168]], [0.714, [0.870, 0.249, 0.168]], [0.716, [0.867, 0.242, 0.163]], [0.718, [0.867, 0.242, 0.163]], [0.720, [0.865, 0.236, 0.158]], [0.722, [0.865, 0.236, 0.158]], [0.724, [0.862, 0.229, 0.153]], [0.726, [0.862, 0.229, 0.153]], [0.728, [0.859, 0.222, 0.148]], [0.730, [0.859, 0.222, 0.148]], [0.732, [0.856, 0.216, 0.143]], [0.734, [0.856, 0.216, 0.143]], [0.736, [0.853, 0.209, 0.138]], [0.738, [0.853, 0.209, 0.138]], [0.740, [0.850, 0.203, 0.133]], [0.742, [0.850, 0.203, 0.133]], [0.744, [0.847, 0.196, 0.128]], [0.746, [0.847, 0.196, 0.128]], [0.748, [0.844, 0.190, 0.123]], [0.750, [0.844, 0.190, 0.123]], [0.751, [0.840, 0.184, 0.119]], [0.753, [0.840, 0.184, 0.119]], [0.755, [0.835, 0.178, 0.115]], [0.757, [0.835, 0.178, 0.115]], [0.759, [0.831, 0.172, 0.111]], [0.761, [0.831, 0.172, 0.111]], [0.763, [0.827, 0.166, 0.107]], [0.765, [0.827, 0.166, 0.107]], [0.767, [0.822, 0.160, 0.103]], [0.769, [0.822, 0.160, 0.103]], [0.771, [0.818, 0.154, 0.100]], [0.773, [0.818, 0.154, 0.100]], [0.775, [0.813, 0.148, 0.096]], [0.777, [0.813, 0.148, 0.096]], [0.779, [0.809, 0.142, 0.092]], [0.781, [0.809, 0.142, 0.092]], [0.783, [0.804, 0.137, 0.088]], [0.785, [0.804, 0.137, 0.088]], [0.787, [0.800, 0.131, 0.084]], [0.789, [0.800, 0.131, 0.084]], [0.791, [0.796, 0.125, 0.081]], [0.793, [0.796, 0.125, 0.081]], [0.795, [0.791, 0.119, 0.077]], [0.796, [0.791, 0.119, 0.077]], [0.798, [0.787, 0.113, 0.073]], [0.800, [0.787, 0.113, 0.073]], [0.802, [0.782, 0.107, 0.069]], [0.804, [0.782, 0.107, 0.069]], [0.806, [0.778, 0.101, 0.065]], [0.808, [0.778, 0.101, 0.065]], [0.810, [0.773, 0.095, 0.061]], [0.812, [0.773, 0.095, 0.061]], [0.814, [0.769, 0.089, 0.058]], [0.816, [0.769, 0.089, 0.058]], [0.818, [0.765, 0.083, 0.054]], [0.820, [0.765, 0.083, 0.054]], [0.822, [0.760, 0.078, 0.050]], [0.824, [0.760, 0.078, 0.050]], [0.826, [0.756, 0.072, 0.046]], [0.828, [0.756, 0.072, 0.046]], [0.830, [0.751, 0.066, 0.042]], [0.832, [0.751, 0.066, 0.042]], [0.834, [0.747, 0.060, 0.039]], [0.836, [0.747, 0.060, 0.039]], [0.838, [0.742, 0.054, 0.035]], [0.840, [0.742, 0.054, 0.035]], [0.841, [0.738, 0.048, 0.031]], [0.843, [0.738, 0.048, 0.031]], [0.845, [0.734, 0.042, 0.027]], [0.847, [0.734, 0.042, 0.027]], [0.849, [0.729, 0.036, 0.023]], [0.851, [0.729, 0.036, 0.023]], [0.853, [0.725, 0.030, 0.020]], [0.855, [0.725, 0.030, 0.020]], [0.857, [0.720, 0.024, 0.016]], [0.859, [0.720, 0.024, 0.016]], [0.861, [0.716, 0.018, 0.012]], [0.863, [0.716, 0.018, 0.012]], [0.865, [0.711, 0.013, 0.008]], [0.867, [0.711, 0.013, 0.008]], [0.869, [0.707, 0.007, 0.004]], [0.871, [0.707, 0.007, 0.004]], [0.873, [0.703, 0.001, 0.000]], [0.875, [0.703, 0.001, 0.000]], [0.877, [0.696, 0.000, 0.000]], [0.879, [0.696, 0.000, 0.000]], [0.881, [0.690, 0.000, 0.000]], [0.883, [0.690, 0.000, 0.000]], [0.885, [0.684, 0.000, 0.000]], [0.886, [0.684, 0.000, 0.000]], [0.888, [0.677, 0.000, 0.000]], [0.890, [0.677, 0.000, 0.000]], [0.892, [0.671, 0.000, 0.000]], [0.894, [0.671, 0.000, 0.000]], [0.896, [0.664, 0.000, 0.000]], [0.898, [0.664, 0.000, 0.000]], [0.900, [0.658, 0.000, 0.000]], [0.902, [0.658, 0.000, 0.000]], [0.904, [0.652, 0.000, 0.000]], [0.906, [0.652, 0.000, 0.000]], [0.908, [0.645, 0.000, 0.000]], [0.910, [0.645, 0.000, 0.000]], [0.912, [0.639, 0.000, 0.000]], [0.914, [0.639, 0.000, 0.000]], [0.916, [0.632, 0.000, 0.000]], [0.918, [0.632, 0.000, 0.000]], [0.920, [0.626, 0.000, 0.000]], [0.922, [0.626, 0.000, 0.000]], [0.924, [0.620, 0.000, 0.000]], [0.926, [0.620, 0.000, 0.000]], [0.928, [0.613, 0.000, 0.000]], [0.930, [0.613, 0.000, 0.000]], [0.932, [0.607, 0.000, 0.000]], [0.933, [0.607, 0.000, 0.000]], [0.935, [0.600, 0.000, 0.000]], [0.937, [0.600, 0.000, 0.000]], [0.939, [0.594, 0.000, 0.000]], [0.941, [0.594, 0.000, 0.000]], [0.943, [0.588, 0.000, 0.000]], [0.945, [0.588, 0.000, 0.000]], [0.947, [0.581, 0.000, 0.000]], [0.949, [0.581, 0.000, 0.000]], [0.951, [0.575, 0.000, 0.000]], [0.953, [0.575, 0.000, 0.000]], [0.955, [0.568, 0.000, 0.000]], [0.957, [0.568, 0.000, 0.000]], [0.959, [0.562, 0.000, 0.000]], [0.961, [0.562, 0.000, 0.000]], [0.963, [0.556, 0.000, 0.000]], [0.965, [0.556, 0.000, 0.000]], [0.967, [0.549, 0.000, 0.000]], [0.969, [0.549, 0.000, 0.000]], [0.971, [0.543, 0.000, 0.000]], [0.973, [0.543, 0.000, 0.000]], [0.975, [0.536, 0.000, 0.000]], [0.977, [0.536, 0.000, 0.000]], [0.978, [0.530, 0.000, 0.000]], [0.980, [0.530, 0.000, 0.000]], [0.982, [0.524, 0.000, 0.000]], [0.984, [0.524, 0.000, 0.000]], [0.986, [0.517, 0.000, 0.000]], [0.988, [0.517, 0.000, 0.000]], [0.990, [0.511, 0.000, 0.000]], [0.992, [0.511, 0.000, 0.000]], [0.994, [0.504, 0.000, 0.000]], [0.996, [0.504, 0.000, 0.000]], [0.998, [0.498, 0.000, 0.000]], [1.000, [0.498, 0.000, 0.000]]]; +var Oranges = [[0.000, [1.000, 0.961, 0.922]], [0.002, [1.000, 0.961, 0.922]], [0.004, [1.000, 0.959, 0.918]], [0.006, [1.000, 0.959, 0.918]], [0.008, [1.000, 0.957, 0.914]], [0.010, [1.000, 0.957, 0.914]], [0.012, [1.000, 0.955, 0.911]], [0.014, [1.000, 0.955, 0.911]], [0.016, [1.000, 0.953, 0.907]], [0.018, [1.000, 0.953, 0.907]], [0.020, [0.999, 0.952, 0.904]], [0.022, [0.999, 0.952, 0.904]], [0.023, [0.999, 0.950, 0.900]], [0.025, [0.999, 0.950, 0.900]], [0.027, [0.999, 0.948, 0.897]], [0.029, [0.999, 0.948, 0.897]], [0.031, [0.999, 0.946, 0.893]], [0.033, [0.999, 0.946, 0.893]], [0.035, [0.999, 0.944, 0.889]], [0.037, [0.999, 0.944, 0.889]], [0.039, [0.999, 0.942, 0.886]], [0.041, [0.999, 0.942, 0.886]], [0.043, [0.999, 0.940, 0.882]], [0.045, [0.999, 0.940, 0.882]], [0.047, [0.999, 0.939, 0.879]], [0.049, [0.999, 0.939, 0.879]], [0.051, [0.998, 0.937, 0.875]], [0.053, [0.998, 0.937, 0.875]], [0.055, [0.998, 0.935, 0.872]], [0.057, [0.998, 0.935, 0.872]], [0.059, [0.998, 0.933, 0.868]], [0.061, [0.998, 0.933, 0.868]], [0.063, [0.998, 0.931, 0.864]], [0.065, [0.998, 0.931, 0.864]], [0.067, [0.998, 0.929, 0.861]], [0.068, [0.998, 0.929, 0.861]], [0.070, [0.998, 0.928, 0.857]], [0.072, [0.998, 0.928, 0.857]], [0.074, [0.998, 0.926, 0.854]], [0.076, [0.998, 0.926, 0.854]], [0.078, [0.998, 0.924, 0.850]], [0.080, [0.998, 0.924, 0.850]], [0.082, [0.997, 0.922, 0.847]], [0.084, [0.997, 0.922, 0.847]], [0.086, [0.997, 0.920, 0.843]], [0.088, [0.997, 0.920, 0.843]], [0.090, [0.997, 0.918, 0.840]], [0.092, [0.997, 0.918, 0.840]], [0.094, [0.997, 0.916, 0.836]], [0.096, [0.997, 0.916, 0.836]], [0.098, [0.997, 0.915, 0.832]], [0.100, [0.997, 0.915, 0.832]], [0.102, [0.997, 0.913, 0.829]], [0.104, [0.997, 0.913, 0.829]], [0.106, [0.997, 0.911, 0.825]], [0.108, [0.997, 0.911, 0.825]], [0.110, [0.997, 0.909, 0.822]], [0.112, [0.997, 0.909, 0.822]], [0.114, [0.996, 0.907, 0.818]], [0.115, [0.996, 0.907, 0.818]], [0.117, [0.996, 0.905, 0.815]], [0.119, [0.996, 0.905, 0.815]], [0.121, [0.996, 0.904, 0.811]], [0.123, [0.996, 0.904, 0.811]], [0.125, [0.996, 0.902, 0.807]], [0.127, [0.996, 0.902, 0.807]], [0.129, [0.996, 0.899, 0.802]], [0.131, [0.996, 0.899, 0.802]], [0.133, [0.996, 0.896, 0.796]], [0.135, [0.996, 0.896, 0.796]], [0.137, [0.996, 0.894, 0.791]], [0.139, [0.996, 0.894, 0.791]], [0.141, [0.996, 0.891, 0.786]], [0.143, [0.996, 0.891, 0.786]], [0.145, [0.995, 0.888, 0.780]], [0.147, [0.995, 0.888, 0.780]], [0.149, [0.995, 0.885, 0.775]], [0.151, [0.995, 0.885, 0.775]], [0.153, [0.995, 0.883, 0.769]], [0.155, [0.995, 0.883, 0.769]], [0.157, [0.995, 0.880, 0.764]], [0.159, [0.995, 0.880, 0.764]], [0.160, [0.995, 0.877, 0.758]], [0.162, [0.995, 0.877, 0.758]], [0.164, [0.995, 0.875, 0.753]], [0.166, [0.995, 0.875, 0.753]], [0.168, [0.995, 0.872, 0.748]], [0.170, [0.995, 0.872, 0.748]], [0.172, [0.995, 0.869, 0.742]], [0.174, [0.995, 0.869, 0.742]], [0.176, [0.994, 0.866, 0.737]], [0.178, [0.994, 0.866, 0.737]], [0.180, [0.994, 0.864, 0.731]], [0.182, [0.994, 0.864, 0.731]], [0.184, [0.994, 0.861, 0.726]], [0.186, [0.994, 0.861, 0.726]], [0.188, [0.994, 0.858, 0.721]], [0.190, [0.994, 0.858, 0.721]], [0.192, [0.994, 0.856, 0.715]], [0.194, [0.994, 0.856, 0.715]], [0.196, [0.994, 0.853, 0.710]], [0.198, [0.994, 0.853, 0.710]], [0.200, [0.994, 0.850, 0.704]], [0.202, [0.994, 0.850, 0.704]], [0.204, [0.994, 0.847, 0.699]], [0.205, [0.994, 0.847, 0.699]], [0.207, [0.993, 0.845, 0.693]], [0.209, [0.993, 0.845, 0.693]], [0.211, [0.993, 0.842, 0.688]], [0.213, [0.993, 0.842, 0.688]], [0.215, [0.993, 0.839, 0.683]], [0.217, [0.993, 0.839, 0.683]], [0.219, [0.993, 0.837, 0.677]], [0.221, [0.993, 0.837, 0.677]], [0.223, [0.993, 0.834, 0.672]], [0.225, [0.993, 0.834, 0.672]], [0.227, [0.993, 0.831, 0.666]], [0.229, [0.993, 0.831, 0.666]], [0.231, [0.993, 0.829, 0.661]], [0.233, [0.993, 0.829, 0.661]], [0.235, [0.993, 0.826, 0.656]], [0.237, [0.993, 0.826, 0.656]], [0.239, [0.992, 0.823, 0.650]], [0.241, [0.992, 0.823, 0.650]], [0.243, [0.992, 0.820, 0.645]], [0.245, [0.992, 0.820, 0.645]], [0.247, [0.992, 0.818, 0.639]], [0.249, [0.992, 0.818, 0.639]], [0.250, [0.992, 0.815, 0.634]], [0.252, [0.992, 0.815, 0.634]], [0.254, [0.992, 0.810, 0.627]], [0.256, [0.992, 0.810, 0.627]], [0.258, [0.992, 0.806, 0.620]], [0.260, [0.992, 0.806, 0.620]], [0.262, [0.992, 0.802, 0.613]], [0.264, [0.992, 0.802, 0.613]], [0.266, [0.992, 0.798, 0.607]], [0.268, [0.992, 0.798, 0.607]], [0.270, [0.992, 0.794, 0.600]], [0.272, [0.992, 0.794, 0.600]], [0.274, [0.992, 0.790, 0.593]], [0.276, [0.992, 0.790, 0.593]], [0.278, [0.992, 0.785, 0.586]], [0.280, [0.992, 0.785, 0.586]], [0.282, [0.992, 0.781, 0.579]], [0.284, [0.992, 0.781, 0.579]], [0.286, [0.992, 0.777, 0.573]], [0.288, [0.992, 0.777, 0.573]], [0.290, [0.992, 0.773, 0.566]], [0.292, [0.992, 0.773, 0.566]], [0.294, [0.992, 0.769, 0.559]], [0.295, [0.992, 0.769, 0.559]], [0.297, [0.992, 0.764, 0.552]], [0.299, [0.992, 0.764, 0.552]], [0.301, [0.992, 0.760, 0.546]], [0.303, [0.992, 0.760, 0.546]], [0.305, [0.992, 0.756, 0.539]], [0.307, [0.992, 0.756, 0.539]], [0.309, [0.992, 0.752, 0.532]], [0.311, [0.992, 0.752, 0.532]], [0.313, [0.992, 0.748, 0.525]], [0.315, [0.992, 0.748, 0.525]], [0.317, [0.992, 0.744, 0.519]], [0.319, [0.992, 0.744, 0.519]], [0.321, [0.992, 0.739, 0.512]], [0.323, [0.992, 0.739, 0.512]], [0.325, [0.992, 0.735, 0.505]], [0.327, [0.992, 0.735, 0.505]], [0.329, [0.992, 0.731, 0.498]], [0.331, [0.992, 0.731, 0.498]], [0.333, [0.992, 0.727, 0.492]], [0.335, [0.992, 0.727, 0.492]], [0.337, [0.992, 0.723, 0.485]], [0.339, [0.992, 0.723, 0.485]], [0.341, [0.992, 0.718, 0.478]], [0.342, [0.992, 0.718, 0.478]], [0.344, [0.992, 0.714, 0.471]], [0.346, [0.992, 0.714, 0.471]], [0.348, [0.992, 0.710, 0.464]], [0.350, [0.992, 0.710, 0.464]], [0.352, [0.992, 0.706, 0.458]], [0.354, [0.992, 0.706, 0.458]], [0.356, [0.992, 0.702, 0.451]], [0.358, [0.992, 0.702, 0.451]], [0.360, [0.992, 0.698, 0.444]], [0.362, [0.992, 0.698, 0.444]], [0.364, [0.992, 0.693, 0.437]], [0.366, [0.992, 0.693, 0.437]], [0.368, [0.992, 0.689, 0.431]], [0.370, [0.992, 0.689, 0.431]], [0.372, [0.992, 0.685, 0.424]], [0.374, [0.992, 0.685, 0.424]], [0.376, [0.992, 0.681, 0.417]], [0.378, [0.992, 0.681, 0.417]], [0.380, [0.992, 0.677, 0.412]], [0.382, [0.992, 0.677, 0.412]], [0.384, [0.992, 0.673, 0.406]], [0.386, [0.992, 0.673, 0.406]], [0.387, [0.992, 0.669, 0.400]], [0.389, [0.992, 0.669, 0.400]], [0.391, [0.992, 0.665, 0.394]], [0.393, [0.992, 0.665, 0.394]], [0.395, [0.992, 0.661, 0.389]], [0.397, [0.992, 0.661, 0.389]], [0.399, [0.992, 0.656, 0.383]], [0.401, [0.992, 0.656, 0.383]], [0.403, [0.992, 0.652, 0.377]], [0.405, [0.992, 0.652, 0.377]], [0.407, [0.992, 0.648, 0.371]], [0.409, [0.992, 0.648, 0.371]], [0.411, [0.992, 0.644, 0.365]], [0.413, [0.992, 0.644, 0.365]], [0.415, [0.992, 0.640, 0.360]], [0.417, [0.992, 0.640, 0.360]], [0.419, [0.992, 0.636, 0.354]], [0.421, [0.992, 0.636, 0.354]], [0.423, [0.992, 0.632, 0.348]], [0.425, [0.992, 0.632, 0.348]], [0.427, [0.992, 0.628, 0.342]], [0.429, [0.992, 0.628, 0.342]], [0.431, [0.992, 0.624, 0.336]], [0.432, [0.992, 0.624, 0.336]], [0.434, [0.992, 0.620, 0.331]], [0.436, [0.992, 0.620, 0.331]], [0.438, [0.992, 0.616, 0.325]], [0.440, [0.992, 0.616, 0.325]], [0.442, [0.992, 0.612, 0.319]], [0.444, [0.992, 0.612, 0.319]], [0.446, [0.992, 0.608, 0.313]], [0.448, [0.992, 0.608, 0.313]], [0.450, [0.992, 0.604, 0.308]], [0.452, [0.992, 0.604, 0.308]], [0.454, [0.992, 0.600, 0.302]], [0.456, [0.992, 0.600, 0.302]], [0.458, [0.992, 0.596, 0.296]], [0.460, [0.992, 0.596, 0.296]], [0.462, [0.992, 0.592, 0.290]], [0.464, [0.992, 0.592, 0.290]], [0.466, [0.992, 0.587, 0.284]], [0.468, [0.992, 0.587, 0.284]], [0.470, [0.992, 0.583, 0.279]], [0.472, [0.992, 0.583, 0.279]], [0.474, [0.992, 0.579, 0.273]], [0.476, [0.992, 0.579, 0.273]], [0.477, [0.992, 0.575, 0.267]], [0.479, [0.992, 0.575, 0.267]], [0.481, [0.992, 0.571, 0.261]], [0.483, [0.992, 0.571, 0.261]], [0.485, [0.992, 0.567, 0.256]], [0.487, [0.992, 0.567, 0.256]], [0.489, [0.992, 0.563, 0.250]], [0.491, [0.992, 0.563, 0.250]], [0.493, [0.992, 0.559, 0.244]], [0.495, [0.992, 0.559, 0.244]], [0.497, [0.992, 0.555, 0.238]], [0.499, [0.992, 0.555, 0.238]], [0.501, [0.991, 0.551, 0.233]], [0.503, [0.991, 0.551, 0.233]], [0.505, [0.990, 0.546, 0.228]], [0.507, [0.990, 0.546, 0.228]], [0.509, [0.988, 0.542, 0.223]], [0.511, [0.988, 0.542, 0.223]], [0.513, [0.987, 0.537, 0.218]], [0.515, [0.987, 0.537, 0.218]], [0.517, [0.986, 0.533, 0.213]], [0.519, [0.986, 0.533, 0.213]], [0.521, [0.984, 0.529, 0.208]], [0.523, [0.984, 0.529, 0.208]], [0.524, [0.983, 0.524, 0.203]], [0.526, [0.983, 0.524, 0.203]], [0.528, [0.981, 0.520, 0.197]], [0.530, [0.981, 0.520, 0.197]], [0.532, [0.980, 0.515, 0.192]], [0.534, [0.980, 0.515, 0.192]], [0.536, [0.978, 0.511, 0.187]], [0.538, [0.978, 0.511, 0.187]], [0.540, [0.977, 0.506, 0.182]], [0.542, [0.977, 0.506, 0.182]], [0.544, [0.975, 0.502, 0.177]], [0.546, [0.975, 0.502, 0.177]], [0.548, [0.974, 0.498, 0.172]], [0.550, [0.974, 0.498, 0.172]], [0.552, [0.972, 0.493, 0.167]], [0.554, [0.972, 0.493, 0.167]], [0.556, [0.971, 0.489, 0.162]], [0.558, [0.971, 0.489, 0.162]], [0.560, [0.969, 0.484, 0.157]], [0.562, [0.969, 0.484, 0.157]], [0.564, [0.968, 0.480, 0.152]], [0.566, [0.968, 0.480, 0.152]], [0.568, [0.966, 0.475, 0.147]], [0.569, [0.966, 0.475, 0.147]], [0.571, [0.965, 0.471, 0.142]], [0.573, [0.965, 0.471, 0.142]], [0.575, [0.963, 0.467, 0.137]], [0.577, [0.963, 0.467, 0.137]], [0.579, [0.962, 0.462, 0.132]], [0.581, [0.962, 0.462, 0.132]], [0.583, [0.960, 0.458, 0.127]], [0.585, [0.960, 0.458, 0.127]], [0.587, [0.959, 0.453, 0.122]], [0.589, [0.959, 0.453, 0.122]], [0.591, [0.957, 0.449, 0.117]], [0.593, [0.957, 0.449, 0.117]], [0.595, [0.956, 0.444, 0.112]], [0.597, [0.956, 0.444, 0.112]], [0.599, [0.955, 0.440, 0.107]], [0.601, [0.955, 0.440, 0.107]], [0.603, [0.953, 0.436, 0.102]], [0.605, [0.953, 0.436, 0.102]], [0.607, [0.952, 0.431, 0.097]], [0.609, [0.952, 0.431, 0.097]], [0.611, [0.950, 0.427, 0.092]], [0.613, [0.950, 0.427, 0.092]], [0.614, [0.949, 0.422, 0.086]], [0.616, [0.949, 0.422, 0.086]], [0.618, [0.947, 0.418, 0.081]], [0.620, [0.947, 0.418, 0.081]], [0.622, [0.946, 0.413, 0.076]], [0.624, [0.946, 0.413, 0.076]], [0.626, [0.943, 0.409, 0.073]], [0.628, [0.943, 0.409, 0.073]], [0.630, [0.940, 0.405, 0.071]], [0.632, [0.940, 0.405, 0.071]], [0.634, [0.937, 0.401, 0.069]], [0.636, [0.937, 0.401, 0.069]], [0.638, [0.934, 0.397, 0.066]], [0.640, [0.934, 0.397, 0.066]], [0.642, [0.931, 0.393, 0.064]], [0.644, [0.931, 0.393, 0.064]], [0.646, [0.928, 0.389, 0.062]], [0.648, [0.928, 0.389, 0.062]], [0.650, [0.926, 0.385, 0.060]], [0.652, [0.926, 0.385, 0.060]], [0.654, [0.923, 0.381, 0.058]], [0.656, [0.923, 0.381, 0.058]], [0.658, [0.920, 0.377, 0.055]], [0.659, [0.920, 0.377, 0.055]], [0.661, [0.917, 0.373, 0.053]], [0.663, [0.917, 0.373, 0.053]], [0.665, [0.914, 0.369, 0.051]], [0.667, [0.914, 0.369, 0.051]], [0.669, [0.911, 0.365, 0.049]], [0.671, [0.911, 0.365, 0.049]], [0.673, [0.908, 0.361, 0.047]], [0.675, [0.908, 0.361, 0.047]], [0.677, [0.905, 0.356, 0.044]], [0.679, [0.905, 0.356, 0.044]], [0.681, [0.902, 0.352, 0.042]], [0.683, [0.902, 0.352, 0.042]], [0.685, [0.899, 0.348, 0.040]], [0.687, [0.899, 0.348, 0.040]], [0.689, [0.896, 0.344, 0.038]], [0.691, [0.896, 0.344, 0.038]], [0.693, [0.893, 0.340, 0.035]], [0.695, [0.893, 0.340, 0.035]], [0.697, [0.890, 0.336, 0.033]], [0.699, [0.890, 0.336, 0.033]], [0.701, [0.887, 0.332, 0.031]], [0.703, [0.887, 0.332, 0.031]], [0.705, [0.884, 0.328, 0.029]], [0.706, [0.884, 0.328, 0.029]], [0.708, [0.881, 0.324, 0.027]], [0.710, [0.881, 0.324, 0.027]], [0.712, [0.878, 0.320, 0.024]], [0.714, [0.878, 0.320, 0.024]], [0.716, [0.875, 0.316, 0.022]], [0.718, [0.875, 0.316, 0.022]], [0.720, [0.872, 0.312, 0.020]], [0.722, [0.872, 0.312, 0.020]], [0.724, [0.869, 0.308, 0.018]], [0.726, [0.869, 0.308, 0.018]], [0.728, [0.866, 0.304, 0.016]], [0.730, [0.866, 0.304, 0.016]], [0.732, [0.864, 0.300, 0.013]], [0.734, [0.864, 0.300, 0.013]], [0.736, [0.861, 0.296, 0.011]], [0.738, [0.861, 0.296, 0.011]], [0.740, [0.858, 0.291, 0.009]], [0.742, [0.858, 0.291, 0.009]], [0.744, [0.855, 0.287, 0.007]], [0.746, [0.855, 0.287, 0.007]], [0.748, [0.852, 0.283, 0.004]], [0.750, [0.852, 0.283, 0.004]], [0.751, [0.846, 0.281, 0.004]], [0.753, [0.846, 0.281, 0.004]], [0.755, [0.840, 0.278, 0.004]], [0.757, [0.840, 0.278, 0.004]], [0.759, [0.834, 0.276, 0.005]], [0.761, [0.834, 0.276, 0.005]], [0.763, [0.827, 0.274, 0.005]], [0.765, [0.827, 0.274, 0.005]], [0.767, [0.821, 0.272, 0.005]], [0.769, [0.821, 0.272, 0.005]], [0.771, [0.815, 0.270, 0.005]], [0.773, [0.815, 0.270, 0.005]], [0.775, [0.809, 0.267, 0.006]], [0.777, [0.809, 0.267, 0.006]], [0.779, [0.802, 0.265, 0.006]], [0.781, [0.802, 0.265, 0.006]], [0.783, [0.796, 0.263, 0.006]], [0.785, [0.796, 0.263, 0.006]], [0.787, [0.790, 0.261, 0.006]], [0.789, [0.790, 0.261, 0.006]], [0.791, [0.784, 0.259, 0.007]], [0.793, [0.784, 0.259, 0.007]], [0.795, [0.777, 0.256, 0.007]], [0.796, [0.777, 0.256, 0.007]], [0.798, [0.771, 0.254, 0.007]], [0.800, [0.771, 0.254, 0.007]], [0.802, [0.765, 0.252, 0.007]], [0.804, [0.765, 0.252, 0.007]], [0.806, [0.758, 0.250, 0.008]], [0.808, [0.758, 0.250, 0.008]], [0.810, [0.752, 0.247, 0.008]], [0.812, [0.752, 0.247, 0.008]], [0.814, [0.746, 0.245, 0.008]], [0.816, [0.746, 0.245, 0.008]], [0.818, [0.740, 0.243, 0.008]], [0.820, [0.740, 0.243, 0.008]], [0.822, [0.733, 0.241, 0.009]], [0.824, [0.733, 0.241, 0.009]], [0.826, [0.727, 0.239, 0.009]], [0.828, [0.727, 0.239, 0.009]], [0.830, [0.721, 0.236, 0.009]], [0.832, [0.721, 0.236, 0.009]], [0.834, [0.715, 0.234, 0.009]], [0.836, [0.715, 0.234, 0.009]], [0.838, [0.708, 0.232, 0.010]], [0.840, [0.708, 0.232, 0.010]], [0.841, [0.702, 0.230, 0.010]], [0.843, [0.702, 0.230, 0.010]], [0.845, [0.696, 0.228, 0.010]], [0.847, [0.696, 0.228, 0.010]], [0.849, [0.689, 0.225, 0.010]], [0.851, [0.689, 0.225, 0.010]], [0.853, [0.683, 0.223, 0.011]], [0.855, [0.683, 0.223, 0.011]], [0.857, [0.677, 0.221, 0.011]], [0.859, [0.677, 0.221, 0.011]], [0.861, [0.671, 0.219, 0.011]], [0.863, [0.671, 0.219, 0.011]], [0.865, [0.664, 0.216, 0.011]], [0.867, [0.664, 0.216, 0.011]], [0.869, [0.658, 0.214, 0.011]], [0.871, [0.658, 0.214, 0.011]], [0.873, [0.652, 0.212, 0.012]], [0.875, [0.652, 0.212, 0.012]], [0.877, [0.647, 0.210, 0.012]], [0.879, [0.647, 0.210, 0.012]], [0.881, [0.642, 0.208, 0.012]], [0.883, [0.642, 0.208, 0.012]], [0.885, [0.637, 0.206, 0.012]], [0.886, [0.637, 0.206, 0.012]], [0.888, [0.632, 0.205, 0.012]], [0.890, [0.632, 0.205, 0.012]], [0.892, [0.628, 0.203, 0.012]], [0.894, [0.628, 0.203, 0.012]], [0.896, [0.623, 0.201, 0.012]], [0.898, [0.623, 0.201, 0.012]], [0.900, [0.618, 0.199, 0.013]], [0.902, [0.618, 0.199, 0.013]], [0.904, [0.613, 0.197, 0.013]], [0.906, [0.613, 0.197, 0.013]], [0.908, [0.608, 0.195, 0.013]], [0.910, [0.608, 0.195, 0.013]], [0.912, [0.604, 0.194, 0.013]], [0.914, [0.604, 0.194, 0.013]], [0.916, [0.599, 0.192, 0.013]], [0.918, [0.599, 0.192, 0.013]], [0.920, [0.594, 0.190, 0.013]], [0.922, [0.594, 0.190, 0.013]], [0.924, [0.589, 0.188, 0.013]], [0.926, [0.589, 0.188, 0.013]], [0.928, [0.584, 0.186, 0.013]], [0.930, [0.584, 0.186, 0.013]], [0.932, [0.580, 0.184, 0.014]], [0.933, [0.580, 0.184, 0.014]], [0.935, [0.575, 0.182, 0.014]], [0.937, [0.575, 0.182, 0.014]], [0.939, [0.570, 0.181, 0.014]], [0.941, [0.570, 0.181, 0.014]], [0.943, [0.565, 0.179, 0.014]], [0.945, [0.565, 0.179, 0.014]], [0.947, [0.560, 0.177, 0.014]], [0.949, [0.560, 0.177, 0.014]], [0.951, [0.556, 0.175, 0.014]], [0.953, [0.556, 0.175, 0.014]], [0.955, [0.551, 0.173, 0.014]], [0.957, [0.551, 0.173, 0.014]], [0.959, [0.546, 0.171, 0.014]], [0.961, [0.546, 0.171, 0.014]], [0.963, [0.541, 0.170, 0.015]], [0.965, [0.541, 0.170, 0.015]], [0.967, [0.536, 0.168, 0.015]], [0.969, [0.536, 0.168, 0.015]], [0.971, [0.532, 0.166, 0.015]], [0.973, [0.532, 0.166, 0.015]], [0.975, [0.527, 0.164, 0.015]], [0.977, [0.527, 0.164, 0.015]], [0.978, [0.522, 0.162, 0.015]], [0.980, [0.522, 0.162, 0.015]], [0.982, [0.517, 0.160, 0.015]], [0.984, [0.517, 0.160, 0.015]], [0.986, [0.512, 0.158, 0.015]], [0.988, [0.512, 0.158, 0.015]], [0.990, [0.508, 0.157, 0.015]], [0.992, [0.508, 0.157, 0.015]], [0.994, [0.503, 0.155, 0.016]], [0.996, [0.503, 0.155, 0.016]], [0.998, [0.498, 0.153, 0.016]], [1.000, [0.498, 0.153, 0.016]]]; +var PuBu = [[0.000, [1.000, 0.969, 0.984]], [0.002, [1.000, 0.969, 0.984]], [0.004, [0.998, 0.967, 0.983]], [0.006, [0.998, 0.967, 0.983]], [0.008, [0.995, 0.965, 0.982]], [0.010, [0.995, 0.965, 0.982]], [0.012, [0.993, 0.963, 0.981]], [0.014, [0.993, 0.963, 0.981]], [0.016, [0.991, 0.961, 0.980]], [0.018, [0.991, 0.961, 0.980]], [0.020, [0.988, 0.959, 0.979]], [0.022, [0.988, 0.959, 0.979]], [0.023, [0.986, 0.957, 0.978]], [0.025, [0.986, 0.957, 0.978]], [0.027, [0.984, 0.955, 0.977]], [0.029, [0.984, 0.955, 0.977]], [0.031, [0.981, 0.953, 0.975]], [0.033, [0.981, 0.953, 0.975]], [0.035, [0.979, 0.951, 0.974]], [0.037, [0.979, 0.951, 0.974]], [0.039, [0.977, 0.949, 0.973]], [0.041, [0.977, 0.949, 0.973]], [0.043, [0.974, 0.947, 0.972]], [0.045, [0.974, 0.947, 0.972]], [0.047, [0.972, 0.945, 0.971]], [0.049, [0.972, 0.945, 0.971]], [0.051, [0.970, 0.943, 0.970]], [0.053, [0.970, 0.943, 0.970]], [0.055, [0.967, 0.941, 0.969]], [0.057, [0.967, 0.941, 0.969]], [0.059, [0.965, 0.939, 0.968]], [0.061, [0.965, 0.939, 0.968]], [0.063, [0.963, 0.937, 0.967]], [0.065, [0.963, 0.937, 0.967]], [0.067, [0.960, 0.935, 0.965]], [0.068, [0.960, 0.935, 0.965]], [0.070, [0.958, 0.933, 0.964]], [0.072, [0.958, 0.933, 0.964]], [0.074, [0.956, 0.931, 0.963]], [0.076, [0.956, 0.931, 0.963]], [0.078, [0.953, 0.929, 0.962]], [0.080, [0.953, 0.929, 0.962]], [0.082, [0.951, 0.927, 0.961]], [0.084, [0.951, 0.927, 0.961]], [0.086, [0.949, 0.925, 0.960]], [0.088, [0.949, 0.925, 0.960]], [0.090, [0.946, 0.923, 0.959]], [0.092, [0.946, 0.923, 0.959]], [0.094, [0.944, 0.921, 0.958]], [0.096, [0.944, 0.921, 0.958]], [0.098, [0.942, 0.919, 0.957]], [0.100, [0.942, 0.919, 0.957]], [0.102, [0.939, 0.917, 0.956]], [0.104, [0.939, 0.917, 0.956]], [0.106, [0.937, 0.915, 0.954]], [0.108, [0.937, 0.915, 0.954]], [0.110, [0.935, 0.914, 0.953]], [0.112, [0.935, 0.914, 0.953]], [0.114, [0.932, 0.912, 0.952]], [0.115, [0.932, 0.912, 0.952]], [0.117, [0.930, 0.910, 0.951]], [0.119, [0.930, 0.910, 0.951]], [0.121, [0.928, 0.908, 0.950]], [0.123, [0.928, 0.908, 0.950]], [0.125, [0.925, 0.906, 0.949]], [0.127, [0.925, 0.906, 0.949]], [0.129, [0.922, 0.903, 0.947]], [0.131, [0.922, 0.903, 0.947]], [0.133, [0.918, 0.900, 0.946]], [0.135, [0.918, 0.900, 0.946]], [0.137, [0.915, 0.897, 0.944]], [0.139, [0.915, 0.897, 0.944]], [0.141, [0.911, 0.895, 0.943]], [0.143, [0.911, 0.895, 0.943]], [0.145, [0.908, 0.892, 0.941]], [0.147, [0.908, 0.892, 0.941]], [0.149, [0.904, 0.889, 0.940]], [0.151, [0.904, 0.889, 0.940]], [0.153, [0.901, 0.887, 0.939]], [0.155, [0.901, 0.887, 0.939]], [0.157, [0.898, 0.884, 0.937]], [0.159, [0.898, 0.884, 0.937]], [0.160, [0.894, 0.881, 0.936]], [0.162, [0.894, 0.881, 0.936]], [0.164, [0.891, 0.878, 0.934]], [0.166, [0.891, 0.878, 0.934]], [0.168, [0.887, 0.876, 0.933]], [0.170, [0.887, 0.876, 0.933]], [0.172, [0.884, 0.873, 0.931]], [0.174, [0.884, 0.873, 0.931]], [0.176, [0.880, 0.870, 0.930]], [0.178, [0.880, 0.870, 0.930]], [0.180, [0.877, 0.868, 0.928]], [0.182, [0.877, 0.868, 0.928]], [0.184, [0.873, 0.865, 0.927]], [0.186, [0.873, 0.865, 0.927]], [0.188, [0.870, 0.862, 0.925]], [0.190, [0.870, 0.862, 0.925]], [0.192, [0.866, 0.860, 0.924]], [0.194, [0.866, 0.860, 0.924]], [0.196, [0.863, 0.857, 0.922]], [0.198, [0.863, 0.857, 0.922]], [0.200, [0.860, 0.854, 0.921]], [0.202, [0.860, 0.854, 0.921]], [0.204, [0.856, 0.851, 0.919]], [0.205, [0.856, 0.851, 0.919]], [0.207, [0.853, 0.849, 0.918]], [0.209, [0.853, 0.849, 0.918]], [0.211, [0.849, 0.846, 0.916]], [0.213, [0.849, 0.846, 0.916]], [0.215, [0.846, 0.843, 0.915]], [0.217, [0.846, 0.843, 0.915]], [0.219, [0.842, 0.841, 0.913]], [0.221, [0.842, 0.841, 0.913]], [0.223, [0.839, 0.838, 0.912]], [0.225, [0.839, 0.838, 0.912]], [0.227, [0.835, 0.835, 0.910]], [0.229, [0.835, 0.835, 0.910]], [0.231, [0.832, 0.832, 0.909]], [0.233, [0.832, 0.832, 0.909]], [0.235, [0.829, 0.830, 0.907]], [0.237, [0.829, 0.830, 0.907]], [0.239, [0.825, 0.827, 0.906]], [0.241, [0.825, 0.827, 0.906]], [0.243, [0.822, 0.824, 0.905]], [0.245, [0.822, 0.824, 0.905]], [0.247, [0.818, 0.822, 0.903]], [0.249, [0.818, 0.822, 0.903]], [0.250, [0.814, 0.819, 0.902]], [0.252, [0.814, 0.819, 0.902]], [0.254, [0.809, 0.817, 0.900]], [0.256, [0.809, 0.817, 0.900]], [0.258, [0.804, 0.814, 0.899]], [0.260, [0.804, 0.814, 0.899]], [0.262, [0.799, 0.812, 0.898]], [0.264, [0.799, 0.812, 0.898]], [0.266, [0.794, 0.809, 0.896]], [0.268, [0.794, 0.809, 0.896]], [0.270, [0.789, 0.807, 0.895]], [0.272, [0.789, 0.807, 0.895]], [0.274, [0.783, 0.804, 0.894]], [0.276, [0.783, 0.804, 0.894]], [0.278, [0.778, 0.802, 0.892]], [0.280, [0.778, 0.802, 0.892]], [0.282, [0.773, 0.799, 0.891]], [0.284, [0.773, 0.799, 0.891]], [0.286, [0.768, 0.797, 0.889]], [0.288, [0.768, 0.797, 0.889]], [0.290, [0.763, 0.794, 0.888]], [0.292, [0.763, 0.794, 0.888]], [0.294, [0.758, 0.792, 0.887]], [0.295, [0.758, 0.792, 0.887]], [0.297, [0.752, 0.789, 0.885]], [0.299, [0.752, 0.789, 0.885]], [0.301, [0.747, 0.787, 0.884]], [0.303, [0.747, 0.787, 0.884]], [0.305, [0.742, 0.785, 0.883]], [0.307, [0.742, 0.785, 0.883]], [0.309, [0.737, 0.782, 0.881]], [0.311, [0.737, 0.782, 0.881]], [0.313, [0.732, 0.780, 0.880]], [0.315, [0.732, 0.780, 0.880]], [0.317, [0.727, 0.777, 0.879]], [0.319, [0.727, 0.777, 0.879]], [0.321, [0.721, 0.775, 0.877]], [0.323, [0.721, 0.775, 0.877]], [0.325, [0.716, 0.772, 0.876]], [0.327, [0.716, 0.772, 0.876]], [0.329, [0.711, 0.770, 0.875]], [0.331, [0.711, 0.770, 0.875]], [0.333, [0.706, 0.767, 0.873]], [0.335, [0.706, 0.767, 0.873]], [0.337, [0.701, 0.765, 0.872]], [0.339, [0.701, 0.765, 0.872]], [0.341, [0.696, 0.762, 0.870]], [0.342, [0.696, 0.762, 0.870]], [0.344, [0.690, 0.760, 0.869]], [0.346, [0.690, 0.760, 0.869]], [0.348, [0.685, 0.757, 0.868]], [0.350, [0.685, 0.757, 0.868]], [0.352, [0.680, 0.755, 0.866]], [0.354, [0.680, 0.755, 0.866]], [0.356, [0.675, 0.753, 0.865]], [0.358, [0.675, 0.753, 0.865]], [0.360, [0.670, 0.750, 0.864]], [0.362, [0.670, 0.750, 0.864]], [0.364, [0.665, 0.748, 0.862]], [0.366, [0.665, 0.748, 0.862]], [0.368, [0.659, 0.745, 0.861]], [0.370, [0.659, 0.745, 0.861]], [0.372, [0.654, 0.743, 0.860]], [0.374, [0.654, 0.743, 0.860]], [0.376, [0.649, 0.740, 0.858]], [0.378, [0.649, 0.740, 0.858]], [0.380, [0.643, 0.738, 0.857]], [0.382, [0.643, 0.738, 0.857]], [0.384, [0.636, 0.735, 0.855]], [0.386, [0.636, 0.735, 0.855]], [0.387, [0.630, 0.733, 0.854]], [0.389, [0.630, 0.733, 0.854]], [0.391, [0.624, 0.730, 0.852]], [0.393, [0.624, 0.730, 0.852]], [0.395, [0.618, 0.728, 0.851]], [0.397, [0.618, 0.728, 0.851]], [0.399, [0.612, 0.725, 0.849]], [0.401, [0.612, 0.725, 0.849]], [0.403, [0.606, 0.723, 0.848]], [0.405, [0.606, 0.723, 0.848]], [0.407, [0.599, 0.721, 0.846]], [0.409, [0.599, 0.721, 0.846]], [0.411, [0.593, 0.718, 0.845]], [0.413, [0.593, 0.718, 0.845]], [0.415, [0.587, 0.716, 0.844]], [0.417, [0.587, 0.716, 0.844]], [0.419, [0.581, 0.713, 0.842]], [0.421, [0.581, 0.713, 0.842]], [0.423, [0.575, 0.711, 0.841]], [0.425, [0.575, 0.711, 0.841]], [0.427, [0.569, 0.708, 0.839]], [0.429, [0.569, 0.708, 0.839]], [0.431, [0.563, 0.706, 0.838]], [0.432, [0.563, 0.706, 0.838]], [0.434, [0.556, 0.703, 0.836]], [0.436, [0.556, 0.703, 0.836]], [0.438, [0.550, 0.701, 0.835]], [0.440, [0.550, 0.701, 0.835]], [0.442, [0.544, 0.698, 0.833]], [0.444, [0.544, 0.698, 0.833]], [0.446, [0.538, 0.696, 0.832]], [0.448, [0.538, 0.696, 0.832]], [0.450, [0.532, 0.694, 0.830]], [0.452, [0.532, 0.694, 0.830]], [0.454, [0.526, 0.691, 0.829]], [0.456, [0.526, 0.691, 0.829]], [0.458, [0.519, 0.689, 0.827]], [0.460, [0.519, 0.689, 0.827]], [0.462, [0.513, 0.686, 0.826]], [0.464, [0.513, 0.686, 0.826]], [0.466, [0.507, 0.684, 0.824]], [0.468, [0.507, 0.684, 0.824]], [0.470, [0.501, 0.681, 0.823]], [0.472, [0.501, 0.681, 0.823]], [0.474, [0.495, 0.679, 0.821]], [0.476, [0.495, 0.679, 0.821]], [0.477, [0.489, 0.676, 0.820]], [0.479, [0.489, 0.676, 0.820]], [0.481, [0.483, 0.674, 0.818]], [0.483, [0.483, 0.674, 0.818]], [0.485, [0.476, 0.671, 0.817]], [0.487, [0.476, 0.671, 0.817]], [0.489, [0.470, 0.669, 0.815]], [0.491, [0.470, 0.669, 0.815]], [0.493, [0.464, 0.666, 0.814]], [0.495, [0.464, 0.666, 0.814]], [0.497, [0.458, 0.664, 0.813]], [0.499, [0.458, 0.664, 0.813]], [0.501, [0.451, 0.661, 0.811]], [0.503, [0.451, 0.661, 0.811]], [0.505, [0.443, 0.658, 0.809]], [0.507, [0.443, 0.658, 0.809]], [0.509, [0.436, 0.655, 0.807]], [0.511, [0.436, 0.655, 0.807]], [0.513, [0.428, 0.652, 0.805]], [0.515, [0.428, 0.652, 0.805]], [0.517, [0.421, 0.649, 0.803]], [0.519, [0.421, 0.649, 0.803]], [0.521, [0.413, 0.646, 0.802]], [0.523, [0.413, 0.646, 0.802]], [0.524, [0.405, 0.643, 0.800]], [0.526, [0.405, 0.643, 0.800]], [0.528, [0.398, 0.640, 0.798]], [0.530, [0.398, 0.640, 0.798]], [0.532, [0.390, 0.637, 0.796]], [0.534, [0.390, 0.637, 0.796]], [0.536, [0.382, 0.634, 0.794]], [0.538, [0.382, 0.634, 0.794]], [0.540, [0.375, 0.630, 0.792]], [0.542, [0.375, 0.630, 0.792]], [0.544, [0.367, 0.627, 0.791]], [0.546, [0.367, 0.627, 0.791]], [0.548, [0.360, 0.624, 0.789]], [0.550, [0.360, 0.624, 0.789]], [0.552, [0.352, 0.621, 0.787]], [0.554, [0.352, 0.621, 0.787]], [0.556, [0.344, 0.618, 0.785]], [0.558, [0.344, 0.618, 0.785]], [0.560, [0.337, 0.615, 0.783]], [0.562, [0.337, 0.615, 0.783]], [0.564, [0.329, 0.612, 0.781]], [0.566, [0.329, 0.612, 0.781]], [0.568, [0.321, 0.609, 0.779]], [0.569, [0.321, 0.609, 0.779]], [0.571, [0.314, 0.606, 0.778]], [0.573, [0.314, 0.606, 0.778]], [0.575, [0.306, 0.603, 0.776]], [0.577, [0.306, 0.603, 0.776]], [0.579, [0.299, 0.600, 0.774]], [0.581, [0.299, 0.600, 0.774]], [0.583, [0.291, 0.597, 0.772]], [0.585, [0.291, 0.597, 0.772]], [0.587, [0.283, 0.594, 0.770]], [0.589, [0.283, 0.594, 0.770]], [0.591, [0.276, 0.590, 0.768]], [0.593, [0.276, 0.590, 0.768]], [0.595, [0.268, 0.587, 0.767]], [0.597, [0.268, 0.587, 0.767]], [0.599, [0.260, 0.584, 0.765]], [0.601, [0.260, 0.584, 0.765]], [0.603, [0.253, 0.581, 0.763]], [0.605, [0.253, 0.581, 0.763]], [0.607, [0.245, 0.578, 0.761]], [0.609, [0.245, 0.578, 0.761]], [0.611, [0.238, 0.575, 0.759]], [0.613, [0.238, 0.575, 0.759]], [0.614, [0.230, 0.572, 0.757]], [0.616, [0.230, 0.572, 0.757]], [0.618, [0.222, 0.569, 0.755]], [0.620, [0.222, 0.569, 0.755]], [0.622, [0.215, 0.566, 0.754]], [0.624, [0.215, 0.566, 0.754]], [0.626, [0.208, 0.562, 0.752]], [0.628, [0.208, 0.562, 0.752]], [0.630, [0.202, 0.558, 0.750]], [0.632, [0.202, 0.558, 0.750]], [0.634, [0.196, 0.554, 0.748]], [0.636, [0.196, 0.554, 0.748]], [0.638, [0.190, 0.550, 0.746]], [0.640, [0.190, 0.550, 0.746]], [0.642, [0.184, 0.546, 0.744]], [0.644, [0.184, 0.546, 0.744]], [0.646, [0.178, 0.543, 0.742]], [0.648, [0.178, 0.543, 0.742]], [0.650, [0.172, 0.539, 0.740]], [0.652, [0.172, 0.539, 0.740]], [0.654, [0.166, 0.535, 0.738]], [0.656, [0.166, 0.535, 0.738]], [0.658, [0.160, 0.531, 0.736]], [0.659, [0.160, 0.531, 0.736]], [0.661, [0.154, 0.527, 0.734]], [0.663, [0.154, 0.527, 0.734]], [0.665, [0.148, 0.523, 0.732]], [0.667, [0.148, 0.523, 0.732]], [0.669, [0.142, 0.519, 0.730]], [0.671, [0.142, 0.519, 0.730]], [0.673, [0.136, 0.515, 0.728]], [0.675, [0.136, 0.515, 0.728]], [0.677, [0.130, 0.511, 0.726]], [0.679, [0.130, 0.511, 0.726]], [0.681, [0.124, 0.507, 0.724]], [0.683, [0.124, 0.507, 0.724]], [0.685, [0.118, 0.503, 0.722]], [0.687, [0.118, 0.503, 0.722]], [0.689, [0.112, 0.499, 0.720]], [0.691, [0.112, 0.499, 0.720]], [0.693, [0.106, 0.495, 0.718]], [0.695, [0.106, 0.495, 0.718]], [0.697, [0.099, 0.491, 0.716]], [0.699, [0.099, 0.491, 0.716]], [0.701, [0.093, 0.487, 0.714]], [0.703, [0.093, 0.487, 0.714]], [0.705, [0.087, 0.484, 0.712]], [0.706, [0.087, 0.484, 0.712]], [0.708, [0.081, 0.480, 0.710]], [0.710, [0.081, 0.480, 0.710]], [0.712, [0.075, 0.476, 0.708]], [0.714, [0.075, 0.476, 0.708]], [0.716, [0.069, 0.472, 0.706]], [0.718, [0.069, 0.472, 0.706]], [0.720, [0.063, 0.468, 0.704]], [0.722, [0.063, 0.468, 0.704]], [0.724, [0.057, 0.464, 0.702]], [0.726, [0.057, 0.464, 0.702]], [0.728, [0.051, 0.460, 0.701]], [0.730, [0.051, 0.460, 0.701]], [0.732, [0.045, 0.456, 0.699]], [0.734, [0.045, 0.456, 0.699]], [0.736, [0.039, 0.452, 0.697]], [0.738, [0.039, 0.452, 0.697]], [0.740, [0.033, 0.448, 0.695]], [0.742, [0.033, 0.448, 0.695]], [0.744, [0.027, 0.444, 0.693]], [0.746, [0.027, 0.444, 0.693]], [0.748, [0.021, 0.440, 0.691]], [0.750, [0.021, 0.440, 0.691]], [0.751, [0.020, 0.437, 0.687]], [0.753, [0.020, 0.437, 0.687]], [0.755, [0.019, 0.434, 0.683]], [0.757, [0.019, 0.434, 0.683]], [0.759, [0.019, 0.432, 0.678]], [0.761, [0.019, 0.432, 0.678]], [0.763, [0.019, 0.429, 0.674]], [0.765, [0.019, 0.429, 0.674]], [0.767, [0.019, 0.426, 0.670]], [0.769, [0.019, 0.426, 0.670]], [0.771, [0.019, 0.424, 0.665]], [0.773, [0.019, 0.424, 0.665]], [0.775, [0.019, 0.421, 0.661]], [0.777, [0.019, 0.421, 0.661]], [0.779, [0.019, 0.418, 0.657]], [0.781, [0.019, 0.418, 0.657]], [0.783, [0.019, 0.416, 0.653]], [0.785, [0.019, 0.416, 0.653]], [0.787, [0.018, 0.413, 0.648]], [0.789, [0.018, 0.413, 0.648]], [0.791, [0.018, 0.410, 0.644]], [0.793, [0.018, 0.410, 0.644]], [0.795, [0.018, 0.407, 0.640]], [0.796, [0.018, 0.407, 0.640]], [0.798, [0.018, 0.405, 0.635]], [0.800, [0.018, 0.405, 0.635]], [0.802, [0.018, 0.402, 0.631]], [0.804, [0.018, 0.402, 0.631]], [0.806, [0.018, 0.399, 0.627]], [0.808, [0.018, 0.399, 0.627]], [0.810, [0.018, 0.397, 0.622]], [0.812, [0.018, 0.397, 0.622]], [0.814, [0.018, 0.394, 0.618]], [0.816, [0.018, 0.394, 0.618]], [0.818, [0.017, 0.391, 0.614]], [0.820, [0.017, 0.391, 0.614]], [0.822, [0.017, 0.388, 0.609]], [0.824, [0.017, 0.388, 0.609]], [0.826, [0.017, 0.386, 0.605]], [0.828, [0.017, 0.386, 0.605]], [0.830, [0.017, 0.383, 0.601]], [0.832, [0.017, 0.383, 0.601]], [0.834, [0.017, 0.380, 0.597]], [0.836, [0.017, 0.380, 0.597]], [0.838, [0.017, 0.378, 0.592]], [0.840, [0.017, 0.378, 0.592]], [0.841, [0.017, 0.375, 0.588]], [0.843, [0.017, 0.375, 0.588]], [0.845, [0.017, 0.372, 0.584]], [0.847, [0.017, 0.372, 0.584]], [0.849, [0.016, 0.370, 0.579]], [0.851, [0.016, 0.370, 0.579]], [0.853, [0.016, 0.367, 0.575]], [0.855, [0.016, 0.367, 0.575]], [0.857, [0.016, 0.364, 0.571]], [0.859, [0.016, 0.364, 0.571]], [0.861, [0.016, 0.361, 0.566]], [0.863, [0.016, 0.361, 0.566]], [0.865, [0.016, 0.359, 0.562]], [0.867, [0.016, 0.359, 0.562]], [0.869, [0.016, 0.356, 0.558]], [0.871, [0.016, 0.356, 0.558]], [0.873, [0.016, 0.353, 0.553]], [0.875, [0.016, 0.353, 0.553]], [0.877, [0.015, 0.349, 0.547]], [0.879, [0.015, 0.349, 0.547]], [0.881, [0.015, 0.345, 0.541]], [0.883, [0.015, 0.345, 0.541]], [0.885, [0.015, 0.341, 0.534]], [0.886, [0.015, 0.341, 0.534]], [0.888, [0.015, 0.337, 0.528]], [0.890, [0.015, 0.337, 0.528]], [0.892, [0.014, 0.333, 0.521]], [0.894, [0.014, 0.333, 0.521]], [0.896, [0.014, 0.328, 0.515]], [0.898, [0.014, 0.328, 0.515]], [0.900, [0.014, 0.324, 0.508]], [0.902, [0.014, 0.324, 0.508]], [0.904, [0.014, 0.320, 0.502]], [0.906, [0.014, 0.320, 0.502]], [0.908, [0.014, 0.316, 0.495]], [0.910, [0.014, 0.316, 0.495]], [0.912, [0.013, 0.312, 0.489]], [0.914, [0.013, 0.312, 0.489]], [0.916, [0.013, 0.307, 0.482]], [0.918, [0.013, 0.307, 0.482]], [0.920, [0.013, 0.303, 0.476]], [0.922, [0.013, 0.303, 0.476]], [0.924, [0.013, 0.299, 0.469]], [0.926, [0.013, 0.299, 0.469]], [0.928, [0.012, 0.295, 0.462]], [0.930, [0.012, 0.295, 0.462]], [0.932, [0.012, 0.291, 0.456]], [0.933, [0.012, 0.291, 0.456]], [0.935, [0.012, 0.287, 0.449]], [0.937, [0.012, 0.287, 0.449]], [0.939, [0.012, 0.282, 0.443]], [0.941, [0.012, 0.282, 0.443]], [0.943, [0.011, 0.278, 0.436]], [0.945, [0.011, 0.278, 0.436]], [0.947, [0.011, 0.274, 0.430]], [0.949, [0.011, 0.274, 0.430]], [0.951, [0.011, 0.270, 0.423]], [0.953, [0.011, 0.270, 0.423]], [0.955, [0.011, 0.266, 0.417]], [0.957, [0.011, 0.266, 0.417]], [0.959, [0.010, 0.261, 0.410]], [0.961, [0.010, 0.261, 0.410]], [0.963, [0.010, 0.257, 0.404]], [0.965, [0.010, 0.257, 0.404]], [0.967, [0.010, 0.253, 0.397]], [0.969, [0.010, 0.253, 0.397]], [0.971, [0.010, 0.249, 0.391]], [0.973, [0.010, 0.249, 0.391]], [0.975, [0.009, 0.245, 0.384]], [0.977, [0.009, 0.245, 0.384]], [0.978, [0.009, 0.241, 0.378]], [0.980, [0.009, 0.241, 0.378]], [0.982, [0.009, 0.236, 0.371]], [0.984, [0.009, 0.236, 0.371]], [0.986, [0.009, 0.232, 0.365]], [0.988, [0.009, 0.232, 0.365]], [0.990, [0.008, 0.228, 0.358]], [0.992, [0.008, 0.228, 0.358]], [0.994, [0.008, 0.224, 0.352]], [0.996, [0.008, 0.224, 0.352]], [0.998, [0.008, 0.220, 0.345]], [1.000, [0.008, 0.220, 0.345]]]; +var PuBuGn = [[0.000, [1.000, 0.969, 0.984]], [0.002, [1.000, 0.969, 0.984]], [0.004, [0.998, 0.966, 0.983]], [0.006, [0.998, 0.966, 0.983]], [0.008, [0.995, 0.963, 0.982]], [0.010, [0.995, 0.963, 0.982]], [0.012, [0.993, 0.961, 0.980]], [0.014, [0.993, 0.961, 0.980]], [0.016, [0.991, 0.958, 0.979]], [0.018, [0.991, 0.958, 0.979]], [0.020, [0.988, 0.956, 0.978]], [0.022, [0.988, 0.956, 0.978]], [0.023, [0.986, 0.953, 0.976]], [0.025, [0.986, 0.953, 0.976]], [0.027, [0.984, 0.951, 0.975]], [0.029, [0.984, 0.951, 0.975]], [0.031, [0.981, 0.948, 0.973]], [0.033, [0.981, 0.948, 0.973]], [0.035, [0.979, 0.945, 0.972]], [0.037, [0.979, 0.945, 0.972]], [0.039, [0.977, 0.943, 0.971]], [0.041, [0.977, 0.943, 0.971]], [0.043, [0.974, 0.940, 0.969]], [0.045, [0.974, 0.940, 0.969]], [0.047, [0.972, 0.938, 0.968]], [0.049, [0.972, 0.938, 0.968]], [0.051, [0.970, 0.935, 0.967]], [0.053, [0.970, 0.935, 0.967]], [0.055, [0.967, 0.932, 0.965]], [0.057, [0.967, 0.932, 0.965]], [0.059, [0.965, 0.930, 0.964]], [0.061, [0.965, 0.930, 0.964]], [0.063, [0.963, 0.927, 0.963]], [0.065, [0.963, 0.927, 0.963]], [0.067, [0.960, 0.925, 0.961]], [0.068, [0.960, 0.925, 0.961]], [0.070, [0.958, 0.922, 0.960]], [0.072, [0.958, 0.922, 0.960]], [0.074, [0.956, 0.920, 0.959]], [0.076, [0.956, 0.920, 0.959]], [0.078, [0.953, 0.917, 0.957]], [0.080, [0.953, 0.917, 0.957]], [0.082, [0.951, 0.914, 0.956]], [0.084, [0.951, 0.914, 0.956]], [0.086, [0.949, 0.912, 0.955]], [0.088, [0.949, 0.912, 0.955]], [0.090, [0.946, 0.909, 0.953]], [0.092, [0.946, 0.909, 0.953]], [0.094, [0.944, 0.907, 0.952]], [0.096, [0.944, 0.907, 0.952]], [0.098, [0.942, 0.904, 0.950]], [0.100, [0.942, 0.904, 0.950]], [0.102, [0.939, 0.901, 0.949]], [0.104, [0.939, 0.901, 0.949]], [0.106, [0.937, 0.899, 0.948]], [0.108, [0.937, 0.899, 0.948]], [0.110, [0.935, 0.896, 0.946]], [0.112, [0.935, 0.896, 0.946]], [0.114, [0.932, 0.894, 0.945]], [0.115, [0.932, 0.894, 0.945]], [0.117, [0.930, 0.891, 0.944]], [0.119, [0.930, 0.891, 0.944]], [0.121, [0.928, 0.889, 0.942]], [0.123, [0.928, 0.889, 0.942]], [0.125, [0.925, 0.886, 0.941]], [0.127, [0.925, 0.886, 0.941]], [0.129, [0.922, 0.884, 0.940]], [0.131, [0.922, 0.884, 0.940]], [0.133, [0.918, 0.882, 0.939]], [0.135, [0.918, 0.882, 0.939]], [0.137, [0.915, 0.880, 0.937]], [0.139, [0.915, 0.880, 0.937]], [0.141, [0.911, 0.878, 0.936]], [0.143, [0.911, 0.878, 0.936]], [0.145, [0.908, 0.876, 0.935]], [0.147, [0.908, 0.876, 0.935]], [0.149, [0.904, 0.873, 0.934]], [0.151, [0.904, 0.873, 0.934]], [0.153, [0.901, 0.871, 0.932]], [0.155, [0.901, 0.871, 0.932]], [0.157, [0.898, 0.869, 0.931]], [0.159, [0.898, 0.869, 0.931]], [0.160, [0.894, 0.867, 0.930]], [0.162, [0.894, 0.867, 0.930]], [0.164, [0.891, 0.865, 0.929]], [0.166, [0.891, 0.865, 0.929]], [0.168, [0.887, 0.863, 0.927]], [0.170, [0.887, 0.863, 0.927]], [0.172, [0.884, 0.861, 0.926]], [0.174, [0.884, 0.861, 0.926]], [0.176, [0.880, 0.859, 0.925]], [0.178, [0.880, 0.859, 0.925]], [0.180, [0.877, 0.857, 0.924]], [0.182, [0.877, 0.857, 0.924]], [0.184, [0.873, 0.855, 0.923]], [0.186, [0.873, 0.855, 0.923]], [0.188, [0.870, 0.853, 0.921]], [0.190, [0.870, 0.853, 0.921]], [0.192, [0.866, 0.850, 0.920]], [0.194, [0.866, 0.850, 0.920]], [0.196, [0.863, 0.848, 0.919]], [0.198, [0.863, 0.848, 0.919]], [0.200, [0.860, 0.846, 0.918]], [0.202, [0.860, 0.846, 0.918]], [0.204, [0.856, 0.844, 0.916]], [0.205, [0.856, 0.844, 0.916]], [0.207, [0.853, 0.842, 0.915]], [0.209, [0.853, 0.842, 0.915]], [0.211, [0.849, 0.840, 0.914]], [0.213, [0.849, 0.840, 0.914]], [0.215, [0.846, 0.838, 0.913]], [0.217, [0.846, 0.838, 0.913]], [0.219, [0.842, 0.836, 0.911]], [0.221, [0.842, 0.836, 0.911]], [0.223, [0.839, 0.834, 0.910]], [0.225, [0.839, 0.834, 0.910]], [0.227, [0.835, 0.832, 0.909]], [0.229, [0.835, 0.832, 0.909]], [0.231, [0.832, 0.830, 0.908]], [0.233, [0.832, 0.830, 0.908]], [0.235, [0.829, 0.827, 0.907]], [0.237, [0.829, 0.827, 0.907]], [0.239, [0.825, 0.825, 0.905]], [0.241, [0.825, 0.825, 0.905]], [0.243, [0.822, 0.823, 0.904]], [0.245, [0.822, 0.823, 0.904]], [0.247, [0.818, 0.821, 0.903]], [0.249, [0.818, 0.821, 0.903]], [0.250, [0.814, 0.819, 0.902]], [0.252, [0.814, 0.819, 0.902]], [0.254, [0.809, 0.817, 0.900]], [0.256, [0.809, 0.817, 0.900]], [0.258, [0.804, 0.814, 0.899]], [0.260, [0.804, 0.814, 0.899]], [0.262, [0.799, 0.812, 0.898]], [0.264, [0.799, 0.812, 0.898]], [0.266, [0.794, 0.809, 0.896]], [0.268, [0.794, 0.809, 0.896]], [0.270, [0.789, 0.807, 0.895]], [0.272, [0.789, 0.807, 0.895]], [0.274, [0.783, 0.804, 0.894]], [0.276, [0.783, 0.804, 0.894]], [0.278, [0.778, 0.802, 0.892]], [0.280, [0.778, 0.802, 0.892]], [0.282, [0.773, 0.799, 0.891]], [0.284, [0.773, 0.799, 0.891]], [0.286, [0.768, 0.797, 0.889]], [0.288, [0.768, 0.797, 0.889]], [0.290, [0.763, 0.794, 0.888]], [0.292, [0.763, 0.794, 0.888]], [0.294, [0.758, 0.792, 0.887]], [0.295, [0.758, 0.792, 0.887]], [0.297, [0.752, 0.789, 0.885]], [0.299, [0.752, 0.789, 0.885]], [0.301, [0.747, 0.787, 0.884]], [0.303, [0.747, 0.787, 0.884]], [0.305, [0.742, 0.785, 0.883]], [0.307, [0.742, 0.785, 0.883]], [0.309, [0.737, 0.782, 0.881]], [0.311, [0.737, 0.782, 0.881]], [0.313, [0.732, 0.780, 0.880]], [0.315, [0.732, 0.780, 0.880]], [0.317, [0.727, 0.777, 0.879]], [0.319, [0.727, 0.777, 0.879]], [0.321, [0.721, 0.775, 0.877]], [0.323, [0.721, 0.775, 0.877]], [0.325, [0.716, 0.772, 0.876]], [0.327, [0.716, 0.772, 0.876]], [0.329, [0.711, 0.770, 0.875]], [0.331, [0.711, 0.770, 0.875]], [0.333, [0.706, 0.767, 0.873]], [0.335, [0.706, 0.767, 0.873]], [0.337, [0.701, 0.765, 0.872]], [0.339, [0.701, 0.765, 0.872]], [0.341, [0.696, 0.762, 0.870]], [0.342, [0.696, 0.762, 0.870]], [0.344, [0.690, 0.760, 0.869]], [0.346, [0.690, 0.760, 0.869]], [0.348, [0.685, 0.757, 0.868]], [0.350, [0.685, 0.757, 0.868]], [0.352, [0.680, 0.755, 0.866]], [0.354, [0.680, 0.755, 0.866]], [0.356, [0.675, 0.753, 0.865]], [0.358, [0.675, 0.753, 0.865]], [0.360, [0.670, 0.750, 0.864]], [0.362, [0.670, 0.750, 0.864]], [0.364, [0.665, 0.748, 0.862]], [0.366, [0.665, 0.748, 0.862]], [0.368, [0.659, 0.745, 0.861]], [0.370, [0.659, 0.745, 0.861]], [0.372, [0.654, 0.743, 0.860]], [0.374, [0.654, 0.743, 0.860]], [0.376, [0.648, 0.740, 0.858]], [0.378, [0.648, 0.740, 0.858]], [0.380, [0.640, 0.738, 0.857]], [0.382, [0.640, 0.738, 0.857]], [0.384, [0.633, 0.735, 0.855]], [0.386, [0.633, 0.735, 0.855]], [0.387, [0.625, 0.733, 0.854]], [0.389, [0.625, 0.733, 0.854]], [0.391, [0.617, 0.730, 0.852]], [0.393, [0.617, 0.730, 0.852]], [0.395, [0.609, 0.728, 0.851]], [0.397, [0.609, 0.728, 0.851]], [0.399, [0.602, 0.725, 0.849]], [0.401, [0.602, 0.725, 0.849]], [0.403, [0.594, 0.723, 0.848]], [0.405, [0.594, 0.723, 0.848]], [0.407, [0.586, 0.721, 0.846]], [0.409, [0.586, 0.721, 0.846]], [0.411, [0.578, 0.718, 0.845]], [0.413, [0.578, 0.718, 0.845]], [0.415, [0.571, 0.716, 0.844]], [0.417, [0.571, 0.716, 0.844]], [0.419, [0.563, 0.713, 0.842]], [0.421, [0.563, 0.713, 0.842]], [0.423, [0.555, 0.711, 0.841]], [0.425, [0.555, 0.711, 0.841]], [0.427, [0.547, 0.708, 0.839]], [0.429, [0.547, 0.708, 0.839]], [0.431, [0.540, 0.706, 0.838]], [0.432, [0.540, 0.706, 0.838]], [0.434, [0.532, 0.703, 0.836]], [0.436, [0.532, 0.703, 0.836]], [0.438, [0.524, 0.701, 0.835]], [0.440, [0.524, 0.701, 0.835]], [0.442, [0.516, 0.698, 0.833]], [0.444, [0.516, 0.698, 0.833]], [0.446, [0.509, 0.696, 0.832]], [0.448, [0.509, 0.696, 0.832]], [0.450, [0.501, 0.694, 0.830]], [0.452, [0.501, 0.694, 0.830]], [0.454, [0.493, 0.691, 0.829]], [0.456, [0.493, 0.691, 0.829]], [0.458, [0.485, 0.689, 0.827]], [0.460, [0.485, 0.689, 0.827]], [0.462, [0.478, 0.686, 0.826]], [0.464, [0.478, 0.686, 0.826]], [0.466, [0.470, 0.684, 0.824]], [0.468, [0.470, 0.684, 0.824]], [0.470, [0.462, 0.681, 0.823]], [0.472, [0.462, 0.681, 0.823]], [0.474, [0.454, 0.679, 0.821]], [0.476, [0.454, 0.679, 0.821]], [0.477, [0.447, 0.676, 0.820]], [0.479, [0.447, 0.676, 0.820]], [0.481, [0.439, 0.674, 0.818]], [0.483, [0.439, 0.674, 0.818]], [0.485, [0.431, 0.671, 0.817]], [0.487, [0.431, 0.671, 0.817]], [0.489, [0.423, 0.669, 0.815]], [0.491, [0.423, 0.669, 0.815]], [0.493, [0.416, 0.666, 0.814]], [0.495, [0.416, 0.666, 0.814]], [0.497, [0.408, 0.664, 0.813]], [0.499, [0.408, 0.664, 0.813]], [0.501, [0.401, 0.661, 0.811]], [0.503, [0.401, 0.661, 0.811]], [0.505, [0.395, 0.658, 0.809]], [0.507, [0.395, 0.658, 0.809]], [0.509, [0.389, 0.655, 0.807]], [0.511, [0.389, 0.655, 0.807]], [0.513, [0.383, 0.652, 0.805]], [0.515, [0.383, 0.652, 0.805]], [0.517, [0.377, 0.649, 0.803]], [0.519, [0.377, 0.649, 0.803]], [0.521, [0.371, 0.646, 0.802]], [0.523, [0.371, 0.646, 0.802]], [0.524, [0.365, 0.643, 0.800]], [0.526, [0.365, 0.643, 0.800]], [0.528, [0.359, 0.640, 0.798]], [0.530, [0.359, 0.640, 0.798]], [0.532, [0.353, 0.637, 0.796]], [0.534, [0.353, 0.637, 0.796]], [0.536, [0.347, 0.634, 0.794]], [0.538, [0.347, 0.634, 0.794]], [0.540, [0.341, 0.630, 0.792]], [0.542, [0.341, 0.630, 0.792]], [0.544, [0.335, 0.627, 0.791]], [0.546, [0.335, 0.627, 0.791]], [0.548, [0.329, 0.624, 0.789]], [0.550, [0.329, 0.624, 0.789]], [0.552, [0.323, 0.621, 0.787]], [0.554, [0.323, 0.621, 0.787]], [0.556, [0.317, 0.618, 0.785]], [0.558, [0.317, 0.618, 0.785]], [0.560, [0.310, 0.615, 0.783]], [0.562, [0.310, 0.615, 0.783]], [0.564, [0.304, 0.612, 0.781]], [0.566, [0.304, 0.612, 0.781]], [0.568, [0.298, 0.609, 0.779]], [0.569, [0.298, 0.609, 0.779]], [0.571, [0.292, 0.606, 0.778]], [0.573, [0.292, 0.606, 0.778]], [0.575, [0.286, 0.603, 0.776]], [0.577, [0.286, 0.603, 0.776]], [0.579, [0.280, 0.600, 0.774]], [0.581, [0.280, 0.600, 0.774]], [0.583, [0.274, 0.597, 0.772]], [0.585, [0.274, 0.597, 0.772]], [0.587, [0.268, 0.594, 0.770]], [0.589, [0.268, 0.594, 0.770]], [0.591, [0.262, 0.590, 0.768]], [0.593, [0.262, 0.590, 0.768]], [0.595, [0.256, 0.587, 0.767]], [0.597, [0.256, 0.587, 0.767]], [0.599, [0.250, 0.584, 0.765]], [0.601, [0.250, 0.584, 0.765]], [0.603, [0.244, 0.581, 0.763]], [0.605, [0.244, 0.581, 0.763]], [0.607, [0.238, 0.578, 0.761]], [0.609, [0.238, 0.578, 0.761]], [0.611, [0.232, 0.575, 0.759]], [0.613, [0.232, 0.575, 0.759]], [0.614, [0.226, 0.572, 0.757]], [0.616, [0.226, 0.572, 0.757]], [0.618, [0.220, 0.569, 0.755]], [0.620, [0.220, 0.569, 0.755]], [0.622, [0.214, 0.566, 0.754]], [0.624, [0.214, 0.566, 0.754]], [0.626, [0.208, 0.564, 0.749]], [0.628, [0.208, 0.564, 0.749]], [0.630, [0.201, 0.562, 0.742]], [0.632, [0.201, 0.562, 0.742]], [0.634, [0.195, 0.560, 0.736]], [0.636, [0.195, 0.560, 0.736]], [0.638, [0.189, 0.558, 0.729]], [0.640, [0.189, 0.558, 0.729]], [0.642, [0.182, 0.556, 0.722]], [0.644, [0.182, 0.556, 0.722]], [0.646, [0.176, 0.554, 0.716]], [0.648, [0.176, 0.554, 0.716]], [0.650, [0.169, 0.552, 0.709]], [0.652, [0.169, 0.552, 0.709]], [0.654, [0.163, 0.551, 0.702]], [0.656, [0.163, 0.551, 0.702]], [0.658, [0.157, 0.549, 0.696]], [0.659, [0.157, 0.549, 0.696]], [0.661, [0.150, 0.547, 0.689]], [0.663, [0.150, 0.547, 0.689]], [0.665, [0.144, 0.545, 0.682]], [0.667, [0.144, 0.545, 0.682]], [0.669, [0.137, 0.543, 0.676]], [0.671, [0.137, 0.543, 0.676]], [0.673, [0.131, 0.541, 0.669]], [0.675, [0.131, 0.541, 0.669]], [0.677, [0.125, 0.540, 0.662]], [0.679, [0.125, 0.540, 0.662]], [0.681, [0.118, 0.538, 0.656]], [0.683, [0.118, 0.538, 0.656]], [0.685, [0.112, 0.536, 0.649]], [0.687, [0.112, 0.536, 0.649]], [0.689, [0.105, 0.534, 0.642]], [0.691, [0.105, 0.534, 0.642]], [0.693, [0.099, 0.532, 0.636]], [0.695, [0.099, 0.532, 0.636]], [0.697, [0.093, 0.530, 0.629]], [0.699, [0.093, 0.530, 0.629]], [0.701, [0.086, 0.528, 0.623]], [0.703, [0.086, 0.528, 0.623]], [0.705, [0.080, 0.527, 0.616]], [0.706, [0.080, 0.527, 0.616]], [0.708, [0.073, 0.525, 0.609]], [0.710, [0.073, 0.525, 0.609]], [0.712, [0.067, 0.523, 0.603]], [0.714, [0.067, 0.523, 0.603]], [0.716, [0.061, 0.521, 0.596]], [0.718, [0.061, 0.521, 0.596]], [0.720, [0.054, 0.519, 0.589]], [0.722, [0.054, 0.519, 0.589]], [0.724, [0.048, 0.517, 0.583]], [0.726, [0.048, 0.517, 0.583]], [0.728, [0.041, 0.516, 0.576]], [0.730, [0.041, 0.516, 0.576]], [0.732, [0.035, 0.514, 0.569]], [0.734, [0.035, 0.514, 0.569]], [0.736, [0.029, 0.512, 0.563]], [0.738, [0.029, 0.512, 0.563]], [0.740, [0.022, 0.510, 0.556]], [0.742, [0.022, 0.510, 0.556]], [0.744, [0.016, 0.508, 0.549]], [0.746, [0.016, 0.508, 0.549]], [0.748, [0.009, 0.506, 0.543]], [0.750, [0.009, 0.506, 0.543]], [0.751, [0.008, 0.504, 0.537]], [0.753, [0.008, 0.504, 0.537]], [0.755, [0.008, 0.501, 0.531]], [0.757, [0.008, 0.501, 0.531]], [0.759, [0.008, 0.499, 0.525]], [0.761, [0.008, 0.499, 0.525]], [0.763, [0.007, 0.496, 0.519]], [0.765, [0.007, 0.496, 0.519]], [0.767, [0.007, 0.494, 0.513]], [0.769, [0.007, 0.494, 0.513]], [0.771, [0.007, 0.491, 0.507]], [0.773, [0.007, 0.491, 0.507]], [0.775, [0.007, 0.488, 0.500]], [0.777, [0.007, 0.488, 0.500]], [0.779, [0.007, 0.486, 0.494]], [0.781, [0.007, 0.486, 0.494]], [0.783, [0.007, 0.483, 0.488]], [0.785, [0.007, 0.483, 0.488]], [0.787, [0.007, 0.481, 0.482]], [0.789, [0.007, 0.481, 0.482]], [0.791, [0.007, 0.478, 0.476]], [0.793, [0.007, 0.478, 0.476]], [0.795, [0.006, 0.476, 0.470]], [0.796, [0.006, 0.476, 0.470]], [0.798, [0.006, 0.473, 0.464]], [0.800, [0.006, 0.473, 0.464]], [0.802, [0.006, 0.470, 0.458]], [0.804, [0.006, 0.470, 0.458]], [0.806, [0.006, 0.468, 0.452]], [0.808, [0.006, 0.468, 0.452]], [0.810, [0.006, 0.465, 0.446]], [0.812, [0.006, 0.465, 0.446]], [0.814, [0.006, 0.463, 0.440]], [0.816, [0.006, 0.463, 0.440]], [0.818, [0.006, 0.460, 0.434]], [0.820, [0.006, 0.460, 0.434]], [0.822, [0.006, 0.457, 0.428]], [0.824, [0.006, 0.457, 0.428]], [0.826, [0.005, 0.455, 0.422]], [0.828, [0.005, 0.455, 0.422]], [0.830, [0.005, 0.452, 0.416]], [0.832, [0.005, 0.452, 0.416]], [0.834, [0.005, 0.450, 0.410]], [0.836, [0.005, 0.450, 0.410]], [0.838, [0.005, 0.447, 0.404]], [0.840, [0.005, 0.447, 0.404]], [0.841, [0.005, 0.445, 0.398]], [0.843, [0.005, 0.445, 0.398]], [0.845, [0.005, 0.442, 0.392]], [0.847, [0.005, 0.442, 0.392]], [0.849, [0.005, 0.439, 0.386]], [0.851, [0.005, 0.439, 0.386]], [0.853, [0.005, 0.437, 0.380]], [0.855, [0.005, 0.437, 0.380]], [0.857, [0.004, 0.434, 0.374]], [0.859, [0.004, 0.434, 0.374]], [0.861, [0.004, 0.432, 0.368]], [0.863, [0.004, 0.432, 0.368]], [0.865, [0.004, 0.429, 0.362]], [0.867, [0.004, 0.429, 0.362]], [0.869, [0.004, 0.426, 0.356]], [0.871, [0.004, 0.426, 0.356]], [0.873, [0.004, 0.424, 0.350]], [0.875, [0.004, 0.424, 0.350]], [0.877, [0.004, 0.419, 0.345]], [0.879, [0.004, 0.419, 0.345]], [0.881, [0.004, 0.415, 0.341]], [0.883, [0.004, 0.415, 0.341]], [0.885, [0.004, 0.410, 0.337]], [0.886, [0.004, 0.410, 0.337]], [0.888, [0.004, 0.405, 0.332]], [0.890, [0.004, 0.405, 0.332]], [0.892, [0.004, 0.401, 0.328]], [0.894, [0.004, 0.401, 0.328]], [0.896, [0.004, 0.396, 0.324]], [0.898, [0.004, 0.396, 0.324]], [0.900, [0.004, 0.391, 0.319]], [0.902, [0.004, 0.391, 0.319]], [0.904, [0.004, 0.387, 0.315]], [0.906, [0.004, 0.387, 0.315]], [0.908, [0.004, 0.382, 0.311]], [0.910, [0.004, 0.382, 0.311]], [0.912, [0.004, 0.377, 0.306]], [0.914, [0.004, 0.377, 0.306]], [0.916, [0.004, 0.373, 0.302]], [0.918, [0.004, 0.373, 0.302]], [0.920, [0.004, 0.368, 0.298]], [0.922, [0.004, 0.368, 0.298]], [0.924, [0.004, 0.363, 0.294]], [0.926, [0.004, 0.363, 0.294]], [0.928, [0.004, 0.359, 0.289]], [0.930, [0.004, 0.359, 0.289]], [0.932, [0.004, 0.354, 0.285]], [0.933, [0.004, 0.354, 0.285]], [0.935, [0.004, 0.349, 0.281]], [0.937, [0.004, 0.349, 0.281]], [0.939, [0.004, 0.345, 0.276]], [0.941, [0.004, 0.345, 0.276]], [0.943, [0.004, 0.340, 0.272]], [0.945, [0.004, 0.340, 0.272]], [0.947, [0.004, 0.335, 0.268]], [0.949, [0.004, 0.335, 0.268]], [0.951, [0.004, 0.331, 0.263]], [0.953, [0.004, 0.331, 0.263]], [0.955, [0.004, 0.326, 0.259]], [0.957, [0.004, 0.326, 0.259]], [0.959, [0.004, 0.321, 0.255]], [0.961, [0.004, 0.321, 0.255]], [0.963, [0.004, 0.317, 0.251]], [0.965, [0.004, 0.317, 0.251]], [0.967, [0.004, 0.312, 0.246]], [0.969, [0.004, 0.312, 0.246]], [0.971, [0.004, 0.307, 0.242]], [0.973, [0.004, 0.307, 0.242]], [0.975, [0.004, 0.303, 0.238]], [0.977, [0.004, 0.303, 0.238]], [0.978, [0.004, 0.298, 0.233]], [0.980, [0.004, 0.298, 0.233]], [0.982, [0.004, 0.293, 0.229]], [0.984, [0.004, 0.293, 0.229]], [0.986, [0.004, 0.289, 0.225]], [0.988, [0.004, 0.289, 0.225]], [0.990, [0.004, 0.284, 0.220]], [0.992, [0.004, 0.284, 0.220]], [0.994, [0.004, 0.279, 0.216]], [0.996, [0.004, 0.279, 0.216]], [0.998, [0.004, 0.275, 0.212]], [1.000, [0.004, 0.275, 0.212]]]; +var PuRd = [[0.000, [0.969, 0.957, 0.976]], [0.002, [0.969, 0.957, 0.976]], [0.004, [0.967, 0.955, 0.975]], [0.006, [0.967, 0.955, 0.975]], [0.008, [0.965, 0.952, 0.974]], [0.010, [0.965, 0.952, 0.974]], [0.012, [0.963, 0.950, 0.973]], [0.014, [0.963, 0.950, 0.973]], [0.016, [0.961, 0.948, 0.972]], [0.018, [0.961, 0.948, 0.972]], [0.020, [0.959, 0.945, 0.970]], [0.022, [0.959, 0.945, 0.970]], [0.023, [0.957, 0.943, 0.969]], [0.025, [0.957, 0.943, 0.969]], [0.027, [0.955, 0.940, 0.968]], [0.029, [0.955, 0.940, 0.968]], [0.031, [0.953, 0.938, 0.967]], [0.033, [0.953, 0.938, 0.967]], [0.035, [0.951, 0.936, 0.965]], [0.037, [0.951, 0.936, 0.965]], [0.039, [0.949, 0.933, 0.964]], [0.041, [0.949, 0.933, 0.964]], [0.043, [0.947, 0.931, 0.963]], [0.045, [0.947, 0.931, 0.963]], [0.047, [0.945, 0.929, 0.962]], [0.049, [0.945, 0.929, 0.962]], [0.051, [0.943, 0.926, 0.960]], [0.053, [0.943, 0.926, 0.960]], [0.055, [0.941, 0.924, 0.959]], [0.057, [0.941, 0.924, 0.959]], [0.059, [0.939, 0.922, 0.958]], [0.061, [0.939, 0.922, 0.958]], [0.063, [0.937, 0.919, 0.957]], [0.065, [0.937, 0.919, 0.957]], [0.067, [0.935, 0.917, 0.956]], [0.068, [0.935, 0.917, 0.956]], [0.070, [0.933, 0.915, 0.954]], [0.072, [0.933, 0.915, 0.954]], [0.074, [0.931, 0.912, 0.953]], [0.076, [0.931, 0.912, 0.953]], [0.078, [0.929, 0.910, 0.952]], [0.080, [0.929, 0.910, 0.952]], [0.082, [0.927, 0.908, 0.951]], [0.084, [0.927, 0.908, 0.951]], [0.086, [0.925, 0.905, 0.949]], [0.088, [0.925, 0.905, 0.949]], [0.090, [0.923, 0.903, 0.948]], [0.092, [0.923, 0.903, 0.948]], [0.094, [0.921, 0.901, 0.947]], [0.096, [0.921, 0.901, 0.947]], [0.098, [0.919, 0.898, 0.946]], [0.100, [0.919, 0.898, 0.946]], [0.102, [0.917, 0.896, 0.944]], [0.104, [0.917, 0.896, 0.944]], [0.106, [0.915, 0.894, 0.943]], [0.108, [0.915, 0.894, 0.943]], [0.110, [0.914, 0.891, 0.942]], [0.112, [0.914, 0.891, 0.942]], [0.114, [0.912, 0.889, 0.941]], [0.115, [0.912, 0.889, 0.941]], [0.117, [0.910, 0.887, 0.940]], [0.119, [0.910, 0.887, 0.940]], [0.121, [0.908, 0.884, 0.938]], [0.123, [0.908, 0.884, 0.938]], [0.125, [0.906, 0.882, 0.937]], [0.127, [0.906, 0.882, 0.937]], [0.129, [0.903, 0.877, 0.934]], [0.131, [0.903, 0.877, 0.934]], [0.133, [0.901, 0.872, 0.932]], [0.135, [0.901, 0.872, 0.932]], [0.137, [0.899, 0.867, 0.929]], [0.139, [0.899, 0.867, 0.929]], [0.141, [0.896, 0.862, 0.927]], [0.143, [0.896, 0.862, 0.927]], [0.145, [0.894, 0.857, 0.924]], [0.147, [0.894, 0.857, 0.924]], [0.149, [0.892, 0.852, 0.921]], [0.151, [0.892, 0.852, 0.921]], [0.153, [0.889, 0.847, 0.919]], [0.155, [0.889, 0.847, 0.919]], [0.157, [0.887, 0.842, 0.916]], [0.159, [0.887, 0.842, 0.916]], [0.160, [0.885, 0.837, 0.914]], [0.162, [0.885, 0.837, 0.914]], [0.164, [0.882, 0.833, 0.911]], [0.166, [0.882, 0.833, 0.911]], [0.168, [0.880, 0.828, 0.909]], [0.170, [0.880, 0.828, 0.909]], [0.172, [0.878, 0.823, 0.906]], [0.174, [0.878, 0.823, 0.906]], [0.176, [0.875, 0.818, 0.903]], [0.178, [0.875, 0.818, 0.903]], [0.180, [0.873, 0.813, 0.901]], [0.182, [0.873, 0.813, 0.901]], [0.184, [0.871, 0.808, 0.898]], [0.186, [0.871, 0.808, 0.898]], [0.188, [0.868, 0.803, 0.896]], [0.190, [0.868, 0.803, 0.896]], [0.192, [0.866, 0.798, 0.893]], [0.194, [0.866, 0.798, 0.893]], [0.196, [0.864, 0.793, 0.890]], [0.198, [0.864, 0.793, 0.890]], [0.200, [0.861, 0.788, 0.888]], [0.202, [0.861, 0.788, 0.888]], [0.204, [0.859, 0.783, 0.885]], [0.205, [0.859, 0.783, 0.885]], [0.207, [0.857, 0.778, 0.883]], [0.209, [0.857, 0.778, 0.883]], [0.211, [0.854, 0.773, 0.880]], [0.213, [0.854, 0.773, 0.880]], [0.215, [0.852, 0.769, 0.878]], [0.217, [0.852, 0.769, 0.878]], [0.219, [0.849, 0.764, 0.875]], [0.221, [0.849, 0.764, 0.875]], [0.223, [0.847, 0.759, 0.872]], [0.225, [0.847, 0.759, 0.872]], [0.227, [0.845, 0.754, 0.870]], [0.229, [0.845, 0.754, 0.870]], [0.231, [0.842, 0.749, 0.867]], [0.233, [0.842, 0.749, 0.867]], [0.235, [0.840, 0.744, 0.865]], [0.237, [0.840, 0.744, 0.865]], [0.239, [0.838, 0.739, 0.862]], [0.241, [0.838, 0.739, 0.862]], [0.243, [0.835, 0.734, 0.859]], [0.245, [0.835, 0.734, 0.859]], [0.247, [0.833, 0.729, 0.857]], [0.249, [0.833, 0.729, 0.857]], [0.250, [0.831, 0.724, 0.854]], [0.252, [0.831, 0.724, 0.854]], [0.254, [0.830, 0.720, 0.852]], [0.256, [0.830, 0.720, 0.852]], [0.258, [0.828, 0.715, 0.850]], [0.260, [0.828, 0.715, 0.850]], [0.262, [0.827, 0.711, 0.847]], [0.264, [0.827, 0.711, 0.847]], [0.266, [0.826, 0.706, 0.845]], [0.268, [0.826, 0.706, 0.845]], [0.270, [0.824, 0.702, 0.843]], [0.272, [0.824, 0.702, 0.843]], [0.274, [0.823, 0.697, 0.840]], [0.276, [0.823, 0.697, 0.840]], [0.278, [0.822, 0.692, 0.838]], [0.280, [0.822, 0.692, 0.838]], [0.282, [0.820, 0.688, 0.836]], [0.284, [0.820, 0.688, 0.836]], [0.286, [0.819, 0.683, 0.833]], [0.288, [0.819, 0.683, 0.833]], [0.290, [0.818, 0.679, 0.831]], [0.292, [0.818, 0.679, 0.831]], [0.294, [0.816, 0.674, 0.829]], [0.295, [0.816, 0.674, 0.829]], [0.297, [0.815, 0.670, 0.826]], [0.299, [0.815, 0.670, 0.826]], [0.301, [0.813, 0.665, 0.824]], [0.303, [0.813, 0.665, 0.824]], [0.305, [0.812, 0.661, 0.822]], [0.307, [0.812, 0.661, 0.822]], [0.309, [0.811, 0.656, 0.819]], [0.311, [0.811, 0.656, 0.819]], [0.313, [0.809, 0.652, 0.817]], [0.315, [0.809, 0.652, 0.817]], [0.317, [0.808, 0.647, 0.815]], [0.319, [0.808, 0.647, 0.815]], [0.321, [0.807, 0.642, 0.812]], [0.323, [0.807, 0.642, 0.812]], [0.325, [0.805, 0.638, 0.810]], [0.327, [0.805, 0.638, 0.810]], [0.329, [0.804, 0.633, 0.808]], [0.331, [0.804, 0.633, 0.808]], [0.333, [0.803, 0.629, 0.805]], [0.335, [0.803, 0.629, 0.805]], [0.337, [0.801, 0.624, 0.803]], [0.339, [0.801, 0.624, 0.803]], [0.341, [0.800, 0.620, 0.801]], [0.342, [0.800, 0.620, 0.801]], [0.344, [0.799, 0.615, 0.798]], [0.346, [0.799, 0.615, 0.798]], [0.348, [0.797, 0.611, 0.796]], [0.350, [0.797, 0.611, 0.796]], [0.352, [0.796, 0.606, 0.794]], [0.354, [0.796, 0.606, 0.794]], [0.356, [0.794, 0.601, 0.791]], [0.358, [0.794, 0.601, 0.791]], [0.360, [0.793, 0.597, 0.789]], [0.362, [0.793, 0.597, 0.789]], [0.364, [0.792, 0.592, 0.787]], [0.366, [0.792, 0.592, 0.787]], [0.368, [0.790, 0.588, 0.784]], [0.370, [0.790, 0.588, 0.784]], [0.372, [0.789, 0.583, 0.782]], [0.374, [0.789, 0.583, 0.782]], [0.376, [0.789, 0.578, 0.779]], [0.378, [0.789, 0.578, 0.779]], [0.380, [0.792, 0.572, 0.777]], [0.382, [0.792, 0.572, 0.777]], [0.384, [0.795, 0.567, 0.774]], [0.386, [0.795, 0.567, 0.774]], [0.387, [0.797, 0.561, 0.771]], [0.389, [0.797, 0.561, 0.771]], [0.391, [0.800, 0.555, 0.768]], [0.393, [0.800, 0.555, 0.768]], [0.395, [0.803, 0.549, 0.765]], [0.397, [0.803, 0.549, 0.765]], [0.399, [0.805, 0.544, 0.762]], [0.401, [0.805, 0.544, 0.762]], [0.403, [0.808, 0.538, 0.760]], [0.405, [0.808, 0.538, 0.760]], [0.407, [0.811, 0.532, 0.757]], [0.409, [0.811, 0.532, 0.757]], [0.411, [0.814, 0.526, 0.754]], [0.413, [0.814, 0.526, 0.754]], [0.415, [0.816, 0.520, 0.751]], [0.417, [0.816, 0.520, 0.751]], [0.419, [0.819, 0.515, 0.748]], [0.421, [0.819, 0.515, 0.748]], [0.423, [0.822, 0.509, 0.745]], [0.425, [0.822, 0.509, 0.745]], [0.427, [0.824, 0.503, 0.743]], [0.429, [0.824, 0.503, 0.743]], [0.431, [0.827, 0.497, 0.740]], [0.432, [0.827, 0.497, 0.740]], [0.434, [0.830, 0.491, 0.737]], [0.436, [0.830, 0.491, 0.737]], [0.438, [0.833, 0.486, 0.734]], [0.440, [0.833, 0.486, 0.734]], [0.442, [0.835, 0.480, 0.731]], [0.444, [0.835, 0.480, 0.731]], [0.446, [0.838, 0.474, 0.728]], [0.448, [0.838, 0.474, 0.728]], [0.450, [0.841, 0.468, 0.726]], [0.452, [0.841, 0.468, 0.726]], [0.454, [0.843, 0.463, 0.723]], [0.456, [0.843, 0.463, 0.723]], [0.458, [0.846, 0.457, 0.720]], [0.460, [0.846, 0.457, 0.720]], [0.462, [0.849, 0.451, 0.717]], [0.464, [0.849, 0.451, 0.717]], [0.466, [0.852, 0.445, 0.714]], [0.468, [0.852, 0.445, 0.714]], [0.470, [0.854, 0.439, 0.711]], [0.472, [0.854, 0.439, 0.711]], [0.474, [0.857, 0.434, 0.709]], [0.476, [0.857, 0.434, 0.709]], [0.477, [0.860, 0.428, 0.706]], [0.479, [0.860, 0.428, 0.706]], [0.481, [0.862, 0.422, 0.703]], [0.483, [0.862, 0.422, 0.703]], [0.485, [0.865, 0.416, 0.700]], [0.487, [0.865, 0.416, 0.700]], [0.489, [0.868, 0.411, 0.697]], [0.491, [0.868, 0.411, 0.697]], [0.493, [0.870, 0.405, 0.694]], [0.495, [0.870, 0.405, 0.694]], [0.497, [0.873, 0.399, 0.692]], [0.499, [0.873, 0.399, 0.692]], [0.501, [0.875, 0.392, 0.688]], [0.503, [0.875, 0.392, 0.688]], [0.505, [0.876, 0.385, 0.683]], [0.507, [0.876, 0.385, 0.683]], [0.509, [0.877, 0.378, 0.679]], [0.511, [0.877, 0.378, 0.679]], [0.513, [0.878, 0.370, 0.674]], [0.515, [0.878, 0.370, 0.674]], [0.517, [0.879, 0.363, 0.669]], [0.519, [0.879, 0.363, 0.669]], [0.521, [0.880, 0.355, 0.664]], [0.523, [0.880, 0.355, 0.664]], [0.524, [0.881, 0.348, 0.660]], [0.526, [0.881, 0.348, 0.660]], [0.528, [0.882, 0.341, 0.655]], [0.530, [0.882, 0.341, 0.655]], [0.532, [0.883, 0.333, 0.650]], [0.534, [0.883, 0.333, 0.650]], [0.536, [0.884, 0.326, 0.646]], [0.538, [0.884, 0.326, 0.646]], [0.540, [0.885, 0.319, 0.641]], [0.542, [0.885, 0.319, 0.641]], [0.544, [0.886, 0.311, 0.636]], [0.546, [0.886, 0.311, 0.636]], [0.548, [0.887, 0.304, 0.632]], [0.550, [0.887, 0.304, 0.632]], [0.552, [0.888, 0.296, 0.627]], [0.554, [0.888, 0.296, 0.627]], [0.556, [0.889, 0.289, 0.622]], [0.558, [0.889, 0.289, 0.622]], [0.560, [0.890, 0.282, 0.618]], [0.562, [0.890, 0.282, 0.618]], [0.564, [0.891, 0.274, 0.613]], [0.566, [0.891, 0.274, 0.613]], [0.568, [0.892, 0.267, 0.608]], [0.569, [0.892, 0.267, 0.608]], [0.571, [0.893, 0.260, 0.604]], [0.573, [0.893, 0.260, 0.604]], [0.575, [0.894, 0.252, 0.599]], [0.577, [0.894, 0.252, 0.599]], [0.579, [0.895, 0.245, 0.594]], [0.581, [0.895, 0.245, 0.594]], [0.583, [0.896, 0.237, 0.590]], [0.585, [0.896, 0.237, 0.590]], [0.587, [0.897, 0.230, 0.585]], [0.589, [0.897, 0.230, 0.585]], [0.591, [0.898, 0.223, 0.580]], [0.593, [0.898, 0.223, 0.580]], [0.595, [0.899, 0.215, 0.576]], [0.597, [0.899, 0.215, 0.576]], [0.599, [0.900, 0.208, 0.571]], [0.601, [0.900, 0.208, 0.571]], [0.603, [0.901, 0.200, 0.566]], [0.605, [0.901, 0.200, 0.566]], [0.607, [0.902, 0.193, 0.562]], [0.609, [0.902, 0.193, 0.562]], [0.611, [0.903, 0.186, 0.557]], [0.613, [0.903, 0.186, 0.557]], [0.614, [0.904, 0.178, 0.552]], [0.616, [0.904, 0.178, 0.552]], [0.618, [0.905, 0.171, 0.548]], [0.620, [0.905, 0.171, 0.548]], [0.622, [0.906, 0.164, 0.543]], [0.624, [0.906, 0.164, 0.543]], [0.626, [0.904, 0.159, 0.537]], [0.628, [0.904, 0.159, 0.537]], [0.630, [0.901, 0.156, 0.531]], [0.632, [0.901, 0.156, 0.531]], [0.634, [0.898, 0.153, 0.524]], [0.636, [0.898, 0.153, 0.524]], [0.638, [0.895, 0.151, 0.518]], [0.640, [0.895, 0.151, 0.518]], [0.642, [0.892, 0.148, 0.512]], [0.644, [0.892, 0.148, 0.512]], [0.646, [0.889, 0.145, 0.505]], [0.648, [0.889, 0.145, 0.505]], [0.650, [0.886, 0.142, 0.499]], [0.652, [0.886, 0.142, 0.499]], [0.654, [0.882, 0.139, 0.492]], [0.656, [0.882, 0.139, 0.492]], [0.658, [0.879, 0.136, 0.486]], [0.659, [0.879, 0.136, 0.486]], [0.661, [0.876, 0.134, 0.480]], [0.663, [0.876, 0.134, 0.480]], [0.665, [0.873, 0.131, 0.473]], [0.667, [0.873, 0.131, 0.473]], [0.669, [0.870, 0.128, 0.467]], [0.671, [0.870, 0.128, 0.467]], [0.673, [0.867, 0.125, 0.460]], [0.675, [0.867, 0.125, 0.460]], [0.677, [0.864, 0.122, 0.454]], [0.679, [0.864, 0.122, 0.454]], [0.681, [0.861, 0.119, 0.448]], [0.683, [0.861, 0.119, 0.448]], [0.685, [0.858, 0.117, 0.441]], [0.687, [0.858, 0.117, 0.441]], [0.689, [0.855, 0.114, 0.435]], [0.691, [0.855, 0.114, 0.435]], [0.693, [0.852, 0.111, 0.428]], [0.695, [0.852, 0.111, 0.428]], [0.697, [0.849, 0.108, 0.422]], [0.699, [0.849, 0.108, 0.422]], [0.701, [0.846, 0.105, 0.416]], [0.703, [0.846, 0.105, 0.416]], [0.705, [0.842, 0.102, 0.409]], [0.706, [0.842, 0.102, 0.409]], [0.708, [0.839, 0.100, 0.403]], [0.710, [0.839, 0.100, 0.403]], [0.712, [0.836, 0.097, 0.396]], [0.714, [0.836, 0.097, 0.396]], [0.716, [0.833, 0.094, 0.390]], [0.718, [0.833, 0.094, 0.390]], [0.720, [0.830, 0.091, 0.384]], [0.722, [0.830, 0.091, 0.384]], [0.724, [0.827, 0.088, 0.377]], [0.726, [0.827, 0.088, 0.377]], [0.728, [0.824, 0.085, 0.371]], [0.730, [0.824, 0.085, 0.371]], [0.732, [0.821, 0.083, 0.364]], [0.734, [0.821, 0.083, 0.364]], [0.736, [0.818, 0.080, 0.358]], [0.738, [0.818, 0.080, 0.358]], [0.740, [0.815, 0.077, 0.352]], [0.742, [0.815, 0.077, 0.352]], [0.744, [0.812, 0.074, 0.345]], [0.746, [0.812, 0.074, 0.345]], [0.748, [0.809, 0.071, 0.339]], [0.750, [0.809, 0.071, 0.339]], [0.751, [0.803, 0.069, 0.336]], [0.753, [0.803, 0.069, 0.336]], [0.755, [0.796, 0.067, 0.333]], [0.757, [0.796, 0.067, 0.333]], [0.759, [0.790, 0.064, 0.331]], [0.761, [0.790, 0.064, 0.331]], [0.763, [0.783, 0.062, 0.328]], [0.765, [0.783, 0.062, 0.328]], [0.767, [0.776, 0.060, 0.326]], [0.769, [0.776, 0.060, 0.326]], [0.771, [0.770, 0.058, 0.324]], [0.773, [0.770, 0.058, 0.324]], [0.775, [0.763, 0.056, 0.321]], [0.777, [0.763, 0.056, 0.321]], [0.779, [0.756, 0.053, 0.319]], [0.781, [0.756, 0.053, 0.319]], [0.783, [0.750, 0.051, 0.317]], [0.785, [0.750, 0.051, 0.317]], [0.787, [0.743, 0.049, 0.314]], [0.789, [0.743, 0.049, 0.314]], [0.791, [0.736, 0.047, 0.312]], [0.793, [0.736, 0.047, 0.312]], [0.795, [0.730, 0.045, 0.310]], [0.796, [0.730, 0.045, 0.310]], [0.798, [0.723, 0.042, 0.307]], [0.800, [0.723, 0.042, 0.307]], [0.802, [0.716, 0.040, 0.305]], [0.804, [0.716, 0.040, 0.305]], [0.806, [0.710, 0.038, 0.303]], [0.808, [0.710, 0.038, 0.303]], [0.810, [0.703, 0.036, 0.300]], [0.812, [0.703, 0.036, 0.300]], [0.814, [0.697, 0.033, 0.298]], [0.816, [0.697, 0.033, 0.298]], [0.818, [0.690, 0.031, 0.296]], [0.820, [0.690, 0.031, 0.296]], [0.822, [0.683, 0.029, 0.293]], [0.824, [0.683, 0.029, 0.293]], [0.826, [0.677, 0.027, 0.291]], [0.828, [0.677, 0.027, 0.291]], [0.830, [0.670, 0.025, 0.289]], [0.832, [0.670, 0.025, 0.289]], [0.834, [0.663, 0.022, 0.286]], [0.836, [0.663, 0.022, 0.286]], [0.838, [0.657, 0.020, 0.284]], [0.840, [0.657, 0.020, 0.284]], [0.841, [0.650, 0.018, 0.282]], [0.843, [0.650, 0.018, 0.282]], [0.845, [0.643, 0.016, 0.279]], [0.847, [0.643, 0.016, 0.279]], [0.849, [0.637, 0.014, 0.277]], [0.851, [0.637, 0.014, 0.277]], [0.853, [0.630, 0.011, 0.275]], [0.855, [0.630, 0.011, 0.275]], [0.857, [0.623, 0.009, 0.272]], [0.859, [0.623, 0.009, 0.272]], [0.861, [0.617, 0.007, 0.270]], [0.863, [0.617, 0.007, 0.270]], [0.865, [0.610, 0.005, 0.268]], [0.867, [0.610, 0.005, 0.268]], [0.869, [0.604, 0.002, 0.265]], [0.871, [0.604, 0.002, 0.265]], [0.873, [0.597, 0.000, 0.263]], [0.875, [0.597, 0.000, 0.263]], [0.877, [0.591, 0.000, 0.259]], [0.879, [0.591, 0.000, 0.259]], [0.881, [0.585, 0.000, 0.254]], [0.883, [0.585, 0.000, 0.254]], [0.885, [0.579, 0.000, 0.250]], [0.886, [0.579, 0.000, 0.250]], [0.888, [0.573, 0.000, 0.246]], [0.890, [0.573, 0.000, 0.246]], [0.892, [0.567, 0.000, 0.241]], [0.894, [0.567, 0.000, 0.241]], [0.896, [0.561, 0.000, 0.237]], [0.898, [0.561, 0.000, 0.237]], [0.900, [0.555, 0.000, 0.232]], [0.902, [0.555, 0.000, 0.232]], [0.904, [0.549, 0.000, 0.228]], [0.906, [0.549, 0.000, 0.228]], [0.908, [0.543, 0.000, 0.223]], [0.910, [0.543, 0.000, 0.223]], [0.912, [0.537, 0.000, 0.219]], [0.914, [0.537, 0.000, 0.219]], [0.916, [0.531, 0.000, 0.215]], [0.918, [0.531, 0.000, 0.215]], [0.920, [0.524, 0.000, 0.210]], [0.922, [0.524, 0.000, 0.210]], [0.924, [0.518, 0.000, 0.206]], [0.926, [0.518, 0.000, 0.206]], [0.928, [0.512, 0.000, 0.201]], [0.930, [0.512, 0.000, 0.201]], [0.932, [0.506, 0.000, 0.197]], [0.933, [0.506, 0.000, 0.197]], [0.935, [0.500, 0.000, 0.192]], [0.937, [0.500, 0.000, 0.192]], [0.939, [0.494, 0.000, 0.188]], [0.941, [0.494, 0.000, 0.188]], [0.943, [0.488, 0.000, 0.184]], [0.945, [0.488, 0.000, 0.184]], [0.947, [0.482, 0.000, 0.179]], [0.949, [0.482, 0.000, 0.179]], [0.951, [0.476, 0.000, 0.175]], [0.953, [0.476, 0.000, 0.175]], [0.955, [0.470, 0.000, 0.170]], [0.957, [0.470, 0.000, 0.170]], [0.959, [0.464, 0.000, 0.166]], [0.961, [0.464, 0.000, 0.166]], [0.963, [0.458, 0.000, 0.161]], [0.965, [0.458, 0.000, 0.161]], [0.967, [0.452, 0.000, 0.157]], [0.969, [0.452, 0.000, 0.157]], [0.971, [0.446, 0.000, 0.153]], [0.973, [0.446, 0.000, 0.153]], [0.975, [0.440, 0.000, 0.148]], [0.977, [0.440, 0.000, 0.148]], [0.978, [0.434, 0.000, 0.144]], [0.980, [0.434, 0.000, 0.144]], [0.982, [0.428, 0.000, 0.139]], [0.984, [0.428, 0.000, 0.139]], [0.986, [0.422, 0.000, 0.135]], [0.988, [0.422, 0.000, 0.135]], [0.990, [0.416, 0.000, 0.130]], [0.992, [0.416, 0.000, 0.130]], [0.994, [0.410, 0.000, 0.126]], [0.996, [0.410, 0.000, 0.126]], [0.998, [0.404, 0.000, 0.122]], [1.000, [0.404, 0.000, 0.122]]]; +var Purples = [[0.000, [0.988, 0.984, 0.992]], [0.002, [0.988, 0.984, 0.992]], [0.004, [0.987, 0.983, 0.991]], [0.006, [0.987, 0.983, 0.991]], [0.008, [0.985, 0.981, 0.990]], [0.010, [0.985, 0.981, 0.990]], [0.012, [0.983, 0.979, 0.989]], [0.014, [0.983, 0.979, 0.989]], [0.016, [0.982, 0.977, 0.988]], [0.018, [0.982, 0.977, 0.988]], [0.020, [0.980, 0.976, 0.987]], [0.022, [0.980, 0.976, 0.987]], [0.023, [0.979, 0.974, 0.986]], [0.025, [0.979, 0.974, 0.986]], [0.027, [0.977, 0.972, 0.985]], [0.029, [0.977, 0.972, 0.985]], [0.031, [0.975, 0.971, 0.984]], [0.033, [0.975, 0.971, 0.984]], [0.035, [0.974, 0.969, 0.983]], [0.037, [0.974, 0.969, 0.983]], [0.039, [0.972, 0.967, 0.982]], [0.041, [0.972, 0.967, 0.982]], [0.043, [0.971, 0.965, 0.981]], [0.045, [0.971, 0.965, 0.981]], [0.047, [0.969, 0.964, 0.980]], [0.049, [0.969, 0.964, 0.980]], [0.051, [0.967, 0.962, 0.979]], [0.053, [0.967, 0.962, 0.979]], [0.055, [0.966, 0.960, 0.978]], [0.057, [0.966, 0.960, 0.978]], [0.059, [0.964, 0.958, 0.977]], [0.061, [0.964, 0.958, 0.977]], [0.063, [0.963, 0.957, 0.976]], [0.065, [0.963, 0.957, 0.976]], [0.067, [0.961, 0.955, 0.975]], [0.068, [0.961, 0.955, 0.975]], [0.070, [0.959, 0.953, 0.974]], [0.072, [0.959, 0.953, 0.974]], [0.074, [0.958, 0.952, 0.973]], [0.076, [0.958, 0.952, 0.973]], [0.078, [0.956, 0.950, 0.972]], [0.080, [0.956, 0.950, 0.972]], [0.082, [0.955, 0.948, 0.971]], [0.084, [0.955, 0.948, 0.971]], [0.086, [0.953, 0.946, 0.971]], [0.088, [0.953, 0.946, 0.971]], [0.090, [0.951, 0.945, 0.970]], [0.092, [0.951, 0.945, 0.970]], [0.094, [0.950, 0.943, 0.969]], [0.096, [0.950, 0.943, 0.969]], [0.098, [0.948, 0.941, 0.968]], [0.100, [0.948, 0.941, 0.968]], [0.102, [0.947, 0.940, 0.967]], [0.104, [0.947, 0.940, 0.967]], [0.106, [0.945, 0.938, 0.966]], [0.108, [0.945, 0.938, 0.966]], [0.110, [0.943, 0.936, 0.965]], [0.112, [0.943, 0.936, 0.965]], [0.114, [0.942, 0.934, 0.964]], [0.115, [0.942, 0.934, 0.964]], [0.117, [0.940, 0.933, 0.963]], [0.119, [0.940, 0.933, 0.963]], [0.121, [0.939, 0.931, 0.962]], [0.123, [0.939, 0.931, 0.962]], [0.125, [0.937, 0.929, 0.961]], [0.127, [0.937, 0.929, 0.961]], [0.129, [0.934, 0.927, 0.959]], [0.131, [0.934, 0.927, 0.959]], [0.133, [0.932, 0.924, 0.958]], [0.135, [0.932, 0.924, 0.958]], [0.137, [0.929, 0.922, 0.957]], [0.139, [0.929, 0.922, 0.957]], [0.141, [0.927, 0.920, 0.956]], [0.143, [0.927, 0.920, 0.956]], [0.145, [0.924, 0.917, 0.954]], [0.147, [0.924, 0.917, 0.954]], [0.149, [0.921, 0.915, 0.953]], [0.151, [0.921, 0.915, 0.953]], [0.153, [0.919, 0.913, 0.952]], [0.155, [0.919, 0.913, 0.952]], [0.157, [0.916, 0.910, 0.951]], [0.159, [0.916, 0.910, 0.951]], [0.160, [0.914, 0.908, 0.950]], [0.162, [0.914, 0.908, 0.950]], [0.164, [0.911, 0.906, 0.948]], [0.166, [0.911, 0.906, 0.948]], [0.168, [0.909, 0.903, 0.947]], [0.170, [0.909, 0.903, 0.947]], [0.172, [0.906, 0.901, 0.946]], [0.174, [0.906, 0.901, 0.946]], [0.176, [0.903, 0.899, 0.945]], [0.178, [0.903, 0.899, 0.945]], [0.180, [0.901, 0.896, 0.943]], [0.182, [0.901, 0.896, 0.943]], [0.184, [0.898, 0.894, 0.942]], [0.186, [0.898, 0.894, 0.942]], [0.188, [0.896, 0.892, 0.941]], [0.190, [0.896, 0.892, 0.941]], [0.192, [0.893, 0.889, 0.940]], [0.194, [0.893, 0.889, 0.940]], [0.196, [0.890, 0.887, 0.938]], [0.198, [0.890, 0.887, 0.938]], [0.200, [0.888, 0.885, 0.937]], [0.202, [0.888, 0.885, 0.937]], [0.204, [0.885, 0.882, 0.936]], [0.205, [0.885, 0.882, 0.936]], [0.207, [0.883, 0.880, 0.935]], [0.209, [0.883, 0.880, 0.935]], [0.211, [0.880, 0.878, 0.934]], [0.213, [0.880, 0.878, 0.934]], [0.215, [0.878, 0.875, 0.932]], [0.217, [0.878, 0.875, 0.932]], [0.219, [0.875, 0.873, 0.931]], [0.221, [0.875, 0.873, 0.931]], [0.223, [0.872, 0.871, 0.930]], [0.225, [0.872, 0.871, 0.930]], [0.227, [0.870, 0.868, 0.929]], [0.229, [0.870, 0.868, 0.929]], [0.231, [0.867, 0.866, 0.927]], [0.233, [0.867, 0.866, 0.927]], [0.235, [0.865, 0.864, 0.926]], [0.237, [0.865, 0.864, 0.926]], [0.239, [0.862, 0.861, 0.925]], [0.241, [0.862, 0.861, 0.925]], [0.243, [0.859, 0.859, 0.924]], [0.245, [0.859, 0.859, 0.924]], [0.247, [0.857, 0.857, 0.922]], [0.249, [0.857, 0.857, 0.922]], [0.250, [0.854, 0.854, 0.921]], [0.252, [0.854, 0.854, 0.921]], [0.254, [0.850, 0.850, 0.919]], [0.256, [0.850, 0.850, 0.919]], [0.258, [0.847, 0.847, 0.917]], [0.260, [0.847, 0.847, 0.917]], [0.262, [0.843, 0.843, 0.916]], [0.264, [0.843, 0.843, 0.916]], [0.266, [0.839, 0.840, 0.914]], [0.268, [0.839, 0.840, 0.914]], [0.270, [0.836, 0.836, 0.912]], [0.272, [0.836, 0.836, 0.912]], [0.274, [0.832, 0.833, 0.910]], [0.276, [0.832, 0.833, 0.910]], [0.278, [0.828, 0.829, 0.908]], [0.280, [0.828, 0.829, 0.908]], [0.282, [0.824, 0.825, 0.906]], [0.284, [0.824, 0.825, 0.906]], [0.286, [0.821, 0.822, 0.904]], [0.288, [0.821, 0.822, 0.904]], [0.290, [0.817, 0.818, 0.903]], [0.292, [0.817, 0.818, 0.903]], [0.294, [0.813, 0.815, 0.901]], [0.295, [0.813, 0.815, 0.901]], [0.297, [0.810, 0.811, 0.899]], [0.299, [0.810, 0.811, 0.899]], [0.301, [0.806, 0.808, 0.897]], [0.303, [0.806, 0.808, 0.897]], [0.305, [0.802, 0.804, 0.895]], [0.307, [0.802, 0.804, 0.895]], [0.309, [0.799, 0.800, 0.893]], [0.311, [0.799, 0.800, 0.893]], [0.313, [0.795, 0.797, 0.892]], [0.315, [0.795, 0.797, 0.892]], [0.317, [0.791, 0.793, 0.890]], [0.319, [0.791, 0.793, 0.890]], [0.321, [0.788, 0.790, 0.888]], [0.323, [0.788, 0.790, 0.888]], [0.325, [0.784, 0.786, 0.886]], [0.327, [0.784, 0.786, 0.886]], [0.329, [0.780, 0.783, 0.884]], [0.331, [0.780, 0.783, 0.884]], [0.333, [0.776, 0.779, 0.882]], [0.335, [0.776, 0.779, 0.882]], [0.337, [0.773, 0.776, 0.881]], [0.339, [0.773, 0.776, 0.881]], [0.341, [0.769, 0.772, 0.879]], [0.342, [0.769, 0.772, 0.879]], [0.344, [0.765, 0.768, 0.877]], [0.346, [0.765, 0.768, 0.877]], [0.348, [0.762, 0.765, 0.875]], [0.350, [0.762, 0.765, 0.875]], [0.352, [0.758, 0.761, 0.873]], [0.354, [0.758, 0.761, 0.873]], [0.356, [0.754, 0.758, 0.871]], [0.358, [0.754, 0.758, 0.871]], [0.360, [0.751, 0.754, 0.869]], [0.362, [0.751, 0.754, 0.869]], [0.364, [0.747, 0.751, 0.868]], [0.366, [0.747, 0.751, 0.868]], [0.368, [0.743, 0.747, 0.866]], [0.370, [0.743, 0.747, 0.866]], [0.372, [0.740, 0.743, 0.864]], [0.374, [0.740, 0.743, 0.864]], [0.376, [0.736, 0.740, 0.862]], [0.378, [0.736, 0.740, 0.862]], [0.380, [0.732, 0.735, 0.859]], [0.382, [0.732, 0.735, 0.859]], [0.384, [0.728, 0.731, 0.857]], [0.386, [0.728, 0.731, 0.857]], [0.387, [0.725, 0.727, 0.854]], [0.389, [0.725, 0.727, 0.854]], [0.391, [0.721, 0.722, 0.852]], [0.393, [0.721, 0.722, 0.852]], [0.395, [0.717, 0.718, 0.850]], [0.397, [0.717, 0.718, 0.850]], [0.399, [0.714, 0.714, 0.847]], [0.401, [0.714, 0.714, 0.847]], [0.403, [0.710, 0.709, 0.845]], [0.405, [0.710, 0.709, 0.845]], [0.407, [0.706, 0.705, 0.842]], [0.409, [0.706, 0.705, 0.842]], [0.411, [0.703, 0.701, 0.840]], [0.413, [0.703, 0.701, 0.840]], [0.415, [0.699, 0.697, 0.837]], [0.417, [0.699, 0.697, 0.837]], [0.419, [0.695, 0.692, 0.835]], [0.421, [0.695, 0.692, 0.835]], [0.423, [0.692, 0.688, 0.832]], [0.425, [0.692, 0.688, 0.832]], [0.427, [0.688, 0.684, 0.830]], [0.429, [0.688, 0.684, 0.830]], [0.431, [0.684, 0.679, 0.827]], [0.432, [0.684, 0.679, 0.827]], [0.434, [0.681, 0.675, 0.825]], [0.436, [0.681, 0.675, 0.825]], [0.438, [0.677, 0.671, 0.822]], [0.440, [0.677, 0.671, 0.822]], [0.442, [0.673, 0.666, 0.820]], [0.444, [0.673, 0.666, 0.820]], [0.446, [0.669, 0.662, 0.818]], [0.448, [0.669, 0.662, 0.818]], [0.450, [0.666, 0.658, 0.815]], [0.452, [0.666, 0.658, 0.815]], [0.454, [0.662, 0.653, 0.813]], [0.456, [0.662, 0.653, 0.813]], [0.458, [0.658, 0.649, 0.810]], [0.460, [0.658, 0.649, 0.810]], [0.462, [0.655, 0.645, 0.808]], [0.464, [0.655, 0.645, 0.808]], [0.466, [0.651, 0.641, 0.805]], [0.468, [0.651, 0.641, 0.805]], [0.470, [0.647, 0.636, 0.803]], [0.472, [0.647, 0.636, 0.803]], [0.474, [0.644, 0.632, 0.800]], [0.476, [0.644, 0.632, 0.800]], [0.477, [0.640, 0.628, 0.798]], [0.479, [0.640, 0.628, 0.798]], [0.481, [0.636, 0.623, 0.795]], [0.483, [0.636, 0.623, 0.795]], [0.485, [0.633, 0.619, 0.793]], [0.487, [0.633, 0.619, 0.793]], [0.489, [0.629, 0.615, 0.790]], [0.491, [0.629, 0.615, 0.790]], [0.493, [0.625, 0.610, 0.788]], [0.495, [0.625, 0.610, 0.788]], [0.497, [0.621, 0.606, 0.786]], [0.499, [0.621, 0.606, 0.786]], [0.501, [0.618, 0.602, 0.783]], [0.503, [0.618, 0.602, 0.783]], [0.505, [0.614, 0.599, 0.782]], [0.507, [0.614, 0.599, 0.782]], [0.509, [0.610, 0.595, 0.780]], [0.511, [0.610, 0.595, 0.780]], [0.513, [0.607, 0.591, 0.778]], [0.515, [0.607, 0.591, 0.778]], [0.517, [0.603, 0.588, 0.777]], [0.519, [0.603, 0.588, 0.777]], [0.521, [0.599, 0.584, 0.775]], [0.523, [0.599, 0.584, 0.775]], [0.524, [0.596, 0.581, 0.773]], [0.526, [0.596, 0.581, 0.773]], [0.528, [0.592, 0.577, 0.771]], [0.530, [0.592, 0.577, 0.771]], [0.532, [0.588, 0.574, 0.770]], [0.534, [0.588, 0.574, 0.770]], [0.536, [0.585, 0.570, 0.768]], [0.538, [0.585, 0.570, 0.768]], [0.540, [0.581, 0.566, 0.766]], [0.542, [0.581, 0.566, 0.766]], [0.544, [0.577, 0.563, 0.765]], [0.546, [0.577, 0.563, 0.765]], [0.548, [0.573, 0.559, 0.763]], [0.550, [0.573, 0.559, 0.763]], [0.552, [0.570, 0.556, 0.761]], [0.554, [0.570, 0.556, 0.761]], [0.556, [0.566, 0.552, 0.759]], [0.558, [0.566, 0.552, 0.759]], [0.560, [0.562, 0.549, 0.758]], [0.562, [0.562, 0.549, 0.758]], [0.564, [0.559, 0.545, 0.756]], [0.566, [0.559, 0.545, 0.756]], [0.568, [0.555, 0.541, 0.754]], [0.569, [0.555, 0.541, 0.754]], [0.571, [0.551, 0.538, 0.752]], [0.573, [0.551, 0.538, 0.752]], [0.575, [0.548, 0.534, 0.751]], [0.577, [0.548, 0.534, 0.751]], [0.579, [0.544, 0.531, 0.749]], [0.581, [0.544, 0.531, 0.749]], [0.583, [0.540, 0.527, 0.747]], [0.585, [0.540, 0.527, 0.747]], [0.587, [0.537, 0.524, 0.746]], [0.589, [0.537, 0.524, 0.746]], [0.591, [0.533, 0.520, 0.744]], [0.593, [0.533, 0.520, 0.744]], [0.595, [0.529, 0.517, 0.742]], [0.597, [0.529, 0.517, 0.742]], [0.599, [0.525, 0.513, 0.740]], [0.601, [0.525, 0.513, 0.740]], [0.603, [0.522, 0.509, 0.739]], [0.605, [0.522, 0.509, 0.739]], [0.607, [0.518, 0.506, 0.737]], [0.609, [0.518, 0.506, 0.737]], [0.611, [0.514, 0.502, 0.735]], [0.613, [0.514, 0.502, 0.735]], [0.614, [0.511, 0.499, 0.734]], [0.616, [0.511, 0.499, 0.734]], [0.618, [0.507, 0.495, 0.732]], [0.620, [0.507, 0.495, 0.732]], [0.622, [0.503, 0.492, 0.730]], [0.624, [0.503, 0.492, 0.730]], [0.626, [0.500, 0.487, 0.728]], [0.628, [0.500, 0.487, 0.728]], [0.630, [0.498, 0.481, 0.725]], [0.632, [0.498, 0.481, 0.725]], [0.634, [0.495, 0.476, 0.722]], [0.636, [0.495, 0.476, 0.722]], [0.638, [0.492, 0.471, 0.719]], [0.640, [0.492, 0.471, 0.719]], [0.642, [0.489, 0.465, 0.716]], [0.644, [0.489, 0.465, 0.716]], [0.646, [0.487, 0.460, 0.713]], [0.648, [0.487, 0.460, 0.713]], [0.650, [0.484, 0.454, 0.711]], [0.652, [0.484, 0.454, 0.711]], [0.654, [0.481, 0.449, 0.708]], [0.656, [0.481, 0.449, 0.708]], [0.658, [0.479, 0.444, 0.705]], [0.659, [0.479, 0.444, 0.705]], [0.661, [0.476, 0.438, 0.702]], [0.663, [0.476, 0.438, 0.702]], [0.665, [0.473, 0.433, 0.699]], [0.667, [0.473, 0.433, 0.699]], [0.669, [0.470, 0.427, 0.697]], [0.671, [0.470, 0.427, 0.697]], [0.673, [0.468, 0.422, 0.694]], [0.675, [0.468, 0.422, 0.694]], [0.677, [0.465, 0.416, 0.691]], [0.679, [0.465, 0.416, 0.691]], [0.681, [0.462, 0.411, 0.688]], [0.683, [0.462, 0.411, 0.688]], [0.685, [0.460, 0.406, 0.685]], [0.687, [0.460, 0.406, 0.685]], [0.689, [0.457, 0.400, 0.682]], [0.691, [0.457, 0.400, 0.682]], [0.693, [0.454, 0.395, 0.680]], [0.695, [0.454, 0.395, 0.680]], [0.697, [0.452, 0.389, 0.677]], [0.699, [0.452, 0.389, 0.677]], [0.701, [0.449, 0.384, 0.674]], [0.703, [0.449, 0.384, 0.674]], [0.705, [0.446, 0.379, 0.671]], [0.706, [0.446, 0.379, 0.671]], [0.708, [0.443, 0.373, 0.668]], [0.710, [0.443, 0.373, 0.668]], [0.712, [0.441, 0.368, 0.665]], [0.714, [0.441, 0.368, 0.665]], [0.716, [0.438, 0.362, 0.663]], [0.718, [0.438, 0.362, 0.663]], [0.720, [0.435, 0.357, 0.660]], [0.722, [0.435, 0.357, 0.660]], [0.724, [0.433, 0.351, 0.657]], [0.726, [0.433, 0.351, 0.657]], [0.728, [0.430, 0.346, 0.654]], [0.730, [0.430, 0.346, 0.654]], [0.732, [0.427, 0.341, 0.651]], [0.734, [0.427, 0.341, 0.651]], [0.736, [0.424, 0.335, 0.648]], [0.738, [0.424, 0.335, 0.648]], [0.740, [0.422, 0.330, 0.646]], [0.742, [0.422, 0.330, 0.646]], [0.744, [0.419, 0.324, 0.643]], [0.746, [0.419, 0.324, 0.643]], [0.748, [0.416, 0.319, 0.640]], [0.750, [0.416, 0.319, 0.640]], [0.751, [0.414, 0.314, 0.637]], [0.753, [0.414, 0.314, 0.637]], [0.755, [0.411, 0.309, 0.635]], [0.757, [0.411, 0.309, 0.635]], [0.759, [0.408, 0.303, 0.632]], [0.761, [0.408, 0.303, 0.632]], [0.763, [0.406, 0.298, 0.630]], [0.765, [0.406, 0.298, 0.630]], [0.767, [0.403, 0.293, 0.628]], [0.769, [0.403, 0.293, 0.628]], [0.771, [0.400, 0.288, 0.625]], [0.773, [0.400, 0.288, 0.625]], [0.775, [0.397, 0.283, 0.623]], [0.777, [0.397, 0.283, 0.623]], [0.779, [0.395, 0.278, 0.620]], [0.781, [0.395, 0.278, 0.620]], [0.783, [0.392, 0.272, 0.618]], [0.785, [0.392, 0.272, 0.618]], [0.787, [0.389, 0.267, 0.615]], [0.789, [0.389, 0.267, 0.615]], [0.791, [0.387, 0.262, 0.613]], [0.793, [0.387, 0.262, 0.613]], [0.795, [0.384, 0.257, 0.610]], [0.796, [0.384, 0.257, 0.610]], [0.798, [0.381, 0.252, 0.608]], [0.800, [0.381, 0.252, 0.608]], [0.802, [0.378, 0.247, 0.605]], [0.804, [0.378, 0.247, 0.605]], [0.806, [0.376, 0.241, 0.603]], [0.808, [0.376, 0.241, 0.603]], [0.810, [0.373, 0.236, 0.600]], [0.812, [0.373, 0.236, 0.600]], [0.814, [0.370, 0.231, 0.598]], [0.816, [0.370, 0.231, 0.598]], [0.818, [0.368, 0.226, 0.596]], [0.820, [0.368, 0.226, 0.596]], [0.822, [0.365, 0.221, 0.593]], [0.824, [0.365, 0.221, 0.593]], [0.826, [0.362, 0.216, 0.591]], [0.828, [0.362, 0.216, 0.591]], [0.830, [0.360, 0.210, 0.588]], [0.832, [0.360, 0.210, 0.588]], [0.834, [0.357, 0.205, 0.586]], [0.836, [0.357, 0.205, 0.586]], [0.838, [0.354, 0.200, 0.583]], [0.840, [0.354, 0.200, 0.583]], [0.841, [0.351, 0.195, 0.581]], [0.843, [0.351, 0.195, 0.581]], [0.845, [0.349, 0.190, 0.578]], [0.847, [0.349, 0.190, 0.578]], [0.849, [0.346, 0.185, 0.576]], [0.851, [0.346, 0.185, 0.576]], [0.853, [0.343, 0.179, 0.573]], [0.855, [0.343, 0.179, 0.573]], [0.857, [0.341, 0.174, 0.571]], [0.859, [0.341, 0.174, 0.571]], [0.861, [0.338, 0.169, 0.568]], [0.863, [0.338, 0.169, 0.568]], [0.865, [0.335, 0.164, 0.566]], [0.867, [0.335, 0.164, 0.566]], [0.869, [0.332, 0.159, 0.564]], [0.871, [0.332, 0.159, 0.564]], [0.873, [0.330, 0.154, 0.561]], [0.875, [0.330, 0.154, 0.561]], [0.877, [0.327, 0.149, 0.559]], [0.879, [0.327, 0.149, 0.559]], [0.881, [0.325, 0.144, 0.557]], [0.883, [0.325, 0.144, 0.557]], [0.885, [0.322, 0.139, 0.554]], [0.886, [0.322, 0.139, 0.554]], [0.888, [0.319, 0.134, 0.552]], [0.890, [0.319, 0.134, 0.552]], [0.892, [0.317, 0.130, 0.550]], [0.894, [0.317, 0.130, 0.550]], [0.896, [0.314, 0.125, 0.548]], [0.898, [0.314, 0.125, 0.548]], [0.900, [0.312, 0.120, 0.546]], [0.902, [0.312, 0.120, 0.546]], [0.904, [0.309, 0.115, 0.543]], [0.906, [0.309, 0.115, 0.543]], [0.908, [0.306, 0.110, 0.541]], [0.910, [0.306, 0.110, 0.541]], [0.912, [0.304, 0.106, 0.539]], [0.914, [0.304, 0.106, 0.539]], [0.916, [0.301, 0.101, 0.537]], [0.918, [0.301, 0.101, 0.537]], [0.920, [0.299, 0.096, 0.534]], [0.922, [0.299, 0.096, 0.534]], [0.924, [0.296, 0.091, 0.532]], [0.926, [0.296, 0.091, 0.532]], [0.928, [0.294, 0.086, 0.530]], [0.930, [0.294, 0.086, 0.530]], [0.932, [0.291, 0.082, 0.528]], [0.933, [0.291, 0.082, 0.528]], [0.935, [0.288, 0.077, 0.526]], [0.937, [0.288, 0.077, 0.526]], [0.939, [0.286, 0.072, 0.523]], [0.941, [0.286, 0.072, 0.523]], [0.943, [0.283, 0.067, 0.521]], [0.945, [0.283, 0.067, 0.521]], [0.947, [0.281, 0.062, 0.519]], [0.949, [0.281, 0.062, 0.519]], [0.951, [0.278, 0.058, 0.517]], [0.953, [0.278, 0.058, 0.517]], [0.955, [0.275, 0.053, 0.515]], [0.957, [0.275, 0.053, 0.515]], [0.959, [0.273, 0.048, 0.512]], [0.961, [0.273, 0.048, 0.512]], [0.963, [0.270, 0.043, 0.510]], [0.965, [0.270, 0.043, 0.510]], [0.967, [0.268, 0.038, 0.508]], [0.969, [0.268, 0.038, 0.508]], [0.971, [0.265, 0.034, 0.506]], [0.973, [0.265, 0.034, 0.506]], [0.975, [0.263, 0.029, 0.503]], [0.977, [0.263, 0.029, 0.503]], [0.978, [0.260, 0.024, 0.501]], [0.980, [0.260, 0.024, 0.501]], [0.982, [0.257, 0.019, 0.499]], [0.984, [0.257, 0.019, 0.499]], [0.986, [0.255, 0.014, 0.497]], [0.988, [0.255, 0.014, 0.497]], [0.990, [0.252, 0.010, 0.495]], [0.992, [0.252, 0.010, 0.495]], [0.994, [0.250, 0.005, 0.492]], [0.996, [0.250, 0.005, 0.492]], [0.998, [0.247, 0.000, 0.490]], [1.000, [0.247, 0.000, 0.490]]]; +var RdPu = [[0.000, [1.000, 0.969, 0.953]], [0.002, [1.000, 0.969, 0.953]], [0.004, [1.000, 0.966, 0.950]], [0.006, [1.000, 0.966, 0.950]], [0.008, [1.000, 0.963, 0.948]], [0.010, [1.000, 0.963, 0.948]], [0.012, [0.999, 0.960, 0.945]], [0.014, [0.999, 0.960, 0.945]], [0.016, [0.999, 0.957, 0.942]], [0.018, [0.999, 0.957, 0.942]], [0.020, [0.999, 0.954, 0.939]], [0.022, [0.999, 0.954, 0.939]], [0.023, [0.999, 0.952, 0.937]], [0.025, [0.999, 0.952, 0.937]], [0.027, [0.998, 0.949, 0.934]], [0.029, [0.998, 0.949, 0.934]], [0.031, [0.998, 0.946, 0.931]], [0.033, [0.998, 0.946, 0.931]], [0.035, [0.998, 0.943, 0.929]], [0.037, [0.998, 0.943, 0.929]], [0.039, [0.998, 0.940, 0.926]], [0.041, [0.998, 0.940, 0.926]], [0.043, [0.997, 0.938, 0.923]], [0.045, [0.997, 0.938, 0.923]], [0.047, [0.997, 0.935, 0.920]], [0.049, [0.997, 0.935, 0.920]], [0.051, [0.997, 0.932, 0.918]], [0.053, [0.997, 0.932, 0.918]], [0.055, [0.997, 0.929, 0.915]], [0.057, [0.997, 0.929, 0.915]], [0.059, [0.996, 0.926, 0.912]], [0.061, [0.996, 0.926, 0.912]], [0.063, [0.996, 0.923, 0.910]], [0.065, [0.996, 0.923, 0.910]], [0.067, [0.996, 0.921, 0.907]], [0.068, [0.996, 0.921, 0.907]], [0.070, [0.996, 0.918, 0.904]], [0.072, [0.996, 0.918, 0.904]], [0.074, [0.995, 0.915, 0.902]], [0.076, [0.995, 0.915, 0.902]], [0.078, [0.995, 0.912, 0.899]], [0.080, [0.995, 0.912, 0.899]], [0.082, [0.995, 0.909, 0.896]], [0.084, [0.995, 0.909, 0.896]], [0.086, [0.995, 0.906, 0.893]], [0.088, [0.995, 0.906, 0.893]], [0.090, [0.994, 0.904, 0.891]], [0.092, [0.994, 0.904, 0.891]], [0.094, [0.994, 0.901, 0.888]], [0.096, [0.994, 0.901, 0.888]], [0.098, [0.994, 0.898, 0.885]], [0.100, [0.994, 0.898, 0.885]], [0.102, [0.994, 0.895, 0.883]], [0.104, [0.994, 0.895, 0.883]], [0.106, [0.993, 0.892, 0.880]], [0.108, [0.993, 0.892, 0.880]], [0.110, [0.993, 0.889, 0.877]], [0.112, [0.993, 0.889, 0.877]], [0.114, [0.993, 0.887, 0.874]], [0.115, [0.993, 0.887, 0.874]], [0.117, [0.993, 0.884, 0.872]], [0.119, [0.993, 0.884, 0.872]], [0.121, [0.992, 0.881, 0.869]], [0.123, [0.992, 0.881, 0.869]], [0.125, [0.992, 0.878, 0.866]], [0.127, [0.992, 0.878, 0.866]], [0.129, [0.992, 0.875, 0.863]], [0.131, [0.992, 0.875, 0.863]], [0.133, [0.992, 0.871, 0.859]], [0.135, [0.992, 0.871, 0.859]], [0.137, [0.992, 0.868, 0.856]], [0.139, [0.992, 0.868, 0.856]], [0.141, [0.992, 0.865, 0.852]], [0.143, [0.992, 0.865, 0.852]], [0.145, [0.992, 0.861, 0.848]], [0.147, [0.992, 0.861, 0.848]], [0.149, [0.991, 0.858, 0.845]], [0.151, [0.991, 0.858, 0.845]], [0.153, [0.991, 0.855, 0.841]], [0.155, [0.991, 0.855, 0.841]], [0.157, [0.991, 0.851, 0.838]], [0.159, [0.991, 0.851, 0.838]], [0.160, [0.991, 0.848, 0.834]], [0.162, [0.991, 0.848, 0.834]], [0.164, [0.991, 0.845, 0.831]], [0.166, [0.991, 0.845, 0.831]], [0.168, [0.991, 0.841, 0.827]], [0.170, [0.991, 0.841, 0.827]], [0.172, [0.991, 0.838, 0.823]], [0.174, [0.991, 0.838, 0.823]], [0.176, [0.991, 0.835, 0.820]], [0.178, [0.991, 0.835, 0.820]], [0.180, [0.990, 0.832, 0.816]], [0.182, [0.990, 0.832, 0.816]], [0.184, [0.990, 0.828, 0.813]], [0.186, [0.990, 0.828, 0.813]], [0.188, [0.990, 0.825, 0.809]], [0.190, [0.990, 0.825, 0.809]], [0.192, [0.990, 0.822, 0.806]], [0.194, [0.990, 0.822, 0.806]], [0.196, [0.990, 0.818, 0.802]], [0.198, [0.990, 0.818, 0.802]], [0.200, [0.990, 0.815, 0.798]], [0.202, [0.990, 0.815, 0.798]], [0.204, [0.990, 0.812, 0.795]], [0.205, [0.990, 0.812, 0.795]], [0.207, [0.990, 0.808, 0.791]], [0.209, [0.990, 0.808, 0.791]], [0.211, [0.989, 0.805, 0.788]], [0.213, [0.989, 0.805, 0.788]], [0.215, [0.989, 0.802, 0.784]], [0.217, [0.989, 0.802, 0.784]], [0.219, [0.989, 0.798, 0.781]], [0.221, [0.989, 0.798, 0.781]], [0.223, [0.989, 0.795, 0.777]], [0.225, [0.989, 0.795, 0.777]], [0.227, [0.989, 0.792, 0.773]], [0.229, [0.989, 0.792, 0.773]], [0.231, [0.989, 0.788, 0.770]], [0.233, [0.989, 0.788, 0.770]], [0.235, [0.989, 0.785, 0.766]], [0.237, [0.989, 0.785, 0.766]], [0.239, [0.989, 0.782, 0.763]], [0.241, [0.989, 0.782, 0.763]], [0.243, [0.988, 0.778, 0.759]], [0.245, [0.988, 0.778, 0.759]], [0.247, [0.988, 0.775, 0.756]], [0.249, [0.988, 0.775, 0.756]], [0.250, [0.988, 0.771, 0.753]], [0.252, [0.988, 0.771, 0.753]], [0.254, [0.988, 0.767, 0.751]], [0.256, [0.988, 0.767, 0.751]], [0.258, [0.988, 0.762, 0.750]], [0.260, [0.988, 0.762, 0.750]], [0.262, [0.987, 0.757, 0.749]], [0.264, [0.987, 0.757, 0.749]], [0.266, [0.987, 0.753, 0.747]], [0.268, [0.987, 0.753, 0.747]], [0.270, [0.987, 0.748, 0.746]], [0.272, [0.987, 0.748, 0.746]], [0.274, [0.987, 0.743, 0.744]], [0.276, [0.987, 0.743, 0.744]], [0.278, [0.986, 0.739, 0.743]], [0.280, [0.986, 0.739, 0.743]], [0.282, [0.986, 0.734, 0.742]], [0.284, [0.986, 0.734, 0.742]], [0.286, [0.986, 0.729, 0.740]], [0.288, [0.986, 0.729, 0.740]], [0.290, [0.986, 0.725, 0.739]], [0.292, [0.986, 0.725, 0.739]], [0.294, [0.985, 0.720, 0.738]], [0.295, [0.985, 0.720, 0.738]], [0.297, [0.985, 0.715, 0.736]], [0.299, [0.985, 0.715, 0.736]], [0.301, [0.985, 0.711, 0.735]], [0.303, [0.985, 0.711, 0.735]], [0.305, [0.985, 0.706, 0.734]], [0.307, [0.985, 0.706, 0.734]], [0.309, [0.984, 0.701, 0.732]], [0.311, [0.984, 0.701, 0.732]], [0.313, [0.984, 0.697, 0.731]], [0.315, [0.984, 0.697, 0.731]], [0.317, [0.984, 0.692, 0.730]], [0.319, [0.984, 0.692, 0.730]], [0.321, [0.984, 0.687, 0.728]], [0.323, [0.984, 0.687, 0.728]], [0.325, [0.983, 0.683, 0.727]], [0.327, [0.983, 0.683, 0.727]], [0.329, [0.983, 0.678, 0.726]], [0.331, [0.983, 0.678, 0.726]], [0.333, [0.983, 0.673, 0.724]], [0.335, [0.983, 0.673, 0.724]], [0.337, [0.983, 0.669, 0.723]], [0.339, [0.983, 0.669, 0.723]], [0.341, [0.983, 0.664, 0.721]], [0.342, [0.983, 0.664, 0.721]], [0.344, [0.982, 0.659, 0.720]], [0.346, [0.982, 0.659, 0.720]], [0.348, [0.982, 0.655, 0.719]], [0.350, [0.982, 0.655, 0.719]], [0.352, [0.982, 0.650, 0.717]], [0.354, [0.982, 0.650, 0.717]], [0.356, [0.982, 0.645, 0.716]], [0.358, [0.982, 0.645, 0.716]], [0.360, [0.981, 0.640, 0.715]], [0.362, [0.981, 0.640, 0.715]], [0.364, [0.981, 0.636, 0.713]], [0.366, [0.981, 0.636, 0.713]], [0.368, [0.981, 0.631, 0.712]], [0.370, [0.981, 0.631, 0.712]], [0.372, [0.981, 0.626, 0.711]], [0.374, [0.981, 0.626, 0.711]], [0.376, [0.980, 0.621, 0.709]], [0.378, [0.980, 0.621, 0.709]], [0.380, [0.980, 0.614, 0.706]], [0.382, [0.980, 0.614, 0.706]], [0.384, [0.980, 0.607, 0.704]], [0.386, [0.980, 0.607, 0.704]], [0.387, [0.979, 0.601, 0.701]], [0.389, [0.979, 0.601, 0.701]], [0.391, [0.979, 0.594, 0.699]], [0.393, [0.979, 0.594, 0.699]], [0.395, [0.978, 0.587, 0.697]], [0.397, [0.978, 0.587, 0.697]], [0.399, [0.978, 0.580, 0.694]], [0.401, [0.978, 0.580, 0.694]], [0.403, [0.978, 0.574, 0.692]], [0.405, [0.978, 0.574, 0.692]], [0.407, [0.977, 0.567, 0.689]], [0.409, [0.977, 0.567, 0.689]], [0.411, [0.977, 0.560, 0.687]], [0.413, [0.977, 0.560, 0.687]], [0.415, [0.977, 0.553, 0.684]], [0.417, [0.977, 0.553, 0.684]], [0.419, [0.976, 0.547, 0.682]], [0.421, [0.976, 0.547, 0.682]], [0.423, [0.976, 0.540, 0.679]], [0.425, [0.976, 0.540, 0.679]], [0.427, [0.975, 0.533, 0.677]], [0.429, [0.975, 0.533, 0.677]], [0.431, [0.975, 0.526, 0.674]], [0.432, [0.975, 0.526, 0.674]], [0.434, [0.975, 0.519, 0.672]], [0.436, [0.975, 0.519, 0.672]], [0.438, [0.974, 0.513, 0.670]], [0.440, [0.974, 0.513, 0.670]], [0.442, [0.974, 0.506, 0.667]], [0.444, [0.974, 0.506, 0.667]], [0.446, [0.974, 0.499, 0.665]], [0.448, [0.974, 0.499, 0.665]], [0.450, [0.973, 0.492, 0.662]], [0.452, [0.973, 0.492, 0.662]], [0.454, [0.973, 0.486, 0.660]], [0.456, [0.973, 0.486, 0.660]], [0.458, [0.973, 0.479, 0.657]], [0.460, [0.973, 0.479, 0.657]], [0.462, [0.972, 0.472, 0.655]], [0.464, [0.972, 0.472, 0.655]], [0.466, [0.972, 0.465, 0.652]], [0.468, [0.972, 0.465, 0.652]], [0.470, [0.971, 0.459, 0.650]], [0.472, [0.971, 0.459, 0.650]], [0.474, [0.971, 0.452, 0.647]], [0.476, [0.971, 0.452, 0.647]], [0.477, [0.971, 0.445, 0.645]], [0.479, [0.971, 0.445, 0.645]], [0.481, [0.970, 0.438, 0.642]], [0.483, [0.970, 0.438, 0.642]], [0.485, [0.970, 0.432, 0.640]], [0.487, [0.970, 0.432, 0.640]], [0.489, [0.970, 0.425, 0.638]], [0.491, [0.970, 0.425, 0.638]], [0.493, [0.969, 0.418, 0.635]], [0.495, [0.969, 0.418, 0.635]], [0.497, [0.969, 0.411, 0.633]], [0.499, [0.969, 0.411, 0.633]], [0.501, [0.967, 0.405, 0.631]], [0.503, [0.967, 0.405, 0.631]], [0.505, [0.964, 0.398, 0.630]], [0.507, [0.964, 0.398, 0.630]], [0.509, [0.961, 0.392, 0.628]], [0.511, [0.961, 0.392, 0.628]], [0.513, [0.957, 0.385, 0.627]], [0.515, [0.957, 0.385, 0.627]], [0.517, [0.954, 0.379, 0.626]], [0.519, [0.954, 0.379, 0.626]], [0.521, [0.951, 0.373, 0.625]], [0.523, [0.951, 0.373, 0.625]], [0.524, [0.948, 0.366, 0.623]], [0.526, [0.948, 0.366, 0.623]], [0.528, [0.945, 0.360, 0.622]], [0.530, [0.945, 0.360, 0.622]], [0.532, [0.941, 0.353, 0.621]], [0.534, [0.941, 0.353, 0.621]], [0.536, [0.938, 0.347, 0.620]], [0.538, [0.938, 0.347, 0.620]], [0.540, [0.935, 0.341, 0.618]], [0.542, [0.935, 0.341, 0.618]], [0.544, [0.932, 0.334, 0.617]], [0.546, [0.932, 0.334, 0.617]], [0.548, [0.929, 0.328, 0.616]], [0.550, [0.929, 0.328, 0.616]], [0.552, [0.925, 0.321, 0.615]], [0.554, [0.925, 0.321, 0.615]], [0.556, [0.922, 0.315, 0.614]], [0.558, [0.922, 0.315, 0.614]], [0.560, [0.919, 0.309, 0.612]], [0.562, [0.919, 0.309, 0.612]], [0.564, [0.916, 0.302, 0.611]], [0.566, [0.916, 0.302, 0.611]], [0.568, [0.913, 0.296, 0.610]], [0.569, [0.913, 0.296, 0.610]], [0.571, [0.909, 0.289, 0.609]], [0.573, [0.909, 0.289, 0.609]], [0.575, [0.906, 0.283, 0.607]], [0.577, [0.906, 0.283, 0.607]], [0.579, [0.903, 0.277, 0.606]], [0.581, [0.903, 0.277, 0.606]], [0.583, [0.900, 0.270, 0.605]], [0.585, [0.900, 0.270, 0.605]], [0.587, [0.897, 0.264, 0.604]], [0.589, [0.897, 0.264, 0.604]], [0.591, [0.893, 0.258, 0.602]], [0.593, [0.893, 0.258, 0.602]], [0.595, [0.890, 0.251, 0.601]], [0.597, [0.890, 0.251, 0.601]], [0.599, [0.887, 0.245, 0.600]], [0.601, [0.887, 0.245, 0.600]], [0.603, [0.884, 0.238, 0.599]], [0.605, [0.884, 0.238, 0.599]], [0.607, [0.881, 0.232, 0.598]], [0.609, [0.881, 0.232, 0.598]], [0.611, [0.877, 0.226, 0.596]], [0.613, [0.877, 0.226, 0.596]], [0.614, [0.874, 0.219, 0.595]], [0.616, [0.874, 0.219, 0.595]], [0.618, [0.871, 0.213, 0.594]], [0.620, [0.871, 0.213, 0.594]], [0.622, [0.868, 0.206, 0.593]], [0.624, [0.868, 0.206, 0.593]], [0.626, [0.863, 0.200, 0.590]], [0.628, [0.863, 0.200, 0.590]], [0.630, [0.857, 0.194, 0.587]], [0.632, [0.857, 0.194, 0.587]], [0.634, [0.851, 0.187, 0.584]], [0.636, [0.851, 0.187, 0.584]], [0.638, [0.846, 0.181, 0.581]], [0.640, [0.846, 0.181, 0.581]], [0.642, [0.840, 0.175, 0.578]], [0.644, [0.840, 0.175, 0.578]], [0.646, [0.834, 0.169, 0.575]], [0.648, [0.834, 0.169, 0.575]], [0.650, [0.828, 0.162, 0.572]], [0.652, [0.828, 0.162, 0.572]], [0.654, [0.823, 0.156, 0.569]], [0.656, [0.823, 0.156, 0.569]], [0.658, [0.817, 0.150, 0.566]], [0.659, [0.817, 0.150, 0.566]], [0.661, [0.811, 0.144, 0.563]], [0.663, [0.811, 0.144, 0.563]], [0.665, [0.805, 0.137, 0.559]], [0.667, [0.805, 0.137, 0.559]], [0.669, [0.799, 0.131, 0.556]], [0.671, [0.799, 0.131, 0.556]], [0.673, [0.794, 0.125, 0.553]], [0.675, [0.794, 0.125, 0.553]], [0.677, [0.788, 0.118, 0.550]], [0.679, [0.788, 0.118, 0.550]], [0.681, [0.782, 0.112, 0.547]], [0.683, [0.782, 0.112, 0.547]], [0.685, [0.776, 0.106, 0.544]], [0.687, [0.776, 0.106, 0.544]], [0.689, [0.771, 0.100, 0.541]], [0.691, [0.771, 0.100, 0.541]], [0.693, [0.765, 0.093, 0.538]], [0.695, [0.765, 0.093, 0.538]], [0.697, [0.759, 0.087, 0.535]], [0.699, [0.759, 0.087, 0.535]], [0.701, [0.753, 0.081, 0.532]], [0.703, [0.753, 0.081, 0.532]], [0.705, [0.747, 0.075, 0.529]], [0.706, [0.747, 0.075, 0.529]], [0.708, [0.742, 0.068, 0.526]], [0.710, [0.742, 0.068, 0.526]], [0.712, [0.736, 0.062, 0.523]], [0.714, [0.736, 0.062, 0.523]], [0.716, [0.730, 0.056, 0.519]], [0.718, [0.730, 0.056, 0.519]], [0.720, [0.724, 0.049, 0.516]], [0.722, [0.724, 0.049, 0.516]], [0.724, [0.718, 0.043, 0.513]], [0.726, [0.718, 0.043, 0.513]], [0.728, [0.713, 0.037, 0.510]], [0.730, [0.713, 0.037, 0.510]], [0.732, [0.707, 0.031, 0.507]], [0.734, [0.707, 0.031, 0.507]], [0.736, [0.701, 0.024, 0.504]], [0.738, [0.701, 0.024, 0.504]], [0.740, [0.695, 0.018, 0.501]], [0.742, [0.695, 0.018, 0.501]], [0.744, [0.690, 0.012, 0.498]], [0.746, [0.690, 0.012, 0.498]], [0.748, [0.684, 0.005, 0.495]], [0.750, [0.684, 0.005, 0.495]], [0.751, [0.678, 0.004, 0.493]], [0.753, [0.678, 0.004, 0.493]], [0.755, [0.671, 0.004, 0.493]], [0.757, [0.671, 0.004, 0.493]], [0.759, [0.665, 0.004, 0.492]], [0.761, [0.665, 0.004, 0.492]], [0.763, [0.658, 0.004, 0.491]], [0.765, [0.658, 0.004, 0.491]], [0.767, [0.652, 0.004, 0.490]], [0.769, [0.652, 0.004, 0.490]], [0.771, [0.646, 0.004, 0.489]], [0.773, [0.646, 0.004, 0.489]], [0.775, [0.639, 0.004, 0.488]], [0.777, [0.639, 0.004, 0.488]], [0.779, [0.633, 0.004, 0.487]], [0.781, [0.633, 0.004, 0.487]], [0.783, [0.626, 0.004, 0.487]], [0.785, [0.626, 0.004, 0.487]], [0.787, [0.620, 0.004, 0.486]], [0.789, [0.620, 0.004, 0.486]], [0.791, [0.614, 0.004, 0.485]], [0.793, [0.614, 0.004, 0.485]], [0.795, [0.607, 0.004, 0.484]], [0.796, [0.607, 0.004, 0.484]], [0.798, [0.601, 0.004, 0.483]], [0.800, [0.601, 0.004, 0.483]], [0.802, [0.594, 0.004, 0.482]], [0.804, [0.594, 0.004, 0.482]], [0.806, [0.588, 0.004, 0.481]], [0.808, [0.588, 0.004, 0.481]], [0.810, [0.582, 0.004, 0.481]], [0.812, [0.582, 0.004, 0.481]], [0.814, [0.575, 0.004, 0.480]], [0.816, [0.575, 0.004, 0.480]], [0.818, [0.569, 0.004, 0.479]], [0.820, [0.569, 0.004, 0.479]], [0.822, [0.562, 0.004, 0.478]], [0.824, [0.562, 0.004, 0.478]], [0.826, [0.556, 0.004, 0.477]], [0.828, [0.556, 0.004, 0.477]], [0.830, [0.550, 0.004, 0.476]], [0.832, [0.550, 0.004, 0.476]], [0.834, [0.543, 0.004, 0.475]], [0.836, [0.543, 0.004, 0.475]], [0.838, [0.537, 0.004, 0.475]], [0.840, [0.537, 0.004, 0.475]], [0.841, [0.530, 0.004, 0.474]], [0.843, [0.530, 0.004, 0.474]], [0.845, [0.524, 0.004, 0.473]], [0.847, [0.524, 0.004, 0.473]], [0.849, [0.518, 0.004, 0.472]], [0.851, [0.518, 0.004, 0.472]], [0.853, [0.511, 0.004, 0.471]], [0.855, [0.511, 0.004, 0.471]], [0.857, [0.505, 0.004, 0.470]], [0.859, [0.505, 0.004, 0.470]], [0.861, [0.498, 0.004, 0.469]], [0.863, [0.498, 0.004, 0.469]], [0.865, [0.492, 0.004, 0.468]], [0.867, [0.492, 0.004, 0.468]], [0.869, [0.486, 0.004, 0.468]], [0.871, [0.486, 0.004, 0.468]], [0.873, [0.479, 0.004, 0.467]], [0.875, [0.479, 0.004, 0.467]], [0.877, [0.473, 0.004, 0.465]], [0.879, [0.473, 0.004, 0.465]], [0.881, [0.467, 0.004, 0.464]], [0.883, [0.467, 0.004, 0.464]], [0.885, [0.461, 0.004, 0.462]], [0.886, [0.461, 0.004, 0.462]], [0.888, [0.455, 0.003, 0.460]], [0.890, [0.455, 0.003, 0.460]], [0.892, [0.449, 0.003, 0.459]], [0.894, [0.449, 0.003, 0.459]], [0.896, [0.443, 0.003, 0.457]], [0.898, [0.443, 0.003, 0.457]], [0.900, [0.437, 0.003, 0.456]], [0.902, [0.437, 0.003, 0.456]], [0.904, [0.431, 0.003, 0.454]], [0.906, [0.431, 0.003, 0.454]], [0.908, [0.425, 0.003, 0.452]], [0.910, [0.425, 0.003, 0.452]], [0.912, [0.419, 0.003, 0.451]], [0.914, [0.419, 0.003, 0.451]], [0.916, [0.413, 0.003, 0.449]], [0.918, [0.413, 0.003, 0.449]], [0.920, [0.407, 0.002, 0.448]], [0.922, [0.407, 0.002, 0.448]], [0.924, [0.401, 0.002, 0.446]], [0.926, [0.401, 0.002, 0.446]], [0.928, [0.395, 0.002, 0.444]], [0.930, [0.395, 0.002, 0.444]], [0.932, [0.389, 0.002, 0.443]], [0.933, [0.389, 0.002, 0.443]], [0.935, [0.383, 0.002, 0.441]], [0.937, [0.383, 0.002, 0.441]], [0.939, [0.377, 0.002, 0.440]], [0.941, [0.377, 0.002, 0.440]], [0.943, [0.371, 0.002, 0.438]], [0.945, [0.371, 0.002, 0.438]], [0.947, [0.365, 0.002, 0.436]], [0.949, [0.365, 0.002, 0.436]], [0.951, [0.359, 0.001, 0.435]], [0.953, [0.359, 0.001, 0.435]], [0.955, [0.353, 0.001, 0.433]], [0.957, [0.353, 0.001, 0.433]], [0.959, [0.347, 0.001, 0.432]], [0.961, [0.347, 0.001, 0.432]], [0.963, [0.341, 0.001, 0.430]], [0.965, [0.341, 0.001, 0.430]], [0.967, [0.335, 0.001, 0.428]], [0.969, [0.335, 0.001, 0.428]], [0.971, [0.328, 0.001, 0.427]], [0.973, [0.328, 0.001, 0.427]], [0.975, [0.322, 0.001, 0.425]], [0.977, [0.322, 0.001, 0.425]], [0.978, [0.316, 0.001, 0.424]], [0.980, [0.316, 0.001, 0.424]], [0.982, [0.310, 0.000, 0.422]], [0.984, [0.310, 0.000, 0.422]], [0.986, [0.304, 0.000, 0.420]], [0.988, [0.304, 0.000, 0.420]], [0.990, [0.298, 0.000, 0.419]], [0.992, [0.298, 0.000, 0.419]], [0.994, [0.292, 0.000, 0.417]], [0.996, [0.292, 0.000, 0.417]], [0.998, [0.286, 0.000, 0.416]], [1.000, [0.286, 0.000, 0.416]]]; +var Reds = [[0.000, [1.000, 0.961, 0.941]], [0.002, [1.000, 0.961, 0.941]], [0.004, [1.000, 0.958, 0.937]], [0.006, [1.000, 0.958, 0.937]], [0.008, [1.000, 0.956, 0.934]], [0.010, [1.000, 0.956, 0.934]], [0.012, [1.000, 0.953, 0.930]], [0.014, [1.000, 0.953, 0.930]], [0.016, [1.000, 0.950, 0.926]], [0.018, [1.000, 0.950, 0.926]], [0.020, [0.999, 0.948, 0.923]], [0.022, [0.999, 0.948, 0.923]], [0.023, [0.999, 0.945, 0.919]], [0.025, [0.999, 0.945, 0.919]], [0.027, [0.999, 0.943, 0.915]], [0.029, [0.999, 0.943, 0.915]], [0.031, [0.999, 0.940, 0.912]], [0.033, [0.999, 0.940, 0.912]], [0.035, [0.999, 0.938, 0.908]], [0.037, [0.999, 0.938, 0.908]], [0.039, [0.999, 0.935, 0.904]], [0.041, [0.999, 0.935, 0.904]], [0.043, [0.999, 0.932, 0.901]], [0.045, [0.999, 0.932, 0.901]], [0.047, [0.999, 0.930, 0.897]], [0.049, [0.999, 0.930, 0.897]], [0.051, [0.998, 0.927, 0.893]], [0.053, [0.998, 0.927, 0.893]], [0.055, [0.998, 0.925, 0.890]], [0.057, [0.998, 0.925, 0.890]], [0.059, [0.998, 0.922, 0.886]], [0.061, [0.998, 0.922, 0.886]], [0.063, [0.998, 0.919, 0.882]], [0.065, [0.998, 0.919, 0.882]], [0.067, [0.998, 0.917, 0.878]], [0.068, [0.998, 0.917, 0.878]], [0.070, [0.998, 0.914, 0.875]], [0.072, [0.998, 0.914, 0.875]], [0.074, [0.998, 0.912, 0.871]], [0.076, [0.998, 0.912, 0.871]], [0.078, [0.998, 0.909, 0.867]], [0.080, [0.998, 0.909, 0.867]], [0.082, [0.997, 0.907, 0.864]], [0.084, [0.997, 0.907, 0.864]], [0.086, [0.997, 0.904, 0.860]], [0.088, [0.997, 0.904, 0.860]], [0.090, [0.997, 0.901, 0.856]], [0.092, [0.997, 0.901, 0.856]], [0.094, [0.997, 0.899, 0.853]], [0.096, [0.997, 0.899, 0.853]], [0.098, [0.997, 0.896, 0.849]], [0.100, [0.997, 0.896, 0.849]], [0.102, [0.997, 0.894, 0.845]], [0.104, [0.997, 0.894, 0.845]], [0.106, [0.997, 0.891, 0.842]], [0.108, [0.997, 0.891, 0.842]], [0.110, [0.997, 0.888, 0.838]], [0.112, [0.997, 0.888, 0.838]], [0.114, [0.996, 0.886, 0.834]], [0.115, [0.996, 0.886, 0.834]], [0.117, [0.996, 0.883, 0.830]], [0.119, [0.996, 0.883, 0.830]], [0.121, [0.996, 0.881, 0.827]], [0.123, [0.996, 0.881, 0.827]], [0.125, [0.996, 0.878, 0.823]], [0.127, [0.996, 0.878, 0.823]], [0.129, [0.996, 0.873, 0.817]], [0.131, [0.996, 0.873, 0.817]], [0.133, [0.996, 0.869, 0.811]], [0.135, [0.996, 0.869, 0.811]], [0.137, [0.995, 0.864, 0.805]], [0.139, [0.995, 0.864, 0.805]], [0.141, [0.995, 0.860, 0.799]], [0.143, [0.995, 0.860, 0.799]], [0.145, [0.995, 0.855, 0.793]], [0.147, [0.995, 0.855, 0.793]], [0.149, [0.995, 0.851, 0.787]], [0.151, [0.995, 0.851, 0.787]], [0.153, [0.994, 0.846, 0.781]], [0.155, [0.994, 0.846, 0.781]], [0.157, [0.994, 0.841, 0.775]], [0.159, [0.994, 0.841, 0.775]], [0.160, [0.994, 0.837, 0.769]], [0.162, [0.994, 0.837, 0.769]], [0.164, [0.994, 0.832, 0.762]], [0.166, [0.994, 0.832, 0.762]], [0.168, [0.993, 0.828, 0.756]], [0.170, [0.993, 0.828, 0.756]], [0.172, [0.993, 0.823, 0.750]], [0.174, [0.993, 0.823, 0.750]], [0.176, [0.993, 0.819, 0.744]], [0.178, [0.993, 0.819, 0.744]], [0.180, [0.993, 0.814, 0.738]], [0.182, [0.993, 0.814, 0.738]], [0.184, [0.992, 0.810, 0.732]], [0.186, [0.992, 0.810, 0.732]], [0.188, [0.992, 0.805, 0.726]], [0.190, [0.992, 0.805, 0.726]], [0.192, [0.992, 0.800, 0.720]], [0.194, [0.992, 0.800, 0.720]], [0.196, [0.992, 0.796, 0.714]], [0.198, [0.992, 0.796, 0.714]], [0.200, [0.991, 0.791, 0.708]], [0.202, [0.991, 0.791, 0.708]], [0.204, [0.991, 0.787, 0.702]], [0.205, [0.991, 0.787, 0.702]], [0.207, [0.991, 0.782, 0.696]], [0.209, [0.991, 0.782, 0.696]], [0.211, [0.991, 0.778, 0.690]], [0.213, [0.991, 0.778, 0.690]], [0.215, [0.990, 0.773, 0.684]], [0.217, [0.990, 0.773, 0.684]], [0.219, [0.990, 0.769, 0.678]], [0.221, [0.990, 0.769, 0.678]], [0.223, [0.990, 0.764, 0.672]], [0.225, [0.990, 0.764, 0.672]], [0.227, [0.990, 0.760, 0.666]], [0.229, [0.990, 0.760, 0.666]], [0.231, [0.989, 0.755, 0.660]], [0.233, [0.989, 0.755, 0.660]], [0.235, [0.989, 0.750, 0.654]], [0.237, [0.989, 0.750, 0.654]], [0.239, [0.989, 0.746, 0.648]], [0.241, [0.989, 0.746, 0.648]], [0.243, [0.989, 0.741, 0.642]], [0.245, [0.989, 0.741, 0.642]], [0.247, [0.988, 0.737, 0.636]], [0.249, [0.988, 0.737, 0.636]], [0.250, [0.988, 0.732, 0.630]], [0.252, [0.988, 0.732, 0.630]], [0.254, [0.988, 0.727, 0.624]], [0.256, [0.988, 0.727, 0.624]], [0.258, [0.988, 0.722, 0.618]], [0.260, [0.988, 0.722, 0.618]], [0.262, [0.988, 0.717, 0.613]], [0.264, [0.988, 0.717, 0.613]], [0.266, [0.988, 0.712, 0.607]], [0.268, [0.988, 0.712, 0.607]], [0.270, [0.988, 0.707, 0.601]], [0.272, [0.988, 0.707, 0.601]], [0.274, [0.988, 0.702, 0.595]], [0.276, [0.988, 0.702, 0.595]], [0.278, [0.988, 0.697, 0.589]], [0.280, [0.988, 0.697, 0.589]], [0.282, [0.988, 0.692, 0.584]], [0.284, [0.988, 0.692, 0.584]], [0.286, [0.988, 0.687, 0.578]], [0.288, [0.988, 0.687, 0.578]], [0.290, [0.988, 0.682, 0.572]], [0.292, [0.988, 0.682, 0.572]], [0.294, [0.988, 0.677, 0.566]], [0.295, [0.988, 0.677, 0.566]], [0.297, [0.988, 0.672, 0.561]], [0.299, [0.988, 0.672, 0.561]], [0.301, [0.988, 0.666, 0.555]], [0.303, [0.988, 0.666, 0.555]], [0.305, [0.988, 0.661, 0.549]], [0.307, [0.988, 0.661, 0.549]], [0.309, [0.988, 0.656, 0.543]], [0.311, [0.988, 0.656, 0.543]], [0.313, [0.988, 0.651, 0.537]], [0.315, [0.988, 0.651, 0.537]], [0.317, [0.988, 0.646, 0.532]], [0.319, [0.988, 0.646, 0.532]], [0.321, [0.988, 0.641, 0.526]], [0.323, [0.988, 0.641, 0.526]], [0.325, [0.988, 0.636, 0.520]], [0.327, [0.988, 0.636, 0.520]], [0.329, [0.988, 0.631, 0.514]], [0.331, [0.988, 0.631, 0.514]], [0.333, [0.988, 0.626, 0.508]], [0.335, [0.988, 0.626, 0.508]], [0.337, [0.988, 0.621, 0.503]], [0.339, [0.988, 0.621, 0.503]], [0.341, [0.988, 0.616, 0.497]], [0.342, [0.988, 0.616, 0.497]], [0.344, [0.988, 0.611, 0.491]], [0.346, [0.988, 0.611, 0.491]], [0.348, [0.988, 0.606, 0.485]], [0.350, [0.988, 0.606, 0.485]], [0.352, [0.988, 0.601, 0.480]], [0.354, [0.988, 0.601, 0.480]], [0.356, [0.988, 0.596, 0.474]], [0.358, [0.988, 0.596, 0.474]], [0.360, [0.988, 0.591, 0.468]], [0.362, [0.988, 0.591, 0.468]], [0.364, [0.988, 0.586, 0.462]], [0.366, [0.988, 0.586, 0.462]], [0.368, [0.988, 0.581, 0.456]], [0.370, [0.988, 0.581, 0.456]], [0.372, [0.988, 0.576, 0.451]], [0.374, [0.988, 0.576, 0.451]], [0.376, [0.988, 0.571, 0.445]], [0.378, [0.988, 0.571, 0.445]], [0.380, [0.988, 0.566, 0.440]], [0.382, [0.988, 0.566, 0.440]], [0.384, [0.988, 0.561, 0.435]], [0.386, [0.988, 0.561, 0.435]], [0.387, [0.988, 0.556, 0.430]], [0.389, [0.988, 0.556, 0.430]], [0.391, [0.988, 0.551, 0.426]], [0.393, [0.988, 0.551, 0.426]], [0.395, [0.988, 0.546, 0.421]], [0.397, [0.988, 0.546, 0.421]], [0.399, [0.987, 0.541, 0.416]], [0.401, [0.987, 0.541, 0.416]], [0.403, [0.987, 0.536, 0.411]], [0.405, [0.987, 0.536, 0.411]], [0.407, [0.987, 0.531, 0.406]], [0.409, [0.987, 0.531, 0.406]], [0.411, [0.987, 0.526, 0.401]], [0.413, [0.987, 0.526, 0.401]], [0.415, [0.987, 0.521, 0.396]], [0.417, [0.987, 0.521, 0.396]], [0.419, [0.987, 0.517, 0.391]], [0.421, [0.987, 0.517, 0.391]], [0.423, [0.987, 0.512, 0.386]], [0.425, [0.987, 0.512, 0.386]], [0.427, [0.987, 0.507, 0.381]], [0.429, [0.987, 0.507, 0.381]], [0.431, [0.986, 0.502, 0.376]], [0.432, [0.986, 0.502, 0.376]], [0.434, [0.986, 0.497, 0.371]], [0.436, [0.986, 0.497, 0.371]], [0.438, [0.986, 0.492, 0.366]], [0.440, [0.986, 0.492, 0.366]], [0.442, [0.986, 0.487, 0.362]], [0.444, [0.986, 0.487, 0.362]], [0.446, [0.986, 0.482, 0.357]], [0.448, [0.986, 0.482, 0.357]], [0.450, [0.986, 0.477, 0.352]], [0.452, [0.986, 0.477, 0.352]], [0.454, [0.986, 0.472, 0.347]], [0.456, [0.986, 0.472, 0.347]], [0.458, [0.986, 0.467, 0.342]], [0.460, [0.986, 0.467, 0.342]], [0.462, [0.985, 0.462, 0.337]], [0.464, [0.985, 0.462, 0.337]], [0.466, [0.985, 0.458, 0.332]], [0.468, [0.985, 0.458, 0.332]], [0.470, [0.985, 0.453, 0.327]], [0.472, [0.985, 0.453, 0.327]], [0.474, [0.985, 0.448, 0.322]], [0.476, [0.985, 0.448, 0.322]], [0.477, [0.985, 0.443, 0.317]], [0.479, [0.985, 0.443, 0.317]], [0.481, [0.985, 0.438, 0.312]], [0.483, [0.985, 0.438, 0.312]], [0.485, [0.985, 0.433, 0.307]], [0.487, [0.985, 0.433, 0.307]], [0.489, [0.985, 0.428, 0.302]], [0.491, [0.985, 0.428, 0.302]], [0.493, [0.984, 0.423, 0.298]], [0.495, [0.984, 0.423, 0.298]], [0.497, [0.984, 0.418, 0.293]], [0.499, [0.984, 0.418, 0.293]], [0.501, [0.984, 0.413, 0.288]], [0.503, [0.984, 0.413, 0.288]], [0.505, [0.982, 0.407, 0.285]], [0.507, [0.982, 0.407, 0.285]], [0.509, [0.981, 0.401, 0.281]], [0.511, [0.981, 0.401, 0.281]], [0.513, [0.979, 0.395, 0.277]], [0.515, [0.979, 0.395, 0.277]], [0.517, [0.978, 0.390, 0.274]], [0.519, [0.978, 0.390, 0.274]], [0.521, [0.976, 0.384, 0.270]], [0.523, [0.976, 0.384, 0.270]], [0.524, [0.975, 0.378, 0.266]], [0.526, [0.975, 0.378, 0.266]], [0.528, [0.973, 0.372, 0.263]], [0.530, [0.973, 0.372, 0.263]], [0.532, [0.972, 0.367, 0.259]], [0.534, [0.972, 0.367, 0.259]], [0.536, [0.970, 0.361, 0.255]], [0.538, [0.970, 0.361, 0.255]], [0.540, [0.969, 0.355, 0.251]], [0.542, [0.969, 0.355, 0.251]], [0.544, [0.967, 0.349, 0.248]], [0.546, [0.967, 0.349, 0.248]], [0.548, [0.966, 0.343, 0.244]], [0.550, [0.966, 0.343, 0.244]], [0.552, [0.964, 0.338, 0.240]], [0.554, [0.964, 0.338, 0.240]], [0.556, [0.963, 0.332, 0.237]], [0.558, [0.963, 0.332, 0.237]], [0.560, [0.961, 0.326, 0.233]], [0.562, [0.961, 0.326, 0.233]], [0.564, [0.960, 0.320, 0.229]], [0.566, [0.960, 0.320, 0.229]], [0.568, [0.958, 0.314, 0.226]], [0.569, [0.958, 0.314, 0.226]], [0.571, [0.957, 0.309, 0.222]], [0.573, [0.957, 0.309, 0.222]], [0.575, [0.956, 0.303, 0.218]], [0.577, [0.956, 0.303, 0.218]], [0.579, [0.954, 0.297, 0.215]], [0.581, [0.954, 0.297, 0.215]], [0.583, [0.953, 0.291, 0.211]], [0.585, [0.953, 0.291, 0.211]], [0.587, [0.951, 0.286, 0.207]], [0.589, [0.951, 0.286, 0.207]], [0.591, [0.950, 0.280, 0.203]], [0.593, [0.950, 0.280, 0.203]], [0.595, [0.948, 0.274, 0.200]], [0.597, [0.948, 0.274, 0.200]], [0.599, [0.947, 0.268, 0.196]], [0.601, [0.947, 0.268, 0.196]], [0.603, [0.945, 0.262, 0.192]], [0.605, [0.945, 0.262, 0.192]], [0.607, [0.944, 0.257, 0.189]], [0.609, [0.944, 0.257, 0.189]], [0.611, [0.942, 0.251, 0.185]], [0.613, [0.942, 0.251, 0.185]], [0.614, [0.941, 0.245, 0.181]], [0.616, [0.941, 0.245, 0.181]], [0.618, [0.939, 0.239, 0.178]], [0.620, [0.939, 0.239, 0.178]], [0.622, [0.938, 0.234, 0.174]], [0.624, [0.938, 0.234, 0.174]], [0.626, [0.934, 0.229, 0.171]], [0.628, [0.934, 0.229, 0.171]], [0.630, [0.930, 0.224, 0.170]], [0.632, [0.930, 0.224, 0.170]], [0.634, [0.926, 0.220, 0.168]], [0.636, [0.926, 0.220, 0.168]], [0.638, [0.921, 0.216, 0.166]], [0.640, [0.921, 0.216, 0.166]], [0.642, [0.917, 0.211, 0.164]], [0.644, [0.917, 0.211, 0.164]], [0.646, [0.912, 0.207, 0.162]], [0.648, [0.912, 0.207, 0.162]], [0.650, [0.908, 0.203, 0.160]], [0.652, [0.908, 0.203, 0.160]], [0.654, [0.903, 0.199, 0.158]], [0.656, [0.903, 0.199, 0.158]], [0.658, [0.899, 0.194, 0.157]], [0.659, [0.899, 0.194, 0.157]], [0.661, [0.895, 0.190, 0.155]], [0.663, [0.895, 0.190, 0.155]], [0.665, [0.890, 0.186, 0.153]], [0.667, [0.890, 0.186, 0.153]], [0.669, [0.886, 0.181, 0.151]], [0.671, [0.886, 0.181, 0.151]], [0.673, [0.881, 0.177, 0.149]], [0.675, [0.881, 0.177, 0.149]], [0.677, [0.877, 0.173, 0.147]], [0.679, [0.877, 0.173, 0.147]], [0.681, [0.872, 0.168, 0.146]], [0.683, [0.872, 0.168, 0.146]], [0.685, [0.868, 0.164, 0.144]], [0.687, [0.868, 0.164, 0.144]], [0.689, [0.864, 0.160, 0.142]], [0.691, [0.864, 0.160, 0.142]], [0.693, [0.859, 0.155, 0.140]], [0.695, [0.859, 0.155, 0.140]], [0.697, [0.855, 0.151, 0.138]], [0.699, [0.855, 0.151, 0.138]], [0.701, [0.850, 0.147, 0.136]], [0.703, [0.850, 0.147, 0.136]], [0.705, [0.846, 0.143, 0.134]], [0.706, [0.846, 0.143, 0.134]], [0.708, [0.841, 0.138, 0.133]], [0.710, [0.841, 0.138, 0.133]], [0.712, [0.837, 0.134, 0.131]], [0.714, [0.837, 0.134, 0.131]], [0.716, [0.833, 0.130, 0.129]], [0.718, [0.833, 0.130, 0.129]], [0.720, [0.828, 0.125, 0.127]], [0.722, [0.828, 0.125, 0.127]], [0.724, [0.824, 0.121, 0.125]], [0.726, [0.824, 0.121, 0.125]], [0.728, [0.819, 0.117, 0.123]], [0.730, [0.819, 0.117, 0.123]], [0.732, [0.815, 0.112, 0.122]], [0.734, [0.815, 0.112, 0.122]], [0.736, [0.810, 0.108, 0.120]], [0.738, [0.810, 0.108, 0.120]], [0.740, [0.806, 0.104, 0.118]], [0.742, [0.806, 0.104, 0.118]], [0.744, [0.802, 0.100, 0.116]], [0.746, [0.802, 0.100, 0.116]], [0.748, [0.797, 0.095, 0.114]], [0.750, [0.797, 0.095, 0.114]], [0.751, [0.793, 0.093, 0.113]], [0.753, [0.793, 0.093, 0.113]], [0.755, [0.788, 0.092, 0.112]], [0.757, [0.788, 0.092, 0.112]], [0.759, [0.783, 0.091, 0.111]], [0.761, [0.783, 0.091, 0.111]], [0.763, [0.779, 0.090, 0.110]], [0.765, [0.779, 0.090, 0.110]], [0.767, [0.774, 0.089, 0.109]], [0.769, [0.774, 0.089, 0.109]], [0.771, [0.769, 0.088, 0.108]], [0.773, [0.769, 0.088, 0.108]], [0.775, [0.765, 0.087, 0.107]], [0.777, [0.765, 0.087, 0.107]], [0.779, [0.760, 0.086, 0.106]], [0.781, [0.760, 0.086, 0.106]], [0.783, [0.755, 0.084, 0.105]], [0.785, [0.755, 0.084, 0.105]], [0.787, [0.750, 0.083, 0.104]], [0.789, [0.750, 0.083, 0.104]], [0.791, [0.746, 0.082, 0.103]], [0.793, [0.746, 0.082, 0.103]], [0.795, [0.741, 0.081, 0.102]], [0.796, [0.741, 0.081, 0.102]], [0.798, [0.736, 0.080, 0.101]], [0.800, [0.736, 0.080, 0.101]], [0.802, [0.732, 0.079, 0.100]], [0.804, [0.732, 0.079, 0.100]], [0.806, [0.727, 0.078, 0.099]], [0.808, [0.727, 0.078, 0.099]], [0.810, [0.722, 0.077, 0.098]], [0.812, [0.722, 0.077, 0.098]], [0.814, [0.718, 0.076, 0.097]], [0.816, [0.718, 0.076, 0.097]], [0.818, [0.713, 0.074, 0.096]], [0.820, [0.713, 0.074, 0.096]], [0.822, [0.708, 0.073, 0.095]], [0.824, [0.708, 0.073, 0.095]], [0.826, [0.704, 0.072, 0.094]], [0.828, [0.704, 0.072, 0.094]], [0.830, [0.699, 0.071, 0.093]], [0.832, [0.699, 0.071, 0.093]], [0.834, [0.694, 0.070, 0.092]], [0.836, [0.694, 0.070, 0.092]], [0.838, [0.690, 0.069, 0.091]], [0.840, [0.690, 0.069, 0.091]], [0.841, [0.685, 0.068, 0.090]], [0.843, [0.685, 0.068, 0.090]], [0.845, [0.680, 0.067, 0.089]], [0.847, [0.680, 0.067, 0.089]], [0.849, [0.676, 0.066, 0.088]], [0.851, [0.676, 0.066, 0.088]], [0.853, [0.671, 0.064, 0.087]], [0.855, [0.671, 0.064, 0.087]], [0.857, [0.666, 0.063, 0.086]], [0.859, [0.666, 0.063, 0.086]], [0.861, [0.662, 0.062, 0.085]], [0.863, [0.662, 0.062, 0.085]], [0.865, [0.657, 0.061, 0.084]], [0.867, [0.657, 0.061, 0.084]], [0.869, [0.652, 0.060, 0.083]], [0.871, [0.652, 0.060, 0.083]], [0.873, [0.648, 0.059, 0.082]], [0.875, [0.648, 0.059, 0.082]], [0.877, [0.640, 0.057, 0.081]], [0.879, [0.640, 0.057, 0.081]], [0.881, [0.633, 0.055, 0.081]], [0.883, [0.633, 0.055, 0.081]], [0.885, [0.625, 0.054, 0.080]], [0.886, [0.625, 0.054, 0.080]], [0.888, [0.618, 0.052, 0.079]], [0.890, [0.618, 0.052, 0.079]], [0.892, [0.610, 0.050, 0.078]], [0.894, [0.610, 0.050, 0.078]], [0.896, [0.602, 0.048, 0.077]], [0.898, [0.602, 0.048, 0.077]], [0.900, [0.595, 0.046, 0.076]], [0.902, [0.595, 0.046, 0.076]], [0.904, [0.587, 0.044, 0.075]], [0.906, [0.587, 0.044, 0.075]], [0.908, [0.579, 0.042, 0.074]], [0.910, [0.579, 0.042, 0.074]], [0.912, [0.572, 0.041, 0.073]], [0.914, [0.572, 0.041, 0.073]], [0.916, [0.564, 0.039, 0.072]], [0.918, [0.564, 0.039, 0.072]], [0.920, [0.556, 0.037, 0.071]], [0.922, [0.556, 0.037, 0.071]], [0.924, [0.549, 0.035, 0.070]], [0.926, [0.549, 0.035, 0.070]], [0.928, [0.541, 0.033, 0.069]], [0.930, [0.541, 0.033, 0.069]], [0.932, [0.534, 0.031, 0.068]], [0.933, [0.534, 0.031, 0.068]], [0.935, [0.526, 0.030, 0.067]], [0.937, [0.526, 0.030, 0.067]], [0.939, [0.518, 0.028, 0.066]], [0.941, [0.518, 0.028, 0.066]], [0.943, [0.511, 0.026, 0.065]], [0.945, [0.511, 0.026, 0.065]], [0.947, [0.503, 0.024, 0.064]], [0.949, [0.503, 0.024, 0.064]], [0.951, [0.495, 0.022, 0.063]], [0.953, [0.495, 0.022, 0.063]], [0.955, [0.488, 0.020, 0.062]], [0.957, [0.488, 0.020, 0.062]], [0.959, [0.480, 0.018, 0.061]], [0.961, [0.480, 0.018, 0.061]], [0.963, [0.473, 0.017, 0.060]], [0.965, [0.473, 0.017, 0.060]], [0.967, [0.465, 0.015, 0.059]], [0.969, [0.465, 0.015, 0.059]], [0.971, [0.457, 0.013, 0.058]], [0.973, [0.457, 0.013, 0.058]], [0.975, [0.450, 0.011, 0.057]], [0.977, [0.450, 0.011, 0.057]], [0.978, [0.442, 0.009, 0.056]], [0.980, [0.442, 0.009, 0.056]], [0.982, [0.434, 0.007, 0.055]], [0.984, [0.434, 0.007, 0.055]], [0.986, [0.427, 0.006, 0.054]], [0.988, [0.427, 0.006, 0.054]], [0.990, [0.419, 0.004, 0.053]], [0.992, [0.419, 0.004, 0.053]], [0.994, [0.412, 0.002, 0.052]], [0.996, [0.412, 0.002, 0.052]], [0.998, [0.404, 0.000, 0.051]], [1.000, [0.404, 0.000, 0.051]]]; +var YlGn = [[0.000, [1.000, 1.000, 0.898]], [0.002, [1.000, 1.000, 0.898]], [0.004, [0.999, 1.000, 0.893]], [0.006, [0.999, 1.000, 0.893]], [0.008, [0.998, 0.999, 0.887]], [0.010, [0.998, 0.999, 0.887]], [0.012, [0.997, 0.999, 0.882]], [0.014, [0.997, 0.999, 0.882]], [0.016, [0.996, 0.999, 0.876]], [0.018, [0.996, 0.999, 0.876]], [0.020, [0.995, 0.998, 0.871]], [0.022, [0.995, 0.998, 0.871]], [0.023, [0.994, 0.998, 0.866]], [0.025, [0.994, 0.998, 0.866]], [0.027, [0.993, 0.997, 0.860]], [0.029, [0.993, 0.997, 0.860]], [0.031, [0.992, 0.997, 0.855]], [0.033, [0.992, 0.997, 0.855]], [0.035, [0.991, 0.997, 0.849]], [0.037, [0.991, 0.997, 0.849]], [0.039, [0.990, 0.996, 0.844]], [0.041, [0.990, 0.996, 0.844]], [0.043, [0.989, 0.996, 0.838]], [0.045, [0.989, 0.996, 0.838]], [0.047, [0.988, 0.996, 0.833]], [0.049, [0.988, 0.996, 0.833]], [0.051, [0.987, 0.995, 0.828]], [0.053, [0.987, 0.995, 0.828]], [0.055, [0.986, 0.995, 0.822]], [0.057, [0.986, 0.995, 0.822]], [0.059, [0.985, 0.994, 0.817]], [0.061, [0.985, 0.994, 0.817]], [0.063, [0.984, 0.994, 0.811]], [0.065, [0.984, 0.994, 0.811]], [0.067, [0.983, 0.994, 0.806]], [0.068, [0.983, 0.994, 0.806]], [0.070, [0.982, 0.993, 0.801]], [0.072, [0.982, 0.993, 0.801]], [0.074, [0.981, 0.993, 0.795]], [0.076, [0.981, 0.993, 0.795]], [0.078, [0.980, 0.993, 0.790]], [0.080, [0.980, 0.993, 0.790]], [0.082, [0.979, 0.992, 0.784]], [0.084, [0.979, 0.992, 0.784]], [0.086, [0.978, 0.992, 0.779]], [0.088, [0.978, 0.992, 0.779]], [0.090, [0.977, 0.992, 0.774]], [0.092, [0.977, 0.992, 0.774]], [0.094, [0.976, 0.991, 0.768]], [0.096, [0.976, 0.991, 0.768]], [0.098, [0.975, 0.991, 0.763]], [0.100, [0.975, 0.991, 0.763]], [0.102, [0.974, 0.990, 0.757]], [0.104, [0.974, 0.990, 0.757]], [0.106, [0.973, 0.990, 0.752]], [0.108, [0.973, 0.990, 0.752]], [0.110, [0.972, 0.990, 0.746]], [0.112, [0.972, 0.990, 0.746]], [0.114, [0.971, 0.989, 0.741]], [0.115, [0.971, 0.989, 0.741]], [0.117, [0.970, 0.989, 0.736]], [0.119, [0.970, 0.989, 0.736]], [0.121, [0.969, 0.989, 0.730]], [0.123, [0.969, 0.989, 0.730]], [0.125, [0.968, 0.988, 0.725]], [0.127, [0.968, 0.988, 0.725]], [0.129, [0.964, 0.987, 0.722]], [0.131, [0.964, 0.987, 0.722]], [0.133, [0.961, 0.985, 0.720]], [0.135, [0.961, 0.985, 0.720]], [0.137, [0.957, 0.984, 0.717]], [0.139, [0.957, 0.984, 0.717]], [0.141, [0.953, 0.982, 0.714]], [0.143, [0.953, 0.982, 0.714]], [0.145, [0.950, 0.981, 0.712]], [0.147, [0.950, 0.981, 0.712]], [0.149, [0.946, 0.979, 0.709]], [0.151, [0.946, 0.979, 0.709]], [0.153, [0.942, 0.978, 0.706]], [0.155, [0.942, 0.978, 0.706]], [0.157, [0.939, 0.976, 0.703]], [0.159, [0.939, 0.976, 0.703]], [0.160, [0.935, 0.975, 0.701]], [0.162, [0.935, 0.975, 0.701]], [0.164, [0.931, 0.973, 0.698]], [0.166, [0.931, 0.973, 0.698]], [0.168, [0.928, 0.972, 0.695]], [0.170, [0.928, 0.972, 0.695]], [0.172, [0.924, 0.970, 0.693]], [0.174, [0.924, 0.970, 0.693]], [0.176, [0.920, 0.969, 0.690]], [0.178, [0.920, 0.969, 0.690]], [0.180, [0.916, 0.967, 0.687]], [0.182, [0.916, 0.967, 0.687]], [0.184, [0.913, 0.966, 0.685]], [0.186, [0.913, 0.966, 0.685]], [0.188, [0.909, 0.964, 0.682]], [0.190, [0.909, 0.964, 0.682]], [0.192, [0.905, 0.963, 0.679]], [0.194, [0.905, 0.963, 0.679]], [0.196, [0.902, 0.961, 0.676]], [0.198, [0.902, 0.961, 0.676]], [0.200, [0.898, 0.960, 0.674]], [0.202, [0.898, 0.960, 0.674]], [0.204, [0.894, 0.959, 0.671]], [0.205, [0.894, 0.959, 0.671]], [0.207, [0.891, 0.957, 0.668]], [0.209, [0.891, 0.957, 0.668]], [0.211, [0.887, 0.956, 0.666]], [0.213, [0.887, 0.956, 0.666]], [0.215, [0.883, 0.954, 0.663]], [0.217, [0.883, 0.954, 0.663]], [0.219, [0.880, 0.953, 0.660]], [0.221, [0.880, 0.953, 0.660]], [0.223, [0.876, 0.951, 0.657]], [0.225, [0.876, 0.951, 0.657]], [0.227, [0.872, 0.950, 0.655]], [0.229, [0.872, 0.950, 0.655]], [0.231, [0.869, 0.948, 0.652]], [0.233, [0.869, 0.948, 0.652]], [0.235, [0.865, 0.947, 0.649]], [0.237, [0.865, 0.947, 0.649]], [0.239, [0.861, 0.945, 0.647]], [0.241, [0.861, 0.945, 0.647]], [0.243, [0.857, 0.944, 0.644]], [0.245, [0.857, 0.944, 0.644]], [0.247, [0.854, 0.942, 0.641]], [0.249, [0.854, 0.942, 0.641]], [0.250, [0.850, 0.941, 0.639]], [0.252, [0.850, 0.941, 0.639]], [0.254, [0.844, 0.938, 0.636]], [0.256, [0.844, 0.938, 0.636]], [0.258, [0.839, 0.936, 0.633]], [0.260, [0.839, 0.936, 0.633]], [0.262, [0.833, 0.934, 0.631]], [0.264, [0.833, 0.934, 0.631]], [0.266, [0.828, 0.931, 0.628]], [0.268, [0.828, 0.931, 0.628]], [0.270, [0.823, 0.929, 0.626]], [0.272, [0.823, 0.929, 0.626]], [0.274, [0.817, 0.927, 0.623]], [0.276, [0.817, 0.927, 0.623]], [0.278, [0.812, 0.924, 0.620]], [0.280, [0.812, 0.924, 0.620]], [0.282, [0.806, 0.922, 0.618]], [0.284, [0.806, 0.922, 0.618]], [0.286, [0.801, 0.920, 0.615]], [0.288, [0.801, 0.920, 0.615]], [0.290, [0.795, 0.917, 0.613]], [0.292, [0.795, 0.917, 0.613]], [0.294, [0.790, 0.915, 0.610]], [0.295, [0.790, 0.915, 0.610]], [0.297, [0.785, 0.913, 0.608]], [0.299, [0.785, 0.913, 0.608]], [0.301, [0.779, 0.910, 0.605]], [0.303, [0.779, 0.910, 0.605]], [0.305, [0.774, 0.908, 0.602]], [0.307, [0.774, 0.908, 0.602]], [0.309, [0.768, 0.906, 0.600]], [0.311, [0.768, 0.906, 0.600]], [0.313, [0.763, 0.903, 0.597]], [0.315, [0.763, 0.903, 0.597]], [0.317, [0.758, 0.901, 0.595]], [0.319, [0.758, 0.901, 0.595]], [0.321, [0.752, 0.899, 0.592]], [0.323, [0.752, 0.899, 0.592]], [0.325, [0.747, 0.896, 0.589]], [0.327, [0.747, 0.896, 0.589]], [0.329, [0.741, 0.894, 0.587]], [0.331, [0.741, 0.894, 0.587]], [0.333, [0.736, 0.892, 0.584]], [0.335, [0.736, 0.892, 0.584]], [0.337, [0.731, 0.889, 0.582]], [0.339, [0.731, 0.889, 0.582]], [0.341, [0.725, 0.887, 0.579]], [0.342, [0.725, 0.887, 0.579]], [0.344, [0.720, 0.884, 0.577]], [0.346, [0.720, 0.884, 0.577]], [0.348, [0.714, 0.882, 0.574]], [0.350, [0.714, 0.882, 0.574]], [0.352, [0.709, 0.880, 0.571]], [0.354, [0.709, 0.880, 0.571]], [0.356, [0.703, 0.877, 0.569]], [0.358, [0.703, 0.877, 0.569]], [0.360, [0.698, 0.875, 0.566]], [0.362, [0.698, 0.875, 0.566]], [0.364, [0.693, 0.873, 0.564]], [0.366, [0.693, 0.873, 0.564]], [0.368, [0.687, 0.870, 0.561]], [0.370, [0.687, 0.870, 0.561]], [0.372, [0.682, 0.868, 0.558]], [0.374, [0.682, 0.868, 0.558]], [0.376, [0.676, 0.866, 0.556]], [0.378, [0.676, 0.866, 0.556]], [0.380, [0.669, 0.863, 0.553]], [0.382, [0.669, 0.863, 0.553]], [0.384, [0.663, 0.860, 0.551]], [0.386, [0.663, 0.860, 0.551]], [0.387, [0.656, 0.857, 0.548]], [0.389, [0.656, 0.857, 0.548]], [0.391, [0.650, 0.854, 0.546]], [0.393, [0.650, 0.854, 0.546]], [0.395, [0.643, 0.851, 0.543]], [0.397, [0.643, 0.851, 0.543]], [0.399, [0.637, 0.849, 0.540]], [0.401, [0.637, 0.849, 0.540]], [0.403, [0.630, 0.846, 0.538]], [0.405, [0.630, 0.846, 0.538]], [0.407, [0.624, 0.843, 0.535]], [0.409, [0.624, 0.843, 0.535]], [0.411, [0.617, 0.840, 0.533]], [0.413, [0.617, 0.840, 0.533]], [0.415, [0.611, 0.837, 0.530]], [0.417, [0.611, 0.837, 0.530]], [0.419, [0.604, 0.834, 0.527]], [0.421, [0.604, 0.834, 0.527]], [0.423, [0.598, 0.832, 0.525]], [0.425, [0.598, 0.832, 0.525]], [0.427, [0.591, 0.829, 0.522]], [0.429, [0.591, 0.829, 0.522]], [0.431, [0.585, 0.826, 0.520]], [0.432, [0.585, 0.826, 0.520]], [0.434, [0.578, 0.823, 0.517]], [0.436, [0.578, 0.823, 0.517]], [0.438, [0.572, 0.820, 0.515]], [0.440, [0.572, 0.820, 0.515]], [0.442, [0.565, 0.818, 0.512]], [0.444, [0.565, 0.818, 0.512]], [0.446, [0.559, 0.815, 0.509]], [0.448, [0.559, 0.815, 0.509]], [0.450, [0.552, 0.812, 0.507]], [0.452, [0.552, 0.812, 0.507]], [0.454, [0.546, 0.809, 0.504]], [0.456, [0.546, 0.809, 0.504]], [0.458, [0.539, 0.806, 0.502]], [0.460, [0.539, 0.806, 0.502]], [0.462, [0.533, 0.803, 0.499]], [0.464, [0.533, 0.803, 0.499]], [0.466, [0.526, 0.801, 0.496]], [0.468, [0.526, 0.801, 0.496]], [0.470, [0.519, 0.798, 0.494]], [0.472, [0.519, 0.798, 0.494]], [0.474, [0.513, 0.795, 0.491]], [0.476, [0.513, 0.795, 0.491]], [0.477, [0.506, 0.792, 0.489]], [0.479, [0.506, 0.792, 0.489]], [0.481, [0.500, 0.789, 0.486]], [0.483, [0.500, 0.789, 0.486]], [0.485, [0.493, 0.786, 0.484]], [0.487, [0.493, 0.786, 0.484]], [0.489, [0.487, 0.784, 0.481]], [0.491, [0.487, 0.784, 0.481]], [0.493, [0.480, 0.781, 0.478]], [0.495, [0.480, 0.781, 0.478]], [0.497, [0.474, 0.778, 0.476]], [0.499, [0.474, 0.778, 0.476]], [0.501, [0.467, 0.775, 0.473]], [0.503, [0.467, 0.775, 0.473]], [0.505, [0.460, 0.771, 0.469]], [0.507, [0.460, 0.771, 0.469]], [0.509, [0.454, 0.768, 0.466]], [0.511, [0.454, 0.768, 0.466]], [0.513, [0.447, 0.765, 0.462]], [0.515, [0.447, 0.765, 0.462]], [0.517, [0.440, 0.762, 0.459]], [0.519, [0.440, 0.762, 0.459]], [0.521, [0.433, 0.758, 0.456]], [0.523, [0.433, 0.758, 0.456]], [0.524, [0.427, 0.755, 0.452]], [0.526, [0.427, 0.755, 0.452]], [0.528, [0.420, 0.752, 0.449]], [0.530, [0.420, 0.752, 0.449]], [0.532, [0.413, 0.748, 0.445]], [0.534, [0.413, 0.748, 0.445]], [0.536, [0.406, 0.745, 0.442]], [0.538, [0.406, 0.745, 0.442]], [0.540, [0.400, 0.742, 0.438]], [0.542, [0.400, 0.742, 0.438]], [0.544, [0.393, 0.738, 0.435]], [0.546, [0.393, 0.738, 0.435]], [0.548, [0.386, 0.735, 0.431]], [0.550, [0.386, 0.735, 0.431]], [0.552, [0.379, 0.732, 0.428]], [0.554, [0.379, 0.732, 0.428]], [0.556, [0.372, 0.728, 0.425]], [0.558, [0.372, 0.728, 0.425]], [0.560, [0.366, 0.725, 0.421]], [0.562, [0.366, 0.725, 0.421]], [0.564, [0.359, 0.722, 0.418]], [0.566, [0.359, 0.722, 0.418]], [0.568, [0.352, 0.718, 0.414]], [0.569, [0.352, 0.718, 0.414]], [0.571, [0.345, 0.715, 0.411]], [0.573, [0.345, 0.715, 0.411]], [0.575, [0.339, 0.712, 0.407]], [0.577, [0.339, 0.712, 0.407]], [0.579, [0.332, 0.708, 0.404]], [0.581, [0.332, 0.708, 0.404]], [0.583, [0.325, 0.705, 0.400]], [0.585, [0.325, 0.705, 0.400]], [0.587, [0.318, 0.702, 0.397]], [0.589, [0.318, 0.702, 0.397]], [0.591, [0.312, 0.698, 0.394]], [0.593, [0.312, 0.698, 0.394]], [0.595, [0.305, 0.695, 0.390]], [0.597, [0.305, 0.695, 0.390]], [0.599, [0.298, 0.692, 0.387]], [0.601, [0.298, 0.692, 0.387]], [0.603, [0.291, 0.688, 0.383]], [0.605, [0.291, 0.688, 0.383]], [0.607, [0.285, 0.685, 0.380]], [0.609, [0.285, 0.685, 0.380]], [0.611, [0.278, 0.682, 0.376]], [0.613, [0.278, 0.682, 0.376]], [0.614, [0.271, 0.678, 0.373]], [0.616, [0.271, 0.678, 0.373]], [0.618, [0.264, 0.675, 0.369]], [0.620, [0.264, 0.675, 0.369]], [0.622, [0.257, 0.672, 0.366]], [0.624, [0.257, 0.672, 0.366]], [0.626, [0.253, 0.668, 0.363]], [0.628, [0.253, 0.668, 0.363]], [0.630, [0.249, 0.663, 0.360]], [0.632, [0.249, 0.663, 0.360]], [0.634, [0.245, 0.658, 0.356]], [0.636, [0.245, 0.658, 0.356]], [0.638, [0.242, 0.653, 0.353]], [0.640, [0.242, 0.653, 0.353]], [0.642, [0.238, 0.648, 0.350]], [0.644, [0.238, 0.648, 0.350]], [0.646, [0.234, 0.644, 0.347]], [0.648, [0.234, 0.644, 0.347]], [0.650, [0.230, 0.639, 0.344]], [0.652, [0.230, 0.639, 0.344]], [0.654, [0.227, 0.634, 0.340]], [0.656, [0.227, 0.634, 0.340]], [0.658, [0.223, 0.629, 0.337]], [0.659, [0.223, 0.629, 0.337]], [0.661, [0.219, 0.624, 0.334]], [0.663, [0.219, 0.624, 0.334]], [0.665, [0.216, 0.620, 0.331]], [0.667, [0.216, 0.620, 0.331]], [0.669, [0.212, 0.615, 0.328]], [0.671, [0.212, 0.615, 0.328]], [0.673, [0.208, 0.610, 0.324]], [0.675, [0.208, 0.610, 0.324]], [0.677, [0.205, 0.605, 0.321]], [0.679, [0.205, 0.605, 0.321]], [0.681, [0.201, 0.600, 0.318]], [0.683, [0.201, 0.600, 0.318]], [0.685, [0.197, 0.596, 0.315]], [0.687, [0.197, 0.596, 0.315]], [0.689, [0.194, 0.591, 0.312]], [0.691, [0.194, 0.591, 0.312]], [0.693, [0.190, 0.586, 0.308]], [0.695, [0.190, 0.586, 0.308]], [0.697, [0.186, 0.581, 0.305]], [0.699, [0.186, 0.581, 0.305]], [0.701, [0.182, 0.576, 0.302]], [0.703, [0.182, 0.576, 0.302]], [0.705, [0.179, 0.572, 0.299]], [0.706, [0.179, 0.572, 0.299]], [0.708, [0.175, 0.567, 0.296]], [0.710, [0.175, 0.567, 0.296]], [0.712, [0.171, 0.562, 0.292]], [0.714, [0.171, 0.562, 0.292]], [0.716, [0.168, 0.557, 0.289]], [0.718, [0.168, 0.557, 0.289]], [0.720, [0.164, 0.552, 0.286]], [0.722, [0.164, 0.552, 0.286]], [0.724, [0.160, 0.548, 0.283]], [0.726, [0.160, 0.548, 0.283]], [0.728, [0.157, 0.543, 0.280]], [0.730, [0.157, 0.543, 0.280]], [0.732, [0.153, 0.538, 0.276]], [0.734, [0.153, 0.538, 0.276]], [0.736, [0.149, 0.533, 0.273]], [0.738, [0.149, 0.533, 0.273]], [0.740, [0.146, 0.528, 0.270]], [0.742, [0.146, 0.528, 0.270]], [0.744, [0.142, 0.524, 0.267]], [0.746, [0.142, 0.524, 0.267]], [0.748, [0.138, 0.519, 0.264]], [0.750, [0.138, 0.519, 0.264]], [0.751, [0.134, 0.515, 0.262]], [0.753, [0.134, 0.515, 0.262]], [0.755, [0.130, 0.512, 0.260]], [0.757, [0.130, 0.512, 0.260]], [0.759, [0.125, 0.508, 0.259]], [0.761, [0.125, 0.508, 0.259]], [0.763, [0.121, 0.505, 0.257]], [0.765, [0.121, 0.505, 0.257]], [0.767, [0.117, 0.501, 0.256]], [0.769, [0.117, 0.501, 0.256]], [0.771, [0.112, 0.498, 0.254]], [0.773, [0.112, 0.498, 0.254]], [0.775, [0.108, 0.494, 0.253]], [0.777, [0.108, 0.494, 0.253]], [0.779, [0.104, 0.491, 0.251]], [0.781, [0.104, 0.491, 0.251]], [0.783, [0.100, 0.488, 0.250]], [0.785, [0.100, 0.488, 0.250]], [0.787, [0.095, 0.484, 0.248]], [0.789, [0.095, 0.484, 0.248]], [0.791, [0.091, 0.481, 0.247]], [0.793, [0.091, 0.481, 0.247]], [0.795, [0.087, 0.477, 0.245]], [0.796, [0.087, 0.477, 0.245]], [0.798, [0.082, 0.474, 0.244]], [0.800, [0.082, 0.474, 0.244]], [0.802, [0.078, 0.470, 0.242]], [0.804, [0.078, 0.470, 0.242]], [0.806, [0.074, 0.467, 0.241]], [0.808, [0.074, 0.467, 0.241]], [0.810, [0.069, 0.463, 0.239]], [0.812, [0.069, 0.463, 0.239]], [0.814, [0.065, 0.460, 0.238]], [0.816, [0.065, 0.460, 0.238]], [0.818, [0.061, 0.457, 0.237]], [0.820, [0.061, 0.457, 0.237]], [0.822, [0.057, 0.453, 0.235]], [0.824, [0.057, 0.453, 0.235]], [0.826, [0.052, 0.450, 0.234]], [0.828, [0.052, 0.450, 0.234]], [0.830, [0.048, 0.446, 0.232]], [0.832, [0.048, 0.446, 0.232]], [0.834, [0.044, 0.443, 0.231]], [0.836, [0.044, 0.443, 0.231]], [0.838, [0.039, 0.439, 0.229]], [0.840, [0.039, 0.439, 0.229]], [0.841, [0.035, 0.436, 0.228]], [0.843, [0.035, 0.436, 0.228]], [0.845, [0.031, 0.432, 0.226]], [0.847, [0.031, 0.432, 0.226]], [0.849, [0.026, 0.429, 0.225]], [0.851, [0.026, 0.429, 0.225]], [0.853, [0.022, 0.425, 0.223]], [0.855, [0.022, 0.425, 0.223]], [0.857, [0.018, 0.422, 0.222]], [0.859, [0.018, 0.422, 0.222]], [0.861, [0.013, 0.419, 0.220]], [0.863, [0.013, 0.419, 0.220]], [0.865, [0.009, 0.415, 0.219]], [0.867, [0.009, 0.415, 0.219]], [0.869, [0.005, 0.412, 0.217]], [0.871, [0.005, 0.412, 0.217]], [0.873, [0.001, 0.408, 0.216]], [0.875, [0.001, 0.408, 0.216]], [0.877, [0.000, 0.404, 0.214]], [0.879, [0.000, 0.404, 0.214]], [0.881, [0.000, 0.400, 0.212]], [0.883, [0.000, 0.400, 0.212]], [0.885, [0.000, 0.395, 0.211]], [0.886, [0.000, 0.395, 0.211]], [0.888, [0.000, 0.391, 0.209]], [0.890, [0.000, 0.391, 0.209]], [0.892, [0.000, 0.387, 0.207]], [0.894, [0.000, 0.387, 0.207]], [0.896, [0.000, 0.383, 0.206]], [0.898, [0.000, 0.383, 0.206]], [0.900, [0.000, 0.378, 0.204]], [0.902, [0.000, 0.378, 0.204]], [0.904, [0.000, 0.374, 0.202]], [0.906, [0.000, 0.374, 0.202]], [0.908, [0.000, 0.370, 0.200]], [0.910, [0.000, 0.370, 0.200]], [0.912, [0.000, 0.365, 0.199]], [0.914, [0.000, 0.365, 0.199]], [0.916, [0.000, 0.361, 0.197]], [0.918, [0.000, 0.361, 0.197]], [0.920, [0.000, 0.357, 0.195]], [0.922, [0.000, 0.357, 0.195]], [0.924, [0.000, 0.352, 0.194]], [0.926, [0.000, 0.352, 0.194]], [0.928, [0.000, 0.348, 0.192]], [0.930, [0.000, 0.348, 0.192]], [0.932, [0.000, 0.344, 0.190]], [0.933, [0.000, 0.344, 0.190]], [0.935, [0.000, 0.339, 0.188]], [0.937, [0.000, 0.339, 0.188]], [0.939, [0.000, 0.335, 0.187]], [0.941, [0.000, 0.335, 0.187]], [0.943, [0.000, 0.331, 0.185]], [0.945, [0.000, 0.331, 0.185]], [0.947, [0.000, 0.327, 0.183]], [0.949, [0.000, 0.327, 0.183]], [0.951, [0.000, 0.322, 0.181]], [0.953, [0.000, 0.322, 0.181]], [0.955, [0.000, 0.318, 0.180]], [0.957, [0.000, 0.318, 0.180]], [0.959, [0.000, 0.314, 0.178]], [0.961, [0.000, 0.314, 0.178]], [0.963, [0.000, 0.309, 0.176]], [0.965, [0.000, 0.309, 0.176]], [0.967, [0.000, 0.305, 0.175]], [0.969, [0.000, 0.305, 0.175]], [0.971, [0.000, 0.301, 0.173]], [0.973, [0.000, 0.301, 0.173]], [0.975, [0.000, 0.296, 0.171]], [0.977, [0.000, 0.296, 0.171]], [0.978, [0.000, 0.292, 0.169]], [0.980, [0.000, 0.292, 0.169]], [0.982, [0.000, 0.288, 0.168]], [0.984, [0.000, 0.288, 0.168]], [0.986, [0.000, 0.284, 0.166]], [0.988, [0.000, 0.284, 0.166]], [0.990, [0.000, 0.279, 0.164]], [0.992, [0.000, 0.279, 0.164]], [0.994, [0.000, 0.275, 0.163]], [0.996, [0.000, 0.275, 0.163]], [0.998, [0.000, 0.271, 0.161]], [1.000, [0.000, 0.271, 0.161]]]; +var YlGnBu = [[0.000, [1.000, 1.000, 0.851]], [0.002, [1.000, 1.000, 0.851]], [0.004, [0.998, 0.999, 0.846]], [0.006, [0.998, 0.999, 0.846]], [0.008, [0.996, 0.998, 0.841]], [0.010, [0.996, 0.998, 0.841]], [0.012, [0.993, 0.997, 0.836]], [0.014, [0.993, 0.997, 0.836]], [0.016, [0.991, 0.997, 0.831]], [0.018, [0.991, 0.997, 0.831]], [0.020, [0.989, 0.996, 0.826]], [0.022, [0.989, 0.996, 0.826]], [0.023, [0.987, 0.995, 0.821]], [0.025, [0.987, 0.995, 0.821]], [0.027, [0.984, 0.994, 0.817]], [0.029, [0.984, 0.994, 0.817]], [0.031, [0.982, 0.993, 0.812]], [0.033, [0.982, 0.993, 0.812]], [0.035, [0.980, 0.992, 0.807]], [0.037, [0.980, 0.992, 0.807]], [0.039, [0.978, 0.991, 0.802]], [0.041, [0.978, 0.991, 0.802]], [0.043, [0.976, 0.991, 0.797]], [0.045, [0.976, 0.991, 0.797]], [0.047, [0.973, 0.990, 0.792]], [0.049, [0.973, 0.990, 0.792]], [0.051, [0.971, 0.989, 0.787]], [0.053, [0.971, 0.989, 0.787]], [0.055, [0.969, 0.988, 0.782]], [0.057, [0.969, 0.988, 0.782]], [0.059, [0.967, 0.987, 0.777]], [0.061, [0.967, 0.987, 0.777]], [0.063, [0.965, 0.986, 0.772]], [0.065, [0.965, 0.986, 0.772]], [0.067, [0.962, 0.985, 0.767]], [0.068, [0.962, 0.985, 0.767]], [0.070, [0.960, 0.984, 0.762]], [0.072, [0.960, 0.984, 0.762]], [0.074, [0.958, 0.984, 0.757]], [0.076, [0.958, 0.984, 0.757]], [0.078, [0.956, 0.983, 0.753]], [0.080, [0.956, 0.983, 0.753]], [0.082, [0.953, 0.982, 0.748]], [0.084, [0.953, 0.982, 0.748]], [0.086, [0.951, 0.981, 0.743]], [0.088, [0.951, 0.981, 0.743]], [0.090, [0.949, 0.980, 0.738]], [0.092, [0.949, 0.980, 0.738]], [0.094, [0.947, 0.979, 0.733]], [0.096, [0.947, 0.979, 0.733]], [0.098, [0.945, 0.978, 0.728]], [0.100, [0.945, 0.978, 0.728]], [0.102, [0.942, 0.978, 0.723]], [0.104, [0.942, 0.978, 0.723]], [0.106, [0.940, 0.977, 0.718]], [0.108, [0.940, 0.977, 0.718]], [0.110, [0.938, 0.976, 0.713]], [0.112, [0.938, 0.976, 0.713]], [0.114, [0.936, 0.975, 0.708]], [0.115, [0.936, 0.975, 0.708]], [0.117, [0.934, 0.974, 0.703]], [0.119, [0.934, 0.974, 0.703]], [0.121, [0.931, 0.973, 0.698]], [0.123, [0.931, 0.973, 0.698]], [0.125, [0.929, 0.972, 0.694]], [0.127, [0.929, 0.972, 0.694]], [0.129, [0.924, 0.970, 0.695]], [0.131, [0.924, 0.970, 0.695]], [0.133, [0.919, 0.969, 0.695]], [0.135, [0.919, 0.969, 0.695]], [0.137, [0.915, 0.967, 0.695]], [0.139, [0.915, 0.967, 0.695]], [0.141, [0.910, 0.965, 0.696]], [0.143, [0.910, 0.965, 0.696]], [0.145, [0.905, 0.963, 0.696]], [0.147, [0.905, 0.963, 0.696]], [0.149, [0.901, 0.961, 0.696]], [0.151, [0.901, 0.961, 0.696]], [0.153, [0.896, 0.959, 0.697]], [0.155, [0.896, 0.959, 0.697]], [0.157, [0.891, 0.958, 0.697]], [0.159, [0.891, 0.958, 0.697]], [0.160, [0.887, 0.956, 0.697]], [0.162, [0.887, 0.956, 0.697]], [0.164, [0.882, 0.954, 0.698]], [0.166, [0.882, 0.954, 0.698]], [0.168, [0.877, 0.952, 0.698]], [0.170, [0.877, 0.952, 0.698]], [0.172, [0.873, 0.950, 0.699]], [0.174, [0.873, 0.950, 0.699]], [0.176, [0.868, 0.948, 0.699]], [0.178, [0.868, 0.948, 0.699]], [0.180, [0.863, 0.946, 0.699]], [0.182, [0.863, 0.946, 0.699]], [0.184, [0.859, 0.945, 0.700]], [0.186, [0.859, 0.945, 0.700]], [0.188, [0.854, 0.943, 0.700]], [0.190, [0.854, 0.943, 0.700]], [0.192, [0.849, 0.941, 0.700]], [0.194, [0.849, 0.941, 0.700]], [0.196, [0.845, 0.939, 0.701]], [0.198, [0.845, 0.939, 0.701]], [0.200, [0.840, 0.937, 0.701]], [0.202, [0.840, 0.937, 0.701]], [0.204, [0.835, 0.935, 0.702]], [0.205, [0.835, 0.935, 0.702]], [0.207, [0.831, 0.934, 0.702]], [0.209, [0.831, 0.934, 0.702]], [0.211, [0.826, 0.932, 0.702]], [0.213, [0.826, 0.932, 0.702]], [0.215, [0.821, 0.930, 0.703]], [0.217, [0.821, 0.930, 0.703]], [0.219, [0.817, 0.928, 0.703]], [0.221, [0.817, 0.928, 0.703]], [0.223, [0.812, 0.926, 0.703]], [0.225, [0.812, 0.926, 0.703]], [0.227, [0.807, 0.924, 0.704]], [0.229, [0.807, 0.924, 0.704]], [0.231, [0.803, 0.922, 0.704]], [0.233, [0.803, 0.922, 0.704]], [0.235, [0.798, 0.921, 0.704]], [0.237, [0.798, 0.921, 0.704]], [0.239, [0.793, 0.919, 0.705]], [0.241, [0.793, 0.919, 0.705]], [0.243, [0.789, 0.917, 0.705]], [0.245, [0.789, 0.917, 0.705]], [0.247, [0.784, 0.915, 0.706]], [0.249, [0.784, 0.915, 0.706]], [0.250, [0.778, 0.913, 0.706]], [0.252, [0.778, 0.913, 0.706]], [0.254, [0.769, 0.909, 0.707]], [0.256, [0.769, 0.909, 0.707]], [0.258, [0.760, 0.906, 0.708]], [0.260, [0.760, 0.906, 0.708]], [0.262, [0.752, 0.903, 0.709]], [0.264, [0.752, 0.903, 0.709]], [0.266, [0.743, 0.899, 0.710]], [0.268, [0.743, 0.899, 0.710]], [0.270, [0.734, 0.896, 0.710]], [0.272, [0.734, 0.896, 0.710]], [0.274, [0.725, 0.892, 0.711]], [0.276, [0.725, 0.892, 0.711]], [0.278, [0.716, 0.889, 0.712]], [0.280, [0.716, 0.889, 0.712]], [0.282, [0.707, 0.885, 0.713]], [0.284, [0.707, 0.885, 0.713]], [0.286, [0.698, 0.882, 0.714]], [0.288, [0.698, 0.882, 0.714]], [0.290, [0.690, 0.878, 0.715]], [0.292, [0.690, 0.878, 0.715]], [0.294, [0.681, 0.875, 0.716]], [0.295, [0.681, 0.875, 0.716]], [0.297, [0.672, 0.872, 0.716]], [0.299, [0.672, 0.872, 0.716]], [0.301, [0.663, 0.868, 0.717]], [0.303, [0.663, 0.868, 0.717]], [0.305, [0.654, 0.865, 0.718]], [0.307, [0.654, 0.865, 0.718]], [0.309, [0.645, 0.861, 0.719]], [0.311, [0.645, 0.861, 0.719]], [0.313, [0.636, 0.858, 0.720]], [0.315, [0.636, 0.858, 0.720]], [0.317, [0.628, 0.854, 0.721]], [0.319, [0.628, 0.854, 0.721]], [0.321, [0.619, 0.851, 0.722]], [0.323, [0.619, 0.851, 0.722]], [0.325, [0.610, 0.847, 0.722]], [0.327, [0.610, 0.847, 0.722]], [0.329, [0.601, 0.844, 0.723]], [0.331, [0.601, 0.844, 0.723]], [0.333, [0.592, 0.841, 0.724]], [0.335, [0.592, 0.841, 0.724]], [0.337, [0.583, 0.837, 0.725]], [0.339, [0.583, 0.837, 0.725]], [0.341, [0.574, 0.834, 0.726]], [0.342, [0.574, 0.834, 0.726]], [0.344, [0.566, 0.830, 0.727]], [0.346, [0.566, 0.830, 0.727]], [0.348, [0.557, 0.827, 0.728]], [0.350, [0.557, 0.827, 0.728]], [0.352, [0.548, 0.823, 0.728]], [0.354, [0.548, 0.823, 0.728]], [0.356, [0.539, 0.820, 0.729]], [0.358, [0.539, 0.820, 0.729]], [0.360, [0.530, 0.816, 0.730]], [0.362, [0.530, 0.816, 0.730]], [0.364, [0.521, 0.813, 0.731]], [0.366, [0.521, 0.813, 0.731]], [0.368, [0.512, 0.810, 0.732]], [0.370, [0.512, 0.810, 0.732]], [0.372, [0.504, 0.806, 0.733]], [0.374, [0.504, 0.806, 0.733]], [0.376, [0.495, 0.803, 0.734]], [0.378, [0.495, 0.803, 0.734]], [0.380, [0.488, 0.800, 0.735]], [0.382, [0.488, 0.800, 0.735]], [0.384, [0.480, 0.797, 0.736]], [0.386, [0.480, 0.797, 0.736]], [0.387, [0.472, 0.794, 0.737]], [0.389, [0.472, 0.794, 0.737]], [0.391, [0.465, 0.792, 0.738]], [0.393, [0.465, 0.792, 0.738]], [0.395, [0.457, 0.789, 0.739]], [0.397, [0.457, 0.789, 0.739]], [0.399, [0.449, 0.786, 0.740]], [0.401, [0.449, 0.786, 0.740]], [0.403, [0.442, 0.783, 0.741]], [0.405, [0.442, 0.783, 0.741]], [0.407, [0.434, 0.780, 0.743]], [0.409, [0.434, 0.780, 0.743]], [0.411, [0.427, 0.777, 0.744]], [0.413, [0.427, 0.777, 0.744]], [0.415, [0.419, 0.775, 0.745]], [0.417, [0.419, 0.775, 0.745]], [0.419, [0.411, 0.772, 0.746]], [0.421, [0.411, 0.772, 0.746]], [0.423, [0.404, 0.769, 0.747]], [0.425, [0.404, 0.769, 0.747]], [0.427, [0.396, 0.766, 0.748]], [0.429, [0.396, 0.766, 0.748]], [0.431, [0.388, 0.763, 0.749]], [0.432, [0.388, 0.763, 0.749]], [0.434, [0.381, 0.760, 0.750]], [0.436, [0.381, 0.760, 0.750]], [0.438, [0.373, 0.758, 0.751]], [0.440, [0.373, 0.758, 0.751]], [0.442, [0.366, 0.755, 0.753]], [0.444, [0.366, 0.755, 0.753]], [0.446, [0.358, 0.752, 0.754]], [0.448, [0.358, 0.752, 0.754]], [0.450, [0.350, 0.749, 0.755]], [0.452, [0.350, 0.749, 0.755]], [0.454, [0.343, 0.746, 0.756]], [0.456, [0.343, 0.746, 0.756]], [0.458, [0.335, 0.743, 0.757]], [0.460, [0.335, 0.743, 0.757]], [0.462, [0.327, 0.741, 0.758]], [0.464, [0.327, 0.741, 0.758]], [0.466, [0.320, 0.738, 0.759]], [0.468, [0.320, 0.738, 0.759]], [0.470, [0.312, 0.735, 0.760]], [0.472, [0.312, 0.735, 0.760]], [0.474, [0.304, 0.732, 0.761]], [0.476, [0.304, 0.732, 0.761]], [0.477, [0.297, 0.729, 0.763]], [0.479, [0.297, 0.729, 0.763]], [0.481, [0.289, 0.726, 0.764]], [0.483, [0.289, 0.726, 0.764]], [0.485, [0.282, 0.724, 0.765]], [0.487, [0.282, 0.724, 0.765]], [0.489, [0.274, 0.721, 0.766]], [0.491, [0.274, 0.721, 0.766]], [0.493, [0.266, 0.718, 0.767]], [0.495, [0.266, 0.718, 0.767]], [0.497, [0.259, 0.715, 0.768]], [0.499, [0.259, 0.715, 0.768]], [0.501, [0.253, 0.711, 0.768]], [0.503, [0.253, 0.711, 0.768]], [0.505, [0.248, 0.707, 0.768]], [0.507, [0.248, 0.707, 0.768]], [0.509, [0.244, 0.702, 0.767]], [0.511, [0.244, 0.702, 0.767]], [0.513, [0.239, 0.698, 0.767]], [0.515, [0.239, 0.698, 0.767]], [0.517, [0.235, 0.693, 0.766]], [0.519, [0.235, 0.693, 0.766]], [0.521, [0.231, 0.689, 0.766]], [0.523, [0.231, 0.689, 0.766]], [0.524, [0.226, 0.684, 0.765]], [0.526, [0.226, 0.684, 0.765]], [0.528, [0.222, 0.680, 0.765]], [0.530, [0.222, 0.680, 0.765]], [0.532, [0.217, 0.675, 0.764]], [0.534, [0.217, 0.675, 0.764]], [0.536, [0.213, 0.670, 0.764]], [0.538, [0.213, 0.670, 0.764]], [0.540, [0.208, 0.666, 0.763]], [0.542, [0.208, 0.666, 0.763]], [0.544, [0.204, 0.661, 0.763]], [0.546, [0.204, 0.661, 0.763]], [0.548, [0.200, 0.657, 0.762]], [0.550, [0.200, 0.657, 0.762]], [0.552, [0.195, 0.652, 0.762]], [0.554, [0.195, 0.652, 0.762]], [0.556, [0.191, 0.648, 0.761]], [0.558, [0.191, 0.648, 0.761]], [0.560, [0.186, 0.643, 0.761]], [0.562, [0.186, 0.643, 0.761]], [0.564, [0.182, 0.639, 0.761]], [0.566, [0.182, 0.639, 0.761]], [0.568, [0.177, 0.634, 0.760]], [0.569, [0.177, 0.634, 0.760]], [0.571, [0.173, 0.630, 0.760]], [0.573, [0.173, 0.630, 0.760]], [0.575, [0.169, 0.625, 0.759]], [0.577, [0.169, 0.625, 0.759]], [0.579, [0.164, 0.620, 0.759]], [0.581, [0.164, 0.620, 0.759]], [0.583, [0.160, 0.616, 0.758]], [0.585, [0.160, 0.616, 0.758]], [0.587, [0.155, 0.611, 0.758]], [0.589, [0.155, 0.611, 0.758]], [0.591, [0.151, 0.607, 0.757]], [0.593, [0.151, 0.607, 0.757]], [0.595, [0.146, 0.602, 0.757]], [0.597, [0.146, 0.602, 0.757]], [0.599, [0.142, 0.598, 0.756]], [0.601, [0.142, 0.598, 0.756]], [0.603, [0.138, 0.593, 0.756]], [0.605, [0.138, 0.593, 0.756]], [0.607, [0.133, 0.589, 0.755]], [0.609, [0.133, 0.589, 0.755]], [0.611, [0.129, 0.584, 0.755]], [0.613, [0.129, 0.584, 0.755]], [0.614, [0.124, 0.579, 0.754]], [0.616, [0.124, 0.579, 0.754]], [0.618, [0.120, 0.575, 0.754]], [0.620, [0.120, 0.575, 0.754]], [0.622, [0.115, 0.570, 0.753]], [0.624, [0.115, 0.570, 0.753]], [0.626, [0.114, 0.565, 0.751]], [0.628, [0.114, 0.565, 0.751]], [0.630, [0.115, 0.558, 0.748]], [0.632, [0.115, 0.558, 0.748]], [0.634, [0.115, 0.552, 0.745]], [0.636, [0.115, 0.552, 0.745]], [0.638, [0.116, 0.546, 0.742]], [0.640, [0.116, 0.546, 0.742]], [0.642, [0.117, 0.540, 0.739]], [0.644, [0.117, 0.540, 0.739]], [0.646, [0.117, 0.533, 0.736]], [0.648, [0.117, 0.533, 0.736]], [0.650, [0.118, 0.527, 0.733]], [0.652, [0.118, 0.527, 0.733]], [0.654, [0.118, 0.521, 0.730]], [0.656, [0.118, 0.521, 0.730]], [0.658, [0.119, 0.515, 0.727]], [0.659, [0.119, 0.515, 0.727]], [0.661, [0.120, 0.508, 0.725]], [0.663, [0.120, 0.508, 0.725]], [0.665, [0.120, 0.502, 0.722]], [0.667, [0.120, 0.502, 0.722]], [0.669, [0.121, 0.496, 0.719]], [0.671, [0.121, 0.496, 0.719]], [0.673, [0.121, 0.489, 0.716]], [0.675, [0.121, 0.489, 0.716]], [0.677, [0.122, 0.483, 0.713]], [0.679, [0.122, 0.483, 0.713]], [0.681, [0.123, 0.477, 0.710]], [0.683, [0.123, 0.477, 0.710]], [0.685, [0.123, 0.471, 0.707]], [0.687, [0.123, 0.471, 0.707]], [0.689, [0.124, 0.464, 0.704]], [0.691, [0.124, 0.464, 0.704]], [0.693, [0.125, 0.458, 0.701]], [0.695, [0.125, 0.458, 0.701]], [0.697, [0.125, 0.452, 0.698]], [0.699, [0.125, 0.452, 0.698]], [0.701, [0.126, 0.445, 0.695]], [0.703, [0.126, 0.445, 0.695]], [0.705, [0.126, 0.439, 0.692]], [0.706, [0.126, 0.439, 0.692]], [0.708, [0.127, 0.433, 0.689]], [0.710, [0.127, 0.433, 0.689]], [0.712, [0.128, 0.427, 0.686]], [0.714, [0.128, 0.427, 0.686]], [0.716, [0.128, 0.420, 0.683]], [0.718, [0.128, 0.420, 0.683]], [0.720, [0.129, 0.414, 0.680]], [0.722, [0.129, 0.414, 0.680]], [0.724, [0.129, 0.408, 0.677]], [0.726, [0.129, 0.408, 0.677]], [0.728, [0.130, 0.402, 0.674]], [0.730, [0.130, 0.402, 0.674]], [0.732, [0.131, 0.395, 0.671]], [0.734, [0.131, 0.395, 0.671]], [0.736, [0.131, 0.389, 0.668]], [0.738, [0.131, 0.389, 0.668]], [0.740, [0.132, 0.383, 0.665]], [0.742, [0.132, 0.383, 0.665]], [0.744, [0.133, 0.376, 0.663]], [0.746, [0.133, 0.376, 0.663]], [0.748, [0.133, 0.370, 0.660]], [0.750, [0.133, 0.370, 0.660]], [0.751, [0.134, 0.365, 0.657]], [0.753, [0.134, 0.365, 0.657]], [0.755, [0.134, 0.360, 0.655]], [0.757, [0.134, 0.360, 0.655]], [0.759, [0.134, 0.354, 0.652]], [0.761, [0.134, 0.354, 0.652]], [0.763, [0.135, 0.349, 0.650]], [0.765, [0.135, 0.349, 0.650]], [0.767, [0.135, 0.344, 0.647]], [0.769, [0.135, 0.344, 0.647]], [0.771, [0.135, 0.339, 0.645]], [0.773, [0.135, 0.339, 0.645]], [0.775, [0.136, 0.334, 0.642]], [0.777, [0.136, 0.334, 0.642]], [0.779, [0.136, 0.329, 0.640]], [0.781, [0.136, 0.329, 0.640]], [0.783, [0.137, 0.323, 0.637]], [0.785, [0.137, 0.323, 0.637]], [0.787, [0.137, 0.318, 0.635]], [0.789, [0.137, 0.318, 0.635]], [0.791, [0.137, 0.313, 0.632]], [0.793, [0.137, 0.313, 0.632]], [0.795, [0.138, 0.308, 0.630]], [0.796, [0.138, 0.308, 0.630]], [0.798, [0.138, 0.303, 0.627]], [0.800, [0.138, 0.303, 0.627]], [0.802, [0.138, 0.298, 0.625]], [0.804, [0.138, 0.298, 0.625]], [0.806, [0.139, 0.292, 0.623]], [0.808, [0.139, 0.292, 0.623]], [0.810, [0.139, 0.287, 0.620]], [0.812, [0.139, 0.287, 0.620]], [0.814, [0.140, 0.282, 0.618]], [0.816, [0.140, 0.282, 0.618]], [0.818, [0.140, 0.277, 0.615]], [0.820, [0.140, 0.277, 0.615]], [0.822, [0.140, 0.272, 0.613]], [0.824, [0.140, 0.272, 0.613]], [0.826, [0.141, 0.267, 0.610]], [0.828, [0.141, 0.267, 0.610]], [0.830, [0.141, 0.261, 0.608]], [0.832, [0.141, 0.261, 0.608]], [0.834, [0.141, 0.256, 0.605]], [0.836, [0.141, 0.256, 0.605]], [0.838, [0.142, 0.251, 0.603]], [0.840, [0.142, 0.251, 0.603]], [0.841, [0.142, 0.246, 0.600]], [0.843, [0.142, 0.246, 0.600]], [0.845, [0.142, 0.241, 0.598]], [0.847, [0.142, 0.241, 0.598]], [0.849, [0.143, 0.236, 0.595]], [0.851, [0.143, 0.236, 0.595]], [0.853, [0.143, 0.230, 0.593]], [0.855, [0.143, 0.230, 0.593]], [0.857, [0.144, 0.225, 0.591]], [0.859, [0.144, 0.225, 0.591]], [0.861, [0.144, 0.220, 0.588]], [0.863, [0.144, 0.220, 0.588]], [0.865, [0.144, 0.215, 0.586]], [0.867, [0.144, 0.215, 0.586]], [0.869, [0.145, 0.210, 0.583]], [0.871, [0.145, 0.210, 0.583]], [0.873, [0.145, 0.205, 0.581]], [0.875, [0.145, 0.205, 0.581]], [0.877, [0.142, 0.201, 0.574]], [0.879, [0.142, 0.201, 0.574]], [0.881, [0.138, 0.199, 0.567]], [0.883, [0.138, 0.199, 0.567]], [0.885, [0.135, 0.196, 0.559]], [0.886, [0.135, 0.196, 0.559]], [0.888, [0.131, 0.193, 0.552]], [0.890, [0.131, 0.193, 0.552]], [0.892, [0.128, 0.190, 0.544]], [0.894, [0.128, 0.190, 0.544]], [0.896, [0.124, 0.187, 0.537]], [0.898, [0.124, 0.187, 0.537]], [0.900, [0.121, 0.184, 0.530]], [0.902, [0.121, 0.184, 0.530]], [0.904, [0.117, 0.182, 0.522]], [0.906, [0.117, 0.182, 0.522]], [0.908, [0.113, 0.179, 0.515]], [0.910, [0.113, 0.179, 0.515]], [0.912, [0.110, 0.176, 0.507]], [0.914, [0.110, 0.176, 0.507]], [0.916, [0.106, 0.173, 0.500]], [0.918, [0.106, 0.173, 0.500]], [0.920, [0.103, 0.170, 0.493]], [0.922, [0.103, 0.170, 0.493]], [0.924, [0.099, 0.167, 0.485]], [0.926, [0.099, 0.167, 0.485]], [0.928, [0.096, 0.165, 0.478]], [0.930, [0.096, 0.165, 0.478]], [0.932, [0.092, 0.162, 0.471]], [0.933, [0.092, 0.162, 0.471]], [0.935, [0.088, 0.159, 0.463]], [0.937, [0.088, 0.159, 0.463]], [0.939, [0.085, 0.156, 0.456]], [0.941, [0.085, 0.156, 0.456]], [0.943, [0.081, 0.153, 0.448]], [0.945, [0.081, 0.153, 0.448]], [0.947, [0.078, 0.151, 0.441]], [0.949, [0.078, 0.151, 0.441]], [0.951, [0.074, 0.148, 0.434]], [0.953, [0.074, 0.148, 0.434]], [0.955, [0.071, 0.145, 0.426]], [0.957, [0.071, 0.145, 0.426]], [0.959, [0.067, 0.142, 0.419]], [0.961, [0.067, 0.142, 0.419]], [0.963, [0.063, 0.139, 0.412]], [0.965, [0.063, 0.139, 0.412]], [0.967, [0.060, 0.136, 0.404]], [0.969, [0.060, 0.136, 0.404]], [0.971, [0.056, 0.134, 0.397]], [0.973, [0.056, 0.134, 0.397]], [0.975, [0.053, 0.131, 0.389]], [0.977, [0.053, 0.131, 0.389]], [0.978, [0.049, 0.128, 0.382]], [0.980, [0.049, 0.128, 0.382]], [0.982, [0.046, 0.125, 0.375]], [0.984, [0.046, 0.125, 0.375]], [0.986, [0.042, 0.122, 0.367]], [0.988, [0.042, 0.122, 0.367]], [0.990, [0.039, 0.119, 0.360]], [0.992, [0.039, 0.119, 0.360]], [0.994, [0.035, 0.117, 0.352]], [0.996, [0.035, 0.117, 0.352]], [0.998, [0.031, 0.114, 0.345]], [1.000, [0.031, 0.114, 0.345]]]; +var YlOrBr = [[0.000, [1.000, 1.000, 0.898]], [0.002, [1.000, 1.000, 0.898]], [0.004, [1.000, 0.999, 0.893]], [0.006, [1.000, 0.999, 0.893]], [0.008, [1.000, 0.998, 0.888]], [0.010, [1.000, 0.998, 0.888]], [0.012, [1.000, 0.997, 0.883]], [0.014, [1.000, 0.997, 0.883]], [0.016, [1.000, 0.996, 0.878]], [0.018, [1.000, 0.996, 0.878]], [0.020, [1.000, 0.995, 0.873]], [0.022, [1.000, 0.995, 0.873]], [0.023, [1.000, 0.994, 0.868]], [0.025, [1.000, 0.994, 0.868]], [0.027, [1.000, 0.993, 0.863]], [0.029, [1.000, 0.993, 0.863]], [0.031, [1.000, 0.992, 0.858]], [0.033, [1.000, 0.992, 0.858]], [0.035, [1.000, 0.991, 0.853]], [0.037, [1.000, 0.991, 0.853]], [0.039, [1.000, 0.990, 0.848]], [0.041, [1.000, 0.990, 0.848]], [0.043, [1.000, 0.989, 0.843]], [0.045, [1.000, 0.989, 0.843]], [0.047, [1.000, 0.988, 0.838]], [0.049, [1.000, 0.988, 0.838]], [0.051, [1.000, 0.987, 0.832]], [0.053, [1.000, 0.987, 0.832]], [0.055, [1.000, 0.986, 0.827]], [0.057, [1.000, 0.986, 0.827]], [0.059, [1.000, 0.985, 0.822]], [0.061, [1.000, 0.985, 0.822]], [0.063, [1.000, 0.984, 0.817]], [0.065, [1.000, 0.984, 0.817]], [0.067, [1.000, 0.983, 0.812]], [0.068, [1.000, 0.983, 0.812]], [0.070, [1.000, 0.982, 0.807]], [0.072, [1.000, 0.982, 0.807]], [0.074, [1.000, 0.981, 0.802]], [0.076, [1.000, 0.981, 0.802]], [0.078, [1.000, 0.980, 0.797]], [0.080, [1.000, 0.980, 0.797]], [0.082, [1.000, 0.979, 0.792]], [0.084, [1.000, 0.979, 0.792]], [0.086, [1.000, 0.978, 0.787]], [0.088, [1.000, 0.978, 0.787]], [0.090, [1.000, 0.977, 0.782]], [0.092, [1.000, 0.977, 0.782]], [0.094, [1.000, 0.976, 0.777]], [0.096, [1.000, 0.976, 0.777]], [0.098, [1.000, 0.975, 0.772]], [0.100, [1.000, 0.975, 0.772]], [0.102, [1.000, 0.974, 0.767]], [0.104, [1.000, 0.974, 0.767]], [0.106, [1.000, 0.973, 0.762]], [0.108, [1.000, 0.973, 0.762]], [0.110, [1.000, 0.972, 0.757]], [0.112, [1.000, 0.972, 0.757]], [0.114, [1.000, 0.971, 0.752]], [0.115, [1.000, 0.971, 0.752]], [0.117, [1.000, 0.970, 0.747]], [0.119, [1.000, 0.970, 0.747]], [0.121, [1.000, 0.969, 0.742]], [0.123, [1.000, 0.969, 0.742]], [0.125, [1.000, 0.968, 0.737]], [0.127, [1.000, 0.968, 0.737]], [0.129, [1.000, 0.966, 0.731]], [0.131, [1.000, 0.966, 0.731]], [0.133, [1.000, 0.963, 0.726]], [0.135, [1.000, 0.963, 0.726]], [0.137, [1.000, 0.961, 0.721]], [0.139, [1.000, 0.961, 0.721]], [0.141, [0.999, 0.958, 0.715]], [0.143, [0.999, 0.958, 0.715]], [0.145, [0.999, 0.956, 0.710]], [0.147, [0.999, 0.956, 0.710]], [0.149, [0.999, 0.954, 0.705]], [0.151, [0.999, 0.954, 0.705]], [0.153, [0.999, 0.951, 0.700]], [0.155, [0.999, 0.951, 0.700]], [0.157, [0.999, 0.949, 0.694]], [0.159, [0.999, 0.949, 0.694]], [0.160, [0.999, 0.946, 0.689]], [0.162, [0.999, 0.946, 0.689]], [0.164, [0.999, 0.944, 0.684]], [0.166, [0.999, 0.944, 0.684]], [0.168, [0.999, 0.941, 0.678]], [0.170, [0.999, 0.941, 0.678]], [0.172, [0.999, 0.939, 0.673]], [0.174, [0.999, 0.939, 0.673]], [0.176, [0.998, 0.936, 0.668]], [0.178, [0.998, 0.936, 0.668]], [0.180, [0.998, 0.934, 0.663]], [0.182, [0.998, 0.934, 0.663]], [0.184, [0.998, 0.931, 0.657]], [0.186, [0.998, 0.931, 0.657]], [0.188, [0.998, 0.929, 0.652]], [0.190, [0.998, 0.929, 0.652]], [0.192, [0.998, 0.926, 0.647]], [0.194, [0.998, 0.926, 0.647]], [0.196, [0.998, 0.924, 0.641]], [0.198, [0.998, 0.924, 0.641]], [0.200, [0.998, 0.922, 0.636]], [0.202, [0.998, 0.922, 0.636]], [0.204, [0.998, 0.919, 0.631]], [0.205, [0.998, 0.919, 0.631]], [0.207, [0.997, 0.917, 0.625]], [0.209, [0.997, 0.917, 0.625]], [0.211, [0.997, 0.914, 0.620]], [0.213, [0.997, 0.914, 0.620]], [0.215, [0.997, 0.912, 0.615]], [0.217, [0.997, 0.912, 0.615]], [0.219, [0.997, 0.909, 0.610]], [0.221, [0.997, 0.909, 0.610]], [0.223, [0.997, 0.907, 0.604]], [0.225, [0.997, 0.907, 0.604]], [0.227, [0.997, 0.904, 0.599]], [0.229, [0.997, 0.904, 0.599]], [0.231, [0.997, 0.902, 0.594]], [0.233, [0.997, 0.902, 0.594]], [0.235, [0.997, 0.899, 0.588]], [0.237, [0.997, 0.899, 0.588]], [0.239, [0.996, 0.897, 0.583]], [0.241, [0.996, 0.897, 0.583]], [0.243, [0.996, 0.895, 0.578]], [0.245, [0.996, 0.895, 0.578]], [0.247, [0.996, 0.892, 0.573]], [0.249, [0.996, 0.892, 0.573]], [0.250, [0.996, 0.889, 0.567]], [0.252, [0.996, 0.889, 0.567]], [0.254, [0.996, 0.885, 0.558]], [0.256, [0.996, 0.885, 0.558]], [0.258, [0.996, 0.882, 0.550]], [0.260, [0.996, 0.882, 0.550]], [0.262, [0.996, 0.878, 0.542]], [0.264, [0.996, 0.878, 0.542]], [0.266, [0.996, 0.874, 0.534]], [0.268, [0.996, 0.874, 0.534]], [0.270, [0.996, 0.870, 0.526]], [0.272, [0.996, 0.870, 0.526]], [0.274, [0.996, 0.866, 0.518]], [0.276, [0.996, 0.866, 0.518]], [0.278, [0.996, 0.863, 0.510]], [0.280, [0.996, 0.863, 0.510]], [0.282, [0.996, 0.859, 0.502]], [0.284, [0.996, 0.859, 0.502]], [0.286, [0.996, 0.855, 0.494]], [0.288, [0.996, 0.855, 0.494]], [0.290, [0.996, 0.851, 0.485]], [0.292, [0.996, 0.851, 0.485]], [0.294, [0.996, 0.847, 0.477]], [0.295, [0.996, 0.847, 0.477]], [0.297, [0.996, 0.843, 0.469]], [0.299, [0.996, 0.843, 0.469]], [0.301, [0.996, 0.840, 0.461]], [0.303, [0.996, 0.840, 0.461]], [0.305, [0.996, 0.836, 0.453]], [0.307, [0.996, 0.836, 0.453]], [0.309, [0.996, 0.832, 0.445]], [0.311, [0.996, 0.832, 0.445]], [0.313, [0.996, 0.828, 0.437]], [0.315, [0.996, 0.828, 0.437]], [0.317, [0.996, 0.824, 0.429]], [0.319, [0.996, 0.824, 0.429]], [0.321, [0.996, 0.821, 0.420]], [0.323, [0.996, 0.821, 0.420]], [0.325, [0.996, 0.817, 0.412]], [0.327, [0.996, 0.817, 0.412]], [0.329, [0.996, 0.813, 0.404]], [0.331, [0.996, 0.813, 0.404]], [0.333, [0.996, 0.809, 0.396]], [0.335, [0.996, 0.809, 0.396]], [0.337, [0.996, 0.805, 0.388]], [0.339, [0.996, 0.805, 0.388]], [0.341, [0.996, 0.802, 0.380]], [0.342, [0.996, 0.802, 0.380]], [0.344, [0.996, 0.798, 0.372]], [0.346, [0.996, 0.798, 0.372]], [0.348, [0.996, 0.794, 0.364]], [0.350, [0.996, 0.794, 0.364]], [0.352, [0.996, 0.790, 0.355]], [0.354, [0.996, 0.790, 0.355]], [0.356, [0.996, 0.786, 0.347]], [0.358, [0.996, 0.786, 0.347]], [0.360, [0.996, 0.782, 0.339]], [0.362, [0.996, 0.782, 0.339]], [0.364, [0.996, 0.779, 0.331]], [0.366, [0.996, 0.779, 0.331]], [0.368, [0.996, 0.775, 0.323]], [0.370, [0.996, 0.775, 0.323]], [0.372, [0.996, 0.771, 0.315]], [0.374, [0.996, 0.771, 0.315]], [0.376, [0.996, 0.767, 0.308]], [0.378, [0.996, 0.767, 0.308]], [0.380, [0.996, 0.761, 0.303]], [0.382, [0.996, 0.761, 0.303]], [0.384, [0.996, 0.756, 0.299]], [0.386, [0.996, 0.756, 0.299]], [0.387, [0.996, 0.751, 0.294]], [0.389, [0.996, 0.751, 0.294]], [0.391, [0.996, 0.745, 0.289]], [0.393, [0.996, 0.745, 0.289]], [0.395, [0.996, 0.740, 0.285]], [0.397, [0.996, 0.740, 0.285]], [0.399, [0.996, 0.735, 0.280]], [0.401, [0.996, 0.735, 0.280]], [0.403, [0.996, 0.730, 0.275]], [0.405, [0.996, 0.730, 0.275]], [0.407, [0.996, 0.724, 0.271]], [0.409, [0.996, 0.724, 0.271]], [0.411, [0.996, 0.719, 0.266]], [0.413, [0.996, 0.719, 0.266]], [0.415, [0.996, 0.714, 0.261]], [0.417, [0.996, 0.714, 0.261]], [0.419, [0.996, 0.708, 0.257]], [0.421, [0.996, 0.708, 0.257]], [0.423, [0.996, 0.703, 0.252]], [0.425, [0.996, 0.703, 0.252]], [0.427, [0.996, 0.698, 0.247]], [0.429, [0.996, 0.698, 0.247]], [0.431, [0.996, 0.693, 0.243]], [0.432, [0.996, 0.693, 0.243]], [0.434, [0.996, 0.687, 0.238]], [0.436, [0.996, 0.687, 0.238]], [0.438, [0.996, 0.682, 0.233]], [0.440, [0.996, 0.682, 0.233]], [0.442, [0.996, 0.677, 0.229]], [0.444, [0.996, 0.677, 0.229]], [0.446, [0.996, 0.671, 0.224]], [0.448, [0.996, 0.671, 0.224]], [0.450, [0.996, 0.666, 0.219]], [0.452, [0.996, 0.666, 0.219]], [0.454, [0.996, 0.661, 0.215]], [0.456, [0.996, 0.661, 0.215]], [0.458, [0.996, 0.656, 0.210]], [0.460, [0.996, 0.656, 0.210]], [0.462, [0.996, 0.650, 0.205]], [0.464, [0.996, 0.650, 0.205]], [0.466, [0.996, 0.645, 0.201]], [0.468, [0.996, 0.645, 0.201]], [0.470, [0.996, 0.640, 0.196]], [0.472, [0.996, 0.640, 0.196]], [0.474, [0.996, 0.634, 0.191]], [0.476, [0.996, 0.634, 0.191]], [0.477, [0.996, 0.629, 0.186]], [0.479, [0.996, 0.629, 0.186]], [0.481, [0.996, 0.624, 0.182]], [0.483, [0.996, 0.624, 0.182]], [0.485, [0.996, 0.619, 0.177]], [0.487, [0.996, 0.619, 0.177]], [0.489, [0.996, 0.613, 0.172]], [0.491, [0.996, 0.613, 0.172]], [0.493, [0.996, 0.608, 0.168]], [0.495, [0.996, 0.608, 0.168]], [0.497, [0.996, 0.603, 0.163]], [0.499, [0.996, 0.603, 0.163]], [0.501, [0.995, 0.597, 0.159]], [0.503, [0.995, 0.597, 0.159]], [0.505, [0.993, 0.592, 0.157]], [0.507, [0.993, 0.592, 0.157]], [0.509, [0.991, 0.587, 0.154]], [0.511, [0.991, 0.587, 0.154]], [0.513, [0.988, 0.582, 0.152]], [0.515, [0.988, 0.582, 0.152]], [0.517, [0.986, 0.577, 0.149]], [0.519, [0.986, 0.577, 0.149]], [0.521, [0.984, 0.572, 0.147]], [0.523, [0.984, 0.572, 0.147]], [0.524, [0.982, 0.567, 0.144]], [0.526, [0.982, 0.567, 0.144]], [0.528, [0.979, 0.562, 0.141]], [0.530, [0.979, 0.562, 0.141]], [0.532, [0.977, 0.557, 0.139]], [0.534, [0.977, 0.557, 0.139]], [0.536, [0.975, 0.552, 0.136]], [0.538, [0.975, 0.552, 0.136]], [0.540, [0.973, 0.547, 0.134]], [0.542, [0.973, 0.547, 0.134]], [0.544, [0.971, 0.542, 0.131]], [0.546, [0.971, 0.542, 0.131]], [0.548, [0.968, 0.537, 0.128]], [0.550, [0.968, 0.537, 0.128]], [0.552, [0.966, 0.532, 0.126]], [0.554, [0.966, 0.532, 0.126]], [0.556, [0.964, 0.527, 0.123]], [0.558, [0.964, 0.527, 0.123]], [0.560, [0.962, 0.522, 0.121]], [0.562, [0.962, 0.522, 0.121]], [0.564, [0.960, 0.517, 0.118]], [0.566, [0.960, 0.517, 0.118]], [0.568, [0.957, 0.512, 0.116]], [0.569, [0.957, 0.512, 0.116]], [0.571, [0.955, 0.507, 0.113]], [0.573, [0.955, 0.507, 0.113]], [0.575, [0.953, 0.502, 0.110]], [0.577, [0.953, 0.502, 0.110]], [0.579, [0.951, 0.497, 0.108]], [0.581, [0.951, 0.497, 0.108]], [0.583, [0.948, 0.492, 0.105]], [0.585, [0.948, 0.492, 0.105]], [0.587, [0.946, 0.487, 0.103]], [0.589, [0.946, 0.487, 0.103]], [0.591, [0.944, 0.481, 0.100]], [0.593, [0.944, 0.481, 0.100]], [0.595, [0.942, 0.476, 0.097]], [0.597, [0.942, 0.476, 0.097]], [0.599, [0.940, 0.471, 0.095]], [0.601, [0.940, 0.471, 0.095]], [0.603, [0.937, 0.466, 0.092]], [0.605, [0.937, 0.466, 0.092]], [0.607, [0.935, 0.461, 0.090]], [0.609, [0.935, 0.461, 0.090]], [0.611, [0.933, 0.456, 0.087]], [0.613, [0.933, 0.456, 0.087]], [0.614, [0.931, 0.451, 0.085]], [0.616, [0.931, 0.451, 0.085]], [0.618, [0.929, 0.446, 0.082]], [0.620, [0.929, 0.446, 0.082]], [0.622, [0.926, 0.441, 0.079]], [0.624, [0.926, 0.441, 0.079]], [0.626, [0.923, 0.436, 0.077]], [0.628, [0.923, 0.436, 0.077]], [0.630, [0.919, 0.432, 0.075]], [0.632, [0.919, 0.432, 0.075]], [0.634, [0.915, 0.428, 0.073]], [0.636, [0.915, 0.428, 0.073]], [0.638, [0.911, 0.423, 0.070]], [0.640, [0.911, 0.423, 0.070]], [0.642, [0.907, 0.419, 0.068]], [0.644, [0.907, 0.419, 0.068]], [0.646, [0.903, 0.414, 0.066]], [0.648, [0.903, 0.414, 0.066]], [0.650, [0.899, 0.410, 0.064]], [0.652, [0.899, 0.410, 0.064]], [0.654, [0.895, 0.405, 0.062]], [0.656, [0.895, 0.405, 0.062]], [0.658, [0.892, 0.401, 0.059]], [0.659, [0.892, 0.401, 0.059]], [0.661, [0.888, 0.397, 0.057]], [0.663, [0.888, 0.397, 0.057]], [0.665, [0.884, 0.392, 0.055]], [0.667, [0.884, 0.392, 0.055]], [0.669, [0.880, 0.388, 0.053]], [0.671, [0.880, 0.388, 0.053]], [0.673, [0.876, 0.383, 0.050]], [0.675, [0.876, 0.383, 0.050]], [0.677, [0.872, 0.379, 0.048]], [0.679, [0.872, 0.379, 0.048]], [0.681, [0.868, 0.374, 0.046]], [0.683, [0.868, 0.374, 0.046]], [0.685, [0.864, 0.370, 0.044]], [0.687, [0.864, 0.370, 0.044]], [0.689, [0.860, 0.366, 0.042]], [0.691, [0.860, 0.366, 0.042]], [0.693, [0.856, 0.361, 0.039]], [0.695, [0.856, 0.361, 0.039]], [0.697, [0.852, 0.357, 0.037]], [0.699, [0.852, 0.357, 0.037]], [0.701, [0.848, 0.352, 0.035]], [0.703, [0.848, 0.352, 0.035]], [0.705, [0.844, 0.348, 0.033]], [0.706, [0.844, 0.348, 0.033]], [0.708, [0.840, 0.343, 0.031]], [0.710, [0.840, 0.343, 0.031]], [0.712, [0.836, 0.339, 0.028]], [0.714, [0.836, 0.339, 0.028]], [0.716, [0.832, 0.335, 0.026]], [0.718, [0.832, 0.335, 0.026]], [0.720, [0.829, 0.330, 0.024]], [0.722, [0.829, 0.330, 0.024]], [0.724, [0.825, 0.326, 0.022]], [0.726, [0.825, 0.326, 0.022]], [0.728, [0.821, 0.321, 0.019]], [0.730, [0.821, 0.321, 0.019]], [0.732, [0.817, 0.317, 0.017]], [0.734, [0.817, 0.317, 0.017]], [0.736, [0.813, 0.312, 0.015]], [0.738, [0.813, 0.312, 0.015]], [0.740, [0.809, 0.308, 0.013]], [0.742, [0.809, 0.308, 0.013]], [0.744, [0.805, 0.304, 0.011]], [0.746, [0.805, 0.304, 0.011]], [0.748, [0.801, 0.299, 0.008]], [0.750, [0.801, 0.299, 0.008]], [0.751, [0.795, 0.296, 0.008]], [0.753, [0.795, 0.296, 0.008]], [0.755, [0.789, 0.293, 0.008]], [0.757, [0.789, 0.293, 0.008]], [0.759, [0.783, 0.290, 0.009]], [0.761, [0.783, 0.290, 0.009]], [0.763, [0.776, 0.287, 0.009]], [0.765, [0.776, 0.287, 0.009]], [0.767, [0.770, 0.284, 0.009]], [0.769, [0.770, 0.284, 0.009]], [0.771, [0.764, 0.281, 0.009]], [0.773, [0.764, 0.281, 0.009]], [0.775, [0.758, 0.278, 0.010]], [0.777, [0.758, 0.278, 0.010]], [0.779, [0.751, 0.275, 0.010]], [0.781, [0.751, 0.275, 0.010]], [0.783, [0.745, 0.272, 0.010]], [0.785, [0.745, 0.272, 0.010]], [0.787, [0.739, 0.269, 0.010]], [0.789, [0.739, 0.269, 0.010]], [0.791, [0.733, 0.266, 0.010]], [0.793, [0.733, 0.266, 0.010]], [0.795, [0.726, 0.263, 0.011]], [0.796, [0.726, 0.263, 0.011]], [0.798, [0.720, 0.260, 0.011]], [0.800, [0.720, 0.260, 0.011]], [0.802, [0.714, 0.257, 0.011]], [0.804, [0.714, 0.257, 0.011]], [0.806, [0.707, 0.254, 0.011]], [0.808, [0.707, 0.254, 0.011]], [0.810, [0.701, 0.252, 0.012]], [0.812, [0.701, 0.252, 0.012]], [0.814, [0.695, 0.249, 0.012]], [0.816, [0.695, 0.249, 0.012]], [0.818, [0.689, 0.246, 0.012]], [0.820, [0.689, 0.246, 0.012]], [0.822, [0.682, 0.243, 0.012]], [0.824, [0.682, 0.243, 0.012]], [0.826, [0.676, 0.240, 0.013]], [0.828, [0.676, 0.240, 0.013]], [0.830, [0.670, 0.237, 0.013]], [0.832, [0.670, 0.237, 0.013]], [0.834, [0.664, 0.234, 0.013]], [0.836, [0.664, 0.234, 0.013]], [0.838, [0.657, 0.231, 0.013]], [0.840, [0.657, 0.231, 0.013]], [0.841, [0.651, 0.228, 0.014]], [0.843, [0.651, 0.228, 0.014]], [0.845, [0.645, 0.225, 0.014]], [0.847, [0.645, 0.225, 0.014]], [0.849, [0.638, 0.222, 0.014]], [0.851, [0.638, 0.222, 0.014]], [0.853, [0.632, 0.219, 0.014]], [0.855, [0.632, 0.219, 0.014]], [0.857, [0.626, 0.216, 0.015]], [0.859, [0.626, 0.216, 0.015]], [0.861, [0.620, 0.213, 0.015]], [0.863, [0.620, 0.213, 0.015]], [0.865, [0.613, 0.210, 0.015]], [0.867, [0.613, 0.210, 0.015]], [0.869, [0.607, 0.207, 0.015]], [0.871, [0.607, 0.207, 0.015]], [0.873, [0.601, 0.204, 0.016]], [0.875, [0.601, 0.204, 0.016]], [0.877, [0.595, 0.202, 0.016]], [0.879, [0.595, 0.202, 0.016]], [0.881, [0.588, 0.200, 0.016]], [0.883, [0.588, 0.200, 0.016]], [0.885, [0.582, 0.199, 0.016]], [0.886, [0.582, 0.199, 0.016]], [0.888, [0.576, 0.197, 0.017]], [0.890, [0.576, 0.197, 0.017]], [0.892, [0.569, 0.195, 0.017]], [0.894, [0.569, 0.195, 0.017]], [0.896, [0.563, 0.193, 0.017]], [0.898, [0.563, 0.193, 0.017]], [0.900, [0.557, 0.191, 0.017]], [0.902, [0.557, 0.191, 0.017]], [0.904, [0.551, 0.189, 0.018]], [0.906, [0.551, 0.189, 0.018]], [0.908, [0.544, 0.188, 0.018]], [0.910, [0.544, 0.188, 0.018]], [0.912, [0.538, 0.186, 0.018]], [0.914, [0.538, 0.186, 0.018]], [0.916, [0.532, 0.184, 0.018]], [0.918, [0.532, 0.184, 0.018]], [0.920, [0.525, 0.182, 0.019]], [0.922, [0.525, 0.182, 0.019]], [0.924, [0.519, 0.180, 0.019]], [0.926, [0.519, 0.180, 0.019]], [0.928, [0.513, 0.178, 0.019]], [0.930, [0.513, 0.178, 0.019]], [0.932, [0.507, 0.176, 0.019]], [0.933, [0.507, 0.176, 0.019]], [0.935, [0.500, 0.175, 0.020]], [0.937, [0.500, 0.175, 0.020]], [0.939, [0.494, 0.173, 0.020]], [0.941, [0.494, 0.173, 0.020]], [0.943, [0.488, 0.171, 0.020]], [0.945, [0.488, 0.171, 0.020]], [0.947, [0.482, 0.169, 0.020]], [0.949, [0.482, 0.169, 0.020]], [0.951, [0.475, 0.167, 0.021]], [0.953, [0.475, 0.167, 0.021]], [0.955, [0.469, 0.165, 0.021]], [0.957, [0.469, 0.165, 0.021]], [0.959, [0.463, 0.164, 0.021]], [0.961, [0.463, 0.164, 0.021]], [0.963, [0.456, 0.162, 0.021]], [0.965, [0.456, 0.162, 0.021]], [0.967, [0.450, 0.160, 0.022]], [0.969, [0.450, 0.160, 0.022]], [0.971, [0.444, 0.158, 0.022]], [0.973, [0.444, 0.158, 0.022]], [0.975, [0.438, 0.156, 0.022]], [0.977, [0.438, 0.156, 0.022]], [0.978, [0.431, 0.154, 0.022]], [0.980, [0.431, 0.154, 0.022]], [0.982, [0.425, 0.152, 0.023]], [0.984, [0.425, 0.152, 0.023]], [0.986, [0.419, 0.151, 0.023]], [0.988, [0.419, 0.151, 0.023]], [0.990, [0.413, 0.149, 0.023]], [0.992, [0.413, 0.149, 0.023]], [0.994, [0.406, 0.147, 0.023]], [0.996, [0.406, 0.147, 0.023]], [0.998, [0.400, 0.145, 0.024]], [1.000, [0.400, 0.145, 0.024]]]; +var YlOrRd = [[0.000, [1.000, 1.000, 0.800]], [0.002, [1.000, 1.000, 0.800]], [0.004, [1.000, 0.998, 0.795]], [0.006, [1.000, 0.998, 0.795]], [0.008, [1.000, 0.996, 0.789]], [0.010, [1.000, 0.996, 0.789]], [0.012, [1.000, 0.993, 0.784]], [0.014, [1.000, 0.993, 0.784]], [0.016, [1.000, 0.991, 0.778]], [0.018, [1.000, 0.991, 0.778]], [0.020, [1.000, 0.989, 0.773]], [0.022, [1.000, 0.989, 0.773]], [0.023, [1.000, 0.987, 0.768]], [0.025, [1.000, 0.987, 0.768]], [0.027, [1.000, 0.984, 0.762]], [0.029, [1.000, 0.984, 0.762]], [0.031, [1.000, 0.982, 0.757]], [0.033, [1.000, 0.982, 0.757]], [0.035, [1.000, 0.980, 0.751]], [0.037, [1.000, 0.980, 0.751]], [0.039, [1.000, 0.978, 0.746]], [0.041, [1.000, 0.978, 0.746]], [0.043, [1.000, 0.976, 0.740]], [0.045, [1.000, 0.976, 0.740]], [0.047, [1.000, 0.973, 0.735]], [0.049, [1.000, 0.973, 0.735]], [0.051, [1.000, 0.971, 0.730]], [0.053, [1.000, 0.971, 0.730]], [0.055, [1.000, 0.969, 0.724]], [0.057, [1.000, 0.969, 0.724]], [0.059, [1.000, 0.967, 0.719]], [0.061, [1.000, 0.967, 0.719]], [0.063, [1.000, 0.965, 0.713]], [0.065, [1.000, 0.965, 0.713]], [0.067, [1.000, 0.962, 0.708]], [0.068, [1.000, 0.962, 0.708]], [0.070, [1.000, 0.960, 0.703]], [0.072, [1.000, 0.960, 0.703]], [0.074, [1.000, 0.958, 0.697]], [0.076, [1.000, 0.958, 0.697]], [0.078, [1.000, 0.956, 0.692]], [0.080, [1.000, 0.956, 0.692]], [0.082, [1.000, 0.953, 0.686]], [0.084, [1.000, 0.953, 0.686]], [0.086, [1.000, 0.951, 0.681]], [0.088, [1.000, 0.951, 0.681]], [0.090, [1.000, 0.949, 0.675]], [0.092, [1.000, 0.949, 0.675]], [0.094, [1.000, 0.947, 0.670]], [0.096, [1.000, 0.947, 0.670]], [0.098, [1.000, 0.945, 0.665]], [0.100, [1.000, 0.945, 0.665]], [0.102, [1.000, 0.942, 0.659]], [0.104, [1.000, 0.942, 0.659]], [0.106, [1.000, 0.940, 0.654]], [0.108, [1.000, 0.940, 0.654]], [0.110, [1.000, 0.938, 0.648]], [0.112, [1.000, 0.938, 0.648]], [0.114, [1.000, 0.936, 0.643]], [0.115, [1.000, 0.936, 0.643]], [0.117, [1.000, 0.934, 0.638]], [0.119, [1.000, 0.934, 0.638]], [0.121, [1.000, 0.931, 0.632]], [0.123, [1.000, 0.931, 0.632]], [0.125, [1.000, 0.929, 0.627]], [0.127, [1.000, 0.929, 0.627]], [0.129, [1.000, 0.927, 0.622]], [0.131, [1.000, 0.927, 0.622]], [0.133, [1.000, 0.924, 0.616]], [0.135, [1.000, 0.924, 0.616]], [0.137, [1.000, 0.922, 0.611]], [0.139, [1.000, 0.922, 0.611]], [0.141, [0.999, 0.919, 0.606]], [0.143, [0.999, 0.919, 0.606]], [0.145, [0.999, 0.917, 0.601]], [0.147, [0.999, 0.917, 0.601]], [0.149, [0.999, 0.914, 0.596]], [0.151, [0.999, 0.914, 0.596]], [0.153, [0.999, 0.912, 0.591]], [0.155, [0.999, 0.912, 0.591]], [0.157, [0.999, 0.909, 0.585]], [0.159, [0.999, 0.909, 0.585]], [0.160, [0.999, 0.907, 0.580]], [0.162, [0.999, 0.907, 0.580]], [0.164, [0.999, 0.904, 0.575]], [0.166, [0.999, 0.904, 0.575]], [0.168, [0.999, 0.902, 0.570]], [0.170, [0.999, 0.902, 0.570]], [0.172, [0.999, 0.900, 0.565]], [0.174, [0.999, 0.900, 0.565]], [0.176, [0.998, 0.897, 0.560]], [0.178, [0.998, 0.897, 0.560]], [0.180, [0.998, 0.895, 0.554]], [0.182, [0.998, 0.895, 0.554]], [0.184, [0.998, 0.892, 0.549]], [0.186, [0.998, 0.892, 0.549]], [0.188, [0.998, 0.890, 0.544]], [0.190, [0.998, 0.890, 0.544]], [0.192, [0.998, 0.887, 0.539]], [0.194, [0.998, 0.887, 0.539]], [0.196, [0.998, 0.885, 0.534]], [0.198, [0.998, 0.885, 0.534]], [0.200, [0.998, 0.882, 0.529]], [0.202, [0.998, 0.882, 0.529]], [0.204, [0.998, 0.880, 0.523]], [0.205, [0.998, 0.880, 0.523]], [0.207, [0.997, 0.877, 0.518]], [0.209, [0.997, 0.877, 0.518]], [0.211, [0.997, 0.875, 0.513]], [0.213, [0.997, 0.875, 0.513]], [0.215, [0.997, 0.873, 0.508]], [0.217, [0.997, 0.873, 0.508]], [0.219, [0.997, 0.870, 0.503]], [0.221, [0.997, 0.870, 0.503]], [0.223, [0.997, 0.868, 0.498]], [0.225, [0.997, 0.868, 0.498]], [0.227, [0.997, 0.865, 0.492]], [0.229, [0.997, 0.865, 0.492]], [0.231, [0.997, 0.863, 0.487]], [0.233, [0.997, 0.863, 0.487]], [0.235, [0.997, 0.860, 0.482]], [0.237, [0.997, 0.860, 0.482]], [0.239, [0.996, 0.858, 0.477]], [0.241, [0.996, 0.858, 0.477]], [0.243, [0.996, 0.855, 0.472]], [0.245, [0.996, 0.855, 0.472]], [0.247, [0.996, 0.853, 0.467]], [0.249, [0.996, 0.853, 0.467]], [0.250, [0.996, 0.850, 0.461]], [0.252, [0.996, 0.850, 0.461]], [0.254, [0.996, 0.845, 0.456]], [0.256, [0.996, 0.845, 0.456]], [0.258, [0.996, 0.840, 0.451]], [0.260, [0.996, 0.840, 0.451]], [0.262, [0.996, 0.835, 0.446]], [0.264, [0.996, 0.835, 0.446]], [0.266, [0.996, 0.831, 0.441]], [0.268, [0.996, 0.831, 0.441]], [0.270, [0.996, 0.826, 0.436]], [0.272, [0.996, 0.826, 0.436]], [0.274, [0.996, 0.821, 0.430]], [0.276, [0.996, 0.821, 0.430]], [0.278, [0.996, 0.816, 0.425]], [0.280, [0.996, 0.816, 0.425]], [0.282, [0.996, 0.811, 0.420]], [0.284, [0.996, 0.811, 0.420]], [0.286, [0.996, 0.807, 0.415]], [0.288, [0.996, 0.807, 0.415]], [0.290, [0.996, 0.802, 0.410]], [0.292, [0.996, 0.802, 0.410]], [0.294, [0.996, 0.797, 0.405]], [0.295, [0.996, 0.797, 0.405]], [0.297, [0.996, 0.792, 0.399]], [0.299, [0.996, 0.792, 0.399]], [0.301, [0.996, 0.787, 0.394]], [0.303, [0.996, 0.787, 0.394]], [0.305, [0.996, 0.783, 0.389]], [0.307, [0.996, 0.783, 0.389]], [0.309, [0.996, 0.778, 0.384]], [0.311, [0.996, 0.778, 0.384]], [0.313, [0.996, 0.773, 0.379]], [0.315, [0.996, 0.773, 0.379]], [0.317, [0.996, 0.768, 0.374]], [0.319, [0.996, 0.768, 0.374]], [0.321, [0.996, 0.763, 0.368]], [0.323, [0.996, 0.763, 0.368]], [0.325, [0.996, 0.759, 0.363]], [0.327, [0.996, 0.759, 0.363]], [0.329, [0.996, 0.754, 0.358]], [0.331, [0.996, 0.754, 0.358]], [0.333, [0.996, 0.749, 0.353]], [0.335, [0.996, 0.749, 0.353]], [0.337, [0.996, 0.744, 0.348]], [0.339, [0.996, 0.744, 0.348]], [0.341, [0.996, 0.739, 0.343]], [0.342, [0.996, 0.739, 0.343]], [0.344, [0.996, 0.735, 0.337]], [0.346, [0.996, 0.735, 0.337]], [0.348, [0.996, 0.730, 0.332]], [0.350, [0.996, 0.730, 0.332]], [0.352, [0.996, 0.725, 0.327]], [0.354, [0.996, 0.725, 0.327]], [0.356, [0.996, 0.720, 0.322]], [0.358, [0.996, 0.720, 0.322]], [0.360, [0.996, 0.715, 0.317]], [0.362, [0.996, 0.715, 0.317]], [0.364, [0.996, 0.711, 0.312]], [0.366, [0.996, 0.711, 0.312]], [0.368, [0.996, 0.706, 0.306]], [0.370, [0.996, 0.706, 0.306]], [0.372, [0.996, 0.701, 0.301]], [0.374, [0.996, 0.701, 0.301]], [0.376, [0.996, 0.696, 0.297]], [0.378, [0.996, 0.696, 0.297]], [0.380, [0.996, 0.692, 0.295]], [0.382, [0.996, 0.692, 0.295]], [0.384, [0.996, 0.687, 0.293]], [0.386, [0.996, 0.687, 0.293]], [0.387, [0.996, 0.683, 0.291]], [0.389, [0.996, 0.683, 0.291]], [0.391, [0.996, 0.678, 0.289]], [0.393, [0.996, 0.678, 0.289]], [0.395, [0.995, 0.674, 0.287]], [0.397, [0.995, 0.674, 0.287]], [0.399, [0.995, 0.669, 0.285]], [0.401, [0.995, 0.669, 0.285]], [0.403, [0.995, 0.664, 0.284]], [0.405, [0.995, 0.664, 0.284]], [0.407, [0.995, 0.660, 0.282]], [0.409, [0.995, 0.660, 0.282]], [0.411, [0.995, 0.655, 0.280]], [0.413, [0.995, 0.655, 0.280]], [0.415, [0.995, 0.651, 0.278]], [0.417, [0.995, 0.651, 0.278]], [0.419, [0.995, 0.646, 0.276]], [0.421, [0.995, 0.646, 0.276]], [0.423, [0.995, 0.642, 0.274]], [0.425, [0.995, 0.642, 0.274]], [0.427, [0.994, 0.637, 0.272]], [0.429, [0.994, 0.637, 0.272]], [0.431, [0.994, 0.633, 0.270]], [0.432, [0.994, 0.633, 0.270]], [0.434, [0.994, 0.628, 0.268]], [0.436, [0.994, 0.628, 0.268]], [0.438, [0.994, 0.623, 0.266]], [0.440, [0.994, 0.623, 0.266]], [0.442, [0.994, 0.619, 0.264]], [0.444, [0.994, 0.619, 0.264]], [0.446, [0.994, 0.614, 0.262]], [0.448, [0.994, 0.614, 0.262]], [0.450, [0.994, 0.610, 0.260]], [0.452, [0.994, 0.610, 0.260]], [0.454, [0.994, 0.605, 0.258]], [0.456, [0.994, 0.605, 0.258]], [0.458, [0.993, 0.601, 0.256]], [0.460, [0.993, 0.601, 0.256]], [0.462, [0.993, 0.596, 0.254]], [0.464, [0.993, 0.596, 0.254]], [0.466, [0.993, 0.592, 0.252]], [0.468, [0.993, 0.592, 0.252]], [0.470, [0.993, 0.587, 0.250]], [0.472, [0.993, 0.587, 0.250]], [0.474, [0.993, 0.583, 0.248]], [0.476, [0.993, 0.583, 0.248]], [0.477, [0.993, 0.578, 0.246]], [0.479, [0.993, 0.578, 0.246]], [0.481, [0.993, 0.573, 0.244]], [0.483, [0.993, 0.573, 0.244]], [0.485, [0.993, 0.569, 0.242]], [0.487, [0.993, 0.569, 0.242]], [0.489, [0.992, 0.564, 0.240]], [0.491, [0.992, 0.564, 0.240]], [0.493, [0.992, 0.560, 0.238]], [0.495, [0.992, 0.560, 0.238]], [0.497, [0.992, 0.555, 0.236]], [0.499, [0.992, 0.555, 0.236]], [0.501, [0.992, 0.549, 0.234]], [0.503, [0.992, 0.549, 0.234]], [0.505, [0.992, 0.541, 0.232]], [0.507, [0.992, 0.541, 0.232]], [0.509, [0.992, 0.534, 0.230]], [0.511, [0.992, 0.534, 0.230]], [0.513, [0.992, 0.526, 0.228]], [0.515, [0.992, 0.526, 0.228]], [0.517, [0.992, 0.518, 0.225]], [0.519, [0.992, 0.518, 0.225]], [0.521, [0.991, 0.510, 0.223]], [0.523, [0.991, 0.510, 0.223]], [0.524, [0.991, 0.503, 0.221]], [0.526, [0.991, 0.503, 0.221]], [0.528, [0.991, 0.495, 0.219]], [0.530, [0.991, 0.495, 0.219]], [0.532, [0.991, 0.487, 0.216]], [0.534, [0.991, 0.487, 0.216]], [0.536, [0.991, 0.479, 0.214]], [0.538, [0.991, 0.479, 0.214]], [0.540, [0.991, 0.472, 0.212]], [0.542, [0.991, 0.472, 0.212]], [0.544, [0.991, 0.464, 0.210]], [0.546, [0.991, 0.464, 0.210]], [0.548, [0.991, 0.456, 0.208]], [0.550, [0.991, 0.456, 0.208]], [0.552, [0.990, 0.448, 0.205]], [0.554, [0.990, 0.448, 0.205]], [0.556, [0.990, 0.441, 0.203]], [0.558, [0.990, 0.441, 0.203]], [0.560, [0.990, 0.433, 0.201]], [0.562, [0.990, 0.433, 0.201]], [0.564, [0.990, 0.425, 0.199]], [0.566, [0.990, 0.425, 0.199]], [0.568, [0.990, 0.417, 0.197]], [0.569, [0.990, 0.417, 0.197]], [0.571, [0.990, 0.410, 0.194]], [0.573, [0.990, 0.410, 0.194]], [0.575, [0.990, 0.402, 0.192]], [0.577, [0.990, 0.402, 0.192]], [0.579, [0.990, 0.394, 0.190]], [0.581, [0.990, 0.394, 0.190]], [0.583, [0.990, 0.386, 0.188]], [0.585, [0.990, 0.386, 0.188]], [0.587, [0.989, 0.379, 0.185]], [0.589, [0.989, 0.379, 0.185]], [0.591, [0.989, 0.371, 0.183]], [0.593, [0.989, 0.371, 0.183]], [0.595, [0.989, 0.363, 0.181]], [0.597, [0.989, 0.363, 0.181]], [0.599, [0.989, 0.355, 0.179]], [0.601, [0.989, 0.355, 0.179]], [0.603, [0.989, 0.348, 0.177]], [0.605, [0.989, 0.348, 0.177]], [0.607, [0.989, 0.340, 0.174]], [0.609, [0.989, 0.340, 0.174]], [0.611, [0.989, 0.332, 0.172]], [0.613, [0.989, 0.332, 0.172]], [0.614, [0.989, 0.324, 0.170]], [0.616, [0.989, 0.324, 0.170]], [0.618, [0.988, 0.317, 0.168]], [0.620, [0.988, 0.317, 0.168]], [0.622, [0.988, 0.309, 0.166]], [0.624, [0.988, 0.309, 0.166]], [0.626, [0.986, 0.302, 0.164]], [0.628, [0.986, 0.302, 0.164]], [0.630, [0.983, 0.295, 0.162]], [0.632, [0.983, 0.295, 0.162]], [0.634, [0.980, 0.289, 0.160]], [0.636, [0.980, 0.289, 0.160]], [0.638, [0.977, 0.283, 0.158]], [0.640, [0.977, 0.283, 0.158]], [0.642, [0.974, 0.276, 0.157]], [0.644, [0.974, 0.276, 0.157]], [0.646, [0.971, 0.270, 0.155]], [0.648, [0.971, 0.270, 0.155]], [0.650, [0.968, 0.263, 0.153]], [0.652, [0.968, 0.263, 0.153]], [0.654, [0.965, 0.257, 0.152]], [0.656, [0.965, 0.257, 0.152]], [0.658, [0.962, 0.251, 0.150]], [0.659, [0.962, 0.251, 0.150]], [0.661, [0.959, 0.244, 0.148]], [0.663, [0.959, 0.244, 0.148]], [0.665, [0.956, 0.238, 0.146]], [0.667, [0.956, 0.238, 0.146]], [0.669, [0.952, 0.232, 0.145]], [0.671, [0.952, 0.232, 0.145]], [0.673, [0.949, 0.225, 0.143]], [0.675, [0.949, 0.225, 0.143]], [0.677, [0.946, 0.219, 0.141]], [0.679, [0.946, 0.219, 0.141]], [0.681, [0.943, 0.212, 0.140]], [0.683, [0.943, 0.212, 0.140]], [0.685, [0.940, 0.206, 0.138]], [0.687, [0.940, 0.206, 0.138]], [0.689, [0.937, 0.200, 0.136]], [0.691, [0.937, 0.200, 0.136]], [0.693, [0.934, 0.193, 0.134]], [0.695, [0.934, 0.193, 0.134]], [0.697, [0.931, 0.187, 0.133]], [0.699, [0.931, 0.187, 0.133]], [0.701, [0.928, 0.180, 0.131]], [0.703, [0.928, 0.180, 0.131]], [0.705, [0.925, 0.174, 0.129]], [0.706, [0.925, 0.174, 0.129]], [0.708, [0.922, 0.168, 0.127]], [0.710, [0.922, 0.168, 0.127]], [0.712, [0.919, 0.161, 0.126]], [0.714, [0.919, 0.161, 0.126]], [0.716, [0.916, 0.155, 0.124]], [0.718, [0.916, 0.155, 0.124]], [0.720, [0.912, 0.148, 0.122]], [0.722, [0.912, 0.148, 0.122]], [0.724, [0.909, 0.142, 0.121]], [0.726, [0.909, 0.142, 0.121]], [0.728, [0.906, 0.136, 0.119]], [0.730, [0.906, 0.136, 0.119]], [0.732, [0.903, 0.129, 0.117]], [0.734, [0.903, 0.129, 0.117]], [0.736, [0.900, 0.123, 0.115]], [0.738, [0.900, 0.123, 0.115]], [0.740, [0.897, 0.116, 0.114]], [0.742, [0.897, 0.116, 0.114]], [0.744, [0.894, 0.110, 0.112]], [0.746, [0.894, 0.110, 0.112]], [0.748, [0.891, 0.104, 0.110]], [0.750, [0.891, 0.104, 0.110]], [0.751, [0.887, 0.100, 0.111]], [0.753, [0.887, 0.100, 0.111]], [0.755, [0.882, 0.096, 0.112]], [0.757, [0.882, 0.096, 0.112]], [0.759, [0.877, 0.093, 0.113]], [0.761, [0.877, 0.093, 0.113]], [0.763, [0.873, 0.090, 0.114]], [0.765, [0.873, 0.090, 0.114]], [0.767, [0.868, 0.087, 0.116]], [0.769, [0.868, 0.087, 0.116]], [0.771, [0.863, 0.084, 0.117]], [0.773, [0.863, 0.084, 0.117]], [0.775, [0.859, 0.080, 0.118]], [0.777, [0.859, 0.080, 0.118]], [0.779, [0.854, 0.077, 0.119]], [0.781, [0.854, 0.077, 0.119]], [0.783, [0.849, 0.074, 0.121]], [0.785, [0.849, 0.074, 0.121]], [0.787, [0.845, 0.071, 0.122]], [0.789, [0.845, 0.071, 0.122]], [0.791, [0.840, 0.068, 0.123]], [0.793, [0.840, 0.068, 0.123]], [0.795, [0.835, 0.064, 0.124]], [0.796, [0.835, 0.064, 0.124]], [0.798, [0.831, 0.061, 0.125]], [0.800, [0.831, 0.061, 0.125]], [0.802, [0.826, 0.058, 0.127]], [0.804, [0.826, 0.058, 0.127]], [0.806, [0.821, 0.055, 0.128]], [0.808, [0.821, 0.055, 0.128]], [0.810, [0.817, 0.052, 0.129]], [0.812, [0.817, 0.052, 0.129]], [0.814, [0.812, 0.048, 0.130]], [0.816, [0.812, 0.048, 0.130]], [0.818, [0.807, 0.045, 0.132]], [0.820, [0.807, 0.045, 0.132]], [0.822, [0.803, 0.042, 0.133]], [0.824, [0.803, 0.042, 0.133]], [0.826, [0.798, 0.039, 0.134]], [0.828, [0.798, 0.039, 0.134]], [0.830, [0.793, 0.036, 0.135]], [0.832, [0.793, 0.036, 0.135]], [0.834, [0.789, 0.032, 0.137]], [0.836, [0.789, 0.032, 0.137]], [0.838, [0.784, 0.029, 0.138]], [0.840, [0.784, 0.029, 0.138]], [0.841, [0.779, 0.026, 0.139]], [0.843, [0.779, 0.026, 0.139]], [0.845, [0.774, 0.023, 0.140]], [0.847, [0.774, 0.023, 0.140]], [0.849, [0.770, 0.020, 0.141]], [0.851, [0.770, 0.020, 0.141]], [0.853, [0.765, 0.016, 0.143]], [0.855, [0.765, 0.016, 0.143]], [0.857, [0.760, 0.013, 0.144]], [0.859, [0.760, 0.013, 0.144]], [0.861, [0.756, 0.010, 0.145]], [0.863, [0.756, 0.010, 0.145]], [0.865, [0.751, 0.007, 0.146]], [0.867, [0.751, 0.007, 0.146]], [0.869, [0.746, 0.004, 0.148]], [0.871, [0.746, 0.004, 0.148]], [0.873, [0.742, 0.000, 0.149]], [0.875, [0.742, 0.000, 0.149]], [0.877, [0.735, 0.000, 0.149]], [0.879, [0.735, 0.000, 0.149]], [0.881, [0.727, 0.000, 0.149]], [0.883, [0.727, 0.000, 0.149]], [0.885, [0.720, 0.000, 0.149]], [0.886, [0.720, 0.000, 0.149]], [0.888, [0.712, 0.000, 0.149]], [0.890, [0.712, 0.000, 0.149]], [0.892, [0.705, 0.000, 0.149]], [0.894, [0.705, 0.000, 0.149]], [0.896, [0.697, 0.000, 0.149]], [0.898, [0.697, 0.000, 0.149]], [0.900, [0.690, 0.000, 0.149]], [0.902, [0.690, 0.000, 0.149]], [0.904, [0.682, 0.000, 0.149]], [0.906, [0.682, 0.000, 0.149]], [0.908, [0.675, 0.000, 0.149]], [0.910, [0.675, 0.000, 0.149]], [0.912, [0.667, 0.000, 0.149]], [0.914, [0.667, 0.000, 0.149]], [0.916, [0.660, 0.000, 0.149]], [0.918, [0.660, 0.000, 0.149]], [0.920, [0.652, 0.000, 0.149]], [0.922, [0.652, 0.000, 0.149]], [0.924, [0.645, 0.000, 0.149]], [0.926, [0.645, 0.000, 0.149]], [0.928, [0.637, 0.000, 0.149]], [0.930, [0.637, 0.000, 0.149]], [0.932, [0.630, 0.000, 0.149]], [0.933, [0.630, 0.000, 0.149]], [0.935, [0.622, 0.000, 0.149]], [0.937, [0.622, 0.000, 0.149]], [0.939, [0.615, 0.000, 0.149]], [0.941, [0.615, 0.000, 0.149]], [0.943, [0.607, 0.000, 0.149]], [0.945, [0.607, 0.000, 0.149]], [0.947, [0.600, 0.000, 0.149]], [0.949, [0.600, 0.000, 0.149]], [0.951, [0.592, 0.000, 0.149]], [0.953, [0.592, 0.000, 0.149]], [0.955, [0.585, 0.000, 0.149]], [0.957, [0.585, 0.000, 0.149]], [0.959, [0.577, 0.000, 0.149]], [0.961, [0.577, 0.000, 0.149]], [0.963, [0.570, 0.000, 0.149]], [0.965, [0.570, 0.000, 0.149]], [0.967, [0.562, 0.000, 0.149]], [0.969, [0.562, 0.000, 0.149]], [0.971, [0.554, 0.000, 0.149]], [0.973, [0.554, 0.000, 0.149]], [0.975, [0.547, 0.000, 0.149]], [0.977, [0.547, 0.000, 0.149]], [0.978, [0.539, 0.000, 0.149]], [0.980, [0.539, 0.000, 0.149]], [0.982, [0.532, 0.000, 0.149]], [0.984, [0.532, 0.000, 0.149]], [0.986, [0.524, 0.000, 0.149]], [0.988, [0.524, 0.000, 0.149]], [0.990, [0.517, 0.000, 0.149]], [0.992, [0.517, 0.000, 0.149]], [0.994, [0.509, 0.000, 0.149]], [0.996, [0.509, 0.000, 0.149]], [0.998, [0.502, 0.000, 0.149]], [1.000, [0.502, 0.000, 0.149]]]; + +// Sequential (2) +var afmhot = [[0.000, [0.000, 0.000, 0.000]], [0.002, [0.000, 0.000, 0.000]], [0.004, [0.008, 0.000, 0.000]], [0.006, [0.008, 0.000, 0.000]], [0.008, [0.016, 0.000, 0.000]], [0.010, [0.016, 0.000, 0.000]], [0.012, [0.024, 0.000, 0.000]], [0.014, [0.024, 0.000, 0.000]], [0.016, [0.031, 0.000, 0.000]], [0.018, [0.031, 0.000, 0.000]], [0.020, [0.039, 0.000, 0.000]], [0.022, [0.039, 0.000, 0.000]], [0.023, [0.047, 0.000, 0.000]], [0.025, [0.047, 0.000, 0.000]], [0.027, [0.055, 0.000, 0.000]], [0.029, [0.055, 0.000, 0.000]], [0.031, [0.063, 0.000, 0.000]], [0.033, [0.063, 0.000, 0.000]], [0.035, [0.071, 0.000, 0.000]], [0.037, [0.071, 0.000, 0.000]], [0.039, [0.078, 0.000, 0.000]], [0.041, [0.078, 0.000, 0.000]], [0.043, [0.086, 0.000, 0.000]], [0.045, [0.086, 0.000, 0.000]], [0.047, [0.094, 0.000, 0.000]], [0.049, [0.094, 0.000, 0.000]], [0.051, [0.102, 0.000, 0.000]], [0.053, [0.102, 0.000, 0.000]], [0.055, [0.110, 0.000, 0.000]], [0.057, [0.110, 0.000, 0.000]], [0.059, [0.118, 0.000, 0.000]], [0.061, [0.118, 0.000, 0.000]], [0.063, [0.125, 0.000, 0.000]], [0.065, [0.125, 0.000, 0.000]], [0.067, [0.133, 0.000, 0.000]], [0.068, [0.133, 0.000, 0.000]], [0.070, [0.141, 0.000, 0.000]], [0.072, [0.141, 0.000, 0.000]], [0.074, [0.149, 0.000, 0.000]], [0.076, [0.149, 0.000, 0.000]], [0.078, [0.157, 0.000, 0.000]], [0.080, [0.157, 0.000, 0.000]], [0.082, [0.165, 0.000, 0.000]], [0.084, [0.165, 0.000, 0.000]], [0.086, [0.173, 0.000, 0.000]], [0.088, [0.173, 0.000, 0.000]], [0.090, [0.180, 0.000, 0.000]], [0.092, [0.180, 0.000, 0.000]], [0.094, [0.188, 0.000, 0.000]], [0.096, [0.188, 0.000, 0.000]], [0.098, [0.196, 0.000, 0.000]], [0.100, [0.196, 0.000, 0.000]], [0.102, [0.204, 0.000, 0.000]], [0.104, [0.204, 0.000, 0.000]], [0.106, [0.212, 0.000, 0.000]], [0.108, [0.212, 0.000, 0.000]], [0.110, [0.220, 0.000, 0.000]], [0.112, [0.220, 0.000, 0.000]], [0.114, [0.227, 0.000, 0.000]], [0.115, [0.227, 0.000, 0.000]], [0.117, [0.235, 0.000, 0.000]], [0.119, [0.235, 0.000, 0.000]], [0.121, [0.243, 0.000, 0.000]], [0.123, [0.243, 0.000, 0.000]], [0.125, [0.251, 0.000, 0.000]], [0.127, [0.251, 0.000, 0.000]], [0.129, [0.259, 0.000, 0.000]], [0.131, [0.259, 0.000, 0.000]], [0.133, [0.267, 0.000, 0.000]], [0.135, [0.267, 0.000, 0.000]], [0.137, [0.275, 0.000, 0.000]], [0.139, [0.275, 0.000, 0.000]], [0.141, [0.282, 0.000, 0.000]], [0.143, [0.282, 0.000, 0.000]], [0.145, [0.290, 0.000, 0.000]], [0.147, [0.290, 0.000, 0.000]], [0.149, [0.298, 0.000, 0.000]], [0.151, [0.298, 0.000, 0.000]], [0.153, [0.306, 0.000, 0.000]], [0.155, [0.306, 0.000, 0.000]], [0.157, [0.314, 0.000, 0.000]], [0.159, [0.314, 0.000, 0.000]], [0.160, [0.322, 0.000, 0.000]], [0.162, [0.322, 0.000, 0.000]], [0.164, [0.329, 0.000, 0.000]], [0.166, [0.329, 0.000, 0.000]], [0.168, [0.337, 0.000, 0.000]], [0.170, [0.337, 0.000, 0.000]], [0.172, [0.345, 0.000, 0.000]], [0.174, [0.345, 0.000, 0.000]], [0.176, [0.353, 0.000, 0.000]], [0.178, [0.353, 0.000, 0.000]], [0.180, [0.361, 0.000, 0.000]], [0.182, [0.361, 0.000, 0.000]], [0.184, [0.369, 0.000, 0.000]], [0.186, [0.369, 0.000, 0.000]], [0.188, [0.376, 0.000, 0.000]], [0.190, [0.376, 0.000, 0.000]], [0.192, [0.384, 0.000, 0.000]], [0.194, [0.384, 0.000, 0.000]], [0.196, [0.392, 0.000, 0.000]], [0.198, [0.392, 0.000, 0.000]], [0.200, [0.400, 0.000, 0.000]], [0.202, [0.400, 0.000, 0.000]], [0.204, [0.408, 0.000, 0.000]], [0.205, [0.408, 0.000, 0.000]], [0.207, [0.416, 0.000, 0.000]], [0.209, [0.416, 0.000, 0.000]], [0.211, [0.424, 0.000, 0.000]], [0.213, [0.424, 0.000, 0.000]], [0.215, [0.431, 0.000, 0.000]], [0.217, [0.431, 0.000, 0.000]], [0.219, [0.439, 0.000, 0.000]], [0.221, [0.439, 0.000, 0.000]], [0.223, [0.447, 0.000, 0.000]], [0.225, [0.447, 0.000, 0.000]], [0.227, [0.455, 0.000, 0.000]], [0.229, [0.455, 0.000, 0.000]], [0.231, [0.463, 0.000, 0.000]], [0.233, [0.463, 0.000, 0.000]], [0.235, [0.471, 0.000, 0.000]], [0.237, [0.471, 0.000, 0.000]], [0.239, [0.478, 0.000, 0.000]], [0.241, [0.478, 0.000, 0.000]], [0.243, [0.486, 0.000, 0.000]], [0.245, [0.486, 0.000, 0.000]], [0.247, [0.494, 0.000, 0.000]], [0.249, [0.494, 0.000, 0.000]], [0.250, [0.502, 0.002, 0.000]], [0.252, [0.502, 0.002, 0.000]], [0.254, [0.510, 0.010, 0.000]], [0.256, [0.510, 0.010, 0.000]], [0.258, [0.518, 0.018, 0.000]], [0.260, [0.518, 0.018, 0.000]], [0.262, [0.525, 0.025, 0.000]], [0.264, [0.525, 0.025, 0.000]], [0.266, [0.533, 0.033, 0.000]], [0.268, [0.533, 0.033, 0.000]], [0.270, [0.541, 0.041, 0.000]], [0.272, [0.541, 0.041, 0.000]], [0.274, [0.549, 0.049, 0.000]], [0.276, [0.549, 0.049, 0.000]], [0.278, [0.557, 0.057, 0.000]], [0.280, [0.557, 0.057, 0.000]], [0.282, [0.565, 0.065, 0.000]], [0.284, [0.565, 0.065, 0.000]], [0.286, [0.573, 0.073, 0.000]], [0.288, [0.573, 0.073, 0.000]], [0.290, [0.580, 0.080, 0.000]], [0.292, [0.580, 0.080, 0.000]], [0.294, [0.588, 0.088, 0.000]], [0.295, [0.588, 0.088, 0.000]], [0.297, [0.596, 0.096, 0.000]], [0.299, [0.596, 0.096, 0.000]], [0.301, [0.604, 0.104, 0.000]], [0.303, [0.604, 0.104, 0.000]], [0.305, [0.612, 0.112, 0.000]], [0.307, [0.612, 0.112, 0.000]], [0.309, [0.620, 0.120, 0.000]], [0.311, [0.620, 0.120, 0.000]], [0.313, [0.627, 0.127, 0.000]], [0.315, [0.627, 0.127, 0.000]], [0.317, [0.635, 0.135, 0.000]], [0.319, [0.635, 0.135, 0.000]], [0.321, [0.643, 0.143, 0.000]], [0.323, [0.643, 0.143, 0.000]], [0.325, [0.651, 0.151, 0.000]], [0.327, [0.651, 0.151, 0.000]], [0.329, [0.659, 0.159, 0.000]], [0.331, [0.659, 0.159, 0.000]], [0.333, [0.667, 0.167, 0.000]], [0.335, [0.667, 0.167, 0.000]], [0.337, [0.675, 0.175, 0.000]], [0.339, [0.675, 0.175, 0.000]], [0.341, [0.682, 0.182, 0.000]], [0.342, [0.682, 0.182, 0.000]], [0.344, [0.690, 0.190, 0.000]], [0.346, [0.690, 0.190, 0.000]], [0.348, [0.698, 0.198, 0.000]], [0.350, [0.698, 0.198, 0.000]], [0.352, [0.706, 0.206, 0.000]], [0.354, [0.706, 0.206, 0.000]], [0.356, [0.714, 0.214, 0.000]], [0.358, [0.714, 0.214, 0.000]], [0.360, [0.722, 0.222, 0.000]], [0.362, [0.722, 0.222, 0.000]], [0.364, [0.729, 0.229, 0.000]], [0.366, [0.729, 0.229, 0.000]], [0.368, [0.737, 0.237, 0.000]], [0.370, [0.737, 0.237, 0.000]], [0.372, [0.745, 0.245, 0.000]], [0.374, [0.745, 0.245, 0.000]], [0.376, [0.753, 0.253, 0.000]], [0.378, [0.753, 0.253, 0.000]], [0.380, [0.761, 0.261, 0.000]], [0.382, [0.761, 0.261, 0.000]], [0.384, [0.769, 0.269, 0.000]], [0.386, [0.769, 0.269, 0.000]], [0.387, [0.776, 0.276, 0.000]], [0.389, [0.776, 0.276, 0.000]], [0.391, [0.784, 0.284, 0.000]], [0.393, [0.784, 0.284, 0.000]], [0.395, [0.792, 0.292, 0.000]], [0.397, [0.792, 0.292, 0.000]], [0.399, [0.800, 0.300, 0.000]], [0.401, [0.800, 0.300, 0.000]], [0.403, [0.808, 0.308, 0.000]], [0.405, [0.808, 0.308, 0.000]], [0.407, [0.816, 0.316, 0.000]], [0.409, [0.816, 0.316, 0.000]], [0.411, [0.824, 0.324, 0.000]], [0.413, [0.824, 0.324, 0.000]], [0.415, [0.831, 0.331, 0.000]], [0.417, [0.831, 0.331, 0.000]], [0.419, [0.839, 0.339, 0.000]], [0.421, [0.839, 0.339, 0.000]], [0.423, [0.847, 0.347, 0.000]], [0.425, [0.847, 0.347, 0.000]], [0.427, [0.855, 0.355, 0.000]], [0.429, [0.855, 0.355, 0.000]], [0.431, [0.863, 0.363, 0.000]], [0.432, [0.863, 0.363, 0.000]], [0.434, [0.871, 0.371, 0.000]], [0.436, [0.871, 0.371, 0.000]], [0.438, [0.878, 0.378, 0.000]], [0.440, [0.878, 0.378, 0.000]], [0.442, [0.886, 0.386, 0.000]], [0.444, [0.886, 0.386, 0.000]], [0.446, [0.894, 0.394, 0.000]], [0.448, [0.894, 0.394, 0.000]], [0.450, [0.902, 0.402, 0.000]], [0.452, [0.902, 0.402, 0.000]], [0.454, [0.910, 0.410, 0.000]], [0.456, [0.910, 0.410, 0.000]], [0.458, [0.918, 0.418, 0.000]], [0.460, [0.918, 0.418, 0.000]], [0.462, [0.925, 0.425, 0.000]], [0.464, [0.925, 0.425, 0.000]], [0.466, [0.933, 0.433, 0.000]], [0.468, [0.933, 0.433, 0.000]], [0.470, [0.941, 0.441, 0.000]], [0.472, [0.941, 0.441, 0.000]], [0.474, [0.949, 0.449, 0.000]], [0.476, [0.949, 0.449, 0.000]], [0.477, [0.957, 0.457, 0.000]], [0.479, [0.957, 0.457, 0.000]], [0.481, [0.965, 0.465, 0.000]], [0.483, [0.965, 0.465, 0.000]], [0.485, [0.973, 0.473, 0.000]], [0.487, [0.973, 0.473, 0.000]], [0.489, [0.980, 0.480, 0.000]], [0.491, [0.980, 0.480, 0.000]], [0.493, [0.988, 0.488, 0.000]], [0.495, [0.988, 0.488, 0.000]], [0.497, [0.996, 0.496, 0.000]], [0.499, [0.996, 0.496, 0.000]], [0.501, [1.000, 0.504, 0.004]], [0.503, [1.000, 0.504, 0.004]], [0.505, [1.000, 0.512, 0.012]], [0.507, [1.000, 0.512, 0.012]], [0.509, [1.000, 0.520, 0.020]], [0.511, [1.000, 0.520, 0.020]], [0.513, [1.000, 0.527, 0.027]], [0.515, [1.000, 0.527, 0.027]], [0.517, [1.000, 0.535, 0.035]], [0.519, [1.000, 0.535, 0.035]], [0.521, [1.000, 0.543, 0.043]], [0.523, [1.000, 0.543, 0.043]], [0.524, [1.000, 0.551, 0.051]], [0.526, [1.000, 0.551, 0.051]], [0.528, [1.000, 0.559, 0.059]], [0.530, [1.000, 0.559, 0.059]], [0.532, [1.000, 0.567, 0.067]], [0.534, [1.000, 0.567, 0.067]], [0.536, [1.000, 0.575, 0.075]], [0.538, [1.000, 0.575, 0.075]], [0.540, [1.000, 0.582, 0.082]], [0.542, [1.000, 0.582, 0.082]], [0.544, [1.000, 0.590, 0.090]], [0.546, [1.000, 0.590, 0.090]], [0.548, [1.000, 0.598, 0.098]], [0.550, [1.000, 0.598, 0.098]], [0.552, [1.000, 0.606, 0.106]], [0.554, [1.000, 0.606, 0.106]], [0.556, [1.000, 0.614, 0.114]], [0.558, [1.000, 0.614, 0.114]], [0.560, [1.000, 0.622, 0.122]], [0.562, [1.000, 0.622, 0.122]], [0.564, [1.000, 0.629, 0.129]], [0.566, [1.000, 0.629, 0.129]], [0.568, [1.000, 0.637, 0.137]], [0.569, [1.000, 0.637, 0.137]], [0.571, [1.000, 0.645, 0.145]], [0.573, [1.000, 0.645, 0.145]], [0.575, [1.000, 0.653, 0.153]], [0.577, [1.000, 0.653, 0.153]], [0.579, [1.000, 0.661, 0.161]], [0.581, [1.000, 0.661, 0.161]], [0.583, [1.000, 0.669, 0.169]], [0.585, [1.000, 0.669, 0.169]], [0.587, [1.000, 0.676, 0.176]], [0.589, [1.000, 0.676, 0.176]], [0.591, [1.000, 0.684, 0.184]], [0.593, [1.000, 0.684, 0.184]], [0.595, [1.000, 0.692, 0.192]], [0.597, [1.000, 0.692, 0.192]], [0.599, [1.000, 0.700, 0.200]], [0.601, [1.000, 0.700, 0.200]], [0.603, [1.000, 0.708, 0.208]], [0.605, [1.000, 0.708, 0.208]], [0.607, [1.000, 0.716, 0.216]], [0.609, [1.000, 0.716, 0.216]], [0.611, [1.000, 0.724, 0.224]], [0.613, [1.000, 0.724, 0.224]], [0.614, [1.000, 0.731, 0.231]], [0.616, [1.000, 0.731, 0.231]], [0.618, [1.000, 0.739, 0.239]], [0.620, [1.000, 0.739, 0.239]], [0.622, [1.000, 0.747, 0.247]], [0.624, [1.000, 0.747, 0.247]], [0.626, [1.000, 0.755, 0.255]], [0.628, [1.000, 0.755, 0.255]], [0.630, [1.000, 0.763, 0.263]], [0.632, [1.000, 0.763, 0.263]], [0.634, [1.000, 0.771, 0.271]], [0.636, [1.000, 0.771, 0.271]], [0.638, [1.000, 0.778, 0.278]], [0.640, [1.000, 0.778, 0.278]], [0.642, [1.000, 0.786, 0.286]], [0.644, [1.000, 0.786, 0.286]], [0.646, [1.000, 0.794, 0.294]], [0.648, [1.000, 0.794, 0.294]], [0.650, [1.000, 0.802, 0.302]], [0.652, [1.000, 0.802, 0.302]], [0.654, [1.000, 0.810, 0.310]], [0.656, [1.000, 0.810, 0.310]], [0.658, [1.000, 0.818, 0.318]], [0.659, [1.000, 0.818, 0.318]], [0.661, [1.000, 0.825, 0.325]], [0.663, [1.000, 0.825, 0.325]], [0.665, [1.000, 0.833, 0.333]], [0.667, [1.000, 0.833, 0.333]], [0.669, [1.000, 0.841, 0.341]], [0.671, [1.000, 0.841, 0.341]], [0.673, [1.000, 0.849, 0.349]], [0.675, [1.000, 0.849, 0.349]], [0.677, [1.000, 0.857, 0.357]], [0.679, [1.000, 0.857, 0.357]], [0.681, [1.000, 0.865, 0.365]], [0.683, [1.000, 0.865, 0.365]], [0.685, [1.000, 0.873, 0.373]], [0.687, [1.000, 0.873, 0.373]], [0.689, [1.000, 0.880, 0.380]], [0.691, [1.000, 0.880, 0.380]], [0.693, [1.000, 0.888, 0.388]], [0.695, [1.000, 0.888, 0.388]], [0.697, [1.000, 0.896, 0.396]], [0.699, [1.000, 0.896, 0.396]], [0.701, [1.000, 0.904, 0.404]], [0.703, [1.000, 0.904, 0.404]], [0.705, [1.000, 0.912, 0.412]], [0.706, [1.000, 0.912, 0.412]], [0.708, [1.000, 0.920, 0.420]], [0.710, [1.000, 0.920, 0.420]], [0.712, [1.000, 0.927, 0.427]], [0.714, [1.000, 0.927, 0.427]], [0.716, [1.000, 0.935, 0.435]], [0.718, [1.000, 0.935, 0.435]], [0.720, [1.000, 0.943, 0.443]], [0.722, [1.000, 0.943, 0.443]], [0.724, [1.000, 0.951, 0.451]], [0.726, [1.000, 0.951, 0.451]], [0.728, [1.000, 0.959, 0.459]], [0.730, [1.000, 0.959, 0.459]], [0.732, [1.000, 0.967, 0.467]], [0.734, [1.000, 0.967, 0.467]], [0.736, [1.000, 0.975, 0.475]], [0.738, [1.000, 0.975, 0.475]], [0.740, [1.000, 0.982, 0.482]], [0.742, [1.000, 0.982, 0.482]], [0.744, [1.000, 0.990, 0.490]], [0.746, [1.000, 0.990, 0.490]], [0.748, [1.000, 0.998, 0.498]], [0.750, [1.000, 0.998, 0.498]], [0.751, [1.000, 1.000, 0.506]], [0.753, [1.000, 1.000, 0.506]], [0.755, [1.000, 1.000, 0.514]], [0.757, [1.000, 1.000, 0.514]], [0.759, [1.000, 1.000, 0.522]], [0.761, [1.000, 1.000, 0.522]], [0.763, [1.000, 1.000, 0.529]], [0.765, [1.000, 1.000, 0.529]], [0.767, [1.000, 1.000, 0.537]], [0.769, [1.000, 1.000, 0.537]], [0.771, [1.000, 1.000, 0.545]], [0.773, [1.000, 1.000, 0.545]], [0.775, [1.000, 1.000, 0.553]], [0.777, [1.000, 1.000, 0.553]], [0.779, [1.000, 1.000, 0.561]], [0.781, [1.000, 1.000, 0.561]], [0.783, [1.000, 1.000, 0.569]], [0.785, [1.000, 1.000, 0.569]], [0.787, [1.000, 1.000, 0.576]], [0.789, [1.000, 1.000, 0.576]], [0.791, [1.000, 1.000, 0.584]], [0.793, [1.000, 1.000, 0.584]], [0.795, [1.000, 1.000, 0.592]], [0.796, [1.000, 1.000, 0.592]], [0.798, [1.000, 1.000, 0.600]], [0.800, [1.000, 1.000, 0.600]], [0.802, [1.000, 1.000, 0.608]], [0.804, [1.000, 1.000, 0.608]], [0.806, [1.000, 1.000, 0.616]], [0.808, [1.000, 1.000, 0.616]], [0.810, [1.000, 1.000, 0.624]], [0.812, [1.000, 1.000, 0.624]], [0.814, [1.000, 1.000, 0.631]], [0.816, [1.000, 1.000, 0.631]], [0.818, [1.000, 1.000, 0.639]], [0.820, [1.000, 1.000, 0.639]], [0.822, [1.000, 1.000, 0.647]], [0.824, [1.000, 1.000, 0.647]], [0.826, [1.000, 1.000, 0.655]], [0.828, [1.000, 1.000, 0.655]], [0.830, [1.000, 1.000, 0.663]], [0.832, [1.000, 1.000, 0.663]], [0.834, [1.000, 1.000, 0.671]], [0.836, [1.000, 1.000, 0.671]], [0.838, [1.000, 1.000, 0.678]], [0.840, [1.000, 1.000, 0.678]], [0.841, [1.000, 1.000, 0.686]], [0.843, [1.000, 1.000, 0.686]], [0.845, [1.000, 1.000, 0.694]], [0.847, [1.000, 1.000, 0.694]], [0.849, [1.000, 1.000, 0.702]], [0.851, [1.000, 1.000, 0.702]], [0.853, [1.000, 1.000, 0.710]], [0.855, [1.000, 1.000, 0.710]], [0.857, [1.000, 1.000, 0.718]], [0.859, [1.000, 1.000, 0.718]], [0.861, [1.000, 1.000, 0.725]], [0.863, [1.000, 1.000, 0.725]], [0.865, [1.000, 1.000, 0.733]], [0.867, [1.000, 1.000, 0.733]], [0.869, [1.000, 1.000, 0.741]], [0.871, [1.000, 1.000, 0.741]], [0.873, [1.000, 1.000, 0.749]], [0.875, [1.000, 1.000, 0.749]], [0.877, [1.000, 1.000, 0.757]], [0.879, [1.000, 1.000, 0.757]], [0.881, [1.000, 1.000, 0.765]], [0.883, [1.000, 1.000, 0.765]], [0.885, [1.000, 1.000, 0.773]], [0.886, [1.000, 1.000, 0.773]], [0.888, [1.000, 1.000, 0.780]], [0.890, [1.000, 1.000, 0.780]], [0.892, [1.000, 1.000, 0.788]], [0.894, [1.000, 1.000, 0.788]], [0.896, [1.000, 1.000, 0.796]], [0.898, [1.000, 1.000, 0.796]], [0.900, [1.000, 1.000, 0.804]], [0.902, [1.000, 1.000, 0.804]], [0.904, [1.000, 1.000, 0.812]], [0.906, [1.000, 1.000, 0.812]], [0.908, [1.000, 1.000, 0.820]], [0.910, [1.000, 1.000, 0.820]], [0.912, [1.000, 1.000, 0.827]], [0.914, [1.000, 1.000, 0.827]], [0.916, [1.000, 1.000, 0.835]], [0.918, [1.000, 1.000, 0.835]], [0.920, [1.000, 1.000, 0.843]], [0.922, [1.000, 1.000, 0.843]], [0.924, [1.000, 1.000, 0.851]], [0.926, [1.000, 1.000, 0.851]], [0.928, [1.000, 1.000, 0.859]], [0.930, [1.000, 1.000, 0.859]], [0.932, [1.000, 1.000, 0.867]], [0.933, [1.000, 1.000, 0.867]], [0.935, [1.000, 1.000, 0.875]], [0.937, [1.000, 1.000, 0.875]], [0.939, [1.000, 1.000, 0.882]], [0.941, [1.000, 1.000, 0.882]], [0.943, [1.000, 1.000, 0.890]], [0.945, [1.000, 1.000, 0.890]], [0.947, [1.000, 1.000, 0.898]], [0.949, [1.000, 1.000, 0.898]], [0.951, [1.000, 1.000, 0.906]], [0.953, [1.000, 1.000, 0.906]], [0.955, [1.000, 1.000, 0.914]], [0.957, [1.000, 1.000, 0.914]], [0.959, [1.000, 1.000, 0.922]], [0.961, [1.000, 1.000, 0.922]], [0.963, [1.000, 1.000, 0.929]], [0.965, [1.000, 1.000, 0.929]], [0.967, [1.000, 1.000, 0.937]], [0.969, [1.000, 1.000, 0.937]], [0.971, [1.000, 1.000, 0.945]], [0.973, [1.000, 1.000, 0.945]], [0.975, [1.000, 1.000, 0.953]], [0.977, [1.000, 1.000, 0.953]], [0.978, [1.000, 1.000, 0.961]], [0.980, [1.000, 1.000, 0.961]], [0.982, [1.000, 1.000, 0.969]], [0.984, [1.000, 1.000, 0.969]], [0.986, [1.000, 1.000, 0.976]], [0.988, [1.000, 1.000, 0.976]], [0.990, [1.000, 1.000, 0.984]], [0.992, [1.000, 1.000, 0.984]], [0.994, [1.000, 1.000, 0.992]], [0.996, [1.000, 1.000, 0.992]], [0.998, [1.000, 1.000, 1.000]], [1.000, [1.000, 1.000, 1.000]]]; +var autumn = [[0.000, [1.000, 0.000, 0.000]], [0.002, [1.000, 0.000, 0.000]], [0.004, [1.000, 0.004, 0.000]], [0.006, [1.000, 0.004, 0.000]], [0.008, [1.000, 0.008, 0.000]], [0.010, [1.000, 0.008, 0.000]], [0.012, [1.000, 0.012, 0.000]], [0.014, [1.000, 0.012, 0.000]], [0.016, [1.000, 0.016, 0.000]], [0.018, [1.000, 0.016, 0.000]], [0.020, [1.000, 0.020, 0.000]], [0.022, [1.000, 0.020, 0.000]], [0.023, [1.000, 0.024, 0.000]], [0.025, [1.000, 0.024, 0.000]], [0.027, [1.000, 0.027, 0.000]], [0.029, [1.000, 0.027, 0.000]], [0.031, [1.000, 0.031, 0.000]], [0.033, [1.000, 0.031, 0.000]], [0.035, [1.000, 0.035, 0.000]], [0.037, [1.000, 0.035, 0.000]], [0.039, [1.000, 0.039, 0.000]], [0.041, [1.000, 0.039, 0.000]], [0.043, [1.000, 0.043, 0.000]], [0.045, [1.000, 0.043, 0.000]], [0.047, [1.000, 0.047, 0.000]], [0.049, [1.000, 0.047, 0.000]], [0.051, [1.000, 0.051, 0.000]], [0.053, [1.000, 0.051, 0.000]], [0.055, [1.000, 0.055, 0.000]], [0.057, [1.000, 0.055, 0.000]], [0.059, [1.000, 0.059, 0.000]], [0.061, [1.000, 0.059, 0.000]], [0.063, [1.000, 0.063, 0.000]], [0.065, [1.000, 0.063, 0.000]], [0.067, [1.000, 0.067, 0.000]], [0.068, [1.000, 0.067, 0.000]], [0.070, [1.000, 0.071, 0.000]], [0.072, [1.000, 0.071, 0.000]], [0.074, [1.000, 0.075, 0.000]], [0.076, [1.000, 0.075, 0.000]], [0.078, [1.000, 0.078, 0.000]], [0.080, [1.000, 0.078, 0.000]], [0.082, [1.000, 0.082, 0.000]], [0.084, [1.000, 0.082, 0.000]], [0.086, [1.000, 0.086, 0.000]], [0.088, [1.000, 0.086, 0.000]], [0.090, [1.000, 0.090, 0.000]], [0.092, [1.000, 0.090, 0.000]], [0.094, [1.000, 0.094, 0.000]], [0.096, [1.000, 0.094, 0.000]], [0.098, [1.000, 0.098, 0.000]], [0.100, [1.000, 0.098, 0.000]], [0.102, [1.000, 0.102, 0.000]], [0.104, [1.000, 0.102, 0.000]], [0.106, [1.000, 0.106, 0.000]], [0.108, [1.000, 0.106, 0.000]], [0.110, [1.000, 0.110, 0.000]], [0.112, [1.000, 0.110, 0.000]], [0.114, [1.000, 0.114, 0.000]], [0.115, [1.000, 0.114, 0.000]], [0.117, [1.000, 0.118, 0.000]], [0.119, [1.000, 0.118, 0.000]], [0.121, [1.000, 0.122, 0.000]], [0.123, [1.000, 0.122, 0.000]], [0.125, [1.000, 0.125, 0.000]], [0.127, [1.000, 0.125, 0.000]], [0.129, [1.000, 0.129, 0.000]], [0.131, [1.000, 0.129, 0.000]], [0.133, [1.000, 0.133, 0.000]], [0.135, [1.000, 0.133, 0.000]], [0.137, [1.000, 0.137, 0.000]], [0.139, [1.000, 0.137, 0.000]], [0.141, [1.000, 0.141, 0.000]], [0.143, [1.000, 0.141, 0.000]], [0.145, [1.000, 0.145, 0.000]], [0.147, [1.000, 0.145, 0.000]], [0.149, [1.000, 0.149, 0.000]], [0.151, [1.000, 0.149, 0.000]], [0.153, [1.000, 0.153, 0.000]], [0.155, [1.000, 0.153, 0.000]], [0.157, [1.000, 0.157, 0.000]], [0.159, [1.000, 0.157, 0.000]], [0.160, [1.000, 0.161, 0.000]], [0.162, [1.000, 0.161, 0.000]], [0.164, [1.000, 0.165, 0.000]], [0.166, [1.000, 0.165, 0.000]], [0.168, [1.000, 0.169, 0.000]], [0.170, [1.000, 0.169, 0.000]], [0.172, [1.000, 0.173, 0.000]], [0.174, [1.000, 0.173, 0.000]], [0.176, [1.000, 0.176, 0.000]], [0.178, [1.000, 0.176, 0.000]], [0.180, [1.000, 0.180, 0.000]], [0.182, [1.000, 0.180, 0.000]], [0.184, [1.000, 0.184, 0.000]], [0.186, [1.000, 0.184, 0.000]], [0.188, [1.000, 0.188, 0.000]], [0.190, [1.000, 0.188, 0.000]], [0.192, [1.000, 0.192, 0.000]], [0.194, [1.000, 0.192, 0.000]], [0.196, [1.000, 0.196, 0.000]], [0.198, [1.000, 0.196, 0.000]], [0.200, [1.000, 0.200, 0.000]], [0.202, [1.000, 0.200, 0.000]], [0.204, [1.000, 0.204, 0.000]], [0.205, [1.000, 0.204, 0.000]], [0.207, [1.000, 0.208, 0.000]], [0.209, [1.000, 0.208, 0.000]], [0.211, [1.000, 0.212, 0.000]], [0.213, [1.000, 0.212, 0.000]], [0.215, [1.000, 0.216, 0.000]], [0.217, [1.000, 0.216, 0.000]], [0.219, [1.000, 0.220, 0.000]], [0.221, [1.000, 0.220, 0.000]], [0.223, [1.000, 0.224, 0.000]], [0.225, [1.000, 0.224, 0.000]], [0.227, [1.000, 0.227, 0.000]], [0.229, [1.000, 0.227, 0.000]], [0.231, [1.000, 0.231, 0.000]], [0.233, [1.000, 0.231, 0.000]], [0.235, [1.000, 0.235, 0.000]], [0.237, [1.000, 0.235, 0.000]], [0.239, [1.000, 0.239, 0.000]], [0.241, [1.000, 0.239, 0.000]], [0.243, [1.000, 0.243, 0.000]], [0.245, [1.000, 0.243, 0.000]], [0.247, [1.000, 0.247, 0.000]], [0.249, [1.000, 0.247, 0.000]], [0.250, [1.000, 0.251, 0.000]], [0.252, [1.000, 0.251, 0.000]], [0.254, [1.000, 0.255, 0.000]], [0.256, [1.000, 0.255, 0.000]], [0.258, [1.000, 0.259, 0.000]], [0.260, [1.000, 0.259, 0.000]], [0.262, [1.000, 0.263, 0.000]], [0.264, [1.000, 0.263, 0.000]], [0.266, [1.000, 0.267, 0.000]], [0.268, [1.000, 0.267, 0.000]], [0.270, [1.000, 0.271, 0.000]], [0.272, [1.000, 0.271, 0.000]], [0.274, [1.000, 0.275, 0.000]], [0.276, [1.000, 0.275, 0.000]], [0.278, [1.000, 0.278, 0.000]], [0.280, [1.000, 0.278, 0.000]], [0.282, [1.000, 0.282, 0.000]], [0.284, [1.000, 0.282, 0.000]], [0.286, [1.000, 0.286, 0.000]], [0.288, [1.000, 0.286, 0.000]], [0.290, [1.000, 0.290, 0.000]], [0.292, [1.000, 0.290, 0.000]], [0.294, [1.000, 0.294, 0.000]], [0.295, [1.000, 0.294, 0.000]], [0.297, [1.000, 0.298, 0.000]], [0.299, [1.000, 0.298, 0.000]], [0.301, [1.000, 0.302, 0.000]], [0.303, [1.000, 0.302, 0.000]], [0.305, [1.000, 0.306, 0.000]], [0.307, [1.000, 0.306, 0.000]], [0.309, [1.000, 0.310, 0.000]], [0.311, [1.000, 0.310, 0.000]], [0.313, [1.000, 0.314, 0.000]], [0.315, [1.000, 0.314, 0.000]], [0.317, [1.000, 0.318, 0.000]], [0.319, [1.000, 0.318, 0.000]], [0.321, [1.000, 0.322, 0.000]], [0.323, [1.000, 0.322, 0.000]], [0.325, [1.000, 0.325, 0.000]], [0.327, [1.000, 0.325, 0.000]], [0.329, [1.000, 0.329, 0.000]], [0.331, [1.000, 0.329, 0.000]], [0.333, [1.000, 0.333, 0.000]], [0.335, [1.000, 0.333, 0.000]], [0.337, [1.000, 0.337, 0.000]], [0.339, [1.000, 0.337, 0.000]], [0.341, [1.000, 0.341, 0.000]], [0.342, [1.000, 0.341, 0.000]], [0.344, [1.000, 0.345, 0.000]], [0.346, [1.000, 0.345, 0.000]], [0.348, [1.000, 0.349, 0.000]], [0.350, [1.000, 0.349, 0.000]], [0.352, [1.000, 0.353, 0.000]], [0.354, [1.000, 0.353, 0.000]], [0.356, [1.000, 0.357, 0.000]], [0.358, [1.000, 0.357, 0.000]], [0.360, [1.000, 0.361, 0.000]], [0.362, [1.000, 0.361, 0.000]], [0.364, [1.000, 0.365, 0.000]], [0.366, [1.000, 0.365, 0.000]], [0.368, [1.000, 0.369, 0.000]], [0.370, [1.000, 0.369, 0.000]], [0.372, [1.000, 0.373, 0.000]], [0.374, [1.000, 0.373, 0.000]], [0.376, [1.000, 0.376, 0.000]], [0.378, [1.000, 0.376, 0.000]], [0.380, [1.000, 0.380, 0.000]], [0.382, [1.000, 0.380, 0.000]], [0.384, [1.000, 0.384, 0.000]], [0.386, [1.000, 0.384, 0.000]], [0.387, [1.000, 0.388, 0.000]], [0.389, [1.000, 0.388, 0.000]], [0.391, [1.000, 0.392, 0.000]], [0.393, [1.000, 0.392, 0.000]], [0.395, [1.000, 0.396, 0.000]], [0.397, [1.000, 0.396, 0.000]], [0.399, [1.000, 0.400, 0.000]], [0.401, [1.000, 0.400, 0.000]], [0.403, [1.000, 0.404, 0.000]], [0.405, [1.000, 0.404, 0.000]], [0.407, [1.000, 0.408, 0.000]], [0.409, [1.000, 0.408, 0.000]], [0.411, [1.000, 0.412, 0.000]], [0.413, [1.000, 0.412, 0.000]], [0.415, [1.000, 0.416, 0.000]], [0.417, [1.000, 0.416, 0.000]], [0.419, [1.000, 0.420, 0.000]], [0.421, [1.000, 0.420, 0.000]], [0.423, [1.000, 0.424, 0.000]], [0.425, [1.000, 0.424, 0.000]], [0.427, [1.000, 0.427, 0.000]], [0.429, [1.000, 0.427, 0.000]], [0.431, [1.000, 0.431, 0.000]], [0.432, [1.000, 0.431, 0.000]], [0.434, [1.000, 0.435, 0.000]], [0.436, [1.000, 0.435, 0.000]], [0.438, [1.000, 0.439, 0.000]], [0.440, [1.000, 0.439, 0.000]], [0.442, [1.000, 0.443, 0.000]], [0.444, [1.000, 0.443, 0.000]], [0.446, [1.000, 0.447, 0.000]], [0.448, [1.000, 0.447, 0.000]], [0.450, [1.000, 0.451, 0.000]], [0.452, [1.000, 0.451, 0.000]], [0.454, [1.000, 0.455, 0.000]], [0.456, [1.000, 0.455, 0.000]], [0.458, [1.000, 0.459, 0.000]], [0.460, [1.000, 0.459, 0.000]], [0.462, [1.000, 0.463, 0.000]], [0.464, [1.000, 0.463, 0.000]], [0.466, [1.000, 0.467, 0.000]], [0.468, [1.000, 0.467, 0.000]], [0.470, [1.000, 0.471, 0.000]], [0.472, [1.000, 0.471, 0.000]], [0.474, [1.000, 0.475, 0.000]], [0.476, [1.000, 0.475, 0.000]], [0.477, [1.000, 0.478, 0.000]], [0.479, [1.000, 0.478, 0.000]], [0.481, [1.000, 0.482, 0.000]], [0.483, [1.000, 0.482, 0.000]], [0.485, [1.000, 0.486, 0.000]], [0.487, [1.000, 0.486, 0.000]], [0.489, [1.000, 0.490, 0.000]], [0.491, [1.000, 0.490, 0.000]], [0.493, [1.000, 0.494, 0.000]], [0.495, [1.000, 0.494, 0.000]], [0.497, [1.000, 0.498, 0.000]], [0.499, [1.000, 0.498, 0.000]], [0.501, [1.000, 0.502, 0.000]], [0.503, [1.000, 0.502, 0.000]], [0.505, [1.000, 0.506, 0.000]], [0.507, [1.000, 0.506, 0.000]], [0.509, [1.000, 0.510, 0.000]], [0.511, [1.000, 0.510, 0.000]], [0.513, [1.000, 0.514, 0.000]], [0.515, [1.000, 0.514, 0.000]], [0.517, [1.000, 0.518, 0.000]], [0.519, [1.000, 0.518, 0.000]], [0.521, [1.000, 0.522, 0.000]], [0.523, [1.000, 0.522, 0.000]], [0.524, [1.000, 0.525, 0.000]], [0.526, [1.000, 0.525, 0.000]], [0.528, [1.000, 0.529, 0.000]], [0.530, [1.000, 0.529, 0.000]], [0.532, [1.000, 0.533, 0.000]], [0.534, [1.000, 0.533, 0.000]], [0.536, [1.000, 0.537, 0.000]], [0.538, [1.000, 0.537, 0.000]], [0.540, [1.000, 0.541, 0.000]], [0.542, [1.000, 0.541, 0.000]], [0.544, [1.000, 0.545, 0.000]], [0.546, [1.000, 0.545, 0.000]], [0.548, [1.000, 0.549, 0.000]], [0.550, [1.000, 0.549, 0.000]], [0.552, [1.000, 0.553, 0.000]], [0.554, [1.000, 0.553, 0.000]], [0.556, [1.000, 0.557, 0.000]], [0.558, [1.000, 0.557, 0.000]], [0.560, [1.000, 0.561, 0.000]], [0.562, [1.000, 0.561, 0.000]], [0.564, [1.000, 0.565, 0.000]], [0.566, [1.000, 0.565, 0.000]], [0.568, [1.000, 0.569, 0.000]], [0.569, [1.000, 0.569, 0.000]], [0.571, [1.000, 0.573, 0.000]], [0.573, [1.000, 0.573, 0.000]], [0.575, [1.000, 0.576, 0.000]], [0.577, [1.000, 0.576, 0.000]], [0.579, [1.000, 0.580, 0.000]], [0.581, [1.000, 0.580, 0.000]], [0.583, [1.000, 0.584, 0.000]], [0.585, [1.000, 0.584, 0.000]], [0.587, [1.000, 0.588, 0.000]], [0.589, [1.000, 0.588, 0.000]], [0.591, [1.000, 0.592, 0.000]], [0.593, [1.000, 0.592, 0.000]], [0.595, [1.000, 0.596, 0.000]], [0.597, [1.000, 0.596, 0.000]], [0.599, [1.000, 0.600, 0.000]], [0.601, [1.000, 0.600, 0.000]], [0.603, [1.000, 0.604, 0.000]], [0.605, [1.000, 0.604, 0.000]], [0.607, [1.000, 0.608, 0.000]], [0.609, [1.000, 0.608, 0.000]], [0.611, [1.000, 0.612, 0.000]], [0.613, [1.000, 0.612, 0.000]], [0.614, [1.000, 0.616, 0.000]], [0.616, [1.000, 0.616, 0.000]], [0.618, [1.000, 0.620, 0.000]], [0.620, [1.000, 0.620, 0.000]], [0.622, [1.000, 0.624, 0.000]], [0.624, [1.000, 0.624, 0.000]], [0.626, [1.000, 0.627, 0.000]], [0.628, [1.000, 0.627, 0.000]], [0.630, [1.000, 0.631, 0.000]], [0.632, [1.000, 0.631, 0.000]], [0.634, [1.000, 0.635, 0.000]], [0.636, [1.000, 0.635, 0.000]], [0.638, [1.000, 0.639, 0.000]], [0.640, [1.000, 0.639, 0.000]], [0.642, [1.000, 0.643, 0.000]], [0.644, [1.000, 0.643, 0.000]], [0.646, [1.000, 0.647, 0.000]], [0.648, [1.000, 0.647, 0.000]], [0.650, [1.000, 0.651, 0.000]], [0.652, [1.000, 0.651, 0.000]], [0.654, [1.000, 0.655, 0.000]], [0.656, [1.000, 0.655, 0.000]], [0.658, [1.000, 0.659, 0.000]], [0.659, [1.000, 0.659, 0.000]], [0.661, [1.000, 0.663, 0.000]], [0.663, [1.000, 0.663, 0.000]], [0.665, [1.000, 0.667, 0.000]], [0.667, [1.000, 0.667, 0.000]], [0.669, [1.000, 0.671, 0.000]], [0.671, [1.000, 0.671, 0.000]], [0.673, [1.000, 0.675, 0.000]], [0.675, [1.000, 0.675, 0.000]], [0.677, [1.000, 0.678, 0.000]], [0.679, [1.000, 0.678, 0.000]], [0.681, [1.000, 0.682, 0.000]], [0.683, [1.000, 0.682, 0.000]], [0.685, [1.000, 0.686, 0.000]], [0.687, [1.000, 0.686, 0.000]], [0.689, [1.000, 0.690, 0.000]], [0.691, [1.000, 0.690, 0.000]], [0.693, [1.000, 0.694, 0.000]], [0.695, [1.000, 0.694, 0.000]], [0.697, [1.000, 0.698, 0.000]], [0.699, [1.000, 0.698, 0.000]], [0.701, [1.000, 0.702, 0.000]], [0.703, [1.000, 0.702, 0.000]], [0.705, [1.000, 0.706, 0.000]], [0.706, [1.000, 0.706, 0.000]], [0.708, [1.000, 0.710, 0.000]], [0.710, [1.000, 0.710, 0.000]], [0.712, [1.000, 0.714, 0.000]], [0.714, [1.000, 0.714, 0.000]], [0.716, [1.000, 0.718, 0.000]], [0.718, [1.000, 0.718, 0.000]], [0.720, [1.000, 0.722, 0.000]], [0.722, [1.000, 0.722, 0.000]], [0.724, [1.000, 0.725, 0.000]], [0.726, [1.000, 0.725, 0.000]], [0.728, [1.000, 0.729, 0.000]], [0.730, [1.000, 0.729, 0.000]], [0.732, [1.000, 0.733, 0.000]], [0.734, [1.000, 0.733, 0.000]], [0.736, [1.000, 0.737, 0.000]], [0.738, [1.000, 0.737, 0.000]], [0.740, [1.000, 0.741, 0.000]], [0.742, [1.000, 0.741, 0.000]], [0.744, [1.000, 0.745, 0.000]], [0.746, [1.000, 0.745, 0.000]], [0.748, [1.000, 0.749, 0.000]], [0.750, [1.000, 0.749, 0.000]], [0.751, [1.000, 0.753, 0.000]], [0.753, [1.000, 0.753, 0.000]], [0.755, [1.000, 0.757, 0.000]], [0.757, [1.000, 0.757, 0.000]], [0.759, [1.000, 0.761, 0.000]], [0.761, [1.000, 0.761, 0.000]], [0.763, [1.000, 0.765, 0.000]], [0.765, [1.000, 0.765, 0.000]], [0.767, [1.000, 0.769, 0.000]], [0.769, [1.000, 0.769, 0.000]], [0.771, [1.000, 0.773, 0.000]], [0.773, [1.000, 0.773, 0.000]], [0.775, [1.000, 0.776, 0.000]], [0.777, [1.000, 0.776, 0.000]], [0.779, [1.000, 0.780, 0.000]], [0.781, [1.000, 0.780, 0.000]], [0.783, [1.000, 0.784, 0.000]], [0.785, [1.000, 0.784, 0.000]], [0.787, [1.000, 0.788, 0.000]], [0.789, [1.000, 0.788, 0.000]], [0.791, [1.000, 0.792, 0.000]], [0.793, [1.000, 0.792, 0.000]], [0.795, [1.000, 0.796, 0.000]], [0.796, [1.000, 0.796, 0.000]], [0.798, [1.000, 0.800, 0.000]], [0.800, [1.000, 0.800, 0.000]], [0.802, [1.000, 0.804, 0.000]], [0.804, [1.000, 0.804, 0.000]], [0.806, [1.000, 0.808, 0.000]], [0.808, [1.000, 0.808, 0.000]], [0.810, [1.000, 0.812, 0.000]], [0.812, [1.000, 0.812, 0.000]], [0.814, [1.000, 0.816, 0.000]], [0.816, [1.000, 0.816, 0.000]], [0.818, [1.000, 0.820, 0.000]], [0.820, [1.000, 0.820, 0.000]], [0.822, [1.000, 0.824, 0.000]], [0.824, [1.000, 0.824, 0.000]], [0.826, [1.000, 0.827, 0.000]], [0.828, [1.000, 0.827, 0.000]], [0.830, [1.000, 0.831, 0.000]], [0.832, [1.000, 0.831, 0.000]], [0.834, [1.000, 0.835, 0.000]], [0.836, [1.000, 0.835, 0.000]], [0.838, [1.000, 0.839, 0.000]], [0.840, [1.000, 0.839, 0.000]], [0.841, [1.000, 0.843, 0.000]], [0.843, [1.000, 0.843, 0.000]], [0.845, [1.000, 0.847, 0.000]], [0.847, [1.000, 0.847, 0.000]], [0.849, [1.000, 0.851, 0.000]], [0.851, [1.000, 0.851, 0.000]], [0.853, [1.000, 0.855, 0.000]], [0.855, [1.000, 0.855, 0.000]], [0.857, [1.000, 0.859, 0.000]], [0.859, [1.000, 0.859, 0.000]], [0.861, [1.000, 0.863, 0.000]], [0.863, [1.000, 0.863, 0.000]], [0.865, [1.000, 0.867, 0.000]], [0.867, [1.000, 0.867, 0.000]], [0.869, [1.000, 0.871, 0.000]], [0.871, [1.000, 0.871, 0.000]], [0.873, [1.000, 0.875, 0.000]], [0.875, [1.000, 0.875, 0.000]], [0.877, [1.000, 0.878, 0.000]], [0.879, [1.000, 0.878, 0.000]], [0.881, [1.000, 0.882, 0.000]], [0.883, [1.000, 0.882, 0.000]], [0.885, [1.000, 0.886, 0.000]], [0.886, [1.000, 0.886, 0.000]], [0.888, [1.000, 0.890, 0.000]], [0.890, [1.000, 0.890, 0.000]], [0.892, [1.000, 0.894, 0.000]], [0.894, [1.000, 0.894, 0.000]], [0.896, [1.000, 0.898, 0.000]], [0.898, [1.000, 0.898, 0.000]], [0.900, [1.000, 0.902, 0.000]], [0.902, [1.000, 0.902, 0.000]], [0.904, [1.000, 0.906, 0.000]], [0.906, [1.000, 0.906, 0.000]], [0.908, [1.000, 0.910, 0.000]], [0.910, [1.000, 0.910, 0.000]], [0.912, [1.000, 0.914, 0.000]], [0.914, [1.000, 0.914, 0.000]], [0.916, [1.000, 0.918, 0.000]], [0.918, [1.000, 0.918, 0.000]], [0.920, [1.000, 0.922, 0.000]], [0.922, [1.000, 0.922, 0.000]], [0.924, [1.000, 0.925, 0.000]], [0.926, [1.000, 0.925, 0.000]], [0.928, [1.000, 0.929, 0.000]], [0.930, [1.000, 0.929, 0.000]], [0.932, [1.000, 0.933, 0.000]], [0.933, [1.000, 0.933, 0.000]], [0.935, [1.000, 0.937, 0.000]], [0.937, [1.000, 0.937, 0.000]], [0.939, [1.000, 0.941, 0.000]], [0.941, [1.000, 0.941, 0.000]], [0.943, [1.000, 0.945, 0.000]], [0.945, [1.000, 0.945, 0.000]], [0.947, [1.000, 0.949, 0.000]], [0.949, [1.000, 0.949, 0.000]], [0.951, [1.000, 0.953, 0.000]], [0.953, [1.000, 0.953, 0.000]], [0.955, [1.000, 0.957, 0.000]], [0.957, [1.000, 0.957, 0.000]], [0.959, [1.000, 0.961, 0.000]], [0.961, [1.000, 0.961, 0.000]], [0.963, [1.000, 0.965, 0.000]], [0.965, [1.000, 0.965, 0.000]], [0.967, [1.000, 0.969, 0.000]], [0.969, [1.000, 0.969, 0.000]], [0.971, [1.000, 0.973, 0.000]], [0.973, [1.000, 0.973, 0.000]], [0.975, [1.000, 0.976, 0.000]], [0.977, [1.000, 0.976, 0.000]], [0.978, [1.000, 0.980, 0.000]], [0.980, [1.000, 0.980, 0.000]], [0.982, [1.000, 0.984, 0.000]], [0.984, [1.000, 0.984, 0.000]], [0.986, [1.000, 0.988, 0.000]], [0.988, [1.000, 0.988, 0.000]], [0.990, [1.000, 0.992, 0.000]], [0.992, [1.000, 0.992, 0.000]], [0.994, [1.000, 0.996, 0.000]], [0.996, [1.000, 0.996, 0.000]], [0.998, [1.000, 1.000, 0.000]], [1.000, [1.000, 1.000, 0.000]]]; +var bone = [[0.000, [0.000, 0.000, 0.000]], [0.002, [0.000, 0.000, 0.000]], [0.004, [0.003, 0.003, 0.005]], [0.006, [0.003, 0.003, 0.005]], [0.008, [0.007, 0.007, 0.010]], [0.010, [0.007, 0.007, 0.010]], [0.012, [0.010, 0.010, 0.014]], [0.014, [0.010, 0.010, 0.014]], [0.016, [0.014, 0.014, 0.019]], [0.018, [0.014, 0.014, 0.019]], [0.020, [0.017, 0.017, 0.024]], [0.022, [0.017, 0.017, 0.024]], [0.023, [0.021, 0.021, 0.029]], [0.025, [0.021, 0.021, 0.029]], [0.027, [0.024, 0.024, 0.033]], [0.029, [0.024, 0.024, 0.033]], [0.031, [0.027, 0.027, 0.038]], [0.033, [0.027, 0.027, 0.038]], [0.035, [0.031, 0.031, 0.043]], [0.037, [0.031, 0.031, 0.043]], [0.039, [0.034, 0.034, 0.048]], [0.041, [0.034, 0.034, 0.048]], [0.043, [0.038, 0.038, 0.053]], [0.045, [0.038, 0.038, 0.053]], [0.047, [0.041, 0.041, 0.057]], [0.049, [0.041, 0.041, 0.057]], [0.051, [0.045, 0.045, 0.062]], [0.053, [0.045, 0.045, 0.062]], [0.055, [0.048, 0.048, 0.067]], [0.057, [0.048, 0.048, 0.067]], [0.059, [0.051, 0.051, 0.072]], [0.061, [0.051, 0.051, 0.072]], [0.063, [0.055, 0.055, 0.076]], [0.065, [0.055, 0.055, 0.076]], [0.067, [0.058, 0.058, 0.081]], [0.068, [0.058, 0.058, 0.081]], [0.070, [0.062, 0.062, 0.086]], [0.072, [0.062, 0.062, 0.086]], [0.074, [0.065, 0.065, 0.091]], [0.076, [0.065, 0.065, 0.091]], [0.078, [0.069, 0.069, 0.095]], [0.080, [0.069, 0.069, 0.095]], [0.082, [0.072, 0.072, 0.100]], [0.084, [0.072, 0.072, 0.100]], [0.086, [0.075, 0.075, 0.105]], [0.088, [0.075, 0.075, 0.105]], [0.090, [0.079, 0.079, 0.110]], [0.092, [0.079, 0.079, 0.110]], [0.094, [0.082, 0.082, 0.115]], [0.096, [0.082, 0.082, 0.115]], [0.098, [0.086, 0.086, 0.119]], [0.100, [0.086, 0.086, 0.119]], [0.102, [0.089, 0.089, 0.124]], [0.104, [0.089, 0.089, 0.124]], [0.106, [0.093, 0.093, 0.129]], [0.108, [0.093, 0.093, 0.129]], [0.110, [0.096, 0.096, 0.134]], [0.112, [0.096, 0.096, 0.134]], [0.114, [0.100, 0.100, 0.138]], [0.115, [0.100, 0.100, 0.138]], [0.117, [0.103, 0.103, 0.143]], [0.119, [0.103, 0.103, 0.143]], [0.121, [0.106, 0.106, 0.148]], [0.123, [0.106, 0.106, 0.148]], [0.125, [0.110, 0.110, 0.153]], [0.127, [0.110, 0.110, 0.153]], [0.129, [0.113, 0.113, 0.158]], [0.131, [0.113, 0.113, 0.158]], [0.133, [0.117, 0.117, 0.162]], [0.135, [0.117, 0.117, 0.162]], [0.137, [0.120, 0.120, 0.167]], [0.139, [0.120, 0.120, 0.167]], [0.141, [0.124, 0.124, 0.172]], [0.143, [0.124, 0.124, 0.172]], [0.145, [0.127, 0.127, 0.177]], [0.147, [0.127, 0.127, 0.177]], [0.149, [0.130, 0.130, 0.181]], [0.151, [0.130, 0.130, 0.181]], [0.153, [0.134, 0.134, 0.186]], [0.155, [0.134, 0.134, 0.186]], [0.157, [0.137, 0.137, 0.191]], [0.159, [0.137, 0.137, 0.191]], [0.160, [0.141, 0.141, 0.196]], [0.162, [0.141, 0.141, 0.196]], [0.164, [0.144, 0.144, 0.201]], [0.166, [0.144, 0.144, 0.201]], [0.168, [0.148, 0.148, 0.205]], [0.170, [0.148, 0.148, 0.205]], [0.172, [0.151, 0.151, 0.210]], [0.174, [0.151, 0.151, 0.210]], [0.176, [0.154, 0.154, 0.215]], [0.178, [0.154, 0.154, 0.215]], [0.180, [0.158, 0.158, 0.220]], [0.182, [0.158, 0.158, 0.220]], [0.184, [0.161, 0.161, 0.224]], [0.186, [0.161, 0.161, 0.224]], [0.188, [0.165, 0.165, 0.229]], [0.190, [0.165, 0.165, 0.229]], [0.192, [0.168, 0.168, 0.234]], [0.194, [0.168, 0.168, 0.234]], [0.196, [0.172, 0.172, 0.239]], [0.198, [0.172, 0.172, 0.239]], [0.200, [0.175, 0.175, 0.243]], [0.202, [0.175, 0.175, 0.243]], [0.204, [0.178, 0.178, 0.248]], [0.205, [0.178, 0.178, 0.248]], [0.207, [0.182, 0.182, 0.253]], [0.209, [0.182, 0.182, 0.253]], [0.211, [0.185, 0.185, 0.258]], [0.213, [0.185, 0.185, 0.258]], [0.215, [0.189, 0.189, 0.263]], [0.217, [0.189, 0.189, 0.263]], [0.219, [0.192, 0.192, 0.267]], [0.221, [0.192, 0.192, 0.267]], [0.223, [0.196, 0.196, 0.272]], [0.225, [0.196, 0.196, 0.272]], [0.227, [0.199, 0.199, 0.277]], [0.229, [0.199, 0.199, 0.277]], [0.231, [0.202, 0.202, 0.282]], [0.233, [0.202, 0.202, 0.282]], [0.235, [0.206, 0.206, 0.286]], [0.237, [0.206, 0.206, 0.286]], [0.239, [0.209, 0.209, 0.291]], [0.241, [0.209, 0.209, 0.291]], [0.243, [0.213, 0.213, 0.296]], [0.245, [0.213, 0.213, 0.296]], [0.247, [0.216, 0.216, 0.301]], [0.249, [0.216, 0.216, 0.301]], [0.250, [0.220, 0.220, 0.306]], [0.252, [0.220, 0.220, 0.306]], [0.254, [0.223, 0.223, 0.310]], [0.256, [0.223, 0.223, 0.310]], [0.258, [0.226, 0.226, 0.315]], [0.260, [0.226, 0.226, 0.315]], [0.262, [0.230, 0.230, 0.320]], [0.264, [0.230, 0.230, 0.320]], [0.266, [0.233, 0.233, 0.325]], [0.268, [0.233, 0.233, 0.325]], [0.270, [0.237, 0.237, 0.329]], [0.272, [0.237, 0.237, 0.329]], [0.274, [0.240, 0.240, 0.334]], [0.276, [0.240, 0.240, 0.334]], [0.278, [0.244, 0.244, 0.339]], [0.280, [0.244, 0.244, 0.339]], [0.282, [0.247, 0.247, 0.344]], [0.284, [0.247, 0.247, 0.344]], [0.286, [0.250, 0.250, 0.349]], [0.288, [0.250, 0.250, 0.349]], [0.290, [0.254, 0.254, 0.353]], [0.292, [0.254, 0.254, 0.353]], [0.294, [0.257, 0.257, 0.358]], [0.295, [0.257, 0.257, 0.358]], [0.297, [0.261, 0.261, 0.363]], [0.299, [0.261, 0.261, 0.363]], [0.301, [0.264, 0.264, 0.368]], [0.303, [0.264, 0.264, 0.368]], [0.305, [0.268, 0.268, 0.372]], [0.307, [0.268, 0.268, 0.372]], [0.309, [0.271, 0.271, 0.377]], [0.311, [0.271, 0.271, 0.377]], [0.313, [0.275, 0.275, 0.382]], [0.315, [0.275, 0.275, 0.382]], [0.317, [0.278, 0.278, 0.387]], [0.319, [0.278, 0.278, 0.387]], [0.321, [0.281, 0.281, 0.391]], [0.323, [0.281, 0.281, 0.391]], [0.325, [0.285, 0.285, 0.396]], [0.327, [0.285, 0.285, 0.396]], [0.329, [0.288, 0.288, 0.401]], [0.331, [0.288, 0.288, 0.401]], [0.333, [0.292, 0.292, 0.406]], [0.335, [0.292, 0.292, 0.406]], [0.337, [0.295, 0.295, 0.411]], [0.339, [0.295, 0.295, 0.411]], [0.341, [0.299, 0.299, 0.415]], [0.342, [0.299, 0.299, 0.415]], [0.344, [0.302, 0.302, 0.420]], [0.346, [0.302, 0.302, 0.420]], [0.348, [0.305, 0.305, 0.425]], [0.350, [0.305, 0.305, 0.425]], [0.352, [0.309, 0.309, 0.430]], [0.354, [0.309, 0.309, 0.430]], [0.356, [0.312, 0.312, 0.434]], [0.358, [0.312, 0.312, 0.434]], [0.360, [0.316, 0.316, 0.439]], [0.362, [0.316, 0.316, 0.439]], [0.364, [0.319, 0.319, 0.444]], [0.366, [0.319, 0.319, 0.444]], [0.368, [0.323, 0.324, 0.448]], [0.370, [0.323, 0.324, 0.448]], [0.372, [0.326, 0.328, 0.451]], [0.374, [0.326, 0.328, 0.451]], [0.376, [0.329, 0.333, 0.454]], [0.378, [0.329, 0.333, 0.454]], [0.380, [0.333, 0.338, 0.458]], [0.382, [0.333, 0.338, 0.458]], [0.384, [0.336, 0.343, 0.461]], [0.386, [0.336, 0.343, 0.461]], [0.387, [0.340, 0.347, 0.465]], [0.389, [0.340, 0.347, 0.465]], [0.391, [0.343, 0.352, 0.468]], [0.393, [0.343, 0.352, 0.468]], [0.395, [0.347, 0.357, 0.472]], [0.397, [0.347, 0.357, 0.472]], [0.399, [0.350, 0.361, 0.475]], [0.401, [0.350, 0.361, 0.475]], [0.403, [0.353, 0.366, 0.478]], [0.405, [0.353, 0.366, 0.478]], [0.407, [0.357, 0.371, 0.482]], [0.409, [0.357, 0.371, 0.482]], [0.411, [0.360, 0.376, 0.485]], [0.413, [0.360, 0.376, 0.485]], [0.415, [0.364, 0.380, 0.489]], [0.417, [0.364, 0.380, 0.489]], [0.419, [0.367, 0.385, 0.492]], [0.421, [0.367, 0.385, 0.492]], [0.423, [0.371, 0.390, 0.496]], [0.425, [0.371, 0.390, 0.496]], [0.427, [0.374, 0.394, 0.499]], [0.429, [0.374, 0.394, 0.499]], [0.431, [0.377, 0.399, 0.502]], [0.432, [0.377, 0.399, 0.502]], [0.434, [0.381, 0.404, 0.506]], [0.436, [0.381, 0.404, 0.506]], [0.438, [0.384, 0.409, 0.509]], [0.440, [0.384, 0.409, 0.509]], [0.442, [0.388, 0.413, 0.513]], [0.444, [0.388, 0.413, 0.513]], [0.446, [0.391, 0.418, 0.516]], [0.448, [0.391, 0.418, 0.516]], [0.450, [0.395, 0.423, 0.520]], [0.452, [0.395, 0.423, 0.520]], [0.454, [0.398, 0.428, 0.523]], [0.456, [0.398, 0.428, 0.523]], [0.458, [0.401, 0.432, 0.526]], [0.460, [0.401, 0.432, 0.526]], [0.462, [0.405, 0.437, 0.530]], [0.464, [0.405, 0.437, 0.530]], [0.466, [0.408, 0.442, 0.533]], [0.468, [0.408, 0.442, 0.533]], [0.470, [0.412, 0.446, 0.537]], [0.472, [0.412, 0.446, 0.537]], [0.474, [0.415, 0.451, 0.540]], [0.476, [0.415, 0.451, 0.540]], [0.477, [0.419, 0.456, 0.544]], [0.479, [0.419, 0.456, 0.544]], [0.481, [0.422, 0.461, 0.547]], [0.483, [0.422, 0.461, 0.547]], [0.485, [0.425, 0.465, 0.550]], [0.487, [0.425, 0.465, 0.550]], [0.489, [0.429, 0.470, 0.554]], [0.491, [0.429, 0.470, 0.554]], [0.493, [0.432, 0.475, 0.557]], [0.495, [0.432, 0.475, 0.557]], [0.497, [0.436, 0.479, 0.561]], [0.499, [0.436, 0.479, 0.561]], [0.501, [0.439, 0.484, 0.564]], [0.503, [0.439, 0.484, 0.564]], [0.505, [0.443, 0.489, 0.568]], [0.507, [0.443, 0.489, 0.568]], [0.509, [0.446, 0.494, 0.571]], [0.511, [0.446, 0.494, 0.571]], [0.513, [0.450, 0.498, 0.575]], [0.515, [0.450, 0.498, 0.575]], [0.517, [0.453, 0.503, 0.578]], [0.519, [0.453, 0.503, 0.578]], [0.521, [0.456, 0.508, 0.581]], [0.523, [0.456, 0.508, 0.581]], [0.524, [0.460, 0.512, 0.585]], [0.526, [0.460, 0.512, 0.585]], [0.528, [0.463, 0.517, 0.588]], [0.530, [0.463, 0.517, 0.588]], [0.532, [0.467, 0.522, 0.592]], [0.534, [0.467, 0.522, 0.592]], [0.536, [0.470, 0.527, 0.595]], [0.538, [0.470, 0.527, 0.595]], [0.540, [0.474, 0.531, 0.599]], [0.542, [0.474, 0.531, 0.599]], [0.544, [0.477, 0.536, 0.602]], [0.546, [0.477, 0.536, 0.602]], [0.548, [0.480, 0.541, 0.605]], [0.550, [0.480, 0.541, 0.605]], [0.552, [0.484, 0.545, 0.609]], [0.554, [0.484, 0.545, 0.609]], [0.556, [0.487, 0.550, 0.612]], [0.558, [0.487, 0.550, 0.612]], [0.560, [0.491, 0.555, 0.616]], [0.562, [0.491, 0.555, 0.616]], [0.564, [0.494, 0.560, 0.619]], [0.566, [0.494, 0.560, 0.619]], [0.568, [0.498, 0.564, 0.623]], [0.569, [0.498, 0.564, 0.623]], [0.571, [0.501, 0.569, 0.626]], [0.573, [0.501, 0.569, 0.626]], [0.575, [0.504, 0.574, 0.629]], [0.577, [0.504, 0.574, 0.629]], [0.579, [0.508, 0.578, 0.633]], [0.581, [0.508, 0.578, 0.633]], [0.583, [0.511, 0.583, 0.636]], [0.585, [0.511, 0.583, 0.636]], [0.587, [0.515, 0.588, 0.640]], [0.589, [0.515, 0.588, 0.640]], [0.591, [0.518, 0.593, 0.643]], [0.593, [0.518, 0.593, 0.643]], [0.595, [0.522, 0.597, 0.647]], [0.597, [0.522, 0.597, 0.647]], [0.599, [0.525, 0.602, 0.650]], [0.601, [0.525, 0.602, 0.650]], [0.603, [0.528, 0.607, 0.653]], [0.605, [0.528, 0.607, 0.653]], [0.607, [0.532, 0.612, 0.657]], [0.609, [0.532, 0.612, 0.657]], [0.611, [0.535, 0.616, 0.660]], [0.613, [0.535, 0.616, 0.660]], [0.614, [0.539, 0.621, 0.664]], [0.616, [0.539, 0.621, 0.664]], [0.618, [0.542, 0.626, 0.667]], [0.620, [0.542, 0.626, 0.667]], [0.622, [0.546, 0.630, 0.671]], [0.624, [0.546, 0.630, 0.671]], [0.626, [0.549, 0.635, 0.674]], [0.628, [0.549, 0.635, 0.674]], [0.630, [0.552, 0.640, 0.677]], [0.632, [0.552, 0.640, 0.677]], [0.634, [0.556, 0.645, 0.681]], [0.636, [0.556, 0.645, 0.681]], [0.638, [0.559, 0.649, 0.684]], [0.640, [0.559, 0.649, 0.684]], [0.642, [0.563, 0.654, 0.688]], [0.644, [0.563, 0.654, 0.688]], [0.646, [0.566, 0.659, 0.691]], [0.648, [0.566, 0.659, 0.691]], [0.650, [0.570, 0.663, 0.695]], [0.652, [0.570, 0.663, 0.695]], [0.654, [0.573, 0.668, 0.698]], [0.656, [0.573, 0.668, 0.698]], [0.658, [0.576, 0.673, 0.701]], [0.659, [0.576, 0.673, 0.701]], [0.661, [0.580, 0.678, 0.705]], [0.663, [0.580, 0.678, 0.705]], [0.665, [0.583, 0.682, 0.708]], [0.667, [0.583, 0.682, 0.708]], [0.669, [0.587, 0.687, 0.712]], [0.671, [0.587, 0.687, 0.712]], [0.673, [0.590, 0.692, 0.715]], [0.675, [0.590, 0.692, 0.715]], [0.677, [0.594, 0.696, 0.719]], [0.679, [0.594, 0.696, 0.719]], [0.681, [0.597, 0.701, 0.722]], [0.683, [0.597, 0.701, 0.722]], [0.685, [0.600, 0.706, 0.725]], [0.687, [0.600, 0.706, 0.725]], [0.689, [0.604, 0.711, 0.729]], [0.691, [0.604, 0.711, 0.729]], [0.693, [0.607, 0.715, 0.732]], [0.695, [0.607, 0.715, 0.732]], [0.697, [0.611, 0.720, 0.736]], [0.699, [0.611, 0.720, 0.736]], [0.701, [0.614, 0.725, 0.739]], [0.703, [0.614, 0.725, 0.739]], [0.705, [0.618, 0.729, 0.743]], [0.706, [0.618, 0.729, 0.743]], [0.708, [0.621, 0.734, 0.746]], [0.710, [0.621, 0.734, 0.746]], [0.712, [0.625, 0.739, 0.750]], [0.714, [0.625, 0.739, 0.750]], [0.716, [0.628, 0.744, 0.753]], [0.718, [0.628, 0.744, 0.753]], [0.720, [0.631, 0.748, 0.756]], [0.722, [0.631, 0.748, 0.756]], [0.724, [0.635, 0.753, 0.760]], [0.726, [0.635, 0.753, 0.760]], [0.728, [0.638, 0.758, 0.763]], [0.730, [0.638, 0.758, 0.763]], [0.732, [0.642, 0.762, 0.767]], [0.734, [0.642, 0.762, 0.767]], [0.736, [0.645, 0.767, 0.770]], [0.738, [0.645, 0.767, 0.770]], [0.740, [0.649, 0.772, 0.774]], [0.742, [0.649, 0.772, 0.774]], [0.744, [0.652, 0.777, 0.777]], [0.746, [0.652, 0.777, 0.777]], [0.748, [0.657, 0.780, 0.780]], [0.750, [0.657, 0.780, 0.780]], [0.751, [0.662, 0.784, 0.784]], [0.753, [0.662, 0.784, 0.784]], [0.755, [0.668, 0.787, 0.787]], [0.757, [0.668, 0.787, 0.787]], [0.759, [0.673, 0.791, 0.791]], [0.761, [0.673, 0.791, 0.791]], [0.763, [0.678, 0.794, 0.794]], [0.765, [0.678, 0.794, 0.794]], [0.767, [0.684, 0.798, 0.798]], [0.769, [0.684, 0.798, 0.798]], [0.771, [0.689, 0.801, 0.801]], [0.773, [0.689, 0.801, 0.801]], [0.775, [0.694, 0.804, 0.804]], [0.777, [0.694, 0.804, 0.804]], [0.779, [0.700, 0.808, 0.808]], [0.781, [0.700, 0.808, 0.808]], [0.783, [0.705, 0.811, 0.811]], [0.785, [0.705, 0.811, 0.811]], [0.787, [0.710, 0.815, 0.815]], [0.789, [0.710, 0.815, 0.815]], [0.791, [0.716, 0.818, 0.818]], [0.793, [0.716, 0.818, 0.818]], [0.795, [0.721, 0.822, 0.822]], [0.796, [0.721, 0.822, 0.822]], [0.798, [0.727, 0.825, 0.825]], [0.800, [0.727, 0.825, 0.825]], [0.802, [0.732, 0.828, 0.828]], [0.804, [0.732, 0.828, 0.828]], [0.806, [0.737, 0.832, 0.832]], [0.808, [0.737, 0.832, 0.832]], [0.810, [0.743, 0.835, 0.835]], [0.812, [0.743, 0.835, 0.835]], [0.814, [0.748, 0.839, 0.839]], [0.816, [0.748, 0.839, 0.839]], [0.818, [0.753, 0.842, 0.842]], [0.820, [0.753, 0.842, 0.842]], [0.822, [0.759, 0.846, 0.846]], [0.824, [0.759, 0.846, 0.846]], [0.826, [0.764, 0.849, 0.849]], [0.828, [0.764, 0.849, 0.849]], [0.830, [0.769, 0.852, 0.852]], [0.832, [0.769, 0.852, 0.852]], [0.834, [0.775, 0.856, 0.856]], [0.836, [0.775, 0.856, 0.856]], [0.838, [0.780, 0.859, 0.859]], [0.840, [0.780, 0.859, 0.859]], [0.841, [0.786, 0.863, 0.863]], [0.843, [0.786, 0.863, 0.863]], [0.845, [0.791, 0.866, 0.866]], [0.847, [0.791, 0.866, 0.866]], [0.849, [0.796, 0.870, 0.870]], [0.851, [0.796, 0.870, 0.870]], [0.853, [0.802, 0.873, 0.873]], [0.855, [0.802, 0.873, 0.873]], [0.857, [0.807, 0.876, 0.876]], [0.859, [0.807, 0.876, 0.876]], [0.861, [0.812, 0.880, 0.880]], [0.863, [0.812, 0.880, 0.880]], [0.865, [0.818, 0.883, 0.883]], [0.867, [0.818, 0.883, 0.883]], [0.869, [0.823, 0.887, 0.887]], [0.871, [0.823, 0.887, 0.887]], [0.873, [0.828, 0.890, 0.890]], [0.875, [0.828, 0.890, 0.890]], [0.877, [0.834, 0.894, 0.894]], [0.879, [0.834, 0.894, 0.894]], [0.881, [0.839, 0.897, 0.897]], [0.883, [0.839, 0.897, 0.897]], [0.885, [0.845, 0.900, 0.900]], [0.886, [0.845, 0.900, 0.900]], [0.888, [0.850, 0.904, 0.904]], [0.890, [0.850, 0.904, 0.904]], [0.892, [0.855, 0.907, 0.907]], [0.894, [0.855, 0.907, 0.907]], [0.896, [0.861, 0.911, 0.911]], [0.898, [0.861, 0.911, 0.911]], [0.900, [0.866, 0.914, 0.914]], [0.902, [0.866, 0.914, 0.914]], [0.904, [0.871, 0.918, 0.918]], [0.906, [0.871, 0.918, 0.918]], [0.908, [0.877, 0.921, 0.921]], [0.910, [0.877, 0.921, 0.921]], [0.912, [0.882, 0.925, 0.925]], [0.914, [0.882, 0.925, 0.925]], [0.916, [0.887, 0.928, 0.928]], [0.918, [0.887, 0.928, 0.928]], [0.920, [0.893, 0.931, 0.931]], [0.922, [0.893, 0.931, 0.931]], [0.924, [0.898, 0.935, 0.935]], [0.926, [0.898, 0.935, 0.935]], [0.928, [0.903, 0.938, 0.938]], [0.930, [0.903, 0.938, 0.938]], [0.932, [0.909, 0.942, 0.942]], [0.933, [0.909, 0.942, 0.942]], [0.935, [0.914, 0.945, 0.945]], [0.937, [0.914, 0.945, 0.945]], [0.939, [0.920, 0.949, 0.949]], [0.941, [0.920, 0.949, 0.949]], [0.943, [0.925, 0.952, 0.952]], [0.945, [0.925, 0.952, 0.952]], [0.947, [0.930, 0.955, 0.955]], [0.949, [0.930, 0.955, 0.955]], [0.951, [0.936, 0.959, 0.959]], [0.953, [0.936, 0.959, 0.959]], [0.955, [0.941, 0.962, 0.962]], [0.957, [0.941, 0.962, 0.962]], [0.959, [0.946, 0.966, 0.966]], [0.961, [0.946, 0.966, 0.966]], [0.963, [0.952, 0.969, 0.969]], [0.965, [0.952, 0.969, 0.969]], [0.967, [0.957, 0.973, 0.973]], [0.969, [0.957, 0.973, 0.973]], [0.971, [0.962, 0.976, 0.976]], [0.973, [0.962, 0.976, 0.976]], [0.975, [0.968, 0.979, 0.979]], [0.977, [0.968, 0.979, 0.979]], [0.978, [0.973, 0.983, 0.983]], [0.980, [0.973, 0.983, 0.983]], [0.982, [0.979, 0.986, 0.986]], [0.984, [0.979, 0.986, 0.986]], [0.986, [0.984, 0.990, 0.990]], [0.988, [0.984, 0.990, 0.990]], [0.990, [0.989, 0.993, 0.993]], [0.992, [0.989, 0.993, 0.993]], [0.994, [0.995, 0.997, 0.997]], [0.996, [0.995, 0.997, 0.997]], [0.998, [1.000, 1.000, 1.000]], [1.000, [1.000, 1.000, 1.000]]]; +var cool = [[0.000, [0.000, 1.000, 1.000]], [0.002, [0.000, 1.000, 1.000]], [0.004, [0.004, 0.996, 1.000]], [0.006, [0.004, 0.996, 1.000]], [0.008, [0.008, 0.992, 1.000]], [0.010, [0.008, 0.992, 1.000]], [0.012, [0.012, 0.988, 1.000]], [0.014, [0.012, 0.988, 1.000]], [0.016, [0.016, 0.984, 1.000]], [0.018, [0.016, 0.984, 1.000]], [0.020, [0.020, 0.980, 1.000]], [0.022, [0.020, 0.980, 1.000]], [0.023, [0.024, 0.976, 1.000]], [0.025, [0.024, 0.976, 1.000]], [0.027, [0.027, 0.973, 1.000]], [0.029, [0.027, 0.973, 1.000]], [0.031, [0.031, 0.969, 1.000]], [0.033, [0.031, 0.969, 1.000]], [0.035, [0.035, 0.965, 1.000]], [0.037, [0.035, 0.965, 1.000]], [0.039, [0.039, 0.961, 1.000]], [0.041, [0.039, 0.961, 1.000]], [0.043, [0.043, 0.957, 1.000]], [0.045, [0.043, 0.957, 1.000]], [0.047, [0.047, 0.953, 1.000]], [0.049, [0.047, 0.953, 1.000]], [0.051, [0.051, 0.949, 1.000]], [0.053, [0.051, 0.949, 1.000]], [0.055, [0.055, 0.945, 1.000]], [0.057, [0.055, 0.945, 1.000]], [0.059, [0.059, 0.941, 1.000]], [0.061, [0.059, 0.941, 1.000]], [0.063, [0.063, 0.937, 1.000]], [0.065, [0.063, 0.937, 1.000]], [0.067, [0.067, 0.933, 1.000]], [0.068, [0.067, 0.933, 1.000]], [0.070, [0.071, 0.929, 1.000]], [0.072, [0.071, 0.929, 1.000]], [0.074, [0.075, 0.925, 1.000]], [0.076, [0.075, 0.925, 1.000]], [0.078, [0.078, 0.922, 1.000]], [0.080, [0.078, 0.922, 1.000]], [0.082, [0.082, 0.918, 1.000]], [0.084, [0.082, 0.918, 1.000]], [0.086, [0.086, 0.914, 1.000]], [0.088, [0.086, 0.914, 1.000]], [0.090, [0.090, 0.910, 1.000]], [0.092, [0.090, 0.910, 1.000]], [0.094, [0.094, 0.906, 1.000]], [0.096, [0.094, 0.906, 1.000]], [0.098, [0.098, 0.902, 1.000]], [0.100, [0.098, 0.902, 1.000]], [0.102, [0.102, 0.898, 1.000]], [0.104, [0.102, 0.898, 1.000]], [0.106, [0.106, 0.894, 1.000]], [0.108, [0.106, 0.894, 1.000]], [0.110, [0.110, 0.890, 1.000]], [0.112, [0.110, 0.890, 1.000]], [0.114, [0.114, 0.886, 1.000]], [0.115, [0.114, 0.886, 1.000]], [0.117, [0.118, 0.882, 1.000]], [0.119, [0.118, 0.882, 1.000]], [0.121, [0.122, 0.878, 1.000]], [0.123, [0.122, 0.878, 1.000]], [0.125, [0.125, 0.875, 1.000]], [0.127, [0.125, 0.875, 1.000]], [0.129, [0.129, 0.871, 1.000]], [0.131, [0.129, 0.871, 1.000]], [0.133, [0.133, 0.867, 1.000]], [0.135, [0.133, 0.867, 1.000]], [0.137, [0.137, 0.863, 1.000]], [0.139, [0.137, 0.863, 1.000]], [0.141, [0.141, 0.859, 1.000]], [0.143, [0.141, 0.859, 1.000]], [0.145, [0.145, 0.855, 1.000]], [0.147, [0.145, 0.855, 1.000]], [0.149, [0.149, 0.851, 1.000]], [0.151, [0.149, 0.851, 1.000]], [0.153, [0.153, 0.847, 1.000]], [0.155, [0.153, 0.847, 1.000]], [0.157, [0.157, 0.843, 1.000]], [0.159, [0.157, 0.843, 1.000]], [0.160, [0.161, 0.839, 1.000]], [0.162, [0.161, 0.839, 1.000]], [0.164, [0.165, 0.835, 1.000]], [0.166, [0.165, 0.835, 1.000]], [0.168, [0.169, 0.831, 1.000]], [0.170, [0.169, 0.831, 1.000]], [0.172, [0.173, 0.827, 1.000]], [0.174, [0.173, 0.827, 1.000]], [0.176, [0.176, 0.824, 1.000]], [0.178, [0.176, 0.824, 1.000]], [0.180, [0.180, 0.820, 1.000]], [0.182, [0.180, 0.820, 1.000]], [0.184, [0.184, 0.816, 1.000]], [0.186, [0.184, 0.816, 1.000]], [0.188, [0.188, 0.812, 1.000]], [0.190, [0.188, 0.812, 1.000]], [0.192, [0.192, 0.808, 1.000]], [0.194, [0.192, 0.808, 1.000]], [0.196, [0.196, 0.804, 1.000]], [0.198, [0.196, 0.804, 1.000]], [0.200, [0.200, 0.800, 1.000]], [0.202, [0.200, 0.800, 1.000]], [0.204, [0.204, 0.796, 1.000]], [0.205, [0.204, 0.796, 1.000]], [0.207, [0.208, 0.792, 1.000]], [0.209, [0.208, 0.792, 1.000]], [0.211, [0.212, 0.788, 1.000]], [0.213, [0.212, 0.788, 1.000]], [0.215, [0.216, 0.784, 1.000]], [0.217, [0.216, 0.784, 1.000]], [0.219, [0.220, 0.780, 1.000]], [0.221, [0.220, 0.780, 1.000]], [0.223, [0.224, 0.776, 1.000]], [0.225, [0.224, 0.776, 1.000]], [0.227, [0.227, 0.773, 1.000]], [0.229, [0.227, 0.773, 1.000]], [0.231, [0.231, 0.769, 1.000]], [0.233, [0.231, 0.769, 1.000]], [0.235, [0.235, 0.765, 1.000]], [0.237, [0.235, 0.765, 1.000]], [0.239, [0.239, 0.761, 1.000]], [0.241, [0.239, 0.761, 1.000]], [0.243, [0.243, 0.757, 1.000]], [0.245, [0.243, 0.757, 1.000]], [0.247, [0.247, 0.753, 1.000]], [0.249, [0.247, 0.753, 1.000]], [0.250, [0.251, 0.749, 1.000]], [0.252, [0.251, 0.749, 1.000]], [0.254, [0.255, 0.745, 1.000]], [0.256, [0.255, 0.745, 1.000]], [0.258, [0.259, 0.741, 1.000]], [0.260, [0.259, 0.741, 1.000]], [0.262, [0.263, 0.737, 1.000]], [0.264, [0.263, 0.737, 1.000]], [0.266, [0.267, 0.733, 1.000]], [0.268, [0.267, 0.733, 1.000]], [0.270, [0.271, 0.729, 1.000]], [0.272, [0.271, 0.729, 1.000]], [0.274, [0.275, 0.725, 1.000]], [0.276, [0.275, 0.725, 1.000]], [0.278, [0.278, 0.722, 1.000]], [0.280, [0.278, 0.722, 1.000]], [0.282, [0.282, 0.718, 1.000]], [0.284, [0.282, 0.718, 1.000]], [0.286, [0.286, 0.714, 1.000]], [0.288, [0.286, 0.714, 1.000]], [0.290, [0.290, 0.710, 1.000]], [0.292, [0.290, 0.710, 1.000]], [0.294, [0.294, 0.706, 1.000]], [0.295, [0.294, 0.706, 1.000]], [0.297, [0.298, 0.702, 1.000]], [0.299, [0.298, 0.702, 1.000]], [0.301, [0.302, 0.698, 1.000]], [0.303, [0.302, 0.698, 1.000]], [0.305, [0.306, 0.694, 1.000]], [0.307, [0.306, 0.694, 1.000]], [0.309, [0.310, 0.690, 1.000]], [0.311, [0.310, 0.690, 1.000]], [0.313, [0.314, 0.686, 1.000]], [0.315, [0.314, 0.686, 1.000]], [0.317, [0.318, 0.682, 1.000]], [0.319, [0.318, 0.682, 1.000]], [0.321, [0.322, 0.678, 1.000]], [0.323, [0.322, 0.678, 1.000]], [0.325, [0.325, 0.675, 1.000]], [0.327, [0.325, 0.675, 1.000]], [0.329, [0.329, 0.671, 1.000]], [0.331, [0.329, 0.671, 1.000]], [0.333, [0.333, 0.667, 1.000]], [0.335, [0.333, 0.667, 1.000]], [0.337, [0.337, 0.663, 1.000]], [0.339, [0.337, 0.663, 1.000]], [0.341, [0.341, 0.659, 1.000]], [0.342, [0.341, 0.659, 1.000]], [0.344, [0.345, 0.655, 1.000]], [0.346, [0.345, 0.655, 1.000]], [0.348, [0.349, 0.651, 1.000]], [0.350, [0.349, 0.651, 1.000]], [0.352, [0.353, 0.647, 1.000]], [0.354, [0.353, 0.647, 1.000]], [0.356, [0.357, 0.643, 1.000]], [0.358, [0.357, 0.643, 1.000]], [0.360, [0.361, 0.639, 1.000]], [0.362, [0.361, 0.639, 1.000]], [0.364, [0.365, 0.635, 1.000]], [0.366, [0.365, 0.635, 1.000]], [0.368, [0.369, 0.631, 1.000]], [0.370, [0.369, 0.631, 1.000]], [0.372, [0.373, 0.627, 1.000]], [0.374, [0.373, 0.627, 1.000]], [0.376, [0.376, 0.624, 1.000]], [0.378, [0.376, 0.624, 1.000]], [0.380, [0.380, 0.620, 1.000]], [0.382, [0.380, 0.620, 1.000]], [0.384, [0.384, 0.616, 1.000]], [0.386, [0.384, 0.616, 1.000]], [0.387, [0.388, 0.612, 1.000]], [0.389, [0.388, 0.612, 1.000]], [0.391, [0.392, 0.608, 1.000]], [0.393, [0.392, 0.608, 1.000]], [0.395, [0.396, 0.604, 1.000]], [0.397, [0.396, 0.604, 1.000]], [0.399, [0.400, 0.600, 1.000]], [0.401, [0.400, 0.600, 1.000]], [0.403, [0.404, 0.596, 1.000]], [0.405, [0.404, 0.596, 1.000]], [0.407, [0.408, 0.592, 1.000]], [0.409, [0.408, 0.592, 1.000]], [0.411, [0.412, 0.588, 1.000]], [0.413, [0.412, 0.588, 1.000]], [0.415, [0.416, 0.584, 1.000]], [0.417, [0.416, 0.584, 1.000]], [0.419, [0.420, 0.580, 1.000]], [0.421, [0.420, 0.580, 1.000]], [0.423, [0.424, 0.576, 1.000]], [0.425, [0.424, 0.576, 1.000]], [0.427, [0.427, 0.573, 1.000]], [0.429, [0.427, 0.573, 1.000]], [0.431, [0.431, 0.569, 1.000]], [0.432, [0.431, 0.569, 1.000]], [0.434, [0.435, 0.565, 1.000]], [0.436, [0.435, 0.565, 1.000]], [0.438, [0.439, 0.561, 1.000]], [0.440, [0.439, 0.561, 1.000]], [0.442, [0.443, 0.557, 1.000]], [0.444, [0.443, 0.557, 1.000]], [0.446, [0.447, 0.553, 1.000]], [0.448, [0.447, 0.553, 1.000]], [0.450, [0.451, 0.549, 1.000]], [0.452, [0.451, 0.549, 1.000]], [0.454, [0.455, 0.545, 1.000]], [0.456, [0.455, 0.545, 1.000]], [0.458, [0.459, 0.541, 1.000]], [0.460, [0.459, 0.541, 1.000]], [0.462, [0.463, 0.537, 1.000]], [0.464, [0.463, 0.537, 1.000]], [0.466, [0.467, 0.533, 1.000]], [0.468, [0.467, 0.533, 1.000]], [0.470, [0.471, 0.529, 1.000]], [0.472, [0.471, 0.529, 1.000]], [0.474, [0.475, 0.525, 1.000]], [0.476, [0.475, 0.525, 1.000]], [0.477, [0.478, 0.522, 1.000]], [0.479, [0.478, 0.522, 1.000]], [0.481, [0.482, 0.518, 1.000]], [0.483, [0.482, 0.518, 1.000]], [0.485, [0.486, 0.514, 1.000]], [0.487, [0.486, 0.514, 1.000]], [0.489, [0.490, 0.510, 1.000]], [0.491, [0.490, 0.510, 1.000]], [0.493, [0.494, 0.506, 1.000]], [0.495, [0.494, 0.506, 1.000]], [0.497, [0.498, 0.502, 1.000]], [0.499, [0.498, 0.502, 1.000]], [0.501, [0.502, 0.498, 1.000]], [0.503, [0.502, 0.498, 1.000]], [0.505, [0.506, 0.494, 1.000]], [0.507, [0.506, 0.494, 1.000]], [0.509, [0.510, 0.490, 1.000]], [0.511, [0.510, 0.490, 1.000]], [0.513, [0.514, 0.486, 1.000]], [0.515, [0.514, 0.486, 1.000]], [0.517, [0.518, 0.482, 1.000]], [0.519, [0.518, 0.482, 1.000]], [0.521, [0.522, 0.478, 1.000]], [0.523, [0.522, 0.478, 1.000]], [0.524, [0.525, 0.475, 1.000]], [0.526, [0.525, 0.475, 1.000]], [0.528, [0.529, 0.471, 1.000]], [0.530, [0.529, 0.471, 1.000]], [0.532, [0.533, 0.467, 1.000]], [0.534, [0.533, 0.467, 1.000]], [0.536, [0.537, 0.463, 1.000]], [0.538, [0.537, 0.463, 1.000]], [0.540, [0.541, 0.459, 1.000]], [0.542, [0.541, 0.459, 1.000]], [0.544, [0.545, 0.455, 1.000]], [0.546, [0.545, 0.455, 1.000]], [0.548, [0.549, 0.451, 1.000]], [0.550, [0.549, 0.451, 1.000]], [0.552, [0.553, 0.447, 1.000]], [0.554, [0.553, 0.447, 1.000]], [0.556, [0.557, 0.443, 1.000]], [0.558, [0.557, 0.443, 1.000]], [0.560, [0.561, 0.439, 1.000]], [0.562, [0.561, 0.439, 1.000]], [0.564, [0.565, 0.435, 1.000]], [0.566, [0.565, 0.435, 1.000]], [0.568, [0.569, 0.431, 1.000]], [0.569, [0.569, 0.431, 1.000]], [0.571, [0.573, 0.427, 1.000]], [0.573, [0.573, 0.427, 1.000]], [0.575, [0.576, 0.424, 1.000]], [0.577, [0.576, 0.424, 1.000]], [0.579, [0.580, 0.420, 1.000]], [0.581, [0.580, 0.420, 1.000]], [0.583, [0.584, 0.416, 1.000]], [0.585, [0.584, 0.416, 1.000]], [0.587, [0.588, 0.412, 1.000]], [0.589, [0.588, 0.412, 1.000]], [0.591, [0.592, 0.408, 1.000]], [0.593, [0.592, 0.408, 1.000]], [0.595, [0.596, 0.404, 1.000]], [0.597, [0.596, 0.404, 1.000]], [0.599, [0.600, 0.400, 1.000]], [0.601, [0.600, 0.400, 1.000]], [0.603, [0.604, 0.396, 1.000]], [0.605, [0.604, 0.396, 1.000]], [0.607, [0.608, 0.392, 1.000]], [0.609, [0.608, 0.392, 1.000]], [0.611, [0.612, 0.388, 1.000]], [0.613, [0.612, 0.388, 1.000]], [0.614, [0.616, 0.384, 1.000]], [0.616, [0.616, 0.384, 1.000]], [0.618, [0.620, 0.380, 1.000]], [0.620, [0.620, 0.380, 1.000]], [0.622, [0.624, 0.376, 1.000]], [0.624, [0.624, 0.376, 1.000]], [0.626, [0.627, 0.373, 1.000]], [0.628, [0.627, 0.373, 1.000]], [0.630, [0.631, 0.369, 1.000]], [0.632, [0.631, 0.369, 1.000]], [0.634, [0.635, 0.365, 1.000]], [0.636, [0.635, 0.365, 1.000]], [0.638, [0.639, 0.361, 1.000]], [0.640, [0.639, 0.361, 1.000]], [0.642, [0.643, 0.357, 1.000]], [0.644, [0.643, 0.357, 1.000]], [0.646, [0.647, 0.353, 1.000]], [0.648, [0.647, 0.353, 1.000]], [0.650, [0.651, 0.349, 1.000]], [0.652, [0.651, 0.349, 1.000]], [0.654, [0.655, 0.345, 1.000]], [0.656, [0.655, 0.345, 1.000]], [0.658, [0.659, 0.341, 1.000]], [0.659, [0.659, 0.341, 1.000]], [0.661, [0.663, 0.337, 1.000]], [0.663, [0.663, 0.337, 1.000]], [0.665, [0.667, 0.333, 1.000]], [0.667, [0.667, 0.333, 1.000]], [0.669, [0.671, 0.329, 1.000]], [0.671, [0.671, 0.329, 1.000]], [0.673, [0.675, 0.325, 1.000]], [0.675, [0.675, 0.325, 1.000]], [0.677, [0.678, 0.322, 1.000]], [0.679, [0.678, 0.322, 1.000]], [0.681, [0.682, 0.318, 1.000]], [0.683, [0.682, 0.318, 1.000]], [0.685, [0.686, 0.314, 1.000]], [0.687, [0.686, 0.314, 1.000]], [0.689, [0.690, 0.310, 1.000]], [0.691, [0.690, 0.310, 1.000]], [0.693, [0.694, 0.306, 1.000]], [0.695, [0.694, 0.306, 1.000]], [0.697, [0.698, 0.302, 1.000]], [0.699, [0.698, 0.302, 1.000]], [0.701, [0.702, 0.298, 1.000]], [0.703, [0.702, 0.298, 1.000]], [0.705, [0.706, 0.294, 1.000]], [0.706, [0.706, 0.294, 1.000]], [0.708, [0.710, 0.290, 1.000]], [0.710, [0.710, 0.290, 1.000]], [0.712, [0.714, 0.286, 1.000]], [0.714, [0.714, 0.286, 1.000]], [0.716, [0.718, 0.282, 1.000]], [0.718, [0.718, 0.282, 1.000]], [0.720, [0.722, 0.278, 1.000]], [0.722, [0.722, 0.278, 1.000]], [0.724, [0.725, 0.275, 1.000]], [0.726, [0.725, 0.275, 1.000]], [0.728, [0.729, 0.271, 1.000]], [0.730, [0.729, 0.271, 1.000]], [0.732, [0.733, 0.267, 1.000]], [0.734, [0.733, 0.267, 1.000]], [0.736, [0.737, 0.263, 1.000]], [0.738, [0.737, 0.263, 1.000]], [0.740, [0.741, 0.259, 1.000]], [0.742, [0.741, 0.259, 1.000]], [0.744, [0.745, 0.255, 1.000]], [0.746, [0.745, 0.255, 1.000]], [0.748, [0.749, 0.251, 1.000]], [0.750, [0.749, 0.251, 1.000]], [0.751, [0.753, 0.247, 1.000]], [0.753, [0.753, 0.247, 1.000]], [0.755, [0.757, 0.243, 1.000]], [0.757, [0.757, 0.243, 1.000]], [0.759, [0.761, 0.239, 1.000]], [0.761, [0.761, 0.239, 1.000]], [0.763, [0.765, 0.235, 1.000]], [0.765, [0.765, 0.235, 1.000]], [0.767, [0.769, 0.231, 1.000]], [0.769, [0.769, 0.231, 1.000]], [0.771, [0.773, 0.227, 1.000]], [0.773, [0.773, 0.227, 1.000]], [0.775, [0.776, 0.224, 1.000]], [0.777, [0.776, 0.224, 1.000]], [0.779, [0.780, 0.220, 1.000]], [0.781, [0.780, 0.220, 1.000]], [0.783, [0.784, 0.216, 1.000]], [0.785, [0.784, 0.216, 1.000]], [0.787, [0.788, 0.212, 1.000]], [0.789, [0.788, 0.212, 1.000]], [0.791, [0.792, 0.208, 1.000]], [0.793, [0.792, 0.208, 1.000]], [0.795, [0.796, 0.204, 1.000]], [0.796, [0.796, 0.204, 1.000]], [0.798, [0.800, 0.200, 1.000]], [0.800, [0.800, 0.200, 1.000]], [0.802, [0.804, 0.196, 1.000]], [0.804, [0.804, 0.196, 1.000]], [0.806, [0.808, 0.192, 1.000]], [0.808, [0.808, 0.192, 1.000]], [0.810, [0.812, 0.188, 1.000]], [0.812, [0.812, 0.188, 1.000]], [0.814, [0.816, 0.184, 1.000]], [0.816, [0.816, 0.184, 1.000]], [0.818, [0.820, 0.180, 1.000]], [0.820, [0.820, 0.180, 1.000]], [0.822, [0.824, 0.176, 1.000]], [0.824, [0.824, 0.176, 1.000]], [0.826, [0.827, 0.173, 1.000]], [0.828, [0.827, 0.173, 1.000]], [0.830, [0.831, 0.169, 1.000]], [0.832, [0.831, 0.169, 1.000]], [0.834, [0.835, 0.165, 1.000]], [0.836, [0.835, 0.165, 1.000]], [0.838, [0.839, 0.161, 1.000]], [0.840, [0.839, 0.161, 1.000]], [0.841, [0.843, 0.157, 1.000]], [0.843, [0.843, 0.157, 1.000]], [0.845, [0.847, 0.153, 1.000]], [0.847, [0.847, 0.153, 1.000]], [0.849, [0.851, 0.149, 1.000]], [0.851, [0.851, 0.149, 1.000]], [0.853, [0.855, 0.145, 1.000]], [0.855, [0.855, 0.145, 1.000]], [0.857, [0.859, 0.141, 1.000]], [0.859, [0.859, 0.141, 1.000]], [0.861, [0.863, 0.137, 1.000]], [0.863, [0.863, 0.137, 1.000]], [0.865, [0.867, 0.133, 1.000]], [0.867, [0.867, 0.133, 1.000]], [0.869, [0.871, 0.129, 1.000]], [0.871, [0.871, 0.129, 1.000]], [0.873, [0.875, 0.125, 1.000]], [0.875, [0.875, 0.125, 1.000]], [0.877, [0.878, 0.122, 1.000]], [0.879, [0.878, 0.122, 1.000]], [0.881, [0.882, 0.118, 1.000]], [0.883, [0.882, 0.118, 1.000]], [0.885, [0.886, 0.114, 1.000]], [0.886, [0.886, 0.114, 1.000]], [0.888, [0.890, 0.110, 1.000]], [0.890, [0.890, 0.110, 1.000]], [0.892, [0.894, 0.106, 1.000]], [0.894, [0.894, 0.106, 1.000]], [0.896, [0.898, 0.102, 1.000]], [0.898, [0.898, 0.102, 1.000]], [0.900, [0.902, 0.098, 1.000]], [0.902, [0.902, 0.098, 1.000]], [0.904, [0.906, 0.094, 1.000]], [0.906, [0.906, 0.094, 1.000]], [0.908, [0.910, 0.090, 1.000]], [0.910, [0.910, 0.090, 1.000]], [0.912, [0.914, 0.086, 1.000]], [0.914, [0.914, 0.086, 1.000]], [0.916, [0.918, 0.082, 1.000]], [0.918, [0.918, 0.082, 1.000]], [0.920, [0.922, 0.078, 1.000]], [0.922, [0.922, 0.078, 1.000]], [0.924, [0.925, 0.075, 1.000]], [0.926, [0.925, 0.075, 1.000]], [0.928, [0.929, 0.071, 1.000]], [0.930, [0.929, 0.071, 1.000]], [0.932, [0.933, 0.067, 1.000]], [0.933, [0.933, 0.067, 1.000]], [0.935, [0.937, 0.063, 1.000]], [0.937, [0.937, 0.063, 1.000]], [0.939, [0.941, 0.059, 1.000]], [0.941, [0.941, 0.059, 1.000]], [0.943, [0.945, 0.055, 1.000]], [0.945, [0.945, 0.055, 1.000]], [0.947, [0.949, 0.051, 1.000]], [0.949, [0.949, 0.051, 1.000]], [0.951, [0.953, 0.047, 1.000]], [0.953, [0.953, 0.047, 1.000]], [0.955, [0.957, 0.043, 1.000]], [0.957, [0.957, 0.043, 1.000]], [0.959, [0.961, 0.039, 1.000]], [0.961, [0.961, 0.039, 1.000]], [0.963, [0.965, 0.035, 1.000]], [0.965, [0.965, 0.035, 1.000]], [0.967, [0.969, 0.031, 1.000]], [0.969, [0.969, 0.031, 1.000]], [0.971, [0.973, 0.027, 1.000]], [0.973, [0.973, 0.027, 1.000]], [0.975, [0.976, 0.024, 1.000]], [0.977, [0.976, 0.024, 1.000]], [0.978, [0.980, 0.020, 1.000]], [0.980, [0.980, 0.020, 1.000]], [0.982, [0.984, 0.016, 1.000]], [0.984, [0.984, 0.016, 1.000]], [0.986, [0.988, 0.012, 1.000]], [0.988, [0.988, 0.012, 1.000]], [0.990, [0.992, 0.008, 1.000]], [0.992, [0.992, 0.008, 1.000]], [0.994, [0.996, 0.004, 1.000]], [0.996, [0.996, 0.004, 1.000]], [0.998, [1.000, 0.000, 1.000]], [1.000, [1.000, 0.000, 1.000]]]; +var copper = [[0.000, [0.000, 0.000, 0.000]], [0.002, [0.000, 0.000, 0.000]], [0.004, [0.005, 0.003, 0.002]], [0.006, [0.005, 0.003, 0.002]], [0.008, [0.010, 0.006, 0.004]], [0.010, [0.010, 0.006, 0.004]], [0.012, [0.015, 0.009, 0.006]], [0.014, [0.015, 0.009, 0.006]], [0.016, [0.019, 0.012, 0.008]], [0.018, [0.019, 0.012, 0.008]], [0.020, [0.024, 0.015, 0.010]], [0.022, [0.024, 0.015, 0.010]], [0.023, [0.029, 0.018, 0.012]], [0.025, [0.029, 0.018, 0.012]], [0.027, [0.034, 0.021, 0.014]], [0.029, [0.034, 0.021, 0.014]], [0.031, [0.039, 0.025, 0.016]], [0.033, [0.039, 0.025, 0.016]], [0.035, [0.044, 0.028, 0.018]], [0.037, [0.044, 0.028, 0.018]], [0.039, [0.048, 0.031, 0.020]], [0.041, [0.048, 0.031, 0.020]], [0.043, [0.053, 0.034, 0.021]], [0.045, [0.053, 0.034, 0.021]], [0.047, [0.058, 0.037, 0.023]], [0.049, [0.058, 0.037, 0.023]], [0.051, [0.063, 0.040, 0.025]], [0.053, [0.063, 0.040, 0.025]], [0.055, [0.068, 0.043, 0.027]], [0.057, [0.068, 0.043, 0.027]], [0.059, [0.073, 0.046, 0.029]], [0.061, [0.073, 0.046, 0.029]], [0.063, [0.078, 0.049, 0.031]], [0.065, [0.078, 0.049, 0.031]], [0.067, [0.082, 0.052, 0.033]], [0.068, [0.082, 0.052, 0.033]], [0.070, [0.087, 0.055, 0.035]], [0.072, [0.087, 0.055, 0.035]], [0.074, [0.092, 0.058, 0.037]], [0.076, [0.092, 0.058, 0.037]], [0.078, [0.097, 0.061, 0.039]], [0.080, [0.097, 0.061, 0.039]], [0.082, [0.102, 0.064, 0.041]], [0.084, [0.102, 0.064, 0.041]], [0.086, [0.107, 0.067, 0.043]], [0.088, [0.107, 0.067, 0.043]], [0.090, [0.111, 0.070, 0.045]], [0.092, [0.111, 0.070, 0.045]], [0.094, [0.116, 0.074, 0.047]], [0.096, [0.116, 0.074, 0.047]], [0.098, [0.121, 0.077, 0.049]], [0.100, [0.121, 0.077, 0.049]], [0.102, [0.126, 0.080, 0.051]], [0.104, [0.126, 0.080, 0.051]], [0.106, [0.131, 0.083, 0.053]], [0.108, [0.131, 0.083, 0.053]], [0.110, [0.136, 0.086, 0.055]], [0.112, [0.136, 0.086, 0.055]], [0.114, [0.140, 0.089, 0.057]], [0.115, [0.140, 0.089, 0.057]], [0.117, [0.145, 0.092, 0.059]], [0.119, [0.145, 0.092, 0.059]], [0.121, [0.150, 0.095, 0.060]], [0.123, [0.150, 0.095, 0.060]], [0.125, [0.155, 0.098, 0.062]], [0.127, [0.155, 0.098, 0.062]], [0.129, [0.160, 0.101, 0.064]], [0.131, [0.160, 0.101, 0.064]], [0.133, [0.165, 0.104, 0.066]], [0.135, [0.165, 0.104, 0.066]], [0.137, [0.170, 0.107, 0.068]], [0.139, [0.170, 0.107, 0.068]], [0.141, [0.174, 0.110, 0.070]], [0.143, [0.174, 0.110, 0.070]], [0.145, [0.179, 0.113, 0.072]], [0.147, [0.179, 0.113, 0.072]], [0.149, [0.184, 0.116, 0.074]], [0.151, [0.184, 0.116, 0.074]], [0.153, [0.189, 0.119, 0.076]], [0.155, [0.189, 0.119, 0.076]], [0.157, [0.194, 0.123, 0.078]], [0.159, [0.194, 0.123, 0.078]], [0.160, [0.199, 0.126, 0.080]], [0.162, [0.199, 0.126, 0.080]], [0.164, [0.203, 0.129, 0.082]], [0.166, [0.203, 0.129, 0.082]], [0.168, [0.208, 0.132, 0.084]], [0.170, [0.208, 0.132, 0.084]], [0.172, [0.213, 0.135, 0.086]], [0.174, [0.213, 0.135, 0.086]], [0.176, [0.218, 0.138, 0.088]], [0.178, [0.218, 0.138, 0.088]], [0.180, [0.223, 0.141, 0.090]], [0.182, [0.223, 0.141, 0.090]], [0.184, [0.228, 0.144, 0.092]], [0.186, [0.228, 0.144, 0.092]], [0.188, [0.233, 0.147, 0.094]], [0.190, [0.233, 0.147, 0.094]], [0.192, [0.237, 0.150, 0.096]], [0.194, [0.237, 0.150, 0.096]], [0.196, [0.242, 0.153, 0.098]], [0.198, [0.242, 0.153, 0.098]], [0.200, [0.247, 0.156, 0.100]], [0.202, [0.247, 0.156, 0.100]], [0.204, [0.252, 0.159, 0.101]], [0.205, [0.252, 0.159, 0.101]], [0.207, [0.257, 0.162, 0.103]], [0.209, [0.257, 0.162, 0.103]], [0.211, [0.262, 0.165, 0.105]], [0.213, [0.262, 0.165, 0.105]], [0.215, [0.266, 0.168, 0.107]], [0.217, [0.266, 0.168, 0.107]], [0.219, [0.271, 0.172, 0.109]], [0.221, [0.271, 0.172, 0.109]], [0.223, [0.276, 0.175, 0.111]], [0.225, [0.276, 0.175, 0.111]], [0.227, [0.281, 0.178, 0.113]], [0.229, [0.281, 0.178, 0.113]], [0.231, [0.286, 0.181, 0.115]], [0.233, [0.286, 0.181, 0.115]], [0.235, [0.291, 0.184, 0.117]], [0.237, [0.291, 0.184, 0.117]], [0.239, [0.296, 0.187, 0.119]], [0.241, [0.296, 0.187, 0.119]], [0.243, [0.300, 0.190, 0.121]], [0.245, [0.300, 0.190, 0.121]], [0.247, [0.305, 0.193, 0.123]], [0.249, [0.305, 0.193, 0.123]], [0.250, [0.310, 0.196, 0.125]], [0.252, [0.310, 0.196, 0.125]], [0.254, [0.315, 0.199, 0.127]], [0.256, [0.315, 0.199, 0.127]], [0.258, [0.320, 0.202, 0.129]], [0.260, [0.320, 0.202, 0.129]], [0.262, [0.325, 0.205, 0.131]], [0.264, [0.325, 0.205, 0.131]], [0.266, [0.329, 0.208, 0.133]], [0.268, [0.329, 0.208, 0.133]], [0.270, [0.334, 0.211, 0.135]], [0.272, [0.334, 0.211, 0.135]], [0.274, [0.339, 0.214, 0.137]], [0.276, [0.339, 0.214, 0.137]], [0.278, [0.344, 0.218, 0.139]], [0.280, [0.344, 0.218, 0.139]], [0.282, [0.349, 0.221, 0.140]], [0.284, [0.349, 0.221, 0.140]], [0.286, [0.354, 0.224, 0.142]], [0.288, [0.354, 0.224, 0.142]], [0.290, [0.358, 0.227, 0.144]], [0.292, [0.358, 0.227, 0.144]], [0.294, [0.363, 0.230, 0.146]], [0.295, [0.363, 0.230, 0.146]], [0.297, [0.368, 0.233, 0.148]], [0.299, [0.368, 0.233, 0.148]], [0.301, [0.373, 0.236, 0.150]], [0.303, [0.373, 0.236, 0.150]], [0.305, [0.378, 0.239, 0.152]], [0.307, [0.378, 0.239, 0.152]], [0.309, [0.383, 0.242, 0.154]], [0.311, [0.383, 0.242, 0.154]], [0.313, [0.388, 0.245, 0.156]], [0.315, [0.388, 0.245, 0.156]], [0.317, [0.392, 0.248, 0.158]], [0.319, [0.392, 0.248, 0.158]], [0.321, [0.397, 0.251, 0.160]], [0.323, [0.397, 0.251, 0.160]], [0.325, [0.402, 0.254, 0.162]], [0.327, [0.402, 0.254, 0.162]], [0.329, [0.407, 0.257, 0.164]], [0.331, [0.407, 0.257, 0.164]], [0.333, [0.412, 0.260, 0.166]], [0.335, [0.412, 0.260, 0.166]], [0.337, [0.417, 0.263, 0.168]], [0.339, [0.417, 0.263, 0.168]], [0.341, [0.421, 0.267, 0.170]], [0.342, [0.421, 0.267, 0.170]], [0.344, [0.426, 0.270, 0.172]], [0.346, [0.426, 0.270, 0.172]], [0.348, [0.431, 0.273, 0.174]], [0.350, [0.431, 0.273, 0.174]], [0.352, [0.436, 0.276, 0.176]], [0.354, [0.436, 0.276, 0.176]], [0.356, [0.441, 0.279, 0.178]], [0.358, [0.441, 0.279, 0.178]], [0.360, [0.446, 0.282, 0.179]], [0.362, [0.446, 0.282, 0.179]], [0.364, [0.451, 0.285, 0.181]], [0.366, [0.451, 0.285, 0.181]], [0.368, [0.455, 0.288, 0.183]], [0.370, [0.455, 0.288, 0.183]], [0.372, [0.460, 0.291, 0.185]], [0.374, [0.460, 0.291, 0.185]], [0.376, [0.465, 0.294, 0.187]], [0.378, [0.465, 0.294, 0.187]], [0.380, [0.470, 0.297, 0.189]], [0.382, [0.470, 0.297, 0.189]], [0.384, [0.475, 0.300, 0.191]], [0.386, [0.475, 0.300, 0.191]], [0.387, [0.480, 0.303, 0.193]], [0.389, [0.480, 0.303, 0.193]], [0.391, [0.484, 0.306, 0.195]], [0.393, [0.484, 0.306, 0.195]], [0.395, [0.489, 0.309, 0.197]], [0.397, [0.489, 0.309, 0.197]], [0.399, [0.494, 0.312, 0.199]], [0.401, [0.494, 0.312, 0.199]], [0.403, [0.499, 0.316, 0.201]], [0.405, [0.499, 0.316, 0.201]], [0.407, [0.504, 0.319, 0.203]], [0.409, [0.504, 0.319, 0.203]], [0.411, [0.509, 0.322, 0.205]], [0.413, [0.509, 0.322, 0.205]], [0.415, [0.513, 0.325, 0.207]], [0.417, [0.513, 0.325, 0.207]], [0.419, [0.518, 0.328, 0.209]], [0.421, [0.518, 0.328, 0.209]], [0.423, [0.523, 0.331, 0.211]], [0.425, [0.523, 0.331, 0.211]], [0.427, [0.528, 0.334, 0.213]], [0.429, [0.528, 0.334, 0.213]], [0.431, [0.533, 0.337, 0.215]], [0.432, [0.533, 0.337, 0.215]], [0.434, [0.538, 0.340, 0.217]], [0.436, [0.538, 0.340, 0.217]], [0.438, [0.543, 0.343, 0.219]], [0.440, [0.543, 0.343, 0.219]], [0.442, [0.547, 0.346, 0.220]], [0.444, [0.547, 0.346, 0.220]], [0.446, [0.552, 0.349, 0.222]], [0.448, [0.552, 0.349, 0.222]], [0.450, [0.557, 0.352, 0.224]], [0.452, [0.557, 0.352, 0.224]], [0.454, [0.562, 0.355, 0.226]], [0.456, [0.562, 0.355, 0.226]], [0.458, [0.567, 0.358, 0.228]], [0.460, [0.567, 0.358, 0.228]], [0.462, [0.572, 0.361, 0.230]], [0.464, [0.572, 0.361, 0.230]], [0.466, [0.576, 0.365, 0.232]], [0.468, [0.576, 0.365, 0.232]], [0.470, [0.581, 0.368, 0.234]], [0.472, [0.581, 0.368, 0.234]], [0.474, [0.586, 0.371, 0.236]], [0.476, [0.586, 0.371, 0.236]], [0.477, [0.591, 0.374, 0.238]], [0.479, [0.591, 0.374, 0.238]], [0.481, [0.596, 0.377, 0.240]], [0.483, [0.596, 0.377, 0.240]], [0.485, [0.601, 0.380, 0.242]], [0.487, [0.601, 0.380, 0.242]], [0.489, [0.606, 0.383, 0.244]], [0.491, [0.606, 0.383, 0.244]], [0.493, [0.610, 0.386, 0.246]], [0.495, [0.610, 0.386, 0.246]], [0.497, [0.615, 0.389, 0.248]], [0.499, [0.615, 0.389, 0.248]], [0.501, [0.620, 0.392, 0.250]], [0.503, [0.620, 0.392, 0.250]], [0.505, [0.625, 0.395, 0.252]], [0.507, [0.625, 0.395, 0.252]], [0.509, [0.630, 0.398, 0.254]], [0.511, [0.630, 0.398, 0.254]], [0.513, [0.635, 0.401, 0.256]], [0.515, [0.635, 0.401, 0.256]], [0.517, [0.639, 0.404, 0.258]], [0.519, [0.639, 0.404, 0.258]], [0.521, [0.644, 0.407, 0.259]], [0.523, [0.644, 0.407, 0.259]], [0.524, [0.649, 0.411, 0.261]], [0.526, [0.649, 0.411, 0.261]], [0.528, [0.654, 0.414, 0.263]], [0.530, [0.654, 0.414, 0.263]], [0.532, [0.659, 0.417, 0.265]], [0.534, [0.659, 0.417, 0.265]], [0.536, [0.664, 0.420, 0.267]], [0.538, [0.664, 0.420, 0.267]], [0.540, [0.669, 0.423, 0.269]], [0.542, [0.669, 0.423, 0.269]], [0.544, [0.673, 0.426, 0.271]], [0.546, [0.673, 0.426, 0.271]], [0.548, [0.678, 0.429, 0.273]], [0.550, [0.678, 0.429, 0.273]], [0.552, [0.683, 0.432, 0.275]], [0.554, [0.683, 0.432, 0.275]], [0.556, [0.688, 0.435, 0.277]], [0.558, [0.688, 0.435, 0.277]], [0.560, [0.693, 0.438, 0.279]], [0.562, [0.693, 0.438, 0.279]], [0.564, [0.698, 0.441, 0.281]], [0.566, [0.698, 0.441, 0.281]], [0.568, [0.702, 0.444, 0.283]], [0.569, [0.702, 0.444, 0.283]], [0.571, [0.707, 0.447, 0.285]], [0.573, [0.707, 0.447, 0.285]], [0.575, [0.712, 0.450, 0.287]], [0.577, [0.712, 0.450, 0.287]], [0.579, [0.717, 0.453, 0.289]], [0.581, [0.717, 0.453, 0.289]], [0.583, [0.722, 0.456, 0.291]], [0.585, [0.722, 0.456, 0.291]], [0.587, [0.727, 0.460, 0.293]], [0.589, [0.727, 0.460, 0.293]], [0.591, [0.731, 0.463, 0.295]], [0.593, [0.731, 0.463, 0.295]], [0.595, [0.736, 0.466, 0.297]], [0.597, [0.736, 0.466, 0.297]], [0.599, [0.741, 0.469, 0.298]], [0.601, [0.741, 0.469, 0.298]], [0.603, [0.746, 0.472, 0.300]], [0.605, [0.746, 0.472, 0.300]], [0.607, [0.751, 0.475, 0.302]], [0.609, [0.751, 0.475, 0.302]], [0.611, [0.756, 0.478, 0.304]], [0.613, [0.756, 0.478, 0.304]], [0.614, [0.761, 0.481, 0.306]], [0.616, [0.761, 0.481, 0.306]], [0.618, [0.765, 0.484, 0.308]], [0.620, [0.765, 0.484, 0.308]], [0.622, [0.770, 0.487, 0.310]], [0.624, [0.770, 0.487, 0.310]], [0.626, [0.775, 0.490, 0.312]], [0.628, [0.775, 0.490, 0.312]], [0.630, [0.780, 0.493, 0.314]], [0.632, [0.780, 0.493, 0.314]], [0.634, [0.785, 0.496, 0.316]], [0.636, [0.785, 0.496, 0.316]], [0.638, [0.790, 0.499, 0.318]], [0.640, [0.790, 0.499, 0.318]], [0.642, [0.794, 0.502, 0.320]], [0.644, [0.794, 0.502, 0.320]], [0.646, [0.799, 0.505, 0.322]], [0.648, [0.799, 0.505, 0.322]], [0.650, [0.804, 0.509, 0.324]], [0.652, [0.804, 0.509, 0.324]], [0.654, [0.809, 0.512, 0.326]], [0.656, [0.809, 0.512, 0.326]], [0.658, [0.814, 0.515, 0.328]], [0.659, [0.814, 0.515, 0.328]], [0.661, [0.819, 0.518, 0.330]], [0.663, [0.819, 0.518, 0.330]], [0.665, [0.824, 0.521, 0.332]], [0.667, [0.824, 0.521, 0.332]], [0.669, [0.828, 0.524, 0.334]], [0.671, [0.828, 0.524, 0.334]], [0.673, [0.833, 0.527, 0.336]], [0.675, [0.833, 0.527, 0.336]], [0.677, [0.838, 0.530, 0.338]], [0.679, [0.838, 0.530, 0.338]], [0.681, [0.843, 0.533, 0.339]], [0.683, [0.843, 0.533, 0.339]], [0.685, [0.848, 0.536, 0.341]], [0.687, [0.848, 0.536, 0.341]], [0.689, [0.853, 0.539, 0.343]], [0.691, [0.853, 0.539, 0.343]], [0.693, [0.857, 0.542, 0.345]], [0.695, [0.857, 0.542, 0.345]], [0.697, [0.862, 0.545, 0.347]], [0.699, [0.862, 0.545, 0.347]], [0.701, [0.867, 0.548, 0.349]], [0.703, [0.867, 0.548, 0.349]], [0.705, [0.872, 0.551, 0.351]], [0.706, [0.872, 0.551, 0.351]], [0.708, [0.877, 0.554, 0.353]], [0.710, [0.877, 0.554, 0.353]], [0.712, [0.882, 0.558, 0.355]], [0.714, [0.882, 0.558, 0.355]], [0.716, [0.887, 0.561, 0.357]], [0.718, [0.887, 0.561, 0.357]], [0.720, [0.891, 0.564, 0.359]], [0.722, [0.891, 0.564, 0.359]], [0.724, [0.896, 0.567, 0.361]], [0.726, [0.896, 0.567, 0.361]], [0.728, [0.901, 0.570, 0.363]], [0.730, [0.901, 0.570, 0.363]], [0.732, [0.906, 0.573, 0.365]], [0.734, [0.906, 0.573, 0.365]], [0.736, [0.911, 0.576, 0.367]], [0.738, [0.911, 0.576, 0.367]], [0.740, [0.916, 0.579, 0.369]], [0.742, [0.916, 0.579, 0.369]], [0.744, [0.920, 0.582, 0.371]], [0.746, [0.920, 0.582, 0.371]], [0.748, [0.925, 0.585, 0.373]], [0.750, [0.925, 0.585, 0.373]], [0.751, [0.930, 0.588, 0.375]], [0.753, [0.930, 0.588, 0.375]], [0.755, [0.935, 0.591, 0.377]], [0.757, [0.935, 0.591, 0.377]], [0.759, [0.940, 0.594, 0.378]], [0.761, [0.940, 0.594, 0.378]], [0.763, [0.945, 0.597, 0.380]], [0.765, [0.945, 0.597, 0.380]], [0.767, [0.949, 0.600, 0.382]], [0.769, [0.949, 0.600, 0.382]], [0.771, [0.954, 0.604, 0.384]], [0.773, [0.954, 0.604, 0.384]], [0.775, [0.959, 0.607, 0.386]], [0.777, [0.959, 0.607, 0.386]], [0.779, [0.964, 0.610, 0.388]], [0.781, [0.964, 0.610, 0.388]], [0.783, [0.969, 0.613, 0.390]], [0.785, [0.969, 0.613, 0.390]], [0.787, [0.974, 0.616, 0.392]], [0.789, [0.974, 0.616, 0.392]], [0.791, [0.979, 0.619, 0.394]], [0.793, [0.979, 0.619, 0.394]], [0.795, [0.983, 0.622, 0.396]], [0.796, [0.983, 0.622, 0.396]], [0.798, [0.988, 0.625, 0.398]], [0.800, [0.988, 0.625, 0.398]], [0.802, [0.993, 0.628, 0.400]], [0.804, [0.993, 0.628, 0.400]], [0.806, [0.998, 0.631, 0.402]], [0.808, [0.998, 0.631, 0.402]], [0.810, [1.000, 0.634, 0.404]], [0.812, [1.000, 0.634, 0.404]], [0.814, [1.000, 0.637, 0.406]], [0.816, [1.000, 0.637, 0.406]], [0.818, [1.000, 0.640, 0.408]], [0.820, [1.000, 0.640, 0.408]], [0.822, [1.000, 0.643, 0.410]], [0.824, [1.000, 0.643, 0.410]], [0.826, [1.000, 0.646, 0.412]], [0.828, [1.000, 0.646, 0.412]], [0.830, [1.000, 0.649, 0.414]], [0.832, [1.000, 0.649, 0.414]], [0.834, [1.000, 0.653, 0.416]], [0.836, [1.000, 0.653, 0.416]], [0.838, [1.000, 0.656, 0.418]], [0.840, [1.000, 0.656, 0.418]], [0.841, [1.000, 0.659, 0.419]], [0.843, [1.000, 0.659, 0.419]], [0.845, [1.000, 0.662, 0.421]], [0.847, [1.000, 0.662, 0.421]], [0.849, [1.000, 0.665, 0.423]], [0.851, [1.000, 0.665, 0.423]], [0.853, [1.000, 0.668, 0.425]], [0.855, [1.000, 0.668, 0.425]], [0.857, [1.000, 0.671, 0.427]], [0.859, [1.000, 0.671, 0.427]], [0.861, [1.000, 0.674, 0.429]], [0.863, [1.000, 0.674, 0.429]], [0.865, [1.000, 0.677, 0.431]], [0.867, [1.000, 0.677, 0.431]], [0.869, [1.000, 0.680, 0.433]], [0.871, [1.000, 0.680, 0.433]], [0.873, [1.000, 0.683, 0.435]], [0.875, [1.000, 0.683, 0.435]], [0.877, [1.000, 0.686, 0.437]], [0.879, [1.000, 0.686, 0.437]], [0.881, [1.000, 0.689, 0.439]], [0.883, [1.000, 0.689, 0.439]], [0.885, [1.000, 0.692, 0.441]], [0.886, [1.000, 0.692, 0.441]], [0.888, [1.000, 0.695, 0.443]], [0.890, [1.000, 0.695, 0.443]], [0.892, [1.000, 0.698, 0.445]], [0.894, [1.000, 0.698, 0.445]], [0.896, [1.000, 0.702, 0.447]], [0.898, [1.000, 0.702, 0.447]], [0.900, [1.000, 0.705, 0.449]], [0.902, [1.000, 0.705, 0.449]], [0.904, [1.000, 0.708, 0.451]], [0.906, [1.000, 0.708, 0.451]], [0.908, [1.000, 0.711, 0.453]], [0.910, [1.000, 0.711, 0.453]], [0.912, [1.000, 0.714, 0.455]], [0.914, [1.000, 0.714, 0.455]], [0.916, [1.000, 0.717, 0.457]], [0.918, [1.000, 0.717, 0.457]], [0.920, [1.000, 0.720, 0.458]], [0.922, [1.000, 0.720, 0.458]], [0.924, [1.000, 0.723, 0.460]], [0.926, [1.000, 0.723, 0.460]], [0.928, [1.000, 0.726, 0.462]], [0.930, [1.000, 0.726, 0.462]], [0.932, [1.000, 0.729, 0.464]], [0.933, [1.000, 0.729, 0.464]], [0.935, [1.000, 0.732, 0.466]], [0.937, [1.000, 0.732, 0.466]], [0.939, [1.000, 0.735, 0.468]], [0.941, [1.000, 0.735, 0.468]], [0.943, [1.000, 0.738, 0.470]], [0.945, [1.000, 0.738, 0.470]], [0.947, [1.000, 0.741, 0.472]], [0.949, [1.000, 0.741, 0.472]], [0.951, [1.000, 0.744, 0.474]], [0.953, [1.000, 0.744, 0.474]], [0.955, [1.000, 0.748, 0.476]], [0.957, [1.000, 0.748, 0.476]], [0.959, [1.000, 0.751, 0.478]], [0.961, [1.000, 0.751, 0.478]], [0.963, [1.000, 0.754, 0.480]], [0.965, [1.000, 0.754, 0.480]], [0.967, [1.000, 0.757, 0.482]], [0.969, [1.000, 0.757, 0.482]], [0.971, [1.000, 0.760, 0.484]], [0.973, [1.000, 0.760, 0.484]], [0.975, [1.000, 0.763, 0.486]], [0.977, [1.000, 0.763, 0.486]], [0.978, [1.000, 0.766, 0.488]], [0.980, [1.000, 0.766, 0.488]], [0.982, [1.000, 0.769, 0.490]], [0.984, [1.000, 0.769, 0.490]], [0.986, [1.000, 0.772, 0.492]], [0.988, [1.000, 0.772, 0.492]], [0.990, [1.000, 0.775, 0.494]], [0.992, [1.000, 0.775, 0.494]], [0.994, [1.000, 0.778, 0.496]], [0.996, [1.000, 0.778, 0.496]], [0.998, [1.000, 0.781, 0.497]], [1.000, [1.000, 0.781, 0.497]]]; +var gist_heat = [[0.000, [0.000, 0.000, 0.000]], [0.002, [0.000, 0.000, 0.000]], [0.004, [0.006, 0.000, 0.000]], [0.006, [0.006, 0.000, 0.000]], [0.008, [0.012, 0.000, 0.000]], [0.010, [0.012, 0.000, 0.000]], [0.012, [0.018, 0.000, 0.000]], [0.014, [0.018, 0.000, 0.000]], [0.016, [0.024, 0.000, 0.000]], [0.018, [0.024, 0.000, 0.000]], [0.020, [0.029, 0.000, 0.000]], [0.022, [0.029, 0.000, 0.000]], [0.023, [0.035, 0.000, 0.000]], [0.025, [0.035, 0.000, 0.000]], [0.027, [0.041, 0.000, 0.000]], [0.029, [0.041, 0.000, 0.000]], [0.031, [0.047, 0.000, 0.000]], [0.033, [0.047, 0.000, 0.000]], [0.035, [0.053, 0.000, 0.000]], [0.037, [0.053, 0.000, 0.000]], [0.039, [0.059, 0.000, 0.000]], [0.041, [0.059, 0.000, 0.000]], [0.043, [0.065, 0.000, 0.000]], [0.045, [0.065, 0.000, 0.000]], [0.047, [0.071, 0.000, 0.000]], [0.049, [0.071, 0.000, 0.000]], [0.051, [0.076, 0.000, 0.000]], [0.053, [0.076, 0.000, 0.000]], [0.055, [0.082, 0.000, 0.000]], [0.057, [0.082, 0.000, 0.000]], [0.059, [0.088, 0.000, 0.000]], [0.061, [0.088, 0.000, 0.000]], [0.063, [0.094, 0.000, 0.000]], [0.065, [0.094, 0.000, 0.000]], [0.067, [0.100, 0.000, 0.000]], [0.068, [0.100, 0.000, 0.000]], [0.070, [0.106, 0.000, 0.000]], [0.072, [0.106, 0.000, 0.000]], [0.074, [0.112, 0.000, 0.000]], [0.076, [0.112, 0.000, 0.000]], [0.078, [0.118, 0.000, 0.000]], [0.080, [0.118, 0.000, 0.000]], [0.082, [0.124, 0.000, 0.000]], [0.084, [0.124, 0.000, 0.000]], [0.086, [0.129, 0.000, 0.000]], [0.088, [0.129, 0.000, 0.000]], [0.090, [0.135, 0.000, 0.000]], [0.092, [0.135, 0.000, 0.000]], [0.094, [0.141, 0.000, 0.000]], [0.096, [0.141, 0.000, 0.000]], [0.098, [0.147, 0.000, 0.000]], [0.100, [0.147, 0.000, 0.000]], [0.102, [0.153, 0.000, 0.000]], [0.104, [0.153, 0.000, 0.000]], [0.106, [0.159, 0.000, 0.000]], [0.108, [0.159, 0.000, 0.000]], [0.110, [0.165, 0.000, 0.000]], [0.112, [0.165, 0.000, 0.000]], [0.114, [0.171, 0.000, 0.000]], [0.115, [0.171, 0.000, 0.000]], [0.117, [0.176, 0.000, 0.000]], [0.119, [0.176, 0.000, 0.000]], [0.121, [0.182, 0.000, 0.000]], [0.123, [0.182, 0.000, 0.000]], [0.125, [0.188, 0.000, 0.000]], [0.127, [0.188, 0.000, 0.000]], [0.129, [0.194, 0.000, 0.000]], [0.131, [0.194, 0.000, 0.000]], [0.133, [0.200, 0.000, 0.000]], [0.135, [0.200, 0.000, 0.000]], [0.137, [0.206, 0.000, 0.000]], [0.139, [0.206, 0.000, 0.000]], [0.141, [0.212, 0.000, 0.000]], [0.143, [0.212, 0.000, 0.000]], [0.145, [0.218, 0.000, 0.000]], [0.147, [0.218, 0.000, 0.000]], [0.149, [0.224, 0.000, 0.000]], [0.151, [0.224, 0.000, 0.000]], [0.153, [0.229, 0.000, 0.000]], [0.155, [0.229, 0.000, 0.000]], [0.157, [0.235, 0.000, 0.000]], [0.159, [0.235, 0.000, 0.000]], [0.160, [0.241, 0.000, 0.000]], [0.162, [0.241, 0.000, 0.000]], [0.164, [0.247, 0.000, 0.000]], [0.166, [0.247, 0.000, 0.000]], [0.168, [0.253, 0.000, 0.000]], [0.170, [0.253, 0.000, 0.000]], [0.172, [0.259, 0.000, 0.000]], [0.174, [0.259, 0.000, 0.000]], [0.176, [0.265, 0.000, 0.000]], [0.178, [0.265, 0.000, 0.000]], [0.180, [0.271, 0.000, 0.000]], [0.182, [0.271, 0.000, 0.000]], [0.184, [0.276, 0.000, 0.000]], [0.186, [0.276, 0.000, 0.000]], [0.188, [0.282, 0.000, 0.000]], [0.190, [0.282, 0.000, 0.000]], [0.192, [0.288, 0.000, 0.000]], [0.194, [0.288, 0.000, 0.000]], [0.196, [0.294, 0.000, 0.000]], [0.198, [0.294, 0.000, 0.000]], [0.200, [0.300, 0.000, 0.000]], [0.202, [0.300, 0.000, 0.000]], [0.204, [0.306, 0.000, 0.000]], [0.205, [0.306, 0.000, 0.000]], [0.207, [0.312, 0.000, 0.000]], [0.209, [0.312, 0.000, 0.000]], [0.211, [0.318, 0.000, 0.000]], [0.213, [0.318, 0.000, 0.000]], [0.215, [0.324, 0.000, 0.000]], [0.217, [0.324, 0.000, 0.000]], [0.219, [0.329, 0.000, 0.000]], [0.221, [0.329, 0.000, 0.000]], [0.223, [0.335, 0.000, 0.000]], [0.225, [0.335, 0.000, 0.000]], [0.227, [0.341, 0.000, 0.000]], [0.229, [0.341, 0.000, 0.000]], [0.231, [0.347, 0.000, 0.000]], [0.233, [0.347, 0.000, 0.000]], [0.235, [0.353, 0.000, 0.000]], [0.237, [0.353, 0.000, 0.000]], [0.239, [0.359, 0.000, 0.000]], [0.241, [0.359, 0.000, 0.000]], [0.243, [0.365, 0.000, 0.000]], [0.245, [0.365, 0.000, 0.000]], [0.247, [0.371, 0.000, 0.000]], [0.249, [0.371, 0.000, 0.000]], [0.250, [0.376, 0.000, 0.000]], [0.252, [0.376, 0.000, 0.000]], [0.254, [0.382, 0.000, 0.000]], [0.256, [0.382, 0.000, 0.000]], [0.258, [0.388, 0.000, 0.000]], [0.260, [0.388, 0.000, 0.000]], [0.262, [0.394, 0.000, 0.000]], [0.264, [0.394, 0.000, 0.000]], [0.266, [0.400, 0.000, 0.000]], [0.268, [0.400, 0.000, 0.000]], [0.270, [0.406, 0.000, 0.000]], [0.272, [0.406, 0.000, 0.000]], [0.274, [0.412, 0.000, 0.000]], [0.276, [0.412, 0.000, 0.000]], [0.278, [0.418, 0.000, 0.000]], [0.280, [0.418, 0.000, 0.000]], [0.282, [0.424, 0.000, 0.000]], [0.284, [0.424, 0.000, 0.000]], [0.286, [0.429, 0.000, 0.000]], [0.288, [0.429, 0.000, 0.000]], [0.290, [0.435, 0.000, 0.000]], [0.292, [0.435, 0.000, 0.000]], [0.294, [0.441, 0.000, 0.000]], [0.295, [0.441, 0.000, 0.000]], [0.297, [0.447, 0.000, 0.000]], [0.299, [0.447, 0.000, 0.000]], [0.301, [0.453, 0.000, 0.000]], [0.303, [0.453, 0.000, 0.000]], [0.305, [0.459, 0.000, 0.000]], [0.307, [0.459, 0.000, 0.000]], [0.309, [0.465, 0.000, 0.000]], [0.311, [0.465, 0.000, 0.000]], [0.313, [0.471, 0.000, 0.000]], [0.315, [0.471, 0.000, 0.000]], [0.317, [0.476, 0.000, 0.000]], [0.319, [0.476, 0.000, 0.000]], [0.321, [0.482, 0.000, 0.000]], [0.323, [0.482, 0.000, 0.000]], [0.325, [0.488, 0.000, 0.000]], [0.327, [0.488, 0.000, 0.000]], [0.329, [0.494, 0.000, 0.000]], [0.331, [0.494, 0.000, 0.000]], [0.333, [0.500, 0.000, 0.000]], [0.335, [0.500, 0.000, 0.000]], [0.337, [0.506, 0.000, 0.000]], [0.339, [0.506, 0.000, 0.000]], [0.341, [0.512, 0.000, 0.000]], [0.342, [0.512, 0.000, 0.000]], [0.344, [0.518, 0.000, 0.000]], [0.346, [0.518, 0.000, 0.000]], [0.348, [0.524, 0.000, 0.000]], [0.350, [0.524, 0.000, 0.000]], [0.352, [0.529, 0.000, 0.000]], [0.354, [0.529, 0.000, 0.000]], [0.356, [0.535, 0.000, 0.000]], [0.358, [0.535, 0.000, 0.000]], [0.360, [0.541, 0.000, 0.000]], [0.362, [0.541, 0.000, 0.000]], [0.364, [0.547, 0.000, 0.000]], [0.366, [0.547, 0.000, 0.000]], [0.368, [0.553, 0.000, 0.000]], [0.370, [0.553, 0.000, 0.000]], [0.372, [0.559, 0.000, 0.000]], [0.374, [0.559, 0.000, 0.000]], [0.376, [0.565, 0.000, 0.000]], [0.378, [0.565, 0.000, 0.000]], [0.380, [0.571, 0.000, 0.000]], [0.382, [0.571, 0.000, 0.000]], [0.384, [0.576, 0.000, 0.000]], [0.386, [0.576, 0.000, 0.000]], [0.387, [0.582, 0.000, 0.000]], [0.389, [0.582, 0.000, 0.000]], [0.391, [0.588, 0.000, 0.000]], [0.393, [0.588, 0.000, 0.000]], [0.395, [0.594, 0.000, 0.000]], [0.397, [0.594, 0.000, 0.000]], [0.399, [0.600, 0.000, 0.000]], [0.401, [0.600, 0.000, 0.000]], [0.403, [0.606, 0.000, 0.000]], [0.405, [0.606, 0.000, 0.000]], [0.407, [0.612, 0.000, 0.000]], [0.409, [0.612, 0.000, 0.000]], [0.411, [0.618, 0.000, 0.000]], [0.413, [0.618, 0.000, 0.000]], [0.415, [0.624, 0.000, 0.000]], [0.417, [0.624, 0.000, 0.000]], [0.419, [0.629, 0.000, 0.000]], [0.421, [0.629, 0.000, 0.000]], [0.423, [0.635, 0.000, 0.000]], [0.425, [0.635, 0.000, 0.000]], [0.427, [0.641, 0.000, 0.000]], [0.429, [0.641, 0.000, 0.000]], [0.431, [0.647, 0.000, 0.000]], [0.432, [0.647, 0.000, 0.000]], [0.434, [0.653, 0.000, 0.000]], [0.436, [0.653, 0.000, 0.000]], [0.438, [0.659, 0.000, 0.000]], [0.440, [0.659, 0.000, 0.000]], [0.442, [0.665, 0.000, 0.000]], [0.444, [0.665, 0.000, 0.000]], [0.446, [0.671, 0.000, 0.000]], [0.448, [0.671, 0.000, 0.000]], [0.450, [0.676, 0.000, 0.000]], [0.452, [0.676, 0.000, 0.000]], [0.454, [0.682, 0.000, 0.000]], [0.456, [0.682, 0.000, 0.000]], [0.458, [0.688, 0.000, 0.000]], [0.460, [0.688, 0.000, 0.000]], [0.462, [0.694, 0.000, 0.000]], [0.464, [0.694, 0.000, 0.000]], [0.466, [0.700, 0.000, 0.000]], [0.468, [0.700, 0.000, 0.000]], [0.470, [0.706, 0.000, 0.000]], [0.472, [0.706, 0.000, 0.000]], [0.474, [0.712, 0.000, 0.000]], [0.476, [0.712, 0.000, 0.000]], [0.477, [0.718, 0.000, 0.000]], [0.479, [0.718, 0.000, 0.000]], [0.481, [0.724, 0.000, 0.000]], [0.483, [0.724, 0.000, 0.000]], [0.485, [0.729, 0.000, 0.000]], [0.487, [0.729, 0.000, 0.000]], [0.489, [0.735, 0.000, 0.000]], [0.491, [0.735, 0.000, 0.000]], [0.493, [0.741, 0.000, 0.000]], [0.495, [0.741, 0.000, 0.000]], [0.497, [0.747, 0.000, 0.000]], [0.499, [0.747, 0.000, 0.000]], [0.501, [0.753, 0.004, 0.000]], [0.503, [0.753, 0.004, 0.000]], [0.505, [0.759, 0.012, 0.000]], [0.507, [0.759, 0.012, 0.000]], [0.509, [0.765, 0.020, 0.000]], [0.511, [0.765, 0.020, 0.000]], [0.513, [0.771, 0.027, 0.000]], [0.515, [0.771, 0.027, 0.000]], [0.517, [0.776, 0.035, 0.000]], [0.519, [0.776, 0.035, 0.000]], [0.521, [0.782, 0.043, 0.000]], [0.523, [0.782, 0.043, 0.000]], [0.524, [0.788, 0.051, 0.000]], [0.526, [0.788, 0.051, 0.000]], [0.528, [0.794, 0.059, 0.000]], [0.530, [0.794, 0.059, 0.000]], [0.532, [0.800, 0.067, 0.000]], [0.534, [0.800, 0.067, 0.000]], [0.536, [0.806, 0.075, 0.000]], [0.538, [0.806, 0.075, 0.000]], [0.540, [0.812, 0.082, 0.000]], [0.542, [0.812, 0.082, 0.000]], [0.544, [0.818, 0.090, 0.000]], [0.546, [0.818, 0.090, 0.000]], [0.548, [0.824, 0.098, 0.000]], [0.550, [0.824, 0.098, 0.000]], [0.552, [0.829, 0.106, 0.000]], [0.554, [0.829, 0.106, 0.000]], [0.556, [0.835, 0.114, 0.000]], [0.558, [0.835, 0.114, 0.000]], [0.560, [0.841, 0.122, 0.000]], [0.562, [0.841, 0.122, 0.000]], [0.564, [0.847, 0.129, 0.000]], [0.566, [0.847, 0.129, 0.000]], [0.568, [0.853, 0.137, 0.000]], [0.569, [0.853, 0.137, 0.000]], [0.571, [0.859, 0.145, 0.000]], [0.573, [0.859, 0.145, 0.000]], [0.575, [0.865, 0.153, 0.000]], [0.577, [0.865, 0.153, 0.000]], [0.579, [0.871, 0.161, 0.000]], [0.581, [0.871, 0.161, 0.000]], [0.583, [0.876, 0.169, 0.000]], [0.585, [0.876, 0.169, 0.000]], [0.587, [0.882, 0.176, 0.000]], [0.589, [0.882, 0.176, 0.000]], [0.591, [0.888, 0.184, 0.000]], [0.593, [0.888, 0.184, 0.000]], [0.595, [0.894, 0.192, 0.000]], [0.597, [0.894, 0.192, 0.000]], [0.599, [0.900, 0.200, 0.000]], [0.601, [0.900, 0.200, 0.000]], [0.603, [0.906, 0.208, 0.000]], [0.605, [0.906, 0.208, 0.000]], [0.607, [0.912, 0.216, 0.000]], [0.609, [0.912, 0.216, 0.000]], [0.611, [0.918, 0.224, 0.000]], [0.613, [0.918, 0.224, 0.000]], [0.614, [0.924, 0.231, 0.000]], [0.616, [0.924, 0.231, 0.000]], [0.618, [0.929, 0.239, 0.000]], [0.620, [0.929, 0.239, 0.000]], [0.622, [0.935, 0.247, 0.000]], [0.624, [0.935, 0.247, 0.000]], [0.626, [0.941, 0.255, 0.000]], [0.628, [0.941, 0.255, 0.000]], [0.630, [0.947, 0.263, 0.000]], [0.632, [0.947, 0.263, 0.000]], [0.634, [0.953, 0.271, 0.000]], [0.636, [0.953, 0.271, 0.000]], [0.638, [0.959, 0.278, 0.000]], [0.640, [0.959, 0.278, 0.000]], [0.642, [0.965, 0.286, 0.000]], [0.644, [0.965, 0.286, 0.000]], [0.646, [0.971, 0.294, 0.000]], [0.648, [0.971, 0.294, 0.000]], [0.650, [0.976, 0.302, 0.000]], [0.652, [0.976, 0.302, 0.000]], [0.654, [0.982, 0.310, 0.000]], [0.656, [0.982, 0.310, 0.000]], [0.658, [0.988, 0.318, 0.000]], [0.659, [0.988, 0.318, 0.000]], [0.661, [0.994, 0.325, 0.000]], [0.663, [0.994, 0.325, 0.000]], [0.665, [1.000, 0.333, 0.000]], [0.667, [1.000, 0.333, 0.000]], [0.669, [1.000, 0.341, 0.000]], [0.671, [1.000, 0.341, 0.000]], [0.673, [1.000, 0.349, 0.000]], [0.675, [1.000, 0.349, 0.000]], [0.677, [1.000, 0.357, 0.000]], [0.679, [1.000, 0.357, 0.000]], [0.681, [1.000, 0.365, 0.000]], [0.683, [1.000, 0.365, 0.000]], [0.685, [1.000, 0.373, 0.000]], [0.687, [1.000, 0.373, 0.000]], [0.689, [1.000, 0.380, 0.000]], [0.691, [1.000, 0.380, 0.000]], [0.693, [1.000, 0.388, 0.000]], [0.695, [1.000, 0.388, 0.000]], [0.697, [1.000, 0.396, 0.000]], [0.699, [1.000, 0.396, 0.000]], [0.701, [1.000, 0.404, 0.000]], [0.703, [1.000, 0.404, 0.000]], [0.705, [1.000, 0.412, 0.000]], [0.706, [1.000, 0.412, 0.000]], [0.708, [1.000, 0.420, 0.000]], [0.710, [1.000, 0.420, 0.000]], [0.712, [1.000, 0.427, 0.000]], [0.714, [1.000, 0.427, 0.000]], [0.716, [1.000, 0.435, 0.000]], [0.718, [1.000, 0.435, 0.000]], [0.720, [1.000, 0.443, 0.000]], [0.722, [1.000, 0.443, 0.000]], [0.724, [1.000, 0.451, 0.000]], [0.726, [1.000, 0.451, 0.000]], [0.728, [1.000, 0.459, 0.000]], [0.730, [1.000, 0.459, 0.000]], [0.732, [1.000, 0.467, 0.000]], [0.734, [1.000, 0.467, 0.000]], [0.736, [1.000, 0.475, 0.000]], [0.738, [1.000, 0.475, 0.000]], [0.740, [1.000, 0.482, 0.000]], [0.742, [1.000, 0.482, 0.000]], [0.744, [1.000, 0.490, 0.000]], [0.746, [1.000, 0.490, 0.000]], [0.748, [1.000, 0.498, 0.000]], [0.750, [1.000, 0.498, 0.000]], [0.751, [1.000, 0.506, 0.012]], [0.753, [1.000, 0.506, 0.012]], [0.755, [1.000, 0.514, 0.027]], [0.757, [1.000, 0.514, 0.027]], [0.759, [1.000, 0.522, 0.043]], [0.761, [1.000, 0.522, 0.043]], [0.763, [1.000, 0.529, 0.059]], [0.765, [1.000, 0.529, 0.059]], [0.767, [1.000, 0.537, 0.075]], [0.769, [1.000, 0.537, 0.075]], [0.771, [1.000, 0.545, 0.090]], [0.773, [1.000, 0.545, 0.090]], [0.775, [1.000, 0.553, 0.106]], [0.777, [1.000, 0.553, 0.106]], [0.779, [1.000, 0.561, 0.122]], [0.781, [1.000, 0.561, 0.122]], [0.783, [1.000, 0.569, 0.137]], [0.785, [1.000, 0.569, 0.137]], [0.787, [1.000, 0.576, 0.153]], [0.789, [1.000, 0.576, 0.153]], [0.791, [1.000, 0.584, 0.169]], [0.793, [1.000, 0.584, 0.169]], [0.795, [1.000, 0.592, 0.184]], [0.796, [1.000, 0.592, 0.184]], [0.798, [1.000, 0.600, 0.200]], [0.800, [1.000, 0.600, 0.200]], [0.802, [1.000, 0.608, 0.216]], [0.804, [1.000, 0.608, 0.216]], [0.806, [1.000, 0.616, 0.231]], [0.808, [1.000, 0.616, 0.231]], [0.810, [1.000, 0.624, 0.247]], [0.812, [1.000, 0.624, 0.247]], [0.814, [1.000, 0.631, 0.263]], [0.816, [1.000, 0.631, 0.263]], [0.818, [1.000, 0.639, 0.278]], [0.820, [1.000, 0.639, 0.278]], [0.822, [1.000, 0.647, 0.294]], [0.824, [1.000, 0.647, 0.294]], [0.826, [1.000, 0.655, 0.310]], [0.828, [1.000, 0.655, 0.310]], [0.830, [1.000, 0.663, 0.325]], [0.832, [1.000, 0.663, 0.325]], [0.834, [1.000, 0.671, 0.341]], [0.836, [1.000, 0.671, 0.341]], [0.838, [1.000, 0.678, 0.357]], [0.840, [1.000, 0.678, 0.357]], [0.841, [1.000, 0.686, 0.373]], [0.843, [1.000, 0.686, 0.373]], [0.845, [1.000, 0.694, 0.388]], [0.847, [1.000, 0.694, 0.388]], [0.849, [1.000, 0.702, 0.404]], [0.851, [1.000, 0.702, 0.404]], [0.853, [1.000, 0.710, 0.420]], [0.855, [1.000, 0.710, 0.420]], [0.857, [1.000, 0.718, 0.435]], [0.859, [1.000, 0.718, 0.435]], [0.861, [1.000, 0.725, 0.451]], [0.863, [1.000, 0.725, 0.451]], [0.865, [1.000, 0.733, 0.467]], [0.867, [1.000, 0.733, 0.467]], [0.869, [1.000, 0.741, 0.482]], [0.871, [1.000, 0.741, 0.482]], [0.873, [1.000, 0.749, 0.498]], [0.875, [1.000, 0.749, 0.498]], [0.877, [1.000, 0.757, 0.514]], [0.879, [1.000, 0.757, 0.514]], [0.881, [1.000, 0.765, 0.529]], [0.883, [1.000, 0.765, 0.529]], [0.885, [1.000, 0.773, 0.545]], [0.886, [1.000, 0.773, 0.545]], [0.888, [1.000, 0.780, 0.561]], [0.890, [1.000, 0.780, 0.561]], [0.892, [1.000, 0.788, 0.576]], [0.894, [1.000, 0.788, 0.576]], [0.896, [1.000, 0.796, 0.592]], [0.898, [1.000, 0.796, 0.592]], [0.900, [1.000, 0.804, 0.608]], [0.902, [1.000, 0.804, 0.608]], [0.904, [1.000, 0.812, 0.624]], [0.906, [1.000, 0.812, 0.624]], [0.908, [1.000, 0.820, 0.639]], [0.910, [1.000, 0.820, 0.639]], [0.912, [1.000, 0.827, 0.655]], [0.914, [1.000, 0.827, 0.655]], [0.916, [1.000, 0.835, 0.671]], [0.918, [1.000, 0.835, 0.671]], [0.920, [1.000, 0.843, 0.686]], [0.922, [1.000, 0.843, 0.686]], [0.924, [1.000, 0.851, 0.702]], [0.926, [1.000, 0.851, 0.702]], [0.928, [1.000, 0.859, 0.718]], [0.930, [1.000, 0.859, 0.718]], [0.932, [1.000, 0.867, 0.733]], [0.933, [1.000, 0.867, 0.733]], [0.935, [1.000, 0.875, 0.749]], [0.937, [1.000, 0.875, 0.749]], [0.939, [1.000, 0.882, 0.765]], [0.941, [1.000, 0.882, 0.765]], [0.943, [1.000, 0.890, 0.780]], [0.945, [1.000, 0.890, 0.780]], [0.947, [1.000, 0.898, 0.796]], [0.949, [1.000, 0.898, 0.796]], [0.951, [1.000, 0.906, 0.812]], [0.953, [1.000, 0.906, 0.812]], [0.955, [1.000, 0.914, 0.827]], [0.957, [1.000, 0.914, 0.827]], [0.959, [1.000, 0.922, 0.843]], [0.961, [1.000, 0.922, 0.843]], [0.963, [1.000, 0.929, 0.859]], [0.965, [1.000, 0.929, 0.859]], [0.967, [1.000, 0.937, 0.875]], [0.969, [1.000, 0.937, 0.875]], [0.971, [1.000, 0.945, 0.890]], [0.973, [1.000, 0.945, 0.890]], [0.975, [1.000, 0.953, 0.906]], [0.977, [1.000, 0.953, 0.906]], [0.978, [1.000, 0.961, 0.922]], [0.980, [1.000, 0.961, 0.922]], [0.982, [1.000, 0.969, 0.937]], [0.984, [1.000, 0.969, 0.937]], [0.986, [1.000, 0.976, 0.953]], [0.988, [1.000, 0.976, 0.953]], [0.990, [1.000, 0.984, 0.969]], [0.992, [1.000, 0.984, 0.969]], [0.994, [1.000, 0.992, 0.984]], [0.996, [1.000, 0.992, 0.984]], [0.998, [1.000, 1.000, 1.000]], [1.000, [1.000, 1.000, 1.000]]]; +var gray = [[0.000, [0.000, 0.000, 0.000]], [0.002, [0.000, 0.000, 0.000]], [0.004, [0.004, 0.004, 0.004]], [0.006, [0.004, 0.004, 0.004]], [0.008, [0.008, 0.008, 0.008]], [0.010, [0.008, 0.008, 0.008]], [0.012, [0.012, 0.012, 0.012]], [0.014, [0.012, 0.012, 0.012]], [0.016, [0.016, 0.016, 0.016]], [0.018, [0.016, 0.016, 0.016]], [0.020, [0.020, 0.020, 0.020]], [0.022, [0.020, 0.020, 0.020]], [0.023, [0.024, 0.024, 0.024]], [0.025, [0.024, 0.024, 0.024]], [0.027, [0.027, 0.027, 0.027]], [0.029, [0.027, 0.027, 0.027]], [0.031, [0.031, 0.031, 0.031]], [0.033, [0.031, 0.031, 0.031]], [0.035, [0.035, 0.035, 0.035]], [0.037, [0.035, 0.035, 0.035]], [0.039, [0.039, 0.039, 0.039]], [0.041, [0.039, 0.039, 0.039]], [0.043, [0.043, 0.043, 0.043]], [0.045, [0.043, 0.043, 0.043]], [0.047, [0.047, 0.047, 0.047]], [0.049, [0.047, 0.047, 0.047]], [0.051, [0.051, 0.051, 0.051]], [0.053, [0.051, 0.051, 0.051]], [0.055, [0.055, 0.055, 0.055]], [0.057, [0.055, 0.055, 0.055]], [0.059, [0.059, 0.059, 0.059]], [0.061, [0.059, 0.059, 0.059]], [0.063, [0.063, 0.063, 0.063]], [0.065, [0.063, 0.063, 0.063]], [0.067, [0.067, 0.067, 0.067]], [0.068, [0.067, 0.067, 0.067]], [0.070, [0.071, 0.071, 0.071]], [0.072, [0.071, 0.071, 0.071]], [0.074, [0.075, 0.075, 0.075]], [0.076, [0.075, 0.075, 0.075]], [0.078, [0.078, 0.078, 0.078]], [0.080, [0.078, 0.078, 0.078]], [0.082, [0.082, 0.082, 0.082]], [0.084, [0.082, 0.082, 0.082]], [0.086, [0.086, 0.086, 0.086]], [0.088, [0.086, 0.086, 0.086]], [0.090, [0.090, 0.090, 0.090]], [0.092, [0.090, 0.090, 0.090]], [0.094, [0.094, 0.094, 0.094]], [0.096, [0.094, 0.094, 0.094]], [0.098, [0.098, 0.098, 0.098]], [0.100, [0.098, 0.098, 0.098]], [0.102, [0.102, 0.102, 0.102]], [0.104, [0.102, 0.102, 0.102]], [0.106, [0.106, 0.106, 0.106]], [0.108, [0.106, 0.106, 0.106]], [0.110, [0.110, 0.110, 0.110]], [0.112, [0.110, 0.110, 0.110]], [0.114, [0.114, 0.114, 0.114]], [0.115, [0.114, 0.114, 0.114]], [0.117, [0.118, 0.118, 0.118]], [0.119, [0.118, 0.118, 0.118]], [0.121, [0.122, 0.122, 0.122]], [0.123, [0.122, 0.122, 0.122]], [0.125, [0.125, 0.125, 0.125]], [0.127, [0.125, 0.125, 0.125]], [0.129, [0.129, 0.129, 0.129]], [0.131, [0.129, 0.129, 0.129]], [0.133, [0.133, 0.133, 0.133]], [0.135, [0.133, 0.133, 0.133]], [0.137, [0.137, 0.137, 0.137]], [0.139, [0.137, 0.137, 0.137]], [0.141, [0.141, 0.141, 0.141]], [0.143, [0.141, 0.141, 0.141]], [0.145, [0.145, 0.145, 0.145]], [0.147, [0.145, 0.145, 0.145]], [0.149, [0.149, 0.149, 0.149]], [0.151, [0.149, 0.149, 0.149]], [0.153, [0.153, 0.153, 0.153]], [0.155, [0.153, 0.153, 0.153]], [0.157, [0.157, 0.157, 0.157]], [0.159, [0.157, 0.157, 0.157]], [0.160, [0.161, 0.161, 0.161]], [0.162, [0.161, 0.161, 0.161]], [0.164, [0.165, 0.165, 0.165]], [0.166, [0.165, 0.165, 0.165]], [0.168, [0.169, 0.169, 0.169]], [0.170, [0.169, 0.169, 0.169]], [0.172, [0.173, 0.173, 0.173]], [0.174, [0.173, 0.173, 0.173]], [0.176, [0.176, 0.176, 0.176]], [0.178, [0.176, 0.176, 0.176]], [0.180, [0.180, 0.180, 0.180]], [0.182, [0.180, 0.180, 0.180]], [0.184, [0.184, 0.184, 0.184]], [0.186, [0.184, 0.184, 0.184]], [0.188, [0.188, 0.188, 0.188]], [0.190, [0.188, 0.188, 0.188]], [0.192, [0.192, 0.192, 0.192]], [0.194, [0.192, 0.192, 0.192]], [0.196, [0.196, 0.196, 0.196]], [0.198, [0.196, 0.196, 0.196]], [0.200, [0.200, 0.200, 0.200]], [0.202, [0.200, 0.200, 0.200]], [0.204, [0.204, 0.204, 0.204]], [0.205, [0.204, 0.204, 0.204]], [0.207, [0.208, 0.208, 0.208]], [0.209, [0.208, 0.208, 0.208]], [0.211, [0.212, 0.212, 0.212]], [0.213, [0.212, 0.212, 0.212]], [0.215, [0.216, 0.216, 0.216]], [0.217, [0.216, 0.216, 0.216]], [0.219, [0.220, 0.220, 0.220]], [0.221, [0.220, 0.220, 0.220]], [0.223, [0.224, 0.224, 0.224]], [0.225, [0.224, 0.224, 0.224]], [0.227, [0.227, 0.227, 0.227]], [0.229, [0.227, 0.227, 0.227]], [0.231, [0.231, 0.231, 0.231]], [0.233, [0.231, 0.231, 0.231]], [0.235, [0.235, 0.235, 0.235]], [0.237, [0.235, 0.235, 0.235]], [0.239, [0.239, 0.239, 0.239]], [0.241, [0.239, 0.239, 0.239]], [0.243, [0.243, 0.243, 0.243]], [0.245, [0.243, 0.243, 0.243]], [0.247, [0.247, 0.247, 0.247]], [0.249, [0.247, 0.247, 0.247]], [0.250, [0.251, 0.251, 0.251]], [0.252, [0.251, 0.251, 0.251]], [0.254, [0.255, 0.255, 0.255]], [0.256, [0.255, 0.255, 0.255]], [0.258, [0.259, 0.259, 0.259]], [0.260, [0.259, 0.259, 0.259]], [0.262, [0.263, 0.263, 0.263]], [0.264, [0.263, 0.263, 0.263]], [0.266, [0.267, 0.267, 0.267]], [0.268, [0.267, 0.267, 0.267]], [0.270, [0.271, 0.271, 0.271]], [0.272, [0.271, 0.271, 0.271]], [0.274, [0.275, 0.275, 0.275]], [0.276, [0.275, 0.275, 0.275]], [0.278, [0.278, 0.278, 0.278]], [0.280, [0.278, 0.278, 0.278]], [0.282, [0.282, 0.282, 0.282]], [0.284, [0.282, 0.282, 0.282]], [0.286, [0.286, 0.286, 0.286]], [0.288, [0.286, 0.286, 0.286]], [0.290, [0.290, 0.290, 0.290]], [0.292, [0.290, 0.290, 0.290]], [0.294, [0.294, 0.294, 0.294]], [0.295, [0.294, 0.294, 0.294]], [0.297, [0.298, 0.298, 0.298]], [0.299, [0.298, 0.298, 0.298]], [0.301, [0.302, 0.302, 0.302]], [0.303, [0.302, 0.302, 0.302]], [0.305, [0.306, 0.306, 0.306]], [0.307, [0.306, 0.306, 0.306]], [0.309, [0.310, 0.310, 0.310]], [0.311, [0.310, 0.310, 0.310]], [0.313, [0.314, 0.314, 0.314]], [0.315, [0.314, 0.314, 0.314]], [0.317, [0.318, 0.318, 0.318]], [0.319, [0.318, 0.318, 0.318]], [0.321, [0.322, 0.322, 0.322]], [0.323, [0.322, 0.322, 0.322]], [0.325, [0.325, 0.325, 0.325]], [0.327, [0.325, 0.325, 0.325]], [0.329, [0.329, 0.329, 0.329]], [0.331, [0.329, 0.329, 0.329]], [0.333, [0.333, 0.333, 0.333]], [0.335, [0.333, 0.333, 0.333]], [0.337, [0.337, 0.337, 0.337]], [0.339, [0.337, 0.337, 0.337]], [0.341, [0.341, 0.341, 0.341]], [0.342, [0.341, 0.341, 0.341]], [0.344, [0.345, 0.345, 0.345]], [0.346, [0.345, 0.345, 0.345]], [0.348, [0.349, 0.349, 0.349]], [0.350, [0.349, 0.349, 0.349]], [0.352, [0.353, 0.353, 0.353]], [0.354, [0.353, 0.353, 0.353]], [0.356, [0.357, 0.357, 0.357]], [0.358, [0.357, 0.357, 0.357]], [0.360, [0.361, 0.361, 0.361]], [0.362, [0.361, 0.361, 0.361]], [0.364, [0.365, 0.365, 0.365]], [0.366, [0.365, 0.365, 0.365]], [0.368, [0.369, 0.369, 0.369]], [0.370, [0.369, 0.369, 0.369]], [0.372, [0.373, 0.373, 0.373]], [0.374, [0.373, 0.373, 0.373]], [0.376, [0.376, 0.376, 0.376]], [0.378, [0.376, 0.376, 0.376]], [0.380, [0.380, 0.380, 0.380]], [0.382, [0.380, 0.380, 0.380]], [0.384, [0.384, 0.384, 0.384]], [0.386, [0.384, 0.384, 0.384]], [0.387, [0.388, 0.388, 0.388]], [0.389, [0.388, 0.388, 0.388]], [0.391, [0.392, 0.392, 0.392]], [0.393, [0.392, 0.392, 0.392]], [0.395, [0.396, 0.396, 0.396]], [0.397, [0.396, 0.396, 0.396]], [0.399, [0.400, 0.400, 0.400]], [0.401, [0.400, 0.400, 0.400]], [0.403, [0.404, 0.404, 0.404]], [0.405, [0.404, 0.404, 0.404]], [0.407, [0.408, 0.408, 0.408]], [0.409, [0.408, 0.408, 0.408]], [0.411, [0.412, 0.412, 0.412]], [0.413, [0.412, 0.412, 0.412]], [0.415, [0.416, 0.416, 0.416]], [0.417, [0.416, 0.416, 0.416]], [0.419, [0.420, 0.420, 0.420]], [0.421, [0.420, 0.420, 0.420]], [0.423, [0.424, 0.424, 0.424]], [0.425, [0.424, 0.424, 0.424]], [0.427, [0.427, 0.427, 0.427]], [0.429, [0.427, 0.427, 0.427]], [0.431, [0.431, 0.431, 0.431]], [0.432, [0.431, 0.431, 0.431]], [0.434, [0.435, 0.435, 0.435]], [0.436, [0.435, 0.435, 0.435]], [0.438, [0.439, 0.439, 0.439]], [0.440, [0.439, 0.439, 0.439]], [0.442, [0.443, 0.443, 0.443]], [0.444, [0.443, 0.443, 0.443]], [0.446, [0.447, 0.447, 0.447]], [0.448, [0.447, 0.447, 0.447]], [0.450, [0.451, 0.451, 0.451]], [0.452, [0.451, 0.451, 0.451]], [0.454, [0.455, 0.455, 0.455]], [0.456, [0.455, 0.455, 0.455]], [0.458, [0.459, 0.459, 0.459]], [0.460, [0.459, 0.459, 0.459]], [0.462, [0.463, 0.463, 0.463]], [0.464, [0.463, 0.463, 0.463]], [0.466, [0.467, 0.467, 0.467]], [0.468, [0.467, 0.467, 0.467]], [0.470, [0.471, 0.471, 0.471]], [0.472, [0.471, 0.471, 0.471]], [0.474, [0.475, 0.475, 0.475]], [0.476, [0.475, 0.475, 0.475]], [0.477, [0.478, 0.478, 0.478]], [0.479, [0.478, 0.478, 0.478]], [0.481, [0.482, 0.482, 0.482]], [0.483, [0.482, 0.482, 0.482]], [0.485, [0.486, 0.486, 0.486]], [0.487, [0.486, 0.486, 0.486]], [0.489, [0.490, 0.490, 0.490]], [0.491, [0.490, 0.490, 0.490]], [0.493, [0.494, 0.494, 0.494]], [0.495, [0.494, 0.494, 0.494]], [0.497, [0.498, 0.498, 0.498]], [0.499, [0.498, 0.498, 0.498]], [0.501, [0.502, 0.502, 0.502]], [0.503, [0.502, 0.502, 0.502]], [0.505, [0.506, 0.506, 0.506]], [0.507, [0.506, 0.506, 0.506]], [0.509, [0.510, 0.510, 0.510]], [0.511, [0.510, 0.510, 0.510]], [0.513, [0.514, 0.514, 0.514]], [0.515, [0.514, 0.514, 0.514]], [0.517, [0.518, 0.518, 0.518]], [0.519, [0.518, 0.518, 0.518]], [0.521, [0.522, 0.522, 0.522]], [0.523, [0.522, 0.522, 0.522]], [0.524, [0.525, 0.525, 0.525]], [0.526, [0.525, 0.525, 0.525]], [0.528, [0.529, 0.529, 0.529]], [0.530, [0.529, 0.529, 0.529]], [0.532, [0.533, 0.533, 0.533]], [0.534, [0.533, 0.533, 0.533]], [0.536, [0.537, 0.537, 0.537]], [0.538, [0.537, 0.537, 0.537]], [0.540, [0.541, 0.541, 0.541]], [0.542, [0.541, 0.541, 0.541]], [0.544, [0.545, 0.545, 0.545]], [0.546, [0.545, 0.545, 0.545]], [0.548, [0.549, 0.549, 0.549]], [0.550, [0.549, 0.549, 0.549]], [0.552, [0.553, 0.553, 0.553]], [0.554, [0.553, 0.553, 0.553]], [0.556, [0.557, 0.557, 0.557]], [0.558, [0.557, 0.557, 0.557]], [0.560, [0.561, 0.561, 0.561]], [0.562, [0.561, 0.561, 0.561]], [0.564, [0.565, 0.565, 0.565]], [0.566, [0.565, 0.565, 0.565]], [0.568, [0.569, 0.569, 0.569]], [0.569, [0.569, 0.569, 0.569]], [0.571, [0.573, 0.573, 0.573]], [0.573, [0.573, 0.573, 0.573]], [0.575, [0.576, 0.576, 0.576]], [0.577, [0.576, 0.576, 0.576]], [0.579, [0.580, 0.580, 0.580]], [0.581, [0.580, 0.580, 0.580]], [0.583, [0.584, 0.584, 0.584]], [0.585, [0.584, 0.584, 0.584]], [0.587, [0.588, 0.588, 0.588]], [0.589, [0.588, 0.588, 0.588]], [0.591, [0.592, 0.592, 0.592]], [0.593, [0.592, 0.592, 0.592]], [0.595, [0.596, 0.596, 0.596]], [0.597, [0.596, 0.596, 0.596]], [0.599, [0.600, 0.600, 0.600]], [0.601, [0.600, 0.600, 0.600]], [0.603, [0.604, 0.604, 0.604]], [0.605, [0.604, 0.604, 0.604]], [0.607, [0.608, 0.608, 0.608]], [0.609, [0.608, 0.608, 0.608]], [0.611, [0.612, 0.612, 0.612]], [0.613, [0.612, 0.612, 0.612]], [0.614, [0.616, 0.616, 0.616]], [0.616, [0.616, 0.616, 0.616]], [0.618, [0.620, 0.620, 0.620]], [0.620, [0.620, 0.620, 0.620]], [0.622, [0.624, 0.624, 0.624]], [0.624, [0.624, 0.624, 0.624]], [0.626, [0.627, 0.627, 0.627]], [0.628, [0.627, 0.627, 0.627]], [0.630, [0.631, 0.631, 0.631]], [0.632, [0.631, 0.631, 0.631]], [0.634, [0.635, 0.635, 0.635]], [0.636, [0.635, 0.635, 0.635]], [0.638, [0.639, 0.639, 0.639]], [0.640, [0.639, 0.639, 0.639]], [0.642, [0.643, 0.643, 0.643]], [0.644, [0.643, 0.643, 0.643]], [0.646, [0.647, 0.647, 0.647]], [0.648, [0.647, 0.647, 0.647]], [0.650, [0.651, 0.651, 0.651]], [0.652, [0.651, 0.651, 0.651]], [0.654, [0.655, 0.655, 0.655]], [0.656, [0.655, 0.655, 0.655]], [0.658, [0.659, 0.659, 0.659]], [0.659, [0.659, 0.659, 0.659]], [0.661, [0.663, 0.663, 0.663]], [0.663, [0.663, 0.663, 0.663]], [0.665, [0.667, 0.667, 0.667]], [0.667, [0.667, 0.667, 0.667]], [0.669, [0.671, 0.671, 0.671]], [0.671, [0.671, 0.671, 0.671]], [0.673, [0.675, 0.675, 0.675]], [0.675, [0.675, 0.675, 0.675]], [0.677, [0.678, 0.678, 0.678]], [0.679, [0.678, 0.678, 0.678]], [0.681, [0.682, 0.682, 0.682]], [0.683, [0.682, 0.682, 0.682]], [0.685, [0.686, 0.686, 0.686]], [0.687, [0.686, 0.686, 0.686]], [0.689, [0.690, 0.690, 0.690]], [0.691, [0.690, 0.690, 0.690]], [0.693, [0.694, 0.694, 0.694]], [0.695, [0.694, 0.694, 0.694]], [0.697, [0.698, 0.698, 0.698]], [0.699, [0.698, 0.698, 0.698]], [0.701, [0.702, 0.702, 0.702]], [0.703, [0.702, 0.702, 0.702]], [0.705, [0.706, 0.706, 0.706]], [0.706, [0.706, 0.706, 0.706]], [0.708, [0.710, 0.710, 0.710]], [0.710, [0.710, 0.710, 0.710]], [0.712, [0.714, 0.714, 0.714]], [0.714, [0.714, 0.714, 0.714]], [0.716, [0.718, 0.718, 0.718]], [0.718, [0.718, 0.718, 0.718]], [0.720, [0.722, 0.722, 0.722]], [0.722, [0.722, 0.722, 0.722]], [0.724, [0.725, 0.725, 0.725]], [0.726, [0.725, 0.725, 0.725]], [0.728, [0.729, 0.729, 0.729]], [0.730, [0.729, 0.729, 0.729]], [0.732, [0.733, 0.733, 0.733]], [0.734, [0.733, 0.733, 0.733]], [0.736, [0.737, 0.737, 0.737]], [0.738, [0.737, 0.737, 0.737]], [0.740, [0.741, 0.741, 0.741]], [0.742, [0.741, 0.741, 0.741]], [0.744, [0.745, 0.745, 0.745]], [0.746, [0.745, 0.745, 0.745]], [0.748, [0.749, 0.749, 0.749]], [0.750, [0.749, 0.749, 0.749]], [0.751, [0.753, 0.753, 0.753]], [0.753, [0.753, 0.753, 0.753]], [0.755, [0.757, 0.757, 0.757]], [0.757, [0.757, 0.757, 0.757]], [0.759, [0.761, 0.761, 0.761]], [0.761, [0.761, 0.761, 0.761]], [0.763, [0.765, 0.765, 0.765]], [0.765, [0.765, 0.765, 0.765]], [0.767, [0.769, 0.769, 0.769]], [0.769, [0.769, 0.769, 0.769]], [0.771, [0.773, 0.773, 0.773]], [0.773, [0.773, 0.773, 0.773]], [0.775, [0.776, 0.776, 0.776]], [0.777, [0.776, 0.776, 0.776]], [0.779, [0.780, 0.780, 0.780]], [0.781, [0.780, 0.780, 0.780]], [0.783, [0.784, 0.784, 0.784]], [0.785, [0.784, 0.784, 0.784]], [0.787, [0.788, 0.788, 0.788]], [0.789, [0.788, 0.788, 0.788]], [0.791, [0.792, 0.792, 0.792]], [0.793, [0.792, 0.792, 0.792]], [0.795, [0.796, 0.796, 0.796]], [0.796, [0.796, 0.796, 0.796]], [0.798, [0.800, 0.800, 0.800]], [0.800, [0.800, 0.800, 0.800]], [0.802, [0.804, 0.804, 0.804]], [0.804, [0.804, 0.804, 0.804]], [0.806, [0.808, 0.808, 0.808]], [0.808, [0.808, 0.808, 0.808]], [0.810, [0.812, 0.812, 0.812]], [0.812, [0.812, 0.812, 0.812]], [0.814, [0.816, 0.816, 0.816]], [0.816, [0.816, 0.816, 0.816]], [0.818, [0.820, 0.820, 0.820]], [0.820, [0.820, 0.820, 0.820]], [0.822, [0.824, 0.824, 0.824]], [0.824, [0.824, 0.824, 0.824]], [0.826, [0.827, 0.827, 0.827]], [0.828, [0.827, 0.827, 0.827]], [0.830, [0.831, 0.831, 0.831]], [0.832, [0.831, 0.831, 0.831]], [0.834, [0.835, 0.835, 0.835]], [0.836, [0.835, 0.835, 0.835]], [0.838, [0.839, 0.839, 0.839]], [0.840, [0.839, 0.839, 0.839]], [0.841, [0.843, 0.843, 0.843]], [0.843, [0.843, 0.843, 0.843]], [0.845, [0.847, 0.847, 0.847]], [0.847, [0.847, 0.847, 0.847]], [0.849, [0.851, 0.851, 0.851]], [0.851, [0.851, 0.851, 0.851]], [0.853, [0.855, 0.855, 0.855]], [0.855, [0.855, 0.855, 0.855]], [0.857, [0.859, 0.859, 0.859]], [0.859, [0.859, 0.859, 0.859]], [0.861, [0.863, 0.863, 0.863]], [0.863, [0.863, 0.863, 0.863]], [0.865, [0.867, 0.867, 0.867]], [0.867, [0.867, 0.867, 0.867]], [0.869, [0.871, 0.871, 0.871]], [0.871, [0.871, 0.871, 0.871]], [0.873, [0.875, 0.875, 0.875]], [0.875, [0.875, 0.875, 0.875]], [0.877, [0.878, 0.878, 0.878]], [0.879, [0.878, 0.878, 0.878]], [0.881, [0.882, 0.882, 0.882]], [0.883, [0.882, 0.882, 0.882]], [0.885, [0.886, 0.886, 0.886]], [0.886, [0.886, 0.886, 0.886]], [0.888, [0.890, 0.890, 0.890]], [0.890, [0.890, 0.890, 0.890]], [0.892, [0.894, 0.894, 0.894]], [0.894, [0.894, 0.894, 0.894]], [0.896, [0.898, 0.898, 0.898]], [0.898, [0.898, 0.898, 0.898]], [0.900, [0.902, 0.902, 0.902]], [0.902, [0.902, 0.902, 0.902]], [0.904, [0.906, 0.906, 0.906]], [0.906, [0.906, 0.906, 0.906]], [0.908, [0.910, 0.910, 0.910]], [0.910, [0.910, 0.910, 0.910]], [0.912, [0.914, 0.914, 0.914]], [0.914, [0.914, 0.914, 0.914]], [0.916, [0.918, 0.918, 0.918]], [0.918, [0.918, 0.918, 0.918]], [0.920, [0.922, 0.922, 0.922]], [0.922, [0.922, 0.922, 0.922]], [0.924, [0.925, 0.925, 0.925]], [0.926, [0.925, 0.925, 0.925]], [0.928, [0.929, 0.929, 0.929]], [0.930, [0.929, 0.929, 0.929]], [0.932, [0.933, 0.933, 0.933]], [0.933, [0.933, 0.933, 0.933]], [0.935, [0.937, 0.937, 0.937]], [0.937, [0.937, 0.937, 0.937]], [0.939, [0.941, 0.941, 0.941]], [0.941, [0.941, 0.941, 0.941]], [0.943, [0.945, 0.945, 0.945]], [0.945, [0.945, 0.945, 0.945]], [0.947, [0.949, 0.949, 0.949]], [0.949, [0.949, 0.949, 0.949]], [0.951, [0.953, 0.953, 0.953]], [0.953, [0.953, 0.953, 0.953]], [0.955, [0.957, 0.957, 0.957]], [0.957, [0.957, 0.957, 0.957]], [0.959, [0.961, 0.961, 0.961]], [0.961, [0.961, 0.961, 0.961]], [0.963, [0.965, 0.965, 0.965]], [0.965, [0.965, 0.965, 0.965]], [0.967, [0.969, 0.969, 0.969]], [0.969, [0.969, 0.969, 0.969]], [0.971, [0.973, 0.973, 0.973]], [0.973, [0.973, 0.973, 0.973]], [0.975, [0.976, 0.976, 0.976]], [0.977, [0.976, 0.976, 0.976]], [0.978, [0.980, 0.980, 0.980]], [0.980, [0.980, 0.980, 0.980]], [0.982, [0.984, 0.984, 0.984]], [0.984, [0.984, 0.984, 0.984]], [0.986, [0.988, 0.988, 0.988]], [0.988, [0.988, 0.988, 0.988]], [0.990, [0.992, 0.992, 0.992]], [0.992, [0.992, 0.992, 0.992]], [0.994, [0.996, 0.996, 0.996]], [0.996, [0.996, 0.996, 0.996]], [0.998, [1.000, 1.000, 1.000]], [1.000, [1.000, 1.000, 1.000]]]; +var hot = [[0.000, [0.042, 0.000, 0.000]], [0.002, [0.042, 0.000, 0.000]], [0.004, [0.052, 0.000, 0.000]], [0.006, [0.052, 0.000, 0.000]], [0.008, [0.062, 0.000, 0.000]], [0.010, [0.062, 0.000, 0.000]], [0.012, [0.072, 0.000, 0.000]], [0.014, [0.072, 0.000, 0.000]], [0.016, [0.083, 0.000, 0.000]], [0.018, [0.083, 0.000, 0.000]], [0.020, [0.093, 0.000, 0.000]], [0.022, [0.093, 0.000, 0.000]], [0.023, [0.103, 0.000, 0.000]], [0.025, [0.103, 0.000, 0.000]], [0.027, [0.114, 0.000, 0.000]], [0.029, [0.114, 0.000, 0.000]], [0.031, [0.124, 0.000, 0.000]], [0.033, [0.124, 0.000, 0.000]], [0.035, [0.134, 0.000, 0.000]], [0.037, [0.134, 0.000, 0.000]], [0.039, [0.145, 0.000, 0.000]], [0.041, [0.145, 0.000, 0.000]], [0.043, [0.155, 0.000, 0.000]], [0.045, [0.155, 0.000, 0.000]], [0.047, [0.165, 0.000, 0.000]], [0.049, [0.165, 0.000, 0.000]], [0.051, [0.175, 0.000, 0.000]], [0.053, [0.175, 0.000, 0.000]], [0.055, [0.186, 0.000, 0.000]], [0.057, [0.186, 0.000, 0.000]], [0.059, [0.196, 0.000, 0.000]], [0.061, [0.196, 0.000, 0.000]], [0.063, [0.206, 0.000, 0.000]], [0.065, [0.206, 0.000, 0.000]], [0.067, [0.217, 0.000, 0.000]], [0.068, [0.217, 0.000, 0.000]], [0.070, [0.227, 0.000, 0.000]], [0.072, [0.227, 0.000, 0.000]], [0.074, [0.237, 0.000, 0.000]], [0.076, [0.237, 0.000, 0.000]], [0.078, [0.247, 0.000, 0.000]], [0.080, [0.247, 0.000, 0.000]], [0.082, [0.258, 0.000, 0.000]], [0.084, [0.258, 0.000, 0.000]], [0.086, [0.268, 0.000, 0.000]], [0.088, [0.268, 0.000, 0.000]], [0.090, [0.278, 0.000, 0.000]], [0.092, [0.278, 0.000, 0.000]], [0.094, [0.289, 0.000, 0.000]], [0.096, [0.289, 0.000, 0.000]], [0.098, [0.299, 0.000, 0.000]], [0.100, [0.299, 0.000, 0.000]], [0.102, [0.309, 0.000, 0.000]], [0.104, [0.309, 0.000, 0.000]], [0.106, [0.320, 0.000, 0.000]], [0.108, [0.320, 0.000, 0.000]], [0.110, [0.330, 0.000, 0.000]], [0.112, [0.330, 0.000, 0.000]], [0.114, [0.340, 0.000, 0.000]], [0.115, [0.340, 0.000, 0.000]], [0.117, [0.350, 0.000, 0.000]], [0.119, [0.350, 0.000, 0.000]], [0.121, [0.361, 0.000, 0.000]], [0.123, [0.361, 0.000, 0.000]], [0.125, [0.371, 0.000, 0.000]], [0.127, [0.371, 0.000, 0.000]], [0.129, [0.381, 0.000, 0.000]], [0.131, [0.381, 0.000, 0.000]], [0.133, [0.392, 0.000, 0.000]], [0.135, [0.392, 0.000, 0.000]], [0.137, [0.402, 0.000, 0.000]], [0.139, [0.402, 0.000, 0.000]], [0.141, [0.412, 0.000, 0.000]], [0.143, [0.412, 0.000, 0.000]], [0.145, [0.423, 0.000, 0.000]], [0.147, [0.423, 0.000, 0.000]], [0.149, [0.433, 0.000, 0.000]], [0.151, [0.433, 0.000, 0.000]], [0.153, [0.443, 0.000, 0.000]], [0.155, [0.443, 0.000, 0.000]], [0.157, [0.453, 0.000, 0.000]], [0.159, [0.453, 0.000, 0.000]], [0.160, [0.464, 0.000, 0.000]], [0.162, [0.464, 0.000, 0.000]], [0.164, [0.474, 0.000, 0.000]], [0.166, [0.474, 0.000, 0.000]], [0.168, [0.484, 0.000, 0.000]], [0.170, [0.484, 0.000, 0.000]], [0.172, [0.495, 0.000, 0.000]], [0.174, [0.495, 0.000, 0.000]], [0.176, [0.505, 0.000, 0.000]], [0.178, [0.505, 0.000, 0.000]], [0.180, [0.515, 0.000, 0.000]], [0.182, [0.515, 0.000, 0.000]], [0.184, [0.525, 0.000, 0.000]], [0.186, [0.525, 0.000, 0.000]], [0.188, [0.536, 0.000, 0.000]], [0.190, [0.536, 0.000, 0.000]], [0.192, [0.546, 0.000, 0.000]], [0.194, [0.546, 0.000, 0.000]], [0.196, [0.556, 0.000, 0.000]], [0.198, [0.556, 0.000, 0.000]], [0.200, [0.567, 0.000, 0.000]], [0.202, [0.567, 0.000, 0.000]], [0.204, [0.577, 0.000, 0.000]], [0.205, [0.577, 0.000, 0.000]], [0.207, [0.587, 0.000, 0.000]], [0.209, [0.587, 0.000, 0.000]], [0.211, [0.598, 0.000, 0.000]], [0.213, [0.598, 0.000, 0.000]], [0.215, [0.608, 0.000, 0.000]], [0.217, [0.608, 0.000, 0.000]], [0.219, [0.618, 0.000, 0.000]], [0.221, [0.618, 0.000, 0.000]], [0.223, [0.628, 0.000, 0.000]], [0.225, [0.628, 0.000, 0.000]], [0.227, [0.639, 0.000, 0.000]], [0.229, [0.639, 0.000, 0.000]], [0.231, [0.649, 0.000, 0.000]], [0.233, [0.649, 0.000, 0.000]], [0.235, [0.659, 0.000, 0.000]], [0.237, [0.659, 0.000, 0.000]], [0.239, [0.670, 0.000, 0.000]], [0.241, [0.670, 0.000, 0.000]], [0.243, [0.680, 0.000, 0.000]], [0.245, [0.680, 0.000, 0.000]], [0.247, [0.690, 0.000, 0.000]], [0.249, [0.690, 0.000, 0.000]], [0.250, [0.700, 0.000, 0.000]], [0.252, [0.700, 0.000, 0.000]], [0.254, [0.711, 0.000, 0.000]], [0.256, [0.711, 0.000, 0.000]], [0.258, [0.721, 0.000, 0.000]], [0.260, [0.721, 0.000, 0.000]], [0.262, [0.731, 0.000, 0.000]], [0.264, [0.731, 0.000, 0.000]], [0.266, [0.742, 0.000, 0.000]], [0.268, [0.742, 0.000, 0.000]], [0.270, [0.752, 0.000, 0.000]], [0.272, [0.752, 0.000, 0.000]], [0.274, [0.762, 0.000, 0.000]], [0.276, [0.762, 0.000, 0.000]], [0.278, [0.773, 0.000, 0.000]], [0.280, [0.773, 0.000, 0.000]], [0.282, [0.783, 0.000, 0.000]], [0.284, [0.783, 0.000, 0.000]], [0.286, [0.793, 0.000, 0.000]], [0.288, [0.793, 0.000, 0.000]], [0.290, [0.803, 0.000, 0.000]], [0.292, [0.803, 0.000, 0.000]], [0.294, [0.814, 0.000, 0.000]], [0.295, [0.814, 0.000, 0.000]], [0.297, [0.824, 0.000, 0.000]], [0.299, [0.824, 0.000, 0.000]], [0.301, [0.834, 0.000, 0.000]], [0.303, [0.834, 0.000, 0.000]], [0.305, [0.845, 0.000, 0.000]], [0.307, [0.845, 0.000, 0.000]], [0.309, [0.855, 0.000, 0.000]], [0.311, [0.855, 0.000, 0.000]], [0.313, [0.865, 0.000, 0.000]], [0.315, [0.865, 0.000, 0.000]], [0.317, [0.875, 0.000, 0.000]], [0.319, [0.875, 0.000, 0.000]], [0.321, [0.886, 0.000, 0.000]], [0.323, [0.886, 0.000, 0.000]], [0.325, [0.896, 0.000, 0.000]], [0.327, [0.896, 0.000, 0.000]], [0.329, [0.906, 0.000, 0.000]], [0.331, [0.906, 0.000, 0.000]], [0.333, [0.917, 0.000, 0.000]], [0.335, [0.917, 0.000, 0.000]], [0.337, [0.927, 0.000, 0.000]], [0.339, [0.927, 0.000, 0.000]], [0.341, [0.937, 0.000, 0.000]], [0.342, [0.937, 0.000, 0.000]], [0.344, [0.948, 0.000, 0.000]], [0.346, [0.948, 0.000, 0.000]], [0.348, [0.958, 0.000, 0.000]], [0.350, [0.958, 0.000, 0.000]], [0.352, [0.968, 0.000, 0.000]], [0.354, [0.968, 0.000, 0.000]], [0.356, [0.978, 0.000, 0.000]], [0.358, [0.978, 0.000, 0.000]], [0.360, [0.989, 0.000, 0.000]], [0.362, [0.989, 0.000, 0.000]], [0.364, [0.999, 0.000, 0.000]], [0.366, [0.999, 0.000, 0.000]], [0.368, [1.000, 0.009, 0.000]], [0.370, [1.000, 0.009, 0.000]], [0.372, [1.000, 0.020, 0.000]], [0.374, [1.000, 0.020, 0.000]], [0.376, [1.000, 0.030, 0.000]], [0.378, [1.000, 0.030, 0.000]], [0.380, [1.000, 0.040, 0.000]], [0.382, [1.000, 0.040, 0.000]], [0.384, [1.000, 0.050, 0.000]], [0.386, [1.000, 0.050, 0.000]], [0.387, [1.000, 0.061, 0.000]], [0.389, [1.000, 0.061, 0.000]], [0.391, [1.000, 0.071, 0.000]], [0.393, [1.000, 0.071, 0.000]], [0.395, [1.000, 0.081, 0.000]], [0.397, [1.000, 0.081, 0.000]], [0.399, [1.000, 0.092, 0.000]], [0.401, [1.000, 0.092, 0.000]], [0.403, [1.000, 0.102, 0.000]], [0.405, [1.000, 0.102, 0.000]], [0.407, [1.000, 0.112, 0.000]], [0.409, [1.000, 0.112, 0.000]], [0.411, [1.000, 0.123, 0.000]], [0.413, [1.000, 0.123, 0.000]], [0.415, [1.000, 0.133, 0.000]], [0.417, [1.000, 0.133, 0.000]], [0.419, [1.000, 0.143, 0.000]], [0.421, [1.000, 0.143, 0.000]], [0.423, [1.000, 0.153, 0.000]], [0.425, [1.000, 0.153, 0.000]], [0.427, [1.000, 0.164, 0.000]], [0.429, [1.000, 0.164, 0.000]], [0.431, [1.000, 0.174, 0.000]], [0.432, [1.000, 0.174, 0.000]], [0.434, [1.000, 0.184, 0.000]], [0.436, [1.000, 0.184, 0.000]], [0.438, [1.000, 0.195, 0.000]], [0.440, [1.000, 0.195, 0.000]], [0.442, [1.000, 0.205, 0.000]], [0.444, [1.000, 0.205, 0.000]], [0.446, [1.000, 0.215, 0.000]], [0.448, [1.000, 0.215, 0.000]], [0.450, [1.000, 0.225, 0.000]], [0.452, [1.000, 0.225, 0.000]], [0.454, [1.000, 0.236, 0.000]], [0.456, [1.000, 0.236, 0.000]], [0.458, [1.000, 0.246, 0.000]], [0.460, [1.000, 0.246, 0.000]], [0.462, [1.000, 0.256, 0.000]], [0.464, [1.000, 0.256, 0.000]], [0.466, [1.000, 0.267, 0.000]], [0.468, [1.000, 0.267, 0.000]], [0.470, [1.000, 0.277, 0.000]], [0.472, [1.000, 0.277, 0.000]], [0.474, [1.000, 0.287, 0.000]], [0.476, [1.000, 0.287, 0.000]], [0.477, [1.000, 0.298, 0.000]], [0.479, [1.000, 0.298, 0.000]], [0.481, [1.000, 0.308, 0.000]], [0.483, [1.000, 0.308, 0.000]], [0.485, [1.000, 0.318, 0.000]], [0.487, [1.000, 0.318, 0.000]], [0.489, [1.000, 0.328, 0.000]], [0.491, [1.000, 0.328, 0.000]], [0.493, [1.000, 0.339, 0.000]], [0.495, [1.000, 0.339, 0.000]], [0.497, [1.000, 0.349, 0.000]], [0.499, [1.000, 0.349, 0.000]], [0.501, [1.000, 0.359, 0.000]], [0.503, [1.000, 0.359, 0.000]], [0.505, [1.000, 0.370, 0.000]], [0.507, [1.000, 0.370, 0.000]], [0.509, [1.000, 0.380, 0.000]], [0.511, [1.000, 0.380, 0.000]], [0.513, [1.000, 0.390, 0.000]], [0.515, [1.000, 0.390, 0.000]], [0.517, [1.000, 0.400, 0.000]], [0.519, [1.000, 0.400, 0.000]], [0.521, [1.000, 0.411, 0.000]], [0.523, [1.000, 0.411, 0.000]], [0.524, [1.000, 0.421, 0.000]], [0.526, [1.000, 0.421, 0.000]], [0.528, [1.000, 0.431, 0.000]], [0.530, [1.000, 0.431, 0.000]], [0.532, [1.000, 0.442, 0.000]], [0.534, [1.000, 0.442, 0.000]], [0.536, [1.000, 0.452, 0.000]], [0.538, [1.000, 0.452, 0.000]], [0.540, [1.000, 0.462, 0.000]], [0.542, [1.000, 0.462, 0.000]], [0.544, [1.000, 0.473, 0.000]], [0.546, [1.000, 0.473, 0.000]], [0.548, [1.000, 0.483, 0.000]], [0.550, [1.000, 0.483, 0.000]], [0.552, [1.000, 0.493, 0.000]], [0.554, [1.000, 0.493, 0.000]], [0.556, [1.000, 0.503, 0.000]], [0.558, [1.000, 0.503, 0.000]], [0.560, [1.000, 0.514, 0.000]], [0.562, [1.000, 0.514, 0.000]], [0.564, [1.000, 0.524, 0.000]], [0.566, [1.000, 0.524, 0.000]], [0.568, [1.000, 0.534, 0.000]], [0.569, [1.000, 0.534, 0.000]], [0.571, [1.000, 0.545, 0.000]], [0.573, [1.000, 0.545, 0.000]], [0.575, [1.000, 0.555, 0.000]], [0.577, [1.000, 0.555, 0.000]], [0.579, [1.000, 0.565, 0.000]], [0.581, [1.000, 0.565, 0.000]], [0.583, [1.000, 0.575, 0.000]], [0.585, [1.000, 0.575, 0.000]], [0.587, [1.000, 0.586, 0.000]], [0.589, [1.000, 0.586, 0.000]], [0.591, [1.000, 0.596, 0.000]], [0.593, [1.000, 0.596, 0.000]], [0.595, [1.000, 0.606, 0.000]], [0.597, [1.000, 0.606, 0.000]], [0.599, [1.000, 0.617, 0.000]], [0.601, [1.000, 0.617, 0.000]], [0.603, [1.000, 0.627, 0.000]], [0.605, [1.000, 0.627, 0.000]], [0.607, [1.000, 0.637, 0.000]], [0.609, [1.000, 0.637, 0.000]], [0.611, [1.000, 0.648, 0.000]], [0.613, [1.000, 0.648, 0.000]], [0.614, [1.000, 0.658, 0.000]], [0.616, [1.000, 0.658, 0.000]], [0.618, [1.000, 0.668, 0.000]], [0.620, [1.000, 0.668, 0.000]], [0.622, [1.000, 0.678, 0.000]], [0.624, [1.000, 0.678, 0.000]], [0.626, [1.000, 0.689, 0.000]], [0.628, [1.000, 0.689, 0.000]], [0.630, [1.000, 0.699, 0.000]], [0.632, [1.000, 0.699, 0.000]], [0.634, [1.000, 0.709, 0.000]], [0.636, [1.000, 0.709, 0.000]], [0.638, [1.000, 0.720, 0.000]], [0.640, [1.000, 0.720, 0.000]], [0.642, [1.000, 0.730, 0.000]], [0.644, [1.000, 0.730, 0.000]], [0.646, [1.000, 0.740, 0.000]], [0.648, [1.000, 0.740, 0.000]], [0.650, [1.000, 0.750, 0.000]], [0.652, [1.000, 0.750, 0.000]], [0.654, [1.000, 0.761, 0.000]], [0.656, [1.000, 0.761, 0.000]], [0.658, [1.000, 0.771, 0.000]], [0.659, [1.000, 0.771, 0.000]], [0.661, [1.000, 0.781, 0.000]], [0.663, [1.000, 0.781, 0.000]], [0.665, [1.000, 0.792, 0.000]], [0.667, [1.000, 0.792, 0.000]], [0.669, [1.000, 0.802, 0.000]], [0.671, [1.000, 0.802, 0.000]], [0.673, [1.000, 0.812, 0.000]], [0.675, [1.000, 0.812, 0.000]], [0.677, [1.000, 0.823, 0.000]], [0.679, [1.000, 0.823, 0.000]], [0.681, [1.000, 0.833, 0.000]], [0.683, [1.000, 0.833, 0.000]], [0.685, [1.000, 0.843, 0.000]], [0.687, [1.000, 0.843, 0.000]], [0.689, [1.000, 0.853, 0.000]], [0.691, [1.000, 0.853, 0.000]], [0.693, [1.000, 0.864, 0.000]], [0.695, [1.000, 0.864, 0.000]], [0.697, [1.000, 0.874, 0.000]], [0.699, [1.000, 0.874, 0.000]], [0.701, [1.000, 0.884, 0.000]], [0.703, [1.000, 0.884, 0.000]], [0.705, [1.000, 0.895, 0.000]], [0.706, [1.000, 0.895, 0.000]], [0.708, [1.000, 0.905, 0.000]], [0.710, [1.000, 0.905, 0.000]], [0.712, [1.000, 0.915, 0.000]], [0.714, [1.000, 0.915, 0.000]], [0.716, [1.000, 0.925, 0.000]], [0.718, [1.000, 0.925, 0.000]], [0.720, [1.000, 0.936, 0.000]], [0.722, [1.000, 0.936, 0.000]], [0.724, [1.000, 0.946, 0.000]], [0.726, [1.000, 0.946, 0.000]], [0.728, [1.000, 0.956, 0.000]], [0.730, [1.000, 0.956, 0.000]], [0.732, [1.000, 0.967, 0.000]], [0.734, [1.000, 0.967, 0.000]], [0.736, [1.000, 0.977, 0.000]], [0.738, [1.000, 0.977, 0.000]], [0.740, [1.000, 0.987, 0.000]], [0.742, [1.000, 0.987, 0.000]], [0.744, [1.000, 0.998, 0.000]], [0.746, [1.000, 0.998, 0.000]], [0.748, [1.000, 1.000, 0.012]], [0.750, [1.000, 1.000, 0.012]], [0.751, [1.000, 1.000, 0.027]], [0.753, [1.000, 1.000, 0.027]], [0.755, [1.000, 1.000, 0.043]], [0.757, [1.000, 1.000, 0.043]], [0.759, [1.000, 1.000, 0.058]], [0.761, [1.000, 1.000, 0.058]], [0.763, [1.000, 1.000, 0.074]], [0.765, [1.000, 1.000, 0.074]], [0.767, [1.000, 1.000, 0.089]], [0.769, [1.000, 1.000, 0.089]], [0.771, [1.000, 1.000, 0.104]], [0.773, [1.000, 1.000, 0.104]], [0.775, [1.000, 1.000, 0.120]], [0.777, [1.000, 1.000, 0.120]], [0.779, [1.000, 1.000, 0.135]], [0.781, [1.000, 1.000, 0.135]], [0.783, [1.000, 1.000, 0.151]], [0.785, [1.000, 1.000, 0.151]], [0.787, [1.000, 1.000, 0.166]], [0.789, [1.000, 1.000, 0.166]], [0.791, [1.000, 1.000, 0.182]], [0.793, [1.000, 1.000, 0.182]], [0.795, [1.000, 1.000, 0.197]], [0.796, [1.000, 1.000, 0.197]], [0.798, [1.000, 1.000, 0.212]], [0.800, [1.000, 1.000, 0.212]], [0.802, [1.000, 1.000, 0.228]], [0.804, [1.000, 1.000, 0.228]], [0.806, [1.000, 1.000, 0.243]], [0.808, [1.000, 1.000, 0.243]], [0.810, [1.000, 1.000, 0.259]], [0.812, [1.000, 1.000, 0.259]], [0.814, [1.000, 1.000, 0.274]], [0.816, [1.000, 1.000, 0.274]], [0.818, [1.000, 1.000, 0.290]], [0.820, [1.000, 1.000, 0.290]], [0.822, [1.000, 1.000, 0.305]], [0.824, [1.000, 1.000, 0.305]], [0.826, [1.000, 1.000, 0.321]], [0.828, [1.000, 1.000, 0.321]], [0.830, [1.000, 1.000, 0.336]], [0.832, [1.000, 1.000, 0.336]], [0.834, [1.000, 1.000, 0.351]], [0.836, [1.000, 1.000, 0.351]], [0.838, [1.000, 1.000, 0.367]], [0.840, [1.000, 1.000, 0.367]], [0.841, [1.000, 1.000, 0.382]], [0.843, [1.000, 1.000, 0.382]], [0.845, [1.000, 1.000, 0.398]], [0.847, [1.000, 1.000, 0.398]], [0.849, [1.000, 1.000, 0.413]], [0.851, [1.000, 1.000, 0.413]], [0.853, [1.000, 1.000, 0.429]], [0.855, [1.000, 1.000, 0.429]], [0.857, [1.000, 1.000, 0.444]], [0.859, [1.000, 1.000, 0.444]], [0.861, [1.000, 1.000, 0.460]], [0.863, [1.000, 1.000, 0.460]], [0.865, [1.000, 1.000, 0.475]], [0.867, [1.000, 1.000, 0.475]], [0.869, [1.000, 1.000, 0.490]], [0.871, [1.000, 1.000, 0.490]], [0.873, [1.000, 1.000, 0.506]], [0.875, [1.000, 1.000, 0.506]], [0.877, [1.000, 1.000, 0.521]], [0.879, [1.000, 1.000, 0.521]], [0.881, [1.000, 1.000, 0.537]], [0.883, [1.000, 1.000, 0.537]], [0.885, [1.000, 1.000, 0.552]], [0.886, [1.000, 1.000, 0.552]], [0.888, [1.000, 1.000, 0.568]], [0.890, [1.000, 1.000, 0.568]], [0.892, [1.000, 1.000, 0.583]], [0.894, [1.000, 1.000, 0.583]], [0.896, [1.000, 1.000, 0.599]], [0.898, [1.000, 1.000, 0.599]], [0.900, [1.000, 1.000, 0.614]], [0.902, [1.000, 1.000, 0.614]], [0.904, [1.000, 1.000, 0.629]], [0.906, [1.000, 1.000, 0.629]], [0.908, [1.000, 1.000, 0.645]], [0.910, [1.000, 1.000, 0.645]], [0.912, [1.000, 1.000, 0.660]], [0.914, [1.000, 1.000, 0.660]], [0.916, [1.000, 1.000, 0.676]], [0.918, [1.000, 1.000, 0.676]], [0.920, [1.000, 1.000, 0.691]], [0.922, [1.000, 1.000, 0.691]], [0.924, [1.000, 1.000, 0.707]], [0.926, [1.000, 1.000, 0.707]], [0.928, [1.000, 1.000, 0.722]], [0.930, [1.000, 1.000, 0.722]], [0.932, [1.000, 1.000, 0.737]], [0.933, [1.000, 1.000, 0.737]], [0.935, [1.000, 1.000, 0.753]], [0.937, [1.000, 1.000, 0.753]], [0.939, [1.000, 1.000, 0.768]], [0.941, [1.000, 1.000, 0.768]], [0.943, [1.000, 1.000, 0.784]], [0.945, [1.000, 1.000, 0.784]], [0.947, [1.000, 1.000, 0.799]], [0.949, [1.000, 1.000, 0.799]], [0.951, [1.000, 1.000, 0.815]], [0.953, [1.000, 1.000, 0.815]], [0.955, [1.000, 1.000, 0.830]], [0.957, [1.000, 1.000, 0.830]], [0.959, [1.000, 1.000, 0.846]], [0.961, [1.000, 1.000, 0.846]], [0.963, [1.000, 1.000, 0.861]], [0.965, [1.000, 1.000, 0.861]], [0.967, [1.000, 1.000, 0.876]], [0.969, [1.000, 1.000, 0.876]], [0.971, [1.000, 1.000, 0.892]], [0.973, [1.000, 1.000, 0.892]], [0.975, [1.000, 1.000, 0.907]], [0.977, [1.000, 1.000, 0.907]], [0.978, [1.000, 1.000, 0.923]], [0.980, [1.000, 1.000, 0.923]], [0.982, [1.000, 1.000, 0.938]], [0.984, [1.000, 1.000, 0.938]], [0.986, [1.000, 1.000, 0.954]], [0.988, [1.000, 1.000, 0.954]], [0.990, [1.000, 1.000, 0.969]], [0.992, [1.000, 1.000, 0.969]], [0.994, [1.000, 1.000, 0.985]], [0.996, [1.000, 1.000, 0.985]], [0.998, [1.000, 1.000, 1.000]], [1.000, [1.000, 1.000, 1.000]]]; +var pink = [[0.000, [0.118, 0.000, 0.000]], [0.002, [0.118, 0.000, 0.000]], [0.004, [0.137, 0.025, 0.025]], [0.006, [0.137, 0.025, 0.025]], [0.008, [0.156, 0.051, 0.051]], [0.010, [0.156, 0.051, 0.051]], [0.012, [0.176, 0.076, 0.076]], [0.014, [0.176, 0.076, 0.076]], [0.016, [0.195, 0.102, 0.102]], [0.018, [0.195, 0.102, 0.102]], [0.020, [0.209, 0.113, 0.113]], [0.022, [0.209, 0.113, 0.113]], [0.023, [0.222, 0.123, 0.123]], [0.025, [0.222, 0.123, 0.123]], [0.027, [0.236, 0.134, 0.134]], [0.029, [0.236, 0.134, 0.134]], [0.031, [0.249, 0.144, 0.144]], [0.033, [0.249, 0.144, 0.144]], [0.035, [0.261, 0.153, 0.153]], [0.037, [0.261, 0.153, 0.153]], [0.039, [0.272, 0.161, 0.161]], [0.041, [0.272, 0.161, 0.161]], [0.043, [0.283, 0.169, 0.169]], [0.045, [0.283, 0.169, 0.169]], [0.047, [0.294, 0.177, 0.177]], [0.049, [0.294, 0.177, 0.177]], [0.051, [0.304, 0.184, 0.184]], [0.053, [0.304, 0.184, 0.184]], [0.055, [0.313, 0.191, 0.191]], [0.057, [0.313, 0.191, 0.191]], [0.059, [0.323, 0.198, 0.198]], [0.061, [0.323, 0.198, 0.198]], [0.063, [0.332, 0.204, 0.204]], [0.065, [0.332, 0.204, 0.204]], [0.067, [0.341, 0.211, 0.211]], [0.068, [0.341, 0.211, 0.211]], [0.070, [0.350, 0.217, 0.217]], [0.072, [0.350, 0.217, 0.217]], [0.074, [0.358, 0.223, 0.223]], [0.076, [0.358, 0.223, 0.223]], [0.078, [0.367, 0.229, 0.229]], [0.080, [0.367, 0.229, 0.229]], [0.082, [0.375, 0.234, 0.234]], [0.084, [0.375, 0.234, 0.234]], [0.086, [0.383, 0.240, 0.240]], [0.088, [0.383, 0.240, 0.240]], [0.090, [0.391, 0.245, 0.245]], [0.092, [0.391, 0.245, 0.245]], [0.094, [0.399, 0.250, 0.250]], [0.096, [0.399, 0.250, 0.250]], [0.098, [0.406, 0.256, 0.256]], [0.100, [0.406, 0.256, 0.256]], [0.102, [0.413, 0.261, 0.261]], [0.104, [0.413, 0.261, 0.261]], [0.106, [0.421, 0.266, 0.266]], [0.108, [0.421, 0.266, 0.266]], [0.110, [0.428, 0.271, 0.271]], [0.112, [0.428, 0.271, 0.271]], [0.114, [0.435, 0.275, 0.275]], [0.115, [0.435, 0.275, 0.275]], [0.117, [0.442, 0.280, 0.280]], [0.119, [0.442, 0.280, 0.280]], [0.121, [0.448, 0.285, 0.285]], [0.123, [0.448, 0.285, 0.285]], [0.125, [0.455, 0.289, 0.289]], [0.127, [0.455, 0.289, 0.289]], [0.129, [0.462, 0.294, 0.294]], [0.131, [0.462, 0.294, 0.294]], [0.133, [0.468, 0.298, 0.298]], [0.135, [0.468, 0.298, 0.298]], [0.137, [0.475, 0.302, 0.302]], [0.139, [0.475, 0.302, 0.302]], [0.141, [0.481, 0.307, 0.307]], [0.143, [0.481, 0.307, 0.307]], [0.145, [0.487, 0.311, 0.311]], [0.147, [0.487, 0.311, 0.311]], [0.149, [0.493, 0.315, 0.315]], [0.151, [0.493, 0.315, 0.315]], [0.153, [0.500, 0.319, 0.319]], [0.155, [0.500, 0.319, 0.319]], [0.157, [0.506, 0.323, 0.323]], [0.159, [0.506, 0.323, 0.323]], [0.160, [0.512, 0.327, 0.327]], [0.162, [0.512, 0.327, 0.327]], [0.164, [0.517, 0.331, 0.331]], [0.166, [0.517, 0.331, 0.331]], [0.168, [0.523, 0.335, 0.335]], [0.170, [0.523, 0.335, 0.335]], [0.172, [0.529, 0.339, 0.339]], [0.174, [0.529, 0.339, 0.339]], [0.176, [0.535, 0.343, 0.343]], [0.178, [0.535, 0.343, 0.343]], [0.180, [0.540, 0.347, 0.347]], [0.182, [0.540, 0.347, 0.347]], [0.184, [0.546, 0.350, 0.350]], [0.186, [0.546, 0.350, 0.350]], [0.188, [0.551, 0.354, 0.354]], [0.190, [0.551, 0.354, 0.354]], [0.192, [0.557, 0.358, 0.358]], [0.194, [0.557, 0.358, 0.358]], [0.196, [0.562, 0.361, 0.361]], [0.198, [0.562, 0.361, 0.361]], [0.200, [0.568, 0.365, 0.365]], [0.202, [0.568, 0.365, 0.365]], [0.204, [0.573, 0.369, 0.369]], [0.205, [0.573, 0.369, 0.369]], [0.207, [0.578, 0.372, 0.372]], [0.209, [0.578, 0.372, 0.372]], [0.211, [0.583, 0.376, 0.376]], [0.213, [0.583, 0.376, 0.376]], [0.215, [0.588, 0.379, 0.379]], [0.217, [0.588, 0.379, 0.379]], [0.219, [0.594, 0.383, 0.383]], [0.221, [0.594, 0.383, 0.383]], [0.223, [0.599, 0.386, 0.386]], [0.225, [0.599, 0.386, 0.386]], [0.227, [0.604, 0.389, 0.389]], [0.229, [0.604, 0.389, 0.389]], [0.231, [0.609, 0.393, 0.393]], [0.233, [0.609, 0.393, 0.393]], [0.235, [0.614, 0.396, 0.396]], [0.237, [0.614, 0.396, 0.396]], [0.239, [0.619, 0.399, 0.399]], [0.241, [0.619, 0.399, 0.399]], [0.243, [0.623, 0.403, 0.403]], [0.245, [0.623, 0.403, 0.403]], [0.247, [0.628, 0.406, 0.406]], [0.249, [0.628, 0.406, 0.406]], [0.250, [0.633, 0.409, 0.409]], [0.252, [0.633, 0.409, 0.409]], [0.254, [0.638, 0.412, 0.412]], [0.256, [0.638, 0.412, 0.412]], [0.258, [0.643, 0.415, 0.415]], [0.260, [0.643, 0.415, 0.415]], [0.262, [0.647, 0.418, 0.418]], [0.264, [0.647, 0.418, 0.418]], [0.266, [0.652, 0.422, 0.422]], [0.268, [0.652, 0.422, 0.422]], [0.270, [0.657, 0.425, 0.425]], [0.272, [0.657, 0.425, 0.425]], [0.274, [0.661, 0.428, 0.428]], [0.276, [0.661, 0.428, 0.428]], [0.278, [0.666, 0.431, 0.431]], [0.280, [0.666, 0.431, 0.431]], [0.282, [0.670, 0.434, 0.434]], [0.284, [0.670, 0.434, 0.434]], [0.286, [0.675, 0.437, 0.437]], [0.288, [0.675, 0.437, 0.437]], [0.290, [0.679, 0.440, 0.440]], [0.292, [0.679, 0.440, 0.440]], [0.294, [0.684, 0.443, 0.443]], [0.295, [0.684, 0.443, 0.443]], [0.297, [0.688, 0.446, 0.446]], [0.299, [0.688, 0.446, 0.446]], [0.301, [0.692, 0.449, 0.449]], [0.303, [0.692, 0.449, 0.449]], [0.305, [0.697, 0.452, 0.452]], [0.307, [0.697, 0.452, 0.452]], [0.309, [0.701, 0.454, 0.454]], [0.311, [0.701, 0.454, 0.454]], [0.313, [0.705, 0.457, 0.457]], [0.315, [0.705, 0.457, 0.457]], [0.317, [0.710, 0.460, 0.460]], [0.319, [0.710, 0.460, 0.460]], [0.321, [0.714, 0.463, 0.463]], [0.323, [0.714, 0.463, 0.463]], [0.325, [0.718, 0.466, 0.466]], [0.327, [0.718, 0.466, 0.466]], [0.329, [0.722, 0.469, 0.469]], [0.331, [0.722, 0.469, 0.469]], [0.333, [0.726, 0.471, 0.471]], [0.335, [0.726, 0.471, 0.471]], [0.337, [0.731, 0.474, 0.474]], [0.339, [0.731, 0.474, 0.474]], [0.341, [0.735, 0.477, 0.477]], [0.342, [0.735, 0.477, 0.477]], [0.344, [0.739, 0.480, 0.480]], [0.346, [0.739, 0.480, 0.480]], [0.348, [0.743, 0.482, 0.482]], [0.350, [0.743, 0.482, 0.482]], [0.352, [0.747, 0.485, 0.485]], [0.354, [0.747, 0.485, 0.485]], [0.356, [0.751, 0.488, 0.488]], [0.358, [0.751, 0.488, 0.488]], [0.360, [0.755, 0.490, 0.490]], [0.362, [0.755, 0.490, 0.490]], [0.364, [0.759, 0.493, 0.493]], [0.366, [0.759, 0.493, 0.493]], [0.368, [0.761, 0.499, 0.496]], [0.370, [0.761, 0.499, 0.496]], [0.372, [0.763, 0.505, 0.498]], [0.374, [0.763, 0.505, 0.498]], [0.376, [0.764, 0.511, 0.501]], [0.378, [0.764, 0.511, 0.501]], [0.380, [0.766, 0.517, 0.504]], [0.382, [0.766, 0.517, 0.504]], [0.384, [0.768, 0.522, 0.506]], [0.386, [0.768, 0.522, 0.506]], [0.387, [0.770, 0.528, 0.509]], [0.389, [0.770, 0.528, 0.509]], [0.391, [0.771, 0.534, 0.511]], [0.393, [0.771, 0.534, 0.511]], [0.395, [0.773, 0.540, 0.514]], [0.397, [0.773, 0.540, 0.514]], [0.399, [0.775, 0.545, 0.516]], [0.401, [0.775, 0.545, 0.516]], [0.403, [0.776, 0.551, 0.519]], [0.405, [0.776, 0.551, 0.519]], [0.407, [0.778, 0.556, 0.521]], [0.409, [0.778, 0.556, 0.521]], [0.411, [0.780, 0.562, 0.524]], [0.413, [0.780, 0.562, 0.524]], [0.415, [0.781, 0.567, 0.526]], [0.417, [0.781, 0.567, 0.526]], [0.419, [0.783, 0.572, 0.529]], [0.421, [0.783, 0.572, 0.529]], [0.423, [0.785, 0.577, 0.531]], [0.425, [0.785, 0.577, 0.531]], [0.427, [0.786, 0.583, 0.534]], [0.429, [0.786, 0.583, 0.534]], [0.431, [0.788, 0.588, 0.536]], [0.432, [0.788, 0.588, 0.536]], [0.434, [0.790, 0.593, 0.539]], [0.436, [0.790, 0.593, 0.539]], [0.438, [0.791, 0.598, 0.541]], [0.440, [0.791, 0.598, 0.541]], [0.442, [0.793, 0.603, 0.544]], [0.444, [0.793, 0.603, 0.544]], [0.446, [0.795, 0.608, 0.546]], [0.448, [0.795, 0.608, 0.546]], [0.450, [0.796, 0.613, 0.548]], [0.452, [0.796, 0.613, 0.548]], [0.454, [0.798, 0.618, 0.551]], [0.456, [0.798, 0.618, 0.551]], [0.458, [0.800, 0.623, 0.553]], [0.460, [0.800, 0.623, 0.553]], [0.462, [0.801, 0.628, 0.555]], [0.464, [0.801, 0.628, 0.555]], [0.466, [0.803, 0.632, 0.558]], [0.468, [0.803, 0.632, 0.558]], [0.470, [0.804, 0.637, 0.560]], [0.472, [0.804, 0.637, 0.560]], [0.474, [0.806, 0.642, 0.562]], [0.476, [0.806, 0.642, 0.562]], [0.477, [0.808, 0.647, 0.565]], [0.479, [0.808, 0.647, 0.565]], [0.481, [0.809, 0.651, 0.567]], [0.483, [0.809, 0.651, 0.567]], [0.485, [0.811, 0.656, 0.569]], [0.487, [0.811, 0.656, 0.569]], [0.489, [0.812, 0.660, 0.572]], [0.491, [0.812, 0.660, 0.572]], [0.493, [0.814, 0.665, 0.574]], [0.495, [0.814, 0.665, 0.574]], [0.497, [0.816, 0.670, 0.576]], [0.499, [0.816, 0.670, 0.576]], [0.501, [0.817, 0.674, 0.578]], [0.503, [0.817, 0.674, 0.578]], [0.505, [0.819, 0.679, 0.581]], [0.507, [0.819, 0.679, 0.581]], [0.509, [0.820, 0.683, 0.583]], [0.511, [0.820, 0.683, 0.583]], [0.513, [0.822, 0.687, 0.585]], [0.515, [0.822, 0.687, 0.585]], [0.517, [0.824, 0.692, 0.587]], [0.519, [0.824, 0.692, 0.587]], [0.521, [0.825, 0.696, 0.590]], [0.523, [0.825, 0.696, 0.590]], [0.524, [0.827, 0.700, 0.592]], [0.526, [0.827, 0.700, 0.592]], [0.528, [0.828, 0.705, 0.594]], [0.530, [0.828, 0.705, 0.594]], [0.532, [0.830, 0.709, 0.596]], [0.534, [0.830, 0.709, 0.596]], [0.536, [0.832, 0.713, 0.598]], [0.538, [0.832, 0.713, 0.598]], [0.540, [0.833, 0.718, 0.601]], [0.542, [0.833, 0.718, 0.601]], [0.544, [0.835, 0.722, 0.603]], [0.546, [0.835, 0.722, 0.603]], [0.548, [0.836, 0.726, 0.605]], [0.550, [0.836, 0.726, 0.605]], [0.552, [0.838, 0.730, 0.607]], [0.554, [0.838, 0.730, 0.607]], [0.556, [0.839, 0.734, 0.609]], [0.558, [0.839, 0.734, 0.609]], [0.560, [0.841, 0.738, 0.611]], [0.562, [0.841, 0.738, 0.611]], [0.564, [0.842, 0.742, 0.614]], [0.566, [0.842, 0.742, 0.614]], [0.568, [0.844, 0.746, 0.616]], [0.569, [0.844, 0.746, 0.616]], [0.571, [0.846, 0.750, 0.618]], [0.573, [0.846, 0.750, 0.618]], [0.575, [0.847, 0.754, 0.620]], [0.577, [0.847, 0.754, 0.620]], [0.579, [0.849, 0.758, 0.622]], [0.581, [0.849, 0.758, 0.622]], [0.583, [0.850, 0.762, 0.624]], [0.585, [0.850, 0.762, 0.624]], [0.587, [0.852, 0.766, 0.626]], [0.589, [0.852, 0.766, 0.626]], [0.591, [0.853, 0.770, 0.628]], [0.593, [0.853, 0.770, 0.628]], [0.595, [0.855, 0.774, 0.630]], [0.597, [0.855, 0.774, 0.630]], [0.599, [0.856, 0.778, 0.632]], [0.601, [0.856, 0.778, 0.632]], [0.603, [0.858, 0.782, 0.635]], [0.605, [0.858, 0.782, 0.635]], [0.607, [0.859, 0.786, 0.637]], [0.609, [0.859, 0.786, 0.637]], [0.611, [0.861, 0.790, 0.639]], [0.613, [0.861, 0.790, 0.639]], [0.614, [0.862, 0.794, 0.641]], [0.616, [0.862, 0.794, 0.641]], [0.618, [0.864, 0.797, 0.643]], [0.620, [0.864, 0.797, 0.643]], [0.622, [0.865, 0.801, 0.645]], [0.624, [0.865, 0.801, 0.645]], [0.626, [0.867, 0.805, 0.647]], [0.628, [0.867, 0.805, 0.647]], [0.630, [0.868, 0.809, 0.649]], [0.632, [0.868, 0.809, 0.649]], [0.634, [0.870, 0.812, 0.651]], [0.636, [0.870, 0.812, 0.651]], [0.638, [0.871, 0.816, 0.653]], [0.640, [0.871, 0.816, 0.653]], [0.642, [0.873, 0.820, 0.655]], [0.644, [0.873, 0.820, 0.655]], [0.646, [0.874, 0.823, 0.657]], [0.648, [0.874, 0.823, 0.657]], [0.650, [0.876, 0.827, 0.659]], [0.652, [0.876, 0.827, 0.659]], [0.654, [0.877, 0.831, 0.661]], [0.656, [0.877, 0.831, 0.661]], [0.658, [0.879, 0.834, 0.663]], [0.659, [0.879, 0.834, 0.663]], [0.661, [0.880, 0.838, 0.665]], [0.663, [0.880, 0.838, 0.665]], [0.665, [0.882, 0.842, 0.667]], [0.667, [0.882, 0.842, 0.667]], [0.669, [0.883, 0.845, 0.669]], [0.671, [0.883, 0.845, 0.669]], [0.673, [0.885, 0.849, 0.671]], [0.675, [0.885, 0.849, 0.671]], [0.677, [0.886, 0.852, 0.673]], [0.679, [0.886, 0.852, 0.673]], [0.681, [0.888, 0.856, 0.674]], [0.683, [0.888, 0.856, 0.674]], [0.685, [0.889, 0.859, 0.676]], [0.687, [0.889, 0.859, 0.676]], [0.689, [0.891, 0.863, 0.678]], [0.691, [0.891, 0.863, 0.678]], [0.693, [0.892, 0.866, 0.680]], [0.695, [0.892, 0.866, 0.680]], [0.697, [0.894, 0.870, 0.682]], [0.699, [0.894, 0.870, 0.682]], [0.701, [0.895, 0.873, 0.684]], [0.703, [0.895, 0.873, 0.684]], [0.705, [0.897, 0.877, 0.686]], [0.706, [0.897, 0.877, 0.686]], [0.708, [0.898, 0.880, 0.688]], [0.710, [0.898, 0.880, 0.688]], [0.712, [0.900, 0.884, 0.690]], [0.714, [0.900, 0.884, 0.690]], [0.716, [0.901, 0.887, 0.692]], [0.718, [0.901, 0.887, 0.692]], [0.720, [0.902, 0.890, 0.694]], [0.722, [0.902, 0.890, 0.694]], [0.724, [0.904, 0.894, 0.695]], [0.726, [0.904, 0.894, 0.695]], [0.728, [0.905, 0.897, 0.697]], [0.730, [0.905, 0.897, 0.697]], [0.732, [0.907, 0.901, 0.699]], [0.734, [0.907, 0.901, 0.699]], [0.736, [0.908, 0.904, 0.701]], [0.738, [0.908, 0.904, 0.701]], [0.740, [0.910, 0.907, 0.703]], [0.742, [0.910, 0.907, 0.703]], [0.744, [0.911, 0.911, 0.705]], [0.746, [0.911, 0.911, 0.705]], [0.748, [0.913, 0.913, 0.709]], [0.750, [0.913, 0.913, 0.709]], [0.751, [0.914, 0.914, 0.715]], [0.753, [0.914, 0.914, 0.715]], [0.755, [0.915, 0.915, 0.720]], [0.757, [0.915, 0.915, 0.720]], [0.759, [0.917, 0.917, 0.726]], [0.761, [0.917, 0.917, 0.726]], [0.763, [0.918, 0.918, 0.731]], [0.765, [0.918, 0.918, 0.731]], [0.767, [0.920, 0.920, 0.736]], [0.769, [0.920, 0.920, 0.736]], [0.771, [0.921, 0.921, 0.741]], [0.773, [0.921, 0.921, 0.741]], [0.775, [0.922, 0.922, 0.747]], [0.777, [0.922, 0.922, 0.747]], [0.779, [0.924, 0.924, 0.752]], [0.781, [0.924, 0.924, 0.752]], [0.783, [0.925, 0.925, 0.757]], [0.785, [0.925, 0.925, 0.757]], [0.787, [0.927, 0.927, 0.762]], [0.789, [0.927, 0.927, 0.762]], [0.791, [0.928, 0.928, 0.767]], [0.793, [0.928, 0.928, 0.767]], [0.795, [0.930, 0.930, 0.772]], [0.796, [0.930, 0.930, 0.772]], [0.798, [0.931, 0.931, 0.777]], [0.800, [0.931, 0.931, 0.777]], [0.802, [0.932, 0.932, 0.782]], [0.804, [0.932, 0.932, 0.782]], [0.806, [0.934, 0.934, 0.787]], [0.808, [0.934, 0.934, 0.787]], [0.810, [0.935, 0.935, 0.792]], [0.812, [0.935, 0.935, 0.792]], [0.814, [0.937, 0.937, 0.797]], [0.816, [0.937, 0.937, 0.797]], [0.818, [0.938, 0.938, 0.802]], [0.820, [0.938, 0.938, 0.802]], [0.822, [0.939, 0.939, 0.807]], [0.824, [0.939, 0.939, 0.807]], [0.826, [0.941, 0.941, 0.811]], [0.828, [0.941, 0.941, 0.811]], [0.830, [0.942, 0.942, 0.816]], [0.832, [0.942, 0.942, 0.816]], [0.834, [0.943, 0.943, 0.821]], [0.836, [0.943, 0.943, 0.821]], [0.838, [0.945, 0.945, 0.826]], [0.840, [0.945, 0.945, 0.826]], [0.841, [0.946, 0.946, 0.830]], [0.843, [0.946, 0.946, 0.830]], [0.845, [0.948, 0.948, 0.835]], [0.847, [0.948, 0.948, 0.835]], [0.849, [0.949, 0.949, 0.840]], [0.851, [0.949, 0.949, 0.840]], [0.853, [0.950, 0.950, 0.844]], [0.855, [0.950, 0.950, 0.844]], [0.857, [0.952, 0.952, 0.849]], [0.859, [0.952, 0.952, 0.849]], [0.861, [0.953, 0.953, 0.853]], [0.863, [0.953, 0.953, 0.853]], [0.865, [0.955, 0.955, 0.858]], [0.867, [0.955, 0.955, 0.858]], [0.869, [0.956, 0.956, 0.862]], [0.871, [0.956, 0.956, 0.862]], [0.873, [0.957, 0.957, 0.867]], [0.875, [0.957, 0.957, 0.867]], [0.877, [0.959, 0.959, 0.871]], [0.879, [0.959, 0.959, 0.871]], [0.881, [0.960, 0.960, 0.876]], [0.883, [0.960, 0.960, 0.876]], [0.885, [0.961, 0.961, 0.880]], [0.886, [0.961, 0.961, 0.880]], [0.888, [0.963, 0.963, 0.885]], [0.890, [0.963, 0.963, 0.885]], [0.892, [0.964, 0.964, 0.889]], [0.894, [0.964, 0.964, 0.889]], [0.896, [0.965, 0.965, 0.893]], [0.898, [0.965, 0.965, 0.893]], [0.900, [0.967, 0.967, 0.898]], [0.902, [0.967, 0.967, 0.898]], [0.904, [0.968, 0.968, 0.902]], [0.906, [0.968, 0.968, 0.902]], [0.908, [0.969, 0.969, 0.906]], [0.910, [0.969, 0.969, 0.906]], [0.912, [0.971, 0.971, 0.911]], [0.914, [0.971, 0.971, 0.911]], [0.916, [0.972, 0.972, 0.915]], [0.918, [0.972, 0.972, 0.915]], [0.920, [0.974, 0.974, 0.919]], [0.922, [0.974, 0.974, 0.919]], [0.924, [0.975, 0.975, 0.923]], [0.926, [0.975, 0.975, 0.923]], [0.928, [0.976, 0.976, 0.927]], [0.930, [0.976, 0.976, 0.927]], [0.932, [0.978, 0.978, 0.932]], [0.933, [0.978, 0.978, 0.932]], [0.935, [0.979, 0.979, 0.936]], [0.937, [0.979, 0.979, 0.936]], [0.939, [0.980, 0.980, 0.940]], [0.941, [0.980, 0.980, 0.940]], [0.943, [0.982, 0.982, 0.944]], [0.945, [0.982, 0.982, 0.944]], [0.947, [0.983, 0.983, 0.948]], [0.949, [0.983, 0.983, 0.948]], [0.951, [0.984, 0.984, 0.952]], [0.953, [0.984, 0.984, 0.952]], [0.955, [0.986, 0.986, 0.956]], [0.957, [0.986, 0.986, 0.956]], [0.959, [0.987, 0.987, 0.960]], [0.961, [0.987, 0.987, 0.960]], [0.963, [0.988, 0.988, 0.964]], [0.965, [0.988, 0.988, 0.964]], [0.967, [0.989, 0.989, 0.968]], [0.969, [0.989, 0.989, 0.968]], [0.971, [0.991, 0.991, 0.972]], [0.973, [0.991, 0.991, 0.972]], [0.975, [0.992, 0.992, 0.976]], [0.977, [0.992, 0.992, 0.976]], [0.978, [0.993, 0.993, 0.980]], [0.980, [0.993, 0.993, 0.980]], [0.982, [0.995, 0.995, 0.984]], [0.984, [0.995, 0.995, 0.984]], [0.986, [0.996, 0.996, 0.988]], [0.988, [0.996, 0.996, 0.988]], [0.990, [0.997, 0.997, 0.992]], [0.992, [0.997, 0.997, 0.992]], [0.994, [0.999, 0.999, 0.996]], [0.996, [0.999, 0.999, 0.996]], [0.998, [1.000, 1.000, 1.000]], [1.000, [1.000, 1.000, 1.000]]]; +var spring = [[0.000, [1.000, 0.000, 1.000]], [0.002, [1.000, 0.000, 1.000]], [0.004, [1.000, 0.004, 0.996]], [0.006, [1.000, 0.004, 0.996]], [0.008, [1.000, 0.008, 0.992]], [0.010, [1.000, 0.008, 0.992]], [0.012, [1.000, 0.012, 0.988]], [0.014, [1.000, 0.012, 0.988]], [0.016, [1.000, 0.016, 0.984]], [0.018, [1.000, 0.016, 0.984]], [0.020, [1.000, 0.020, 0.980]], [0.022, [1.000, 0.020, 0.980]], [0.023, [1.000, 0.024, 0.976]], [0.025, [1.000, 0.024, 0.976]], [0.027, [1.000, 0.027, 0.973]], [0.029, [1.000, 0.027, 0.973]], [0.031, [1.000, 0.031, 0.969]], [0.033, [1.000, 0.031, 0.969]], [0.035, [1.000, 0.035, 0.965]], [0.037, [1.000, 0.035, 0.965]], [0.039, [1.000, 0.039, 0.961]], [0.041, [1.000, 0.039, 0.961]], [0.043, [1.000, 0.043, 0.957]], [0.045, [1.000, 0.043, 0.957]], [0.047, [1.000, 0.047, 0.953]], [0.049, [1.000, 0.047, 0.953]], [0.051, [1.000, 0.051, 0.949]], [0.053, [1.000, 0.051, 0.949]], [0.055, [1.000, 0.055, 0.945]], [0.057, [1.000, 0.055, 0.945]], [0.059, [1.000, 0.059, 0.941]], [0.061, [1.000, 0.059, 0.941]], [0.063, [1.000, 0.063, 0.937]], [0.065, [1.000, 0.063, 0.937]], [0.067, [1.000, 0.067, 0.933]], [0.068, [1.000, 0.067, 0.933]], [0.070, [1.000, 0.071, 0.929]], [0.072, [1.000, 0.071, 0.929]], [0.074, [1.000, 0.075, 0.925]], [0.076, [1.000, 0.075, 0.925]], [0.078, [1.000, 0.078, 0.922]], [0.080, [1.000, 0.078, 0.922]], [0.082, [1.000, 0.082, 0.918]], [0.084, [1.000, 0.082, 0.918]], [0.086, [1.000, 0.086, 0.914]], [0.088, [1.000, 0.086, 0.914]], [0.090, [1.000, 0.090, 0.910]], [0.092, [1.000, 0.090, 0.910]], [0.094, [1.000, 0.094, 0.906]], [0.096, [1.000, 0.094, 0.906]], [0.098, [1.000, 0.098, 0.902]], [0.100, [1.000, 0.098, 0.902]], [0.102, [1.000, 0.102, 0.898]], [0.104, [1.000, 0.102, 0.898]], [0.106, [1.000, 0.106, 0.894]], [0.108, [1.000, 0.106, 0.894]], [0.110, [1.000, 0.110, 0.890]], [0.112, [1.000, 0.110, 0.890]], [0.114, [1.000, 0.114, 0.886]], [0.115, [1.000, 0.114, 0.886]], [0.117, [1.000, 0.118, 0.882]], [0.119, [1.000, 0.118, 0.882]], [0.121, [1.000, 0.122, 0.878]], [0.123, [1.000, 0.122, 0.878]], [0.125, [1.000, 0.125, 0.875]], [0.127, [1.000, 0.125, 0.875]], [0.129, [1.000, 0.129, 0.871]], [0.131, [1.000, 0.129, 0.871]], [0.133, [1.000, 0.133, 0.867]], [0.135, [1.000, 0.133, 0.867]], [0.137, [1.000, 0.137, 0.863]], [0.139, [1.000, 0.137, 0.863]], [0.141, [1.000, 0.141, 0.859]], [0.143, [1.000, 0.141, 0.859]], [0.145, [1.000, 0.145, 0.855]], [0.147, [1.000, 0.145, 0.855]], [0.149, [1.000, 0.149, 0.851]], [0.151, [1.000, 0.149, 0.851]], [0.153, [1.000, 0.153, 0.847]], [0.155, [1.000, 0.153, 0.847]], [0.157, [1.000, 0.157, 0.843]], [0.159, [1.000, 0.157, 0.843]], [0.160, [1.000, 0.161, 0.839]], [0.162, [1.000, 0.161, 0.839]], [0.164, [1.000, 0.165, 0.835]], [0.166, [1.000, 0.165, 0.835]], [0.168, [1.000, 0.169, 0.831]], [0.170, [1.000, 0.169, 0.831]], [0.172, [1.000, 0.173, 0.827]], [0.174, [1.000, 0.173, 0.827]], [0.176, [1.000, 0.176, 0.824]], [0.178, [1.000, 0.176, 0.824]], [0.180, [1.000, 0.180, 0.820]], [0.182, [1.000, 0.180, 0.820]], [0.184, [1.000, 0.184, 0.816]], [0.186, [1.000, 0.184, 0.816]], [0.188, [1.000, 0.188, 0.812]], [0.190, [1.000, 0.188, 0.812]], [0.192, [1.000, 0.192, 0.808]], [0.194, [1.000, 0.192, 0.808]], [0.196, [1.000, 0.196, 0.804]], [0.198, [1.000, 0.196, 0.804]], [0.200, [1.000, 0.200, 0.800]], [0.202, [1.000, 0.200, 0.800]], [0.204, [1.000, 0.204, 0.796]], [0.205, [1.000, 0.204, 0.796]], [0.207, [1.000, 0.208, 0.792]], [0.209, [1.000, 0.208, 0.792]], [0.211, [1.000, 0.212, 0.788]], [0.213, [1.000, 0.212, 0.788]], [0.215, [1.000, 0.216, 0.784]], [0.217, [1.000, 0.216, 0.784]], [0.219, [1.000, 0.220, 0.780]], [0.221, [1.000, 0.220, 0.780]], [0.223, [1.000, 0.224, 0.776]], [0.225, [1.000, 0.224, 0.776]], [0.227, [1.000, 0.227, 0.773]], [0.229, [1.000, 0.227, 0.773]], [0.231, [1.000, 0.231, 0.769]], [0.233, [1.000, 0.231, 0.769]], [0.235, [1.000, 0.235, 0.765]], [0.237, [1.000, 0.235, 0.765]], [0.239, [1.000, 0.239, 0.761]], [0.241, [1.000, 0.239, 0.761]], [0.243, [1.000, 0.243, 0.757]], [0.245, [1.000, 0.243, 0.757]], [0.247, [1.000, 0.247, 0.753]], [0.249, [1.000, 0.247, 0.753]], [0.250, [1.000, 0.251, 0.749]], [0.252, [1.000, 0.251, 0.749]], [0.254, [1.000, 0.255, 0.745]], [0.256, [1.000, 0.255, 0.745]], [0.258, [1.000, 0.259, 0.741]], [0.260, [1.000, 0.259, 0.741]], [0.262, [1.000, 0.263, 0.737]], [0.264, [1.000, 0.263, 0.737]], [0.266, [1.000, 0.267, 0.733]], [0.268, [1.000, 0.267, 0.733]], [0.270, [1.000, 0.271, 0.729]], [0.272, [1.000, 0.271, 0.729]], [0.274, [1.000, 0.275, 0.725]], [0.276, [1.000, 0.275, 0.725]], [0.278, [1.000, 0.278, 0.722]], [0.280, [1.000, 0.278, 0.722]], [0.282, [1.000, 0.282, 0.718]], [0.284, [1.000, 0.282, 0.718]], [0.286, [1.000, 0.286, 0.714]], [0.288, [1.000, 0.286, 0.714]], [0.290, [1.000, 0.290, 0.710]], [0.292, [1.000, 0.290, 0.710]], [0.294, [1.000, 0.294, 0.706]], [0.295, [1.000, 0.294, 0.706]], [0.297, [1.000, 0.298, 0.702]], [0.299, [1.000, 0.298, 0.702]], [0.301, [1.000, 0.302, 0.698]], [0.303, [1.000, 0.302, 0.698]], [0.305, [1.000, 0.306, 0.694]], [0.307, [1.000, 0.306, 0.694]], [0.309, [1.000, 0.310, 0.690]], [0.311, [1.000, 0.310, 0.690]], [0.313, [1.000, 0.314, 0.686]], [0.315, [1.000, 0.314, 0.686]], [0.317, [1.000, 0.318, 0.682]], [0.319, [1.000, 0.318, 0.682]], [0.321, [1.000, 0.322, 0.678]], [0.323, [1.000, 0.322, 0.678]], [0.325, [1.000, 0.325, 0.675]], [0.327, [1.000, 0.325, 0.675]], [0.329, [1.000, 0.329, 0.671]], [0.331, [1.000, 0.329, 0.671]], [0.333, [1.000, 0.333, 0.667]], [0.335, [1.000, 0.333, 0.667]], [0.337, [1.000, 0.337, 0.663]], [0.339, [1.000, 0.337, 0.663]], [0.341, [1.000, 0.341, 0.659]], [0.342, [1.000, 0.341, 0.659]], [0.344, [1.000, 0.345, 0.655]], [0.346, [1.000, 0.345, 0.655]], [0.348, [1.000, 0.349, 0.651]], [0.350, [1.000, 0.349, 0.651]], [0.352, [1.000, 0.353, 0.647]], [0.354, [1.000, 0.353, 0.647]], [0.356, [1.000, 0.357, 0.643]], [0.358, [1.000, 0.357, 0.643]], [0.360, [1.000, 0.361, 0.639]], [0.362, [1.000, 0.361, 0.639]], [0.364, [1.000, 0.365, 0.635]], [0.366, [1.000, 0.365, 0.635]], [0.368, [1.000, 0.369, 0.631]], [0.370, [1.000, 0.369, 0.631]], [0.372, [1.000, 0.373, 0.627]], [0.374, [1.000, 0.373, 0.627]], [0.376, [1.000, 0.376, 0.624]], [0.378, [1.000, 0.376, 0.624]], [0.380, [1.000, 0.380, 0.620]], [0.382, [1.000, 0.380, 0.620]], [0.384, [1.000, 0.384, 0.616]], [0.386, [1.000, 0.384, 0.616]], [0.387, [1.000, 0.388, 0.612]], [0.389, [1.000, 0.388, 0.612]], [0.391, [1.000, 0.392, 0.608]], [0.393, [1.000, 0.392, 0.608]], [0.395, [1.000, 0.396, 0.604]], [0.397, [1.000, 0.396, 0.604]], [0.399, [1.000, 0.400, 0.600]], [0.401, [1.000, 0.400, 0.600]], [0.403, [1.000, 0.404, 0.596]], [0.405, [1.000, 0.404, 0.596]], [0.407, [1.000, 0.408, 0.592]], [0.409, [1.000, 0.408, 0.592]], [0.411, [1.000, 0.412, 0.588]], [0.413, [1.000, 0.412, 0.588]], [0.415, [1.000, 0.416, 0.584]], [0.417, [1.000, 0.416, 0.584]], [0.419, [1.000, 0.420, 0.580]], [0.421, [1.000, 0.420, 0.580]], [0.423, [1.000, 0.424, 0.576]], [0.425, [1.000, 0.424, 0.576]], [0.427, [1.000, 0.427, 0.573]], [0.429, [1.000, 0.427, 0.573]], [0.431, [1.000, 0.431, 0.569]], [0.432, [1.000, 0.431, 0.569]], [0.434, [1.000, 0.435, 0.565]], [0.436, [1.000, 0.435, 0.565]], [0.438, [1.000, 0.439, 0.561]], [0.440, [1.000, 0.439, 0.561]], [0.442, [1.000, 0.443, 0.557]], [0.444, [1.000, 0.443, 0.557]], [0.446, [1.000, 0.447, 0.553]], [0.448, [1.000, 0.447, 0.553]], [0.450, [1.000, 0.451, 0.549]], [0.452, [1.000, 0.451, 0.549]], [0.454, [1.000, 0.455, 0.545]], [0.456, [1.000, 0.455, 0.545]], [0.458, [1.000, 0.459, 0.541]], [0.460, [1.000, 0.459, 0.541]], [0.462, [1.000, 0.463, 0.537]], [0.464, [1.000, 0.463, 0.537]], [0.466, [1.000, 0.467, 0.533]], [0.468, [1.000, 0.467, 0.533]], [0.470, [1.000, 0.471, 0.529]], [0.472, [1.000, 0.471, 0.529]], [0.474, [1.000, 0.475, 0.525]], [0.476, [1.000, 0.475, 0.525]], [0.477, [1.000, 0.478, 0.522]], [0.479, [1.000, 0.478, 0.522]], [0.481, [1.000, 0.482, 0.518]], [0.483, [1.000, 0.482, 0.518]], [0.485, [1.000, 0.486, 0.514]], [0.487, [1.000, 0.486, 0.514]], [0.489, [1.000, 0.490, 0.510]], [0.491, [1.000, 0.490, 0.510]], [0.493, [1.000, 0.494, 0.506]], [0.495, [1.000, 0.494, 0.506]], [0.497, [1.000, 0.498, 0.502]], [0.499, [1.000, 0.498, 0.502]], [0.501, [1.000, 0.502, 0.498]], [0.503, [1.000, 0.502, 0.498]], [0.505, [1.000, 0.506, 0.494]], [0.507, [1.000, 0.506, 0.494]], [0.509, [1.000, 0.510, 0.490]], [0.511, [1.000, 0.510, 0.490]], [0.513, [1.000, 0.514, 0.486]], [0.515, [1.000, 0.514, 0.486]], [0.517, [1.000, 0.518, 0.482]], [0.519, [1.000, 0.518, 0.482]], [0.521, [1.000, 0.522, 0.478]], [0.523, [1.000, 0.522, 0.478]], [0.524, [1.000, 0.525, 0.475]], [0.526, [1.000, 0.525, 0.475]], [0.528, [1.000, 0.529, 0.471]], [0.530, [1.000, 0.529, 0.471]], [0.532, [1.000, 0.533, 0.467]], [0.534, [1.000, 0.533, 0.467]], [0.536, [1.000, 0.537, 0.463]], [0.538, [1.000, 0.537, 0.463]], [0.540, [1.000, 0.541, 0.459]], [0.542, [1.000, 0.541, 0.459]], [0.544, [1.000, 0.545, 0.455]], [0.546, [1.000, 0.545, 0.455]], [0.548, [1.000, 0.549, 0.451]], [0.550, [1.000, 0.549, 0.451]], [0.552, [1.000, 0.553, 0.447]], [0.554, [1.000, 0.553, 0.447]], [0.556, [1.000, 0.557, 0.443]], [0.558, [1.000, 0.557, 0.443]], [0.560, [1.000, 0.561, 0.439]], [0.562, [1.000, 0.561, 0.439]], [0.564, [1.000, 0.565, 0.435]], [0.566, [1.000, 0.565, 0.435]], [0.568, [1.000, 0.569, 0.431]], [0.569, [1.000, 0.569, 0.431]], [0.571, [1.000, 0.573, 0.427]], [0.573, [1.000, 0.573, 0.427]], [0.575, [1.000, 0.576, 0.424]], [0.577, [1.000, 0.576, 0.424]], [0.579, [1.000, 0.580, 0.420]], [0.581, [1.000, 0.580, 0.420]], [0.583, [1.000, 0.584, 0.416]], [0.585, [1.000, 0.584, 0.416]], [0.587, [1.000, 0.588, 0.412]], [0.589, [1.000, 0.588, 0.412]], [0.591, [1.000, 0.592, 0.408]], [0.593, [1.000, 0.592, 0.408]], [0.595, [1.000, 0.596, 0.404]], [0.597, [1.000, 0.596, 0.404]], [0.599, [1.000, 0.600, 0.400]], [0.601, [1.000, 0.600, 0.400]], [0.603, [1.000, 0.604, 0.396]], [0.605, [1.000, 0.604, 0.396]], [0.607, [1.000, 0.608, 0.392]], [0.609, [1.000, 0.608, 0.392]], [0.611, [1.000, 0.612, 0.388]], [0.613, [1.000, 0.612, 0.388]], [0.614, [1.000, 0.616, 0.384]], [0.616, [1.000, 0.616, 0.384]], [0.618, [1.000, 0.620, 0.380]], [0.620, [1.000, 0.620, 0.380]], [0.622, [1.000, 0.624, 0.376]], [0.624, [1.000, 0.624, 0.376]], [0.626, [1.000, 0.627, 0.373]], [0.628, [1.000, 0.627, 0.373]], [0.630, [1.000, 0.631, 0.369]], [0.632, [1.000, 0.631, 0.369]], [0.634, [1.000, 0.635, 0.365]], [0.636, [1.000, 0.635, 0.365]], [0.638, [1.000, 0.639, 0.361]], [0.640, [1.000, 0.639, 0.361]], [0.642, [1.000, 0.643, 0.357]], [0.644, [1.000, 0.643, 0.357]], [0.646, [1.000, 0.647, 0.353]], [0.648, [1.000, 0.647, 0.353]], [0.650, [1.000, 0.651, 0.349]], [0.652, [1.000, 0.651, 0.349]], [0.654, [1.000, 0.655, 0.345]], [0.656, [1.000, 0.655, 0.345]], [0.658, [1.000, 0.659, 0.341]], [0.659, [1.000, 0.659, 0.341]], [0.661, [1.000, 0.663, 0.337]], [0.663, [1.000, 0.663, 0.337]], [0.665, [1.000, 0.667, 0.333]], [0.667, [1.000, 0.667, 0.333]], [0.669, [1.000, 0.671, 0.329]], [0.671, [1.000, 0.671, 0.329]], [0.673, [1.000, 0.675, 0.325]], [0.675, [1.000, 0.675, 0.325]], [0.677, [1.000, 0.678, 0.322]], [0.679, [1.000, 0.678, 0.322]], [0.681, [1.000, 0.682, 0.318]], [0.683, [1.000, 0.682, 0.318]], [0.685, [1.000, 0.686, 0.314]], [0.687, [1.000, 0.686, 0.314]], [0.689, [1.000, 0.690, 0.310]], [0.691, [1.000, 0.690, 0.310]], [0.693, [1.000, 0.694, 0.306]], [0.695, [1.000, 0.694, 0.306]], [0.697, [1.000, 0.698, 0.302]], [0.699, [1.000, 0.698, 0.302]], [0.701, [1.000, 0.702, 0.298]], [0.703, [1.000, 0.702, 0.298]], [0.705, [1.000, 0.706, 0.294]], [0.706, [1.000, 0.706, 0.294]], [0.708, [1.000, 0.710, 0.290]], [0.710, [1.000, 0.710, 0.290]], [0.712, [1.000, 0.714, 0.286]], [0.714, [1.000, 0.714, 0.286]], [0.716, [1.000, 0.718, 0.282]], [0.718, [1.000, 0.718, 0.282]], [0.720, [1.000, 0.722, 0.278]], [0.722, [1.000, 0.722, 0.278]], [0.724, [1.000, 0.725, 0.275]], [0.726, [1.000, 0.725, 0.275]], [0.728, [1.000, 0.729, 0.271]], [0.730, [1.000, 0.729, 0.271]], [0.732, [1.000, 0.733, 0.267]], [0.734, [1.000, 0.733, 0.267]], [0.736, [1.000, 0.737, 0.263]], [0.738, [1.000, 0.737, 0.263]], [0.740, [1.000, 0.741, 0.259]], [0.742, [1.000, 0.741, 0.259]], [0.744, [1.000, 0.745, 0.255]], [0.746, [1.000, 0.745, 0.255]], [0.748, [1.000, 0.749, 0.251]], [0.750, [1.000, 0.749, 0.251]], [0.751, [1.000, 0.753, 0.247]], [0.753, [1.000, 0.753, 0.247]], [0.755, [1.000, 0.757, 0.243]], [0.757, [1.000, 0.757, 0.243]], [0.759, [1.000, 0.761, 0.239]], [0.761, [1.000, 0.761, 0.239]], [0.763, [1.000, 0.765, 0.235]], [0.765, [1.000, 0.765, 0.235]], [0.767, [1.000, 0.769, 0.231]], [0.769, [1.000, 0.769, 0.231]], [0.771, [1.000, 0.773, 0.227]], [0.773, [1.000, 0.773, 0.227]], [0.775, [1.000, 0.776, 0.224]], [0.777, [1.000, 0.776, 0.224]], [0.779, [1.000, 0.780, 0.220]], [0.781, [1.000, 0.780, 0.220]], [0.783, [1.000, 0.784, 0.216]], [0.785, [1.000, 0.784, 0.216]], [0.787, [1.000, 0.788, 0.212]], [0.789, [1.000, 0.788, 0.212]], [0.791, [1.000, 0.792, 0.208]], [0.793, [1.000, 0.792, 0.208]], [0.795, [1.000, 0.796, 0.204]], [0.796, [1.000, 0.796, 0.204]], [0.798, [1.000, 0.800, 0.200]], [0.800, [1.000, 0.800, 0.200]], [0.802, [1.000, 0.804, 0.196]], [0.804, [1.000, 0.804, 0.196]], [0.806, [1.000, 0.808, 0.192]], [0.808, [1.000, 0.808, 0.192]], [0.810, [1.000, 0.812, 0.188]], [0.812, [1.000, 0.812, 0.188]], [0.814, [1.000, 0.816, 0.184]], [0.816, [1.000, 0.816, 0.184]], [0.818, [1.000, 0.820, 0.180]], [0.820, [1.000, 0.820, 0.180]], [0.822, [1.000, 0.824, 0.176]], [0.824, [1.000, 0.824, 0.176]], [0.826, [1.000, 0.827, 0.173]], [0.828, [1.000, 0.827, 0.173]], [0.830, [1.000, 0.831, 0.169]], [0.832, [1.000, 0.831, 0.169]], [0.834, [1.000, 0.835, 0.165]], [0.836, [1.000, 0.835, 0.165]], [0.838, [1.000, 0.839, 0.161]], [0.840, [1.000, 0.839, 0.161]], [0.841, [1.000, 0.843, 0.157]], [0.843, [1.000, 0.843, 0.157]], [0.845, [1.000, 0.847, 0.153]], [0.847, [1.000, 0.847, 0.153]], [0.849, [1.000, 0.851, 0.149]], [0.851, [1.000, 0.851, 0.149]], [0.853, [1.000, 0.855, 0.145]], [0.855, [1.000, 0.855, 0.145]], [0.857, [1.000, 0.859, 0.141]], [0.859, [1.000, 0.859, 0.141]], [0.861, [1.000, 0.863, 0.137]], [0.863, [1.000, 0.863, 0.137]], [0.865, [1.000, 0.867, 0.133]], [0.867, [1.000, 0.867, 0.133]], [0.869, [1.000, 0.871, 0.129]], [0.871, [1.000, 0.871, 0.129]], [0.873, [1.000, 0.875, 0.125]], [0.875, [1.000, 0.875, 0.125]], [0.877, [1.000, 0.878, 0.122]], [0.879, [1.000, 0.878, 0.122]], [0.881, [1.000, 0.882, 0.118]], [0.883, [1.000, 0.882, 0.118]], [0.885, [1.000, 0.886, 0.114]], [0.886, [1.000, 0.886, 0.114]], [0.888, [1.000, 0.890, 0.110]], [0.890, [1.000, 0.890, 0.110]], [0.892, [1.000, 0.894, 0.106]], [0.894, [1.000, 0.894, 0.106]], [0.896, [1.000, 0.898, 0.102]], [0.898, [1.000, 0.898, 0.102]], [0.900, [1.000, 0.902, 0.098]], [0.902, [1.000, 0.902, 0.098]], [0.904, [1.000, 0.906, 0.094]], [0.906, [1.000, 0.906, 0.094]], [0.908, [1.000, 0.910, 0.090]], [0.910, [1.000, 0.910, 0.090]], [0.912, [1.000, 0.914, 0.086]], [0.914, [1.000, 0.914, 0.086]], [0.916, [1.000, 0.918, 0.082]], [0.918, [1.000, 0.918, 0.082]], [0.920, [1.000, 0.922, 0.078]], [0.922, [1.000, 0.922, 0.078]], [0.924, [1.000, 0.925, 0.075]], [0.926, [1.000, 0.925, 0.075]], [0.928, [1.000, 0.929, 0.071]], [0.930, [1.000, 0.929, 0.071]], [0.932, [1.000, 0.933, 0.067]], [0.933, [1.000, 0.933, 0.067]], [0.935, [1.000, 0.937, 0.063]], [0.937, [1.000, 0.937, 0.063]], [0.939, [1.000, 0.941, 0.059]], [0.941, [1.000, 0.941, 0.059]], [0.943, [1.000, 0.945, 0.055]], [0.945, [1.000, 0.945, 0.055]], [0.947, [1.000, 0.949, 0.051]], [0.949, [1.000, 0.949, 0.051]], [0.951, [1.000, 0.953, 0.047]], [0.953, [1.000, 0.953, 0.047]], [0.955, [1.000, 0.957, 0.043]], [0.957, [1.000, 0.957, 0.043]], [0.959, [1.000, 0.961, 0.039]], [0.961, [1.000, 0.961, 0.039]], [0.963, [1.000, 0.965, 0.035]], [0.965, [1.000, 0.965, 0.035]], [0.967, [1.000, 0.969, 0.031]], [0.969, [1.000, 0.969, 0.031]], [0.971, [1.000, 0.973, 0.027]], [0.973, [1.000, 0.973, 0.027]], [0.975, [1.000, 0.976, 0.024]], [0.977, [1.000, 0.976, 0.024]], [0.978, [1.000, 0.980, 0.020]], [0.980, [1.000, 0.980, 0.020]], [0.982, [1.000, 0.984, 0.016]], [0.984, [1.000, 0.984, 0.016]], [0.986, [1.000, 0.988, 0.012]], [0.988, [1.000, 0.988, 0.012]], [0.990, [1.000, 0.992, 0.008]], [0.992, [1.000, 0.992, 0.008]], [0.994, [1.000, 0.996, 0.004]], [0.996, [1.000, 0.996, 0.004]], [0.998, [1.000, 1.000, 0.000]], [1.000, [1.000, 1.000, 0.000]]]; +var summer = [[0.000, [0.000, 0.500, 0.400]], [0.002, [0.000, 0.500, 0.400]], [0.004, [0.004, 0.502, 0.400]], [0.006, [0.004, 0.502, 0.400]], [0.008, [0.008, 0.504, 0.400]], [0.010, [0.008, 0.504, 0.400]], [0.012, [0.012, 0.506, 0.400]], [0.014, [0.012, 0.506, 0.400]], [0.016, [0.016, 0.508, 0.400]], [0.018, [0.016, 0.508, 0.400]], [0.020, [0.020, 0.510, 0.400]], [0.022, [0.020, 0.510, 0.400]], [0.023, [0.024, 0.512, 0.400]], [0.025, [0.024, 0.512, 0.400]], [0.027, [0.027, 0.514, 0.400]], [0.029, [0.027, 0.514, 0.400]], [0.031, [0.031, 0.516, 0.400]], [0.033, [0.031, 0.516, 0.400]], [0.035, [0.035, 0.518, 0.400]], [0.037, [0.035, 0.518, 0.400]], [0.039, [0.039, 0.520, 0.400]], [0.041, [0.039, 0.520, 0.400]], [0.043, [0.043, 0.522, 0.400]], [0.045, [0.043, 0.522, 0.400]], [0.047, [0.047, 0.524, 0.400]], [0.049, [0.047, 0.524, 0.400]], [0.051, [0.051, 0.525, 0.400]], [0.053, [0.051, 0.525, 0.400]], [0.055, [0.055, 0.527, 0.400]], [0.057, [0.055, 0.527, 0.400]], [0.059, [0.059, 0.529, 0.400]], [0.061, [0.059, 0.529, 0.400]], [0.063, [0.063, 0.531, 0.400]], [0.065, [0.063, 0.531, 0.400]], [0.067, [0.067, 0.533, 0.400]], [0.068, [0.067, 0.533, 0.400]], [0.070, [0.071, 0.535, 0.400]], [0.072, [0.071, 0.535, 0.400]], [0.074, [0.075, 0.537, 0.400]], [0.076, [0.075, 0.537, 0.400]], [0.078, [0.078, 0.539, 0.400]], [0.080, [0.078, 0.539, 0.400]], [0.082, [0.082, 0.541, 0.400]], [0.084, [0.082, 0.541, 0.400]], [0.086, [0.086, 0.543, 0.400]], [0.088, [0.086, 0.543, 0.400]], [0.090, [0.090, 0.545, 0.400]], [0.092, [0.090, 0.545, 0.400]], [0.094, [0.094, 0.547, 0.400]], [0.096, [0.094, 0.547, 0.400]], [0.098, [0.098, 0.549, 0.400]], [0.100, [0.098, 0.549, 0.400]], [0.102, [0.102, 0.551, 0.400]], [0.104, [0.102, 0.551, 0.400]], [0.106, [0.106, 0.553, 0.400]], [0.108, [0.106, 0.553, 0.400]], [0.110, [0.110, 0.555, 0.400]], [0.112, [0.110, 0.555, 0.400]], [0.114, [0.114, 0.557, 0.400]], [0.115, [0.114, 0.557, 0.400]], [0.117, [0.118, 0.559, 0.400]], [0.119, [0.118, 0.559, 0.400]], [0.121, [0.122, 0.561, 0.400]], [0.123, [0.122, 0.561, 0.400]], [0.125, [0.125, 0.563, 0.400]], [0.127, [0.125, 0.563, 0.400]], [0.129, [0.129, 0.565, 0.400]], [0.131, [0.129, 0.565, 0.400]], [0.133, [0.133, 0.567, 0.400]], [0.135, [0.133, 0.567, 0.400]], [0.137, [0.137, 0.569, 0.400]], [0.139, [0.137, 0.569, 0.400]], [0.141, [0.141, 0.571, 0.400]], [0.143, [0.141, 0.571, 0.400]], [0.145, [0.145, 0.573, 0.400]], [0.147, [0.145, 0.573, 0.400]], [0.149, [0.149, 0.575, 0.400]], [0.151, [0.149, 0.575, 0.400]], [0.153, [0.153, 0.576, 0.400]], [0.155, [0.153, 0.576, 0.400]], [0.157, [0.157, 0.578, 0.400]], [0.159, [0.157, 0.578, 0.400]], [0.160, [0.161, 0.580, 0.400]], [0.162, [0.161, 0.580, 0.400]], [0.164, [0.165, 0.582, 0.400]], [0.166, [0.165, 0.582, 0.400]], [0.168, [0.169, 0.584, 0.400]], [0.170, [0.169, 0.584, 0.400]], [0.172, [0.173, 0.586, 0.400]], [0.174, [0.173, 0.586, 0.400]], [0.176, [0.176, 0.588, 0.400]], [0.178, [0.176, 0.588, 0.400]], [0.180, [0.180, 0.590, 0.400]], [0.182, [0.180, 0.590, 0.400]], [0.184, [0.184, 0.592, 0.400]], [0.186, [0.184, 0.592, 0.400]], [0.188, [0.188, 0.594, 0.400]], [0.190, [0.188, 0.594, 0.400]], [0.192, [0.192, 0.596, 0.400]], [0.194, [0.192, 0.596, 0.400]], [0.196, [0.196, 0.598, 0.400]], [0.198, [0.196, 0.598, 0.400]], [0.200, [0.200, 0.600, 0.400]], [0.202, [0.200, 0.600, 0.400]], [0.204, [0.204, 0.602, 0.400]], [0.205, [0.204, 0.602, 0.400]], [0.207, [0.208, 0.604, 0.400]], [0.209, [0.208, 0.604, 0.400]], [0.211, [0.212, 0.606, 0.400]], [0.213, [0.212, 0.606, 0.400]], [0.215, [0.216, 0.608, 0.400]], [0.217, [0.216, 0.608, 0.400]], [0.219, [0.220, 0.610, 0.400]], [0.221, [0.220, 0.610, 0.400]], [0.223, [0.224, 0.612, 0.400]], [0.225, [0.224, 0.612, 0.400]], [0.227, [0.227, 0.614, 0.400]], [0.229, [0.227, 0.614, 0.400]], [0.231, [0.231, 0.616, 0.400]], [0.233, [0.231, 0.616, 0.400]], [0.235, [0.235, 0.618, 0.400]], [0.237, [0.235, 0.618, 0.400]], [0.239, [0.239, 0.620, 0.400]], [0.241, [0.239, 0.620, 0.400]], [0.243, [0.243, 0.622, 0.400]], [0.245, [0.243, 0.622, 0.400]], [0.247, [0.247, 0.624, 0.400]], [0.249, [0.247, 0.624, 0.400]], [0.250, [0.251, 0.625, 0.400]], [0.252, [0.251, 0.625, 0.400]], [0.254, [0.255, 0.627, 0.400]], [0.256, [0.255, 0.627, 0.400]], [0.258, [0.259, 0.629, 0.400]], [0.260, [0.259, 0.629, 0.400]], [0.262, [0.263, 0.631, 0.400]], [0.264, [0.263, 0.631, 0.400]], [0.266, [0.267, 0.633, 0.400]], [0.268, [0.267, 0.633, 0.400]], [0.270, [0.271, 0.635, 0.400]], [0.272, [0.271, 0.635, 0.400]], [0.274, [0.275, 0.637, 0.400]], [0.276, [0.275, 0.637, 0.400]], [0.278, [0.278, 0.639, 0.400]], [0.280, [0.278, 0.639, 0.400]], [0.282, [0.282, 0.641, 0.400]], [0.284, [0.282, 0.641, 0.400]], [0.286, [0.286, 0.643, 0.400]], [0.288, [0.286, 0.643, 0.400]], [0.290, [0.290, 0.645, 0.400]], [0.292, [0.290, 0.645, 0.400]], [0.294, [0.294, 0.647, 0.400]], [0.295, [0.294, 0.647, 0.400]], [0.297, [0.298, 0.649, 0.400]], [0.299, [0.298, 0.649, 0.400]], [0.301, [0.302, 0.651, 0.400]], [0.303, [0.302, 0.651, 0.400]], [0.305, [0.306, 0.653, 0.400]], [0.307, [0.306, 0.653, 0.400]], [0.309, [0.310, 0.655, 0.400]], [0.311, [0.310, 0.655, 0.400]], [0.313, [0.314, 0.657, 0.400]], [0.315, [0.314, 0.657, 0.400]], [0.317, [0.318, 0.659, 0.400]], [0.319, [0.318, 0.659, 0.400]], [0.321, [0.322, 0.661, 0.400]], [0.323, [0.322, 0.661, 0.400]], [0.325, [0.325, 0.663, 0.400]], [0.327, [0.325, 0.663, 0.400]], [0.329, [0.329, 0.665, 0.400]], [0.331, [0.329, 0.665, 0.400]], [0.333, [0.333, 0.667, 0.400]], [0.335, [0.333, 0.667, 0.400]], [0.337, [0.337, 0.669, 0.400]], [0.339, [0.337, 0.669, 0.400]], [0.341, [0.341, 0.671, 0.400]], [0.342, [0.341, 0.671, 0.400]], [0.344, [0.345, 0.673, 0.400]], [0.346, [0.345, 0.673, 0.400]], [0.348, [0.349, 0.675, 0.400]], [0.350, [0.349, 0.675, 0.400]], [0.352, [0.353, 0.676, 0.400]], [0.354, [0.353, 0.676, 0.400]], [0.356, [0.357, 0.678, 0.400]], [0.358, [0.357, 0.678, 0.400]], [0.360, [0.361, 0.680, 0.400]], [0.362, [0.361, 0.680, 0.400]], [0.364, [0.365, 0.682, 0.400]], [0.366, [0.365, 0.682, 0.400]], [0.368, [0.369, 0.684, 0.400]], [0.370, [0.369, 0.684, 0.400]], [0.372, [0.373, 0.686, 0.400]], [0.374, [0.373, 0.686, 0.400]], [0.376, [0.376, 0.688, 0.400]], [0.378, [0.376, 0.688, 0.400]], [0.380, [0.380, 0.690, 0.400]], [0.382, [0.380, 0.690, 0.400]], [0.384, [0.384, 0.692, 0.400]], [0.386, [0.384, 0.692, 0.400]], [0.387, [0.388, 0.694, 0.400]], [0.389, [0.388, 0.694, 0.400]], [0.391, [0.392, 0.696, 0.400]], [0.393, [0.392, 0.696, 0.400]], [0.395, [0.396, 0.698, 0.400]], [0.397, [0.396, 0.698, 0.400]], [0.399, [0.400, 0.700, 0.400]], [0.401, [0.400, 0.700, 0.400]], [0.403, [0.404, 0.702, 0.400]], [0.405, [0.404, 0.702, 0.400]], [0.407, [0.408, 0.704, 0.400]], [0.409, [0.408, 0.704, 0.400]], [0.411, [0.412, 0.706, 0.400]], [0.413, [0.412, 0.706, 0.400]], [0.415, [0.416, 0.708, 0.400]], [0.417, [0.416, 0.708, 0.400]], [0.419, [0.420, 0.710, 0.400]], [0.421, [0.420, 0.710, 0.400]], [0.423, [0.424, 0.712, 0.400]], [0.425, [0.424, 0.712, 0.400]], [0.427, [0.427, 0.714, 0.400]], [0.429, [0.427, 0.714, 0.400]], [0.431, [0.431, 0.716, 0.400]], [0.432, [0.431, 0.716, 0.400]], [0.434, [0.435, 0.718, 0.400]], [0.436, [0.435, 0.718, 0.400]], [0.438, [0.439, 0.720, 0.400]], [0.440, [0.439, 0.720, 0.400]], [0.442, [0.443, 0.722, 0.400]], [0.444, [0.443, 0.722, 0.400]], [0.446, [0.447, 0.724, 0.400]], [0.448, [0.447, 0.724, 0.400]], [0.450, [0.451, 0.725, 0.400]], [0.452, [0.451, 0.725, 0.400]], [0.454, [0.455, 0.727, 0.400]], [0.456, [0.455, 0.727, 0.400]], [0.458, [0.459, 0.729, 0.400]], [0.460, [0.459, 0.729, 0.400]], [0.462, [0.463, 0.731, 0.400]], [0.464, [0.463, 0.731, 0.400]], [0.466, [0.467, 0.733, 0.400]], [0.468, [0.467, 0.733, 0.400]], [0.470, [0.471, 0.735, 0.400]], [0.472, [0.471, 0.735, 0.400]], [0.474, [0.475, 0.737, 0.400]], [0.476, [0.475, 0.737, 0.400]], [0.477, [0.478, 0.739, 0.400]], [0.479, [0.478, 0.739, 0.400]], [0.481, [0.482, 0.741, 0.400]], [0.483, [0.482, 0.741, 0.400]], [0.485, [0.486, 0.743, 0.400]], [0.487, [0.486, 0.743, 0.400]], [0.489, [0.490, 0.745, 0.400]], [0.491, [0.490, 0.745, 0.400]], [0.493, [0.494, 0.747, 0.400]], [0.495, [0.494, 0.747, 0.400]], [0.497, [0.498, 0.749, 0.400]], [0.499, [0.498, 0.749, 0.400]], [0.501, [0.502, 0.751, 0.400]], [0.503, [0.502, 0.751, 0.400]], [0.505, [0.506, 0.753, 0.400]], [0.507, [0.506, 0.753, 0.400]], [0.509, [0.510, 0.755, 0.400]], [0.511, [0.510, 0.755, 0.400]], [0.513, [0.514, 0.757, 0.400]], [0.515, [0.514, 0.757, 0.400]], [0.517, [0.518, 0.759, 0.400]], [0.519, [0.518, 0.759, 0.400]], [0.521, [0.522, 0.761, 0.400]], [0.523, [0.522, 0.761, 0.400]], [0.524, [0.525, 0.763, 0.400]], [0.526, [0.525, 0.763, 0.400]], [0.528, [0.529, 0.765, 0.400]], [0.530, [0.529, 0.765, 0.400]], [0.532, [0.533, 0.767, 0.400]], [0.534, [0.533, 0.767, 0.400]], [0.536, [0.537, 0.769, 0.400]], [0.538, [0.537, 0.769, 0.400]], [0.540, [0.541, 0.771, 0.400]], [0.542, [0.541, 0.771, 0.400]], [0.544, [0.545, 0.773, 0.400]], [0.546, [0.545, 0.773, 0.400]], [0.548, [0.549, 0.775, 0.400]], [0.550, [0.549, 0.775, 0.400]], [0.552, [0.553, 0.776, 0.400]], [0.554, [0.553, 0.776, 0.400]], [0.556, [0.557, 0.778, 0.400]], [0.558, [0.557, 0.778, 0.400]], [0.560, [0.561, 0.780, 0.400]], [0.562, [0.561, 0.780, 0.400]], [0.564, [0.565, 0.782, 0.400]], [0.566, [0.565, 0.782, 0.400]], [0.568, [0.569, 0.784, 0.400]], [0.569, [0.569, 0.784, 0.400]], [0.571, [0.573, 0.786, 0.400]], [0.573, [0.573, 0.786, 0.400]], [0.575, [0.576, 0.788, 0.400]], [0.577, [0.576, 0.788, 0.400]], [0.579, [0.580, 0.790, 0.400]], [0.581, [0.580, 0.790, 0.400]], [0.583, [0.584, 0.792, 0.400]], [0.585, [0.584, 0.792, 0.400]], [0.587, [0.588, 0.794, 0.400]], [0.589, [0.588, 0.794, 0.400]], [0.591, [0.592, 0.796, 0.400]], [0.593, [0.592, 0.796, 0.400]], [0.595, [0.596, 0.798, 0.400]], [0.597, [0.596, 0.798, 0.400]], [0.599, [0.600, 0.800, 0.400]], [0.601, [0.600, 0.800, 0.400]], [0.603, [0.604, 0.802, 0.400]], [0.605, [0.604, 0.802, 0.400]], [0.607, [0.608, 0.804, 0.400]], [0.609, [0.608, 0.804, 0.400]], [0.611, [0.612, 0.806, 0.400]], [0.613, [0.612, 0.806, 0.400]], [0.614, [0.616, 0.808, 0.400]], [0.616, [0.616, 0.808, 0.400]], [0.618, [0.620, 0.810, 0.400]], [0.620, [0.620, 0.810, 0.400]], [0.622, [0.624, 0.812, 0.400]], [0.624, [0.624, 0.812, 0.400]], [0.626, [0.627, 0.814, 0.400]], [0.628, [0.627, 0.814, 0.400]], [0.630, [0.631, 0.816, 0.400]], [0.632, [0.631, 0.816, 0.400]], [0.634, [0.635, 0.818, 0.400]], [0.636, [0.635, 0.818, 0.400]], [0.638, [0.639, 0.820, 0.400]], [0.640, [0.639, 0.820, 0.400]], [0.642, [0.643, 0.822, 0.400]], [0.644, [0.643, 0.822, 0.400]], [0.646, [0.647, 0.824, 0.400]], [0.648, [0.647, 0.824, 0.400]], [0.650, [0.651, 0.825, 0.400]], [0.652, [0.651, 0.825, 0.400]], [0.654, [0.655, 0.827, 0.400]], [0.656, [0.655, 0.827, 0.400]], [0.658, [0.659, 0.829, 0.400]], [0.659, [0.659, 0.829, 0.400]], [0.661, [0.663, 0.831, 0.400]], [0.663, [0.663, 0.831, 0.400]], [0.665, [0.667, 0.833, 0.400]], [0.667, [0.667, 0.833, 0.400]], [0.669, [0.671, 0.835, 0.400]], [0.671, [0.671, 0.835, 0.400]], [0.673, [0.675, 0.837, 0.400]], [0.675, [0.675, 0.837, 0.400]], [0.677, [0.678, 0.839, 0.400]], [0.679, [0.678, 0.839, 0.400]], [0.681, [0.682, 0.841, 0.400]], [0.683, [0.682, 0.841, 0.400]], [0.685, [0.686, 0.843, 0.400]], [0.687, [0.686, 0.843, 0.400]], [0.689, [0.690, 0.845, 0.400]], [0.691, [0.690, 0.845, 0.400]], [0.693, [0.694, 0.847, 0.400]], [0.695, [0.694, 0.847, 0.400]], [0.697, [0.698, 0.849, 0.400]], [0.699, [0.698, 0.849, 0.400]], [0.701, [0.702, 0.851, 0.400]], [0.703, [0.702, 0.851, 0.400]], [0.705, [0.706, 0.853, 0.400]], [0.706, [0.706, 0.853, 0.400]], [0.708, [0.710, 0.855, 0.400]], [0.710, [0.710, 0.855, 0.400]], [0.712, [0.714, 0.857, 0.400]], [0.714, [0.714, 0.857, 0.400]], [0.716, [0.718, 0.859, 0.400]], [0.718, [0.718, 0.859, 0.400]], [0.720, [0.722, 0.861, 0.400]], [0.722, [0.722, 0.861, 0.400]], [0.724, [0.725, 0.863, 0.400]], [0.726, [0.725, 0.863, 0.400]], [0.728, [0.729, 0.865, 0.400]], [0.730, [0.729, 0.865, 0.400]], [0.732, [0.733, 0.867, 0.400]], [0.734, [0.733, 0.867, 0.400]], [0.736, [0.737, 0.869, 0.400]], [0.738, [0.737, 0.869, 0.400]], [0.740, [0.741, 0.871, 0.400]], [0.742, [0.741, 0.871, 0.400]], [0.744, [0.745, 0.873, 0.400]], [0.746, [0.745, 0.873, 0.400]], [0.748, [0.749, 0.875, 0.400]], [0.750, [0.749, 0.875, 0.400]], [0.751, [0.753, 0.876, 0.400]], [0.753, [0.753, 0.876, 0.400]], [0.755, [0.757, 0.878, 0.400]], [0.757, [0.757, 0.878, 0.400]], [0.759, [0.761, 0.880, 0.400]], [0.761, [0.761, 0.880, 0.400]], [0.763, [0.765, 0.882, 0.400]], [0.765, [0.765, 0.882, 0.400]], [0.767, [0.769, 0.884, 0.400]], [0.769, [0.769, 0.884, 0.400]], [0.771, [0.773, 0.886, 0.400]], [0.773, [0.773, 0.886, 0.400]], [0.775, [0.776, 0.888, 0.400]], [0.777, [0.776, 0.888, 0.400]], [0.779, [0.780, 0.890, 0.400]], [0.781, [0.780, 0.890, 0.400]], [0.783, [0.784, 0.892, 0.400]], [0.785, [0.784, 0.892, 0.400]], [0.787, [0.788, 0.894, 0.400]], [0.789, [0.788, 0.894, 0.400]], [0.791, [0.792, 0.896, 0.400]], [0.793, [0.792, 0.896, 0.400]], [0.795, [0.796, 0.898, 0.400]], [0.796, [0.796, 0.898, 0.400]], [0.798, [0.800, 0.900, 0.400]], [0.800, [0.800, 0.900, 0.400]], [0.802, [0.804, 0.902, 0.400]], [0.804, [0.804, 0.902, 0.400]], [0.806, [0.808, 0.904, 0.400]], [0.808, [0.808, 0.904, 0.400]], [0.810, [0.812, 0.906, 0.400]], [0.812, [0.812, 0.906, 0.400]], [0.814, [0.816, 0.908, 0.400]], [0.816, [0.816, 0.908, 0.400]], [0.818, [0.820, 0.910, 0.400]], [0.820, [0.820, 0.910, 0.400]], [0.822, [0.824, 0.912, 0.400]], [0.824, [0.824, 0.912, 0.400]], [0.826, [0.827, 0.914, 0.400]], [0.828, [0.827, 0.914, 0.400]], [0.830, [0.831, 0.916, 0.400]], [0.832, [0.831, 0.916, 0.400]], [0.834, [0.835, 0.918, 0.400]], [0.836, [0.835, 0.918, 0.400]], [0.838, [0.839, 0.920, 0.400]], [0.840, [0.839, 0.920, 0.400]], [0.841, [0.843, 0.922, 0.400]], [0.843, [0.843, 0.922, 0.400]], [0.845, [0.847, 0.924, 0.400]], [0.847, [0.847, 0.924, 0.400]], [0.849, [0.851, 0.925, 0.400]], [0.851, [0.851, 0.925, 0.400]], [0.853, [0.855, 0.927, 0.400]], [0.855, [0.855, 0.927, 0.400]], [0.857, [0.859, 0.929, 0.400]], [0.859, [0.859, 0.929, 0.400]], [0.861, [0.863, 0.931, 0.400]], [0.863, [0.863, 0.931, 0.400]], [0.865, [0.867, 0.933, 0.400]], [0.867, [0.867, 0.933, 0.400]], [0.869, [0.871, 0.935, 0.400]], [0.871, [0.871, 0.935, 0.400]], [0.873, [0.875, 0.937, 0.400]], [0.875, [0.875, 0.937, 0.400]], [0.877, [0.878, 0.939, 0.400]], [0.879, [0.878, 0.939, 0.400]], [0.881, [0.882, 0.941, 0.400]], [0.883, [0.882, 0.941, 0.400]], [0.885, [0.886, 0.943, 0.400]], [0.886, [0.886, 0.943, 0.400]], [0.888, [0.890, 0.945, 0.400]], [0.890, [0.890, 0.945, 0.400]], [0.892, [0.894, 0.947, 0.400]], [0.894, [0.894, 0.947, 0.400]], [0.896, [0.898, 0.949, 0.400]], [0.898, [0.898, 0.949, 0.400]], [0.900, [0.902, 0.951, 0.400]], [0.902, [0.902, 0.951, 0.400]], [0.904, [0.906, 0.953, 0.400]], [0.906, [0.906, 0.953, 0.400]], [0.908, [0.910, 0.955, 0.400]], [0.910, [0.910, 0.955, 0.400]], [0.912, [0.914, 0.957, 0.400]], [0.914, [0.914, 0.957, 0.400]], [0.916, [0.918, 0.959, 0.400]], [0.918, [0.918, 0.959, 0.400]], [0.920, [0.922, 0.961, 0.400]], [0.922, [0.922, 0.961, 0.400]], [0.924, [0.925, 0.963, 0.400]], [0.926, [0.925, 0.963, 0.400]], [0.928, [0.929, 0.965, 0.400]], [0.930, [0.929, 0.965, 0.400]], [0.932, [0.933, 0.967, 0.400]], [0.933, [0.933, 0.967, 0.400]], [0.935, [0.937, 0.969, 0.400]], [0.937, [0.937, 0.969, 0.400]], [0.939, [0.941, 0.971, 0.400]], [0.941, [0.941, 0.971, 0.400]], [0.943, [0.945, 0.973, 0.400]], [0.945, [0.945, 0.973, 0.400]], [0.947, [0.949, 0.975, 0.400]], [0.949, [0.949, 0.975, 0.400]], [0.951, [0.953, 0.976, 0.400]], [0.953, [0.953, 0.976, 0.400]], [0.955, [0.957, 0.978, 0.400]], [0.957, [0.957, 0.978, 0.400]], [0.959, [0.961, 0.980, 0.400]], [0.961, [0.961, 0.980, 0.400]], [0.963, [0.965, 0.982, 0.400]], [0.965, [0.965, 0.982, 0.400]], [0.967, [0.969, 0.984, 0.400]], [0.969, [0.969, 0.984, 0.400]], [0.971, [0.973, 0.986, 0.400]], [0.973, [0.973, 0.986, 0.400]], [0.975, [0.976, 0.988, 0.400]], [0.977, [0.976, 0.988, 0.400]], [0.978, [0.980, 0.990, 0.400]], [0.980, [0.980, 0.990, 0.400]], [0.982, [0.984, 0.992, 0.400]], [0.984, [0.984, 0.992, 0.400]], [0.986, [0.988, 0.994, 0.400]], [0.988, [0.988, 0.994, 0.400]], [0.990, [0.992, 0.996, 0.400]], [0.992, [0.992, 0.996, 0.400]], [0.994, [0.996, 0.998, 0.400]], [0.996, [0.996, 0.998, 0.400]], [0.998, [1.000, 1.000, 0.400]], [1.000, [1.000, 1.000, 0.400]]]; +var winter = [[0.000, [0.000, 0.000, 1.000]], [0.002, [0.000, 0.000, 1.000]], [0.004, [0.000, 0.004, 0.998]], [0.006, [0.000, 0.004, 0.998]], [0.008, [0.000, 0.008, 0.996]], [0.010, [0.000, 0.008, 0.996]], [0.012, [0.000, 0.012, 0.994]], [0.014, [0.000, 0.012, 0.994]], [0.016, [0.000, 0.016, 0.992]], [0.018, [0.000, 0.016, 0.992]], [0.020, [0.000, 0.020, 0.990]], [0.022, [0.000, 0.020, 0.990]], [0.023, [0.000, 0.024, 0.988]], [0.025, [0.000, 0.024, 0.988]], [0.027, [0.000, 0.027, 0.986]], [0.029, [0.000, 0.027, 0.986]], [0.031, [0.000, 0.031, 0.984]], [0.033, [0.000, 0.031, 0.984]], [0.035, [0.000, 0.035, 0.982]], [0.037, [0.000, 0.035, 0.982]], [0.039, [0.000, 0.039, 0.980]], [0.041, [0.000, 0.039, 0.980]], [0.043, [0.000, 0.043, 0.978]], [0.045, [0.000, 0.043, 0.978]], [0.047, [0.000, 0.047, 0.976]], [0.049, [0.000, 0.047, 0.976]], [0.051, [0.000, 0.051, 0.975]], [0.053, [0.000, 0.051, 0.975]], [0.055, [0.000, 0.055, 0.973]], [0.057, [0.000, 0.055, 0.973]], [0.059, [0.000, 0.059, 0.971]], [0.061, [0.000, 0.059, 0.971]], [0.063, [0.000, 0.063, 0.969]], [0.065, [0.000, 0.063, 0.969]], [0.067, [0.000, 0.067, 0.967]], [0.068, [0.000, 0.067, 0.967]], [0.070, [0.000, 0.071, 0.965]], [0.072, [0.000, 0.071, 0.965]], [0.074, [0.000, 0.075, 0.963]], [0.076, [0.000, 0.075, 0.963]], [0.078, [0.000, 0.078, 0.961]], [0.080, [0.000, 0.078, 0.961]], [0.082, [0.000, 0.082, 0.959]], [0.084, [0.000, 0.082, 0.959]], [0.086, [0.000, 0.086, 0.957]], [0.088, [0.000, 0.086, 0.957]], [0.090, [0.000, 0.090, 0.955]], [0.092, [0.000, 0.090, 0.955]], [0.094, [0.000, 0.094, 0.953]], [0.096, [0.000, 0.094, 0.953]], [0.098, [0.000, 0.098, 0.951]], [0.100, [0.000, 0.098, 0.951]], [0.102, [0.000, 0.102, 0.949]], [0.104, [0.000, 0.102, 0.949]], [0.106, [0.000, 0.106, 0.947]], [0.108, [0.000, 0.106, 0.947]], [0.110, [0.000, 0.110, 0.945]], [0.112, [0.000, 0.110, 0.945]], [0.114, [0.000, 0.114, 0.943]], [0.115, [0.000, 0.114, 0.943]], [0.117, [0.000, 0.118, 0.941]], [0.119, [0.000, 0.118, 0.941]], [0.121, [0.000, 0.122, 0.939]], [0.123, [0.000, 0.122, 0.939]], [0.125, [0.000, 0.125, 0.937]], [0.127, [0.000, 0.125, 0.937]], [0.129, [0.000, 0.129, 0.935]], [0.131, [0.000, 0.129, 0.935]], [0.133, [0.000, 0.133, 0.933]], [0.135, [0.000, 0.133, 0.933]], [0.137, [0.000, 0.137, 0.931]], [0.139, [0.000, 0.137, 0.931]], [0.141, [0.000, 0.141, 0.929]], [0.143, [0.000, 0.141, 0.929]], [0.145, [0.000, 0.145, 0.927]], [0.147, [0.000, 0.145, 0.927]], [0.149, [0.000, 0.149, 0.925]], [0.151, [0.000, 0.149, 0.925]], [0.153, [0.000, 0.153, 0.924]], [0.155, [0.000, 0.153, 0.924]], [0.157, [0.000, 0.157, 0.922]], [0.159, [0.000, 0.157, 0.922]], [0.160, [0.000, 0.161, 0.920]], [0.162, [0.000, 0.161, 0.920]], [0.164, [0.000, 0.165, 0.918]], [0.166, [0.000, 0.165, 0.918]], [0.168, [0.000, 0.169, 0.916]], [0.170, [0.000, 0.169, 0.916]], [0.172, [0.000, 0.173, 0.914]], [0.174, [0.000, 0.173, 0.914]], [0.176, [0.000, 0.176, 0.912]], [0.178, [0.000, 0.176, 0.912]], [0.180, [0.000, 0.180, 0.910]], [0.182, [0.000, 0.180, 0.910]], [0.184, [0.000, 0.184, 0.908]], [0.186, [0.000, 0.184, 0.908]], [0.188, [0.000, 0.188, 0.906]], [0.190, [0.000, 0.188, 0.906]], [0.192, [0.000, 0.192, 0.904]], [0.194, [0.000, 0.192, 0.904]], [0.196, [0.000, 0.196, 0.902]], [0.198, [0.000, 0.196, 0.902]], [0.200, [0.000, 0.200, 0.900]], [0.202, [0.000, 0.200, 0.900]], [0.204, [0.000, 0.204, 0.898]], [0.205, [0.000, 0.204, 0.898]], [0.207, [0.000, 0.208, 0.896]], [0.209, [0.000, 0.208, 0.896]], [0.211, [0.000, 0.212, 0.894]], [0.213, [0.000, 0.212, 0.894]], [0.215, [0.000, 0.216, 0.892]], [0.217, [0.000, 0.216, 0.892]], [0.219, [0.000, 0.220, 0.890]], [0.221, [0.000, 0.220, 0.890]], [0.223, [0.000, 0.224, 0.888]], [0.225, [0.000, 0.224, 0.888]], [0.227, [0.000, 0.227, 0.886]], [0.229, [0.000, 0.227, 0.886]], [0.231, [0.000, 0.231, 0.884]], [0.233, [0.000, 0.231, 0.884]], [0.235, [0.000, 0.235, 0.882]], [0.237, [0.000, 0.235, 0.882]], [0.239, [0.000, 0.239, 0.880]], [0.241, [0.000, 0.239, 0.880]], [0.243, [0.000, 0.243, 0.878]], [0.245, [0.000, 0.243, 0.878]], [0.247, [0.000, 0.247, 0.876]], [0.249, [0.000, 0.247, 0.876]], [0.250, [0.000, 0.251, 0.875]], [0.252, [0.000, 0.251, 0.875]], [0.254, [0.000, 0.255, 0.873]], [0.256, [0.000, 0.255, 0.873]], [0.258, [0.000, 0.259, 0.871]], [0.260, [0.000, 0.259, 0.871]], [0.262, [0.000, 0.263, 0.869]], [0.264, [0.000, 0.263, 0.869]], [0.266, [0.000, 0.267, 0.867]], [0.268, [0.000, 0.267, 0.867]], [0.270, [0.000, 0.271, 0.865]], [0.272, [0.000, 0.271, 0.865]], [0.274, [0.000, 0.275, 0.863]], [0.276, [0.000, 0.275, 0.863]], [0.278, [0.000, 0.278, 0.861]], [0.280, [0.000, 0.278, 0.861]], [0.282, [0.000, 0.282, 0.859]], [0.284, [0.000, 0.282, 0.859]], [0.286, [0.000, 0.286, 0.857]], [0.288, [0.000, 0.286, 0.857]], [0.290, [0.000, 0.290, 0.855]], [0.292, [0.000, 0.290, 0.855]], [0.294, [0.000, 0.294, 0.853]], [0.295, [0.000, 0.294, 0.853]], [0.297, [0.000, 0.298, 0.851]], [0.299, [0.000, 0.298, 0.851]], [0.301, [0.000, 0.302, 0.849]], [0.303, [0.000, 0.302, 0.849]], [0.305, [0.000, 0.306, 0.847]], [0.307, [0.000, 0.306, 0.847]], [0.309, [0.000, 0.310, 0.845]], [0.311, [0.000, 0.310, 0.845]], [0.313, [0.000, 0.314, 0.843]], [0.315, [0.000, 0.314, 0.843]], [0.317, [0.000, 0.318, 0.841]], [0.319, [0.000, 0.318, 0.841]], [0.321, [0.000, 0.322, 0.839]], [0.323, [0.000, 0.322, 0.839]], [0.325, [0.000, 0.325, 0.837]], [0.327, [0.000, 0.325, 0.837]], [0.329, [0.000, 0.329, 0.835]], [0.331, [0.000, 0.329, 0.835]], [0.333, [0.000, 0.333, 0.833]], [0.335, [0.000, 0.333, 0.833]], [0.337, [0.000, 0.337, 0.831]], [0.339, [0.000, 0.337, 0.831]], [0.341, [0.000, 0.341, 0.829]], [0.342, [0.000, 0.341, 0.829]], [0.344, [0.000, 0.345, 0.827]], [0.346, [0.000, 0.345, 0.827]], [0.348, [0.000, 0.349, 0.825]], [0.350, [0.000, 0.349, 0.825]], [0.352, [0.000, 0.353, 0.824]], [0.354, [0.000, 0.353, 0.824]], [0.356, [0.000, 0.357, 0.822]], [0.358, [0.000, 0.357, 0.822]], [0.360, [0.000, 0.361, 0.820]], [0.362, [0.000, 0.361, 0.820]], [0.364, [0.000, 0.365, 0.818]], [0.366, [0.000, 0.365, 0.818]], [0.368, [0.000, 0.369, 0.816]], [0.370, [0.000, 0.369, 0.816]], [0.372, [0.000, 0.373, 0.814]], [0.374, [0.000, 0.373, 0.814]], [0.376, [0.000, 0.376, 0.812]], [0.378, [0.000, 0.376, 0.812]], [0.380, [0.000, 0.380, 0.810]], [0.382, [0.000, 0.380, 0.810]], [0.384, [0.000, 0.384, 0.808]], [0.386, [0.000, 0.384, 0.808]], [0.387, [0.000, 0.388, 0.806]], [0.389, [0.000, 0.388, 0.806]], [0.391, [0.000, 0.392, 0.804]], [0.393, [0.000, 0.392, 0.804]], [0.395, [0.000, 0.396, 0.802]], [0.397, [0.000, 0.396, 0.802]], [0.399, [0.000, 0.400, 0.800]], [0.401, [0.000, 0.400, 0.800]], [0.403, [0.000, 0.404, 0.798]], [0.405, [0.000, 0.404, 0.798]], [0.407, [0.000, 0.408, 0.796]], [0.409, [0.000, 0.408, 0.796]], [0.411, [0.000, 0.412, 0.794]], [0.413, [0.000, 0.412, 0.794]], [0.415, [0.000, 0.416, 0.792]], [0.417, [0.000, 0.416, 0.792]], [0.419, [0.000, 0.420, 0.790]], [0.421, [0.000, 0.420, 0.790]], [0.423, [0.000, 0.424, 0.788]], [0.425, [0.000, 0.424, 0.788]], [0.427, [0.000, 0.427, 0.786]], [0.429, [0.000, 0.427, 0.786]], [0.431, [0.000, 0.431, 0.784]], [0.432, [0.000, 0.431, 0.784]], [0.434, [0.000, 0.435, 0.782]], [0.436, [0.000, 0.435, 0.782]], [0.438, [0.000, 0.439, 0.780]], [0.440, [0.000, 0.439, 0.780]], [0.442, [0.000, 0.443, 0.778]], [0.444, [0.000, 0.443, 0.778]], [0.446, [0.000, 0.447, 0.776]], [0.448, [0.000, 0.447, 0.776]], [0.450, [0.000, 0.451, 0.775]], [0.452, [0.000, 0.451, 0.775]], [0.454, [0.000, 0.455, 0.773]], [0.456, [0.000, 0.455, 0.773]], [0.458, [0.000, 0.459, 0.771]], [0.460, [0.000, 0.459, 0.771]], [0.462, [0.000, 0.463, 0.769]], [0.464, [0.000, 0.463, 0.769]], [0.466, [0.000, 0.467, 0.767]], [0.468, [0.000, 0.467, 0.767]], [0.470, [0.000, 0.471, 0.765]], [0.472, [0.000, 0.471, 0.765]], [0.474, [0.000, 0.475, 0.763]], [0.476, [0.000, 0.475, 0.763]], [0.477, [0.000, 0.478, 0.761]], [0.479, [0.000, 0.478, 0.761]], [0.481, [0.000, 0.482, 0.759]], [0.483, [0.000, 0.482, 0.759]], [0.485, [0.000, 0.486, 0.757]], [0.487, [0.000, 0.486, 0.757]], [0.489, [0.000, 0.490, 0.755]], [0.491, [0.000, 0.490, 0.755]], [0.493, [0.000, 0.494, 0.753]], [0.495, [0.000, 0.494, 0.753]], [0.497, [0.000, 0.498, 0.751]], [0.499, [0.000, 0.498, 0.751]], [0.501, [0.000, 0.502, 0.749]], [0.503, [0.000, 0.502, 0.749]], [0.505, [0.000, 0.506, 0.747]], [0.507, [0.000, 0.506, 0.747]], [0.509, [0.000, 0.510, 0.745]], [0.511, [0.000, 0.510, 0.745]], [0.513, [0.000, 0.514, 0.743]], [0.515, [0.000, 0.514, 0.743]], [0.517, [0.000, 0.518, 0.741]], [0.519, [0.000, 0.518, 0.741]], [0.521, [0.000, 0.522, 0.739]], [0.523, [0.000, 0.522, 0.739]], [0.524, [0.000, 0.525, 0.737]], [0.526, [0.000, 0.525, 0.737]], [0.528, [0.000, 0.529, 0.735]], [0.530, [0.000, 0.529, 0.735]], [0.532, [0.000, 0.533, 0.733]], [0.534, [0.000, 0.533, 0.733]], [0.536, [0.000, 0.537, 0.731]], [0.538, [0.000, 0.537, 0.731]], [0.540, [0.000, 0.541, 0.729]], [0.542, [0.000, 0.541, 0.729]], [0.544, [0.000, 0.545, 0.727]], [0.546, [0.000, 0.545, 0.727]], [0.548, [0.000, 0.549, 0.725]], [0.550, [0.000, 0.549, 0.725]], [0.552, [0.000, 0.553, 0.724]], [0.554, [0.000, 0.553, 0.724]], [0.556, [0.000, 0.557, 0.722]], [0.558, [0.000, 0.557, 0.722]], [0.560, [0.000, 0.561, 0.720]], [0.562, [0.000, 0.561, 0.720]], [0.564, [0.000, 0.565, 0.718]], [0.566, [0.000, 0.565, 0.718]], [0.568, [0.000, 0.569, 0.716]], [0.569, [0.000, 0.569, 0.716]], [0.571, [0.000, 0.573, 0.714]], [0.573, [0.000, 0.573, 0.714]], [0.575, [0.000, 0.576, 0.712]], [0.577, [0.000, 0.576, 0.712]], [0.579, [0.000, 0.580, 0.710]], [0.581, [0.000, 0.580, 0.710]], [0.583, [0.000, 0.584, 0.708]], [0.585, [0.000, 0.584, 0.708]], [0.587, [0.000, 0.588, 0.706]], [0.589, [0.000, 0.588, 0.706]], [0.591, [0.000, 0.592, 0.704]], [0.593, [0.000, 0.592, 0.704]], [0.595, [0.000, 0.596, 0.702]], [0.597, [0.000, 0.596, 0.702]], [0.599, [0.000, 0.600, 0.700]], [0.601, [0.000, 0.600, 0.700]], [0.603, [0.000, 0.604, 0.698]], [0.605, [0.000, 0.604, 0.698]], [0.607, [0.000, 0.608, 0.696]], [0.609, [0.000, 0.608, 0.696]], [0.611, [0.000, 0.612, 0.694]], [0.613, [0.000, 0.612, 0.694]], [0.614, [0.000, 0.616, 0.692]], [0.616, [0.000, 0.616, 0.692]], [0.618, [0.000, 0.620, 0.690]], [0.620, [0.000, 0.620, 0.690]], [0.622, [0.000, 0.624, 0.688]], [0.624, [0.000, 0.624, 0.688]], [0.626, [0.000, 0.627, 0.686]], [0.628, [0.000, 0.627, 0.686]], [0.630, [0.000, 0.631, 0.684]], [0.632, [0.000, 0.631, 0.684]], [0.634, [0.000, 0.635, 0.682]], [0.636, [0.000, 0.635, 0.682]], [0.638, [0.000, 0.639, 0.680]], [0.640, [0.000, 0.639, 0.680]], [0.642, [0.000, 0.643, 0.678]], [0.644, [0.000, 0.643, 0.678]], [0.646, [0.000, 0.647, 0.676]], [0.648, [0.000, 0.647, 0.676]], [0.650, [0.000, 0.651, 0.675]], [0.652, [0.000, 0.651, 0.675]], [0.654, [0.000, 0.655, 0.673]], [0.656, [0.000, 0.655, 0.673]], [0.658, [0.000, 0.659, 0.671]], [0.659, [0.000, 0.659, 0.671]], [0.661, [0.000, 0.663, 0.669]], [0.663, [0.000, 0.663, 0.669]], [0.665, [0.000, 0.667, 0.667]], [0.667, [0.000, 0.667, 0.667]], [0.669, [0.000, 0.671, 0.665]], [0.671, [0.000, 0.671, 0.665]], [0.673, [0.000, 0.675, 0.663]], [0.675, [0.000, 0.675, 0.663]], [0.677, [0.000, 0.678, 0.661]], [0.679, [0.000, 0.678, 0.661]], [0.681, [0.000, 0.682, 0.659]], [0.683, [0.000, 0.682, 0.659]], [0.685, [0.000, 0.686, 0.657]], [0.687, [0.000, 0.686, 0.657]], [0.689, [0.000, 0.690, 0.655]], [0.691, [0.000, 0.690, 0.655]], [0.693, [0.000, 0.694, 0.653]], [0.695, [0.000, 0.694, 0.653]], [0.697, [0.000, 0.698, 0.651]], [0.699, [0.000, 0.698, 0.651]], [0.701, [0.000, 0.702, 0.649]], [0.703, [0.000, 0.702, 0.649]], [0.705, [0.000, 0.706, 0.647]], [0.706, [0.000, 0.706, 0.647]], [0.708, [0.000, 0.710, 0.645]], [0.710, [0.000, 0.710, 0.645]], [0.712, [0.000, 0.714, 0.643]], [0.714, [0.000, 0.714, 0.643]], [0.716, [0.000, 0.718, 0.641]], [0.718, [0.000, 0.718, 0.641]], [0.720, [0.000, 0.722, 0.639]], [0.722, [0.000, 0.722, 0.639]], [0.724, [0.000, 0.725, 0.637]], [0.726, [0.000, 0.725, 0.637]], [0.728, [0.000, 0.729, 0.635]], [0.730, [0.000, 0.729, 0.635]], [0.732, [0.000, 0.733, 0.633]], [0.734, [0.000, 0.733, 0.633]], [0.736, [0.000, 0.737, 0.631]], [0.738, [0.000, 0.737, 0.631]], [0.740, [0.000, 0.741, 0.629]], [0.742, [0.000, 0.741, 0.629]], [0.744, [0.000, 0.745, 0.627]], [0.746, [0.000, 0.745, 0.627]], [0.748, [0.000, 0.749, 0.625]], [0.750, [0.000, 0.749, 0.625]], [0.751, [0.000, 0.753, 0.624]], [0.753, [0.000, 0.753, 0.624]], [0.755, [0.000, 0.757, 0.622]], [0.757, [0.000, 0.757, 0.622]], [0.759, [0.000, 0.761, 0.620]], [0.761, [0.000, 0.761, 0.620]], [0.763, [0.000, 0.765, 0.618]], [0.765, [0.000, 0.765, 0.618]], [0.767, [0.000, 0.769, 0.616]], [0.769, [0.000, 0.769, 0.616]], [0.771, [0.000, 0.773, 0.614]], [0.773, [0.000, 0.773, 0.614]], [0.775, [0.000, 0.776, 0.612]], [0.777, [0.000, 0.776, 0.612]], [0.779, [0.000, 0.780, 0.610]], [0.781, [0.000, 0.780, 0.610]], [0.783, [0.000, 0.784, 0.608]], [0.785, [0.000, 0.784, 0.608]], [0.787, [0.000, 0.788, 0.606]], [0.789, [0.000, 0.788, 0.606]], [0.791, [0.000, 0.792, 0.604]], [0.793, [0.000, 0.792, 0.604]], [0.795, [0.000, 0.796, 0.602]], [0.796, [0.000, 0.796, 0.602]], [0.798, [0.000, 0.800, 0.600]], [0.800, [0.000, 0.800, 0.600]], [0.802, [0.000, 0.804, 0.598]], [0.804, [0.000, 0.804, 0.598]], [0.806, [0.000, 0.808, 0.596]], [0.808, [0.000, 0.808, 0.596]], [0.810, [0.000, 0.812, 0.594]], [0.812, [0.000, 0.812, 0.594]], [0.814, [0.000, 0.816, 0.592]], [0.816, [0.000, 0.816, 0.592]], [0.818, [0.000, 0.820, 0.590]], [0.820, [0.000, 0.820, 0.590]], [0.822, [0.000, 0.824, 0.588]], [0.824, [0.000, 0.824, 0.588]], [0.826, [0.000, 0.827, 0.586]], [0.828, [0.000, 0.827, 0.586]], [0.830, [0.000, 0.831, 0.584]], [0.832, [0.000, 0.831, 0.584]], [0.834, [0.000, 0.835, 0.582]], [0.836, [0.000, 0.835, 0.582]], [0.838, [0.000, 0.839, 0.580]], [0.840, [0.000, 0.839, 0.580]], [0.841, [0.000, 0.843, 0.578]], [0.843, [0.000, 0.843, 0.578]], [0.845, [0.000, 0.847, 0.576]], [0.847, [0.000, 0.847, 0.576]], [0.849, [0.000, 0.851, 0.575]], [0.851, [0.000, 0.851, 0.575]], [0.853, [0.000, 0.855, 0.573]], [0.855, [0.000, 0.855, 0.573]], [0.857, [0.000, 0.859, 0.571]], [0.859, [0.000, 0.859, 0.571]], [0.861, [0.000, 0.863, 0.569]], [0.863, [0.000, 0.863, 0.569]], [0.865, [0.000, 0.867, 0.567]], [0.867, [0.000, 0.867, 0.567]], [0.869, [0.000, 0.871, 0.565]], [0.871, [0.000, 0.871, 0.565]], [0.873, [0.000, 0.875, 0.563]], [0.875, [0.000, 0.875, 0.563]], [0.877, [0.000, 0.878, 0.561]], [0.879, [0.000, 0.878, 0.561]], [0.881, [0.000, 0.882, 0.559]], [0.883, [0.000, 0.882, 0.559]], [0.885, [0.000, 0.886, 0.557]], [0.886, [0.000, 0.886, 0.557]], [0.888, [0.000, 0.890, 0.555]], [0.890, [0.000, 0.890, 0.555]], [0.892, [0.000, 0.894, 0.553]], [0.894, [0.000, 0.894, 0.553]], [0.896, [0.000, 0.898, 0.551]], [0.898, [0.000, 0.898, 0.551]], [0.900, [0.000, 0.902, 0.549]], [0.902, [0.000, 0.902, 0.549]], [0.904, [0.000, 0.906, 0.547]], [0.906, [0.000, 0.906, 0.547]], [0.908, [0.000, 0.910, 0.545]], [0.910, [0.000, 0.910, 0.545]], [0.912, [0.000, 0.914, 0.543]], [0.914, [0.000, 0.914, 0.543]], [0.916, [0.000, 0.918, 0.541]], [0.918, [0.000, 0.918, 0.541]], [0.920, [0.000, 0.922, 0.539]], [0.922, [0.000, 0.922, 0.539]], [0.924, [0.000, 0.925, 0.537]], [0.926, [0.000, 0.925, 0.537]], [0.928, [0.000, 0.929, 0.535]], [0.930, [0.000, 0.929, 0.535]], [0.932, [0.000, 0.933, 0.533]], [0.933, [0.000, 0.933, 0.533]], [0.935, [0.000, 0.937, 0.531]], [0.937, [0.000, 0.937, 0.531]], [0.939, [0.000, 0.941, 0.529]], [0.941, [0.000, 0.941, 0.529]], [0.943, [0.000, 0.945, 0.527]], [0.945, [0.000, 0.945, 0.527]], [0.947, [0.000, 0.949, 0.525]], [0.949, [0.000, 0.949, 0.525]], [0.951, [0.000, 0.953, 0.524]], [0.953, [0.000, 0.953, 0.524]], [0.955, [0.000, 0.957, 0.522]], [0.957, [0.000, 0.957, 0.522]], [0.959, [0.000, 0.961, 0.520]], [0.961, [0.000, 0.961, 0.520]], [0.963, [0.000, 0.965, 0.518]], [0.965, [0.000, 0.965, 0.518]], [0.967, [0.000, 0.969, 0.516]], [0.969, [0.000, 0.969, 0.516]], [0.971, [0.000, 0.973, 0.514]], [0.973, [0.000, 0.973, 0.514]], [0.975, [0.000, 0.976, 0.512]], [0.977, [0.000, 0.976, 0.512]], [0.978, [0.000, 0.980, 0.510]], [0.980, [0.000, 0.980, 0.510]], [0.982, [0.000, 0.984, 0.508]], [0.984, [0.000, 0.984, 0.508]], [0.986, [0.000, 0.988, 0.506]], [0.988, [0.000, 0.988, 0.506]], [0.990, [0.000, 0.992, 0.504]], [0.992, [0.000, 0.992, 0.504]], [0.994, [0.000, 0.996, 0.502]], [0.996, [0.000, 0.996, 0.502]], [0.998, [0.000, 1.000, 0.500]], [1.000, [0.000, 1.000, 0.500]]]; + +// Miscellaneous +var CMRmap = [[0.000, [0.000, 0.000, 0.000]], [0.002, [0.000, 0.000, 0.000]], [0.004, [0.005, 0.005, 0.016]], [0.006, [0.005, 0.005, 0.016]], [0.008, [0.009, 0.009, 0.031]], [0.010, [0.009, 0.009, 0.031]], [0.012, [0.014, 0.014, 0.047]], [0.014, [0.014, 0.014, 0.047]], [0.016, [0.019, 0.019, 0.063]], [0.018, [0.019, 0.019, 0.063]], [0.020, [0.024, 0.024, 0.078]], [0.022, [0.024, 0.024, 0.078]], [0.023, [0.028, 0.028, 0.094]], [0.025, [0.028, 0.028, 0.094]], [0.027, [0.033, 0.033, 0.110]], [0.029, [0.033, 0.033, 0.110]], [0.031, [0.038, 0.038, 0.125]], [0.033, [0.038, 0.038, 0.125]], [0.035, [0.042, 0.042, 0.141]], [0.037, [0.042, 0.042, 0.141]], [0.039, [0.047, 0.047, 0.157]], [0.041, [0.047, 0.047, 0.157]], [0.043, [0.052, 0.052, 0.173]], [0.045, [0.052, 0.052, 0.173]], [0.047, [0.056, 0.056, 0.188]], [0.049, [0.056, 0.056, 0.188]], [0.051, [0.061, 0.061, 0.204]], [0.053, [0.061, 0.061, 0.204]], [0.055, [0.066, 0.066, 0.220]], [0.057, [0.066, 0.066, 0.220]], [0.059, [0.071, 0.071, 0.235]], [0.061, [0.071, 0.071, 0.235]], [0.063, [0.075, 0.075, 0.251]], [0.065, [0.075, 0.075, 0.251]], [0.067, [0.080, 0.080, 0.267]], [0.068, [0.080, 0.080, 0.267]], [0.070, [0.085, 0.085, 0.282]], [0.072, [0.085, 0.085, 0.282]], [0.074, [0.089, 0.089, 0.298]], [0.076, [0.089, 0.089, 0.298]], [0.078, [0.094, 0.094, 0.314]], [0.080, [0.094, 0.094, 0.314]], [0.082, [0.099, 0.099, 0.329]], [0.084, [0.099, 0.099, 0.329]], [0.086, [0.104, 0.104, 0.345]], [0.088, [0.104, 0.104, 0.345]], [0.090, [0.108, 0.108, 0.361]], [0.092, [0.108, 0.108, 0.361]], [0.094, [0.113, 0.113, 0.376]], [0.096, [0.113, 0.113, 0.376]], [0.098, [0.118, 0.118, 0.392]], [0.100, [0.118, 0.118, 0.392]], [0.102, [0.122, 0.122, 0.408]], [0.104, [0.122, 0.122, 0.408]], [0.106, [0.127, 0.127, 0.424]], [0.108, [0.127, 0.127, 0.424]], [0.110, [0.132, 0.132, 0.439]], [0.112, [0.132, 0.132, 0.439]], [0.114, [0.136, 0.136, 0.455]], [0.115, [0.136, 0.136, 0.455]], [0.117, [0.141, 0.141, 0.471]], [0.119, [0.141, 0.141, 0.471]], [0.121, [0.146, 0.146, 0.486]], [0.123, [0.146, 0.146, 0.486]], [0.125, [0.151, 0.150, 0.501]], [0.127, [0.151, 0.150, 0.501]], [0.129, [0.155, 0.150, 0.509]], [0.131, [0.155, 0.150, 0.509]], [0.133, [0.160, 0.150, 0.517]], [0.135, [0.160, 0.150, 0.517]], [0.137, [0.165, 0.150, 0.525]], [0.139, [0.165, 0.150, 0.525]], [0.141, [0.169, 0.150, 0.532]], [0.143, [0.169, 0.150, 0.532]], [0.145, [0.174, 0.150, 0.540]], [0.147, [0.174, 0.150, 0.540]], [0.149, [0.179, 0.150, 0.548]], [0.151, [0.179, 0.150, 0.548]], [0.153, [0.184, 0.150, 0.556]], [0.155, [0.184, 0.150, 0.556]], [0.157, [0.188, 0.150, 0.564]], [0.159, [0.188, 0.150, 0.564]], [0.160, [0.193, 0.150, 0.572]], [0.162, [0.193, 0.150, 0.572]], [0.164, [0.198, 0.150, 0.579]], [0.166, [0.198, 0.150, 0.579]], [0.168, [0.202, 0.150, 0.587]], [0.170, [0.202, 0.150, 0.587]], [0.172, [0.207, 0.150, 0.595]], [0.174, [0.207, 0.150, 0.595]], [0.176, [0.212, 0.150, 0.603]], [0.178, [0.212, 0.150, 0.603]], [0.180, [0.216, 0.150, 0.611]], [0.182, [0.216, 0.150, 0.611]], [0.184, [0.221, 0.150, 0.619]], [0.186, [0.221, 0.150, 0.619]], [0.188, [0.226, 0.150, 0.626]], [0.190, [0.226, 0.150, 0.626]], [0.192, [0.231, 0.150, 0.634]], [0.194, [0.231, 0.150, 0.634]], [0.196, [0.235, 0.150, 0.642]], [0.198, [0.235, 0.150, 0.642]], [0.200, [0.240, 0.150, 0.650]], [0.202, [0.240, 0.150, 0.650]], [0.204, [0.245, 0.150, 0.658]], [0.205, [0.245, 0.150, 0.658]], [0.207, [0.249, 0.150, 0.666]], [0.209, [0.249, 0.150, 0.666]], [0.211, [0.254, 0.150, 0.674]], [0.213, [0.254, 0.150, 0.674]], [0.215, [0.259, 0.150, 0.681]], [0.217, [0.259, 0.150, 0.681]], [0.219, [0.264, 0.150, 0.689]], [0.221, [0.264, 0.150, 0.689]], [0.223, [0.268, 0.150, 0.697]], [0.225, [0.268, 0.150, 0.697]], [0.227, [0.273, 0.150, 0.705]], [0.229, [0.273, 0.150, 0.705]], [0.231, [0.278, 0.150, 0.713]], [0.233, [0.278, 0.150, 0.713]], [0.235, [0.282, 0.150, 0.721]], [0.237, [0.282, 0.150, 0.721]], [0.239, [0.287, 0.150, 0.728]], [0.241, [0.287, 0.150, 0.728]], [0.243, [0.292, 0.150, 0.736]], [0.245, [0.292, 0.150, 0.736]], [0.247, [0.296, 0.150, 0.744]], [0.249, [0.296, 0.150, 0.744]], [0.250, [0.302, 0.150, 0.748]], [0.252, [0.302, 0.150, 0.748]], [0.254, [0.312, 0.152, 0.740]], [0.256, [0.312, 0.152, 0.740]], [0.258, [0.321, 0.154, 0.732]], [0.260, [0.321, 0.154, 0.732]], [0.262, [0.331, 0.155, 0.725]], [0.264, [0.331, 0.155, 0.725]], [0.266, [0.340, 0.157, 0.717]], [0.268, [0.340, 0.157, 0.717]], [0.270, [0.349, 0.158, 0.709]], [0.272, [0.349, 0.158, 0.709]], [0.274, [0.359, 0.160, 0.701]], [0.276, [0.359, 0.160, 0.701]], [0.278, [0.368, 0.161, 0.693]], [0.280, [0.368, 0.161, 0.693]], [0.282, [0.378, 0.163, 0.685]], [0.284, [0.378, 0.163, 0.685]], [0.286, [0.387, 0.165, 0.677]], [0.288, [0.387, 0.165, 0.677]], [0.290, [0.396, 0.166, 0.670]], [0.292, [0.396, 0.166, 0.670]], [0.294, [0.406, 0.168, 0.662]], [0.295, [0.406, 0.168, 0.662]], [0.297, [0.415, 0.169, 0.654]], [0.299, [0.415, 0.169, 0.654]], [0.301, [0.425, 0.171, 0.646]], [0.303, [0.425, 0.171, 0.646]], [0.305, [0.434, 0.172, 0.638]], [0.307, [0.434, 0.172, 0.638]], [0.309, [0.444, 0.174, 0.630]], [0.311, [0.444, 0.174, 0.630]], [0.313, [0.453, 0.175, 0.623]], [0.315, [0.453, 0.175, 0.623]], [0.317, [0.462, 0.177, 0.615]], [0.319, [0.462, 0.177, 0.615]], [0.321, [0.472, 0.179, 0.607]], [0.323, [0.472, 0.179, 0.607]], [0.325, [0.481, 0.180, 0.599]], [0.327, [0.481, 0.180, 0.599]], [0.329, [0.491, 0.182, 0.591]], [0.331, [0.491, 0.182, 0.591]], [0.333, [0.500, 0.183, 0.583]], [0.335, [0.500, 0.183, 0.583]], [0.337, [0.509, 0.185, 0.575]], [0.339, [0.509, 0.185, 0.575]], [0.341, [0.519, 0.186, 0.568]], [0.342, [0.519, 0.186, 0.568]], [0.344, [0.528, 0.188, 0.560]], [0.346, [0.528, 0.188, 0.560]], [0.348, [0.538, 0.190, 0.552]], [0.350, [0.538, 0.190, 0.552]], [0.352, [0.547, 0.191, 0.544]], [0.354, [0.547, 0.191, 0.544]], [0.356, [0.556, 0.193, 0.536]], [0.358, [0.556, 0.193, 0.536]], [0.360, [0.566, 0.194, 0.528]], [0.362, [0.566, 0.194, 0.528]], [0.364, [0.575, 0.196, 0.521]], [0.366, [0.575, 0.196, 0.521]], [0.368, [0.585, 0.197, 0.513]], [0.370, [0.585, 0.197, 0.513]], [0.372, [0.594, 0.199, 0.505]], [0.374, [0.594, 0.199, 0.505]], [0.376, [0.605, 0.201, 0.496]], [0.378, [0.605, 0.201, 0.496]], [0.380, [0.617, 0.202, 0.485]], [0.382, [0.617, 0.202, 0.485]], [0.384, [0.630, 0.204, 0.474]], [0.386, [0.630, 0.204, 0.474]], [0.387, [0.642, 0.205, 0.463]], [0.389, [0.642, 0.205, 0.463]], [0.391, [0.655, 0.207, 0.452]], [0.393, [0.655, 0.207, 0.452]], [0.395, [0.667, 0.208, 0.441]], [0.397, [0.667, 0.208, 0.441]], [0.399, [0.680, 0.210, 0.430]], [0.401, [0.680, 0.210, 0.430]], [0.403, [0.693, 0.212, 0.419]], [0.405, [0.693, 0.212, 0.419]], [0.407, [0.705, 0.213, 0.408]], [0.409, [0.705, 0.213, 0.408]], [0.411, [0.718, 0.215, 0.397]], [0.413, [0.718, 0.215, 0.397]], [0.415, [0.730, 0.216, 0.386]], [0.417, [0.730, 0.216, 0.386]], [0.419, [0.743, 0.218, 0.375]], [0.421, [0.743, 0.218, 0.375]], [0.423, [0.755, 0.219, 0.364]], [0.425, [0.755, 0.219, 0.364]], [0.427, [0.768, 0.221, 0.353]], [0.429, [0.768, 0.221, 0.353]], [0.431, [0.780, 0.223, 0.342]], [0.432, [0.780, 0.223, 0.342]], [0.434, [0.793, 0.224, 0.331]], [0.436, [0.793, 0.224, 0.331]], [0.438, [0.805, 0.226, 0.320]], [0.440, [0.805, 0.226, 0.320]], [0.442, [0.818, 0.227, 0.309]], [0.444, [0.818, 0.227, 0.309]], [0.446, [0.831, 0.229, 0.298]], [0.448, [0.831, 0.229, 0.298]], [0.450, [0.843, 0.230, 0.287]], [0.452, [0.843, 0.230, 0.287]], [0.454, [0.856, 0.232, 0.276]], [0.456, [0.856, 0.232, 0.276]], [0.458, [0.868, 0.234, 0.265]], [0.460, [0.868, 0.234, 0.265]], [0.462, [0.881, 0.235, 0.254]], [0.464, [0.881, 0.235, 0.254]], [0.466, [0.893, 0.237, 0.243]], [0.468, [0.893, 0.237, 0.243]], [0.470, [0.906, 0.238, 0.232]], [0.472, [0.906, 0.238, 0.232]], [0.474, [0.918, 0.240, 0.221]], [0.476, [0.918, 0.240, 0.221]], [0.477, [0.931, 0.241, 0.210]], [0.479, [0.931, 0.241, 0.210]], [0.481, [0.944, 0.243, 0.199]], [0.483, [0.944, 0.243, 0.199]], [0.485, [0.956, 0.245, 0.188]], [0.487, [0.956, 0.245, 0.188]], [0.489, [0.969, 0.246, 0.177]], [0.491, [0.969, 0.246, 0.177]], [0.493, [0.981, 0.248, 0.166]], [0.495, [0.981, 0.248, 0.166]], [0.497, [0.994, 0.249, 0.155]], [0.499, [0.994, 0.249, 0.155]], [0.501, [0.998, 0.254, 0.148]], [0.503, [0.998, 0.254, 0.148]], [0.505, [0.995, 0.262, 0.143]], [0.507, [0.995, 0.262, 0.143]], [0.509, [0.992, 0.270, 0.138]], [0.511, [0.992, 0.270, 0.138]], [0.513, [0.989, 0.277, 0.134]], [0.515, [0.989, 0.277, 0.134]], [0.517, [0.986, 0.285, 0.129]], [0.519, [0.986, 0.285, 0.129]], [0.521, [0.983, 0.293, 0.124]], [0.523, [0.983, 0.293, 0.124]], [0.524, [0.980, 0.301, 0.119]], [0.526, [0.980, 0.301, 0.119]], [0.528, [0.976, 0.309, 0.115]], [0.530, [0.976, 0.309, 0.115]], [0.532, [0.973, 0.317, 0.110]], [0.534, [0.973, 0.317, 0.110]], [0.536, [0.970, 0.325, 0.105]], [0.538, [0.970, 0.325, 0.105]], [0.540, [0.967, 0.332, 0.101]], [0.542, [0.967, 0.332, 0.101]], [0.544, [0.964, 0.340, 0.096]], [0.546, [0.964, 0.340, 0.096]], [0.548, [0.961, 0.348, 0.091]], [0.550, [0.961, 0.348, 0.091]], [0.552, [0.958, 0.356, 0.086]], [0.554, [0.958, 0.356, 0.086]], [0.556, [0.955, 0.364, 0.082]], [0.558, [0.955, 0.364, 0.082]], [0.560, [0.951, 0.372, 0.077]], [0.562, [0.951, 0.372, 0.077]], [0.564, [0.948, 0.379, 0.072]], [0.566, [0.948, 0.379, 0.072]], [0.568, [0.945, 0.387, 0.068]], [0.569, [0.945, 0.387, 0.068]], [0.571, [0.942, 0.395, 0.063]], [0.573, [0.942, 0.395, 0.063]], [0.575, [0.939, 0.403, 0.058]], [0.577, [0.939, 0.403, 0.058]], [0.579, [0.936, 0.411, 0.054]], [0.581, [0.936, 0.411, 0.054]], [0.583, [0.933, 0.419, 0.049]], [0.585, [0.933, 0.419, 0.049]], [0.587, [0.929, 0.426, 0.044]], [0.589, [0.929, 0.426, 0.044]], [0.591, [0.926, 0.434, 0.039]], [0.593, [0.926, 0.434, 0.039]], [0.595, [0.923, 0.442, 0.035]], [0.597, [0.923, 0.442, 0.035]], [0.599, [0.920, 0.450, 0.030]], [0.601, [0.920, 0.450, 0.030]], [0.603, [0.917, 0.458, 0.025]], [0.605, [0.917, 0.458, 0.025]], [0.607, [0.914, 0.466, 0.021]], [0.609, [0.914, 0.466, 0.021]], [0.611, [0.911, 0.474, 0.016]], [0.613, [0.911, 0.474, 0.016]], [0.614, [0.907, 0.481, 0.011]], [0.616, [0.907, 0.481, 0.011]], [0.618, [0.904, 0.489, 0.006]], [0.620, [0.904, 0.489, 0.006]], [0.622, [0.901, 0.497, 0.002]], [0.624, [0.901, 0.497, 0.002]], [0.626, [0.900, 0.505, 0.002]], [0.628, [0.900, 0.505, 0.002]], [0.630, [0.900, 0.513, 0.005]], [0.632, [0.900, 0.513, 0.005]], [0.634, [0.900, 0.521, 0.008]], [0.636, [0.900, 0.521, 0.008]], [0.638, [0.900, 0.528, 0.011]], [0.640, [0.900, 0.528, 0.011]], [0.642, [0.900, 0.536, 0.015]], [0.644, [0.900, 0.536, 0.015]], [0.646, [0.900, 0.544, 0.018]], [0.648, [0.900, 0.544, 0.018]], [0.650, [0.900, 0.552, 0.021]], [0.652, [0.900, 0.552, 0.021]], [0.654, [0.900, 0.560, 0.024]], [0.656, [0.900, 0.560, 0.024]], [0.658, [0.900, 0.568, 0.027]], [0.659, [0.900, 0.568, 0.027]], [0.661, [0.900, 0.575, 0.030]], [0.663, [0.900, 0.575, 0.030]], [0.665, [0.900, 0.583, 0.033]], [0.667, [0.900, 0.583, 0.033]], [0.669, [0.900, 0.591, 0.036]], [0.671, [0.900, 0.591, 0.036]], [0.673, [0.900, 0.599, 0.040]], [0.675, [0.900, 0.599, 0.040]], [0.677, [0.900, 0.607, 0.043]], [0.679, [0.900, 0.607, 0.043]], [0.681, [0.900, 0.615, 0.046]], [0.683, [0.900, 0.615, 0.046]], [0.685, [0.900, 0.623, 0.049]], [0.687, [0.900, 0.623, 0.049]], [0.689, [0.900, 0.630, 0.052]], [0.691, [0.900, 0.630, 0.052]], [0.693, [0.900, 0.638, 0.055]], [0.695, [0.900, 0.638, 0.055]], [0.697, [0.900, 0.646, 0.058]], [0.699, [0.900, 0.646, 0.058]], [0.701, [0.900, 0.654, 0.062]], [0.703, [0.900, 0.654, 0.062]], [0.705, [0.900, 0.662, 0.065]], [0.706, [0.900, 0.662, 0.065]], [0.708, [0.900, 0.670, 0.068]], [0.710, [0.900, 0.670, 0.068]], [0.712, [0.900, 0.677, 0.071]], [0.714, [0.900, 0.677, 0.071]], [0.716, [0.900, 0.685, 0.074]], [0.718, [0.900, 0.685, 0.074]], [0.720, [0.900, 0.693, 0.077]], [0.722, [0.900, 0.693, 0.077]], [0.724, [0.900, 0.701, 0.080]], [0.726, [0.900, 0.701, 0.080]], [0.728, [0.900, 0.709, 0.084]], [0.730, [0.900, 0.709, 0.084]], [0.732, [0.900, 0.717, 0.087]], [0.734, [0.900, 0.717, 0.087]], [0.736, [0.900, 0.725, 0.090]], [0.738, [0.900, 0.725, 0.090]], [0.740, [0.900, 0.732, 0.093]], [0.742, [0.900, 0.732, 0.093]], [0.744, [0.900, 0.740, 0.096]], [0.746, [0.900, 0.740, 0.096]], [0.748, [0.900, 0.748, 0.099]], [0.750, [0.900, 0.748, 0.099]], [0.751, [0.900, 0.754, 0.109]], [0.753, [0.900, 0.754, 0.109]], [0.755, [0.900, 0.758, 0.122]], [0.757, [0.900, 0.758, 0.122]], [0.759, [0.900, 0.763, 0.135]], [0.761, [0.900, 0.763, 0.135]], [0.763, [0.900, 0.768, 0.147]], [0.765, [0.900, 0.768, 0.147]], [0.767, [0.900, 0.772, 0.160]], [0.769, [0.900, 0.772, 0.160]], [0.771, [0.900, 0.777, 0.172]], [0.773, [0.900, 0.777, 0.172]], [0.775, [0.900, 0.782, 0.185]], [0.777, [0.900, 0.782, 0.185]], [0.779, [0.900, 0.786, 0.197]], [0.781, [0.900, 0.786, 0.197]], [0.783, [0.900, 0.791, 0.210]], [0.785, [0.900, 0.791, 0.210]], [0.787, [0.900, 0.796, 0.222]], [0.789, [0.900, 0.796, 0.222]], [0.791, [0.900, 0.801, 0.235]], [0.793, [0.900, 0.801, 0.235]], [0.795, [0.900, 0.805, 0.247]], [0.796, [0.900, 0.805, 0.247]], [0.798, [0.900, 0.810, 0.260]], [0.800, [0.900, 0.810, 0.260]], [0.802, [0.900, 0.815, 0.273]], [0.804, [0.900, 0.815, 0.273]], [0.806, [0.900, 0.819, 0.285]], [0.808, [0.900, 0.819, 0.285]], [0.810, [0.900, 0.824, 0.298]], [0.812, [0.900, 0.824, 0.298]], [0.814, [0.900, 0.829, 0.310]], [0.816, [0.900, 0.829, 0.310]], [0.818, [0.900, 0.834, 0.323]], [0.820, [0.900, 0.834, 0.323]], [0.822, [0.900, 0.838, 0.335]], [0.824, [0.900, 0.838, 0.335]], [0.826, [0.900, 0.843, 0.348]], [0.828, [0.900, 0.843, 0.348]], [0.830, [0.900, 0.848, 0.360]], [0.832, [0.900, 0.848, 0.360]], [0.834, [0.900, 0.852, 0.373]], [0.836, [0.900, 0.852, 0.373]], [0.838, [0.900, 0.857, 0.385]], [0.840, [0.900, 0.857, 0.385]], [0.841, [0.900, 0.862, 0.398]], [0.843, [0.900, 0.862, 0.398]], [0.845, [0.900, 0.866, 0.411]], [0.847, [0.900, 0.866, 0.411]], [0.849, [0.900, 0.871, 0.423]], [0.851, [0.900, 0.871, 0.423]], [0.853, [0.900, 0.876, 0.436]], [0.855, [0.900, 0.876, 0.436]], [0.857, [0.900, 0.881, 0.448]], [0.859, [0.900, 0.881, 0.448]], [0.861, [0.900, 0.885, 0.461]], [0.863, [0.900, 0.885, 0.461]], [0.865, [0.900, 0.890, 0.473]], [0.867, [0.900, 0.890, 0.473]], [0.869, [0.900, 0.895, 0.486]], [0.871, [0.900, 0.895, 0.486]], [0.873, [0.900, 0.899, 0.498]], [0.875, [0.900, 0.899, 0.498]], [0.877, [0.903, 0.903, 0.514]], [0.879, [0.903, 0.903, 0.514]], [0.881, [0.906, 0.906, 0.529]], [0.883, [0.906, 0.906, 0.529]], [0.885, [0.909, 0.909, 0.545]], [0.886, [0.909, 0.909, 0.545]], [0.888, [0.912, 0.912, 0.561]], [0.890, [0.912, 0.912, 0.561]], [0.892, [0.915, 0.915, 0.576]], [0.894, [0.915, 0.915, 0.576]], [0.896, [0.918, 0.918, 0.592]], [0.898, [0.918, 0.918, 0.592]], [0.900, [0.922, 0.922, 0.608]], [0.902, [0.922, 0.922, 0.608]], [0.904, [0.925, 0.925, 0.624]], [0.906, [0.925, 0.925, 0.624]], [0.908, [0.928, 0.928, 0.639]], [0.910, [0.928, 0.928, 0.639]], [0.912, [0.931, 0.931, 0.655]], [0.914, [0.931, 0.931, 0.655]], [0.916, [0.934, 0.934, 0.671]], [0.918, [0.934, 0.934, 0.671]], [0.920, [0.937, 0.937, 0.686]], [0.922, [0.937, 0.937, 0.686]], [0.924, [0.940, 0.940, 0.702]], [0.926, [0.940, 0.940, 0.702]], [0.928, [0.944, 0.944, 0.718]], [0.930, [0.944, 0.944, 0.718]], [0.932, [0.947, 0.947, 0.733]], [0.933, [0.947, 0.947, 0.733]], [0.935, [0.950, 0.950, 0.749]], [0.937, [0.950, 0.950, 0.749]], [0.939, [0.953, 0.953, 0.765]], [0.941, [0.953, 0.953, 0.765]], [0.943, [0.956, 0.956, 0.780]], [0.945, [0.956, 0.956, 0.780]], [0.947, [0.959, 0.959, 0.796]], [0.949, [0.959, 0.959, 0.796]], [0.951, [0.962, 0.962, 0.812]], [0.953, [0.962, 0.962, 0.812]], [0.955, [0.965, 0.965, 0.827]], [0.957, [0.965, 0.965, 0.827]], [0.959, [0.969, 0.969, 0.843]], [0.961, [0.969, 0.969, 0.843]], [0.963, [0.972, 0.972, 0.859]], [0.965, [0.972, 0.972, 0.859]], [0.967, [0.975, 0.975, 0.875]], [0.969, [0.975, 0.975, 0.875]], [0.971, [0.978, 0.978, 0.890]], [0.973, [0.978, 0.978, 0.890]], [0.975, [0.981, 0.981, 0.906]], [0.977, [0.981, 0.981, 0.906]], [0.978, [0.984, 0.984, 0.922]], [0.980, [0.984, 0.984, 0.922]], [0.982, [0.987, 0.987, 0.937]], [0.984, [0.987, 0.987, 0.937]], [0.986, [0.991, 0.991, 0.953]], [0.988, [0.991, 0.991, 0.953]], [0.990, [0.994, 0.994, 0.969]], [0.992, [0.994, 0.994, 0.969]], [0.994, [0.997, 0.997, 0.984]], [0.996, [0.997, 0.997, 0.984]], [0.998, [1.000, 1.000, 1.000]], [1.000, [1.000, 1.000, 1.000]]]; +var brg = [[0.000, [0.000, 0.000, 1.000]], [0.002, [0.000, 0.000, 1.000]], [0.004, [0.008, 0.000, 0.992]], [0.006, [0.008, 0.000, 0.992]], [0.008, [0.016, 0.000, 0.984]], [0.010, [0.016, 0.000, 0.984]], [0.012, [0.024, 0.000, 0.976]], [0.014, [0.024, 0.000, 0.976]], [0.016, [0.031, 0.000, 0.969]], [0.018, [0.031, 0.000, 0.969]], [0.020, [0.039, 0.000, 0.961]], [0.022, [0.039, 0.000, 0.961]], [0.023, [0.047, 0.000, 0.953]], [0.025, [0.047, 0.000, 0.953]], [0.027, [0.055, 0.000, 0.945]], [0.029, [0.055, 0.000, 0.945]], [0.031, [0.063, 0.000, 0.937]], [0.033, [0.063, 0.000, 0.937]], [0.035, [0.071, 0.000, 0.929]], [0.037, [0.071, 0.000, 0.929]], [0.039, [0.078, 0.000, 0.922]], [0.041, [0.078, 0.000, 0.922]], [0.043, [0.086, 0.000, 0.914]], [0.045, [0.086, 0.000, 0.914]], [0.047, [0.094, 0.000, 0.906]], [0.049, [0.094, 0.000, 0.906]], [0.051, [0.102, 0.000, 0.898]], [0.053, [0.102, 0.000, 0.898]], [0.055, [0.110, 0.000, 0.890]], [0.057, [0.110, 0.000, 0.890]], [0.059, [0.118, 0.000, 0.882]], [0.061, [0.118, 0.000, 0.882]], [0.063, [0.125, 0.000, 0.875]], [0.065, [0.125, 0.000, 0.875]], [0.067, [0.133, 0.000, 0.867]], [0.068, [0.133, 0.000, 0.867]], [0.070, [0.141, 0.000, 0.859]], [0.072, [0.141, 0.000, 0.859]], [0.074, [0.149, 0.000, 0.851]], [0.076, [0.149, 0.000, 0.851]], [0.078, [0.157, 0.000, 0.843]], [0.080, [0.157, 0.000, 0.843]], [0.082, [0.165, 0.000, 0.835]], [0.084, [0.165, 0.000, 0.835]], [0.086, [0.173, 0.000, 0.827]], [0.088, [0.173, 0.000, 0.827]], [0.090, [0.180, 0.000, 0.820]], [0.092, [0.180, 0.000, 0.820]], [0.094, [0.188, 0.000, 0.812]], [0.096, [0.188, 0.000, 0.812]], [0.098, [0.196, 0.000, 0.804]], [0.100, [0.196, 0.000, 0.804]], [0.102, [0.204, 0.000, 0.796]], [0.104, [0.204, 0.000, 0.796]], [0.106, [0.212, 0.000, 0.788]], [0.108, [0.212, 0.000, 0.788]], [0.110, [0.220, 0.000, 0.780]], [0.112, [0.220, 0.000, 0.780]], [0.114, [0.227, 0.000, 0.773]], [0.115, [0.227, 0.000, 0.773]], [0.117, [0.235, 0.000, 0.765]], [0.119, [0.235, 0.000, 0.765]], [0.121, [0.243, 0.000, 0.757]], [0.123, [0.243, 0.000, 0.757]], [0.125, [0.251, 0.000, 0.749]], [0.127, [0.251, 0.000, 0.749]], [0.129, [0.259, 0.000, 0.741]], [0.131, [0.259, 0.000, 0.741]], [0.133, [0.267, 0.000, 0.733]], [0.135, [0.267, 0.000, 0.733]], [0.137, [0.275, 0.000, 0.725]], [0.139, [0.275, 0.000, 0.725]], [0.141, [0.282, 0.000, 0.718]], [0.143, [0.282, 0.000, 0.718]], [0.145, [0.290, 0.000, 0.710]], [0.147, [0.290, 0.000, 0.710]], [0.149, [0.298, 0.000, 0.702]], [0.151, [0.298, 0.000, 0.702]], [0.153, [0.306, 0.000, 0.694]], [0.155, [0.306, 0.000, 0.694]], [0.157, [0.314, 0.000, 0.686]], [0.159, [0.314, 0.000, 0.686]], [0.160, [0.322, 0.000, 0.678]], [0.162, [0.322, 0.000, 0.678]], [0.164, [0.329, 0.000, 0.671]], [0.166, [0.329, 0.000, 0.671]], [0.168, [0.337, 0.000, 0.663]], [0.170, [0.337, 0.000, 0.663]], [0.172, [0.345, 0.000, 0.655]], [0.174, [0.345, 0.000, 0.655]], [0.176, [0.353, 0.000, 0.647]], [0.178, [0.353, 0.000, 0.647]], [0.180, [0.361, 0.000, 0.639]], [0.182, [0.361, 0.000, 0.639]], [0.184, [0.369, 0.000, 0.631]], [0.186, [0.369, 0.000, 0.631]], [0.188, [0.376, 0.000, 0.624]], [0.190, [0.376, 0.000, 0.624]], [0.192, [0.384, 0.000, 0.616]], [0.194, [0.384, 0.000, 0.616]], [0.196, [0.392, 0.000, 0.608]], [0.198, [0.392, 0.000, 0.608]], [0.200, [0.400, 0.000, 0.600]], [0.202, [0.400, 0.000, 0.600]], [0.204, [0.408, 0.000, 0.592]], [0.205, [0.408, 0.000, 0.592]], [0.207, [0.416, 0.000, 0.584]], [0.209, [0.416, 0.000, 0.584]], [0.211, [0.424, 0.000, 0.576]], [0.213, [0.424, 0.000, 0.576]], [0.215, [0.431, 0.000, 0.569]], [0.217, [0.431, 0.000, 0.569]], [0.219, [0.439, 0.000, 0.561]], [0.221, [0.439, 0.000, 0.561]], [0.223, [0.447, 0.000, 0.553]], [0.225, [0.447, 0.000, 0.553]], [0.227, [0.455, 0.000, 0.545]], [0.229, [0.455, 0.000, 0.545]], [0.231, [0.463, 0.000, 0.537]], [0.233, [0.463, 0.000, 0.537]], [0.235, [0.471, 0.000, 0.529]], [0.237, [0.471, 0.000, 0.529]], [0.239, [0.478, 0.000, 0.522]], [0.241, [0.478, 0.000, 0.522]], [0.243, [0.486, 0.000, 0.514]], [0.245, [0.486, 0.000, 0.514]], [0.247, [0.494, 0.000, 0.506]], [0.249, [0.494, 0.000, 0.506]], [0.250, [0.502, 0.000, 0.498]], [0.252, [0.502, 0.000, 0.498]], [0.254, [0.510, 0.000, 0.490]], [0.256, [0.510, 0.000, 0.490]], [0.258, [0.518, 0.000, 0.482]], [0.260, [0.518, 0.000, 0.482]], [0.262, [0.525, 0.000, 0.475]], [0.264, [0.525, 0.000, 0.475]], [0.266, [0.533, 0.000, 0.467]], [0.268, [0.533, 0.000, 0.467]], [0.270, [0.541, 0.000, 0.459]], [0.272, [0.541, 0.000, 0.459]], [0.274, [0.549, 0.000, 0.451]], [0.276, [0.549, 0.000, 0.451]], [0.278, [0.557, 0.000, 0.443]], [0.280, [0.557, 0.000, 0.443]], [0.282, [0.565, 0.000, 0.435]], [0.284, [0.565, 0.000, 0.435]], [0.286, [0.573, 0.000, 0.427]], [0.288, [0.573, 0.000, 0.427]], [0.290, [0.580, 0.000, 0.420]], [0.292, [0.580, 0.000, 0.420]], [0.294, [0.588, 0.000, 0.412]], [0.295, [0.588, 0.000, 0.412]], [0.297, [0.596, 0.000, 0.404]], [0.299, [0.596, 0.000, 0.404]], [0.301, [0.604, 0.000, 0.396]], [0.303, [0.604, 0.000, 0.396]], [0.305, [0.612, 0.000, 0.388]], [0.307, [0.612, 0.000, 0.388]], [0.309, [0.620, 0.000, 0.380]], [0.311, [0.620, 0.000, 0.380]], [0.313, [0.627, 0.000, 0.373]], [0.315, [0.627, 0.000, 0.373]], [0.317, [0.635, 0.000, 0.365]], [0.319, [0.635, 0.000, 0.365]], [0.321, [0.643, 0.000, 0.357]], [0.323, [0.643, 0.000, 0.357]], [0.325, [0.651, 0.000, 0.349]], [0.327, [0.651, 0.000, 0.349]], [0.329, [0.659, 0.000, 0.341]], [0.331, [0.659, 0.000, 0.341]], [0.333, [0.667, 0.000, 0.333]], [0.335, [0.667, 0.000, 0.333]], [0.337, [0.675, 0.000, 0.325]], [0.339, [0.675, 0.000, 0.325]], [0.341, [0.682, 0.000, 0.318]], [0.342, [0.682, 0.000, 0.318]], [0.344, [0.690, 0.000, 0.310]], [0.346, [0.690, 0.000, 0.310]], [0.348, [0.698, 0.000, 0.302]], [0.350, [0.698, 0.000, 0.302]], [0.352, [0.706, 0.000, 0.294]], [0.354, [0.706, 0.000, 0.294]], [0.356, [0.714, 0.000, 0.286]], [0.358, [0.714, 0.000, 0.286]], [0.360, [0.722, 0.000, 0.278]], [0.362, [0.722, 0.000, 0.278]], [0.364, [0.729, 0.000, 0.271]], [0.366, [0.729, 0.000, 0.271]], [0.368, [0.737, 0.000, 0.263]], [0.370, [0.737, 0.000, 0.263]], [0.372, [0.745, 0.000, 0.255]], [0.374, [0.745, 0.000, 0.255]], [0.376, [0.753, 0.000, 0.247]], [0.378, [0.753, 0.000, 0.247]], [0.380, [0.761, 0.000, 0.239]], [0.382, [0.761, 0.000, 0.239]], [0.384, [0.769, 0.000, 0.231]], [0.386, [0.769, 0.000, 0.231]], [0.387, [0.776, 0.000, 0.224]], [0.389, [0.776, 0.000, 0.224]], [0.391, [0.784, 0.000, 0.216]], [0.393, [0.784, 0.000, 0.216]], [0.395, [0.792, 0.000, 0.208]], [0.397, [0.792, 0.000, 0.208]], [0.399, [0.800, 0.000, 0.200]], [0.401, [0.800, 0.000, 0.200]], [0.403, [0.808, 0.000, 0.192]], [0.405, [0.808, 0.000, 0.192]], [0.407, [0.816, 0.000, 0.184]], [0.409, [0.816, 0.000, 0.184]], [0.411, [0.824, 0.000, 0.176]], [0.413, [0.824, 0.000, 0.176]], [0.415, [0.831, 0.000, 0.169]], [0.417, [0.831, 0.000, 0.169]], [0.419, [0.839, 0.000, 0.161]], [0.421, [0.839, 0.000, 0.161]], [0.423, [0.847, 0.000, 0.153]], [0.425, [0.847, 0.000, 0.153]], [0.427, [0.855, 0.000, 0.145]], [0.429, [0.855, 0.000, 0.145]], [0.431, [0.863, 0.000, 0.137]], [0.432, [0.863, 0.000, 0.137]], [0.434, [0.871, 0.000, 0.129]], [0.436, [0.871, 0.000, 0.129]], [0.438, [0.878, 0.000, 0.122]], [0.440, [0.878, 0.000, 0.122]], [0.442, [0.886, 0.000, 0.114]], [0.444, [0.886, 0.000, 0.114]], [0.446, [0.894, 0.000, 0.106]], [0.448, [0.894, 0.000, 0.106]], [0.450, [0.902, 0.000, 0.098]], [0.452, [0.902, 0.000, 0.098]], [0.454, [0.910, 0.000, 0.090]], [0.456, [0.910, 0.000, 0.090]], [0.458, [0.918, 0.000, 0.082]], [0.460, [0.918, 0.000, 0.082]], [0.462, [0.925, 0.000, 0.075]], [0.464, [0.925, 0.000, 0.075]], [0.466, [0.933, 0.000, 0.067]], [0.468, [0.933, 0.000, 0.067]], [0.470, [0.941, 0.000, 0.059]], [0.472, [0.941, 0.000, 0.059]], [0.474, [0.949, 0.000, 0.051]], [0.476, [0.949, 0.000, 0.051]], [0.477, [0.957, 0.000, 0.043]], [0.479, [0.957, 0.000, 0.043]], [0.481, [0.965, 0.000, 0.035]], [0.483, [0.965, 0.000, 0.035]], [0.485, [0.973, 0.000, 0.027]], [0.487, [0.973, 0.000, 0.027]], [0.489, [0.980, 0.000, 0.020]], [0.491, [0.980, 0.000, 0.020]], [0.493, [0.988, 0.000, 0.012]], [0.495, [0.988, 0.000, 0.012]], [0.497, [0.996, 0.000, 0.004]], [0.499, [0.996, 0.000, 0.004]], [0.501, [0.996, 0.004, 0.000]], [0.503, [0.996, 0.004, 0.000]], [0.505, [0.988, 0.012, 0.000]], [0.507, [0.988, 0.012, 0.000]], [0.509, [0.980, 0.020, 0.000]], [0.511, [0.980, 0.020, 0.000]], [0.513, [0.973, 0.027, 0.000]], [0.515, [0.973, 0.027, 0.000]], [0.517, [0.965, 0.035, 0.000]], [0.519, [0.965, 0.035, 0.000]], [0.521, [0.957, 0.043, 0.000]], [0.523, [0.957, 0.043, 0.000]], [0.524, [0.949, 0.051, 0.000]], [0.526, [0.949, 0.051, 0.000]], [0.528, [0.941, 0.059, 0.000]], [0.530, [0.941, 0.059, 0.000]], [0.532, [0.933, 0.067, 0.000]], [0.534, [0.933, 0.067, 0.000]], [0.536, [0.925, 0.075, 0.000]], [0.538, [0.925, 0.075, 0.000]], [0.540, [0.918, 0.082, 0.000]], [0.542, [0.918, 0.082, 0.000]], [0.544, [0.910, 0.090, 0.000]], [0.546, [0.910, 0.090, 0.000]], [0.548, [0.902, 0.098, 0.000]], [0.550, [0.902, 0.098, 0.000]], [0.552, [0.894, 0.106, 0.000]], [0.554, [0.894, 0.106, 0.000]], [0.556, [0.886, 0.114, 0.000]], [0.558, [0.886, 0.114, 0.000]], [0.560, [0.878, 0.122, 0.000]], [0.562, [0.878, 0.122, 0.000]], [0.564, [0.871, 0.129, 0.000]], [0.566, [0.871, 0.129, 0.000]], [0.568, [0.863, 0.137, 0.000]], [0.569, [0.863, 0.137, 0.000]], [0.571, [0.855, 0.145, 0.000]], [0.573, [0.855, 0.145, 0.000]], [0.575, [0.847, 0.153, 0.000]], [0.577, [0.847, 0.153, 0.000]], [0.579, [0.839, 0.161, 0.000]], [0.581, [0.839, 0.161, 0.000]], [0.583, [0.831, 0.169, 0.000]], [0.585, [0.831, 0.169, 0.000]], [0.587, [0.824, 0.176, 0.000]], [0.589, [0.824, 0.176, 0.000]], [0.591, [0.816, 0.184, 0.000]], [0.593, [0.816, 0.184, 0.000]], [0.595, [0.808, 0.192, 0.000]], [0.597, [0.808, 0.192, 0.000]], [0.599, [0.800, 0.200, 0.000]], [0.601, [0.800, 0.200, 0.000]], [0.603, [0.792, 0.208, 0.000]], [0.605, [0.792, 0.208, 0.000]], [0.607, [0.784, 0.216, 0.000]], [0.609, [0.784, 0.216, 0.000]], [0.611, [0.776, 0.224, 0.000]], [0.613, [0.776, 0.224, 0.000]], [0.614, [0.769, 0.231, 0.000]], [0.616, [0.769, 0.231, 0.000]], [0.618, [0.761, 0.239, 0.000]], [0.620, [0.761, 0.239, 0.000]], [0.622, [0.753, 0.247, 0.000]], [0.624, [0.753, 0.247, 0.000]], [0.626, [0.745, 0.255, 0.000]], [0.628, [0.745, 0.255, 0.000]], [0.630, [0.737, 0.263, 0.000]], [0.632, [0.737, 0.263, 0.000]], [0.634, [0.729, 0.271, 0.000]], [0.636, [0.729, 0.271, 0.000]], [0.638, [0.722, 0.278, 0.000]], [0.640, [0.722, 0.278, 0.000]], [0.642, [0.714, 0.286, 0.000]], [0.644, [0.714, 0.286, 0.000]], [0.646, [0.706, 0.294, 0.000]], [0.648, [0.706, 0.294, 0.000]], [0.650, [0.698, 0.302, 0.000]], [0.652, [0.698, 0.302, 0.000]], [0.654, [0.690, 0.310, 0.000]], [0.656, [0.690, 0.310, 0.000]], [0.658, [0.682, 0.318, 0.000]], [0.659, [0.682, 0.318, 0.000]], [0.661, [0.675, 0.325, 0.000]], [0.663, [0.675, 0.325, 0.000]], [0.665, [0.667, 0.333, 0.000]], [0.667, [0.667, 0.333, 0.000]], [0.669, [0.659, 0.341, 0.000]], [0.671, [0.659, 0.341, 0.000]], [0.673, [0.651, 0.349, 0.000]], [0.675, [0.651, 0.349, 0.000]], [0.677, [0.643, 0.357, 0.000]], [0.679, [0.643, 0.357, 0.000]], [0.681, [0.635, 0.365, 0.000]], [0.683, [0.635, 0.365, 0.000]], [0.685, [0.627, 0.373, 0.000]], [0.687, [0.627, 0.373, 0.000]], [0.689, [0.620, 0.380, 0.000]], [0.691, [0.620, 0.380, 0.000]], [0.693, [0.612, 0.388, 0.000]], [0.695, [0.612, 0.388, 0.000]], [0.697, [0.604, 0.396, 0.000]], [0.699, [0.604, 0.396, 0.000]], [0.701, [0.596, 0.404, 0.000]], [0.703, [0.596, 0.404, 0.000]], [0.705, [0.588, 0.412, 0.000]], [0.706, [0.588, 0.412, 0.000]], [0.708, [0.580, 0.420, 0.000]], [0.710, [0.580, 0.420, 0.000]], [0.712, [0.573, 0.427, 0.000]], [0.714, [0.573, 0.427, 0.000]], [0.716, [0.565, 0.435, 0.000]], [0.718, [0.565, 0.435, 0.000]], [0.720, [0.557, 0.443, 0.000]], [0.722, [0.557, 0.443, 0.000]], [0.724, [0.549, 0.451, 0.000]], [0.726, [0.549, 0.451, 0.000]], [0.728, [0.541, 0.459, 0.000]], [0.730, [0.541, 0.459, 0.000]], [0.732, [0.533, 0.467, 0.000]], [0.734, [0.533, 0.467, 0.000]], [0.736, [0.525, 0.475, 0.000]], [0.738, [0.525, 0.475, 0.000]], [0.740, [0.518, 0.482, 0.000]], [0.742, [0.518, 0.482, 0.000]], [0.744, [0.510, 0.490, 0.000]], [0.746, [0.510, 0.490, 0.000]], [0.748, [0.502, 0.498, 0.000]], [0.750, [0.502, 0.498, 0.000]], [0.751, [0.494, 0.506, 0.000]], [0.753, [0.494, 0.506, 0.000]], [0.755, [0.486, 0.514, 0.000]], [0.757, [0.486, 0.514, 0.000]], [0.759, [0.478, 0.522, 0.000]], [0.761, [0.478, 0.522, 0.000]], [0.763, [0.471, 0.529, 0.000]], [0.765, [0.471, 0.529, 0.000]], [0.767, [0.463, 0.537, 0.000]], [0.769, [0.463, 0.537, 0.000]], [0.771, [0.455, 0.545, 0.000]], [0.773, [0.455, 0.545, 0.000]], [0.775, [0.447, 0.553, 0.000]], [0.777, [0.447, 0.553, 0.000]], [0.779, [0.439, 0.561, 0.000]], [0.781, [0.439, 0.561, 0.000]], [0.783, [0.431, 0.569, 0.000]], [0.785, [0.431, 0.569, 0.000]], [0.787, [0.424, 0.576, 0.000]], [0.789, [0.424, 0.576, 0.000]], [0.791, [0.416, 0.584, 0.000]], [0.793, [0.416, 0.584, 0.000]], [0.795, [0.408, 0.592, 0.000]], [0.796, [0.408, 0.592, 0.000]], [0.798, [0.400, 0.600, 0.000]], [0.800, [0.400, 0.600, 0.000]], [0.802, [0.392, 0.608, 0.000]], [0.804, [0.392, 0.608, 0.000]], [0.806, [0.384, 0.616, 0.000]], [0.808, [0.384, 0.616, 0.000]], [0.810, [0.376, 0.624, 0.000]], [0.812, [0.376, 0.624, 0.000]], [0.814, [0.369, 0.631, 0.000]], [0.816, [0.369, 0.631, 0.000]], [0.818, [0.361, 0.639, 0.000]], [0.820, [0.361, 0.639, 0.000]], [0.822, [0.353, 0.647, 0.000]], [0.824, [0.353, 0.647, 0.000]], [0.826, [0.345, 0.655, 0.000]], [0.828, [0.345, 0.655, 0.000]], [0.830, [0.337, 0.663, 0.000]], [0.832, [0.337, 0.663, 0.000]], [0.834, [0.329, 0.671, 0.000]], [0.836, [0.329, 0.671, 0.000]], [0.838, [0.322, 0.678, 0.000]], [0.840, [0.322, 0.678, 0.000]], [0.841, [0.314, 0.686, 0.000]], [0.843, [0.314, 0.686, 0.000]], [0.845, [0.306, 0.694, 0.000]], [0.847, [0.306, 0.694, 0.000]], [0.849, [0.298, 0.702, 0.000]], [0.851, [0.298, 0.702, 0.000]], [0.853, [0.290, 0.710, 0.000]], [0.855, [0.290, 0.710, 0.000]], [0.857, [0.282, 0.718, 0.000]], [0.859, [0.282, 0.718, 0.000]], [0.861, [0.275, 0.725, 0.000]], [0.863, [0.275, 0.725, 0.000]], [0.865, [0.267, 0.733, 0.000]], [0.867, [0.267, 0.733, 0.000]], [0.869, [0.259, 0.741, 0.000]], [0.871, [0.259, 0.741, 0.000]], [0.873, [0.251, 0.749, 0.000]], [0.875, [0.251, 0.749, 0.000]], [0.877, [0.243, 0.757, 0.000]], [0.879, [0.243, 0.757, 0.000]], [0.881, [0.235, 0.765, 0.000]], [0.883, [0.235, 0.765, 0.000]], [0.885, [0.227, 0.773, 0.000]], [0.886, [0.227, 0.773, 0.000]], [0.888, [0.220, 0.780, 0.000]], [0.890, [0.220, 0.780, 0.000]], [0.892, [0.212, 0.788, 0.000]], [0.894, [0.212, 0.788, 0.000]], [0.896, [0.204, 0.796, 0.000]], [0.898, [0.204, 0.796, 0.000]], [0.900, [0.196, 0.804, 0.000]], [0.902, [0.196, 0.804, 0.000]], [0.904, [0.188, 0.812, 0.000]], [0.906, [0.188, 0.812, 0.000]], [0.908, [0.180, 0.820, 0.000]], [0.910, [0.180, 0.820, 0.000]], [0.912, [0.173, 0.827, 0.000]], [0.914, [0.173, 0.827, 0.000]], [0.916, [0.165, 0.835, 0.000]], [0.918, [0.165, 0.835, 0.000]], [0.920, [0.157, 0.843, 0.000]], [0.922, [0.157, 0.843, 0.000]], [0.924, [0.149, 0.851, 0.000]], [0.926, [0.149, 0.851, 0.000]], [0.928, [0.141, 0.859, 0.000]], [0.930, [0.141, 0.859, 0.000]], [0.932, [0.133, 0.867, 0.000]], [0.933, [0.133, 0.867, 0.000]], [0.935, [0.125, 0.875, 0.000]], [0.937, [0.125, 0.875, 0.000]], [0.939, [0.118, 0.882, 0.000]], [0.941, [0.118, 0.882, 0.000]], [0.943, [0.110, 0.890, 0.000]], [0.945, [0.110, 0.890, 0.000]], [0.947, [0.102, 0.898, 0.000]], [0.949, [0.102, 0.898, 0.000]], [0.951, [0.094, 0.906, 0.000]], [0.953, [0.094, 0.906, 0.000]], [0.955, [0.086, 0.914, 0.000]], [0.957, [0.086, 0.914, 0.000]], [0.959, [0.078, 0.922, 0.000]], [0.961, [0.078, 0.922, 0.000]], [0.963, [0.071, 0.929, 0.000]], [0.965, [0.071, 0.929, 0.000]], [0.967, [0.063, 0.937, 0.000]], [0.969, [0.063, 0.937, 0.000]], [0.971, [0.055, 0.945, 0.000]], [0.973, [0.055, 0.945, 0.000]], [0.975, [0.047, 0.953, 0.000]], [0.977, [0.047, 0.953, 0.000]], [0.978, [0.039, 0.961, 0.000]], [0.980, [0.039, 0.961, 0.000]], [0.982, [0.031, 0.969, 0.000]], [0.984, [0.031, 0.969, 0.000]], [0.986, [0.024, 0.976, 0.000]], [0.988, [0.024, 0.976, 0.000]], [0.990, [0.016, 0.984, 0.000]], [0.992, [0.016, 0.984, 0.000]], [0.994, [0.008, 0.992, 0.000]], [0.996, [0.008, 0.992, 0.000]], [0.998, [0.000, 1.000, 0.000]], [1.000, [0.000, 1.000, 0.000]]]; +var cubehelix = [[0.000, [0.000, 0.000, 0.000]], [0.002, [0.000, 0.000, 0.000]], [0.004, [0.007, 0.002, 0.006]], [0.006, [0.007, 0.002, 0.006]], [0.008, [0.013, 0.004, 0.012]], [0.010, [0.013, 0.004, 0.012]], [0.012, [0.020, 0.007, 0.019]], [0.014, [0.020, 0.007, 0.019]], [0.016, [0.026, 0.009, 0.025]], [0.018, [0.026, 0.009, 0.025]], [0.020, [0.032, 0.011, 0.032]], [0.022, [0.032, 0.011, 0.032]], [0.023, [0.037, 0.014, 0.039]], [0.025, [0.037, 0.014, 0.039]], [0.027, [0.043, 0.016, 0.046]], [0.029, [0.043, 0.016, 0.046]], [0.031, [0.048, 0.019, 0.053]], [0.033, [0.048, 0.019, 0.053]], [0.035, [0.053, 0.021, 0.061]], [0.037, [0.053, 0.021, 0.061]], [0.039, [0.058, 0.024, 0.068]], [0.041, [0.058, 0.024, 0.068]], [0.043, [0.063, 0.027, 0.076]], [0.045, [0.063, 0.027, 0.076]], [0.047, [0.067, 0.030, 0.083]], [0.049, [0.067, 0.030, 0.083]], [0.051, [0.071, 0.033, 0.091]], [0.053, [0.071, 0.033, 0.091]], [0.055, [0.075, 0.036, 0.099]], [0.057, [0.075, 0.036, 0.099]], [0.059, [0.079, 0.040, 0.107]], [0.061, [0.079, 0.040, 0.107]], [0.063, [0.082, 0.043, 0.115]], [0.065, [0.082, 0.043, 0.115]], [0.067, [0.085, 0.047, 0.123]], [0.068, [0.085, 0.047, 0.123]], [0.070, [0.088, 0.051, 0.131]], [0.072, [0.088, 0.051, 0.131]], [0.074, [0.090, 0.054, 0.139]], [0.076, [0.090, 0.054, 0.139]], [0.078, [0.093, 0.058, 0.146]], [0.080, [0.093, 0.058, 0.146]], [0.082, [0.095, 0.063, 0.154]], [0.084, [0.095, 0.063, 0.154]], [0.086, [0.097, 0.067, 0.162]], [0.088, [0.097, 0.067, 0.162]], [0.090, [0.099, 0.071, 0.170]], [0.092, [0.099, 0.071, 0.170]], [0.094, [0.100, 0.076, 0.177]], [0.096, [0.100, 0.076, 0.177]], [0.098, [0.101, 0.080, 0.185]], [0.100, [0.101, 0.080, 0.185]], [0.102, [0.102, 0.085, 0.192]], [0.104, [0.102, 0.085, 0.192]], [0.106, [0.103, 0.090, 0.199]], [0.108, [0.103, 0.090, 0.199]], [0.110, [0.104, 0.095, 0.206]], [0.112, [0.104, 0.095, 0.206]], [0.114, [0.104, 0.100, 0.213]], [0.115, [0.104, 0.100, 0.213]], [0.117, [0.104, 0.105, 0.220]], [0.119, [0.104, 0.105, 0.220]], [0.121, [0.104, 0.111, 0.226]], [0.123, [0.104, 0.111, 0.226]], [0.125, [0.104, 0.116, 0.233]], [0.127, [0.104, 0.116, 0.233]], [0.129, [0.104, 0.122, 0.239]], [0.131, [0.104, 0.122, 0.239]], [0.133, [0.104, 0.128, 0.245]], [0.135, [0.104, 0.128, 0.245]], [0.137, [0.103, 0.134, 0.251]], [0.139, [0.103, 0.134, 0.251]], [0.141, [0.102, 0.140, 0.256]], [0.143, [0.102, 0.140, 0.256]], [0.145, [0.102, 0.146, 0.261]], [0.147, [0.102, 0.146, 0.261]], [0.149, [0.101, 0.152, 0.266]], [0.151, [0.101, 0.152, 0.266]], [0.153, [0.100, 0.158, 0.271]], [0.155, [0.100, 0.158, 0.271]], [0.157, [0.099, 0.164, 0.275]], [0.159, [0.099, 0.164, 0.275]], [0.160, [0.098, 0.171, 0.280]], [0.162, [0.098, 0.171, 0.280]], [0.164, [0.096, 0.177, 0.283]], [0.166, [0.096, 0.177, 0.283]], [0.168, [0.095, 0.184, 0.287]], [0.170, [0.095, 0.184, 0.287]], [0.172, [0.094, 0.190, 0.290]], [0.174, [0.094, 0.190, 0.290]], [0.176, [0.093, 0.197, 0.293]], [0.178, [0.093, 0.197, 0.293]], [0.180, [0.092, 0.204, 0.296]], [0.182, [0.092, 0.204, 0.296]], [0.184, [0.090, 0.211, 0.299]], [0.186, [0.090, 0.211, 0.299]], [0.188, [0.089, 0.218, 0.301]], [0.190, [0.089, 0.218, 0.301]], [0.192, [0.088, 0.224, 0.303]], [0.194, [0.088, 0.224, 0.303]], [0.196, [0.087, 0.231, 0.304]], [0.198, [0.087, 0.231, 0.304]], [0.200, [0.086, 0.238, 0.306]], [0.202, [0.086, 0.238, 0.306]], [0.204, [0.085, 0.245, 0.307]], [0.205, [0.085, 0.245, 0.307]], [0.207, [0.084, 0.252, 0.307]], [0.209, [0.084, 0.252, 0.307]], [0.211, [0.084, 0.259, 0.308]], [0.213, [0.084, 0.259, 0.308]], [0.215, [0.083, 0.266, 0.308]], [0.217, [0.083, 0.266, 0.308]], [0.219, [0.083, 0.273, 0.308]], [0.221, [0.083, 0.273, 0.308]], [0.223, [0.082, 0.280, 0.307]], [0.225, [0.082, 0.280, 0.307]], [0.227, [0.082, 0.287, 0.307]], [0.229, [0.082, 0.287, 0.307]], [0.231, [0.082, 0.293, 0.306]], [0.233, [0.082, 0.293, 0.306]], [0.235, [0.082, 0.300, 0.304]], [0.237, [0.082, 0.300, 0.304]], [0.239, [0.083, 0.307, 0.303]], [0.241, [0.083, 0.307, 0.303]], [0.243, [0.083, 0.314, 0.301]], [0.245, [0.083, 0.314, 0.301]], [0.247, [0.084, 0.320, 0.299]], [0.249, [0.084, 0.320, 0.299]], [0.250, [0.085, 0.327, 0.297]], [0.252, [0.085, 0.327, 0.297]], [0.254, [0.087, 0.333, 0.295]], [0.256, [0.087, 0.333, 0.295]], [0.258, [0.088, 0.339, 0.292]], [0.260, [0.088, 0.339, 0.292]], [0.262, [0.090, 0.346, 0.290]], [0.264, [0.090, 0.346, 0.290]], [0.266, [0.092, 0.352, 0.287]], [0.268, [0.092, 0.352, 0.287]], [0.270, [0.094, 0.358, 0.284]], [0.272, [0.094, 0.358, 0.284]], [0.274, [0.097, 0.364, 0.281]], [0.276, [0.097, 0.364, 0.281]], [0.278, [0.099, 0.370, 0.277]], [0.280, [0.099, 0.370, 0.277]], [0.282, [0.103, 0.375, 0.274]], [0.284, [0.103, 0.375, 0.274]], [0.286, [0.106, 0.381, 0.270]], [0.288, [0.106, 0.381, 0.270]], [0.290, [0.110, 0.386, 0.266]], [0.292, [0.110, 0.386, 0.266]], [0.294, [0.114, 0.392, 0.263]], [0.295, [0.114, 0.392, 0.263]], [0.297, [0.118, 0.397, 0.259]], [0.299, [0.118, 0.397, 0.259]], [0.301, [0.122, 0.402, 0.255]], [0.303, [0.122, 0.402, 0.255]], [0.305, [0.127, 0.407, 0.251]], [0.307, [0.127, 0.407, 0.251]], [0.309, [0.133, 0.412, 0.247]], [0.311, [0.133, 0.412, 0.247]], [0.313, [0.138, 0.416, 0.243]], [0.315, [0.138, 0.416, 0.243]], [0.317, [0.144, 0.421, 0.239]], [0.319, [0.144, 0.421, 0.239]], [0.321, [0.150, 0.425, 0.235]], [0.323, [0.150, 0.425, 0.235]], [0.325, [0.156, 0.429, 0.231]], [0.327, [0.156, 0.429, 0.231]], [0.329, [0.163, 0.433, 0.228]], [0.331, [0.163, 0.433, 0.228]], [0.333, [0.170, 0.437, 0.224]], [0.335, [0.170, 0.437, 0.224]], [0.337, [0.177, 0.440, 0.220]], [0.339, [0.177, 0.440, 0.220]], [0.341, [0.185, 0.444, 0.216]], [0.342, [0.185, 0.444, 0.216]], [0.344, [0.193, 0.447, 0.213]], [0.346, [0.193, 0.447, 0.213]], [0.348, [0.201, 0.450, 0.210]], [0.350, [0.201, 0.450, 0.210]], [0.352, [0.209, 0.453, 0.206]], [0.354, [0.209, 0.453, 0.206]], [0.356, [0.218, 0.456, 0.203]], [0.358, [0.218, 0.456, 0.203]], [0.360, [0.227, 0.459, 0.200]], [0.362, [0.227, 0.459, 0.200]], [0.364, [0.236, 0.461, 0.198]], [0.366, [0.236, 0.461, 0.198]], [0.368, [0.246, 0.463, 0.195]], [0.370, [0.246, 0.463, 0.195]], [0.372, [0.255, 0.466, 0.193]], [0.374, [0.255, 0.466, 0.193]], [0.376, [0.265, 0.468, 0.191]], [0.378, [0.265, 0.468, 0.191]], [0.380, [0.276, 0.469, 0.189]], [0.382, [0.276, 0.469, 0.189]], [0.384, [0.286, 0.471, 0.187]], [0.386, [0.286, 0.471, 0.187]], [0.387, [0.296, 0.473, 0.186]], [0.389, [0.296, 0.473, 0.186]], [0.391, [0.307, 0.474, 0.185]], [0.393, [0.307, 0.474, 0.185]], [0.395, [0.318, 0.475, 0.184]], [0.397, [0.318, 0.475, 0.184]], [0.399, [0.329, 0.476, 0.184]], [0.401, [0.329, 0.476, 0.184]], [0.403, [0.341, 0.477, 0.184]], [0.405, [0.341, 0.477, 0.184]], [0.407, [0.352, 0.478, 0.184]], [0.409, [0.352, 0.478, 0.184]], [0.411, [0.363, 0.479, 0.184]], [0.413, [0.363, 0.479, 0.184]], [0.415, [0.375, 0.479, 0.185]], [0.417, [0.375, 0.479, 0.185]], [0.419, [0.387, 0.480, 0.186]], [0.421, [0.387, 0.480, 0.186]], [0.423, [0.399, 0.480, 0.187]], [0.425, [0.399, 0.480, 0.187]], [0.427, [0.411, 0.480, 0.189]], [0.429, [0.411, 0.480, 0.189]], [0.431, [0.423, 0.481, 0.191]], [0.432, [0.423, 0.481, 0.191]], [0.434, [0.435, 0.481, 0.194]], [0.436, [0.435, 0.481, 0.194]], [0.438, [0.447, 0.481, 0.197]], [0.440, [0.447, 0.481, 0.197]], [0.442, [0.459, 0.481, 0.200]], [0.444, [0.459, 0.481, 0.200]], [0.446, [0.471, 0.480, 0.203]], [0.448, [0.471, 0.480, 0.203]], [0.450, [0.483, 0.480, 0.207]], [0.452, [0.483, 0.480, 0.207]], [0.454, [0.495, 0.480, 0.211]], [0.456, [0.495, 0.480, 0.211]], [0.458, [0.507, 0.480, 0.216]], [0.460, [0.507, 0.480, 0.216]], [0.462, [0.519, 0.479, 0.221]], [0.464, [0.519, 0.479, 0.221]], [0.466, [0.531, 0.479, 0.227]], [0.468, [0.531, 0.479, 0.227]], [0.470, [0.543, 0.478, 0.232]], [0.472, [0.543, 0.478, 0.232]], [0.474, [0.554, 0.478, 0.238]], [0.476, [0.554, 0.478, 0.238]], [0.477, [0.566, 0.477, 0.245]], [0.479, [0.566, 0.477, 0.245]], [0.481, [0.578, 0.477, 0.252]], [0.483, [0.578, 0.477, 0.252]], [0.485, [0.589, 0.476, 0.259]], [0.487, [0.589, 0.476, 0.259]], [0.489, [0.600, 0.476, 0.266]], [0.491, [0.600, 0.476, 0.266]], [0.493, [0.611, 0.476, 0.274]], [0.495, [0.611, 0.476, 0.274]], [0.497, [0.622, 0.475, 0.282]], [0.499, [0.622, 0.475, 0.282]], [0.501, [0.633, 0.475, 0.291]], [0.503, [0.633, 0.475, 0.291]], [0.505, [0.643, 0.474, 0.299]], [0.507, [0.643, 0.474, 0.299]], [0.509, [0.654, 0.474, 0.309]], [0.511, [0.654, 0.474, 0.309]], [0.513, [0.664, 0.474, 0.318]], [0.515, [0.664, 0.474, 0.318]], [0.517, [0.674, 0.474, 0.328]], [0.519, [0.674, 0.474, 0.328]], [0.521, [0.683, 0.474, 0.338]], [0.523, [0.683, 0.474, 0.338]], [0.524, [0.693, 0.474, 0.348]], [0.526, [0.693, 0.474, 0.348]], [0.528, [0.702, 0.474, 0.358]], [0.530, [0.702, 0.474, 0.358]], [0.532, [0.711, 0.474, 0.369]], [0.534, [0.711, 0.474, 0.369]], [0.536, [0.719, 0.474, 0.380]], [0.538, [0.719, 0.474, 0.380]], [0.540, [0.727, 0.474, 0.391]], [0.542, [0.727, 0.474, 0.391]], [0.544, [0.735, 0.475, 0.403]], [0.546, [0.735, 0.475, 0.403]], [0.548, [0.743, 0.475, 0.414]], [0.550, [0.743, 0.475, 0.414]], [0.552, [0.751, 0.476, 0.426]], [0.554, [0.751, 0.476, 0.426]], [0.556, [0.758, 0.477, 0.438]], [0.558, [0.758, 0.477, 0.438]], [0.560, [0.764, 0.478, 0.450]], [0.562, [0.764, 0.478, 0.450]], [0.564, [0.771, 0.479, 0.462]], [0.566, [0.771, 0.479, 0.462]], [0.568, [0.777, 0.480, 0.474]], [0.569, [0.777, 0.480, 0.474]], [0.571, [0.783, 0.482, 0.487]], [0.573, [0.783, 0.482, 0.487]], [0.575, [0.788, 0.483, 0.499]], [0.577, [0.788, 0.483, 0.499]], [0.579, [0.794, 0.485, 0.512]], [0.581, [0.794, 0.485, 0.512]], [0.583, [0.798, 0.487, 0.524]], [0.585, [0.798, 0.487, 0.524]], [0.587, [0.803, 0.489, 0.537]], [0.589, [0.803, 0.489, 0.537]], [0.591, [0.807, 0.491, 0.550]], [0.593, [0.807, 0.491, 0.550]], [0.595, [0.811, 0.493, 0.563]], [0.597, [0.811, 0.493, 0.563]], [0.599, [0.815, 0.495, 0.575]], [0.601, [0.815, 0.495, 0.575]], [0.603, [0.818, 0.498, 0.588]], [0.605, [0.818, 0.498, 0.588]], [0.607, [0.821, 0.501, 0.601]], [0.609, [0.821, 0.501, 0.601]], [0.611, [0.823, 0.504, 0.613]], [0.613, [0.823, 0.504, 0.613]], [0.614, [0.826, 0.507, 0.626]], [0.616, [0.826, 0.507, 0.626]], [0.618, [0.828, 0.510, 0.638]], [0.620, [0.828, 0.510, 0.638]], [0.622, [0.829, 0.514, 0.651]], [0.624, [0.829, 0.514, 0.651]], [0.626, [0.831, 0.518, 0.663]], [0.628, [0.831, 0.518, 0.663]], [0.630, [0.832, 0.521, 0.675]], [0.632, [0.832, 0.521, 0.675]], [0.634, [0.833, 0.525, 0.687]], [0.636, [0.833, 0.525, 0.687]], [0.638, [0.833, 0.530, 0.699]], [0.640, [0.833, 0.530, 0.699]], [0.642, [0.833, 0.534, 0.710]], [0.644, [0.833, 0.534, 0.710]], [0.646, [0.833, 0.538, 0.722]], [0.648, [0.833, 0.538, 0.722]], [0.650, [0.833, 0.543, 0.733]], [0.652, [0.833, 0.543, 0.733]], [0.654, [0.833, 0.548, 0.744]], [0.656, [0.833, 0.548, 0.744]], [0.658, [0.832, 0.553, 0.755]], [0.659, [0.832, 0.553, 0.755]], [0.661, [0.831, 0.558, 0.766]], [0.663, [0.831, 0.558, 0.766]], [0.665, [0.830, 0.563, 0.776]], [0.667, [0.830, 0.563, 0.776]], [0.669, [0.829, 0.569, 0.786]], [0.671, [0.829, 0.569, 0.786]], [0.673, [0.827, 0.574, 0.796]], [0.675, [0.827, 0.574, 0.796]], [0.677, [0.825, 0.580, 0.806]], [0.679, [0.825, 0.580, 0.806]], [0.681, [0.824, 0.586, 0.815]], [0.683, [0.824, 0.586, 0.815]], [0.685, [0.822, 0.592, 0.824]], [0.687, [0.822, 0.592, 0.824]], [0.689, [0.819, 0.598, 0.833]], [0.691, [0.819, 0.598, 0.833]], [0.693, [0.817, 0.604, 0.842]], [0.695, [0.817, 0.604, 0.842]], [0.697, [0.815, 0.610, 0.850]], [0.699, [0.815, 0.610, 0.850]], [0.701, [0.812, 0.617, 0.858]], [0.703, [0.812, 0.617, 0.858]], [0.705, [0.810, 0.623, 0.865]], [0.706, [0.810, 0.623, 0.865]], [0.708, [0.807, 0.630, 0.873]], [0.710, [0.807, 0.630, 0.873]], [0.712, [0.805, 0.637, 0.880]], [0.714, [0.805, 0.637, 0.880]], [0.716, [0.802, 0.643, 0.886]], [0.718, [0.802, 0.643, 0.886]], [0.720, [0.799, 0.650, 0.893]], [0.722, [0.799, 0.650, 0.893]], [0.724, [0.796, 0.657, 0.899]], [0.726, [0.796, 0.657, 0.899]], [0.728, [0.794, 0.664, 0.904]], [0.730, [0.794, 0.664, 0.904]], [0.732, [0.791, 0.671, 0.910]], [0.734, [0.791, 0.671, 0.910]], [0.736, [0.788, 0.678, 0.915]], [0.738, [0.788, 0.678, 0.915]], [0.740, [0.786, 0.685, 0.919]], [0.742, [0.786, 0.685, 0.919]], [0.744, [0.783, 0.693, 0.924]], [0.746, [0.783, 0.693, 0.924]], [0.748, [0.780, 0.700, 0.928]], [0.750, [0.780, 0.700, 0.928]], [0.751, [0.778, 0.707, 0.931]], [0.753, [0.778, 0.707, 0.931]], [0.755, [0.776, 0.714, 0.935]], [0.757, [0.776, 0.714, 0.935]], [0.759, [0.773, 0.721, 0.938]], [0.761, [0.773, 0.721, 0.938]], [0.763, [0.771, 0.729, 0.941]], [0.765, [0.771, 0.729, 0.941]], [0.767, [0.769, 0.736, 0.943]], [0.769, [0.769, 0.736, 0.943]], [0.771, [0.767, 0.743, 0.946]], [0.773, [0.767, 0.743, 0.946]], [0.775, [0.765, 0.750, 0.948]], [0.777, [0.765, 0.750, 0.948]], [0.779, [0.764, 0.757, 0.949]], [0.781, [0.764, 0.757, 0.949]], [0.783, [0.762, 0.764, 0.951]], [0.785, [0.762, 0.764, 0.951]], [0.787, [0.761, 0.771, 0.952]], [0.789, [0.761, 0.771, 0.952]], [0.791, [0.760, 0.778, 0.953]], [0.793, [0.760, 0.778, 0.953]], [0.795, [0.759, 0.785, 0.954]], [0.796, [0.759, 0.785, 0.954]], [0.798, [0.759, 0.792, 0.954]], [0.800, [0.759, 0.792, 0.954]], [0.802, [0.758, 0.799, 0.955]], [0.804, [0.758, 0.799, 0.955]], [0.806, [0.758, 0.806, 0.955]], [0.808, [0.758, 0.806, 0.955]], [0.810, [0.758, 0.812, 0.955]], [0.812, [0.758, 0.812, 0.955]], [0.814, [0.758, 0.819, 0.955]], [0.816, [0.758, 0.819, 0.955]], [0.818, [0.759, 0.825, 0.954]], [0.820, [0.759, 0.825, 0.954]], [0.822, [0.760, 0.832, 0.954]], [0.824, [0.760, 0.832, 0.954]], [0.826, [0.761, 0.838, 0.953]], [0.828, [0.761, 0.838, 0.953]], [0.830, [0.762, 0.844, 0.952]], [0.832, [0.762, 0.844, 0.952]], [0.834, [0.763, 0.850, 0.952]], [0.836, [0.763, 0.850, 0.952]], [0.838, [0.765, 0.856, 0.951]], [0.840, [0.765, 0.856, 0.951]], [0.841, [0.767, 0.862, 0.950]], [0.843, [0.767, 0.862, 0.950]], [0.845, [0.769, 0.868, 0.949]], [0.847, [0.769, 0.868, 0.949]], [0.849, [0.772, 0.873, 0.947]], [0.851, [0.772, 0.873, 0.947]], [0.853, [0.775, 0.879, 0.946]], [0.855, [0.775, 0.879, 0.946]], [0.857, [0.778, 0.884, 0.945]], [0.859, [0.778, 0.884, 0.945]], [0.861, [0.781, 0.889, 0.944]], [0.863, [0.781, 0.889, 0.944]], [0.865, [0.784, 0.894, 0.943]], [0.867, [0.784, 0.894, 0.943]], [0.869, [0.788, 0.899, 0.942]], [0.871, [0.788, 0.899, 0.942]], [0.873, [0.792, 0.904, 0.941]], [0.875, [0.792, 0.904, 0.941]], [0.877, [0.796, 0.909, 0.940]], [0.879, [0.796, 0.909, 0.940]], [0.881, [0.801, 0.913, 0.939]], [0.883, [0.801, 0.913, 0.939]], [0.885, [0.806, 0.918, 0.938]], [0.886, [0.806, 0.918, 0.938]], [0.888, [0.811, 0.922, 0.937]], [0.890, [0.811, 0.922, 0.937]], [0.892, [0.816, 0.926, 0.937]], [0.894, [0.816, 0.926, 0.937]], [0.896, [0.821, 0.930, 0.936]], [0.898, [0.821, 0.930, 0.936]], [0.900, [0.827, 0.934, 0.936]], [0.902, [0.827, 0.934, 0.936]], [0.904, [0.833, 0.938, 0.936]], [0.906, [0.833, 0.938, 0.936]], [0.908, [0.839, 0.941, 0.936]], [0.910, [0.839, 0.941, 0.936]], [0.912, [0.845, 0.945, 0.936]], [0.914, [0.845, 0.945, 0.936]], [0.916, [0.851, 0.948, 0.936]], [0.918, [0.851, 0.948, 0.936]], [0.920, [0.857, 0.951, 0.937]], [0.922, [0.857, 0.951, 0.937]], [0.924, [0.864, 0.954, 0.938]], [0.926, [0.864, 0.954, 0.938]], [0.928, [0.871, 0.957, 0.939]], [0.930, [0.871, 0.957, 0.939]], [0.932, [0.878, 0.960, 0.940]], [0.933, [0.878, 0.960, 0.940]], [0.935, [0.885, 0.963, 0.941]], [0.937, [0.885, 0.963, 0.941]], [0.939, [0.892, 0.966, 0.943]], [0.941, [0.892, 0.966, 0.943]], [0.943, [0.899, 0.969, 0.945]], [0.945, [0.899, 0.969, 0.945]], [0.947, [0.906, 0.971, 0.947]], [0.949, [0.906, 0.971, 0.947]], [0.951, [0.913, 0.974, 0.949]], [0.953, [0.913, 0.974, 0.949]], [0.955, [0.921, 0.976, 0.952]], [0.957, [0.921, 0.976, 0.952]], [0.959, [0.928, 0.979, 0.955]], [0.961, [0.928, 0.979, 0.955]], [0.963, [0.935, 0.981, 0.958]], [0.965, [0.935, 0.981, 0.958]], [0.967, [0.943, 0.983, 0.962]], [0.969, [0.943, 0.983, 0.962]], [0.971, [0.950, 0.985, 0.966]], [0.973, [0.950, 0.985, 0.966]], [0.975, [0.957, 0.987, 0.970]], [0.977, [0.957, 0.987, 0.970]], [0.978, [0.965, 0.990, 0.974]], [0.980, [0.965, 0.990, 0.974]], [0.982, [0.972, 0.992, 0.979]], [0.984, [0.972, 0.992, 0.979]], [0.986, [0.979, 0.994, 0.984]], [0.988, [0.979, 0.994, 0.984]], [0.990, [0.986, 0.996, 0.989]], [0.992, [0.986, 0.996, 0.989]], [0.994, [0.993, 0.998, 0.994]], [0.996, [0.993, 0.998, 0.994]], [0.998, [1.000, 1.000, 1.000]], [1.000, [1.000, 1.000, 1.000]]]; +var flag = [[0.000, [1.000, 0.000, 0.000]], [0.002, [1.000, 0.000, 0.000]], [0.004, [1.000, 0.378, 0.210]], [0.006, [1.000, 0.378, 0.210]], [0.008, [1.000, 0.701, 0.493]], [0.010, [1.000, 0.701, 0.493]], [0.012, [1.000, 0.918, 0.777]], [0.014, [1.000, 0.918, 0.777]], [0.016, [1.000, 1.000, 1.000]], [0.018, [1.000, 1.000, 1.000]], [0.020, [0.803, 0.932, 1.000]], [0.022, [0.803, 0.932, 1.000]], [0.023, [0.521, 0.726, 1.000]], [0.025, [0.521, 0.726, 1.000]], [0.027, [0.236, 0.412, 1.000]], [0.029, [0.236, 0.412, 1.000]], [0.031, [0.000, 0.037, 1.000]], [0.033, [0.000, 0.037, 1.000]], [0.035, [0.000, 0.000, 0.816]], [0.037, [0.000, 0.000, 0.816]], [0.039, [0.000, 0.000, 0.535]], [0.041, [0.000, 0.000, 0.535]], [0.043, [0.000, 0.000, 0.249]], [0.045, [0.000, 0.000, 0.249]], [0.047, [0.000, 0.000, 0.000]], [0.049, [0.000, 0.000, 0.000]], [0.051, [0.172, 0.000, 0.000]], [0.053, [0.172, 0.000, 0.000]], [0.055, [0.452, 0.000, 0.000]], [0.057, [0.452, 0.000, 0.000]], [0.059, [0.738, 0.000, 0.000]], [0.061, [0.738, 0.000, 0.000]], [0.063, [0.990, 0.000, 0.000]], [0.065, [0.990, 0.000, 0.000]], [0.067, [1.000, 0.309, 0.160]], [0.068, [1.000, 0.309, 0.160]], [0.070, [1.000, 0.646, 0.438]], [0.072, [1.000, 0.646, 0.438]], [0.074, [1.000, 0.887, 0.725]], [0.076, [1.000, 0.887, 0.725]], [0.078, [1.000, 0.996, 0.979]], [0.080, [1.000, 0.996, 0.979]], [0.082, [0.853, 0.957, 1.000]], [0.084, [0.853, 0.957, 1.000]], [0.086, [0.576, 0.775, 1.000]], [0.088, [0.576, 0.775, 1.000]], [0.090, [0.288, 0.479, 1.000]], [0.092, [0.288, 0.479, 1.000]], [0.094, [0.032, 0.111, 1.000]], [0.096, [0.032, 0.111, 1.000]], [0.098, [0.000, 0.000, 0.865]], [0.100, [0.000, 0.000, 0.865]], [0.102, [0.000, 0.000, 0.590]], [0.104, [0.000, 0.000, 0.590]], [0.106, [0.000, 0.000, 0.301]], [0.108, [0.000, 0.000, 0.301]], [0.110, [0.000, 0.000, 0.043]], [0.112, [0.000, 0.000, 0.043]], [0.114, [0.123, 0.000, 0.000]], [0.115, [0.123, 0.000, 0.000]], [0.117, [0.396, 0.000, 0.000]], [0.119, [0.396, 0.000, 0.000]], [0.121, [0.685, 0.000, 0.000]], [0.123, [0.685, 0.000, 0.000]], [0.125, [0.946, 0.000, 0.000]], [0.127, [0.946, 0.000, 0.000]], [0.129, [1.000, 0.238, 0.111]], [0.131, [1.000, 0.238, 0.111]], [0.133, [1.000, 0.588, 0.383]], [0.135, [1.000, 0.588, 0.383]], [0.137, [1.000, 0.850, 0.672]], [0.139, [1.000, 0.850, 0.672]], [0.141, [1.000, 0.986, 0.935]], [0.143, [1.000, 0.986, 0.935]], [0.145, [0.901, 0.976, 1.000]], [0.147, [0.901, 0.976, 1.000]], [0.149, [0.631, 0.820, 1.000]], [0.151, [0.631, 0.820, 1.000]], [0.153, [0.342, 0.542, 1.000]], [0.155, [0.342, 0.542, 1.000]], [0.157, [0.076, 0.184, 1.000]], [0.159, [0.076, 0.184, 1.000]], [0.160, [0.000, 0.000, 0.912]], [0.162, [0.000, 0.000, 0.912]], [0.164, [0.000, 0.000, 0.645]], [0.166, [0.000, 0.000, 0.645]], [0.168, [0.000, 0.000, 0.355]], [0.170, [0.000, 0.000, 0.355]], [0.172, [0.000, 0.000, 0.088]], [0.174, [0.000, 0.000, 0.088]], [0.176, [0.076, 0.000, 0.000]], [0.178, [0.076, 0.000, 0.000]], [0.180, [0.342, 0.000, 0.000]], [0.182, [0.342, 0.000, 0.000]], [0.184, [0.631, 0.000, 0.000]], [0.186, [0.631, 0.000, 0.000]], [0.188, [0.901, 0.000, 0.000]], [0.190, [0.901, 0.000, 0.000]], [0.192, [1.000, 0.166, 0.065]], [0.194, [1.000, 0.166, 0.065]], [0.196, [1.000, 0.526, 0.328]], [0.198, [1.000, 0.526, 0.328]], [0.200, [1.000, 0.809, 0.617]], [0.202, [1.000, 0.809, 0.617]], [0.204, [1.000, 0.971, 0.889]], [0.205, [1.000, 0.971, 0.889]], [0.207, [0.946, 0.989, 1.000]], [0.209, [0.946, 0.989, 1.000]], [0.211, [0.685, 0.860, 1.000]], [0.213, [0.685, 0.860, 1.000]], [0.215, [0.396, 0.603, 1.000]], [0.217, [0.396, 0.603, 1.000]], [0.219, [0.123, 0.256, 1.000]], [0.221, [0.123, 0.256, 1.000]], [0.223, [0.000, 0.000, 0.957]], [0.225, [0.000, 0.000, 0.957]], [0.227, [0.000, 0.000, 0.699]], [0.229, [0.000, 0.000, 0.699]], [0.231, [0.000, 0.000, 0.410]], [0.233, [0.000, 0.000, 0.410]], [0.235, [0.000, 0.000, 0.135]], [0.237, [0.000, 0.000, 0.135]], [0.239, [0.032, 0.000, 0.000]], [0.241, [0.032, 0.000, 0.000]], [0.243, [0.288, 0.000, 0.000]], [0.245, [0.288, 0.000, 0.000]], [0.247, [0.576, 0.000, 0.000]], [0.249, [0.576, 0.000, 0.000]], [0.250, [0.853, 0.000, 0.000]], [0.252, [0.853, 0.000, 0.000]], [0.254, [1.000, 0.092, 0.021]], [0.256, [1.000, 0.092, 0.021]], [0.258, [1.000, 0.462, 0.275]], [0.260, [1.000, 0.462, 0.275]], [0.262, [1.000, 0.763, 0.562]], [0.264, [1.000, 0.763, 0.562]], [0.266, [1.000, 0.951, 0.840]], [0.268, [1.000, 0.951, 0.840]], [0.270, [0.990, 0.997, 1.000]], [0.272, [0.990, 0.997, 1.000]], [0.274, [0.738, 0.895, 1.000]], [0.276, [0.738, 0.895, 1.000]], [0.278, [0.452, 0.660, 1.000]], [0.280, [0.452, 0.660, 1.000]], [0.282, [0.172, 0.327, 1.000]], [0.284, [0.172, 0.327, 1.000]], [0.286, [0.000, 0.000, 1.000]], [0.288, [0.000, 0.000, 1.000]], [0.290, [0.000, 0.000, 0.751]], [0.292, [0.000, 0.000, 0.751]], [0.294, [0.000, 0.000, 0.465]], [0.295, [0.000, 0.000, 0.465]], [0.297, [0.000, 0.000, 0.184]], [0.299, [0.000, 0.000, 0.184]], [0.301, [0.000, 0.000, 0.000]], [0.303, [0.000, 0.000, 0.000]], [0.305, [0.236, 0.000, 0.000]], [0.307, [0.236, 0.000, 0.000]], [0.309, [0.521, 0.000, 0.000]], [0.311, [0.521, 0.000, 0.000]], [0.313, [0.803, 0.000, 0.000]], [0.315, [0.803, 0.000, 0.000]], [0.317, [1.000, 0.018, 0.000]], [0.319, [1.000, 0.018, 0.000]], [0.321, [1.000, 0.395, 0.223]], [0.323, [1.000, 0.395, 0.223]], [0.325, [1.000, 0.714, 0.507]], [0.327, [1.000, 0.714, 0.507]], [0.329, [1.000, 0.926, 0.790]], [0.331, [1.000, 0.926, 0.790]], [0.333, [1.000, 1.000, 1.000]], [0.335, [1.000, 1.000, 1.000]], [0.337, [0.790, 0.926, 1.000]], [0.339, [0.790, 0.926, 1.000]], [0.341, [0.507, 0.714, 1.000]], [0.342, [0.507, 0.714, 1.000]], [0.344, [0.223, 0.395, 1.000]], [0.346, [0.223, 0.395, 1.000]], [0.348, [0.000, 0.018, 1.000]], [0.350, [0.000, 0.018, 1.000]], [0.352, [0.000, 0.000, 0.803]], [0.354, [0.000, 0.000, 0.803]], [0.356, [0.000, 0.000, 0.521]], [0.358, [0.000, 0.000, 0.521]], [0.360, [0.000, 0.000, 0.236]], [0.362, [0.000, 0.000, 0.236]], [0.364, [0.000, 0.000, 0.000]], [0.366, [0.000, 0.000, 0.000]], [0.368, [0.184, 0.000, 0.000]], [0.370, [0.184, 0.000, 0.000]], [0.372, [0.465, 0.000, 0.000]], [0.374, [0.465, 0.000, 0.000]], [0.376, [0.751, 0.000, 0.000]], [0.378, [0.751, 0.000, 0.000]], [0.380, [1.000, 0.000, 0.000]], [0.382, [1.000, 0.000, 0.000]], [0.384, [1.000, 0.327, 0.172]], [0.386, [1.000, 0.327, 0.172]], [0.387, [1.000, 0.660, 0.452]], [0.389, [1.000, 0.660, 0.452]], [0.391, [1.000, 0.895, 0.738]], [0.393, [1.000, 0.895, 0.738]], [0.395, [1.000, 0.997, 0.990]], [0.397, [1.000, 0.997, 0.990]], [0.399, [0.840, 0.951, 1.000]], [0.401, [0.840, 0.951, 1.000]], [0.403, [0.562, 0.763, 1.000]], [0.405, [0.562, 0.763, 1.000]], [0.407, [0.275, 0.462, 1.000]], [0.409, [0.275, 0.462, 1.000]], [0.411, [0.021, 0.092, 1.000]], [0.413, [0.021, 0.092, 1.000]], [0.415, [0.000, 0.000, 0.853]], [0.417, [0.000, 0.000, 0.853]], [0.419, [0.000, 0.000, 0.576]], [0.421, [0.000, 0.000, 0.576]], [0.423, [0.000, 0.000, 0.288]], [0.425, [0.000, 0.000, 0.288]], [0.427, [0.000, 0.000, 0.032]], [0.429, [0.000, 0.000, 0.032]], [0.431, [0.135, 0.000, 0.000]], [0.432, [0.135, 0.000, 0.000]], [0.434, [0.410, 0.000, 0.000]], [0.436, [0.410, 0.000, 0.000]], [0.438, [0.699, 0.000, 0.000]], [0.440, [0.699, 0.000, 0.000]], [0.442, [0.957, 0.000, 0.000]], [0.444, [0.957, 0.000, 0.000]], [0.446, [1.000, 0.256, 0.123]], [0.448, [1.000, 0.256, 0.123]], [0.450, [1.000, 0.603, 0.396]], [0.452, [1.000, 0.603, 0.396]], [0.454, [1.000, 0.860, 0.685]], [0.456, [1.000, 0.860, 0.685]], [0.458, [1.000, 0.989, 0.946]], [0.460, [1.000, 0.989, 0.946]], [0.462, [0.889, 0.971, 1.000]], [0.464, [0.889, 0.971, 1.000]], [0.466, [0.617, 0.809, 1.000]], [0.468, [0.617, 0.809, 1.000]], [0.470, [0.328, 0.526, 1.000]], [0.472, [0.328, 0.526, 1.000]], [0.474, [0.065, 0.166, 1.000]], [0.476, [0.065, 0.166, 1.000]], [0.477, [0.000, 0.000, 0.901]], [0.479, [0.000, 0.000, 0.901]], [0.481, [0.000, 0.000, 0.631]], [0.483, [0.000, 0.000, 0.631]], [0.485, [0.000, 0.000, 0.342]], [0.487, [0.000, 0.000, 0.342]], [0.489, [0.000, 0.000, 0.076]], [0.491, [0.000, 0.000, 0.076]], [0.493, [0.088, 0.000, 0.000]], [0.495, [0.088, 0.000, 0.000]], [0.497, [0.355, 0.000, 0.000]], [0.499, [0.355, 0.000, 0.000]], [0.501, [0.645, 0.000, 0.000]], [0.503, [0.645, 0.000, 0.000]], [0.505, [0.912, 0.000, 0.000]], [0.507, [0.912, 0.000, 0.000]], [0.509, [1.000, 0.184, 0.076]], [0.511, [1.000, 0.184, 0.076]], [0.513, [1.000, 0.542, 0.342]], [0.515, [1.000, 0.542, 0.342]], [0.517, [1.000, 0.820, 0.631]], [0.519, [1.000, 0.820, 0.631]], [0.521, [1.000, 0.976, 0.901]], [0.523, [1.000, 0.976, 0.901]], [0.524, [0.935, 0.986, 1.000]], [0.526, [0.935, 0.986, 1.000]], [0.528, [0.672, 0.850, 1.000]], [0.530, [0.672, 0.850, 1.000]], [0.532, [0.383, 0.588, 1.000]], [0.534, [0.383, 0.588, 1.000]], [0.536, [0.111, 0.238, 1.000]], [0.538, [0.111, 0.238, 1.000]], [0.540, [0.000, 0.000, 0.946]], [0.542, [0.000, 0.000, 0.946]], [0.544, [0.000, 0.000, 0.685]], [0.546, [0.000, 0.000, 0.685]], [0.548, [0.000, 0.000, 0.396]], [0.550, [0.000, 0.000, 0.396]], [0.552, [0.000, 0.000, 0.123]], [0.554, [0.000, 0.000, 0.123]], [0.556, [0.043, 0.000, 0.000]], [0.558, [0.043, 0.000, 0.000]], [0.560, [0.301, 0.000, 0.000]], [0.562, [0.301, 0.000, 0.000]], [0.564, [0.590, 0.000, 0.000]], [0.566, [0.590, 0.000, 0.000]], [0.568, [0.865, 0.000, 0.000]], [0.569, [0.865, 0.000, 0.000]], [0.571, [1.000, 0.111, 0.032]], [0.573, [1.000, 0.111, 0.032]], [0.575, [1.000, 0.479, 0.288]], [0.577, [1.000, 0.479, 0.288]], [0.579, [1.000, 0.775, 0.576]], [0.581, [1.000, 0.775, 0.576]], [0.583, [1.000, 0.957, 0.853]], [0.585, [1.000, 0.957, 0.853]], [0.587, [0.979, 0.996, 1.000]], [0.589, [0.979, 0.996, 1.000]], [0.591, [0.725, 0.887, 1.000]], [0.593, [0.725, 0.887, 1.000]], [0.595, [0.438, 0.646, 1.000]], [0.597, [0.438, 0.646, 1.000]], [0.599, [0.160, 0.309, 1.000]], [0.601, [0.160, 0.309, 1.000]], [0.603, [0.000, 0.000, 0.990]], [0.605, [0.000, 0.000, 0.990]], [0.607, [0.000, 0.000, 0.738]], [0.609, [0.000, 0.000, 0.738]], [0.611, [0.000, 0.000, 0.452]], [0.613, [0.000, 0.000, 0.452]], [0.614, [0.000, 0.000, 0.172]], [0.616, [0.000, 0.000, 0.172]], [0.618, [0.000, 0.000, 0.000]], [0.620, [0.000, 0.000, 0.000]], [0.622, [0.249, 0.000, 0.000]], [0.624, [0.249, 0.000, 0.000]], [0.626, [0.535, 0.000, 0.000]], [0.628, [0.535, 0.000, 0.000]], [0.630, [0.816, 0.000, 0.000]], [0.632, [0.816, 0.000, 0.000]], [0.634, [1.000, 0.037, 0.000]], [0.636, [1.000, 0.037, 0.000]], [0.638, [1.000, 0.412, 0.236]], [0.640, [1.000, 0.412, 0.236]], [0.642, [1.000, 0.726, 0.521]], [0.644, [1.000, 0.726, 0.521]], [0.646, [1.000, 0.932, 0.803]], [0.648, [1.000, 0.932, 0.803]], [0.650, [1.000, 1.000, 1.000]], [0.652, [1.000, 1.000, 1.000]], [0.654, [0.777, 0.918, 1.000]], [0.656, [0.777, 0.918, 1.000]], [0.658, [0.493, 0.701, 1.000]], [0.659, [0.493, 0.701, 1.000]], [0.661, [0.210, 0.378, 1.000]], [0.663, [0.210, 0.378, 1.000]], [0.665, [0.000, 0.000, 1.000]], [0.667, [0.000, 0.000, 1.000]], [0.669, [0.000, 0.000, 0.790]], [0.671, [0.000, 0.000, 0.790]], [0.673, [0.000, 0.000, 0.507]], [0.675, [0.000, 0.000, 0.507]], [0.677, [0.000, 0.000, 0.223]], [0.679, [0.000, 0.000, 0.223]], [0.681, [0.000, 0.000, 0.000]], [0.683, [0.000, 0.000, 0.000]], [0.685, [0.197, 0.000, 0.000]], [0.687, [0.197, 0.000, 0.000]], [0.689, [0.479, 0.000, 0.000]], [0.691, [0.479, 0.000, 0.000]], [0.693, [0.764, 0.000, 0.000]], [0.695, [0.764, 0.000, 0.000]], [0.697, [1.000, 0.000, 0.000]], [0.699, [1.000, 0.000, 0.000]], [0.701, [1.000, 0.344, 0.184]], [0.703, [1.000, 0.344, 0.184]], [0.705, [1.000, 0.674, 0.465]], [0.706, [1.000, 0.674, 0.465]], [0.708, [1.000, 0.903, 0.751]], [0.710, [1.000, 0.903, 0.751]], [0.712, [1.000, 0.998, 1.000]], [0.714, [1.000, 0.998, 1.000]], [0.716, [0.828, 0.945, 1.000]], [0.718, [0.828, 0.945, 1.000]], [0.720, [0.548, 0.751, 1.000]], [0.722, [0.548, 0.751, 1.000]], [0.724, [0.262, 0.446, 1.000]], [0.726, [0.262, 0.446, 1.000]], [0.728, [0.010, 0.074, 1.000]], [0.730, [0.010, 0.074, 1.000]], [0.732, [0.000, 0.000, 0.840]], [0.734, [0.000, 0.000, 0.840]], [0.736, [0.000, 0.000, 0.562]], [0.738, [0.000, 0.000, 0.562]], [0.740, [0.000, 0.000, 0.275]], [0.742, [0.000, 0.000, 0.275]], [0.744, [0.000, 0.000, 0.021]], [0.746, [0.000, 0.000, 0.021]], [0.748, [0.147, 0.000, 0.000]], [0.750, [0.147, 0.000, 0.000]], [0.751, [0.424, 0.000, 0.000]], [0.753, [0.424, 0.000, 0.000]], [0.755, [0.712, 0.000, 0.000]], [0.757, [0.712, 0.000, 0.000]], [0.759, [0.968, 0.000, 0.000]], [0.761, [0.968, 0.000, 0.000]], [0.763, [1.000, 0.274, 0.135]], [0.765, [1.000, 0.274, 0.135]], [0.767, [1.000, 0.617, 0.410]], [0.769, [1.000, 0.617, 0.410]], [0.771, [1.000, 0.869, 0.699]], [0.773, [1.000, 0.869, 0.699]], [0.775, [1.000, 0.992, 0.957]], [0.777, [1.000, 0.992, 0.957]], [0.779, [0.877, 0.967, 1.000]], [0.781, [0.877, 0.967, 1.000]], [0.783, [0.604, 0.798, 1.000]], [0.785, [0.604, 0.798, 1.000]], [0.787, [0.315, 0.511, 1.000]], [0.789, [0.315, 0.511, 1.000]], [0.791, [0.054, 0.147, 1.000]], [0.793, [0.054, 0.147, 1.000]], [0.795, [0.000, 0.000, 0.889]], [0.796, [0.000, 0.000, 0.889]], [0.798, [0.000, 0.000, 0.617]], [0.800, [0.000, 0.000, 0.617]], [0.802, [0.000, 0.000, 0.328]], [0.804, [0.000, 0.000, 0.328]], [0.806, [0.000, 0.000, 0.065]], [0.808, [0.000, 0.000, 0.065]], [0.810, [0.099, 0.000, 0.000]], [0.812, [0.099, 0.000, 0.000]], [0.814, [0.369, 0.000, 0.000]], [0.816, [0.369, 0.000, 0.000]], [0.818, [0.658, 0.000, 0.000]], [0.820, [0.658, 0.000, 0.000]], [0.822, [0.924, 0.000, 0.000]], [0.824, [0.924, 0.000, 0.000]], [0.826, [1.000, 0.202, 0.088]], [0.828, [1.000, 0.202, 0.088]], [0.830, [1.000, 0.557, 0.355]], [0.832, [1.000, 0.557, 0.355]], [0.834, [1.000, 0.830, 0.645]], [0.836, [1.000, 0.830, 0.645]], [0.838, [1.000, 0.979, 0.912]], [0.840, [1.000, 0.979, 0.912]], [0.841, [0.924, 0.983, 1.000]], [0.843, [0.924, 0.983, 1.000]], [0.845, [0.658, 0.840, 1.000]], [0.847, [0.658, 0.840, 1.000]], [0.849, [0.369, 0.573, 1.000]], [0.851, [0.369, 0.573, 1.000]], [0.853, [0.099, 0.220, 1.000]], [0.855, [0.099, 0.220, 1.000]], [0.857, [0.000, 0.000, 0.935]], [0.859, [0.000, 0.000, 0.935]], [0.861, [0.000, 0.000, 0.672]], [0.863, [0.000, 0.000, 0.672]], [0.865, [0.000, 0.000, 0.383]], [0.867, [0.000, 0.000, 0.383]], [0.869, [0.000, 0.000, 0.111]], [0.871, [0.000, 0.000, 0.111]], [0.873, [0.054, 0.000, 0.000]], [0.875, [0.054, 0.000, 0.000]], [0.877, [0.315, 0.000, 0.000]], [0.879, [0.315, 0.000, 0.000]], [0.881, [0.604, 0.000, 0.000]], [0.883, [0.604, 0.000, 0.000]], [0.885, [0.877, 0.000, 0.000]], [0.886, [0.877, 0.000, 0.000]], [0.888, [1.000, 0.129, 0.043]], [0.890, [1.000, 0.129, 0.043]], [0.892, [1.000, 0.495, 0.301]], [0.894, [1.000, 0.495, 0.301]], [0.896, [1.000, 0.787, 0.590]], [0.898, [1.000, 0.787, 0.590]], [0.900, [1.000, 0.962, 0.865]], [0.902, [1.000, 0.962, 0.865]], [0.904, [0.968, 0.994, 1.000]], [0.906, [0.968, 0.994, 1.000]], [0.908, [0.712, 0.878, 1.000]], [0.910, [0.712, 0.878, 1.000]], [0.912, [0.424, 0.632, 1.000]], [0.914, [0.424, 0.632, 1.000]], [0.916, [0.147, 0.291, 1.000]], [0.918, [0.147, 0.291, 1.000]], [0.920, [0.000, 0.000, 0.979]], [0.922, [0.000, 0.000, 0.979]], [0.924, [0.000, 0.000, 0.725]], [0.926, [0.000, 0.000, 0.725]], [0.928, [0.000, 0.000, 0.438]], [0.930, [0.000, 0.000, 0.438]], [0.932, [0.000, 0.000, 0.160]], [0.933, [0.000, 0.000, 0.160]], [0.935, [0.010, 0.000, 0.000]], [0.937, [0.010, 0.000, 0.000]], [0.939, [0.262, 0.000, 0.000]], [0.941, [0.262, 0.000, 0.000]], [0.943, [0.548, 0.000, 0.000]], [0.945, [0.548, 0.000, 0.000]], [0.947, [0.828, 0.000, 0.000]], [0.949, [0.828, 0.000, 0.000]], [0.951, [1.000, 0.055, 0.000]], [0.953, [1.000, 0.055, 0.000]], [0.955, [1.000, 0.429, 0.249]], [0.957, [1.000, 0.429, 0.249]], [0.959, [1.000, 0.739, 0.535]], [0.961, [1.000, 0.739, 0.535]], [0.963, [1.000, 0.939, 0.816]], [0.965, [1.000, 0.939, 0.816]], [0.967, [1.000, 0.999, 1.000]], [0.969, [1.000, 0.999, 1.000]], [0.971, [0.764, 0.911, 1.000]], [0.973, [0.764, 0.911, 1.000]], [0.975, [0.479, 0.687, 1.000]], [0.977, [0.479, 0.687, 1.000]], [0.978, [0.197, 0.361, 1.000]], [0.980, [0.197, 0.361, 1.000]], [0.982, [0.000, 0.000, 1.000]], [0.984, [0.000, 0.000, 1.000]], [0.986, [0.000, 0.000, 0.777]], [0.988, [0.000, 0.000, 0.777]], [0.990, [0.000, 0.000, 0.493]], [0.992, [0.000, 0.000, 0.493]], [0.994, [0.000, 0.000, 0.210]], [0.996, [0.000, 0.000, 0.210]], [0.998, [0.000, 0.000, 0.000]], [1.000, [0.000, 0.000, 0.000]]]; +var gist_earth = [[0.000, [0.000, 0.000, 0.000]], [0.002, [0.000, 0.000, 0.000]], [0.004, [0.003, 0.000, 0.169]], [0.006, [0.003, 0.000, 0.169]], [0.008, [0.005, 0.000, 0.222]], [0.010, [0.005, 0.000, 0.222]], [0.012, [0.008, 0.000, 0.264]], [0.014, [0.008, 0.000, 0.264]], [0.016, [0.010, 0.000, 0.306]], [0.018, [0.010, 0.000, 0.306]], [0.020, [0.013, 0.000, 0.348]], [0.022, [0.013, 0.000, 0.348]], [0.023, [0.016, 0.000, 0.390]], [0.025, [0.016, 0.000, 0.390]], [0.027, [0.018, 0.000, 0.432]], [0.029, [0.018, 0.000, 0.432]], [0.031, [0.021, 0.009, 0.455]], [0.033, [0.021, 0.009, 0.455]], [0.035, [0.024, 0.018, 0.456]], [0.037, [0.024, 0.018, 0.456]], [0.039, [0.026, 0.027, 0.456]], [0.041, [0.026, 0.027, 0.456]], [0.043, [0.029, 0.036, 0.457]], [0.045, [0.029, 0.036, 0.457]], [0.047, [0.031, 0.045, 0.458]], [0.049, [0.031, 0.045, 0.458]], [0.051, [0.034, 0.054, 0.458]], [0.053, [0.034, 0.054, 0.458]], [0.055, [0.037, 0.063, 0.459]], [0.057, [0.037, 0.063, 0.459]], [0.059, [0.039, 0.072, 0.460]], [0.061, [0.039, 0.072, 0.460]], [0.063, [0.042, 0.081, 0.461]], [0.065, [0.042, 0.081, 0.461]], [0.067, [0.044, 0.090, 0.461]], [0.068, [0.044, 0.090, 0.461]], [0.070, [0.047, 0.099, 0.462]], [0.072, [0.047, 0.099, 0.462]], [0.074, [0.050, 0.108, 0.463]], [0.076, [0.050, 0.108, 0.463]], [0.078, [0.052, 0.117, 0.463]], [0.080, [0.052, 0.117, 0.463]], [0.082, [0.055, 0.126, 0.464]], [0.084, [0.055, 0.126, 0.464]], [0.086, [0.057, 0.135, 0.465]], [0.088, [0.057, 0.135, 0.465]], [0.090, [0.060, 0.144, 0.466]], [0.092, [0.060, 0.144, 0.466]], [0.094, [0.063, 0.153, 0.466]], [0.096, [0.063, 0.153, 0.466]], [0.098, [0.065, 0.162, 0.467]], [0.100, [0.065, 0.162, 0.467]], [0.102, [0.068, 0.171, 0.468]], [0.104, [0.068, 0.171, 0.468]], [0.106, [0.071, 0.180, 0.468]], [0.108, [0.071, 0.180, 0.468]], [0.110, [0.073, 0.189, 0.469]], [0.112, [0.073, 0.189, 0.469]], [0.114, [0.076, 0.197, 0.470]], [0.115, [0.076, 0.197, 0.470]], [0.117, [0.078, 0.206, 0.471]], [0.119, [0.078, 0.206, 0.471]], [0.121, [0.081, 0.214, 0.471]], [0.123, [0.081, 0.214, 0.471]], [0.125, [0.084, 0.222, 0.472]], [0.127, [0.084, 0.222, 0.472]], [0.129, [0.086, 0.230, 0.473]], [0.131, [0.086, 0.230, 0.473]], [0.133, [0.089, 0.238, 0.473]], [0.135, [0.089, 0.238, 0.473]], [0.137, [0.091, 0.246, 0.474]], [0.139, [0.091, 0.246, 0.474]], [0.141, [0.094, 0.255, 0.475]], [0.143, [0.094, 0.255, 0.475]], [0.145, [0.097, 0.263, 0.476]], [0.147, [0.097, 0.263, 0.476]], [0.149, [0.099, 0.271, 0.476]], [0.151, [0.099, 0.271, 0.476]], [0.153, [0.102, 0.279, 0.477]], [0.155, [0.102, 0.279, 0.477]], [0.157, [0.105, 0.287, 0.478]], [0.159, [0.105, 0.287, 0.478]], [0.160, [0.107, 0.295, 0.478]], [0.162, [0.107, 0.295, 0.478]], [0.164, [0.110, 0.304, 0.479]], [0.166, [0.110, 0.304, 0.479]], [0.168, [0.112, 0.311, 0.480]], [0.170, [0.112, 0.311, 0.480]], [0.172, [0.115, 0.318, 0.480]], [0.174, [0.115, 0.318, 0.480]], [0.176, [0.118, 0.326, 0.481]], [0.178, [0.118, 0.326, 0.481]], [0.180, [0.120, 0.333, 0.482]], [0.182, [0.120, 0.333, 0.482]], [0.184, [0.123, 0.340, 0.483]], [0.186, [0.123, 0.340, 0.483]], [0.188, [0.125, 0.348, 0.483]], [0.190, [0.125, 0.348, 0.483]], [0.192, [0.128, 0.355, 0.484]], [0.194, [0.128, 0.355, 0.484]], [0.196, [0.131, 0.362, 0.485]], [0.198, [0.131, 0.362, 0.485]], [0.200, [0.133, 0.370, 0.485]], [0.202, [0.133, 0.370, 0.485]], [0.204, [0.136, 0.377, 0.486]], [0.205, [0.136, 0.377, 0.486]], [0.207, [0.139, 0.384, 0.487]], [0.209, [0.139, 0.384, 0.487]], [0.211, [0.141, 0.390, 0.488]], [0.213, [0.141, 0.390, 0.488]], [0.215, [0.144, 0.397, 0.488]], [0.217, [0.144, 0.397, 0.488]], [0.219, [0.146, 0.403, 0.489]], [0.221, [0.146, 0.403, 0.489]], [0.223, [0.149, 0.409, 0.490]], [0.225, [0.149, 0.409, 0.490]], [0.227, [0.152, 0.415, 0.490]], [0.229, [0.152, 0.415, 0.490]], [0.231, [0.154, 0.421, 0.491]], [0.233, [0.154, 0.421, 0.491]], [0.235, [0.157, 0.428, 0.492]], [0.237, [0.157, 0.428, 0.492]], [0.239, [0.159, 0.434, 0.493]], [0.241, [0.159, 0.434, 0.493]], [0.243, [0.162, 0.440, 0.493]], [0.245, [0.162, 0.440, 0.493]], [0.247, [0.165, 0.446, 0.494]], [0.249, [0.165, 0.446, 0.494]], [0.250, [0.167, 0.452, 0.495]], [0.252, [0.167, 0.452, 0.495]], [0.254, [0.170, 0.459, 0.495]], [0.256, [0.170, 0.459, 0.495]], [0.258, [0.172, 0.465, 0.496]], [0.260, [0.172, 0.465, 0.496]], [0.262, [0.175, 0.471, 0.497]], [0.264, [0.175, 0.471, 0.497]], [0.266, [0.178, 0.477, 0.498]], [0.268, [0.178, 0.477, 0.498]], [0.270, [0.180, 0.483, 0.498]], [0.272, [0.180, 0.483, 0.498]], [0.274, [0.183, 0.490, 0.499]], [0.276, [0.183, 0.490, 0.499]], [0.278, [0.186, 0.496, 0.500]], [0.280, [0.186, 0.496, 0.500]], [0.282, [0.188, 0.502, 0.500]], [0.284, [0.188, 0.502, 0.500]], [0.286, [0.190, 0.504, 0.496]], [0.288, [0.190, 0.504, 0.496]], [0.290, [0.192, 0.506, 0.491]], [0.292, [0.192, 0.506, 0.491]], [0.294, [0.194, 0.509, 0.486]], [0.295, [0.194, 0.509, 0.486]], [0.297, [0.196, 0.511, 0.481]], [0.299, [0.196, 0.511, 0.481]], [0.301, [0.197, 0.513, 0.476]], [0.303, [0.197, 0.513, 0.476]], [0.305, [0.199, 0.516, 0.472]], [0.307, [0.199, 0.516, 0.472]], [0.309, [0.201, 0.518, 0.467]], [0.311, [0.201, 0.518, 0.467]], [0.313, [0.203, 0.520, 0.462]], [0.315, [0.203, 0.520, 0.462]], [0.317, [0.205, 0.522, 0.457]], [0.319, [0.205, 0.522, 0.457]], [0.321, [0.207, 0.525, 0.452]], [0.323, [0.207, 0.525, 0.452]], [0.325, [0.209, 0.527, 0.448]], [0.327, [0.209, 0.527, 0.448]], [0.329, [0.210, 0.529, 0.443]], [0.331, [0.210, 0.529, 0.443]], [0.333, [0.212, 0.531, 0.438]], [0.335, [0.212, 0.531, 0.438]], [0.337, [0.214, 0.534, 0.433]], [0.339, [0.214, 0.534, 0.433]], [0.341, [0.216, 0.536, 0.428]], [0.342, [0.216, 0.536, 0.428]], [0.344, [0.218, 0.538, 0.424]], [0.346, [0.218, 0.538, 0.424]], [0.348, [0.220, 0.540, 0.419]], [0.350, [0.220, 0.540, 0.419]], [0.352, [0.221, 0.543, 0.414]], [0.354, [0.221, 0.543, 0.414]], [0.356, [0.223, 0.545, 0.409]], [0.358, [0.223, 0.545, 0.409]], [0.360, [0.225, 0.547, 0.404]], [0.362, [0.225, 0.547, 0.404]], [0.364, [0.227, 0.549, 0.400]], [0.366, [0.227, 0.549, 0.400]], [0.368, [0.229, 0.552, 0.395]], [0.370, [0.229, 0.552, 0.395]], [0.372, [0.231, 0.554, 0.390]], [0.374, [0.231, 0.554, 0.390]], [0.376, [0.233, 0.556, 0.385]], [0.378, [0.233, 0.556, 0.385]], [0.380, [0.234, 0.558, 0.380]], [0.382, [0.234, 0.558, 0.380]], [0.384, [0.236, 0.561, 0.376]], [0.386, [0.236, 0.561, 0.376]], [0.387, [0.238, 0.563, 0.371]], [0.389, [0.238, 0.563, 0.371]], [0.391, [0.240, 0.565, 0.366]], [0.393, [0.240, 0.565, 0.366]], [0.395, [0.242, 0.567, 0.361]], [0.397, [0.242, 0.567, 0.361]], [0.399, [0.244, 0.570, 0.356]], [0.401, [0.244, 0.570, 0.356]], [0.403, [0.246, 0.572, 0.352]], [0.405, [0.246, 0.572, 0.352]], [0.407, [0.247, 0.574, 0.347]], [0.409, [0.247, 0.574, 0.347]], [0.411, [0.249, 0.576, 0.342]], [0.413, [0.249, 0.576, 0.342]], [0.415, [0.251, 0.579, 0.337]], [0.417, [0.251, 0.579, 0.337]], [0.419, [0.253, 0.581, 0.332]], [0.421, [0.253, 0.581, 0.332]], [0.423, [0.255, 0.583, 0.328]], [0.425, [0.255, 0.583, 0.328]], [0.427, [0.257, 0.586, 0.323]], [0.429, [0.257, 0.586, 0.323]], [0.431, [0.258, 0.588, 0.318]], [0.432, [0.258, 0.588, 0.318]], [0.434, [0.260, 0.590, 0.313]], [0.436, [0.260, 0.590, 0.313]], [0.438, [0.262, 0.592, 0.308]], [0.440, [0.262, 0.592, 0.308]], [0.442, [0.264, 0.595, 0.304]], [0.444, [0.264, 0.595, 0.304]], [0.446, [0.266, 0.597, 0.299]], [0.448, [0.266, 0.597, 0.299]], [0.450, [0.268, 0.599, 0.294]], [0.452, [0.268, 0.599, 0.294]], [0.454, [0.270, 0.601, 0.289]], [0.456, [0.270, 0.601, 0.289]], [0.458, [0.271, 0.604, 0.284]], [0.460, [0.271, 0.604, 0.284]], [0.462, [0.280, 0.606, 0.280]], [0.464, [0.280, 0.606, 0.280]], [0.466, [0.289, 0.608, 0.275]], [0.468, [0.289, 0.608, 0.275]], [0.470, [0.298, 0.610, 0.277]], [0.472, [0.298, 0.610, 0.277]], [0.474, [0.306, 0.613, 0.279]], [0.476, [0.306, 0.613, 0.279]], [0.477, [0.315, 0.615, 0.282]], [0.479, [0.315, 0.615, 0.282]], [0.481, [0.324, 0.617, 0.284]], [0.483, [0.324, 0.617, 0.284]], [0.485, [0.332, 0.619, 0.286]], [0.487, [0.332, 0.619, 0.286]], [0.489, [0.341, 0.622, 0.288]], [0.491, [0.341, 0.622, 0.288]], [0.493, [0.350, 0.624, 0.291]], [0.495, [0.350, 0.624, 0.291]], [0.497, [0.359, 0.626, 0.293]], [0.499, [0.359, 0.626, 0.293]], [0.501, [0.367, 0.628, 0.295]], [0.503, [0.367, 0.628, 0.295]], [0.505, [0.376, 0.631, 0.298]], [0.507, [0.376, 0.631, 0.298]], [0.509, [0.385, 0.633, 0.300]], [0.511, [0.385, 0.633, 0.300]], [0.513, [0.393, 0.635, 0.302]], [0.515, [0.393, 0.635, 0.302]], [0.517, [0.402, 0.637, 0.304]], [0.519, [0.402, 0.637, 0.304]], [0.521, [0.411, 0.640, 0.307]], [0.523, [0.411, 0.640, 0.307]], [0.524, [0.420, 0.641, 0.309]], [0.526, [0.420, 0.641, 0.309]], [0.528, [0.428, 0.643, 0.311]], [0.530, [0.428, 0.643, 0.311]], [0.532, [0.437, 0.645, 0.314]], [0.534, [0.437, 0.645, 0.314]], [0.536, [0.446, 0.647, 0.316]], [0.538, [0.446, 0.647, 0.316]], [0.540, [0.455, 0.648, 0.318]], [0.542, [0.455, 0.648, 0.318]], [0.544, [0.463, 0.650, 0.320]], [0.546, [0.463, 0.650, 0.320]], [0.548, [0.472, 0.652, 0.322]], [0.550, [0.472, 0.652, 0.322]], [0.552, [0.478, 0.653, 0.323]], [0.554, [0.478, 0.653, 0.323]], [0.556, [0.485, 0.655, 0.324]], [0.558, [0.485, 0.655, 0.324]], [0.560, [0.491, 0.657, 0.325]], [0.562, [0.491, 0.657, 0.325]], [0.564, [0.498, 0.659, 0.327]], [0.566, [0.498, 0.659, 0.327]], [0.568, [0.504, 0.660, 0.328]], [0.569, [0.504, 0.660, 0.328]], [0.571, [0.511, 0.662, 0.329]], [0.573, [0.511, 0.662, 0.329]], [0.575, [0.517, 0.664, 0.330]], [0.577, [0.517, 0.664, 0.330]], [0.579, [0.524, 0.665, 0.332]], [0.581, [0.524, 0.665, 0.332]], [0.583, [0.530, 0.667, 0.333]], [0.585, [0.530, 0.667, 0.333]], [0.587, [0.537, 0.669, 0.334]], [0.589, [0.537, 0.669, 0.334]], [0.591, [0.543, 0.671, 0.335]], [0.593, [0.543, 0.671, 0.335]], [0.595, [0.550, 0.672, 0.337]], [0.597, [0.550, 0.672, 0.337]], [0.599, [0.556, 0.674, 0.338]], [0.601, [0.556, 0.674, 0.338]], [0.603, [0.562, 0.676, 0.339]], [0.605, [0.562, 0.676, 0.339]], [0.607, [0.569, 0.678, 0.340]], [0.609, [0.569, 0.678, 0.340]], [0.611, [0.575, 0.679, 0.342]], [0.613, [0.575, 0.679, 0.342]], [0.614, [0.582, 0.681, 0.343]], [0.616, [0.582, 0.681, 0.343]], [0.618, [0.588, 0.683, 0.344]], [0.620, [0.588, 0.683, 0.344]], [0.622, [0.595, 0.684, 0.345]], [0.624, [0.595, 0.684, 0.345]], [0.626, [0.601, 0.686, 0.347]], [0.628, [0.601, 0.686, 0.347]], [0.630, [0.608, 0.688, 0.348]], [0.632, [0.608, 0.688, 0.348]], [0.634, [0.614, 0.690, 0.349]], [0.636, [0.614, 0.690, 0.349]], [0.638, [0.621, 0.691, 0.350]], [0.640, [0.621, 0.691, 0.350]], [0.642, [0.627, 0.693, 0.351]], [0.644, [0.627, 0.693, 0.351]], [0.646, [0.634, 0.695, 0.353]], [0.648, [0.634, 0.695, 0.353]], [0.650, [0.640, 0.696, 0.354]], [0.652, [0.640, 0.696, 0.354]], [0.654, [0.647, 0.698, 0.355]], [0.656, [0.647, 0.698, 0.355]], [0.658, [0.653, 0.700, 0.356]], [0.659, [0.653, 0.700, 0.356]], [0.661, [0.659, 0.702, 0.358]], [0.663, [0.659, 0.702, 0.358]], [0.665, [0.666, 0.703, 0.359]], [0.667, [0.666, 0.703, 0.359]], [0.669, [0.672, 0.705, 0.360]], [0.671, [0.672, 0.705, 0.360]], [0.673, [0.679, 0.707, 0.361]], [0.675, [0.679, 0.707, 0.361]], [0.677, [0.685, 0.709, 0.363]], [0.679, [0.685, 0.709, 0.363]], [0.681, [0.692, 0.710, 0.364]], [0.683, [0.692, 0.710, 0.364]], [0.685, [0.698, 0.712, 0.365]], [0.687, [0.698, 0.712, 0.365]], [0.689, [0.705, 0.714, 0.366]], [0.691, [0.705, 0.714, 0.366]], [0.693, [0.711, 0.715, 0.368]], [0.695, [0.711, 0.715, 0.368]], [0.697, [0.718, 0.717, 0.369]], [0.699, [0.718, 0.717, 0.369]], [0.701, [0.719, 0.714, 0.370]], [0.703, [0.719, 0.714, 0.370]], [0.705, [0.721, 0.710, 0.371]], [0.706, [0.721, 0.710, 0.371]], [0.708, [0.723, 0.707, 0.373]], [0.710, [0.723, 0.707, 0.373]], [0.712, [0.724, 0.704, 0.374]], [0.714, [0.724, 0.704, 0.374]], [0.716, [0.726, 0.700, 0.375]], [0.718, [0.726, 0.700, 0.375]], [0.720, [0.727, 0.697, 0.376]], [0.722, [0.727, 0.697, 0.376]], [0.724, [0.729, 0.693, 0.378]], [0.726, [0.729, 0.693, 0.378]], [0.728, [0.731, 0.690, 0.379]], [0.730, [0.731, 0.690, 0.379]], [0.732, [0.732, 0.687, 0.380]], [0.734, [0.732, 0.687, 0.380]], [0.736, [0.734, 0.683, 0.381]], [0.738, [0.734, 0.683, 0.381]], [0.740, [0.736, 0.680, 0.382]], [0.742, [0.736, 0.680, 0.382]], [0.744, [0.737, 0.676, 0.384]], [0.746, [0.737, 0.676, 0.384]], [0.748, [0.739, 0.673, 0.385]], [0.750, [0.739, 0.673, 0.385]], [0.751, [0.741, 0.670, 0.386]], [0.753, [0.741, 0.670, 0.386]], [0.755, [0.742, 0.666, 0.387]], [0.757, [0.742, 0.666, 0.387]], [0.759, [0.744, 0.663, 0.389]], [0.761, [0.744, 0.663, 0.389]], [0.763, [0.745, 0.659, 0.390]], [0.765, [0.745, 0.659, 0.390]], [0.767, [0.747, 0.656, 0.391]], [0.769, [0.747, 0.656, 0.391]], [0.771, [0.749, 0.653, 0.392]], [0.773, [0.749, 0.653, 0.392]], [0.775, [0.750, 0.649, 0.394]], [0.777, [0.750, 0.649, 0.394]], [0.779, [0.752, 0.646, 0.395]], [0.781, [0.752, 0.646, 0.395]], [0.783, [0.754, 0.643, 0.396]], [0.785, [0.754, 0.643, 0.396]], [0.787, [0.755, 0.639, 0.406]], [0.789, [0.755, 0.639, 0.406]], [0.791, [0.760, 0.641, 0.415]], [0.793, [0.760, 0.641, 0.415]], [0.795, [0.764, 0.643, 0.425]], [0.796, [0.764, 0.643, 0.425]], [0.798, [0.768, 0.645, 0.435]], [0.800, [0.768, 0.645, 0.435]], [0.802, [0.773, 0.646, 0.444]], [0.804, [0.773, 0.646, 0.444]], [0.806, [0.777, 0.648, 0.454]], [0.808, [0.777, 0.648, 0.454]], [0.810, [0.782, 0.652, 0.463]], [0.812, [0.782, 0.652, 0.463]], [0.814, [0.786, 0.655, 0.473]], [0.816, [0.786, 0.655, 0.473]], [0.818, [0.790, 0.658, 0.483]], [0.820, [0.790, 0.658, 0.483]], [0.822, [0.795, 0.662, 0.492]], [0.824, [0.795, 0.662, 0.492]], [0.826, [0.799, 0.665, 0.502]], [0.828, [0.799, 0.665, 0.502]], [0.830, [0.804, 0.668, 0.511]], [0.832, [0.804, 0.668, 0.511]], [0.834, [0.808, 0.672, 0.521]], [0.836, [0.808, 0.672, 0.521]], [0.838, [0.812, 0.675, 0.531]], [0.840, [0.812, 0.675, 0.531]], [0.841, [0.817, 0.679, 0.540]], [0.843, [0.817, 0.679, 0.540]], [0.845, [0.821, 0.682, 0.550]], [0.847, [0.821, 0.682, 0.550]], [0.849, [0.826, 0.685, 0.559]], [0.851, [0.826, 0.685, 0.559]], [0.853, [0.830, 0.689, 0.569]], [0.855, [0.830, 0.689, 0.569]], [0.857, [0.834, 0.692, 0.579]], [0.859, [0.834, 0.692, 0.579]], [0.861, [0.839, 0.696, 0.588]], [0.863, [0.839, 0.696, 0.588]], [0.865, [0.843, 0.699, 0.598]], [0.867, [0.843, 0.699, 0.598]], [0.869, [0.847, 0.705, 0.607]], [0.871, [0.847, 0.705, 0.607]], [0.873, [0.852, 0.710, 0.617]], [0.875, [0.852, 0.710, 0.617]], [0.877, [0.856, 0.716, 0.627]], [0.879, [0.856, 0.716, 0.627]], [0.881, [0.861, 0.722, 0.636]], [0.883, [0.861, 0.722, 0.636]], [0.885, [0.865, 0.727, 0.646]], [0.886, [0.865, 0.727, 0.646]], [0.888, [0.869, 0.732, 0.656]], [0.890, [0.869, 0.732, 0.656]], [0.892, [0.874, 0.738, 0.665]], [0.894, [0.874, 0.738, 0.665]], [0.896, [0.878, 0.743, 0.677]], [0.898, [0.878, 0.743, 0.677]], [0.900, [0.883, 0.751, 0.689]], [0.902, [0.883, 0.751, 0.689]], [0.904, [0.887, 0.758, 0.701]], [0.906, [0.887, 0.758, 0.701]], [0.908, [0.891, 0.766, 0.712]], [0.910, [0.891, 0.766, 0.712]], [0.912, [0.896, 0.774, 0.724]], [0.914, [0.896, 0.774, 0.724]], [0.916, [0.900, 0.781, 0.736]], [0.918, [0.900, 0.781, 0.736]], [0.920, [0.904, 0.789, 0.748]], [0.922, [0.904, 0.789, 0.748]], [0.924, [0.909, 0.797, 0.760]], [0.926, [0.909, 0.797, 0.760]], [0.928, [0.913, 0.804, 0.772]], [0.930, [0.913, 0.804, 0.772]], [0.932, [0.918, 0.812, 0.783]], [0.933, [0.918, 0.812, 0.783]], [0.935, [0.922, 0.820, 0.795]], [0.937, [0.922, 0.820, 0.795]], [0.939, [0.926, 0.827, 0.807]], [0.941, [0.926, 0.827, 0.807]], [0.943, [0.931, 0.836, 0.819]], [0.945, [0.931, 0.836, 0.819]], [0.947, [0.935, 0.845, 0.831]], [0.949, [0.935, 0.845, 0.831]], [0.951, [0.940, 0.854, 0.842]], [0.953, [0.940, 0.854, 0.842]], [0.955, [0.944, 0.863, 0.854]], [0.957, [0.944, 0.863, 0.854]], [0.959, [0.948, 0.873, 0.866]], [0.961, [0.948, 0.873, 0.866]], [0.963, [0.953, 0.882, 0.878]], [0.965, [0.953, 0.882, 0.878]], [0.967, [0.957, 0.893, 0.890]], [0.969, [0.957, 0.893, 0.890]], [0.971, [0.961, 0.905, 0.902]], [0.973, [0.961, 0.905, 0.902]], [0.975, [0.966, 0.916, 0.913]], [0.977, [0.966, 0.916, 0.913]], [0.978, [0.970, 0.927, 0.925]], [0.980, [0.970, 0.927, 0.925]], [0.982, [0.975, 0.939, 0.937]], [0.984, [0.975, 0.939, 0.937]], [0.986, [0.979, 0.950, 0.949]], [0.988, [0.979, 0.950, 0.949]], [0.990, [0.983, 0.962, 0.961]], [0.992, [0.983, 0.962, 0.961]], [0.994, [0.988, 0.973, 0.972]], [0.996, [0.988, 0.973, 0.972]], [0.998, [0.992, 0.984, 0.984]], [1.000, [0.992, 0.984, 0.984]]]; +var gist_ncar = [[0.000, [0.000, 0.000, 0.502]], [0.002, [0.000, 0.000, 0.502]], [0.004, [0.000, 0.029, 0.465]], [0.006, [0.000, 0.029, 0.465]], [0.008, [0.000, 0.057, 0.428]], [0.010, [0.000, 0.057, 0.428]], [0.012, [0.000, 0.086, 0.391]], [0.014, [0.000, 0.086, 0.391]], [0.016, [0.000, 0.114, 0.354]], [0.018, [0.000, 0.114, 0.354]], [0.020, [0.000, 0.143, 0.318]], [0.022, [0.000, 0.143, 0.318]], [0.023, [0.000, 0.172, 0.281]], [0.025, [0.000, 0.172, 0.281]], [0.027, [0.000, 0.200, 0.244]], [0.029, [0.000, 0.200, 0.244]], [0.031, [0.000, 0.229, 0.207]], [0.033, [0.000, 0.229, 0.207]], [0.035, [0.000, 0.258, 0.170]], [0.037, [0.000, 0.258, 0.170]], [0.039, [0.000, 0.286, 0.133]], [0.041, [0.000, 0.286, 0.133]], [0.043, [0.000, 0.315, 0.096]], [0.045, [0.000, 0.315, 0.096]], [0.047, [0.000, 0.343, 0.059]], [0.049, [0.000, 0.343, 0.059]], [0.051, [0.000, 0.372, 0.022]], [0.053, [0.000, 0.372, 0.022]], [0.055, [0.000, 0.346, 0.087]], [0.057, [0.000, 0.346, 0.087]], [0.059, [0.000, 0.319, 0.152]], [0.061, [0.000, 0.319, 0.152]], [0.063, [0.000, 0.293, 0.218]], [0.065, [0.000, 0.293, 0.218]], [0.067, [0.000, 0.266, 0.283]], [0.068, [0.000, 0.266, 0.283]], [0.070, [0.000, 0.239, 0.348]], [0.072, [0.000, 0.239, 0.348]], [0.074, [0.000, 0.213, 0.413]], [0.076, [0.000, 0.213, 0.413]], [0.078, [0.000, 0.186, 0.478]], [0.080, [0.000, 0.186, 0.478]], [0.082, [0.000, 0.160, 0.544]], [0.084, [0.000, 0.160, 0.544]], [0.086, [0.000, 0.133, 0.609]], [0.088, [0.000, 0.133, 0.609]], [0.090, [0.000, 0.106, 0.674]], [0.092, [0.000, 0.106, 0.674]], [0.094, [0.000, 0.080, 0.739]], [0.096, [0.000, 0.080, 0.739]], [0.098, [0.000, 0.053, 0.804]], [0.100, [0.000, 0.053, 0.804]], [0.102, [0.000, 0.027, 0.870]], [0.104, [0.000, 0.027, 0.870]], [0.106, [0.000, 0.000, 0.935]], [0.108, [0.000, 0.000, 0.935]], [0.110, [0.000, 0.055, 1.000]], [0.112, [0.000, 0.055, 1.000]], [0.114, [0.000, 0.111, 1.000]], [0.115, [0.000, 0.111, 1.000]], [0.117, [0.000, 0.166, 1.000]], [0.119, [0.000, 0.166, 1.000]], [0.121, [0.000, 0.221, 1.000]], [0.123, [0.000, 0.221, 1.000]], [0.125, [0.000, 0.277, 1.000]], [0.127, [0.000, 0.277, 1.000]], [0.129, [0.000, 0.332, 1.000]], [0.131, [0.000, 0.332, 1.000]], [0.133, [0.000, 0.387, 1.000]], [0.135, [0.000, 0.387, 1.000]], [0.137, [0.000, 0.443, 1.000]], [0.139, [0.000, 0.443, 1.000]], [0.141, [0.000, 0.498, 1.000]], [0.143, [0.000, 0.498, 1.000]], [0.145, [0.000, 0.554, 1.000]], [0.147, [0.000, 0.554, 1.000]], [0.149, [0.000, 0.609, 1.000]], [0.151, [0.000, 0.609, 1.000]], [0.153, [0.000, 0.664, 1.000]], [0.155, [0.000, 0.664, 1.000]], [0.157, [0.000, 0.720, 1.000]], [0.159, [0.000, 0.720, 1.000]], [0.160, [0.000, 0.754, 1.000]], [0.162, [0.000, 0.754, 1.000]], [0.164, [0.000, 0.775, 1.000]], [0.166, [0.000, 0.775, 1.000]], [0.168, [0.000, 0.793, 1.000]], [0.170, [0.000, 0.793, 1.000]], [0.172, [0.000, 0.810, 1.000]], [0.174, [0.000, 0.810, 1.000]], [0.176, [0.000, 0.827, 1.000]], [0.178, [0.000, 0.827, 1.000]], [0.180, [0.000, 0.844, 1.000]], [0.182, [0.000, 0.844, 1.000]], [0.184, [0.000, 0.862, 1.000]], [0.186, [0.000, 0.862, 1.000]], [0.188, [0.000, 0.879, 1.000]], [0.190, [0.000, 0.879, 1.000]], [0.192, [0.000, 0.896, 1.000]], [0.194, [0.000, 0.896, 1.000]], [0.196, [0.000, 0.914, 1.000]], [0.198, [0.000, 0.914, 1.000]], [0.200, [0.000, 0.931, 1.000]], [0.202, [0.000, 0.931, 1.000]], [0.204, [0.000, 0.948, 1.000]], [0.205, [0.000, 0.948, 1.000]], [0.207, [0.000, 0.965, 0.974]], [0.209, [0.000, 0.965, 0.974]], [0.211, [0.000, 0.983, 0.948]], [0.213, [0.000, 0.983, 0.948]], [0.215, [0.000, 1.000, 0.923]], [0.217, [0.000, 1.000, 0.923]], [0.219, [0.000, 0.998, 0.897]], [0.221, [0.000, 0.998, 0.897]], [0.223, [0.000, 0.996, 0.871]], [0.225, [0.000, 0.996, 0.871]], [0.227, [0.000, 0.995, 0.846]], [0.229, [0.000, 0.995, 0.846]], [0.231, [0.000, 0.993, 0.820]], [0.233, [0.000, 0.993, 0.820]], [0.235, [0.000, 0.991, 0.794]], [0.237, [0.000, 0.991, 0.794]], [0.239, [0.000, 0.989, 0.768]], [0.241, [0.000, 0.989, 0.768]], [0.243, [0.000, 0.988, 0.743]], [0.245, [0.000, 0.988, 0.743]], [0.247, [0.000, 0.986, 0.717]], [0.249, [0.000, 0.986, 0.717]], [0.250, [0.000, 0.984, 0.691]], [0.252, [0.000, 0.984, 0.691]], [0.254, [0.000, 0.982, 0.666]], [0.256, [0.000, 0.982, 0.666]], [0.258, [0.000, 0.980, 0.640]], [0.260, [0.000, 0.980, 0.640]], [0.262, [0.000, 0.980, 0.614]], [0.264, [0.000, 0.980, 0.614]], [0.266, [0.000, 0.980, 0.573]], [0.268, [0.000, 0.980, 0.573]], [0.270, [0.000, 0.980, 0.532]], [0.272, [0.000, 0.980, 0.532]], [0.274, [0.000, 0.982, 0.491]], [0.276, [0.000, 0.982, 0.491]], [0.278, [0.000, 0.984, 0.450]], [0.280, [0.000, 0.984, 0.450]], [0.282, [0.000, 0.985, 0.409]], [0.284, [0.000, 0.985, 0.409]], [0.286, [0.000, 0.987, 0.369]], [0.288, [0.000, 0.987, 0.369]], [0.290, [0.000, 0.989, 0.328]], [0.292, [0.000, 0.989, 0.328]], [0.294, [0.000, 0.990, 0.287]], [0.295, [0.000, 0.990, 0.287]], [0.297, [0.000, 0.992, 0.246]], [0.299, [0.000, 0.992, 0.246]], [0.301, [0.000, 0.993, 0.205]], [0.303, [0.000, 0.993, 0.205]], [0.305, [0.000, 0.995, 0.164]], [0.307, [0.000, 0.995, 0.164]], [0.309, [0.000, 0.997, 0.123]], [0.311, [0.000, 0.997, 0.123]], [0.313, [0.025, 0.998, 0.082]], [0.315, [0.025, 0.998, 0.082]], [0.317, [0.050, 1.000, 0.041]], [0.319, [0.050, 1.000, 0.041]], [0.321, [0.075, 0.985, 0.000]], [0.323, [0.075, 0.985, 0.000]], [0.325, [0.100, 0.970, 0.000]], [0.327, [0.100, 0.970, 0.000]], [0.329, [0.125, 0.956, 0.000]], [0.331, [0.125, 0.956, 0.000]], [0.333, [0.150, 0.941, 0.000]], [0.335, [0.150, 0.941, 0.000]], [0.337, [0.175, 0.926, 0.000]], [0.339, [0.175, 0.926, 0.000]], [0.341, [0.200, 0.911, 0.000]], [0.342, [0.200, 0.911, 0.000]], [0.344, [0.225, 0.897, 0.000]], [0.346, [0.225, 0.897, 0.000]], [0.348, [0.250, 0.882, 0.000]], [0.350, [0.250, 0.882, 0.000]], [0.352, [0.275, 0.867, 0.000]], [0.354, [0.275, 0.867, 0.000]], [0.356, [0.300, 0.852, 0.000]], [0.358, [0.300, 0.852, 0.000]], [0.360, [0.325, 0.838, 0.000]], [0.362, [0.325, 0.838, 0.000]], [0.364, [0.350, 0.823, 0.000]], [0.366, [0.350, 0.823, 0.000]], [0.368, [0.375, 0.808, 0.000]], [0.370, [0.375, 0.808, 0.000]], [0.372, [0.399, 0.821, 0.000]], [0.374, [0.399, 0.821, 0.000]], [0.376, [0.407, 0.834, 0.000]], [0.378, [0.407, 0.834, 0.000]], [0.380, [0.415, 0.847, 0.000]], [0.382, [0.415, 0.847, 0.000]], [0.384, [0.423, 0.859, 0.000]], [0.386, [0.423, 0.859, 0.000]], [0.387, [0.430, 0.872, 0.000]], [0.389, [0.430, 0.872, 0.000]], [0.391, [0.438, 0.885, 0.000]], [0.393, [0.438, 0.885, 0.000]], [0.395, [0.446, 0.898, 0.000]], [0.397, [0.446, 0.898, 0.000]], [0.399, [0.454, 0.910, 0.000]], [0.401, [0.454, 0.910, 0.000]], [0.403, [0.462, 0.923, 0.000]], [0.405, [0.462, 0.923, 0.000]], [0.407, [0.469, 0.936, 0.000]], [0.409, [0.469, 0.936, 0.000]], [0.411, [0.477, 0.949, 0.000]], [0.413, [0.477, 0.949, 0.000]], [0.415, [0.485, 0.962, 0.000]], [0.417, [0.485, 0.962, 0.000]], [0.419, [0.493, 0.974, 0.016]], [0.421, [0.493, 0.974, 0.016]], [0.423, [0.500, 0.987, 0.031]], [0.425, [0.500, 0.987, 0.031]], [0.427, [0.518, 1.000, 0.047]], [0.429, [0.518, 1.000, 0.047]], [0.431, [0.536, 1.000, 0.062]], [0.432, [0.536, 1.000, 0.062]], [0.434, [0.554, 1.000, 0.078]], [0.436, [0.554, 1.000, 0.078]], [0.438, [0.572, 1.000, 0.094]], [0.440, [0.572, 1.000, 0.094]], [0.442, [0.590, 1.000, 0.109]], [0.444, [0.590, 1.000, 0.109]], [0.446, [0.608, 1.000, 0.125]], [0.448, [0.608, 1.000, 0.125]], [0.450, [0.625, 1.000, 0.141]], [0.452, [0.625, 1.000, 0.141]], [0.454, [0.643, 1.000, 0.156]], [0.456, [0.643, 1.000, 0.156]], [0.458, [0.661, 1.000, 0.172]], [0.460, [0.661, 1.000, 0.172]], [0.462, [0.679, 1.000, 0.187]], [0.464, [0.679, 1.000, 0.187]], [0.466, [0.697, 1.000, 0.203]], [0.468, [0.697, 1.000, 0.203]], [0.470, [0.715, 1.000, 0.219]], [0.472, [0.715, 1.000, 0.219]], [0.474, [0.732, 1.000, 0.234]], [0.476, [0.732, 1.000, 0.234]], [0.477, [0.750, 1.000, 0.219]], [0.479, [0.750, 1.000, 0.219]], [0.481, [0.768, 1.000, 0.203]], [0.483, [0.768, 1.000, 0.203]], [0.485, [0.786, 1.000, 0.187]], [0.487, [0.786, 1.000, 0.187]], [0.489, [0.804, 1.000, 0.172]], [0.491, [0.804, 1.000, 0.172]], [0.493, [0.822, 1.000, 0.156]], [0.495, [0.822, 1.000, 0.156]], [0.497, [0.840, 1.000, 0.140]], [0.499, [0.840, 1.000, 0.140]], [0.501, [0.857, 1.000, 0.125]], [0.503, [0.857, 1.000, 0.125]], [0.505, [0.875, 1.000, 0.109]], [0.507, [0.875, 1.000, 0.109]], [0.509, [0.893, 1.000, 0.094]], [0.511, [0.893, 1.000, 0.094]], [0.513, [0.911, 1.000, 0.078]], [0.515, [0.911, 1.000, 0.078]], [0.517, [0.929, 1.000, 0.062]], [0.519, [0.929, 1.000, 0.062]], [0.521, [0.947, 1.000, 0.047]], [0.523, [0.947, 1.000, 0.047]], [0.524, [0.964, 0.990, 0.031]], [0.526, [0.964, 0.990, 0.031]], [0.528, [0.982, 0.981, 0.015]], [0.530, [0.982, 0.981, 0.015]], [0.532, [1.000, 0.971, 0.000]], [0.534, [1.000, 0.971, 0.000]], [0.536, [1.000, 0.961, 0.000]], [0.538, [1.000, 0.961, 0.000]], [0.540, [1.000, 0.952, 0.000]], [0.542, [1.000, 0.952, 0.000]], [0.544, [1.000, 0.942, 0.000]], [0.546, [1.000, 0.942, 0.000]], [0.548, [1.000, 0.932, 0.000]], [0.550, [1.000, 0.932, 0.000]], [0.552, [1.000, 0.923, 0.000]], [0.554, [1.000, 0.923, 0.000]], [0.556, [1.000, 0.913, 0.000]], [0.558, [1.000, 0.913, 0.000]], [0.560, [1.000, 0.903, 0.000]], [0.562, [1.000, 0.903, 0.000]], [0.564, [1.000, 0.894, 0.000]], [0.566, [1.000, 0.894, 0.000]], [0.568, [1.000, 0.884, 0.000]], [0.569, [1.000, 0.884, 0.000]], [0.571, [1.000, 0.874, 0.000]], [0.573, [1.000, 0.874, 0.000]], [0.575, [1.000, 0.865, 0.000]], [0.577, [1.000, 0.865, 0.000]], [0.579, [1.000, 0.855, 0.000]], [0.581, [1.000, 0.855, 0.000]], [0.583, [1.000, 0.845, 0.004]], [0.585, [1.000, 0.845, 0.004]], [0.587, [1.000, 0.836, 0.008]], [0.589, [1.000, 0.836, 0.008]], [0.591, [1.000, 0.826, 0.013]], [0.593, [1.000, 0.826, 0.013]], [0.595, [1.000, 0.816, 0.017]], [0.597, [1.000, 0.816, 0.017]], [0.599, [1.000, 0.807, 0.021]], [0.601, [1.000, 0.807, 0.021]], [0.603, [1.000, 0.797, 0.025]], [0.605, [1.000, 0.797, 0.025]], [0.607, [1.000, 0.787, 0.030]], [0.609, [1.000, 0.787, 0.030]], [0.611, [1.000, 0.778, 0.034]], [0.613, [1.000, 0.778, 0.034]], [0.614, [1.000, 0.768, 0.038]], [0.616, [1.000, 0.768, 0.038]], [0.618, [1.000, 0.758, 0.042]], [0.620, [1.000, 0.758, 0.042]], [0.622, [1.000, 0.749, 0.046]], [0.624, [1.000, 0.749, 0.046]], [0.626, [1.000, 0.739, 0.051]], [0.628, [1.000, 0.739, 0.051]], [0.630, [1.000, 0.729, 0.055]], [0.632, [1.000, 0.729, 0.055]], [0.634, [1.000, 0.697, 0.051]], [0.636, [1.000, 0.697, 0.051]], [0.638, [1.000, 0.665, 0.048]], [0.640, [1.000, 0.665, 0.048]], [0.642, [1.000, 0.633, 0.044]], [0.644, [1.000, 0.633, 0.044]], [0.646, [1.000, 0.601, 0.040]], [0.648, [1.000, 0.601, 0.040]], [0.650, [1.000, 0.569, 0.037]], [0.652, [1.000, 0.569, 0.037]], [0.654, [1.000, 0.537, 0.033]], [0.656, [1.000, 0.537, 0.033]], [0.658, [1.000, 0.505, 0.029]], [0.659, [1.000, 0.505, 0.029]], [0.661, [1.000, 0.473, 0.026]], [0.663, [1.000, 0.473, 0.026]], [0.665, [1.000, 0.440, 0.022]], [0.667, [1.000, 0.440, 0.022]], [0.669, [1.000, 0.408, 0.018]], [0.671, [1.000, 0.408, 0.018]], [0.673, [1.000, 0.376, 0.015]], [0.675, [1.000, 0.376, 0.015]], [0.677, [1.000, 0.344, 0.011]], [0.679, [1.000, 0.344, 0.011]], [0.681, [1.000, 0.312, 0.007]], [0.683, [1.000, 0.312, 0.007]], [0.685, [1.000, 0.280, 0.004]], [0.687, [1.000, 0.280, 0.004]], [0.689, [1.000, 0.261, 0.000]], [0.691, [1.000, 0.261, 0.000]], [0.693, [1.000, 0.242, 0.000]], [0.695, [1.000, 0.242, 0.000]], [0.697, [1.000, 0.224, 0.000]], [0.699, [1.000, 0.224, 0.000]], [0.701, [1.000, 0.205, 0.000]], [0.703, [1.000, 0.205, 0.000]], [0.705, [1.000, 0.186, 0.000]], [0.706, [1.000, 0.186, 0.000]], [0.708, [1.000, 0.168, 0.000]], [0.710, [1.000, 0.168, 0.000]], [0.712, [1.000, 0.149, 0.000]], [0.714, [1.000, 0.149, 0.000]], [0.716, [1.000, 0.131, 0.000]], [0.718, [1.000, 0.131, 0.000]], [0.720, [1.000, 0.112, 0.000]], [0.722, [1.000, 0.112, 0.000]], [0.724, [1.000, 0.093, 0.000]], [0.726, [1.000, 0.093, 0.000]], [0.728, [1.000, 0.075, 0.000]], [0.730, [1.000, 0.075, 0.000]], [0.732, [1.000, 0.056, 0.000]], [0.734, [1.000, 0.056, 0.000]], [0.736, [1.000, 0.037, 0.000]], [0.738, [1.000, 0.037, 0.000]], [0.740, [1.000, 0.019, 0.069]], [0.742, [1.000, 0.019, 0.069]], [0.744, [1.000, 0.000, 0.138]], [0.746, [1.000, 0.000, 0.138]], [0.748, [1.000, 0.000, 0.208]], [0.750, [1.000, 0.000, 0.208]], [0.751, [1.000, 0.000, 0.277]], [0.753, [1.000, 0.000, 0.277]], [0.755, [1.000, 0.000, 0.347]], [0.757, [1.000, 0.000, 0.347]], [0.759, [1.000, 0.000, 0.417]], [0.761, [1.000, 0.000, 0.417]], [0.763, [1.000, 0.000, 0.486]], [0.765, [1.000, 0.000, 0.486]], [0.767, [1.000, 0.000, 0.556]], [0.769, [1.000, 0.000, 0.556]], [0.771, [1.000, 0.000, 0.625]], [0.773, [1.000, 0.000, 0.625]], [0.775, [1.000, 0.000, 0.695]], [0.777, [1.000, 0.000, 0.695]], [0.779, [1.000, 0.000, 0.764]], [0.781, [1.000, 0.000, 0.764]], [0.783, [1.000, 0.000, 0.834]], [0.785, [1.000, 0.000, 0.834]], [0.787, [1.000, 0.000, 0.903]], [0.789, [1.000, 0.000, 0.903]], [0.791, [1.000, 0.000, 0.973]], [0.793, [1.000, 0.000, 0.973]], [0.795, [0.973, 0.013, 0.987]], [0.796, [0.973, 0.013, 0.987]], [0.798, [0.946, 0.027, 1.000]], [0.800, [0.946, 0.027, 1.000]], [0.802, [0.919, 0.040, 1.000]], [0.804, [0.919, 0.040, 1.000]], [0.806, [0.892, 0.054, 1.000]], [0.808, [0.892, 0.054, 1.000]], [0.810, [0.865, 0.067, 1.000]], [0.812, [0.865, 0.067, 1.000]], [0.814, [0.838, 0.081, 1.000]], [0.816, [0.838, 0.081, 1.000]], [0.818, [0.811, 0.094, 1.000]], [0.820, [0.811, 0.094, 1.000]], [0.822, [0.784, 0.108, 1.000]], [0.824, [0.784, 0.108, 1.000]], [0.826, [0.757, 0.121, 1.000]], [0.828, [0.757, 0.121, 1.000]], [0.830, [0.730, 0.135, 1.000]], [0.832, [0.730, 0.135, 1.000]], [0.834, [0.703, 0.148, 1.000]], [0.836, [0.703, 0.148, 1.000]], [0.838, [0.676, 0.162, 1.000]], [0.840, [0.676, 0.162, 1.000]], [0.841, [0.649, 0.176, 1.000]], [0.843, [0.649, 0.176, 1.000]], [0.845, [0.622, 0.199, 0.995]], [0.847, [0.622, 0.199, 0.995]], [0.849, [0.645, 0.222, 0.991]], [0.851, [0.645, 0.222, 0.991]], [0.853, [0.668, 0.245, 0.986]], [0.855, [0.668, 0.245, 0.986]], [0.857, [0.691, 0.268, 0.981]], [0.859, [0.691, 0.268, 0.981]], [0.861, [0.715, 0.291, 0.976]], [0.863, [0.715, 0.291, 0.976]], [0.865, [0.738, 0.315, 0.972]], [0.867, [0.738, 0.315, 0.972]], [0.869, [0.761, 0.338, 0.967]], [0.871, [0.761, 0.338, 0.967]], [0.873, [0.784, 0.361, 0.962]], [0.875, [0.784, 0.361, 0.962]], [0.877, [0.808, 0.384, 0.958]], [0.879, [0.808, 0.384, 0.958]], [0.881, [0.831, 0.407, 0.953]], [0.883, [0.831, 0.407, 0.953]], [0.885, [0.854, 0.431, 0.948]], [0.886, [0.854, 0.431, 0.948]], [0.888, [0.877, 0.454, 0.943]], [0.890, [0.877, 0.454, 0.943]], [0.892, [0.900, 0.477, 0.939]], [0.894, [0.900, 0.477, 0.939]], [0.896, [0.924, 0.500, 0.934]], [0.898, [0.924, 0.500, 0.934]], [0.900, [0.926, 0.518, 0.937]], [0.902, [0.926, 0.518, 0.937]], [0.904, [0.929, 0.537, 0.939]], [0.906, [0.929, 0.537, 0.939]], [0.908, [0.932, 0.555, 0.941]], [0.910, [0.932, 0.555, 0.941]], [0.912, [0.935, 0.573, 0.944]], [0.914, [0.935, 0.573, 0.944]], [0.916, [0.937, 0.591, 0.946]], [0.918, [0.937, 0.591, 0.946]], [0.920, [0.940, 0.609, 0.948]], [0.922, [0.940, 0.609, 0.948]], [0.924, [0.943, 0.627, 0.951]], [0.926, [0.943, 0.627, 0.951]], [0.928, [0.946, 0.646, 0.953]], [0.930, [0.946, 0.646, 0.953]], [0.932, [0.949, 0.664, 0.956]], [0.933, [0.949, 0.664, 0.956]], [0.935, [0.951, 0.682, 0.958]], [0.937, [0.951, 0.682, 0.958]], [0.939, [0.954, 0.700, 0.960]], [0.941, [0.954, 0.700, 0.960]], [0.943, [0.957, 0.718, 0.963]], [0.945, [0.957, 0.718, 0.963]], [0.947, [0.960, 0.736, 0.965]], [0.949, [0.960, 0.736, 0.965]], [0.951, [0.963, 0.755, 0.967]], [0.953, [0.963, 0.755, 0.967]], [0.955, [0.965, 0.773, 0.970]], [0.957, [0.965, 0.773, 0.970]], [0.959, [0.968, 0.791, 0.972]], [0.961, [0.968, 0.791, 0.972]], [0.963, [0.971, 0.809, 0.975]], [0.965, [0.971, 0.809, 0.975]], [0.967, [0.974, 0.827, 0.977]], [0.969, [0.974, 0.827, 0.977]], [0.971, [0.977, 0.845, 0.979]], [0.973, [0.977, 0.845, 0.979]], [0.975, [0.979, 0.864, 0.982]], [0.977, [0.979, 0.864, 0.982]], [0.978, [0.982, 0.882, 0.984]], [0.980, [0.982, 0.882, 0.984]], [0.982, [0.985, 0.900, 0.987]], [0.984, [0.985, 0.900, 0.987]], [0.986, [0.988, 0.918, 0.989]], [0.988, [0.988, 0.918, 0.989]], [0.990, [0.991, 0.936, 0.991]], [0.992, [0.991, 0.936, 0.991]], [0.994, [0.993, 0.954, 0.994]], [0.996, [0.993, 0.954, 0.994]], [0.998, [0.996, 0.973, 0.996]], [1.000, [0.996, 0.973, 0.996]]]; +var gist_rainbow = [[0.000, [1.000, 0.000, 0.160]], [0.002, [1.000, 0.000, 0.160]], [0.004, [1.000, 0.000, 0.139]], [0.006, [1.000, 0.000, 0.139]], [0.008, [1.000, 0.000, 0.118]], [0.010, [1.000, 0.000, 0.118]], [0.012, [1.000, 0.000, 0.097]], [0.014, [1.000, 0.000, 0.097]], [0.016, [1.000, 0.000, 0.076]], [0.018, [1.000, 0.000, 0.076]], [0.020, [1.000, 0.000, 0.055]], [0.022, [1.000, 0.000, 0.055]], [0.023, [1.000, 0.000, 0.035]], [0.025, [1.000, 0.000, 0.035]], [0.027, [1.000, 0.000, 0.014]], [0.029, [1.000, 0.000, 0.014]], [0.031, [1.000, 0.007, 0.000]], [0.033, [1.000, 0.007, 0.000]], [0.035, [1.000, 0.029, 0.000]], [0.037, [1.000, 0.029, 0.000]], [0.039, [1.000, 0.050, 0.000]], [0.041, [1.000, 0.050, 0.000]], [0.043, [1.000, 0.071, 0.000]], [0.045, [1.000, 0.071, 0.000]], [0.047, [1.000, 0.092, 0.000]], [0.049, [1.000, 0.092, 0.000]], [0.051, [1.000, 0.113, 0.000]], [0.053, [1.000, 0.113, 0.000]], [0.055, [1.000, 0.135, 0.000]], [0.057, [1.000, 0.135, 0.000]], [0.059, [1.000, 0.156, 0.000]], [0.061, [1.000, 0.156, 0.000]], [0.063, [1.000, 0.177, 0.000]], [0.065, [1.000, 0.177, 0.000]], [0.067, [1.000, 0.198, 0.000]], [0.068, [1.000, 0.198, 0.000]], [0.070, [1.000, 0.219, 0.000]], [0.072, [1.000, 0.219, 0.000]], [0.074, [1.000, 0.241, 0.000]], [0.076, [1.000, 0.241, 0.000]], [0.078, [1.000, 0.262, 0.000]], [0.080, [1.000, 0.262, 0.000]], [0.082, [1.000, 0.283, 0.000]], [0.084, [1.000, 0.283, 0.000]], [0.086, [1.000, 0.304, 0.000]], [0.088, [1.000, 0.304, 0.000]], [0.090, [1.000, 0.325, 0.000]], [0.092, [1.000, 0.325, 0.000]], [0.094, [1.000, 0.347, 0.000]], [0.096, [1.000, 0.347, 0.000]], [0.098, [1.000, 0.368, 0.000]], [0.100, [1.000, 0.368, 0.000]], [0.102, [1.000, 0.389, 0.000]], [0.104, [1.000, 0.389, 0.000]], [0.106, [1.000, 0.410, 0.000]], [0.108, [1.000, 0.410, 0.000]], [0.110, [1.000, 0.431, 0.000]], [0.112, [1.000, 0.431, 0.000]], [0.114, [1.000, 0.453, 0.000]], [0.115, [1.000, 0.453, 0.000]], [0.117, [1.000, 0.474, 0.000]], [0.119, [1.000, 0.474, 0.000]], [0.121, [1.000, 0.495, 0.000]], [0.123, [1.000, 0.495, 0.000]], [0.125, [1.000, 0.516, 0.000]], [0.127, [1.000, 0.516, 0.000]], [0.129, [1.000, 0.537, 0.000]], [0.131, [1.000, 0.537, 0.000]], [0.133, [1.000, 0.559, 0.000]], [0.135, [1.000, 0.559, 0.000]], [0.137, [1.000, 0.580, 0.000]], [0.139, [1.000, 0.580, 0.000]], [0.141, [1.000, 0.601, 0.000]], [0.143, [1.000, 0.601, 0.000]], [0.145, [1.000, 0.622, 0.000]], [0.147, [1.000, 0.622, 0.000]], [0.149, [1.000, 0.643, 0.000]], [0.151, [1.000, 0.643, 0.000]], [0.153, [1.000, 0.665, 0.000]], [0.155, [1.000, 0.665, 0.000]], [0.157, [1.000, 0.686, 0.000]], [0.159, [1.000, 0.686, 0.000]], [0.160, [1.000, 0.707, 0.000]], [0.162, [1.000, 0.707, 0.000]], [0.164, [1.000, 0.728, 0.000]], [0.166, [1.000, 0.728, 0.000]], [0.168, [1.000, 0.749, 0.000]], [0.170, [1.000, 0.749, 0.000]], [0.172, [1.000, 0.771, 0.000]], [0.174, [1.000, 0.771, 0.000]], [0.176, [1.000, 0.792, 0.000]], [0.178, [1.000, 0.792, 0.000]], [0.180, [1.000, 0.813, 0.000]], [0.182, [1.000, 0.813, 0.000]], [0.184, [1.000, 0.834, 0.000]], [0.186, [1.000, 0.834, 0.000]], [0.188, [1.000, 0.855, 0.000]], [0.190, [1.000, 0.855, 0.000]], [0.192, [1.000, 0.877, 0.000]], [0.194, [1.000, 0.877, 0.000]], [0.196, [1.000, 0.898, 0.000]], [0.198, [1.000, 0.898, 0.000]], [0.200, [1.000, 0.919, 0.000]], [0.202, [1.000, 0.919, 0.000]], [0.204, [1.000, 0.940, 0.000]], [0.205, [1.000, 0.940, 0.000]], [0.207, [1.000, 0.961, 0.000]], [0.209, [1.000, 0.961, 0.000]], [0.211, [1.000, 0.983, 0.000]], [0.213, [1.000, 0.983, 0.000]], [0.215, [0.996, 1.000, 0.000]], [0.217, [0.996, 1.000, 0.000]], [0.219, [0.975, 1.000, 0.000]], [0.221, [0.975, 1.000, 0.000]], [0.223, [0.954, 1.000, 0.000]], [0.225, [0.954, 1.000, 0.000]], [0.227, [0.933, 1.000, 0.000]], [0.229, [0.933, 1.000, 0.000]], [0.231, [0.911, 1.000, 0.000]], [0.233, [0.911, 1.000, 0.000]], [0.235, [0.890, 1.000, 0.000]], [0.237, [0.890, 1.000, 0.000]], [0.239, [0.869, 1.000, 0.000]], [0.241, [0.869, 1.000, 0.000]], [0.243, [0.848, 1.000, 0.000]], [0.245, [0.848, 1.000, 0.000]], [0.247, [0.827, 1.000, 0.000]], [0.249, [0.827, 1.000, 0.000]], [0.250, [0.806, 1.000, 0.000]], [0.252, [0.806, 1.000, 0.000]], [0.254, [0.784, 1.000, 0.000]], [0.256, [0.784, 1.000, 0.000]], [0.258, [0.763, 1.000, 0.000]], [0.260, [0.763, 1.000, 0.000]], [0.262, [0.742, 1.000, 0.000]], [0.264, [0.742, 1.000, 0.000]], [0.266, [0.721, 1.000, 0.000]], [0.268, [0.721, 1.000, 0.000]], [0.270, [0.700, 1.000, 0.000]], [0.272, [0.700, 1.000, 0.000]], [0.274, [0.678, 1.000, 0.000]], [0.276, [0.678, 1.000, 0.000]], [0.278, [0.657, 1.000, 0.000]], [0.280, [0.657, 1.000, 0.000]], [0.282, [0.636, 1.000, 0.000]], [0.284, [0.636, 1.000, 0.000]], [0.286, [0.615, 1.000, 0.000]], [0.288, [0.615, 1.000, 0.000]], [0.290, [0.594, 1.000, 0.000]], [0.292, [0.594, 1.000, 0.000]], [0.294, [0.572, 1.000, 0.000]], [0.295, [0.572, 1.000, 0.000]], [0.297, [0.551, 1.000, 0.000]], [0.299, [0.551, 1.000, 0.000]], [0.301, [0.530, 1.000, 0.000]], [0.303, [0.530, 1.000, 0.000]], [0.305, [0.509, 1.000, 0.000]], [0.307, [0.509, 1.000, 0.000]], [0.309, [0.488, 1.000, 0.000]], [0.311, [0.488, 1.000, 0.000]], [0.313, [0.466, 1.000, 0.000]], [0.315, [0.466, 1.000, 0.000]], [0.317, [0.445, 1.000, 0.000]], [0.319, [0.445, 1.000, 0.000]], [0.321, [0.424, 1.000, 0.000]], [0.323, [0.424, 1.000, 0.000]], [0.325, [0.403, 1.000, 0.000]], [0.327, [0.403, 1.000, 0.000]], [0.329, [0.382, 1.000, 0.000]], [0.331, [0.382, 1.000, 0.000]], [0.333, [0.360, 1.000, 0.000]], [0.335, [0.360, 1.000, 0.000]], [0.337, [0.339, 1.000, 0.000]], [0.339, [0.339, 1.000, 0.000]], [0.341, [0.318, 1.000, 0.000]], [0.342, [0.318, 1.000, 0.000]], [0.344, [0.297, 1.000, 0.000]], [0.346, [0.297, 1.000, 0.000]], [0.348, [0.276, 1.000, 0.000]], [0.350, [0.276, 1.000, 0.000]], [0.352, [0.254, 1.000, 0.000]], [0.354, [0.254, 1.000, 0.000]], [0.356, [0.233, 1.000, 0.000]], [0.358, [0.233, 1.000, 0.000]], [0.360, [0.212, 1.000, 0.000]], [0.362, [0.212, 1.000, 0.000]], [0.364, [0.191, 1.000, 0.000]], [0.366, [0.191, 1.000, 0.000]], [0.368, [0.170, 1.000, 0.000]], [0.370, [0.170, 1.000, 0.000]], [0.372, [0.148, 1.000, 0.000]], [0.374, [0.148, 1.000, 0.000]], [0.376, [0.127, 1.000, 0.000]], [0.378, [0.127, 1.000, 0.000]], [0.380, [0.106, 1.000, 0.000]], [0.382, [0.106, 1.000, 0.000]], [0.384, [0.085, 1.000, 0.000]], [0.386, [0.085, 1.000, 0.000]], [0.387, [0.064, 1.000, 0.000]], [0.389, [0.064, 1.000, 0.000]], [0.391, [0.042, 1.000, 0.000]], [0.393, [0.042, 1.000, 0.000]], [0.395, [0.021, 1.000, 0.000]], [0.397, [0.021, 1.000, 0.000]], [0.399, [0.000, 1.000, 0.000]], [0.401, [0.000, 1.000, 0.000]], [0.403, [0.000, 1.000, 0.021]], [0.405, [0.000, 1.000, 0.021]], [0.407, [0.000, 1.000, 0.042]], [0.409, [0.000, 1.000, 0.042]], [0.411, [0.000, 1.000, 0.063]], [0.413, [0.000, 1.000, 0.063]], [0.415, [0.000, 1.000, 0.084]], [0.417, [0.000, 1.000, 0.084]], [0.419, [0.000, 1.000, 0.105]], [0.421, [0.000, 1.000, 0.105]], [0.423, [0.000, 1.000, 0.127]], [0.425, [0.000, 1.000, 0.127]], [0.427, [0.000, 1.000, 0.148]], [0.429, [0.000, 1.000, 0.148]], [0.431, [0.000, 1.000, 0.169]], [0.432, [0.000, 1.000, 0.169]], [0.434, [0.000, 1.000, 0.190]], [0.436, [0.000, 1.000, 0.190]], [0.438, [0.000, 1.000, 0.211]], [0.440, [0.000, 1.000, 0.211]], [0.442, [0.000, 1.000, 0.232]], [0.444, [0.000, 1.000, 0.232]], [0.446, [0.000, 1.000, 0.253]], [0.448, [0.000, 1.000, 0.253]], [0.450, [0.000, 1.000, 0.274]], [0.452, [0.000, 1.000, 0.274]], [0.454, [0.000, 1.000, 0.295]], [0.456, [0.000, 1.000, 0.295]], [0.458, [0.000, 1.000, 0.316]], [0.460, [0.000, 1.000, 0.316]], [0.462, [0.000, 1.000, 0.337]], [0.464, [0.000, 1.000, 0.337]], [0.466, [0.000, 1.000, 0.358]], [0.468, [0.000, 1.000, 0.358]], [0.470, [0.000, 1.000, 0.380]], [0.472, [0.000, 1.000, 0.380]], [0.474, [0.000, 1.000, 0.401]], [0.476, [0.000, 1.000, 0.401]], [0.477, [0.000, 1.000, 0.422]], [0.479, [0.000, 1.000, 0.422]], [0.481, [0.000, 1.000, 0.443]], [0.483, [0.000, 1.000, 0.443]], [0.485, [0.000, 1.000, 0.464]], [0.487, [0.000, 1.000, 0.464]], [0.489, [0.000, 1.000, 0.485]], [0.491, [0.000, 1.000, 0.485]], [0.493, [0.000, 1.000, 0.506]], [0.495, [0.000, 1.000, 0.506]], [0.497, [0.000, 1.000, 0.527]], [0.499, [0.000, 1.000, 0.527]], [0.501, [0.000, 1.000, 0.548]], [0.503, [0.000, 1.000, 0.548]], [0.505, [0.000, 1.000, 0.569]], [0.507, [0.000, 1.000, 0.569]], [0.509, [0.000, 1.000, 0.590]], [0.511, [0.000, 1.000, 0.590]], [0.513, [0.000, 1.000, 0.611]], [0.515, [0.000, 1.000, 0.611]], [0.517, [0.000, 1.000, 0.633]], [0.519, [0.000, 1.000, 0.633]], [0.521, [0.000, 1.000, 0.654]], [0.523, [0.000, 1.000, 0.654]], [0.524, [0.000, 1.000, 0.675]], [0.526, [0.000, 1.000, 0.675]], [0.528, [0.000, 1.000, 0.696]], [0.530, [0.000, 1.000, 0.696]], [0.532, [0.000, 1.000, 0.717]], [0.534, [0.000, 1.000, 0.717]], [0.536, [0.000, 1.000, 0.738]], [0.538, [0.000, 1.000, 0.738]], [0.540, [0.000, 1.000, 0.759]], [0.542, [0.000, 1.000, 0.759]], [0.544, [0.000, 1.000, 0.780]], [0.546, [0.000, 1.000, 0.780]], [0.548, [0.000, 1.000, 0.801]], [0.550, [0.000, 1.000, 0.801]], [0.552, [0.000, 1.000, 0.822]], [0.554, [0.000, 1.000, 0.822]], [0.556, [0.000, 1.000, 0.843]], [0.558, [0.000, 1.000, 0.843]], [0.560, [0.000, 1.000, 0.864]], [0.562, [0.000, 1.000, 0.864]], [0.564, [0.000, 1.000, 0.886]], [0.566, [0.000, 1.000, 0.886]], [0.568, [0.000, 1.000, 0.907]], [0.569, [0.000, 1.000, 0.907]], [0.571, [0.000, 1.000, 0.928]], [0.573, [0.000, 1.000, 0.928]], [0.575, [0.000, 1.000, 0.949]], [0.577, [0.000, 1.000, 0.949]], [0.579, [0.000, 1.000, 0.970]], [0.581, [0.000, 1.000, 0.970]], [0.583, [0.000, 1.000, 0.991]], [0.585, [0.000, 1.000, 0.991]], [0.587, [0.000, 0.988, 1.000]], [0.589, [0.000, 0.988, 1.000]], [0.591, [0.000, 0.967, 1.000]], [0.593, [0.000, 0.967, 1.000]], [0.595, [0.000, 0.945, 1.000]], [0.597, [0.000, 0.945, 1.000]], [0.599, [0.000, 0.924, 1.000]], [0.601, [0.000, 0.924, 1.000]], [0.603, [0.000, 0.903, 1.000]], [0.605, [0.000, 0.903, 1.000]], [0.607, [0.000, 0.881, 1.000]], [0.609, [0.000, 0.881, 1.000]], [0.611, [0.000, 0.860, 1.000]], [0.613, [0.000, 0.860, 1.000]], [0.614, [0.000, 0.839, 1.000]], [0.616, [0.000, 0.839, 1.000]], [0.618, [0.000, 0.817, 1.000]], [0.620, [0.000, 0.817, 1.000]], [0.622, [0.000, 0.796, 1.000]], [0.624, [0.000, 0.796, 1.000]], [0.626, [0.000, 0.775, 1.000]], [0.628, [0.000, 0.775, 1.000]], [0.630, [0.000, 0.753, 1.000]], [0.632, [0.000, 0.753, 1.000]], [0.634, [0.000, 0.732, 1.000]], [0.636, [0.000, 0.732, 1.000]], [0.638, [0.000, 0.711, 1.000]], [0.640, [0.000, 0.711, 1.000]], [0.642, [0.000, 0.689, 1.000]], [0.644, [0.000, 0.689, 1.000]], [0.646, [0.000, 0.668, 1.000]], [0.648, [0.000, 0.668, 1.000]], [0.650, [0.000, 0.647, 1.000]], [0.652, [0.000, 0.647, 1.000]], [0.654, [0.000, 0.626, 1.000]], [0.656, [0.000, 0.626, 1.000]], [0.658, [0.000, 0.604, 1.000]], [0.659, [0.000, 0.604, 1.000]], [0.661, [0.000, 0.583, 1.000]], [0.663, [0.000, 0.583, 1.000]], [0.665, [0.000, 0.562, 1.000]], [0.667, [0.000, 0.562, 1.000]], [0.669, [0.000, 0.540, 1.000]], [0.671, [0.000, 0.540, 1.000]], [0.673, [0.000, 0.519, 1.000]], [0.675, [0.000, 0.519, 1.000]], [0.677, [0.000, 0.498, 1.000]], [0.679, [0.000, 0.498, 1.000]], [0.681, [0.000, 0.476, 1.000]], [0.683, [0.000, 0.476, 1.000]], [0.685, [0.000, 0.455, 1.000]], [0.687, [0.000, 0.455, 1.000]], [0.689, [0.000, 0.434, 1.000]], [0.691, [0.000, 0.434, 1.000]], [0.693, [0.000, 0.412, 1.000]], [0.695, [0.000, 0.412, 1.000]], [0.697, [0.000, 0.391, 1.000]], [0.699, [0.000, 0.391, 1.000]], [0.701, [0.000, 0.370, 1.000]], [0.703, [0.000, 0.370, 1.000]], [0.705, [0.000, 0.348, 1.000]], [0.706, [0.000, 0.348, 1.000]], [0.708, [0.000, 0.327, 1.000]], [0.710, [0.000, 0.327, 1.000]], [0.712, [0.000, 0.306, 1.000]], [0.714, [0.000, 0.306, 1.000]], [0.716, [0.000, 0.285, 1.000]], [0.718, [0.000, 0.285, 1.000]], [0.720, [0.000, 0.263, 1.000]], [0.722, [0.000, 0.263, 1.000]], [0.724, [0.000, 0.242, 1.000]], [0.726, [0.000, 0.242, 1.000]], [0.728, [0.000, 0.221, 1.000]], [0.730, [0.000, 0.221, 1.000]], [0.732, [0.000, 0.199, 1.000]], [0.734, [0.000, 0.199, 1.000]], [0.736, [0.000, 0.178, 1.000]], [0.738, [0.000, 0.178, 1.000]], [0.740, [0.000, 0.157, 1.000]], [0.742, [0.000, 0.157, 1.000]], [0.744, [0.000, 0.135, 1.000]], [0.746, [0.000, 0.135, 1.000]], [0.748, [0.000, 0.114, 1.000]], [0.750, [0.000, 0.114, 1.000]], [0.751, [0.000, 0.093, 1.000]], [0.753, [0.000, 0.093, 1.000]], [0.755, [0.000, 0.071, 1.000]], [0.757, [0.000, 0.071, 1.000]], [0.759, [0.000, 0.050, 1.000]], [0.761, [0.000, 0.050, 1.000]], [0.763, [0.000, 0.029, 1.000]], [0.765, [0.000, 0.029, 1.000]], [0.767, [0.000, 0.007, 1.000]], [0.769, [0.000, 0.007, 1.000]], [0.771, [0.014, 0.000, 1.000]], [0.773, [0.014, 0.000, 1.000]], [0.775, [0.035, 0.000, 1.000]], [0.777, [0.035, 0.000, 1.000]], [0.779, [0.056, 0.000, 1.000]], [0.781, [0.056, 0.000, 1.000]], [0.783, [0.078, 0.000, 1.000]], [0.785, [0.078, 0.000, 1.000]], [0.787, [0.099, 0.000, 1.000]], [0.789, [0.099, 0.000, 1.000]], [0.791, [0.120, 0.000, 1.000]], [0.793, [0.120, 0.000, 1.000]], [0.795, [0.142, 0.000, 1.000]], [0.796, [0.142, 0.000, 1.000]], [0.798, [0.163, 0.000, 1.000]], [0.800, [0.163, 0.000, 1.000]], [0.802, [0.184, 0.000, 1.000]], [0.804, [0.184, 0.000, 1.000]], [0.806, [0.206, 0.000, 1.000]], [0.808, [0.206, 0.000, 1.000]], [0.810, [0.227, 0.000, 1.000]], [0.812, [0.227, 0.000, 1.000]], [0.814, [0.248, 0.000, 1.000]], [0.816, [0.248, 0.000, 1.000]], [0.818, [0.270, 0.000, 1.000]], [0.820, [0.270, 0.000, 1.000]], [0.822, [0.291, 0.000, 1.000]], [0.824, [0.291, 0.000, 1.000]], [0.826, [0.312, 0.000, 1.000]], [0.828, [0.312, 0.000, 1.000]], [0.830, [0.334, 0.000, 1.000]], [0.832, [0.334, 0.000, 1.000]], [0.834, [0.355, 0.000, 1.000]], [0.836, [0.355, 0.000, 1.000]], [0.838, [0.376, 0.000, 1.000]], [0.840, [0.376, 0.000, 1.000]], [0.841, [0.397, 0.000, 1.000]], [0.843, [0.397, 0.000, 1.000]], [0.845, [0.419, 0.000, 1.000]], [0.847, [0.419, 0.000, 1.000]], [0.849, [0.440, 0.000, 1.000]], [0.851, [0.440, 0.000, 1.000]], [0.853, [0.461, 0.000, 1.000]], [0.855, [0.461, 0.000, 1.000]], [0.857, [0.483, 0.000, 1.000]], [0.859, [0.483, 0.000, 1.000]], [0.861, [0.504, 0.000, 1.000]], [0.863, [0.504, 0.000, 1.000]], [0.865, [0.525, 0.000, 1.000]], [0.867, [0.525, 0.000, 1.000]], [0.869, [0.547, 0.000, 1.000]], [0.871, [0.547, 0.000, 1.000]], [0.873, [0.568, 0.000, 1.000]], [0.875, [0.568, 0.000, 1.000]], [0.877, [0.589, 0.000, 1.000]], [0.879, [0.589, 0.000, 1.000]], [0.881, [0.611, 0.000, 1.000]], [0.883, [0.611, 0.000, 1.000]], [0.885, [0.632, 0.000, 1.000]], [0.886, [0.632, 0.000, 1.000]], [0.888, [0.653, 0.000, 1.000]], [0.890, [0.653, 0.000, 1.000]], [0.892, [0.675, 0.000, 1.000]], [0.894, [0.675, 0.000, 1.000]], [0.896, [0.696, 0.000, 1.000]], [0.898, [0.696, 0.000, 1.000]], [0.900, [0.717, 0.000, 1.000]], [0.902, [0.717, 0.000, 1.000]], [0.904, [0.738, 0.000, 1.000]], [0.906, [0.738, 0.000, 1.000]], [0.908, [0.760, 0.000, 1.000]], [0.910, [0.760, 0.000, 1.000]], [0.912, [0.781, 0.000, 1.000]], [0.914, [0.781, 0.000, 1.000]], [0.916, [0.802, 0.000, 1.000]], [0.918, [0.802, 0.000, 1.000]], [0.920, [0.824, 0.000, 1.000]], [0.922, [0.824, 0.000, 1.000]], [0.924, [0.845, 0.000, 1.000]], [0.926, [0.845, 0.000, 1.000]], [0.928, [0.866, 0.000, 1.000]], [0.930, [0.866, 0.000, 1.000]], [0.932, [0.888, 0.000, 1.000]], [0.933, [0.888, 0.000, 1.000]], [0.935, [0.909, 0.000, 1.000]], [0.937, [0.909, 0.000, 1.000]], [0.939, [0.930, 0.000, 1.000]], [0.941, [0.930, 0.000, 1.000]], [0.943, [0.952, 0.000, 1.000]], [0.945, [0.952, 0.000, 1.000]], [0.947, [0.973, 0.000, 1.000]], [0.949, [0.973, 0.000, 1.000]], [0.951, [0.994, 0.000, 1.000]], [0.953, [0.994, 0.000, 1.000]], [0.955, [1.000, 0.000, 0.984]], [0.957, [1.000, 0.000, 0.984]], [0.959, [1.000, 0.000, 0.963]], [0.961, [1.000, 0.000, 0.963]], [0.963, [1.000, 0.000, 0.942]], [0.965, [1.000, 0.000, 0.942]], [0.967, [1.000, 0.000, 0.921]], [0.969, [1.000, 0.000, 0.921]], [0.971, [1.000, 0.000, 0.899]], [0.973, [1.000, 0.000, 0.899]], [0.975, [1.000, 0.000, 0.878]], [0.977, [1.000, 0.000, 0.878]], [0.978, [1.000, 0.000, 0.857]], [0.980, [1.000, 0.000, 0.857]], [0.982, [1.000, 0.000, 0.835]], [0.984, [1.000, 0.000, 0.835]], [0.986, [1.000, 0.000, 0.814]], [0.988, [1.000, 0.000, 0.814]], [0.990, [1.000, 0.000, 0.793]], [0.992, [1.000, 0.000, 0.793]], [0.994, [1.000, 0.000, 0.771]], [0.996, [1.000, 0.000, 0.771]], [0.998, [1.000, 0.000, 0.750]], [1.000, [1.000, 0.000, 0.750]]]; +var gist_stern = [[0.000, [0.000, 0.000, 0.000]], [0.002, [0.000, 0.000, 0.000]], [0.004, [0.072, 0.004, 0.008]], [0.006, [0.072, 0.004, 0.008]], [0.008, [0.143, 0.008, 0.016]], [0.010, [0.143, 0.008, 0.016]], [0.012, [0.215, 0.012, 0.024]], [0.014, [0.215, 0.012, 0.024]], [0.016, [0.287, 0.016, 0.031]], [0.018, [0.287, 0.016, 0.031]], [0.020, [0.358, 0.020, 0.039]], [0.022, [0.358, 0.020, 0.039]], [0.023, [0.430, 0.024, 0.047]], [0.025, [0.430, 0.024, 0.047]], [0.027, [0.502, 0.027, 0.055]], [0.029, [0.502, 0.027, 0.055]], [0.031, [0.574, 0.031, 0.063]], [0.033, [0.574, 0.031, 0.063]], [0.035, [0.645, 0.035, 0.071]], [0.037, [0.645, 0.035, 0.071]], [0.039, [0.717, 0.039, 0.078]], [0.041, [0.717, 0.039, 0.078]], [0.043, [0.789, 0.043, 0.086]], [0.045, [0.789, 0.043, 0.086]], [0.047, [0.860, 0.047, 0.094]], [0.049, [0.860, 0.047, 0.094]], [0.051, [0.932, 0.051, 0.102]], [0.053, [0.932, 0.051, 0.102]], [0.055, [0.999, 0.055, 0.110]], [0.057, [0.999, 0.055, 0.110]], [0.059, [0.979, 0.059, 0.118]], [0.061, [0.979, 0.059, 0.118]], [0.063, [0.960, 0.063, 0.125]], [0.065, [0.960, 0.063, 0.125]], [0.067, [0.940, 0.067, 0.133]], [0.068, [0.940, 0.067, 0.133]], [0.070, [0.921, 0.071, 0.141]], [0.072, [0.921, 0.071, 0.141]], [0.074, [0.901, 0.075, 0.149]], [0.076, [0.901, 0.075, 0.149]], [0.078, [0.882, 0.078, 0.157]], [0.080, [0.882, 0.078, 0.157]], [0.082, [0.862, 0.082, 0.165]], [0.084, [0.862, 0.082, 0.165]], [0.086, [0.843, 0.086, 0.173]], [0.088, [0.843, 0.086, 0.173]], [0.090, [0.823, 0.090, 0.180]], [0.092, [0.823, 0.090, 0.180]], [0.094, [0.804, 0.094, 0.188]], [0.096, [0.804, 0.094, 0.188]], [0.098, [0.784, 0.098, 0.196]], [0.100, [0.784, 0.098, 0.196]], [0.102, [0.765, 0.102, 0.204]], [0.104, [0.765, 0.102, 0.204]], [0.106, [0.745, 0.106, 0.212]], [0.108, [0.745, 0.106, 0.212]], [0.110, [0.725, 0.110, 0.220]], [0.112, [0.725, 0.110, 0.220]], [0.114, [0.706, 0.114, 0.227]], [0.115, [0.706, 0.114, 0.227]], [0.117, [0.686, 0.118, 0.235]], [0.119, [0.686, 0.118, 0.235]], [0.121, [0.667, 0.122, 0.243]], [0.123, [0.667, 0.122, 0.243]], [0.125, [0.647, 0.125, 0.251]], [0.127, [0.647, 0.125, 0.251]], [0.129, [0.628, 0.129, 0.259]], [0.131, [0.628, 0.129, 0.259]], [0.133, [0.608, 0.133, 0.267]], [0.135, [0.608, 0.133, 0.267]], [0.137, [0.589, 0.137, 0.275]], [0.139, [0.589, 0.137, 0.275]], [0.141, [0.569, 0.141, 0.282]], [0.143, [0.569, 0.141, 0.282]], [0.145, [0.550, 0.145, 0.290]], [0.147, [0.550, 0.145, 0.290]], [0.149, [0.530, 0.149, 0.298]], [0.151, [0.530, 0.149, 0.298]], [0.153, [0.511, 0.153, 0.306]], [0.155, [0.511, 0.153, 0.306]], [0.157, [0.491, 0.157, 0.314]], [0.159, [0.491, 0.157, 0.314]], [0.160, [0.471, 0.161, 0.322]], [0.162, [0.471, 0.161, 0.322]], [0.164, [0.452, 0.165, 0.329]], [0.166, [0.452, 0.165, 0.329]], [0.168, [0.432, 0.169, 0.337]], [0.170, [0.432, 0.169, 0.337]], [0.172, [0.413, 0.173, 0.345]], [0.174, [0.413, 0.173, 0.345]], [0.176, [0.393, 0.176, 0.353]], [0.178, [0.393, 0.176, 0.353]], [0.180, [0.374, 0.180, 0.361]], [0.182, [0.374, 0.180, 0.361]], [0.184, [0.354, 0.184, 0.369]], [0.186, [0.354, 0.184, 0.369]], [0.188, [0.335, 0.188, 0.376]], [0.190, [0.335, 0.188, 0.376]], [0.192, [0.315, 0.192, 0.384]], [0.194, [0.315, 0.192, 0.384]], [0.196, [0.296, 0.196, 0.392]], [0.198, [0.296, 0.196, 0.392]], [0.200, [0.276, 0.200, 0.400]], [0.202, [0.276, 0.200, 0.400]], [0.204, [0.257, 0.204, 0.408]], [0.205, [0.257, 0.204, 0.408]], [0.207, [0.237, 0.208, 0.416]], [0.209, [0.237, 0.208, 0.416]], [0.211, [0.217, 0.212, 0.424]], [0.213, [0.217, 0.212, 0.424]], [0.215, [0.198, 0.216, 0.431]], [0.217, [0.198, 0.216, 0.431]], [0.219, [0.178, 0.220, 0.439]], [0.221, [0.178, 0.220, 0.439]], [0.223, [0.159, 0.224, 0.447]], [0.225, [0.159, 0.224, 0.447]], [0.227, [0.139, 0.227, 0.455]], [0.229, [0.139, 0.227, 0.455]], [0.231, [0.120, 0.231, 0.463]], [0.233, [0.120, 0.231, 0.463]], [0.235, [0.100, 0.235, 0.471]], [0.237, [0.100, 0.235, 0.471]], [0.239, [0.081, 0.239, 0.478]], [0.241, [0.081, 0.239, 0.478]], [0.243, [0.061, 0.243, 0.486]], [0.245, [0.061, 0.243, 0.486]], [0.247, [0.042, 0.247, 0.494]], [0.249, [0.042, 0.247, 0.494]], [0.250, [0.251, 0.251, 0.502]], [0.252, [0.251, 0.251, 0.502]], [0.254, [0.255, 0.255, 0.510]], [0.256, [0.255, 0.255, 0.510]], [0.258, [0.259, 0.259, 0.518]], [0.260, [0.259, 0.259, 0.518]], [0.262, [0.263, 0.263, 0.525]], [0.264, [0.263, 0.263, 0.525]], [0.266, [0.267, 0.267, 0.533]], [0.268, [0.267, 0.267, 0.533]], [0.270, [0.271, 0.271, 0.541]], [0.272, [0.271, 0.271, 0.541]], [0.274, [0.275, 0.275, 0.549]], [0.276, [0.275, 0.275, 0.549]], [0.278, [0.278, 0.278, 0.557]], [0.280, [0.278, 0.278, 0.557]], [0.282, [0.282, 0.282, 0.565]], [0.284, [0.282, 0.282, 0.565]], [0.286, [0.286, 0.286, 0.573]], [0.288, [0.286, 0.286, 0.573]], [0.290, [0.290, 0.290, 0.580]], [0.292, [0.290, 0.290, 0.580]], [0.294, [0.294, 0.294, 0.588]], [0.295, [0.294, 0.294, 0.588]], [0.297, [0.298, 0.298, 0.596]], [0.299, [0.298, 0.298, 0.596]], [0.301, [0.302, 0.302, 0.604]], [0.303, [0.302, 0.302, 0.604]], [0.305, [0.306, 0.306, 0.612]], [0.307, [0.306, 0.306, 0.612]], [0.309, [0.310, 0.310, 0.620]], [0.311, [0.310, 0.310, 0.620]], [0.313, [0.314, 0.314, 0.627]], [0.315, [0.314, 0.314, 0.627]], [0.317, [0.318, 0.318, 0.635]], [0.319, [0.318, 0.318, 0.635]], [0.321, [0.322, 0.322, 0.643]], [0.323, [0.322, 0.322, 0.643]], [0.325, [0.325, 0.325, 0.651]], [0.327, [0.325, 0.325, 0.651]], [0.329, [0.329, 0.329, 0.659]], [0.331, [0.329, 0.329, 0.659]], [0.333, [0.333, 0.333, 0.667]], [0.335, [0.333, 0.333, 0.667]], [0.337, [0.337, 0.337, 0.675]], [0.339, [0.337, 0.337, 0.675]], [0.341, [0.341, 0.341, 0.682]], [0.342, [0.341, 0.341, 0.682]], [0.344, [0.345, 0.345, 0.690]], [0.346, [0.345, 0.345, 0.690]], [0.348, [0.349, 0.349, 0.698]], [0.350, [0.349, 0.349, 0.698]], [0.352, [0.353, 0.353, 0.706]], [0.354, [0.353, 0.353, 0.706]], [0.356, [0.357, 0.357, 0.714]], [0.358, [0.357, 0.357, 0.714]], [0.360, [0.361, 0.361, 0.722]], [0.362, [0.361, 0.361, 0.722]], [0.364, [0.365, 0.365, 0.729]], [0.366, [0.365, 0.365, 0.729]], [0.368, [0.369, 0.369, 0.737]], [0.370, [0.369, 0.369, 0.737]], [0.372, [0.373, 0.373, 0.745]], [0.374, [0.373, 0.373, 0.745]], [0.376, [0.376, 0.376, 0.753]], [0.378, [0.376, 0.376, 0.753]], [0.380, [0.380, 0.380, 0.761]], [0.382, [0.380, 0.380, 0.761]], [0.384, [0.384, 0.384, 0.769]], [0.386, [0.384, 0.384, 0.769]], [0.387, [0.388, 0.388, 0.776]], [0.389, [0.388, 0.388, 0.776]], [0.391, [0.392, 0.392, 0.784]], [0.393, [0.392, 0.392, 0.784]], [0.395, [0.396, 0.396, 0.792]], [0.397, [0.396, 0.396, 0.792]], [0.399, [0.400, 0.400, 0.800]], [0.401, [0.400, 0.400, 0.800]], [0.403, [0.404, 0.404, 0.808]], [0.405, [0.404, 0.404, 0.808]], [0.407, [0.408, 0.408, 0.816]], [0.409, [0.408, 0.408, 0.816]], [0.411, [0.412, 0.412, 0.824]], [0.413, [0.412, 0.412, 0.824]], [0.415, [0.416, 0.416, 0.831]], [0.417, [0.416, 0.416, 0.831]], [0.419, [0.420, 0.420, 0.839]], [0.421, [0.420, 0.420, 0.839]], [0.423, [0.424, 0.424, 0.847]], [0.425, [0.424, 0.424, 0.847]], [0.427, [0.427, 0.427, 0.855]], [0.429, [0.427, 0.427, 0.855]], [0.431, [0.431, 0.431, 0.863]], [0.432, [0.431, 0.431, 0.863]], [0.434, [0.435, 0.435, 0.871]], [0.436, [0.435, 0.435, 0.871]], [0.438, [0.439, 0.439, 0.878]], [0.440, [0.439, 0.439, 0.878]], [0.442, [0.443, 0.443, 0.886]], [0.444, [0.443, 0.443, 0.886]], [0.446, [0.447, 0.447, 0.894]], [0.448, [0.447, 0.447, 0.894]], [0.450, [0.451, 0.451, 0.902]], [0.452, [0.451, 0.451, 0.902]], [0.454, [0.455, 0.455, 0.910]], [0.456, [0.455, 0.455, 0.910]], [0.458, [0.459, 0.459, 0.918]], [0.460, [0.459, 0.459, 0.918]], [0.462, [0.463, 0.463, 0.925]], [0.464, [0.463, 0.463, 0.925]], [0.466, [0.467, 0.467, 0.933]], [0.468, [0.467, 0.467, 0.933]], [0.470, [0.471, 0.471, 0.941]], [0.472, [0.471, 0.471, 0.941]], [0.474, [0.475, 0.475, 0.949]], [0.476, [0.475, 0.475, 0.949]], [0.477, [0.478, 0.478, 0.957]], [0.479, [0.478, 0.478, 0.957]], [0.481, [0.482, 0.482, 0.965]], [0.483, [0.482, 0.482, 0.965]], [0.485, [0.486, 0.486, 0.973]], [0.487, [0.486, 0.486, 0.973]], [0.489, [0.490, 0.490, 0.980]], [0.491, [0.490, 0.490, 0.980]], [0.493, [0.494, 0.494, 0.988]], [0.495, [0.494, 0.494, 0.988]], [0.497, [0.498, 0.498, 0.996]], [0.499, [0.498, 0.498, 0.996]], [0.501, [0.502, 0.502, 0.992]], [0.503, [0.502, 0.502, 0.992]], [0.505, [0.506, 0.506, 0.975]], [0.507, [0.506, 0.506, 0.975]], [0.509, [0.510, 0.510, 0.958]], [0.511, [0.510, 0.510, 0.958]], [0.513, [0.514, 0.514, 0.942]], [0.515, [0.514, 0.514, 0.942]], [0.517, [0.518, 0.518, 0.925]], [0.519, [0.518, 0.518, 0.925]], [0.521, [0.522, 0.522, 0.908]], [0.523, [0.522, 0.522, 0.908]], [0.524, [0.525, 0.525, 0.892]], [0.526, [0.525, 0.525, 0.892]], [0.528, [0.529, 0.529, 0.875]], [0.530, [0.529, 0.529, 0.875]], [0.532, [0.533, 0.533, 0.858]], [0.534, [0.533, 0.533, 0.858]], [0.536, [0.537, 0.537, 0.841]], [0.538, [0.537, 0.537, 0.841]], [0.540, [0.541, 0.541, 0.825]], [0.542, [0.541, 0.541, 0.825]], [0.544, [0.545, 0.545, 0.808]], [0.546, [0.545, 0.545, 0.808]], [0.548, [0.549, 0.549, 0.791]], [0.550, [0.549, 0.549, 0.791]], [0.552, [0.553, 0.553, 0.775]], [0.554, [0.553, 0.553, 0.775]], [0.556, [0.557, 0.557, 0.758]], [0.558, [0.557, 0.557, 0.758]], [0.560, [0.561, 0.561, 0.741]], [0.562, [0.561, 0.561, 0.741]], [0.564, [0.565, 0.565, 0.725]], [0.566, [0.565, 0.565, 0.725]], [0.568, [0.569, 0.569, 0.708]], [0.569, [0.569, 0.569, 0.708]], [0.571, [0.573, 0.573, 0.691]], [0.573, [0.573, 0.573, 0.691]], [0.575, [0.576, 0.576, 0.675]], [0.577, [0.576, 0.576, 0.675]], [0.579, [0.580, 0.580, 0.658]], [0.581, [0.580, 0.580, 0.658]], [0.583, [0.584, 0.584, 0.641]], [0.585, [0.584, 0.584, 0.641]], [0.587, [0.588, 0.588, 0.625]], [0.589, [0.588, 0.588, 0.625]], [0.591, [0.592, 0.592, 0.608]], [0.593, [0.592, 0.592, 0.608]], [0.595, [0.596, 0.596, 0.591]], [0.597, [0.596, 0.596, 0.591]], [0.599, [0.600, 0.600, 0.574]], [0.601, [0.600, 0.600, 0.574]], [0.603, [0.604, 0.604, 0.558]], [0.605, [0.604, 0.604, 0.558]], [0.607, [0.608, 0.608, 0.541]], [0.609, [0.608, 0.608, 0.541]], [0.611, [0.612, 0.612, 0.524]], [0.613, [0.612, 0.612, 0.524]], [0.614, [0.616, 0.616, 0.508]], [0.616, [0.616, 0.616, 0.508]], [0.618, [0.620, 0.620, 0.491]], [0.620, [0.620, 0.620, 0.491]], [0.622, [0.624, 0.624, 0.474]], [0.624, [0.624, 0.624, 0.474]], [0.626, [0.627, 0.627, 0.458]], [0.628, [0.627, 0.627, 0.458]], [0.630, [0.631, 0.631, 0.441]], [0.632, [0.631, 0.631, 0.441]], [0.634, [0.635, 0.635, 0.424]], [0.636, [0.635, 0.635, 0.424]], [0.638, [0.639, 0.639, 0.408]], [0.640, [0.639, 0.639, 0.408]], [0.642, [0.643, 0.643, 0.391]], [0.644, [0.643, 0.643, 0.391]], [0.646, [0.647, 0.647, 0.374]], [0.648, [0.647, 0.647, 0.374]], [0.650, [0.651, 0.651, 0.358]], [0.652, [0.651, 0.651, 0.358]], [0.654, [0.655, 0.655, 0.341]], [0.656, [0.655, 0.655, 0.341]], [0.658, [0.659, 0.659, 0.324]], [0.659, [0.659, 0.659, 0.324]], [0.661, [0.663, 0.663, 0.307]], [0.663, [0.663, 0.663, 0.307]], [0.665, [0.667, 0.667, 0.291]], [0.667, [0.667, 0.667, 0.291]], [0.669, [0.671, 0.671, 0.274]], [0.671, [0.671, 0.671, 0.274]], [0.673, [0.675, 0.675, 0.257]], [0.675, [0.675, 0.675, 0.257]], [0.677, [0.678, 0.678, 0.241]], [0.679, [0.678, 0.678, 0.241]], [0.681, [0.682, 0.682, 0.224]], [0.683, [0.682, 0.682, 0.224]], [0.685, [0.686, 0.686, 0.207]], [0.687, [0.686, 0.686, 0.207]], [0.689, [0.690, 0.690, 0.191]], [0.691, [0.690, 0.690, 0.191]], [0.693, [0.694, 0.694, 0.174]], [0.695, [0.694, 0.694, 0.174]], [0.697, [0.698, 0.698, 0.157]], [0.699, [0.698, 0.698, 0.157]], [0.701, [0.702, 0.702, 0.141]], [0.703, [0.702, 0.702, 0.141]], [0.705, [0.706, 0.706, 0.124]], [0.706, [0.706, 0.706, 0.124]], [0.708, [0.710, 0.710, 0.107]], [0.710, [0.710, 0.710, 0.107]], [0.712, [0.714, 0.714, 0.091]], [0.714, [0.714, 0.714, 0.091]], [0.716, [0.718, 0.718, 0.074]], [0.718, [0.718, 0.718, 0.074]], [0.720, [0.722, 0.722, 0.057]], [0.722, [0.722, 0.722, 0.057]], [0.724, [0.725, 0.725, 0.040]], [0.726, [0.725, 0.725, 0.040]], [0.728, [0.729, 0.729, 0.024]], [0.730, [0.729, 0.729, 0.024]], [0.732, [0.733, 0.733, 0.007]], [0.734, [0.733, 0.733, 0.007]], [0.736, [0.737, 0.737, 0.009]], [0.738, [0.737, 0.737, 0.009]], [0.740, [0.741, 0.741, 0.023]], [0.742, [0.741, 0.741, 0.023]], [0.744, [0.745, 0.745, 0.038]], [0.746, [0.745, 0.745, 0.038]], [0.748, [0.749, 0.749, 0.053]], [0.750, [0.749, 0.749, 0.053]], [0.751, [0.753, 0.753, 0.068]], [0.753, [0.753, 0.753, 0.068]], [0.755, [0.757, 0.757, 0.083]], [0.757, [0.757, 0.757, 0.083]], [0.759, [0.761, 0.761, 0.097]], [0.761, [0.761, 0.761, 0.097]], [0.763, [0.765, 0.765, 0.112]], [0.765, [0.765, 0.765, 0.112]], [0.767, [0.769, 0.769, 0.127]], [0.769, [0.769, 0.769, 0.127]], [0.771, [0.773, 0.773, 0.142]], [0.773, [0.773, 0.773, 0.142]], [0.775, [0.776, 0.776, 0.156]], [0.777, [0.776, 0.776, 0.156]], [0.779, [0.780, 0.780, 0.171]], [0.781, [0.780, 0.780, 0.171]], [0.783, [0.784, 0.784, 0.186]], [0.785, [0.784, 0.784, 0.186]], [0.787, [0.788, 0.788, 0.201]], [0.789, [0.788, 0.788, 0.201]], [0.791, [0.792, 0.792, 0.216]], [0.793, [0.792, 0.792, 0.216]], [0.795, [0.796, 0.796, 0.230]], [0.796, [0.796, 0.796, 0.230]], [0.798, [0.800, 0.800, 0.245]], [0.800, [0.800, 0.800, 0.245]], [0.802, [0.804, 0.804, 0.260]], [0.804, [0.804, 0.804, 0.260]], [0.806, [0.808, 0.808, 0.275]], [0.808, [0.808, 0.808, 0.275]], [0.810, [0.812, 0.812, 0.290]], [0.812, [0.812, 0.812, 0.290]], [0.814, [0.816, 0.816, 0.304]], [0.816, [0.816, 0.816, 0.304]], [0.818, [0.820, 0.820, 0.319]], [0.820, [0.820, 0.820, 0.319]], [0.822, [0.824, 0.824, 0.334]], [0.824, [0.824, 0.824, 0.334]], [0.826, [0.827, 0.827, 0.349]], [0.828, [0.827, 0.827, 0.349]], [0.830, [0.831, 0.831, 0.364]], [0.832, [0.831, 0.831, 0.364]], [0.834, [0.835, 0.835, 0.378]], [0.836, [0.835, 0.835, 0.378]], [0.838, [0.839, 0.839, 0.393]], [0.840, [0.839, 0.839, 0.393]], [0.841, [0.843, 0.843, 0.408]], [0.843, [0.843, 0.843, 0.408]], [0.845, [0.847, 0.847, 0.423]], [0.847, [0.847, 0.847, 0.423]], [0.849, [0.851, 0.851, 0.438]], [0.851, [0.851, 0.851, 0.438]], [0.853, [0.855, 0.855, 0.452]], [0.855, [0.855, 0.855, 0.452]], [0.857, [0.859, 0.859, 0.467]], [0.859, [0.859, 0.859, 0.467]], [0.861, [0.863, 0.863, 0.482]], [0.863, [0.863, 0.863, 0.482]], [0.865, [0.867, 0.867, 0.497]], [0.867, [0.867, 0.867, 0.497]], [0.869, [0.871, 0.871, 0.512]], [0.871, [0.871, 0.871, 0.512]], [0.873, [0.875, 0.875, 0.526]], [0.875, [0.875, 0.875, 0.526]], [0.877, [0.878, 0.878, 0.541]], [0.879, [0.878, 0.878, 0.541]], [0.881, [0.882, 0.882, 0.556]], [0.883, [0.882, 0.882, 0.556]], [0.885, [0.886, 0.886, 0.571]], [0.886, [0.886, 0.886, 0.571]], [0.888, [0.890, 0.890, 0.586]], [0.890, [0.890, 0.890, 0.586]], [0.892, [0.894, 0.894, 0.600]], [0.894, [0.894, 0.894, 0.600]], [0.896, [0.898, 0.898, 0.615]], [0.898, [0.898, 0.898, 0.615]], [0.900, [0.902, 0.902, 0.630]], [0.902, [0.902, 0.902, 0.630]], [0.904, [0.906, 0.906, 0.645]], [0.906, [0.906, 0.906, 0.645]], [0.908, [0.910, 0.910, 0.660]], [0.910, [0.910, 0.910, 0.660]], [0.912, [0.914, 0.914, 0.674]], [0.914, [0.914, 0.914, 0.674]], [0.916, [0.918, 0.918, 0.689]], [0.918, [0.918, 0.918, 0.689]], [0.920, [0.922, 0.922, 0.704]], [0.922, [0.922, 0.922, 0.704]], [0.924, [0.925, 0.925, 0.719]], [0.926, [0.925, 0.925, 0.719]], [0.928, [0.929, 0.929, 0.734]], [0.930, [0.929, 0.929, 0.734]], [0.932, [0.933, 0.933, 0.748]], [0.933, [0.933, 0.933, 0.748]], [0.935, [0.937, 0.937, 0.763]], [0.937, [0.937, 0.937, 0.763]], [0.939, [0.941, 0.941, 0.778]], [0.941, [0.941, 0.941, 0.778]], [0.943, [0.945, 0.945, 0.793]], [0.945, [0.945, 0.945, 0.793]], [0.947, [0.949, 0.949, 0.808]], [0.949, [0.949, 0.949, 0.808]], [0.951, [0.953, 0.953, 0.822]], [0.953, [0.953, 0.953, 0.822]], [0.955, [0.957, 0.957, 0.837]], [0.957, [0.957, 0.957, 0.837]], [0.959, [0.961, 0.961, 0.852]], [0.961, [0.961, 0.961, 0.852]], [0.963, [0.965, 0.965, 0.867]], [0.965, [0.965, 0.965, 0.867]], [0.967, [0.969, 0.969, 0.882]], [0.969, [0.969, 0.969, 0.882]], [0.971, [0.973, 0.973, 0.896]], [0.973, [0.973, 0.973, 0.896]], [0.975, [0.976, 0.976, 0.911]], [0.977, [0.976, 0.976, 0.911]], [0.978, [0.980, 0.980, 0.926]], [0.980, [0.980, 0.980, 0.926]], [0.982, [0.984, 0.984, 0.941]], [0.984, [0.984, 0.984, 0.941]], [0.986, [0.988, 0.988, 0.956]], [0.988, [0.988, 0.988, 0.956]], [0.990, [0.992, 0.992, 0.970]], [0.992, [0.992, 0.992, 0.970]], [0.994, [0.996, 0.996, 0.985]], [0.996, [0.996, 0.996, 0.985]], [0.998, [1.000, 1.000, 1.000]], [1.000, [1.000, 1.000, 1.000]]]; +var gnuplot = [[0.000, [0.000, 0.000, 0.000]], [0.002, [0.000, 0.000, 0.000]], [0.004, [0.063, 0.000, 0.025]], [0.006, [0.063, 0.000, 0.025]], [0.008, [0.089, 0.000, 0.049]], [0.010, [0.089, 0.000, 0.049]], [0.012, [0.108, 0.000, 0.074]], [0.014, [0.108, 0.000, 0.074]], [0.016, [0.125, 0.000, 0.098]], [0.018, [0.125, 0.000, 0.098]], [0.020, [0.140, 0.000, 0.123]], [0.022, [0.140, 0.000, 0.123]], [0.023, [0.153, 0.000, 0.147]], [0.025, [0.153, 0.000, 0.147]], [0.027, [0.166, 0.000, 0.172]], [0.029, [0.166, 0.000, 0.172]], [0.031, [0.177, 0.000, 0.196]], [0.033, [0.177, 0.000, 0.196]], [0.035, [0.188, 0.000, 0.220]], [0.037, [0.188, 0.000, 0.220]], [0.039, [0.198, 0.000, 0.244]], [0.041, [0.198, 0.000, 0.244]], [0.043, [0.208, 0.000, 0.268]], [0.045, [0.208, 0.000, 0.268]], [0.047, [0.217, 0.000, 0.291]], [0.049, [0.217, 0.000, 0.291]], [0.051, [0.226, 0.000, 0.315]], [0.053, [0.226, 0.000, 0.315]], [0.055, [0.234, 0.000, 0.338]], [0.057, [0.234, 0.000, 0.338]], [0.059, [0.243, 0.000, 0.361]], [0.061, [0.243, 0.000, 0.361]], [0.063, [0.250, 0.000, 0.384]], [0.065, [0.250, 0.000, 0.384]], [0.067, [0.258, 0.000, 0.407]], [0.068, [0.258, 0.000, 0.407]], [0.070, [0.266, 0.000, 0.429]], [0.072, [0.266, 0.000, 0.429]], [0.074, [0.273, 0.000, 0.451]], [0.076, [0.273, 0.000, 0.451]], [0.078, [0.280, 0.000, 0.473]], [0.080, [0.280, 0.000, 0.473]], [0.082, [0.287, 0.001, 0.495]], [0.084, [0.287, 0.001, 0.495]], [0.086, [0.294, 0.001, 0.516]], [0.088, [0.294, 0.001, 0.516]], [0.090, [0.300, 0.001, 0.537]], [0.092, [0.300, 0.001, 0.537]], [0.094, [0.307, 0.001, 0.557]], [0.096, [0.307, 0.001, 0.557]], [0.098, [0.313, 0.001, 0.578]], [0.100, [0.313, 0.001, 0.578]], [0.102, [0.319, 0.001, 0.598]], [0.104, [0.319, 0.001, 0.598]], [0.106, [0.325, 0.001, 0.617]], [0.108, [0.325, 0.001, 0.617]], [0.110, [0.331, 0.001, 0.636]], [0.112, [0.331, 0.001, 0.636]], [0.114, [0.337, 0.001, 0.655]], [0.115, [0.337, 0.001, 0.655]], [0.117, [0.343, 0.002, 0.674]], [0.119, [0.343, 0.002, 0.674]], [0.121, [0.349, 0.002, 0.692]], [0.123, [0.349, 0.002, 0.692]], [0.125, [0.354, 0.002, 0.709]], [0.127, [0.354, 0.002, 0.709]], [0.129, [0.360, 0.002, 0.726]], [0.131, [0.360, 0.002, 0.726]], [0.133, [0.365, 0.002, 0.743]], [0.135, [0.365, 0.002, 0.743]], [0.137, [0.370, 0.003, 0.759]], [0.139, [0.370, 0.003, 0.759]], [0.141, [0.376, 0.003, 0.775]], [0.143, [0.376, 0.003, 0.775]], [0.145, [0.381, 0.003, 0.791]], [0.147, [0.381, 0.003, 0.791]], [0.149, [0.386, 0.003, 0.805]], [0.151, [0.386, 0.003, 0.805]], [0.153, [0.391, 0.004, 0.820]], [0.155, [0.391, 0.004, 0.820]], [0.157, [0.396, 0.004, 0.834]], [0.159, [0.396, 0.004, 0.834]], [0.160, [0.401, 0.004, 0.847]], [0.162, [0.401, 0.004, 0.847]], [0.164, [0.406, 0.004, 0.860]], [0.166, [0.406, 0.004, 0.860]], [0.168, [0.411, 0.005, 0.872]], [0.170, [0.411, 0.005, 0.872]], [0.172, [0.415, 0.005, 0.884]], [0.174, [0.415, 0.005, 0.884]], [0.176, [0.420, 0.005, 0.895]], [0.178, [0.420, 0.005, 0.895]], [0.180, [0.425, 0.006, 0.906]], [0.182, [0.425, 0.006, 0.906]], [0.184, [0.429, 0.006, 0.916]], [0.186, [0.429, 0.006, 0.916]], [0.188, [0.434, 0.007, 0.926]], [0.190, [0.434, 0.007, 0.926]], [0.192, [0.438, 0.007, 0.935]], [0.194, [0.438, 0.007, 0.935]], [0.196, [0.443, 0.008, 0.943]], [0.198, [0.443, 0.008, 0.943]], [0.200, [0.447, 0.008, 0.951]], [0.202, [0.447, 0.008, 0.951]], [0.204, [0.452, 0.008, 0.958]], [0.205, [0.452, 0.008, 0.958]], [0.207, [0.456, 0.009, 0.965]], [0.209, [0.456, 0.009, 0.965]], [0.211, [0.460, 0.009, 0.971]], [0.213, [0.460, 0.009, 0.971]], [0.215, [0.464, 0.010, 0.977]], [0.217, [0.464, 0.010, 0.977]], [0.219, [0.469, 0.011, 0.982]], [0.221, [0.469, 0.011, 0.982]], [0.223, [0.473, 0.011, 0.986]], [0.225, [0.473, 0.011, 0.986]], [0.227, [0.477, 0.012, 0.990]], [0.229, [0.477, 0.012, 0.990]], [0.231, [0.481, 0.012, 0.993]], [0.233, [0.481, 0.012, 0.993]], [0.235, [0.485, 0.013, 0.996]], [0.237, [0.485, 0.013, 0.996]], [0.239, [0.489, 0.014, 0.998]], [0.241, [0.489, 0.014, 0.998]], [0.243, [0.493, 0.014, 0.999]], [0.245, [0.493, 0.014, 0.999]], [0.247, [0.497, 0.015, 1.000]], [0.249, [0.497, 0.015, 1.000]], [0.250, [0.501, 0.016, 1.000]], [0.252, [0.501, 0.016, 1.000]], [0.254, [0.505, 0.017, 1.000]], [0.256, [0.505, 0.017, 1.000]], [0.258, [0.509, 0.017, 0.998]], [0.260, [0.509, 0.017, 0.998]], [0.262, [0.513, 0.018, 0.997]], [0.264, [0.513, 0.018, 0.997]], [0.266, [0.516, 0.019, 0.995]], [0.268, [0.516, 0.019, 0.995]], [0.270, [0.520, 0.020, 0.992]], [0.272, [0.520, 0.020, 0.992]], [0.274, [0.524, 0.021, 0.988]], [0.276, [0.524, 0.021, 0.988]], [0.278, [0.528, 0.022, 0.984]], [0.280, [0.528, 0.022, 0.984]], [0.282, [0.531, 0.023, 0.979]], [0.284, [0.531, 0.023, 0.979]], [0.286, [0.535, 0.023, 0.974]], [0.288, [0.535, 0.023, 0.974]], [0.290, [0.539, 0.024, 0.968]], [0.292, [0.539, 0.024, 0.968]], [0.294, [0.542, 0.025, 0.962]], [0.295, [0.542, 0.025, 0.962]], [0.297, [0.546, 0.026, 0.955]], [0.299, [0.546, 0.026, 0.955]], [0.301, [0.550, 0.028, 0.947]], [0.303, [0.550, 0.028, 0.947]], [0.305, [0.553, 0.029, 0.939]], [0.307, [0.553, 0.029, 0.939]], [0.309, [0.557, 0.030, 0.930]], [0.311, [0.557, 0.030, 0.930]], [0.313, [0.560, 0.031, 0.921]], [0.315, [0.560, 0.031, 0.921]], [0.317, [0.564, 0.032, 0.911]], [0.319, [0.564, 0.032, 0.911]], [0.321, [0.567, 0.033, 0.901]], [0.323, [0.567, 0.033, 0.901]], [0.325, [0.571, 0.034, 0.890]], [0.327, [0.571, 0.034, 0.890]], [0.329, [0.574, 0.036, 0.878]], [0.331, [0.574, 0.036, 0.878]], [0.333, [0.577, 0.037, 0.866]], [0.335, [0.577, 0.037, 0.866]], [0.337, [0.581, 0.038, 0.853]], [0.339, [0.581, 0.038, 0.853]], [0.341, [0.584, 0.040, 0.840]], [0.342, [0.584, 0.040, 0.840]], [0.344, [0.587, 0.041, 0.827]], [0.346, [0.587, 0.041, 0.827]], [0.348, [0.591, 0.043, 0.813]], [0.350, [0.591, 0.043, 0.813]], [0.352, [0.594, 0.044, 0.798]], [0.354, [0.594, 0.044, 0.798]], [0.356, [0.597, 0.045, 0.783]], [0.358, [0.597, 0.045, 0.783]], [0.360, [0.601, 0.047, 0.767]], [0.362, [0.601, 0.047, 0.767]], [0.364, [0.604, 0.049, 0.751]], [0.366, [0.604, 0.049, 0.751]], [0.368, [0.607, 0.050, 0.735]], [0.370, [0.607, 0.050, 0.735]], [0.372, [0.610, 0.052, 0.718]], [0.374, [0.610, 0.052, 0.718]], [0.376, [0.614, 0.053, 0.701]], [0.378, [0.614, 0.053, 0.701]], [0.380, [0.617, 0.055, 0.683]], [0.382, [0.617, 0.055, 0.683]], [0.384, [0.620, 0.057, 0.665]], [0.386, [0.620, 0.057, 0.665]], [0.387, [0.623, 0.059, 0.646]], [0.389, [0.623, 0.059, 0.646]], [0.391, [0.626, 0.060, 0.627]], [0.393, [0.626, 0.060, 0.627]], [0.395, [0.629, 0.062, 0.608]], [0.397, [0.629, 0.062, 0.608]], [0.399, [0.632, 0.064, 0.588]], [0.401, [0.632, 0.064, 0.588]], [0.403, [0.636, 0.066, 0.568]], [0.405, [0.636, 0.066, 0.568]], [0.407, [0.639, 0.068, 0.547]], [0.409, [0.639, 0.068, 0.547]], [0.411, [0.642, 0.070, 0.526]], [0.413, [0.642, 0.070, 0.526]], [0.415, [0.645, 0.072, 0.505]], [0.417, [0.645, 0.072, 0.505]], [0.419, [0.648, 0.074, 0.484]], [0.421, [0.648, 0.074, 0.484]], [0.423, [0.651, 0.076, 0.462]], [0.425, [0.651, 0.076, 0.462]], [0.427, [0.654, 0.078, 0.440]], [0.429, [0.654, 0.078, 0.440]], [0.431, [0.657, 0.080, 0.418]], [0.432, [0.657, 0.080, 0.418]], [0.434, [0.660, 0.082, 0.395]], [0.436, [0.660, 0.082, 0.395]], [0.438, [0.663, 0.085, 0.373]], [0.440, [0.663, 0.085, 0.373]], [0.442, [0.666, 0.087, 0.350]], [0.444, [0.666, 0.087, 0.350]], [0.446, [0.669, 0.089, 0.327]], [0.448, [0.669, 0.089, 0.327]], [0.450, [0.672, 0.092, 0.303]], [0.452, [0.672, 0.092, 0.303]], [0.454, [0.674, 0.094, 0.280]], [0.456, [0.674, 0.094, 0.280]], [0.458, [0.677, 0.097, 0.256]], [0.460, [0.677, 0.097, 0.256]], [0.462, [0.680, 0.099, 0.232]], [0.464, [0.680, 0.099, 0.232]], [0.466, [0.683, 0.102, 0.208]], [0.468, [0.683, 0.102, 0.208]], [0.470, [0.686, 0.104, 0.184]], [0.472, [0.686, 0.104, 0.184]], [0.474, [0.689, 0.107, 0.159]], [0.476, [0.689, 0.107, 0.159]], [0.477, [0.692, 0.110, 0.135]], [0.479, [0.692, 0.110, 0.135]], [0.481, [0.695, 0.112, 0.111]], [0.483, [0.695, 0.112, 0.111]], [0.485, [0.697, 0.115, 0.086]], [0.487, [0.697, 0.115, 0.086]], [0.489, [0.700, 0.118, 0.062]], [0.491, [0.700, 0.118, 0.062]], [0.493, [0.703, 0.121, 0.037]], [0.495, [0.703, 0.121, 0.037]], [0.497, [0.706, 0.124, 0.012]], [0.499, [0.706, 0.124, 0.012]], [0.501, [0.708, 0.126, 0.000]], [0.503, [0.708, 0.126, 0.000]], [0.505, [0.711, 0.129, 0.000]], [0.507, [0.711, 0.129, 0.000]], [0.509, [0.714, 0.132, 0.000]], [0.511, [0.714, 0.132, 0.000]], [0.513, [0.717, 0.136, 0.000]], [0.515, [0.717, 0.136, 0.000]], [0.517, [0.719, 0.139, 0.000]], [0.519, [0.719, 0.139, 0.000]], [0.521, [0.722, 0.142, 0.000]], [0.523, [0.722, 0.142, 0.000]], [0.524, [0.725, 0.145, 0.000]], [0.526, [0.725, 0.145, 0.000]], [0.528, [0.728, 0.148, 0.000]], [0.530, [0.728, 0.148, 0.000]], [0.532, [0.730, 0.152, 0.000]], [0.534, [0.730, 0.152, 0.000]], [0.536, [0.733, 0.155, 0.000]], [0.538, [0.733, 0.155, 0.000]], [0.540, [0.736, 0.158, 0.000]], [0.542, [0.736, 0.158, 0.000]], [0.544, [0.738, 0.162, 0.000]], [0.546, [0.738, 0.162, 0.000]], [0.548, [0.741, 0.165, 0.000]], [0.550, [0.741, 0.165, 0.000]], [0.552, [0.744, 0.169, 0.000]], [0.554, [0.744, 0.169, 0.000]], [0.556, [0.746, 0.173, 0.000]], [0.558, [0.746, 0.173, 0.000]], [0.560, [0.749, 0.176, 0.000]], [0.562, [0.749, 0.176, 0.000]], [0.564, [0.751, 0.180, 0.000]], [0.566, [0.751, 0.180, 0.000]], [0.568, [0.754, 0.184, 0.000]], [0.569, [0.754, 0.184, 0.000]], [0.571, [0.757, 0.188, 0.000]], [0.573, [0.757, 0.188, 0.000]], [0.575, [0.759, 0.192, 0.000]], [0.577, [0.759, 0.192, 0.000]], [0.579, [0.762, 0.196, 0.000]], [0.581, [0.762, 0.196, 0.000]], [0.583, [0.764, 0.199, 0.000]], [0.585, [0.764, 0.199, 0.000]], [0.587, [0.767, 0.204, 0.000]], [0.589, [0.767, 0.204, 0.000]], [0.591, [0.770, 0.208, 0.000]], [0.593, [0.770, 0.208, 0.000]], [0.595, [0.772, 0.212, 0.000]], [0.597, [0.772, 0.212, 0.000]], [0.599, [0.775, 0.216, 0.000]], [0.601, [0.775, 0.216, 0.000]], [0.603, [0.777, 0.220, 0.000]], [0.605, [0.777, 0.220, 0.000]], [0.607, [0.780, 0.225, 0.000]], [0.609, [0.780, 0.225, 0.000]], [0.611, [0.782, 0.229, 0.000]], [0.613, [0.782, 0.229, 0.000]], [0.614, [0.785, 0.233, 0.000]], [0.616, [0.785, 0.233, 0.000]], [0.618, [0.787, 0.238, 0.000]], [0.620, [0.787, 0.238, 0.000]], [0.622, [0.790, 0.242, 0.000]], [0.624, [0.790, 0.242, 0.000]], [0.626, [0.792, 0.247, 0.000]], [0.628, [0.792, 0.247, 0.000]], [0.630, [0.795, 0.252, 0.000]], [0.632, [0.795, 0.252, 0.000]], [0.634, [0.797, 0.256, 0.000]], [0.636, [0.797, 0.256, 0.000]], [0.638, [0.800, 0.261, 0.000]], [0.640, [0.800, 0.261, 0.000]], [0.642, [0.802, 0.266, 0.000]], [0.644, [0.802, 0.266, 0.000]], [0.646, [0.804, 0.271, 0.000]], [0.648, [0.804, 0.271, 0.000]], [0.650, [0.807, 0.276, 0.000]], [0.652, [0.807, 0.276, 0.000]], [0.654, [0.809, 0.281, 0.000]], [0.656, [0.809, 0.281, 0.000]], [0.658, [0.812, 0.286, 0.000]], [0.659, [0.812, 0.286, 0.000]], [0.661, [0.814, 0.291, 0.000]], [0.663, [0.814, 0.291, 0.000]], [0.665, [0.816, 0.296, 0.000]], [0.667, [0.816, 0.296, 0.000]], [0.669, [0.819, 0.302, 0.000]], [0.671, [0.819, 0.302, 0.000]], [0.673, [0.821, 0.307, 0.000]], [0.675, [0.821, 0.307, 0.000]], [0.677, [0.824, 0.312, 0.000]], [0.679, [0.824, 0.312, 0.000]], [0.681, [0.826, 0.318, 0.000]], [0.683, [0.826, 0.318, 0.000]], [0.685, [0.828, 0.323, 0.000]], [0.687, [0.828, 0.323, 0.000]], [0.689, [0.831, 0.329, 0.000]], [0.691, [0.831, 0.329, 0.000]], [0.693, [0.833, 0.334, 0.000]], [0.695, [0.833, 0.334, 0.000]], [0.697, [0.835, 0.340, 0.000]], [0.699, [0.835, 0.340, 0.000]], [0.701, [0.838, 0.346, 0.000]], [0.703, [0.838, 0.346, 0.000]], [0.705, [0.840, 0.352, 0.000]], [0.706, [0.840, 0.352, 0.000]], [0.708, [0.842, 0.358, 0.000]], [0.710, [0.842, 0.358, 0.000]], [0.712, [0.845, 0.364, 0.000]], [0.714, [0.845, 0.364, 0.000]], [0.716, [0.847, 0.370, 0.000]], [0.718, [0.847, 0.370, 0.000]], [0.720, [0.849, 0.376, 0.000]], [0.722, [0.849, 0.376, 0.000]], [0.724, [0.852, 0.382, 0.000]], [0.726, [0.852, 0.382, 0.000]], [0.728, [0.854, 0.388, 0.000]], [0.730, [0.854, 0.388, 0.000]], [0.732, [0.856, 0.394, 0.000]], [0.734, [0.856, 0.394, 0.000]], [0.736, [0.859, 0.401, 0.000]], [0.738, [0.859, 0.401, 0.000]], [0.740, [0.861, 0.407, 0.000]], [0.742, [0.861, 0.407, 0.000]], [0.744, [0.863, 0.414, 0.000]], [0.746, [0.863, 0.414, 0.000]], [0.748, [0.865, 0.420, 0.000]], [0.750, [0.865, 0.420, 0.000]], [0.751, [0.868, 0.427, 0.000]], [0.753, [0.868, 0.427, 0.000]], [0.755, [0.870, 0.434, 0.000]], [0.757, [0.870, 0.434, 0.000]], [0.759, [0.872, 0.440, 0.000]], [0.761, [0.872, 0.440, 0.000]], [0.763, [0.874, 0.447, 0.000]], [0.765, [0.874, 0.447, 0.000]], [0.767, [0.877, 0.454, 0.000]], [0.769, [0.877, 0.454, 0.000]], [0.771, [0.879, 0.461, 0.000]], [0.773, [0.879, 0.461, 0.000]], [0.775, [0.881, 0.468, 0.000]], [0.777, [0.881, 0.468, 0.000]], [0.779, [0.883, 0.475, 0.000]], [0.781, [0.883, 0.475, 0.000]], [0.783, [0.886, 0.482, 0.000]], [0.785, [0.886, 0.482, 0.000]], [0.787, [0.888, 0.490, 0.000]], [0.789, [0.888, 0.490, 0.000]], [0.791, [0.890, 0.497, 0.000]], [0.793, [0.890, 0.497, 0.000]], [0.795, [0.892, 0.505, 0.000]], [0.796, [0.892, 0.505, 0.000]], [0.798, [0.894, 0.512, 0.000]], [0.800, [0.894, 0.512, 0.000]], [0.802, [0.897, 0.520, 0.000]], [0.804, [0.897, 0.520, 0.000]], [0.806, [0.899, 0.527, 0.000]], [0.808, [0.899, 0.527, 0.000]], [0.810, [0.901, 0.535, 0.000]], [0.812, [0.901, 0.535, 0.000]], [0.814, [0.903, 0.543, 0.000]], [0.816, [0.903, 0.543, 0.000]], [0.818, [0.905, 0.551, 0.000]], [0.820, [0.905, 0.551, 0.000]], [0.822, [0.907, 0.559, 0.000]], [0.824, [0.907, 0.559, 0.000]], [0.826, [0.910, 0.567, 0.000]], [0.828, [0.910, 0.567, 0.000]], [0.830, [0.912, 0.575, 0.000]], [0.832, [0.912, 0.575, 0.000]], [0.834, [0.914, 0.583, 0.000]], [0.836, [0.914, 0.583, 0.000]], [0.838, [0.916, 0.591, 0.000]], [0.840, [0.916, 0.591, 0.000]], [0.841, [0.918, 0.599, 0.000]], [0.843, [0.918, 0.599, 0.000]], [0.845, [0.920, 0.608, 0.000]], [0.847, [0.920, 0.608, 0.000]], [0.849, [0.922, 0.616, 0.000]], [0.851, [0.922, 0.616, 0.000]], [0.853, [0.925, 0.625, 0.000]], [0.855, [0.925, 0.625, 0.000]], [0.857, [0.927, 0.633, 0.000]], [0.859, [0.927, 0.633, 0.000]], [0.861, [0.929, 0.642, 0.000]], [0.863, [0.929, 0.642, 0.000]], [0.865, [0.931, 0.651, 0.000]], [0.867, [0.931, 0.651, 0.000]], [0.869, [0.933, 0.660, 0.000]], [0.871, [0.933, 0.660, 0.000]], [0.873, [0.935, 0.669, 0.000]], [0.875, [0.935, 0.669, 0.000]], [0.877, [0.937, 0.678, 0.000]], [0.879, [0.937, 0.678, 0.000]], [0.881, [0.939, 0.687, 0.000]], [0.883, [0.939, 0.687, 0.000]], [0.885, [0.941, 0.696, 0.000]], [0.886, [0.941, 0.696, 0.000]], [0.888, [0.944, 0.705, 0.000]], [0.890, [0.944, 0.705, 0.000]], [0.892, [0.946, 0.715, 0.000]], [0.894, [0.946, 0.715, 0.000]], [0.896, [0.948, 0.724, 0.000]], [0.898, [0.948, 0.724, 0.000]], [0.900, [0.950, 0.734, 0.000]], [0.902, [0.950, 0.734, 0.000]], [0.904, [0.952, 0.743, 0.000]], [0.906, [0.952, 0.743, 0.000]], [0.908, [0.954, 0.753, 0.000]], [0.910, [0.954, 0.753, 0.000]], [0.912, [0.956, 0.763, 0.000]], [0.914, [0.956, 0.763, 0.000]], [0.916, [0.958, 0.773, 0.000]], [0.918, [0.958, 0.773, 0.000]], [0.920, [0.960, 0.783, 0.000]], [0.922, [0.960, 0.783, 0.000]], [0.924, [0.962, 0.793, 0.000]], [0.926, [0.962, 0.793, 0.000]], [0.928, [0.964, 0.803, 0.000]], [0.930, [0.964, 0.803, 0.000]], [0.932, [0.966, 0.813, 0.000]], [0.933, [0.966, 0.813, 0.000]], [0.935, [0.968, 0.823, 0.000]], [0.937, [0.968, 0.823, 0.000]], [0.939, [0.970, 0.834, 0.000]], [0.941, [0.970, 0.834, 0.000]], [0.943, [0.972, 0.844, 0.000]], [0.945, [0.972, 0.844, 0.000]], [0.947, [0.974, 0.855, 0.000]], [0.949, [0.974, 0.855, 0.000]], [0.951, [0.976, 0.865, 0.000]], [0.953, [0.976, 0.865, 0.000]], [0.955, [0.978, 0.876, 0.000]], [0.957, [0.978, 0.876, 0.000]], [0.959, [0.980, 0.887, 0.000]], [0.961, [0.980, 0.887, 0.000]], [0.963, [0.982, 0.898, 0.000]], [0.965, [0.982, 0.898, 0.000]], [0.967, [0.984, 0.909, 0.000]], [0.969, [0.984, 0.909, 0.000]], [0.971, [0.986, 0.920, 0.000]], [0.973, [0.986, 0.920, 0.000]], [0.975, [0.988, 0.931, 0.000]], [0.977, [0.988, 0.931, 0.000]], [0.978, [0.990, 0.942, 0.000]], [0.980, [0.990, 0.942, 0.000]], [0.982, [0.992, 0.954, 0.000]], [0.984, [0.992, 0.954, 0.000]], [0.986, [0.994, 0.965, 0.000]], [0.988, [0.994, 0.965, 0.000]], [0.990, [0.996, 0.977, 0.000]], [0.992, [0.996, 0.977, 0.000]], [0.994, [0.998, 0.988, 0.000]], [0.996, [0.998, 0.988, 0.000]], [0.998, [1.000, 1.000, 0.000]], [1.000, [1.000, 1.000, 0.000]]]; +var gnuplot2 = [[0.000, [0.000, 0.000, 0.000]], [0.002, [0.000, 0.000, 0.000]], [0.004, [0.000, 0.000, 0.016]], [0.006, [0.000, 0.000, 0.016]], [0.008, [0.000, 0.000, 0.031]], [0.010, [0.000, 0.000, 0.031]], [0.012, [0.000, 0.000, 0.047]], [0.014, [0.000, 0.000, 0.047]], [0.016, [0.000, 0.000, 0.063]], [0.018, [0.000, 0.000, 0.063]], [0.020, [0.000, 0.000, 0.078]], [0.022, [0.000, 0.000, 0.078]], [0.023, [0.000, 0.000, 0.094]], [0.025, [0.000, 0.000, 0.094]], [0.027, [0.000, 0.000, 0.110]], [0.029, [0.000, 0.000, 0.110]], [0.031, [0.000, 0.000, 0.125]], [0.033, [0.000, 0.000, 0.125]], [0.035, [0.000, 0.000, 0.141]], [0.037, [0.000, 0.000, 0.141]], [0.039, [0.000, 0.000, 0.157]], [0.041, [0.000, 0.000, 0.157]], [0.043, [0.000, 0.000, 0.173]], [0.045, [0.000, 0.000, 0.173]], [0.047, [0.000, 0.000, 0.188]], [0.049, [0.000, 0.000, 0.188]], [0.051, [0.000, 0.000, 0.204]], [0.053, [0.000, 0.000, 0.204]], [0.055, [0.000, 0.000, 0.220]], [0.057, [0.000, 0.000, 0.220]], [0.059, [0.000, 0.000, 0.235]], [0.061, [0.000, 0.000, 0.235]], [0.063, [0.000, 0.000, 0.251]], [0.065, [0.000, 0.000, 0.251]], [0.067, [0.000, 0.000, 0.267]], [0.068, [0.000, 0.000, 0.267]], [0.070, [0.000, 0.000, 0.282]], [0.072, [0.000, 0.000, 0.282]], [0.074, [0.000, 0.000, 0.298]], [0.076, [0.000, 0.000, 0.298]], [0.078, [0.000, 0.000, 0.314]], [0.080, [0.000, 0.000, 0.314]], [0.082, [0.000, 0.000, 0.329]], [0.084, [0.000, 0.000, 0.329]], [0.086, [0.000, 0.000, 0.345]], [0.088, [0.000, 0.000, 0.345]], [0.090, [0.000, 0.000, 0.361]], [0.092, [0.000, 0.000, 0.361]], [0.094, [0.000, 0.000, 0.376]], [0.096, [0.000, 0.000, 0.376]], [0.098, [0.000, 0.000, 0.392]], [0.100, [0.000, 0.000, 0.392]], [0.102, [0.000, 0.000, 0.408]], [0.104, [0.000, 0.000, 0.408]], [0.106, [0.000, 0.000, 0.424]], [0.108, [0.000, 0.000, 0.424]], [0.110, [0.000, 0.000, 0.439]], [0.112, [0.000, 0.000, 0.439]], [0.114, [0.000, 0.000, 0.455]], [0.115, [0.000, 0.000, 0.455]], [0.117, [0.000, 0.000, 0.471]], [0.119, [0.000, 0.000, 0.471]], [0.121, [0.000, 0.000, 0.486]], [0.123, [0.000, 0.000, 0.486]], [0.125, [0.000, 0.000, 0.502]], [0.127, [0.000, 0.000, 0.502]], [0.129, [0.000, 0.000, 0.518]], [0.131, [0.000, 0.000, 0.518]], [0.133, [0.000, 0.000, 0.533]], [0.135, [0.000, 0.000, 0.533]], [0.137, [0.000, 0.000, 0.549]], [0.139, [0.000, 0.000, 0.549]], [0.141, [0.000, 0.000, 0.565]], [0.143, [0.000, 0.000, 0.565]], [0.145, [0.000, 0.000, 0.580]], [0.147, [0.000, 0.000, 0.580]], [0.149, [0.000, 0.000, 0.596]], [0.151, [0.000, 0.000, 0.596]], [0.153, [0.000, 0.000, 0.612]], [0.155, [0.000, 0.000, 0.612]], [0.157, [0.000, 0.000, 0.627]], [0.159, [0.000, 0.000, 0.627]], [0.160, [0.000, 0.000, 0.643]], [0.162, [0.000, 0.000, 0.643]], [0.164, [0.000, 0.000, 0.659]], [0.166, [0.000, 0.000, 0.659]], [0.168, [0.000, 0.000, 0.675]], [0.170, [0.000, 0.000, 0.675]], [0.172, [0.000, 0.000, 0.690]], [0.174, [0.000, 0.000, 0.690]], [0.176, [0.000, 0.000, 0.706]], [0.178, [0.000, 0.000, 0.706]], [0.180, [0.000, 0.000, 0.722]], [0.182, [0.000, 0.000, 0.722]], [0.184, [0.000, 0.000, 0.737]], [0.186, [0.000, 0.000, 0.737]], [0.188, [0.000, 0.000, 0.753]], [0.190, [0.000, 0.000, 0.753]], [0.192, [0.000, 0.000, 0.769]], [0.194, [0.000, 0.000, 0.769]], [0.196, [0.000, 0.000, 0.784]], [0.198, [0.000, 0.000, 0.784]], [0.200, [0.000, 0.000, 0.800]], [0.202, [0.000, 0.000, 0.800]], [0.204, [0.000, 0.000, 0.816]], [0.205, [0.000, 0.000, 0.816]], [0.207, [0.000, 0.000, 0.831]], [0.209, [0.000, 0.000, 0.831]], [0.211, [0.000, 0.000, 0.847]], [0.213, [0.000, 0.000, 0.847]], [0.215, [0.000, 0.000, 0.863]], [0.217, [0.000, 0.000, 0.863]], [0.219, [0.000, 0.000, 0.878]], [0.221, [0.000, 0.000, 0.878]], [0.223, [0.000, 0.000, 0.894]], [0.225, [0.000, 0.000, 0.894]], [0.227, [0.000, 0.000, 0.910]], [0.229, [0.000, 0.000, 0.910]], [0.231, [0.000, 0.000, 0.925]], [0.233, [0.000, 0.000, 0.925]], [0.235, [0.000, 0.000, 0.941]], [0.237, [0.000, 0.000, 0.941]], [0.239, [0.000, 0.000, 0.957]], [0.241, [0.000, 0.000, 0.957]], [0.243, [0.000, 0.000, 0.973]], [0.245, [0.000, 0.000, 0.973]], [0.247, [0.000, 0.000, 0.988]], [0.249, [0.000, 0.000, 0.988]], [0.250, [0.003, 0.000, 1.000]], [0.252, [0.003, 0.000, 1.000]], [0.254, [0.015, 0.000, 1.000]], [0.256, [0.015, 0.000, 1.000]], [0.258, [0.028, 0.000, 1.000]], [0.260, [0.028, 0.000, 1.000]], [0.262, [0.040, 0.000, 1.000]], [0.264, [0.040, 0.000, 1.000]], [0.266, [0.052, 0.000, 1.000]], [0.268, [0.052, 0.000, 1.000]], [0.270, [0.064, 0.000, 1.000]], [0.272, [0.064, 0.000, 1.000]], [0.274, [0.077, 0.000, 1.000]], [0.276, [0.077, 0.000, 1.000]], [0.278, [0.089, 0.000, 1.000]], [0.280, [0.089, 0.000, 1.000]], [0.282, [0.101, 0.000, 1.000]], [0.284, [0.101, 0.000, 1.000]], [0.286, [0.113, 0.000, 1.000]], [0.288, [0.113, 0.000, 1.000]], [0.290, [0.126, 0.000, 1.000]], [0.292, [0.126, 0.000, 1.000]], [0.294, [0.138, 0.000, 1.000]], [0.295, [0.138, 0.000, 1.000]], [0.297, [0.150, 0.000, 1.000]], [0.299, [0.150, 0.000, 1.000]], [0.301, [0.162, 0.000, 1.000]], [0.303, [0.162, 0.000, 1.000]], [0.305, [0.175, 0.000, 1.000]], [0.307, [0.175, 0.000, 1.000]], [0.309, [0.187, 0.000, 1.000]], [0.311, [0.187, 0.000, 1.000]], [0.313, [0.199, 0.000, 1.000]], [0.315, [0.199, 0.000, 1.000]], [0.317, [0.211, 0.000, 1.000]], [0.319, [0.211, 0.000, 1.000]], [0.321, [0.224, 0.000, 1.000]], [0.323, [0.224, 0.000, 1.000]], [0.325, [0.236, 0.000, 1.000]], [0.327, [0.236, 0.000, 1.000]], [0.329, [0.248, 0.000, 1.000]], [0.331, [0.248, 0.000, 1.000]], [0.333, [0.260, 0.000, 1.000]], [0.335, [0.260, 0.000, 1.000]], [0.337, [0.273, 0.000, 1.000]], [0.339, [0.273, 0.000, 1.000]], [0.341, [0.285, 0.000, 1.000]], [0.342, [0.285, 0.000, 1.000]], [0.344, [0.297, 0.000, 1.000]], [0.346, [0.297, 0.000, 1.000]], [0.348, [0.309, 0.000, 1.000]], [0.350, [0.309, 0.000, 1.000]], [0.352, [0.322, 0.000, 1.000]], [0.354, [0.322, 0.000, 1.000]], [0.356, [0.334, 0.000, 1.000]], [0.358, [0.334, 0.000, 1.000]], [0.360, [0.346, 0.000, 1.000]], [0.362, [0.346, 0.000, 1.000]], [0.364, [0.358, 0.000, 1.000]], [0.366, [0.358, 0.000, 1.000]], [0.368, [0.371, 0.000, 1.000]], [0.370, [0.371, 0.000, 1.000]], [0.372, [0.383, 0.000, 1.000]], [0.374, [0.383, 0.000, 1.000]], [0.376, [0.395, 0.000, 1.000]], [0.378, [0.395, 0.000, 1.000]], [0.380, [0.407, 0.000, 1.000]], [0.382, [0.407, 0.000, 1.000]], [0.384, [0.420, 0.000, 1.000]], [0.386, [0.420, 0.000, 1.000]], [0.387, [0.432, 0.000, 1.000]], [0.389, [0.432, 0.000, 1.000]], [0.391, [0.444, 0.000, 1.000]], [0.393, [0.444, 0.000, 1.000]], [0.395, [0.456, 0.000, 1.000]], [0.397, [0.456, 0.000, 1.000]], [0.399, [0.469, 0.000, 1.000]], [0.401, [0.469, 0.000, 1.000]], [0.403, [0.481, 0.000, 1.000]], [0.405, [0.481, 0.000, 1.000]], [0.407, [0.493, 0.000, 1.000]], [0.409, [0.493, 0.000, 1.000]], [0.411, [0.506, 0.000, 1.000]], [0.413, [0.506, 0.000, 1.000]], [0.415, [0.518, 0.000, 1.000]], [0.417, [0.518, 0.000, 1.000]], [0.419, [0.530, 0.000, 1.000]], [0.421, [0.530, 0.000, 1.000]], [0.423, [0.542, 0.007, 0.993]], [0.425, [0.542, 0.007, 0.993]], [0.427, [0.555, 0.015, 0.985]], [0.429, [0.555, 0.015, 0.985]], [0.431, [0.567, 0.023, 0.977]], [0.432, [0.567, 0.023, 0.977]], [0.434, [0.579, 0.031, 0.969]], [0.436, [0.579, 0.031, 0.969]], [0.438, [0.591, 0.038, 0.962]], [0.440, [0.591, 0.038, 0.962]], [0.442, [0.604, 0.046, 0.954]], [0.444, [0.604, 0.046, 0.954]], [0.446, [0.616, 0.054, 0.946]], [0.448, [0.616, 0.054, 0.946]], [0.450, [0.628, 0.062, 0.938]], [0.452, [0.628, 0.062, 0.938]], [0.454, [0.640, 0.070, 0.930]], [0.456, [0.640, 0.070, 0.930]], [0.458, [0.653, 0.078, 0.922]], [0.460, [0.653, 0.078, 0.922]], [0.462, [0.665, 0.085, 0.915]], [0.464, [0.665, 0.085, 0.915]], [0.466, [0.677, 0.093, 0.907]], [0.468, [0.677, 0.093, 0.907]], [0.470, [0.689, 0.101, 0.899]], [0.472, [0.689, 0.101, 0.899]], [0.474, [0.702, 0.109, 0.891]], [0.476, [0.702, 0.109, 0.891]], [0.477, [0.714, 0.117, 0.883]], [0.479, [0.714, 0.117, 0.883]], [0.481, [0.726, 0.125, 0.875]], [0.483, [0.726, 0.125, 0.875]], [0.485, [0.738, 0.133, 0.867]], [0.487, [0.738, 0.133, 0.867]], [0.489, [0.751, 0.140, 0.860]], [0.491, [0.751, 0.140, 0.860]], [0.493, [0.763, 0.148, 0.852]], [0.495, [0.763, 0.148, 0.852]], [0.497, [0.775, 0.156, 0.844]], [0.499, [0.775, 0.156, 0.844]], [0.501, [0.787, 0.164, 0.836]], [0.503, [0.787, 0.164, 0.836]], [0.505, [0.800, 0.172, 0.828]], [0.507, [0.800, 0.172, 0.828]], [0.509, [0.812, 0.180, 0.820]], [0.511, [0.812, 0.180, 0.820]], [0.513, [0.824, 0.187, 0.813]], [0.515, [0.824, 0.187, 0.813]], [0.517, [0.836, 0.195, 0.805]], [0.519, [0.836, 0.195, 0.805]], [0.521, [0.849, 0.203, 0.797]], [0.523, [0.849, 0.203, 0.797]], [0.524, [0.861, 0.211, 0.789]], [0.526, [0.861, 0.211, 0.789]], [0.528, [0.873, 0.219, 0.781]], [0.530, [0.873, 0.219, 0.781]], [0.532, [0.885, 0.227, 0.773]], [0.534, [0.885, 0.227, 0.773]], [0.536, [0.898, 0.235, 0.765]], [0.538, [0.898, 0.235, 0.765]], [0.540, [0.910, 0.242, 0.758]], [0.542, [0.910, 0.242, 0.758]], [0.544, [0.922, 0.250, 0.750]], [0.546, [0.922, 0.250, 0.750]], [0.548, [0.934, 0.258, 0.742]], [0.550, [0.934, 0.258, 0.742]], [0.552, [0.947, 0.266, 0.734]], [0.554, [0.947, 0.266, 0.734]], [0.556, [0.959, 0.274, 0.726]], [0.558, [0.959, 0.274, 0.726]], [0.560, [0.971, 0.282, 0.718]], [0.562, [0.971, 0.282, 0.718]], [0.564, [0.983, 0.289, 0.711]], [0.566, [0.983, 0.289, 0.711]], [0.568, [0.996, 0.297, 0.703]], [0.569, [0.996, 0.297, 0.703]], [0.571, [1.000, 0.305, 0.695]], [0.573, [1.000, 0.305, 0.695]], [0.575, [1.000, 0.313, 0.687]], [0.577, [1.000, 0.313, 0.687]], [0.579, [1.000, 0.321, 0.679]], [0.581, [1.000, 0.321, 0.679]], [0.583, [1.000, 0.329, 0.671]], [0.585, [1.000, 0.329, 0.671]], [0.587, [1.000, 0.336, 0.664]], [0.589, [1.000, 0.336, 0.664]], [0.591, [1.000, 0.344, 0.656]], [0.593, [1.000, 0.344, 0.656]], [0.595, [1.000, 0.352, 0.648]], [0.597, [1.000, 0.352, 0.648]], [0.599, [1.000, 0.360, 0.640]], [0.601, [1.000, 0.360, 0.640]], [0.603, [1.000, 0.368, 0.632]], [0.605, [1.000, 0.368, 0.632]], [0.607, [1.000, 0.376, 0.624]], [0.609, [1.000, 0.376, 0.624]], [0.611, [1.000, 0.384, 0.616]], [0.613, [1.000, 0.384, 0.616]], [0.614, [1.000, 0.391, 0.609]], [0.616, [1.000, 0.391, 0.609]], [0.618, [1.000, 0.399, 0.601]], [0.620, [1.000, 0.399, 0.601]], [0.622, [1.000, 0.407, 0.593]], [0.624, [1.000, 0.407, 0.593]], [0.626, [1.000, 0.415, 0.585]], [0.628, [1.000, 0.415, 0.585]], [0.630, [1.000, 0.423, 0.577]], [0.632, [1.000, 0.423, 0.577]], [0.634, [1.000, 0.431, 0.569]], [0.636, [1.000, 0.431, 0.569]], [0.638, [1.000, 0.438, 0.562]], [0.640, [1.000, 0.438, 0.562]], [0.642, [1.000, 0.446, 0.554]], [0.644, [1.000, 0.446, 0.554]], [0.646, [1.000, 0.454, 0.546]], [0.648, [1.000, 0.454, 0.546]], [0.650, [1.000, 0.462, 0.538]], [0.652, [1.000, 0.462, 0.538]], [0.654, [1.000, 0.470, 0.530]], [0.656, [1.000, 0.470, 0.530]], [0.658, [1.000, 0.478, 0.522]], [0.659, [1.000, 0.478, 0.522]], [0.661, [1.000, 0.485, 0.515]], [0.663, [1.000, 0.485, 0.515]], [0.665, [1.000, 0.493, 0.507]], [0.667, [1.000, 0.493, 0.507]], [0.669, [1.000, 0.501, 0.499]], [0.671, [1.000, 0.501, 0.499]], [0.673, [1.000, 0.509, 0.491]], [0.675, [1.000, 0.509, 0.491]], [0.677, [1.000, 0.517, 0.483]], [0.679, [1.000, 0.517, 0.483]], [0.681, [1.000, 0.525, 0.475]], [0.683, [1.000, 0.525, 0.475]], [0.685, [1.000, 0.533, 0.467]], [0.687, [1.000, 0.533, 0.467]], [0.689, [1.000, 0.540, 0.460]], [0.691, [1.000, 0.540, 0.460]], [0.693, [1.000, 0.548, 0.452]], [0.695, [1.000, 0.548, 0.452]], [0.697, [1.000, 0.556, 0.444]], [0.699, [1.000, 0.556, 0.444]], [0.701, [1.000, 0.564, 0.436]], [0.703, [1.000, 0.564, 0.436]], [0.705, [1.000, 0.572, 0.428]], [0.706, [1.000, 0.572, 0.428]], [0.708, [1.000, 0.580, 0.420]], [0.710, [1.000, 0.580, 0.420]], [0.712, [1.000, 0.587, 0.413]], [0.714, [1.000, 0.587, 0.413]], [0.716, [1.000, 0.595, 0.405]], [0.718, [1.000, 0.595, 0.405]], [0.720, [1.000, 0.603, 0.397]], [0.722, [1.000, 0.603, 0.397]], [0.724, [1.000, 0.611, 0.389]], [0.726, [1.000, 0.611, 0.389]], [0.728, [1.000, 0.619, 0.381]], [0.730, [1.000, 0.619, 0.381]], [0.732, [1.000, 0.627, 0.373]], [0.734, [1.000, 0.627, 0.373]], [0.736, [1.000, 0.635, 0.365]], [0.738, [1.000, 0.635, 0.365]], [0.740, [1.000, 0.642, 0.358]], [0.742, [1.000, 0.642, 0.358]], [0.744, [1.000, 0.650, 0.350]], [0.746, [1.000, 0.650, 0.350]], [0.748, [1.000, 0.658, 0.342]], [0.750, [1.000, 0.658, 0.342]], [0.751, [1.000, 0.666, 0.334]], [0.753, [1.000, 0.666, 0.334]], [0.755, [1.000, 0.674, 0.326]], [0.757, [1.000, 0.674, 0.326]], [0.759, [1.000, 0.682, 0.318]], [0.761, [1.000, 0.682, 0.318]], [0.763, [1.000, 0.689, 0.311]], [0.765, [1.000, 0.689, 0.311]], [0.767, [1.000, 0.697, 0.303]], [0.769, [1.000, 0.697, 0.303]], [0.771, [1.000, 0.705, 0.295]], [0.773, [1.000, 0.705, 0.295]], [0.775, [1.000, 0.713, 0.287]], [0.777, [1.000, 0.713, 0.287]], [0.779, [1.000, 0.721, 0.279]], [0.781, [1.000, 0.721, 0.279]], [0.783, [1.000, 0.729, 0.271]], [0.785, [1.000, 0.729, 0.271]], [0.787, [1.000, 0.736, 0.264]], [0.789, [1.000, 0.736, 0.264]], [0.791, [1.000, 0.744, 0.256]], [0.793, [1.000, 0.744, 0.256]], [0.795, [1.000, 0.752, 0.248]], [0.796, [1.000, 0.752, 0.248]], [0.798, [1.000, 0.760, 0.240]], [0.800, [1.000, 0.760, 0.240]], [0.802, [1.000, 0.768, 0.232]], [0.804, [1.000, 0.768, 0.232]], [0.806, [1.000, 0.776, 0.224]], [0.808, [1.000, 0.776, 0.224]], [0.810, [1.000, 0.784, 0.216]], [0.812, [1.000, 0.784, 0.216]], [0.814, [1.000, 0.791, 0.209]], [0.816, [1.000, 0.791, 0.209]], [0.818, [1.000, 0.799, 0.201]], [0.820, [1.000, 0.799, 0.201]], [0.822, [1.000, 0.807, 0.193]], [0.824, [1.000, 0.807, 0.193]], [0.826, [1.000, 0.815, 0.185]], [0.828, [1.000, 0.815, 0.185]], [0.830, [1.000, 0.823, 0.177]], [0.832, [1.000, 0.823, 0.177]], [0.834, [1.000, 0.831, 0.169]], [0.836, [1.000, 0.831, 0.169]], [0.838, [1.000, 0.838, 0.162]], [0.840, [1.000, 0.838, 0.162]], [0.841, [1.000, 0.846, 0.154]], [0.843, [1.000, 0.846, 0.154]], [0.845, [1.000, 0.854, 0.146]], [0.847, [1.000, 0.854, 0.146]], [0.849, [1.000, 0.862, 0.138]], [0.851, [1.000, 0.862, 0.138]], [0.853, [1.000, 0.870, 0.130]], [0.855, [1.000, 0.870, 0.130]], [0.857, [1.000, 0.878, 0.122]], [0.859, [1.000, 0.878, 0.122]], [0.861, [1.000, 0.885, 0.115]], [0.863, [1.000, 0.885, 0.115]], [0.865, [1.000, 0.893, 0.107]], [0.867, [1.000, 0.893, 0.107]], [0.869, [1.000, 0.901, 0.099]], [0.871, [1.000, 0.901, 0.099]], [0.873, [1.000, 0.909, 0.091]], [0.875, [1.000, 0.909, 0.091]], [0.877, [1.000, 0.917, 0.083]], [0.879, [1.000, 0.917, 0.083]], [0.881, [1.000, 0.925, 0.075]], [0.883, [1.000, 0.925, 0.075]], [0.885, [1.000, 0.933, 0.067]], [0.886, [1.000, 0.933, 0.067]], [0.888, [1.000, 0.940, 0.060]], [0.890, [1.000, 0.940, 0.060]], [0.892, [1.000, 0.948, 0.052]], [0.894, [1.000, 0.948, 0.052]], [0.896, [1.000, 0.956, 0.044]], [0.898, [1.000, 0.956, 0.044]], [0.900, [1.000, 0.964, 0.036]], [0.902, [1.000, 0.964, 0.036]], [0.904, [1.000, 0.972, 0.028]], [0.906, [1.000, 0.972, 0.028]], [0.908, [1.000, 0.980, 0.020]], [0.910, [1.000, 0.980, 0.020]], [0.912, [1.000, 0.987, 0.013]], [0.914, [1.000, 0.987, 0.013]], [0.916, [1.000, 0.995, 0.005]], [0.918, [1.000, 0.995, 0.005]], [0.920, [1.000, 1.000, 0.020]], [0.922, [1.000, 1.000, 0.020]], [0.924, [1.000, 1.000, 0.069]], [0.926, [1.000, 1.000, 0.069]], [0.928, [1.000, 1.000, 0.118]], [0.930, [1.000, 1.000, 0.118]], [0.932, [1.000, 1.000, 0.167]], [0.933, [1.000, 1.000, 0.167]], [0.935, [1.000, 1.000, 0.216]], [0.937, [1.000, 1.000, 0.216]], [0.939, [1.000, 1.000, 0.265]], [0.941, [1.000, 1.000, 0.265]], [0.943, [1.000, 1.000, 0.314]], [0.945, [1.000, 1.000, 0.314]], [0.947, [1.000, 1.000, 0.363]], [0.949, [1.000, 1.000, 0.363]], [0.951, [1.000, 1.000, 0.412]], [0.953, [1.000, 1.000, 0.412]], [0.955, [1.000, 1.000, 0.461]], [0.957, [1.000, 1.000, 0.461]], [0.959, [1.000, 1.000, 0.510]], [0.961, [1.000, 1.000, 0.510]], [0.963, [1.000, 1.000, 0.559]], [0.965, [1.000, 1.000, 0.559]], [0.967, [1.000, 1.000, 0.608]], [0.969, [1.000, 1.000, 0.608]], [0.971, [1.000, 1.000, 0.657]], [0.973, [1.000, 1.000, 0.657]], [0.975, [1.000, 1.000, 0.706]], [0.977, [1.000, 1.000, 0.706]], [0.978, [1.000, 1.000, 0.755]], [0.980, [1.000, 1.000, 0.755]], [0.982, [1.000, 1.000, 0.804]], [0.984, [1.000, 1.000, 0.804]], [0.986, [1.000, 1.000, 0.853]], [0.988, [1.000, 1.000, 0.853]], [0.990, [1.000, 1.000, 0.902]], [0.992, [1.000, 1.000, 0.902]], [0.994, [1.000, 1.000, 0.951]], [0.996, [1.000, 1.000, 0.951]], [0.998, [1.000, 1.000, 1.000]], [1.000, [1.000, 1.000, 1.000]]]; +var hsv = [[0.000, [1.000, 0.000, 0.000]], [0.002, [1.000, 0.000, 0.000]], [0.004, [1.000, 0.023, 0.000]], [0.006, [1.000, 0.023, 0.000]], [0.008, [1.000, 0.046, 0.000]], [0.010, [1.000, 0.046, 0.000]], [0.012, [1.000, 0.069, 0.000]], [0.014, [1.000, 0.069, 0.000]], [0.016, [1.000, 0.093, 0.000]], [0.018, [1.000, 0.093, 0.000]], [0.020, [1.000, 0.116, 0.000]], [0.022, [1.000, 0.116, 0.000]], [0.023, [1.000, 0.139, 0.000]], [0.025, [1.000, 0.139, 0.000]], [0.027, [1.000, 0.162, 0.000]], [0.029, [1.000, 0.162, 0.000]], [0.031, [1.000, 0.185, 0.000]], [0.033, [1.000, 0.185, 0.000]], [0.035, [1.000, 0.208, 0.000]], [0.037, [1.000, 0.208, 0.000]], [0.039, [1.000, 0.232, 0.000]], [0.041, [1.000, 0.232, 0.000]], [0.043, [1.000, 0.255, 0.000]], [0.045, [1.000, 0.255, 0.000]], [0.047, [1.000, 0.278, 0.000]], [0.049, [1.000, 0.278, 0.000]], [0.051, [1.000, 0.301, 0.000]], [0.053, [1.000, 0.301, 0.000]], [0.055, [1.000, 0.324, 0.000]], [0.057, [1.000, 0.324, 0.000]], [0.059, [1.000, 0.347, 0.000]], [0.061, [1.000, 0.347, 0.000]], [0.063, [1.000, 0.371, 0.000]], [0.065, [1.000, 0.371, 0.000]], [0.067, [1.000, 0.394, 0.000]], [0.068, [1.000, 0.394, 0.000]], [0.070, [1.000, 0.417, 0.000]], [0.072, [1.000, 0.417, 0.000]], [0.074, [1.000, 0.440, 0.000]], [0.076, [1.000, 0.440, 0.000]], [0.078, [1.000, 0.463, 0.000]], [0.080, [1.000, 0.463, 0.000]], [0.082, [1.000, 0.486, 0.000]], [0.084, [1.000, 0.486, 0.000]], [0.086, [1.000, 0.510, 0.000]], [0.088, [1.000, 0.510, 0.000]], [0.090, [1.000, 0.533, 0.000]], [0.092, [1.000, 0.533, 0.000]], [0.094, [1.000, 0.556, 0.000]], [0.096, [1.000, 0.556, 0.000]], [0.098, [1.000, 0.579, 0.000]], [0.100, [1.000, 0.579, 0.000]], [0.102, [1.000, 0.602, 0.000]], [0.104, [1.000, 0.602, 0.000]], [0.106, [1.000, 0.625, 0.000]], [0.108, [1.000, 0.625, 0.000]], [0.110, [1.000, 0.649, 0.000]], [0.112, [1.000, 0.649, 0.000]], [0.114, [1.000, 0.672, 0.000]], [0.115, [1.000, 0.672, 0.000]], [0.117, [1.000, 0.695, 0.000]], [0.119, [1.000, 0.695, 0.000]], [0.121, [1.000, 0.718, 0.000]], [0.123, [1.000, 0.718, 0.000]], [0.125, [1.000, 0.741, 0.000]], [0.127, [1.000, 0.741, 0.000]], [0.129, [1.000, 0.764, 0.000]], [0.131, [1.000, 0.764, 0.000]], [0.133, [1.000, 0.788, 0.000]], [0.135, [1.000, 0.788, 0.000]], [0.137, [1.000, 0.811, 0.000]], [0.139, [1.000, 0.811, 0.000]], [0.141, [1.000, 0.834, 0.000]], [0.143, [1.000, 0.834, 0.000]], [0.145, [1.000, 0.857, 0.000]], [0.147, [1.000, 0.857, 0.000]], [0.149, [1.000, 0.880, 0.000]], [0.151, [1.000, 0.880, 0.000]], [0.153, [1.000, 0.903, 0.000]], [0.155, [1.000, 0.903, 0.000]], [0.157, [1.000, 0.926, 0.000]], [0.159, [1.000, 0.926, 0.000]], [0.160, [0.996, 0.946, 0.000]], [0.162, [0.996, 0.946, 0.000]], [0.164, [0.988, 0.961, 0.000]], [0.166, [0.988, 0.961, 0.000]], [0.168, [0.981, 0.976, 0.000]], [0.170, [0.981, 0.976, 0.000]], [0.172, [0.973, 0.992, 0.000]], [0.174, [0.973, 0.992, 0.000]], [0.176, [0.958, 1.000, 0.000]], [0.178, [0.958, 1.000, 0.000]], [0.180, [0.935, 1.000, 0.000]], [0.182, [0.935, 1.000, 0.000]], [0.184, [0.911, 1.000, 0.000]], [0.186, [0.911, 1.000, 0.000]], [0.188, [0.888, 1.000, 0.000]], [0.190, [0.888, 1.000, 0.000]], [0.192, [0.865, 1.000, 0.000]], [0.194, [0.865, 1.000, 0.000]], [0.196, [0.842, 1.000, 0.000]], [0.198, [0.842, 1.000, 0.000]], [0.200, [0.819, 1.000, 0.000]], [0.202, [0.819, 1.000, 0.000]], [0.204, [0.796, 1.000, 0.000]], [0.205, [0.796, 1.000, 0.000]], [0.207, [0.772, 1.000, 0.000]], [0.209, [0.772, 1.000, 0.000]], [0.211, [0.749, 1.000, 0.000]], [0.213, [0.749, 1.000, 0.000]], [0.215, [0.726, 1.000, 0.000]], [0.217, [0.726, 1.000, 0.000]], [0.219, [0.703, 1.000, 0.000]], [0.221, [0.703, 1.000, 0.000]], [0.223, [0.680, 1.000, 0.000]], [0.225, [0.680, 1.000, 0.000]], [0.227, [0.657, 1.000, 0.000]], [0.229, [0.657, 1.000, 0.000]], [0.231, [0.633, 1.000, 0.000]], [0.233, [0.633, 1.000, 0.000]], [0.235, [0.610, 1.000, 0.000]], [0.237, [0.610, 1.000, 0.000]], [0.239, [0.587, 1.000, 0.000]], [0.241, [0.587, 1.000, 0.000]], [0.243, [0.564, 1.000, 0.000]], [0.245, [0.564, 1.000, 0.000]], [0.247, [0.541, 1.000, 0.000]], [0.249, [0.541, 1.000, 0.000]], [0.250, [0.518, 1.000, 0.000]], [0.252, [0.518, 1.000, 0.000]], [0.254, [0.494, 1.000, 0.000]], [0.256, [0.494, 1.000, 0.000]], [0.258, [0.471, 1.000, 0.000]], [0.260, [0.471, 1.000, 0.000]], [0.262, [0.448, 1.000, 0.000]], [0.264, [0.448, 1.000, 0.000]], [0.266, [0.425, 1.000, 0.000]], [0.268, [0.425, 1.000, 0.000]], [0.270, [0.402, 1.000, 0.000]], [0.272, [0.402, 1.000, 0.000]], [0.274, [0.379, 1.000, 0.000]], [0.276, [0.379, 1.000, 0.000]], [0.278, [0.356, 1.000, 0.000]], [0.280, [0.356, 1.000, 0.000]], [0.282, [0.332, 1.000, 0.000]], [0.284, [0.332, 1.000, 0.000]], [0.286, [0.309, 1.000, 0.000]], [0.288, [0.309, 1.000, 0.000]], [0.290, [0.286, 1.000, 0.000]], [0.292, [0.286, 1.000, 0.000]], [0.294, [0.263, 1.000, 0.000]], [0.295, [0.263, 1.000, 0.000]], [0.297, [0.240, 1.000, 0.000]], [0.299, [0.240, 1.000, 0.000]], [0.301, [0.217, 1.000, 0.000]], [0.303, [0.217, 1.000, 0.000]], [0.305, [0.193, 1.000, 0.000]], [0.307, [0.193, 1.000, 0.000]], [0.309, [0.170, 1.000, 0.000]], [0.311, [0.170, 1.000, 0.000]], [0.313, [0.147, 1.000, 0.000]], [0.315, [0.147, 1.000, 0.000]], [0.317, [0.124, 1.000, 0.000]], [0.319, [0.124, 1.000, 0.000]], [0.321, [0.101, 1.000, 0.000]], [0.323, [0.101, 1.000, 0.000]], [0.325, [0.078, 1.000, 0.000]], [0.327, [0.078, 1.000, 0.000]], [0.329, [0.054, 1.000, 0.000]], [0.331, [0.054, 1.000, 0.000]], [0.333, [0.031, 1.000, 0.000]], [0.335, [0.031, 1.000, 0.000]], [0.337, [0.024, 1.000, 0.015]], [0.339, [0.024, 1.000, 0.015]], [0.341, [0.016, 1.000, 0.031]], [0.342, [0.016, 1.000, 0.031]], [0.344, [0.008, 1.000, 0.046]], [0.346, [0.008, 1.000, 0.046]], [0.348, [0.000, 1.000, 0.062]], [0.350, [0.000, 1.000, 0.062]], [0.352, [0.000, 1.000, 0.085]], [0.354, [0.000, 1.000, 0.085]], [0.356, [0.000, 1.000, 0.108]], [0.358, [0.000, 1.000, 0.108]], [0.360, [0.000, 1.000, 0.131]], [0.362, [0.000, 1.000, 0.131]], [0.364, [0.000, 1.000, 0.154]], [0.366, [0.000, 1.000, 0.154]], [0.368, [0.000, 1.000, 0.177]], [0.370, [0.000, 1.000, 0.177]], [0.372, [0.000, 1.000, 0.200]], [0.374, [0.000, 1.000, 0.200]], [0.376, [0.000, 1.000, 0.224]], [0.378, [0.000, 1.000, 0.224]], [0.380, [0.000, 1.000, 0.247]], [0.382, [0.000, 1.000, 0.247]], [0.384, [0.000, 1.000, 0.270]], [0.386, [0.000, 1.000, 0.270]], [0.387, [0.000, 1.000, 0.293]], [0.389, [0.000, 1.000, 0.293]], [0.391, [0.000, 1.000, 0.316]], [0.393, [0.000, 1.000, 0.316]], [0.395, [0.000, 1.000, 0.339]], [0.397, [0.000, 1.000, 0.339]], [0.399, [0.000, 1.000, 0.363]], [0.401, [0.000, 1.000, 0.363]], [0.403, [0.000, 1.000, 0.386]], [0.405, [0.000, 1.000, 0.386]], [0.407, [0.000, 1.000, 0.409]], [0.409, [0.000, 1.000, 0.409]], [0.411, [0.000, 1.000, 0.432]], [0.413, [0.000, 1.000, 0.432]], [0.415, [0.000, 1.000, 0.455]], [0.417, [0.000, 1.000, 0.455]], [0.419, [0.000, 1.000, 0.478]], [0.421, [0.000, 1.000, 0.478]], [0.423, [0.000, 1.000, 0.501]], [0.425, [0.000, 1.000, 0.501]], [0.427, [0.000, 1.000, 0.525]], [0.429, [0.000, 1.000, 0.525]], [0.431, [0.000, 1.000, 0.548]], [0.432, [0.000, 1.000, 0.548]], [0.434, [0.000, 1.000, 0.571]], [0.436, [0.000, 1.000, 0.571]], [0.438, [0.000, 1.000, 0.594]], [0.440, [0.000, 1.000, 0.594]], [0.442, [0.000, 1.000, 0.617]], [0.444, [0.000, 1.000, 0.617]], [0.446, [0.000, 1.000, 0.640]], [0.448, [0.000, 1.000, 0.640]], [0.450, [0.000, 1.000, 0.664]], [0.452, [0.000, 1.000, 0.664]], [0.454, [0.000, 1.000, 0.687]], [0.456, [0.000, 1.000, 0.687]], [0.458, [0.000, 1.000, 0.710]], [0.460, [0.000, 1.000, 0.710]], [0.462, [0.000, 1.000, 0.733]], [0.464, [0.000, 1.000, 0.733]], [0.466, [0.000, 1.000, 0.756]], [0.468, [0.000, 1.000, 0.756]], [0.470, [0.000, 1.000, 0.779]], [0.472, [0.000, 1.000, 0.779]], [0.474, [0.000, 1.000, 0.803]], [0.476, [0.000, 1.000, 0.803]], [0.477, [0.000, 1.000, 0.826]], [0.479, [0.000, 1.000, 0.826]], [0.481, [0.000, 1.000, 0.849]], [0.483, [0.000, 1.000, 0.849]], [0.485, [0.000, 1.000, 0.872]], [0.487, [0.000, 1.000, 0.872]], [0.489, [0.000, 1.000, 0.895]], [0.491, [0.000, 1.000, 0.895]], [0.493, [0.000, 1.000, 0.918]], [0.495, [0.000, 1.000, 0.918]], [0.497, [0.000, 1.000, 0.942]], [0.499, [0.000, 1.000, 0.942]], [0.501, [0.000, 1.000, 0.965]], [0.503, [0.000, 1.000, 0.965]], [0.505, [0.000, 1.000, 0.988]], [0.507, [0.000, 1.000, 0.988]], [0.509, [0.000, 0.989, 1.000]], [0.511, [0.000, 0.989, 1.000]], [0.513, [0.000, 0.966, 1.000]], [0.515, [0.000, 0.966, 1.000]], [0.517, [0.000, 0.943, 1.000]], [0.519, [0.000, 0.943, 1.000]], [0.521, [0.000, 0.919, 1.000]], [0.523, [0.000, 0.919, 1.000]], [0.524, [0.000, 0.896, 1.000]], [0.526, [0.000, 0.896, 1.000]], [0.528, [0.000, 0.873, 1.000]], [0.530, [0.000, 0.873, 1.000]], [0.532, [0.000, 0.850, 1.000]], [0.534, [0.000, 0.850, 1.000]], [0.536, [0.000, 0.827, 1.000]], [0.538, [0.000, 0.827, 1.000]], [0.540, [0.000, 0.804, 1.000]], [0.542, [0.000, 0.804, 1.000]], [0.544, [0.000, 0.781, 1.000]], [0.546, [0.000, 0.781, 1.000]], [0.548, [0.000, 0.757, 1.000]], [0.550, [0.000, 0.757, 1.000]], [0.552, [0.000, 0.734, 1.000]], [0.554, [0.000, 0.734, 1.000]], [0.556, [0.000, 0.711, 1.000]], [0.558, [0.000, 0.711, 1.000]], [0.560, [0.000, 0.688, 1.000]], [0.562, [0.000, 0.688, 1.000]], [0.564, [0.000, 0.665, 1.000]], [0.566, [0.000, 0.665, 1.000]], [0.568, [0.000, 0.642, 1.000]], [0.569, [0.000, 0.642, 1.000]], [0.571, [0.000, 0.618, 1.000]], [0.573, [0.000, 0.618, 1.000]], [0.575, [0.000, 0.595, 1.000]], [0.577, [0.000, 0.595, 1.000]], [0.579, [0.000, 0.572, 1.000]], [0.581, [0.000, 0.572, 1.000]], [0.583, [0.000, 0.549, 1.000]], [0.585, [0.000, 0.549, 1.000]], [0.587, [0.000, 0.526, 1.000]], [0.589, [0.000, 0.526, 1.000]], [0.591, [0.000, 0.503, 1.000]], [0.593, [0.000, 0.503, 1.000]], [0.595, [0.000, 0.479, 1.000]], [0.597, [0.000, 0.479, 1.000]], [0.599, [0.000, 0.456, 1.000]], [0.601, [0.000, 0.456, 1.000]], [0.603, [0.000, 0.433, 1.000]], [0.605, [0.000, 0.433, 1.000]], [0.607, [0.000, 0.410, 1.000]], [0.609, [0.000, 0.410, 1.000]], [0.611, [0.000, 0.387, 1.000]], [0.613, [0.000, 0.387, 1.000]], [0.614, [0.000, 0.364, 1.000]], [0.616, [0.000, 0.364, 1.000]], [0.618, [0.000, 0.340, 1.000]], [0.620, [0.000, 0.340, 1.000]], [0.622, [0.000, 0.317, 1.000]], [0.624, [0.000, 0.317, 1.000]], [0.626, [0.000, 0.294, 1.000]], [0.628, [0.000, 0.294, 1.000]], [0.630, [0.000, 0.271, 1.000]], [0.632, [0.000, 0.271, 1.000]], [0.634, [0.000, 0.248, 1.000]], [0.636, [0.000, 0.248, 1.000]], [0.638, [0.000, 0.225, 1.000]], [0.640, [0.000, 0.225, 1.000]], [0.642, [0.000, 0.201, 1.000]], [0.644, [0.000, 0.201, 1.000]], [0.646, [0.000, 0.178, 1.000]], [0.648, [0.000, 0.178, 1.000]], [0.650, [0.000, 0.155, 1.000]], [0.652, [0.000, 0.155, 1.000]], [0.654, [0.000, 0.132, 1.000]], [0.656, [0.000, 0.132, 1.000]], [0.658, [0.000, 0.109, 1.000]], [0.659, [0.000, 0.109, 1.000]], [0.661, [0.000, 0.086, 1.000]], [0.663, [0.000, 0.086, 1.000]], [0.665, [0.000, 0.063, 1.000]], [0.667, [0.000, 0.063, 1.000]], [0.669, [0.008, 0.047, 1.000]], [0.671, [0.008, 0.047, 1.000]], [0.673, [0.015, 0.032, 1.000]], [0.675, [0.015, 0.032, 1.000]], [0.677, [0.023, 0.016, 1.000]], [0.679, [0.023, 0.016, 1.000]], [0.681, [0.031, 0.001, 1.000]], [0.683, [0.031, 0.001, 1.000]], [0.685, [0.053, 0.000, 1.000]], [0.687, [0.053, 0.000, 1.000]], [0.689, [0.076, 0.000, 1.000]], [0.691, [0.076, 0.000, 1.000]], [0.693, [0.100, 0.000, 1.000]], [0.695, [0.100, 0.000, 1.000]], [0.697, [0.123, 0.000, 1.000]], [0.699, [0.123, 0.000, 1.000]], [0.701, [0.146, 0.000, 1.000]], [0.703, [0.146, 0.000, 1.000]], [0.705, [0.169, 0.000, 1.000]], [0.706, [0.169, 0.000, 1.000]], [0.708, [0.192, 0.000, 1.000]], [0.710, [0.192, 0.000, 1.000]], [0.712, [0.215, 0.000, 1.000]], [0.714, [0.215, 0.000, 1.000]], [0.716, [0.239, 0.000, 1.000]], [0.718, [0.239, 0.000, 1.000]], [0.720, [0.262, 0.000, 1.000]], [0.722, [0.262, 0.000, 1.000]], [0.724, [0.285, 0.000, 1.000]], [0.726, [0.285, 0.000, 1.000]], [0.728, [0.308, 0.000, 1.000]], [0.730, [0.308, 0.000, 1.000]], [0.732, [0.331, 0.000, 1.000]], [0.734, [0.331, 0.000, 1.000]], [0.736, [0.354, 0.000, 1.000]], [0.738, [0.354, 0.000, 1.000]], [0.740, [0.378, 0.000, 1.000]], [0.742, [0.378, 0.000, 1.000]], [0.744, [0.401, 0.000, 1.000]], [0.746, [0.401, 0.000, 1.000]], [0.748, [0.424, 0.000, 1.000]], [0.750, [0.424, 0.000, 1.000]], [0.751, [0.447, 0.000, 1.000]], [0.753, [0.447, 0.000, 1.000]], [0.755, [0.470, 0.000, 1.000]], [0.757, [0.470, 0.000, 1.000]], [0.759, [0.493, 0.000, 1.000]], [0.761, [0.493, 0.000, 1.000]], [0.763, [0.517, 0.000, 1.000]], [0.765, [0.517, 0.000, 1.000]], [0.767, [0.540, 0.000, 1.000]], [0.769, [0.540, 0.000, 1.000]], [0.771, [0.563, 0.000, 1.000]], [0.773, [0.563, 0.000, 1.000]], [0.775, [0.586, 0.000, 1.000]], [0.777, [0.586, 0.000, 1.000]], [0.779, [0.609, 0.000, 1.000]], [0.781, [0.609, 0.000, 1.000]], [0.783, [0.632, 0.000, 1.000]], [0.785, [0.632, 0.000, 1.000]], [0.787, [0.656, 0.000, 1.000]], [0.789, [0.656, 0.000, 1.000]], [0.791, [0.679, 0.000, 1.000]], [0.793, [0.679, 0.000, 1.000]], [0.795, [0.702, 0.000, 1.000]], [0.796, [0.702, 0.000, 1.000]], [0.798, [0.725, 0.000, 1.000]], [0.800, [0.725, 0.000, 1.000]], [0.802, [0.748, 0.000, 1.000]], [0.804, [0.748, 0.000, 1.000]], [0.806, [0.771, 0.000, 1.000]], [0.808, [0.771, 0.000, 1.000]], [0.810, [0.794, 0.000, 1.000]], [0.812, [0.794, 0.000, 1.000]], [0.814, [0.818, 0.000, 1.000]], [0.816, [0.818, 0.000, 1.000]], [0.818, [0.841, 0.000, 1.000]], [0.820, [0.841, 0.000, 1.000]], [0.822, [0.864, 0.000, 1.000]], [0.824, [0.864, 0.000, 1.000]], [0.826, [0.887, 0.000, 1.000]], [0.828, [0.887, 0.000, 1.000]], [0.830, [0.910, 0.000, 1.000]], [0.832, [0.910, 0.000, 1.000]], [0.834, [0.933, 0.000, 1.000]], [0.836, [0.933, 0.000, 1.000]], [0.838, [0.957, 0.000, 1.000]], [0.840, [0.957, 0.000, 1.000]], [0.841, [0.972, 0.000, 0.993]], [0.843, [0.972, 0.000, 0.993]], [0.845, [0.980, 0.000, 0.977]], [0.847, [0.980, 0.000, 0.977]], [0.849, [0.988, 0.000, 0.962]], [0.851, [0.988, 0.000, 0.962]], [0.853, [0.996, 0.000, 0.946]], [0.855, [0.996, 0.000, 0.946]], [0.857, [1.000, 0.000, 0.928]], [0.859, [1.000, 0.000, 0.928]], [0.861, [1.000, 0.000, 0.904]], [0.863, [1.000, 0.000, 0.904]], [0.865, [1.000, 0.000, 0.881]], [0.867, [1.000, 0.000, 0.881]], [0.869, [1.000, 0.000, 0.858]], [0.871, [1.000, 0.000, 0.858]], [0.873, [1.000, 0.000, 0.835]], [0.875, [1.000, 0.000, 0.835]], [0.877, [1.000, 0.000, 0.812]], [0.879, [1.000, 0.000, 0.812]], [0.881, [1.000, 0.000, 0.789]], [0.883, [1.000, 0.000, 0.789]], [0.885, [1.000, 0.000, 0.765]], [0.886, [1.000, 0.000, 0.765]], [0.888, [1.000, 0.000, 0.742]], [0.890, [1.000, 0.000, 0.742]], [0.892, [1.000, 0.000, 0.719]], [0.894, [1.000, 0.000, 0.719]], [0.896, [1.000, 0.000, 0.696]], [0.898, [1.000, 0.000, 0.696]], [0.900, [1.000, 0.000, 0.673]], [0.902, [1.000, 0.000, 0.673]], [0.904, [1.000, 0.000, 0.650]], [0.906, [1.000, 0.000, 0.650]], [0.908, [1.000, 0.000, 0.626]], [0.910, [1.000, 0.000, 0.626]], [0.912, [1.000, 0.000, 0.603]], [0.914, [1.000, 0.000, 0.603]], [0.916, [1.000, 0.000, 0.580]], [0.918, [1.000, 0.000, 0.580]], [0.920, [1.000, 0.000, 0.557]], [0.922, [1.000, 0.000, 0.557]], [0.924, [1.000, 0.000, 0.534]], [0.926, [1.000, 0.000, 0.534]], [0.928, [1.000, 0.000, 0.511]], [0.930, [1.000, 0.000, 0.511]], [0.932, [1.000, 0.000, 0.488]], [0.933, [1.000, 0.000, 0.488]], [0.935, [1.000, 0.000, 0.464]], [0.937, [1.000, 0.000, 0.464]], [0.939, [1.000, 0.000, 0.441]], [0.941, [1.000, 0.000, 0.441]], [0.943, [1.000, 0.000, 0.418]], [0.945, [1.000, 0.000, 0.418]], [0.947, [1.000, 0.000, 0.395]], [0.949, [1.000, 0.000, 0.395]], [0.951, [1.000, 0.000, 0.372]], [0.953, [1.000, 0.000, 0.372]], [0.955, [1.000, 0.000, 0.349]], [0.957, [1.000, 0.000, 0.349]], [0.959, [1.000, 0.000, 0.325]], [0.961, [1.000, 0.000, 0.325]], [0.963, [1.000, 0.000, 0.302]], [0.965, [1.000, 0.000, 0.302]], [0.967, [1.000, 0.000, 0.279]], [0.969, [1.000, 0.000, 0.279]], [0.971, [1.000, 0.000, 0.256]], [0.973, [1.000, 0.000, 0.256]], [0.975, [1.000, 0.000, 0.233]], [0.977, [1.000, 0.000, 0.233]], [0.978, [1.000, 0.000, 0.210]], [0.980, [1.000, 0.000, 0.210]], [0.982, [1.000, 0.000, 0.186]], [0.984, [1.000, 0.000, 0.186]], [0.986, [1.000, 0.000, 0.163]], [0.988, [1.000, 0.000, 0.163]], [0.990, [1.000, 0.000, 0.140]], [0.992, [1.000, 0.000, 0.140]], [0.994, [1.000, 0.000, 0.117]], [0.996, [1.000, 0.000, 0.117]], [0.998, [1.000, 0.000, 0.094]], [1.000, [1.000, 0.000, 0.094]]]; +var jet = [[0.000, [0.000, 0.000, 0.500]], [0.002, [0.000, 0.000, 0.500]], [0.004, [0.000, 0.000, 0.518]], [0.006, [0.000, 0.000, 0.518]], [0.008, [0.000, 0.000, 0.536]], [0.010, [0.000, 0.000, 0.536]], [0.012, [0.000, 0.000, 0.553]], [0.014, [0.000, 0.000, 0.553]], [0.016, [0.000, 0.000, 0.571]], [0.018, [0.000, 0.000, 0.571]], [0.020, [0.000, 0.000, 0.589]], [0.022, [0.000, 0.000, 0.589]], [0.023, [0.000, 0.000, 0.607]], [0.025, [0.000, 0.000, 0.607]], [0.027, [0.000, 0.000, 0.625]], [0.029, [0.000, 0.000, 0.625]], [0.031, [0.000, 0.000, 0.643]], [0.033, [0.000, 0.000, 0.643]], [0.035, [0.000, 0.000, 0.660]], [0.037, [0.000, 0.000, 0.660]], [0.039, [0.000, 0.000, 0.678]], [0.041, [0.000, 0.000, 0.678]], [0.043, [0.000, 0.000, 0.696]], [0.045, [0.000, 0.000, 0.696]], [0.047, [0.000, 0.000, 0.714]], [0.049, [0.000, 0.000, 0.714]], [0.051, [0.000, 0.000, 0.732]], [0.053, [0.000, 0.000, 0.732]], [0.055, [0.000, 0.000, 0.750]], [0.057, [0.000, 0.000, 0.750]], [0.059, [0.000, 0.000, 0.767]], [0.061, [0.000, 0.000, 0.767]], [0.063, [0.000, 0.000, 0.785]], [0.065, [0.000, 0.000, 0.785]], [0.067, [0.000, 0.000, 0.803]], [0.068, [0.000, 0.000, 0.803]], [0.070, [0.000, 0.000, 0.821]], [0.072, [0.000, 0.000, 0.821]], [0.074, [0.000, 0.000, 0.839]], [0.076, [0.000, 0.000, 0.839]], [0.078, [0.000, 0.000, 0.857]], [0.080, [0.000, 0.000, 0.857]], [0.082, [0.000, 0.000, 0.874]], [0.084, [0.000, 0.000, 0.874]], [0.086, [0.000, 0.000, 0.892]], [0.088, [0.000, 0.000, 0.892]], [0.090, [0.000, 0.000, 0.910]], [0.092, [0.000, 0.000, 0.910]], [0.094, [0.000, 0.000, 0.928]], [0.096, [0.000, 0.000, 0.928]], [0.098, [0.000, 0.000, 0.946]], [0.100, [0.000, 0.000, 0.946]], [0.102, [0.000, 0.000, 0.963]], [0.104, [0.000, 0.000, 0.963]], [0.106, [0.000, 0.000, 0.981]], [0.108, [0.000, 0.000, 0.981]], [0.110, [0.000, 0.000, 0.999]], [0.112, [0.000, 0.000, 0.999]], [0.114, [0.000, 0.000, 1.000]], [0.115, [0.000, 0.000, 1.000]], [0.117, [0.000, 0.000, 1.000]], [0.119, [0.000, 0.000, 1.000]], [0.121, [0.000, 0.000, 1.000]], [0.123, [0.000, 0.000, 1.000]], [0.125, [0.000, 0.002, 1.000]], [0.127, [0.000, 0.002, 1.000]], [0.129, [0.000, 0.018, 1.000]], [0.131, [0.000, 0.018, 1.000]], [0.133, [0.000, 0.033, 1.000]], [0.135, [0.000, 0.033, 1.000]], [0.137, [0.000, 0.049, 1.000]], [0.139, [0.000, 0.049, 1.000]], [0.141, [0.000, 0.065, 1.000]], [0.143, [0.000, 0.065, 1.000]], [0.145, [0.000, 0.080, 1.000]], [0.147, [0.000, 0.080, 1.000]], [0.149, [0.000, 0.096, 1.000]], [0.151, [0.000, 0.096, 1.000]], [0.153, [0.000, 0.112, 1.000]], [0.155, [0.000, 0.112, 1.000]], [0.157, [0.000, 0.127, 1.000]], [0.159, [0.000, 0.127, 1.000]], [0.160, [0.000, 0.143, 1.000]], [0.162, [0.000, 0.143, 1.000]], [0.164, [0.000, 0.159, 1.000]], [0.166, [0.000, 0.159, 1.000]], [0.168, [0.000, 0.175, 1.000]], [0.170, [0.000, 0.175, 1.000]], [0.172, [0.000, 0.190, 1.000]], [0.174, [0.000, 0.190, 1.000]], [0.176, [0.000, 0.206, 1.000]], [0.178, [0.000, 0.206, 1.000]], [0.180, [0.000, 0.222, 1.000]], [0.182, [0.000, 0.222, 1.000]], [0.184, [0.000, 0.237, 1.000]], [0.186, [0.000, 0.237, 1.000]], [0.188, [0.000, 0.253, 1.000]], [0.190, [0.000, 0.253, 1.000]], [0.192, [0.000, 0.269, 1.000]], [0.194, [0.000, 0.269, 1.000]], [0.196, [0.000, 0.284, 1.000]], [0.198, [0.000, 0.284, 1.000]], [0.200, [0.000, 0.300, 1.000]], [0.202, [0.000, 0.300, 1.000]], [0.204, [0.000, 0.316, 1.000]], [0.205, [0.000, 0.316, 1.000]], [0.207, [0.000, 0.331, 1.000]], [0.209, [0.000, 0.331, 1.000]], [0.211, [0.000, 0.347, 1.000]], [0.213, [0.000, 0.347, 1.000]], [0.215, [0.000, 0.363, 1.000]], [0.217, [0.000, 0.363, 1.000]], [0.219, [0.000, 0.378, 1.000]], [0.221, [0.000, 0.378, 1.000]], [0.223, [0.000, 0.394, 1.000]], [0.225, [0.000, 0.394, 1.000]], [0.227, [0.000, 0.410, 1.000]], [0.229, [0.000, 0.410, 1.000]], [0.231, [0.000, 0.425, 1.000]], [0.233, [0.000, 0.425, 1.000]], [0.235, [0.000, 0.441, 1.000]], [0.237, [0.000, 0.441, 1.000]], [0.239, [0.000, 0.457, 1.000]], [0.241, [0.000, 0.457, 1.000]], [0.243, [0.000, 0.473, 1.000]], [0.245, [0.000, 0.473, 1.000]], [0.247, [0.000, 0.488, 1.000]], [0.249, [0.000, 0.488, 1.000]], [0.250, [0.000, 0.504, 1.000]], [0.252, [0.000, 0.504, 1.000]], [0.254, [0.000, 0.520, 1.000]], [0.256, [0.000, 0.520, 1.000]], [0.258, [0.000, 0.535, 1.000]], [0.260, [0.000, 0.535, 1.000]], [0.262, [0.000, 0.551, 1.000]], [0.264, [0.000, 0.551, 1.000]], [0.266, [0.000, 0.567, 1.000]], [0.268, [0.000, 0.567, 1.000]], [0.270, [0.000, 0.582, 1.000]], [0.272, [0.000, 0.582, 1.000]], [0.274, [0.000, 0.598, 1.000]], [0.276, [0.000, 0.598, 1.000]], [0.278, [0.000, 0.614, 1.000]], [0.280, [0.000, 0.614, 1.000]], [0.282, [0.000, 0.629, 1.000]], [0.284, [0.000, 0.629, 1.000]], [0.286, [0.000, 0.645, 1.000]], [0.288, [0.000, 0.645, 1.000]], [0.290, [0.000, 0.661, 1.000]], [0.292, [0.000, 0.661, 1.000]], [0.294, [0.000, 0.676, 1.000]], [0.295, [0.000, 0.676, 1.000]], [0.297, [0.000, 0.692, 1.000]], [0.299, [0.000, 0.692, 1.000]], [0.301, [0.000, 0.708, 1.000]], [0.303, [0.000, 0.708, 1.000]], [0.305, [0.000, 0.724, 1.000]], [0.307, [0.000, 0.724, 1.000]], [0.309, [0.000, 0.739, 1.000]], [0.311, [0.000, 0.739, 1.000]], [0.313, [0.000, 0.755, 1.000]], [0.315, [0.000, 0.755, 1.000]], [0.317, [0.000, 0.771, 1.000]], [0.319, [0.000, 0.771, 1.000]], [0.321, [0.000, 0.786, 1.000]], [0.323, [0.000, 0.786, 1.000]], [0.325, [0.000, 0.802, 1.000]], [0.327, [0.000, 0.802, 1.000]], [0.329, [0.000, 0.818, 1.000]], [0.331, [0.000, 0.818, 1.000]], [0.333, [0.000, 0.833, 1.000]], [0.335, [0.000, 0.833, 1.000]], [0.337, [0.000, 0.849, 1.000]], [0.339, [0.000, 0.849, 1.000]], [0.341, [0.000, 0.865, 0.996]], [0.342, [0.000, 0.865, 0.996]], [0.344, [0.000, 0.880, 0.984]], [0.346, [0.000, 0.880, 0.984]], [0.348, [0.000, 0.896, 0.971]], [0.350, [0.000, 0.896, 0.971]], [0.352, [0.009, 0.912, 0.958]], [0.354, [0.009, 0.912, 0.958]], [0.356, [0.022, 0.927, 0.946]], [0.358, [0.022, 0.927, 0.946]], [0.360, [0.035, 0.943, 0.933]], [0.362, [0.035, 0.943, 0.933]], [0.364, [0.047, 0.959, 0.920]], [0.366, [0.047, 0.959, 0.920]], [0.368, [0.060, 0.975, 0.908]], [0.370, [0.060, 0.975, 0.908]], [0.372, [0.073, 0.990, 0.895]], [0.374, [0.073, 0.990, 0.895]], [0.376, [0.085, 1.000, 0.882]], [0.378, [0.085, 1.000, 0.882]], [0.380, [0.098, 1.000, 0.870]], [0.382, [0.098, 1.000, 0.870]], [0.384, [0.111, 1.000, 0.857]], [0.386, [0.111, 1.000, 0.857]], [0.387, [0.123, 1.000, 0.844]], [0.389, [0.123, 1.000, 0.844]], [0.391, [0.136, 1.000, 0.832]], [0.393, [0.136, 1.000, 0.832]], [0.395, [0.149, 1.000, 0.819]], [0.397, [0.149, 1.000, 0.819]], [0.399, [0.161, 1.000, 0.806]], [0.401, [0.161, 1.000, 0.806]], [0.403, [0.174, 1.000, 0.794]], [0.405, [0.174, 1.000, 0.794]], [0.407, [0.187, 1.000, 0.781]], [0.409, [0.187, 1.000, 0.781]], [0.411, [0.199, 1.000, 0.769]], [0.413, [0.199, 1.000, 0.769]], [0.415, [0.212, 1.000, 0.756]], [0.417, [0.212, 1.000, 0.756]], [0.419, [0.225, 1.000, 0.743]], [0.421, [0.225, 1.000, 0.743]], [0.423, [0.237, 1.000, 0.731]], [0.425, [0.237, 1.000, 0.731]], [0.427, [0.250, 1.000, 0.718]], [0.429, [0.250, 1.000, 0.718]], [0.431, [0.262, 1.000, 0.705]], [0.432, [0.262, 1.000, 0.705]], [0.434, [0.275, 1.000, 0.693]], [0.436, [0.275, 1.000, 0.693]], [0.438, [0.288, 1.000, 0.680]], [0.440, [0.288, 1.000, 0.680]], [0.442, [0.300, 1.000, 0.667]], [0.444, [0.300, 1.000, 0.667]], [0.446, [0.313, 1.000, 0.655]], [0.448, [0.313, 1.000, 0.655]], [0.450, [0.326, 1.000, 0.642]], [0.452, [0.326, 1.000, 0.642]], [0.454, [0.338, 1.000, 0.629]], [0.456, [0.338, 1.000, 0.629]], [0.458, [0.351, 1.000, 0.617]], [0.460, [0.351, 1.000, 0.617]], [0.462, [0.364, 1.000, 0.604]], [0.464, [0.364, 1.000, 0.604]], [0.466, [0.376, 1.000, 0.591]], [0.468, [0.376, 1.000, 0.591]], [0.470, [0.389, 1.000, 0.579]], [0.472, [0.389, 1.000, 0.579]], [0.474, [0.402, 1.000, 0.566]], [0.476, [0.402, 1.000, 0.566]], [0.477, [0.414, 1.000, 0.553]], [0.479, [0.414, 1.000, 0.553]], [0.481, [0.427, 1.000, 0.541]], [0.483, [0.427, 1.000, 0.541]], [0.485, [0.440, 1.000, 0.528]], [0.487, [0.440, 1.000, 0.528]], [0.489, [0.452, 1.000, 0.515]], [0.491, [0.452, 1.000, 0.515]], [0.493, [0.465, 1.000, 0.503]], [0.495, [0.465, 1.000, 0.503]], [0.497, [0.478, 1.000, 0.490]], [0.499, [0.478, 1.000, 0.490]], [0.501, [0.490, 1.000, 0.478]], [0.503, [0.490, 1.000, 0.478]], [0.505, [0.503, 1.000, 0.465]], [0.507, [0.503, 1.000, 0.465]], [0.509, [0.515, 1.000, 0.452]], [0.511, [0.515, 1.000, 0.452]], [0.513, [0.528, 1.000, 0.440]], [0.515, [0.528, 1.000, 0.440]], [0.517, [0.541, 1.000, 0.427]], [0.519, [0.541, 1.000, 0.427]], [0.521, [0.553, 1.000, 0.414]], [0.523, [0.553, 1.000, 0.414]], [0.524, [0.566, 1.000, 0.402]], [0.526, [0.566, 1.000, 0.402]], [0.528, [0.579, 1.000, 0.389]], [0.530, [0.579, 1.000, 0.389]], [0.532, [0.591, 1.000, 0.376]], [0.534, [0.591, 1.000, 0.376]], [0.536, [0.604, 1.000, 0.364]], [0.538, [0.604, 1.000, 0.364]], [0.540, [0.617, 1.000, 0.351]], [0.542, [0.617, 1.000, 0.351]], [0.544, [0.629, 1.000, 0.338]], [0.546, [0.629, 1.000, 0.338]], [0.548, [0.642, 1.000, 0.326]], [0.550, [0.642, 1.000, 0.326]], [0.552, [0.655, 1.000, 0.313]], [0.554, [0.655, 1.000, 0.313]], [0.556, [0.667, 1.000, 0.300]], [0.558, [0.667, 1.000, 0.300]], [0.560, [0.680, 1.000, 0.288]], [0.562, [0.680, 1.000, 0.288]], [0.564, [0.693, 1.000, 0.275]], [0.566, [0.693, 1.000, 0.275]], [0.568, [0.705, 1.000, 0.262]], [0.569, [0.705, 1.000, 0.262]], [0.571, [0.718, 1.000, 0.250]], [0.573, [0.718, 1.000, 0.250]], [0.575, [0.731, 1.000, 0.237]], [0.577, [0.731, 1.000, 0.237]], [0.579, [0.743, 1.000, 0.225]], [0.581, [0.743, 1.000, 0.225]], [0.583, [0.756, 1.000, 0.212]], [0.585, [0.756, 1.000, 0.212]], [0.587, [0.769, 1.000, 0.199]], [0.589, [0.769, 1.000, 0.199]], [0.591, [0.781, 1.000, 0.187]], [0.593, [0.781, 1.000, 0.187]], [0.595, [0.794, 1.000, 0.174]], [0.597, [0.794, 1.000, 0.174]], [0.599, [0.806, 1.000, 0.161]], [0.601, [0.806, 1.000, 0.161]], [0.603, [0.819, 1.000, 0.149]], [0.605, [0.819, 1.000, 0.149]], [0.607, [0.832, 1.000, 0.136]], [0.609, [0.832, 1.000, 0.136]], [0.611, [0.844, 1.000, 0.123]], [0.613, [0.844, 1.000, 0.123]], [0.614, [0.857, 1.000, 0.111]], [0.616, [0.857, 1.000, 0.111]], [0.618, [0.870, 1.000, 0.098]], [0.620, [0.870, 1.000, 0.098]], [0.622, [0.882, 1.000, 0.085]], [0.624, [0.882, 1.000, 0.085]], [0.626, [0.895, 1.000, 0.073]], [0.628, [0.895, 1.000, 0.073]], [0.630, [0.908, 1.000, 0.060]], [0.632, [0.908, 1.000, 0.060]], [0.634, [0.920, 1.000, 0.047]], [0.636, [0.920, 1.000, 0.047]], [0.638, [0.933, 1.000, 0.035]], [0.640, [0.933, 1.000, 0.035]], [0.642, [0.946, 0.988, 0.022]], [0.644, [0.946, 0.988, 0.022]], [0.646, [0.958, 0.974, 0.009]], [0.648, [0.958, 0.974, 0.009]], [0.650, [0.971, 0.959, 0.000]], [0.652, [0.971, 0.959, 0.000]], [0.654, [0.984, 0.945, 0.000]], [0.656, [0.984, 0.945, 0.000]], [0.658, [0.996, 0.930, 0.000]], [0.659, [0.996, 0.930, 0.000]], [0.661, [1.000, 0.916, 0.000]], [0.663, [1.000, 0.916, 0.000]], [0.665, [1.000, 0.901, 0.000]], [0.667, [1.000, 0.901, 0.000]], [0.669, [1.000, 0.887, 0.000]], [0.671, [1.000, 0.887, 0.000]], [0.673, [1.000, 0.872, 0.000]], [0.675, [1.000, 0.872, 0.000]], [0.677, [1.000, 0.858, 0.000]], [0.679, [1.000, 0.858, 0.000]], [0.681, [1.000, 0.843, 0.000]], [0.683, [1.000, 0.843, 0.000]], [0.685, [1.000, 0.829, 0.000]], [0.687, [1.000, 0.829, 0.000]], [0.689, [1.000, 0.814, 0.000]], [0.691, [1.000, 0.814, 0.000]], [0.693, [1.000, 0.800, 0.000]], [0.695, [1.000, 0.800, 0.000]], [0.697, [1.000, 0.785, 0.000]], [0.699, [1.000, 0.785, 0.000]], [0.701, [1.000, 0.771, 0.000]], [0.703, [1.000, 0.771, 0.000]], [0.705, [1.000, 0.756, 0.000]], [0.706, [1.000, 0.756, 0.000]], [0.708, [1.000, 0.741, 0.000]], [0.710, [1.000, 0.741, 0.000]], [0.712, [1.000, 0.727, 0.000]], [0.714, [1.000, 0.727, 0.000]], [0.716, [1.000, 0.712, 0.000]], [0.718, [1.000, 0.712, 0.000]], [0.720, [1.000, 0.698, 0.000]], [0.722, [1.000, 0.698, 0.000]], [0.724, [1.000, 0.683, 0.000]], [0.726, [1.000, 0.683, 0.000]], [0.728, [1.000, 0.669, 0.000]], [0.730, [1.000, 0.669, 0.000]], [0.732, [1.000, 0.654, 0.000]], [0.734, [1.000, 0.654, 0.000]], [0.736, [1.000, 0.640, 0.000]], [0.738, [1.000, 0.640, 0.000]], [0.740, [1.000, 0.625, 0.000]], [0.742, [1.000, 0.625, 0.000]], [0.744, [1.000, 0.611, 0.000]], [0.746, [1.000, 0.611, 0.000]], [0.748, [1.000, 0.596, 0.000]], [0.750, [1.000, 0.596, 0.000]], [0.751, [1.000, 0.582, 0.000]], [0.753, [1.000, 0.582, 0.000]], [0.755, [1.000, 0.567, 0.000]], [0.757, [1.000, 0.567, 0.000]], [0.759, [1.000, 0.553, 0.000]], [0.761, [1.000, 0.553, 0.000]], [0.763, [1.000, 0.538, 0.000]], [0.765, [1.000, 0.538, 0.000]], [0.767, [1.000, 0.524, 0.000]], [0.769, [1.000, 0.524, 0.000]], [0.771, [1.000, 0.509, 0.000]], [0.773, [1.000, 0.509, 0.000]], [0.775, [1.000, 0.495, 0.000]], [0.777, [1.000, 0.495, 0.000]], [0.779, [1.000, 0.480, 0.000]], [0.781, [1.000, 0.480, 0.000]], [0.783, [1.000, 0.466, 0.000]], [0.785, [1.000, 0.466, 0.000]], [0.787, [1.000, 0.451, 0.000]], [0.789, [1.000, 0.451, 0.000]], [0.791, [1.000, 0.436, 0.000]], [0.793, [1.000, 0.436, 0.000]], [0.795, [1.000, 0.422, 0.000]], [0.796, [1.000, 0.422, 0.000]], [0.798, [1.000, 0.407, 0.000]], [0.800, [1.000, 0.407, 0.000]], [0.802, [1.000, 0.393, 0.000]], [0.804, [1.000, 0.393, 0.000]], [0.806, [1.000, 0.378, 0.000]], [0.808, [1.000, 0.378, 0.000]], [0.810, [1.000, 0.364, 0.000]], [0.812, [1.000, 0.364, 0.000]], [0.814, [1.000, 0.349, 0.000]], [0.816, [1.000, 0.349, 0.000]], [0.818, [1.000, 0.335, 0.000]], [0.820, [1.000, 0.335, 0.000]], [0.822, [1.000, 0.320, 0.000]], [0.824, [1.000, 0.320, 0.000]], [0.826, [1.000, 0.306, 0.000]], [0.828, [1.000, 0.306, 0.000]], [0.830, [1.000, 0.291, 0.000]], [0.832, [1.000, 0.291, 0.000]], [0.834, [1.000, 0.277, 0.000]], [0.836, [1.000, 0.277, 0.000]], [0.838, [1.000, 0.262, 0.000]], [0.840, [1.000, 0.262, 0.000]], [0.841, [1.000, 0.248, 0.000]], [0.843, [1.000, 0.248, 0.000]], [0.845, [1.000, 0.233, 0.000]], [0.847, [1.000, 0.233, 0.000]], [0.849, [1.000, 0.219, 0.000]], [0.851, [1.000, 0.219, 0.000]], [0.853, [1.000, 0.204, 0.000]], [0.855, [1.000, 0.204, 0.000]], [0.857, [1.000, 0.190, 0.000]], [0.859, [1.000, 0.190, 0.000]], [0.861, [1.000, 0.175, 0.000]], [0.863, [1.000, 0.175, 0.000]], [0.865, [1.000, 0.160, 0.000]], [0.867, [1.000, 0.160, 0.000]], [0.869, [1.000, 0.146, 0.000]], [0.871, [1.000, 0.146, 0.000]], [0.873, [1.000, 0.131, 0.000]], [0.875, [1.000, 0.131, 0.000]], [0.877, [1.000, 0.117, 0.000]], [0.879, [1.000, 0.117, 0.000]], [0.881, [1.000, 0.102, 0.000]], [0.883, [1.000, 0.102, 0.000]], [0.885, [1.000, 0.088, 0.000]], [0.886, [1.000, 0.088, 0.000]], [0.888, [0.999, 0.073, 0.000]], [0.890, [0.999, 0.073, 0.000]], [0.892, [0.981, 0.059, 0.000]], [0.894, [0.981, 0.059, 0.000]], [0.896, [0.963, 0.044, 0.000]], [0.898, [0.963, 0.044, 0.000]], [0.900, [0.946, 0.030, 0.000]], [0.902, [0.946, 0.030, 0.000]], [0.904, [0.928, 0.015, 0.000]], [0.906, [0.928, 0.015, 0.000]], [0.908, [0.910, 0.001, 0.000]], [0.910, [0.910, 0.001, 0.000]], [0.912, [0.892, 0.000, 0.000]], [0.914, [0.892, 0.000, 0.000]], [0.916, [0.874, 0.000, 0.000]], [0.918, [0.874, 0.000, 0.000]], [0.920, [0.857, 0.000, 0.000]], [0.922, [0.857, 0.000, 0.000]], [0.924, [0.839, 0.000, 0.000]], [0.926, [0.839, 0.000, 0.000]], [0.928, [0.821, 0.000, 0.000]], [0.930, [0.821, 0.000, 0.000]], [0.932, [0.803, 0.000, 0.000]], [0.933, [0.803, 0.000, 0.000]], [0.935, [0.785, 0.000, 0.000]], [0.937, [0.785, 0.000, 0.000]], [0.939, [0.767, 0.000, 0.000]], [0.941, [0.767, 0.000, 0.000]], [0.943, [0.750, 0.000, 0.000]], [0.945, [0.750, 0.000, 0.000]], [0.947, [0.732, 0.000, 0.000]], [0.949, [0.732, 0.000, 0.000]], [0.951, [0.714, 0.000, 0.000]], [0.953, [0.714, 0.000, 0.000]], [0.955, [0.696, 0.000, 0.000]], [0.957, [0.696, 0.000, 0.000]], [0.959, [0.678, 0.000, 0.000]], [0.961, [0.678, 0.000, 0.000]], [0.963, [0.660, 0.000, 0.000]], [0.965, [0.660, 0.000, 0.000]], [0.967, [0.643, 0.000, 0.000]], [0.969, [0.643, 0.000, 0.000]], [0.971, [0.625, 0.000, 0.000]], [0.973, [0.625, 0.000, 0.000]], [0.975, [0.607, 0.000, 0.000]], [0.977, [0.607, 0.000, 0.000]], [0.978, [0.589, 0.000, 0.000]], [0.980, [0.589, 0.000, 0.000]], [0.982, [0.571, 0.000, 0.000]], [0.984, [0.571, 0.000, 0.000]], [0.986, [0.553, 0.000, 0.000]], [0.988, [0.553, 0.000, 0.000]], [0.990, [0.536, 0.000, 0.000]], [0.992, [0.536, 0.000, 0.000]], [0.994, [0.518, 0.000, 0.000]], [0.996, [0.518, 0.000, 0.000]], [0.998, [0.500, 0.000, 0.000]], [1.000, [0.500, 0.000, 0.000]]]; +var nipy_spectral = [[0.000, [0.000, 0.000, 0.000]], [0.002, [0.000, 0.000, 0.000]], [0.004, [0.037, 0.000, 0.042]], [0.006, [0.037, 0.000, 0.042]], [0.008, [0.073, 0.000, 0.084]], [0.010, [0.073, 0.000, 0.084]], [0.012, [0.110, 0.000, 0.125]], [0.014, [0.110, 0.000, 0.125]], [0.016, [0.146, 0.000, 0.167]], [0.018, [0.146, 0.000, 0.167]], [0.020, [0.183, 0.000, 0.209]], [0.022, [0.183, 0.000, 0.209]], [0.023, [0.220, 0.000, 0.251]], [0.025, [0.220, 0.000, 0.251]], [0.027, [0.256, 0.000, 0.293]], [0.029, [0.256, 0.000, 0.293]], [0.031, [0.293, 0.000, 0.335]], [0.033, [0.293, 0.000, 0.335]], [0.035, [0.329, 0.000, 0.376]], [0.037, [0.329, 0.000, 0.376]], [0.039, [0.366, 0.000, 0.418]], [0.041, [0.366, 0.000, 0.418]], [0.043, [0.403, 0.000, 0.460]], [0.045, [0.403, 0.000, 0.460]], [0.047, [0.439, 0.000, 0.502]], [0.049, [0.439, 0.000, 0.502]], [0.051, [0.468, 0.000, 0.535]], [0.053, [0.468, 0.000, 0.535]], [0.055, [0.473, 0.000, 0.540]], [0.057, [0.473, 0.000, 0.540]], [0.059, [0.478, 0.000, 0.545]], [0.061, [0.478, 0.000, 0.545]], [0.063, [0.484, 0.000, 0.550]], [0.065, [0.484, 0.000, 0.550]], [0.067, [0.489, 0.000, 0.556]], [0.068, [0.489, 0.000, 0.556]], [0.070, [0.494, 0.000, 0.561]], [0.072, [0.494, 0.000, 0.561]], [0.074, [0.499, 0.000, 0.566]], [0.076, [0.499, 0.000, 0.566]], [0.078, [0.505, 0.000, 0.571]], [0.080, [0.505, 0.000, 0.571]], [0.082, [0.510, 0.000, 0.576]], [0.084, [0.510, 0.000, 0.576]], [0.086, [0.515, 0.000, 0.582]], [0.088, [0.515, 0.000, 0.582]], [0.090, [0.520, 0.000, 0.587]], [0.092, [0.520, 0.000, 0.587]], [0.094, [0.525, 0.000, 0.592]], [0.096, [0.525, 0.000, 0.592]], [0.098, [0.531, 0.000, 0.597]], [0.100, [0.531, 0.000, 0.597]], [0.102, [0.512, 0.000, 0.603]], [0.104, [0.512, 0.000, 0.603]], [0.106, [0.471, 0.000, 0.608]], [0.108, [0.471, 0.000, 0.608]], [0.110, [0.429, 0.000, 0.613]], [0.112, [0.429, 0.000, 0.613]], [0.114, [0.387, 0.000, 0.618]], [0.115, [0.387, 0.000, 0.618]], [0.117, [0.345, 0.000, 0.624]], [0.119, [0.345, 0.000, 0.624]], [0.121, [0.303, 0.000, 0.629]], [0.123, [0.303, 0.000, 0.629]], [0.125, [0.261, 0.000, 0.634]], [0.127, [0.261, 0.000, 0.634]], [0.129, [0.220, 0.000, 0.639]], [0.131, [0.220, 0.000, 0.639]], [0.133, [0.178, 0.000, 0.644]], [0.135, [0.178, 0.000, 0.644]], [0.137, [0.136, 0.000, 0.650]], [0.139, [0.136, 0.000, 0.650]], [0.141, [0.094, 0.000, 0.655]], [0.143, [0.094, 0.000, 0.655]], [0.145, [0.052, 0.000, 0.660]], [0.147, [0.052, 0.000, 0.660]], [0.149, [0.010, 0.000, 0.665]], [0.151, [0.010, 0.000, 0.665]], [0.153, [0.000, 0.000, 0.678]], [0.155, [0.000, 0.000, 0.678]], [0.157, [0.000, 0.000, 0.694]], [0.159, [0.000, 0.000, 0.694]], [0.160, [0.000, 0.000, 0.710]], [0.162, [0.000, 0.000, 0.710]], [0.164, [0.000, 0.000, 0.726]], [0.166, [0.000, 0.000, 0.726]], [0.168, [0.000, 0.000, 0.741]], [0.170, [0.000, 0.000, 0.741]], [0.172, [0.000, 0.000, 0.757]], [0.174, [0.000, 0.000, 0.757]], [0.176, [0.000, 0.000, 0.773]], [0.178, [0.000, 0.000, 0.773]], [0.180, [0.000, 0.000, 0.788]], [0.182, [0.000, 0.000, 0.788]], [0.184, [0.000, 0.000, 0.804]], [0.186, [0.000, 0.000, 0.804]], [0.188, [0.000, 0.000, 0.820]], [0.190, [0.000, 0.000, 0.820]], [0.192, [0.000, 0.000, 0.835]], [0.194, [0.000, 0.000, 0.835]], [0.196, [0.000, 0.000, 0.851]], [0.198, [0.000, 0.000, 0.851]], [0.200, [0.000, 0.000, 0.867]], [0.202, [0.000, 0.000, 0.867]], [0.204, [0.000, 0.037, 0.867]], [0.205, [0.000, 0.037, 0.867]], [0.207, [0.000, 0.073, 0.867]], [0.209, [0.000, 0.073, 0.867]], [0.211, [0.000, 0.110, 0.867]], [0.213, [0.000, 0.110, 0.867]], [0.215, [0.000, 0.146, 0.867]], [0.217, [0.000, 0.146, 0.867]], [0.219, [0.000, 0.183, 0.867]], [0.221, [0.000, 0.183, 0.867]], [0.223, [0.000, 0.220, 0.867]], [0.225, [0.000, 0.220, 0.867]], [0.227, [0.000, 0.256, 0.867]], [0.229, [0.000, 0.256, 0.867]], [0.231, [0.000, 0.293, 0.867]], [0.233, [0.000, 0.293, 0.867]], [0.235, [0.000, 0.329, 0.867]], [0.237, [0.000, 0.329, 0.867]], [0.239, [0.000, 0.366, 0.867]], [0.241, [0.000, 0.366, 0.867]], [0.243, [0.000, 0.403, 0.867]], [0.245, [0.000, 0.403, 0.867]], [0.247, [0.000, 0.439, 0.867]], [0.249, [0.000, 0.439, 0.867]], [0.250, [0.000, 0.469, 0.867]], [0.252, [0.000, 0.469, 0.867]], [0.254, [0.000, 0.480, 0.867]], [0.256, [0.000, 0.480, 0.867]], [0.258, [0.000, 0.490, 0.867]], [0.260, [0.000, 0.490, 0.867]], [0.262, [0.000, 0.501, 0.867]], [0.264, [0.000, 0.501, 0.867]], [0.266, [0.000, 0.511, 0.867]], [0.268, [0.000, 0.511, 0.867]], [0.270, [0.000, 0.522, 0.867]], [0.272, [0.000, 0.522, 0.867]], [0.274, [0.000, 0.532, 0.867]], [0.276, [0.000, 0.532, 0.867]], [0.278, [0.000, 0.542, 0.867]], [0.280, [0.000, 0.542, 0.867]], [0.282, [0.000, 0.553, 0.867]], [0.284, [0.000, 0.553, 0.867]], [0.286, [0.000, 0.563, 0.867]], [0.288, [0.000, 0.563, 0.867]], [0.290, [0.000, 0.574, 0.867]], [0.292, [0.000, 0.574, 0.867]], [0.294, [0.000, 0.584, 0.867]], [0.295, [0.000, 0.584, 0.867]], [0.297, [0.000, 0.595, 0.867]], [0.299, [0.000, 0.595, 0.867]], [0.301, [0.000, 0.603, 0.859]], [0.303, [0.000, 0.603, 0.859]], [0.305, [0.000, 0.608, 0.843]], [0.307, [0.000, 0.608, 0.843]], [0.309, [0.000, 0.613, 0.827]], [0.311, [0.000, 0.613, 0.827]], [0.313, [0.000, 0.618, 0.812]], [0.315, [0.000, 0.618, 0.812]], [0.317, [0.000, 0.624, 0.796]], [0.319, [0.000, 0.624, 0.796]], [0.321, [0.000, 0.629, 0.780]], [0.323, [0.000, 0.629, 0.780]], [0.325, [0.000, 0.634, 0.765]], [0.327, [0.000, 0.634, 0.765]], [0.329, [0.000, 0.639, 0.749]], [0.331, [0.000, 0.639, 0.749]], [0.333, [0.000, 0.644, 0.733]], [0.335, [0.000, 0.644, 0.733]], [0.337, [0.000, 0.650, 0.718]], [0.339, [0.000, 0.650, 0.718]], [0.341, [0.000, 0.655, 0.702]], [0.342, [0.000, 0.655, 0.702]], [0.344, [0.000, 0.660, 0.686]], [0.346, [0.000, 0.660, 0.686]], [0.348, [0.000, 0.665, 0.671]], [0.350, [0.000, 0.665, 0.671]], [0.352, [0.000, 0.667, 0.659]], [0.354, [0.000, 0.667, 0.659]], [0.356, [0.000, 0.667, 0.648]], [0.358, [0.000, 0.667, 0.648]], [0.360, [0.000, 0.667, 0.638]], [0.362, [0.000, 0.667, 0.638]], [0.364, [0.000, 0.667, 0.627]], [0.366, [0.000, 0.667, 0.627]], [0.368, [0.000, 0.667, 0.617]], [0.370, [0.000, 0.667, 0.617]], [0.372, [0.000, 0.667, 0.607]], [0.374, [0.000, 0.667, 0.607]], [0.376, [0.000, 0.667, 0.596]], [0.378, [0.000, 0.667, 0.596]], [0.380, [0.000, 0.667, 0.586]], [0.382, [0.000, 0.667, 0.586]], [0.384, [0.000, 0.667, 0.575]], [0.386, [0.000, 0.667, 0.575]], [0.387, [0.000, 0.667, 0.565]], [0.389, [0.000, 0.667, 0.565]], [0.391, [0.000, 0.667, 0.554]], [0.393, [0.000, 0.667, 0.554]], [0.395, [0.000, 0.667, 0.544]], [0.397, [0.000, 0.667, 0.544]], [0.399, [0.000, 0.667, 0.533]], [0.401, [0.000, 0.667, 0.533]], [0.403, [0.000, 0.661, 0.491]], [0.405, [0.000, 0.661, 0.491]], [0.407, [0.000, 0.656, 0.450]], [0.409, [0.000, 0.656, 0.450]], [0.411, [0.000, 0.651, 0.408]], [0.413, [0.000, 0.651, 0.408]], [0.415, [0.000, 0.646, 0.366]], [0.417, [0.000, 0.646, 0.366]], [0.419, [0.000, 0.641, 0.324]], [0.421, [0.000, 0.641, 0.324]], [0.423, [0.000, 0.635, 0.282]], [0.425, [0.000, 0.635, 0.282]], [0.427, [0.000, 0.630, 0.241]], [0.429, [0.000, 0.630, 0.241]], [0.431, [0.000, 0.625, 0.199]], [0.432, [0.000, 0.625, 0.199]], [0.434, [0.000, 0.620, 0.157]], [0.436, [0.000, 0.620, 0.157]], [0.438, [0.000, 0.614, 0.115]], [0.440, [0.000, 0.614, 0.115]], [0.442, [0.000, 0.609, 0.073]], [0.444, [0.000, 0.609, 0.073]], [0.446, [0.000, 0.604, 0.031]], [0.448, [0.000, 0.604, 0.031]], [0.450, [0.000, 0.603, 0.000]], [0.452, [0.000, 0.603, 0.000]], [0.454, [0.000, 0.613, 0.000]], [0.456, [0.000, 0.613, 0.000]], [0.458, [0.000, 0.624, 0.000]], [0.460, [0.000, 0.624, 0.000]], [0.462, [0.000, 0.634, 0.000]], [0.464, [0.000, 0.634, 0.000]], [0.466, [0.000, 0.644, 0.000]], [0.468, [0.000, 0.644, 0.000]], [0.470, [0.000, 0.655, 0.000]], [0.472, [0.000, 0.655, 0.000]], [0.474, [0.000, 0.665, 0.000]], [0.476, [0.000, 0.665, 0.000]], [0.477, [0.000, 0.676, 0.000]], [0.479, [0.000, 0.676, 0.000]], [0.481, [0.000, 0.686, 0.000]], [0.483, [0.000, 0.686, 0.000]], [0.485, [0.000, 0.697, 0.000]], [0.487, [0.000, 0.697, 0.000]], [0.489, [0.000, 0.707, 0.000]], [0.491, [0.000, 0.707, 0.000]], [0.493, [0.000, 0.718, 0.000]], [0.495, [0.000, 0.718, 0.000]], [0.497, [0.000, 0.728, 0.000]], [0.499, [0.000, 0.728, 0.000]], [0.501, [0.000, 0.739, 0.000]], [0.503, [0.000, 0.739, 0.000]], [0.505, [0.000, 0.749, 0.000]], [0.507, [0.000, 0.749, 0.000]], [0.509, [0.000, 0.759, 0.000]], [0.511, [0.000, 0.759, 0.000]], [0.513, [0.000, 0.770, 0.000]], [0.515, [0.000, 0.770, 0.000]], [0.517, [0.000, 0.780, 0.000]], [0.519, [0.000, 0.780, 0.000]], [0.521, [0.000, 0.791, 0.000]], [0.523, [0.000, 0.791, 0.000]], [0.524, [0.000, 0.801, 0.000]], [0.526, [0.000, 0.801, 0.000]], [0.528, [0.000, 0.812, 0.000]], [0.530, [0.000, 0.812, 0.000]], [0.532, [0.000, 0.822, 0.000]], [0.534, [0.000, 0.822, 0.000]], [0.536, [0.000, 0.833, 0.000]], [0.538, [0.000, 0.833, 0.000]], [0.540, [0.000, 0.843, 0.000]], [0.542, [0.000, 0.843, 0.000]], [0.544, [0.000, 0.854, 0.000]], [0.546, [0.000, 0.854, 0.000]], [0.548, [0.000, 0.864, 0.000]], [0.550, [0.000, 0.864, 0.000]], [0.552, [0.000, 0.875, 0.000]], [0.554, [0.000, 0.875, 0.000]], [0.556, [0.000, 0.885, 0.000]], [0.558, [0.000, 0.885, 0.000]], [0.560, [0.000, 0.895, 0.000]], [0.562, [0.000, 0.895, 0.000]], [0.564, [0.000, 0.906, 0.000]], [0.566, [0.000, 0.906, 0.000]], [0.568, [0.000, 0.916, 0.000]], [0.569, [0.000, 0.916, 0.000]], [0.571, [0.000, 0.927, 0.000]], [0.573, [0.000, 0.927, 0.000]], [0.575, [0.000, 0.937, 0.000]], [0.577, [0.000, 0.937, 0.000]], [0.579, [0.000, 0.948, 0.000]], [0.581, [0.000, 0.948, 0.000]], [0.583, [0.000, 0.958, 0.000]], [0.585, [0.000, 0.958, 0.000]], [0.587, [0.000, 0.969, 0.000]], [0.589, [0.000, 0.969, 0.000]], [0.591, [0.000, 0.979, 0.000]], [0.593, [0.000, 0.979, 0.000]], [0.595, [0.000, 0.990, 0.000]], [0.597, [0.000, 0.990, 0.000]], [0.599, [0.000, 1.000, 0.000]], [0.601, [0.000, 1.000, 0.000]], [0.603, [0.058, 1.000, 0.000]], [0.605, [0.058, 1.000, 0.000]], [0.607, [0.115, 1.000, 0.000]], [0.609, [0.115, 1.000, 0.000]], [0.611, [0.173, 1.000, 0.000]], [0.613, [0.173, 1.000, 0.000]], [0.614, [0.230, 1.000, 0.000]], [0.616, [0.230, 1.000, 0.000]], [0.618, [0.288, 1.000, 0.000]], [0.620, [0.288, 1.000, 0.000]], [0.622, [0.345, 1.000, 0.000]], [0.624, [0.345, 1.000, 0.000]], [0.626, [0.403, 1.000, 0.000]], [0.628, [0.403, 1.000, 0.000]], [0.630, [0.460, 1.000, 0.000]], [0.632, [0.460, 1.000, 0.000]], [0.634, [0.518, 1.000, 0.000]], [0.636, [0.518, 1.000, 0.000]], [0.638, [0.575, 1.000, 0.000]], [0.640, [0.575, 1.000, 0.000]], [0.642, [0.633, 1.000, 0.000]], [0.644, [0.633, 1.000, 0.000]], [0.646, [0.690, 1.000, 0.000]], [0.648, [0.690, 1.000, 0.000]], [0.650, [0.737, 0.999, 0.000]], [0.652, [0.737, 0.999, 0.000]], [0.654, [0.753, 0.993, 0.000]], [0.656, [0.753, 0.993, 0.000]], [0.658, [0.769, 0.988, 0.000]], [0.659, [0.769, 0.988, 0.000]], [0.661, [0.784, 0.983, 0.000]], [0.663, [0.784, 0.983, 0.000]], [0.665, [0.800, 0.978, 0.000]], [0.667, [0.800, 0.978, 0.000]], [0.669, [0.816, 0.973, 0.000]], [0.671, [0.816, 0.973, 0.000]], [0.673, [0.831, 0.967, 0.000]], [0.675, [0.831, 0.967, 0.000]], [0.677, [0.847, 0.962, 0.000]], [0.679, [0.847, 0.962, 0.000]], [0.681, [0.863, 0.957, 0.000]], [0.683, [0.863, 0.957, 0.000]], [0.685, [0.878, 0.952, 0.000]], [0.687, [0.878, 0.952, 0.000]], [0.689, [0.894, 0.946, 0.000]], [0.691, [0.894, 0.946, 0.000]], [0.693, [0.910, 0.941, 0.000]], [0.695, [0.910, 0.941, 0.000]], [0.697, [0.925, 0.936, 0.000]], [0.699, [0.925, 0.936, 0.000]], [0.701, [0.936, 0.928, 0.000]], [0.703, [0.936, 0.928, 0.000]], [0.705, [0.941, 0.918, 0.000]], [0.706, [0.941, 0.918, 0.000]], [0.708, [0.946, 0.907, 0.000]], [0.710, [0.946, 0.907, 0.000]], [0.712, [0.952, 0.897, 0.000]], [0.714, [0.952, 0.897, 0.000]], [0.716, [0.957, 0.886, 0.000]], [0.718, [0.957, 0.886, 0.000]], [0.720, [0.962, 0.876, 0.000]], [0.722, [0.962, 0.876, 0.000]], [0.724, [0.967, 0.865, 0.000]], [0.726, [0.967, 0.865, 0.000]], [0.728, [0.973, 0.855, 0.000]], [0.730, [0.973, 0.855, 0.000]], [0.732, [0.978, 0.844, 0.000]], [0.734, [0.978, 0.844, 0.000]], [0.736, [0.983, 0.834, 0.000]], [0.738, [0.983, 0.834, 0.000]], [0.740, [0.988, 0.824, 0.000]], [0.742, [0.988, 0.824, 0.000]], [0.744, [0.993, 0.813, 0.000]], [0.746, [0.993, 0.813, 0.000]], [0.748, [0.999, 0.803, 0.000]], [0.750, [0.999, 0.803, 0.000]], [0.751, [1.000, 0.788, 0.000]], [0.753, [1.000, 0.788, 0.000]], [0.755, [1.000, 0.773, 0.000]], [0.757, [1.000, 0.773, 0.000]], [0.759, [1.000, 0.757, 0.000]], [0.761, [1.000, 0.757, 0.000]], [0.763, [1.000, 0.741, 0.000]], [0.765, [1.000, 0.741, 0.000]], [0.767, [1.000, 0.725, 0.000]], [0.769, [1.000, 0.725, 0.000]], [0.771, [1.000, 0.710, 0.000]], [0.773, [1.000, 0.710, 0.000]], [0.775, [1.000, 0.694, 0.000]], [0.777, [1.000, 0.694, 0.000]], [0.779, [1.000, 0.678, 0.000]], [0.781, [1.000, 0.678, 0.000]], [0.783, [1.000, 0.663, 0.000]], [0.785, [1.000, 0.663, 0.000]], [0.787, [1.000, 0.647, 0.000]], [0.789, [1.000, 0.647, 0.000]], [0.791, [1.000, 0.631, 0.000]], [0.793, [1.000, 0.631, 0.000]], [0.795, [1.000, 0.616, 0.000]], [0.796, [1.000, 0.616, 0.000]], [0.798, [1.000, 0.600, 0.000]], [0.800, [1.000, 0.600, 0.000]], [0.802, [1.000, 0.553, 0.000]], [0.804, [1.000, 0.553, 0.000]], [0.806, [1.000, 0.506, 0.000]], [0.808, [1.000, 0.506, 0.000]], [0.810, [1.000, 0.459, 0.000]], [0.812, [1.000, 0.459, 0.000]], [0.814, [1.000, 0.412, 0.000]], [0.816, [1.000, 0.412, 0.000]], [0.818, [1.000, 0.365, 0.000]], [0.820, [1.000, 0.365, 0.000]], [0.822, [1.000, 0.318, 0.000]], [0.824, [1.000, 0.318, 0.000]], [0.826, [1.000, 0.271, 0.000]], [0.828, [1.000, 0.271, 0.000]], [0.830, [1.000, 0.224, 0.000]], [0.832, [1.000, 0.224, 0.000]], [0.834, [1.000, 0.176, 0.000]], [0.836, [1.000, 0.176, 0.000]], [0.838, [1.000, 0.129, 0.000]], [0.840, [1.000, 0.129, 0.000]], [0.841, [1.000, 0.082, 0.000]], [0.843, [1.000, 0.082, 0.000]], [0.845, [1.000, 0.035, 0.000]], [0.847, [1.000, 0.035, 0.000]], [0.849, [0.997, 0.000, 0.000]], [0.851, [0.997, 0.000, 0.000]], [0.853, [0.987, 0.000, 0.000]], [0.855, [0.987, 0.000, 0.000]], [0.857, [0.976, 0.000, 0.000]], [0.859, [0.976, 0.000, 0.000]], [0.861, [0.966, 0.000, 0.000]], [0.863, [0.966, 0.000, 0.000]], [0.865, [0.956, 0.000, 0.000]], [0.867, [0.956, 0.000, 0.000]], [0.869, [0.945, 0.000, 0.000]], [0.871, [0.945, 0.000, 0.000]], [0.873, [0.935, 0.000, 0.000]], [0.875, [0.935, 0.000, 0.000]], [0.877, [0.924, 0.000, 0.000]], [0.879, [0.924, 0.000, 0.000]], [0.881, [0.914, 0.000, 0.000]], [0.883, [0.914, 0.000, 0.000]], [0.885, [0.903, 0.000, 0.000]], [0.886, [0.903, 0.000, 0.000]], [0.888, [0.893, 0.000, 0.000]], [0.890, [0.893, 0.000, 0.000]], [0.892, [0.882, 0.000, 0.000]], [0.894, [0.882, 0.000, 0.000]], [0.896, [0.872, 0.000, 0.000]], [0.898, [0.872, 0.000, 0.000]], [0.900, [0.864, 0.000, 0.000]], [0.902, [0.864, 0.000, 0.000]], [0.904, [0.859, 0.000, 0.000]], [0.906, [0.859, 0.000, 0.000]], [0.908, [0.854, 0.000, 0.000]], [0.910, [0.854, 0.000, 0.000]], [0.912, [0.848, 0.000, 0.000]], [0.914, [0.848, 0.000, 0.000]], [0.916, [0.843, 0.000, 0.000]], [0.918, [0.843, 0.000, 0.000]], [0.920, [0.838, 0.000, 0.000]], [0.922, [0.838, 0.000, 0.000]], [0.924, [0.833, 0.000, 0.000]], [0.926, [0.833, 0.000, 0.000]], [0.928, [0.827, 0.000, 0.000]], [0.930, [0.827, 0.000, 0.000]], [0.932, [0.822, 0.000, 0.000]], [0.933, [0.822, 0.000, 0.000]], [0.935, [0.817, 0.000, 0.000]], [0.937, [0.817, 0.000, 0.000]], [0.939, [0.812, 0.000, 0.000]], [0.941, [0.812, 0.000, 0.000]], [0.943, [0.807, 0.000, 0.000]], [0.945, [0.807, 0.000, 0.000]], [0.947, [0.801, 0.000, 0.000]], [0.949, [0.801, 0.000, 0.000]], [0.951, [0.800, 0.047, 0.047]], [0.953, [0.800, 0.047, 0.047]], [0.955, [0.800, 0.110, 0.110]], [0.957, [0.800, 0.110, 0.110]], [0.959, [0.800, 0.173, 0.173]], [0.961, [0.800, 0.173, 0.173]], [0.963, [0.800, 0.235, 0.235]], [0.965, [0.800, 0.235, 0.235]], [0.967, [0.800, 0.298, 0.298]], [0.969, [0.800, 0.298, 0.298]], [0.971, [0.800, 0.361, 0.361]], [0.973, [0.800, 0.361, 0.361]], [0.975, [0.800, 0.424, 0.424]], [0.977, [0.800, 0.424, 0.424]], [0.978, [0.800, 0.486, 0.486]], [0.980, [0.800, 0.486, 0.486]], [0.982, [0.800, 0.549, 0.549]], [0.984, [0.800, 0.549, 0.549]], [0.986, [0.800, 0.612, 0.612]], [0.988, [0.800, 0.612, 0.612]], [0.990, [0.800, 0.675, 0.675]], [0.992, [0.800, 0.675, 0.675]], [0.994, [0.800, 0.737, 0.737]], [0.996, [0.800, 0.737, 0.737]], [0.998, [0.800, 0.800, 0.800]], [1.000, [0.800, 0.800, 0.800]]]; +var ocean = [[0.000, [0.000, 0.500, 0.000]], [0.002, [0.000, 0.500, 0.000]], [0.004, [0.000, 0.494, 0.004]], [0.006, [0.000, 0.494, 0.004]], [0.008, [0.000, 0.488, 0.008]], [0.010, [0.000, 0.488, 0.008]], [0.012, [0.000, 0.482, 0.012]], [0.014, [0.000, 0.482, 0.012]], [0.016, [0.000, 0.476, 0.016]], [0.018, [0.000, 0.476, 0.016]], [0.020, [0.000, 0.471, 0.020]], [0.022, [0.000, 0.471, 0.020]], [0.023, [0.000, 0.465, 0.024]], [0.025, [0.000, 0.465, 0.024]], [0.027, [0.000, 0.459, 0.027]], [0.029, [0.000, 0.459, 0.027]], [0.031, [0.000, 0.453, 0.031]], [0.033, [0.000, 0.453, 0.031]], [0.035, [0.000, 0.447, 0.035]], [0.037, [0.000, 0.447, 0.035]], [0.039, [0.000, 0.441, 0.039]], [0.041, [0.000, 0.441, 0.039]], [0.043, [0.000, 0.435, 0.043]], [0.045, [0.000, 0.435, 0.043]], [0.047, [0.000, 0.429, 0.047]], [0.049, [0.000, 0.429, 0.047]], [0.051, [0.000, 0.424, 0.051]], [0.053, [0.000, 0.424, 0.051]], [0.055, [0.000, 0.418, 0.055]], [0.057, [0.000, 0.418, 0.055]], [0.059, [0.000, 0.412, 0.059]], [0.061, [0.000, 0.412, 0.059]], [0.063, [0.000, 0.406, 0.063]], [0.065, [0.000, 0.406, 0.063]], [0.067, [0.000, 0.400, 0.067]], [0.068, [0.000, 0.400, 0.067]], [0.070, [0.000, 0.394, 0.071]], [0.072, [0.000, 0.394, 0.071]], [0.074, [0.000, 0.388, 0.075]], [0.076, [0.000, 0.388, 0.075]], [0.078, [0.000, 0.382, 0.078]], [0.080, [0.000, 0.382, 0.078]], [0.082, [0.000, 0.376, 0.082]], [0.084, [0.000, 0.376, 0.082]], [0.086, [0.000, 0.371, 0.086]], [0.088, [0.000, 0.371, 0.086]], [0.090, [0.000, 0.365, 0.090]], [0.092, [0.000, 0.365, 0.090]], [0.094, [0.000, 0.359, 0.094]], [0.096, [0.000, 0.359, 0.094]], [0.098, [0.000, 0.353, 0.098]], [0.100, [0.000, 0.353, 0.098]], [0.102, [0.000, 0.347, 0.102]], [0.104, [0.000, 0.347, 0.102]], [0.106, [0.000, 0.341, 0.106]], [0.108, [0.000, 0.341, 0.106]], [0.110, [0.000, 0.335, 0.110]], [0.112, [0.000, 0.335, 0.110]], [0.114, [0.000, 0.329, 0.114]], [0.115, [0.000, 0.329, 0.114]], [0.117, [0.000, 0.324, 0.118]], [0.119, [0.000, 0.324, 0.118]], [0.121, [0.000, 0.318, 0.122]], [0.123, [0.000, 0.318, 0.122]], [0.125, [0.000, 0.312, 0.125]], [0.127, [0.000, 0.312, 0.125]], [0.129, [0.000, 0.306, 0.129]], [0.131, [0.000, 0.306, 0.129]], [0.133, [0.000, 0.300, 0.133]], [0.135, [0.000, 0.300, 0.133]], [0.137, [0.000, 0.294, 0.137]], [0.139, [0.000, 0.294, 0.137]], [0.141, [0.000, 0.288, 0.141]], [0.143, [0.000, 0.288, 0.141]], [0.145, [0.000, 0.282, 0.145]], [0.147, [0.000, 0.282, 0.145]], [0.149, [0.000, 0.276, 0.149]], [0.151, [0.000, 0.276, 0.149]], [0.153, [0.000, 0.271, 0.153]], [0.155, [0.000, 0.271, 0.153]], [0.157, [0.000, 0.265, 0.157]], [0.159, [0.000, 0.265, 0.157]], [0.160, [0.000, 0.259, 0.161]], [0.162, [0.000, 0.259, 0.161]], [0.164, [0.000, 0.253, 0.165]], [0.166, [0.000, 0.253, 0.165]], [0.168, [0.000, 0.247, 0.169]], [0.170, [0.000, 0.247, 0.169]], [0.172, [0.000, 0.241, 0.173]], [0.174, [0.000, 0.241, 0.173]], [0.176, [0.000, 0.235, 0.176]], [0.178, [0.000, 0.235, 0.176]], [0.180, [0.000, 0.229, 0.180]], [0.182, [0.000, 0.229, 0.180]], [0.184, [0.000, 0.224, 0.184]], [0.186, [0.000, 0.224, 0.184]], [0.188, [0.000, 0.218, 0.188]], [0.190, [0.000, 0.218, 0.188]], [0.192, [0.000, 0.212, 0.192]], [0.194, [0.000, 0.212, 0.192]], [0.196, [0.000, 0.206, 0.196]], [0.198, [0.000, 0.206, 0.196]], [0.200, [0.000, 0.200, 0.200]], [0.202, [0.000, 0.200, 0.200]], [0.204, [0.000, 0.194, 0.204]], [0.205, [0.000, 0.194, 0.204]], [0.207, [0.000, 0.188, 0.208]], [0.209, [0.000, 0.188, 0.208]], [0.211, [0.000, 0.182, 0.212]], [0.213, [0.000, 0.182, 0.212]], [0.215, [0.000, 0.176, 0.216]], [0.217, [0.000, 0.176, 0.216]], [0.219, [0.000, 0.171, 0.220]], [0.221, [0.000, 0.171, 0.220]], [0.223, [0.000, 0.165, 0.224]], [0.225, [0.000, 0.165, 0.224]], [0.227, [0.000, 0.159, 0.227]], [0.229, [0.000, 0.159, 0.227]], [0.231, [0.000, 0.153, 0.231]], [0.233, [0.000, 0.153, 0.231]], [0.235, [0.000, 0.147, 0.235]], [0.237, [0.000, 0.147, 0.235]], [0.239, [0.000, 0.141, 0.239]], [0.241, [0.000, 0.141, 0.239]], [0.243, [0.000, 0.135, 0.243]], [0.245, [0.000, 0.135, 0.243]], [0.247, [0.000, 0.129, 0.247]], [0.249, [0.000, 0.129, 0.247]], [0.250, [0.000, 0.124, 0.251]], [0.252, [0.000, 0.124, 0.251]], [0.254, [0.000, 0.118, 0.255]], [0.256, [0.000, 0.118, 0.255]], [0.258, [0.000, 0.112, 0.259]], [0.260, [0.000, 0.112, 0.259]], [0.262, [0.000, 0.106, 0.263]], [0.264, [0.000, 0.106, 0.263]], [0.266, [0.000, 0.100, 0.267]], [0.268, [0.000, 0.100, 0.267]], [0.270, [0.000, 0.094, 0.271]], [0.272, [0.000, 0.094, 0.271]], [0.274, [0.000, 0.088, 0.275]], [0.276, [0.000, 0.088, 0.275]], [0.278, [0.000, 0.082, 0.278]], [0.280, [0.000, 0.082, 0.278]], [0.282, [0.000, 0.076, 0.282]], [0.284, [0.000, 0.076, 0.282]], [0.286, [0.000, 0.071, 0.286]], [0.288, [0.000, 0.071, 0.286]], [0.290, [0.000, 0.065, 0.290]], [0.292, [0.000, 0.065, 0.290]], [0.294, [0.000, 0.059, 0.294]], [0.295, [0.000, 0.059, 0.294]], [0.297, [0.000, 0.053, 0.298]], [0.299, [0.000, 0.053, 0.298]], [0.301, [0.000, 0.047, 0.302]], [0.303, [0.000, 0.047, 0.302]], [0.305, [0.000, 0.041, 0.306]], [0.307, [0.000, 0.041, 0.306]], [0.309, [0.000, 0.035, 0.310]], [0.311, [0.000, 0.035, 0.310]], [0.313, [0.000, 0.029, 0.314]], [0.315, [0.000, 0.029, 0.314]], [0.317, [0.000, 0.024, 0.318]], [0.319, [0.000, 0.024, 0.318]], [0.321, [0.000, 0.018, 0.322]], [0.323, [0.000, 0.018, 0.322]], [0.325, [0.000, 0.012, 0.325]], [0.327, [0.000, 0.012, 0.325]], [0.329, [0.000, 0.006, 0.329]], [0.331, [0.000, 0.006, 0.329]], [0.333, [0.000, 0.000, 0.333]], [0.335, [0.000, 0.000, 0.333]], [0.337, [0.000, 0.006, 0.337]], [0.339, [0.000, 0.006, 0.337]], [0.341, [0.000, 0.012, 0.341]], [0.342, [0.000, 0.012, 0.341]], [0.344, [0.000, 0.018, 0.345]], [0.346, [0.000, 0.018, 0.345]], [0.348, [0.000, 0.024, 0.349]], [0.350, [0.000, 0.024, 0.349]], [0.352, [0.000, 0.029, 0.353]], [0.354, [0.000, 0.029, 0.353]], [0.356, [0.000, 0.035, 0.357]], [0.358, [0.000, 0.035, 0.357]], [0.360, [0.000, 0.041, 0.361]], [0.362, [0.000, 0.041, 0.361]], [0.364, [0.000, 0.047, 0.365]], [0.366, [0.000, 0.047, 0.365]], [0.368, [0.000, 0.053, 0.369]], [0.370, [0.000, 0.053, 0.369]], [0.372, [0.000, 0.059, 0.373]], [0.374, [0.000, 0.059, 0.373]], [0.376, [0.000, 0.065, 0.376]], [0.378, [0.000, 0.065, 0.376]], [0.380, [0.000, 0.071, 0.380]], [0.382, [0.000, 0.071, 0.380]], [0.384, [0.000, 0.076, 0.384]], [0.386, [0.000, 0.076, 0.384]], [0.387, [0.000, 0.082, 0.388]], [0.389, [0.000, 0.082, 0.388]], [0.391, [0.000, 0.088, 0.392]], [0.393, [0.000, 0.088, 0.392]], [0.395, [0.000, 0.094, 0.396]], [0.397, [0.000, 0.094, 0.396]], [0.399, [0.000, 0.100, 0.400]], [0.401, [0.000, 0.100, 0.400]], [0.403, [0.000, 0.106, 0.404]], [0.405, [0.000, 0.106, 0.404]], [0.407, [0.000, 0.112, 0.408]], [0.409, [0.000, 0.112, 0.408]], [0.411, [0.000, 0.118, 0.412]], [0.413, [0.000, 0.118, 0.412]], [0.415, [0.000, 0.124, 0.416]], [0.417, [0.000, 0.124, 0.416]], [0.419, [0.000, 0.129, 0.420]], [0.421, [0.000, 0.129, 0.420]], [0.423, [0.000, 0.135, 0.424]], [0.425, [0.000, 0.135, 0.424]], [0.427, [0.000, 0.141, 0.427]], [0.429, [0.000, 0.141, 0.427]], [0.431, [0.000, 0.147, 0.431]], [0.432, [0.000, 0.147, 0.431]], [0.434, [0.000, 0.153, 0.435]], [0.436, [0.000, 0.153, 0.435]], [0.438, [0.000, 0.159, 0.439]], [0.440, [0.000, 0.159, 0.439]], [0.442, [0.000, 0.165, 0.443]], [0.444, [0.000, 0.165, 0.443]], [0.446, [0.000, 0.171, 0.447]], [0.448, [0.000, 0.171, 0.447]], [0.450, [0.000, 0.176, 0.451]], [0.452, [0.000, 0.176, 0.451]], [0.454, [0.000, 0.182, 0.455]], [0.456, [0.000, 0.182, 0.455]], [0.458, [0.000, 0.188, 0.459]], [0.460, [0.000, 0.188, 0.459]], [0.462, [0.000, 0.194, 0.463]], [0.464, [0.000, 0.194, 0.463]], [0.466, [0.000, 0.200, 0.467]], [0.468, [0.000, 0.200, 0.467]], [0.470, [0.000, 0.206, 0.471]], [0.472, [0.000, 0.206, 0.471]], [0.474, [0.000, 0.212, 0.475]], [0.476, [0.000, 0.212, 0.475]], [0.477, [0.000, 0.218, 0.478]], [0.479, [0.000, 0.218, 0.478]], [0.481, [0.000, 0.224, 0.482]], [0.483, [0.000, 0.224, 0.482]], [0.485, [0.000, 0.229, 0.486]], [0.487, [0.000, 0.229, 0.486]], [0.489, [0.000, 0.235, 0.490]], [0.491, [0.000, 0.235, 0.490]], [0.493, [0.000, 0.241, 0.494]], [0.495, [0.000, 0.241, 0.494]], [0.497, [0.000, 0.247, 0.498]], [0.499, [0.000, 0.247, 0.498]], [0.501, [0.000, 0.253, 0.502]], [0.503, [0.000, 0.253, 0.502]], [0.505, [0.000, 0.259, 0.506]], [0.507, [0.000, 0.259, 0.506]], [0.509, [0.000, 0.265, 0.510]], [0.511, [0.000, 0.265, 0.510]], [0.513, [0.000, 0.271, 0.514]], [0.515, [0.000, 0.271, 0.514]], [0.517, [0.000, 0.276, 0.518]], [0.519, [0.000, 0.276, 0.518]], [0.521, [0.000, 0.282, 0.522]], [0.523, [0.000, 0.282, 0.522]], [0.524, [0.000, 0.288, 0.525]], [0.526, [0.000, 0.288, 0.525]], [0.528, [0.000, 0.294, 0.529]], [0.530, [0.000, 0.294, 0.529]], [0.532, [0.000, 0.300, 0.533]], [0.534, [0.000, 0.300, 0.533]], [0.536, [0.000, 0.306, 0.537]], [0.538, [0.000, 0.306, 0.537]], [0.540, [0.000, 0.312, 0.541]], [0.542, [0.000, 0.312, 0.541]], [0.544, [0.000, 0.318, 0.545]], [0.546, [0.000, 0.318, 0.545]], [0.548, [0.000, 0.324, 0.549]], [0.550, [0.000, 0.324, 0.549]], [0.552, [0.000, 0.329, 0.553]], [0.554, [0.000, 0.329, 0.553]], [0.556, [0.000, 0.335, 0.557]], [0.558, [0.000, 0.335, 0.557]], [0.560, [0.000, 0.341, 0.561]], [0.562, [0.000, 0.341, 0.561]], [0.564, [0.000, 0.347, 0.565]], [0.566, [0.000, 0.347, 0.565]], [0.568, [0.000, 0.353, 0.569]], [0.569, [0.000, 0.353, 0.569]], [0.571, [0.000, 0.359, 0.573]], [0.573, [0.000, 0.359, 0.573]], [0.575, [0.000, 0.365, 0.576]], [0.577, [0.000, 0.365, 0.576]], [0.579, [0.000, 0.371, 0.580]], [0.581, [0.000, 0.371, 0.580]], [0.583, [0.000, 0.376, 0.584]], [0.585, [0.000, 0.376, 0.584]], [0.587, [0.000, 0.382, 0.588]], [0.589, [0.000, 0.382, 0.588]], [0.591, [0.000, 0.388, 0.592]], [0.593, [0.000, 0.388, 0.592]], [0.595, [0.000, 0.394, 0.596]], [0.597, [0.000, 0.394, 0.596]], [0.599, [0.000, 0.400, 0.600]], [0.601, [0.000, 0.400, 0.600]], [0.603, [0.000, 0.406, 0.604]], [0.605, [0.000, 0.406, 0.604]], [0.607, [0.000, 0.412, 0.608]], [0.609, [0.000, 0.412, 0.608]], [0.611, [0.000, 0.418, 0.612]], [0.613, [0.000, 0.418, 0.612]], [0.614, [0.000, 0.424, 0.616]], [0.616, [0.000, 0.424, 0.616]], [0.618, [0.000, 0.429, 0.620]], [0.620, [0.000, 0.429, 0.620]], [0.622, [0.000, 0.435, 0.624]], [0.624, [0.000, 0.435, 0.624]], [0.626, [0.000, 0.441, 0.627]], [0.628, [0.000, 0.441, 0.627]], [0.630, [0.000, 0.447, 0.631]], [0.632, [0.000, 0.447, 0.631]], [0.634, [0.000, 0.453, 0.635]], [0.636, [0.000, 0.453, 0.635]], [0.638, [0.000, 0.459, 0.639]], [0.640, [0.000, 0.459, 0.639]], [0.642, [0.000, 0.465, 0.643]], [0.644, [0.000, 0.465, 0.643]], [0.646, [0.000, 0.471, 0.647]], [0.648, [0.000, 0.471, 0.647]], [0.650, [0.000, 0.476, 0.651]], [0.652, [0.000, 0.476, 0.651]], [0.654, [0.000, 0.482, 0.655]], [0.656, [0.000, 0.482, 0.655]], [0.658, [0.000, 0.488, 0.659]], [0.659, [0.000, 0.488, 0.659]], [0.661, [0.000, 0.494, 0.663]], [0.663, [0.000, 0.494, 0.663]], [0.665, [0.000, 0.500, 0.667]], [0.667, [0.000, 0.500, 0.667]], [0.669, [0.012, 0.506, 0.671]], [0.671, [0.012, 0.506, 0.671]], [0.673, [0.024, 0.512, 0.675]], [0.675, [0.024, 0.512, 0.675]], [0.677, [0.035, 0.518, 0.678]], [0.679, [0.035, 0.518, 0.678]], [0.681, [0.047, 0.524, 0.682]], [0.683, [0.047, 0.524, 0.682]], [0.685, [0.059, 0.529, 0.686]], [0.687, [0.059, 0.529, 0.686]], [0.689, [0.071, 0.535, 0.690]], [0.691, [0.071, 0.535, 0.690]], [0.693, [0.082, 0.541, 0.694]], [0.695, [0.082, 0.541, 0.694]], [0.697, [0.094, 0.547, 0.698]], [0.699, [0.094, 0.547, 0.698]], [0.701, [0.106, 0.553, 0.702]], [0.703, [0.106, 0.553, 0.702]], [0.705, [0.118, 0.559, 0.706]], [0.706, [0.118, 0.559, 0.706]], [0.708, [0.129, 0.565, 0.710]], [0.710, [0.129, 0.565, 0.710]], [0.712, [0.141, 0.571, 0.714]], [0.714, [0.141, 0.571, 0.714]], [0.716, [0.153, 0.576, 0.718]], [0.718, [0.153, 0.576, 0.718]], [0.720, [0.165, 0.582, 0.722]], [0.722, [0.165, 0.582, 0.722]], [0.724, [0.176, 0.588, 0.725]], [0.726, [0.176, 0.588, 0.725]], [0.728, [0.188, 0.594, 0.729]], [0.730, [0.188, 0.594, 0.729]], [0.732, [0.200, 0.600, 0.733]], [0.734, [0.200, 0.600, 0.733]], [0.736, [0.212, 0.606, 0.737]], [0.738, [0.212, 0.606, 0.737]], [0.740, [0.224, 0.612, 0.741]], [0.742, [0.224, 0.612, 0.741]], [0.744, [0.235, 0.618, 0.745]], [0.746, [0.235, 0.618, 0.745]], [0.748, [0.247, 0.624, 0.749]], [0.750, [0.247, 0.624, 0.749]], [0.751, [0.259, 0.629, 0.753]], [0.753, [0.259, 0.629, 0.753]], [0.755, [0.271, 0.635, 0.757]], [0.757, [0.271, 0.635, 0.757]], [0.759, [0.282, 0.641, 0.761]], [0.761, [0.282, 0.641, 0.761]], [0.763, [0.294, 0.647, 0.765]], [0.765, [0.294, 0.647, 0.765]], [0.767, [0.306, 0.653, 0.769]], [0.769, [0.306, 0.653, 0.769]], [0.771, [0.318, 0.659, 0.773]], [0.773, [0.318, 0.659, 0.773]], [0.775, [0.329, 0.665, 0.776]], [0.777, [0.329, 0.665, 0.776]], [0.779, [0.341, 0.671, 0.780]], [0.781, [0.341, 0.671, 0.780]], [0.783, [0.353, 0.676, 0.784]], [0.785, [0.353, 0.676, 0.784]], [0.787, [0.365, 0.682, 0.788]], [0.789, [0.365, 0.682, 0.788]], [0.791, [0.376, 0.688, 0.792]], [0.793, [0.376, 0.688, 0.792]], [0.795, [0.388, 0.694, 0.796]], [0.796, [0.388, 0.694, 0.796]], [0.798, [0.400, 0.700, 0.800]], [0.800, [0.400, 0.700, 0.800]], [0.802, [0.412, 0.706, 0.804]], [0.804, [0.412, 0.706, 0.804]], [0.806, [0.424, 0.712, 0.808]], [0.808, [0.424, 0.712, 0.808]], [0.810, [0.435, 0.718, 0.812]], [0.812, [0.435, 0.718, 0.812]], [0.814, [0.447, 0.724, 0.816]], [0.816, [0.447, 0.724, 0.816]], [0.818, [0.459, 0.729, 0.820]], [0.820, [0.459, 0.729, 0.820]], [0.822, [0.471, 0.735, 0.824]], [0.824, [0.471, 0.735, 0.824]], [0.826, [0.482, 0.741, 0.827]], [0.828, [0.482, 0.741, 0.827]], [0.830, [0.494, 0.747, 0.831]], [0.832, [0.494, 0.747, 0.831]], [0.834, [0.506, 0.753, 0.835]], [0.836, [0.506, 0.753, 0.835]], [0.838, [0.518, 0.759, 0.839]], [0.840, [0.518, 0.759, 0.839]], [0.841, [0.529, 0.765, 0.843]], [0.843, [0.529, 0.765, 0.843]], [0.845, [0.541, 0.771, 0.847]], [0.847, [0.541, 0.771, 0.847]], [0.849, [0.553, 0.776, 0.851]], [0.851, [0.553, 0.776, 0.851]], [0.853, [0.565, 0.782, 0.855]], [0.855, [0.565, 0.782, 0.855]], [0.857, [0.576, 0.788, 0.859]], [0.859, [0.576, 0.788, 0.859]], [0.861, [0.588, 0.794, 0.863]], [0.863, [0.588, 0.794, 0.863]], [0.865, [0.600, 0.800, 0.867]], [0.867, [0.600, 0.800, 0.867]], [0.869, [0.612, 0.806, 0.871]], [0.871, [0.612, 0.806, 0.871]], [0.873, [0.624, 0.812, 0.875]], [0.875, [0.624, 0.812, 0.875]], [0.877, [0.635, 0.818, 0.878]], [0.879, [0.635, 0.818, 0.878]], [0.881, [0.647, 0.824, 0.882]], [0.883, [0.647, 0.824, 0.882]], [0.885, [0.659, 0.829, 0.886]], [0.886, [0.659, 0.829, 0.886]], [0.888, [0.671, 0.835, 0.890]], [0.890, [0.671, 0.835, 0.890]], [0.892, [0.682, 0.841, 0.894]], [0.894, [0.682, 0.841, 0.894]], [0.896, [0.694, 0.847, 0.898]], [0.898, [0.694, 0.847, 0.898]], [0.900, [0.706, 0.853, 0.902]], [0.902, [0.706, 0.853, 0.902]], [0.904, [0.718, 0.859, 0.906]], [0.906, [0.718, 0.859, 0.906]], [0.908, [0.729, 0.865, 0.910]], [0.910, [0.729, 0.865, 0.910]], [0.912, [0.741, 0.871, 0.914]], [0.914, [0.741, 0.871, 0.914]], [0.916, [0.753, 0.876, 0.918]], [0.918, [0.753, 0.876, 0.918]], [0.920, [0.765, 0.882, 0.922]], [0.922, [0.765, 0.882, 0.922]], [0.924, [0.776, 0.888, 0.925]], [0.926, [0.776, 0.888, 0.925]], [0.928, [0.788, 0.894, 0.929]], [0.930, [0.788, 0.894, 0.929]], [0.932, [0.800, 0.900, 0.933]], [0.933, [0.800, 0.900, 0.933]], [0.935, [0.812, 0.906, 0.937]], [0.937, [0.812, 0.906, 0.937]], [0.939, [0.824, 0.912, 0.941]], [0.941, [0.824, 0.912, 0.941]], [0.943, [0.835, 0.918, 0.945]], [0.945, [0.835, 0.918, 0.945]], [0.947, [0.847, 0.924, 0.949]], [0.949, [0.847, 0.924, 0.949]], [0.951, [0.859, 0.929, 0.953]], [0.953, [0.859, 0.929, 0.953]], [0.955, [0.871, 0.935, 0.957]], [0.957, [0.871, 0.935, 0.957]], [0.959, [0.882, 0.941, 0.961]], [0.961, [0.882, 0.941, 0.961]], [0.963, [0.894, 0.947, 0.965]], [0.965, [0.894, 0.947, 0.965]], [0.967, [0.906, 0.953, 0.969]], [0.969, [0.906, 0.953, 0.969]], [0.971, [0.918, 0.959, 0.973]], [0.973, [0.918, 0.959, 0.973]], [0.975, [0.929, 0.965, 0.976]], [0.977, [0.929, 0.965, 0.976]], [0.978, [0.941, 0.971, 0.980]], [0.980, [0.941, 0.971, 0.980]], [0.982, [0.953, 0.976, 0.984]], [0.984, [0.953, 0.976, 0.984]], [0.986, [0.965, 0.982, 0.988]], [0.988, [0.965, 0.982, 0.988]], [0.990, [0.976, 0.988, 0.992]], [0.992, [0.976, 0.988, 0.992]], [0.994, [0.988, 0.994, 0.996]], [0.996, [0.988, 0.994, 0.996]], [0.998, [1.000, 1.000, 1.000]], [1.000, [1.000, 1.000, 1.000]]]; +var prism = [[0.000, [1.000, 0.000, -0.000]], [0.002, [1.000, 0.000, -0.000]], [0.004, [1.000, 0.000, 0.000]], [0.006, [1.000, 0.000, 0.000]], [0.008, [1.000, 0.130, 0.000]], [0.010, [1.000, 0.130, 0.000]], [0.012, [1.000, 0.320, 0.000]], [0.014, [1.000, 0.320, 0.000]], [0.016, [1.000, 0.512, 0.000]], [0.018, [1.000, 0.512, 0.000]], [0.020, [1.000, 0.691, 0.000]], [0.022, [1.000, 0.691, 0.000]], [0.023, [1.000, 0.846, 0.000]], [0.025, [1.000, 0.846, 0.000]], [0.027, [1.000, 0.968, 0.000]], [0.029, [1.000, 0.968, 0.000]], [0.031, [0.889, 1.000, 0.000]], [0.033, [0.889, 1.000, 0.000]], [0.035, [0.699, 1.000, 0.000]], [0.037, [0.699, 1.000, 0.000]], [0.039, [0.507, 1.000, 0.000]], [0.041, [0.507, 1.000, 0.000]], [0.043, [0.326, 0.997, 0.000]], [0.045, [0.326, 0.997, 0.000]], [0.047, [0.168, 0.887, 0.000]], [0.049, [0.168, 0.887, 0.000]], [0.051, [0.043, 0.741, 0.225]], [0.053, [0.043, 0.741, 0.225]], [0.055, [0.000, 0.567, 0.492]], [0.057, [0.000, 0.567, 0.492]], [0.059, [0.000, 0.378, 0.726]], [0.061, [0.000, 0.378, 0.726]], [0.063, [0.000, 0.186, 0.912]], [0.065, [0.000, 0.186, 0.912]], [0.067, [0.000, 0.004, 1.000]], [0.068, [0.000, 0.004, 1.000]], [0.070, [0.100, 0.000, 1.000]], [0.072, [0.100, 0.000, 1.000]], [0.074, [0.243, 0.000, 1.000]], [0.076, [0.243, 0.000, 1.000]], [0.078, [0.414, 0.000, 0.996]], [0.080, [0.414, 0.000, 0.996]], [0.082, [0.602, 0.000, 0.845]], [0.084, [0.602, 0.000, 0.845]], [0.086, [0.795, 0.000, 0.638]], [0.088, [0.795, 0.000, 0.638]], [0.090, [0.979, 0.000, 0.389]], [0.092, [0.979, 0.000, 0.389]], [0.094, [1.000, 0.000, 0.114]], [0.096, [1.000, 0.000, 0.114]], [0.098, [1.000, 0.000, 0.000]], [0.100, [1.000, 0.000, 0.000]], [0.102, [1.000, 0.056, 0.000]], [0.104, [1.000, 0.056, 0.000]], [0.106, [1.000, 0.243, 0.000]], [0.108, [1.000, 0.243, 0.000]], [0.110, [1.000, 0.435, 0.000]], [0.112, [1.000, 0.435, 0.000]], [0.114, [1.000, 0.621, 0.000]], [0.115, [1.000, 0.621, 0.000]], [0.117, [1.000, 0.787, 0.000]], [0.119, [1.000, 0.787, 0.000]], [0.121, [1.000, 0.924, 0.000]], [0.123, [1.000, 0.924, 0.000]], [0.125, [0.962, 1.000, 0.000]], [0.127, [0.962, 1.000, 0.000]], [0.129, [0.776, 1.000, 0.000]], [0.131, [0.776, 1.000, 0.000]], [0.133, [0.584, 1.000, 0.000]], [0.135, [0.584, 1.000, 0.000]], [0.137, [0.397, 1.000, 0.000]], [0.139, [0.397, 1.000, 0.000]], [0.141, [0.228, 0.936, 0.000]], [0.143, [0.228, 0.936, 0.000]], [0.145, [0.088, 0.803, 0.112]], [0.147, [0.088, 0.803, 0.112]], [0.149, [0.000, 0.640, 0.387]], [0.151, [0.000, 0.640, 0.387]], [0.153, [0.000, 0.456, 0.637]], [0.155, [0.000, 0.456, 0.637]], [0.157, [0.000, 0.263, 0.844]], [0.159, [0.000, 0.263, 0.844]], [0.160, [0.000, 0.075, 0.996]], [0.162, [0.000, 0.075, 0.996]], [0.164, [0.053, 0.000, 1.000]], [0.166, [0.053, 0.000, 1.000]], [0.168, [0.182, 0.000, 1.000]], [0.170, [0.182, 0.000, 1.000]], [0.172, [0.343, 0.000, 1.000]], [0.174, [0.343, 0.000, 1.000]], [0.176, [0.525, 0.000, 0.913]], [0.178, [0.525, 0.000, 0.913]], [0.180, [0.718, 0.000, 0.727]], [0.182, [0.718, 0.000, 0.727]], [0.184, [0.907, 0.000, 0.493]], [0.186, [0.907, 0.000, 0.493]], [0.188, [1.000, 0.000, 0.226]], [0.190, [1.000, 0.000, 0.226]], [0.192, [1.000, 0.000, 0.000]], [0.194, [1.000, 0.000, 0.000]], [0.196, [1.000, 0.000, 0.000]], [0.198, [1.000, 0.000, 0.000]], [0.200, [1.000, 0.166, 0.000]], [0.202, [1.000, 0.166, 0.000]], [0.204, [1.000, 0.358, 0.000]], [0.205, [1.000, 0.358, 0.000]], [0.207, [1.000, 0.548, 0.000]], [0.209, [1.000, 0.548, 0.000]], [0.211, [1.000, 0.724, 0.000]], [0.213, [1.000, 0.724, 0.000]], [0.215, [1.000, 0.873, 0.000]], [0.217, [1.000, 0.873, 0.000]], [0.219, [1.000, 0.987, 0.000]], [0.221, [1.000, 0.987, 0.000]], [0.223, [0.852, 1.000, 0.000]], [0.225, [0.852, 1.000, 0.000]], [0.227, [0.661, 1.000, 0.000]], [0.229, [0.661, 1.000, 0.000]], [0.231, [0.471, 1.000, 0.000]], [0.233, [0.471, 1.000, 0.000]], [0.235, [0.293, 0.978, 0.000]], [0.237, [0.293, 0.978, 0.000]], [0.239, [0.140, 0.861, 0.000]], [0.241, [0.140, 0.861, 0.000]], [0.243, [0.023, 0.709, 0.279]], [0.245, [0.023, 0.709, 0.279]], [0.247, [0.000, 0.531, 0.541]], [0.249, [0.000, 0.531, 0.541]], [0.250, [0.000, 0.341, 0.767]], [0.252, [0.000, 0.341, 0.767]], [0.254, [0.000, 0.149, 0.942]], [0.256, [0.000, 0.149, 0.942]], [0.258, [0.012, 0.000, 1.000]], [0.260, [0.012, 0.000, 1.000]], [0.262, [0.125, 0.000, 1.000]], [0.264, [0.125, 0.000, 1.000]], [0.266, [0.275, 0.000, 1.000]], [0.268, [0.275, 0.000, 1.000]], [0.270, [0.450, 0.000, 0.972]], [0.272, [0.450, 0.000, 0.972]], [0.274, [0.640, 0.000, 0.808]], [0.276, [0.640, 0.000, 0.808]], [0.278, [0.832, 0.000, 0.592]], [0.280, [0.832, 0.000, 0.592]], [0.282, [1.000, 0.000, 0.336]], [0.284, [1.000, 0.000, 0.336]], [0.286, [1.000, 0.000, 0.058]], [0.288, [1.000, 0.000, 0.058]], [0.290, [1.000, 0.000, 0.000]], [0.292, [1.000, 0.000, 0.000]], [0.294, [1.000, 0.092, 0.000]], [0.295, [1.000, 0.092, 0.000]], [0.297, [1.000, 0.281, 0.000]], [0.299, [1.000, 0.281, 0.000]], [0.301, [1.000, 0.473, 0.000]], [0.303, [1.000, 0.473, 0.000]], [0.305, [1.000, 0.656, 0.000]], [0.307, [1.000, 0.656, 0.000]], [0.309, [1.000, 0.817, 0.000]], [0.311, [1.000, 0.817, 0.000]], [0.313, [1.000, 0.946, 0.000]], [0.315, [1.000, 0.946, 0.000]], [0.317, [0.927, 1.000, 0.000]], [0.319, [0.927, 1.000, 0.000]], [0.321, [0.739, 1.000, 0.000]], [0.323, [0.739, 1.000, 0.000]], [0.325, [0.546, 1.000, 0.000]], [0.327, [0.546, 1.000, 0.000]], [0.329, [0.362, 1.000, 0.000]], [0.331, [0.362, 1.000, 0.000]], [0.333, [0.198, 0.913, 0.000]], [0.335, [0.198, 0.913, 0.000]], [0.337, [0.065, 0.773, 0.167]], [0.339, [0.065, 0.773, 0.167]], [0.341, [0.000, 0.605, 0.439]], [0.342, [0.000, 0.605, 0.439]], [0.344, [0.000, 0.418, 0.681]], [0.346, [0.000, 0.418, 0.681]], [0.348, [0.000, 0.225, 0.879]], [0.350, [0.000, 0.225, 0.879]], [0.352, [0.000, 0.040, 1.000]], [0.354, [0.000, 0.040, 1.000]], [0.356, [0.075, 0.000, 1.000]], [0.358, [0.075, 0.000, 1.000]], [0.360, [0.211, 0.000, 1.000]], [0.362, [0.211, 0.000, 1.000]], [0.364, [0.377, 0.000, 1.000]], [0.366, [0.377, 0.000, 1.000]], [0.368, [0.563, 0.000, 0.881]], [0.370, [0.563, 0.000, 0.881]], [0.372, [0.755, 0.000, 0.684]], [0.374, [0.755, 0.000, 0.684]], [0.376, [0.942, 0.000, 0.442]], [0.378, [0.942, 0.000, 0.442]], [0.380, [1.000, 0.000, 0.171]], [0.382, [1.000, 0.000, 0.171]], [0.384, [1.000, 0.000, 0.000]], [0.386, [1.000, 0.000, 0.000]], [0.387, [1.000, 0.019, 0.000]], [0.389, [1.000, 0.019, 0.000]], [0.391, [1.000, 0.204, 0.000]], [0.393, [1.000, 0.204, 0.000]], [0.395, [1.000, 0.396, 0.000]], [0.397, [1.000, 0.396, 0.000]], [0.399, [1.000, 0.584, 0.000]], [0.401, [1.000, 0.584, 0.000]], [0.403, [1.000, 0.755, 0.000]], [0.405, [1.000, 0.755, 0.000]], [0.407, [1.000, 0.899, 0.000]], [0.409, [1.000, 0.899, 0.000]], [0.411, [0.998, 1.000, 0.000]], [0.413, [0.998, 1.000, 0.000]], [0.415, [0.816, 1.000, 0.000]], [0.417, [0.816, 1.000, 0.000]], [0.419, [0.623, 1.000, 0.000]], [0.421, [0.623, 1.000, 0.000]], [0.423, [0.434, 1.000, 0.000]], [0.425, [0.434, 1.000, 0.000]], [0.427, [0.261, 0.958, 0.000]], [0.429, [0.261, 0.958, 0.000]], [0.431, [0.114, 0.834, 0.054]], [0.432, [0.114, 0.834, 0.054]], [0.434, [0.004, 0.675, 0.332]], [0.436, [0.004, 0.675, 0.332]], [0.438, [0.000, 0.495, 0.588]], [0.440, [0.000, 0.495, 0.588]], [0.442, [0.000, 0.303, 0.806]], [0.444, [0.000, 0.303, 0.806]], [0.446, [0.000, 0.113, 0.970]], [0.448, [0.000, 0.113, 0.970]], [0.450, [0.031, 0.000, 1.000]], [0.452, [0.031, 0.000, 1.000]], [0.454, [0.152, 0.000, 1.000]], [0.456, [0.152, 0.000, 1.000]], [0.458, [0.307, 0.000, 1.000]], [0.460, [0.307, 0.000, 1.000]], [0.462, [0.487, 0.000, 0.944]], [0.464, [0.487, 0.000, 0.944]], [0.466, [0.678, 0.000, 0.770]], [0.468, [0.678, 0.000, 0.770]], [0.470, [0.869, 0.000, 0.544]], [0.472, [0.869, 0.000, 0.544]], [0.474, [1.000, 0.000, 0.283]], [0.476, [1.000, 0.000, 0.283]], [0.477, [1.000, 0.000, 0.003]], [0.479, [1.000, 0.000, 0.003]], [0.481, [1.000, 0.000, 0.000]], [0.483, [1.000, 0.000, 0.000]], [0.485, [1.000, 0.128, 0.000]], [0.487, [1.000, 0.128, 0.000]], [0.489, [1.000, 0.318, 0.000]], [0.491, [1.000, 0.318, 0.000]], [0.493, [1.000, 0.510, 0.000]], [0.495, [1.000, 0.510, 0.000]], [0.497, [1.000, 0.689, 0.000]], [0.499, [1.000, 0.689, 0.000]], [0.501, [1.000, 0.845, 0.000]], [0.503, [1.000, 0.845, 0.000]], [0.505, [1.000, 0.967, 0.000]], [0.507, [1.000, 0.967, 0.000]], [0.509, [0.891, 1.000, 0.000]], [0.511, [0.891, 1.000, 0.000]], [0.513, [0.701, 1.000, 0.000]], [0.515, [0.701, 1.000, 0.000]], [0.517, [0.509, 1.000, 0.000]], [0.519, [0.509, 1.000, 0.000]], [0.521, [0.328, 0.997, 0.000]], [0.523, [0.328, 0.997, 0.000]], [0.524, [0.169, 0.888, 0.000]], [0.526, [0.169, 0.888, 0.000]], [0.528, [0.044, 0.742, 0.222]], [0.530, [0.044, 0.742, 0.222]], [0.532, [0.000, 0.569, 0.489]], [0.534, [0.000, 0.569, 0.489]], [0.536, [0.000, 0.380, 0.724]], [0.538, [0.000, 0.380, 0.724]], [0.540, [0.000, 0.188, 0.911]], [0.542, [0.000, 0.188, 0.911]], [0.544, [0.000, 0.005, 1.000]], [0.546, [0.000, 0.005, 1.000]], [0.548, [0.099, 0.000, 1.000]], [0.550, [0.099, 0.000, 1.000]], [0.552, [0.242, 0.000, 1.000]], [0.554, [0.242, 0.000, 1.000]], [0.556, [0.412, 0.000, 0.998]], [0.558, [0.412, 0.000, 0.998]], [0.560, [0.600, 0.000, 0.847]], [0.562, [0.600, 0.000, 0.847]], [0.564, [0.793, 0.000, 0.640]], [0.566, [0.793, 0.000, 0.640]], [0.568, [0.977, 0.000, 0.391]], [0.569, [0.977, 0.000, 0.391]], [0.571, [1.000, 0.000, 0.116]], [0.573, [1.000, 0.000, 0.116]], [0.575, [1.000, 0.000, 0.000]], [0.577, [1.000, 0.000, 0.000]], [0.579, [1.000, 0.054, 0.000]], [0.581, [1.000, 0.054, 0.000]], [0.583, [1.000, 0.241, 0.000]], [0.585, [1.000, 0.241, 0.000]], [0.587, [1.000, 0.434, 0.000]], [0.589, [1.000, 0.434, 0.000]], [0.591, [1.000, 0.619, 0.000]], [0.593, [1.000, 0.619, 0.000]], [0.595, [1.000, 0.786, 0.000]], [0.597, [1.000, 0.786, 0.000]], [0.599, [1.000, 0.923, 0.000]], [0.601, [1.000, 0.923, 0.000]], [0.603, [0.964, 1.000, 0.000]], [0.605, [0.964, 1.000, 0.000]], [0.607, [0.778, 1.000, 0.000]], [0.609, [0.778, 1.000, 0.000]], [0.611, [0.586, 1.000, 0.000]], [0.613, [0.586, 1.000, 0.000]], [0.614, [0.399, 1.000, 0.000]], [0.616, [0.399, 1.000, 0.000]], [0.618, [0.230, 0.937, 0.000]], [0.620, [0.230, 0.937, 0.000]], [0.622, [0.089, 0.805, 0.110]], [0.624, [0.089, 0.805, 0.110]], [0.626, [0.000, 0.641, 0.385]], [0.628, [0.000, 0.641, 0.385]], [0.630, [0.000, 0.457, 0.634]], [0.632, [0.000, 0.457, 0.634]], [0.634, [0.000, 0.265, 0.842]], [0.636, [0.000, 0.265, 0.842]], [0.638, [0.000, 0.077, 0.995]], [0.640, [0.000, 0.077, 0.995]], [0.642, [0.052, 0.000, 1.000]], [0.644, [0.052, 0.000, 1.000]], [0.646, [0.180, 0.000, 1.000]], [0.648, [0.180, 0.000, 1.000]], [0.650, [0.341, 0.000, 1.000]], [0.652, [0.341, 0.000, 1.000]], [0.654, [0.524, 0.000, 0.915]], [0.656, [0.524, 0.000, 0.915]], [0.658, [0.716, 0.000, 0.729]], [0.659, [0.716, 0.000, 0.729]], [0.661, [0.905, 0.000, 0.495]], [0.663, [0.905, 0.000, 0.495]], [0.665, [1.000, 0.000, 0.229]], [0.667, [1.000, 0.000, 0.229]], [0.669, [1.000, 0.000, 0.000]], [0.671, [1.000, 0.000, 0.000]], [0.673, [1.000, 0.000, 0.000]], [0.675, [1.000, 0.000, 0.000]], [0.677, [1.000, 0.165, 0.000]], [0.679, [1.000, 0.165, 0.000]], [0.681, [1.000, 0.356, 0.000]], [0.683, [1.000, 0.356, 0.000]], [0.685, [1.000, 0.546, 0.000]], [0.687, [1.000, 0.546, 0.000]], [0.689, [1.000, 0.722, 0.000]], [0.691, [1.000, 0.722, 0.000]], [0.693, [1.000, 0.872, 0.000]], [0.695, [1.000, 0.872, 0.000]], [0.697, [1.000, 0.986, 0.000]], [0.699, [1.000, 0.986, 0.000]], [0.701, [0.854, 1.000, 0.000]], [0.703, [0.854, 1.000, 0.000]], [0.705, [0.663, 1.000, 0.000]], [0.706, [0.663, 1.000, 0.000]], [0.708, [0.472, 1.000, 0.000]], [0.710, [0.472, 1.000, 0.000]], [0.712, [0.295, 0.979, 0.000]], [0.714, [0.295, 0.979, 0.000]], [0.716, [0.142, 0.862, 0.000]], [0.718, [0.142, 0.862, 0.000]], [0.720, [0.024, 0.710, 0.276]], [0.722, [0.024, 0.710, 0.276]], [0.724, [0.000, 0.533, 0.538]], [0.726, [0.000, 0.533, 0.538]], [0.728, [0.000, 0.342, 0.765]], [0.730, [0.000, 0.342, 0.765]], [0.732, [0.000, 0.151, 0.941]], [0.734, [0.000, 0.151, 0.941]], [0.736, [0.011, 0.000, 1.000]], [0.738, [0.011, 0.000, 1.000]], [0.740, [0.124, 0.000, 1.000]], [0.742, [0.124, 0.000, 1.000]], [0.744, [0.273, 0.000, 1.000]], [0.746, [0.273, 0.000, 1.000]], [0.748, [0.448, 0.000, 0.973]], [0.750, [0.448, 0.000, 0.973]], [0.751, [0.638, 0.000, 0.810]], [0.753, [0.638, 0.000, 0.810]], [0.755, [0.830, 0.000, 0.594]], [0.757, [0.830, 0.000, 0.594]], [0.759, [1.000, 0.000, 0.339]], [0.761, [1.000, 0.000, 0.339]], [0.763, [1.000, 0.000, 0.061]], [0.765, [1.000, 0.000, 0.061]], [0.767, [1.000, 0.000, 0.000]], [0.769, [1.000, 0.000, 0.000]], [0.771, [1.000, 0.090, 0.000]], [0.773, [1.000, 0.090, 0.000]], [0.775, [1.000, 0.279, 0.000]], [0.777, [1.000, 0.279, 0.000]], [0.779, [1.000, 0.471, 0.000]], [0.781, [1.000, 0.471, 0.000]], [0.783, [1.000, 0.654, 0.000]], [0.785, [1.000, 0.654, 0.000]], [0.787, [1.000, 0.816, 0.000]], [0.789, [1.000, 0.816, 0.000]], [0.791, [1.000, 0.945, 0.000]], [0.793, [1.000, 0.945, 0.000]], [0.795, [0.928, 1.000, 0.000]], [0.796, [0.928, 1.000, 0.000]], [0.798, [0.741, 1.000, 0.000]], [0.800, [0.741, 1.000, 0.000]], [0.802, [0.548, 1.000, 0.000]], [0.804, [0.548, 1.000, 0.000]], [0.806, [0.364, 1.000, 0.000]], [0.808, [0.364, 1.000, 0.000]], [0.810, [0.199, 0.914, 0.000]], [0.812, [0.199, 0.914, 0.000]], [0.814, [0.066, 0.775, 0.165]], [0.816, [0.066, 0.775, 0.165]], [0.818, [0.000, 0.607, 0.436]], [0.820, [0.000, 0.607, 0.436]], [0.822, [0.000, 0.420, 0.679]], [0.824, [0.000, 0.420, 0.679]], [0.826, [0.000, 0.227, 0.877]], [0.828, [0.000, 0.227, 0.877]], [0.830, [0.000, 0.041, 1.000]], [0.832, [0.000, 0.041, 1.000]], [0.834, [0.074, 0.000, 1.000]], [0.836, [0.074, 0.000, 1.000]], [0.838, [0.210, 0.000, 1.000]], [0.840, [0.210, 0.000, 1.000]], [0.841, [0.376, 0.000, 1.000]], [0.843, [0.376, 0.000, 1.000]], [0.845, [0.561, 0.000, 0.883]], [0.847, [0.561, 0.000, 0.883]], [0.849, [0.753, 0.000, 0.686]], [0.851, [0.753, 0.000, 0.686]], [0.853, [0.941, 0.000, 0.445]], [0.855, [0.941, 0.000, 0.445]], [0.857, [1.000, 0.000, 0.174]], [0.859, [1.000, 0.000, 0.174]], [0.861, [1.000, 0.000, 0.000]], [0.863, [1.000, 0.000, 0.000]], [0.865, [1.000, 0.018, 0.000]], [0.867, [1.000, 0.018, 0.000]], [0.869, [1.000, 0.202, 0.000]], [0.871, [1.000, 0.202, 0.000]], [0.873, [1.000, 0.394, 0.000]], [0.875, [1.000, 0.394, 0.000]], [0.877, [1.000, 0.582, 0.000]], [0.879, [1.000, 0.582, 0.000]], [0.881, [1.000, 0.754, 0.000]], [0.883, [1.000, 0.754, 0.000]], [0.885, [1.000, 0.897, 0.000]], [0.886, [1.000, 0.897, 0.000]], [0.888, [1.000, 1.000, 0.000]], [0.890, [1.000, 1.000, 0.000]], [0.892, [0.817, 1.000, 0.000]], [0.894, [0.817, 1.000, 0.000]], [0.896, [0.625, 1.000, 0.000]], [0.898, [0.625, 1.000, 0.000]], [0.900, [0.436, 1.000, 0.000]], [0.902, [0.436, 1.000, 0.000]], [0.904, [0.262, 0.960, 0.000]], [0.906, [0.262, 0.960, 0.000]], [0.908, [0.115, 0.835, 0.051]], [0.910, [0.115, 0.835, 0.051]], [0.912, [0.005, 0.677, 0.330]], [0.914, [0.005, 0.677, 0.330]], [0.916, [0.000, 0.496, 0.586]], [0.918, [0.000, 0.496, 0.586]], [0.920, [0.000, 0.305, 0.804]], [0.922, [0.000, 0.305, 0.804]], [0.924, [0.000, 0.115, 0.968]], [0.926, [0.000, 0.115, 0.968]], [0.928, [0.030, 0.000, 1.000]], [0.930, [0.030, 0.000, 1.000]], [0.932, [0.151, 0.000, 1.000]], [0.933, [0.151, 0.000, 1.000]], [0.935, [0.306, 0.000, 1.000]], [0.937, [0.306, 0.000, 1.000]], [0.939, [0.485, 0.000, 0.946]], [0.941, [0.485, 0.000, 0.946]], [0.943, [0.676, 0.000, 0.772]], [0.945, [0.676, 0.000, 0.772]], [0.947, [0.867, 0.000, 0.546]], [0.949, [0.867, 0.000, 0.546]], [0.951, [1.000, 0.000, 0.285]], [0.953, [1.000, 0.000, 0.285]], [0.955, [1.000, 0.000, 0.005]], [0.957, [1.000, 0.000, 0.005]], [0.959, [1.000, 0.000, 0.000]], [0.961, [1.000, 0.000, 0.000]], [0.963, [1.000, 0.126, 0.000]], [0.965, [1.000, 0.126, 0.000]], [0.967, [1.000, 0.317, 0.000]], [0.969, [1.000, 0.317, 0.000]], [0.971, [1.000, 0.508, 0.000]], [0.973, [1.000, 0.508, 0.000]], [0.975, [1.000, 0.688, 0.000]], [0.977, [1.000, 0.688, 0.000]], [0.978, [1.000, 0.844, 0.000]], [0.980, [1.000, 0.844, 0.000]], [0.982, [1.000, 0.966, 0.000]], [0.984, [1.000, 0.966, 0.000]], [0.986, [0.893, 1.000, 0.000]], [0.988, [0.893, 1.000, 0.000]], [0.990, [0.703, 1.000, 0.000]], [0.992, [0.703, 1.000, 0.000]], [0.994, [0.511, 1.000, 0.000]], [0.996, [0.511, 1.000, 0.000]], [0.998, [0.330, 0.998, 0.000]], [1.000, [0.330, 0.998, 0.000]]]; +var rainbow = [[0.000, [0.500, 0.000, 1.000]], [0.002, [0.500, 0.000, 1.000]], [0.004, [0.492, 0.012, 1.000]], [0.006, [0.492, 0.012, 1.000]], [0.008, [0.484, 0.025, 1.000]], [0.010, [0.484, 0.025, 1.000]], [0.012, [0.476, 0.037, 1.000]], [0.014, [0.476, 0.037, 1.000]], [0.016, [0.469, 0.049, 1.000]], [0.018, [0.469, 0.049, 1.000]], [0.020, [0.461, 0.062, 1.000]], [0.022, [0.461, 0.062, 1.000]], [0.023, [0.453, 0.074, 0.999]], [0.025, [0.453, 0.074, 0.999]], [0.027, [0.445, 0.086, 0.999]], [0.029, [0.445, 0.086, 0.999]], [0.031, [0.437, 0.098, 0.999]], [0.033, [0.437, 0.098, 0.999]], [0.035, [0.429, 0.111, 0.998]], [0.037, [0.429, 0.111, 0.998]], [0.039, [0.422, 0.123, 0.998]], [0.041, [0.422, 0.123, 0.998]], [0.043, [0.414, 0.135, 0.998]], [0.045, [0.414, 0.135, 0.998]], [0.047, [0.406, 0.147, 0.997]], [0.049, [0.406, 0.147, 0.997]], [0.051, [0.398, 0.159, 0.997]], [0.053, [0.398, 0.159, 0.997]], [0.055, [0.390, 0.172, 0.996]], [0.057, [0.390, 0.172, 0.996]], [0.059, [0.382, 0.184, 0.996]], [0.061, [0.382, 0.184, 0.996]], [0.063, [0.375, 0.196, 0.995]], [0.065, [0.375, 0.196, 0.995]], [0.067, [0.367, 0.208, 0.995]], [0.068, [0.367, 0.208, 0.995]], [0.070, [0.359, 0.220, 0.994]], [0.072, [0.359, 0.220, 0.994]], [0.074, [0.351, 0.232, 0.993]], [0.076, [0.351, 0.232, 0.993]], [0.078, [0.343, 0.244, 0.992]], [0.080, [0.343, 0.244, 0.992]], [0.082, [0.335, 0.256, 0.992]], [0.084, [0.335, 0.256, 0.992]], [0.086, [0.327, 0.268, 0.991]], [0.088, [0.327, 0.268, 0.991]], [0.090, [0.320, 0.280, 0.990]], [0.092, [0.320, 0.280, 0.990]], [0.094, [0.312, 0.291, 0.989]], [0.096, [0.312, 0.291, 0.989]], [0.098, [0.304, 0.303, 0.988]], [0.100, [0.304, 0.303, 0.988]], [0.102, [0.296, 0.315, 0.987]], [0.104, [0.296, 0.315, 0.987]], [0.106, [0.288, 0.327, 0.986]], [0.108, [0.288, 0.327, 0.986]], [0.110, [0.280, 0.338, 0.985]], [0.112, [0.280, 0.338, 0.985]], [0.114, [0.273, 0.350, 0.984]], [0.115, [0.273, 0.350, 0.984]], [0.117, [0.265, 0.361, 0.983]], [0.119, [0.265, 0.361, 0.983]], [0.121, [0.257, 0.373, 0.982]], [0.123, [0.257, 0.373, 0.982]], [0.125, [0.249, 0.384, 0.981]], [0.127, [0.249, 0.384, 0.981]], [0.129, [0.241, 0.395, 0.979]], [0.131, [0.241, 0.395, 0.979]], [0.133, [0.233, 0.407, 0.978]], [0.135, [0.233, 0.407, 0.978]], [0.137, [0.225, 0.418, 0.977]], [0.139, [0.225, 0.418, 0.977]], [0.141, [0.218, 0.429, 0.976]], [0.143, [0.218, 0.429, 0.976]], [0.145, [0.210, 0.440, 0.974]], [0.147, [0.210, 0.440, 0.974]], [0.149, [0.202, 0.451, 0.973]], [0.151, [0.202, 0.451, 0.973]], [0.153, [0.194, 0.462, 0.971]], [0.155, [0.194, 0.462, 0.971]], [0.157, [0.186, 0.473, 0.970]], [0.159, [0.186, 0.473, 0.970]], [0.160, [0.178, 0.484, 0.968]], [0.162, [0.178, 0.484, 0.968]], [0.164, [0.171, 0.495, 0.967]], [0.166, [0.171, 0.495, 0.967]], [0.168, [0.163, 0.505, 0.965]], [0.170, [0.163, 0.505, 0.965]], [0.172, [0.155, 0.516, 0.963]], [0.174, [0.155, 0.516, 0.963]], [0.176, [0.147, 0.526, 0.962]], [0.178, [0.147, 0.526, 0.962]], [0.180, [0.139, 0.537, 0.960]], [0.182, [0.139, 0.537, 0.960]], [0.184, [0.131, 0.547, 0.958]], [0.186, [0.131, 0.547, 0.958]], [0.188, [0.124, 0.557, 0.957]], [0.190, [0.124, 0.557, 0.957]], [0.192, [0.116, 0.568, 0.955]], [0.194, [0.116, 0.568, 0.955]], [0.196, [0.108, 0.578, 0.953]], [0.198, [0.108, 0.578, 0.953]], [0.200, [0.100, 0.588, 0.951]], [0.202, [0.100, 0.588, 0.951]], [0.204, [0.092, 0.598, 0.949]], [0.205, [0.092, 0.598, 0.949]], [0.207, [0.084, 0.608, 0.947]], [0.209, [0.084, 0.608, 0.947]], [0.211, [0.076, 0.617, 0.945]], [0.213, [0.076, 0.617, 0.945]], [0.215, [0.069, 0.627, 0.943]], [0.217, [0.069, 0.627, 0.943]], [0.219, [0.061, 0.636, 0.941]], [0.221, [0.061, 0.636, 0.941]], [0.223, [0.053, 0.646, 0.939]], [0.225, [0.053, 0.646, 0.939]], [0.227, [0.045, 0.655, 0.937]], [0.229, [0.045, 0.655, 0.937]], [0.231, [0.037, 0.665, 0.935]], [0.233, [0.037, 0.665, 0.935]], [0.235, [0.029, 0.674, 0.932]], [0.237, [0.029, 0.674, 0.932]], [0.239, [0.022, 0.683, 0.930]], [0.241, [0.022, 0.683, 0.930]], [0.243, [0.014, 0.692, 0.928]], [0.245, [0.014, 0.692, 0.928]], [0.247, [0.006, 0.701, 0.926]], [0.249, [0.006, 0.701, 0.926]], [0.250, [0.002, 0.709, 0.923]], [0.252, [0.002, 0.709, 0.923]], [0.254, [0.010, 0.718, 0.921]], [0.256, [0.010, 0.718, 0.921]], [0.258, [0.018, 0.726, 0.918]], [0.260, [0.018, 0.726, 0.918]], [0.262, [0.025, 0.735, 0.916]], [0.264, [0.025, 0.735, 0.916]], [0.266, [0.033, 0.743, 0.914]], [0.268, [0.033, 0.743, 0.914]], [0.270, [0.041, 0.751, 0.911]], [0.272, [0.041, 0.751, 0.911]], [0.274, [0.049, 0.759, 0.908]], [0.276, [0.049, 0.759, 0.908]], [0.278, [0.057, 0.767, 0.906]], [0.280, [0.057, 0.767, 0.906]], [0.282, [0.065, 0.775, 0.903]], [0.284, [0.065, 0.775, 0.903]], [0.286, [0.073, 0.783, 0.901]], [0.288, [0.073, 0.783, 0.901]], [0.290, [0.080, 0.791, 0.898]], [0.292, [0.080, 0.791, 0.898]], [0.294, [0.088, 0.798, 0.895]], [0.295, [0.088, 0.798, 0.895]], [0.297, [0.096, 0.805, 0.892]], [0.299, [0.096, 0.805, 0.892]], [0.301, [0.104, 0.813, 0.890]], [0.303, [0.104, 0.813, 0.890]], [0.305, [0.112, 0.820, 0.887]], [0.307, [0.112, 0.820, 0.887]], [0.309, [0.120, 0.827, 0.884]], [0.311, [0.120, 0.827, 0.884]], [0.313, [0.127, 0.834, 0.881]], [0.315, [0.127, 0.834, 0.881]], [0.317, [0.135, 0.840, 0.878]], [0.319, [0.135, 0.840, 0.878]], [0.321, [0.143, 0.847, 0.875]], [0.323, [0.143, 0.847, 0.875]], [0.325, [0.151, 0.853, 0.872]], [0.327, [0.151, 0.853, 0.872]], [0.329, [0.159, 0.860, 0.869]], [0.331, [0.159, 0.860, 0.869]], [0.333, [0.167, 0.866, 0.866]], [0.335, [0.167, 0.866, 0.866]], [0.337, [0.175, 0.872, 0.863]], [0.339, [0.175, 0.872, 0.863]], [0.341, [0.182, 0.878, 0.860]], [0.342, [0.182, 0.878, 0.860]], [0.344, [0.190, 0.884, 0.857]], [0.346, [0.190, 0.884, 0.857]], [0.348, [0.198, 0.890, 0.853]], [0.350, [0.198, 0.890, 0.853]], [0.352, [0.206, 0.895, 0.850]], [0.354, [0.206, 0.895, 0.850]], [0.356, [0.214, 0.901, 0.847]], [0.358, [0.214, 0.901, 0.847]], [0.360, [0.222, 0.906, 0.844]], [0.362, [0.222, 0.906, 0.844]], [0.364, [0.229, 0.911, 0.840]], [0.366, [0.229, 0.911, 0.840]], [0.368, [0.237, 0.916, 0.837]], [0.370, [0.237, 0.916, 0.837]], [0.372, [0.245, 0.921, 0.834]], [0.374, [0.245, 0.921, 0.834]], [0.376, [0.253, 0.926, 0.830]], [0.378, [0.253, 0.926, 0.830]], [0.380, [0.261, 0.930, 0.827]], [0.382, [0.261, 0.930, 0.827]], [0.384, [0.269, 0.935, 0.823]], [0.386, [0.269, 0.935, 0.823]], [0.387, [0.276, 0.939, 0.820]], [0.389, [0.276, 0.939, 0.820]], [0.391, [0.284, 0.943, 0.816]], [0.393, [0.284, 0.943, 0.816]], [0.395, [0.292, 0.947, 0.813]], [0.397, [0.292, 0.947, 0.813]], [0.399, [0.300, 0.951, 0.809]], [0.401, [0.300, 0.951, 0.809]], [0.403, [0.308, 0.955, 0.805]], [0.405, [0.308, 0.955, 0.805]], [0.407, [0.316, 0.958, 0.802]], [0.409, [0.316, 0.958, 0.802]], [0.411, [0.324, 0.962, 0.798]], [0.413, [0.324, 0.962, 0.798]], [0.415, [0.331, 0.965, 0.794]], [0.417, [0.331, 0.965, 0.794]], [0.419, [0.339, 0.968, 0.791]], [0.421, [0.339, 0.968, 0.791]], [0.423, [0.347, 0.971, 0.787]], [0.425, [0.347, 0.971, 0.787]], [0.427, [0.355, 0.974, 0.783]], [0.429, [0.355, 0.974, 0.783]], [0.431, [0.363, 0.977, 0.779]], [0.432, [0.363, 0.977, 0.779]], [0.434, [0.371, 0.979, 0.775]], [0.436, [0.371, 0.979, 0.775]], [0.438, [0.378, 0.982, 0.771]], [0.440, [0.378, 0.982, 0.771]], [0.442, [0.386, 0.984, 0.767]], [0.444, [0.386, 0.984, 0.767]], [0.446, [0.394, 0.986, 0.763]], [0.448, [0.394, 0.986, 0.763]], [0.450, [0.402, 0.988, 0.759]], [0.452, [0.402, 0.988, 0.759]], [0.454, [0.410, 0.990, 0.755]], [0.456, [0.410, 0.990, 0.755]], [0.458, [0.418, 0.992, 0.751]], [0.460, [0.418, 0.992, 0.751]], [0.462, [0.425, 0.993, 0.747]], [0.464, [0.425, 0.993, 0.747]], [0.466, [0.433, 0.995, 0.743]], [0.468, [0.433, 0.995, 0.743]], [0.470, [0.441, 0.996, 0.739]], [0.472, [0.441, 0.996, 0.739]], [0.474, [0.449, 0.997, 0.735]], [0.476, [0.449, 0.997, 0.735]], [0.477, [0.457, 0.998, 0.731]], [0.479, [0.457, 0.998, 0.731]], [0.481, [0.465, 0.998, 0.726]], [0.483, [0.465, 0.998, 0.726]], [0.485, [0.473, 0.999, 0.722]], [0.487, [0.473, 0.999, 0.722]], [0.489, [0.480, 1.000, 0.718]], [0.491, [0.480, 1.000, 0.718]], [0.493, [0.488, 1.000, 0.714]], [0.495, [0.488, 1.000, 0.714]], [0.497, [0.496, 1.000, 0.709]], [0.499, [0.496, 1.000, 0.709]], [0.501, [0.504, 1.000, 0.705]], [0.503, [0.504, 1.000, 0.705]], [0.505, [0.512, 1.000, 0.701]], [0.507, [0.512, 1.000, 0.701]], [0.509, [0.520, 1.000, 0.696]], [0.511, [0.520, 1.000, 0.696]], [0.513, [0.527, 0.999, 0.692]], [0.515, [0.527, 0.999, 0.692]], [0.517, [0.535, 0.998, 0.687]], [0.519, [0.535, 0.998, 0.687]], [0.521, [0.543, 0.998, 0.683]], [0.523, [0.543, 0.998, 0.683]], [0.524, [0.551, 0.997, 0.678]], [0.526, [0.551, 0.997, 0.678]], [0.528, [0.559, 0.996, 0.674]], [0.530, [0.559, 0.996, 0.674]], [0.532, [0.567, 0.995, 0.669]], [0.534, [0.567, 0.995, 0.669]], [0.536, [0.575, 0.993, 0.665]], [0.538, [0.575, 0.993, 0.665]], [0.540, [0.582, 0.992, 0.660]], [0.542, [0.582, 0.992, 0.660]], [0.544, [0.590, 0.990, 0.655]], [0.546, [0.590, 0.990, 0.655]], [0.548, [0.598, 0.988, 0.651]], [0.550, [0.598, 0.988, 0.651]], [0.552, [0.606, 0.986, 0.646]], [0.554, [0.606, 0.986, 0.646]], [0.556, [0.614, 0.984, 0.641]], [0.558, [0.614, 0.984, 0.641]], [0.560, [0.622, 0.982, 0.636]], [0.562, [0.622, 0.982, 0.636]], [0.564, [0.629, 0.979, 0.632]], [0.566, [0.629, 0.979, 0.632]], [0.568, [0.637, 0.977, 0.627]], [0.569, [0.637, 0.977, 0.627]], [0.571, [0.645, 0.974, 0.622]], [0.573, [0.645, 0.974, 0.622]], [0.575, [0.653, 0.971, 0.617]], [0.577, [0.653, 0.971, 0.617]], [0.579, [0.661, 0.968, 0.612]], [0.581, [0.661, 0.968, 0.612]], [0.583, [0.669, 0.965, 0.608]], [0.585, [0.669, 0.965, 0.608]], [0.587, [0.676, 0.962, 0.603]], [0.589, [0.676, 0.962, 0.603]], [0.591, [0.684, 0.958, 0.598]], [0.593, [0.684, 0.958, 0.598]], [0.595, [0.692, 0.955, 0.593]], [0.597, [0.692, 0.955, 0.593]], [0.599, [0.700, 0.951, 0.588]], [0.601, [0.700, 0.951, 0.588]], [0.603, [0.708, 0.947, 0.583]], [0.605, [0.708, 0.947, 0.583]], [0.607, [0.716, 0.943, 0.578]], [0.609, [0.716, 0.943, 0.578]], [0.611, [0.724, 0.939, 0.573]], [0.613, [0.724, 0.939, 0.573]], [0.614, [0.731, 0.935, 0.568]], [0.616, [0.731, 0.935, 0.568]], [0.618, [0.739, 0.930, 0.563]], [0.620, [0.739, 0.930, 0.563]], [0.622, [0.747, 0.926, 0.557]], [0.624, [0.747, 0.926, 0.557]], [0.626, [0.755, 0.921, 0.552]], [0.628, [0.755, 0.921, 0.552]], [0.630, [0.763, 0.916, 0.547]], [0.632, [0.763, 0.916, 0.547]], [0.634, [0.771, 0.911, 0.542]], [0.636, [0.771, 0.911, 0.542]], [0.638, [0.778, 0.906, 0.537]], [0.640, [0.778, 0.906, 0.537]], [0.642, [0.786, 0.901, 0.532]], [0.644, [0.786, 0.901, 0.532]], [0.646, [0.794, 0.895, 0.526]], [0.648, [0.794, 0.895, 0.526]], [0.650, [0.802, 0.890, 0.521]], [0.652, [0.802, 0.890, 0.521]], [0.654, [0.810, 0.884, 0.516]], [0.656, [0.810, 0.884, 0.516]], [0.658, [0.818, 0.878, 0.511]], [0.659, [0.818, 0.878, 0.511]], [0.661, [0.825, 0.872, 0.505]], [0.663, [0.825, 0.872, 0.505]], [0.665, [0.833, 0.866, 0.500]], [0.667, [0.833, 0.866, 0.500]], [0.669, [0.841, 0.860, 0.495]], [0.671, [0.841, 0.860, 0.495]], [0.673, [0.849, 0.853, 0.489]], [0.675, [0.849, 0.853, 0.489]], [0.677, [0.857, 0.847, 0.484]], [0.679, [0.857, 0.847, 0.484]], [0.681, [0.865, 0.840, 0.479]], [0.683, [0.865, 0.840, 0.479]], [0.685, [0.873, 0.834, 0.473]], [0.687, [0.873, 0.834, 0.473]], [0.689, [0.880, 0.827, 0.468]], [0.691, [0.880, 0.827, 0.468]], [0.693, [0.888, 0.820, 0.462]], [0.695, [0.888, 0.820, 0.462]], [0.697, [0.896, 0.813, 0.457]], [0.699, [0.896, 0.813, 0.457]], [0.701, [0.904, 0.805, 0.451]], [0.703, [0.904, 0.805, 0.451]], [0.705, [0.912, 0.798, 0.446]], [0.706, [0.912, 0.798, 0.446]], [0.708, [0.920, 0.791, 0.440]], [0.710, [0.920, 0.791, 0.440]], [0.712, [0.927, 0.783, 0.435]], [0.714, [0.927, 0.783, 0.435]], [0.716, [0.935, 0.775, 0.429]], [0.718, [0.935, 0.775, 0.429]], [0.720, [0.943, 0.767, 0.424]], [0.722, [0.943, 0.767, 0.424]], [0.724, [0.951, 0.759, 0.418]], [0.726, [0.951, 0.759, 0.418]], [0.728, [0.959, 0.751, 0.412]], [0.730, [0.959, 0.751, 0.412]], [0.732, [0.967, 0.743, 0.407]], [0.734, [0.967, 0.743, 0.407]], [0.736, [0.975, 0.735, 0.401]], [0.738, [0.975, 0.735, 0.401]], [0.740, [0.982, 0.726, 0.395]], [0.742, [0.982, 0.726, 0.395]], [0.744, [0.990, 0.718, 0.390]], [0.746, [0.990, 0.718, 0.390]], [0.748, [0.998, 0.709, 0.384]], [0.750, [0.998, 0.709, 0.384]], [0.751, [1.000, 0.701, 0.378]], [0.753, [1.000, 0.701, 0.378]], [0.755, [1.000, 0.692, 0.373]], [0.757, [1.000, 0.692, 0.373]], [0.759, [1.000, 0.683, 0.367]], [0.761, [1.000, 0.683, 0.367]], [0.763, [1.000, 0.674, 0.361]], [0.765, [1.000, 0.674, 0.361]], [0.767, [1.000, 0.665, 0.355]], [0.769, [1.000, 0.665, 0.355]], [0.771, [1.000, 0.655, 0.350]], [0.773, [1.000, 0.655, 0.350]], [0.775, [1.000, 0.646, 0.344]], [0.777, [1.000, 0.646, 0.344]], [0.779, [1.000, 0.636, 0.338]], [0.781, [1.000, 0.636, 0.338]], [0.783, [1.000, 0.627, 0.332]], [0.785, [1.000, 0.627, 0.332]], [0.787, [1.000, 0.617, 0.327]], [0.789, [1.000, 0.617, 0.327]], [0.791, [1.000, 0.608, 0.321]], [0.793, [1.000, 0.608, 0.321]], [0.795, [1.000, 0.598, 0.315]], [0.796, [1.000, 0.598, 0.315]], [0.798, [1.000, 0.588, 0.309]], [0.800, [1.000, 0.588, 0.309]], [0.802, [1.000, 0.578, 0.303]], [0.804, [1.000, 0.578, 0.303]], [0.806, [1.000, 0.568, 0.297]], [0.808, [1.000, 0.568, 0.297]], [0.810, [1.000, 0.557, 0.291]], [0.812, [1.000, 0.557, 0.291]], [0.814, [1.000, 0.547, 0.285]], [0.816, [1.000, 0.547, 0.285]], [0.818, [1.000, 0.537, 0.280]], [0.820, [1.000, 0.537, 0.280]], [0.822, [1.000, 0.526, 0.274]], [0.824, [1.000, 0.526, 0.274]], [0.826, [1.000, 0.516, 0.268]], [0.828, [1.000, 0.516, 0.268]], [0.830, [1.000, 0.505, 0.262]], [0.832, [1.000, 0.505, 0.262]], [0.834, [1.000, 0.495, 0.256]], [0.836, [1.000, 0.495, 0.256]], [0.838, [1.000, 0.484, 0.250]], [0.840, [1.000, 0.484, 0.250]], [0.841, [1.000, 0.473, 0.244]], [0.843, [1.000, 0.473, 0.244]], [0.845, [1.000, 0.462, 0.238]], [0.847, [1.000, 0.462, 0.238]], [0.849, [1.000, 0.451, 0.232]], [0.851, [1.000, 0.451, 0.232]], [0.853, [1.000, 0.440, 0.226]], [0.855, [1.000, 0.440, 0.226]], [0.857, [1.000, 0.429, 0.220]], [0.859, [1.000, 0.429, 0.220]], [0.861, [1.000, 0.418, 0.214]], [0.863, [1.000, 0.418, 0.214]], [0.865, [1.000, 0.407, 0.208]], [0.867, [1.000, 0.407, 0.208]], [0.869, [1.000, 0.395, 0.202]], [0.871, [1.000, 0.395, 0.202]], [0.873, [1.000, 0.384, 0.196]], [0.875, [1.000, 0.384, 0.196]], [0.877, [1.000, 0.373, 0.190]], [0.879, [1.000, 0.373, 0.190]], [0.881, [1.000, 0.361, 0.184]], [0.883, [1.000, 0.361, 0.184]], [0.885, [1.000, 0.350, 0.178]], [0.886, [1.000, 0.350, 0.178]], [0.888, [1.000, 0.338, 0.172]], [0.890, [1.000, 0.338, 0.172]], [0.892, [1.000, 0.327, 0.166]], [0.894, [1.000, 0.327, 0.166]], [0.896, [1.000, 0.315, 0.159]], [0.898, [1.000, 0.315, 0.159]], [0.900, [1.000, 0.303, 0.153]], [0.902, [1.000, 0.303, 0.153]], [0.904, [1.000, 0.291, 0.147]], [0.906, [1.000, 0.291, 0.147]], [0.908, [1.000, 0.280, 0.141]], [0.910, [1.000, 0.280, 0.141]], [0.912, [1.000, 0.268, 0.135]], [0.914, [1.000, 0.268, 0.135]], [0.916, [1.000, 0.256, 0.129]], [0.918, [1.000, 0.256, 0.129]], [0.920, [1.000, 0.244, 0.123]], [0.922, [1.000, 0.244, 0.123]], [0.924, [1.000, 0.232, 0.117]], [0.926, [1.000, 0.232, 0.117]], [0.928, [1.000, 0.220, 0.111]], [0.930, [1.000, 0.220, 0.111]], [0.932, [1.000, 0.208, 0.105]], [0.933, [1.000, 0.208, 0.105]], [0.935, [1.000, 0.196, 0.098]], [0.937, [1.000, 0.196, 0.098]], [0.939, [1.000, 0.184, 0.092]], [0.941, [1.000, 0.184, 0.092]], [0.943, [1.000, 0.172, 0.086]], [0.945, [1.000, 0.172, 0.086]], [0.947, [1.000, 0.159, 0.080]], [0.949, [1.000, 0.159, 0.080]], [0.951, [1.000, 0.147, 0.074]], [0.953, [1.000, 0.147, 0.074]], [0.955, [1.000, 0.135, 0.068]], [0.957, [1.000, 0.135, 0.068]], [0.959, [1.000, 0.123, 0.062]], [0.961, [1.000, 0.123, 0.062]], [0.963, [1.000, 0.111, 0.055]], [0.965, [1.000, 0.111, 0.055]], [0.967, [1.000, 0.098, 0.049]], [0.969, [1.000, 0.098, 0.049]], [0.971, [1.000, 0.086, 0.043]], [0.973, [1.000, 0.086, 0.043]], [0.975, [1.000, 0.074, 0.037]], [0.977, [1.000, 0.074, 0.037]], [0.978, [1.000, 0.062, 0.031]], [0.980, [1.000, 0.062, 0.031]], [0.982, [1.000, 0.049, 0.025]], [0.984, [1.000, 0.049, 0.025]], [0.986, [1.000, 0.037, 0.018]], [0.988, [1.000, 0.037, 0.018]], [0.990, [1.000, 0.025, 0.012]], [0.992, [1.000, 0.025, 0.012]], [0.994, [1.000, 0.012, 0.006]], [0.996, [1.000, 0.012, 0.006]], [0.998, [1.000, 0.000, 0.000]], [1.000, [1.000, 0.000, 0.000]]]; +var terrain = [[0.000, [0.200, 0.200, 0.600]], [0.002, [0.200, 0.200, 0.600]], [0.004, [0.195, 0.210, 0.610]], [0.006, [0.195, 0.210, 0.610]], [0.008, [0.190, 0.221, 0.621]], [0.010, [0.190, 0.221, 0.621]], [0.012, [0.184, 0.231, 0.631]], [0.014, [0.184, 0.231, 0.631]], [0.016, [0.179, 0.242, 0.642]], [0.018, [0.179, 0.242, 0.642]], [0.020, [0.174, 0.252, 0.652]], [0.022, [0.174, 0.252, 0.652]], [0.023, [0.169, 0.263, 0.663]], [0.025, [0.169, 0.263, 0.663]], [0.027, [0.163, 0.273, 0.673]], [0.029, [0.163, 0.273, 0.673]], [0.031, [0.158, 0.284, 0.684]], [0.033, [0.158, 0.284, 0.684]], [0.035, [0.153, 0.294, 0.694]], [0.037, [0.153, 0.294, 0.694]], [0.039, [0.148, 0.305, 0.705]], [0.041, [0.148, 0.305, 0.705]], [0.043, [0.142, 0.315, 0.715]], [0.045, [0.142, 0.315, 0.715]], [0.047, [0.137, 0.325, 0.725]], [0.049, [0.137, 0.325, 0.725]], [0.051, [0.132, 0.336, 0.736]], [0.053, [0.132, 0.336, 0.736]], [0.055, [0.127, 0.346, 0.746]], [0.057, [0.127, 0.346, 0.746]], [0.059, [0.122, 0.357, 0.757]], [0.061, [0.122, 0.357, 0.757]], [0.063, [0.116, 0.367, 0.767]], [0.065, [0.116, 0.367, 0.767]], [0.067, [0.111, 0.378, 0.778]], [0.068, [0.111, 0.378, 0.778]], [0.070, [0.106, 0.388, 0.788]], [0.072, [0.106, 0.388, 0.788]], [0.074, [0.101, 0.399, 0.799]], [0.076, [0.101, 0.399, 0.799]], [0.078, [0.095, 0.409, 0.809]], [0.080, [0.095, 0.409, 0.809]], [0.082, [0.090, 0.420, 0.820]], [0.084, [0.090, 0.420, 0.820]], [0.086, [0.085, 0.430, 0.830]], [0.088, [0.085, 0.430, 0.830]], [0.090, [0.080, 0.441, 0.841]], [0.092, [0.080, 0.441, 0.841]], [0.094, [0.075, 0.451, 0.851]], [0.096, [0.075, 0.451, 0.851]], [0.098, [0.069, 0.461, 0.861]], [0.100, [0.069, 0.461, 0.861]], [0.102, [0.064, 0.472, 0.872]], [0.104, [0.064, 0.472, 0.872]], [0.106, [0.059, 0.482, 0.882]], [0.108, [0.059, 0.482, 0.882]], [0.110, [0.054, 0.493, 0.893]], [0.112, [0.054, 0.493, 0.893]], [0.114, [0.048, 0.503, 0.903]], [0.115, [0.048, 0.503, 0.903]], [0.117, [0.043, 0.514, 0.914]], [0.119, [0.043, 0.514, 0.914]], [0.121, [0.038, 0.524, 0.924]], [0.123, [0.038, 0.524, 0.924]], [0.125, [0.033, 0.535, 0.935]], [0.127, [0.033, 0.535, 0.935]], [0.129, [0.027, 0.545, 0.945]], [0.131, [0.027, 0.545, 0.945]], [0.133, [0.022, 0.556, 0.956]], [0.135, [0.022, 0.556, 0.956]], [0.137, [0.017, 0.566, 0.966]], [0.139, [0.017, 0.566, 0.966]], [0.141, [0.012, 0.576, 0.976]], [0.143, [0.012, 0.576, 0.976]], [0.145, [0.007, 0.587, 0.987]], [0.147, [0.007, 0.587, 0.987]], [0.149, [0.001, 0.597, 0.997]], [0.151, [0.001, 0.597, 0.997]], [0.153, [0.000, 0.606, 0.982]], [0.155, [0.000, 0.606, 0.982]], [0.157, [0.000, 0.614, 0.959]], [0.159, [0.000, 0.614, 0.959]], [0.160, [0.000, 0.622, 0.935]], [0.162, [0.000, 0.622, 0.935]], [0.164, [0.000, 0.629, 0.912]], [0.166, [0.000, 0.629, 0.912]], [0.168, [0.000, 0.637, 0.888]], [0.170, [0.000, 0.637, 0.888]], [0.172, [0.000, 0.645, 0.865]], [0.174, [0.000, 0.645, 0.865]], [0.176, [0.000, 0.653, 0.841]], [0.178, [0.000, 0.653, 0.841]], [0.180, [0.000, 0.661, 0.818]], [0.182, [0.000, 0.661, 0.818]], [0.184, [0.000, 0.669, 0.794]], [0.186, [0.000, 0.669, 0.794]], [0.188, [0.000, 0.676, 0.771]], [0.190, [0.000, 0.676, 0.771]], [0.192, [0.000, 0.684, 0.747]], [0.194, [0.000, 0.684, 0.747]], [0.196, [0.000, 0.692, 0.724]], [0.198, [0.000, 0.692, 0.724]], [0.200, [0.000, 0.700, 0.700]], [0.202, [0.000, 0.700, 0.700]], [0.204, [0.000, 0.708, 0.676]], [0.205, [0.000, 0.708, 0.676]], [0.207, [0.000, 0.716, 0.653]], [0.209, [0.000, 0.716, 0.653]], [0.211, [0.000, 0.724, 0.629]], [0.213, [0.000, 0.724, 0.629]], [0.215, [0.000, 0.731, 0.606]], [0.217, [0.000, 0.731, 0.606]], [0.219, [0.000, 0.739, 0.582]], [0.221, [0.000, 0.739, 0.582]], [0.223, [0.000, 0.747, 0.559]], [0.225, [0.000, 0.747, 0.559]], [0.227, [0.000, 0.755, 0.535]], [0.229, [0.000, 0.755, 0.535]], [0.231, [0.000, 0.763, 0.512]], [0.233, [0.000, 0.763, 0.512]], [0.235, [0.000, 0.771, 0.488]], [0.237, [0.000, 0.771, 0.488]], [0.239, [0.000, 0.778, 0.465]], [0.241, [0.000, 0.778, 0.465]], [0.243, [0.000, 0.786, 0.441]], [0.245, [0.000, 0.786, 0.441]], [0.247, [0.000, 0.794, 0.418]], [0.249, [0.000, 0.794, 0.418]], [0.250, [0.004, 0.801, 0.401]], [0.252, [0.004, 0.801, 0.401]], [0.254, [0.020, 0.804, 0.404]], [0.256, [0.020, 0.804, 0.404]], [0.258, [0.035, 0.807, 0.407]], [0.260, [0.035, 0.807, 0.407]], [0.262, [0.051, 0.810, 0.410]], [0.264, [0.051, 0.810, 0.410]], [0.266, [0.067, 0.813, 0.413]], [0.268, [0.067, 0.813, 0.413]], [0.270, [0.082, 0.816, 0.416]], [0.272, [0.082, 0.816, 0.416]], [0.274, [0.098, 0.820, 0.420]], [0.276, [0.098, 0.820, 0.420]], [0.278, [0.114, 0.823, 0.423]], [0.280, [0.114, 0.823, 0.423]], [0.282, [0.129, 0.826, 0.426]], [0.284, [0.129, 0.826, 0.426]], [0.286, [0.145, 0.829, 0.429]], [0.288, [0.145, 0.829, 0.429]], [0.290, [0.161, 0.832, 0.432]], [0.292, [0.161, 0.832, 0.432]], [0.294, [0.176, 0.835, 0.435]], [0.295, [0.176, 0.835, 0.435]], [0.297, [0.192, 0.838, 0.438]], [0.299, [0.192, 0.838, 0.438]], [0.301, [0.208, 0.842, 0.442]], [0.303, [0.208, 0.842, 0.442]], [0.305, [0.224, 0.845, 0.445]], [0.307, [0.224, 0.845, 0.445]], [0.309, [0.239, 0.848, 0.448]], [0.311, [0.239, 0.848, 0.448]], [0.313, [0.255, 0.851, 0.451]], [0.315, [0.255, 0.851, 0.451]], [0.317, [0.271, 0.854, 0.454]], [0.319, [0.271, 0.854, 0.454]], [0.321, [0.286, 0.857, 0.457]], [0.323, [0.286, 0.857, 0.457]], [0.325, [0.302, 0.860, 0.460]], [0.327, [0.302, 0.860, 0.460]], [0.329, [0.318, 0.864, 0.464]], [0.331, [0.318, 0.864, 0.464]], [0.333, [0.333, 0.867, 0.467]], [0.335, [0.333, 0.867, 0.467]], [0.337, [0.349, 0.870, 0.470]], [0.339, [0.349, 0.870, 0.470]], [0.341, [0.365, 0.873, 0.473]], [0.342, [0.365, 0.873, 0.473]], [0.344, [0.380, 0.876, 0.476]], [0.346, [0.380, 0.876, 0.476]], [0.348, [0.396, 0.879, 0.479]], [0.350, [0.396, 0.879, 0.479]], [0.352, [0.412, 0.882, 0.482]], [0.354, [0.412, 0.882, 0.482]], [0.356, [0.427, 0.885, 0.485]], [0.358, [0.427, 0.885, 0.485]], [0.360, [0.443, 0.889, 0.489]], [0.362, [0.443, 0.889, 0.489]], [0.364, [0.459, 0.892, 0.492]], [0.366, [0.459, 0.892, 0.492]], [0.368, [0.475, 0.895, 0.495]], [0.370, [0.475, 0.895, 0.495]], [0.372, [0.490, 0.898, 0.498]], [0.374, [0.490, 0.898, 0.498]], [0.376, [0.506, 0.901, 0.501]], [0.378, [0.506, 0.901, 0.501]], [0.380, [0.522, 0.904, 0.504]], [0.382, [0.522, 0.904, 0.504]], [0.384, [0.537, 0.907, 0.507]], [0.386, [0.537, 0.907, 0.507]], [0.387, [0.553, 0.911, 0.511]], [0.389, [0.553, 0.911, 0.511]], [0.391, [0.569, 0.914, 0.514]], [0.393, [0.569, 0.914, 0.514]], [0.395, [0.584, 0.917, 0.517]], [0.397, [0.584, 0.917, 0.517]], [0.399, [0.600, 0.920, 0.520]], [0.401, [0.600, 0.920, 0.520]], [0.403, [0.616, 0.923, 0.523]], [0.405, [0.616, 0.923, 0.523]], [0.407, [0.631, 0.926, 0.526]], [0.409, [0.631, 0.926, 0.526]], [0.411, [0.647, 0.929, 0.529]], [0.413, [0.647, 0.929, 0.529]], [0.415, [0.663, 0.933, 0.533]], [0.417, [0.663, 0.933, 0.533]], [0.419, [0.678, 0.936, 0.536]], [0.421, [0.678, 0.936, 0.536]], [0.423, [0.694, 0.939, 0.539]], [0.425, [0.694, 0.939, 0.539]], [0.427, [0.710, 0.942, 0.542]], [0.429, [0.710, 0.942, 0.542]], [0.431, [0.725, 0.945, 0.545]], [0.432, [0.725, 0.945, 0.545]], [0.434, [0.741, 0.948, 0.548]], [0.436, [0.741, 0.948, 0.548]], [0.438, [0.757, 0.951, 0.551]], [0.440, [0.757, 0.951, 0.551]], [0.442, [0.773, 0.955, 0.555]], [0.444, [0.773, 0.955, 0.555]], [0.446, [0.788, 0.958, 0.558]], [0.448, [0.788, 0.958, 0.558]], [0.450, [0.804, 0.961, 0.561]], [0.452, [0.804, 0.961, 0.561]], [0.454, [0.820, 0.964, 0.564]], [0.456, [0.820, 0.964, 0.564]], [0.458, [0.835, 0.967, 0.567]], [0.460, [0.835, 0.967, 0.567]], [0.462, [0.851, 0.970, 0.570]], [0.464, [0.851, 0.970, 0.570]], [0.466, [0.867, 0.973, 0.573]], [0.468, [0.867, 0.973, 0.573]], [0.470, [0.882, 0.976, 0.576]], [0.472, [0.882, 0.976, 0.576]], [0.474, [0.898, 0.980, 0.580]], [0.476, [0.898, 0.980, 0.580]], [0.477, [0.914, 0.983, 0.583]], [0.479, [0.914, 0.983, 0.583]], [0.481, [0.929, 0.986, 0.586]], [0.483, [0.929, 0.986, 0.586]], [0.485, [0.945, 0.989, 0.589]], [0.487, [0.945, 0.989, 0.589]], [0.489, [0.961, 0.992, 0.592]], [0.491, [0.961, 0.992, 0.592]], [0.493, [0.976, 0.995, 0.595]], [0.495, [0.976, 0.995, 0.595]], [0.497, [0.992, 0.998, 0.598]], [0.499, [0.992, 0.998, 0.598]], [0.501, [0.996, 0.995, 0.598]], [0.503, [0.996, 0.995, 0.598]], [0.505, [0.988, 0.985, 0.594]], [0.507, [0.988, 0.985, 0.594]], [0.509, [0.980, 0.975, 0.589]], [0.511, [0.980, 0.975, 0.589]], [0.513, [0.973, 0.965, 0.585]], [0.515, [0.973, 0.965, 0.585]], [0.517, [0.965, 0.955, 0.581]], [0.519, [0.965, 0.955, 0.581]], [0.521, [0.957, 0.945, 0.577]], [0.523, [0.957, 0.945, 0.577]], [0.524, [0.949, 0.935, 0.572]], [0.526, [0.949, 0.935, 0.572]], [0.528, [0.941, 0.925, 0.568]], [0.530, [0.941, 0.925, 0.568]], [0.532, [0.933, 0.915, 0.564]], [0.534, [0.933, 0.915, 0.564]], [0.536, [0.925, 0.905, 0.560]], [0.538, [0.925, 0.905, 0.560]], [0.540, [0.918, 0.895, 0.556]], [0.542, [0.918, 0.895, 0.556]], [0.544, [0.910, 0.885, 0.551]], [0.546, [0.910, 0.885, 0.551]], [0.548, [0.902, 0.875, 0.547]], [0.550, [0.902, 0.875, 0.547]], [0.552, [0.894, 0.864, 0.543]], [0.554, [0.894, 0.864, 0.543]], [0.556, [0.886, 0.854, 0.539]], [0.558, [0.886, 0.854, 0.539]], [0.560, [0.878, 0.844, 0.534]], [0.562, [0.878, 0.844, 0.534]], [0.564, [0.871, 0.834, 0.530]], [0.566, [0.871, 0.834, 0.530]], [0.568, [0.863, 0.824, 0.526]], [0.569, [0.863, 0.824, 0.526]], [0.571, [0.855, 0.814, 0.522]], [0.573, [0.855, 0.814, 0.522]], [0.575, [0.847, 0.804, 0.517]], [0.577, [0.847, 0.804, 0.517]], [0.579, [0.839, 0.794, 0.513]], [0.581, [0.839, 0.794, 0.513]], [0.583, [0.831, 0.784, 0.509]], [0.585, [0.831, 0.784, 0.509]], [0.587, [0.824, 0.774, 0.505]], [0.589, [0.824, 0.774, 0.505]], [0.591, [0.816, 0.764, 0.500]], [0.593, [0.816, 0.764, 0.500]], [0.595, [0.808, 0.754, 0.496]], [0.597, [0.808, 0.754, 0.496]], [0.599, [0.800, 0.744, 0.492]], [0.601, [0.800, 0.744, 0.492]], [0.603, [0.792, 0.734, 0.488]], [0.605, [0.792, 0.734, 0.488]], [0.607, [0.784, 0.724, 0.484]], [0.609, [0.784, 0.724, 0.484]], [0.611, [0.776, 0.714, 0.479]], [0.613, [0.776, 0.714, 0.479]], [0.614, [0.769, 0.704, 0.475]], [0.616, [0.769, 0.704, 0.475]], [0.618, [0.761, 0.694, 0.471]], [0.620, [0.761, 0.694, 0.471]], [0.622, [0.753, 0.684, 0.467]], [0.624, [0.753, 0.684, 0.467]], [0.626, [0.745, 0.674, 0.462]], [0.628, [0.745, 0.674, 0.462]], [0.630, [0.737, 0.664, 0.458]], [0.632, [0.737, 0.664, 0.458]], [0.634, [0.729, 0.654, 0.454]], [0.636, [0.729, 0.654, 0.454]], [0.638, [0.722, 0.644, 0.450]], [0.640, [0.722, 0.644, 0.450]], [0.642, [0.714, 0.634, 0.445]], [0.644, [0.714, 0.634, 0.445]], [0.646, [0.706, 0.624, 0.441]], [0.648, [0.706, 0.624, 0.441]], [0.650, [0.698, 0.613, 0.437]], [0.652, [0.698, 0.613, 0.437]], [0.654, [0.690, 0.603, 0.433]], [0.656, [0.690, 0.603, 0.433]], [0.658, [0.682, 0.593, 0.428]], [0.659, [0.682, 0.593, 0.428]], [0.661, [0.675, 0.583, 0.424]], [0.663, [0.675, 0.583, 0.424]], [0.665, [0.667, 0.573, 0.420]], [0.667, [0.667, 0.573, 0.420]], [0.669, [0.659, 0.563, 0.416]], [0.671, [0.659, 0.563, 0.416]], [0.673, [0.651, 0.553, 0.412]], [0.675, [0.651, 0.553, 0.412]], [0.677, [0.643, 0.543, 0.407]], [0.679, [0.643, 0.543, 0.407]], [0.681, [0.635, 0.533, 0.403]], [0.683, [0.635, 0.533, 0.403]], [0.685, [0.627, 0.523, 0.399]], [0.687, [0.627, 0.523, 0.399]], [0.689, [0.620, 0.513, 0.395]], [0.691, [0.620, 0.513, 0.395]], [0.693, [0.612, 0.503, 0.390]], [0.695, [0.612, 0.503, 0.390]], [0.697, [0.604, 0.493, 0.386]], [0.699, [0.604, 0.493, 0.386]], [0.701, [0.596, 0.483, 0.382]], [0.703, [0.596, 0.483, 0.382]], [0.705, [0.588, 0.473, 0.378]], [0.706, [0.588, 0.473, 0.378]], [0.708, [0.580, 0.463, 0.373]], [0.710, [0.580, 0.463, 0.373]], [0.712, [0.573, 0.453, 0.369]], [0.714, [0.573, 0.453, 0.369]], [0.716, [0.565, 0.443, 0.365]], [0.718, [0.565, 0.443, 0.365]], [0.720, [0.557, 0.433, 0.361]], [0.722, [0.557, 0.433, 0.361]], [0.724, [0.549, 0.423, 0.356]], [0.726, [0.549, 0.423, 0.356]], [0.728, [0.541, 0.413, 0.352]], [0.730, [0.541, 0.413, 0.352]], [0.732, [0.533, 0.403, 0.348]], [0.734, [0.533, 0.403, 0.348]], [0.736, [0.525, 0.393, 0.344]], [0.738, [0.525, 0.393, 0.344]], [0.740, [0.518, 0.383, 0.340]], [0.742, [0.518, 0.383, 0.340]], [0.744, [0.510, 0.373, 0.335]], [0.746, [0.510, 0.373, 0.335]], [0.748, [0.502, 0.363, 0.331]], [0.750, [0.502, 0.363, 0.331]], [0.751, [0.506, 0.368, 0.338]], [0.753, [0.506, 0.368, 0.338]], [0.755, [0.514, 0.378, 0.348]], [0.757, [0.514, 0.378, 0.348]], [0.759, [0.522, 0.388, 0.359]], [0.761, [0.522, 0.388, 0.359]], [0.763, [0.529, 0.398, 0.369]], [0.765, [0.529, 0.398, 0.369]], [0.767, [0.537, 0.408, 0.380]], [0.769, [0.537, 0.408, 0.380]], [0.771, [0.545, 0.418, 0.390]], [0.773, [0.545, 0.418, 0.390]], [0.775, [0.553, 0.428, 0.401]], [0.777, [0.553, 0.428, 0.401]], [0.779, [0.561, 0.438, 0.411]], [0.781, [0.561, 0.438, 0.411]], [0.783, [0.569, 0.448, 0.422]], [0.785, [0.569, 0.448, 0.422]], [0.787, [0.576, 0.458, 0.432]], [0.789, [0.576, 0.458, 0.432]], [0.791, [0.584, 0.468, 0.443]], [0.793, [0.584, 0.468, 0.443]], [0.795, [0.592, 0.478, 0.453]], [0.796, [0.592, 0.478, 0.453]], [0.798, [0.600, 0.488, 0.464]], [0.800, [0.600, 0.488, 0.464]], [0.802, [0.608, 0.498, 0.475]], [0.804, [0.608, 0.498, 0.475]], [0.806, [0.616, 0.508, 0.485]], [0.808, [0.616, 0.508, 0.485]], [0.810, [0.624, 0.518, 0.496]], [0.812, [0.624, 0.518, 0.496]], [0.814, [0.631, 0.528, 0.506]], [0.816, [0.631, 0.528, 0.506]], [0.818, [0.639, 0.538, 0.517]], [0.820, [0.639, 0.538, 0.517]], [0.822, [0.647, 0.548, 0.527]], [0.824, [0.647, 0.548, 0.527]], [0.826, [0.655, 0.558, 0.538]], [0.828, [0.655, 0.558, 0.538]], [0.830, [0.663, 0.568, 0.548]], [0.832, [0.663, 0.568, 0.548]], [0.834, [0.671, 0.578, 0.559]], [0.836, [0.671, 0.578, 0.559]], [0.838, [0.678, 0.588, 0.569]], [0.840, [0.678, 0.588, 0.569]], [0.841, [0.686, 0.598, 0.580]], [0.843, [0.686, 0.598, 0.580]], [0.845, [0.694, 0.608, 0.590]], [0.847, [0.694, 0.608, 0.590]], [0.849, [0.702, 0.619, 0.601]], [0.851, [0.702, 0.619, 0.601]], [0.853, [0.710, 0.629, 0.611]], [0.855, [0.710, 0.629, 0.611]], [0.857, [0.718, 0.639, 0.622]], [0.859, [0.718, 0.639, 0.622]], [0.861, [0.725, 0.649, 0.632]], [0.863, [0.725, 0.649, 0.632]], [0.865, [0.733, 0.659, 0.643]], [0.867, [0.733, 0.659, 0.643]], [0.869, [0.741, 0.669, 0.653]], [0.871, [0.741, 0.669, 0.653]], [0.873, [0.749, 0.679, 0.664]], [0.875, [0.749, 0.679, 0.664]], [0.877, [0.757, 0.689, 0.674]], [0.879, [0.757, 0.689, 0.674]], [0.881, [0.765, 0.699, 0.685]], [0.883, [0.765, 0.699, 0.685]], [0.885, [0.773, 0.709, 0.695]], [0.886, [0.773, 0.709, 0.695]], [0.888, [0.780, 0.719, 0.706]], [0.890, [0.780, 0.719, 0.706]], [0.892, [0.788, 0.729, 0.716]], [0.894, [0.788, 0.729, 0.716]], [0.896, [0.796, 0.739, 0.727]], [0.898, [0.796, 0.739, 0.727]], [0.900, [0.804, 0.749, 0.737]], [0.902, [0.804, 0.749, 0.737]], [0.904, [0.812, 0.759, 0.748]], [0.906, [0.812, 0.759, 0.748]], [0.908, [0.820, 0.769, 0.758]], [0.910, [0.820, 0.769, 0.758]], [0.912, [0.827, 0.779, 0.769]], [0.914, [0.827, 0.779, 0.769]], [0.916, [0.835, 0.789, 0.779]], [0.918, [0.835, 0.789, 0.779]], [0.920, [0.843, 0.799, 0.790]], [0.922, [0.843, 0.799, 0.790]], [0.924, [0.851, 0.809, 0.800]], [0.926, [0.851, 0.809, 0.800]], [0.928, [0.859, 0.819, 0.811]], [0.930, [0.859, 0.819, 0.811]], [0.932, [0.867, 0.829, 0.821]], [0.933, [0.867, 0.829, 0.821]], [0.935, [0.875, 0.839, 0.832]], [0.937, [0.875, 0.839, 0.832]], [0.939, [0.882, 0.849, 0.842]], [0.941, [0.882, 0.849, 0.842]], [0.943, [0.890, 0.859, 0.853]], [0.945, [0.890, 0.859, 0.853]], [0.947, [0.898, 0.869, 0.863]], [0.949, [0.898, 0.869, 0.863]], [0.951, [0.906, 0.880, 0.874]], [0.953, [0.906, 0.880, 0.874]], [0.955, [0.914, 0.890, 0.884]], [0.957, [0.914, 0.890, 0.884]], [0.959, [0.922, 0.900, 0.895]], [0.961, [0.922, 0.900, 0.895]], [0.963, [0.929, 0.910, 0.905]], [0.965, [0.929, 0.910, 0.905]], [0.967, [0.937, 0.920, 0.916]], [0.969, [0.937, 0.920, 0.916]], [0.971, [0.945, 0.930, 0.926]], [0.973, [0.945, 0.930, 0.926]], [0.975, [0.953, 0.940, 0.937]], [0.977, [0.953, 0.940, 0.937]], [0.978, [0.961, 0.950, 0.947]], [0.980, [0.961, 0.950, 0.947]], [0.982, [0.969, 0.960, 0.958]], [0.984, [0.969, 0.960, 0.958]], [0.986, [0.976, 0.970, 0.968]], [0.988, [0.976, 0.970, 0.968]], [0.990, [0.984, 0.980, 0.979]], [0.992, [0.984, 0.980, 0.979]], [0.994, [0.992, 0.990, 0.989]], [0.996, [0.992, 0.990, 0.989]], [0.998, [1.000, 1.000, 1.000]], [1.000, [1.000, 1.000, 1.000]]]; + diff --git a/recursive_swarm/lib/jspack.js b/recursive_swarm/lib/jspack.js new file mode 100644 index 0000000000000000000000000000000000000000..6dd46670bd8e214ac84880480bab8f2bf1a42234 --- /dev/null +++ b/recursive_swarm/lib/jspack.js @@ -0,0 +1,253 @@ +/*! + * Copyright � 2008 Fair Oaks Labs, Inc. + * All rights reserved. + */ + +// Utility object: Encode/Decode C-style binary primitives to/from octet arrays +function JSPack() +{ + // Module-level (private) variables + var el, bBE = false, m = this; + + + // Raw byte arrays + m._DeArray = function (a, p, l) + { + return [a.slice(p,p+l)]; + }; + m._EnArray = function (a, p, l, v) + { + for (var i = 0; i < l; a[p+i] = v[i]?v[i]:0, i++); + }; + + // ASCII characters + m._DeChar = function (a, p) + { + return String.fromCharCode(a[p]); + }; + m._EnChar = function (a, p, v) + { + a[p] = v.charCodeAt(0); + }; + + // Little-endian (un)signed N-byte integers + m._DeInt = function (a, p) + { + var lsb = bBE?(el.len-1):0, nsb = bBE?-1:1, stop = lsb+nsb*el.len, rv, i, f; + for (rv = 0, i = lsb, f = 1; i != stop; rv+=(a[p+i]*f), i+=nsb, f*=256); + if (el.bSigned && (rv & Math.pow(2, el.len*8-1))) { rv -= Math.pow(2, el.len*8); } + return rv; + }; + m._EnInt = function (a, p, v) + { + var lsb = bBE?(el.len-1):0, nsb = bBE?-1:1, stop = lsb+nsb*el.len, i; + v = (v<el.min)?el.min:(v>el.max)?el.max:v; + for (i = lsb; i != stop; a[p+i]=v&0xff, i+=nsb, v>>=8); + }; + + // ASCII character strings + m._DeString = function (a, p, l) + { + for (var rv = new Array(l), i = 0; i < l; rv[i] = String.fromCharCode(a[p+i]), i++); + return rv.join(''); + }; + m._EnString = function (a, p, l, v) + { + for (var t, i = 0; i < l; a[p+i] = (t=v.charCodeAt(i))?t:0, i++); + }; + + // Little-endian N-bit IEEE 754 floating point + m._De754 = function (a, p) + { + var s, e, m, i, d, nBits, mLen, eLen, eBias, eMax; + mLen = el.mLen, eLen = el.len*8-el.mLen-1, eMax = (1<<eLen)-1, eBias = eMax>>1; + + i = bBE?0:(el.len-1); d = bBE?1:-1; s = a[p+i]; i+=d; nBits = -7; + for (e = s&((1<<(-nBits))-1), s>>=(-nBits), nBits += eLen; nBits > 0; e=e*256+a[p+i], i+=d, nBits-=8); + for (m = e&((1<<(-nBits))-1), e>>=(-nBits), nBits += mLen; nBits > 0; m=m*256+a[p+i], i+=d, nBits-=8); + + switch (e) + { + case 0: + // Zero, or denormalized number + e = 1-eBias; + break; + case eMax: + // NaN, or +/-Infinity + return m?NaN:((s?-1:1)*Infinity); + default: + // Normalized number + m = m + Math.pow(2, mLen); + e = e - eBias; + break; + } + return (s?-1:1) * m * Math.pow(2, e-mLen); + }; + m._En754 = function (a, p, v) + { + var s, e, m, i, d, c, mLen, eLen, eBias, eMax; + mLen = el.mLen, eLen = el.len*8-el.mLen-1, eMax = (1<<eLen)-1, eBias = eMax>>1; + + s = v<0?1:0; + v = Math.abs(v); + if (isNaN(v) || (v == Infinity)) + { + m = isNaN(v)?1:0; + e = eMax; + } + else + { + e = Math.floor(Math.log(v)/Math.LN2); // Calculate log2 of the value + if (v*(c = Math.pow(2, -e)) < 1) { e--; c*=2; } // Math.log() isn't 100% reliable + + // Round by adding 1/2 the significand's LSD + if (e+eBias >= 1) { v += el.rt/c; } // Normalized: mLen significand digits + else { v += el.rt*Math.pow(2, 1-eBias); } // Denormalized: <= mLen significand digits + if (v*c >= 2) { e++; c/=2; } // Rounding can increment the exponent + + if (e+eBias >= eMax) + { + // Overflow + m = 0; + e = eMax; + } + else if (e+eBias >= 1) + { + // Normalized - term order matters, as Math.pow(2, 52-e) and v*Math.pow(2, 52) can overflow + m = (v*c-1)*Math.pow(2, mLen); + e = e + eBias; + } + else + { + // Denormalized - also catches the '0' case, somewhat by chance + m = v*Math.pow(2, eBias-1)*Math.pow(2, mLen); + e = 0; + } + } + + for (i = bBE?(el.len-1):0, d=bBE?-1:1; mLen >= 8; a[p+i]=m&0xff, i+=d, m/=256, mLen-=8); + for (e=(e<<mLen)|m, eLen+=mLen; eLen > 0; a[p+i]=e&0xff, i+=d, e/=256, eLen-=8); + a[p+i-d] |= s*128; + }; + + + // Class data + m._sPattern = '(\\d+)?([AxcbBhHsfdiIlL])'; + m._lenLut = {'A':1, 'x':1, 'c':1, 'b':1, 'B':1, 'h':2, 'H':2, 's':1, 'f':4, 'd':8, 'i':4, 'I':4, 'l':4, 'L':4}; + m._elLut = { 'A': {en:m._EnArray, de:m._DeArray}, + 's': {en:m._EnString, de:m._DeString}, + 'c': {en:m._EnChar, de:m._DeChar}, + 'b': {en:m._EnInt, de:m._DeInt, len:1, bSigned:true, min:-Math.pow(2, 7), max:Math.pow(2, 7)-1}, + 'B': {en:m._EnInt, de:m._DeInt, len:1, bSigned:false, min:0, max:Math.pow(2, 8)-1}, + 'h': {en:m._EnInt, de:m._DeInt, len:2, bSigned:true, min:-Math.pow(2, 15), max:Math.pow(2, 15)-1}, + 'H': {en:m._EnInt, de:m._DeInt, len:2, bSigned:false, min:0, max:Math.pow(2, 16)-1}, + 'i': {en:m._EnInt, de:m._DeInt, len:4, bSigned:true, min:-Math.pow(2, 31), max:Math.pow(2, 31)-1}, + 'I': {en:m._EnInt, de:m._DeInt, len:4, bSigned:false, min:0, max:Math.pow(2, 32)-1}, + 'l': {en:m._EnInt, de:m._DeInt, len:4, bSigned:true, min:-Math.pow(2, 31), max:Math.pow(2, 31)-1}, + 'L': {en:m._EnInt, de:m._DeInt, len:4, bSigned:false, min:0, max:Math.pow(2, 32)-1}, + 'f': {en:m._En754, de:m._De754, len:4, mLen:23, rt:Math.pow(2, -24)-Math.pow(2, -77)}, + 'd': {en:m._En754, de:m._De754, len:8, mLen:52, rt:0}}; + + // Unpack a series of n elements of size s from array a at offset p with fxn + m._UnpackSeries = function (n, s, a, p) + { + for (var fxn = el.de, rv = [], i = 0; i < n; rv.push(fxn(a, p+i*s)), i++); + return rv; + }; + + // Pack a series of n elements of size s from array v at offset i to array a at offset p with fxn + m._PackSeries = function (n, s, a, p, v, i) + { + for (var fxn = el.en, o = 0; o < n; fxn(a, p+o*s, v[i+o]), o++); + }; + + // Unpack the octet array a, beginning at offset p, according to the fmt string + m.Unpack = function (fmt, a, p) + { + // Set the private bBE flag based on the format string - assume big-endianness + bBE = (fmt.charAt(0) != '<'); + + p = p?p:0; + var re = new RegExp(this._sPattern, 'g'), m, n, s, rv = []; + while (m = re.exec(fmt)) + { + n = ((m[1]==undefined)||(m[1]==''))?1:parseInt(m[1]); + s = this._lenLut[m[2]]; + if ((p + n*s) > a.length) + { + return undefined; + } + switch (m[2]) + { + case 'A': case 's': + rv.push(this._elLut[m[2]].de(a, p, n)); + break; + case 'c': case 'b': case 'B': case 'h': case 'H': + case 'i': case 'I': case 'l': case 'L': case 'f': case 'd': + el = this._elLut[m[2]]; + rv.push(this._UnpackSeries(n, s, a, p)); + break; + } + p += n*s; + } + return Array.prototype.concat.apply([], rv); + }; + + // Pack the supplied values into the octet array a, beginning at offset p, according to the fmt string + m.PackTo = function (fmt, a, p, values) + { + // Set the private bBE flag based on the format string - assume big-endianness + bBE = (fmt.charAt(0) != '<'); + + var re = new RegExp(this._sPattern, 'g'), m, n, s, i = 0, j; + while (m = re.exec(fmt)) + { + n = ((m[1]==undefined)||(m[1]==''))?1:parseInt(m[1]); + s = this._lenLut[m[2]]; + if ((p + n*s) > a.length) + { + return false; + } + switch (m[2]) + { + case 'A': case 's': + if ((i + 1) > values.length) { return false; } + this._elLut[m[2]].en(a, p, n, values[i]); + i += 1; + break; + case 'c': case 'b': case 'B': case 'h': case 'H': + case 'i': case 'I': case 'l': case 'L': case 'f': case 'd': + el = this._elLut[m[2]]; + if ((i + n) > values.length) { return false; } + this._PackSeries(n, s, a, p, values, i); + i += n; + break; + case 'x': + for (j = 0; j < n; j++) { a[p+j] = 0; } + break; + } + p += n*s; + } + return a; + }; + + // Pack the supplied values into a new octet array, according to the fmt string + m.Pack = function (fmt, values) + { + return this.PackTo(fmt, new Array(this.CalcLength(fmt)), 0, values); + }; + + // Determine the number of bytes represented by the format string + m.CalcLength = function (fmt) + { + var re = new RegExp(this._sPattern, 'g'), m, sum = 0; + while (m = re.exec(fmt)) + { + sum += (((m[1]==undefined)||(m[1]==''))?1:parseInt(m[1])) * this._lenLut[m[2]]; + } + return sum; + }; + +}; + +// exports.jspack = new JSPack(); \ No newline at end of file diff --git a/recursive_swarm/lib/perlin.js b/recursive_swarm/lib/perlin.js new file mode 100644 index 0000000000000000000000000000000000000000..3ab0f4822be07e0e3f89a19068285fc46323fbfe --- /dev/null +++ b/recursive_swarm/lib/perlin.js @@ -0,0 +1,310 @@ +/* + * A speed-improved perlin and simplex noise algorithms for 2D. + * + * Based on example code by Stefan Gustavson (stegu@itn.liu.se). + * Optimisations by Peter Eastman (peastman@drizzle.stanford.edu). + * Better rank ordering method by Stefan Gustavson in 2012. + * Converted to Javascript by Joseph Gentle. + * + * Version 2012-03-09 + * + * This code was placed in the public domain by its original author, + * Stefan Gustavson. You may use it as you see fit, but + * attribution is appreciated. + * + */ + +(function(global){ + var module = global.noise = {}; + + function Grad(x, y, z) { + this.x = x; this.y = y; this.z = z; + } + + Grad.prototype.dot2 = function(x, y) { + return this.x*x + this.y*y; + }; + + Grad.prototype.dot3 = function(x, y, z) { + return this.x*x + this.y*y + this.z*z; + }; + + var grad3 = [new Grad(1,1,0),new Grad(-1,1,0),new Grad(1,-1,0),new Grad(-1,-1,0), + new Grad(1,0,1),new Grad(-1,0,1),new Grad(1,0,-1),new Grad(-1,0,-1), + new Grad(0,1,1),new Grad(0,-1,1),new Grad(0,1,-1),new Grad(0,-1,-1)]; + + var p = [151,160,137,91,90,15, + 131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23, + 190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33, + 88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166, + 77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244, + 102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196, + 135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123, + 5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42, + 223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9, + 129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228, + 251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107, + 49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254, + 138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180]; + // To remove the need for index wrapping, double the permutation table length + var perm = new Array(512); + var gradP = new Array(512); + + // This isn't a very good seeding function, but it works ok. It supports 2^16 + // different seed values. Write something better if you need more seeds. + module.seed = function(seed) { + if(seed > 0 && seed < 1) { + // Scale the seed out + seed *= 65536; + } + + seed = Math.floor(seed); + if(seed < 256) { + seed |= seed << 8; + } + + for(var i = 0; i < 256; i++) { + var v; + if (i & 1) { + v = p[i] ^ (seed & 255); + } else { + v = p[i] ^ ((seed>>8) & 255); + } + + perm[i] = perm[i + 256] = v; + gradP[i] = gradP[i + 256] = grad3[v % 12]; + } + }; + + module.seed(0); + + /* + for(var i=0; i<256; i++) { + perm[i] = perm[i + 256] = p[i]; + gradP[i] = gradP[i + 256] = grad3[perm[i] % 12]; + }*/ + + // Skewing and unskewing factors for 2, 3, and 4 dimensions + var F2 = 0.5*(Math.sqrt(3)-1); + var G2 = (3-Math.sqrt(3))/6; + + var F3 = 1/3; + var G3 = 1/6; + + // 2D simplex noise + module.simplex2 = function(xin, yin) { + var n0, n1, n2; // Noise contributions from the three corners + // Skew the input space to determine which simplex cell we're in + var s = (xin+yin)*F2; // Hairy factor for 2D + var i = Math.floor(xin+s); + var j = Math.floor(yin+s); + var t = (i+j)*G2; + var x0 = xin-i+t; // The x,y distances from the cell origin, unskewed. + var y0 = yin-j+t; + // For the 2D case, the simplex shape is an equilateral triangle. + // Determine which simplex we are in. + var i1, j1; // Offsets for second (middle) corner of simplex in (i,j) coords + if(x0>y0) { // lower triangle, XY order: (0,0)->(1,0)->(1,1) + i1=1; j1=0; + } else { // upper triangle, YX order: (0,0)->(0,1)->(1,1) + i1=0; j1=1; + } + // A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and + // a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where + // c = (3-sqrt(3))/6 + var x1 = x0 - i1 + G2; // Offsets for middle corner in (x,y) unskewed coords + var y1 = y0 - j1 + G2; + var x2 = x0 - 1 + 2 * G2; // Offsets for last corner in (x,y) unskewed coords + var y2 = y0 - 1 + 2 * G2; + // Work out the hashed gradient indices of the three simplex corners + i &= 255; + j &= 255; + var gi0 = gradP[i+perm[j]]; + var gi1 = gradP[i+i1+perm[j+j1]]; + var gi2 = gradP[i+1+perm[j+1]]; + // Calculate the contribution from the three corners + var t0 = 0.5 - x0*x0-y0*y0; + if(t0<0) { + n0 = 0; + } else { + t0 *= t0; + n0 = t0 * t0 * gi0.dot2(x0, y0); // (x,y) of grad3 used for 2D gradient + } + var t1 = 0.5 - x1*x1-y1*y1; + if(t1<0) { + n1 = 0; + } else { + t1 *= t1; + n1 = t1 * t1 * gi1.dot2(x1, y1); + } + var t2 = 0.5 - x2*x2-y2*y2; + if(t2<0) { + n2 = 0; + } else { + t2 *= t2; + n2 = t2 * t2 * gi2.dot2(x2, y2); + } + // Add contributions from each corner to get the final noise value. + // The result is scaled to return values in the interval [-1,1]. + return 70 * (n0 + n1 + n2); + }; + + // 3D simplex noise + module.simplex3 = function(xin, yin, zin) { + var n0, n1, n2, n3; // Noise contributions from the four corners + + // Skew the input space to determine which simplex cell we're in + var s = (xin+yin+zin)*F3; // Hairy factor for 2D + var i = Math.floor(xin+s); + var j = Math.floor(yin+s); + var k = Math.floor(zin+s); + + var t = (i+j+k)*G3; + var x0 = xin-i+t; // The x,y distances from the cell origin, unskewed. + var y0 = yin-j+t; + var z0 = zin-k+t; + + // For the 3D case, the simplex shape is a slightly irregular tetrahedron. + // Determine which simplex we are in. + var i1, j1, k1; // Offsets for second corner of simplex in (i,j,k) coords + var i2, j2, k2; // Offsets for third corner of simplex in (i,j,k) coords + if(x0 >= y0) { + if(y0 >= z0) { i1=1; j1=0; k1=0; i2=1; j2=1; k2=0; } + else if(x0 >= z0) { i1=1; j1=0; k1=0; i2=1; j2=0; k2=1; } + else { i1=0; j1=0; k1=1; i2=1; j2=0; k2=1; } + } else { + if(y0 < z0) { i1=0; j1=0; k1=1; i2=0; j2=1; k2=1; } + else if(x0 < z0) { i1=0; j1=1; k1=0; i2=0; j2=1; k2=1; } + else { i1=0; j1=1; k1=0; i2=1; j2=1; k2=0; } + } + // A step of (1,0,0) in (i,j,k) means a step of (1-c,-c,-c) in (x,y,z), + // a step of (0,1,0) in (i,j,k) means a step of (-c,1-c,-c) in (x,y,z), and + // a step of (0,0,1) in (i,j,k) means a step of (-c,-c,1-c) in (x,y,z), where + // c = 1/6. + var x1 = x0 - i1 + G3; // Offsets for second corner + var y1 = y0 - j1 + G3; + var z1 = z0 - k1 + G3; + + var x2 = x0 - i2 + 2 * G3; // Offsets for third corner + var y2 = y0 - j2 + 2 * G3; + var z2 = z0 - k2 + 2 * G3; + + var x3 = x0 - 1 + 3 * G3; // Offsets for fourth corner + var y3 = y0 - 1 + 3 * G3; + var z3 = z0 - 1 + 3 * G3; + + // Work out the hashed gradient indices of the four simplex corners + i &= 255; + j &= 255; + k &= 255; + var gi0 = gradP[i+ perm[j+ perm[k ]]]; + var gi1 = gradP[i+i1+perm[j+j1+perm[k+k1]]]; + var gi2 = gradP[i+i2+perm[j+j2+perm[k+k2]]]; + var gi3 = gradP[i+ 1+perm[j+ 1+perm[k+ 1]]]; + + // Calculate the contribution from the four corners + var t0 = 0.6 - x0*x0 - y0*y0 - z0*z0; + if(t0<0) { + n0 = 0; + } else { + t0 *= t0; + n0 = t0 * t0 * gi0.dot3(x0, y0, z0); // (x,y) of grad3 used for 2D gradient + } + var t1 = 0.6 - x1*x1 - y1*y1 - z1*z1; + if(t1<0) { + n1 = 0; + } else { + t1 *= t1; + n1 = t1 * t1 * gi1.dot3(x1, y1, z1); + } + var t2 = 0.6 - x2*x2 - y2*y2 - z2*z2; + if(t2<0) { + n2 = 0; + } else { + t2 *= t2; + n2 = t2 * t2 * gi2.dot3(x2, y2, z2); + } + var t3 = 0.6 - x3*x3 - y3*y3 - z3*z3; + if(t3<0) { + n3 = 0; + } else { + t3 *= t3; + n3 = t3 * t3 * gi3.dot3(x3, y3, z3); + } + // Add contributions from each corner to get the final noise value. + // The result is scaled to return values in the interval [-1,1]. + return 32 * (n0 + n1 + n2 + n3); + + }; + + // ##### Perlin noise stuff + + function fade(t) { + return t*t*t*(t*(t*6-15)+10); + } + + function lerp(a, b, t) { + return (1-t)*a + t*b; + } + + // 2D Perlin Noise + module.perlin2 = function(x, y) { + // Find unit grid cell containing point + var X = Math.floor(x), Y = Math.floor(y); + // Get relative xy coordinates of point within that cell + x = x - X; y = y - Y; + // Wrap the integer cells at 255 (smaller integer period can be introduced here) + X = X & 255; Y = Y & 255; + + // Calculate noise contributions from each of the four corners + var n00 = gradP[X+perm[Y]].dot2(x, y); + var n01 = gradP[X+perm[Y+1]].dot2(x, y-1); + var n10 = gradP[X+1+perm[Y]].dot2(x-1, y); + var n11 = gradP[X+1+perm[Y+1]].dot2(x-1, y-1); + + // Compute the fade curve value for x + var u = fade(x); + + // Interpolate the four results + return lerp( + lerp(n00, n10, u), + lerp(n01, n11, u), + fade(y)); + }; + + // 3D Perlin Noise + module.perlin3 = function(x, y, z) { + // Find unit grid cell containing point + var X = Math.floor(x), Y = Math.floor(y), Z = Math.floor(z); + // Get relative xyz coordinates of point within that cell + x = x - X; y = y - Y; z = z - Z; + // Wrap the integer cells at 255 (smaller integer period can be introduced here) + X = X & 255; Y = Y & 255; Z = Z & 255; + + // Calculate noise contributions from each of the eight corners + var n000 = gradP[X+ perm[Y+ perm[Z ]]].dot3(x, y, z); + var n001 = gradP[X+ perm[Y+ perm[Z+1]]].dot3(x, y, z-1); + var n010 = gradP[X+ perm[Y+1+perm[Z ]]].dot3(x, y-1, z); + var n011 = gradP[X+ perm[Y+1+perm[Z+1]]].dot3(x, y-1, z-1); + var n100 = gradP[X+1+perm[Y+ perm[Z ]]].dot3(x-1, y, z); + var n101 = gradP[X+1+perm[Y+ perm[Z+1]]].dot3(x-1, y, z-1); + var n110 = gradP[X+1+perm[Y+1+perm[Z ]]].dot3(x-1, y-1, z); + var n111 = gradP[X+1+perm[Y+1+perm[Z+1]]].dot3(x-1, y-1, z-1); + + // Compute the fade curve value for x, y, z + var u = fade(x); + var v = fade(y); + var w = fade(z); + + // Interpolate + return lerp( + lerp( + lerp(n000, n100, u), + lerp(n001, n101, u), w), + lerp( + lerp(n010, n110, u), + lerp(n011, n111, u), w), + v); + }; + +})(this); diff --git a/recursive_swarm/lib/stats.js b/recursive_swarm/lib/stats.js new file mode 100644 index 0000000000000000000000000000000000000000..a2baaf7efdd5b4166d7bca43b46b8e3c34516e3c --- /dev/null +++ b/recursive_swarm/lib/stats.js @@ -0,0 +1,179 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global.Stats = factory()); +}(this, (function () { 'use strict'; + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +var Stats = function () { + + var mode = 0; + + var container = document.createElement( 'div' ); + container.style.cssText = 'position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000'; + container.addEventListener( 'click', function ( event ) { + + event.preventDefault(); + showPanel( ++ mode % container.children.length ); + + }, false ); + + // + + function addPanel( panel ) { + + container.appendChild( panel.dom ); + return panel; + + } + + function showPanel( id ) { + + for ( var i = 0; i < container.children.length; i ++ ) { + + container.children[ i ].style.display = i === id ? 'block' : 'none'; + + } + + mode = id; + + } + + // + + var beginTime = ( performance || Date ).now(), prevTime = beginTime, frames = 0; + + var fpsPanel = addPanel( new Stats.Panel( 'FPS', '#0ff', '#002' ) ); + var msPanel = addPanel( new Stats.Panel( 'MS', '#0f0', '#020' ) ); + + if ( self.performance && self.performance.memory ) { + + var memPanel = addPanel( new Stats.Panel( 'MB', '#f08', '#201' ) ); + + } + + showPanel( 0 ); + + return { + + REVISION: 16, + + dom: container, + + addPanel: addPanel, + showPanel: showPanel, + + begin: function () { + + beginTime = ( performance || Date ).now(); + + }, + + end: function () { + + frames ++; + + var time = ( performance || Date ).now(); + + msPanel.update( time - beginTime, 200 ); + + if ( time > prevTime + 1000 ) { + + fpsPanel.update( ( frames * 1000 ) / ( time - prevTime ), 100 ); + + prevTime = time; + frames = 0; + + if ( memPanel ) { + + var memory = performance.memory; + memPanel.update( memory.usedJSHeapSize / 1048576, memory.jsHeapSizeLimit / 1048576 ); + + } + + } + + return time; + + }, + + update: function () { + + beginTime = this.end(); + + }, + + // Backwards Compatibility + + domElement: container, + setMode: showPanel + + }; + +}; + +Stats.Panel = function ( name, fg, bg ) { + + var min = Infinity, max = 0, round = Math.round; + var PR = round( window.devicePixelRatio || 1 ); + + var WIDTH = 80 * PR, HEIGHT = 48 * PR, + TEXT_X = 3 * PR, TEXT_Y = 2 * PR, + GRAPH_X = 3 * PR, GRAPH_Y = 15 * PR, + GRAPH_WIDTH = 74 * PR, GRAPH_HEIGHT = 30 * PR; + + var canvas = document.createElement( 'canvas' ); + canvas.width = WIDTH; + canvas.height = HEIGHT; + canvas.style.cssText = 'width:80px;height:48px'; + + var context = canvas.getContext( '2d' ); + context.font = 'bold ' + ( 9 * PR ) + 'px Helvetica,Arial,sans-serif'; + context.textBaseline = 'top'; + + context.fillStyle = bg; + context.fillRect( 0, 0, WIDTH, HEIGHT ); + + context.fillStyle = fg; + context.fillText( name, TEXT_X, TEXT_Y ); + context.fillRect( GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT ); + + context.fillStyle = bg; + context.globalAlpha = 0.9; + context.fillRect( GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT ); + + return { + + dom: canvas, + + update: function ( value, maxValue ) { + + min = Math.min( min, value ); + max = Math.max( max, value ); + + context.fillStyle = bg; + context.globalAlpha = 1; + context.fillRect( 0, 0, WIDTH, GRAPH_Y ); + context.fillStyle = fg; + context.fillText( round( value ) + ' ' + name + ' (' + round( min ) + '-' + round( max ) + ')', TEXT_X, TEXT_Y ); + + context.drawImage( canvas, GRAPH_X + PR, GRAPH_Y, GRAPH_WIDTH - PR, GRAPH_HEIGHT, GRAPH_X, GRAPH_Y, GRAPH_WIDTH - PR, GRAPH_HEIGHT ); + + context.fillRect( GRAPH_X + GRAPH_WIDTH - PR, GRAPH_Y, PR, GRAPH_HEIGHT ); + + context.fillStyle = bg; + context.globalAlpha = 0.9; + context.fillRect( GRAPH_X + GRAPH_WIDTH - PR, GRAPH_Y, PR, round( ( 1 - ( value / maxValue ) ) * GRAPH_HEIGHT ) ); + + } + + }; + +}; + +return Stats; + +}))); \ No newline at end of file diff --git a/recursive_swarm/lib/structjs.js b/recursive_swarm/lib/structjs.js new file mode 100644 index 0000000000000000000000000000000000000000..f15996582dcfc26b7ab2a6f1921c7752a986ae30 --- /dev/null +++ b/recursive_swarm/lib/structjs.js @@ -0,0 +1,72 @@ +/*eslint-env es6*/ +const rechk = /^([<>])?(([1-9]\d*)?([xcbB?hHiIfdsp]))*$/ +const refmt = /([1-9]\d*)?([xcbB?hHiIfdsp])/g +const str = (v,o,c) => String.fromCharCode( + ...new Uint8Array(v.buffer, v.byteOffset + o, c)) +const rts = (v,o,c,s) => new Uint8Array(v.buffer, v.byteOffset + o, c) + .set(s.split('').map(str => str.charCodeAt(0))) +const pst = (v,o,c) => str(v, o + 1, Math.min(v.getUint8(o), c - 1)) +const tsp = (v,o,c,s) => { v.setUint8(o, s.length); rts(v, o + 1, c - 1, s) } +const lut = le => ({ + x: c=>[1,c,0], + c: c=>[c,1,o=>({u:v=>str(v, o, 1) , p:(v,c)=>rts(v, o, 1, c) })], + '?': c=>[c,1,o=>({u:v=>Boolean(v.getUint8(o)),p:(v,B)=>v.setUint8(o,B)})], + b: c=>[c,1,o=>({u:v=>v.getInt8( o ), p:(v,b)=>v.setInt8( o,b )})], + B: c=>[c,1,o=>({u:v=>v.getUint8( o ), p:(v,B)=>v.setUint8( o,B )})], + h: c=>[c,2,o=>({u:v=>v.getInt16( o,le), p:(v,h)=>v.setInt16( o,h,le)})], + H: c=>[c,2,o=>({u:v=>v.getUint16( o,le), p:(v,H)=>v.setUint16( o,H,le)})], + i: c=>[c,4,o=>({u:v=>v.getInt32( o,le), p:(v,i)=>v.setInt32( o,i,le)})], + I: c=>[c,4,o=>({u:v=>v.getUint32( o,le), p:(v,I)=>v.setUint32( o,I,le)})], + f: c=>[c,4,o=>({u:v=>v.getFloat32(o,le), p:(v,f)=>v.setFloat32(o,f,le)})], + d: c=>[c,8,o=>({u:v=>v.getFloat64(o,le), p:(v,d)=>v.setFloat64(o,d,le)})], + s: c=>[1,c,o=>({u:v=>str(v,o,c), p:(v,s)=>rts(v,o,c,s.slice(0,c ) )})], + p: c=>[1,c,o=>({u:v=>pst(v,o,c), p:(v,s)=>tsp(v,o,c,s.slice(0,c - 1) )})] +}) +const errbuf = new RangeError("Structure larger than remaining buffer") +const errval = new RangeError("Not enough values for structure") +// export default +function struct(format) { + let fns = [], size = 0, m = rechk.exec(format) + if (!m) { throw new RangeError("Invalid format string") } + const t = lut('<' === m[1]), lu = (n, c) => t[c](n ? parseInt(n, 10) : 1) + while ((m = refmt.exec(format))) { ((r, s, f) => { + for (let i = 0; i < r; ++i, size += s) { if (f) {fns.push(f(size))} } + })(...lu(...m.slice(1)))} + const unpack_from = (arrb, offs) => { + if (arrb.byteLength < (offs|0) + size) { throw errbuf } + let v = new DataView(arrb, offs|0) + return fns.map(f => f.u(v)) + } + const pack_into = (arrb, offs, ...values) => { + if (values.length < fns.length) { throw errval } + if (arrb.byteLength < offs + size) { throw errbuf } + const v = new DataView(arrb, offs) + new Uint8Array(arrb, offs, size).fill(0) + fns.forEach((f, i) => f.p(v, values[i])) + } + const pack = (...values) => { + let b = new ArrayBuffer(size) + pack_into(b, 0, ...values) + return b + } + const unpack = arrb => unpack_from(arrb, 0) + function* iter_unpack(arrb) { + for (let offs = 0; offs + size <= arrb.byteLength; offs += size) { + yield unpack_from(arrb, offs); + } + } + return Object.freeze({ + unpack, pack, unpack_from, pack_into, iter_unpack, format, size}) +} +/* +const pack = (format, ...values) => struct(format).pack(...values) +const unpack = (format, buffer) => struct(format).unpack(buffer) +const pack_into = (format, arrb, offs, ...values) => + struct(format).pack_into(arrb, offs, ...values) +const unpack_from = (format, arrb, offset) => + struct(format).unpack_from(arrb, offset) +const iter_unpack = (format, arrb) => struct(format).iter_unpack(arrb) +const calcsize = format => struct(format).size +module.exports = { + struct, pack, unpack, pack_into, unpack_from, iter_unpack, calcsize } +*/ \ No newline at end of file diff --git a/recursive_swarm/lib/styles.css b/recursive_swarm/lib/styles.css new file mode 100644 index 0000000000000000000000000000000000000000..a63a0359a3d5ec76e2220b8d8aa78e2b71948198 --- /dev/null +++ b/recursive_swarm/lib/styles.css @@ -0,0 +1,9 @@ +body { + font-family: 'Helvetica Neue', Arial, sans-serif; + color: #333; + font-weight: 300; +} + +path.glyd3link { + stroke: black; +} \ No newline at end of file diff --git a/recursive_swarm/lib/three.js b/recursive_swarm/lib/three.js new file mode 100644 index 0000000000000000000000000000000000000000..d9c68d25e56ef525914bce42e886974302a86541 --- /dev/null +++ b/recursive_swarm/lib/three.js @@ -0,0 +1,43684 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.THREE = global.THREE || {}))); +}(this, (function (exports) { 'use strict'; + + // Polyfills + + if ( Number.EPSILON === undefined ) { + + Number.EPSILON = Math.pow( 2, - 52 ); + + } + + if ( Number.isInteger === undefined ) { + + // Missing in IE + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger + + Number.isInteger = function ( value ) { + + return typeof value === 'number' && isFinite( value ) && Math.floor( value ) === value; + + }; + + } + + // + + if ( Math.sign === undefined ) { + + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign + + Math.sign = function ( x ) { + + return ( x < 0 ) ? - 1 : ( x > 0 ) ? 1 : + x; + + }; + + } + + if ( Function.prototype.name === undefined ) { + + // Missing in IE + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name + + Object.defineProperty( Function.prototype, 'name', { + + get: function () { + + return this.toString().match( /^\s*function\s*([^\(\s]*)/ )[ 1 ]; + + } + + } ); + + } + + if ( Object.assign === undefined ) { + + // Missing in IE + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign + + ( function () { + + Object.assign = function ( target ) { + + 'use strict'; + + if ( target === undefined || target === null ) { + + throw new TypeError( 'Cannot convert undefined or null to object' ); + + } + + var output = Object( target ); + + for ( var index = 1; index < arguments.length; index ++ ) { + + var source = arguments[ index ]; + + if ( source !== undefined && source !== null ) { + + for ( var nextKey in source ) { + + if ( Object.prototype.hasOwnProperty.call( source, nextKey ) ) { + + output[ nextKey ] = source[ nextKey ]; + + } + + } + + } + + } + + return output; + + }; + + } )(); + + } + + /** + * https://github.com/mrdoob/eventdispatcher.js/ + */ + + function EventDispatcher() {} + + Object.assign( EventDispatcher.prototype, { + + addEventListener: function ( type, listener ) { + + if ( this._listeners === undefined ) this._listeners = {}; + + var listeners = this._listeners; + + if ( listeners[ type ] === undefined ) { + + listeners[ type ] = []; + + } + + if ( listeners[ type ].indexOf( listener ) === - 1 ) { + + listeners[ type ].push( listener ); + + } + + }, + + hasEventListener: function ( type, listener ) { + + if ( this._listeners === undefined ) return false; + + var listeners = this._listeners; + + return listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1; + + }, + + removeEventListener: function ( type, listener ) { + + if ( this._listeners === undefined ) return; + + var listeners = this._listeners; + var listenerArray = listeners[ type ]; + + if ( listenerArray !== undefined ) { + + var index = listenerArray.indexOf( listener ); + + if ( index !== - 1 ) { + + listenerArray.splice( index, 1 ); + + } + + } + + }, + + dispatchEvent: function ( event ) { + + if ( this._listeners === undefined ) return; + + var listeners = this._listeners; + var listenerArray = listeners[ event.type ]; + + if ( listenerArray !== undefined ) { + + event.target = this; + + var array = [], i = 0; + var length = listenerArray.length; + + for ( i = 0; i < length; i ++ ) { + + array[ i ] = listenerArray[ i ]; + + } + + for ( i = 0; i < length; i ++ ) { + + array[ i ].call( this, event ); + + } + + } + + } + + } ); + + var REVISION = '85'; + var MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 }; + var CullFaceNone = 0; + var CullFaceBack = 1; + var CullFaceFront = 2; + var CullFaceFrontBack = 3; + var FrontFaceDirectionCW = 0; + var FrontFaceDirectionCCW = 1; + var BasicShadowMap = 0; + var PCFShadowMap = 1; + var PCFSoftShadowMap = 2; + var FrontSide = 0; + var BackSide = 1; + var DoubleSide = 2; + var FlatShading = 1; + var SmoothShading = 2; + var NoColors = 0; + var FaceColors = 1; + var VertexColors = 2; + var NoBlending = 0; + var NormalBlending = 1; + var AdditiveBlending = 2; + var SubtractiveBlending = 3; + var MultiplyBlending = 4; + var CustomBlending = 5; + var AddEquation = 100; + var SubtractEquation = 101; + var ReverseSubtractEquation = 102; + var MinEquation = 103; + var MaxEquation = 104; + var ZeroFactor = 200; + var OneFactor = 201; + var SrcColorFactor = 202; + var OneMinusSrcColorFactor = 203; + var SrcAlphaFactor = 204; + var OneMinusSrcAlphaFactor = 205; + var DstAlphaFactor = 206; + var OneMinusDstAlphaFactor = 207; + var DstColorFactor = 208; + var OneMinusDstColorFactor = 209; + var SrcAlphaSaturateFactor = 210; + var NeverDepth = 0; + var AlwaysDepth = 1; + var LessDepth = 2; + var LessEqualDepth = 3; + var EqualDepth = 4; + var GreaterEqualDepth = 5; + var GreaterDepth = 6; + var NotEqualDepth = 7; + var MultiplyOperation = 0; + var MixOperation = 1; + var AddOperation = 2; + var NoToneMapping = 0; + var LinearToneMapping = 1; + var ReinhardToneMapping = 2; + var Uncharted2ToneMapping = 3; + var CineonToneMapping = 4; + var UVMapping = 300; + var CubeReflectionMapping = 301; + var CubeRefractionMapping = 302; + var EquirectangularReflectionMapping = 303; + var EquirectangularRefractionMapping = 304; + var SphericalReflectionMapping = 305; + var CubeUVReflectionMapping = 306; + var CubeUVRefractionMapping = 307; + var RepeatWrapping = 1000; + var ClampToEdgeWrapping = 1001; + var MirroredRepeatWrapping = 1002; + var NearestFilter = 1003; + var NearestMipMapNearestFilter = 1004; + var NearestMipMapLinearFilter = 1005; + var LinearFilter = 1006; + var LinearMipMapNearestFilter = 1007; + var LinearMipMapLinearFilter = 1008; + var UnsignedByteType = 1009; + var ByteType = 1010; + var ShortType = 1011; + var UnsignedShortType = 1012; + var IntType = 1013; + var UnsignedIntType = 1014; + var FloatType = 1015; + var HalfFloatType = 1016; + var UnsignedShort4444Type = 1017; + var UnsignedShort5551Type = 1018; + var UnsignedShort565Type = 1019; + var UnsignedInt248Type = 1020; + var AlphaFormat = 1021; + var RGBFormat = 1022; + var RGBAFormat = 1023; + var LuminanceFormat = 1024; + var LuminanceAlphaFormat = 1025; + var RGBEFormat = RGBAFormat; + var DepthFormat = 1026; + var DepthStencilFormat = 1027; + var RGB_S3TC_DXT1_Format = 2001; + var RGBA_S3TC_DXT1_Format = 2002; + var RGBA_S3TC_DXT3_Format = 2003; + var RGBA_S3TC_DXT5_Format = 2004; + var RGB_PVRTC_4BPPV1_Format = 2100; + var RGB_PVRTC_2BPPV1_Format = 2101; + var RGBA_PVRTC_4BPPV1_Format = 2102; + var RGBA_PVRTC_2BPPV1_Format = 2103; + var RGB_ETC1_Format = 2151; + var LoopOnce = 2200; + var LoopRepeat = 2201; + var LoopPingPong = 2202; + var InterpolateDiscrete = 2300; + var InterpolateLinear = 2301; + var InterpolateSmooth = 2302; + var ZeroCurvatureEnding = 2400; + var ZeroSlopeEnding = 2401; + var WrapAroundEnding = 2402; + var TrianglesDrawMode = 0; + var TriangleStripDrawMode = 1; + var TriangleFanDrawMode = 2; + var LinearEncoding = 3000; + var sRGBEncoding = 3001; + var GammaEncoding = 3007; + var RGBEEncoding = 3002; + var LogLuvEncoding = 3003; + var RGBM7Encoding = 3004; + var RGBM16Encoding = 3005; + var RGBDEncoding = 3006; + var BasicDepthPacking = 3200; + var RGBADepthPacking = 3201; + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + var _Math = { + + DEG2RAD: Math.PI / 180, + RAD2DEG: 180 / Math.PI, + + generateUUID: function () { + + // http://www.broofa.com/Tools/Math.uuid.htm + + var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split( '' ); + var uuid = new Array( 36 ); + var rnd = 0, r; + + return function generateUUID() { + + for ( var i = 0; i < 36; i ++ ) { + + if ( i === 8 || i === 13 || i === 18 || i === 23 ) { + + uuid[ i ] = '-'; + + } else if ( i === 14 ) { + + uuid[ i ] = '4'; + + } else { + + if ( rnd <= 0x02 ) rnd = 0x2000000 + ( Math.random() * 0x1000000 ) | 0; + r = rnd & 0xf; + rnd = rnd >> 4; + uuid[ i ] = chars[ ( i === 19 ) ? ( r & 0x3 ) | 0x8 : r ]; + + } + + } + + return uuid.join( '' ); + + }; + + }(), + + clamp: function ( value, min, max ) { + + return Math.max( min, Math.min( max, value ) ); + + }, + + // compute euclidian modulo of m % n + // https://en.wikipedia.org/wiki/Modulo_operation + + euclideanModulo: function ( n, m ) { + + return ( ( n % m ) + m ) % m; + + }, + + // Linear mapping from range <a1, a2> to range <b1, b2> + + mapLinear: function ( x, a1, a2, b1, b2 ) { + + return b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 ); + + }, + + // https://en.wikipedia.org/wiki/Linear_interpolation + + lerp: function ( x, y, t ) { + + return ( 1 - t ) * x + t * y; + + }, + + // http://en.wikipedia.org/wiki/Smoothstep + + smoothstep: function ( x, min, max ) { + + if ( x <= min ) return 0; + if ( x >= max ) return 1; + + x = ( x - min ) / ( max - min ); + + return x * x * ( 3 - 2 * x ); + + }, + + smootherstep: function ( x, min, max ) { + + if ( x <= min ) return 0; + if ( x >= max ) return 1; + + x = ( x - min ) / ( max - min ); + + return x * x * x * ( x * ( x * 6 - 15 ) + 10 ); + + }, + + // Random integer from <low, high> interval + + randInt: function ( low, high ) { + + return low + Math.floor( Math.random() * ( high - low + 1 ) ); + + }, + + // Random float from <low, high> interval + + randFloat: function ( low, high ) { + + return low + Math.random() * ( high - low ); + + }, + + // Random float from <-range/2, range/2> interval + + randFloatSpread: function ( range ) { + + return range * ( 0.5 - Math.random() ); + + }, + + degToRad: function ( degrees ) { + + return degrees * _Math.DEG2RAD; + + }, + + radToDeg: function ( radians ) { + + return radians * _Math.RAD2DEG; + + }, + + isPowerOfTwo: function ( value ) { + + return ( value & ( value - 1 ) ) === 0 && value !== 0; + + }, + + nearestPowerOfTwo: function ( value ) { + + return Math.pow( 2, Math.round( Math.log( value ) / Math.LN2 ) ); + + }, + + nextPowerOfTwo: function ( value ) { + + value --; + value |= value >> 1; + value |= value >> 2; + value |= value >> 4; + value |= value >> 8; + value |= value >> 16; + value ++; + + return value; + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author philogb / http://blog.thejit.org/ + * @author egraether / http://egraether.com/ + * @author zz85 / http://www.lab4games.net/zz85/blog + */ + + function Vector2( x, y ) { + + this.x = x || 0; + this.y = y || 0; + + } + + Object.defineProperties( Vector2.prototype, { + + "width" : { + + get: function () { + + return this.x; + + }, + + set: function ( value ) { + + this.x = value; + + } + + }, + + "height" : { + + get: function () { + + return this.y; + + }, + + set: function ( value ) { + + this.y = value; + + } + + } + + } ); + + Object.assign( Vector2.prototype, { + + isVector2: true, + + set: function ( x, y ) { + + this.x = x; + this.y = y; + + return this; + + }, + + setScalar: function ( scalar ) { + + this.x = scalar; + this.y = scalar; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + return this; + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + clone: function () { + + return new this.constructor( this.x, this.y ); + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + + return this; + + }, + + addVectors: function ( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + + return this; + + }, + + addScaledVector: function ( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + + return this; + + }, + + subScalar: function ( s ) { + + this.x -= s; + this.y -= s; + + return this; + + }, + + subVectors: function ( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + + return this; + + }, + + multiply: function ( v ) { + + this.x *= v.x; + this.y *= v.y; + + return this; + + }, + + multiplyScalar: function ( scalar ) { + + this.x *= scalar; + this.y *= scalar; + + return this; + + }, + + divide: function ( v ) { + + this.x /= v.x; + this.y /= v.y; + + return this; + + }, + + divideScalar: function ( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + }, + + min: function ( v ) { + + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + + return this; + + }, + + max: function ( v ) { + + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + + return this; + + }, + + clamp: function ( min, max ) { + + // This function assumes min < max, if this assumption isn't true it will not operate correctly + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + + return this; + + }, + + clampScalar: function () { + + var min = new Vector2(); + var max = new Vector2(); + + return function clampScalar( minVal, maxVal ) { + + min.set( minVal, minVal ); + max.set( maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + }(), + + clampLength: function ( min, max ) { + + var length = this.length(); + + return this.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length ); + + }, + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + + return this; + + }, + + round: function () { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + + return this; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y; + + }, + + lengthSq: function () { + + return this.x * this.x + this.y * this.y; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y ); + + }, + + lengthManhattan: function() { + + return Math.abs( this.x ) + Math.abs( this.y ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() ); + + }, + + angle: function () { + + // computes the angle in radians with respect to the positive x-axis + + var angle = Math.atan2( this.y, this.x ); + + if ( angle < 0 ) angle += 2 * Math.PI; + + return angle; + + }, + + distanceTo: function ( v ) { + + return Math.sqrt( this.distanceToSquared( v ) ); + + }, + + distanceToSquared: function ( v ) { + + var dx = this.x - v.x, dy = this.y - v.y; + return dx * dx + dy * dy; + + }, + + distanceToManhattan: function ( v ) { + + return Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ); + + }, + + setLength: function ( length ) { + + return this.multiplyScalar( length / this.length() ); + + }, + + lerp: function ( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + + return this; + + }, + + lerpVectors: function ( v1, v2, alpha ) { + + return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 ); + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + + return array; + + }, + + fromBufferAttribute: function ( attribute, index, offset ) { + + if ( offset !== undefined ) { + + console.warn( 'THREE.Vector2: offset has been removed from .fromBufferAttribute().' ); + + } + + this.x = attribute.getX( index ); + this.y = attribute.getY( index ); + + return this; + + }, + + rotateAround: function ( center, angle ) { + + var c = Math.cos( angle ), s = Math.sin( angle ); + + var x = this.x - center.x; + var y = this.y - center.y; + + this.x = x * c - y * s + center.x; + this.y = x * s + y * c + center.y; + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author szimek / https://github.com/szimek/ + */ + + var textureId = 0; + + function Texture( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) { + + Object.defineProperty( this, 'id', { value: textureId ++ } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + + this.image = image !== undefined ? image : Texture.DEFAULT_IMAGE; + this.mipmaps = []; + + this.mapping = mapping !== undefined ? mapping : Texture.DEFAULT_MAPPING; + + this.wrapS = wrapS !== undefined ? wrapS : ClampToEdgeWrapping; + this.wrapT = wrapT !== undefined ? wrapT : ClampToEdgeWrapping; + + this.magFilter = magFilter !== undefined ? magFilter : LinearFilter; + this.minFilter = minFilter !== undefined ? minFilter : LinearMipMapLinearFilter; + + this.anisotropy = anisotropy !== undefined ? anisotropy : 1; + + this.format = format !== undefined ? format : RGBAFormat; + this.type = type !== undefined ? type : UnsignedByteType; + + this.offset = new Vector2( 0, 0 ); + this.repeat = new Vector2( 1, 1 ); + + this.generateMipmaps = true; + this.premultiplyAlpha = false; + this.flipY = true; + this.unpackAlignment = 4; // valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml) + + // Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap. + // + // Also changing the encoding after already used by a Material will not automatically make the Material + // update. You need to explicitly call Material.needsUpdate to trigger it to recompile. + this.encoding = encoding !== undefined ? encoding : LinearEncoding; + + this.version = 0; + this.onUpdate = null; + + } + + Texture.DEFAULT_IMAGE = undefined; + Texture.DEFAULT_MAPPING = UVMapping; + + Object.defineProperty( Texture.prototype, "needsUpdate", { + + set: function ( value ) { + + if ( value === true ) this.version ++; + + } + + } ); + + Object.assign( Texture.prototype, EventDispatcher.prototype, { + + constructor: Texture, + + isTexture: true, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.name = source.name; + + this.image = source.image; + this.mipmaps = source.mipmaps.slice( 0 ); + + this.mapping = source.mapping; + + this.wrapS = source.wrapS; + this.wrapT = source.wrapT; + + this.magFilter = source.magFilter; + this.minFilter = source.minFilter; + + this.anisotropy = source.anisotropy; + + this.format = source.format; + this.type = source.type; + + this.offset.copy( source.offset ); + this.repeat.copy( source.repeat ); + + this.generateMipmaps = source.generateMipmaps; + this.premultiplyAlpha = source.premultiplyAlpha; + this.flipY = source.flipY; + this.unpackAlignment = source.unpackAlignment; + this.encoding = source.encoding; + + return this; + + }, + + toJSON: function ( meta ) { + + if ( meta.textures[ this.uuid ] !== undefined ) { + + return meta.textures[ this.uuid ]; + + } + + function getDataURL( image ) { + + var canvas; + + if ( image.toDataURL !== undefined ) { + + canvas = image; + + } else { + + canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + canvas.width = image.width; + canvas.height = image.height; + + canvas.getContext( '2d' ).drawImage( image, 0, 0, image.width, image.height ); + + } + + if ( canvas.width > 2048 || canvas.height > 2048 ) { + + return canvas.toDataURL( 'image/jpeg', 0.6 ); + + } else { + + return canvas.toDataURL( 'image/png' ); + + } + + } + + var output = { + metadata: { + version: 4.5, + type: 'Texture', + generator: 'Texture.toJSON' + }, + + uuid: this.uuid, + name: this.name, + + mapping: this.mapping, + + repeat: [ this.repeat.x, this.repeat.y ], + offset: [ this.offset.x, this.offset.y ], + wrap: [ this.wrapS, this.wrapT ], + + minFilter: this.minFilter, + magFilter: this.magFilter, + anisotropy: this.anisotropy, + + flipY: this.flipY + }; + + if ( this.image !== undefined ) { + + // TODO: Move to THREE.Image + + var image = this.image; + + if ( image.uuid === undefined ) { + + image.uuid = _Math.generateUUID(); // UGH + + } + + if ( meta.images[ image.uuid ] === undefined ) { + + meta.images[ image.uuid ] = { + uuid: image.uuid, + url: getDataURL( image ) + }; + + } + + output.image = image.uuid; + + } + + meta.textures[ this.uuid ] = output; + + return output; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + }, + + transformUv: function ( uv ) { + + if ( this.mapping !== UVMapping ) return; + + uv.multiply( this.repeat ); + uv.add( this.offset ); + + if ( uv.x < 0 || uv.x > 1 ) { + + switch ( this.wrapS ) { + + case RepeatWrapping: + + uv.x = uv.x - Math.floor( uv.x ); + break; + + case ClampToEdgeWrapping: + + uv.x = uv.x < 0 ? 0 : 1; + break; + + case MirroredRepeatWrapping: + + if ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) { + + uv.x = Math.ceil( uv.x ) - uv.x; + + } else { + + uv.x = uv.x - Math.floor( uv.x ); + + } + break; + + } + + } + + if ( uv.y < 0 || uv.y > 1 ) { + + switch ( this.wrapT ) { + + case RepeatWrapping: + + uv.y = uv.y - Math.floor( uv.y ); + break; + + case ClampToEdgeWrapping: + + uv.y = uv.y < 0 ? 0 : 1; + break; + + case MirroredRepeatWrapping: + + if ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) { + + uv.y = Math.ceil( uv.y ) - uv.y; + + } else { + + uv.y = uv.y - Math.floor( uv.y ); + + } + break; + + } + + } + + if ( this.flipY ) { + + uv.y = 1 - uv.y; + + } + + } + + } ); + + /** + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author philogb / http://blog.thejit.org/ + * @author mikael emtinger / http://gomo.se/ + * @author egraether / http://egraether.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function Vector4( x, y, z, w ) { + + this.x = x || 0; + this.y = y || 0; + this.z = z || 0; + this.w = ( w !== undefined ) ? w : 1; + + } + + Object.assign( Vector4.prototype, { + + isVector4: true, + + set: function ( x, y, z, w ) { + + this.x = x; + this.y = y; + this.z = z; + this.w = w; + + return this; + + }, + + setScalar: function ( scalar ) { + + this.x = scalar; + this.y = scalar; + this.z = scalar; + this.w = scalar; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setZ: function ( z ) { + + this.z = z; + + return this; + + }, + + setW: function ( w ) { + + this.w = w; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + case 2: this.z = value; break; + case 3: this.w = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + return this; + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + case 2: return this.z; + case 3: return this.w; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + clone: function () { + + return new this.constructor( this.x, this.y, this.z, this.w ); + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + this.z = v.z; + this.w = ( v.w !== undefined ) ? v.w : 1; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + this.z += v.z; + this.w += v.w; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + this.z += s; + this.w += s; + + return this; + + }, + + addVectors: function ( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + this.z = a.z + b.z; + this.w = a.w + b.w; + + return this; + + }, + + addScaledVector: function ( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + this.z += v.z * s; + this.w += v.w * s; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; + this.w -= v.w; + + return this; + + }, + + subScalar: function ( s ) { + + this.x -= s; + this.y -= s; + this.z -= s; + this.w -= s; + + return this; + + }, + + subVectors: function ( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + this.z = a.z - b.z; + this.w = a.w - b.w; + + return this; + + }, + + multiplyScalar: function ( scalar ) { + + this.x *= scalar; + this.y *= scalar; + this.z *= scalar; + this.w *= scalar; + + return this; + + }, + + applyMatrix4: function ( m ) { + + var x = this.x, y = this.y, z = this.z, w = this.w; + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w; + this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w; + this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w; + this.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w; + + return this; + + }, + + divideScalar: function ( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + }, + + setAxisAngleFromQuaternion: function ( q ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm + + // q is assumed to be normalized + + this.w = 2 * Math.acos( q.w ); + + var s = Math.sqrt( 1 - q.w * q.w ); + + if ( s < 0.0001 ) { + + this.x = 1; + this.y = 0; + this.z = 0; + + } else { + + this.x = q.x / s; + this.y = q.y / s; + this.z = q.z / s; + + } + + return this; + + }, + + setAxisAngleFromRotationMatrix: function ( m ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var angle, x, y, z, // variables for result + epsilon = 0.01, // margin to allow for rounding errors + epsilon2 = 0.1, // margin to distinguish between 0 and 180 degrees + + te = m.elements, + + m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ], + m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ], + m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ]; + + if ( ( Math.abs( m12 - m21 ) < epsilon ) && + ( Math.abs( m13 - m31 ) < epsilon ) && + ( Math.abs( m23 - m32 ) < epsilon ) ) { + + // singularity found + // first check for identity matrix which must have +1 for all terms + // in leading diagonal and zero in other terms + + if ( ( Math.abs( m12 + m21 ) < epsilon2 ) && + ( Math.abs( m13 + m31 ) < epsilon2 ) && + ( Math.abs( m23 + m32 ) < epsilon2 ) && + ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) { + + // this singularity is identity matrix so angle = 0 + + this.set( 1, 0, 0, 0 ); + + return this; // zero angle, arbitrary axis + + } + + // otherwise this singularity is angle = 180 + + angle = Math.PI; + + var xx = ( m11 + 1 ) / 2; + var yy = ( m22 + 1 ) / 2; + var zz = ( m33 + 1 ) / 2; + var xy = ( m12 + m21 ) / 4; + var xz = ( m13 + m31 ) / 4; + var yz = ( m23 + m32 ) / 4; + + if ( ( xx > yy ) && ( xx > zz ) ) { + + // m11 is the largest diagonal term + + if ( xx < epsilon ) { + + x = 0; + y = 0.707106781; + z = 0.707106781; + + } else { + + x = Math.sqrt( xx ); + y = xy / x; + z = xz / x; + + } + + } else if ( yy > zz ) { + + // m22 is the largest diagonal term + + if ( yy < epsilon ) { + + x = 0.707106781; + y = 0; + z = 0.707106781; + + } else { + + y = Math.sqrt( yy ); + x = xy / y; + z = yz / y; + + } + + } else { + + // m33 is the largest diagonal term so base result on this + + if ( zz < epsilon ) { + + x = 0.707106781; + y = 0.707106781; + z = 0; + + } else { + + z = Math.sqrt( zz ); + x = xz / z; + y = yz / z; + + } + + } + + this.set( x, y, z, angle ); + + return this; // return 180 deg rotation + + } + + // as we have reached here there are no singularities so we can handle normally + + var s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) + + ( m13 - m31 ) * ( m13 - m31 ) + + ( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize + + if ( Math.abs( s ) < 0.001 ) s = 1; + + // prevent divide by zero, should not happen if matrix is orthogonal and should be + // caught by singularity test above, but I've left it in just in case + + this.x = ( m32 - m23 ) / s; + this.y = ( m13 - m31 ) / s; + this.z = ( m21 - m12 ) / s; + this.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 ); + + return this; + + }, + + min: function ( v ) { + + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + this.z = Math.min( this.z, v.z ); + this.w = Math.min( this.w, v.w ); + + return this; + + }, + + max: function ( v ) { + + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + this.z = Math.max( this.z, v.z ); + this.w = Math.max( this.w, v.w ); + + return this; + + }, + + clamp: function ( min, max ) { + + // This function assumes min < max, if this assumption isn't true it will not operate correctly + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + this.z = Math.max( min.z, Math.min( max.z, this.z ) ); + this.w = Math.max( min.w, Math.min( max.w, this.w ) ); + + return this; + + }, + + clampScalar: function () { + + var min = new Vector4(); + var max = new Vector4(); + + return function clampScalar( minVal, maxVal ) { + + min.set( minVal, minVal, minVal, minVal ); + max.set( maxVal, maxVal, maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + }(), + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + this.z = Math.floor( this.z ); + this.w = Math.floor( this.w ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + this.z = Math.ceil( this.z ); + this.w = Math.ceil( this.w ); + + return this; + + }, + + round: function () { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + this.z = Math.round( this.z ); + this.w = Math.round( this.w ); + + return this; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z ); + this.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + this.z = - this.z; + this.w = - this.w; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w; + + }, + + lengthSq: function () { + + return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w ); + + }, + + lengthManhattan: function () { + + return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() ); + + }, + + setLength: function ( length ) { + + return this.multiplyScalar( length / this.length() ); + + }, + + lerp: function ( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + this.z += ( v.z - this.z ) * alpha; + this.w += ( v.w - this.w ) * alpha; + + return this; + + }, + + lerpVectors: function ( v1, v2, alpha ) { + + return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 ); + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + this.z = array[ offset + 2 ]; + this.w = array[ offset + 3 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + array[ offset + 2 ] = this.z; + array[ offset + 3 ] = this.w; + + return array; + + }, + + fromBufferAttribute: function ( attribute, index, offset ) { + + if ( offset !== undefined ) { + + console.warn( 'THREE.Vector4: offset has been removed from .fromBufferAttribute().' ); + + } + + this.x = attribute.getX( index ); + this.y = attribute.getY( index ); + this.z = attribute.getZ( index ); + this.w = attribute.getW( index ); + + return this; + + } + + } ); + + /** + * @author szimek / https://github.com/szimek/ + * @author alteredq / http://alteredqualia.com/ + * @author Marius Kintel / https://github.com/kintel + */ + + /* + In options, we can specify: + * Texture parameters for an auto-generated target texture + * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers + */ + function WebGLRenderTarget( width, height, options ) { + + this.uuid = _Math.generateUUID(); + + this.width = width; + this.height = height; + + this.scissor = new Vector4( 0, 0, width, height ); + this.scissorTest = false; + + this.viewport = new Vector4( 0, 0, width, height ); + + options = options || {}; + + if ( options.minFilter === undefined ) options.minFilter = LinearFilter; + + this.texture = new Texture( undefined, undefined, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding ); + + this.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true; + this.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true; + this.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null; + + } + + Object.assign( WebGLRenderTarget.prototype, EventDispatcher.prototype, { + + isWebGLRenderTarget: true, + + setSize: function ( width, height ) { + + if ( this.width !== width || this.height !== height ) { + + this.width = width; + this.height = height; + + this.dispose(); + + } + + this.viewport.set( 0, 0, width, height ); + this.scissor.set( 0, 0, width, height ); + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.width = source.width; + this.height = source.height; + + this.viewport.copy( source.viewport ); + + this.texture = source.texture.clone(); + + this.depthBuffer = source.depthBuffer; + this.stencilBuffer = source.stencilBuffer; + this.depthTexture = source.depthTexture; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com + */ + + function WebGLRenderTargetCube( width, height, options ) { + + WebGLRenderTarget.call( this, width, height, options ); + + this.activeCubeFace = 0; // PX 0, NX 1, PY 2, NY 3, PZ 4, NZ 5 + this.activeMipMapLevel = 0; + + } + + WebGLRenderTargetCube.prototype = Object.create( WebGLRenderTarget.prototype ); + WebGLRenderTargetCube.prototype.constructor = WebGLRenderTargetCube; + + WebGLRenderTargetCube.prototype.isWebGLRenderTargetCube = true; + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://clara.io + */ + + function Quaternion( x, y, z, w ) { + + this._x = x || 0; + this._y = y || 0; + this._z = z || 0; + this._w = ( w !== undefined ) ? w : 1; + + } + + Object.assign( Quaternion, { + + slerp: function ( qa, qb, qm, t ) { + + return qm.copy( qa ).slerp( qb, t ); + + }, + + slerpFlat: function ( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) { + + // fuzz-free, array-based Quaternion SLERP operation + + var x0 = src0[ srcOffset0 + 0 ], + y0 = src0[ srcOffset0 + 1 ], + z0 = src0[ srcOffset0 + 2 ], + w0 = src0[ srcOffset0 + 3 ], + + x1 = src1[ srcOffset1 + 0 ], + y1 = src1[ srcOffset1 + 1 ], + z1 = src1[ srcOffset1 + 2 ], + w1 = src1[ srcOffset1 + 3 ]; + + if ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) { + + var s = 1 - t, + + cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1, + + dir = ( cos >= 0 ? 1 : - 1 ), + sqrSin = 1 - cos * cos; + + // Skip the Slerp for tiny steps to avoid numeric problems: + if ( sqrSin > Number.EPSILON ) { + + var sin = Math.sqrt( sqrSin ), + len = Math.atan2( sin, cos * dir ); + + s = Math.sin( s * len ) / sin; + t = Math.sin( t * len ) / sin; + + } + + var tDir = t * dir; + + x0 = x0 * s + x1 * tDir; + y0 = y0 * s + y1 * tDir; + z0 = z0 * s + z1 * tDir; + w0 = w0 * s + w1 * tDir; + + // Normalize in case we just did a lerp: + if ( s === 1 - t ) { + + var f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 ); + + x0 *= f; + y0 *= f; + z0 *= f; + w0 *= f; + + } + + } + + dst[ dstOffset ] = x0; + dst[ dstOffset + 1 ] = y0; + dst[ dstOffset + 2 ] = z0; + dst[ dstOffset + 3 ] = w0; + + } + + } ); + + Object.defineProperties( Quaternion.prototype, { + + x: { + + get: function () { + + return this._x; + + }, + + set: function ( value ) { + + this._x = value; + this.onChangeCallback(); + + } + + }, + + y: { + + get: function () { + + return this._y; + + }, + + set: function ( value ) { + + this._y = value; + this.onChangeCallback(); + + } + + }, + + z: { + + get: function () { + + return this._z; + + }, + + set: function ( value ) { + + this._z = value; + this.onChangeCallback(); + + } + + }, + + w: { + + get: function () { + + return this._w; + + }, + + set: function ( value ) { + + this._w = value; + this.onChangeCallback(); + + } + + } + + } ); + + Object.assign( Quaternion.prototype, { + + set: function ( x, y, z, w ) { + + this._x = x; + this._y = y; + this._z = z; + this._w = w; + + this.onChangeCallback(); + + return this; + + }, + + clone: function () { + + return new this.constructor( this._x, this._y, this._z, this._w ); + + }, + + copy: function ( quaternion ) { + + this._x = quaternion.x; + this._y = quaternion.y; + this._z = quaternion.z; + this._w = quaternion.w; + + this.onChangeCallback(); + + return this; + + }, + + setFromEuler: function ( euler, update ) { + + if ( ( euler && euler.isEuler ) === false ) { + + throw new Error( 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' ); + + } + + var x = euler._x, y = euler._y, z = euler._z, order = euler.order; + + // http://www.mathworks.com/matlabcentral/fileexchange/ + // 20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/ + // content/SpinCalc.m + + var cos = Math.cos; + var sin = Math.sin; + + var c1 = cos( x / 2 ); + var c2 = cos( y / 2 ); + var c3 = cos( z / 2 ); + + var s1 = sin( x / 2 ); + var s2 = sin( y / 2 ); + var s3 = sin( z / 2 ); + + if ( order === 'XYZ' ) { + + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + + } else if ( order === 'YXZ' ) { + + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + + } else if ( order === 'ZXY' ) { + + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + + } else if ( order === 'ZYX' ) { + + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + + } else if ( order === 'YZX' ) { + + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + + } else if ( order === 'XZY' ) { + + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + + } + + if ( update !== false ) this.onChangeCallback(); + + return this; + + }, + + setFromAxisAngle: function ( axis, angle ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm + + // assumes axis is normalized + + var halfAngle = angle / 2, s = Math.sin( halfAngle ); + + this._x = axis.x * s; + this._y = axis.y * s; + this._z = axis.z * s; + this._w = Math.cos( halfAngle ); + + this.onChangeCallback(); + + return this; + + }, + + setFromRotationMatrix: function ( m ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var te = m.elements, + + m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ], + m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ], + m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ], + + trace = m11 + m22 + m33, + s; + + if ( trace > 0 ) { + + s = 0.5 / Math.sqrt( trace + 1.0 ); + + this._w = 0.25 / s; + this._x = ( m32 - m23 ) * s; + this._y = ( m13 - m31 ) * s; + this._z = ( m21 - m12 ) * s; + + } else if ( m11 > m22 && m11 > m33 ) { + + s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 ); + + this._w = ( m32 - m23 ) / s; + this._x = 0.25 * s; + this._y = ( m12 + m21 ) / s; + this._z = ( m13 + m31 ) / s; + + } else if ( m22 > m33 ) { + + s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 ); + + this._w = ( m13 - m31 ) / s; + this._x = ( m12 + m21 ) / s; + this._y = 0.25 * s; + this._z = ( m23 + m32 ) / s; + + } else { + + s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 ); + + this._w = ( m21 - m12 ) / s; + this._x = ( m13 + m31 ) / s; + this._y = ( m23 + m32 ) / s; + this._z = 0.25 * s; + + } + + this.onChangeCallback(); + + return this; + + }, + + setFromUnitVectors: function () { + + // assumes direction vectors vFrom and vTo are normalized + + var v1 = new Vector3(); + var r; + + var EPS = 0.000001; + + return function setFromUnitVectors( vFrom, vTo ) { + + if ( v1 === undefined ) v1 = new Vector3(); + + r = vFrom.dot( vTo ) + 1; + + if ( r < EPS ) { + + r = 0; + + if ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) { + + v1.set( - vFrom.y, vFrom.x, 0 ); + + } else { + + v1.set( 0, - vFrom.z, vFrom.y ); + + } + + } else { + + v1.crossVectors( vFrom, vTo ); + + } + + this._x = v1.x; + this._y = v1.y; + this._z = v1.z; + this._w = r; + + return this.normalize(); + + }; + + }(), + + inverse: function () { + + return this.conjugate().normalize(); + + }, + + conjugate: function () { + + this._x *= - 1; + this._y *= - 1; + this._z *= - 1; + + this.onChangeCallback(); + + return this; + + }, + + dot: function ( v ) { + + return this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w; + + }, + + lengthSq: function () { + + return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w; + + }, + + length: function () { + + return Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w ); + + }, + + normalize: function () { + + var l = this.length(); + + if ( l === 0 ) { + + this._x = 0; + this._y = 0; + this._z = 0; + this._w = 1; + + } else { + + l = 1 / l; + + this._x = this._x * l; + this._y = this._y * l; + this._z = this._z * l; + this._w = this._w * l; + + } + + this.onChangeCallback(); + + return this; + + }, + + multiply: function ( q, p ) { + + if ( p !== undefined ) { + + console.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' ); + return this.multiplyQuaternions( q, p ); + + } + + return this.multiplyQuaternions( this, q ); + + }, + + premultiply: function ( q ) { + + return this.multiplyQuaternions( q, this ); + + }, + + multiplyQuaternions: function ( a, b ) { + + // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm + + var qax = a._x, qay = a._y, qaz = a._z, qaw = a._w; + var qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w; + + this._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby; + this._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz; + this._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx; + this._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz; + + this.onChangeCallback(); + + return this; + + }, + + slerp: function ( qb, t ) { + + if ( t === 0 ) return this; + if ( t === 1 ) return this.copy( qb ); + + var x = this._x, y = this._y, z = this._z, w = this._w; + + // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/ + + var cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z; + + if ( cosHalfTheta < 0 ) { + + this._w = - qb._w; + this._x = - qb._x; + this._y = - qb._y; + this._z = - qb._z; + + cosHalfTheta = - cosHalfTheta; + + } else { + + this.copy( qb ); + + } + + if ( cosHalfTheta >= 1.0 ) { + + this._w = w; + this._x = x; + this._y = y; + this._z = z; + + return this; + + } + + var sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta ); + + if ( Math.abs( sinHalfTheta ) < 0.001 ) { + + this._w = 0.5 * ( w + this._w ); + this._x = 0.5 * ( x + this._x ); + this._y = 0.5 * ( y + this._y ); + this._z = 0.5 * ( z + this._z ); + + return this; + + } + + var halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta ); + var ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta, + ratioB = Math.sin( t * halfTheta ) / sinHalfTheta; + + this._w = ( w * ratioA + this._w * ratioB ); + this._x = ( x * ratioA + this._x * ratioB ); + this._y = ( y * ratioA + this._y * ratioB ); + this._z = ( z * ratioA + this._z * ratioB ); + + this.onChangeCallback(); + + return this; + + }, + + equals: function ( quaternion ) { + + return ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this._x = array[ offset ]; + this._y = array[ offset + 1 ]; + this._z = array[ offset + 2 ]; + this._w = array[ offset + 3 ]; + + this.onChangeCallback(); + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this._x; + array[ offset + 1 ] = this._y; + array[ offset + 2 ] = this._z; + array[ offset + 3 ] = this._w; + + return array; + + }, + + onChange: function ( callback ) { + + this.onChangeCallback = callback; + + return this; + + }, + + onChangeCallback: function () {} + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author *kile / http://kile.stravaganza.org/ + * @author philogb / http://blog.thejit.org/ + * @author mikael emtinger / http://gomo.se/ + * @author egraether / http://egraether.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function Vector3( x, y, z ) { + + this.x = x || 0; + this.y = y || 0; + this.z = z || 0; + + } + + Object.assign( Vector3.prototype, { + + isVector3: true, + + set: function ( x, y, z ) { + + this.x = x; + this.y = y; + this.z = z; + + return this; + + }, + + setScalar: function ( scalar ) { + + this.x = scalar; + this.y = scalar; + this.z = scalar; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setZ: function ( z ) { + + this.z = z; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + case 2: this.z = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + return this; + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + case 2: return this.z; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + clone: function () { + + return new this.constructor( this.x, this.y, this.z ); + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + this.z = v.z; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + this.z += v.z; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + this.z += s; + + return this; + + }, + + addVectors: function ( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + this.z = a.z + b.z; + + return this; + + }, + + addScaledVector: function ( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + this.z += v.z * s; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; + + return this; + + }, + + subScalar: function ( s ) { + + this.x -= s; + this.y -= s; + this.z -= s; + + return this; + + }, + + subVectors: function ( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + this.z = a.z - b.z; + + return this; + + }, + + multiply: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' ); + return this.multiplyVectors( v, w ); + + } + + this.x *= v.x; + this.y *= v.y; + this.z *= v.z; + + return this; + + }, + + multiplyScalar: function ( scalar ) { + + this.x *= scalar; + this.y *= scalar; + this.z *= scalar; + + return this; + + }, + + multiplyVectors: function ( a, b ) { + + this.x = a.x * b.x; + this.y = a.y * b.y; + this.z = a.z * b.z; + + return this; + + }, + + applyEuler: function () { + + var quaternion = new Quaternion(); + + return function applyEuler( euler ) { + + if ( ( euler && euler.isEuler ) === false ) { + + console.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' ); + + } + + return this.applyQuaternion( quaternion.setFromEuler( euler ) ); + + }; + + }(), + + applyAxisAngle: function () { + + var quaternion = new Quaternion(); + + return function applyAxisAngle( axis, angle ) { + + return this.applyQuaternion( quaternion.setFromAxisAngle( axis, angle ) ); + + }; + + }(), + + applyMatrix3: function ( m ) { + + var x = this.x, y = this.y, z = this.z; + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z; + this.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z; + this.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z; + + return this; + + }, + + applyMatrix4: function ( m ) { + + var x = this.x, y = this.y, z = this.z; + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ]; + this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ]; + this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ]; + var w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ]; + + return this.divideScalar( w ); + + }, + + applyQuaternion: function ( q ) { + + var x = this.x, y = this.y, z = this.z; + var qx = q.x, qy = q.y, qz = q.z, qw = q.w; + + // calculate quat * vector + + var ix = qw * x + qy * z - qz * y; + var iy = qw * y + qz * x - qx * z; + var iz = qw * z + qx * y - qy * x; + var iw = - qx * x - qy * y - qz * z; + + // calculate result * inverse quat + + this.x = ix * qw + iw * - qx + iy * - qz - iz * - qy; + this.y = iy * qw + iw * - qy + iz * - qx - ix * - qz; + this.z = iz * qw + iw * - qz + ix * - qy - iy * - qx; + + return this; + + }, + + project: function () { + + var matrix = new Matrix4(); + + return function project( camera ) { + + matrix.multiplyMatrices( camera.projectionMatrix, matrix.getInverse( camera.matrixWorld ) ); + return this.applyMatrix4( matrix ); + + }; + + }(), + + unproject: function () { + + var matrix = new Matrix4(); + + return function unproject( camera ) { + + matrix.multiplyMatrices( camera.matrixWorld, matrix.getInverse( camera.projectionMatrix ) ); + return this.applyMatrix4( matrix ); + + }; + + }(), + + transformDirection: function ( m ) { + + // input: THREE.Matrix4 affine matrix + // vector interpreted as a direction + + var x = this.x, y = this.y, z = this.z; + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z; + this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z; + this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z; + + return this.normalize(); + + }, + + divide: function ( v ) { + + this.x /= v.x; + this.y /= v.y; + this.z /= v.z; + + return this; + + }, + + divideScalar: function ( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + }, + + min: function ( v ) { + + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + this.z = Math.min( this.z, v.z ); + + return this; + + }, + + max: function ( v ) { + + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + this.z = Math.max( this.z, v.z ); + + return this; + + }, + + clamp: function ( min, max ) { + + // This function assumes min < max, if this assumption isn't true it will not operate correctly + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + this.z = Math.max( min.z, Math.min( max.z, this.z ) ); + + return this; + + }, + + clampScalar: function () { + + var min = new Vector3(); + var max = new Vector3(); + + return function clampScalar( minVal, maxVal ) { + + min.set( minVal, minVal, minVal ); + max.set( maxVal, maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + }(), + + clampLength: function ( min, max ) { + + var length = this.length(); + + return this.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length ); + + }, + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + this.z = Math.floor( this.z ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + this.z = Math.ceil( this.z ); + + return this; + + }, + + round: function () { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + this.z = Math.round( this.z ); + + return this; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + this.z = - this.z; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y + this.z * v.z; + + }, + + // TODO lengthSquared? + + lengthSq: function () { + + return this.x * this.x + this.y * this.y + this.z * this.z; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z ); + + }, + + lengthManhattan: function () { + + return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() ); + + }, + + setLength: function ( length ) { + + return this.multiplyScalar( length / this.length() ); + + }, + + lerp: function ( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + this.z += ( v.z - this.z ) * alpha; + + return this; + + }, + + lerpVectors: function ( v1, v2, alpha ) { + + return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 ); + + }, + + cross: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' ); + return this.crossVectors( v, w ); + + } + + var x = this.x, y = this.y, z = this.z; + + this.x = y * v.z - z * v.y; + this.y = z * v.x - x * v.z; + this.z = x * v.y - y * v.x; + + return this; + + }, + + crossVectors: function ( a, b ) { + + var ax = a.x, ay = a.y, az = a.z; + var bx = b.x, by = b.y, bz = b.z; + + this.x = ay * bz - az * by; + this.y = az * bx - ax * bz; + this.z = ax * by - ay * bx; + + return this; + + }, + + projectOnVector: function ( vector ) { + + var scalar = vector.dot( this ) / vector.lengthSq(); + + return this.copy( vector ).multiplyScalar( scalar ); + + }, + + projectOnPlane: function () { + + var v1 = new Vector3(); + + return function projectOnPlane( planeNormal ) { + + v1.copy( this ).projectOnVector( planeNormal ); + + return this.sub( v1 ); + + }; + + }(), + + reflect: function () { + + // reflect incident vector off plane orthogonal to normal + // normal is assumed to have unit length + + var v1 = new Vector3(); + + return function reflect( normal ) { + + return this.sub( v1.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) ); + + }; + + }(), + + angleTo: function ( v ) { + + var theta = this.dot( v ) / ( Math.sqrt( this.lengthSq() * v.lengthSq() ) ); + + // clamp, to handle numerical problems + + return Math.acos( _Math.clamp( theta, - 1, 1 ) ); + + }, + + distanceTo: function ( v ) { + + return Math.sqrt( this.distanceToSquared( v ) ); + + }, + + distanceToSquared: function ( v ) { + + var dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z; + + return dx * dx + dy * dy + dz * dz; + + }, + + distanceToManhattan: function ( v ) { + + return Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z ); + + }, + + setFromSpherical: function ( s ) { + + var sinPhiRadius = Math.sin( s.phi ) * s.radius; + + this.x = sinPhiRadius * Math.sin( s.theta ); + this.y = Math.cos( s.phi ) * s.radius; + this.z = sinPhiRadius * Math.cos( s.theta ); + + return this; + + }, + + setFromCylindrical: function ( c ) { + + this.x = c.radius * Math.sin( c.theta ); + this.y = c.y; + this.z = c.radius * Math.cos( c.theta ); + + return this; + + }, + + setFromMatrixPosition: function ( m ) { + + return this.setFromMatrixColumn( m, 3 ); + + }, + + setFromMatrixScale: function ( m ) { + + var sx = this.setFromMatrixColumn( m, 0 ).length(); + var sy = this.setFromMatrixColumn( m, 1 ).length(); + var sz = this.setFromMatrixColumn( m, 2 ).length(); + + this.x = sx; + this.y = sy; + this.z = sz; + + return this; + + }, + + setFromMatrixColumn: function ( m, index ) { + + + return this.fromArray( m.elements, index * 4 ); + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + this.z = array[ offset + 2 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + array[ offset + 2 ] = this.z; + + return array; + + }, + + fromBufferAttribute: function ( attribute, index, offset ) { + + if ( offset !== undefined ) { + + console.warn( 'THREE.Vector3: offset has been removed from .fromBufferAttribute().' ); + + } + + this.x = attribute.getX( index ); + this.y = attribute.getY( index ); + this.z = attribute.getZ( index ); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author philogb / http://blog.thejit.org/ + * @author jordi_ros / http://plattsoft.com + * @author D1plo1d / http://github.com/D1plo1d + * @author alteredq / http://alteredqualia.com/ + * @author mikael emtinger / http://gomo.se/ + * @author timknip / http://www.floorplanner.com/ + * @author bhouston / http://clara.io + * @author WestLangley / http://github.com/WestLangley + */ + + function Matrix4() { + + this.elements = [ + + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ]; + + if ( arguments.length > 0 ) { + + console.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' ); + + } + + } + + Object.assign( Matrix4.prototype, { + + isMatrix4: true, + + set: function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) { + + var te = this.elements; + + te[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14; + te[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24; + te[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34; + te[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44; + + return this; + + }, + + identity: function () { + + this.set( + + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + clone: function () { + + return new Matrix4().fromArray( this.elements ); + + }, + + copy: function ( m ) { + + var te = this.elements; + var me = m.elements; + + te[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; te[ 3 ] = me[ 3 ]; + te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; + te[ 8 ] = me[ 8 ]; te[ 9 ] = me[ 9 ]; te[ 10 ] = me[ 10 ]; te[ 11 ] = me[ 11 ]; + te[ 12 ] = me[ 12 ]; te[ 13 ] = me[ 13 ]; te[ 14 ] = me[ 14 ]; te[ 15 ] = me[ 15 ]; + + return this; + + }, + + copyPosition: function ( m ) { + + var te = this.elements, me = m.elements; + + te[ 12 ] = me[ 12 ]; + te[ 13 ] = me[ 13 ]; + te[ 14 ] = me[ 14 ]; + + return this; + + }, + + extractBasis: function ( xAxis, yAxis, zAxis ) { + + xAxis.setFromMatrixColumn( this, 0 ); + yAxis.setFromMatrixColumn( this, 1 ); + zAxis.setFromMatrixColumn( this, 2 ); + + return this; + + }, + + makeBasis: function ( xAxis, yAxis, zAxis ) { + + this.set( + xAxis.x, yAxis.x, zAxis.x, 0, + xAxis.y, yAxis.y, zAxis.y, 0, + xAxis.z, yAxis.z, zAxis.z, 0, + 0, 0, 0, 1 + ); + + return this; + + }, + + extractRotation: function () { + + var v1 = new Vector3(); + + return function extractRotation( m ) { + + var te = this.elements; + var me = m.elements; + + var scaleX = 1 / v1.setFromMatrixColumn( m, 0 ).length(); + var scaleY = 1 / v1.setFromMatrixColumn( m, 1 ).length(); + var scaleZ = 1 / v1.setFromMatrixColumn( m, 2 ).length(); + + te[ 0 ] = me[ 0 ] * scaleX; + te[ 1 ] = me[ 1 ] * scaleX; + te[ 2 ] = me[ 2 ] * scaleX; + + te[ 4 ] = me[ 4 ] * scaleY; + te[ 5 ] = me[ 5 ] * scaleY; + te[ 6 ] = me[ 6 ] * scaleY; + + te[ 8 ] = me[ 8 ] * scaleZ; + te[ 9 ] = me[ 9 ] * scaleZ; + te[ 10 ] = me[ 10 ] * scaleZ; + + return this; + + }; + + }(), + + makeRotationFromEuler: function ( euler ) { + + if ( ( euler && euler.isEuler ) === false ) { + + console.error( 'THREE.Matrix: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' ); + + } + + var te = this.elements; + + var x = euler.x, y = euler.y, z = euler.z; + var a = Math.cos( x ), b = Math.sin( x ); + var c = Math.cos( y ), d = Math.sin( y ); + var e = Math.cos( z ), f = Math.sin( z ); + + if ( euler.order === 'XYZ' ) { + + var ae = a * e, af = a * f, be = b * e, bf = b * f; + + te[ 0 ] = c * e; + te[ 4 ] = - c * f; + te[ 8 ] = d; + + te[ 1 ] = af + be * d; + te[ 5 ] = ae - bf * d; + te[ 9 ] = - b * c; + + te[ 2 ] = bf - ae * d; + te[ 6 ] = be + af * d; + te[ 10 ] = a * c; + + } else if ( euler.order === 'YXZ' ) { + + var ce = c * e, cf = c * f, de = d * e, df = d * f; + + te[ 0 ] = ce + df * b; + te[ 4 ] = de * b - cf; + te[ 8 ] = a * d; + + te[ 1 ] = a * f; + te[ 5 ] = a * e; + te[ 9 ] = - b; + + te[ 2 ] = cf * b - de; + te[ 6 ] = df + ce * b; + te[ 10 ] = a * c; + + } else if ( euler.order === 'ZXY' ) { + + var ce = c * e, cf = c * f, de = d * e, df = d * f; + + te[ 0 ] = ce - df * b; + te[ 4 ] = - a * f; + te[ 8 ] = de + cf * b; + + te[ 1 ] = cf + de * b; + te[ 5 ] = a * e; + te[ 9 ] = df - ce * b; + + te[ 2 ] = - a * d; + te[ 6 ] = b; + te[ 10 ] = a * c; + + } else if ( euler.order === 'ZYX' ) { + + var ae = a * e, af = a * f, be = b * e, bf = b * f; + + te[ 0 ] = c * e; + te[ 4 ] = be * d - af; + te[ 8 ] = ae * d + bf; + + te[ 1 ] = c * f; + te[ 5 ] = bf * d + ae; + te[ 9 ] = af * d - be; + + te[ 2 ] = - d; + te[ 6 ] = b * c; + te[ 10 ] = a * c; + + } else if ( euler.order === 'YZX' ) { + + var ac = a * c, ad = a * d, bc = b * c, bd = b * d; + + te[ 0 ] = c * e; + te[ 4 ] = bd - ac * f; + te[ 8 ] = bc * f + ad; + + te[ 1 ] = f; + te[ 5 ] = a * e; + te[ 9 ] = - b * e; + + te[ 2 ] = - d * e; + te[ 6 ] = ad * f + bc; + te[ 10 ] = ac - bd * f; + + } else if ( euler.order === 'XZY' ) { + + var ac = a * c, ad = a * d, bc = b * c, bd = b * d; + + te[ 0 ] = c * e; + te[ 4 ] = - f; + te[ 8 ] = d * e; + + te[ 1 ] = ac * f + bd; + te[ 5 ] = a * e; + te[ 9 ] = ad * f - bc; + + te[ 2 ] = bc * f - ad; + te[ 6 ] = b * e; + te[ 10 ] = bd * f + ac; + + } + + // last column + te[ 3 ] = 0; + te[ 7 ] = 0; + te[ 11 ] = 0; + + // bottom row + te[ 12 ] = 0; + te[ 13 ] = 0; + te[ 14 ] = 0; + te[ 15 ] = 1; + + return this; + + }, + + makeRotationFromQuaternion: function ( q ) { + + var te = this.elements; + + var x = q._x, y = q._y, z = q._z, w = q._w; + var x2 = x + x, y2 = y + y, z2 = z + z; + var xx = x * x2, xy = x * y2, xz = x * z2; + var yy = y * y2, yz = y * z2, zz = z * z2; + var wx = w * x2, wy = w * y2, wz = w * z2; + + te[ 0 ] = 1 - ( yy + zz ); + te[ 4 ] = xy - wz; + te[ 8 ] = xz + wy; + + te[ 1 ] = xy + wz; + te[ 5 ] = 1 - ( xx + zz ); + te[ 9 ] = yz - wx; + + te[ 2 ] = xz - wy; + te[ 6 ] = yz + wx; + te[ 10 ] = 1 - ( xx + yy ); + + // last column + te[ 3 ] = 0; + te[ 7 ] = 0; + te[ 11 ] = 0; + + // bottom row + te[ 12 ] = 0; + te[ 13 ] = 0; + te[ 14 ] = 0; + te[ 15 ] = 1; + + return this; + + }, + + lookAt: function () { + + var x = new Vector3(); + var y = new Vector3(); + var z = new Vector3(); + + return function lookAt( eye, target, up ) { + + var te = this.elements; + + z.subVectors( eye, target ); + + if ( z.lengthSq() === 0 ) { + + // eye and target are in the same position + + z.z = 1; + + } + + z.normalize(); + x.crossVectors( up, z ); + + if ( x.lengthSq() === 0 ) { + + // eye and target are in the same vertical + + z.z += 0.0001; + x.crossVectors( up, z ); + + } + + x.normalize(); + y.crossVectors( z, x ); + + te[ 0 ] = x.x; te[ 4 ] = y.x; te[ 8 ] = z.x; + te[ 1 ] = x.y; te[ 5 ] = y.y; te[ 9 ] = z.y; + te[ 2 ] = x.z; te[ 6 ] = y.z; te[ 10 ] = z.z; + + return this; + + }; + + }(), + + multiply: function ( m, n ) { + + if ( n !== undefined ) { + + console.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' ); + return this.multiplyMatrices( m, n ); + + } + + return this.multiplyMatrices( this, m ); + + }, + + premultiply: function ( m ) { + + return this.multiplyMatrices( m, this ); + + }, + + multiplyMatrices: function ( a, b ) { + + var ae = a.elements; + var be = b.elements; + var te = this.elements; + + var a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ]; + var a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ]; + var a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ]; + var a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ]; + + var b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ]; + var b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ]; + var b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ]; + var b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ]; + + te[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41; + te[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42; + te[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43; + te[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44; + + te[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41; + te[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42; + te[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43; + te[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44; + + te[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41; + te[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42; + te[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43; + te[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44; + + te[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41; + te[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42; + te[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43; + te[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44; + + return this; + + }, + + multiplyScalar: function ( s ) { + + var te = this.elements; + + te[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s; + te[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s; + te[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s; + te[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s; + + return this; + + }, + + applyToBufferAttribute: function () { + + var v1 = new Vector3(); + + return function applyToBufferAttribute( attribute ) { + + for ( var i = 0, l = attribute.count; i < l; i ++ ) { + + v1.x = attribute.getX( i ); + v1.y = attribute.getY( i ); + v1.z = attribute.getZ( i ); + + v1.applyMatrix4( this ); + + attribute.setXYZ( i, v1.x, v1.y, v1.z ); + + } + + return attribute; + + }; + + }(), + + determinant: function () { + + var te = this.elements; + + var n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ]; + var n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ]; + var n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ]; + var n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ]; + + //TODO: make this more efficient + //( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm ) + + return ( + n41 * ( + + n14 * n23 * n32 + - n13 * n24 * n32 + - n14 * n22 * n33 + + n12 * n24 * n33 + + n13 * n22 * n34 + - n12 * n23 * n34 + ) + + n42 * ( + + n11 * n23 * n34 + - n11 * n24 * n33 + + n14 * n21 * n33 + - n13 * n21 * n34 + + n13 * n24 * n31 + - n14 * n23 * n31 + ) + + n43 * ( + + n11 * n24 * n32 + - n11 * n22 * n34 + - n14 * n21 * n32 + + n12 * n21 * n34 + + n14 * n22 * n31 + - n12 * n24 * n31 + ) + + n44 * ( + - n13 * n22 * n31 + - n11 * n23 * n32 + + n11 * n22 * n33 + + n13 * n21 * n32 + - n12 * n21 * n33 + + n12 * n23 * n31 + ) + + ); + + }, + + transpose: function () { + + var te = this.elements; + var tmp; + + tmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp; + tmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp; + tmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp; + + tmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp; + tmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp; + tmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp; + + return this; + + }, + + setPosition: function ( v ) { + + var te = this.elements; + + te[ 12 ] = v.x; + te[ 13 ] = v.y; + te[ 14 ] = v.z; + + return this; + + }, + + getInverse: function ( m, throwOnDegenerate ) { + + // based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm + var te = this.elements, + me = m.elements, + + n11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], n41 = me[ 3 ], + n12 = me[ 4 ], n22 = me[ 5 ], n32 = me[ 6 ], n42 = me[ 7 ], + n13 = me[ 8 ], n23 = me[ 9 ], n33 = me[ 10 ], n43 = me[ 11 ], + n14 = me[ 12 ], n24 = me[ 13 ], n34 = me[ 14 ], n44 = me[ 15 ], + + t11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44, + t12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44, + t13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44, + t14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34; + + var det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14; + + if ( det === 0 ) { + + var msg = "THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0"; + + if ( throwOnDegenerate === true ) { + + throw new Error( msg ); + + } else { + + console.warn( msg ); + + } + + return this.identity(); + + } + + var detInv = 1 / det; + + te[ 0 ] = t11 * detInv; + te[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv; + te[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv; + te[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv; + + te[ 4 ] = t12 * detInv; + te[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv; + te[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv; + te[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv; + + te[ 8 ] = t13 * detInv; + te[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv; + te[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv; + te[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv; + + te[ 12 ] = t14 * detInv; + te[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv; + te[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv; + te[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv; + + return this; + + }, + + scale: function ( v ) { + + var te = this.elements; + var x = v.x, y = v.y, z = v.z; + + te[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z; + te[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z; + te[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z; + te[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z; + + return this; + + }, + + getMaxScaleOnAxis: function () { + + var te = this.elements; + + var scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ]; + var scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ]; + var scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ]; + + return Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) ); + + }, + + makeTranslation: function ( x, y, z ) { + + this.set( + + 1, 0, 0, x, + 0, 1, 0, y, + 0, 0, 1, z, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationX: function ( theta ) { + + var c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + 1, 0, 0, 0, + 0, c, - s, 0, + 0, s, c, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationY: function ( theta ) { + + var c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationZ: function ( theta ) { + + var c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + c, - s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationAxis: function ( axis, angle ) { + + // Based on http://www.gamedev.net/reference/articles/article1199.asp + + var c = Math.cos( angle ); + var s = Math.sin( angle ); + var t = 1 - c; + var x = axis.x, y = axis.y, z = axis.z; + var tx = t * x, ty = t * y; + + this.set( + + tx * x + c, tx * y - s * z, tx * z + s * y, 0, + tx * y + s * z, ty * y + c, ty * z - s * x, 0, + tx * z - s * y, ty * z + s * x, t * z * z + c, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeScale: function ( x, y, z ) { + + this.set( + + x, 0, 0, 0, + 0, y, 0, 0, + 0, 0, z, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeShear: function ( x, y, z ) { + + this.set( + + 1, y, z, 0, + x, 1, z, 0, + x, y, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + compose: function ( position, quaternion, scale ) { + + this.makeRotationFromQuaternion( quaternion ); + this.scale( scale ); + this.setPosition( position ); + + return this; + + }, + + decompose: function () { + + var vector = new Vector3(); + var matrix = new Matrix4(); + + return function decompose( position, quaternion, scale ) { + + var te = this.elements; + + var sx = vector.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length(); + var sy = vector.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length(); + var sz = vector.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length(); + + // if determine is negative, we need to invert one scale + var det = this.determinant(); + if ( det < 0 ) sx = - sx; + + position.x = te[ 12 ]; + position.y = te[ 13 ]; + position.z = te[ 14 ]; + + // scale the rotation part + matrix.copy( this ); + + var invSX = 1 / sx; + var invSY = 1 / sy; + var invSZ = 1 / sz; + + matrix.elements[ 0 ] *= invSX; + matrix.elements[ 1 ] *= invSX; + matrix.elements[ 2 ] *= invSX; + + matrix.elements[ 4 ] *= invSY; + matrix.elements[ 5 ] *= invSY; + matrix.elements[ 6 ] *= invSY; + + matrix.elements[ 8 ] *= invSZ; + matrix.elements[ 9 ] *= invSZ; + matrix.elements[ 10 ] *= invSZ; + + quaternion.setFromRotationMatrix( matrix ); + + scale.x = sx; + scale.y = sy; + scale.z = sz; + + return this; + + }; + + }(), + + makePerspective: function ( left, right, top, bottom, near, far ) { + + if ( far === undefined ) { + + console.warn( 'THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.' ); + + } + + var te = this.elements; + var x = 2 * near / ( right - left ); + var y = 2 * near / ( top - bottom ); + + var a = ( right + left ) / ( right - left ); + var b = ( top + bottom ) / ( top - bottom ); + var c = - ( far + near ) / ( far - near ); + var d = - 2 * far * near / ( far - near ); + + te[ 0 ] = x; te[ 4 ] = 0; te[ 8 ] = a; te[ 12 ] = 0; + te[ 1 ] = 0; te[ 5 ] = y; te[ 9 ] = b; te[ 13 ] = 0; + te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = c; te[ 14 ] = d; + te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = - 1; te[ 15 ] = 0; + + return this; + + }, + + makeOrthographic: function ( left, right, top, bottom, near, far ) { + + var te = this.elements; + var w = 1.0 / ( right - left ); + var h = 1.0 / ( top - bottom ); + var p = 1.0 / ( far - near ); + + var x = ( right + left ) * w; + var y = ( top + bottom ) * h; + var z = ( far + near ) * p; + + te[ 0 ] = 2 * w; te[ 4 ] = 0; te[ 8 ] = 0; te[ 12 ] = - x; + te[ 1 ] = 0; te[ 5 ] = 2 * h; te[ 9 ] = 0; te[ 13 ] = - y; + te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = - 2 * p; te[ 14 ] = - z; + te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = 0; te[ 15 ] = 1; + + return this; + + }, + + equals: function ( matrix ) { + + var te = this.elements; + var me = matrix.elements; + + for ( var i = 0; i < 16; i ++ ) { + + if ( te[ i ] !== me[ i ] ) return false; + + } + + return true; + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + for ( var i = 0; i < 16; i ++ ) { + + this.elements[ i ] = array[ i + offset ]; + + } + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + var te = this.elements; + + array[ offset ] = te[ 0 ]; + array[ offset + 1 ] = te[ 1 ]; + array[ offset + 2 ] = te[ 2 ]; + array[ offset + 3 ] = te[ 3 ]; + + array[ offset + 4 ] = te[ 4 ]; + array[ offset + 5 ] = te[ 5 ]; + array[ offset + 6 ] = te[ 6 ]; + array[ offset + 7 ] = te[ 7 ]; + + array[ offset + 8 ] = te[ 8 ]; + array[ offset + 9 ] = te[ 9 ]; + array[ offset + 10 ] = te[ 10 ]; + array[ offset + 11 ] = te[ 11 ]; + + array[ offset + 12 ] = te[ 12 ]; + array[ offset + 13 ] = te[ 13 ]; + array[ offset + 14 ] = te[ 14 ]; + array[ offset + 15 ] = te[ 15 ]; + + return array; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function DataTexture( data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) { + + Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); + + this.image = { data: data, width: width, height: height }; + + this.magFilter = magFilter !== undefined ? magFilter : NearestFilter; + this.minFilter = minFilter !== undefined ? minFilter : NearestFilter; + + this.generateMipmaps = false; + this.flipY = false; + this.unpackAlignment = 1; + + } + + DataTexture.prototype = Object.create( Texture.prototype ); + DataTexture.prototype.constructor = DataTexture; + + DataTexture.prototype.isDataTexture = true; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function CubeTexture( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) { + + images = images !== undefined ? images : []; + mapping = mapping !== undefined ? mapping : CubeReflectionMapping; + + Texture.call( this, images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); + + this.flipY = false; + + } + + CubeTexture.prototype = Object.create( Texture.prototype ); + CubeTexture.prototype.constructor = CubeTexture; + + CubeTexture.prototype.isCubeTexture = true; + + Object.defineProperty( CubeTexture.prototype, 'images', { + + get: function () { + + return this.image; + + }, + + set: function ( value ) { + + this.image = value; + + } + + } ); + + /** + * @author tschw + * + * Uniforms of a program. + * Those form a tree structure with a special top-level container for the root, + * which you get by calling 'new WebGLUniforms( gl, program, renderer )'. + * + * + * Properties of inner nodes including the top-level container: + * + * .seq - array of nested uniforms + * .map - nested uniforms by name + * + * + * Methods of all nodes except the top-level container: + * + * .setValue( gl, value, [renderer] ) + * + * uploads a uniform value(s) + * the 'renderer' parameter is needed for sampler uniforms + * + * + * Static methods of the top-level container (renderer factorizations): + * + * .upload( gl, seq, values, renderer ) + * + * sets uniforms in 'seq' to 'values[id].value' + * + * .seqWithValue( seq, values ) : filteredSeq + * + * filters 'seq' entries with corresponding entry in values + * + * + * Methods of the top-level container (renderer factorizations): + * + * .setValue( gl, name, value ) + * + * sets uniform with name 'name' to 'value' + * + * .set( gl, obj, prop ) + * + * sets uniform from object and property with same name than uniform + * + * .setOptional( gl, obj, prop ) + * + * like .set for an optional property of the object + * + */ + + var emptyTexture = new Texture(); + var emptyCubeTexture = new CubeTexture(); + + // --- Base for inner nodes (including the root) --- + + function UniformContainer() { + + this.seq = []; + this.map = {}; + + } + + // --- Utilities --- + + // Array Caches (provide typed arrays for temporary by size) + + var arrayCacheF32 = []; + var arrayCacheI32 = []; + + // Float32Array caches used for uploading Matrix uniforms + + var mat4array = new Float32Array( 16 ); + var mat3array = new Float32Array( 9 ); + + // Flattening for arrays of vectors and matrices + + function flatten( array, nBlocks, blockSize ) { + + var firstElem = array[ 0 ]; + + if ( firstElem <= 0 || firstElem > 0 ) return array; + // unoptimized: ! isNaN( firstElem ) + // see http://jacksondunstan.com/articles/983 + + var n = nBlocks * blockSize, + r = arrayCacheF32[ n ]; + + if ( r === undefined ) { + + r = new Float32Array( n ); + arrayCacheF32[ n ] = r; + + } + + if ( nBlocks !== 0 ) { + + firstElem.toArray( r, 0 ); + + for ( var i = 1, offset = 0; i !== nBlocks; ++ i ) { + + offset += blockSize; + array[ i ].toArray( r, offset ); + + } + + } + + return r; + + } + + // Texture unit allocation + + function allocTexUnits( renderer, n ) { + + var r = arrayCacheI32[ n ]; + + if ( r === undefined ) { + + r = new Int32Array( n ); + arrayCacheI32[ n ] = r; + + } + + for ( var i = 0; i !== n; ++ i ) + r[ i ] = renderer.allocTextureUnit(); + + return r; + + } + + // --- Setters --- + + // Note: Defining these methods externally, because they come in a bunch + // and this way their names minify. + + // Single scalar + + function setValue1f( gl, v ) { gl.uniform1f( this.addr, v ); } + function setValue1i( gl, v ) { gl.uniform1i( this.addr, v ); } + + // Single float vector (from flat array or THREE.VectorN) + + function setValue2fv( gl, v ) { + + if ( v.x === undefined ) gl.uniform2fv( this.addr, v ); + else gl.uniform2f( this.addr, v.x, v.y ); + + } + + function setValue3fv( gl, v ) { + + if ( v.x !== undefined ) + gl.uniform3f( this.addr, v.x, v.y, v.z ); + else if ( v.r !== undefined ) + gl.uniform3f( this.addr, v.r, v.g, v.b ); + else + gl.uniform3fv( this.addr, v ); + + } + + function setValue4fv( gl, v ) { + + if ( v.x === undefined ) gl.uniform4fv( this.addr, v ); + else gl.uniform4f( this.addr, v.x, v.y, v.z, v.w ); + + } + + // Single matrix (from flat array or MatrixN) + + function setValue2fm( gl, v ) { + + gl.uniformMatrix2fv( this.addr, false, v.elements || v ); + + } + + function setValue3fm( gl, v ) { + + if ( v.elements === undefined ) { + + gl.uniformMatrix3fv( this.addr, false, v ); + + } else { + + mat3array.set( v.elements ); + gl.uniformMatrix3fv( this.addr, false, mat3array ); + + } + + } + + function setValue4fm( gl, v ) { + + if ( v.elements === undefined ) { + + gl.uniformMatrix4fv( this.addr, false, v ); + + } else { + + mat4array.set( v.elements ); + gl.uniformMatrix4fv( this.addr, false, mat4array ); + + } + + } + + // Single texture (2D / Cube) + + function setValueT1( gl, v, renderer ) { + + var unit = renderer.allocTextureUnit(); + gl.uniform1i( this.addr, unit ); + renderer.setTexture2D( v || emptyTexture, unit ); + + } + + function setValueT6( gl, v, renderer ) { + + var unit = renderer.allocTextureUnit(); + gl.uniform1i( this.addr, unit ); + renderer.setTextureCube( v || emptyCubeTexture, unit ); + + } + + // Integer / Boolean vectors or arrays thereof (always flat arrays) + + function setValue2iv( gl, v ) { gl.uniform2iv( this.addr, v ); } + function setValue3iv( gl, v ) { gl.uniform3iv( this.addr, v ); } + function setValue4iv( gl, v ) { gl.uniform4iv( this.addr, v ); } + + // Helper to pick the right setter for the singular case + + function getSingularSetter( type ) { + + switch ( type ) { + + case 0x1406: return setValue1f; // FLOAT + case 0x8b50: return setValue2fv; // _VEC2 + case 0x8b51: return setValue3fv; // _VEC3 + case 0x8b52: return setValue4fv; // _VEC4 + + case 0x8b5a: return setValue2fm; // _MAT2 + case 0x8b5b: return setValue3fm; // _MAT3 + case 0x8b5c: return setValue4fm; // _MAT4 + + case 0x8b5e: return setValueT1; // SAMPLER_2D + case 0x8b60: return setValueT6; // SAMPLER_CUBE + + case 0x1404: case 0x8b56: return setValue1i; // INT, BOOL + case 0x8b53: case 0x8b57: return setValue2iv; // _VEC2 + case 0x8b54: case 0x8b58: return setValue3iv; // _VEC3 + case 0x8b55: case 0x8b59: return setValue4iv; // _VEC4 + + } + + } + + // Array of scalars + + function setValue1fv( gl, v ) { gl.uniform1fv( this.addr, v ); } + function setValue1iv( gl, v ) { gl.uniform1iv( this.addr, v ); } + + // Array of vectors (flat or from THREE classes) + + function setValueV2a( gl, v ) { + + gl.uniform2fv( this.addr, flatten( v, this.size, 2 ) ); + + } + + function setValueV3a( gl, v ) { + + gl.uniform3fv( this.addr, flatten( v, this.size, 3 ) ); + + } + + function setValueV4a( gl, v ) { + + gl.uniform4fv( this.addr, flatten( v, this.size, 4 ) ); + + } + + // Array of matrices (flat or from THREE clases) + + function setValueM2a( gl, v ) { + + gl.uniformMatrix2fv( this.addr, false, flatten( v, this.size, 4 ) ); + + } + + function setValueM3a( gl, v ) { + + gl.uniformMatrix3fv( this.addr, false, flatten( v, this.size, 9 ) ); + + } + + function setValueM4a( gl, v ) { + + gl.uniformMatrix4fv( this.addr, false, flatten( v, this.size, 16 ) ); + + } + + // Array of textures (2D / Cube) + + function setValueT1a( gl, v, renderer ) { + + var n = v.length, + units = allocTexUnits( renderer, n ); + + gl.uniform1iv( this.addr, units ); + + for ( var i = 0; i !== n; ++ i ) { + + renderer.setTexture2D( v[ i ] || emptyTexture, units[ i ] ); + + } + + } + + function setValueT6a( gl, v, renderer ) { + + var n = v.length, + units = allocTexUnits( renderer, n ); + + gl.uniform1iv( this.addr, units ); + + for ( var i = 0; i !== n; ++ i ) { + + renderer.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] ); + + } + + } + + // Helper to pick the right setter for a pure (bottom-level) array + + function getPureArraySetter( type ) { + + switch ( type ) { + + case 0x1406: return setValue1fv; // FLOAT + case 0x8b50: return setValueV2a; // _VEC2 + case 0x8b51: return setValueV3a; // _VEC3 + case 0x8b52: return setValueV4a; // _VEC4 + + case 0x8b5a: return setValueM2a; // _MAT2 + case 0x8b5b: return setValueM3a; // _MAT3 + case 0x8b5c: return setValueM4a; // _MAT4 + + case 0x8b5e: return setValueT1a; // SAMPLER_2D + case 0x8b60: return setValueT6a; // SAMPLER_CUBE + + case 0x1404: case 0x8b56: return setValue1iv; // INT, BOOL + case 0x8b53: case 0x8b57: return setValue2iv; // _VEC2 + case 0x8b54: case 0x8b58: return setValue3iv; // _VEC3 + case 0x8b55: case 0x8b59: return setValue4iv; // _VEC4 + + } + + } + + // --- Uniform Classes --- + + function SingleUniform( id, activeInfo, addr ) { + + this.id = id; + this.addr = addr; + this.setValue = getSingularSetter( activeInfo.type ); + + // this.path = activeInfo.name; // DEBUG + + } + + function PureArrayUniform( id, activeInfo, addr ) { + + this.id = id; + this.addr = addr; + this.size = activeInfo.size; + this.setValue = getPureArraySetter( activeInfo.type ); + + // this.path = activeInfo.name; // DEBUG + + } + + function StructuredUniform( id ) { + + this.id = id; + + UniformContainer.call( this ); // mix-in + + } + + StructuredUniform.prototype.setValue = function ( gl, value ) { + + // Note: Don't need an extra 'renderer' parameter, since samplers + // are not allowed in structured uniforms. + + var seq = this.seq; + + for ( var i = 0, n = seq.length; i !== n; ++ i ) { + + var u = seq[ i ]; + u.setValue( gl, value[ u.id ] ); + + } + + }; + + // --- Top-level --- + + // Parser - builds up the property tree from the path strings + + var RePathPart = /([\w\d_]+)(\])?(\[|\.)?/g; + + // extracts + // - the identifier (member name or array index) + // - followed by an optional right bracket (found when array index) + // - followed by an optional left bracket or dot (type of subscript) + // + // Note: These portions can be read in a non-overlapping fashion and + // allow straightforward parsing of the hierarchy that WebGL encodes + // in the uniform names. + + function addUniform( container, uniformObject ) { + + container.seq.push( uniformObject ); + container.map[ uniformObject.id ] = uniformObject; + + } + + function parseUniform( activeInfo, addr, container ) { + + var path = activeInfo.name, + pathLength = path.length; + + // reset RegExp object, because of the early exit of a previous run + RePathPart.lastIndex = 0; + + for ( ; ; ) { + + var match = RePathPart.exec( path ), + matchEnd = RePathPart.lastIndex, + + id = match[ 1 ], + idIsIndex = match[ 2 ] === ']', + subscript = match[ 3 ]; + + if ( idIsIndex ) id = id | 0; // convert to integer + + if ( subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength ) { + + // bare name or "pure" bottom-level array "[0]" suffix + + addUniform( container, subscript === undefined ? + new SingleUniform( id, activeInfo, addr ) : + new PureArrayUniform( id, activeInfo, addr ) ); + + break; + + } else { + + // step into inner node / create it in case it doesn't exist + + var map = container.map, next = map[ id ]; + + if ( next === undefined ) { + + next = new StructuredUniform( id ); + addUniform( container, next ); + + } + + container = next; + + } + + } + + } + + // Root Container + + function WebGLUniforms( gl, program, renderer ) { + + UniformContainer.call( this ); + + this.renderer = renderer; + + var n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS ); + + for ( var i = 0; i < n; ++ i ) { + + var info = gl.getActiveUniform( program, i ), + path = info.name, + addr = gl.getUniformLocation( program, path ); + + parseUniform( info, addr, this ); + + } + + } + + WebGLUniforms.prototype.setValue = function ( gl, name, value ) { + + var u = this.map[ name ]; + + if ( u !== undefined ) u.setValue( gl, value, this.renderer ); + + }; + + WebGLUniforms.prototype.setOptional = function ( gl, object, name ) { + + var v = object[ name ]; + + if ( v !== undefined ) this.setValue( gl, name, v ); + + }; + + + // Static interface + + WebGLUniforms.upload = function ( gl, seq, values, renderer ) { + + for ( var i = 0, n = seq.length; i !== n; ++ i ) { + + var u = seq[ i ], + v = values[ u.id ]; + + if ( v.needsUpdate !== false ) { + + // note: always updating when .needsUpdate is undefined + u.setValue( gl, v.value, renderer ); + + } + + } + + }; + + WebGLUniforms.seqWithValue = function ( seq, values ) { + + var r = []; + + for ( var i = 0, n = seq.length; i !== n; ++ i ) { + + var u = seq[ i ]; + if ( u.id in values ) r.push( u ); + + } + + return r; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + var ColorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF, + 'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2, + 'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50, + 'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B, + 'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B, + 'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F, + 'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3, + 'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222, + 'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700, + 'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4, + 'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00, + 'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3, + 'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA, + 'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32, + 'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3, + 'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC, + 'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD, + 'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6, + 'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9, + 'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F, + 'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE, + 'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA, + 'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0, + 'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 }; + + function Color( r, g, b ) { + + if ( g === undefined && b === undefined ) { + + // r is THREE.Color, hex or string + return this.set( r ); + + } + + return this.setRGB( r, g, b ); + + } + + Object.assign( Color.prototype, { + + isColor: true, + + r: 1, g: 1, b: 1, + + set: function ( value ) { + + if ( value && value.isColor ) { + + this.copy( value ); + + } else if ( typeof value === 'number' ) { + + this.setHex( value ); + + } else if ( typeof value === 'string' ) { + + this.setStyle( value ); + + } + + return this; + + }, + + setScalar: function ( scalar ) { + + this.r = scalar; + this.g = scalar; + this.b = scalar; + + return this; + + }, + + setHex: function ( hex ) { + + hex = Math.floor( hex ); + + this.r = ( hex >> 16 & 255 ) / 255; + this.g = ( hex >> 8 & 255 ) / 255; + this.b = ( hex & 255 ) / 255; + + return this; + + }, + + setRGB: function ( r, g, b ) { + + this.r = r; + this.g = g; + this.b = b; + + return this; + + }, + + setHSL: function () { + + function hue2rgb( p, q, t ) { + + if ( t < 0 ) t += 1; + if ( t > 1 ) t -= 1; + if ( t < 1 / 6 ) return p + ( q - p ) * 6 * t; + if ( t < 1 / 2 ) return q; + if ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t ); + return p; + + } + + return function setHSL( h, s, l ) { + + // h,s,l ranges are in 0.0 - 1.0 + h = _Math.euclideanModulo( h, 1 ); + s = _Math.clamp( s, 0, 1 ); + l = _Math.clamp( l, 0, 1 ); + + if ( s === 0 ) { + + this.r = this.g = this.b = l; + + } else { + + var p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s ); + var q = ( 2 * l ) - p; + + this.r = hue2rgb( q, p, h + 1 / 3 ); + this.g = hue2rgb( q, p, h ); + this.b = hue2rgb( q, p, h - 1 / 3 ); + + } + + return this; + + }; + + }(), + + setStyle: function ( style ) { + + function handleAlpha( string ) { + + if ( string === undefined ) return; + + if ( parseFloat( string ) < 1 ) { + + console.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' ); + + } + + } + + + var m; + + if ( m = /^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec( style ) ) { + + // rgb / hsl + + var color; + var name = m[ 1 ]; + var components = m[ 2 ]; + + switch ( name ) { + + case 'rgb': + case 'rgba': + + if ( color = /^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) { + + // rgb(255,0,0) rgba(255,0,0,0.5) + this.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255; + this.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255; + this.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255; + + handleAlpha( color[ 5 ] ); + + return this; + + } + + if ( color = /^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) { + + // rgb(100%,0%,0%) rgba(100%,0%,0%,0.5) + this.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100; + this.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100; + this.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100; + + handleAlpha( color[ 5 ] ); + + return this; + + } + + break; + + case 'hsl': + case 'hsla': + + if ( color = /^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) { + + // hsl(120,50%,50%) hsla(120,50%,50%,0.5) + var h = parseFloat( color[ 1 ] ) / 360; + var s = parseInt( color[ 2 ], 10 ) / 100; + var l = parseInt( color[ 3 ], 10 ) / 100; + + handleAlpha( color[ 5 ] ); + + return this.setHSL( h, s, l ); + + } + + break; + + } + + } else if ( m = /^\#([A-Fa-f0-9]+)$/.exec( style ) ) { + + // hex color + + var hex = m[ 1 ]; + var size = hex.length; + + if ( size === 3 ) { + + // #ff0 + this.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255; + this.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255; + this.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255; + + return this; + + } else if ( size === 6 ) { + + // #ff0000 + this.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255; + this.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255; + this.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255; + + return this; + + } + + } + + if ( style && style.length > 0 ) { + + // color keywords + var hex = ColorKeywords[ style ]; + + if ( hex !== undefined ) { + + // red + this.setHex( hex ); + + } else { + + // unknown color + console.warn( 'THREE.Color: Unknown color ' + style ); + + } + + } + + return this; + + }, + + clone: function () { + + return new this.constructor( this.r, this.g, this.b ); + + }, + + copy: function ( color ) { + + this.r = color.r; + this.g = color.g; + this.b = color.b; + + return this; + + }, + + copyGammaToLinear: function ( color, gammaFactor ) { + + if ( gammaFactor === undefined ) gammaFactor = 2.0; + + this.r = Math.pow( color.r, gammaFactor ); + this.g = Math.pow( color.g, gammaFactor ); + this.b = Math.pow( color.b, gammaFactor ); + + return this; + + }, + + copyLinearToGamma: function ( color, gammaFactor ) { + + if ( gammaFactor === undefined ) gammaFactor = 2.0; + + var safeInverse = ( gammaFactor > 0 ) ? ( 1.0 / gammaFactor ) : 1.0; + + this.r = Math.pow( color.r, safeInverse ); + this.g = Math.pow( color.g, safeInverse ); + this.b = Math.pow( color.b, safeInverse ); + + return this; + + }, + + convertGammaToLinear: function () { + + var r = this.r, g = this.g, b = this.b; + + this.r = r * r; + this.g = g * g; + this.b = b * b; + + return this; + + }, + + convertLinearToGamma: function () { + + this.r = Math.sqrt( this.r ); + this.g = Math.sqrt( this.g ); + this.b = Math.sqrt( this.b ); + + return this; + + }, + + getHex: function () { + + return ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0; + + }, + + getHexString: function () { + + return ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 ); + + }, + + getHSL: function ( optionalTarget ) { + + // h,s,l ranges are in 0.0 - 1.0 + + var hsl = optionalTarget || { h: 0, s: 0, l: 0 }; + + var r = this.r, g = this.g, b = this.b; + + var max = Math.max( r, g, b ); + var min = Math.min( r, g, b ); + + var hue, saturation; + var lightness = ( min + max ) / 2.0; + + if ( min === max ) { + + hue = 0; + saturation = 0; + + } else { + + var delta = max - min; + + saturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min ); + + switch ( max ) { + + case r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break; + case g: hue = ( b - r ) / delta + 2; break; + case b: hue = ( r - g ) / delta + 4; break; + + } + + hue /= 6; + + } + + hsl.h = hue; + hsl.s = saturation; + hsl.l = lightness; + + return hsl; + + }, + + getStyle: function () { + + return 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')'; + + }, + + offsetHSL: function ( h, s, l ) { + + var hsl = this.getHSL(); + + hsl.h += h; hsl.s += s; hsl.l += l; + + this.setHSL( hsl.h, hsl.s, hsl.l ); + + return this; + + }, + + add: function ( color ) { + + this.r += color.r; + this.g += color.g; + this.b += color.b; + + return this; + + }, + + addColors: function ( color1, color2 ) { + + this.r = color1.r + color2.r; + this.g = color1.g + color2.g; + this.b = color1.b + color2.b; + + return this; + + }, + + addScalar: function ( s ) { + + this.r += s; + this.g += s; + this.b += s; + + return this; + + }, + + sub: function( color ) { + + this.r = Math.max( 0, this.r - color.r ); + this.g = Math.max( 0, this.g - color.g ); + this.b = Math.max( 0, this.b - color.b ); + + return this; + + }, + + multiply: function ( color ) { + + this.r *= color.r; + this.g *= color.g; + this.b *= color.b; + + return this; + + }, + + multiplyScalar: function ( s ) { + + this.r *= s; + this.g *= s; + this.b *= s; + + return this; + + }, + + lerp: function ( color, alpha ) { + + this.r += ( color.r - this.r ) * alpha; + this.g += ( color.g - this.g ) * alpha; + this.b += ( color.b - this.b ) * alpha; + + return this; + + }, + + equals: function ( c ) { + + return ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.r = array[ offset ]; + this.g = array[ offset + 1 ]; + this.b = array[ offset + 2 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.r; + array[ offset + 1 ] = this.g; + array[ offset + 2 ] = this.b; + + return array; + + }, + + toJSON: function () { + + return this.getHex(); + + } + + } ); + + /** + * Uniforms library for shared webgl shaders + */ + + var UniformsLib = { + + common: { + + diffuse: { value: new Color( 0xeeeeee ) }, + opacity: { value: 1.0 }, + + map: { value: null }, + offsetRepeat: { value: new Vector4( 0, 0, 1, 1 ) }, + + specularMap: { value: null }, + alphaMap: { value: null }, + + envMap: { value: null }, + flipEnvMap: { value: - 1 }, + reflectivity: { value: 1.0 }, + refractionRatio: { value: 0.98 } + + }, + + aomap: { + + aoMap: { value: null }, + aoMapIntensity: { value: 1 } + + }, + + lightmap: { + + lightMap: { value: null }, + lightMapIntensity: { value: 1 } + + }, + + emissivemap: { + + emissiveMap: { value: null } + + }, + + bumpmap: { + + bumpMap: { value: null }, + bumpScale: { value: 1 } + + }, + + normalmap: { + + normalMap: { value: null }, + normalScale: { value: new Vector2( 1, 1 ) } + + }, + + displacementmap: { + + displacementMap: { value: null }, + displacementScale: { value: 1 }, + displacementBias: { value: 0 } + + }, + + roughnessmap: { + + roughnessMap: { value: null } + + }, + + metalnessmap: { + + metalnessMap: { value: null } + + }, + + gradientmap: { + + gradientMap: { value: null } + + }, + + fog: { + + fogDensity: { value: 0.00025 }, + fogNear: { value: 1 }, + fogFar: { value: 2000 }, + fogColor: { value: new Color( 0xffffff ) } + + }, + + lights: { + + ambientLightColor: { value: [] }, + + directionalLights: { value: [], properties: { + direction: {}, + color: {}, + + shadow: {}, + shadowBias: {}, + shadowRadius: {}, + shadowMapSize: {} + } }, + + directionalShadowMap: { value: [] }, + directionalShadowMatrix: { value: [] }, + + spotLights: { value: [], properties: { + color: {}, + position: {}, + direction: {}, + distance: {}, + coneCos: {}, + penumbraCos: {}, + decay: {}, + + shadow: {}, + shadowBias: {}, + shadowRadius: {}, + shadowMapSize: {} + } }, + + spotShadowMap: { value: [] }, + spotShadowMatrix: { value: [] }, + + pointLights: { value: [], properties: { + color: {}, + position: {}, + decay: {}, + distance: {}, + + shadow: {}, + shadowBias: {}, + shadowRadius: {}, + shadowMapSize: {} + } }, + + pointShadowMap: { value: [] }, + pointShadowMatrix: { value: [] }, + + hemisphereLights: { value: [], properties: { + direction: {}, + skyColor: {}, + groundColor: {} + } }, + + // TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src + rectAreaLights: { value: [], properties: { + color: {}, + position: {}, + width: {}, + height: {} + } } + + }, + + points: { + + diffuse: { value: new Color( 0xeeeeee ) }, + opacity: { value: 1.0 }, + size: { value: 1.0 }, + scale: { value: 1.0 }, + map: { value: null }, + offsetRepeat: { value: new Vector4( 0, 0, 1, 1 ) } + + } + + }; + + /** + * Uniform Utilities + */ + + var UniformsUtils = { + + merge: function ( uniforms ) { + + var merged = {}; + + for ( var u = 0; u < uniforms.length; u ++ ) { + + var tmp = this.clone( uniforms[ u ] ); + + for ( var p in tmp ) { + + merged[ p ] = tmp[ p ]; + + } + + } + + return merged; + + }, + + clone: function ( uniforms_src ) { + + var uniforms_dst = {}; + + for ( var u in uniforms_src ) { + + uniforms_dst[ u ] = {}; + + for ( var p in uniforms_src[ u ] ) { + + var parameter_src = uniforms_src[ u ][ p ]; + + if ( parameter_src && ( parameter_src.isColor || + parameter_src.isMatrix3 || parameter_src.isMatrix4 || + parameter_src.isVector2 || parameter_src.isVector3 || parameter_src.isVector4 || + parameter_src.isTexture ) ) { + + uniforms_dst[ u ][ p ] = parameter_src.clone(); + + } else if ( Array.isArray( parameter_src ) ) { + + uniforms_dst[ u ][ p ] = parameter_src.slice(); + + } else { + + uniforms_dst[ u ][ p ] = parameter_src; + + } + + } + + } + + return uniforms_dst; + + } + + }; + + var alphamap_fragment = "#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif\n"; + + var alphamap_pars_fragment = "#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif\n"; + + var alphatest_fragment = "#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif\n"; + + var aomap_fragment = "#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\n\t#endif\n#endif\n"; + + var aomap_pars_fragment = "#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif"; + + var begin_vertex = "\nvec3 transformed = vec3( position );\n"; + + var beginnormal_vertex = "\nvec3 objectNormal = vec3( normal );\n"; + + var bsdfs = "float punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\tif( decayExponent > 0.0 ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\treturn distanceFalloff * maxDistanceCutoffFactor;\n#else\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n#endif\n\t}\n\treturn 1.0;\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat theta = acos( dot( N, V ) );\n\tvec2 uv = vec2(\n\t\tsqrt( saturate( roughness ) ),\n\t\tsaturate( theta / ( 0.5 * PI ) ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.86267 + (0.49788 + 0.01436 * y ) * y;\n\tfloat b = 3.45068 + (4.18814 + y) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = (x > 0.0) ? v : 0.5 * inversesqrt( 1.0 - x * x ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transpose( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tvec3 result = vec3( LTC_ClippedSphereFormFactor( vectorFormFactor ) );\n\treturn result;\n}\nvec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;\n\treturn specularColor * AB.x + AB.y;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n"; + + var bumpmap_pars_fragment = "#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\t\tvec3 vSigmaX = dFdx( surf_pos );\n\t\tvec3 vSigmaY = dFdy( surf_pos );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif\n"; + + var clipping_planes_fragment = "#if NUM_CLIPPING_PLANES > 0\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; ++ i ) {\n\t\tvec4 plane = clippingPlanes[ i ];\n\t\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t\t\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; ++ i ) {\n\t\t\tvec4 plane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\tif ( clipped ) discard;\n\t\n\t#endif\n#endif\n"; + + var clipping_planes_pars_fragment = "#if NUM_CLIPPING_PLANES > 0\n\t#if ! defined( PHYSICAL ) && ! defined( PHONG )\n\t\tvarying vec3 vViewPosition;\n\t#endif\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif\n"; + + var clipping_planes_pars_vertex = "#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvarying vec3 vViewPosition;\n#endif\n"; + + var clipping_planes_vertex = "#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n"; + + var color_fragment = "#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif"; + + var color_pars_fragment = "#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif\n"; + + var color_pars_vertex = "#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif"; + + var color_vertex = "#ifdef USE_COLOR\n\tvColor.xyz = color.xyz;\n#endif"; + + var common = "#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\nmat3 transpose( const in mat3 v ) {\n\tmat3 tmp;\n\ttmp[0] = vec3(v[0].x, v[1].x, v[2].x);\n\ttmp[1] = vec3(v[0].y, v[1].y, v[2].y);\n\ttmp[2] = vec3(v[0].z, v[1].z, v[2].z);\n\treturn tmp;\n}\n"; + + var cube_uv_reflection_fragment = "#ifdef ENVMAP_TYPE_CUBE_UV\n#define cubeUV_textureSize (1024.0)\nint getFaceFromDirection(vec3 direction) {\n\tvec3 absDirection = abs(direction);\n\tint face = -1;\n\tif( absDirection.x > absDirection.z ) {\n\t\tif(absDirection.x > absDirection.y )\n\t\t\tface = direction.x > 0.0 ? 0 : 3;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\telse {\n\t\tif(absDirection.z > absDirection.y )\n\t\t\tface = direction.z > 0.0 ? 2 : 5;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\treturn face;\n}\n#define cubeUV_maxLods1 (log2(cubeUV_textureSize*0.25) - 1.0)\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\n\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\n\tfloat dxRoughness = dFdx(roughness);\n\tfloat dyRoughness = dFdy(roughness);\n\tvec3 dx = dFdx( vec * scale * dxRoughness );\n\tvec3 dy = dFdy( vec * scale * dyRoughness );\n\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\n\td = clamp(d, 1.0, cubeUV_rangeClamp);\n\tfloat mipLevel = 0.5 * log2(d);\n\treturn vec2(floor(mipLevel), fract(mipLevel));\n}\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\n\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\n\tfloat a = 16.0 * cubeUV_rcpTextureSize;\n\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\n\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\n\tfloat powScale = exp2_packed.x * exp2_packed.y;\n\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\n\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\n\tbool bRes = mipLevel == 0.0;\n\tscale = bRes && (scale < a) ? a : scale;\n\tvec3 r;\n\tvec2 offset;\n\tint face = getFaceFromDirection(direction);\n\tfloat rcpPowScale = 1.0 / powScale;\n\tif( face == 0) {\n\t\tr = vec3(direction.x, -direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 1) {\n\t\tr = vec3(direction.y, direction.x, direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 2) {\n\t\tr = vec3(direction.z, direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 3) {\n\t\tr = vec3(direction.x, direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse if( face == 4) {\n\t\tr = vec3(direction.y, direction.x, -direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse {\n\t\tr = vec3(direction.z, -direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\tr = normalize(r);\n\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\n\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\n\tvec2 base = offset + vec2( texelOffset );\n\treturn base + s * ( scale - 2.0 * texelOffset );\n}\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\n\tfloat roughnessVal = roughness* cubeUV_maxLods3;\n\tfloat r1 = floor(roughnessVal);\n\tfloat r2 = r1 + 1.0;\n\tfloat t = fract(roughnessVal);\n\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\n\tfloat s = mipInfo.y;\n\tfloat level0 = mipInfo.x;\n\tfloat level1 = level0 + 1.0;\n\tlevel1 = level1 > 5.0 ? 5.0 : level1;\n\tlevel0 += min( floor( s + 0.5 ), 5.0 );\n\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\n\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\n\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\n\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\n\tvec4 result = mix(color10, color20, t);\n\treturn vec4(result.rgb, 1.0);\n}\n#endif\n"; + + var defaultnormal_vertex = "#ifdef FLIP_SIDED\n\tobjectNormal = -objectNormal;\n#endif\nvec3 transformedNormal = normalMatrix * objectNormal;\n"; + + var displacementmap_pars_vertex = "#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif\n"; + + var displacementmap_vertex = "#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normal * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\n#endif\n"; + + var emissivemap_fragment = "#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif\n"; + + var emissivemap_pars_fragment = "#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif\n"; + + var encodings_fragment = " gl_FragColor = linearToOutputTexel( gl_FragColor );\n"; + + var encodings_pars_fragment = "\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.w );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.w );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.xyz * value.w * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = min( floor( D ) / 255.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value ) {\n\tvec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\n\tXp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract(Le);\n\tvResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\n\treturn vec4( max(vRGB, 0.0), 1.0 );\n}\n"; + + var envmap_fragment = "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\tsampleUV.y = saturate( flipNormal * reflectVec.y * 0.5 + 0.5 );\n\t\tsampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\tvec3 reflectView = flipNormal * normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\n\t\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\tenvColor = envMapTexelToLinear( envColor );\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif\n"; + + var envmap_pars_fragment = "#if defined( USE_ENVMAP ) || defined( PHYSICAL )\n\tuniform float reflectivity;\n\tuniform float envMapIntensity;\n#endif\n#ifdef USE_ENVMAP\n\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\n\t\tvarying vec3 vWorldPosition;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\tuniform float flipEnvMap;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL )\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif\n"; + + var envmap_pars_vertex = "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif\n"; + + var envmap_vertex = "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif\n"; + + var fog_vertex = "\n#ifdef USE_FOG\nfogDepth = -mvPosition.z;\n#endif"; + + var fog_pars_vertex = "#ifdef USE_FOG\n varying float fogDepth;\n#endif\n"; + + var fog_fragment = "#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif\n"; + + var fog_pars_fragment = "#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float fogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif\n"; + + var gradientmap_pars_fragment = "#ifdef TOON\n\tuniform sampler2D gradientMap;\n\tvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\t\tfloat dotNL = dot( normal, lightDirection );\n\t\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t\t#ifdef USE_GRADIENTMAP\n\t\t\treturn texture2D( gradientMap, coord ).rgb;\n\t\t#else\n\t\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t\t#endif\n\t}\n#endif\n"; + + var lightmap_fragment = "#ifdef USE_LIGHTMAP\n\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n#endif\n"; + + var lightmap_pars_fragment = "#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif"; + + var lights_lambert_vertex = "vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\n#if NUM_POINT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_DIR_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n#endif\n"; + + var lights_pars = "uniform vec3 ambientLightColor;\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( angleCos > spotLight.coneCos ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltcMat;\tuniform sampler2D ltcMag;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif\n#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar - 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\n\t\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\t\tvec2 sampleUV;\n\t\t\tsampleUV.y = saturate( reflectVec.y * 0.5 + 0.5 );\n\t\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif\n"; + + var lights_phong_fragment = "BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;\n"; + + var lights_phong_pars_fragment = "varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_BlinnPhong( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = BlinnExponentToGGXRoughness( material.specularShininess );\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos - halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos + halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos + halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos - halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tfloat norm = texture2D( ltcMag, uv ).a;\n\t\tvec4 t = texture2D( ltcMat, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( 1, 0, t.y ),\n\t\t\tvec3( 0, t.z, 0 ),\n\t\t\tvec3( t.w, 0, t.x )\n\t\t);\n\t\treflectedLight.directSpecular += lightColor * material.specularColor * norm * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifdef TOON\n\t\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#else\n\t\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\t\tvec3 irradiance = dotNL * directLight.color;\n\t#endif\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)\n"; + + var lights_physical_fragment = "PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\n#ifdef STANDARD\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.clearCoat = saturate( clearCoat );\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\n#endif\n"; + + var lights_physical_pars_fragment = "struct PhysicalMaterial {\n\tvec3\tdiffuseColor;\n\tfloat\tspecularRoughness;\n\tvec3\tspecularColor;\n\t#ifndef STANDARD\n\t\tfloat clearCoat;\n\t\tfloat clearCoatRoughness;\n\t#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.specularRoughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos - halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos + halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos + halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos - halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tfloat norm = texture2D( ltcMag, uv ).a;\n\t\tvec4 t = texture2D( ltcMat, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( 1, 0, t.y ),\n\t\t\tvec3( 0, t.z, 0 ),\n\t\t\tvec3( t.w, 0, t.x )\n\t\t);\n\t\treflectedLight.directSpecular += lightColor * material.specularColor * norm * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifndef STANDARD\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\n\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\t#ifndef STANDARD\n\t\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifndef STANDARD\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\tfloat dotNL = dotNV;\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\n\t#ifndef STANDARD\n\t\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\n#define Material_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.specularRoughness )\n#define Material_ClearCoat_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}\n"; + + var lights_template = "\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = normalize( vViewPosition );\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#ifdef USE_LIGHTMAP\n\t\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tirradiance += getLightProbeIndirectIrradiance( geometry, 8 );\n\t#endif\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tvec3 radiance = getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), 8 );\n\t#ifndef STANDARD\n\t\tvec3 clearCoatRadiance = getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), 8 );\n\t#else\n\t\tvec3 clearCoatRadiance = vec3( 0.0 );\n\t#endif\n\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\n#endif\n"; + + var logdepthbuf_fragment = "#if defined(USE_LOGDEPTHBUF) && defined(USE_LOGDEPTHBUF_EXT)\n\tgl_FragDepthEXT = log2(vFragDepth) * logDepthBufFC * 0.5;\n#endif"; + + var logdepthbuf_pars_fragment = "#ifdef USE_LOGDEPTHBUF\n\tuniform float logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n#endif\n"; + + var logdepthbuf_pars_vertex = "#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n\tuniform float logDepthBufFC;\n#endif"; + + var logdepthbuf_vertex = "#ifdef USE_LOGDEPTHBUF\n\tgl_Position.z = log2(max( EPSILON, gl_Position.w + 1.0 )) * logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t#else\n\t\tgl_Position.z = (gl_Position.z - 1.0) * gl_Position.w;\n\t#endif\n#endif\n"; + + var map_fragment = "#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif\n"; + + var map_pars_fragment = "#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n"; + + var map_particle_fragment = "#ifdef USE_MAP\n\tvec4 mapTexel = texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) * offsetRepeat.zw + offsetRepeat.xy );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n"; + + var map_particle_pars_fragment = "#ifdef USE_MAP\n\tuniform vec4 offsetRepeat;\n\tuniform sampler2D map;\n#endif\n"; + + var metalnessmap_fragment = "float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif\n"; + + var metalnessmap_pars_fragment = "#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif"; + + var morphnormal_vertex = "#ifdef USE_MORPHNORMALS\n\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\n\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\n\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\n\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\n#endif\n"; + + var morphtarget_pars_vertex = "#ifdef USE_MORPHTARGETS\n\t#ifndef USE_MORPHNORMALS\n\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif"; + + var morphtarget_vertex = "#ifdef USE_MORPHTARGETS\n\ttransformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\n\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\n\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\n\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\n\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\n\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\n\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\n\t#endif\n#endif\n"; + + var normal_flip = "#ifdef DOUBLE_SIDED\n\tfloat flipNormal = ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n#else\n\tfloat flipNormal = 1.0;\n#endif\n"; + + var normal_fragment = "#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal ) * flipNormal;\n#endif\n#ifdef USE_NORMALMAP\n\tnormal = perturbNormal2Arb( -vViewPosition, normal );\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif\n"; + + var normalmap_pars_fragment = "#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\n\t\tvec3 q0 = dFdx( eye_pos.xyz );\n\t\tvec3 q1 = dFdy( eye_pos.xyz );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tvec3 S = normalize( q0 * st1.t - q1 * st0.t );\n\t\tvec3 T = normalize( -q0 * st1.s + q1 * st0.s );\n\t\tvec3 N = normalize( surf_norm );\n\t\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\tmapN.xy = normalScale * mapN.xy;\n\t\tmat3 tsn = mat3( S, T, N );\n\t\treturn normalize( tsn * mapN );\n\t}\n#endif\n"; + + var packing = "vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 1.0 - 2.0 * rgb.xyz;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}\n"; + + var premultiplied_alpha_fragment = "#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif\n"; + + var project_vertex = "#ifdef USE_SKINNING\n\tvec4 mvPosition = modelViewMatrix * skinned;\n#else\n\tvec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\n#endif\ngl_Position = projectionMatrix * mvPosition;\n"; + + var dithering_fragment = "#if defined( DITHERING )\n gl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif\n"; + + var dithering_pars_fragment = "#if defined( DITHERING )\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif\n"; + + var roughnessmap_fragment = "float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif\n"; + + var roughnessmap_pars_fragment = "#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif"; + + var shadowmap_pars_fragment = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\n\t\tconst vec2 offset = vec2( 0.0, 1.0 );\n\t\tvec2 texelSize = vec2( 1.0 ) / size;\n\t\tvec2 centroidUV = floor( uv * size + 0.5 ) / size;\n\t\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\n\t\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\n\t\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\n\t\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\n\t\tvec2 f = fract( uv * size + 0.5 );\n\t\tfloat a = mix( lb, lt, f.y );\n\t\tfloat b = mix( rb, rt, f.y );\n\t\tfloat c = mix( a, b, f.x );\n\t\treturn c;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\treturn (\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn 1.0;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\tfloat dp = ( length( lightToPosition ) - shadowBias ) / 1000.0;\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif\n"; + + var shadowmap_pars_vertex = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n#endif\n"; + + var shadowmap_vertex = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n#endif\n"; + + var shadowmask_pars_fragment = "float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tDirectionalLight directionalLight;\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tSpotLight spotLight;\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tPointLight pointLight;\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#endif\n\treturn shadow;\n}\n"; + + var skinbase_vertex = "#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif"; + + var skinning_pars_vertex = "#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif\n"; + + var skinning_vertex = "#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\tskinned = bindMatrixInverse * skinned;\n#endif\n"; + + var skinnormal_vertex = "#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n#endif\n"; + + var specularmap_fragment = "float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif"; + + var specularmap_pars_fragment = "#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif"; + + var tonemapping_fragment = "#if defined( TONE_MAPPING )\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif\n"; + + var tonemapping_pars_fragment = "#define saturate(a) clamp( a, 0.0, 1.0 )\nuniform float toneMappingExposure;\nuniform float toneMappingWhitePoint;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\nvec3 Uncharted2ToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\n"; + + var uv_pars_fragment = "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n#endif"; + + var uv_pars_vertex = "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n\tuniform vec4 offsetRepeat;\n#endif\n"; + + var uv_vertex = "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvUv = uv * offsetRepeat.zw + offsetRepeat.xy;\n#endif"; + + var uv2_pars_fragment = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif"; + + var uv2_pars_vertex = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n#endif"; + + var uv2_vertex = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = uv2;\n#endif"; + + var worldpos_vertex = "#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( PHYSICAL ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )\n\t#ifdef USE_SKINNING\n\t\tvec4 worldPosition = modelMatrix * skinned;\n\t#else\n\t\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n\t#endif\n#endif\n"; + + var cube_frag = "uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\n\tgl_FragColor.a *= opacity;\n}\n"; + + var cube_vert = "varying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}\n"; + + var depth_frag = "#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <logdepthbuf_fragment>\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( gl_FragCoord.z ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\n\t#endif\n}\n"; + + var depth_vert = "#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#include <begin_vertex>\n\t#include <displacementmap_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n}\n"; + + var distanceRGBA_frag = "uniform vec3 lightPos;\nvarying vec4 vWorldPosition;\n#include <common>\n#include <packing>\n#include <clipping_planes_pars_fragment>\nvoid main () {\n\t#include <clipping_planes_fragment>\n\tgl_FragColor = packDepthToRGBA( length( vWorldPosition.xyz - lightPos.xyz ) / 1000.0 );\n}\n"; + + var distanceRGBA_vert = "varying vec4 vWorldPosition;\n#include <common>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <skinbase_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\tvWorldPosition = worldPosition;\n}\n"; + + var equirect_frag = "uniform sampler2D tEquirect;\nuniform float tFlip;\nvarying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvec3 direction = normalize( vWorldPosition );\n\tvec2 sampleUV;\n\tsampleUV.y = saturate( tFlip * direction.y * -0.5 + 0.5 );\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n}\n"; + + var equirect_vert = "varying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}\n"; + + var linedashed_frag = "uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <color_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n"; + + var linedashed_vert = "uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}\n"; + + var meshbasic_frag = "uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include <aomap_fragment>\n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include <normal_flip>\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n"; + + var meshbasic_vert = "#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_ENVMAP\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <envmap_vertex>\n\t#include <fog_vertex>\n}\n"; + + var meshlambert_frag = "uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <bsdfs>\n#include <lights_pars>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <emissivemap_fragment>\n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#include <lightmap_fragment>\n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include <normal_flip>\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n"; + + var meshlambert_vert = "#define LAMBERT\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <bsdfs>\n#include <lights_pars>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <lights_lambert_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n"; + + var meshphong_frag = "#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <gradientmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars>\n#include <lights_phong_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_flip>\n\t#include <normal_fragment>\n\t#include <emissivemap_fragment>\n\t#include <lights_phong_fragment>\n\t#include <lights_template>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n"; + + var meshphong_vert = "#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <displacementmap_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n"; + + var meshphysical_frag = "#define PHYSICAL\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifndef STANDARD\n\tuniform float clearCoat;\n\tuniform float clearCoatRoughness;\n#endif\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <cube_uv_reflection_fragment>\n#include <lights_pars>\n#include <lights_physical_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <roughnessmap_pars_fragment>\n#include <metalnessmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <roughnessmap_fragment>\n\t#include <metalnessmap_fragment>\n\t#include <normal_flip>\n\t#include <normal_fragment>\n\t#include <emissivemap_fragment>\n\t#include <lights_physical_fragment>\n\t#include <lights_template>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n"; + + var meshphysical_vert = "#define PHYSICAL\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <displacementmap_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n"; + + var normal_frag = "#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <packing>\n#include <uv_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\nvoid main() {\n\t#include <logdepthbuf_fragment>\n\t#include <normal_flip>\n\t#include <normal_fragment>\n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}\n"; + + var normal_vert = "#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <displacementmap_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}\n"; + + var points_frag = "uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <color_pars_fragment>\n#include <map_particle_pars_fragment>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_particle_fragment>\n\t#include <color_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n"; + + var points_vert = "uniform float size;\nuniform float scale;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#ifdef USE_SIZEATTENUATION\n\t\tgl_PointSize = size * ( scale / - mvPosition.z );\n\t#else\n\t\tgl_PointSize = size;\n\t#endif\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n"; + + var shadow_frag = "uniform float opacity;\n#include <common>\n#include <packing>\n#include <bsdfs>\n#include <lights_pars>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main() {\n\tgl_FragColor = vec4( 0.0, 0.0, 0.0, opacity * ( 1.0 - getShadowMask() ) );\n}\n"; + + var shadow_vert = "#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n}\n"; + + var ShaderChunk = { + alphamap_fragment: alphamap_fragment, + alphamap_pars_fragment: alphamap_pars_fragment, + alphatest_fragment: alphatest_fragment, + aomap_fragment: aomap_fragment, + aomap_pars_fragment: aomap_pars_fragment, + begin_vertex: begin_vertex, + beginnormal_vertex: beginnormal_vertex, + bsdfs: bsdfs, + bumpmap_pars_fragment: bumpmap_pars_fragment, + clipping_planes_fragment: clipping_planes_fragment, + clipping_planes_pars_fragment: clipping_planes_pars_fragment, + clipping_planes_pars_vertex: clipping_planes_pars_vertex, + clipping_planes_vertex: clipping_planes_vertex, + color_fragment: color_fragment, + color_pars_fragment: color_pars_fragment, + color_pars_vertex: color_pars_vertex, + color_vertex: color_vertex, + common: common, + cube_uv_reflection_fragment: cube_uv_reflection_fragment, + defaultnormal_vertex: defaultnormal_vertex, + displacementmap_pars_vertex: displacementmap_pars_vertex, + displacementmap_vertex: displacementmap_vertex, + emissivemap_fragment: emissivemap_fragment, + emissivemap_pars_fragment: emissivemap_pars_fragment, + encodings_fragment: encodings_fragment, + encodings_pars_fragment: encodings_pars_fragment, + envmap_fragment: envmap_fragment, + envmap_pars_fragment: envmap_pars_fragment, + envmap_pars_vertex: envmap_pars_vertex, + envmap_vertex: envmap_vertex, + fog_vertex: fog_vertex, + fog_pars_vertex: fog_pars_vertex, + fog_fragment: fog_fragment, + fog_pars_fragment: fog_pars_fragment, + gradientmap_pars_fragment: gradientmap_pars_fragment, + lightmap_fragment: lightmap_fragment, + lightmap_pars_fragment: lightmap_pars_fragment, + lights_lambert_vertex: lights_lambert_vertex, + lights_pars: lights_pars, + lights_phong_fragment: lights_phong_fragment, + lights_phong_pars_fragment: lights_phong_pars_fragment, + lights_physical_fragment: lights_physical_fragment, + lights_physical_pars_fragment: lights_physical_pars_fragment, + lights_template: lights_template, + logdepthbuf_fragment: logdepthbuf_fragment, + logdepthbuf_pars_fragment: logdepthbuf_pars_fragment, + logdepthbuf_pars_vertex: logdepthbuf_pars_vertex, + logdepthbuf_vertex: logdepthbuf_vertex, + map_fragment: map_fragment, + map_pars_fragment: map_pars_fragment, + map_particle_fragment: map_particle_fragment, + map_particle_pars_fragment: map_particle_pars_fragment, + metalnessmap_fragment: metalnessmap_fragment, + metalnessmap_pars_fragment: metalnessmap_pars_fragment, + morphnormal_vertex: morphnormal_vertex, + morphtarget_pars_vertex: morphtarget_pars_vertex, + morphtarget_vertex: morphtarget_vertex, + normal_flip: normal_flip, + normal_fragment: normal_fragment, + normalmap_pars_fragment: normalmap_pars_fragment, + packing: packing, + premultiplied_alpha_fragment: premultiplied_alpha_fragment, + project_vertex: project_vertex, + dithering_fragment: dithering_fragment, + dithering_pars_fragment: dithering_pars_fragment, + roughnessmap_fragment: roughnessmap_fragment, + roughnessmap_pars_fragment: roughnessmap_pars_fragment, + shadowmap_pars_fragment: shadowmap_pars_fragment, + shadowmap_pars_vertex: shadowmap_pars_vertex, + shadowmap_vertex: shadowmap_vertex, + shadowmask_pars_fragment: shadowmask_pars_fragment, + skinbase_vertex: skinbase_vertex, + skinning_pars_vertex: skinning_pars_vertex, + skinning_vertex: skinning_vertex, + skinnormal_vertex: skinnormal_vertex, + specularmap_fragment: specularmap_fragment, + specularmap_pars_fragment: specularmap_pars_fragment, + tonemapping_fragment: tonemapping_fragment, + tonemapping_pars_fragment: tonemapping_pars_fragment, + uv_pars_fragment: uv_pars_fragment, + uv_pars_vertex: uv_pars_vertex, + uv_vertex: uv_vertex, + uv2_pars_fragment: uv2_pars_fragment, + uv2_pars_vertex: uv2_pars_vertex, + uv2_vertex: uv2_vertex, + worldpos_vertex: worldpos_vertex, + + cube_frag: cube_frag, + cube_vert: cube_vert, + depth_frag: depth_frag, + depth_vert: depth_vert, + distanceRGBA_frag: distanceRGBA_frag, + distanceRGBA_vert: distanceRGBA_vert, + equirect_frag: equirect_frag, + equirect_vert: equirect_vert, + linedashed_frag: linedashed_frag, + linedashed_vert: linedashed_vert, + meshbasic_frag: meshbasic_frag, + meshbasic_vert: meshbasic_vert, + meshlambert_frag: meshlambert_frag, + meshlambert_vert: meshlambert_vert, + meshphong_frag: meshphong_frag, + meshphong_vert: meshphong_vert, + meshphysical_frag: meshphysical_frag, + meshphysical_vert: meshphysical_vert, + normal_frag: normal_frag, + normal_vert: normal_vert, + points_frag: points_frag, + points_vert: points_vert, + shadow_frag: shadow_frag, + shadow_vert: shadow_vert + }; + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author mikael emtinger / http://gomo.se/ + */ + + var ShaderLib = { + + basic: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.fog + ] ), + + vertexShader: ShaderChunk.meshbasic_vert, + fragmentShader: ShaderChunk.meshbasic_frag + + }, + + lambert: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: new Color( 0x000000 ) } + } + ] ), + + vertexShader: ShaderChunk.meshlambert_vert, + fragmentShader: ShaderChunk.meshlambert_frag + + }, + + phong: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.gradientmap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: new Color( 0x000000 ) }, + specular: { value: new Color( 0x111111 ) }, + shininess: { value: 30 } + } + ] ), + + vertexShader: ShaderChunk.meshphong_vert, + fragmentShader: ShaderChunk.meshphong_frag + + }, + + standard: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.roughnessmap, + UniformsLib.metalnessmap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: new Color( 0x000000 ) }, + roughness: { value: 0.5 }, + metalness: { value: 0.5 }, + envMapIntensity: { value: 1 } // temporary + } + ] ), + + vertexShader: ShaderChunk.meshphysical_vert, + fragmentShader: ShaderChunk.meshphysical_frag + + }, + + points: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.points, + UniformsLib.fog + ] ), + + vertexShader: ShaderChunk.points_vert, + fragmentShader: ShaderChunk.points_frag + + }, + + dashed: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.fog, + { + scale: { value: 1 }, + dashSize: { value: 1 }, + totalSize: { value: 2 } + } + ] ), + + vertexShader: ShaderChunk.linedashed_vert, + fragmentShader: ShaderChunk.linedashed_frag + + }, + + depth: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.displacementmap + ] ), + + vertexShader: ShaderChunk.depth_vert, + fragmentShader: ShaderChunk.depth_frag + + }, + + normal: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + { + opacity: { value: 1.0 } + } + ] ), + + vertexShader: ShaderChunk.normal_vert, + fragmentShader: ShaderChunk.normal_frag + + }, + + /* ------------------------------------------------------------------------- + // Cube map shader + ------------------------------------------------------------------------- */ + + cube: { + + uniforms: { + tCube: { value: null }, + tFlip: { value: - 1 }, + opacity: { value: 1.0 } + }, + + vertexShader: ShaderChunk.cube_vert, + fragmentShader: ShaderChunk.cube_frag + + }, + + /* ------------------------------------------------------------------------- + // Cube map shader + ------------------------------------------------------------------------- */ + + equirect: { + + uniforms: { + tEquirect: { value: null }, + tFlip: { value: - 1 } + }, + + vertexShader: ShaderChunk.equirect_vert, + fragmentShader: ShaderChunk.equirect_frag + + }, + + distanceRGBA: { + + uniforms: { + lightPos: { value: new Vector3() } + }, + + vertexShader: ShaderChunk.distanceRGBA_vert, + fragmentShader: ShaderChunk.distanceRGBA_frag + + } + + }; + + ShaderLib.physical = { + + uniforms: UniformsUtils.merge( [ + ShaderLib.standard.uniforms, + { + clearCoat: { value: 0 }, + clearCoatRoughness: { value: 0 } + } + ] ), + + vertexShader: ShaderChunk.meshphysical_vert, + fragmentShader: ShaderChunk.meshphysical_frag + + }; + + /** + * @author bhouston / http://clara.io + */ + + function Box2( min, max ) { + + this.min = ( min !== undefined ) ? min : new Vector2( + Infinity, + Infinity ); + this.max = ( max !== undefined ) ? max : new Vector2( - Infinity, - Infinity ); + + } + + Object.assign( Box2.prototype, { + + set: function ( min, max ) { + + this.min.copy( min ); + this.max.copy( max ); + + return this; + + }, + + setFromPoints: function ( points ) { + + this.makeEmpty(); + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + this.expandByPoint( points[ i ] ); + + } + + return this; + + }, + + setFromCenterAndSize: function () { + + var v1 = new Vector2(); + + return function setFromCenterAndSize( center, size ) { + + var halfSize = v1.copy( size ).multiplyScalar( 0.5 ); + this.min.copy( center ).sub( halfSize ); + this.max.copy( center ).add( halfSize ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( box ) { + + this.min.copy( box.min ); + this.max.copy( box.max ); + + return this; + + }, + + makeEmpty: function () { + + this.min.x = this.min.y = + Infinity; + this.max.x = this.max.y = - Infinity; + + return this; + + }, + + isEmpty: function () { + + // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes + + return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ); + + }, + + getCenter: function ( optionalTarget ) { + + var result = optionalTarget || new Vector2(); + return this.isEmpty() ? result.set( 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 ); + + }, + + getSize: function ( optionalTarget ) { + + var result = optionalTarget || new Vector2(); + return this.isEmpty() ? result.set( 0, 0 ) : result.subVectors( this.max, this.min ); + + }, + + expandByPoint: function ( point ) { + + this.min.min( point ); + this.max.max( point ); + + return this; + + }, + + expandByVector: function ( vector ) { + + this.min.sub( vector ); + this.max.add( vector ); + + return this; + + }, + + expandByScalar: function ( scalar ) { + + this.min.addScalar( - scalar ); + this.max.addScalar( scalar ); + + return this; + + }, + + containsPoint: function ( point ) { + + return point.x < this.min.x || point.x > this.max.x || + point.y < this.min.y || point.y > this.max.y ? false : true; + + }, + + containsBox: function ( box ) { + + return this.min.x <= box.min.x && box.max.x <= this.max.x && + this.min.y <= box.min.y && box.max.y <= this.max.y; + + }, + + getParameter: function ( point, optionalTarget ) { + + // This can potentially have a divide by zero if the box + // has a size dimension of 0. + + var result = optionalTarget || new Vector2(); + + return result.set( + ( point.x - this.min.x ) / ( this.max.x - this.min.x ), + ( point.y - this.min.y ) / ( this.max.y - this.min.y ) + ); + + }, + + intersectsBox: function ( box ) { + + // using 4 splitting planes to rule out intersections + + return box.max.x < this.min.x || box.min.x > this.max.x || + box.max.y < this.min.y || box.min.y > this.max.y ? false : true; + + }, + + clampPoint: function ( point, optionalTarget ) { + + var result = optionalTarget || new Vector2(); + return result.copy( point ).clamp( this.min, this.max ); + + }, + + distanceToPoint: function () { + + var v1 = new Vector2(); + + return function distanceToPoint( point ) { + + var clampedPoint = v1.copy( point ).clamp( this.min, this.max ); + return clampedPoint.sub( point ).length(); + + }; + + }(), + + intersect: function ( box ) { + + this.min.max( box.min ); + this.max.min( box.max ); + + return this; + + }, + + union: function ( box ) { + + this.min.min( box.min ); + this.max.max( box.max ); + + return this; + + }, + + translate: function ( offset ) { + + this.min.add( offset ); + this.max.add( offset ); + + return this; + + }, + + equals: function ( box ) { + + return box.min.equals( this.min ) && box.max.equals( this.max ); + + } + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + */ + + function LensFlarePlugin( renderer, flares ) { + + var gl = renderer.context; + var state = renderer.state; + + var vertexBuffer, elementBuffer; + var shader, program, attributes, uniforms; + + var tempTexture, occlusionTexture; + + function init() { + + var vertices = new Float32Array( [ + - 1, - 1, 0, 0, + 1, - 1, 1, 0, + 1, 1, 1, 1, + - 1, 1, 0, 1 + ] ); + + var faces = new Uint16Array( [ + 0, 1, 2, + 0, 2, 3 + ] ); + + // buffers + + vertexBuffer = gl.createBuffer(); + elementBuffer = gl.createBuffer(); + + gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer ); + gl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW ); + + gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer ); + gl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW ); + + // textures + + tempTexture = gl.createTexture(); + occlusionTexture = gl.createTexture(); + + state.bindTexture( gl.TEXTURE_2D, tempTexture ); + gl.texImage2D( gl.TEXTURE_2D, 0, gl.RGB, 16, 16, 0, gl.RGB, gl.UNSIGNED_BYTE, null ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST ); + + state.bindTexture( gl.TEXTURE_2D, occlusionTexture ); + gl.texImage2D( gl.TEXTURE_2D, 0, gl.RGBA, 16, 16, 0, gl.RGBA, gl.UNSIGNED_BYTE, null ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST ); + + shader = { + + vertexShader: [ + + "uniform lowp int renderType;", + + "uniform vec3 screenPosition;", + "uniform vec2 scale;", + "uniform float rotation;", + + "uniform sampler2D occlusionMap;", + + "attribute vec2 position;", + "attribute vec2 uv;", + + "varying vec2 vUV;", + "varying float vVisibility;", + + "void main() {", + + "vUV = uv;", + + "vec2 pos = position;", + + "if ( renderType == 2 ) {", + + "vec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );", + + "vVisibility = visibility.r / 9.0;", + "vVisibility *= 1.0 - visibility.g / 9.0;", + "vVisibility *= visibility.b / 9.0;", + "vVisibility *= 1.0 - visibility.a / 9.0;", + + "pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;", + "pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;", + + "}", + + "gl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );", + + "}" + + ].join( "\n" ), + + fragmentShader: [ + + "uniform lowp int renderType;", + + "uniform sampler2D map;", + "uniform float opacity;", + "uniform vec3 color;", + + "varying vec2 vUV;", + "varying float vVisibility;", + + "void main() {", + + // pink square + + "if ( renderType == 0 ) {", + + "gl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );", + + // restore + + "} else if ( renderType == 1 ) {", + + "gl_FragColor = texture2D( map, vUV );", + + // flare + + "} else {", + + "vec4 texture = texture2D( map, vUV );", + "texture.a *= opacity * vVisibility;", + "gl_FragColor = texture;", + "gl_FragColor.rgb *= color;", + + "}", + + "}" + + ].join( "\n" ) + + }; + + program = createProgram( shader ); + + attributes = { + vertex: gl.getAttribLocation ( program, "position" ), + uv: gl.getAttribLocation ( program, "uv" ) + }; + + uniforms = { + renderType: gl.getUniformLocation( program, "renderType" ), + map: gl.getUniformLocation( program, "map" ), + occlusionMap: gl.getUniformLocation( program, "occlusionMap" ), + opacity: gl.getUniformLocation( program, "opacity" ), + color: gl.getUniformLocation( program, "color" ), + scale: gl.getUniformLocation( program, "scale" ), + rotation: gl.getUniformLocation( program, "rotation" ), + screenPosition: gl.getUniformLocation( program, "screenPosition" ) + }; + + } + + /* + * Render lens flares + * Method: renders 16x16 0xff00ff-colored points scattered over the light source area, + * reads these back and calculates occlusion. + */ + + this.render = function ( scene, camera, viewport ) { + + if ( flares.length === 0 ) return; + + var tempPosition = new Vector3(); + + var invAspect = viewport.w / viewport.z, + halfViewportWidth = viewport.z * 0.5, + halfViewportHeight = viewport.w * 0.5; + + var size = 16 / viewport.w, + scale = new Vector2( size * invAspect, size ); + + var screenPosition = new Vector3( 1, 1, 0 ), + screenPositionPixels = new Vector2( 1, 1 ); + + var validArea = new Box2(); + + validArea.min.set( viewport.x, viewport.y ); + validArea.max.set( viewport.x + ( viewport.z - 16 ), viewport.y + ( viewport.w - 16 ) ); + + if ( program === undefined ) { + + init(); + + } + + gl.useProgram( program ); + + state.initAttributes(); + state.enableAttribute( attributes.vertex ); + state.enableAttribute( attributes.uv ); + state.disableUnusedAttributes(); + + // loop through all lens flares to update their occlusion and positions + // setup gl and common used attribs/uniforms + + gl.uniform1i( uniforms.occlusionMap, 0 ); + gl.uniform1i( uniforms.map, 1 ); + + gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer ); + gl.vertexAttribPointer( attributes.vertex, 2, gl.FLOAT, false, 2 * 8, 0 ); + gl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 ); + + gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer ); + + state.disable( gl.CULL_FACE ); + state.buffers.depth.setMask( false ); + + for ( var i = 0, l = flares.length; i < l; i ++ ) { + + size = 16 / viewport.w; + scale.set( size * invAspect, size ); + + // calc object screen position + + var flare = flares[ i ]; + + tempPosition.set( flare.matrixWorld.elements[ 12 ], flare.matrixWorld.elements[ 13 ], flare.matrixWorld.elements[ 14 ] ); + + tempPosition.applyMatrix4( camera.matrixWorldInverse ); + tempPosition.applyMatrix4( camera.projectionMatrix ); + + // setup arrays for gl programs + + screenPosition.copy( tempPosition ); + + // horizontal and vertical coordinate of the lower left corner of the pixels to copy + + screenPositionPixels.x = viewport.x + ( screenPosition.x * halfViewportWidth ) + halfViewportWidth - 8; + screenPositionPixels.y = viewport.y + ( screenPosition.y * halfViewportHeight ) + halfViewportHeight - 8; + + // screen cull + + if ( validArea.containsPoint( screenPositionPixels ) === true ) { + + // save current RGB to temp texture + + state.activeTexture( gl.TEXTURE0 ); + state.bindTexture( gl.TEXTURE_2D, null ); + state.activeTexture( gl.TEXTURE1 ); + state.bindTexture( gl.TEXTURE_2D, tempTexture ); + gl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGB, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 ); + + + // render pink quad + + gl.uniform1i( uniforms.renderType, 0 ); + gl.uniform2f( uniforms.scale, scale.x, scale.y ); + gl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z ); + + state.disable( gl.BLEND ); + state.enable( gl.DEPTH_TEST ); + + gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 ); + + + // copy result to occlusionMap + + state.activeTexture( gl.TEXTURE0 ); + state.bindTexture( gl.TEXTURE_2D, occlusionTexture ); + gl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGBA, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 ); + + + // restore graphics + + gl.uniform1i( uniforms.renderType, 1 ); + state.disable( gl.DEPTH_TEST ); + + state.activeTexture( gl.TEXTURE1 ); + state.bindTexture( gl.TEXTURE_2D, tempTexture ); + gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 ); + + + // update object positions + + flare.positionScreen.copy( screenPosition ); + + if ( flare.customUpdateCallback ) { + + flare.customUpdateCallback( flare ); + + } else { + + flare.updateLensFlares(); + + } + + // render flares + + gl.uniform1i( uniforms.renderType, 2 ); + state.enable( gl.BLEND ); + + for ( var j = 0, jl = flare.lensFlares.length; j < jl; j ++ ) { + + var sprite = flare.lensFlares[ j ]; + + if ( sprite.opacity > 0.001 && sprite.scale > 0.001 ) { + + screenPosition.x = sprite.x; + screenPosition.y = sprite.y; + screenPosition.z = sprite.z; + + size = sprite.size * sprite.scale / viewport.w; + + scale.x = size * invAspect; + scale.y = size; + + gl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z ); + gl.uniform2f( uniforms.scale, scale.x, scale.y ); + gl.uniform1f( uniforms.rotation, sprite.rotation ); + + gl.uniform1f( uniforms.opacity, sprite.opacity ); + gl.uniform3f( uniforms.color, sprite.color.r, sprite.color.g, sprite.color.b ); + + state.setBlending( sprite.blending, sprite.blendEquation, sprite.blendSrc, sprite.blendDst ); + renderer.setTexture2D( sprite.texture, 1 ); + + gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 ); + + } + + } + + } + + } + + // restore gl + + state.enable( gl.CULL_FACE ); + state.enable( gl.DEPTH_TEST ); + state.buffers.depth.setMask( true ); + + renderer.resetGLState(); + + }; + + function createProgram( shader ) { + + var program = gl.createProgram(); + + var fragmentShader = gl.createShader( gl.FRAGMENT_SHADER ); + var vertexShader = gl.createShader( gl.VERTEX_SHADER ); + + var prefix = "precision " + renderer.getPrecision() + " float;\n"; + + gl.shaderSource( fragmentShader, prefix + shader.fragmentShader ); + gl.shaderSource( vertexShader, prefix + shader.vertexShader ); + + gl.compileShader( fragmentShader ); + gl.compileShader( vertexShader ); + + gl.attachShader( program, fragmentShader ); + gl.attachShader( program, vertexShader ); + + gl.linkProgram( program ); + + return program; + + } + + } + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + */ + + function SpritePlugin( renderer, sprites ) { + + var gl = renderer.context; + var state = renderer.state; + + var vertexBuffer, elementBuffer; + var program, attributes, uniforms; + + var texture; + + // decompose matrixWorld + + var spritePosition = new Vector3(); + var spriteRotation = new Quaternion(); + var spriteScale = new Vector3(); + + function init() { + + var vertices = new Float32Array( [ + - 0.5, - 0.5, 0, 0, + 0.5, - 0.5, 1, 0, + 0.5, 0.5, 1, 1, + - 0.5, 0.5, 0, 1 + ] ); + + var faces = new Uint16Array( [ + 0, 1, 2, + 0, 2, 3 + ] ); + + vertexBuffer = gl.createBuffer(); + elementBuffer = gl.createBuffer(); + + gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer ); + gl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW ); + + gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer ); + gl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW ); + + program = createProgram(); + + attributes = { + position: gl.getAttribLocation ( program, 'position' ), + uv: gl.getAttribLocation ( program, 'uv' ) + }; + + uniforms = { + uvOffset: gl.getUniformLocation( program, 'uvOffset' ), + uvScale: gl.getUniformLocation( program, 'uvScale' ), + + rotation: gl.getUniformLocation( program, 'rotation' ), + scale: gl.getUniformLocation( program, 'scale' ), + + color: gl.getUniformLocation( program, 'color' ), + map: gl.getUniformLocation( program, 'map' ), + opacity: gl.getUniformLocation( program, 'opacity' ), + + modelViewMatrix: gl.getUniformLocation( program, 'modelViewMatrix' ), + projectionMatrix: gl.getUniformLocation( program, 'projectionMatrix' ), + + fogType: gl.getUniformLocation( program, 'fogType' ), + fogDensity: gl.getUniformLocation( program, 'fogDensity' ), + fogNear: gl.getUniformLocation( program, 'fogNear' ), + fogFar: gl.getUniformLocation( program, 'fogFar' ), + fogColor: gl.getUniformLocation( program, 'fogColor' ), + + alphaTest: gl.getUniformLocation( program, 'alphaTest' ) + }; + + var canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + canvas.width = 8; + canvas.height = 8; + + var context = canvas.getContext( '2d' ); + context.fillStyle = 'white'; + context.fillRect( 0, 0, 8, 8 ); + + texture = new Texture( canvas ); + texture.needsUpdate = true; + + } + + this.render = function ( scene, camera ) { + + if ( sprites.length === 0 ) return; + + // setup gl + + if ( program === undefined ) { + + init(); + + } + + gl.useProgram( program ); + + state.initAttributes(); + state.enableAttribute( attributes.position ); + state.enableAttribute( attributes.uv ); + state.disableUnusedAttributes(); + + state.disable( gl.CULL_FACE ); + state.enable( gl.BLEND ); + + gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer ); + gl.vertexAttribPointer( attributes.position, 2, gl.FLOAT, false, 2 * 8, 0 ); + gl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 ); + + gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer ); + + gl.uniformMatrix4fv( uniforms.projectionMatrix, false, camera.projectionMatrix.elements ); + + state.activeTexture( gl.TEXTURE0 ); + gl.uniform1i( uniforms.map, 0 ); + + var oldFogType = 0; + var sceneFogType = 0; + var fog = scene.fog; + + if ( fog ) { + + gl.uniform3f( uniforms.fogColor, fog.color.r, fog.color.g, fog.color.b ); + + if ( fog.isFog ) { + + gl.uniform1f( uniforms.fogNear, fog.near ); + gl.uniform1f( uniforms.fogFar, fog.far ); + + gl.uniform1i( uniforms.fogType, 1 ); + oldFogType = 1; + sceneFogType = 1; + + } else if ( fog.isFogExp2 ) { + + gl.uniform1f( uniforms.fogDensity, fog.density ); + + gl.uniform1i( uniforms.fogType, 2 ); + oldFogType = 2; + sceneFogType = 2; + + } + + } else { + + gl.uniform1i( uniforms.fogType, 0 ); + oldFogType = 0; + sceneFogType = 0; + + } + + + // update positions and sort + + for ( var i = 0, l = sprites.length; i < l; i ++ ) { + + var sprite = sprites[ i ]; + + sprite.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, sprite.matrixWorld ); + sprite.z = - sprite.modelViewMatrix.elements[ 14 ]; + + } + + sprites.sort( painterSortStable ); + + // render all sprites + + var scale = []; + + for ( var i = 0, l = sprites.length; i < l; i ++ ) { + + var sprite = sprites[ i ]; + var material = sprite.material; + + if ( material.visible === false ) continue; + + gl.uniform1f( uniforms.alphaTest, material.alphaTest ); + gl.uniformMatrix4fv( uniforms.modelViewMatrix, false, sprite.modelViewMatrix.elements ); + + sprite.matrixWorld.decompose( spritePosition, spriteRotation, spriteScale ); + + scale[ 0 ] = spriteScale.x; + scale[ 1 ] = spriteScale.y; + + var fogType = 0; + + if ( scene.fog && material.fog ) { + + fogType = sceneFogType; + + } + + if ( oldFogType !== fogType ) { + + gl.uniform1i( uniforms.fogType, fogType ); + oldFogType = fogType; + + } + + if ( material.map !== null ) { + + gl.uniform2f( uniforms.uvOffset, material.map.offset.x, material.map.offset.y ); + gl.uniform2f( uniforms.uvScale, material.map.repeat.x, material.map.repeat.y ); + + } else { + + gl.uniform2f( uniforms.uvOffset, 0, 0 ); + gl.uniform2f( uniforms.uvScale, 1, 1 ); + + } + + gl.uniform1f( uniforms.opacity, material.opacity ); + gl.uniform3f( uniforms.color, material.color.r, material.color.g, material.color.b ); + + gl.uniform1f( uniforms.rotation, material.rotation ); + gl.uniform2fv( uniforms.scale, scale ); + + state.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst ); + state.buffers.depth.setTest( material.depthTest ); + state.buffers.depth.setMask( material.depthWrite ); + + if ( material.map ) { + + renderer.setTexture2D( material.map, 0 ); + + } else { + + renderer.setTexture2D( texture, 0 ); + + } + + gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 ); + + } + + // restore gl + + state.enable( gl.CULL_FACE ); + + renderer.resetGLState(); + + }; + + function createProgram() { + + var program = gl.createProgram(); + + var vertexShader = gl.createShader( gl.VERTEX_SHADER ); + var fragmentShader = gl.createShader( gl.FRAGMENT_SHADER ); + + gl.shaderSource( vertexShader, [ + + 'precision ' + renderer.getPrecision() + ' float;', + + 'uniform mat4 modelViewMatrix;', + 'uniform mat4 projectionMatrix;', + 'uniform float rotation;', + 'uniform vec2 scale;', + 'uniform vec2 uvOffset;', + 'uniform vec2 uvScale;', + + 'attribute vec2 position;', + 'attribute vec2 uv;', + + 'varying vec2 vUV;', + + 'void main() {', + + 'vUV = uvOffset + uv * uvScale;', + + 'vec2 alignedPosition = position * scale;', + + 'vec2 rotatedPosition;', + 'rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;', + 'rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;', + + 'vec4 finalPosition;', + + 'finalPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );', + 'finalPosition.xy += rotatedPosition;', + 'finalPosition = projectionMatrix * finalPosition;', + + 'gl_Position = finalPosition;', + + '}' + + ].join( '\n' ) ); + + gl.shaderSource( fragmentShader, [ + + 'precision ' + renderer.getPrecision() + ' float;', + + 'uniform vec3 color;', + 'uniform sampler2D map;', + 'uniform float opacity;', + + 'uniform int fogType;', + 'uniform vec3 fogColor;', + 'uniform float fogDensity;', + 'uniform float fogNear;', + 'uniform float fogFar;', + 'uniform float alphaTest;', + + 'varying vec2 vUV;', + + 'void main() {', + + 'vec4 texture = texture2D( map, vUV );', + + 'if ( texture.a < alphaTest ) discard;', + + 'gl_FragColor = vec4( color * texture.xyz, texture.a * opacity );', + + 'if ( fogType > 0 ) {', + + 'float depth = gl_FragCoord.z / gl_FragCoord.w;', + 'float fogFactor = 0.0;', + + 'if ( fogType == 1 ) {', + + 'fogFactor = smoothstep( fogNear, fogFar, depth );', + + '} else {', + + 'const float LOG2 = 1.442695;', + 'fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );', + 'fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );', + + '}', + + 'gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );', + + '}', + + '}' + + ].join( '\n' ) ); + + gl.compileShader( vertexShader ); + gl.compileShader( fragmentShader ); + + gl.attachShader( program, vertexShader ); + gl.attachShader( program, fragmentShader ); + + gl.linkProgram( program ); + + return program; + + } + + function painterSortStable( a, b ) { + + if ( a.renderOrder !== b.renderOrder ) { + + return a.renderOrder - b.renderOrder; + + } else if ( a.z !== b.z ) { + + return b.z - a.z; + + } else { + + return b.id - a.id; + + } + + } + + } + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + var materialId = 0; + + function Material() { + + Object.defineProperty( this, 'id', { value: materialId ++ } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'Material'; + + this.fog = true; + this.lights = true; + + this.blending = NormalBlending; + this.side = FrontSide; + this.shading = SmoothShading; // THREE.FlatShading, THREE.SmoothShading + this.vertexColors = NoColors; // THREE.NoColors, THREE.VertexColors, THREE.FaceColors + + this.opacity = 1; + this.transparent = false; + + this.blendSrc = SrcAlphaFactor; + this.blendDst = OneMinusSrcAlphaFactor; + this.blendEquation = AddEquation; + this.blendSrcAlpha = null; + this.blendDstAlpha = null; + this.blendEquationAlpha = null; + + this.depthFunc = LessEqualDepth; + this.depthTest = true; + this.depthWrite = true; + + this.clippingPlanes = null; + this.clipIntersection = false; + this.clipShadows = false; + + this.colorWrite = true; + + this.precision = null; // override the renderer's default precision for this material + + this.polygonOffset = false; + this.polygonOffsetFactor = 0; + this.polygonOffsetUnits = 0; + + this.dithering = false; + + this.alphaTest = 0; + this.premultipliedAlpha = false; + + this.overdraw = 0; // Overdrawn pixels (typically between 0 and 1) for fixing antialiasing gaps in CanvasRenderer + + this.visible = true; + + this.needsUpdate = true; + + } + + Object.assign( Material.prototype, EventDispatcher.prototype, { + + isMaterial: true, + + setValues: function ( values ) { + + if ( values === undefined ) return; + + for ( var key in values ) { + + var newValue = values[ key ]; + + if ( newValue === undefined ) { + + console.warn( "THREE.Material: '" + key + "' parameter is undefined." ); + continue; + + } + + var currentValue = this[ key ]; + + if ( currentValue === undefined ) { + + console.warn( "THREE." + this.type + ": '" + key + "' is not a property of this material." ); + continue; + + } + + if ( currentValue && currentValue.isColor ) { + + currentValue.set( newValue ); + + } else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) { + + currentValue.copy( newValue ); + + } else if ( key === 'overdraw' ) { + + // ensure overdraw is backwards-compatible with legacy boolean type + this[ key ] = Number( newValue ); + + } else { + + this[ key ] = newValue; + + } + + } + + }, + + toJSON: function ( meta ) { + + var isRoot = meta === undefined; + + if ( isRoot ) { + + meta = { + textures: {}, + images: {} + }; + + } + + var data = { + metadata: { + version: 4.5, + type: 'Material', + generator: 'Material.toJSON' + } + }; + + // standard Material serialization + data.uuid = this.uuid; + data.type = this.type; + + if ( this.name !== '' ) data.name = this.name; + + if ( this.color && this.color.isColor ) data.color = this.color.getHex(); + + if ( this.roughness !== undefined ) data.roughness = this.roughness; + if ( this.metalness !== undefined ) data.metalness = this.metalness; + + if ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex(); + if ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex(); + if ( this.shininess !== undefined ) data.shininess = this.shininess; + if ( this.clearCoat !== undefined ) data.clearCoat = this.clearCoat; + if ( this.clearCoatRoughness !== undefined ) data.clearCoatRoughness = this.clearCoatRoughness; + + if ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid; + if ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid; + if ( this.lightMap && this.lightMap.isTexture ) data.lightMap = this.lightMap.toJSON( meta ).uuid; + if ( this.bumpMap && this.bumpMap.isTexture ) { + + data.bumpMap = this.bumpMap.toJSON( meta ).uuid; + data.bumpScale = this.bumpScale; + + } + if ( this.normalMap && this.normalMap.isTexture ) { + + data.normalMap = this.normalMap.toJSON( meta ).uuid; + data.normalScale = this.normalScale.toArray(); + + } + if ( this.displacementMap && this.displacementMap.isTexture ) { + + data.displacementMap = this.displacementMap.toJSON( meta ).uuid; + data.displacementScale = this.displacementScale; + data.displacementBias = this.displacementBias; + + } + if ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid; + if ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid; + + if ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid; + if ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid; + + if ( this.envMap && this.envMap.isTexture ) { + + data.envMap = this.envMap.toJSON( meta ).uuid; + data.reflectivity = this.reflectivity; // Scale behind envMap + + } + + if ( this.gradientMap && this.gradientMap.isTexture ) { + + data.gradientMap = this.gradientMap.toJSON( meta ).uuid; + + } + + if ( this.size !== undefined ) data.size = this.size; + if ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation; + + if ( this.blending !== NormalBlending ) data.blending = this.blending; + if ( this.shading !== SmoothShading ) data.shading = this.shading; + if ( this.side !== FrontSide ) data.side = this.side; + if ( this.vertexColors !== NoColors ) data.vertexColors = this.vertexColors; + + if ( this.opacity < 1 ) data.opacity = this.opacity; + if ( this.transparent === true ) data.transparent = this.transparent; + + data.depthFunc = this.depthFunc; + data.depthTest = this.depthTest; + data.depthWrite = this.depthWrite; + + if ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest; + if ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha; + if ( this.wireframe === true ) data.wireframe = this.wireframe; + if ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth; + if ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap; + if ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin; + + data.skinning = this.skinning; + data.morphTargets = this.morphTargets; + + data.dithering = this.dithering; + + // TODO: Copied from Object3D.toJSON + + function extractFromCache( cache ) { + + var values = []; + + for ( var key in cache ) { + + var data = cache[ key ]; + delete data.metadata; + values.push( data ); + + } + + return values; + + } + + if ( isRoot ) { + + var textures = extractFromCache( meta.textures ); + var images = extractFromCache( meta.images ); + + if ( textures.length > 0 ) data.textures = textures; + if ( images.length > 0 ) data.images = images; + + } + + return data; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.name = source.name; + + this.fog = source.fog; + this.lights = source.lights; + + this.blending = source.blending; + this.side = source.side; + this.shading = source.shading; + this.vertexColors = source.vertexColors; + + this.opacity = source.opacity; + this.transparent = source.transparent; + + this.blendSrc = source.blendSrc; + this.blendDst = source.blendDst; + this.blendEquation = source.blendEquation; + this.blendSrcAlpha = source.blendSrcAlpha; + this.blendDstAlpha = source.blendDstAlpha; + this.blendEquationAlpha = source.blendEquationAlpha; + + this.depthFunc = source.depthFunc; + this.depthTest = source.depthTest; + this.depthWrite = source.depthWrite; + + this.colorWrite = source.colorWrite; + + this.precision = source.precision; + + this.polygonOffset = source.polygonOffset; + this.polygonOffsetFactor = source.polygonOffsetFactor; + this.polygonOffsetUnits = source.polygonOffsetUnits; + + this.dithering = source.dithering; + + this.alphaTest = source.alphaTest; + + this.premultipliedAlpha = source.premultipliedAlpha; + + this.overdraw = source.overdraw; + + this.visible = source.visible; + this.clipShadows = source.clipShadows; + this.clipIntersection = source.clipIntersection; + + var srcPlanes = source.clippingPlanes, + dstPlanes = null; + + if ( srcPlanes !== null ) { + + var n = srcPlanes.length; + dstPlanes = new Array( n ); + + for ( var i = 0; i !== n; ++ i ) + dstPlanes[ i ] = srcPlanes[ i ].clone(); + + } + + this.clippingPlanes = dstPlanes; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * defines: { "label" : "value" }, + * uniforms: { "parameter1": { value: 1.0 }, "parameter2": { value2: 2 } }, + * + * fragmentShader: <string>, + * vertexShader: <string>, + * + * wireframe: <boolean>, + * wireframeLinewidth: <float>, + * + * lights: <bool>, + * + * skinning: <bool>, + * morphTargets: <bool>, + * morphNormals: <bool> + * } + */ + + function ShaderMaterial( parameters ) { + + Material.call( this ); + + this.type = 'ShaderMaterial'; + + this.defines = {}; + this.uniforms = {}; + + this.vertexShader = 'void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}'; + this.fragmentShader = 'void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}'; + + this.linewidth = 1; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.fog = false; // set to use scene fog + this.lights = false; // set to use scene lights + this.clipping = false; // set to use user-defined clipping planes + + this.skinning = false; // set to use skinning attribute streams + this.morphTargets = false; // set to use morph targets + this.morphNormals = false; // set to use morph normals + + this.extensions = { + derivatives: false, // set to use derivatives + fragDepth: false, // set to use fragment depth values + drawBuffers: false, // set to use draw buffers + shaderTextureLOD: false // set to use shader texture LOD + }; + + // When rendered geometry doesn't include these attributes but the material does, + // use these default values in WebGL. This avoids errors when buffer data is missing. + this.defaultAttributeValues = { + 'color': [ 1, 1, 1 ], + 'uv': [ 0, 0 ], + 'uv2': [ 0, 0 ] + }; + + this.index0AttributeName = undefined; + + if ( parameters !== undefined ) { + + if ( parameters.attributes !== undefined ) { + + console.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' ); + + } + + this.setValues( parameters ); + + } + + } + + ShaderMaterial.prototype = Object.create( Material.prototype ); + ShaderMaterial.prototype.constructor = ShaderMaterial; + + ShaderMaterial.prototype.isShaderMaterial = true; + + ShaderMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.fragmentShader = source.fragmentShader; + this.vertexShader = source.vertexShader; + + this.uniforms = UniformsUtils.clone( source.uniforms ); + + this.defines = source.defines; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + this.lights = source.lights; + this.clipping = source.clipping; + + this.skinning = source.skinning; + + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + this.extensions = source.extensions; + + return this; + + }; + + ShaderMaterial.prototype.toJSON = function ( meta ) { + + var data = Material.prototype.toJSON.call( this, meta ); + + data.uniforms = this.uniforms; + data.vertexShader = this.vertexShader; + data.fragmentShader = this.fragmentShader; + + return data; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author bhouston / https://clara.io + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * + * opacity: <float>, + * + * map: new THREE.Texture( <Image> ), + * + * alphaMap: new THREE.Texture( <Image> ), + * + * displacementMap: new THREE.Texture( <Image> ), + * displacementScale: <float>, + * displacementBias: <float>, + * + * wireframe: <boolean>, + * wireframeLinewidth: <float> + * } + */ + + function MeshDepthMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshDepthMaterial'; + + this.depthPacking = BasicDepthPacking; + + this.skinning = false; + this.morphTargets = false; + + this.map = null; + + this.alphaMap = null; + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.fog = false; + this.lights = false; + + this.setValues( parameters ); + + } + + MeshDepthMaterial.prototype = Object.create( Material.prototype ); + MeshDepthMaterial.prototype.constructor = MeshDepthMaterial; + + MeshDepthMaterial.prototype.isMeshDepthMaterial = true; + + MeshDepthMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.depthPacking = source.depthPacking; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + + this.map = source.map; + + this.alphaMap = source.alphaMap; + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + return this; + + }; + + /** + * @author bhouston / http://clara.io + * @author WestLangley / http://github.com/WestLangley + */ + + function Box3( min, max ) { + + this.min = ( min !== undefined ) ? min : new Vector3( + Infinity, + Infinity, + Infinity ); + this.max = ( max !== undefined ) ? max : new Vector3( - Infinity, - Infinity, - Infinity ); + + } + + Object.assign( Box3.prototype, { + + isBox3: true, + + set: function ( min, max ) { + + this.min.copy( min ); + this.max.copy( max ); + + return this; + + }, + + setFromArray: function ( array ) { + + var minX = + Infinity; + var minY = + Infinity; + var minZ = + Infinity; + + var maxX = - Infinity; + var maxY = - Infinity; + var maxZ = - Infinity; + + for ( var i = 0, l = array.length; i < l; i += 3 ) { + + var x = array[ i ]; + var y = array[ i + 1 ]; + var z = array[ i + 2 ]; + + if ( x < minX ) minX = x; + if ( y < minY ) minY = y; + if ( z < minZ ) minZ = z; + + if ( x > maxX ) maxX = x; + if ( y > maxY ) maxY = y; + if ( z > maxZ ) maxZ = z; + + } + + this.min.set( minX, minY, minZ ); + this.max.set( maxX, maxY, maxZ ); + + return this; + + }, + + setFromBufferAttribute: function ( attribute ) { + + var minX = + Infinity; + var minY = + Infinity; + var minZ = + Infinity; + + var maxX = - Infinity; + var maxY = - Infinity; + var maxZ = - Infinity; + + for ( var i = 0, l = attribute.count; i < l; i ++ ) { + + var x = attribute.getX( i ); + var y = attribute.getY( i ); + var z = attribute.getZ( i ); + + if ( x < minX ) minX = x; + if ( y < minY ) minY = y; + if ( z < minZ ) minZ = z; + + if ( x > maxX ) maxX = x; + if ( y > maxY ) maxY = y; + if ( z > maxZ ) maxZ = z; + + } + + this.min.set( minX, minY, minZ ); + this.max.set( maxX, maxY, maxZ ); + + return this; + + }, + + setFromPoints: function ( points ) { + + this.makeEmpty(); + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + this.expandByPoint( points[ i ] ); + + } + + return this; + + }, + + setFromCenterAndSize: function () { + + var v1 = new Vector3(); + + return function setFromCenterAndSize( center, size ) { + + var halfSize = v1.copy( size ).multiplyScalar( 0.5 ); + + this.min.copy( center ).sub( halfSize ); + this.max.copy( center ).add( halfSize ); + + return this; + + }; + + }(), + + setFromObject: function ( object ) { + + this.makeEmpty(); + + return this.expandByObject( object ); + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( box ) { + + this.min.copy( box.min ); + this.max.copy( box.max ); + + return this; + + }, + + makeEmpty: function () { + + this.min.x = this.min.y = this.min.z = + Infinity; + this.max.x = this.max.y = this.max.z = - Infinity; + + return this; + + }, + + isEmpty: function () { + + // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes + + return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z ); + + }, + + getCenter: function ( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + return this.isEmpty() ? result.set( 0, 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 ); + + }, + + getSize: function ( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + return this.isEmpty() ? result.set( 0, 0, 0 ) : result.subVectors( this.max, this.min ); + + }, + + expandByPoint: function ( point ) { + + this.min.min( point ); + this.max.max( point ); + + return this; + + }, + + expandByVector: function ( vector ) { + + this.min.sub( vector ); + this.max.add( vector ); + + return this; + + }, + + expandByScalar: function ( scalar ) { + + this.min.addScalar( - scalar ); + this.max.addScalar( scalar ); + + return this; + + }, + + expandByObject: function () { + + // Computes the world-axis-aligned bounding box of an object (including its children), + // accounting for both the object's, and children's, world transforms + + var v1 = new Vector3(); + + return function expandByObject( object ) { + + var scope = this; + + object.updateMatrixWorld( true ); + + object.traverse( function ( node ) { + + var i, l; + + var geometry = node.geometry; + + if ( geometry !== undefined ) { + + if ( geometry.isGeometry ) { + + var vertices = geometry.vertices; + + for ( i = 0, l = vertices.length; i < l; i ++ ) { + + v1.copy( vertices[ i ] ); + v1.applyMatrix4( node.matrixWorld ); + + scope.expandByPoint( v1 ); + + } + + } else if ( geometry.isBufferGeometry ) { + + var attribute = geometry.attributes.position; + + if ( attribute !== undefined ) { + + for ( i = 0, l = attribute.count; i < l; i ++ ) { + + v1.fromBufferAttribute( attribute, i ).applyMatrix4( node.matrixWorld ); + + scope.expandByPoint( v1 ); + + } + + } + + } + + } + + } ); + + return this; + + }; + + }(), + + containsPoint: function ( point ) { + + return point.x < this.min.x || point.x > this.max.x || + point.y < this.min.y || point.y > this.max.y || + point.z < this.min.z || point.z > this.max.z ? false : true; + + }, + + containsBox: function ( box ) { + + return this.min.x <= box.min.x && box.max.x <= this.max.x && + this.min.y <= box.min.y && box.max.y <= this.max.y && + this.min.z <= box.min.z && box.max.z <= this.max.z; + + }, + + getParameter: function ( point, optionalTarget ) { + + // This can potentially have a divide by zero if the box + // has a size dimension of 0. + + var result = optionalTarget || new Vector3(); + + return result.set( + ( point.x - this.min.x ) / ( this.max.x - this.min.x ), + ( point.y - this.min.y ) / ( this.max.y - this.min.y ), + ( point.z - this.min.z ) / ( this.max.z - this.min.z ) + ); + + }, + + intersectsBox: function ( box ) { + + // using 6 splitting planes to rule out intersections. + return box.max.x < this.min.x || box.min.x > this.max.x || + box.max.y < this.min.y || box.min.y > this.max.y || + box.max.z < this.min.z || box.min.z > this.max.z ? false : true; + + }, + + intersectsSphere: ( function () { + + var closestPoint = new Vector3(); + + return function intersectsSphere( sphere ) { + + // Find the point on the AABB closest to the sphere center. + this.clampPoint( sphere.center, closestPoint ); + + // If that point is inside the sphere, the AABB and sphere intersect. + return closestPoint.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius ); + + }; + + } )(), + + intersectsPlane: function ( plane ) { + + // We compute the minimum and maximum dot product values. If those values + // are on the same side (back or front) of the plane, then there is no intersection. + + var min, max; + + if ( plane.normal.x > 0 ) { + + min = plane.normal.x * this.min.x; + max = plane.normal.x * this.max.x; + + } else { + + min = plane.normal.x * this.max.x; + max = plane.normal.x * this.min.x; + + } + + if ( plane.normal.y > 0 ) { + + min += plane.normal.y * this.min.y; + max += plane.normal.y * this.max.y; + + } else { + + min += plane.normal.y * this.max.y; + max += plane.normal.y * this.min.y; + + } + + if ( plane.normal.z > 0 ) { + + min += plane.normal.z * this.min.z; + max += plane.normal.z * this.max.z; + + } else { + + min += plane.normal.z * this.max.z; + max += plane.normal.z * this.min.z; + + } + + return ( min <= plane.constant && max >= plane.constant ); + + }, + + clampPoint: function ( point, optionalTarget ) { + + var result = optionalTarget || new Vector3(); + return result.copy( point ).clamp( this.min, this.max ); + + }, + + distanceToPoint: function () { + + var v1 = new Vector3(); + + return function distanceToPoint( point ) { + + var clampedPoint = v1.copy( point ).clamp( this.min, this.max ); + return clampedPoint.sub( point ).length(); + + }; + + }(), + + getBoundingSphere: function () { + + var v1 = new Vector3(); + + return function getBoundingSphere( optionalTarget ) { + + var result = optionalTarget || new Sphere(); + + this.getCenter( result.center ); + + result.radius = this.getSize( v1 ).length() * 0.5; + + return result; + + }; + + }(), + + intersect: function ( box ) { + + this.min.max( box.min ); + this.max.min( box.max ); + + // ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values. + if( this.isEmpty() ) this.makeEmpty(); + + return this; + + }, + + union: function ( box ) { + + this.min.min( box.min ); + this.max.max( box.max ); + + return this; + + }, + + applyMatrix4: function () { + + var points = [ + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3() + ]; + + return function applyMatrix4( matrix ) { + + // transform of empty box is an empty box. + if( this.isEmpty() ) return this; + + // NOTE: I am using a binary pattern to specify all 2^3 combinations below + points[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000 + points[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001 + points[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010 + points[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011 + points[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100 + points[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101 + points[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110 + points[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111 + + this.setFromPoints( points ); + + return this; + + }; + + }(), + + translate: function ( offset ) { + + this.min.add( offset ); + this.max.add( offset ); + + return this; + + }, + + equals: function ( box ) { + + return box.min.equals( this.min ) && box.max.equals( this.max ); + + } + + } ); + + /** + * @author bhouston / http://clara.io + * @author mrdoob / http://mrdoob.com/ + */ + + function Sphere( center, radius ) { + + this.center = ( center !== undefined ) ? center : new Vector3(); + this.radius = ( radius !== undefined ) ? radius : 0; + + } + + Object.assign( Sphere.prototype, { + + set: function ( center, radius ) { + + this.center.copy( center ); + this.radius = radius; + + return this; + + }, + + setFromPoints: function () { + + var box = new Box3(); + + return function setFromPoints( points, optionalCenter ) { + + var center = this.center; + + if ( optionalCenter !== undefined ) { + + center.copy( optionalCenter ); + + } else { + + box.setFromPoints( points ).getCenter( center ); + + } + + var maxRadiusSq = 0; + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) ); + + } + + this.radius = Math.sqrt( maxRadiusSq ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( sphere ) { + + this.center.copy( sphere.center ); + this.radius = sphere.radius; + + return this; + + }, + + empty: function () { + + return ( this.radius <= 0 ); + + }, + + containsPoint: function ( point ) { + + return ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) ); + + }, + + distanceToPoint: function ( point ) { + + return ( point.distanceTo( this.center ) - this.radius ); + + }, + + intersectsSphere: function ( sphere ) { + + var radiusSum = this.radius + sphere.radius; + + return sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum ); + + }, + + intersectsBox: function ( box ) { + + return box.intersectsSphere( this ); + + }, + + intersectsPlane: function ( plane ) { + + // We use the following equation to compute the signed distance from + // the center of the sphere to the plane. + // + // distance = q * n - d + // + // If this distance is greater than the radius of the sphere, + // then there is no intersection. + + return Math.abs( this.center.dot( plane.normal ) - plane.constant ) <= this.radius; + + }, + + clampPoint: function ( point, optionalTarget ) { + + var deltaLengthSq = this.center.distanceToSquared( point ); + + var result = optionalTarget || new Vector3(); + + result.copy( point ); + + if ( deltaLengthSq > ( this.radius * this.radius ) ) { + + result.sub( this.center ).normalize(); + result.multiplyScalar( this.radius ).add( this.center ); + + } + + return result; + + }, + + getBoundingBox: function ( optionalTarget ) { + + var box = optionalTarget || new Box3(); + + box.set( this.center, this.center ); + box.expandByScalar( this.radius ); + + return box; + + }, + + applyMatrix4: function ( matrix ) { + + this.center.applyMatrix4( matrix ); + this.radius = this.radius * matrix.getMaxScaleOnAxis(); + + return this; + + }, + + translate: function ( offset ) { + + this.center.add( offset ); + + return this; + + }, + + equals: function ( sphere ) { + + return sphere.center.equals( this.center ) && ( sphere.radius === this.radius ); + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://clara.io + * @author tschw + */ + + function Matrix3() { + + this.elements = [ + + 1, 0, 0, + 0, 1, 0, + 0, 0, 1 + + ]; + + if ( arguments.length > 0 ) { + + console.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' ); + + } + + } + + Object.assign( Matrix3.prototype, { + + isMatrix3: true, + + set: function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) { + + var te = this.elements; + + te[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31; + te[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32; + te[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33; + + return this; + + }, + + identity: function () { + + this.set( + + 1, 0, 0, + 0, 1, 0, + 0, 0, 1 + + ); + + return this; + + }, + + clone: function () { + + return new this.constructor().fromArray( this.elements ); + + }, + + copy: function ( m ) { + + var te = this.elements; + var me = m.elements; + + te[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; + te[ 3 ] = me[ 3 ]; te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; + te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; te[ 8 ] = me[ 8 ]; + + return this; + + }, + + setFromMatrix4: function ( m ) { + + var me = m.elements; + + this.set( + + me[ 0 ], me[ 4 ], me[ 8 ], + me[ 1 ], me[ 5 ], me[ 9 ], + me[ 2 ], me[ 6 ], me[ 10 ] + + ); + + return this; + + }, + + applyToBufferAttribute: function () { + + var v1 = new Vector3(); + + return function applyToBufferAttribute( attribute ) { + + for ( var i = 0, l = attribute.count; i < l; i ++ ) { + + v1.x = attribute.getX( i ); + v1.y = attribute.getY( i ); + v1.z = attribute.getZ( i ); + + v1.applyMatrix3( this ); + + attribute.setXYZ( i, v1.x, v1.y, v1.z ); + + } + + return attribute; + + }; + + }(), + + multiply: function ( m ) { + + return this.multiplyMatrices( this, m ); + + }, + + premultiply: function ( m ) { + + return this.multiplyMatrices( m, this ); + + }, + + multiplyMatrices: function ( a, b ) { + + var ae = a.elements; + var be = b.elements; + var te = this.elements; + + var a11 = ae[ 0 ], a12 = ae[ 3 ], a13 = ae[ 6 ]; + var a21 = ae[ 1 ], a22 = ae[ 4 ], a23 = ae[ 7 ]; + var a31 = ae[ 2 ], a32 = ae[ 5 ], a33 = ae[ 8 ]; + + var b11 = be[ 0 ], b12 = be[ 3 ], b13 = be[ 6 ]; + var b21 = be[ 1 ], b22 = be[ 4 ], b23 = be[ 7 ]; + var b31 = be[ 2 ], b32 = be[ 5 ], b33 = be[ 8 ]; + + te[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31; + te[ 3 ] = a11 * b12 + a12 * b22 + a13 * b32; + te[ 6 ] = a11 * b13 + a12 * b23 + a13 * b33; + + te[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31; + te[ 4 ] = a21 * b12 + a22 * b22 + a23 * b32; + te[ 7 ] = a21 * b13 + a22 * b23 + a23 * b33; + + te[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31; + te[ 5 ] = a31 * b12 + a32 * b22 + a33 * b32; + te[ 8 ] = a31 * b13 + a32 * b23 + a33 * b33; + + return this; + + }, + + multiplyScalar: function ( s ) { + + var te = this.elements; + + te[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s; + te[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s; + te[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s; + + return this; + + }, + + determinant: function () { + + var te = this.elements; + + var a = te[ 0 ], b = te[ 1 ], c = te[ 2 ], + d = te[ 3 ], e = te[ 4 ], f = te[ 5 ], + g = te[ 6 ], h = te[ 7 ], i = te[ 8 ]; + + return a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g; + + }, + + getInverse: function ( matrix, throwOnDegenerate ) { + + if ( matrix && matrix.isMatrix4 ) { + + console.error( "THREE.Matrix3.getInverse no longer takes a Matrix4 argument." ); + + } + + var me = matrix.elements, + te = this.elements, + + n11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], + n12 = me[ 3 ], n22 = me[ 4 ], n32 = me[ 5 ], + n13 = me[ 6 ], n23 = me[ 7 ], n33 = me[ 8 ], + + t11 = n33 * n22 - n32 * n23, + t12 = n32 * n13 - n33 * n12, + t13 = n23 * n12 - n22 * n13, + + det = n11 * t11 + n21 * t12 + n31 * t13; + + if ( det === 0 ) { + + var msg = "THREE.Matrix3.getInverse(): can't invert matrix, determinant is 0"; + + if ( throwOnDegenerate === true ) { + + throw new Error( msg ); + + } else { + + console.warn( msg ); + + } + + return this.identity(); + + } + + var detInv = 1 / det; + + te[ 0 ] = t11 * detInv; + te[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv; + te[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv; + + te[ 3 ] = t12 * detInv; + te[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv; + te[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv; + + te[ 6 ] = t13 * detInv; + te[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv; + te[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv; + + return this; + + }, + + transpose: function () { + + var tmp, m = this.elements; + + tmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp; + tmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp; + tmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp; + + return this; + + }, + + getNormalMatrix: function ( matrix4 ) { + + return this.setFromMatrix4( matrix4 ).getInverse( this ).transpose(); + + }, + + transposeIntoArray: function ( r ) { + + var m = this.elements; + + r[ 0 ] = m[ 0 ]; + r[ 1 ] = m[ 3 ]; + r[ 2 ] = m[ 6 ]; + r[ 3 ] = m[ 1 ]; + r[ 4 ] = m[ 4 ]; + r[ 5 ] = m[ 7 ]; + r[ 6 ] = m[ 2 ]; + r[ 7 ] = m[ 5 ]; + r[ 8 ] = m[ 8 ]; + + return this; + + }, + + equals: function ( matrix ) { + + var te = this.elements; + var me = matrix.elements; + + for ( var i = 0; i < 9; i ++ ) { + + if ( te[ i ] !== me[ i ] ) return false; + + } + + return true; + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + for ( var i = 0; i < 9; i ++ ) { + + this.elements[ i ] = array[ i + offset ]; + + } + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + var te = this.elements; + + array[ offset ] = te[ 0 ]; + array[ offset + 1 ] = te[ 1 ]; + array[ offset + 2 ] = te[ 2 ]; + + array[ offset + 3 ] = te[ 3 ]; + array[ offset + 4 ] = te[ 4 ]; + array[ offset + 5 ] = te[ 5 ]; + + array[ offset + 6 ] = te[ 6 ]; + array[ offset + 7 ] = te[ 7 ]; + array[ offset + 8 ] = te[ 8 ]; + + return array; + + } + + } ); + + /** + * @author bhouston / http://clara.io + */ + + function Plane( normal, constant ) { + + this.normal = ( normal !== undefined ) ? normal : new Vector3( 1, 0, 0 ); + this.constant = ( constant !== undefined ) ? constant : 0; + + } + + Object.assign( Plane.prototype, { + + set: function ( normal, constant ) { + + this.normal.copy( normal ); + this.constant = constant; + + return this; + + }, + + setComponents: function ( x, y, z, w ) { + + this.normal.set( x, y, z ); + this.constant = w; + + return this; + + }, + + setFromNormalAndCoplanarPoint: function ( normal, point ) { + + this.normal.copy( normal ); + this.constant = - point.dot( this.normal ); // must be this.normal, not normal, as this.normal is normalized + + return this; + + }, + + setFromCoplanarPoints: function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + + return function setFromCoplanarPoints( a, b, c ) { + + var normal = v1.subVectors( c, b ).cross( v2.subVectors( a, b ) ).normalize(); + + // Q: should an error be thrown if normal is zero (e.g. degenerate plane)? + + this.setFromNormalAndCoplanarPoint( normal, a ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( plane ) { + + this.normal.copy( plane.normal ); + this.constant = plane.constant; + + return this; + + }, + + normalize: function () { + + // Note: will lead to a divide by zero if the plane is invalid. + + var inverseNormalLength = 1.0 / this.normal.length(); + this.normal.multiplyScalar( inverseNormalLength ); + this.constant *= inverseNormalLength; + + return this; + + }, + + negate: function () { + + this.constant *= - 1; + this.normal.negate(); + + return this; + + }, + + distanceToPoint: function ( point ) { + + return this.normal.dot( point ) + this.constant; + + }, + + distanceToSphere: function ( sphere ) { + + return this.distanceToPoint( sphere.center ) - sphere.radius; + + }, + + projectPoint: function ( point, optionalTarget ) { + + return this.orthoPoint( point, optionalTarget ).sub( point ).negate(); + + }, + + orthoPoint: function ( point, optionalTarget ) { + + var perpendicularMagnitude = this.distanceToPoint( point ); + + var result = optionalTarget || new Vector3(); + return result.copy( this.normal ).multiplyScalar( perpendicularMagnitude ); + + }, + + intersectLine: function () { + + var v1 = new Vector3(); + + return function intersectLine( line, optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + var direction = line.delta( v1 ); + + var denominator = this.normal.dot( direction ); + + if ( denominator === 0 ) { + + // line is coplanar, return origin + if ( this.distanceToPoint( line.start ) === 0 ) { + + return result.copy( line.start ); + + } + + // Unsure if this is the correct method to handle this case. + return undefined; + + } + + var t = - ( line.start.dot( this.normal ) + this.constant ) / denominator; + + if ( t < 0 || t > 1 ) { + + return undefined; + + } + + return result.copy( direction ).multiplyScalar( t ).add( line.start ); + + }; + + }(), + + intersectsLine: function ( line ) { + + // Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it. + + var startSign = this.distanceToPoint( line.start ); + var endSign = this.distanceToPoint( line.end ); + + return ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 ); + + }, + + intersectsBox: function ( box ) { + + return box.intersectsPlane( this ); + + }, + + intersectsSphere: function ( sphere ) { + + return sphere.intersectsPlane( this ); + + }, + + coplanarPoint: function ( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + return result.copy( this.normal ).multiplyScalar( - this.constant ); + + }, + + applyMatrix4: function () { + + var v1 = new Vector3(); + var m1 = new Matrix3(); + + return function applyMatrix4( matrix, optionalNormalMatrix ) { + + var referencePoint = this.coplanarPoint( v1 ).applyMatrix4( matrix ); + + // transform normal based on theory here: + // http://www.songho.ca/opengl/gl_normaltransform.html + var normalMatrix = optionalNormalMatrix || m1.getNormalMatrix( matrix ); + var normal = this.normal.applyMatrix3( normalMatrix ).normalize(); + + // recalculate constant (like in setFromNormalAndCoplanarPoint) + this.constant = - referencePoint.dot( normal ); + + return this; + + }; + + }(), + + translate: function ( offset ) { + + this.constant = this.constant - offset.dot( this.normal ); + + return this; + + }, + + equals: function ( plane ) { + + return plane.normal.equals( this.normal ) && ( plane.constant === this.constant ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author bhouston / http://clara.io + */ + + function Frustum( p0, p1, p2, p3, p4, p5 ) { + + this.planes = [ + + ( p0 !== undefined ) ? p0 : new Plane(), + ( p1 !== undefined ) ? p1 : new Plane(), + ( p2 !== undefined ) ? p2 : new Plane(), + ( p3 !== undefined ) ? p3 : new Plane(), + ( p4 !== undefined ) ? p4 : new Plane(), + ( p5 !== undefined ) ? p5 : new Plane() + + ]; + + } + + Object.assign( Frustum.prototype, { + + set: function ( p0, p1, p2, p3, p4, p5 ) { + + var planes = this.planes; + + planes[ 0 ].copy( p0 ); + planes[ 1 ].copy( p1 ); + planes[ 2 ].copy( p2 ); + planes[ 3 ].copy( p3 ); + planes[ 4 ].copy( p4 ); + planes[ 5 ].copy( p5 ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( frustum ) { + + var planes = this.planes; + + for ( var i = 0; i < 6; i ++ ) { + + planes[ i ].copy( frustum.planes[ i ] ); + + } + + return this; + + }, + + setFromMatrix: function ( m ) { + + var planes = this.planes; + var me = m.elements; + var me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ]; + var me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ]; + var me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ]; + var me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ]; + + planes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize(); + planes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize(); + planes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize(); + planes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize(); + planes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize(); + planes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize(); + + return this; + + }, + + intersectsObject: function () { + + var sphere = new Sphere(); + + return function intersectsObject( object ) { + + var geometry = object.geometry; + + if ( geometry.boundingSphere === null ) + geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ) + .applyMatrix4( object.matrixWorld ); + + return this.intersectsSphere( sphere ); + + }; + + }(), + + intersectsSprite: function () { + + var sphere = new Sphere(); + + return function intersectsSprite( sprite ) { + + sphere.center.set( 0, 0, 0 ); + sphere.radius = 0.7071067811865476; + sphere.applyMatrix4( sprite.matrixWorld ); + + return this.intersectsSphere( sphere ); + + }; + + }(), + + intersectsSphere: function ( sphere ) { + + var planes = this.planes; + var center = sphere.center; + var negRadius = - sphere.radius; + + for ( var i = 0; i < 6; i ++ ) { + + var distance = planes[ i ].distanceToPoint( center ); + + if ( distance < negRadius ) { + + return false; + + } + + } + + return true; + + }, + + intersectsBox: function () { + + var p1 = new Vector3(), + p2 = new Vector3(); + + return function intersectsBox( box ) { + + var planes = this.planes; + + for ( var i = 0; i < 6; i ++ ) { + + var plane = planes[ i ]; + + p1.x = plane.normal.x > 0 ? box.min.x : box.max.x; + p2.x = plane.normal.x > 0 ? box.max.x : box.min.x; + p1.y = plane.normal.y > 0 ? box.min.y : box.max.y; + p2.y = plane.normal.y > 0 ? box.max.y : box.min.y; + p1.z = plane.normal.z > 0 ? box.min.z : box.max.z; + p2.z = plane.normal.z > 0 ? box.max.z : box.min.z; + + var d1 = plane.distanceToPoint( p1 ); + var d2 = plane.distanceToPoint( p2 ); + + // if both outside plane, no intersection + + if ( d1 < 0 && d2 < 0 ) { + + return false; + + } + + } + + return true; + + }; + + }(), + + containsPoint: function ( point ) { + + var planes = this.planes; + + for ( var i = 0; i < 6; i ++ ) { + + if ( planes[ i ].distanceToPoint( point ) < 0 ) { + + return false; + + } + + } + + return true; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLShadowMap( _renderer, _lights, _objects, capabilities ) { + + var _gl = _renderer.context, + _state = _renderer.state, + _frustum = new Frustum(), + _projScreenMatrix = new Matrix4(), + + _lightShadows = _lights.shadows, + + _shadowMapSize = new Vector2(), + _maxShadowMapSize = new Vector2( capabilities.maxTextureSize, capabilities.maxTextureSize ), + + _lookTarget = new Vector3(), + _lightPositionWorld = new Vector3(), + + _MorphingFlag = 1, + _SkinningFlag = 2, + + _NumberOfMaterialVariants = ( _MorphingFlag | _SkinningFlag ) + 1, + + _depthMaterials = new Array( _NumberOfMaterialVariants ), + _distanceMaterials = new Array( _NumberOfMaterialVariants ), + + _materialCache = {}; + + var cubeDirections = [ + new Vector3( 1, 0, 0 ), new Vector3( - 1, 0, 0 ), new Vector3( 0, 0, 1 ), + new Vector3( 0, 0, - 1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, - 1, 0 ) + ]; + + var cubeUps = [ + new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), + new Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ), new Vector3( 0, 0, - 1 ) + ]; + + var cube2DViewPorts = [ + new Vector4(), new Vector4(), new Vector4(), + new Vector4(), new Vector4(), new Vector4() + ]; + + // init + + var depthMaterialTemplate = new MeshDepthMaterial(); + depthMaterialTemplate.depthPacking = RGBADepthPacking; + depthMaterialTemplate.clipping = true; + + var distanceShader = ShaderLib[ "distanceRGBA" ]; + var distanceUniforms = UniformsUtils.clone( distanceShader.uniforms ); + + for ( var i = 0; i !== _NumberOfMaterialVariants; ++ i ) { + + var useMorphing = ( i & _MorphingFlag ) !== 0; + var useSkinning = ( i & _SkinningFlag ) !== 0; + + var depthMaterial = depthMaterialTemplate.clone(); + depthMaterial.morphTargets = useMorphing; + depthMaterial.skinning = useSkinning; + + _depthMaterials[ i ] = depthMaterial; + + var distanceMaterial = new ShaderMaterial( { + defines: { + 'USE_SHADOWMAP': '' + }, + uniforms: distanceUniforms, + vertexShader: distanceShader.vertexShader, + fragmentShader: distanceShader.fragmentShader, + morphTargets: useMorphing, + skinning: useSkinning, + clipping: true + } ); + + _distanceMaterials[ i ] = distanceMaterial; + + } + + // + + var scope = this; + + this.enabled = false; + + this.autoUpdate = true; + this.needsUpdate = false; + + this.type = PCFShadowMap; + + this.renderReverseSided = true; + this.renderSingleSided = true; + + this.render = function ( scene, camera ) { + + if ( scope.enabled === false ) return; + if ( scope.autoUpdate === false && scope.needsUpdate === false ) return; + + if ( _lightShadows.length === 0 ) return; + + // Set GL state for depth map. + _state.disable( _gl.BLEND ); + _state.buffers.color.setClear( 1, 1, 1, 1 ); + _state.buffers.depth.setTest( true ); + _state.setScissorTest( false ); + + // render depth map + + var faceCount, isPointLight; + + for ( var i = 0, il = _lightShadows.length; i < il; i ++ ) { + + var light = _lightShadows[ i ]; + var shadow = light.shadow; + + if ( shadow === undefined ) { + + console.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' ); + continue; + + } + + var shadowCamera = shadow.camera; + var shadowMatrix = shadow.matrix; + + _lightPositionWorld.setFromMatrixPosition( light.matrixWorld ); + shadowCamera.position.copy( _lightPositionWorld ); + + _shadowMapSize.copy( shadow.mapSize ); + _shadowMapSize.min( _maxShadowMapSize ); + + if ( light && light.isPointLight ) { + + faceCount = 6; + isPointLight = true; + + var vpWidth = _shadowMapSize.x; + var vpHeight = _shadowMapSize.y; + + // These viewports map a cube-map onto a 2D texture with the + // following orientation: + // + // xzXZ + // y Y + // + // X - Positive x direction + // x - Negative x direction + // Y - Positive y direction + // y - Negative y direction + // Z - Positive z direction + // z - Negative z direction + + // positive X + cube2DViewPorts[ 0 ].set( vpWidth * 2, vpHeight, vpWidth, vpHeight ); + // negative X + cube2DViewPorts[ 1 ].set( 0, vpHeight, vpWidth, vpHeight ); + // positive Z + cube2DViewPorts[ 2 ].set( vpWidth * 3, vpHeight, vpWidth, vpHeight ); + // negative Z + cube2DViewPorts[ 3 ].set( vpWidth, vpHeight, vpWidth, vpHeight ); + // positive Y + cube2DViewPorts[ 4 ].set( vpWidth * 3, 0, vpWidth, vpHeight ); + // negative Y + cube2DViewPorts[ 5 ].set( vpWidth, 0, vpWidth, vpHeight ); + + _shadowMapSize.x *= 4.0; + _shadowMapSize.y *= 2.0; + + + // for point lights we set the shadow matrix to be a translation-only matrix + // equal to inverse of the light's position + + shadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z ); + + } else { + + faceCount = 1; + isPointLight = false; + + _lookTarget.setFromMatrixPosition( light.target.matrixWorld ); + shadowCamera.lookAt( _lookTarget ); + shadowCamera.updateMatrixWorld(); + shadowCamera.matrixWorldInverse.getInverse( shadowCamera.matrixWorld ); + + // compute shadow matrix + + shadowMatrix.set( + 0.5, 0.0, 0.0, 0.5, + 0.0, 0.5, 0.0, 0.5, + 0.0, 0.0, 0.5, 0.5, + 0.0, 0.0, 0.0, 1.0 + ); + + shadowMatrix.multiply( shadowCamera.projectionMatrix ); + shadowMatrix.multiply( shadowCamera.matrixWorldInverse ); + + } + + if ( shadow.map === null ) { + + var pars = { minFilter: NearestFilter, magFilter: NearestFilter, format: RGBAFormat }; + + shadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars ); + shadow.map.texture.name = light.name + ".shadowMap"; + + shadowCamera.updateProjectionMatrix(); + + } + + if ( shadow.isSpotLightShadow ) { + + shadow.update( light ); + + } + + var shadowMap = shadow.map; + + _renderer.setRenderTarget( shadowMap ); + _renderer.clear(); + + // render shadow map for each cube face (if omni-directional) or + // run a single pass if not + + for ( var face = 0; face < faceCount; face ++ ) { + + if ( isPointLight ) { + + _lookTarget.copy( shadowCamera.position ); + _lookTarget.add( cubeDirections[ face ] ); + shadowCamera.up.copy( cubeUps[ face ] ); + shadowCamera.lookAt( _lookTarget ); + shadowCamera.updateMatrixWorld(); + shadowCamera.matrixWorldInverse.getInverse( shadowCamera.matrixWorld ); + + var vpDimensions = cube2DViewPorts[ face ]; + _state.viewport( vpDimensions ); + + } + + // update camera matrices and frustum + + _projScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse ); + _frustum.setFromMatrix( _projScreenMatrix ); + + // set object matrices & frustum culling + + renderObject( scene, camera, shadowCamera, isPointLight ); + + } + + } + + // Restore GL state. + var clearColor = _renderer.getClearColor(); + var clearAlpha = _renderer.getClearAlpha(); + _renderer.setClearColor( clearColor, clearAlpha ); + + scope.needsUpdate = false; + + }; + + function getDepthMaterial( object, material, isPointLight, lightPositionWorld ) { + + var geometry = object.geometry; + + var result = null; + + var materialVariants = _depthMaterials; + var customMaterial = object.customDepthMaterial; + + if ( isPointLight ) { + + materialVariants = _distanceMaterials; + customMaterial = object.customDistanceMaterial; + + } + + if ( ! customMaterial ) { + + var useMorphing = false; + + if ( material.morphTargets ) { + + if ( geometry && geometry.isBufferGeometry ) { + + useMorphing = geometry.morphAttributes && geometry.morphAttributes.position && geometry.morphAttributes.position.length > 0; + + } else if ( geometry && geometry.isGeometry ) { + + useMorphing = geometry.morphTargets && geometry.morphTargets.length > 0; + + } + + } + + if ( object.isSkinnedMesh && material.skinning === false ) { + + console.warn( 'THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:', object ); + + } + + var useSkinning = object.isSkinnedMesh && material.skinning; + + var variantIndex = 0; + + if ( useMorphing ) variantIndex |= _MorphingFlag; + if ( useSkinning ) variantIndex |= _SkinningFlag; + + result = materialVariants[ variantIndex ]; + + } else { + + result = customMaterial; + + } + + if ( _renderer.localClippingEnabled && + material.clipShadows === true && + material.clippingPlanes.length !== 0 ) { + + // in this case we need a unique material instance reflecting the + // appropriate state + + var keyA = result.uuid, keyB = material.uuid; + + var materialsForVariant = _materialCache[ keyA ]; + + if ( materialsForVariant === undefined ) { + + materialsForVariant = {}; + _materialCache[ keyA ] = materialsForVariant; + + } + + var cachedMaterial = materialsForVariant[ keyB ]; + + if ( cachedMaterial === undefined ) { + + cachedMaterial = result.clone(); + materialsForVariant[ keyB ] = cachedMaterial; + + } + + result = cachedMaterial; + + } + + result.visible = material.visible; + result.wireframe = material.wireframe; + + var side = material.side; + + if ( scope.renderSingleSided && side == DoubleSide ) { + + side = FrontSide; + + } + + if ( scope.renderReverseSided ) { + + if ( side === FrontSide ) side = BackSide; + else if ( side === BackSide ) side = FrontSide; + + } + + result.side = side; + + result.clipShadows = material.clipShadows; + result.clippingPlanes = material.clippingPlanes; + + result.wireframeLinewidth = material.wireframeLinewidth; + result.linewidth = material.linewidth; + + if ( isPointLight && result.uniforms.lightPos !== undefined ) { + + result.uniforms.lightPos.value.copy( lightPositionWorld ); + + } + + return result; + + } + + function renderObject( object, camera, shadowCamera, isPointLight ) { + + if ( object.visible === false ) return; + + var visible = object.layers.test( camera.layers ); + + if ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) { + + if ( object.castShadow && ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) ) { + + object.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld ); + + var geometry = _objects.update( object ); + var material = object.material; + + if ( Array.isArray( material ) ) { + + var groups = geometry.groups; + + for ( var k = 0, kl = groups.length; k < kl; k ++ ) { + + var group = groups[ k ]; + var groupMaterial = material[ group.materialIndex ]; + + if ( groupMaterial && groupMaterial.visible ) { + + var depthMaterial = getDepthMaterial( object, groupMaterial, isPointLight, _lightPositionWorld ); + _renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group ); + + } + + } + + } else if ( material.visible ) { + + var depthMaterial = getDepthMaterial( object, material, isPointLight, _lightPositionWorld ); + _renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null ); + + } + + } + + } + + var children = object.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + renderObject( children[ i ], camera, shadowCamera, isPointLight ); + + } + + } + + } + + /** + * @author bhouston / http://clara.io + */ + + function Ray( origin, direction ) { + + this.origin = ( origin !== undefined ) ? origin : new Vector3(); + this.direction = ( direction !== undefined ) ? direction : new Vector3(); + + } + + Object.assign( Ray.prototype, { + + set: function ( origin, direction ) { + + this.origin.copy( origin ); + this.direction.copy( direction ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( ray ) { + + this.origin.copy( ray.origin ); + this.direction.copy( ray.direction ); + + return this; + + }, + + at: function ( t, optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + return result.copy( this.direction ).multiplyScalar( t ).add( this.origin ); + + }, + + lookAt: function ( v ) { + + this.direction.copy( v ).sub( this.origin ).normalize(); + + return this; + + }, + + recast: function () { + + var v1 = new Vector3(); + + return function recast( t ) { + + this.origin.copy( this.at( t, v1 ) ); + + return this; + + }; + + }(), + + closestPointToPoint: function ( point, optionalTarget ) { + + var result = optionalTarget || new Vector3(); + result.subVectors( point, this.origin ); + var directionDistance = result.dot( this.direction ); + + if ( directionDistance < 0 ) { + + return result.copy( this.origin ); + + } + + return result.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin ); + + }, + + distanceToPoint: function ( point ) { + + return Math.sqrt( this.distanceSqToPoint( point ) ); + + }, + + distanceSqToPoint: function () { + + var v1 = new Vector3(); + + return function distanceSqToPoint( point ) { + + var directionDistance = v1.subVectors( point, this.origin ).dot( this.direction ); + + // point behind the ray + + if ( directionDistance < 0 ) { + + return this.origin.distanceToSquared( point ); + + } + + v1.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin ); + + return v1.distanceToSquared( point ); + + }; + + }(), + + distanceSqToSegment: function () { + + var segCenter = new Vector3(); + var segDir = new Vector3(); + var diff = new Vector3(); + + return function distanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) { + + // from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistRaySegment.h + // It returns the min distance between the ray and the segment + // defined by v0 and v1 + // It can also set two optional targets : + // - The closest point on the ray + // - The closest point on the segment + + segCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 ); + segDir.copy( v1 ).sub( v0 ).normalize(); + diff.copy( this.origin ).sub( segCenter ); + + var segExtent = v0.distanceTo( v1 ) * 0.5; + var a01 = - this.direction.dot( segDir ); + var b0 = diff.dot( this.direction ); + var b1 = - diff.dot( segDir ); + var c = diff.lengthSq(); + var det = Math.abs( 1 - a01 * a01 ); + var s0, s1, sqrDist, extDet; + + if ( det > 0 ) { + + // The ray and segment are not parallel. + + s0 = a01 * b1 - b0; + s1 = a01 * b0 - b1; + extDet = segExtent * det; + + if ( s0 >= 0 ) { + + if ( s1 >= - extDet ) { + + if ( s1 <= extDet ) { + + // region 0 + // Minimum at interior points of ray and segment. + + var invDet = 1 / det; + s0 *= invDet; + s1 *= invDet; + sqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c; + + } else { + + // region 1 + + s1 = segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } else { + + // region 5 + + s1 = - segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } else { + + if ( s1 <= - extDet ) { + + // region 4 + + s0 = Math.max( 0, - ( - a01 * segExtent + b0 ) ); + s1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } else if ( s1 <= extDet ) { + + // region 3 + + s0 = 0; + s1 = Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = s1 * ( s1 + 2 * b1 ) + c; + + } else { + + // region 2 + + s0 = Math.max( 0, - ( a01 * segExtent + b0 ) ); + s1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } + + } else { + + // Ray and segment are parallel. + + s1 = ( a01 > 0 ) ? - segExtent : segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + if ( optionalPointOnRay ) { + + optionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin ); + + } + + if ( optionalPointOnSegment ) { + + optionalPointOnSegment.copy( segDir ).multiplyScalar( s1 ).add( segCenter ); + + } + + return sqrDist; + + }; + + }(), + + intersectSphere: function () { + + var v1 = new Vector3(); + + return function intersectSphere( sphere, optionalTarget ) { + + v1.subVectors( sphere.center, this.origin ); + var tca = v1.dot( this.direction ); + var d2 = v1.dot( v1 ) - tca * tca; + var radius2 = sphere.radius * sphere.radius; + + if ( d2 > radius2 ) return null; + + var thc = Math.sqrt( radius2 - d2 ); + + // t0 = first intersect point - entrance on front of sphere + var t0 = tca - thc; + + // t1 = second intersect point - exit point on back of sphere + var t1 = tca + thc; + + // test to see if both t0 and t1 are behind the ray - if so, return null + if ( t0 < 0 && t1 < 0 ) return null; + + // test to see if t0 is behind the ray: + // if it is, the ray is inside the sphere, so return the second exit point scaled by t1, + // in order to always return an intersect point that is in front of the ray. + if ( t0 < 0 ) return this.at( t1, optionalTarget ); + + // else t0 is in front of the ray, so return the first collision point scaled by t0 + return this.at( t0, optionalTarget ); + + }; + + }(), + + intersectsSphere: function ( sphere ) { + + return this.distanceToPoint( sphere.center ) <= sphere.radius; + + }, + + distanceToPlane: function ( plane ) { + + var denominator = plane.normal.dot( this.direction ); + + if ( denominator === 0 ) { + + // line is coplanar, return origin + if ( plane.distanceToPoint( this.origin ) === 0 ) { + + return 0; + + } + + // Null is preferable to undefined since undefined means.... it is undefined + + return null; + + } + + var t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator; + + // Return if the ray never intersects the plane + + return t >= 0 ? t : null; + + }, + + intersectPlane: function ( plane, optionalTarget ) { + + var t = this.distanceToPlane( plane ); + + if ( t === null ) { + + return null; + + } + + return this.at( t, optionalTarget ); + + }, + + intersectsPlane: function ( plane ) { + + // check if the ray lies on the plane first + + var distToPoint = plane.distanceToPoint( this.origin ); + + if ( distToPoint === 0 ) { + + return true; + + } + + var denominator = plane.normal.dot( this.direction ); + + if ( denominator * distToPoint < 0 ) { + + return true; + + } + + // ray origin is behind the plane (and is pointing behind it) + + return false; + + }, + + intersectBox: function ( box, optionalTarget ) { + + var tmin, tmax, tymin, tymax, tzmin, tzmax; + + var invdirx = 1 / this.direction.x, + invdiry = 1 / this.direction.y, + invdirz = 1 / this.direction.z; + + var origin = this.origin; + + if ( invdirx >= 0 ) { + + tmin = ( box.min.x - origin.x ) * invdirx; + tmax = ( box.max.x - origin.x ) * invdirx; + + } else { + + tmin = ( box.max.x - origin.x ) * invdirx; + tmax = ( box.min.x - origin.x ) * invdirx; + + } + + if ( invdiry >= 0 ) { + + tymin = ( box.min.y - origin.y ) * invdiry; + tymax = ( box.max.y - origin.y ) * invdiry; + + } else { + + tymin = ( box.max.y - origin.y ) * invdiry; + tymax = ( box.min.y - origin.y ) * invdiry; + + } + + if ( ( tmin > tymax ) || ( tymin > tmax ) ) return null; + + // These lines also handle the case where tmin or tmax is NaN + // (result of 0 * Infinity). x !== x returns true if x is NaN + + if ( tymin > tmin || tmin !== tmin ) tmin = tymin; + + if ( tymax < tmax || tmax !== tmax ) tmax = tymax; + + if ( invdirz >= 0 ) { + + tzmin = ( box.min.z - origin.z ) * invdirz; + tzmax = ( box.max.z - origin.z ) * invdirz; + + } else { + + tzmin = ( box.max.z - origin.z ) * invdirz; + tzmax = ( box.min.z - origin.z ) * invdirz; + + } + + if ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null; + + if ( tzmin > tmin || tmin !== tmin ) tmin = tzmin; + + if ( tzmax < tmax || tmax !== tmax ) tmax = tzmax; + + //return point closest to the ray (positive side) + + if ( tmax < 0 ) return null; + + return this.at( tmin >= 0 ? tmin : tmax, optionalTarget ); + + }, + + intersectsBox: ( function () { + + var v = new Vector3(); + + return function intersectsBox( box ) { + + return this.intersectBox( box, v ) !== null; + + }; + + } )(), + + intersectTriangle: function () { + + // Compute the offset origin, edges, and normal. + var diff = new Vector3(); + var edge1 = new Vector3(); + var edge2 = new Vector3(); + var normal = new Vector3(); + + return function intersectTriangle( a, b, c, backfaceCulling, optionalTarget ) { + + // from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h + + edge1.subVectors( b, a ); + edge2.subVectors( c, a ); + normal.crossVectors( edge1, edge2 ); + + // Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction, + // E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by + // |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2)) + // |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q)) + // |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N) + var DdN = this.direction.dot( normal ); + var sign; + + if ( DdN > 0 ) { + + if ( backfaceCulling ) return null; + sign = 1; + + } else if ( DdN < 0 ) { + + sign = - 1; + DdN = - DdN; + + } else { + + return null; + + } + + diff.subVectors( this.origin, a ); + var DdQxE2 = sign * this.direction.dot( edge2.crossVectors( diff, edge2 ) ); + + // b1 < 0, no intersection + if ( DdQxE2 < 0 ) { + + return null; + + } + + var DdE1xQ = sign * this.direction.dot( edge1.cross( diff ) ); + + // b2 < 0, no intersection + if ( DdE1xQ < 0 ) { + + return null; + + } + + // b1+b2 > 1, no intersection + if ( DdQxE2 + DdE1xQ > DdN ) { + + return null; + + } + + // Line intersects triangle, check if ray does. + var QdN = - sign * diff.dot( normal ); + + // t < 0, no intersection + if ( QdN < 0 ) { + + return null; + + } + + // Ray intersects triangle. + return this.at( QdN / DdN, optionalTarget ); + + }; + + }(), + + applyMatrix4: function ( matrix4 ) { + + this.direction.add( this.origin ).applyMatrix4( matrix4 ); + this.origin.applyMatrix4( matrix4 ); + this.direction.sub( this.origin ); + this.direction.normalize(); + + return this; + + }, + + equals: function ( ray ) { + + return ray.origin.equals( this.origin ) && ray.direction.equals( this.direction ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://clara.io + */ + + function Euler( x, y, z, order ) { + + this._x = x || 0; + this._y = y || 0; + this._z = z || 0; + this._order = order || Euler.DefaultOrder; + + } + + Euler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ]; + + Euler.DefaultOrder = 'XYZ'; + + Object.defineProperties( Euler.prototype, { + + x: { + + get: function () { + + return this._x; + + }, + + set: function ( value ) { + + this._x = value; + this.onChangeCallback(); + + } + + }, + + y: { + + get: function () { + + return this._y; + + }, + + set: function ( value ) { + + this._y = value; + this.onChangeCallback(); + + } + + }, + + z: { + + get: function () { + + return this._z; + + }, + + set: function ( value ) { + + this._z = value; + this.onChangeCallback(); + + } + + }, + + order: { + + get: function () { + + return this._order; + + }, + + set: function ( value ) { + + this._order = value; + this.onChangeCallback(); + + } + + } + + } ); + + Object.assign( Euler.prototype, { + + isEuler: true, + + set: function ( x, y, z, order ) { + + this._x = x; + this._y = y; + this._z = z; + this._order = order || this._order; + + this.onChangeCallback(); + + return this; + + }, + + clone: function () { + + return new this.constructor( this._x, this._y, this._z, this._order ); + + }, + + copy: function ( euler ) { + + this._x = euler._x; + this._y = euler._y; + this._z = euler._z; + this._order = euler._order; + + this.onChangeCallback(); + + return this; + + }, + + setFromRotationMatrix: function ( m, order, update ) { + + var clamp = _Math.clamp; + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var te = m.elements; + var m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ]; + var m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ]; + var m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ]; + + order = order || this._order; + + if ( order === 'XYZ' ) { + + this._y = Math.asin( clamp( m13, - 1, 1 ) ); + + if ( Math.abs( m13 ) < 0.99999 ) { + + this._x = Math.atan2( - m23, m33 ); + this._z = Math.atan2( - m12, m11 ); + + } else { + + this._x = Math.atan2( m32, m22 ); + this._z = 0; + + } + + } else if ( order === 'YXZ' ) { + + this._x = Math.asin( - clamp( m23, - 1, 1 ) ); + + if ( Math.abs( m23 ) < 0.99999 ) { + + this._y = Math.atan2( m13, m33 ); + this._z = Math.atan2( m21, m22 ); + + } else { + + this._y = Math.atan2( - m31, m11 ); + this._z = 0; + + } + + } else if ( order === 'ZXY' ) { + + this._x = Math.asin( clamp( m32, - 1, 1 ) ); + + if ( Math.abs( m32 ) < 0.99999 ) { + + this._y = Math.atan2( - m31, m33 ); + this._z = Math.atan2( - m12, m22 ); + + } else { + + this._y = 0; + this._z = Math.atan2( m21, m11 ); + + } + + } else if ( order === 'ZYX' ) { + + this._y = Math.asin( - clamp( m31, - 1, 1 ) ); + + if ( Math.abs( m31 ) < 0.99999 ) { + + this._x = Math.atan2( m32, m33 ); + this._z = Math.atan2( m21, m11 ); + + } else { + + this._x = 0; + this._z = Math.atan2( - m12, m22 ); + + } + + } else if ( order === 'YZX' ) { + + this._z = Math.asin( clamp( m21, - 1, 1 ) ); + + if ( Math.abs( m21 ) < 0.99999 ) { + + this._x = Math.atan2( - m23, m22 ); + this._y = Math.atan2( - m31, m11 ); + + } else { + + this._x = 0; + this._y = Math.atan2( m13, m33 ); + + } + + } else if ( order === 'XZY' ) { + + this._z = Math.asin( - clamp( m12, - 1, 1 ) ); + + if ( Math.abs( m12 ) < 0.99999 ) { + + this._x = Math.atan2( m32, m22 ); + this._y = Math.atan2( m13, m11 ); + + } else { + + this._x = Math.atan2( - m23, m33 ); + this._y = 0; + + } + + } else { + + console.warn( 'THREE.Euler: .setFromRotationMatrix() given unsupported order: ' + order ); + + } + + this._order = order; + + if ( update !== false ) this.onChangeCallback(); + + return this; + + }, + + setFromQuaternion: function () { + + var matrix = new Matrix4(); + + return function setFromQuaternion( q, order, update ) { + + matrix.makeRotationFromQuaternion( q ); + + return this.setFromRotationMatrix( matrix, order, update ); + + }; + + }(), + + setFromVector3: function ( v, order ) { + + return this.set( v.x, v.y, v.z, order || this._order ); + + }, + + reorder: function () { + + // WARNING: this discards revolution information -bhouston + + var q = new Quaternion(); + + return function reorder( newOrder ) { + + q.setFromEuler( this ); + + return this.setFromQuaternion( q, newOrder ); + + }; + + }(), + + equals: function ( euler ) { + + return ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order ); + + }, + + fromArray: function ( array ) { + + this._x = array[ 0 ]; + this._y = array[ 1 ]; + this._z = array[ 2 ]; + if ( array[ 3 ] !== undefined ) this._order = array[ 3 ]; + + this.onChangeCallback(); + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this._x; + array[ offset + 1 ] = this._y; + array[ offset + 2 ] = this._z; + array[ offset + 3 ] = this._order; + + return array; + + }, + + toVector3: function ( optionalResult ) { + + if ( optionalResult ) { + + return optionalResult.set( this._x, this._y, this._z ); + + } else { + + return new Vector3( this._x, this._y, this._z ); + + } + + }, + + onChange: function ( callback ) { + + this.onChangeCallback = callback; + + return this; + + }, + + onChangeCallback: function () {} + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Layers() { + + this.mask = 1 | 0; + + } + + Object.assign( Layers.prototype, { + + set: function ( channel ) { + + this.mask = 1 << channel | 0; + + }, + + enable: function ( channel ) { + + this.mask |= 1 << channel | 0; + + }, + + toggle: function ( channel ) { + + this.mask ^= 1 << channel | 0; + + }, + + disable: function ( channel ) { + + this.mask &= ~ ( 1 << channel | 0 ); + + }, + + test: function ( layers ) { + + return ( this.mask & layers.mask ) !== 0; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author elephantatwork / www.elephantatwork.ch + */ + + var object3DId = 0; + + function Object3D() { + + Object.defineProperty( this, 'id', { value: object3DId ++ } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'Object3D'; + + this.parent = null; + this.children = []; + + this.up = Object3D.DefaultUp.clone(); + + var position = new Vector3(); + var rotation = new Euler(); + var quaternion = new Quaternion(); + var scale = new Vector3( 1, 1, 1 ); + + function onRotationChange() { + + quaternion.setFromEuler( rotation, false ); + + } + + function onQuaternionChange() { + + rotation.setFromQuaternion( quaternion, undefined, false ); + + } + + rotation.onChange( onRotationChange ); + quaternion.onChange( onQuaternionChange ); + + Object.defineProperties( this, { + position: { + enumerable: true, + value: position + }, + rotation: { + enumerable: true, + value: rotation + }, + quaternion: { + enumerable: true, + value: quaternion + }, + scale: { + enumerable: true, + value: scale + }, + modelViewMatrix: { + value: new Matrix4() + }, + normalMatrix: { + value: new Matrix3() + } + } ); + + this.matrix = new Matrix4(); + this.matrixWorld = new Matrix4(); + + this.matrixAutoUpdate = Object3D.DefaultMatrixAutoUpdate; + this.matrixWorldNeedsUpdate = false; + + this.layers = new Layers(); + this.visible = true; + + this.castShadow = false; + this.receiveShadow = false; + + this.frustumCulled = true; + this.renderOrder = 0; + + this.userData = {}; + + this.onBeforeRender = function () {}; + this.onAfterRender = function () {}; + + } + + Object3D.DefaultUp = new Vector3( 0, 1, 0 ); + Object3D.DefaultMatrixAutoUpdate = true; + + Object.assign( Object3D.prototype, EventDispatcher.prototype, { + + isObject3D: true, + + applyMatrix: function ( matrix ) { + + this.matrix.multiplyMatrices( matrix, this.matrix ); + + this.matrix.decompose( this.position, this.quaternion, this.scale ); + + }, + + setRotationFromAxisAngle: function ( axis, angle ) { + + // assumes axis is normalized + + this.quaternion.setFromAxisAngle( axis, angle ); + + }, + + setRotationFromEuler: function ( euler ) { + + this.quaternion.setFromEuler( euler, true ); + + }, + + setRotationFromMatrix: function ( m ) { + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + this.quaternion.setFromRotationMatrix( m ); + + }, + + setRotationFromQuaternion: function ( q ) { + + // assumes q is normalized + + this.quaternion.copy( q ); + + }, + + rotateOnAxis: function () { + + // rotate object on axis in object space + // axis is assumed to be normalized + + var q1 = new Quaternion(); + + return function rotateOnAxis( axis, angle ) { + + q1.setFromAxisAngle( axis, angle ); + + this.quaternion.multiply( q1 ); + + return this; + + }; + + }(), + + rotateX: function () { + + var v1 = new Vector3( 1, 0, 0 ); + + return function rotateX( angle ) { + + return this.rotateOnAxis( v1, angle ); + + }; + + }(), + + rotateY: function () { + + var v1 = new Vector3( 0, 1, 0 ); + + return function rotateY( angle ) { + + return this.rotateOnAxis( v1, angle ); + + }; + + }(), + + rotateZ: function () { + + var v1 = new Vector3( 0, 0, 1 ); + + return function rotateZ( angle ) { + + return this.rotateOnAxis( v1, angle ); + + }; + + }(), + + translateOnAxis: function () { + + // translate object by distance along axis in object space + // axis is assumed to be normalized + + var v1 = new Vector3(); + + return function translateOnAxis( axis, distance ) { + + v1.copy( axis ).applyQuaternion( this.quaternion ); + + this.position.add( v1.multiplyScalar( distance ) ); + + return this; + + }; + + }(), + + translateX: function () { + + var v1 = new Vector3( 1, 0, 0 ); + + return function translateX( distance ) { + + return this.translateOnAxis( v1, distance ); + + }; + + }(), + + translateY: function () { + + var v1 = new Vector3( 0, 1, 0 ); + + return function translateY( distance ) { + + return this.translateOnAxis( v1, distance ); + + }; + + }(), + + translateZ: function () { + + var v1 = new Vector3( 0, 0, 1 ); + + return function translateZ( distance ) { + + return this.translateOnAxis( v1, distance ); + + }; + + }(), + + localToWorld: function ( vector ) { + + return vector.applyMatrix4( this.matrixWorld ); + + }, + + worldToLocal: function () { + + var m1 = new Matrix4(); + + return function worldToLocal( vector ) { + + return vector.applyMatrix4( m1.getInverse( this.matrixWorld ) ); + + }; + + }(), + + lookAt: function () { + + // This routine does not support objects with rotated and/or translated parent(s) + + var m1 = new Matrix4(); + + return function lookAt( vector ) { + + if ( this.isCamera ) { + + m1.lookAt( this.position, vector, this.up ); + + } else { + + m1.lookAt( vector, this.position, this.up ); + + } + + this.quaternion.setFromRotationMatrix( m1 ); + + }; + + }(), + + add: function ( object ) { + + if ( arguments.length > 1 ) { + + for ( var i = 0; i < arguments.length; i ++ ) { + + this.add( arguments[ i ] ); + + } + + return this; + + } + + if ( object === this ) { + + console.error( "THREE.Object3D.add: object can't be added as a child of itself.", object ); + return this; + + } + + if ( ( object && object.isObject3D ) ) { + + if ( object.parent !== null ) { + + object.parent.remove( object ); + + } + + object.parent = this; + object.dispatchEvent( { type: 'added' } ); + + this.children.push( object ); + + } else { + + console.error( "THREE.Object3D.add: object not an instance of THREE.Object3D.", object ); + + } + + return this; + + }, + + remove: function ( object ) { + + if ( arguments.length > 1 ) { + + for ( var i = 0; i < arguments.length; i ++ ) { + + this.remove( arguments[ i ] ); + + } + + } + + var index = this.children.indexOf( object ); + + if ( index !== - 1 ) { + + object.parent = null; + + object.dispatchEvent( { type: 'removed' } ); + + this.children.splice( index, 1 ); + + } + + }, + + getObjectById: function ( id ) { + + return this.getObjectByProperty( 'id', id ); + + }, + + getObjectByName: function ( name ) { + + return this.getObjectByProperty( 'name', name ); + + }, + + getObjectByProperty: function ( name, value ) { + + if ( this[ name ] === value ) return this; + + for ( var i = 0, l = this.children.length; i < l; i ++ ) { + + var child = this.children[ i ]; + var object = child.getObjectByProperty( name, value ); + + if ( object !== undefined ) { + + return object; + + } + + } + + return undefined; + + }, + + getWorldPosition: function ( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + this.updateMatrixWorld( true ); + + return result.setFromMatrixPosition( this.matrixWorld ); + + }, + + getWorldQuaternion: function () { + + var position = new Vector3(); + var scale = new Vector3(); + + return function getWorldQuaternion( optionalTarget ) { + + var result = optionalTarget || new Quaternion(); + + this.updateMatrixWorld( true ); + + this.matrixWorld.decompose( position, result, scale ); + + return result; + + }; + + }(), + + getWorldRotation: function () { + + var quaternion = new Quaternion(); + + return function getWorldRotation( optionalTarget ) { + + var result = optionalTarget || new Euler(); + + this.getWorldQuaternion( quaternion ); + + return result.setFromQuaternion( quaternion, this.rotation.order, false ); + + }; + + }(), + + getWorldScale: function () { + + var position = new Vector3(); + var quaternion = new Quaternion(); + + return function getWorldScale( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + this.updateMatrixWorld( true ); + + this.matrixWorld.decompose( position, quaternion, result ); + + return result; + + }; + + }(), + + getWorldDirection: function () { + + var quaternion = new Quaternion(); + + return function getWorldDirection( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + this.getWorldQuaternion( quaternion ); + + return result.set( 0, 0, 1 ).applyQuaternion( quaternion ); + + }; + + }(), + + raycast: function () {}, + + traverse: function ( callback ) { + + callback( this ); + + var children = this.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].traverse( callback ); + + } + + }, + + traverseVisible: function ( callback ) { + + if ( this.visible === false ) return; + + callback( this ); + + var children = this.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].traverseVisible( callback ); + + } + + }, + + traverseAncestors: function ( callback ) { + + var parent = this.parent; + + if ( parent !== null ) { + + callback( parent ); + + parent.traverseAncestors( callback ); + + } + + }, + + updateMatrix: function () { + + this.matrix.compose( this.position, this.quaternion, this.scale ); + + this.matrixWorldNeedsUpdate = true; + + }, + + updateMatrixWorld: function ( force ) { + + if ( this.matrixAutoUpdate ) this.updateMatrix(); + + if ( this.matrixWorldNeedsUpdate || force ) { + + if ( this.parent === null ) { + + this.matrixWorld.copy( this.matrix ); + + } else { + + this.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix ); + + } + + this.matrixWorldNeedsUpdate = false; + + force = true; + + } + + // update children + + var children = this.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].updateMatrixWorld( force ); + + } + + }, + + toJSON: function ( meta ) { + + // meta is '' when called from JSON.stringify + var isRootObject = ( meta === undefined || meta === '' ); + + var output = {}; + + // meta is a hash used to collect geometries, materials. + // not providing it implies that this is the root object + // being serialized. + if ( isRootObject ) { + + // initialize meta obj + meta = { + geometries: {}, + materials: {}, + textures: {}, + images: {} + }; + + output.metadata = { + version: 4.5, + type: 'Object', + generator: 'Object3D.toJSON' + }; + + } + + // standard Object3D serialization + + var object = {}; + + object.uuid = this.uuid; + object.type = this.type; + + if ( this.name !== '' ) object.name = this.name; + if ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData; + if ( this.castShadow === true ) object.castShadow = true; + if ( this.receiveShadow === true ) object.receiveShadow = true; + if ( this.visible === false ) object.visible = false; + + object.matrix = this.matrix.toArray(); + + // + + function serialize( library, element ) { + + if ( library[ element.uuid ] === undefined ) { + + library[ element.uuid ] = element.toJSON( meta ); + + } + + return element.uuid; + + } + + if ( this.geometry !== undefined ) { + + object.geometry = serialize( meta.geometries, this.geometry ); + + } + + if ( this.material !== undefined ) { + + if ( Array.isArray( this.material ) ) { + + var uuids = []; + + for ( var i = 0, l = this.material.length; i < l; i ++ ) { + + uuids.push( serialize( meta.materials, this.material[ i ] ) ); + + } + + object.material = uuids; + + } else { + + object.material = serialize( meta.materials, this.material ); + + } + + } + + // + + if ( this.children.length > 0 ) { + + object.children = []; + + for ( var i = 0; i < this.children.length; i ++ ) { + + object.children.push( this.children[ i ].toJSON( meta ).object ); + + } + + } + + if ( isRootObject ) { + + var geometries = extractFromCache( meta.geometries ); + var materials = extractFromCache( meta.materials ); + var textures = extractFromCache( meta.textures ); + var images = extractFromCache( meta.images ); + + if ( geometries.length > 0 ) output.geometries = geometries; + if ( materials.length > 0 ) output.materials = materials; + if ( textures.length > 0 ) output.textures = textures; + if ( images.length > 0 ) output.images = images; + + } + + output.object = object; + + return output; + + // extract data from the cache hash + // remove metadata on each item + // and return as array + function extractFromCache( cache ) { + + var values = []; + for ( var key in cache ) { + + var data = cache[ key ]; + delete data.metadata; + values.push( data ); + + } + return values; + + } + + }, + + clone: function ( recursive ) { + + return new this.constructor().copy( this, recursive ); + + }, + + copy: function ( source, recursive ) { + + if ( recursive === undefined ) recursive = true; + + this.name = source.name; + + this.up.copy( source.up ); + + this.position.copy( source.position ); + this.quaternion.copy( source.quaternion ); + this.scale.copy( source.scale ); + + this.matrix.copy( source.matrix ); + this.matrixWorld.copy( source.matrixWorld ); + + this.matrixAutoUpdate = source.matrixAutoUpdate; + this.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate; + + this.layers.mask = source.layers.mask; + this.visible = source.visible; + + this.castShadow = source.castShadow; + this.receiveShadow = source.receiveShadow; + + this.frustumCulled = source.frustumCulled; + this.renderOrder = source.renderOrder; + + this.userData = JSON.parse( JSON.stringify( source.userData ) ); + + if ( recursive === true ) { + + for ( var i = 0; i < source.children.length; i ++ ) { + + var child = source.children[ i ]; + this.add( child.clone() ); + + } + + } + + return this; + + } + + } ); + + /** + * @author bhouston / http://clara.io + */ + + function Line3( start, end ) { + + this.start = ( start !== undefined ) ? start : new Vector3(); + this.end = ( end !== undefined ) ? end : new Vector3(); + + } + + Object.assign( Line3.prototype, { + + set: function ( start, end ) { + + this.start.copy( start ); + this.end.copy( end ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( line ) { + + this.start.copy( line.start ); + this.end.copy( line.end ); + + return this; + + }, + + getCenter: function ( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + return result.addVectors( this.start, this.end ).multiplyScalar( 0.5 ); + + }, + + delta: function ( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + return result.subVectors( this.end, this.start ); + + }, + + distanceSq: function () { + + return this.start.distanceToSquared( this.end ); + + }, + + distance: function () { + + return this.start.distanceTo( this.end ); + + }, + + at: function ( t, optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + return this.delta( result ).multiplyScalar( t ).add( this.start ); + + }, + + closestPointToPointParameter: function () { + + var startP = new Vector3(); + var startEnd = new Vector3(); + + return function closestPointToPointParameter( point, clampToLine ) { + + startP.subVectors( point, this.start ); + startEnd.subVectors( this.end, this.start ); + + var startEnd2 = startEnd.dot( startEnd ); + var startEnd_startP = startEnd.dot( startP ); + + var t = startEnd_startP / startEnd2; + + if ( clampToLine ) { + + t = _Math.clamp( t, 0, 1 ); + + } + + return t; + + }; + + }(), + + closestPointToPoint: function ( point, clampToLine, optionalTarget ) { + + var t = this.closestPointToPointParameter( point, clampToLine ); + + var result = optionalTarget || new Vector3(); + + return this.delta( result ).multiplyScalar( t ).add( this.start ); + + }, + + applyMatrix4: function ( matrix ) { + + this.start.applyMatrix4( matrix ); + this.end.applyMatrix4( matrix ); + + return this; + + }, + + equals: function ( line ) { + + return line.start.equals( this.start ) && line.end.equals( this.end ); + + } + + } ); + + /** + * @author bhouston / http://clara.io + * @author mrdoob / http://mrdoob.com/ + */ + + function Triangle( a, b, c ) { + + this.a = ( a !== undefined ) ? a : new Vector3(); + this.b = ( b !== undefined ) ? b : new Vector3(); + this.c = ( c !== undefined ) ? c : new Vector3(); + + } + + Object.assign( Triangle, { + + normal: function () { + + var v0 = new Vector3(); + + return function normal( a, b, c, optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + result.subVectors( c, b ); + v0.subVectors( a, b ); + result.cross( v0 ); + + var resultLengthSq = result.lengthSq(); + if ( resultLengthSq > 0 ) { + + return result.multiplyScalar( 1 / Math.sqrt( resultLengthSq ) ); + + } + + return result.set( 0, 0, 0 ); + + }; + + }(), + + // static/instance method to calculate barycentric coordinates + // based on: http://www.blackpawn.com/texts/pointinpoly/default.html + barycoordFromPoint: function () { + + var v0 = new Vector3(); + var v1 = new Vector3(); + var v2 = new Vector3(); + + return function barycoordFromPoint( point, a, b, c, optionalTarget ) { + + v0.subVectors( c, a ); + v1.subVectors( b, a ); + v2.subVectors( point, a ); + + var dot00 = v0.dot( v0 ); + var dot01 = v0.dot( v1 ); + var dot02 = v0.dot( v2 ); + var dot11 = v1.dot( v1 ); + var dot12 = v1.dot( v2 ); + + var denom = ( dot00 * dot11 - dot01 * dot01 ); + + var result = optionalTarget || new Vector3(); + + // collinear or singular triangle + if ( denom === 0 ) { + + // arbitrary location outside of triangle? + // not sure if this is the best idea, maybe should be returning undefined + return result.set( - 2, - 1, - 1 ); + + } + + var invDenom = 1 / denom; + var u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom; + var v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom; + + // barycentric coordinates must always sum to 1 + return result.set( 1 - u - v, v, u ); + + }; + + }(), + + containsPoint: function () { + + var v1 = new Vector3(); + + return function containsPoint( point, a, b, c ) { + + var result = Triangle.barycoordFromPoint( point, a, b, c, v1 ); + + return ( result.x >= 0 ) && ( result.y >= 0 ) && ( ( result.x + result.y ) <= 1 ); + + }; + + }() + + } ); + + Object.assign( Triangle.prototype, { + + set: function ( a, b, c ) { + + this.a.copy( a ); + this.b.copy( b ); + this.c.copy( c ); + + return this; + + }, + + setFromPointsAndIndices: function ( points, i0, i1, i2 ) { + + this.a.copy( points[ i0 ] ); + this.b.copy( points[ i1 ] ); + this.c.copy( points[ i2 ] ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( triangle ) { + + this.a.copy( triangle.a ); + this.b.copy( triangle.b ); + this.c.copy( triangle.c ); + + return this; + + }, + + area: function () { + + var v0 = new Vector3(); + var v1 = new Vector3(); + + return function area() { + + v0.subVectors( this.c, this.b ); + v1.subVectors( this.a, this.b ); + + return v0.cross( v1 ).length() * 0.5; + + }; + + }(), + + midpoint: function ( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + return result.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 ); + + }, + + normal: function ( optionalTarget ) { + + return Triangle.normal( this.a, this.b, this.c, optionalTarget ); + + }, + + plane: function ( optionalTarget ) { + + var result = optionalTarget || new Plane(); + + return result.setFromCoplanarPoints( this.a, this.b, this.c ); + + }, + + barycoordFromPoint: function ( point, optionalTarget ) { + + return Triangle.barycoordFromPoint( point, this.a, this.b, this.c, optionalTarget ); + + }, + + containsPoint: function ( point ) { + + return Triangle.containsPoint( point, this.a, this.b, this.c ); + + }, + + closestPointToPoint: function () { + + var plane = new Plane(); + var edgeList = [ new Line3(), new Line3(), new Line3() ]; + var projectedPoint = new Vector3(); + var closestPoint = new Vector3(); + + return function closestPointToPoint( point, optionalTarget ) { + + var result = optionalTarget || new Vector3(); + var minDistance = Infinity; + + // project the point onto the plane of the triangle + + plane.setFromCoplanarPoints( this.a, this.b, this.c ); + plane.projectPoint( point, projectedPoint ); + + // check if the projection lies within the triangle + + if( this.containsPoint( projectedPoint ) === true ) { + + // if so, this is the closest point + + result.copy( projectedPoint ); + + } else { + + // if not, the point falls outside the triangle. the result is the closest point to the triangle's edges or vertices + + edgeList[ 0 ].set( this.a, this.b ); + edgeList[ 1 ].set( this.b, this.c ); + edgeList[ 2 ].set( this.c, this.a ); + + for( var i = 0; i < edgeList.length; i ++ ) { + + edgeList[ i ].closestPointToPoint( projectedPoint, true, closestPoint ); + + var distance = projectedPoint.distanceToSquared( closestPoint ); + + if( distance < minDistance ) { + + minDistance = distance; + + result.copy( closestPoint ); + + } + + } + + } + + return result; + + }; + + }(), + + equals: function ( triangle ) { + + return triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Face3( a, b, c, normal, color, materialIndex ) { + + this.a = a; + this.b = b; + this.c = c; + + this.normal = ( normal && normal.isVector3 ) ? normal : new Vector3(); + this.vertexNormals = Array.isArray( normal ) ? normal : []; + + this.color = ( color && color.isColor ) ? color : new Color(); + this.vertexColors = Array.isArray( color ) ? color : []; + + this.materialIndex = materialIndex !== undefined ? materialIndex : 0; + + } + + Object.assign( Face3.prototype, { + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.a = source.a; + this.b = source.b; + this.c = source.c; + + this.normal.copy( source.normal ); + this.color.copy( source.color ); + + this.materialIndex = source.materialIndex; + + for ( var i = 0, il = source.vertexNormals.length; i < il; i ++ ) { + + this.vertexNormals[ i ] = source.vertexNormals[ i ].clone(); + + } + + for ( var i = 0, il = source.vertexColors.length; i < il; i ++ ) { + + this.vertexColors[ i ] = source.vertexColors[ i ].clone(); + + } + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: <hex>, + * opacity: <float>, + * map: new THREE.Texture( <Image> ), + * + * lightMap: new THREE.Texture( <Image> ), + * lightMapIntensity: <float> + * + * aoMap: new THREE.Texture( <Image> ), + * aoMapIntensity: <float> + * + * specularMap: new THREE.Texture( <Image> ), + * + * alphaMap: new THREE.Texture( <Image> ), + * + * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: <float>, + * refractionRatio: <float>, + * + * shading: THREE.SmoothShading, + * depthTest: <bool>, + * depthWrite: <bool>, + * + * wireframe: <boolean>, + * wireframeLinewidth: <float>, + * + * skinning: <bool>, + * morphTargets: <bool> + * } + */ + + function MeshBasicMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshBasicMaterial'; + + this.color = new Color( 0xffffff ); // emissive + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + + this.lights = false; + + this.setValues( parameters ); + + } + + MeshBasicMaterial.prototype = Object.create( Material.prototype ); + MeshBasicMaterial.prototype.constructor = MeshBasicMaterial; + + MeshBasicMaterial.prototype.isMeshBasicMaterial = true; + + MeshBasicMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function BufferAttribute( array, itemSize, normalized ) { + + if ( Array.isArray( array ) ) { + + throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); + + } + + this.uuid = _Math.generateUUID(); + + this.array = array; + this.itemSize = itemSize; + this.count = array !== undefined ? array.length / itemSize : 0; + this.normalized = normalized === true; + + this.dynamic = false; + this.updateRange = { offset: 0, count: - 1 }; + + this.onUploadCallback = function () {}; + + this.version = 0; + + } + + Object.defineProperty( BufferAttribute.prototype, 'needsUpdate', { + + set: function ( value ) { + + if ( value === true ) this.version ++; + + } + + } ); + + Object.assign( BufferAttribute.prototype, { + + isBufferAttribute: true, + + setArray: function ( array ) { + + if ( Array.isArray( array ) ) { + + throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); + + } + + this.count = array !== undefined ? array.length / this.itemSize : 0; + this.array = array; + + }, + + setDynamic: function ( value ) { + + this.dynamic = value; + + return this; + + }, + + copy: function ( source ) { + + this.array = new source.array.constructor( source.array ); + this.itemSize = source.itemSize; + this.count = source.count; + this.normalized = source.normalized; + + this.dynamic = source.dynamic; + + return this; + + }, + + copyAt: function ( index1, attribute, index2 ) { + + index1 *= this.itemSize; + index2 *= attribute.itemSize; + + for ( var i = 0, l = this.itemSize; i < l; i ++ ) { + + this.array[ index1 + i ] = attribute.array[ index2 + i ]; + + } + + return this; + + }, + + copyArray: function ( array ) { + + this.array.set( array ); + + return this; + + }, + + copyColorsArray: function ( colors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = colors.length; i < l; i ++ ) { + + var color = colors[ i ]; + + if ( color === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i ); + color = new Color(); + + } + + array[ offset ++ ] = color.r; + array[ offset ++ ] = color.g; + array[ offset ++ ] = color.b; + + } + + return this; + + }, + + copyIndicesArray: function ( indices ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = indices.length; i < l; i ++ ) { + + var index = indices[ i ]; + + array[ offset ++ ] = index.a; + array[ offset ++ ] = index.b; + array[ offset ++ ] = index.c; + + } + + return this; + + }, + + copyVector2sArray: function ( vectors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = vectors.length; i < l; i ++ ) { + + var vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i ); + vector = new Vector2(); + + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + + } + + return this; + + }, + + copyVector3sArray: function ( vectors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = vectors.length; i < l; i ++ ) { + + var vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i ); + vector = new Vector3(); + + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + array[ offset ++ ] = vector.z; + + } + + return this; + + }, + + copyVector4sArray: function ( vectors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = vectors.length; i < l; i ++ ) { + + var vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i ); + vector = new Vector4(); + + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + array[ offset ++ ] = vector.z; + array[ offset ++ ] = vector.w; + + } + + return this; + + }, + + set: function ( value, offset ) { + + if ( offset === undefined ) offset = 0; + + this.array.set( value, offset ); + + return this; + + }, + + getX: function ( index ) { + + return this.array[ index * this.itemSize ]; + + }, + + setX: function ( index, x ) { + + this.array[ index * this.itemSize ] = x; + + return this; + + }, + + getY: function ( index ) { + + return this.array[ index * this.itemSize + 1 ]; + + }, + + setY: function ( index, y ) { + + this.array[ index * this.itemSize + 1 ] = y; + + return this; + + }, + + getZ: function ( index ) { + + return this.array[ index * this.itemSize + 2 ]; + + }, + + setZ: function ( index, z ) { + + this.array[ index * this.itemSize + 2 ] = z; + + return this; + + }, + + getW: function ( index ) { + + return this.array[ index * this.itemSize + 3 ]; + + }, + + setW: function ( index, w ) { + + this.array[ index * this.itemSize + 3 ] = w; + + return this; + + }, + + setXY: function ( index, x, y ) { + + index *= this.itemSize; + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + + return this; + + }, + + setXYZ: function ( index, x, y, z ) { + + index *= this.itemSize; + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + this.array[ index + 2 ] = z; + + return this; + + }, + + setXYZW: function ( index, x, y, z, w ) { + + index *= this.itemSize; + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + this.array[ index + 2 ] = z; + this.array[ index + 3 ] = w; + + return this; + + }, + + onUpload: function ( callback ) { + + this.onUploadCallback = callback; + + return this; + + }, + + clone: function () { + + return new this.constructor( this.array, this.itemSize ).copy( this ); + + } + + } ); + + // + + function Int8BufferAttribute( array, itemSize ) { + + BufferAttribute.call( this, new Int8Array( array ), itemSize ); + + } + + Int8BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Int8BufferAttribute.prototype.constructor = Int8BufferAttribute; + + + function Uint8BufferAttribute( array, itemSize ) { + + BufferAttribute.call( this, new Uint8Array( array ), itemSize ); + + } + + Uint8BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Uint8BufferAttribute.prototype.constructor = Uint8BufferAttribute; + + + function Uint8ClampedBufferAttribute( array, itemSize ) { + + BufferAttribute.call( this, new Uint8ClampedArray( array ), itemSize ); + + } + + Uint8ClampedBufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Uint8ClampedBufferAttribute.prototype.constructor = Uint8ClampedBufferAttribute; + + + function Int16BufferAttribute( array, itemSize ) { + + BufferAttribute.call( this, new Int16Array( array ), itemSize ); + + } + + Int16BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Int16BufferAttribute.prototype.constructor = Int16BufferAttribute; + + + function Uint16BufferAttribute( array, itemSize ) { + + BufferAttribute.call( this, new Uint16Array( array ), itemSize ); + + } + + Uint16BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Uint16BufferAttribute.prototype.constructor = Uint16BufferAttribute; + + + function Int32BufferAttribute( array, itemSize ) { + + BufferAttribute.call( this, new Int32Array( array ), itemSize ); + + } + + Int32BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Int32BufferAttribute.prototype.constructor = Int32BufferAttribute; + + + function Uint32BufferAttribute( array, itemSize ) { + + BufferAttribute.call( this, new Uint32Array( array ), itemSize ); + + } + + Uint32BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Uint32BufferAttribute.prototype.constructor = Uint32BufferAttribute; + + + function Float32BufferAttribute( array, itemSize ) { + + BufferAttribute.call( this, new Float32Array( array ), itemSize ); + + } + + Float32BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Float32BufferAttribute.prototype.constructor = Float32BufferAttribute; + + + function Float64BufferAttribute( array, itemSize ) { + + BufferAttribute.call( this, new Float64Array( array ), itemSize ); + + } + + Float64BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Float64BufferAttribute.prototype.constructor = Float64BufferAttribute; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function DirectGeometry() { + + this.indices = []; + this.vertices = []; + this.normals = []; + this.colors = []; + this.uvs = []; + this.uvs2 = []; + + this.groups = []; + + this.morphTargets = {}; + + this.skinWeights = []; + this.skinIndices = []; + + // this.lineDistances = []; + + this.boundingBox = null; + this.boundingSphere = null; + + // update flags + + this.verticesNeedUpdate = false; + this.normalsNeedUpdate = false; + this.colorsNeedUpdate = false; + this.uvsNeedUpdate = false; + this.groupsNeedUpdate = false; + + } + + Object.assign( DirectGeometry.prototype, { + + computeGroups: function ( geometry ) { + + var group; + var groups = []; + var materialIndex = undefined; + + var faces = geometry.faces; + + for ( var i = 0; i < faces.length; i ++ ) { + + var face = faces[ i ]; + + // materials + + if ( face.materialIndex !== materialIndex ) { + + materialIndex = face.materialIndex; + + if ( group !== undefined ) { + + group.count = ( i * 3 ) - group.start; + groups.push( group ); + + } + + group = { + start: i * 3, + materialIndex: materialIndex + }; + + } + + } + + if ( group !== undefined ) { + + group.count = ( i * 3 ) - group.start; + groups.push( group ); + + } + + this.groups = groups; + + }, + + fromGeometry: function ( geometry ) { + + var faces = geometry.faces; + var vertices = geometry.vertices; + var faceVertexUvs = geometry.faceVertexUvs; + + var hasFaceVertexUv = faceVertexUvs[ 0 ] && faceVertexUvs[ 0 ].length > 0; + var hasFaceVertexUv2 = faceVertexUvs[ 1 ] && faceVertexUvs[ 1 ].length > 0; + + // morphs + + var morphTargets = geometry.morphTargets; + var morphTargetsLength = morphTargets.length; + + var morphTargetsPosition; + + if ( morphTargetsLength > 0 ) { + + morphTargetsPosition = []; + + for ( var i = 0; i < morphTargetsLength; i ++ ) { + + morphTargetsPosition[ i ] = []; + + } + + this.morphTargets.position = morphTargetsPosition; + + } + + var morphNormals = geometry.morphNormals; + var morphNormalsLength = morphNormals.length; + + var morphTargetsNormal; + + if ( morphNormalsLength > 0 ) { + + morphTargetsNormal = []; + + for ( var i = 0; i < morphNormalsLength; i ++ ) { + + morphTargetsNormal[ i ] = []; + + } + + this.morphTargets.normal = morphTargetsNormal; + + } + + // skins + + var skinIndices = geometry.skinIndices; + var skinWeights = geometry.skinWeights; + + var hasSkinIndices = skinIndices.length === vertices.length; + var hasSkinWeights = skinWeights.length === vertices.length; + + // + + for ( var i = 0; i < faces.length; i ++ ) { + + var face = faces[ i ]; + + this.vertices.push( vertices[ face.a ], vertices[ face.b ], vertices[ face.c ] ); + + var vertexNormals = face.vertexNormals; + + if ( vertexNormals.length === 3 ) { + + this.normals.push( vertexNormals[ 0 ], vertexNormals[ 1 ], vertexNormals[ 2 ] ); + + } else { + + var normal = face.normal; + + this.normals.push( normal, normal, normal ); + + } + + var vertexColors = face.vertexColors; + + if ( vertexColors.length === 3 ) { + + this.colors.push( vertexColors[ 0 ], vertexColors[ 1 ], vertexColors[ 2 ] ); + + } else { + + var color = face.color; + + this.colors.push( color, color, color ); + + } + + if ( hasFaceVertexUv === true ) { + + var vertexUvs = faceVertexUvs[ 0 ][ i ]; + + if ( vertexUvs !== undefined ) { + + this.uvs.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] ); + + } else { + + console.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ', i ); + + this.uvs.push( new Vector2(), new Vector2(), new Vector2() ); + + } + + } + + if ( hasFaceVertexUv2 === true ) { + + var vertexUvs = faceVertexUvs[ 1 ][ i ]; + + if ( vertexUvs !== undefined ) { + + this.uvs2.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] ); + + } else { + + console.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ', i ); + + this.uvs2.push( new Vector2(), new Vector2(), new Vector2() ); + + } + + } + + // morphs + + for ( var j = 0; j < morphTargetsLength; j ++ ) { + + var morphTarget = morphTargets[ j ].vertices; + + morphTargetsPosition[ j ].push( morphTarget[ face.a ], morphTarget[ face.b ], morphTarget[ face.c ] ); + + } + + for ( var j = 0; j < morphNormalsLength; j ++ ) { + + var morphNormal = morphNormals[ j ].vertexNormals[ i ]; + + morphTargetsNormal[ j ].push( morphNormal.a, morphNormal.b, morphNormal.c ); + + } + + // skins + + if ( hasSkinIndices ) { + + this.skinIndices.push( skinIndices[ face.a ], skinIndices[ face.b ], skinIndices[ face.c ] ); + + } + + if ( hasSkinWeights ) { + + this.skinWeights.push( skinWeights[ face.a ], skinWeights[ face.b ], skinWeights[ face.c ] ); + + } + + } + + this.computeGroups( geometry ); + + this.verticesNeedUpdate = geometry.verticesNeedUpdate; + this.normalsNeedUpdate = geometry.normalsNeedUpdate; + this.colorsNeedUpdate = geometry.colorsNeedUpdate; + this.uvsNeedUpdate = geometry.uvsNeedUpdate; + this.groupsNeedUpdate = geometry.groupsNeedUpdate; + + return this; + + } + + } ); + + function arrayMax( array ) { + + if ( array.length === 0 ) return - Infinity; + + var max = array[ 0 ]; + + for ( var i = 1, l = array.length; i < l; ++ i ) { + + if ( array[ i ] > max ) max = array[ i ]; + + } + + return max; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + * @author kile / http://kile.stravaganza.org/ + * @author alteredq / http://alteredqualia.com/ + * @author mikael emtinger / http://gomo.se/ + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author bhouston / http://clara.io + */ + + var count = 0; + function GeometryIdCount() { return count++; } + + function Geometry() { + + Object.defineProperty( this, 'id', { value: GeometryIdCount() } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'Geometry'; + + this.vertices = []; + this.colors = []; + this.faces = []; + this.faceVertexUvs = [[]]; + + this.morphTargets = []; + this.morphNormals = []; + + this.skinWeights = []; + this.skinIndices = []; + + this.lineDistances = []; + + this.boundingBox = null; + this.boundingSphere = null; + + // update flags + + this.elementsNeedUpdate = false; + this.verticesNeedUpdate = false; + this.uvsNeedUpdate = false; + this.normalsNeedUpdate = false; + this.colorsNeedUpdate = false; + this.lineDistancesNeedUpdate = false; + this.groupsNeedUpdate = false; + + } + + Object.assign( Geometry.prototype, EventDispatcher.prototype, { + + isGeometry: true, + + applyMatrix: function ( matrix ) { + + var normalMatrix = new Matrix3().getNormalMatrix( matrix ); + + for ( var i = 0, il = this.vertices.length; i < il; i ++ ) { + + var vertex = this.vertices[ i ]; + vertex.applyMatrix4( matrix ); + + } + + for ( var i = 0, il = this.faces.length; i < il; i ++ ) { + + var face = this.faces[ i ]; + face.normal.applyMatrix3( normalMatrix ).normalize(); + + for ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) { + + face.vertexNormals[ j ].applyMatrix3( normalMatrix ).normalize(); + + } + + } + + if ( this.boundingBox !== null ) { + + this.computeBoundingBox(); + + } + + if ( this.boundingSphere !== null ) { + + this.computeBoundingSphere(); + + } + + this.verticesNeedUpdate = true; + this.normalsNeedUpdate = true; + + return this; + + }, + + rotateX: function () { + + // rotate geometry around world x-axis + + var m1 = new Matrix4(); + + return function rotateX( angle ) { + + m1.makeRotationX( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateY: function () { + + // rotate geometry around world y-axis + + var m1 = new Matrix4(); + + return function rotateY( angle ) { + + m1.makeRotationY( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateZ: function () { + + // rotate geometry around world z-axis + + var m1 = new Matrix4(); + + return function rotateZ( angle ) { + + m1.makeRotationZ( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + translate: function () { + + // translate geometry + + var m1 = new Matrix4(); + + return function translate( x, y, z ) { + + m1.makeTranslation( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + scale: function () { + + // scale geometry + + var m1 = new Matrix4(); + + return function scale( x, y, z ) { + + m1.makeScale( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + lookAt: function () { + + var obj = new Object3D(); + + return function lookAt( vector ) { + + obj.lookAt( vector ); + + obj.updateMatrix(); + + this.applyMatrix( obj.matrix ); + + }; + + }(), + + fromBufferGeometry: function ( geometry ) { + + var scope = this; + + var indices = geometry.index !== null ? geometry.index.array : undefined; + var attributes = geometry.attributes; + + var positions = attributes.position.array; + var normals = attributes.normal !== undefined ? attributes.normal.array : undefined; + var colors = attributes.color !== undefined ? attributes.color.array : undefined; + var uvs = attributes.uv !== undefined ? attributes.uv.array : undefined; + var uvs2 = attributes.uv2 !== undefined ? attributes.uv2.array : undefined; + + if ( uvs2 !== undefined ) this.faceVertexUvs[ 1 ] = []; + + var tempNormals = []; + var tempUVs = []; + var tempUVs2 = []; + + for ( var i = 0, j = 0; i < positions.length; i += 3, j += 2 ) { + + scope.vertices.push( new Vector3( positions[ i ], positions[ i + 1 ], positions[ i + 2 ] ) ); + + if ( normals !== undefined ) { + + tempNormals.push( new Vector3( normals[ i ], normals[ i + 1 ], normals[ i + 2 ] ) ); + + } + + if ( colors !== undefined ) { + + scope.colors.push( new Color( colors[ i ], colors[ i + 1 ], colors[ i + 2 ] ) ); + + } + + if ( uvs !== undefined ) { + + tempUVs.push( new Vector2( uvs[ j ], uvs[ j + 1 ] ) ); + + } + + if ( uvs2 !== undefined ) { + + tempUVs2.push( new Vector2( uvs2[ j ], uvs2[ j + 1 ] ) ); + + } + + } + + function addFace( a, b, c, materialIndex ) { + + var vertexNormals = normals !== undefined ? [ tempNormals[ a ].clone(), tempNormals[ b ].clone(), tempNormals[ c ].clone() ] : []; + var vertexColors = colors !== undefined ? [ scope.colors[ a ].clone(), scope.colors[ b ].clone(), scope.colors[ c ].clone() ] : []; + + var face = new Face3( a, b, c, vertexNormals, vertexColors, materialIndex ); + + scope.faces.push( face ); + + if ( uvs !== undefined ) { + + scope.faceVertexUvs[ 0 ].push( [ tempUVs[ a ].clone(), tempUVs[ b ].clone(), tempUVs[ c ].clone() ] ); + + } + + if ( uvs2 !== undefined ) { + + scope.faceVertexUvs[ 1 ].push( [ tempUVs2[ a ].clone(), tempUVs2[ b ].clone(), tempUVs2[ c ].clone() ] ); + + } + + } + + var groups = geometry.groups; + + if ( groups.length > 0 ) { + + for ( var i = 0; i < groups.length; i ++ ) { + + var group = groups[ i ]; + + var start = group.start; + var count = group.count; + + for ( var j = start, jl = start + count; j < jl; j += 3 ) { + + if ( indices !== undefined ) { + + addFace( indices[ j ], indices[ j + 1 ], indices[ j + 2 ], group.materialIndex ); + + } else { + + addFace( j, j + 1, j + 2, group.materialIndex ); + + } + + } + + } + + } else { + + if ( indices !== undefined ) { + + for ( var i = 0; i < indices.length; i += 3 ) { + + addFace( indices[ i ], indices[ i + 1 ], indices[ i + 2 ] ); + + } + + } else { + + for ( var i = 0; i < positions.length / 3; i += 3 ) { + + addFace( i, i + 1, i + 2 ); + + } + + } + + } + + this.computeFaceNormals(); + + if ( geometry.boundingBox !== null ) { + + this.boundingBox = geometry.boundingBox.clone(); + + } + + if ( geometry.boundingSphere !== null ) { + + this.boundingSphere = geometry.boundingSphere.clone(); + + } + + return this; + + }, + + center: function () { + + this.computeBoundingBox(); + + var offset = this.boundingBox.getCenter().negate(); + + this.translate( offset.x, offset.y, offset.z ); + + return offset; + + }, + + normalize: function () { + + this.computeBoundingSphere(); + + var center = this.boundingSphere.center; + var radius = this.boundingSphere.radius; + + var s = radius === 0 ? 1 : 1.0 / radius; + + var matrix = new Matrix4(); + matrix.set( + s, 0, 0, - s * center.x, + 0, s, 0, - s * center.y, + 0, 0, s, - s * center.z, + 0, 0, 0, 1 + ); + + this.applyMatrix( matrix ); + + return this; + + }, + + computeFaceNormals: function () { + + var cb = new Vector3(), ab = new Vector3(); + + for ( var f = 0, fl = this.faces.length; f < fl; f ++ ) { + + var face = this.faces[ f ]; + + var vA = this.vertices[ face.a ]; + var vB = this.vertices[ face.b ]; + var vC = this.vertices[ face.c ]; + + cb.subVectors( vC, vB ); + ab.subVectors( vA, vB ); + cb.cross( ab ); + + cb.normalize(); + + face.normal.copy( cb ); + + } + + }, + + computeVertexNormals: function ( areaWeighted ) { + + if ( areaWeighted === undefined ) areaWeighted = true; + + var v, vl, f, fl, face, vertices; + + vertices = new Array( this.vertices.length ); + + for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) { + + vertices[ v ] = new Vector3(); + + } + + if ( areaWeighted ) { + + // vertex normals weighted by triangle areas + // http://www.iquilezles.org/www/articles/normals/normals.htm + + var vA, vB, vC; + var cb = new Vector3(), ab = new Vector3(); + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + vA = this.vertices[ face.a ]; + vB = this.vertices[ face.b ]; + vC = this.vertices[ face.c ]; + + cb.subVectors( vC, vB ); + ab.subVectors( vA, vB ); + cb.cross( ab ); + + vertices[ face.a ].add( cb ); + vertices[ face.b ].add( cb ); + vertices[ face.c ].add( cb ); + + } + + } else { + + this.computeFaceNormals(); + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + vertices[ face.a ].add( face.normal ); + vertices[ face.b ].add( face.normal ); + vertices[ face.c ].add( face.normal ); + + } + + } + + for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) { + + vertices[ v ].normalize(); + + } + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + var vertexNormals = face.vertexNormals; + + if ( vertexNormals.length === 3 ) { + + vertexNormals[ 0 ].copy( vertices[ face.a ] ); + vertexNormals[ 1 ].copy( vertices[ face.b ] ); + vertexNormals[ 2 ].copy( vertices[ face.c ] ); + + } else { + + vertexNormals[ 0 ] = vertices[ face.a ].clone(); + vertexNormals[ 1 ] = vertices[ face.b ].clone(); + vertexNormals[ 2 ] = vertices[ face.c ].clone(); + + } + + } + + if ( this.faces.length > 0 ) { + + this.normalsNeedUpdate = true; + + } + + }, + + computeFlatVertexNormals: function () { + + var f, fl, face; + + this.computeFaceNormals(); + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + var vertexNormals = face.vertexNormals; + + if ( vertexNormals.length === 3 ) { + + vertexNormals[ 0 ].copy( face.normal ); + vertexNormals[ 1 ].copy( face.normal ); + vertexNormals[ 2 ].copy( face.normal ); + + } else { + + vertexNormals[ 0 ] = face.normal.clone(); + vertexNormals[ 1 ] = face.normal.clone(); + vertexNormals[ 2 ] = face.normal.clone(); + + } + + } + + if ( this.faces.length > 0 ) { + + this.normalsNeedUpdate = true; + + } + + }, + + computeMorphNormals: function () { + + var i, il, f, fl, face; + + // save original normals + // - create temp variables on first access + // otherwise just copy (for faster repeated calls) + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + if ( ! face.__originalFaceNormal ) { + + face.__originalFaceNormal = face.normal.clone(); + + } else { + + face.__originalFaceNormal.copy( face.normal ); + + } + + if ( ! face.__originalVertexNormals ) face.__originalVertexNormals = []; + + for ( i = 0, il = face.vertexNormals.length; i < il; i ++ ) { + + if ( ! face.__originalVertexNormals[ i ] ) { + + face.__originalVertexNormals[ i ] = face.vertexNormals[ i ].clone(); + + } else { + + face.__originalVertexNormals[ i ].copy( face.vertexNormals[ i ] ); + + } + + } + + } + + // use temp geometry to compute face and vertex normals for each morph + + var tmpGeo = new Geometry(); + tmpGeo.faces = this.faces; + + for ( i = 0, il = this.morphTargets.length; i < il; i ++ ) { + + // create on first access + + if ( ! this.morphNormals[ i ] ) { + + this.morphNormals[ i ] = {}; + this.morphNormals[ i ].faceNormals = []; + this.morphNormals[ i ].vertexNormals = []; + + var dstNormalsFace = this.morphNormals[ i ].faceNormals; + var dstNormalsVertex = this.morphNormals[ i ].vertexNormals; + + var faceNormal, vertexNormals; + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + faceNormal = new Vector3(); + vertexNormals = { a: new Vector3(), b: new Vector3(), c: new Vector3() }; + + dstNormalsFace.push( faceNormal ); + dstNormalsVertex.push( vertexNormals ); + + } + + } + + var morphNormals = this.morphNormals[ i ]; + + // set vertices to morph target + + tmpGeo.vertices = this.morphTargets[ i ].vertices; + + // compute morph normals + + tmpGeo.computeFaceNormals(); + tmpGeo.computeVertexNormals(); + + // store morph normals + + var faceNormal, vertexNormals; + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + faceNormal = morphNormals.faceNormals[ f ]; + vertexNormals = morphNormals.vertexNormals[ f ]; + + faceNormal.copy( face.normal ); + + vertexNormals.a.copy( face.vertexNormals[ 0 ] ); + vertexNormals.b.copy( face.vertexNormals[ 1 ] ); + vertexNormals.c.copy( face.vertexNormals[ 2 ] ); + + } + + } + + // restore original normals + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + face.normal = face.__originalFaceNormal; + face.vertexNormals = face.__originalVertexNormals; + + } + + }, + + computeLineDistances: function () { + + var d = 0; + var vertices = this.vertices; + + for ( var i = 0, il = vertices.length; i < il; i ++ ) { + + if ( i > 0 ) { + + d += vertices[ i ].distanceTo( vertices[ i - 1 ] ); + + } + + this.lineDistances[ i ] = d; + + } + + }, + + computeBoundingBox: function () { + + if ( this.boundingBox === null ) { + + this.boundingBox = new Box3(); + + } + + this.boundingBox.setFromPoints( this.vertices ); + + }, + + computeBoundingSphere: function () { + + if ( this.boundingSphere === null ) { + + this.boundingSphere = new Sphere(); + + } + + this.boundingSphere.setFromPoints( this.vertices ); + + }, + + merge: function ( geometry, matrix, materialIndexOffset ) { + + if ( ( geometry && geometry.isGeometry ) === false ) { + + console.error( 'THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.', geometry ); + return; + + } + + var normalMatrix, + vertexOffset = this.vertices.length, + vertices1 = this.vertices, + vertices2 = geometry.vertices, + faces1 = this.faces, + faces2 = geometry.faces, + uvs1 = this.faceVertexUvs[ 0 ], + uvs2 = geometry.faceVertexUvs[ 0 ], + colors1 = this.colors, + colors2 = geometry.colors; + + if ( materialIndexOffset === undefined ) materialIndexOffset = 0; + + if ( matrix !== undefined ) { + + normalMatrix = new Matrix3().getNormalMatrix( matrix ); + + } + + // vertices + + for ( var i = 0, il = vertices2.length; i < il; i ++ ) { + + var vertex = vertices2[ i ]; + + var vertexCopy = vertex.clone(); + + if ( matrix !== undefined ) vertexCopy.applyMatrix4( matrix ); + + vertices1.push( vertexCopy ); + + } + + // colors + + for ( var i = 0, il = colors2.length; i < il; i ++ ) { + + colors1.push( colors2[ i ].clone() ); + + } + + // faces + + for ( i = 0, il = faces2.length; i < il; i ++ ) { + + var face = faces2[ i ], faceCopy, normal, color, + faceVertexNormals = face.vertexNormals, + faceVertexColors = face.vertexColors; + + faceCopy = new Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset ); + faceCopy.normal.copy( face.normal ); + + if ( normalMatrix !== undefined ) { + + faceCopy.normal.applyMatrix3( normalMatrix ).normalize(); + + } + + for ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) { + + normal = faceVertexNormals[ j ].clone(); + + if ( normalMatrix !== undefined ) { + + normal.applyMatrix3( normalMatrix ).normalize(); + + } + + faceCopy.vertexNormals.push( normal ); + + } + + faceCopy.color.copy( face.color ); + + for ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) { + + color = faceVertexColors[ j ]; + faceCopy.vertexColors.push( color.clone() ); + + } + + faceCopy.materialIndex = face.materialIndex + materialIndexOffset; + + faces1.push( faceCopy ); + + } + + // uvs + + for ( i = 0, il = uvs2.length; i < il; i ++ ) { + + var uv = uvs2[ i ], uvCopy = []; + + if ( uv === undefined ) { + + continue; + + } + + for ( var j = 0, jl = uv.length; j < jl; j ++ ) { + + uvCopy.push( uv[ j ].clone() ); + + } + + uvs1.push( uvCopy ); + + } + + }, + + mergeMesh: function ( mesh ) { + + if ( ( mesh && mesh.isMesh ) === false ) { + + console.error( 'THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.', mesh ); + return; + + } + + mesh.matrixAutoUpdate && mesh.updateMatrix(); + + this.merge( mesh.geometry, mesh.matrix ); + + }, + + /* + * Checks for duplicate vertices with hashmap. + * Duplicated vertices are removed + * and faces' vertices are updated. + */ + + mergeVertices: function () { + + var verticesMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique) + var unique = [], changes = []; + + var v, key; + var precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001 + var precision = Math.pow( 10, precisionPoints ); + var i, il, face; + var indices, j, jl; + + for ( i = 0, il = this.vertices.length; i < il; i ++ ) { + + v = this.vertices[ i ]; + key = Math.round( v.x * precision ) + '_' + Math.round( v.y * precision ) + '_' + Math.round( v.z * precision ); + + if ( verticesMap[ key ] === undefined ) { + + verticesMap[ key ] = i; + unique.push( this.vertices[ i ] ); + changes[ i ] = unique.length - 1; + + } else { + + //console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]); + changes[ i ] = changes[ verticesMap[ key ] ]; + + } + + } + + + // if faces are completely degenerate after merging vertices, we + // have to remove them from the geometry. + var faceIndicesToRemove = []; + + for ( i = 0, il = this.faces.length; i < il; i ++ ) { + + face = this.faces[ i ]; + + face.a = changes[ face.a ]; + face.b = changes[ face.b ]; + face.c = changes[ face.c ]; + + indices = [ face.a, face.b, face.c ]; + + // if any duplicate vertices are found in a Face3 + // we have to remove the face as nothing can be saved + for ( var n = 0; n < 3; n ++ ) { + + if ( indices[ n ] === indices[ ( n + 1 ) % 3 ] ) { + + faceIndicesToRemove.push( i ); + break; + + } + + } + + } + + for ( i = faceIndicesToRemove.length - 1; i >= 0; i -- ) { + + var idx = faceIndicesToRemove[ i ]; + + this.faces.splice( idx, 1 ); + + for ( j = 0, jl = this.faceVertexUvs.length; j < jl; j ++ ) { + + this.faceVertexUvs[ j ].splice( idx, 1 ); + + } + + } + + // Use unique set of vertices + + var diff = this.vertices.length - unique.length; + this.vertices = unique; + return diff; + + }, + + sortFacesByMaterialIndex: function () { + + var faces = this.faces; + var length = faces.length; + + // tag faces + + for ( var i = 0; i < length; i ++ ) { + + faces[ i ]._id = i; + + } + + // sort faces + + function materialIndexSort( a, b ) { + + return a.materialIndex - b.materialIndex; + + } + + faces.sort( materialIndexSort ); + + // sort uvs + + var uvs1 = this.faceVertexUvs[ 0 ]; + var uvs2 = this.faceVertexUvs[ 1 ]; + + var newUvs1, newUvs2; + + if ( uvs1 && uvs1.length === length ) newUvs1 = []; + if ( uvs2 && uvs2.length === length ) newUvs2 = []; + + for ( var i = 0; i < length; i ++ ) { + + var id = faces[ i ]._id; + + if ( newUvs1 ) newUvs1.push( uvs1[ id ] ); + if ( newUvs2 ) newUvs2.push( uvs2[ id ] ); + + } + + if ( newUvs1 ) this.faceVertexUvs[ 0 ] = newUvs1; + if ( newUvs2 ) this.faceVertexUvs[ 1 ] = newUvs2; + + }, + + toJSON: function () { + + var data = { + metadata: { + version: 4.5, + type: 'Geometry', + generator: 'Geometry.toJSON' + } + }; + + // standard Geometry serialization + + data.uuid = this.uuid; + data.type = this.type; + if ( this.name !== '' ) data.name = this.name; + + if ( this.parameters !== undefined ) { + + var parameters = this.parameters; + + for ( var key in parameters ) { + + if ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ]; + + } + + return data; + + } + + var vertices = []; + + for ( var i = 0; i < this.vertices.length; i ++ ) { + + var vertex = this.vertices[ i ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + var faces = []; + var normals = []; + var normalsHash = {}; + var colors = []; + var colorsHash = {}; + var uvs = []; + var uvsHash = {}; + + for ( var i = 0; i < this.faces.length; i ++ ) { + + var face = this.faces[ i ]; + + var hasMaterial = true; + var hasFaceUv = false; // deprecated + var hasFaceVertexUv = this.faceVertexUvs[ 0 ][ i ] !== undefined; + var hasFaceNormal = face.normal.length() > 0; + var hasFaceVertexNormal = face.vertexNormals.length > 0; + var hasFaceColor = face.color.r !== 1 || face.color.g !== 1 || face.color.b !== 1; + var hasFaceVertexColor = face.vertexColors.length > 0; + + var faceType = 0; + + faceType = setBit( faceType, 0, 0 ); // isQuad + faceType = setBit( faceType, 1, hasMaterial ); + faceType = setBit( faceType, 2, hasFaceUv ); + faceType = setBit( faceType, 3, hasFaceVertexUv ); + faceType = setBit( faceType, 4, hasFaceNormal ); + faceType = setBit( faceType, 5, hasFaceVertexNormal ); + faceType = setBit( faceType, 6, hasFaceColor ); + faceType = setBit( faceType, 7, hasFaceVertexColor ); + + faces.push( faceType ); + faces.push( face.a, face.b, face.c ); + faces.push( face.materialIndex ); + + if ( hasFaceVertexUv ) { + + var faceVertexUvs = this.faceVertexUvs[ 0 ][ i ]; + + faces.push( + getUvIndex( faceVertexUvs[ 0 ] ), + getUvIndex( faceVertexUvs[ 1 ] ), + getUvIndex( faceVertexUvs[ 2 ] ) + ); + + } + + if ( hasFaceNormal ) { + + faces.push( getNormalIndex( face.normal ) ); + + } + + if ( hasFaceVertexNormal ) { + + var vertexNormals = face.vertexNormals; + + faces.push( + getNormalIndex( vertexNormals[ 0 ] ), + getNormalIndex( vertexNormals[ 1 ] ), + getNormalIndex( vertexNormals[ 2 ] ) + ); + + } + + if ( hasFaceColor ) { + + faces.push( getColorIndex( face.color ) ); + + } + + if ( hasFaceVertexColor ) { + + var vertexColors = face.vertexColors; + + faces.push( + getColorIndex( vertexColors[ 0 ] ), + getColorIndex( vertexColors[ 1 ] ), + getColorIndex( vertexColors[ 2 ] ) + ); + + } + + } + + function setBit( value, position, enabled ) { + + return enabled ? value | ( 1 << position ) : value & ( ~ ( 1 << position ) ); + + } + + function getNormalIndex( normal ) { + + var hash = normal.x.toString() + normal.y.toString() + normal.z.toString(); + + if ( normalsHash[ hash ] !== undefined ) { + + return normalsHash[ hash ]; + + } + + normalsHash[ hash ] = normals.length / 3; + normals.push( normal.x, normal.y, normal.z ); + + return normalsHash[ hash ]; + + } + + function getColorIndex( color ) { + + var hash = color.r.toString() + color.g.toString() + color.b.toString(); + + if ( colorsHash[ hash ] !== undefined ) { + + return colorsHash[ hash ]; + + } + + colorsHash[ hash ] = colors.length; + colors.push( color.getHex() ); + + return colorsHash[ hash ]; + + } + + function getUvIndex( uv ) { + + var hash = uv.x.toString() + uv.y.toString(); + + if ( uvsHash[ hash ] !== undefined ) { + + return uvsHash[ hash ]; + + } + + uvsHash[ hash ] = uvs.length / 2; + uvs.push( uv.x, uv.y ); + + return uvsHash[ hash ]; + + } + + data.data = {}; + + data.data.vertices = vertices; + data.data.normals = normals; + if ( colors.length > 0 ) data.data.colors = colors; + if ( uvs.length > 0 ) data.data.uvs = [ uvs ]; // temporal backward compatibility + data.data.faces = faces; + + return data; + + }, + + clone: function () { + + /* + // Handle primitives + + var parameters = this.parameters; + + if ( parameters !== undefined ) { + + var values = []; + + for ( var key in parameters ) { + + values.push( parameters[ key ] ); + + } + + var geometry = Object.create( this.constructor.prototype ); + this.constructor.apply( geometry, values ); + return geometry; + + } + + return new this.constructor().copy( this ); + */ + + return new Geometry().copy( this ); + + }, + + copy: function ( source ) { + + var i, il, j, jl, k, kl; + + // reset + + this.vertices = []; + this.colors = []; + this.faces = []; + this.faceVertexUvs = [[]]; + this.morphTargets = []; + this.morphNormals = []; + this.skinWeights = []; + this.skinIndices = []; + this.lineDistances = []; + this.boundingBox = null; + this.boundingSphere = null; + + // name + + this.name = source.name; + + // vertices + + var vertices = source.vertices; + + for ( i = 0, il = vertices.length; i < il; i ++ ) { + + this.vertices.push( vertices[ i ].clone() ); + + } + + // colors + + var colors = source.colors; + + for ( i = 0, il = colors.length; i < il; i ++ ) { + + this.colors.push( colors[ i ].clone() ); + + } + + // faces + + var faces = source.faces; + + for ( i = 0, il = faces.length; i < il; i ++ ) { + + this.faces.push( faces[ i ].clone() ); + + } + + // face vertex uvs + + for ( i = 0, il = source.faceVertexUvs.length; i < il; i ++ ) { + + var faceVertexUvs = source.faceVertexUvs[ i ]; + + if ( this.faceVertexUvs[ i ] === undefined ) { + + this.faceVertexUvs[ i ] = []; + + } + + for ( j = 0, jl = faceVertexUvs.length; j < jl; j ++ ) { + + var uvs = faceVertexUvs[ j ], uvsCopy = []; + + for ( k = 0, kl = uvs.length; k < kl; k ++ ) { + + var uv = uvs[ k ]; + + uvsCopy.push( uv.clone() ); + + } + + this.faceVertexUvs[ i ].push( uvsCopy ); + + } + + } + + // morph targets + + var morphTargets = source.morphTargets; + + for ( i = 0, il = morphTargets.length; i < il; i ++ ) { + + var morphTarget = {}; + morphTarget.name = morphTargets[ i ].name; + + // vertices + + if ( morphTargets[ i ].vertices !== undefined ) { + + morphTarget.vertices = []; + + for ( j = 0, jl = morphTargets[ i ].vertices.length; j < jl; j ++ ) { + + morphTarget.vertices.push( morphTargets[ i ].vertices[ j ].clone() ); + + } + + } + + // normals + + if ( morphTargets[ i ].normals !== undefined ) { + + morphTarget.normals = []; + + for ( j = 0, jl = morphTargets[ i ].normals.length; j < jl; j ++ ) { + + morphTarget.normals.push( morphTargets[ i ].normals[ j ].clone() ); + + } + + } + + this.morphTargets.push( morphTarget ); + + } + + // morph normals + + var morphNormals = source.morphNormals; + + for ( i = 0, il = morphNormals.length; i < il; i ++ ) { + + var morphNormal = {}; + + // vertex normals + + if ( morphNormals[ i ].vertexNormals !== undefined ) { + + morphNormal.vertexNormals = []; + + for ( j = 0, jl = morphNormals[ i ].vertexNormals.length; j < jl; j ++ ) { + + var srcVertexNormal = morphNormals[ i ].vertexNormals[ j ]; + var destVertexNormal = {}; + + destVertexNormal.a = srcVertexNormal.a.clone(); + destVertexNormal.b = srcVertexNormal.b.clone(); + destVertexNormal.c = srcVertexNormal.c.clone(); + + morphNormal.vertexNormals.push( destVertexNormal ); + + } + + } + + // face normals + + if ( morphNormals[ i ].faceNormals !== undefined ) { + + morphNormal.faceNormals = []; + + for ( j = 0, jl = morphNormals[ i ].faceNormals.length; j < jl; j ++ ) { + + morphNormal.faceNormals.push( morphNormals[ i ].faceNormals[ j ].clone() ); + + } + + } + + this.morphNormals.push( morphNormal ); + + } + + // skin weights + + var skinWeights = source.skinWeights; + + for ( i = 0, il = skinWeights.length; i < il; i ++ ) { + + this.skinWeights.push( skinWeights[ i ].clone() ); + + } + + // skin indices + + var skinIndices = source.skinIndices; + + for ( i = 0, il = skinIndices.length; i < il; i ++ ) { + + this.skinIndices.push( skinIndices[ i ].clone() ); + + } + + // line distances + + var lineDistances = source.lineDistances; + + for ( i = 0, il = lineDistances.length; i < il; i ++ ) { + + this.lineDistances.push( lineDistances[ i ] ); + + } + + // bounding box + + var boundingBox = source.boundingBox; + + if ( boundingBox !== null ) { + + this.boundingBox = boundingBox.clone(); + + } + + // bounding sphere + + var boundingSphere = source.boundingSphere; + + if ( boundingSphere !== null ) { + + this.boundingSphere = boundingSphere.clone(); + + } + + // update flags + + this.elementsNeedUpdate = source.elementsNeedUpdate; + this.verticesNeedUpdate = source.verticesNeedUpdate; + this.uvsNeedUpdate = source.uvsNeedUpdate; + this.normalsNeedUpdate = source.normalsNeedUpdate; + this.colorsNeedUpdate = source.colorsNeedUpdate; + this.lineDistancesNeedUpdate = source.lineDistancesNeedUpdate; + this.groupsNeedUpdate = source.groupsNeedUpdate; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + function BufferGeometry() { + + Object.defineProperty( this, 'id', { value: GeometryIdCount() } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'BufferGeometry'; + + this.index = null; + this.attributes = {}; + + this.morphAttributes = {}; + + this.groups = []; + + this.boundingBox = null; + this.boundingSphere = null; + + this.drawRange = { start: 0, count: Infinity }; + + } + + BufferGeometry.MaxIndex = 65535; + + Object.assign( BufferGeometry.prototype, EventDispatcher.prototype, { + + isBufferGeometry: true, + + getIndex: function () { + + return this.index; + + }, + + setIndex: function ( index ) { + + if ( Array.isArray( index ) ) { + + this.index = new ( arrayMax( index ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 ); + + } else { + + this.index = index; + + } + + }, + + addAttribute: function ( name, attribute ) { + + if ( ( attribute && attribute.isBufferAttribute ) === false && ( attribute && attribute.isInterleavedBufferAttribute ) === false ) { + + console.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' ); + + this.addAttribute( name, new BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) ); + + return; + + } + + if ( name === 'index' ) { + + console.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' ); + this.setIndex( attribute ); + + return; + + } + + this.attributes[ name ] = attribute; + + return this; + + }, + + getAttribute: function ( name ) { + + return this.attributes[ name ]; + + }, + + removeAttribute: function ( name ) { + + delete this.attributes[ name ]; + + return this; + + }, + + addGroup: function ( start, count, materialIndex ) { + + this.groups.push( { + + start: start, + count: count, + materialIndex: materialIndex !== undefined ? materialIndex : 0 + + } ); + + }, + + clearGroups: function () { + + this.groups = []; + + }, + + setDrawRange: function ( start, count ) { + + this.drawRange.start = start; + this.drawRange.count = count; + + }, + + applyMatrix: function ( matrix ) { + + var position = this.attributes.position; + + if ( position !== undefined ) { + + matrix.applyToBufferAttribute( position ); + position.needsUpdate = true; + + } + + var normal = this.attributes.normal; + + if ( normal !== undefined ) { + + var normalMatrix = new Matrix3().getNormalMatrix( matrix ); + + normalMatrix.applyToBufferAttribute( normal ); + normal.needsUpdate = true; + + } + + if ( this.boundingBox !== null ) { + + this.computeBoundingBox(); + + } + + if ( this.boundingSphere !== null ) { + + this.computeBoundingSphere(); + + } + + return this; + + }, + + rotateX: function () { + + // rotate geometry around world x-axis + + var m1 = new Matrix4(); + + return function rotateX( angle ) { + + m1.makeRotationX( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateY: function () { + + // rotate geometry around world y-axis + + var m1 = new Matrix4(); + + return function rotateY( angle ) { + + m1.makeRotationY( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateZ: function () { + + // rotate geometry around world z-axis + + var m1 = new Matrix4(); + + return function rotateZ( angle ) { + + m1.makeRotationZ( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + translate: function () { + + // translate geometry + + var m1 = new Matrix4(); + + return function translate( x, y, z ) { + + m1.makeTranslation( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + scale: function () { + + // scale geometry + + var m1 = new Matrix4(); + + return function scale( x, y, z ) { + + m1.makeScale( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + lookAt: function () { + + var obj = new Object3D(); + + return function lookAt( vector ) { + + obj.lookAt( vector ); + + obj.updateMatrix(); + + this.applyMatrix( obj.matrix ); + + }; + + }(), + + center: function () { + + this.computeBoundingBox(); + + var offset = this.boundingBox.getCenter().negate(); + + this.translate( offset.x, offset.y, offset.z ); + + return offset; + + }, + + setFromObject: function ( object ) { + + // console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this ); + + var geometry = object.geometry; + + if ( object.isPoints || object.isLine ) { + + var positions = new Float32BufferAttribute( geometry.vertices.length * 3, 3 ); + var colors = new Float32BufferAttribute( geometry.colors.length * 3, 3 ); + + this.addAttribute( 'position', positions.copyVector3sArray( geometry.vertices ) ); + this.addAttribute( 'color', colors.copyColorsArray( geometry.colors ) ); + + if ( geometry.lineDistances && geometry.lineDistances.length === geometry.vertices.length ) { + + var lineDistances = new Float32BufferAttribute( geometry.lineDistances.length, 1 ); + + this.addAttribute( 'lineDistance', lineDistances.copyArray( geometry.lineDistances ) ); + + } + + if ( geometry.boundingSphere !== null ) { + + this.boundingSphere = geometry.boundingSphere.clone(); + + } + + if ( geometry.boundingBox !== null ) { + + this.boundingBox = geometry.boundingBox.clone(); + + } + + } else if ( object.isMesh ) { + + if ( geometry && geometry.isGeometry ) { + + this.fromGeometry( geometry ); + + } + + } + + return this; + + }, + + updateFromObject: function ( object ) { + + var geometry = object.geometry; + + if ( object.isMesh ) { + + var direct = geometry.__directGeometry; + + if ( geometry.elementsNeedUpdate === true ) { + + direct = undefined; + geometry.elementsNeedUpdate = false; + + } + + if ( direct === undefined ) { + + return this.fromGeometry( geometry ); + + } + + direct.verticesNeedUpdate = geometry.verticesNeedUpdate; + direct.normalsNeedUpdate = geometry.normalsNeedUpdate; + direct.colorsNeedUpdate = geometry.colorsNeedUpdate; + direct.uvsNeedUpdate = geometry.uvsNeedUpdate; + direct.groupsNeedUpdate = geometry.groupsNeedUpdate; + + geometry.verticesNeedUpdate = false; + geometry.normalsNeedUpdate = false; + geometry.colorsNeedUpdate = false; + geometry.uvsNeedUpdate = false; + geometry.groupsNeedUpdate = false; + + geometry = direct; + + } + + var attribute; + + if ( geometry.verticesNeedUpdate === true ) { + + attribute = this.attributes.position; + + if ( attribute !== undefined ) { + + attribute.copyVector3sArray( geometry.vertices ); + attribute.needsUpdate = true; + + } + + geometry.verticesNeedUpdate = false; + + } + + if ( geometry.normalsNeedUpdate === true ) { + + attribute = this.attributes.normal; + + if ( attribute !== undefined ) { + + attribute.copyVector3sArray( geometry.normals ); + attribute.needsUpdate = true; + + } + + geometry.normalsNeedUpdate = false; + + } + + if ( geometry.colorsNeedUpdate === true ) { + + attribute = this.attributes.color; + + if ( attribute !== undefined ) { + + attribute.copyColorsArray( geometry.colors ); + attribute.needsUpdate = true; + + } + + geometry.colorsNeedUpdate = false; + + } + + if ( geometry.uvsNeedUpdate ) { + + attribute = this.attributes.uv; + + if ( attribute !== undefined ) { + + attribute.copyVector2sArray( geometry.uvs ); + attribute.needsUpdate = true; + + } + + geometry.uvsNeedUpdate = false; + + } + + if ( geometry.lineDistancesNeedUpdate ) { + + attribute = this.attributes.lineDistance; + + if ( attribute !== undefined ) { + + attribute.copyArray( geometry.lineDistances ); + attribute.needsUpdate = true; + + } + + geometry.lineDistancesNeedUpdate = false; + + } + + if ( geometry.groupsNeedUpdate ) { + + geometry.computeGroups( object.geometry ); + this.groups = geometry.groups; + + geometry.groupsNeedUpdate = false; + + } + + return this; + + }, + + fromGeometry: function ( geometry ) { + + geometry.__directGeometry = new DirectGeometry().fromGeometry( geometry ); + + return this.fromDirectGeometry( geometry.__directGeometry ); + + }, + + fromDirectGeometry: function ( geometry ) { + + var positions = new Float32Array( geometry.vertices.length * 3 ); + this.addAttribute( 'position', new BufferAttribute( positions, 3 ).copyVector3sArray( geometry.vertices ) ); + + if ( geometry.normals.length > 0 ) { + + var normals = new Float32Array( geometry.normals.length * 3 ); + this.addAttribute( 'normal', new BufferAttribute( normals, 3 ).copyVector3sArray( geometry.normals ) ); + + } + + if ( geometry.colors.length > 0 ) { + + var colors = new Float32Array( geometry.colors.length * 3 ); + this.addAttribute( 'color', new BufferAttribute( colors, 3 ).copyColorsArray( geometry.colors ) ); + + } + + if ( geometry.uvs.length > 0 ) { + + var uvs = new Float32Array( geometry.uvs.length * 2 ); + this.addAttribute( 'uv', new BufferAttribute( uvs, 2 ).copyVector2sArray( geometry.uvs ) ); + + } + + if ( geometry.uvs2.length > 0 ) { + + var uvs2 = new Float32Array( geometry.uvs2.length * 2 ); + this.addAttribute( 'uv2', new BufferAttribute( uvs2, 2 ).copyVector2sArray( geometry.uvs2 ) ); + + } + + if ( geometry.indices.length > 0 ) { + + var TypeArray = arrayMax( geometry.indices ) > 65535 ? Uint32Array : Uint16Array; + var indices = new TypeArray( geometry.indices.length * 3 ); + this.setIndex( new BufferAttribute( indices, 1 ).copyIndicesArray( geometry.indices ) ); + + } + + // groups + + this.groups = geometry.groups; + + // morphs + + for ( var name in geometry.morphTargets ) { + + var array = []; + var morphTargets = geometry.morphTargets[ name ]; + + for ( var i = 0, l = morphTargets.length; i < l; i ++ ) { + + var morphTarget = morphTargets[ i ]; + + var attribute = new Float32BufferAttribute( morphTarget.length * 3, 3 ); + + array.push( attribute.copyVector3sArray( morphTarget ) ); + + } + + this.morphAttributes[ name ] = array; + + } + + // skinning + + if ( geometry.skinIndices.length > 0 ) { + + var skinIndices = new Float32BufferAttribute( geometry.skinIndices.length * 4, 4 ); + this.addAttribute( 'skinIndex', skinIndices.copyVector4sArray( geometry.skinIndices ) ); + + } + + if ( geometry.skinWeights.length > 0 ) { + + var skinWeights = new Float32BufferAttribute( geometry.skinWeights.length * 4, 4 ); + this.addAttribute( 'skinWeight', skinWeights.copyVector4sArray( geometry.skinWeights ) ); + + } + + // + + if ( geometry.boundingSphere !== null ) { + + this.boundingSphere = geometry.boundingSphere.clone(); + + } + + if ( geometry.boundingBox !== null ) { + + this.boundingBox = geometry.boundingBox.clone(); + + } + + return this; + + }, + + computeBoundingBox: function () { + + if ( this.boundingBox === null ) { + + this.boundingBox = new Box3(); + + } + + var position = this.attributes.position; + + if ( position !== undefined ) { + + this.boundingBox.setFromBufferAttribute( position ); + + } else { + + this.boundingBox.makeEmpty(); + + } + + if ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) { + + console.error( 'THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The "position" attribute is likely to have NaN values.', this ); + + } + + }, + + computeBoundingSphere: function () { + + var box = new Box3(); + var vector = new Vector3(); + + return function computeBoundingSphere() { + + if ( this.boundingSphere === null ) { + + this.boundingSphere = new Sphere(); + + } + + var position = this.attributes.position; + + if ( position ) { + + var center = this.boundingSphere.center; + + box.setFromBufferAttribute( position ); + box.getCenter( center ); + + // hoping to find a boundingSphere with a radius smaller than the + // boundingSphere of the boundingBox: sqrt(3) smaller in the best case + + var maxRadiusSq = 0; + + for ( var i = 0, il = position.count; i < il; i ++ ) { + + vector.x = position.getX( i ); + vector.y = position.getY( i ); + vector.z = position.getZ( i ); + maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) ); + + } + + this.boundingSphere.radius = Math.sqrt( maxRadiusSq ); + + if ( isNaN( this.boundingSphere.radius ) ) { + + console.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.', this ); + + } + + } + + }; + + }(), + + computeFaceNormals: function () { + + // backwards compatibility + + }, + + computeVertexNormals: function () { + + var index = this.index; + var attributes = this.attributes; + var groups = this.groups; + + if ( attributes.position ) { + + var positions = attributes.position.array; + + if ( attributes.normal === undefined ) { + + this.addAttribute( 'normal', new BufferAttribute( new Float32Array( positions.length ), 3 ) ); + + } else { + + // reset existing normals to zero + + var array = attributes.normal.array; + + for ( var i = 0, il = array.length; i < il; i ++ ) { + + array[ i ] = 0; + + } + + } + + var normals = attributes.normal.array; + + var vA, vB, vC; + var pA = new Vector3(), pB = new Vector3(), pC = new Vector3(); + var cb = new Vector3(), ab = new Vector3(); + + // indexed elements + + if ( index ) { + + var indices = index.array; + + if ( groups.length === 0 ) { + + this.addGroup( 0, indices.length ); + + } + + for ( var j = 0, jl = groups.length; j < jl; ++ j ) { + + var group = groups[ j ]; + + var start = group.start; + var count = group.count; + + for ( var i = start, il = start + count; i < il; i += 3 ) { + + vA = indices[ i + 0 ] * 3; + vB = indices[ i + 1 ] * 3; + vC = indices[ i + 2 ] * 3; + + pA.fromArray( positions, vA ); + pB.fromArray( positions, vB ); + pC.fromArray( positions, vC ); + + cb.subVectors( pC, pB ); + ab.subVectors( pA, pB ); + cb.cross( ab ); + + normals[ vA ] += cb.x; + normals[ vA + 1 ] += cb.y; + normals[ vA + 2 ] += cb.z; + + normals[ vB ] += cb.x; + normals[ vB + 1 ] += cb.y; + normals[ vB + 2 ] += cb.z; + + normals[ vC ] += cb.x; + normals[ vC + 1 ] += cb.y; + normals[ vC + 2 ] += cb.z; + + } + + } + + } else { + + // non-indexed elements (unconnected triangle soup) + + for ( var i = 0, il = positions.length; i < il; i += 9 ) { + + pA.fromArray( positions, i ); + pB.fromArray( positions, i + 3 ); + pC.fromArray( positions, i + 6 ); + + cb.subVectors( pC, pB ); + ab.subVectors( pA, pB ); + cb.cross( ab ); + + normals[ i ] = cb.x; + normals[ i + 1 ] = cb.y; + normals[ i + 2 ] = cb.z; + + normals[ i + 3 ] = cb.x; + normals[ i + 4 ] = cb.y; + normals[ i + 5 ] = cb.z; + + normals[ i + 6 ] = cb.x; + normals[ i + 7 ] = cb.y; + normals[ i + 8 ] = cb.z; + + } + + } + + this.normalizeNormals(); + + attributes.normal.needsUpdate = true; + + } + + }, + + merge: function ( geometry, offset ) { + + if ( ( geometry && geometry.isBufferGeometry ) === false ) { + + console.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry ); + return; + + } + + if ( offset === undefined ) offset = 0; + + var attributes = this.attributes; + + for ( var key in attributes ) { + + if ( geometry.attributes[ key ] === undefined ) continue; + + var attribute1 = attributes[ key ]; + var attributeArray1 = attribute1.array; + + var attribute2 = geometry.attributes[ key ]; + var attributeArray2 = attribute2.array; + + var attributeSize = attribute2.itemSize; + + for ( var i = 0, j = attributeSize * offset; i < attributeArray2.length; i ++, j ++ ) { + + attributeArray1[ j ] = attributeArray2[ i ]; + + } + + } + + return this; + + }, + + normalizeNormals: function () { + + var normals = this.attributes.normal; + + var x, y, z, n; + + for ( var i = 0, il = normals.count; i < il; i ++ ) { + + x = normals.getX( i ); + y = normals.getY( i ); + z = normals.getZ( i ); + + n = 1.0 / Math.sqrt( x * x + y * y + z * z ); + + normals.setXYZ( i, x * n, y * n, z * n ); + + } + + }, + + toNonIndexed: function () { + + if ( this.index === null ) { + + console.warn( 'THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.' ); + return this; + + } + + var geometry2 = new BufferGeometry(); + + var indices = this.index.array; + var attributes = this.attributes; + + for ( var name in attributes ) { + + var attribute = attributes[ name ]; + + var array = attribute.array; + var itemSize = attribute.itemSize; + + var array2 = new array.constructor( indices.length * itemSize ); + + var index = 0, index2 = 0; + + for ( var i = 0, l = indices.length; i < l; i ++ ) { + + index = indices[ i ] * itemSize; + + for ( var j = 0; j < itemSize; j ++ ) { + + array2[ index2 ++ ] = array[ index ++ ]; + + } + + } + + geometry2.addAttribute( name, new BufferAttribute( array2, itemSize ) ); + + } + + return geometry2; + + }, + + toJSON: function () { + + var data = { + metadata: { + version: 4.5, + type: 'BufferGeometry', + generator: 'BufferGeometry.toJSON' + } + }; + + // standard BufferGeometry serialization + + data.uuid = this.uuid; + data.type = this.type; + if ( this.name !== '' ) data.name = this.name; + + if ( this.parameters !== undefined ) { + + var parameters = this.parameters; + + for ( var key in parameters ) { + + if ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ]; + + } + + return data; + + } + + data.data = { attributes: {} }; + + var index = this.index; + + if ( index !== null ) { + + var array = Array.prototype.slice.call( index.array ); + + data.data.index = { + type: index.array.constructor.name, + array: array + }; + + } + + var attributes = this.attributes; + + for ( var key in attributes ) { + + var attribute = attributes[ key ]; + + var array = Array.prototype.slice.call( attribute.array ); + + data.data.attributes[ key ] = { + itemSize: attribute.itemSize, + type: attribute.array.constructor.name, + array: array, + normalized: attribute.normalized + }; + + } + + var groups = this.groups; + + if ( groups.length > 0 ) { + + data.data.groups = JSON.parse( JSON.stringify( groups ) ); + + } + + var boundingSphere = this.boundingSphere; + + if ( boundingSphere !== null ) { + + data.data.boundingSphere = { + center: boundingSphere.center.toArray(), + radius: boundingSphere.radius + }; + + } + + return data; + + }, + + clone: function () { + + /* + // Handle primitives + + var parameters = this.parameters; + + if ( parameters !== undefined ) { + + var values = []; + + for ( var key in parameters ) { + + values.push( parameters[ key ] ); + + } + + var geometry = Object.create( this.constructor.prototype ); + this.constructor.apply( geometry, values ); + return geometry; + + } + + return new this.constructor().copy( this ); + */ + + return new BufferGeometry().copy( this ); + + }, + + copy: function ( source ) { + + var name, i, l; + + // reset + + this.index = null; + this.attributes = {}; + this.morphAttributes = {}; + this.groups = []; + this.boundingBox = null; + this.boundingSphere = null; + + // name + + this.name = source.name; + + // index + + var index = source.index; + + if ( index !== null ) { + + this.setIndex( index.clone() ); + + } + + // attributes + + var attributes = source.attributes; + + for ( name in attributes ) { + + var attribute = attributes[ name ]; + this.addAttribute( name, attribute.clone() ); + + } + + // morph attributes + + var morphAttributes = source.morphAttributes; + + for ( name in morphAttributes ) { + + var array = []; + var morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes + + for ( i = 0, l = morphAttribute.length; i < l; i ++ ) { + + array.push( morphAttribute[ i ].clone() ); + + } + + this.morphAttributes[ name ] = array; + + } + + // groups + + var groups = source.groups; + + for ( i = 0, l = groups.length; i < l; i ++ ) { + + var group = groups[ i ]; + this.addGroup( group.start, group.count, group.materialIndex ); + + } + + // bounding box + + var boundingBox = source.boundingBox; + + if ( boundingBox !== null ) { + + this.boundingBox = boundingBox.clone(); + + } + + // bounding sphere + + var boundingSphere = source.boundingSphere; + + if ( boundingSphere !== null ) { + + this.boundingSphere = boundingSphere.clone(); + + } + + // draw range + + this.drawRange.start = source.drawRange.start; + this.drawRange.count = source.drawRange.count; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author mikael emtinger / http://gomo.se/ + * @author jonobr1 / http://jonobr1.com/ + */ + + function Mesh( geometry, material ) { + + Object3D.call( this ); + + this.type = 'Mesh'; + + this.geometry = geometry !== undefined ? geometry : new BufferGeometry(); + this.material = material !== undefined ? material : new MeshBasicMaterial( { color: Math.random() * 0xffffff } ); + + this.drawMode = TrianglesDrawMode; + + this.updateMorphTargets(); + + } + + Mesh.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Mesh, + + isMesh: true, + + setDrawMode: function ( value ) { + + this.drawMode = value; + + }, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + this.drawMode = source.drawMode; + + return this; + + }, + + updateMorphTargets: function () { + + var morphTargets = this.geometry.morphTargets; + + if ( morphTargets !== undefined && morphTargets.length > 0 ) { + + this.morphTargetInfluences = []; + this.morphTargetDictionary = {}; + + for ( var m = 0, ml = morphTargets.length; m < ml; m ++ ) { + + this.morphTargetInfluences.push( 0 ); + this.morphTargetDictionary[ morphTargets[ m ].name ] = m; + + } + + } + + }, + + raycast: ( function () { + + var inverseMatrix = new Matrix4(); + var ray = new Ray(); + var sphere = new Sphere(); + + var vA = new Vector3(); + var vB = new Vector3(); + var vC = new Vector3(); + + var tempA = new Vector3(); + var tempB = new Vector3(); + var tempC = new Vector3(); + + var uvA = new Vector2(); + var uvB = new Vector2(); + var uvC = new Vector2(); + + var barycoord = new Vector3(); + + var intersectionPoint = new Vector3(); + var intersectionPointWorld = new Vector3(); + + function uvIntersection( point, p1, p2, p3, uv1, uv2, uv3 ) { + + Triangle.barycoordFromPoint( point, p1, p2, p3, barycoord ); + + uv1.multiplyScalar( barycoord.x ); + uv2.multiplyScalar( barycoord.y ); + uv3.multiplyScalar( barycoord.z ); + + uv1.add( uv2 ).add( uv3 ); + + return uv1.clone(); + + } + + function checkIntersection( object, raycaster, ray, pA, pB, pC, point ) { + + var intersect; + var material = object.material; + + if ( material.side === BackSide ) { + + intersect = ray.intersectTriangle( pC, pB, pA, true, point ); + + } else { + + intersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide, point ); + + } + + if ( intersect === null ) return null; + + intersectionPointWorld.copy( point ); + intersectionPointWorld.applyMatrix4( object.matrixWorld ); + + var distance = raycaster.ray.origin.distanceTo( intersectionPointWorld ); + + if ( distance < raycaster.near || distance > raycaster.far ) return null; + + return { + distance: distance, + point: intersectionPointWorld.clone(), + object: object + }; + + } + + function checkBufferGeometryIntersection( object, raycaster, ray, position, uv, a, b, c ) { + + vA.fromBufferAttribute( position, a ); + vB.fromBufferAttribute( position, b ); + vC.fromBufferAttribute( position, c ); + + var intersection = checkIntersection( object, raycaster, ray, vA, vB, vC, intersectionPoint ); + + if ( intersection ) { + + if ( uv ) { + + uvA.fromBufferAttribute( uv, a ); + uvB.fromBufferAttribute( uv, b ); + uvC.fromBufferAttribute( uv, c ); + + intersection.uv = uvIntersection( intersectionPoint, vA, vB, vC, uvA, uvB, uvC ); + + } + + intersection.face = new Face3( a, b, c, Triangle.normal( vA, vB, vC ) ); + intersection.faceIndex = a; + + } + + return intersection; + + } + + return function raycast( raycaster, intersects ) { + + var geometry = this.geometry; + var material = this.material; + var matrixWorld = this.matrixWorld; + + if ( material === undefined ) return; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ); + sphere.applyMatrix4( matrixWorld ); + + if ( raycaster.ray.intersectsSphere( sphere ) === false ) return; + + // + + inverseMatrix.getInverse( matrixWorld ); + ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); + + // Check boundingBox before continuing + + if ( geometry.boundingBox !== null ) { + + if ( ray.intersectsBox( geometry.boundingBox ) === false ) return; + + } + + var intersection; + + if ( geometry.isBufferGeometry ) { + + var a, b, c; + var index = geometry.index; + var position = geometry.attributes.position; + var uv = geometry.attributes.uv; + var i, l; + + if ( index !== null ) { + + // indexed buffer geometry + + for ( i = 0, l = index.count; i < l; i += 3 ) { + + a = index.getX( i ); + b = index.getX( i + 1 ); + c = index.getX( i + 2 ); + + intersection = checkBufferGeometryIntersection( this, raycaster, ray, position, uv, a, b, c ); + + if ( intersection ) { + + intersection.faceIndex = Math.floor( i / 3 ); // triangle number in indices buffer semantics + intersects.push( intersection ); + + } + + } + + } else { + + // non-indexed buffer geometry + + for ( i = 0, l = position.count; i < l; i += 3 ) { + + a = i; + b = i + 1; + c = i + 2; + + intersection = checkBufferGeometryIntersection( this, raycaster, ray, position, uv, a, b, c ); + + if ( intersection ) { + + intersection.index = a; // triangle number in positions buffer semantics + intersects.push( intersection ); + + } + + } + + } + + } else if ( geometry.isGeometry ) { + + var fvA, fvB, fvC; + var isMultiMaterial = Array.isArray( material ); + + var vertices = geometry.vertices; + var faces = geometry.faces; + var uvs; + + var faceVertexUvs = geometry.faceVertexUvs[ 0 ]; + if ( faceVertexUvs.length > 0 ) uvs = faceVertexUvs; + + for ( var f = 0, fl = faces.length; f < fl; f ++ ) { + + var face = faces[ f ]; + var faceMaterial = isMultiMaterial ? material[ face.materialIndex ] : material; + + if ( faceMaterial === undefined ) continue; + + fvA = vertices[ face.a ]; + fvB = vertices[ face.b ]; + fvC = vertices[ face.c ]; + + if ( faceMaterial.morphTargets === true ) { + + var morphTargets = geometry.morphTargets; + var morphInfluences = this.morphTargetInfluences; + + vA.set( 0, 0, 0 ); + vB.set( 0, 0, 0 ); + vC.set( 0, 0, 0 ); + + for ( var t = 0, tl = morphTargets.length; t < tl; t ++ ) { + + var influence = morphInfluences[ t ]; + + if ( influence === 0 ) continue; + + var targets = morphTargets[ t ].vertices; + + vA.addScaledVector( tempA.subVectors( targets[ face.a ], fvA ), influence ); + vB.addScaledVector( tempB.subVectors( targets[ face.b ], fvB ), influence ); + vC.addScaledVector( tempC.subVectors( targets[ face.c ], fvC ), influence ); + + } + + vA.add( fvA ); + vB.add( fvB ); + vC.add( fvC ); + + fvA = vA; + fvB = vB; + fvC = vC; + + } + + intersection = checkIntersection( this, raycaster, ray, fvA, fvB, fvC, intersectionPoint ); + + if ( intersection ) { + + if ( uvs && uvs[ f ] ) { + + var uvs_f = uvs[ f ]; + uvA.copy( uvs_f[ 0 ] ); + uvB.copy( uvs_f[ 1 ] ); + uvC.copy( uvs_f[ 2 ] ); + + intersection.uv = uvIntersection( intersectionPoint, fvA, fvB, fvC, uvA, uvB, uvC ); + + } + + intersection.face = face; + intersection.faceIndex = f; + intersects.push( intersection ); + + } + + } + + } + + }; + + }() ), + + clone: function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + // BoxGeometry + + function BoxGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) { + + Geometry.call( this ); + + this.type = 'BoxGeometry'; + + this.parameters = { + width: width, + height: height, + depth: depth, + widthSegments: widthSegments, + heightSegments: heightSegments, + depthSegments: depthSegments + }; + + this.fromBufferGeometry( new BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) ); + this.mergeVertices(); + + } + + BoxGeometry.prototype = Object.create( Geometry.prototype ); + BoxGeometry.prototype.constructor = BoxGeometry; + + // BoxBufferGeometry + + function BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) { + + BufferGeometry.call( this ); + + this.type = 'BoxBufferGeometry'; + + this.parameters = { + width: width, + height: height, + depth: depth, + widthSegments: widthSegments, + heightSegments: heightSegments, + depthSegments: depthSegments + }; + + var scope = this; + + // segments + + widthSegments = Math.floor( widthSegments ) || 1; + heightSegments = Math.floor( heightSegments ) || 1; + depthSegments = Math.floor( depthSegments ) || 1; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var numberOfVertices = 0; + var groupStart = 0; + + // build each side of the box geometry + + buildPlane( 'z', 'y', 'x', - 1, - 1, depth, height, width, depthSegments, heightSegments, 0 ); // px + buildPlane( 'z', 'y', 'x', 1, - 1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx + buildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py + buildPlane( 'x', 'z', 'y', 1, - 1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny + buildPlane( 'x', 'y', 'z', 1, - 1, width, height, depth, widthSegments, heightSegments, 4 ); // pz + buildPlane( 'x', 'y', 'z', - 1, - 1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + function buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) { + + var segmentWidth = width / gridX; + var segmentHeight = height / gridY; + + var widthHalf = width / 2; + var heightHalf = height / 2; + var depthHalf = depth / 2; + + var gridX1 = gridX + 1; + var gridY1 = gridY + 1; + + var vertexCounter = 0; + var groupCount = 0; + + var ix, iy; + + var vector = new Vector3(); + + // generate vertices, normals and uvs + + for ( iy = 0; iy < gridY1; iy ++ ) { + + var y = iy * segmentHeight - heightHalf; + + for ( ix = 0; ix < gridX1; ix ++ ) { + + var x = ix * segmentWidth - widthHalf; + + // set values to correct vector component + + vector[ u ] = x * udir; + vector[ v ] = y * vdir; + vector[ w ] = depthHalf; + + // now apply vector to vertex buffer + + vertices.push( vector.x, vector.y, vector.z ); + + // set values to correct vector component + + vector[ u ] = 0; + vector[ v ] = 0; + vector[ w ] = depth > 0 ? 1 : - 1; + + // now apply vector to normal buffer + + normals.push( vector.x, vector.y, vector.z ); + + // uvs + + uvs.push( ix / gridX ); + uvs.push( 1 - ( iy / gridY ) ); + + // counters + + vertexCounter += 1; + + } + + } + + // indices + + // 1. you need three indices to draw a single face + // 2. a single segment consists of two faces + // 3. so we need to generate six (2*3) indices per segment + + for ( iy = 0; iy < gridY; iy ++ ) { + + for ( ix = 0; ix < gridX; ix ++ ) { + + var a = numberOfVertices + ix + gridX1 * iy; + var b = numberOfVertices + ix + gridX1 * ( iy + 1 ); + var c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 ); + var d = numberOfVertices + ( ix + 1 ) + gridX1 * iy; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + // increase counter + + groupCount += 6; + + } + + } + + // add a group to the geometry. this will ensure multi material support + + scope.addGroup( groupStart, groupCount, materialIndex ); + + // calculate new start value for groups + + groupStart += groupCount; + + // update total number of vertices + + numberOfVertices += vertexCounter; + + } + + } + + BoxBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + BoxBufferGeometry.prototype.constructor = BoxBufferGeometry; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + // PlaneGeometry + + function PlaneGeometry( width, height, widthSegments, heightSegments ) { + + Geometry.call( this ); + + this.type = 'PlaneGeometry'; + + this.parameters = { + width: width, + height: height, + widthSegments: widthSegments, + heightSegments: heightSegments + }; + + this.fromBufferGeometry( new PlaneBufferGeometry( width, height, widthSegments, heightSegments ) ); + this.mergeVertices(); + + } + + PlaneGeometry.prototype = Object.create( Geometry.prototype ); + PlaneGeometry.prototype.constructor = PlaneGeometry; + + // PlaneBufferGeometry + + function PlaneBufferGeometry( width, height, widthSegments, heightSegments ) { + + BufferGeometry.call( this ); + + this.type = 'PlaneBufferGeometry'; + + this.parameters = { + width: width, + height: height, + widthSegments: widthSegments, + heightSegments: heightSegments + }; + + var width_half = width / 2; + var height_half = height / 2; + + var gridX = Math.floor( widthSegments ) || 1; + var gridY = Math.floor( heightSegments ) || 1; + + var gridX1 = gridX + 1; + var gridY1 = gridY + 1; + + var segment_width = width / gridX; + var segment_height = height / gridY; + + var ix, iy; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // generate vertices, normals and uvs + + for ( iy = 0; iy < gridY1; iy ++ ) { + + var y = iy * segment_height - height_half; + + for ( ix = 0; ix < gridX1; ix ++ ) { + + var x = ix * segment_width - width_half; + + vertices.push( x, - y, 0 ); + + normals.push( 0, 0, 1 ); + + uvs.push( ix / gridX ); + uvs.push( 1 - ( iy / gridY ) ); + + } + + } + + // indices + + for ( iy = 0; iy < gridY; iy ++ ) { + + for ( ix = 0; ix < gridX; ix ++ ) { + + var a = ix + gridX1 * iy; + var b = ix + gridX1 * ( iy + 1 ); + var c = ( ix + 1 ) + gridX1 * ( iy + 1 ); + var d = ( ix + 1 ) + gridX1 * iy; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + PlaneBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + PlaneBufferGeometry.prototype.constructor = PlaneBufferGeometry; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author mikael emtinger / http://gomo.se/ + * @author WestLangley / http://github.com/WestLangley + */ + + function Camera() { + + Object3D.call( this ); + + this.type = 'Camera'; + + this.matrixWorldInverse = new Matrix4(); + this.projectionMatrix = new Matrix4(); + + } + + Camera.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Camera, + + isCamera: true, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + this.matrixWorldInverse.copy( source.matrixWorldInverse ); + this.projectionMatrix.copy( source.projectionMatrix ); + + return this; + + }, + + getWorldDirection: function () { + + var quaternion = new Quaternion(); + + return function getWorldDirection( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + this.getWorldQuaternion( quaternion ); + + return result.set( 0, 0, - 1 ).applyQuaternion( quaternion ); + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author greggman / http://games.greggman.com/ + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author tschw + */ + + function PerspectiveCamera( fov, aspect, near, far ) { + + Camera.call( this ); + + this.type = 'PerspectiveCamera'; + + this.fov = fov !== undefined ? fov : 50; + this.zoom = 1; + + this.near = near !== undefined ? near : 0.1; + this.far = far !== undefined ? far : 2000; + this.focus = 10; + + this.aspect = aspect !== undefined ? aspect : 1; + this.view = null; + + this.filmGauge = 35; // width of the film (default in millimeters) + this.filmOffset = 0; // horizontal film offset (same unit as gauge) + + this.updateProjectionMatrix(); + + } + + PerspectiveCamera.prototype = Object.assign( Object.create( Camera.prototype ), { + + constructor: PerspectiveCamera, + + isPerspectiveCamera: true, + + copy: function ( source ) { + + Camera.prototype.copy.call( this, source ); + + this.fov = source.fov; + this.zoom = source.zoom; + + this.near = source.near; + this.far = source.far; + this.focus = source.focus; + + this.aspect = source.aspect; + this.view = source.view === null ? null : Object.assign( {}, source.view ); + + this.filmGauge = source.filmGauge; + this.filmOffset = source.filmOffset; + + return this; + + }, + + /** + * Sets the FOV by focal length in respect to the current .filmGauge. + * + * The default film gauge is 35, so that the focal length can be specified for + * a 35mm (full frame) camera. + * + * Values for focal length and film gauge must have the same unit. + */ + setFocalLength: function ( focalLength ) { + + // see http://www.bobatkins.com/photography/technical/field_of_view.html + var vExtentSlope = 0.5 * this.getFilmHeight() / focalLength; + + this.fov = _Math.RAD2DEG * 2 * Math.atan( vExtentSlope ); + this.updateProjectionMatrix(); + + }, + + /** + * Calculates the focal length from the current .fov and .filmGauge. + */ + getFocalLength: function () { + + var vExtentSlope = Math.tan( _Math.DEG2RAD * 0.5 * this.fov ); + + return 0.5 * this.getFilmHeight() / vExtentSlope; + + }, + + getEffectiveFOV: function () { + + return _Math.RAD2DEG * 2 * Math.atan( + Math.tan( _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom ); + + }, + + getFilmWidth: function () { + + // film not completely covered in portrait format (aspect < 1) + return this.filmGauge * Math.min( this.aspect, 1 ); + + }, + + getFilmHeight: function () { + + // film not completely covered in landscape format (aspect > 1) + return this.filmGauge / Math.max( this.aspect, 1 ); + + }, + + /** + * Sets an offset in a larger frustum. This is useful for multi-window or + * multi-monitor/multi-machine setups. + * + * For example, if you have 3x2 monitors and each monitor is 1920x1080 and + * the monitors are in grid like this + * + * +---+---+---+ + * | A | B | C | + * +---+---+---+ + * | D | E | F | + * +---+---+---+ + * + * then for each monitor you would call it like this + * + * var w = 1920; + * var h = 1080; + * var fullWidth = w * 3; + * var fullHeight = h * 2; + * + * --A-- + * camera.setOffset( fullWidth, fullHeight, w * 0, h * 0, w, h ); + * --B-- + * camera.setOffset( fullWidth, fullHeight, w * 1, h * 0, w, h ); + * --C-- + * camera.setOffset( fullWidth, fullHeight, w * 2, h * 0, w, h ); + * --D-- + * camera.setOffset( fullWidth, fullHeight, w * 0, h * 1, w, h ); + * --E-- + * camera.setOffset( fullWidth, fullHeight, w * 1, h * 1, w, h ); + * --F-- + * camera.setOffset( fullWidth, fullHeight, w * 2, h * 1, w, h ); + * + * Note there is no reason monitors have to be the same size or in a grid. + */ + setViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) { + + this.aspect = fullWidth / fullHeight; + + this.view = { + fullWidth: fullWidth, + fullHeight: fullHeight, + offsetX: x, + offsetY: y, + width: width, + height: height + }; + + this.updateProjectionMatrix(); + + }, + + clearViewOffset: function () { + + this.view = null; + this.updateProjectionMatrix(); + + }, + + updateProjectionMatrix: function () { + + var near = this.near, + top = near * Math.tan( + _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom, + height = 2 * top, + width = this.aspect * height, + left = - 0.5 * width, + view = this.view; + + if ( view !== null ) { + + var fullWidth = view.fullWidth, + fullHeight = view.fullHeight; + + left += view.offsetX * width / fullWidth; + top -= view.offsetY * height / fullHeight; + width *= view.width / fullWidth; + height *= view.height / fullHeight; + + } + + var skew = this.filmOffset; + if ( skew !== 0 ) left += near * skew / this.getFilmWidth(); + + this.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far ); + + }, + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.fov = this.fov; + data.object.zoom = this.zoom; + + data.object.near = this.near; + data.object.far = this.far; + data.object.focus = this.focus; + + data.object.aspect = this.aspect; + + if ( this.view !== null ) data.object.view = Object.assign( {}, this.view ); + + data.object.filmGauge = this.filmGauge; + data.object.filmOffset = this.filmOffset; + + return data; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author arose / http://github.com/arose + */ + + function OrthographicCamera( left, right, top, bottom, near, far ) { + + Camera.call( this ); + + this.type = 'OrthographicCamera'; + + this.zoom = 1; + this.view = null; + + this.left = left; + this.right = right; + this.top = top; + this.bottom = bottom; + + this.near = ( near !== undefined ) ? near : 0.1; + this.far = ( far !== undefined ) ? far : 2000; + + this.updateProjectionMatrix(); + + } + + OrthographicCamera.prototype = Object.assign( Object.create( Camera.prototype ), { + + constructor: OrthographicCamera, + + isOrthographicCamera: true, + + copy: function ( source ) { + + Camera.prototype.copy.call( this, source ); + + this.left = source.left; + this.right = source.right; + this.top = source.top; + this.bottom = source.bottom; + this.near = source.near; + this.far = source.far; + + this.zoom = source.zoom; + this.view = source.view === null ? null : Object.assign( {}, source.view ); + + return this; + + }, + + setViewOffset: function( fullWidth, fullHeight, x, y, width, height ) { + + this.view = { + fullWidth: fullWidth, + fullHeight: fullHeight, + offsetX: x, + offsetY: y, + width: width, + height: height + }; + + this.updateProjectionMatrix(); + + }, + + clearViewOffset: function() { + + this.view = null; + this.updateProjectionMatrix(); + + }, + + updateProjectionMatrix: function () { + + var dx = ( this.right - this.left ) / ( 2 * this.zoom ); + var dy = ( this.top - this.bottom ) / ( 2 * this.zoom ); + var cx = ( this.right + this.left ) / 2; + var cy = ( this.top + this.bottom ) / 2; + + var left = cx - dx; + var right = cx + dx; + var top = cy + dy; + var bottom = cy - dy; + + if ( this.view !== null ) { + + var zoomW = this.zoom / ( this.view.width / this.view.fullWidth ); + var zoomH = this.zoom / ( this.view.height / this.view.fullHeight ); + var scaleW = ( this.right - this.left ) / this.view.width; + var scaleH = ( this.top - this.bottom ) / this.view.height; + + left += scaleW * ( this.view.offsetX / zoomW ); + right = left + scaleW * ( this.view.width / zoomW ); + top -= scaleH * ( this.view.offsetY / zoomH ); + bottom = top - scaleH * ( this.view.height / zoomH ); + + } + + this.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far ); + + }, + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.zoom = this.zoom; + data.object.left = this.left; + data.object.right = this.right; + data.object.top = this.top; + data.object.bottom = this.bottom; + data.object.near = this.near; + data.object.far = this.far; + + if ( this.view !== null ) data.object.view = Object.assign( {}, this.view ); + + return data; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLAttributes( gl ) { + + var buffers = {}; + + function createBuffer( attribute, bufferType ) { + + var array = attribute.array; + var usage = attribute.dynamic ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW; + + var buffer = gl.createBuffer(); + + gl.bindBuffer( bufferType, buffer ); + gl.bufferData( bufferType, array, usage ); + + attribute.onUploadCallback(); + + var type = gl.FLOAT; + + if ( array instanceof Float32Array ) { + + type = gl.FLOAT; + + } else if ( array instanceof Float64Array ) { + + console.warn( "Unsupported data buffer format: Float64Array" ); + + } else if ( array instanceof Uint16Array ) { + + type = gl.UNSIGNED_SHORT; + + } else if ( array instanceof Int16Array ) { + + type = gl.SHORT; + + } else if ( array instanceof Uint32Array ) { + + type = gl.UNSIGNED_INT; + + } else if ( array instanceof Int32Array ) { + + type = gl.INT; + + } else if ( array instanceof Int8Array ) { + + type = gl.BYTE; + + } else if ( array instanceof Uint8Array ) { + + type = gl.UNSIGNED_BYTE; + + } + + return { + buffer: buffer, + type: type, + bytesPerElement: array.BYTES_PER_ELEMENT, + version: attribute.version + }; + + } + + function updateBuffer( buffer, attribute, bufferType ) { + + var array = attribute.array; + var updateRange = attribute.updateRange; + + gl.bindBuffer( bufferType, buffer ); + + if ( attribute.dynamic === false ) { + + gl.bufferData( bufferType, array, gl.STATIC_DRAW ); + + } else if ( updateRange.count === - 1 ) { + + // Not using update ranges + + gl.bufferSubData( bufferType, 0, array ); + + } else if ( updateRange.count === 0 ) { + + console.error( 'THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually.' ); + + } else { + + gl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT, + array.subarray( updateRange.offset, updateRange.offset + updateRange.count ) ); + + updateRange.count = 0; // reset range + + } + + } + + // + + function get( attribute ) { + + if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data; + + return buffers[ attribute.uuid ]; + + } + + function remove( attribute ) { + + var data = buffers[ attribute.uuid ]; + + if ( data ) { + + gl.deleteBuffer( data.buffer ); + + delete buffers[ attribute.uuid ]; + + } + + } + + function update( attribute, bufferType ) { + + if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data; + + var data = buffers[ attribute.uuid ]; + + if ( data === undefined ) { + + buffers[ attribute.uuid ] = createBuffer( attribute, bufferType ); + + } else if ( data.version < attribute.version ) { + + updateBuffer( data.buffer, attribute, bufferType ); + + data.version = attribute.version; + + } + + } + + return { + + get: get, + remove: remove, + update: update + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function painterSortStable( a, b ) { + + if ( a.renderOrder !== b.renderOrder ) { + + return a.renderOrder - b.renderOrder; + + } else if ( a.program && b.program && a.program !== b.program ) { + + return a.program.id - b.program.id; + + } else if ( a.material.id !== b.material.id ) { + + return a.material.id - b.material.id; + + } else if ( a.z !== b.z ) { + + return a.z - b.z; + + } else { + + return a.id - b.id; + + } + + } + + function reversePainterSortStable( a, b ) { + + if ( a.renderOrder !== b.renderOrder ) { + + return a.renderOrder - b.renderOrder; + + } if ( a.z !== b.z ) { + + return b.z - a.z; + + } else { + + return a.id - b.id; + + } + + } + + function WebGLRenderList() { + + var opaque = []; + var opaqueLastIndex = - 1; + + var transparent = []; + var transparentLastIndex = - 1; + + function init() { + + opaqueLastIndex = - 1; + transparentLastIndex = - 1; + + } + + function push( object, geometry, material, z, group ) { + + var array, index; + + // allocate the next position in the appropriate array + + if ( material.transparent ) { + + array = transparent; + index = ++ transparentLastIndex; + + } else { + + array = opaque; + index = ++ opaqueLastIndex; + + } + + // recycle existing render item or grow the array + + var renderItem = array[ index ]; + + if ( renderItem ) { + + renderItem.id = object.id; + renderItem.object = object; + renderItem.geometry = geometry; + renderItem.material = material; + renderItem.program = material.program; + renderItem.renderOrder = object.renderOrder; + renderItem.z = z; + renderItem.group = group; + + } else { + + renderItem = { + id: object.id, + object: object, + geometry: geometry, + material: material, + program: material.program, + renderOrder: object.renderOrder, + z: z, + group: group + }; + + // assert( index === array.length ); + array.push( renderItem ); + + } + + } + + function finish() { + + opaque.length = opaqueLastIndex + 1; + transparent.length = transparentLastIndex + 1; + + } + + function sort() { + + opaque.sort( painterSortStable ); + transparent.sort( reversePainterSortStable ); + + } + + return { + opaque: opaque, + transparent: transparent, + + init: init, + push: push, + finish: finish, + + sort: sort + }; + + } + + function WebGLRenderLists() { + + var lists = {}; + + function get( scene, camera ) { + + var hash = scene.id + ',' + camera.id; + var list = lists[ hash ]; + + if ( list === undefined ) { + + // console.log( 'THREE.WebGLRenderLists:', hash ); + + list = new WebGLRenderList(); + lists[ hash ] = list; + + } + + return list; + + } + + function dispose() { + + lists = {}; + + } + + return { + get: get, + dispose: dispose + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLIndexedBufferRenderer( gl, extensions, infoRender ) { + + var mode; + + function setMode( value ) { + + mode = value; + + } + + var type, size; + + function setIndex( index ) { + + if ( index.array instanceof Uint32Array && extensions.get( 'OES_element_index_uint' ) ) { + + type = gl.UNSIGNED_INT; + size = 4; + + } else if ( index.array instanceof Uint16Array ) { + + type = gl.UNSIGNED_SHORT; + size = 2; + + } else { + + type = gl.UNSIGNED_BYTE; + size = 1; + + } + + } + + function render( start, count ) { + + gl.drawElements( mode, count, type, start * size ); + + infoRender.calls ++; + infoRender.vertices += count; + + if ( mode === gl.TRIANGLES ) infoRender.faces += count / 3; + + } + + function renderInstances( geometry, start, count ) { + + var extension = extensions.get( 'ANGLE_instanced_arrays' ); + + if ( extension === null ) { + + console.error( 'THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + extension.drawElementsInstancedANGLE( mode, count, type, start * size, geometry.maxInstancedCount ); + + infoRender.calls ++; + infoRender.vertices += count * geometry.maxInstancedCount; + + if ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3; + + } + + // + + this.setMode = setMode; + this.setIndex = setIndex; + this.render = render; + this.renderInstances = renderInstances; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLBufferRenderer( gl, extensions, infoRender ) { + + var mode; + + function setMode( value ) { + + mode = value; + + } + + function render( start, count ) { + + gl.drawArrays( mode, start, count ); + + infoRender.calls ++; + infoRender.vertices += count; + + if ( mode === gl.TRIANGLES ) infoRender.faces += count / 3; + + } + + function renderInstances( geometry, start, count ) { + + var extension = extensions.get( 'ANGLE_instanced_arrays' ); + + if ( extension === null ) { + + console.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + var position = geometry.attributes.position; + + if ( position.isInterleavedBufferAttribute ) { + + count = position.data.count; + + extension.drawArraysInstancedANGLE( mode, 0, count, geometry.maxInstancedCount ); + + } else { + + extension.drawArraysInstancedANGLE( mode, start, count, geometry.maxInstancedCount ); + + } + + infoRender.calls ++; + infoRender.vertices += count * geometry.maxInstancedCount; + + if ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3; + + } + + // + + this.setMode = setMode; + this.render = render; + this.renderInstances = renderInstances; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLGeometries( gl, attributes, infoMemory ) { + + var geometries = {}; + var wireframeAttributes = {}; + + function onGeometryDispose( event ) { + + var geometry = event.target; + var buffergeometry = geometries[ geometry.id ]; + + if ( buffergeometry.index !== null ) { + + attributes.remove( buffergeometry.index ); + + } + + for ( var name in buffergeometry.attributes ) { + + attributes.remove( buffergeometry.attributes[ name ] ); + + } + + geometry.removeEventListener( 'dispose', onGeometryDispose ); + + delete geometries[ geometry.id ]; + + // TODO Remove duplicate code + + var attribute = wireframeAttributes[ geometry.id ]; + + if ( attribute ) { + + attributes.remove( attribute ); + delete wireframeAttributes[ geometry.id ]; + + } + + attribute = wireframeAttributes[ buffergeometry.id ]; + + if ( attribute ) { + + attributes.remove( attribute ); + delete wireframeAttributes[ buffergeometry.id ]; + + } + + // + + infoMemory.geometries --; + + } + + function get( object, geometry ) { + + var buffergeometry = geometries[ geometry.id ]; + + if ( buffergeometry ) return buffergeometry; + + geometry.addEventListener( 'dispose', onGeometryDispose ); + + if ( geometry.isBufferGeometry ) { + + buffergeometry = geometry; + + } else if ( geometry.isGeometry ) { + + if ( geometry._bufferGeometry === undefined ) { + + geometry._bufferGeometry = new BufferGeometry().setFromObject( object ); + + } + + buffergeometry = geometry._bufferGeometry; + + } + + geometries[ geometry.id ] = buffergeometry; + + infoMemory.geometries ++; + + return buffergeometry; + + } + + function update( geometry ) { + + var index = geometry.index; + var geometryAttributes = geometry.attributes; + + if ( index !== null ) { + + attributes.update( index, gl.ELEMENT_ARRAY_BUFFER ); + + } + + for ( var name in geometryAttributes ) { + + attributes.update( geometryAttributes[ name ], gl.ARRAY_BUFFER ); + + } + + // morph targets + + var morphAttributes = geometry.morphAttributes; + + for ( var name in morphAttributes ) { + + var array = morphAttributes[ name ]; + + for ( var i = 0, l = array.length; i < l; i ++ ) { + + attributes.update( array[ i ], gl.ARRAY_BUFFER ); + + } + + } + + } + + function getWireframeAttribute( geometry ) { + + var attribute = wireframeAttributes[ geometry.id ]; + + if ( attribute ) return attribute; + + var indices = []; + + var geometryIndex = geometry.index; + var geometryAttributes = geometry.attributes; + + // console.time( 'wireframe' ); + + if ( geometryIndex !== null ) { + + var array = geometryIndex.array; + + for ( var i = 0, l = array.length; i < l; i += 3 ) { + + var a = array[ i + 0 ]; + var b = array[ i + 1 ]; + var c = array[ i + 2 ]; + + indices.push( a, b, b, c, c, a ); + + } + + } else { + + var array = geometryAttributes.position.array; + + for ( var i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) { + + var a = i + 0; + var b = i + 1; + var c = i + 2; + + indices.push( a, b, b, c, c, a ); + + } + + } + + // console.timeEnd( 'wireframe' ); + + attribute = new ( arrayMax( indices ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 ); + + attributes.update( attribute, gl.ELEMENT_ARRAY_BUFFER ); + + wireframeAttributes[ geometry.id ] = attribute; + + return attribute; + + } + + return { + + get: get, + update: update, + + getWireframeAttribute: getWireframeAttribute + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLLights() { + + var lights = {}; + + return { + + get: function ( light ) { + + if ( lights[ light.id ] !== undefined ) { + + return lights[ light.id ]; + + } + + var uniforms; + + switch ( light.type ) { + + case 'DirectionalLight': + uniforms = { + direction: new Vector3(), + color: new Color(), + + shadow: false, + shadowBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2() + }; + break; + + case 'SpotLight': + uniforms = { + position: new Vector3(), + direction: new Vector3(), + color: new Color(), + distance: 0, + coneCos: 0, + penumbraCos: 0, + decay: 0, + + shadow: false, + shadowBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2() + }; + break; + + case 'PointLight': + uniforms = { + position: new Vector3(), + color: new Color(), + distance: 0, + decay: 0, + + shadow: false, + shadowBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2() + }; + break; + + case 'HemisphereLight': + uniforms = { + direction: new Vector3(), + skyColor: new Color(), + groundColor: new Color() + }; + break; + + case 'RectAreaLight': + uniforms = { + color: new Color(), + position: new Vector3(), + halfWidth: new Vector3(), + halfHeight: new Vector3() + // TODO (abelnation): set RectAreaLight shadow uniforms + }; + break; + + } + + lights[ light.id ] = uniforms; + + return uniforms; + + } + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLObjects( gl, geometries, infoRender ) { + + var updateList = {}; + + function update( object ) { + + var frame = infoRender.frame; + + var geometry = object.geometry; + var buffergeometry = geometries.get( object, geometry ); + + // Update once per frame + + if ( updateList[ buffergeometry.id ] !== frame ) { + + if ( geometry.isGeometry ) { + + buffergeometry.updateFromObject( object ); + + } + + geometries.update( buffergeometry ); + + updateList[ buffergeometry.id ] = frame; + + } + + return buffergeometry; + + } + + function clear() { + + updateList = {}; + + } + + return { + + update: update, + clear: clear + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function addLineNumbers( string ) { + + var lines = string.split( '\n' ); + + for ( var i = 0; i < lines.length; i ++ ) { + + lines[ i ] = ( i + 1 ) + ': ' + lines[ i ]; + + } + + return lines.join( '\n' ); + + } + + function WebGLShader( gl, type, string ) { + + var shader = gl.createShader( type ); + + gl.shaderSource( shader, string ); + gl.compileShader( shader ); + + if ( gl.getShaderParameter( shader, gl.COMPILE_STATUS ) === false ) { + + console.error( 'THREE.WebGLShader: Shader couldn\'t compile.' ); + + } + + if ( gl.getShaderInfoLog( shader ) !== '' ) { + + console.warn( 'THREE.WebGLShader: gl.getShaderInfoLog()', type === gl.VERTEX_SHADER ? 'vertex' : 'fragment', gl.getShaderInfoLog( shader ), addLineNumbers( string ) ); + + } + + // --enable-privileged-webgl-extension + // console.log( type, gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) ); + + return shader; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + var programIdCount = 0; + + function getEncodingComponents( encoding ) { + + switch ( encoding ) { + + case LinearEncoding: + return [ 'Linear','( value )' ]; + case sRGBEncoding: + return [ 'sRGB','( value )' ]; + case RGBEEncoding: + return [ 'RGBE','( value )' ]; + case RGBM7Encoding: + return [ 'RGBM','( value, 7.0 )' ]; + case RGBM16Encoding: + return [ 'RGBM','( value, 16.0 )' ]; + case RGBDEncoding: + return [ 'RGBD','( value, 256.0 )' ]; + case GammaEncoding: + return [ 'Gamma','( value, float( GAMMA_FACTOR ) )' ]; + default: + throw new Error( 'unsupported encoding: ' + encoding ); + + } + + } + + function getTexelDecodingFunction( functionName, encoding ) { + + var components = getEncodingComponents( encoding ); + return "vec4 " + functionName + "( vec4 value ) { return " + components[ 0 ] + "ToLinear" + components[ 1 ] + "; }"; + + } + + function getTexelEncodingFunction( functionName, encoding ) { + + var components = getEncodingComponents( encoding ); + return "vec4 " + functionName + "( vec4 value ) { return LinearTo" + components[ 0 ] + components[ 1 ] + "; }"; + + } + + function getToneMappingFunction( functionName, toneMapping ) { + + var toneMappingName; + + switch ( toneMapping ) { + + case LinearToneMapping: + toneMappingName = "Linear"; + break; + + case ReinhardToneMapping: + toneMappingName = "Reinhard"; + break; + + case Uncharted2ToneMapping: + toneMappingName = "Uncharted2"; + break; + + case CineonToneMapping: + toneMappingName = "OptimizedCineon"; + break; + + default: + throw new Error( 'unsupported toneMapping: ' + toneMapping ); + + } + + return "vec3 " + functionName + "( vec3 color ) { return " + toneMappingName + "ToneMapping( color ); }"; + + } + + function generateExtensions( extensions, parameters, rendererExtensions ) { + + extensions = extensions || {}; + + var chunks = [ + ( extensions.derivatives || parameters.envMapCubeUV || parameters.bumpMap || parameters.normalMap || parameters.flatShading ) ? '#extension GL_OES_standard_derivatives : enable' : '', + ( extensions.fragDepth || parameters.logarithmicDepthBuffer ) && rendererExtensions.get( 'EXT_frag_depth' ) ? '#extension GL_EXT_frag_depth : enable' : '', + ( extensions.drawBuffers ) && rendererExtensions.get( 'WEBGL_draw_buffers' ) ? '#extension GL_EXT_draw_buffers : require' : '', + ( extensions.shaderTextureLOD || parameters.envMap ) && rendererExtensions.get( 'EXT_shader_texture_lod' ) ? '#extension GL_EXT_shader_texture_lod : enable' : '' + ]; + + return chunks.filter( filterEmptyLine ).join( '\n' ); + + } + + function generateDefines( defines ) { + + var chunks = []; + + for ( var name in defines ) { + + var value = defines[ name ]; + + if ( value === false ) continue; + + chunks.push( '#define ' + name + ' ' + value ); + + } + + return chunks.join( '\n' ); + + } + + function fetchAttributeLocations( gl, program, identifiers ) { + + var attributes = {}; + + var n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES ); + + for ( var i = 0; i < n; i ++ ) { + + var info = gl.getActiveAttrib( program, i ); + var name = info.name; + + // console.log("THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:", name, i ); + + attributes[ name ] = gl.getAttribLocation( program, name ); + + } + + return attributes; + + } + + function filterEmptyLine( string ) { + + return string !== ''; + + } + + function replaceLightNums( string, parameters ) { + + return string + .replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights ) + .replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights ) + .replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights ) + .replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights ) + .replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights ); + + } + + function parseIncludes( string ) { + + var pattern = /^[ \t]*#include +<([\w\d.]+)>/gm; + + function replace( match, include ) { + + var replace = ShaderChunk[ include ]; + + if ( replace === undefined ) { + + throw new Error( 'Can not resolve #include <' + include + '>' ); + + } + + return parseIncludes( replace ); + + } + + return string.replace( pattern, replace ); + + } + + function unrollLoops( string ) { + + var pattern = /for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g; + + function replace( match, start, end, snippet ) { + + var unroll = ''; + + for ( var i = parseInt( start ); i < parseInt( end ); i ++ ) { + + unroll += snippet.replace( /\[ i \]/g, '[ ' + i + ' ]' ); + + } + + return unroll; + + } + + return string.replace( pattern, replace ); + + } + + function WebGLProgram( renderer, code, material, parameters ) { + + var gl = renderer.context; + + var extensions = material.extensions; + var defines = material.defines; + + var vertexShader = material.__webglShader.vertexShader; + var fragmentShader = material.__webglShader.fragmentShader; + + var shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC'; + + if ( parameters.shadowMapType === PCFShadowMap ) { + + shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF'; + + } else if ( parameters.shadowMapType === PCFSoftShadowMap ) { + + shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT'; + + } + + var envMapTypeDefine = 'ENVMAP_TYPE_CUBE'; + var envMapModeDefine = 'ENVMAP_MODE_REFLECTION'; + var envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY'; + + if ( parameters.envMap ) { + + switch ( material.envMap.mapping ) { + + case CubeReflectionMapping: + case CubeRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_CUBE'; + break; + + case CubeUVReflectionMapping: + case CubeUVRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV'; + break; + + case EquirectangularReflectionMapping: + case EquirectangularRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_EQUIREC'; + break; + + case SphericalReflectionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_SPHERE'; + break; + + } + + switch ( material.envMap.mapping ) { + + case CubeRefractionMapping: + case EquirectangularRefractionMapping: + envMapModeDefine = 'ENVMAP_MODE_REFRACTION'; + break; + + } + + switch ( material.combine ) { + + case MultiplyOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY'; + break; + + case MixOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_MIX'; + break; + + case AddOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_ADD'; + break; + + } + + } + + var gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0; + + // console.log( 'building new program ' ); + + // + + var customExtensions = generateExtensions( extensions, parameters, renderer.extensions ); + + var customDefines = generateDefines( defines ); + + // + + var program = gl.createProgram(); + + var prefixVertex, prefixFragment; + + if ( material.isRawShaderMaterial ) { + + prefixVertex = [ + + customDefines, + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + prefixFragment = [ + + customExtensions, + customDefines, + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + } else { + + prefixVertex = [ + + 'precision ' + parameters.precision + ' float;', + 'precision ' + parameters.precision + ' int;', + + '#define SHADER_NAME ' + material.__webglShader.name, + + customDefines, + + parameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '', + + '#define GAMMA_FACTOR ' + gammaFactorDefine, + + '#define MAX_BONES ' + parameters.maxBones, + ( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '', + ( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '', + + parameters.map ? '#define USE_MAP' : '', + parameters.envMap ? '#define USE_ENVMAP' : '', + parameters.envMap ? '#define ' + envMapModeDefine : '', + parameters.lightMap ? '#define USE_LIGHTMAP' : '', + parameters.aoMap ? '#define USE_AOMAP' : '', + parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '', + parameters.bumpMap ? '#define USE_BUMPMAP' : '', + parameters.normalMap ? '#define USE_NORMALMAP' : '', + parameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '', + parameters.specularMap ? '#define USE_SPECULARMAP' : '', + parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '', + parameters.metalnessMap ? '#define USE_METALNESSMAP' : '', + parameters.alphaMap ? '#define USE_ALPHAMAP' : '', + parameters.vertexColors ? '#define USE_COLOR' : '', + + parameters.flatShading ? '#define FLAT_SHADED' : '', + + parameters.skinning ? '#define USE_SKINNING' : '', + parameters.useVertexTexture ? '#define BONE_TEXTURE' : '', + + parameters.morphTargets ? '#define USE_MORPHTARGETS' : '', + parameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '', + parameters.doubleSided ? '#define DOUBLE_SIDED' : '', + parameters.flipSided ? '#define FLIP_SIDED' : '', + + '#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes, + + parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '', + parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '', + + parameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '', + + parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', + parameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '', + + 'uniform mat4 modelMatrix;', + 'uniform mat4 modelViewMatrix;', + 'uniform mat4 projectionMatrix;', + 'uniform mat4 viewMatrix;', + 'uniform mat3 normalMatrix;', + 'uniform vec3 cameraPosition;', + + 'attribute vec3 position;', + 'attribute vec3 normal;', + 'attribute vec2 uv;', + + '#ifdef USE_COLOR', + + ' attribute vec3 color;', + + '#endif', + + '#ifdef USE_MORPHTARGETS', + + ' attribute vec3 morphTarget0;', + ' attribute vec3 morphTarget1;', + ' attribute vec3 morphTarget2;', + ' attribute vec3 morphTarget3;', + + ' #ifdef USE_MORPHNORMALS', + + ' attribute vec3 morphNormal0;', + ' attribute vec3 morphNormal1;', + ' attribute vec3 morphNormal2;', + ' attribute vec3 morphNormal3;', + + ' #else', + + ' attribute vec3 morphTarget4;', + ' attribute vec3 morphTarget5;', + ' attribute vec3 morphTarget6;', + ' attribute vec3 morphTarget7;', + + ' #endif', + + '#endif', + + '#ifdef USE_SKINNING', + + ' attribute vec4 skinIndex;', + ' attribute vec4 skinWeight;', + + '#endif', + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + prefixFragment = [ + + customExtensions, + + 'precision ' + parameters.precision + ' float;', + 'precision ' + parameters.precision + ' int;', + + '#define SHADER_NAME ' + material.__webglShader.name, + + customDefines, + + parameters.alphaTest ? '#define ALPHATEST ' + parameters.alphaTest : '', + + '#define GAMMA_FACTOR ' + gammaFactorDefine, + + ( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '', + ( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '', + + parameters.map ? '#define USE_MAP' : '', + parameters.envMap ? '#define USE_ENVMAP' : '', + parameters.envMap ? '#define ' + envMapTypeDefine : '', + parameters.envMap ? '#define ' + envMapModeDefine : '', + parameters.envMap ? '#define ' + envMapBlendingDefine : '', + parameters.lightMap ? '#define USE_LIGHTMAP' : '', + parameters.aoMap ? '#define USE_AOMAP' : '', + parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '', + parameters.bumpMap ? '#define USE_BUMPMAP' : '', + parameters.normalMap ? '#define USE_NORMALMAP' : '', + parameters.specularMap ? '#define USE_SPECULARMAP' : '', + parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '', + parameters.metalnessMap ? '#define USE_METALNESSMAP' : '', + parameters.alphaMap ? '#define USE_ALPHAMAP' : '', + parameters.vertexColors ? '#define USE_COLOR' : '', + + parameters.gradientMap ? '#define USE_GRADIENTMAP' : '', + + parameters.flatShading ? '#define FLAT_SHADED' : '', + + parameters.doubleSided ? '#define DOUBLE_SIDED' : '', + parameters.flipSided ? '#define FLIP_SIDED' : '', + + '#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes, + '#define UNION_CLIPPING_PLANES ' + (parameters.numClippingPlanes - parameters.numClipIntersection), + + parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '', + parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '', + + parameters.premultipliedAlpha ? "#define PREMULTIPLIED_ALPHA" : '', + + parameters.physicallyCorrectLights ? "#define PHYSICALLY_CORRECT_LIGHTS" : '', + + parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', + parameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '', + + parameters.envMap && renderer.extensions.get( 'EXT_shader_texture_lod' ) ? '#define TEXTURE_LOD_EXT' : '', + + 'uniform mat4 viewMatrix;', + 'uniform vec3 cameraPosition;', + + ( parameters.toneMapping !== NoToneMapping ) ? "#define TONE_MAPPING" : '', + ( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below + ( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( "toneMapping", parameters.toneMapping ) : '', + + parameters.dithering ? '#define DITHERING' : '', + + ( parameters.outputEncoding || parameters.mapEncoding || parameters.envMapEncoding || parameters.emissiveMapEncoding ) ? ShaderChunk[ 'encodings_pars_fragment' ] : '', // this code is required here because it is used by the various encoding/decoding function defined below + parameters.mapEncoding ? getTexelDecodingFunction( 'mapTexelToLinear', parameters.mapEncoding ) : '', + parameters.envMapEncoding ? getTexelDecodingFunction( 'envMapTexelToLinear', parameters.envMapEncoding ) : '', + parameters.emissiveMapEncoding ? getTexelDecodingFunction( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '', + parameters.outputEncoding ? getTexelEncodingFunction( "linearToOutputTexel", parameters.outputEncoding ) : '', + + parameters.depthPacking ? "#define DEPTH_PACKING " + material.depthPacking : '', + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + } + + vertexShader = parseIncludes( vertexShader, parameters ); + vertexShader = replaceLightNums( vertexShader, parameters ); + + fragmentShader = parseIncludes( fragmentShader, parameters ); + fragmentShader = replaceLightNums( fragmentShader, parameters ); + + if ( ! material.isShaderMaterial ) { + + vertexShader = unrollLoops( vertexShader ); + fragmentShader = unrollLoops( fragmentShader ); + + } + + var vertexGlsl = prefixVertex + vertexShader; + var fragmentGlsl = prefixFragment + fragmentShader; + + // console.log( '*VERTEX*', vertexGlsl ); + // console.log( '*FRAGMENT*', fragmentGlsl ); + + var glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl ); + var glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl ); + + gl.attachShader( program, glVertexShader ); + gl.attachShader( program, glFragmentShader ); + + // Force a particular attribute to index 0. + + if ( material.index0AttributeName !== undefined ) { + + gl.bindAttribLocation( program, 0, material.index0AttributeName ); + + } else if ( parameters.morphTargets === true ) { + + // programs with morphTargets displace position out of attribute 0 + gl.bindAttribLocation( program, 0, 'position' ); + + } + + gl.linkProgram( program ); + + var programLog = gl.getProgramInfoLog( program ); + var vertexLog = gl.getShaderInfoLog( glVertexShader ); + var fragmentLog = gl.getShaderInfoLog( glFragmentShader ); + + var runnable = true; + var haveDiagnostics = true; + + // console.log( '**VERTEX**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glVertexShader ) ); + // console.log( '**FRAGMENT**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glFragmentShader ) ); + + if ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) { + + runnable = false; + + console.error( 'THREE.WebGLProgram: shader error: ', gl.getError(), 'gl.VALIDATE_STATUS', gl.getProgramParameter( program, gl.VALIDATE_STATUS ), 'gl.getProgramInfoLog', programLog, vertexLog, fragmentLog ); + + } else if ( programLog !== '' ) { + + console.warn( 'THREE.WebGLProgram: gl.getProgramInfoLog()', programLog ); + + } else if ( vertexLog === '' || fragmentLog === '' ) { + + haveDiagnostics = false; + + } + + if ( haveDiagnostics ) { + + this.diagnostics = { + + runnable: runnable, + material: material, + + programLog: programLog, + + vertexShader: { + + log: vertexLog, + prefix: prefixVertex + + }, + + fragmentShader: { + + log: fragmentLog, + prefix: prefixFragment + + } + + }; + + } + + // clean up + + gl.deleteShader( glVertexShader ); + gl.deleteShader( glFragmentShader ); + + // set up caching for uniform locations + + var cachedUniforms; + + this.getUniforms = function() { + + if ( cachedUniforms === undefined ) { + + cachedUniforms = + new WebGLUniforms( gl, program, renderer ); + + } + + return cachedUniforms; + + }; + + // set up caching for attribute locations + + var cachedAttributes; + + this.getAttributes = function() { + + if ( cachedAttributes === undefined ) { + + cachedAttributes = fetchAttributeLocations( gl, program ); + + } + + return cachedAttributes; + + }; + + // free resource + + this.destroy = function() { + + gl.deleteProgram( program ); + this.program = undefined; + + }; + + // DEPRECATED + + Object.defineProperties( this, { + + uniforms: { + get: function() { + + console.warn( 'THREE.WebGLProgram: .uniforms is now .getUniforms().' ); + return this.getUniforms(); + + } + }, + + attributes: { + get: function() { + + console.warn( 'THREE.WebGLProgram: .attributes is now .getAttributes().' ); + return this.getAttributes(); + + } + } + + } ); + + + // + + this.id = programIdCount ++; + this.code = code; + this.usedTimes = 1; + this.program = program; + this.vertexShader = glVertexShader; + this.fragmentShader = glFragmentShader; + + return this; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLPrograms( renderer, capabilities ) { + + var programs = []; + + var shaderIDs = { + MeshDepthMaterial: 'depth', + MeshNormalMaterial: 'normal', + MeshBasicMaterial: 'basic', + MeshLambertMaterial: 'lambert', + MeshPhongMaterial: 'phong', + MeshToonMaterial: 'phong', + MeshStandardMaterial: 'physical', + MeshPhysicalMaterial: 'physical', + LineBasicMaterial: 'basic', + LineDashedMaterial: 'dashed', + PointsMaterial: 'points' + }; + + var parameterNames = [ + "precision", "supportsVertexTextures", "map", "mapEncoding", "envMap", "envMapMode", "envMapEncoding", + "lightMap", "aoMap", "emissiveMap", "emissiveMapEncoding", "bumpMap", "normalMap", "displacementMap", "specularMap", + "roughnessMap", "metalnessMap", "gradientMap", + "alphaMap", "combine", "vertexColors", "fog", "useFog", "fogExp", + "flatShading", "sizeAttenuation", "logarithmicDepthBuffer", "skinning", + "maxBones", "useVertexTexture", "morphTargets", "morphNormals", + "maxMorphTargets", "maxMorphNormals", "premultipliedAlpha", + "numDirLights", "numPointLights", "numSpotLights", "numHemiLights", "numRectAreaLights", + "shadowMapEnabled", "shadowMapType", "toneMapping", 'physicallyCorrectLights', + "alphaTest", "doubleSided", "flipSided", "numClippingPlanes", "numClipIntersection", "depthPacking", "dithering" + ]; + + + function allocateBones( object ) { + + var skeleton = object.skeleton; + var bones = skeleton.bones; + + if ( capabilities.floatVertexTextures ) { + + return 1024; + + } else { + + // default for when object is not specified + // ( for example when prebuilding shader to be used with multiple objects ) + // + // - leave some extra space for other uniforms + // - limit here is ANGLE's 254 max uniform vectors + // (up to 54 should be safe) + + var nVertexUniforms = capabilities.maxVertexUniforms; + var nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 ); + + var maxBones = Math.min( nVertexMatrices, bones.length ); + + if ( maxBones < bones.length ) { + + console.warn( 'THREE.WebGLRenderer: Skeleton has ' + bones.length + ' bones. This GPU supports ' + maxBones + '.' ); + return 0; + + } + + return maxBones; + + } + + } + + function getTextureEncodingFromMap( map, gammaOverrideLinear ) { + + var encoding; + + if ( ! map ) { + + encoding = LinearEncoding; + + } else if ( map.isTexture ) { + + encoding = map.encoding; + + } else if ( map.isWebGLRenderTarget ) { + + console.warn( "THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead." ); + encoding = map.texture.encoding; + + } + + // add backwards compatibility for WebGLRenderer.gammaInput/gammaOutput parameter, should probably be removed at some point. + if ( encoding === LinearEncoding && gammaOverrideLinear ) { + + encoding = GammaEncoding; + + } + + return encoding; + + } + + this.getParameters = function ( material, lights, fog, nClipPlanes, nClipIntersection, object ) { + + var shaderID = shaderIDs[ material.type ]; + + // heuristics to create shader parameters according to lights in the scene + // (not to blow over maxLights budget) + + var maxBones = object.isSkinnedMesh ? allocateBones( object ) : 0; + var precision = renderer.getPrecision(); + + if ( material.precision !== null ) { + + precision = capabilities.getMaxPrecision( material.precision ); + + if ( precision !== material.precision ) { + + console.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' ); + + } + + } + + var currentRenderTarget = renderer.getRenderTarget(); + + var parameters = { + + shaderID: shaderID, + + precision: precision, + supportsVertexTextures: capabilities.vertexTextures, + outputEncoding: getTextureEncodingFromMap( ( ! currentRenderTarget ) ? null : currentRenderTarget.texture, renderer.gammaOutput ), + map: !! material.map, + mapEncoding: getTextureEncodingFromMap( material.map, renderer.gammaInput ), + envMap: !! material.envMap, + envMapMode: material.envMap && material.envMap.mapping, + envMapEncoding: getTextureEncodingFromMap( material.envMap, renderer.gammaInput ), + envMapCubeUV: ( !! material.envMap ) && ( ( material.envMap.mapping === CubeUVReflectionMapping ) || ( material.envMap.mapping === CubeUVRefractionMapping ) ), + lightMap: !! material.lightMap, + aoMap: !! material.aoMap, + emissiveMap: !! material.emissiveMap, + emissiveMapEncoding: getTextureEncodingFromMap( material.emissiveMap, renderer.gammaInput ), + bumpMap: !! material.bumpMap, + normalMap: !! material.normalMap, + displacementMap: !! material.displacementMap, + roughnessMap: !! material.roughnessMap, + metalnessMap: !! material.metalnessMap, + specularMap: !! material.specularMap, + alphaMap: !! material.alphaMap, + + gradientMap: !! material.gradientMap, + + combine: material.combine, + + vertexColors: material.vertexColors, + + fog: !! fog, + useFog: material.fog, + fogExp: ( fog && fog.isFogExp2 ), + + flatShading: material.shading === FlatShading, + + sizeAttenuation: material.sizeAttenuation, + logarithmicDepthBuffer: capabilities.logarithmicDepthBuffer, + + skinning: material.skinning && maxBones > 0, + maxBones: maxBones, + useVertexTexture: capabilities.floatVertexTextures, + + morphTargets: material.morphTargets, + morphNormals: material.morphNormals, + maxMorphTargets: renderer.maxMorphTargets, + maxMorphNormals: renderer.maxMorphNormals, + + numDirLights: lights.directional.length, + numPointLights: lights.point.length, + numSpotLights: lights.spot.length, + numRectAreaLights: lights.rectArea.length, + numHemiLights: lights.hemi.length, + + numClippingPlanes: nClipPlanes, + numClipIntersection: nClipIntersection, + + dithering: material.dithering, + + shadowMapEnabled: renderer.shadowMap.enabled && object.receiveShadow && lights.shadows.length > 0, + shadowMapType: renderer.shadowMap.type, + + toneMapping: renderer.toneMapping, + physicallyCorrectLights: renderer.physicallyCorrectLights, + + premultipliedAlpha: material.premultipliedAlpha, + + alphaTest: material.alphaTest, + doubleSided: material.side === DoubleSide, + flipSided: material.side === BackSide, + + depthPacking: ( material.depthPacking !== undefined ) ? material.depthPacking : false + + }; + + return parameters; + + }; + + this.getProgramCode = function ( material, parameters ) { + + var array = []; + + if ( parameters.shaderID ) { + + array.push( parameters.shaderID ); + + } else { + + array.push( material.fragmentShader ); + array.push( material.vertexShader ); + + } + + if ( material.defines !== undefined ) { + + for ( var name in material.defines ) { + + array.push( name ); + array.push( material.defines[ name ] ); + + } + + } + + for ( var i = 0; i < parameterNames.length; i ++ ) { + + array.push( parameters[ parameterNames[ i ] ] ); + + } + + return array.join(); + + }; + + this.acquireProgram = function ( material, parameters, code ) { + + var program; + + // Check if code has been already compiled + for ( var p = 0, pl = programs.length; p < pl; p ++ ) { + + var programInfo = programs[ p ]; + + if ( programInfo.code === code ) { + + program = programInfo; + ++ program.usedTimes; + + break; + + } + + } + + if ( program === undefined ) { + + program = new WebGLProgram( renderer, code, material, parameters ); + programs.push( program ); + + } + + return program; + + }; + + this.releaseProgram = function ( program ) { + + if ( -- program.usedTimes === 0 ) { + + // Remove from unordered set + var i = programs.indexOf( program ); + programs[ i ] = programs[ programs.length - 1 ]; + programs.pop(); + + // Free WebGL resources + program.destroy(); + + } + + }; + + // Exposed for resource monitoring & error feedback via renderer.info: + this.programs = programs; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLTextures( _gl, extensions, state, properties, capabilities, paramThreeToGL, infoMemory ) { + + var _isWebGL2 = ( typeof WebGL2RenderingContext !== 'undefined' && _gl instanceof WebGL2RenderingContext ); + + // + + function clampToMaxSize( image, maxSize ) { + + if ( image.width > maxSize || image.height > maxSize ) { + + // Warning: Scaling through the canvas will only work with images that use + // premultiplied alpha. + + var scale = maxSize / Math.max( image.width, image.height ); + + var canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + canvas.width = Math.floor( image.width * scale ); + canvas.height = Math.floor( image.height * scale ); + + var context = canvas.getContext( '2d' ); + context.drawImage( image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height ); + + console.warn( 'THREE.WebGLRenderer: image is too big (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image ); + + return canvas; + + } + + return image; + + } + + function isPowerOfTwo( image ) { + + return _Math.isPowerOfTwo( image.width ) && _Math.isPowerOfTwo( image.height ); + + } + + function makePowerOfTwo( image ) { + + if ( image instanceof HTMLImageElement || image instanceof HTMLCanvasElement ) { + + var canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + canvas.width = _Math.nearestPowerOfTwo( image.width ); + canvas.height = _Math.nearestPowerOfTwo( image.height ); + + var context = canvas.getContext( '2d' ); + context.drawImage( image, 0, 0, canvas.width, canvas.height ); + + console.warn( 'THREE.WebGLRenderer: image is not power of two (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image ); + + return canvas; + + } + + return image; + + } + + function textureNeedsPowerOfTwo( texture ) { + + return ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) || + ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ); + + } + + // Fallback filters for non-power-of-2 textures + + function filterFallback( f ) { + + if ( f === NearestFilter || f === NearestMipMapNearestFilter || f === NearestMipMapLinearFilter ) { + + return _gl.NEAREST; + + } + + return _gl.LINEAR; + + } + + // + + function onTextureDispose( event ) { + + var texture = event.target; + + texture.removeEventListener( 'dispose', onTextureDispose ); + + deallocateTexture( texture ); + + infoMemory.textures --; + + + } + + function onRenderTargetDispose( event ) { + + var renderTarget = event.target; + + renderTarget.removeEventListener( 'dispose', onRenderTargetDispose ); + + deallocateRenderTarget( renderTarget ); + + infoMemory.textures --; + + } + + // + + function deallocateTexture( texture ) { + + var textureProperties = properties.get( texture ); + + if ( texture.image && textureProperties.__image__webglTextureCube ) { + + // cube texture + + _gl.deleteTexture( textureProperties.__image__webglTextureCube ); + + } else { + + // 2D texture + + if ( textureProperties.__webglInit === undefined ) return; + + _gl.deleteTexture( textureProperties.__webglTexture ); + + } + + // remove all webgl properties + properties.remove( texture ); + + } + + function deallocateRenderTarget( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + var textureProperties = properties.get( renderTarget.texture ); + + if ( ! renderTarget ) return; + + if ( textureProperties.__webglTexture !== undefined ) { + + _gl.deleteTexture( textureProperties.__webglTexture ); + + } + + if ( renderTarget.depthTexture ) { + + renderTarget.depthTexture.dispose(); + + } + + if ( renderTarget.isWebGLRenderTargetCube ) { + + for ( var i = 0; i < 6; i ++ ) { + + _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] ); + if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] ); + + } + + } else { + + _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer ); + if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer ); + + } + + properties.remove( renderTarget.texture ); + properties.remove( renderTarget ); + + } + + // + + + + function setTexture2D( texture, slot ) { + + var textureProperties = properties.get( texture ); + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + var image = texture.image; + + if ( image === undefined ) { + + console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined', texture ); + + } else if ( image.complete === false ) { + + console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete', texture ); + + } else { + + uploadTexture( textureProperties, texture, slot ); + return; + + } + + } + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture ); + + } + + function setTextureCube( texture, slot ) { + + var textureProperties = properties.get( texture ); + + if ( texture.image.length === 6 ) { + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + if ( ! textureProperties.__image__webglTextureCube ) { + + texture.addEventListener( 'dispose', onTextureDispose ); + + textureProperties.__image__webglTextureCube = _gl.createTexture(); + + infoMemory.textures ++; + + } + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube ); + + _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY ); + + var isCompressed = ( texture && texture.isCompressedTexture ); + var isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture ); + + var cubeImage = []; + + for ( var i = 0; i < 6; i ++ ) { + + if ( ! isCompressed && ! isDataTexture ) { + + cubeImage[ i ] = clampToMaxSize( texture.image[ i ], capabilities.maxCubemapSize ); + + } else { + + cubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ]; + + } + + } + + var image = cubeImage[ 0 ], + isPowerOfTwoImage = isPowerOfTwo( image ), + glFormat = paramThreeToGL( texture.format ), + glType = paramThreeToGL( texture.type ); + + setTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, isPowerOfTwoImage ); + + for ( var i = 0; i < 6; i ++ ) { + + if ( ! isCompressed ) { + + if ( isDataTexture ) { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data ); + + } else { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, glFormat, glType, cubeImage[ i ] ); + + } + + } else { + + var mipmap, mipmaps = cubeImage[ i ].mipmaps; + + for ( var j = 0, jl = mipmaps.length; j < jl; j ++ ) { + + mipmap = mipmaps[ j ]; + + if ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) { + + if ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) { + + state.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, mipmap.data ); + + } else { + + console.warn( "THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()" ); + + } + + } else { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + } + + } + + } + + if ( texture.generateMipmaps && isPowerOfTwoImage ) { + + _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP ); + + } + + textureProperties.__version = texture.version; + + if ( texture.onUpdate ) texture.onUpdate( texture ); + + } else { + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube ); + + } + + } + + } + + function setTextureCubeDynamic( texture, slot ) { + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_CUBE_MAP, properties.get( texture ).__webglTexture ); + + } + + function setTextureParameters( textureType, texture, isPowerOfTwoImage ) { + + var extension; + + if ( isPowerOfTwoImage ) { + + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, paramThreeToGL( texture.wrapS ) ); + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, paramThreeToGL( texture.wrapT ) ); + + _gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, paramThreeToGL( texture.magFilter ) ); + _gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, paramThreeToGL( texture.minFilter ) ); + + } else { + + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE ); + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE ); + + if ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) { + + console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.', texture ); + + } + + _gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterFallback( texture.magFilter ) ); + _gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterFallback( texture.minFilter ) ); + + if ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) { + + console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.', texture ); + + } + + } + + extension = extensions.get( 'EXT_texture_filter_anisotropic' ); + + if ( extension ) { + + if ( texture.type === FloatType && extensions.get( 'OES_texture_float_linear' ) === null ) return; + if ( texture.type === HalfFloatType && extensions.get( 'OES_texture_half_float_linear' ) === null ) return; + + if ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) { + + _gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) ); + properties.get( texture ).__currentAnisotropy = texture.anisotropy; + + } + + } + + } + + function uploadTexture( textureProperties, texture, slot ) { + + if ( textureProperties.__webglInit === undefined ) { + + textureProperties.__webglInit = true; + + texture.addEventListener( 'dispose', onTextureDispose ); + + textureProperties.__webglTexture = _gl.createTexture(); + + infoMemory.textures ++; + + } + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture ); + + _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY ); + _gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha ); + _gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment ); + + var image = clampToMaxSize( texture.image, capabilities.maxTextureSize ); + + if ( textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( image ) === false ) { + + image = makePowerOfTwo( image ); + + } + + var isPowerOfTwoImage = isPowerOfTwo( image ), + glFormat = paramThreeToGL( texture.format ), + glType = paramThreeToGL( texture.type ); + + setTextureParameters( _gl.TEXTURE_2D, texture, isPowerOfTwoImage ); + + var mipmap, mipmaps = texture.mipmaps; + + if ( texture.isDepthTexture ) { + + // populate depth texture with dummy data + + var internalFormat = _gl.DEPTH_COMPONENT; + + if ( texture.type === FloatType ) { + + if ( !_isWebGL2 ) throw new Error('Float Depth Texture only supported in WebGL2.0'); + internalFormat = _gl.DEPTH_COMPONENT32F; + + } else if ( _isWebGL2 ) { + + // WebGL 2.0 requires signed internalformat for glTexImage2D + internalFormat = _gl.DEPTH_COMPONENT16; + + } + + if ( texture.format === DepthFormat && internalFormat === _gl.DEPTH_COMPONENT ) { + + // The error INVALID_OPERATION is generated by texImage2D if format and internalformat are + // DEPTH_COMPONENT and type is not UNSIGNED_SHORT or UNSIGNED_INT + // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) + if ( texture.type !== UnsignedShortType && texture.type !== UnsignedIntType ) { + + console.warn( 'THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.' ); + + texture.type = UnsignedShortType; + glType = paramThreeToGL( texture.type ); + + } + + } + + // Depth stencil textures need the DEPTH_STENCIL internal format + // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) + if ( texture.format === DepthStencilFormat ) { + + internalFormat = _gl.DEPTH_STENCIL; + + // The error INVALID_OPERATION is generated by texImage2D if format and internalformat are + // DEPTH_STENCIL and type is not UNSIGNED_INT_24_8_WEBGL. + // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) + if ( texture.type !== UnsignedInt248Type ) { + + console.warn( 'THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.' ); + + texture.type = UnsignedInt248Type; + glType = paramThreeToGL( texture.type ); + + } + + } + + state.texImage2D( _gl.TEXTURE_2D, 0, internalFormat, image.width, image.height, 0, glFormat, glType, null ); + + } else if ( texture.isDataTexture ) { + + // use manually created mipmaps if available + // if there are no manual mipmaps + // set 0 level mipmap and then use GL to generate other mipmap levels + + if ( mipmaps.length > 0 && isPowerOfTwoImage ) { + + for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + state.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + texture.generateMipmaps = false; + + } else { + + state.texImage2D( _gl.TEXTURE_2D, 0, glFormat, image.width, image.height, 0, glFormat, glType, image.data ); + + } + + } else if ( texture.isCompressedTexture ) { + + for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + + if ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) { + + if ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) { + + state.compressedTexImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, mipmap.data ); + + } else { + + console.warn( "THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()" ); + + } + + } else { + + state.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + } + + } else { + + // regular Texture (image, video, canvas) + + // use manually created mipmaps if available + // if there are no manual mipmaps + // set 0 level mipmap and then use GL to generate other mipmap levels + + if ( mipmaps.length > 0 && isPowerOfTwoImage ) { + + for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + state.texImage2D( _gl.TEXTURE_2D, i, glFormat, glFormat, glType, mipmap ); + + } + + texture.generateMipmaps = false; + + } else { + + state.texImage2D( _gl.TEXTURE_2D, 0, glFormat, glFormat, glType, image ); + + } + + } + + if ( texture.generateMipmaps && isPowerOfTwoImage ) _gl.generateMipmap( _gl.TEXTURE_2D ); + + textureProperties.__version = texture.version; + + if ( texture.onUpdate ) texture.onUpdate( texture ); + + } + + // Render targets + + // Setup storage for target texture and bind it to correct framebuffer + function setupFrameBufferTexture( framebuffer, renderTarget, attachment, textureTarget ) { + + var glFormat = paramThreeToGL( renderTarget.texture.format ); + var glType = paramThreeToGL( renderTarget.texture.type ); + state.texImage2D( textureTarget, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null ); + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( renderTarget.texture ).__webglTexture, 0 ); + _gl.bindFramebuffer( _gl.FRAMEBUFFER, null ); + + } + + // Setup storage for internal depth/stencil buffers and bind to correct framebuffer + function setupRenderBufferStorage( renderbuffer, renderTarget ) { + + _gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer ); + + if ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) { + + _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTarget.width, renderTarget.height ); + _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer ); + + } else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) { + + _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height ); + _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer ); + + } else { + + // FIXME: We don't support !depth !stencil + _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.RGBA4, renderTarget.width, renderTarget.height ); + + } + + _gl.bindRenderbuffer( _gl.RENDERBUFFER, null ); + + } + + // Setup resources for a Depth Texture for a FBO (needs an extension) + function setupDepthTexture( framebuffer, renderTarget ) { + + var isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube ); + if ( isCube ) throw new Error('Depth Texture with cube render targets is not supported!'); + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + + if ( !( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) { + + throw new Error('renderTarget.depthTexture must be an instance of THREE.DepthTexture'); + + } + + // upload an empty depth texture with framebuffer size + if ( !properties.get( renderTarget.depthTexture ).__webglTexture || + renderTarget.depthTexture.image.width !== renderTarget.width || + renderTarget.depthTexture.image.height !== renderTarget.height ) { + renderTarget.depthTexture.image.width = renderTarget.width; + renderTarget.depthTexture.image.height = renderTarget.height; + renderTarget.depthTexture.needsUpdate = true; + } + + setTexture2D( renderTarget.depthTexture, 0 ); + + var webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture; + + if ( renderTarget.depthTexture.format === DepthFormat ) { + + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 ); + + } else if ( renderTarget.depthTexture.format === DepthStencilFormat ) { + + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 ); + + } else { + + throw new Error('Unknown depthTexture format') + + } + + } + + // Setup GL resources for a non-texture depth buffer + function setupDepthRenderbuffer( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + + var isCube = ( renderTarget.isWebGLRenderTargetCube === true ); + + if ( renderTarget.depthTexture ) { + + if ( isCube ) throw new Error('target.depthTexture not supported in Cube render targets'); + + setupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget ); + + } else { + + if ( isCube ) { + + renderTargetProperties.__webglDepthbuffer = []; + + for ( var i = 0; i < 6; i ++ ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] ); + renderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer(); + setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget ); + + } + + } else { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer ); + renderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer(); + setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget ); + + } + + } + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, null ); + + } + + // Set up GL resources for the render target + function setupRenderTarget( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + var textureProperties = properties.get( renderTarget.texture ); + + renderTarget.addEventListener( 'dispose', onRenderTargetDispose ); + + textureProperties.__webglTexture = _gl.createTexture(); + + infoMemory.textures ++; + + var isCube = ( renderTarget.isWebGLRenderTargetCube === true ); + var isTargetPowerOfTwo = isPowerOfTwo( renderTarget ); + + // Setup framebuffer + + if ( isCube ) { + + renderTargetProperties.__webglFramebuffer = []; + + for ( var i = 0; i < 6; i ++ ) { + + renderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer(); + + } + + } else { + + renderTargetProperties.__webglFramebuffer = _gl.createFramebuffer(); + + } + + // Setup color buffer + + if ( isCube ) { + + state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture ); + setTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, isTargetPowerOfTwo ); + + for ( var i = 0; i < 6; i ++ ) { + + setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i ); + + } + + if ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP ); + state.bindTexture( _gl.TEXTURE_CUBE_MAP, null ); + + } else { + + state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture ); + setTextureParameters( _gl.TEXTURE_2D, renderTarget.texture, isTargetPowerOfTwo ); + setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D ); + + if ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_2D ); + state.bindTexture( _gl.TEXTURE_2D, null ); + + } + + // Setup depth and stencil buffers + + if ( renderTarget.depthBuffer ) { + + setupDepthRenderbuffer( renderTarget ); + + } + + } + + function updateRenderTargetMipmap( renderTarget ) { + + var texture = renderTarget.texture; + + if ( texture.generateMipmaps && isPowerOfTwo( renderTarget ) && + texture.minFilter !== NearestFilter && + texture.minFilter !== LinearFilter ) { + + var target = (renderTarget && renderTarget.isWebGLRenderTargetCube) ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D; + var webglTexture = properties.get( texture ).__webglTexture; + + state.bindTexture( target, webglTexture ); + _gl.generateMipmap( target ); + state.bindTexture( target, null ); + + } + + } + + this.setTexture2D = setTexture2D; + this.setTextureCube = setTextureCube; + this.setTextureCubeDynamic = setTextureCubeDynamic; + this.setupRenderTarget = setupRenderTarget; + this.updateRenderTargetMipmap = updateRenderTargetMipmap; + + } + + /** + * @author fordacious / fordacious.github.io + */ + + function WebGLProperties() { + + var properties = {}; + + function get( object ) { + + var uuid = object.uuid; + var map = properties[ uuid ]; + + if ( map === undefined ) { + + map = {}; + properties[ uuid ] = map; + + } + + return map; + + } + + function remove( object ) { + + delete properties[ object.uuid ]; + + } + + function clear() { + + properties = {}; + + } + + return { + get: get, + remove: remove, + clear: clear + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLState( gl, extensions, paramThreeToGL ) { + + function ColorBuffer() { + + var locked = false; + + var color = new Vector4(); + var currentColorMask = null; + var currentColorClear = new Vector4(); + + return { + + setMask: function ( colorMask ) { + + if ( currentColorMask !== colorMask && ! locked ) { + + gl.colorMask( colorMask, colorMask, colorMask, colorMask ); + currentColorMask = colorMask; + + } + + }, + + setLocked: function ( lock ) { + + locked = lock; + + }, + + setClear: function ( r, g, b, a, premultipliedAlpha ) { + + if ( premultipliedAlpha === true ) { + + r *= a; g *= a; b *= a; + + } + + color.set( r, g, b, a ); + + if ( currentColorClear.equals( color ) === false ) { + + gl.clearColor( r, g, b, a ); + currentColorClear.copy( color ); + + } + + }, + + reset: function () { + + locked = false; + + currentColorMask = null; + currentColorClear.set( 0, 0, 0, 1 ); + + } + + }; + + } + + function DepthBuffer() { + + var locked = false; + + var currentDepthMask = null; + var currentDepthFunc = null; + var currentDepthClear = null; + + return { + + setTest: function ( depthTest ) { + + if ( depthTest ) { + + enable( gl.DEPTH_TEST ); + + } else { + + disable( gl.DEPTH_TEST ); + + } + + }, + + setMask: function ( depthMask ) { + + if ( currentDepthMask !== depthMask && ! locked ) { + + gl.depthMask( depthMask ); + currentDepthMask = depthMask; + + } + + }, + + setFunc: function ( depthFunc ) { + + if ( currentDepthFunc !== depthFunc ) { + + if ( depthFunc ) { + + switch ( depthFunc ) { + + case NeverDepth: + + gl.depthFunc( gl.NEVER ); + break; + + case AlwaysDepth: + + gl.depthFunc( gl.ALWAYS ); + break; + + case LessDepth: + + gl.depthFunc( gl.LESS ); + break; + + case LessEqualDepth: + + gl.depthFunc( gl.LEQUAL ); + break; + + case EqualDepth: + + gl.depthFunc( gl.EQUAL ); + break; + + case GreaterEqualDepth: + + gl.depthFunc( gl.GEQUAL ); + break; + + case GreaterDepth: + + gl.depthFunc( gl.GREATER ); + break; + + case NotEqualDepth: + + gl.depthFunc( gl.NOTEQUAL ); + break; + + default: + + gl.depthFunc( gl.LEQUAL ); + + } + + } else { + + gl.depthFunc( gl.LEQUAL ); + + } + + currentDepthFunc = depthFunc; + + } + + }, + + setLocked: function ( lock ) { + + locked = lock; + + }, + + setClear: function ( depth ) { + + if ( currentDepthClear !== depth ) { + + gl.clearDepth( depth ); + currentDepthClear = depth; + + } + + }, + + reset: function () { + + locked = false; + + currentDepthMask = null; + currentDepthFunc = null; + currentDepthClear = null; + + } + + }; + + } + + function StencilBuffer() { + + var locked = false; + + var currentStencilMask = null; + var currentStencilFunc = null; + var currentStencilRef = null; + var currentStencilFuncMask = null; + var currentStencilFail = null; + var currentStencilZFail = null; + var currentStencilZPass = null; + var currentStencilClear = null; + + return { + + setTest: function ( stencilTest ) { + + if ( stencilTest ) { + + enable( gl.STENCIL_TEST ); + + } else { + + disable( gl.STENCIL_TEST ); + + } + + }, + + setMask: function ( stencilMask ) { + + if ( currentStencilMask !== stencilMask && ! locked ) { + + gl.stencilMask( stencilMask ); + currentStencilMask = stencilMask; + + } + + }, + + setFunc: function ( stencilFunc, stencilRef, stencilMask ) { + + if ( currentStencilFunc !== stencilFunc || + currentStencilRef !== stencilRef || + currentStencilFuncMask !== stencilMask ) { + + gl.stencilFunc( stencilFunc, stencilRef, stencilMask ); + + currentStencilFunc = stencilFunc; + currentStencilRef = stencilRef; + currentStencilFuncMask = stencilMask; + + } + + }, + + setOp: function ( stencilFail, stencilZFail, stencilZPass ) { + + if ( currentStencilFail !== stencilFail || + currentStencilZFail !== stencilZFail || + currentStencilZPass !== stencilZPass ) { + + gl.stencilOp( stencilFail, stencilZFail, stencilZPass ); + + currentStencilFail = stencilFail; + currentStencilZFail = stencilZFail; + currentStencilZPass = stencilZPass; + + } + + }, + + setLocked: function ( lock ) { + + locked = lock; + + }, + + setClear: function ( stencil ) { + + if ( currentStencilClear !== stencil ) { + + gl.clearStencil( stencil ); + currentStencilClear = stencil; + + } + + }, + + reset: function () { + + locked = false; + + currentStencilMask = null; + currentStencilFunc = null; + currentStencilRef = null; + currentStencilFuncMask = null; + currentStencilFail = null; + currentStencilZFail = null; + currentStencilZPass = null; + currentStencilClear = null; + + } + + }; + + } + + // + + var colorBuffer = new ColorBuffer(); + var depthBuffer = new DepthBuffer(); + var stencilBuffer = new StencilBuffer(); + + var maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS ); + var newAttributes = new Uint8Array( maxVertexAttributes ); + var enabledAttributes = new Uint8Array( maxVertexAttributes ); + var attributeDivisors = new Uint8Array( maxVertexAttributes ); + + var capabilities = {}; + + var compressedTextureFormats = null; + + var currentBlending = null; + var currentBlendEquation = null; + var currentBlendSrc = null; + var currentBlendDst = null; + var currentBlendEquationAlpha = null; + var currentBlendSrcAlpha = null; + var currentBlendDstAlpha = null; + var currentPremultipledAlpha = false; + + var currentFlipSided = null; + var currentCullFace = null; + + var currentLineWidth = null; + + var currentPolygonOffsetFactor = null; + var currentPolygonOffsetUnits = null; + + var currentScissorTest = null; + + var maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS ); + + var version = parseFloat( /^WebGL\ ([0-9])/.exec( gl.getParameter( gl.VERSION ) )[ 1 ] ); + var lineWidthAvailable = parseFloat( version ) >= 1.0; + + var currentTextureSlot = null; + var currentBoundTextures = {}; + + var currentScissor = new Vector4(); + var currentViewport = new Vector4(); + + function createTexture( type, target, count ) { + + var data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4. + var texture = gl.createTexture(); + + gl.bindTexture( type, texture ); + gl.texParameteri( type, gl.TEXTURE_MIN_FILTER, gl.NEAREST ); + gl.texParameteri( type, gl.TEXTURE_MAG_FILTER, gl.NEAREST ); + + for ( var i = 0; i < count; i ++ ) { + + gl.texImage2D( target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data ); + + } + + return texture; + + } + + var emptyTextures = {}; + emptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 ); + emptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 ); + + // + + function init() { + + colorBuffer.setClear( 0, 0, 0, 1 ); + depthBuffer.setClear( 1 ); + stencilBuffer.setClear( 0 ); + + enable( gl.DEPTH_TEST ); + depthBuffer.setFunc( LessEqualDepth ); + + setFlipSided( false ); + setCullFace( CullFaceBack ); + enable( gl.CULL_FACE ); + + enable( gl.BLEND ); + setBlending( NormalBlending ); + + } + + function initAttributes() { + + for ( var i = 0, l = newAttributes.length; i < l; i ++ ) { + + newAttributes[ i ] = 0; + + } + + } + + function enableAttribute( attribute ) { + + newAttributes[ attribute ] = 1; + + if ( enabledAttributes[ attribute ] === 0 ) { + + gl.enableVertexAttribArray( attribute ); + enabledAttributes[ attribute ] = 1; + + } + + if ( attributeDivisors[ attribute ] !== 0 ) { + + var extension = extensions.get( 'ANGLE_instanced_arrays' ); + + extension.vertexAttribDivisorANGLE( attribute, 0 ); + attributeDivisors[ attribute ] = 0; + + } + + } + + function enableAttributeAndDivisor( attribute, meshPerAttribute ) { + + newAttributes[ attribute ] = 1; + + if ( enabledAttributes[ attribute ] === 0 ) { + + gl.enableVertexAttribArray( attribute ); + enabledAttributes[ attribute ] = 1; + + } + + if ( attributeDivisors[ attribute ] !== meshPerAttribute ) { + + var extension = extensions.get( 'ANGLE_instanced_arrays' ); + + extension.vertexAttribDivisorANGLE( attribute, meshPerAttribute ); + attributeDivisors[ attribute ] = meshPerAttribute; + + } + + } + + function disableUnusedAttributes() { + + for ( var i = 0, l = enabledAttributes.length; i !== l; ++ i ) { + + if ( enabledAttributes[ i ] !== newAttributes[ i ] ) { + + gl.disableVertexAttribArray( i ); + enabledAttributes[ i ] = 0; + + } + + } + + } + + function enable( id ) { + + if ( capabilities[ id ] !== true ) { + + gl.enable( id ); + capabilities[ id ] = true; + + } + + } + + function disable( id ) { + + if ( capabilities[ id ] !== false ) { + + gl.disable( id ); + capabilities[ id ] = false; + + } + + } + + function getCompressedTextureFormats() { + + if ( compressedTextureFormats === null ) { + + compressedTextureFormats = []; + + if ( extensions.get( 'WEBGL_compressed_texture_pvrtc' ) || + extensions.get( 'WEBGL_compressed_texture_s3tc' ) || + extensions.get( 'WEBGL_compressed_texture_etc1' ) ) { + + var formats = gl.getParameter( gl.COMPRESSED_TEXTURE_FORMATS ); + + for ( var i = 0; i < formats.length; i ++ ) { + + compressedTextureFormats.push( formats[ i ] ); + + } + + } + + } + + return compressedTextureFormats; + + } + + function setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) { + + if ( blending !== NoBlending ) { + + enable( gl.BLEND ); + + } else { + + disable( gl.BLEND ); + + } + + if ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) { + + if ( blending === AdditiveBlending ) { + + if ( premultipliedAlpha ) { + + gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); + gl.blendFuncSeparate( gl.ONE, gl.ONE, gl.ONE, gl.ONE ); + + } else { + + gl.blendEquation( gl.FUNC_ADD ); + gl.blendFunc( gl.SRC_ALPHA, gl.ONE ); + + } + + } else if ( blending === SubtractiveBlending ) { + + if ( premultipliedAlpha ) { + + gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); + gl.blendFuncSeparate( gl.ZERO, gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ONE_MINUS_SRC_ALPHA ); + + } else { + + gl.blendEquation( gl.FUNC_ADD ); + gl.blendFunc( gl.ZERO, gl.ONE_MINUS_SRC_COLOR ); + + } + + } else if ( blending === MultiplyBlending ) { + + if ( premultipliedAlpha ) { + + gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); + gl.blendFuncSeparate( gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA ); + + } else { + + gl.blendEquation( gl.FUNC_ADD ); + gl.blendFunc( gl.ZERO, gl.SRC_COLOR ); + + } + + } else { + + if ( premultipliedAlpha ) { + + gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); + gl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA ); + + } else { + + gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); + gl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA ); + + } + + } + + currentBlending = blending; + currentPremultipledAlpha = premultipliedAlpha; + + } + + if ( blending === CustomBlending ) { + + blendEquationAlpha = blendEquationAlpha || blendEquation; + blendSrcAlpha = blendSrcAlpha || blendSrc; + blendDstAlpha = blendDstAlpha || blendDst; + + if ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) { + + gl.blendEquationSeparate( paramThreeToGL( blendEquation ), paramThreeToGL( blendEquationAlpha ) ); + + currentBlendEquation = blendEquation; + currentBlendEquationAlpha = blendEquationAlpha; + + } + + if ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) { + + gl.blendFuncSeparate( paramThreeToGL( blendSrc ), paramThreeToGL( blendDst ), paramThreeToGL( blendSrcAlpha ), paramThreeToGL( blendDstAlpha ) ); + + currentBlendSrc = blendSrc; + currentBlendDst = blendDst; + currentBlendSrcAlpha = blendSrcAlpha; + currentBlendDstAlpha = blendDstAlpha; + + } + + } else { + + currentBlendEquation = null; + currentBlendSrc = null; + currentBlendDst = null; + currentBlendEquationAlpha = null; + currentBlendSrcAlpha = null; + currentBlendDstAlpha = null; + + } + + } + + function setMaterial( material ) { + + material.side === DoubleSide + ? disable( gl.CULL_FACE ) + : enable( gl.CULL_FACE ); + + setFlipSided( material.side === BackSide ); + + material.transparent === true + ? setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha ) + : setBlending( NoBlending ); + + depthBuffer.setFunc( material.depthFunc ); + depthBuffer.setTest( material.depthTest ); + depthBuffer.setMask( material.depthWrite ); + colorBuffer.setMask( material.colorWrite ); + + setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits ); + + } + + // + + function setFlipSided( flipSided ) { + + if ( currentFlipSided !== flipSided ) { + + if ( flipSided ) { + + gl.frontFace( gl.CW ); + + } else { + + gl.frontFace( gl.CCW ); + + } + + currentFlipSided = flipSided; + + } + + } + + function setCullFace( cullFace ) { + + if ( cullFace !== CullFaceNone ) { + + enable( gl.CULL_FACE ); + + if ( cullFace !== currentCullFace ) { + + if ( cullFace === CullFaceBack ) { + + gl.cullFace( gl.BACK ); + + } else if ( cullFace === CullFaceFront ) { + + gl.cullFace( gl.FRONT ); + + } else { + + gl.cullFace( gl.FRONT_AND_BACK ); + + } + + } + + } else { + + disable( gl.CULL_FACE ); + + } + + currentCullFace = cullFace; + + } + + function setLineWidth( width ) { + + if ( width !== currentLineWidth ) { + + if ( lineWidthAvailable ) gl.lineWidth( width ); + + currentLineWidth = width; + + } + + } + + function setPolygonOffset( polygonOffset, factor, units ) { + + if ( polygonOffset ) { + + enable( gl.POLYGON_OFFSET_FILL ); + + if ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) { + + gl.polygonOffset( factor, units ); + + currentPolygonOffsetFactor = factor; + currentPolygonOffsetUnits = units; + + } + + } else { + + disable( gl.POLYGON_OFFSET_FILL ); + + } + + } + + function getScissorTest() { + + return currentScissorTest; + + } + + function setScissorTest( scissorTest ) { + + currentScissorTest = scissorTest; + + if ( scissorTest ) { + + enable( gl.SCISSOR_TEST ); + + } else { + + disable( gl.SCISSOR_TEST ); + + } + + } + + // texture + + function activeTexture( webglSlot ) { + + if ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1; + + if ( currentTextureSlot !== webglSlot ) { + + gl.activeTexture( webglSlot ); + currentTextureSlot = webglSlot; + + } + + } + + function bindTexture( webglType, webglTexture ) { + + if ( currentTextureSlot === null ) { + + activeTexture(); + + } + + var boundTexture = currentBoundTextures[ currentTextureSlot ]; + + if ( boundTexture === undefined ) { + + boundTexture = { type: undefined, texture: undefined }; + currentBoundTextures[ currentTextureSlot ] = boundTexture; + + } + + if ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) { + + gl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] ); + + boundTexture.type = webglType; + boundTexture.texture = webglTexture; + + } + + } + + function compressedTexImage2D() { + + try { + + gl.compressedTexImage2D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( error ); + + } + + } + + function texImage2D() { + + try { + + gl.texImage2D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( error ); + + } + + } + + // + + function scissor( scissor ) { + + if ( currentScissor.equals( scissor ) === false ) { + + gl.scissor( scissor.x, scissor.y, scissor.z, scissor.w ); + currentScissor.copy( scissor ); + + } + + } + + function viewport( viewport ) { + + if ( currentViewport.equals( viewport ) === false ) { + + gl.viewport( viewport.x, viewport.y, viewport.z, viewport.w ); + currentViewport.copy( viewport ); + + } + + } + + // + + function reset() { + + for ( var i = 0; i < enabledAttributes.length; i ++ ) { + + if ( enabledAttributes[ i ] === 1 ) { + + gl.disableVertexAttribArray( i ); + enabledAttributes[ i ] = 0; + + } + + } + + capabilities = {}; + + compressedTextureFormats = null; + + currentTextureSlot = null; + currentBoundTextures = {}; + + currentBlending = null; + + currentFlipSided = null; + currentCullFace = null; + + colorBuffer.reset(); + depthBuffer.reset(); + stencilBuffer.reset(); + + } + + return { + + buffers: { + color: colorBuffer, + depth: depthBuffer, + stencil: stencilBuffer + }, + + init: init, + initAttributes: initAttributes, + enableAttribute: enableAttribute, + enableAttributeAndDivisor: enableAttributeAndDivisor, + disableUnusedAttributes: disableUnusedAttributes, + enable: enable, + disable: disable, + getCompressedTextureFormats: getCompressedTextureFormats, + + setBlending: setBlending, + setMaterial: setMaterial, + + setFlipSided: setFlipSided, + setCullFace: setCullFace, + + setLineWidth: setLineWidth, + setPolygonOffset: setPolygonOffset, + + getScissorTest: getScissorTest, + setScissorTest: setScissorTest, + + activeTexture: activeTexture, + bindTexture: bindTexture, + compressedTexImage2D: compressedTexImage2D, + texImage2D: texImage2D, + + scissor: scissor, + viewport: viewport, + + reset: reset + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLCapabilities( gl, extensions, parameters ) { + + var maxAnisotropy; + + function getMaxAnisotropy() { + + if ( maxAnisotropy !== undefined ) return maxAnisotropy; + + var extension = extensions.get( 'EXT_texture_filter_anisotropic' ); + + if ( extension !== null ) { + + maxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT ); + + } else { + + maxAnisotropy = 0; + + } + + return maxAnisotropy; + + } + + function getMaxPrecision( precision ) { + + if ( precision === 'highp' ) { + + if ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 && + gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) { + + return 'highp'; + + } + + precision = 'mediump'; + + } + + if ( precision === 'mediump' ) { + + if ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 && + gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) { + + return 'mediump'; + + } + + } + + return 'lowp'; + + } + + var precision = parameters.precision !== undefined ? parameters.precision : 'highp'; + var maxPrecision = getMaxPrecision( precision ); + + if ( maxPrecision !== precision ) { + + console.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' ); + precision = maxPrecision; + + } + + var logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true && !! extensions.get( 'EXT_frag_depth' ); + + var maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS ); + var maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS ); + var maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE ); + var maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE ); + + var maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS ); + var maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS ); + var maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS ); + var maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS ); + + var vertexTextures = maxVertexTextures > 0; + var floatFragmentTextures = !! extensions.get( 'OES_texture_float' ); + var floatVertexTextures = vertexTextures && floatFragmentTextures; + + return { + + getMaxAnisotropy: getMaxAnisotropy, + getMaxPrecision: getMaxPrecision, + + precision: precision, + logarithmicDepthBuffer: logarithmicDepthBuffer, + + maxTextures: maxTextures, + maxVertexTextures: maxVertexTextures, + maxTextureSize: maxTextureSize, + maxCubemapSize: maxCubemapSize, + + maxAttributes: maxAttributes, + maxVertexUniforms: maxVertexUniforms, + maxVaryings: maxVaryings, + maxFragmentUniforms: maxFragmentUniforms, + + vertexTextures: vertexTextures, + floatFragmentTextures: floatFragmentTextures, + floatVertexTextures: floatVertexTextures + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLExtensions( gl ) { + + var extensions = {}; + + return { + + get: function ( name ) { + + if ( extensions[ name ] !== undefined ) { + + return extensions[ name ]; + + } + + var extension; + + switch ( name ) { + + case 'WEBGL_depth_texture': + extension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' ); + break; + + case 'EXT_texture_filter_anisotropic': + extension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' ); + break; + + case 'WEBGL_compressed_texture_s3tc': + extension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' ); + break; + + case 'WEBGL_compressed_texture_pvrtc': + extension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' ); + break; + + case 'WEBGL_compressed_texture_etc1': + extension = gl.getExtension( 'WEBGL_compressed_texture_etc1' ); + break; + + default: + extension = gl.getExtension( name ); + + } + + if ( extension === null ) { + + console.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' ); + + } + + extensions[ name ] = extension; + + return extension; + + } + + }; + + } + + /** + * @author tschw + */ + + function WebGLClipping() { + + var scope = this, + + globalState = null, + numGlobalPlanes = 0, + localClippingEnabled = false, + renderingShadows = false, + + plane = new Plane(), + viewNormalMatrix = new Matrix3(), + + uniform = { value: null, needsUpdate: false }; + + this.uniform = uniform; + this.numPlanes = 0; + this.numIntersection = 0; + + this.init = function( planes, enableLocalClipping, camera ) { + + var enabled = + planes.length !== 0 || + enableLocalClipping || + // enable state of previous frame - the clipping code has to + // run another frame in order to reset the state: + numGlobalPlanes !== 0 || + localClippingEnabled; + + localClippingEnabled = enableLocalClipping; + + globalState = projectPlanes( planes, camera, 0 ); + numGlobalPlanes = planes.length; + + return enabled; + + }; + + this.beginShadows = function() { + + renderingShadows = true; + projectPlanes( null ); + + }; + + this.endShadows = function() { + + renderingShadows = false; + resetGlobalState(); + + }; + + this.setState = function( planes, clipIntersection, clipShadows, camera, cache, fromCache ) { + + if ( ! localClippingEnabled || + planes === null || planes.length === 0 || + renderingShadows && ! clipShadows ) { + // there's no local clipping + + if ( renderingShadows ) { + // there's no global clipping + + projectPlanes( null ); + + } else { + + resetGlobalState(); + } + + } else { + + var nGlobal = renderingShadows ? 0 : numGlobalPlanes, + lGlobal = nGlobal * 4, + + dstArray = cache.clippingState || null; + + uniform.value = dstArray; // ensure unique state + + dstArray = projectPlanes( planes, camera, lGlobal, fromCache ); + + for ( var i = 0; i !== lGlobal; ++ i ) { + + dstArray[ i ] = globalState[ i ]; + + } + + cache.clippingState = dstArray; + this.numIntersection = clipIntersection ? this.numPlanes : 0; + this.numPlanes += nGlobal; + + } + + + }; + + function resetGlobalState() { + + if ( uniform.value !== globalState ) { + + uniform.value = globalState; + uniform.needsUpdate = numGlobalPlanes > 0; + + } + + scope.numPlanes = numGlobalPlanes; + scope.numIntersection = 0; + + } + + function projectPlanes( planes, camera, dstOffset, skipTransform ) { + + var nPlanes = planes !== null ? planes.length : 0, + dstArray = null; + + if ( nPlanes !== 0 ) { + + dstArray = uniform.value; + + if ( skipTransform !== true || dstArray === null ) { + + var flatSize = dstOffset + nPlanes * 4, + viewMatrix = camera.matrixWorldInverse; + + viewNormalMatrix.getNormalMatrix( viewMatrix ); + + if ( dstArray === null || dstArray.length < flatSize ) { + + dstArray = new Float32Array( flatSize ); + + } + + for ( var i = 0, i4 = dstOffset; + i !== nPlanes; ++ i, i4 += 4 ) { + + plane.copy( planes[ i ] ). + applyMatrix4( viewMatrix, viewNormalMatrix ); + + plane.normal.toArray( dstArray, i4 ); + dstArray[ i4 + 3 ] = plane.constant; + + } + + } + + uniform.value = dstArray; + uniform.needsUpdate = true; + + } + + scope.numPlanes = nPlanes; + + return dstArray; + + } + + } + + // import { Sphere } from '../math/Sphere'; + /** + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author szimek / https://github.com/szimek/ + * @author tschw + */ + + function WebGLRenderer( parameters ) { + + console.log( 'THREE.WebGLRenderer', REVISION ); + + parameters = parameters || {}; + + var _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ), + _context = parameters.context !== undefined ? parameters.context : null, + + _alpha = parameters.alpha !== undefined ? parameters.alpha : false, + _depth = parameters.depth !== undefined ? parameters.depth : true, + _stencil = parameters.stencil !== undefined ? parameters.stencil : true, + _antialias = parameters.antialias !== undefined ? parameters.antialias : false, + _premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true, + _preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false; + + var lights = []; + + var currentRenderList = null; + + var morphInfluences = new Float32Array( 8 ); + + var sprites = []; + var lensFlares = []; + + // public properties + + this.domElement = _canvas; + this.context = null; + + // clearing + + this.autoClear = true; + this.autoClearColor = true; + this.autoClearDepth = true; + this.autoClearStencil = true; + + // scene graph + + this.sortObjects = true; + + // user-defined clipping + + this.clippingPlanes = []; + this.localClippingEnabled = false; + + // physically based shading + + this.gammaFactor = 2.0; // for backwards compatibility + this.gammaInput = false; + this.gammaOutput = false; + + // physical lights + + this.physicallyCorrectLights = false; + + // tone mapping + + this.toneMapping = LinearToneMapping; + this.toneMappingExposure = 1.0; + this.toneMappingWhitePoint = 1.0; + + // morphs + + this.maxMorphTargets = 8; + this.maxMorphNormals = 4; + + // internal properties + + var _this = this, + + // internal state cache + + _currentProgram = null, + _currentRenderTarget = null, + _currentFramebuffer = null, + _currentMaterialId = - 1, + _currentGeometryProgram = '', + _currentCamera = null, + + _currentScissor = new Vector4(), + _currentScissorTest = null, + + _currentViewport = new Vector4(), + + // + + _usedTextureUnits = 0, + + // + + _clearColor = new Color( 0x000000 ), + _clearAlpha = 0, + + _width = _canvas.width, + _height = _canvas.height, + + _pixelRatio = 1, + + _scissor = new Vector4( 0, 0, _width, _height ), + _scissorTest = false, + + _viewport = new Vector4( 0, 0, _width, _height ), + + // frustum + + _frustum = new Frustum(), + + // clipping + + _clipping = new WebGLClipping(), + _clippingEnabled = false, + _localClippingEnabled = false, + + // camera matrices cache + + _projScreenMatrix = new Matrix4(), + + _vector3 = new Vector3(), + _matrix4 = new Matrix4(), + _matrix42 = new Matrix4(), + + // light arrays cache + + _lights = { + + hash: '', + + ambient: [ 0, 0, 0 ], + directional: [], + directionalShadowMap: [], + directionalShadowMatrix: [], + spot: [], + spotShadowMap: [], + spotShadowMatrix: [], + rectArea: [], + point: [], + pointShadowMap: [], + pointShadowMatrix: [], + hemi: [], + + shadows: [] + + }, + + // info + + _infoMemory = { + geometries: 0, + textures: 0 + }, + + _infoRender = { + + frame: 0, + calls: 0, + vertices: 0, + faces: 0, + points: 0 + + }; + + this.info = { + + render: _infoRender, + memory: _infoMemory, + programs: null + + }; + + + // initialize + + var _gl; + + try { + + var contextAttributes = { + alpha: _alpha, + depth: _depth, + stencil: _stencil, + antialias: _antialias, + premultipliedAlpha: _premultipliedAlpha, + preserveDrawingBuffer: _preserveDrawingBuffer + }; + + _gl = _context || _canvas.getContext( 'webgl', contextAttributes ) || _canvas.getContext( 'experimental-webgl', contextAttributes ); + + if ( _gl === null ) { + + if ( _canvas.getContext( 'webgl' ) !== null ) { + + throw 'Error creating WebGL context with your selected attributes.'; + + } else { + + throw 'Error creating WebGL context.'; + + } + + } + + // Some experimental-webgl implementations do not have getShaderPrecisionFormat + + if ( _gl.getShaderPrecisionFormat === undefined ) { + + _gl.getShaderPrecisionFormat = function () { + + return { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 }; + + }; + + } + + _canvas.addEventListener( 'webglcontextlost', onContextLost, false ); + + } catch ( error ) { + + console.error( 'THREE.WebGLRenderer: ' + error ); + + } + + var extensions = new WebGLExtensions( _gl ); + + extensions.get( 'WEBGL_depth_texture' ); + extensions.get( 'OES_texture_float' ); + extensions.get( 'OES_texture_float_linear' ); + extensions.get( 'OES_texture_half_float' ); + extensions.get( 'OES_texture_half_float_linear' ); + extensions.get( 'OES_standard_derivatives' ); + extensions.get( 'ANGLE_instanced_arrays' ); + + if ( extensions.get( 'OES_element_index_uint' ) ) { + + BufferGeometry.MaxIndex = 4294967296; + + } + + var capabilities = new WebGLCapabilities( _gl, extensions, parameters ); + + var state = new WebGLState( _gl, extensions, paramThreeToGL ); + + var properties = new WebGLProperties(); + var textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, paramThreeToGL, _infoMemory ); + var attributes = new WebGLAttributes( _gl ); + var geometries = new WebGLGeometries( _gl, attributes, _infoMemory ); + var objects = new WebGLObjects( _gl, geometries, _infoRender ); + var programCache = new WebGLPrograms( this, capabilities ); + var lightCache = new WebGLLights(); + var renderLists = new WebGLRenderLists(); + + this.info.programs = programCache.programs; + + var bufferRenderer = new WebGLBufferRenderer( _gl, extensions, _infoRender ); + var indexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, _infoRender ); + + // + + var backgroundPlaneCamera, backgroundPlaneMesh; + var backgroundBoxCamera, backgroundBoxMesh; + + // + + function getTargetPixelRatio() { + + return _currentRenderTarget === null ? _pixelRatio : 1; + + } + + function setDefaultGLState() { + + state.init(); + + state.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) ); + state.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) ); + + state.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha ); + + } + + function resetGLState() { + + _currentProgram = null; + _currentCamera = null; + + _currentGeometryProgram = ''; + _currentMaterialId = - 1; + + state.reset(); + + } + + setDefaultGLState(); + + this.context = _gl; + this.capabilities = capabilities; + this.extensions = extensions; + this.properties = properties; + this.state = state; + + // shadow map + + var shadowMap = new WebGLShadowMap( this, _lights, objects, capabilities ); + + this.shadowMap = shadowMap; + + + // Plugins + + var spritePlugin = new SpritePlugin( this, sprites ); + var lensFlarePlugin = new LensFlarePlugin( this, lensFlares ); + + // API + + this.getContext = function () { + + return _gl; + + }; + + this.getContextAttributes = function () { + + return _gl.getContextAttributes(); + + }; + + this.forceContextLoss = function () { + + var extension = extensions.get( 'WEBGL_lose_context' ); + if ( extension ) extension.loseContext(); + + }; + + this.getMaxAnisotropy = function () { + + return capabilities.getMaxAnisotropy(); + + }; + + this.getPrecision = function () { + + return capabilities.precision; + + }; + + this.getPixelRatio = function () { + + return _pixelRatio; + + }; + + this.setPixelRatio = function ( value ) { + + if ( value === undefined ) return; + + _pixelRatio = value; + + this.setSize( _viewport.z, _viewport.w, false ); + + }; + + this.getSize = function () { + + return { + width: _width, + height: _height + }; + + }; + + this.setSize = function ( width, height, updateStyle ) { + + _width = width; + _height = height; + + _canvas.width = width * _pixelRatio; + _canvas.height = height * _pixelRatio; + + if ( updateStyle !== false ) { + + _canvas.style.width = width + 'px'; + _canvas.style.height = height + 'px'; + + } + + this.setViewport( 0, 0, width, height ); + + }; + + this.setViewport = function ( x, y, width, height ) { + + state.viewport( _viewport.set( x, y, width, height ) ); + + }; + + this.setScissor = function ( x, y, width, height ) { + + state.scissor( _scissor.set( x, y, width, height ) ); + + }; + + this.setScissorTest = function ( boolean ) { + + state.setScissorTest( _scissorTest = boolean ); + + }; + + // Clearing + + this.getClearColor = function () { + + return _clearColor; + + }; + + this.setClearColor = function ( color, alpha ) { + + _clearColor.set( color ); + + _clearAlpha = alpha !== undefined ? alpha : 1; + + state.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha ); + + }; + + this.getClearAlpha = function () { + + return _clearAlpha; + + }; + + this.setClearAlpha = function ( alpha ) { + + _clearAlpha = alpha; + + state.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha ); + + }; + + this.clear = function ( color, depth, stencil ) { + + var bits = 0; + + if ( color === undefined || color ) bits |= _gl.COLOR_BUFFER_BIT; + if ( depth === undefined || depth ) bits |= _gl.DEPTH_BUFFER_BIT; + if ( stencil === undefined || stencil ) bits |= _gl.STENCIL_BUFFER_BIT; + + _gl.clear( bits ); + + }; + + this.clearColor = function () { + + this.clear( true, false, false ); + + }; + + this.clearDepth = function () { + + this.clear( false, true, false ); + + }; + + this.clearStencil = function () { + + this.clear( false, false, true ); + + }; + + this.clearTarget = function ( renderTarget, color, depth, stencil ) { + + this.setRenderTarget( renderTarget ); + this.clear( color, depth, stencil ); + + }; + + // Reset + + this.resetGLState = resetGLState; + + this.dispose = function () { + + _canvas.removeEventListener( 'webglcontextlost', onContextLost, false ); + + renderLists.dispose(); + + }; + + // Events + + function onContextLost( event ) { + + event.preventDefault(); + + resetGLState(); + setDefaultGLState(); + + properties.clear(); + objects.clear(); + + } + + function onMaterialDispose( event ) { + + var material = event.target; + + material.removeEventListener( 'dispose', onMaterialDispose ); + + deallocateMaterial( material ); + + } + + // Buffer deallocation + + function deallocateMaterial( material ) { + + releaseMaterialProgramReference( material ); + + properties.remove( material ); + + } + + + function releaseMaterialProgramReference( material ) { + + var programInfo = properties.get( material ).program; + + material.program = undefined; + + if ( programInfo !== undefined ) { + + programCache.releaseProgram( programInfo ); + + } + + } + + // Buffer rendering + + function renderObjectImmediate( object, program, material ) { + + object.render( function ( object ) { + + _this.renderBufferImmediate( object, program, material ); + + } ); + + } + + this.renderBufferImmediate = function ( object, program, material ) { + + state.initAttributes(); + + var buffers = properties.get( object ); + + if ( object.hasPositions && ! buffers.position ) buffers.position = _gl.createBuffer(); + if ( object.hasNormals && ! buffers.normal ) buffers.normal = _gl.createBuffer(); + if ( object.hasUvs && ! buffers.uv ) buffers.uv = _gl.createBuffer(); + if ( object.hasColors && ! buffers.color ) buffers.color = _gl.createBuffer(); + + var programAttributes = program.getAttributes(); + + if ( object.hasPositions ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.position ); + _gl.bufferData( _gl.ARRAY_BUFFER, object.positionArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( programAttributes.position ); + _gl.vertexAttribPointer( programAttributes.position, 3, _gl.FLOAT, false, 0, 0 ); + + } + + if ( object.hasNormals ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.normal ); + + if ( ! material.isMeshPhongMaterial && + ! material.isMeshStandardMaterial && + ! material.isMeshNormalMaterial && + material.shading === FlatShading ) { + + for ( var i = 0, l = object.count * 3; i < l; i += 9 ) { + + var array = object.normalArray; + + var nx = ( array[ i + 0 ] + array[ i + 3 ] + array[ i + 6 ] ) / 3; + var ny = ( array[ i + 1 ] + array[ i + 4 ] + array[ i + 7 ] ) / 3; + var nz = ( array[ i + 2 ] + array[ i + 5 ] + array[ i + 8 ] ) / 3; + + array[ i + 0 ] = nx; + array[ i + 1 ] = ny; + array[ i + 2 ] = nz; + + array[ i + 3 ] = nx; + array[ i + 4 ] = ny; + array[ i + 5 ] = nz; + + array[ i + 6 ] = nx; + array[ i + 7 ] = ny; + array[ i + 8 ] = nz; + + } + + } + + _gl.bufferData( _gl.ARRAY_BUFFER, object.normalArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( programAttributes.normal ); + + _gl.vertexAttribPointer( programAttributes.normal, 3, _gl.FLOAT, false, 0, 0 ); + + } + + if ( object.hasUvs && material.map ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.uv ); + _gl.bufferData( _gl.ARRAY_BUFFER, object.uvArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( programAttributes.uv ); + + _gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 0, 0 ); + + } + + if ( object.hasColors && material.vertexColors !== NoColors ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.color ); + _gl.bufferData( _gl.ARRAY_BUFFER, object.colorArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( programAttributes.color ); + + _gl.vertexAttribPointer( programAttributes.color, 3, _gl.FLOAT, false, 0, 0 ); + + } + + state.disableUnusedAttributes(); + + _gl.drawArrays( _gl.TRIANGLES, 0, object.count ); + + object.count = 0; + + }; + + function absNumericalSort( a, b ) { + + return Math.abs( b[ 0 ] ) - Math.abs( a[ 0 ] ); + + } + + this.renderBufferDirect = function ( camera, fog, geometry, material, object, group ) { + + state.setMaterial( material ); + + var program = setProgram( camera, fog, material, object ); + var geometryProgram = geometry.id + '_' + program.id + '_' + ( material.wireframe === true ); + + var updateBuffers = false; + + if ( geometryProgram !== _currentGeometryProgram ) { + + _currentGeometryProgram = geometryProgram; + updateBuffers = true; + + } + + // morph targets + + var morphTargetInfluences = object.morphTargetInfluences; + + if ( morphTargetInfluences !== undefined ) { + + // TODO Remove allocations + + var activeInfluences = []; + + for ( var i = 0, l = morphTargetInfluences.length; i < l; i ++ ) { + + var influence = morphTargetInfluences[ i ]; + activeInfluences.push( [ influence, i ] ); + + } + + activeInfluences.sort( absNumericalSort ); + + if ( activeInfluences.length > 8 ) { + + activeInfluences.length = 8; + + } + + var morphAttributes = geometry.morphAttributes; + + for ( var i = 0, l = activeInfluences.length; i < l; i ++ ) { + + var influence = activeInfluences[ i ]; + morphInfluences[ i ] = influence[ 0 ]; + + if ( influence[ 0 ] !== 0 ) { + + var index = influence[ 1 ]; + + if ( material.morphTargets === true && morphAttributes.position ) geometry.addAttribute( 'morphTarget' + i, morphAttributes.position[ index ] ); + if ( material.morphNormals === true && morphAttributes.normal ) geometry.addAttribute( 'morphNormal' + i, morphAttributes.normal[ index ] ); + + } else { + + if ( material.morphTargets === true ) geometry.removeAttribute( 'morphTarget' + i ); + if ( material.morphNormals === true ) geometry.removeAttribute( 'morphNormal' + i ); + + } + + } + + for ( var i = activeInfluences.length, il = morphInfluences.length; i < il; i ++ ) { + + morphInfluences[ i ] = 0.0; + + } + + program.getUniforms().setValue( _gl, 'morphTargetInfluences', morphInfluences ); + + updateBuffers = true; + + } + + // + + var index = geometry.index; + var position = geometry.attributes.position; + var rangeFactor = 1; + + if ( material.wireframe === true ) { + + index = geometries.getWireframeAttribute( geometry ); + rangeFactor = 2; + + } + + var renderer = bufferRenderer; + + if ( index !== null ) { + + renderer = indexedBufferRenderer; + renderer.setIndex( index ); + + } + + if ( updateBuffers ) { + + setupVertexAttributes( material, program, geometry ); + + if ( index !== null ) { + + _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, attributes.get( index ).buffer ); + + } + + } + + // + + var dataCount = 0; + + if ( index !== null ) { + + dataCount = index.count; + + } else if ( position !== undefined ) { + + dataCount = position.count; + + } + + var rangeStart = geometry.drawRange.start * rangeFactor; + var rangeCount = geometry.drawRange.count * rangeFactor; + + var groupStart = group !== null ? group.start * rangeFactor : 0; + var groupCount = group !== null ? group.count * rangeFactor : Infinity; + + var drawStart = Math.max( rangeStart, groupStart ); + var drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1; + + var drawCount = Math.max( 0, drawEnd - drawStart + 1 ); + + if ( drawCount === 0 ) return; + + // + + if ( object.isMesh ) { + + if ( material.wireframe === true ) { + + state.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() ); + renderer.setMode( _gl.LINES ); + + } else { + + switch ( object.drawMode ) { + + case TrianglesDrawMode: + renderer.setMode( _gl.TRIANGLES ); + break; + + case TriangleStripDrawMode: + renderer.setMode( _gl.TRIANGLE_STRIP ); + break; + + case TriangleFanDrawMode: + renderer.setMode( _gl.TRIANGLE_FAN ); + break; + + } + + } + + + } else if ( object.isLine ) { + + var lineWidth = material.linewidth; + + if ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material + + state.setLineWidth( lineWidth * getTargetPixelRatio() ); + + if ( object.isLineSegments ) { + + renderer.setMode( _gl.LINES ); + + } else if ( object.isLineLoop ) { + + renderer.setMode( _gl.LINE_LOOP ); + + } else { + + renderer.setMode( _gl.LINE_STRIP ); + + } + + } else if ( object.isPoints ) { + + renderer.setMode( _gl.POINTS ); + + } + + if ( geometry && geometry.isInstancedBufferGeometry ) { + + if ( geometry.maxInstancedCount > 0 ) { + + renderer.renderInstances( geometry, drawStart, drawCount ); + + } + + } else { + + renderer.render( drawStart, drawCount ); + + } + + }; + + function setupVertexAttributes( material, program, geometry, startIndex ) { + + if ( geometry && geometry.isInstancedBufferGeometry ) { + + if ( extensions.get( 'ANGLE_instanced_arrays' ) === null ) { + + console.error( 'THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + } + + if ( startIndex === undefined ) startIndex = 0; + + state.initAttributes(); + + var geometryAttributes = geometry.attributes; + + var programAttributes = program.getAttributes(); + + var materialDefaultAttributeValues = material.defaultAttributeValues; + + for ( var name in programAttributes ) { + + var programAttribute = programAttributes[ name ]; + + if ( programAttribute >= 0 ) { + + var geometryAttribute = geometryAttributes[ name ]; + + if ( geometryAttribute !== undefined ) { + + var normalized = geometryAttribute.normalized; + var size = geometryAttribute.itemSize; + + var attributeProperties = attributes.get( geometryAttribute ); + + var buffer = attributeProperties.buffer; + var type = attributeProperties.type; + var bytesPerElement = attributeProperties.bytesPerElement; + + if ( geometryAttribute.isInterleavedBufferAttribute ) { + + var data = geometryAttribute.data; + var stride = data.stride; + var offset = geometryAttribute.offset; + + if ( data && data.isInstancedInterleavedBuffer ) { + + state.enableAttributeAndDivisor( programAttribute, data.meshPerAttribute ); + + if ( geometry.maxInstancedCount === undefined ) { + + geometry.maxInstancedCount = data.meshPerAttribute * data.count; + + } + + } else { + + state.enableAttribute( programAttribute ); + + } + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffer ); + _gl.vertexAttribPointer( programAttribute, size, type, normalized, stride * bytesPerElement, ( startIndex * stride + offset ) * bytesPerElement ); + + } else { + + if ( geometryAttribute.isInstancedBufferAttribute ) { + + state.enableAttributeAndDivisor( programAttribute, geometryAttribute.meshPerAttribute ); + + if ( geometry.maxInstancedCount === undefined ) { + + geometry.maxInstancedCount = geometryAttribute.meshPerAttribute * geometryAttribute.count; + + } + + } else { + + state.enableAttribute( programAttribute ); + + } + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffer ); + _gl.vertexAttribPointer( programAttribute, size, type, normalized, 0, startIndex * size * bytesPerElement ); + + } + + } else if ( materialDefaultAttributeValues !== undefined ) { + + var value = materialDefaultAttributeValues[ name ]; + + if ( value !== undefined ) { + + switch ( value.length ) { + + case 2: + _gl.vertexAttrib2fv( programAttribute, value ); + break; + + case 3: + _gl.vertexAttrib3fv( programAttribute, value ); + break; + + case 4: + _gl.vertexAttrib4fv( programAttribute, value ); + break; + + default: + _gl.vertexAttrib1fv( programAttribute, value ); + + } + + } + + } + + } + + } + + state.disableUnusedAttributes(); + + } + + // Compile + + this.compile = function ( scene, camera ) { + + lights = []; + + scene.traverse( function ( object ) { + + if ( object.isLight ) { + + lights.push( object ); + + } + + } ); + + setupLights( lights, camera ); + + scene.traverse( function ( object ) { + + if ( object.material ) { + + if ( Array.isArray( object.material ) ) { + + for ( var i = 0; i < object.material.length; i ++ ) { + + initMaterial( object.material[ i ], scene.fog, object ); + + } + + } else { + + initMaterial( object.material, scene.fog, object ); + + } + + } + + } ); + + }; + + // Rendering + + this.render = function ( scene, camera, renderTarget, forceClear ) { + + if ( camera !== undefined && camera.isCamera !== true ) { + + console.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' ); + return; + + } + + // reset caching for this frame + + _currentGeometryProgram = ''; + _currentMaterialId = - 1; + _currentCamera = null; + + // update scene graph + + if ( scene.autoUpdate === true ) scene.updateMatrixWorld(); + + // update camera matrices and frustum + + camera.onBeforeRender( _this ); + + if ( camera.parent === null ) camera.updateMatrixWorld(); + + camera.matrixWorldInverse.getInverse( camera.matrixWorld ); + + _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse ); + _frustum.setFromMatrix( _projScreenMatrix ); + + lights.length = 0; + sprites.length = 0; + lensFlares.length = 0; + + _localClippingEnabled = this.localClippingEnabled; + _clippingEnabled = _clipping.init( this.clippingPlanes, _localClippingEnabled, camera ); + + currentRenderList = renderLists.get( scene, camera ); + currentRenderList.init(); + + projectObject( scene, camera, _this.sortObjects ); + + currentRenderList.finish(); + + if ( _this.sortObjects === true ) { + + currentRenderList.sort(); + + } + + // + + if ( _clippingEnabled ) _clipping.beginShadows(); + + setupShadows( lights ); + + shadowMap.render( scene, camera ); + + setupLights( lights, camera ); + + if ( _clippingEnabled ) _clipping.endShadows(); + + // + + _infoRender.frame ++; + _infoRender.calls = 0; + _infoRender.vertices = 0; + _infoRender.faces = 0; + _infoRender.points = 0; + + if ( renderTarget === undefined ) { + + renderTarget = null; + + } + + this.setRenderTarget( renderTarget ); + + // + + var background = scene.background; + + if ( background === null ) { + + state.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha ); + + } else if ( background && background.isColor ) { + + state.buffers.color.setClear( background.r, background.g, background.b, 1, _premultipliedAlpha ); + forceClear = true; + + } + + if ( this.autoClear || forceClear ) { + + this.clear( this.autoClearColor, this.autoClearDepth, this.autoClearStencil ); + + } + + if ( background && background.isCubeTexture ) { + + if ( backgroundBoxCamera === undefined ) { + + backgroundBoxCamera = new PerspectiveCamera(); + + backgroundBoxMesh = new Mesh( + new BoxBufferGeometry( 5, 5, 5 ), + new ShaderMaterial( { + uniforms: ShaderLib.cube.uniforms, + vertexShader: ShaderLib.cube.vertexShader, + fragmentShader: ShaderLib.cube.fragmentShader, + side: BackSide, + depthTest: false, + depthWrite: false, + fog: false + } ) + ); + + } + + backgroundBoxCamera.projectionMatrix.copy( camera.projectionMatrix ); + + backgroundBoxCamera.matrixWorld.extractRotation( camera.matrixWorld ); + backgroundBoxCamera.matrixWorldInverse.getInverse( backgroundBoxCamera.matrixWorld ); + + + backgroundBoxMesh.material.uniforms[ "tCube" ].value = background; + backgroundBoxMesh.modelViewMatrix.multiplyMatrices( backgroundBoxCamera.matrixWorldInverse, backgroundBoxMesh.matrixWorld ); + + objects.update( backgroundBoxMesh ); + + _this.renderBufferDirect( backgroundBoxCamera, null, backgroundBoxMesh.geometry, backgroundBoxMesh.material, backgroundBoxMesh, null ); + + } else if ( background && background.isTexture ) { + + if ( backgroundPlaneCamera === undefined ) { + + backgroundPlaneCamera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 ); + + backgroundPlaneMesh = new Mesh( + new PlaneBufferGeometry( 2, 2 ), + new MeshBasicMaterial( { depthTest: false, depthWrite: false, fog: false } ) + ); + + } + + backgroundPlaneMesh.material.map = background; + + objects.update( backgroundPlaneMesh ); + + _this.renderBufferDirect( backgroundPlaneCamera, null, backgroundPlaneMesh.geometry, backgroundPlaneMesh.material, backgroundPlaneMesh, null ); + + } + + // + + var opaqueObjects = currentRenderList.opaque; + var transparentObjects = currentRenderList.transparent; + + if ( scene.overrideMaterial ) { + + var overrideMaterial = scene.overrideMaterial; + + if ( opaqueObjects.length ) renderObjects( opaqueObjects, scene, camera, overrideMaterial ); + if ( transparentObjects.length ) renderObjects( transparentObjects, scene, camera, overrideMaterial ); + + } else { + + // opaque pass (front-to-back order) + + if ( opaqueObjects.length ) renderObjects( opaqueObjects, scene, camera ); + + // transparent pass (back-to-front order) + + if ( transparentObjects.length ) renderObjects( transparentObjects, scene, camera ); + + } + + // custom render plugins (post pass) + + spritePlugin.render( scene, camera ); + lensFlarePlugin.render( scene, camera, _currentViewport ); + + // Generate mipmap if we're using any kind of mipmap filtering + + if ( renderTarget ) { + + textures.updateRenderTargetMipmap( renderTarget ); + + } + + // Ensure depth buffer writing is enabled so it can be cleared on next render + + state.buffers.depth.setTest( true ); + state.buffers.depth.setMask( true ); + state.buffers.color.setMask( true ); + + if ( camera.isArrayCamera && camera.enabled ) { + + _this.setScissorTest( false ); + + } + + camera.onAfterRender( _this ); + + // _gl.finish(); + + }; + + /* + // TODO Duplicated code (Frustum) + + var _sphere = new Sphere(); + + function isObjectViewable( object ) { + + var geometry = object.geometry; + + if ( geometry.boundingSphere === null ) + geometry.computeBoundingSphere(); + + _sphere.copy( geometry.boundingSphere ). + applyMatrix4( object.matrixWorld ); + + return isSphereViewable( _sphere ); + + } + + function isSpriteViewable( sprite ) { + + _sphere.center.set( 0, 0, 0 ); + _sphere.radius = 0.7071067811865476; + _sphere.applyMatrix4( sprite.matrixWorld ); + + return isSphereViewable( _sphere ); + + } + + function isSphereViewable( sphere ) { + + if ( ! _frustum.intersectsSphere( sphere ) ) return false; + + var numPlanes = _clipping.numPlanes; + + if ( numPlanes === 0 ) return true; + + var planes = _this.clippingPlanes, + + center = sphere.center, + negRad = - sphere.radius, + i = 0; + + do { + + // out when deeper than radius in the negative halfspace + if ( planes[ i ].distanceToPoint( center ) < negRad ) return false; + + } while ( ++ i !== numPlanes ); + + return true; + + } + */ + + function projectObject( object, camera, sortObjects ) { + + if ( ! object.visible ) return; + + var visible = object.layers.test( camera.layers ); + + if ( visible ) { + + if ( object.isLight ) { + + lights.push( object ); + + } else if ( object.isSprite ) { + + if ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) { + + sprites.push( object ); + + } + + } else if ( object.isLensFlare ) { + + lensFlares.push( object ); + + } else if ( object.isImmediateRenderObject ) { + + if ( sortObjects ) { + + _vector3.setFromMatrixPosition( object.matrixWorld ) + .applyMatrix4( _projScreenMatrix ); + + } + + currentRenderList.push( object, null, object.material, _vector3.z, null ); + + } else if ( object.isMesh || object.isLine || object.isPoints ) { + + if ( object.isSkinnedMesh ) { + + object.skeleton.update(); + + } + + if ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) { + + if ( sortObjects ) { + + _vector3.setFromMatrixPosition( object.matrixWorld ) + .applyMatrix4( _projScreenMatrix ); + + } + + var geometry = objects.update( object ); + var material = object.material; + + if ( Array.isArray( material ) ) { + + var groups = geometry.groups; + + for ( var i = 0, l = groups.length; i < l; i ++ ) { + + var group = groups[ i ]; + var groupMaterial = material[ group.materialIndex ]; + + if ( groupMaterial && groupMaterial.visible ) { + + currentRenderList.push( object, geometry, groupMaterial, _vector3.z, group ); + + } + + } + + } else if ( material.visible ) { + + currentRenderList.push( object, geometry, material, _vector3.z, null ); + + } + + } + + } + + } + + var children = object.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + projectObject( children[ i ], camera, sortObjects ); + + } + + } + + function renderObjects( renderList, scene, camera, overrideMaterial ) { + + for ( var i = 0, l = renderList.length; i < l; i ++ ) { + + var renderItem = renderList[ i ]; + + var object = renderItem.object; + var geometry = renderItem.geometry; + var material = overrideMaterial === undefined ? renderItem.material : overrideMaterial; + var group = renderItem.group; + + object.onBeforeRender( _this, scene, camera, geometry, material, group ); + + if ( camera.isArrayCamera && camera.enabled ) { + + var cameras = camera.cameras; + + for ( var j = 0, jl = cameras.length; j < jl; j ++ ) { + + var camera2 = cameras[ j ]; + var bounds = camera2.bounds; + + _this.setViewport( + bounds.x * _width * _pixelRatio, bounds.y * _height * _pixelRatio, + bounds.z * _width * _pixelRatio, bounds.w * _height * _pixelRatio + ); + _this.setScissor( + bounds.x * _width * _pixelRatio, bounds.y * _height * _pixelRatio, + bounds.z * _width * _pixelRatio, bounds.w * _height * _pixelRatio + ); + _this.setScissorTest( true ); + + renderObject( object, scene, camera2, geometry, material, group ); + + } + + } else { + + renderObject( object, scene, camera, geometry, material, group ); + + } + + object.onAfterRender( _this, scene, camera, geometry, material, group ); + + } + + } + + function renderObject( object, scene, camera, geometry, material, group ) { + + object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld ); + object.normalMatrix.getNormalMatrix( object.modelViewMatrix ); + + if ( object.isImmediateRenderObject ) { + + state.setMaterial( material ); + + var program = setProgram( camera, scene.fog, material, object ); + + _currentGeometryProgram = ''; + + renderObjectImmediate( object, program, material ); + + } else { + + _this.renderBufferDirect( camera, scene.fog, geometry, material, object, group ); + + } + + } + + function initMaterial( material, fog, object ) { + + var materialProperties = properties.get( material ); + + var parameters = programCache.getParameters( + material, _lights, fog, _clipping.numPlanes, _clipping.numIntersection, object ); + + var code = programCache.getProgramCode( material, parameters ); + + var program = materialProperties.program; + var programChange = true; + + if ( program === undefined ) { + + // new material + material.addEventListener( 'dispose', onMaterialDispose ); + + } else if ( program.code !== code ) { + + // changed glsl or parameters + releaseMaterialProgramReference( material ); + + } else if ( parameters.shaderID !== undefined ) { + + // same glsl and uniform list + return; + + } else { + + // only rebuild uniform list + programChange = false; + + } + + if ( programChange ) { + + if ( parameters.shaderID ) { + + var shader = ShaderLib[ parameters.shaderID ]; + + materialProperties.__webglShader = { + name: material.type, + uniforms: UniformsUtils.clone( shader.uniforms ), + vertexShader: shader.vertexShader, + fragmentShader: shader.fragmentShader + }; + + } else { + + materialProperties.__webglShader = { + name: material.type, + uniforms: material.uniforms, + vertexShader: material.vertexShader, + fragmentShader: material.fragmentShader + }; + + } + + material.__webglShader = materialProperties.__webglShader; + + program = programCache.acquireProgram( material, parameters, code ); + + materialProperties.program = program; + material.program = program; + + } + + var programAttributes = program.getAttributes(); + + if ( material.morphTargets ) { + + material.numSupportedMorphTargets = 0; + + for ( var i = 0; i < _this.maxMorphTargets; i ++ ) { + + if ( programAttributes[ 'morphTarget' + i ] >= 0 ) { + + material.numSupportedMorphTargets ++; + + } + + } + + } + + if ( material.morphNormals ) { + + material.numSupportedMorphNormals = 0; + + for ( var i = 0; i < _this.maxMorphNormals; i ++ ) { + + if ( programAttributes[ 'morphNormal' + i ] >= 0 ) { + + material.numSupportedMorphNormals ++; + + } + + } + + } + + var uniforms = materialProperties.__webglShader.uniforms; + + if ( ! material.isShaderMaterial && + ! material.isRawShaderMaterial || + material.clipping === true ) { + + materialProperties.numClippingPlanes = _clipping.numPlanes; + materialProperties.numIntersection = _clipping.numIntersection; + uniforms.clippingPlanes = _clipping.uniform; + + } + + materialProperties.fog = fog; + + // store the light setup it was created for + + materialProperties.lightsHash = _lights.hash; + + if ( material.lights ) { + + // wire up the material to this renderer's lighting state + + uniforms.ambientLightColor.value = _lights.ambient; + uniforms.directionalLights.value = _lights.directional; + uniforms.spotLights.value = _lights.spot; + uniforms.rectAreaLights.value = _lights.rectArea; + uniforms.pointLights.value = _lights.point; + uniforms.hemisphereLights.value = _lights.hemi; + + uniforms.directionalShadowMap.value = _lights.directionalShadowMap; + uniforms.directionalShadowMatrix.value = _lights.directionalShadowMatrix; + uniforms.spotShadowMap.value = _lights.spotShadowMap; + uniforms.spotShadowMatrix.value = _lights.spotShadowMatrix; + uniforms.pointShadowMap.value = _lights.pointShadowMap; + uniforms.pointShadowMatrix.value = _lights.pointShadowMatrix; + // TODO (abelnation): add area lights shadow info to uniforms + + } + + var progUniforms = materialProperties.program.getUniforms(), + uniformsList = + WebGLUniforms.seqWithValue( progUniforms.seq, uniforms ); + + materialProperties.uniformsList = uniformsList; + + } + + function setProgram( camera, fog, material, object ) { + + _usedTextureUnits = 0; + + var materialProperties = properties.get( material ); + + if ( _clippingEnabled ) { + + if ( _localClippingEnabled || camera !== _currentCamera ) { + + var useCache = + camera === _currentCamera && + material.id === _currentMaterialId; + + // we might want to call this function with some ClippingGroup + // object instead of the material, once it becomes feasible + // (#8465, #8379) + _clipping.setState( + material.clippingPlanes, material.clipIntersection, material.clipShadows, + camera, materialProperties, useCache ); + + } + + } + + if ( material.needsUpdate === false ) { + + if ( materialProperties.program === undefined ) { + + material.needsUpdate = true; + + } else if ( material.fog && materialProperties.fog !== fog ) { + + material.needsUpdate = true; + + } else if ( material.lights && materialProperties.lightsHash !== _lights.hash ) { + + material.needsUpdate = true; + + } else if ( materialProperties.numClippingPlanes !== undefined && + ( materialProperties.numClippingPlanes !== _clipping.numPlanes || + materialProperties.numIntersection !== _clipping.numIntersection ) ) { + + material.needsUpdate = true; + + } + + } + + if ( material.needsUpdate ) { + + initMaterial( material, fog, object ); + material.needsUpdate = false; + + } + + var refreshProgram = false; + var refreshMaterial = false; + var refreshLights = false; + + var program = materialProperties.program, + p_uniforms = program.getUniforms(), + m_uniforms = materialProperties.__webglShader.uniforms; + + if ( program.id !== _currentProgram ) { + + _gl.useProgram( program.program ); + _currentProgram = program.id; + + refreshProgram = true; + refreshMaterial = true; + refreshLights = true; + + } + + if ( material.id !== _currentMaterialId ) { + + _currentMaterialId = material.id; + + refreshMaterial = true; + + } + + if ( refreshProgram || camera !== _currentCamera ) { + + p_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix ); + + if ( capabilities.logarithmicDepthBuffer ) { + + p_uniforms.setValue( _gl, 'logDepthBufFC', + 2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) ); + + } + + + if ( camera !== _currentCamera ) { + + _currentCamera = camera; + + // lighting uniforms depend on the camera so enforce an update + // now, in case this material supports lights - or later, when + // the next material that does gets activated: + + refreshMaterial = true; // set to true on material change + refreshLights = true; // remains set until update done + + } + + // load material specific uniforms + // (shader material also gets them for the sake of genericity) + + if ( material.isShaderMaterial || + material.isMeshPhongMaterial || + material.isMeshStandardMaterial || + material.envMap ) { + + var uCamPos = p_uniforms.map.cameraPosition; + + if ( uCamPos !== undefined ) { + + uCamPos.setValue( _gl, + _vector3.setFromMatrixPosition( camera.matrixWorld ) ); + + } + + } + + if ( material.isMeshPhongMaterial || + material.isMeshLambertMaterial || + material.isMeshBasicMaterial || + material.isMeshStandardMaterial || + material.isShaderMaterial || + material.skinning ) { + + p_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse ); + + } + + p_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure ); + p_uniforms.setValue( _gl, 'toneMappingWhitePoint', _this.toneMappingWhitePoint ); + + } + + // skinning uniforms must be set even if material didn't change + // auto-setting of texture unit for bone texture must go before other textures + // not sure why, but otherwise weird things happen + + if ( material.skinning ) { + + p_uniforms.setOptional( _gl, object, 'bindMatrix' ); + p_uniforms.setOptional( _gl, object, 'bindMatrixInverse' ); + + var skeleton = object.skeleton; + + if ( skeleton ) { + + var bones = skeleton.bones; + + if ( capabilities.floatVertexTextures ) { + + if ( skeleton.boneTexture === undefined ) { + + // layout (1 matrix = 4 pixels) + // RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4) + // with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8) + // 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16) + // 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32) + // 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64) + + + var size = Math.sqrt( bones.length * 4 ); // 4 pixels needed for 1 matrix + size = _Math.nextPowerOfTwo( Math.ceil( size ) ); + size = Math.max( size, 4 ); + + var boneMatrices = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel + boneMatrices.set( skeleton.boneMatrices ); // copy current values + + var boneTexture = new DataTexture( boneMatrices, size, size, RGBAFormat, FloatType ); + + skeleton.boneMatrices = boneMatrices; + skeleton.boneTexture = boneTexture; + skeleton.boneTextureSize = size; + + } + + p_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture ); + p_uniforms.setValue( _gl, 'boneTextureSize', skeleton.boneTextureSize ); + + } else { + + p_uniforms.setOptional( _gl, skeleton, 'boneMatrices' ); + + } + + } + + } + + if ( refreshMaterial ) { + + if ( material.lights ) { + + // the current material requires lighting info + + // note: all lighting uniforms are always set correctly + // they simply reference the renderer's state for their + // values + // + // use the current material's .needsUpdate flags to set + // the GL state when required + + markUniformsLightsNeedsUpdate( m_uniforms, refreshLights ); + + } + + // refresh uniforms common to several materials + + if ( fog && material.fog ) { + + refreshUniformsFog( m_uniforms, fog ); + + } + + if ( material.isMeshBasicMaterial || + material.isMeshLambertMaterial || + material.isMeshPhongMaterial || + material.isMeshStandardMaterial || + material.isMeshNormalMaterial || + material.isMeshDepthMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + + } + + // refresh single material specific uniforms + + if ( material.isLineBasicMaterial ) { + + refreshUniformsLine( m_uniforms, material ); + + } else if ( material.isLineDashedMaterial ) { + + refreshUniformsLine( m_uniforms, material ); + refreshUniformsDash( m_uniforms, material ); + + } else if ( material.isPointsMaterial ) { + + refreshUniformsPoints( m_uniforms, material ); + + } else if ( material.isMeshLambertMaterial ) { + + refreshUniformsLambert( m_uniforms, material ); + + } else if ( material.isMeshToonMaterial ) { + + refreshUniformsToon( m_uniforms, material ); + + } else if ( material.isMeshPhongMaterial ) { + + refreshUniformsPhong( m_uniforms, material ); + + } else if ( material.isMeshPhysicalMaterial ) { + + refreshUniformsPhysical( m_uniforms, material ); + + } else if ( material.isMeshStandardMaterial ) { + + refreshUniformsStandard( m_uniforms, material ); + + } else if ( material.isMeshDepthMaterial ) { + + if ( material.displacementMap ) { + + m_uniforms.displacementMap.value = material.displacementMap; + m_uniforms.displacementScale.value = material.displacementScale; + m_uniforms.displacementBias.value = material.displacementBias; + + } + + } else if ( material.isMeshNormalMaterial ) { + + refreshUniformsNormal( m_uniforms, material ); + + } + + // RectAreaLight Texture + // TODO (mrdoob): Find a nicer implementation + + if ( m_uniforms.ltcMat !== undefined ) m_uniforms.ltcMat.value = UniformsLib.LTC_MAT_TEXTURE; + if ( m_uniforms.ltcMag !== undefined ) m_uniforms.ltcMag.value = UniformsLib.LTC_MAG_TEXTURE; + + WebGLUniforms.upload( + _gl, materialProperties.uniformsList, m_uniforms, _this ); + + } + + + // common matrices + + p_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix ); + p_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix ); + p_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld ); + + return program; + + } + + // Uniforms (refresh uniforms objects) + + function refreshUniformsCommon( uniforms, material ) { + + uniforms.opacity.value = material.opacity; + + uniforms.diffuse.value = material.color; + + if ( material.emissive ) { + + uniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity ); + + } + + uniforms.map.value = material.map; + uniforms.specularMap.value = material.specularMap; + uniforms.alphaMap.value = material.alphaMap; + + if ( material.lightMap ) { + + uniforms.lightMap.value = material.lightMap; + uniforms.lightMapIntensity.value = material.lightMapIntensity; + + } + + if ( material.aoMap ) { + + uniforms.aoMap.value = material.aoMap; + uniforms.aoMapIntensity.value = material.aoMapIntensity; + + } + + // uv repeat and offset setting priorities + // 1. color map + // 2. specular map + // 3. normal map + // 4. bump map + // 5. alpha map + // 6. emissive map + + var uvScaleMap; + + if ( material.map ) { + + uvScaleMap = material.map; + + } else if ( material.specularMap ) { + + uvScaleMap = material.specularMap; + + } else if ( material.displacementMap ) { + + uvScaleMap = material.displacementMap; + + } else if ( material.normalMap ) { + + uvScaleMap = material.normalMap; + + } else if ( material.bumpMap ) { + + uvScaleMap = material.bumpMap; + + } else if ( material.roughnessMap ) { + + uvScaleMap = material.roughnessMap; + + } else if ( material.metalnessMap ) { + + uvScaleMap = material.metalnessMap; + + } else if ( material.alphaMap ) { + + uvScaleMap = material.alphaMap; + + } else if ( material.emissiveMap ) { + + uvScaleMap = material.emissiveMap; + + } + + if ( uvScaleMap !== undefined ) { + + // backwards compatibility + if ( uvScaleMap.isWebGLRenderTarget ) { + + uvScaleMap = uvScaleMap.texture; + + } + + var offset = uvScaleMap.offset; + var repeat = uvScaleMap.repeat; + + uniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y ); + + } + + uniforms.envMap.value = material.envMap; + + // don't flip CubeTexture envMaps, flip everything else: + // WebGLRenderTargetCube will be flipped for backwards compatibility + // WebGLRenderTargetCube.texture will be flipped because it's a Texture and NOT a CubeTexture + // this check must be handled differently, or removed entirely, if WebGLRenderTargetCube uses a CubeTexture in the future + uniforms.flipEnvMap.value = ( ! ( material.envMap && material.envMap.isCubeTexture ) ) ? 1 : - 1; + + uniforms.reflectivity.value = material.reflectivity; + uniforms.refractionRatio.value = material.refractionRatio; + + } + + function refreshUniformsLine( uniforms, material ) { + + uniforms.diffuse.value = material.color; + uniforms.opacity.value = material.opacity; + + } + + function refreshUniformsDash( uniforms, material ) { + + uniforms.dashSize.value = material.dashSize; + uniforms.totalSize.value = material.dashSize + material.gapSize; + uniforms.scale.value = material.scale; + + } + + function refreshUniformsPoints( uniforms, material ) { + + uniforms.diffuse.value = material.color; + uniforms.opacity.value = material.opacity; + uniforms.size.value = material.size * _pixelRatio; + uniforms.scale.value = _height * 0.5; + + uniforms.map.value = material.map; + + if ( material.map !== null ) { + + var offset = material.map.offset; + var repeat = material.map.repeat; + + uniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y ); + + } + + } + + function refreshUniformsFog( uniforms, fog ) { + + uniforms.fogColor.value = fog.color; + + if ( fog.isFog ) { + + uniforms.fogNear.value = fog.near; + uniforms.fogFar.value = fog.far; + + } else if ( fog.isFogExp2 ) { + + uniforms.fogDensity.value = fog.density; + + } + + } + + function refreshUniformsLambert( uniforms, material ) { + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + } + + function refreshUniformsPhong( uniforms, material ) { + + uniforms.specular.value = material.specular; + uniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 ) + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + } + + function refreshUniformsToon( uniforms, material ) { + + refreshUniformsPhong( uniforms, material ); + + if ( material.gradientMap ) { + + uniforms.gradientMap.value = material.gradientMap; + + } + + } + + function refreshUniformsStandard( uniforms, material ) { + + uniforms.roughness.value = material.roughness; + uniforms.metalness.value = material.metalness; + + if ( material.roughnessMap ) { + + uniforms.roughnessMap.value = material.roughnessMap; + + } + + if ( material.metalnessMap ) { + + uniforms.metalnessMap.value = material.metalnessMap; + + } + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + if ( material.envMap ) { + + //uniforms.envMap.value = material.envMap; // part of uniforms common + uniforms.envMapIntensity.value = material.envMapIntensity; + + } + + } + + function refreshUniformsPhysical( uniforms, material ) { + + uniforms.clearCoat.value = material.clearCoat; + uniforms.clearCoatRoughness.value = material.clearCoatRoughness; + + refreshUniformsStandard( uniforms, material ); + + } + + function refreshUniformsNormal( uniforms, material ) { + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + } + + // If uniforms are marked as clean, they don't need to be loaded to the GPU. + + function markUniformsLightsNeedsUpdate( uniforms, value ) { + + uniforms.ambientLightColor.needsUpdate = value; + + uniforms.directionalLights.needsUpdate = value; + uniforms.pointLights.needsUpdate = value; + uniforms.spotLights.needsUpdate = value; + uniforms.rectAreaLights.needsUpdate = value; + uniforms.hemisphereLights.needsUpdate = value; + + } + + // Lighting + + function setupShadows( lights ) { + + var lightShadowsLength = 0; + + for ( var i = 0, l = lights.length; i < l; i ++ ) { + + var light = lights[ i ]; + + if ( light.castShadow ) { + + _lights.shadows[ lightShadowsLength ] = light; + lightShadowsLength ++; + + } + + } + + _lights.shadows.length = lightShadowsLength; + + } + + function setupLights( lights, camera ) { + + var l, ll, light, shadow, + r = 0, g = 0, b = 0, + color, + intensity, + distance, + shadowMap, + + viewMatrix = camera.matrixWorldInverse, + + directionalLength = 0, + pointLength = 0, + spotLength = 0, + rectAreaLength = 0, + hemiLength = 0; + + for ( l = 0, ll = lights.length; l < ll; l ++ ) { + + light = lights[ l ]; + + color = light.color; + intensity = light.intensity; + distance = light.distance; + + shadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null; + + if ( light.isAmbientLight ) { + + r += color.r * intensity; + g += color.g * intensity; + b += color.b * intensity; + + } else if ( light.isDirectionalLight ) { + + var uniforms = lightCache.get( light ); + + uniforms.color.copy( light.color ).multiplyScalar( light.intensity ); + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + _vector3.setFromMatrixPosition( light.target.matrixWorld ); + uniforms.direction.sub( _vector3 ); + uniforms.direction.transformDirection( viewMatrix ); + + uniforms.shadow = light.castShadow; + + if ( light.castShadow ) { + + shadow = light.shadow; + + uniforms.shadowBias = shadow.bias; + uniforms.shadowRadius = shadow.radius; + uniforms.shadowMapSize = shadow.mapSize; + + } + + _lights.directionalShadowMap[ directionalLength ] = shadowMap; + _lights.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix; + _lights.directional[ directionalLength ] = uniforms; + + directionalLength ++; + + } else if ( light.isSpotLight ) { + + var uniforms = lightCache.get( light ); + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + uniforms.color.copy( color ).multiplyScalar( intensity ); + uniforms.distance = distance; + + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + _vector3.setFromMatrixPosition( light.target.matrixWorld ); + uniforms.direction.sub( _vector3 ); + uniforms.direction.transformDirection( viewMatrix ); + + uniforms.coneCos = Math.cos( light.angle ); + uniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) ); + uniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay; + + uniforms.shadow = light.castShadow; + + if ( light.castShadow ) { + + shadow = light.shadow; + + uniforms.shadowBias = shadow.bias; + uniforms.shadowRadius = shadow.radius; + uniforms.shadowMapSize = shadow.mapSize; + + } + + _lights.spotShadowMap[ spotLength ] = shadowMap; + _lights.spotShadowMatrix[ spotLength ] = light.shadow.matrix; + _lights.spot[ spotLength ] = uniforms; + + spotLength ++; + + } else if ( light.isRectAreaLight ) { + + var uniforms = lightCache.get( light ); + + // (a) intensity controls irradiance of entire light + uniforms.color + .copy( color ) + .multiplyScalar( intensity / ( light.width * light.height ) ); + + // (b) intensity controls the radiance per light area + // uniforms.color.copy( color ).multiplyScalar( intensity ); + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + // extract local rotation of light to derive width/height half vectors + _matrix42.identity(); + _matrix4.copy( light.matrixWorld ); + _matrix4.premultiply( viewMatrix ); + _matrix42.extractRotation( _matrix4 ); + + uniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 ); + uniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 ); + + uniforms.halfWidth.applyMatrix4( _matrix42 ); + uniforms.halfHeight.applyMatrix4( _matrix42 ); + + // TODO (abelnation): RectAreaLight distance? + // uniforms.distance = distance; + + _lights.rectArea[ rectAreaLength ] = uniforms; + + rectAreaLength ++; + + } else if ( light.isPointLight ) { + + var uniforms = lightCache.get( light ); + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + uniforms.color.copy( light.color ).multiplyScalar( light.intensity ); + uniforms.distance = light.distance; + uniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay; + + uniforms.shadow = light.castShadow; + + if ( light.castShadow ) { + + shadow = light.shadow; + + uniforms.shadowBias = shadow.bias; + uniforms.shadowRadius = shadow.radius; + uniforms.shadowMapSize = shadow.mapSize; + + } + + _lights.pointShadowMap[ pointLength ] = shadowMap; + _lights.pointShadowMatrix[ pointLength ] = light.shadow.matrix; + _lights.point[ pointLength ] = uniforms; + + pointLength ++; + + } else if ( light.isHemisphereLight ) { + + var uniforms = lightCache.get( light ); + + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + uniforms.direction.transformDirection( viewMatrix ); + uniforms.direction.normalize(); + + uniforms.skyColor.copy( light.color ).multiplyScalar( intensity ); + uniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity ); + + _lights.hemi[ hemiLength ] = uniforms; + + hemiLength ++; + + } + + } + + _lights.ambient[ 0 ] = r; + _lights.ambient[ 1 ] = g; + _lights.ambient[ 2 ] = b; + + _lights.directional.length = directionalLength; + _lights.spot.length = spotLength; + _lights.rectArea.length = rectAreaLength; + _lights.point.length = pointLength; + _lights.hemi.length = hemiLength; + + // TODO (sam-g-steel) why aren't we using join + _lights.hash = directionalLength + ',' + pointLength + ',' + spotLength + ',' + rectAreaLength + ',' + hemiLength + ',' + _lights.shadows.length; + + } + + // GL state setting + + this.setFaceCulling = function ( cullFace, frontFaceDirection ) { + + state.setCullFace( cullFace ); + state.setFlipSided( frontFaceDirection === FrontFaceDirectionCW ); + + }; + + // Textures + + function allocTextureUnit() { + + var textureUnit = _usedTextureUnits; + + if ( textureUnit >= capabilities.maxTextures ) { + + console.warn( 'WebGLRenderer: trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures ); + + } + + _usedTextureUnits += 1; + + return textureUnit; + + } + + this.allocTextureUnit = allocTextureUnit; + + // this.setTexture2D = setTexture2D; + this.setTexture2D = ( function () { + + var warned = false; + + // backwards compatibility: peel texture.texture + return function setTexture2D( texture, slot ) { + + if ( texture && texture.isWebGLRenderTarget ) { + + if ( ! warned ) { + + console.warn( "THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead." ); + warned = true; + + } + + texture = texture.texture; + + } + + textures.setTexture2D( texture, slot ); + + }; + + }() ); + + this.setTexture = ( function () { + + var warned = false; + + return function setTexture( texture, slot ) { + + if ( ! warned ) { + + console.warn( "THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead." ); + warned = true; + + } + + textures.setTexture2D( texture, slot ); + + }; + + }() ); + + this.setTextureCube = ( function () { + + var warned = false; + + return function setTextureCube( texture, slot ) { + + // backwards compatibility: peel texture.texture + if ( texture && texture.isWebGLRenderTargetCube ) { + + if ( ! warned ) { + + console.warn( "THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead." ); + warned = true; + + } + + texture = texture.texture; + + } + + // currently relying on the fact that WebGLRenderTargetCube.texture is a Texture and NOT a CubeTexture + // TODO: unify these code paths + if ( ( texture && texture.isCubeTexture ) || + ( Array.isArray( texture.image ) && texture.image.length === 6 ) ) { + + // CompressedTexture can have Array in image :/ + + // this function alone should take care of cube textures + textures.setTextureCube( texture, slot ); + + } else { + + // assumed: texture property of THREE.WebGLRenderTargetCube + + textures.setTextureCubeDynamic( texture, slot ); + + } + + }; + + }() ); + + this.getRenderTarget = function () { + + return _currentRenderTarget; + + }; + + this.setRenderTarget = function ( renderTarget ) { + + _currentRenderTarget = renderTarget; + + if ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) { + + textures.setupRenderTarget( renderTarget ); + + } + + var isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube ); + var framebuffer; + + if ( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + + if ( isCube ) { + + framebuffer = renderTargetProperties.__webglFramebuffer[ renderTarget.activeCubeFace ]; + + } else { + + framebuffer = renderTargetProperties.__webglFramebuffer; + + } + + _currentScissor.copy( renderTarget.scissor ); + _currentScissorTest = renderTarget.scissorTest; + + _currentViewport.copy( renderTarget.viewport ); + + } else { + + framebuffer = null; + + _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ); + _currentScissorTest = _scissorTest; + + _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ); + + } + + if ( _currentFramebuffer !== framebuffer ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + _currentFramebuffer = framebuffer; + + } + + state.scissor( _currentScissor ); + state.setScissorTest( _currentScissorTest ); + + state.viewport( _currentViewport ); + + if ( isCube ) { + + var textureProperties = properties.get( renderTarget.texture ); + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeCubeFace, textureProperties.__webglTexture, renderTarget.activeMipMapLevel ); + + } + + }; + + this.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer ) { + + if ( ( renderTarget && renderTarget.isWebGLRenderTarget ) === false ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' ); + return; + + } + + var framebuffer = properties.get( renderTarget ).__webglFramebuffer; + + if ( framebuffer ) { + + var restore = false; + + if ( framebuffer !== _currentFramebuffer ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + + restore = true; + + } + + try { + + var texture = renderTarget.texture; + var textureFormat = texture.format; + var textureType = texture.type; + + if ( textureFormat !== RGBAFormat && paramThreeToGL( textureFormat ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' ); + return; + + } + + if ( textureType !== UnsignedByteType && paramThreeToGL( textureType ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // IE11, Edge and Chrome Mac < 52 (#9513) + ! ( textureType === FloatType && ( extensions.get( 'OES_texture_float' ) || extensions.get( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox + ! ( textureType === HalfFloatType && extensions.get( 'EXT_color_buffer_half_float' ) ) ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' ); + return; + + } + + if ( _gl.checkFramebufferStatus( _gl.FRAMEBUFFER ) === _gl.FRAMEBUFFER_COMPLETE ) { + + // the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604) + + if ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) { + + _gl.readPixels( x, y, width, height, paramThreeToGL( textureFormat ), paramThreeToGL( textureType ), buffer ); + + } + + } else { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' ); + + } + + } finally { + + if ( restore ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, _currentFramebuffer ); + + } + + } + + } + + }; + + // Map three.js constants to WebGL constants + + function paramThreeToGL( p ) { + + var extension; + + if ( p === RepeatWrapping ) return _gl.REPEAT; + if ( p === ClampToEdgeWrapping ) return _gl.CLAMP_TO_EDGE; + if ( p === MirroredRepeatWrapping ) return _gl.MIRRORED_REPEAT; + + if ( p === NearestFilter ) return _gl.NEAREST; + if ( p === NearestMipMapNearestFilter ) return _gl.NEAREST_MIPMAP_NEAREST; + if ( p === NearestMipMapLinearFilter ) return _gl.NEAREST_MIPMAP_LINEAR; + + if ( p === LinearFilter ) return _gl.LINEAR; + if ( p === LinearMipMapNearestFilter ) return _gl.LINEAR_MIPMAP_NEAREST; + if ( p === LinearMipMapLinearFilter ) return _gl.LINEAR_MIPMAP_LINEAR; + + if ( p === UnsignedByteType ) return _gl.UNSIGNED_BYTE; + if ( p === UnsignedShort4444Type ) return _gl.UNSIGNED_SHORT_4_4_4_4; + if ( p === UnsignedShort5551Type ) return _gl.UNSIGNED_SHORT_5_5_5_1; + if ( p === UnsignedShort565Type ) return _gl.UNSIGNED_SHORT_5_6_5; + + if ( p === ByteType ) return _gl.BYTE; + if ( p === ShortType ) return _gl.SHORT; + if ( p === UnsignedShortType ) return _gl.UNSIGNED_SHORT; + if ( p === IntType ) return _gl.INT; + if ( p === UnsignedIntType ) return _gl.UNSIGNED_INT; + if ( p === FloatType ) return _gl.FLOAT; + + if ( p === HalfFloatType ) { + + extension = extensions.get( 'OES_texture_half_float' ); + + if ( extension !== null ) return extension.HALF_FLOAT_OES; + + } + + if ( p === AlphaFormat ) return _gl.ALPHA; + if ( p === RGBFormat ) return _gl.RGB; + if ( p === RGBAFormat ) return _gl.RGBA; + if ( p === LuminanceFormat ) return _gl.LUMINANCE; + if ( p === LuminanceAlphaFormat ) return _gl.LUMINANCE_ALPHA; + if ( p === DepthFormat ) return _gl.DEPTH_COMPONENT; + if ( p === DepthStencilFormat ) return _gl.DEPTH_STENCIL; + + if ( p === AddEquation ) return _gl.FUNC_ADD; + if ( p === SubtractEquation ) return _gl.FUNC_SUBTRACT; + if ( p === ReverseSubtractEquation ) return _gl.FUNC_REVERSE_SUBTRACT; + + if ( p === ZeroFactor ) return _gl.ZERO; + if ( p === OneFactor ) return _gl.ONE; + if ( p === SrcColorFactor ) return _gl.SRC_COLOR; + if ( p === OneMinusSrcColorFactor ) return _gl.ONE_MINUS_SRC_COLOR; + if ( p === SrcAlphaFactor ) return _gl.SRC_ALPHA; + if ( p === OneMinusSrcAlphaFactor ) return _gl.ONE_MINUS_SRC_ALPHA; + if ( p === DstAlphaFactor ) return _gl.DST_ALPHA; + if ( p === OneMinusDstAlphaFactor ) return _gl.ONE_MINUS_DST_ALPHA; + + if ( p === DstColorFactor ) return _gl.DST_COLOR; + if ( p === OneMinusDstColorFactor ) return _gl.ONE_MINUS_DST_COLOR; + if ( p === SrcAlphaSaturateFactor ) return _gl.SRC_ALPHA_SATURATE; + + if ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format || + p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_s3tc' ); + + if ( extension !== null ) { + + if ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT; + if ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT; + if ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT; + if ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT; + + } + + } + + if ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format || + p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_pvrtc' ); + + if ( extension !== null ) { + + if ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG; + if ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG; + if ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; + if ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; + + } + + } + + if ( p === RGB_ETC1_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_etc1' ); + + if ( extension !== null ) return extension.COMPRESSED_RGB_ETC1_WEBGL; + + } + + if ( p === MinEquation || p === MaxEquation ) { + + extension = extensions.get( 'EXT_blend_minmax' ); + + if ( extension !== null ) { + + if ( p === MinEquation ) return extension.MIN_EXT; + if ( p === MaxEquation ) return extension.MAX_EXT; + + } + + } + + if ( p === UnsignedInt248Type ) { + + extension = extensions.get( 'WEBGL_depth_texture' ); + + if ( extension !== null ) return extension.UNSIGNED_INT_24_8_WEBGL; + + } + + return 0; + + } + + } + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function FogExp2 ( color, density ) { + + this.name = ''; + + this.color = new Color( color ); + this.density = ( density !== undefined ) ? density : 0.00025; + + } + + FogExp2.prototype.isFogExp2 = true; + + FogExp2.prototype.clone = function () { + + return new FogExp2( this.color.getHex(), this.density ); + + }; + + FogExp2.prototype.toJSON = function ( meta ) { + + return { + type: 'FogExp2', + color: this.color.getHex(), + density: this.density + }; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Fog ( color, near, far ) { + + this.name = ''; + + this.color = new Color( color ); + + this.near = ( near !== undefined ) ? near : 1; + this.far = ( far !== undefined ) ? far : 1000; + + } + + Fog.prototype.isFog = true; + + Fog.prototype.clone = function () { + + return new Fog( this.color.getHex(), this.near, this.far ); + + }; + + Fog.prototype.toJSON = function ( meta ) { + + return { + type: 'Fog', + color: this.color.getHex(), + near: this.near, + far: this.far + }; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Scene () { + + Object3D.call( this ); + + this.type = 'Scene'; + + this.background = null; + this.fog = null; + this.overrideMaterial = null; + + this.autoUpdate = true; // checked by the renderer + + } + + Scene.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Scene, + + copy: function ( source, recursive ) { + + Object3D.prototype.copy.call( this, source, recursive ); + + if ( source.background !== null ) this.background = source.background.clone(); + if ( source.fog !== null ) this.fog = source.fog.clone(); + if ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone(); + + this.autoUpdate = source.autoUpdate; + this.matrixAutoUpdate = source.matrixAutoUpdate; + + return this; + + }, + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + if ( this.background !== null ) data.object.background = this.background.toJSON( meta ); + if ( this.fog !== null ) data.object.fog = this.fog.toJSON(); + + return data; + + } + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + */ + + function LensFlare( texture, size, distance, blending, color ) { + + Object3D.call( this ); + + this.lensFlares = []; + + this.positionScreen = new Vector3(); + this.customUpdateCallback = undefined; + + if ( texture !== undefined ) { + + this.add( texture, size, distance, blending, color ); + + } + + } + + LensFlare.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: LensFlare, + + isLensFlare: true, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + this.positionScreen.copy( source.positionScreen ); + this.customUpdateCallback = source.customUpdateCallback; + + for ( var i = 0, l = source.lensFlares.length; i < l; i ++ ) { + + this.lensFlares.push( source.lensFlares[ i ] ); + + } + + return this; + + }, + + add: function ( texture, size, distance, blending, color, opacity ) { + + if ( size === undefined ) size = - 1; + if ( distance === undefined ) distance = 0; + if ( opacity === undefined ) opacity = 1; + if ( color === undefined ) color = new Color( 0xffffff ); + if ( blending === undefined ) blending = NormalBlending; + + distance = Math.min( distance, Math.max( 0, distance ) ); + + this.lensFlares.push( { + texture: texture, // THREE.Texture + size: size, // size in pixels (-1 = use texture.width) + distance: distance, // distance (0-1) from light source (0=at light source) + x: 0, y: 0, z: 0, // screen position (-1 => 1) z = 0 is in front z = 1 is back + scale: 1, // scale + rotation: 0, // rotation + opacity: opacity, // opacity + color: color, // color + blending: blending // blending + } ); + + }, + + /* + * Update lens flares update positions on all flares based on the screen position + * Set myLensFlare.customUpdateCallback to alter the flares in your project specific way. + */ + + updateLensFlares: function () { + + var f, fl = this.lensFlares.length; + var flare; + var vecX = - this.positionScreen.x * 2; + var vecY = - this.positionScreen.y * 2; + + for ( f = 0; f < fl; f ++ ) { + + flare = this.lensFlares[ f ]; + + flare.x = this.positionScreen.x + vecX * flare.distance; + flare.y = this.positionScreen.y + vecY * flare.distance; + + flare.wantedRotation = flare.x * Math.PI * 0.25; + flare.rotation += ( flare.wantedRotation - flare.rotation ) * 0.25; + + } + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: <hex>, + * opacity: <float>, + * map: new THREE.Texture( <Image> ), + * + * uvOffset: new THREE.Vector2(), + * uvScale: new THREE.Vector2() + * } + */ + + function SpriteMaterial( parameters ) { + + Material.call( this ); + + this.type = 'SpriteMaterial'; + + this.color = new Color( 0xffffff ); + this.map = null; + + this.rotation = 0; + + this.fog = false; + this.lights = false; + + this.setValues( parameters ); + + } + + SpriteMaterial.prototype = Object.create( Material.prototype ); + SpriteMaterial.prototype.constructor = SpriteMaterial; + SpriteMaterial.prototype.isSpriteMaterial = true; + + SpriteMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + this.map = source.map; + + this.rotation = source.rotation; + + return this; + + }; + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Sprite( material ) { + + Object3D.call( this ); + + this.type = 'Sprite'; + + this.material = ( material !== undefined ) ? material : new SpriteMaterial(); + + } + + Sprite.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Sprite, + + isSprite: true, + + raycast: ( function () { + + var intersectPoint = new Vector3(); + var worldPosition = new Vector3(); + var worldScale = new Vector3(); + + return function raycast( raycaster, intersects ) { + + worldPosition.setFromMatrixPosition( this.matrixWorld ); + raycaster.ray.closestPointToPoint( worldPosition, intersectPoint ); + + worldScale.setFromMatrixScale( this.matrixWorld ); + var guessSizeSq = worldScale.x * worldScale.y / 4; + + if ( worldPosition.distanceToSquared( intersectPoint ) > guessSizeSq ) return; + + var distance = raycaster.ray.origin.distanceTo( intersectPoint ); + + if ( distance < raycaster.near || distance > raycaster.far ) return; + + intersects.push( { + + distance: distance, + point: intersectPoint.clone(), + face: null, + object: this + + } ); + + }; + + }() ), + + clone: function () { + + return new this.constructor( this.material ).copy( this ); + + } + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + function LOD() { + + Object3D.call( this ); + + this.type = 'LOD'; + + Object.defineProperties( this, { + levels: { + enumerable: true, + value: [] + } + } ); + + } + + LOD.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: LOD, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source, false ); + + var levels = source.levels; + + for ( var i = 0, l = levels.length; i < l; i ++ ) { + + var level = levels[ i ]; + + this.addLevel( level.object.clone(), level.distance ); + + } + + return this; + + }, + + addLevel: function ( object, distance ) { + + if ( distance === undefined ) distance = 0; + + distance = Math.abs( distance ); + + var levels = this.levels; + + for ( var l = 0; l < levels.length; l ++ ) { + + if ( distance < levels[ l ].distance ) { + + break; + + } + + } + + levels.splice( l, 0, { distance: distance, object: object } ); + + this.add( object ); + + }, + + getObjectForDistance: function ( distance ) { + + var levels = this.levels; + + for ( var i = 1, l = levels.length; i < l; i ++ ) { + + if ( distance < levels[ i ].distance ) { + + break; + + } + + } + + return levels[ i - 1 ].object; + + }, + + raycast: ( function () { + + var matrixPosition = new Vector3(); + + return function raycast( raycaster, intersects ) { + + matrixPosition.setFromMatrixPosition( this.matrixWorld ); + + var distance = raycaster.ray.origin.distanceTo( matrixPosition ); + + this.getObjectForDistance( distance ).raycast( raycaster, intersects ); + + }; + + }() ), + + update: function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + + return function update( camera ) { + + var levels = this.levels; + + if ( levels.length > 1 ) { + + v1.setFromMatrixPosition( camera.matrixWorld ); + v2.setFromMatrixPosition( this.matrixWorld ); + + var distance = v1.distanceTo( v2 ); + + levels[ 0 ].object.visible = true; + + for ( var i = 1, l = levels.length; i < l; i ++ ) { + + if ( distance >= levels[ i ].distance ) { + + levels[ i - 1 ].object.visible = false; + levels[ i ].object.visible = true; + + } else { + + break; + + } + + } + + for ( ; i < l; i ++ ) { + + levels[ i ].object.visible = false; + + } + + } + + }; + + }(), + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.levels = []; + + var levels = this.levels; + + for ( var i = 0, l = levels.length; i < l; i ++ ) { + + var level = levels[ i ]; + + data.object.levels.push( { + object: level.object.uuid, + distance: level.distance + } ); + + } + + return data; + + } + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author michael guerrero / http://realitymeltdown.com + * @author ikerr / http://verold.com + */ + + function Skeleton( bones, boneInverses ) { + + // copy the bone array + + bones = bones || []; + + this.bones = bones.slice( 0 ); + this.boneMatrices = new Float32Array( this.bones.length * 16 ); + + // use the supplied bone inverses or calculate the inverses + + if ( boneInverses === undefined ) { + + this.calculateInverses(); + + } else { + + if ( this.bones.length === boneInverses.length ) { + + this.boneInverses = boneInverses.slice( 0 ); + + } else { + + console.warn( 'THREE.Skeleton boneInverses is the wrong length.' ); + + this.boneInverses = []; + + for ( var i = 0, il = this.bones.length; i < il; i ++ ) { + + this.boneInverses.push( new Matrix4() ); + + } + + } + + } + + } + + Object.assign( Skeleton.prototype, { + + calculateInverses: function () { + + this.boneInverses = []; + + for ( var i = 0, il = this.bones.length; i < il; i ++ ) { + + var inverse = new Matrix4(); + + if ( this.bones[ i ] ) { + + inverse.getInverse( this.bones[ i ].matrixWorld ); + + } + + this.boneInverses.push( inverse ); + + } + + }, + + pose: function () { + + var bone, i, il; + + // recover the bind-time world matrices + + for ( i = 0, il = this.bones.length; i < il; i ++ ) { + + bone = this.bones[ i ]; + + if ( bone ) { + + bone.matrixWorld.getInverse( this.boneInverses[ i ] ); + + } + + } + + // compute the local matrices, positions, rotations and scales + + for ( i = 0, il = this.bones.length; i < il; i ++ ) { + + bone = this.bones[ i ]; + + if ( bone ) { + + if ( bone.parent && bone.parent.isBone ) { + + bone.matrix.getInverse( bone.parent.matrixWorld ); + bone.matrix.multiply( bone.matrixWorld ); + + } else { + + bone.matrix.copy( bone.matrixWorld ); + + } + + bone.matrix.decompose( bone.position, bone.quaternion, bone.scale ); + + } + + } + + }, + + update: ( function () { + + var offsetMatrix = new Matrix4(); + var identityMatrix = new Matrix4(); + + return function update() { + + var bones = this.bones; + var boneInverses = this.boneInverses; + var boneMatrices = this.boneMatrices; + var boneTexture = this.boneTexture; + + // flatten bone matrices to array + + for ( var i = 0, il = bones.length; i < il; i ++ ) { + + // compute the offset between the current and the original transform + + var matrix = bones[ i ] ? bones[ i ].matrixWorld : identityMatrix; + + offsetMatrix.multiplyMatrices( matrix, boneInverses[ i ] ); + offsetMatrix.toArray( boneMatrices, i * 16 ); + + } + + if ( boneTexture !== undefined ) { + + boneTexture.needsUpdate = true; + + } + + }; + + } )(), + + clone: function () { + + return new Skeleton( this.bones, this.boneInverses ); + + } + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author ikerr / http://verold.com + */ + + function Bone() { + + Object3D.call( this ); + + this.type = 'Bone'; + + } + + Bone.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Bone, + + isBone: true + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author ikerr / http://verold.com + */ + + function SkinnedMesh( geometry, material ) { + + Mesh.call( this, geometry, material ); + + this.type = 'SkinnedMesh'; + + this.bindMode = 'attached'; + this.bindMatrix = new Matrix4(); + this.bindMatrixInverse = new Matrix4(); + + var bones = this.initBones(); + var skeleton = new Skeleton( bones ); + + this.bind( skeleton, this.matrixWorld ); + + this.normalizeSkinWeights(); + + } + + SkinnedMesh.prototype = Object.assign( Object.create( Mesh.prototype ), { + + constructor: SkinnedMesh, + + isSkinnedMesh: true, + + initBones: function () { + + var bones = [], bone, gbone; + var i, il; + + if ( this.geometry && this.geometry.bones !== undefined ) { + + // first, create array of 'Bone' objects from geometry data + + for ( i = 0, il = this.geometry.bones.length; i < il; i ++ ) { + + gbone = this.geometry.bones[ i ]; + + // create new 'Bone' object + + bone = new Bone(); + bones.push( bone ); + + // apply values + + bone.name = gbone.name; + bone.position.fromArray( gbone.pos ); + bone.quaternion.fromArray( gbone.rotq ); + if ( gbone.scl !== undefined ) bone.scale.fromArray( gbone.scl ); + + } + + // second, create bone hierarchy + + for ( i = 0, il = this.geometry.bones.length; i < il; i ++ ) { + + gbone = this.geometry.bones[ i ]; + + if ( ( gbone.parent !== - 1 ) && ( gbone.parent !== null ) && ( bones[ gbone.parent ] !== undefined ) ) { + + // subsequent bones in the hierarchy + + bones[ gbone.parent ].add( bones[ i ] ); + + } else { + + // topmost bone, immediate child of the skinned mesh + + this.add( bones[ i ] ); + + } + + } + + } + + // now the bones are part of the scene graph and children of the skinned mesh. + // let's update the corresponding matrices + + this.updateMatrixWorld( true ); + + return bones; + + }, + + bind: function ( skeleton, bindMatrix ) { + + this.skeleton = skeleton; + + if ( bindMatrix === undefined ) { + + this.updateMatrixWorld( true ); + + this.skeleton.calculateInverses(); + + bindMatrix = this.matrixWorld; + + } + + this.bindMatrix.copy( bindMatrix ); + this.bindMatrixInverse.getInverse( bindMatrix ); + + }, + + pose: function () { + + this.skeleton.pose(); + + }, + + normalizeSkinWeights: function () { + + var scale, i; + + if ( this.geometry && this.geometry.isGeometry ) { + + for ( i = 0; i < this.geometry.skinWeights.length; i ++ ) { + + var sw = this.geometry.skinWeights[ i ]; + + scale = 1.0 / sw.lengthManhattan(); + + if ( scale !== Infinity ) { + + sw.multiplyScalar( scale ); + + } else { + + sw.set( 1, 0, 0, 0 ); // do something reasonable + + } + + } + + } else if ( this.geometry && this.geometry.isBufferGeometry ) { + + var vec = new Vector4(); + + var skinWeight = this.geometry.attributes.skinWeight; + + for ( i = 0; i < skinWeight.count; i ++ ) { + + vec.x = skinWeight.getX( i ); + vec.y = skinWeight.getY( i ); + vec.z = skinWeight.getZ( i ); + vec.w = skinWeight.getW( i ); + + scale = 1.0 / vec.lengthManhattan(); + + if ( scale !== Infinity ) { + + vec.multiplyScalar( scale ); + + } else { + + vec.set( 1, 0, 0, 0 ); // do something reasonable + + } + + skinWeight.setXYZW( i, vec.x, vec.y, vec.z, vec.w ); + + } + + } + + }, + + updateMatrixWorld: function ( force ) { + + Mesh.prototype.updateMatrixWorld.call( this, force ); + + if ( this.bindMode === 'attached' ) { + + this.bindMatrixInverse.getInverse( this.matrixWorld ); + + } else if ( this.bindMode === 'detached' ) { + + this.bindMatrixInverse.getInverse( this.bindMatrix ); + + } else { + + console.warn( 'THREE.SkinnedMesh: Unrecognized bindMode: ' + this.bindMode ); + + } + + }, + + clone: function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: <hex>, + * opacity: <float>, + * + * linewidth: <float>, + * linecap: "round", + * linejoin: "round" + * } + */ + + function LineBasicMaterial( parameters ) { + + Material.call( this ); + + this.type = 'LineBasicMaterial'; + + this.color = new Color( 0xffffff ); + + this.linewidth = 1; + this.linecap = 'round'; + this.linejoin = 'round'; + + this.lights = false; + + this.setValues( parameters ); + + } + + LineBasicMaterial.prototype = Object.create( Material.prototype ); + LineBasicMaterial.prototype.constructor = LineBasicMaterial; + + LineBasicMaterial.prototype.isLineBasicMaterial = true; + + LineBasicMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.linewidth = source.linewidth; + this.linecap = source.linecap; + this.linejoin = source.linejoin; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Line( geometry, material, mode ) { + + if ( mode === 1 ) { + + console.warn( 'THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead.' ); + return new LineSegments( geometry, material ); + + } + + Object3D.call( this ); + + this.type = 'Line'; + + this.geometry = geometry !== undefined ? geometry : new BufferGeometry(); + this.material = material !== undefined ? material : new LineBasicMaterial( { color: Math.random() * 0xffffff } ); + + } + + Line.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Line, + + isLine: true, + + raycast: ( function () { + + var inverseMatrix = new Matrix4(); + var ray = new Ray(); + var sphere = new Sphere(); + + return function raycast( raycaster, intersects ) { + + var precision = raycaster.linePrecision; + var precisionSq = precision * precision; + + var geometry = this.geometry; + var matrixWorld = this.matrixWorld; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ); + sphere.applyMatrix4( matrixWorld ); + + if ( raycaster.ray.intersectsSphere( sphere ) === false ) return; + + // + + inverseMatrix.getInverse( matrixWorld ); + ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); + + var vStart = new Vector3(); + var vEnd = new Vector3(); + var interSegment = new Vector3(); + var interRay = new Vector3(); + var step = (this && this.isLineSegments) ? 2 : 1; + + if ( geometry.isBufferGeometry ) { + + var index = geometry.index; + var attributes = geometry.attributes; + var positions = attributes.position.array; + + if ( index !== null ) { + + var indices = index.array; + + for ( var i = 0, l = indices.length - 1; i < l; i += step ) { + + var a = indices[ i ]; + var b = indices[ i + 1 ]; + + vStart.fromArray( positions, a * 3 ); + vEnd.fromArray( positions, b * 3 ); + + var distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment ); + + if ( distSq > precisionSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + var distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } else { + + for ( var i = 0, l = positions.length / 3 - 1; i < l; i += step ) { + + vStart.fromArray( positions, 3 * i ); + vEnd.fromArray( positions, 3 * i + 3 ); + + var distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment ); + + if ( distSq > precisionSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + var distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } + + } else if ( geometry.isGeometry ) { + + var vertices = geometry.vertices; + var nbVertices = vertices.length; + + for ( var i = 0; i < nbVertices - 1; i += step ) { + + var distSq = ray.distanceSqToSegment( vertices[ i ], vertices[ i + 1 ], interRay, interSegment ); + + if ( distSq > precisionSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + var distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } + + }; + + }() ), + + clone: function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function LineSegments( geometry, material ) { + + Line.call( this, geometry, material ); + + this.type = 'LineSegments'; + + } + + LineSegments.prototype = Object.assign( Object.create( Line.prototype ), { + + constructor: LineSegments, + + isLineSegments: true + + } ); + + /** + * @author mgreter / http://github.com/mgreter + */ + + function LineLoop( geometry, material ) { + + Line.call( this, geometry, material ); + + this.type = 'LineLoop'; + + } + + LineLoop.prototype = Object.assign( Object.create( Line.prototype ), { + + constructor: LineLoop, + + isLineLoop: true, + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: <hex>, + * opacity: <float>, + * map: new THREE.Texture( <Image> ), + * + * size: <float>, + * sizeAttenuation: <bool> + * } + */ + + function PointsMaterial( parameters ) { + + Material.call( this ); + + this.type = 'PointsMaterial'; + + this.color = new Color( 0xffffff ); + + this.map = null; + + this.size = 1; + this.sizeAttenuation = true; + + this.lights = false; + + this.setValues( parameters ); + + } + + PointsMaterial.prototype = Object.create( Material.prototype ); + PointsMaterial.prototype.constructor = PointsMaterial; + + PointsMaterial.prototype.isPointsMaterial = true; + + PointsMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.size = source.size; + this.sizeAttenuation = source.sizeAttenuation; + + return this; + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function Points( geometry, material ) { + + Object3D.call( this ); + + this.type = 'Points'; + + this.geometry = geometry !== undefined ? geometry : new BufferGeometry(); + this.material = material !== undefined ? material : new PointsMaterial( { color: Math.random() * 0xffffff } ); + + } + + Points.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Points, + + isPoints: true, + + raycast: ( function () { + + var inverseMatrix = new Matrix4(); + var ray = new Ray(); + var sphere = new Sphere(); + + return function raycast( raycaster, intersects ) { + + var object = this; + var geometry = this.geometry; + var matrixWorld = this.matrixWorld; + var threshold = raycaster.params.Points.threshold; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ); + sphere.applyMatrix4( matrixWorld ); + sphere.radius += threshold; + + if ( raycaster.ray.intersectsSphere( sphere ) === false ) return; + + // + + inverseMatrix.getInverse( matrixWorld ); + ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); + + var localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 ); + var localThresholdSq = localThreshold * localThreshold; + var position = new Vector3(); + + function testPoint( point, index ) { + + var rayPointDistanceSq = ray.distanceSqToPoint( point ); + + if ( rayPointDistanceSq < localThresholdSq ) { + + var intersectPoint = ray.closestPointToPoint( point ); + intersectPoint.applyMatrix4( matrixWorld ); + + var distance = raycaster.ray.origin.distanceTo( intersectPoint ); + + if ( distance < raycaster.near || distance > raycaster.far ) return; + + intersects.push( { + + distance: distance, + distanceToRay: Math.sqrt( rayPointDistanceSq ), + point: intersectPoint.clone(), + index: index, + face: null, + object: object + + } ); + + } + + } + + if ( geometry.isBufferGeometry ) { + + var index = geometry.index; + var attributes = geometry.attributes; + var positions = attributes.position.array; + + if ( index !== null ) { + + var indices = index.array; + + for ( var i = 0, il = indices.length; i < il; i ++ ) { + + var a = indices[ i ]; + + position.fromArray( positions, a * 3 ); + + testPoint( position, a ); + + } + + } else { + + for ( var i = 0, l = positions.length / 3; i < l; i ++ ) { + + position.fromArray( positions, i * 3 ); + + testPoint( position, i ); + + } + + } + + } else { + + var vertices = geometry.vertices; + + for ( var i = 0, l = vertices.length; i < l; i ++ ) { + + testPoint( vertices[ i ], i ); + + } + + } + + }; + + }() ), + + clone: function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Group() { + + Object3D.call( this ); + + this.type = 'Group'; + + } + + Group.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Group + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function VideoTexture( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { + + Texture.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.generateMipmaps = false; + + var scope = this; + + function update() { + + requestAnimationFrame( update ); + + if ( video.readyState >= video.HAVE_CURRENT_DATA ) { + + scope.needsUpdate = true; + + } + + } + + update(); + + } + + VideoTexture.prototype = Object.create( Texture.prototype ); + VideoTexture.prototype.constructor = VideoTexture; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function CompressedTexture( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) { + + Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); + + this.image = { width: width, height: height }; + this.mipmaps = mipmaps; + + // no flipping for cube textures + // (also flipping doesn't work for compressed textures ) + + this.flipY = false; + + // can't generate mipmaps for compressed textures + // mips must be embedded in DDS files + + this.generateMipmaps = false; + + } + + CompressedTexture.prototype = Object.create( Texture.prototype ); + CompressedTexture.prototype.constructor = CompressedTexture; + + CompressedTexture.prototype.isCompressedTexture = true; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function CanvasTexture( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { + + Texture.call( this, canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.needsUpdate = true; + + } + + CanvasTexture.prototype = Object.create( Texture.prototype ); + CanvasTexture.prototype.constructor = CanvasTexture; + + /** + * @author Matt DesLauriers / @mattdesl + * @author atix / arthursilber.de + */ + + function DepthTexture( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format ) { + + format = format !== undefined ? format : DepthFormat; + + if ( format !== DepthFormat && format !== DepthStencilFormat ) { + + throw new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' ) + + } + + if ( type === undefined && format === DepthFormat ) type = UnsignedShortType; + if ( type === undefined && format === DepthStencilFormat ) type = UnsignedInt248Type; + + Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.image = { width: width, height: height }; + + this.magFilter = magFilter !== undefined ? magFilter : NearestFilter; + this.minFilter = minFilter !== undefined ? minFilter : NearestFilter; + + this.flipY = false; + this.generateMipmaps = false; + + } + + DepthTexture.prototype = Object.create( Texture.prototype ); + DepthTexture.prototype.constructor = DepthTexture; + DepthTexture.prototype.isDepthTexture = true; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + function WireframeGeometry( geometry ) { + + BufferGeometry.call( this ); + + this.type = 'WireframeGeometry'; + + // buffer + + var vertices = []; + + // helper variables + + var i, j, l, o, ol; + var edge = [ 0, 0 ], edges = {}, e, edge1, edge2; + var key, keys = [ 'a', 'b', 'c' ]; + var vertex; + + // different logic for Geometry and BufferGeometry + + if ( geometry && geometry.isGeometry ) { + + // create a data structure that contains all edges without duplicates + + var faces = geometry.faces; + + for ( i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + for ( j = 0; j < 3; j ++ ) { + + edge1 = face[ keys[ j ] ]; + edge2 = face[ keys[ ( j + 1 ) % 3 ] ]; + edge[ 0 ] = Math.min( edge1, edge2 ); // sorting prevents duplicates + edge[ 1 ] = Math.max( edge1, edge2 ); + + key = edge[ 0 ] + ',' + edge[ 1 ]; + + if ( edges[ key ] === undefined ) { + + edges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] }; + + } + + } + + } + + // generate vertices + + for ( key in edges ) { + + e = edges[ key ]; + + vertex = geometry.vertices[ e.index1 ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + vertex = geometry.vertices[ e.index2 ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } else if ( geometry && geometry.isBufferGeometry ) { + + var position, indices, groups; + var group, start, count; + var index1, index2; + + vertex = new Vector3(); + + if ( geometry.index !== null ) { + + // indexed BufferGeometry + + position = geometry.attributes.position; + indices = geometry.index; + groups = geometry.groups; + + if ( groups.length === 0 ) { + + groups = [ { start: 0, count: indices.count, materialIndex: 0 } ]; + + } + + // create a data structure that contains all eges without duplicates + + for ( o = 0, ol = groups.length; o < ol; ++ o ) { + + group = groups[ o ]; + + start = group.start; + count = group.count; + + for ( i = start, l = ( start + count ); i < l; i += 3 ) { + + for ( j = 0; j < 3; j ++ ) { + + edge1 = indices.getX( i + j ); + edge2 = indices.getX( i + ( j + 1 ) % 3 ); + edge[ 0 ] = Math.min( edge1, edge2 ); // sorting prevents duplicates + edge[ 1 ] = Math.max( edge1, edge2 ); + + key = edge[ 0 ] + ',' + edge[ 1 ]; + + if ( edges[ key ] === undefined ) { + + edges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] }; + + } + + } + + } + + } + + // generate vertices + + for ( key in edges ) { + + e = edges[ key ]; + + vertex.fromBufferAttribute( position, e.index1 ); + vertices.push( vertex.x, vertex.y, vertex.z ); + + vertex.fromBufferAttribute( position, e.index2 ); + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } else { + + // non-indexed BufferGeometry + + position = geometry.attributes.position; + + for ( i = 0, l = ( position.count / 3 ); i < l; i ++ ) { + + for ( j = 0; j < 3; j ++ ) { + + // three edges per triangle, an edge is represented as (index1, index2) + // e.g. the first triangle has the following edges: (0,1),(1,2),(2,0) + + index1 = 3 * i + j; + vertex.fromBufferAttribute( position, index1 ); + vertices.push( vertex.x, vertex.y, vertex.z ); + + index2 = 3 * i + ( ( j + 1 ) % 3 ); + vertex.fromBufferAttribute( position, index2 ); + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } + + } + + } + + // build geometry + + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + + } + + WireframeGeometry.prototype = Object.create( BufferGeometry.prototype ); + WireframeGeometry.prototype.constructor = WireframeGeometry; + + /** + * @author zz85 / https://github.com/zz85 + * @author Mugen87 / https://github.com/Mugen87 + * + * Parametric Surfaces Geometry + * based on the brilliant article by @prideout http://prideout.net/blog/?p=44 + */ + + // ParametricGeometry + + function ParametricGeometry( func, slices, stacks ) { + + Geometry.call( this ); + + this.type = 'ParametricGeometry'; + + this.parameters = { + func: func, + slices: slices, + stacks: stacks + }; + + this.fromBufferGeometry( new ParametricBufferGeometry( func, slices, stacks ) ); + this.mergeVertices(); + + } + + ParametricGeometry.prototype = Object.create( Geometry.prototype ); + ParametricGeometry.prototype.constructor = ParametricGeometry; + + // ParametricBufferGeometry + + function ParametricBufferGeometry( func, slices, stacks ) { + + BufferGeometry.call( this ); + + this.type = 'ParametricBufferGeometry'; + + this.parameters = { + func: func, + slices: slices, + stacks: stacks + }; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + var EPS = 0.00001; + + var normal = new Vector3(); + + var p0 = new Vector3(), p1 = new Vector3(); + var pu = new Vector3(), pv = new Vector3(); + + var i, j; + + // generate vertices, normals and uvs + + var sliceCount = slices + 1; + + for ( i = 0; i <= stacks; i ++ ) { + + var v = i / stacks; + + for ( j = 0; j <= slices; j ++ ) { + + var u = j / slices; + + // vertex + + p0 = func( u, v, p0 ); + vertices.push( p0.x, p0.y, p0.z ); + + // normal + + // approximate tangent vectors via finite differences + + if ( u - EPS >= 0 ) { + + p1 = func( u - EPS, v, p1 ); + pu.subVectors( p0, p1 ); + + } else { + + p1 = func( u + EPS, v, p1 ); + pu.subVectors( p1, p0 ); + + } + + if ( v - EPS >= 0 ) { + + p1 = func( u, v - EPS, p1 ); + pv.subVectors( p0, p1 ); + + } else { + + p1 = func( u, v + EPS, p1 ); + pv.subVectors( p1, p0 ); + + } + + // cross product of tangent vectors returns surface normal + + normal.crossVectors( pu, pv ).normalize(); + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( u, v ); + + } + + } + + // generate indices + + for ( i = 0; i < stacks; i ++ ) { + + for ( j = 0; j < slices; j ++ ) { + + var a = i * sliceCount + j; + var b = i * sliceCount + j + 1; + var c = ( i + 1 ) * sliceCount + j + 1; + var d = ( i + 1 ) * sliceCount + j; + + // faces one and two + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + ParametricBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + ParametricBufferGeometry.prototype.constructor = ParametricBufferGeometry; + + /** + * @author clockworkgeek / https://github.com/clockworkgeek + * @author timothypratley / https://github.com/timothypratley + * @author WestLangley / http://github.com/WestLangley + * @author Mugen87 / https://github.com/Mugen87 + */ + + // PolyhedronGeometry + + function PolyhedronGeometry( vertices, indices, radius, detail ) { + + Geometry.call( this ); + + this.type = 'PolyhedronGeometry'; + + this.parameters = { + vertices: vertices, + indices: indices, + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new PolyhedronBufferGeometry( vertices, indices, radius, detail ) ); + this.mergeVertices(); + + } + + PolyhedronGeometry.prototype = Object.create( Geometry.prototype ); + PolyhedronGeometry.prototype.constructor = PolyhedronGeometry; + + // PolyhedronBufferGeometry + + function PolyhedronBufferGeometry( vertices, indices, radius, detail ) { + + BufferGeometry.call( this ); + + this.type = 'PolyhedronBufferGeometry'; + + this.parameters = { + vertices: vertices, + indices: indices, + radius: radius, + detail: detail + }; + + radius = radius || 1; + detail = detail || 0; + + // default buffer data + + var vertexBuffer = []; + var uvBuffer = []; + + // the subdivision creates the vertex buffer data + + subdivide( detail ); + + // all vertices should lie on a conceptual sphere with a given radius + + appplyRadius( radius ); + + // finally, create the uv data + + generateUVs(); + + // build non-indexed geometry + + this.addAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) ); + this.normalizeNormals(); + + // helper functions + + function subdivide( detail ) { + + var a = new Vector3(); + var b = new Vector3(); + var c = new Vector3(); + + // iterate over all faces and apply a subdivison with the given detail value + + for ( var i = 0; i < indices.length; i += 3 ) { + + // get the vertices of the face + + getVertexByIndex( indices[ i + 0 ], a ); + getVertexByIndex( indices[ i + 1 ], b ); + getVertexByIndex( indices[ i + 2 ], c ); + + // perform subdivision + + subdivideFace( a, b, c, detail ); + + } + + } + + function subdivideFace( a, b, c, detail ) { + + var cols = Math.pow( 2, detail ); + + // we use this multidimensional array as a data structure for creating the subdivision + + var v = []; + + var i, j; + + // construct all of the vertices for this subdivision + + for ( i = 0; i <= cols; i ++ ) { + + v[ i ] = []; + + var aj = a.clone().lerp( c, i / cols ); + var bj = b.clone().lerp( c, i / cols ); + + var rows = cols - i; + + for ( j = 0; j <= rows; j ++ ) { + + if ( j === 0 && i === cols ) { + + v[ i ][ j ] = aj; + + } else { + + v[ i ][ j ] = aj.clone().lerp( bj, j / rows ); + + } + + } + + } + + // construct all of the faces + + for ( i = 0; i < cols; i ++ ) { + + for ( j = 0; j < 2 * ( cols - i ) - 1; j ++ ) { + + var k = Math.floor( j / 2 ); + + if ( j % 2 === 0 ) { + + pushVertex( v[ i ][ k + 1 ] ); + pushVertex( v[ i + 1 ][ k ] ); + pushVertex( v[ i ][ k ] ); + + } else { + + pushVertex( v[ i ][ k + 1 ] ); + pushVertex( v[ i + 1 ][ k + 1 ] ); + pushVertex( v[ i + 1 ][ k ] ); + + } + + } + + } + + } + + function appplyRadius( radius ) { + + var vertex = new Vector3(); + + // iterate over the entire buffer and apply the radius to each vertex + + for ( var i = 0; i < vertexBuffer.length; i += 3 ) { + + vertex.x = vertexBuffer[ i + 0 ]; + vertex.y = vertexBuffer[ i + 1 ]; + vertex.z = vertexBuffer[ i + 2 ]; + + vertex.normalize().multiplyScalar( radius ); + + vertexBuffer[ i + 0 ] = vertex.x; + vertexBuffer[ i + 1 ] = vertex.y; + vertexBuffer[ i + 2 ] = vertex.z; + + } + + } + + function generateUVs() { + + var vertex = new Vector3(); + + for ( var i = 0; i < vertexBuffer.length; i += 3 ) { + + vertex.x = vertexBuffer[ i + 0 ]; + vertex.y = vertexBuffer[ i + 1 ]; + vertex.z = vertexBuffer[ i + 2 ]; + + var u = azimuth( vertex ) / 2 / Math.PI + 0.5; + var v = inclination( vertex ) / Math.PI + 0.5; + uvBuffer.push( u, 1 - v ); + + } + + correctUVs(); + + correctSeam(); + + } + + function correctSeam() { + + // handle case when face straddles the seam, see #3269 + + for ( var i = 0; i < uvBuffer.length; i += 6 ) { + + // uv data of a single face + + var x0 = uvBuffer[ i + 0 ]; + var x1 = uvBuffer[ i + 2 ]; + var x2 = uvBuffer[ i + 4 ]; + + var max = Math.max( x0, x1, x2 ); + var min = Math.min( x0, x1, x2 ); + + // 0.9 is somewhat arbitrary + + if ( max > 0.9 && min < 0.1 ) { + + if ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1; + if ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1; + if ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1; + + } + + } + + } + + function pushVertex( vertex ) { + + vertexBuffer.push( vertex.x, vertex.y, vertex.z ); + + } + + function getVertexByIndex( index, vertex ) { + + var stride = index * 3; + + vertex.x = vertices[ stride + 0 ]; + vertex.y = vertices[ stride + 1 ]; + vertex.z = vertices[ stride + 2 ]; + + } + + function correctUVs() { + + var a = new Vector3(); + var b = new Vector3(); + var c = new Vector3(); + + var centroid = new Vector3(); + + var uvA = new Vector2(); + var uvB = new Vector2(); + var uvC = new Vector2(); + + for ( var i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) { + + a.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] ); + b.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] ); + c.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] ); + + uvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] ); + uvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] ); + uvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] ); + + centroid.copy( a ).add( b ).add( c ).divideScalar( 3 ); + + var azi = azimuth( centroid ); + + correctUV( uvA, j + 0, a, azi ); + correctUV( uvB, j + 2, b, azi ); + correctUV( uvC, j + 4, c, azi ); + + } + + } + + function correctUV( uv, stride, vector, azimuth ) { + + if ( ( azimuth < 0 ) && ( uv.x === 1 ) ) { + + uvBuffer[ stride ] = uv.x - 1; + + } + + if ( ( vector.x === 0 ) && ( vector.z === 0 ) ) { + + uvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5; + + } + + } + + // Angle around the Y axis, counter-clockwise when looking from above. + + function azimuth( vector ) { + + return Math.atan2( vector.z, - vector.x ); + + } + + + // Angle above the XZ plane. + + function inclination( vector ) { + + return Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) ); + + } + + } + + PolyhedronBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + PolyhedronBufferGeometry.prototype.constructor = PolyhedronBufferGeometry; + + /** + * @author timothypratley / https://github.com/timothypratley + * @author Mugen87 / https://github.com/Mugen87 + */ + + // TetrahedronGeometry + + function TetrahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'TetrahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new TetrahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + + } + + TetrahedronGeometry.prototype = Object.create( Geometry.prototype ); + TetrahedronGeometry.prototype.constructor = TetrahedronGeometry; + + // TetrahedronBufferGeometry + + function TetrahedronBufferGeometry( radius, detail ) { + + var vertices = [ + 1, 1, 1, - 1, - 1, 1, - 1, 1, - 1, 1, - 1, - 1 + ]; + + var indices = [ + 2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'TetrahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + TetrahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); + TetrahedronBufferGeometry.prototype.constructor = TetrahedronBufferGeometry; + + /** + * @author timothypratley / https://github.com/timothypratley + * @author Mugen87 / https://github.com/Mugen87 + */ + + // OctahedronGeometry + + function OctahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'OctahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new OctahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + + } + + OctahedronGeometry.prototype = Object.create( Geometry.prototype ); + OctahedronGeometry.prototype.constructor = OctahedronGeometry; + + // OctahedronBufferGeometry + + function OctahedronBufferGeometry( radius, detail ) { + + var vertices = [ + 1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1 + ]; + + var indices = [ + 0, 2, 4, 0, 4, 3, 0, 3, 5, 0, 5, 2, 1, 2, 5, 1, 5, 3, 1, 3, 4, 1, 4, 2 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'OctahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + OctahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); + OctahedronBufferGeometry.prototype.constructor = OctahedronBufferGeometry; + + /** + * @author timothypratley / https://github.com/timothypratley + * @author Mugen87 / https://github.com/Mugen87 + */ + + // IcosahedronGeometry + + function IcosahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'IcosahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new IcosahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + + } + + IcosahedronGeometry.prototype = Object.create( Geometry.prototype ); + IcosahedronGeometry.prototype.constructor = IcosahedronGeometry; + + // IcosahedronBufferGeometry + + function IcosahedronBufferGeometry( radius, detail ) { + + var t = ( 1 + Math.sqrt( 5 ) ) / 2; + + var vertices = [ + - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, 0, + 0, - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, + t, 0, - 1, t, 0, 1, - t, 0, - 1, - t, 0, 1 + ]; + + var indices = [ + 0, 11, 5, 0, 5, 1, 0, 1, 7, 0, 7, 10, 0, 10, 11, + 1, 5, 9, 5, 11, 4, 11, 10, 2, 10, 7, 6, 7, 1, 8, + 3, 9, 4, 3, 4, 2, 3, 2, 6, 3, 6, 8, 3, 8, 9, + 4, 9, 5, 2, 4, 11, 6, 2, 10, 8, 6, 7, 9, 8, 1 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'IcosahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + IcosahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); + IcosahedronBufferGeometry.prototype.constructor = IcosahedronBufferGeometry; + + /** + * @author Abe Pazos / https://hamoid.com + * @author Mugen87 / https://github.com/Mugen87 + */ + + // DodecahedronGeometry + + function DodecahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'DodecahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new DodecahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + + } + + DodecahedronGeometry.prototype = Object.create( Geometry.prototype ); + DodecahedronGeometry.prototype.constructor = DodecahedronGeometry; + + // DodecahedronBufferGeometry + + function DodecahedronBufferGeometry( radius, detail ) { + + var t = ( 1 + Math.sqrt( 5 ) ) / 2; + var r = 1 / t; + + var vertices = [ + + // (±1, ±1, ±1) + - 1, - 1, - 1, - 1, - 1, 1, + - 1, 1, - 1, - 1, 1, 1, + 1, - 1, - 1, 1, - 1, 1, + 1, 1, - 1, 1, 1, 1, + + // (0, ±1/φ, ±φ) + 0, - r, - t, 0, - r, t, + 0, r, - t, 0, r, t, + + // (±1/φ, ±φ, 0) + - r, - t, 0, - r, t, 0, + r, - t, 0, r, t, 0, + + // (±φ, 0, ±1/φ) + - t, 0, - r, t, 0, - r, + - t, 0, r, t, 0, r + ]; + + var indices = [ + 3, 11, 7, 3, 7, 15, 3, 15, 13, + 7, 19, 17, 7, 17, 6, 7, 6, 15, + 17, 4, 8, 17, 8, 10, 17, 10, 6, + 8, 0, 16, 8, 16, 2, 8, 2, 10, + 0, 12, 1, 0, 1, 18, 0, 18, 16, + 6, 10, 2, 6, 2, 13, 6, 13, 15, + 2, 16, 18, 2, 18, 3, 2, 3, 13, + 18, 1, 9, 18, 9, 11, 18, 11, 3, + 4, 14, 12, 4, 12, 0, 4, 0, 8, + 11, 9, 5, 11, 5, 19, 11, 19, 7, + 19, 5, 14, 19, 14, 4, 19, 4, 17, + 1, 12, 14, 1, 14, 5, 1, 5, 9 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'DodecahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + DodecahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); + DodecahedronBufferGeometry.prototype.constructor = DodecahedronBufferGeometry; + + /** + * @author oosmoxiecode / https://github.com/oosmoxiecode + * @author WestLangley / https://github.com/WestLangley + * @author zz85 / https://github.com/zz85 + * @author miningold / https://github.com/miningold + * @author jonobr1 / https://github.com/jonobr1 + * @author Mugen87 / https://github.com/Mugen87 + * + */ + + // TubeGeometry + + function TubeGeometry( path, tubularSegments, radius, radialSegments, closed, taper ) { + + Geometry.call( this ); + + this.type = 'TubeGeometry'; + + this.parameters = { + path: path, + tubularSegments: tubularSegments, + radius: radius, + radialSegments: radialSegments, + closed: closed + }; + + if ( taper !== undefined ) console.warn( 'THREE.TubeGeometry: taper has been removed.' ); + + var bufferGeometry = new TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ); + + // expose internals + + this.tangents = bufferGeometry.tangents; + this.normals = bufferGeometry.normals; + this.binormals = bufferGeometry.binormals; + + // create geometry + + this.fromBufferGeometry( bufferGeometry ); + this.mergeVertices(); + + } + + TubeGeometry.prototype = Object.create( Geometry.prototype ); + TubeGeometry.prototype.constructor = TubeGeometry; + + // TubeBufferGeometry + + function TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ) { + + BufferGeometry.call( this ); + + this.type = 'TubeBufferGeometry'; + + this.parameters = { + path: path, + tubularSegments: tubularSegments, + radius: radius, + radialSegments: radialSegments, + closed: closed + }; + + tubularSegments = tubularSegments || 64; + radius = radius || 1; + radialSegments = radialSegments || 8; + closed = closed || false; + + var frames = path.computeFrenetFrames( tubularSegments, closed ); + + // expose internals + + this.tangents = frames.tangents; + this.normals = frames.normals; + this.binormals = frames.binormals; + + // helper variables + + var vertex = new Vector3(); + var normal = new Vector3(); + var uv = new Vector2(); + + var i, j; + + // buffer + + var vertices = []; + var normals = []; + var uvs = []; + var indices = []; + + // create buffer data + + generateBufferData(); + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + // functions + + function generateBufferData() { + + for ( i = 0; i < tubularSegments; i ++ ) { + + generateSegment( i ); + + } + + // if the geometry is not closed, generate the last row of vertices and normals + // at the regular position on the given path + // + // if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ) + + generateSegment( ( closed === false ) ? tubularSegments : 0 ); + + // uvs are generated in a separate function. + // this makes it easy compute correct values for closed geometries + + generateUVs(); + + // finally create faces + + generateIndices(); + + } + + function generateSegment( i ) { + + // we use getPointAt to sample evenly distributed points from the given path + + var P = path.getPointAt( i / tubularSegments ); + + // retrieve corresponding normal and binormal + + var N = frames.normals[ i ]; + var B = frames.binormals[ i ]; + + // generate normals and vertices for the current segment + + for ( j = 0; j <= radialSegments; j ++ ) { + + var v = j / radialSegments * Math.PI * 2; + + var sin = Math.sin( v ); + var cos = - Math.cos( v ); + + // normal + + normal.x = ( cos * N.x + sin * B.x ); + normal.y = ( cos * N.y + sin * B.y ); + normal.z = ( cos * N.z + sin * B.z ); + normal.normalize(); + + normals.push( normal.x, normal.y, normal.z ); + + // vertex + + vertex.x = P.x + radius * normal.x; + vertex.y = P.y + radius * normal.y; + vertex.z = P.z + radius * normal.z; + + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } + + function generateIndices() { + + for ( j = 1; j <= tubularSegments; j ++ ) { + + for ( i = 1; i <= radialSegments; i ++ ) { + + var a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 ); + var b = ( radialSegments + 1 ) * j + ( i - 1 ); + var c = ( radialSegments + 1 ) * j + i; + var d = ( radialSegments + 1 ) * ( j - 1 ) + i; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + } + + function generateUVs() { + + for ( i = 0; i <= tubularSegments; i ++ ) { + + for ( j = 0; j <= radialSegments; j ++ ) { + + uv.x = i / tubularSegments; + uv.y = j / radialSegments; + + uvs.push( uv.x, uv.y ); + + } + + } + + } + + } + + TubeBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + TubeBufferGeometry.prototype.constructor = TubeBufferGeometry; + + /** + * @author oosmoxiecode + * @author Mugen87 / https://github.com/Mugen87 + * + * based on http://www.blackpawn.com/texts/pqtorus/ + */ + + // TorusKnotGeometry + + function TorusKnotGeometry( radius, tube, tubularSegments, radialSegments, p, q, heightScale ) { + + Geometry.call( this ); + + this.type = 'TorusKnotGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + tubularSegments: tubularSegments, + radialSegments: radialSegments, + p: p, + q: q + }; + + if ( heightScale !== undefined ) console.warn( 'THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.' ); + + this.fromBufferGeometry( new TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) ); + this.mergeVertices(); + + } + + TorusKnotGeometry.prototype = Object.create( Geometry.prototype ); + TorusKnotGeometry.prototype.constructor = TorusKnotGeometry; + + // TorusKnotBufferGeometry + + function TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) { + + BufferGeometry.call( this ); + + this.type = 'TorusKnotBufferGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + tubularSegments: tubularSegments, + radialSegments: radialSegments, + p: p, + q: q + }; + + radius = radius || 100; + tube = tube || 40; + tubularSegments = Math.floor( tubularSegments ) || 64; + radialSegments = Math.floor( radialSegments ) || 8; + p = p || 2; + q = q || 3; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var i, j; + + var vertex = new Vector3(); + var normal = new Vector3(); + + var P1 = new Vector3(); + var P2 = new Vector3(); + + var B = new Vector3(); + var T = new Vector3(); + var N = new Vector3(); + + // generate vertices, normals and uvs + + for ( i = 0; i <= tubularSegments; ++ i ) { + + // the radian "u" is used to calculate the position on the torus curve of the current tubular segement + + var u = i / tubularSegments * p * Math.PI * 2; + + // now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead. + // these points are used to create a special "coordinate space", which is necessary to calculate the correct vertex positions + + calculatePositionOnCurve( u, p, q, radius, P1 ); + calculatePositionOnCurve( u + 0.01, p, q, radius, P2 ); + + // calculate orthonormal basis + + T.subVectors( P2, P1 ); + N.addVectors( P2, P1 ); + B.crossVectors( T, N ); + N.crossVectors( B, T ); + + // normalize B, N. T can be ignored, we don't use it + + B.normalize(); + N.normalize(); + + for ( j = 0; j <= radialSegments; ++ j ) { + + // now calculate the vertices. they are nothing more than an extrusion of the torus curve. + // because we extrude a shape in the xy-plane, there is no need to calculate a z-value. + + var v = j / radialSegments * Math.PI * 2; + var cx = - tube * Math.cos( v ); + var cy = tube * Math.sin( v ); + + // now calculate the final vertex position. + // first we orient the extrusion with our basis vectos, then we add it to the current position on the curve + + vertex.x = P1.x + ( cx * N.x + cy * B.x ); + vertex.y = P1.y + ( cx * N.y + cy * B.y ); + vertex.z = P1.z + ( cx * N.z + cy * B.z ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal) + + normal.subVectors( vertex, P1 ).normalize(); + + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( i / tubularSegments ); + uvs.push( j / radialSegments ); + + } + + } + + // generate indices + + for ( j = 1; j <= tubularSegments; j ++ ) { + + for ( i = 1; i <= radialSegments; i ++ ) { + + // indices + + var a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 ); + var b = ( radialSegments + 1 ) * j + ( i - 1 ); + var c = ( radialSegments + 1 ) * j + i; + var d = ( radialSegments + 1 ) * ( j - 1 ) + i; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + // this function calculates the current position on the torus curve + + function calculatePositionOnCurve( u, p, q, radius, position ) { + + var cu = Math.cos( u ); + var su = Math.sin( u ); + var quOverP = q / p * u; + var cs = Math.cos( quOverP ); + + position.x = radius * ( 2 + cs ) * 0.5 * cu; + position.y = radius * ( 2 + cs ) * su * 0.5; + position.z = radius * Math.sin( quOverP ) * 0.5; + + } + + } + + TorusKnotBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + TorusKnotBufferGeometry.prototype.constructor = TorusKnotBufferGeometry; + + /** + * @author oosmoxiecode + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + // TorusGeometry + + function TorusGeometry( radius, tube, radialSegments, tubularSegments, arc ) { + + Geometry.call( this ); + + this.type = 'TorusGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + radialSegments: radialSegments, + tubularSegments: tubularSegments, + arc: arc + }; + + this.fromBufferGeometry( new TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) ); + this.mergeVertices(); + + } + + TorusGeometry.prototype = Object.create( Geometry.prototype ); + TorusGeometry.prototype.constructor = TorusGeometry; + + // TorusBufferGeometry + + function TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) { + + BufferGeometry.call( this ); + + this.type = 'TorusBufferGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + radialSegments: radialSegments, + tubularSegments: tubularSegments, + arc: arc + }; + + radius = radius || 100; + tube = tube || 40; + radialSegments = Math.floor( radialSegments ) || 8; + tubularSegments = Math.floor( tubularSegments ) || 6; + arc = arc || Math.PI * 2; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var center = new Vector3(); + var vertex = new Vector3(); + var normal = new Vector3(); + + var j, i; + + // generate vertices, normals and uvs + + for ( j = 0; j <= radialSegments; j ++ ) { + + for ( i = 0; i <= tubularSegments; i ++ ) { + + var u = i / tubularSegments * arc; + var v = j / radialSegments * Math.PI * 2; + + // vertex + + vertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u ); + vertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u ); + vertex.z = tube * Math.sin( v ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + center.x = radius * Math.cos( u ); + center.y = radius * Math.sin( u ); + normal.subVectors( vertex, center ).normalize(); + + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( i / tubularSegments ); + uvs.push( j / radialSegments ); + + } + + } + + // generate indices + + for ( j = 1; j <= radialSegments; j ++ ) { + + for ( i = 1; i <= tubularSegments; i ++ ) { + + // indices + + var a = ( tubularSegments + 1 ) * j + i - 1; + var b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1; + var c = ( tubularSegments + 1 ) * ( j - 1 ) + i; + var d = ( tubularSegments + 1 ) * j + i; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + TorusBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + TorusBufferGeometry.prototype.constructor = TorusBufferGeometry; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + */ + + var ShapeUtils = { + + // calculate area of the contour polygon + + area: function ( contour ) { + + var n = contour.length; + var a = 0.0; + + for ( var p = n - 1, q = 0; q < n; p = q ++ ) { + + a += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y; + + } + + return a * 0.5; + + }, + + triangulate: ( function () { + + /** + * This code is a quick port of code written in C++ which was submitted to + * flipcode.com by John W. Ratcliff // July 22, 2000 + * See original code and more information here: + * http://www.flipcode.com/archives/Efficient_Polygon_Triangulation.shtml + * + * ported to actionscript by Zevan Rosser + * www.actionsnippet.com + * + * ported to javascript by Joshua Koo + * http://www.lab4games.net/zz85/blog + * + */ + + function snip( contour, u, v, w, n, verts ) { + + var p; + var ax, ay, bx, by; + var cx, cy, px, py; + + ax = contour[ verts[ u ] ].x; + ay = contour[ verts[ u ] ].y; + + bx = contour[ verts[ v ] ].x; + by = contour[ verts[ v ] ].y; + + cx = contour[ verts[ w ] ].x; + cy = contour[ verts[ w ] ].y; + + if ( ( bx - ax ) * ( cy - ay ) - ( by - ay ) * ( cx - ax ) <= 0 ) return false; + + var aX, aY, bX, bY, cX, cY; + var apx, apy, bpx, bpy, cpx, cpy; + var cCROSSap, bCROSScp, aCROSSbp; + + aX = cx - bx; aY = cy - by; + bX = ax - cx; bY = ay - cy; + cX = bx - ax; cY = by - ay; + + for ( p = 0; p < n; p ++ ) { + + px = contour[ verts[ p ] ].x; + py = contour[ verts[ p ] ].y; + + if ( ( ( px === ax ) && ( py === ay ) ) || + ( ( px === bx ) && ( py === by ) ) || + ( ( px === cx ) && ( py === cy ) ) ) continue; + + apx = px - ax; apy = py - ay; + bpx = px - bx; bpy = py - by; + cpx = px - cx; cpy = py - cy; + + // see if p is inside triangle abc + + aCROSSbp = aX * bpy - aY * bpx; + cCROSSap = cX * apy - cY * apx; + bCROSScp = bX * cpy - bY * cpx; + + if ( ( aCROSSbp >= - Number.EPSILON ) && ( bCROSScp >= - Number.EPSILON ) && ( cCROSSap >= - Number.EPSILON ) ) return false; + + } + + return true; + + } + + // takes in an contour array and returns + + return function triangulate( contour, indices ) { + + var n = contour.length; + + if ( n < 3 ) return null; + + var result = [], + verts = [], + vertIndices = []; + + /* we want a counter-clockwise polygon in verts */ + + var u, v, w; + + if ( ShapeUtils.area( contour ) > 0.0 ) { + + for ( v = 0; v < n; v ++ ) verts[ v ] = v; + + } else { + + for ( v = 0; v < n; v ++ ) verts[ v ] = ( n - 1 ) - v; + + } + + var nv = n; + + /* remove nv - 2 vertices, creating 1 triangle every time */ + + var count = 2 * nv; /* error detection */ + + for ( v = nv - 1; nv > 2; ) { + + /* if we loop, it is probably a non-simple polygon */ + + if ( ( count -- ) <= 0 ) { + + //** Triangulate: ERROR - probable bad polygon! + + //throw ( "Warning, unable to triangulate polygon!" ); + //return null; + // Sometimes warning is fine, especially polygons are triangulated in reverse. + console.warn( 'THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()' ); + + if ( indices ) return vertIndices; + return result; + + } + + /* three consecutive vertices in current polygon, <u,v,w> */ + + u = v; if ( nv <= u ) u = 0; /* previous */ + v = u + 1; if ( nv <= v ) v = 0; /* new v */ + w = v + 1; if ( nv <= w ) w = 0; /* next */ + + if ( snip( contour, u, v, w, nv, verts ) ) { + + var a, b, c, s, t; + + /* true names of the vertices */ + + a = verts[ u ]; + b = verts[ v ]; + c = verts[ w ]; + + /* output Triangle */ + + result.push( [ contour[ a ], + contour[ b ], + contour[ c ] ] ); + + + vertIndices.push( [ verts[ u ], verts[ v ], verts[ w ] ] ); + + /* remove v from the remaining polygon */ + + for ( s = v, t = v + 1; t < nv; s ++, t ++ ) { + + verts[ s ] = verts[ t ]; + + } + + nv --; + + /* reset error detection counter */ + + count = 2 * nv; + + } + + } + + if ( indices ) return vertIndices; + return result; + + } + + } )(), + + triangulateShape: function ( contour, holes ) { + + function removeDupEndPts(points) { + + var l = points.length; + + if ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) { + + points.pop(); + + } + + } + + removeDupEndPts( contour ); + holes.forEach( removeDupEndPts ); + + function point_in_segment_2D_colin( inSegPt1, inSegPt2, inOtherPt ) { + + // inOtherPt needs to be collinear to the inSegment + if ( inSegPt1.x !== inSegPt2.x ) { + + if ( inSegPt1.x < inSegPt2.x ) { + + return ( ( inSegPt1.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt2.x ) ); + + } else { + + return ( ( inSegPt2.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt1.x ) ); + + } + + } else { + + if ( inSegPt1.y < inSegPt2.y ) { + + return ( ( inSegPt1.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt2.y ) ); + + } else { + + return ( ( inSegPt2.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt1.y ) ); + + } + + } + + } + + function intersect_segments_2D( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1, inSeg2Pt2, inExcludeAdjacentSegs ) { + + var seg1dx = inSeg1Pt2.x - inSeg1Pt1.x, seg1dy = inSeg1Pt2.y - inSeg1Pt1.y; + var seg2dx = inSeg2Pt2.x - inSeg2Pt1.x, seg2dy = inSeg2Pt2.y - inSeg2Pt1.y; + + var seg1seg2dx = inSeg1Pt1.x - inSeg2Pt1.x; + var seg1seg2dy = inSeg1Pt1.y - inSeg2Pt1.y; + + var limit = seg1dy * seg2dx - seg1dx * seg2dy; + var perpSeg1 = seg1dy * seg1seg2dx - seg1dx * seg1seg2dy; + + if ( Math.abs( limit ) > Number.EPSILON ) { + + // not parallel + + var perpSeg2; + if ( limit > 0 ) { + + if ( ( perpSeg1 < 0 ) || ( perpSeg1 > limit ) ) return []; + perpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy; + if ( ( perpSeg2 < 0 ) || ( perpSeg2 > limit ) ) return []; + + } else { + + if ( ( perpSeg1 > 0 ) || ( perpSeg1 < limit ) ) return []; + perpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy; + if ( ( perpSeg2 > 0 ) || ( perpSeg2 < limit ) ) return []; + + } + + // i.e. to reduce rounding errors + // intersection at endpoint of segment#1? + if ( perpSeg2 === 0 ) { + + if ( ( inExcludeAdjacentSegs ) && + ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) ) return []; + return [ inSeg1Pt1 ]; + + } + if ( perpSeg2 === limit ) { + + if ( ( inExcludeAdjacentSegs ) && + ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) ) return []; + return [ inSeg1Pt2 ]; + + } + // intersection at endpoint of segment#2? + if ( perpSeg1 === 0 ) return [ inSeg2Pt1 ]; + if ( perpSeg1 === limit ) return [ inSeg2Pt2 ]; + + // return real intersection point + var factorSeg1 = perpSeg2 / limit; + return [ { x: inSeg1Pt1.x + factorSeg1 * seg1dx, + y: inSeg1Pt1.y + factorSeg1 * seg1dy } ]; + + } else { + + // parallel or collinear + if ( ( perpSeg1 !== 0 ) || + ( seg2dy * seg1seg2dx !== seg2dx * seg1seg2dy ) ) return []; + + // they are collinear or degenerate + var seg1Pt = ( ( seg1dx === 0 ) && ( seg1dy === 0 ) ); // segment1 is just a point? + var seg2Pt = ( ( seg2dx === 0 ) && ( seg2dy === 0 ) ); // segment2 is just a point? + // both segments are points + if ( seg1Pt && seg2Pt ) { + + if ( ( inSeg1Pt1.x !== inSeg2Pt1.x ) || + ( inSeg1Pt1.y !== inSeg2Pt1.y ) ) return []; // they are distinct points + return [ inSeg1Pt1 ]; // they are the same point + + } + // segment#1 is a single point + if ( seg1Pt ) { + + if ( ! point_in_segment_2D_colin( inSeg2Pt1, inSeg2Pt2, inSeg1Pt1 ) ) return []; // but not in segment#2 + return [ inSeg1Pt1 ]; + + } + // segment#2 is a single point + if ( seg2Pt ) { + + if ( ! point_in_segment_2D_colin( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1 ) ) return []; // but not in segment#1 + return [ inSeg2Pt1 ]; + + } + + // they are collinear segments, which might overlap + var seg1min, seg1max, seg1minVal, seg1maxVal; + var seg2min, seg2max, seg2minVal, seg2maxVal; + if ( seg1dx !== 0 ) { + + // the segments are NOT on a vertical line + if ( inSeg1Pt1.x < inSeg1Pt2.x ) { + + seg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.x; + seg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.x; + + } else { + + seg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.x; + seg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.x; + + } + if ( inSeg2Pt1.x < inSeg2Pt2.x ) { + + seg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.x; + seg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.x; + + } else { + + seg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.x; + seg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.x; + + } + + } else { + + // the segments are on a vertical line + if ( inSeg1Pt1.y < inSeg1Pt2.y ) { + + seg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.y; + seg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.y; + + } else { + + seg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.y; + seg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.y; + + } + if ( inSeg2Pt1.y < inSeg2Pt2.y ) { + + seg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.y; + seg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.y; + + } else { + + seg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.y; + seg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.y; + + } + + } + if ( seg1minVal <= seg2minVal ) { + + if ( seg1maxVal < seg2minVal ) return []; + if ( seg1maxVal === seg2minVal ) { + + if ( inExcludeAdjacentSegs ) return []; + return [ seg2min ]; + + } + if ( seg1maxVal <= seg2maxVal ) return [ seg2min, seg1max ]; + return [ seg2min, seg2max ]; + + } else { + + if ( seg1minVal > seg2maxVal ) return []; + if ( seg1minVal === seg2maxVal ) { + + if ( inExcludeAdjacentSegs ) return []; + return [ seg1min ]; + + } + if ( seg1maxVal <= seg2maxVal ) return [ seg1min, seg1max ]; + return [ seg1min, seg2max ]; + + } + + } + + } + + function isPointInsideAngle( inVertex, inLegFromPt, inLegToPt, inOtherPt ) { + + // The order of legs is important + + // translation of all points, so that Vertex is at (0,0) + var legFromPtX = inLegFromPt.x - inVertex.x, legFromPtY = inLegFromPt.y - inVertex.y; + var legToPtX = inLegToPt.x - inVertex.x, legToPtY = inLegToPt.y - inVertex.y; + var otherPtX = inOtherPt.x - inVertex.x, otherPtY = inOtherPt.y - inVertex.y; + + // main angle >0: < 180 deg.; 0: 180 deg.; <0: > 180 deg. + var from2toAngle = legFromPtX * legToPtY - legFromPtY * legToPtX; + var from2otherAngle = legFromPtX * otherPtY - legFromPtY * otherPtX; + + if ( Math.abs( from2toAngle ) > Number.EPSILON ) { + + // angle != 180 deg. + + var other2toAngle = otherPtX * legToPtY - otherPtY * legToPtX; + // console.log( "from2to: " + from2toAngle + ", from2other: " + from2otherAngle + ", other2to: " + other2toAngle ); + + if ( from2toAngle > 0 ) { + + // main angle < 180 deg. + return ( ( from2otherAngle >= 0 ) && ( other2toAngle >= 0 ) ); + + } else { + + // main angle > 180 deg. + return ( ( from2otherAngle >= 0 ) || ( other2toAngle >= 0 ) ); + + } + + } else { + + // angle == 180 deg. + // console.log( "from2to: 180 deg., from2other: " + from2otherAngle ); + return ( from2otherAngle > 0 ); + + } + + } + + + function removeHoles( contour, holes ) { + + var shape = contour.concat(); // work on this shape + var hole; + + function isCutLineInsideAngles( inShapeIdx, inHoleIdx ) { + + // Check if hole point lies within angle around shape point + var lastShapeIdx = shape.length - 1; + + var prevShapeIdx = inShapeIdx - 1; + if ( prevShapeIdx < 0 ) prevShapeIdx = lastShapeIdx; + + var nextShapeIdx = inShapeIdx + 1; + if ( nextShapeIdx > lastShapeIdx ) nextShapeIdx = 0; + + var insideAngle = isPointInsideAngle( shape[ inShapeIdx ], shape[ prevShapeIdx ], shape[ nextShapeIdx ], hole[ inHoleIdx ] ); + if ( ! insideAngle ) { + + // console.log( "Vertex (Shape): " + inShapeIdx + ", Point: " + hole[inHoleIdx].x + "/" + hole[inHoleIdx].y ); + return false; + + } + + // Check if shape point lies within angle around hole point + var lastHoleIdx = hole.length - 1; + + var prevHoleIdx = inHoleIdx - 1; + if ( prevHoleIdx < 0 ) prevHoleIdx = lastHoleIdx; + + var nextHoleIdx = inHoleIdx + 1; + if ( nextHoleIdx > lastHoleIdx ) nextHoleIdx = 0; + + insideAngle = isPointInsideAngle( hole[ inHoleIdx ], hole[ prevHoleIdx ], hole[ nextHoleIdx ], shape[ inShapeIdx ] ); + if ( ! insideAngle ) { + + // console.log( "Vertex (Hole): " + inHoleIdx + ", Point: " + shape[inShapeIdx].x + "/" + shape[inShapeIdx].y ); + return false; + + } + + return true; + + } + + function intersectsShapeEdge( inShapePt, inHolePt ) { + + // checks for intersections with shape edges + var sIdx, nextIdx, intersection; + for ( sIdx = 0; sIdx < shape.length; sIdx ++ ) { + + nextIdx = sIdx + 1; nextIdx %= shape.length; + intersection = intersect_segments_2D( inShapePt, inHolePt, shape[ sIdx ], shape[ nextIdx ], true ); + if ( intersection.length > 0 ) return true; + + } + + return false; + + } + + var indepHoles = []; + + function intersectsHoleEdge( inShapePt, inHolePt ) { + + // checks for intersections with hole edges + var ihIdx, chkHole, + hIdx, nextIdx, intersection; + for ( ihIdx = 0; ihIdx < indepHoles.length; ihIdx ++ ) { + + chkHole = holes[ indepHoles[ ihIdx ]]; + for ( hIdx = 0; hIdx < chkHole.length; hIdx ++ ) { + + nextIdx = hIdx + 1; nextIdx %= chkHole.length; + intersection = intersect_segments_2D( inShapePt, inHolePt, chkHole[ hIdx ], chkHole[ nextIdx ], true ); + if ( intersection.length > 0 ) return true; + + } + + } + return false; + + } + + var holeIndex, shapeIndex, + shapePt, holePt, + holeIdx, cutKey, failedCuts = [], + tmpShape1, tmpShape2, + tmpHole1, tmpHole2; + + for ( var h = 0, hl = holes.length; h < hl; h ++ ) { + + indepHoles.push( h ); + + } + + var minShapeIndex = 0; + var counter = indepHoles.length * 2; + while ( indepHoles.length > 0 ) { + + counter --; + if ( counter < 0 ) { + + console.log( "Infinite Loop! Holes left:" + indepHoles.length + ", Probably Hole outside Shape!" ); + break; + + } + + // search for shape-vertex and hole-vertex, + // which can be connected without intersections + for ( shapeIndex = minShapeIndex; shapeIndex < shape.length; shapeIndex ++ ) { + + shapePt = shape[ shapeIndex ]; + holeIndex = - 1; + + // search for hole which can be reached without intersections + for ( var h = 0; h < indepHoles.length; h ++ ) { + + holeIdx = indepHoles[ h ]; + + // prevent multiple checks + cutKey = shapePt.x + ":" + shapePt.y + ":" + holeIdx; + if ( failedCuts[ cutKey ] !== undefined ) continue; + + hole = holes[ holeIdx ]; + for ( var h2 = 0; h2 < hole.length; h2 ++ ) { + + holePt = hole[ h2 ]; + if ( ! isCutLineInsideAngles( shapeIndex, h2 ) ) continue; + if ( intersectsShapeEdge( shapePt, holePt ) ) continue; + if ( intersectsHoleEdge( shapePt, holePt ) ) continue; + + holeIndex = h2; + indepHoles.splice( h, 1 ); + + tmpShape1 = shape.slice( 0, shapeIndex + 1 ); + tmpShape2 = shape.slice( shapeIndex ); + tmpHole1 = hole.slice( holeIndex ); + tmpHole2 = hole.slice( 0, holeIndex + 1 ); + + shape = tmpShape1.concat( tmpHole1 ).concat( tmpHole2 ).concat( tmpShape2 ); + + minShapeIndex = shapeIndex; + + // Debug only, to show the selected cuts + // glob_CutLines.push( [ shapePt, holePt ] ); + + break; + + } + if ( holeIndex >= 0 ) break; // hole-vertex found + + failedCuts[ cutKey ] = true; // remember failure + + } + if ( holeIndex >= 0 ) break; // hole-vertex found + + } + + } + + return shape; /* shape with no holes */ + + } + + + var i, il, f, face, + key, index, + allPointsMap = {}; + + // To maintain reference to old shape, one must match coordinates, or offset the indices from original arrays. It's probably easier to do the first. + + var allpoints = contour.concat(); + + for ( var h = 0, hl = holes.length; h < hl; h ++ ) { + + Array.prototype.push.apply( allpoints, holes[ h ] ); + + } + + //console.log( "allpoints",allpoints, allpoints.length ); + + // prepare all points map + + for ( i = 0, il = allpoints.length; i < il; i ++ ) { + + key = allpoints[ i ].x + ":" + allpoints[ i ].y; + + if ( allPointsMap[ key ] !== undefined ) { + + console.warn( "THREE.ShapeUtils: Duplicate point", key, i ); + + } + + allPointsMap[ key ] = i; + + } + + // remove holes by cutting paths to holes and adding them to the shape + var shapeWithoutHoles = removeHoles( contour, holes ); + + var triangles = ShapeUtils.triangulate( shapeWithoutHoles, false ); // True returns indices for points of spooled shape + //console.log( "triangles",triangles, triangles.length ); + + // check all face vertices against all points map + + for ( i = 0, il = triangles.length; i < il; i ++ ) { + + face = triangles[ i ]; + + for ( f = 0; f < 3; f ++ ) { + + key = face[ f ].x + ":" + face[ f ].y; + + index = allPointsMap[ key ]; + + if ( index !== undefined ) { + + face[ f ] = index; + + } + + } + + } + + return triangles.concat(); + + }, + + isClockWise: function ( pts ) { + + return ShapeUtils.area( pts ) < 0; + + } + + }; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * + * Creates extruded geometry from a path shape. + * + * parameters = { + * + * curveSegments: <int>, // number of points on the curves + * steps: <int>, // number of points for z-side extrusions / used for subdividing segments of extrude spline too + * amount: <int>, // Depth to extrude the shape + * + * bevelEnabled: <bool>, // turn on bevel + * bevelThickness: <float>, // how deep into the original shape bevel goes + * bevelSize: <float>, // how far from shape outline is bevel + * bevelSegments: <int>, // number of bevel layers + * + * extrudePath: <THREE.Curve> // curve to extrude shape along + * frames: <Object> // containing arrays of tangents, normals, binormals + * + * UVGenerator: <Object> // object that provides UV generator functions + * + * } + */ + + // ExtrudeGeometry + + function ExtrudeGeometry( shapes, options ) { + + Geometry.call( this ); + + this.type = 'ExtrudeGeometry'; + + this.parameters = { + shapes: shapes, + options: options + }; + + this.fromBufferGeometry( new ExtrudeBufferGeometry( shapes, options ) ); + this.mergeVertices(); + + } + + ExtrudeGeometry.prototype = Object.create( Geometry.prototype ); + ExtrudeGeometry.prototype.constructor = ExtrudeGeometry; + + // ExtrudeBufferGeometry + + function ExtrudeBufferGeometry( shapes, options ) { + + if ( typeof ( shapes ) === "undefined" ) { + + shapes = []; + return; + + } + + BufferGeometry.call( this ); + + this.type = 'ExtrudeBufferGeometry'; + + shapes = Array.isArray( shapes ) ? shapes : [ shapes ]; + + this.addShapeList( shapes, options ); + + this.computeVertexNormals(); + + // can't really use automatic vertex normals + // as then front and back sides get smoothed too + // should do separate smoothing just for sides + + //this.computeVertexNormals(); + + //console.log( "took", ( Date.now() - startTime ) ); + + } + + ExtrudeBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + ExtrudeBufferGeometry.prototype.constructor = ExtrudeBufferGeometry; + + ExtrudeBufferGeometry.prototype.getArrays = function () { + + var positionAttribute = this.getAttribute( "position" ); + var verticesArray = positionAttribute ? Array.prototype.slice.call( positionAttribute.array ) : []; + + var uvAttribute = this.getAttribute( "uv" ); + var uvArray = uvAttribute ? Array.prototype.slice.call( uvAttribute.array ) : []; + + var IndexAttribute = this.index; + var indicesArray = IndexAttribute ? Array.prototype.slice.call( IndexAttribute.array ) : []; + + return { + position: verticesArray, + uv: uvArray, + index: indicesArray + }; + + }; + + ExtrudeBufferGeometry.prototype.addShapeList = function ( shapes, options ) { + + var sl = shapes.length; + options.arrays = this.getArrays(); + + for ( var s = 0; s < sl; s ++ ) { + + var shape = shapes[ s ]; + this.addShape( shape, options ); + + } + + this.setIndex( options.arrays.index ); + this.addAttribute( 'position', new Float32BufferAttribute( options.arrays.position, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( options.arrays.uv, 2 ) ); + + }; + + ExtrudeBufferGeometry.prototype.addShape = function ( shape, options ) { + + var arrays = options.arrays ? options.arrays : this.getArrays(); + var verticesArray = arrays.position; + var indicesArray = arrays.index; + var uvArray = arrays.uv; + + var placeholder = []; + + + var amount = options.amount !== undefined ? options.amount : 100; + + var bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6; // 10 + var bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2; // 8 + var bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3; + + var bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true; // false + + var curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12; + + var steps = options.steps !== undefined ? options.steps : 1; + + var extrudePath = options.extrudePath; + var extrudePts, extrudeByPath = false; + + // Use default WorldUVGenerator if no UV generators are specified. + var uvgen = options.UVGenerator !== undefined ? options.UVGenerator : ExtrudeGeometry.WorldUVGenerator; + + var splineTube, binormal, normal, position2; + if ( extrudePath ) { + + extrudePts = extrudePath.getSpacedPoints( steps ); + + extrudeByPath = true; + bevelEnabled = false; // bevels not supported for path extrusion + + // SETUP TNB variables + + // TODO1 - have a .isClosed in spline? + + splineTube = options.frames !== undefined ? options.frames : extrudePath.computeFrenetFrames( steps, false ); + + // console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length); + + binormal = new Vector3(); + normal = new Vector3(); + position2 = new Vector3(); + + } + + // Safeguards if bevels are not enabled + + if ( ! bevelEnabled ) { + + bevelSegments = 0; + bevelThickness = 0; + bevelSize = 0; + + } + + // Variables initialization + + var ahole, h, hl; // looping of holes + var scope = this; + + var shapePoints = shape.extractPoints( curveSegments ); + + var vertices = shapePoints.shape; + var holes = shapePoints.holes; + + var reverse = ! ShapeUtils.isClockWise( vertices ); + + if ( reverse ) { + + vertices = vertices.reverse(); + + // Maybe we should also check if holes are in the opposite direction, just to be safe ... + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + + if ( ShapeUtils.isClockWise( ahole ) ) { + + holes[ h ] = ahole.reverse(); + + } + + } + + reverse = false; // If vertices are in order now, we shouldn't need to worry about them again (hopefully)! + + } + + + var faces = ShapeUtils.triangulateShape( vertices, holes ); + + /* Vertices */ + + var contour = vertices; // vertices has all points but contour has only points of circumference + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + + vertices = vertices.concat( ahole ); + + } + + + function scalePt2( pt, vec, size ) { + + if ( ! vec ) console.error( "THREE.ExtrudeGeometry: vec does not exist" ); + + return vec.clone().multiplyScalar( size ).add( pt ); + + } + + var b, bs, t, z, + vert, vlen = vertices.length, + face, flen = faces.length; + + + // Find directions for point movement + + + function getBevelVec( inPt, inPrev, inNext ) { + + // computes for inPt the corresponding point inPt' on a new contour + // shifted by 1 unit (length of normalized vector) to the left + // if we walk along contour clockwise, this new contour is outside the old one + // + // inPt' is the intersection of the two lines parallel to the two + // adjacent edges of inPt at a distance of 1 unit on the left side. + + var v_trans_x, v_trans_y, shrink_by = 1; // resulting translation vector for inPt + + // good reading for geometry algorithms (here: line-line intersection) + // http://geomalgorithms.com/a05-_intersect-1.html + + var v_prev_x = inPt.x - inPrev.x, + v_prev_y = inPt.y - inPrev.y; + var v_next_x = inNext.x - inPt.x, + v_next_y = inNext.y - inPt.y; + + var v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y ); + + // check for collinear edges + var collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x ); + + if ( Math.abs( collinear0 ) > Number.EPSILON ) { + + // not collinear + + // length of vectors for normalizing + + var v_prev_len = Math.sqrt( v_prev_lensq ); + var v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y ); + + // shift adjacent points by unit vectors to the left + + var ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len ); + var ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len ); + + var ptNextShift_x = ( inNext.x - v_next_y / v_next_len ); + var ptNextShift_y = ( inNext.y + v_next_x / v_next_len ); + + // scaling factor for v_prev to intersection point + + var sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y - + ( ptNextShift_y - ptPrevShift_y ) * v_next_x ) / + ( v_prev_x * v_next_y - v_prev_y * v_next_x ); + + // vector from inPt to intersection point + + v_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x ); + v_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y ); + + // Don't normalize!, otherwise sharp corners become ugly + // but prevent crazy spikes + var v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y ); + if ( v_trans_lensq <= 2 ) { + + return new Vector2( v_trans_x, v_trans_y ); + + } else { + + shrink_by = Math.sqrt( v_trans_lensq / 2 ); + + } + + } else { + + // handle special case of collinear edges + + var direction_eq = false; // assumes: opposite + if ( v_prev_x > Number.EPSILON ) { + + if ( v_next_x > Number.EPSILON ) { + + direction_eq = true; + + } + + } else { + + if ( v_prev_x < - Number.EPSILON ) { + + if ( v_next_x < - Number.EPSILON ) { + + direction_eq = true; + + } + + } else { + + if ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) { + + direction_eq = true; + + } + + } + + } + + if ( direction_eq ) { + + // console.log("Warning: lines are a straight sequence"); + v_trans_x = - v_prev_y; + v_trans_y = v_prev_x; + shrink_by = Math.sqrt( v_prev_lensq ); + + } else { + + // console.log("Warning: lines are a straight spike"); + v_trans_x = v_prev_x; + v_trans_y = v_prev_y; + shrink_by = Math.sqrt( v_prev_lensq / 2 ); + + } + + } + + return new Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by ); + + } + + + var contourMovements = []; + + for ( var i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) { + + if ( j === il ) j = 0; + if ( k === il ) k = 0; + + // (j)---(i)---(k) + // console.log('i,j,k', i, j , k) + + contourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] ); + + } + + var holesMovements = [], + oneHoleMovements, verticesMovements = contourMovements.concat(); + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + + oneHoleMovements = []; + + for ( i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) { + + if ( j === il ) j = 0; + if ( k === il ) k = 0; + + // (j)---(i)---(k) + oneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] ); + + } + + holesMovements.push( oneHoleMovements ); + verticesMovements = verticesMovements.concat( oneHoleMovements ); + + } + + + // Loop bevelSegments, 1 for the front, 1 for the back + + for ( b = 0; b < bevelSegments; b ++ ) { + + //for ( b = bevelSegments; b > 0; b -- ) { + + t = b / bevelSegments; + z = bevelThickness * Math.cos( t * Math.PI / 2 ); + bs = bevelSize * Math.sin( t * Math.PI / 2 ); + + // contract shape + + for ( i = 0, il = contour.length; i < il; i ++ ) { + + vert = scalePt2( contour[ i ], contourMovements[ i ], bs ); + + v( vert.x, vert.y, - z ); + + } + + // expand holes + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + oneHoleMovements = holesMovements[ h ]; + + for ( i = 0, il = ahole.length; i < il; i ++ ) { + + vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs ); + + v( vert.x, vert.y, - z ); + + } + + } + + } + + bs = bevelSize; + + // Back facing vertices + + for ( i = 0; i < vlen; i ++ ) { + + vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ]; + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, 0 ); + + } else { + + // v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x ); + + normal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x ); + binormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y ); + + position2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal ); + + v( position2.x, position2.y, position2.z ); + + } + + } + + // Add stepped vertices... + // Including front facing vertices + + var s; + + for ( s = 1; s <= steps; s ++ ) { + + for ( i = 0; i < vlen; i ++ ) { + + vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ]; + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, amount / steps * s ); + + } else { + + // v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x ); + + normal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x ); + binormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y ); + + position2.copy( extrudePts[ s ] ).add( normal ).add( binormal ); + + v( position2.x, position2.y, position2.z ); + + } + + } + + } + + + // Add bevel segments planes + + //for ( b = 1; b <= bevelSegments; b ++ ) { + for ( b = bevelSegments - 1; b >= 0; b -- ) { + + t = b / bevelSegments; + z = bevelThickness * Math.cos( t * Math.PI / 2 ); + bs = bevelSize * Math.sin( t * Math.PI / 2 ); + + // contract shape + + for ( i = 0, il = contour.length; i < il; i ++ ) { + + vert = scalePt2( contour[ i ], contourMovements[ i ], bs ); + v( vert.x, vert.y, amount + z ); + + } + + // expand holes + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + oneHoleMovements = holesMovements[ h ]; + + for ( i = 0, il = ahole.length; i < il; i ++ ) { + + vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs ); + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, amount + z ); + + } else { + + v( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z ); + + } + + } + + } + + } + + /* Faces */ + + // Top and bottom faces + + buildLidFaces(); + + // Sides faces + + buildSideFaces(); + + + ///// Internal functions + + function buildLidFaces() { + + var start = verticesArray.length/3; + + if ( bevelEnabled ) { + + var layer = 0; // steps + 1 + var offset = vlen * layer; + + // Bottom faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset ); + + } + + layer = steps + bevelSegments * 2; + offset = vlen * layer; + + // Top faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset ); + + } + + } else { + + // Bottom faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 2 ], face[ 1 ], face[ 0 ] ); + + } + + // Top faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps ); + + } + + } + + scope.addGroup( start, verticesArray.length/3 -start, options.material !== undefined ? options.material : 0); + + } + + // Create faces for the z-sides of the shape + + function buildSideFaces() { + + var start = verticesArray.length/3; + var layeroffset = 0; + sidewalls( contour, layeroffset ); + layeroffset += contour.length; + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + sidewalls( ahole, layeroffset ); + + //, true + layeroffset += ahole.length; + + } + + + scope.addGroup( start, verticesArray.length/3 -start, options.extrudeMaterial !== undefined ? options.extrudeMaterial : 1); + + + } + + function sidewalls( contour, layeroffset ) { + + var j, k; + i = contour.length; + + while ( -- i >= 0 ) { + + j = i; + k = i - 1; + if ( k < 0 ) k = contour.length - 1; + + //console.log('b', i,j, i-1, k,vertices.length); + + var s = 0, + sl = steps + bevelSegments * 2; + + for ( s = 0; s < sl; s ++ ) { + + var slen1 = vlen * s; + var slen2 = vlen * ( s + 1 ); + + var a = layeroffset + j + slen1, + b = layeroffset + k + slen1, + c = layeroffset + k + slen2, + d = layeroffset + j + slen2; + + f4( a, b, c, d, contour, s, sl, j, k ); + + } + + } + + } + + function v( x, y, z ) { + + placeholder.push( x ); + placeholder.push( y ); + placeholder.push( z ); + + } + + + function f3( a, b, c ) { + + addVertex( a ); + addVertex( b ); + addVertex( c ); + + var nextIndex = verticesArray.length / 3; + var uvs = uvgen.generateTopUV( scope, verticesArray, nextIndex - 3, nextIndex - 2, nextIndex - 1 ); + + addUV( uvs[ 0 ] ); + addUV( uvs[ 1 ] ); + addUV( uvs[ 2 ] ); + + } + + function f4( a, b, c, d, wallContour, stepIndex, stepsLength, contourIndex1, contourIndex2 ) { + + addVertex( a ); + addVertex( b ); + addVertex( d ); + + addVertex( b ); + addVertex( c ); + addVertex( d ); + + + var nextIndex = verticesArray.length / 3; + var uvs = uvgen.generateSideWallUV( scope, verticesArray, nextIndex - 6, nextIndex - 3, nextIndex - 2, nextIndex - 1 ); + + addUV( uvs[ 0 ] ); + addUV( uvs[ 1 ] ); + addUV( uvs[ 3 ] ); + + addUV( uvs[ 1 ] ); + addUV( uvs[ 2 ] ); + addUV( uvs[ 3 ] ); + + } + + function addVertex( index ) { + + indicesArray.push( verticesArray.length / 3 ); + verticesArray.push( placeholder[ index * 3 + 0 ] ); + verticesArray.push( placeholder[ index * 3 + 1 ] ); + verticesArray.push( placeholder[ index * 3 + 2 ] ); + + } + + + function addUV( vector2 ) { + + uvArray.push( vector2.x ); + uvArray.push( vector2.y ); + + } + + if ( ! options.arrays ) { + + this.setIndex( indicesArray ); + this.addAttribute( 'position', new Float32BufferAttribute( verticesArray, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( options.arrays.uv, 2 ) ); + + } + + }; + + ExtrudeGeometry.WorldUVGenerator = { + + generateTopUV: function ( geometry, vertices, indexA, indexB, indexC ) { + + var a_x = vertices[ indexA * 3 ]; + var a_y = vertices[ indexA * 3 + 1 ]; + var b_x = vertices[ indexB * 3 ]; + var b_y = vertices[ indexB * 3 + 1 ]; + var c_x = vertices[ indexC * 3 ]; + var c_y = vertices[ indexC * 3 + 1 ]; + + return [ + new Vector2( a_x, a_y ), + new Vector2( b_x, b_y ), + new Vector2( c_x, c_y ) + ]; + + }, + + generateSideWallUV: function ( geometry, vertices, indexA, indexB, indexC, indexD ) { + + var a_x = vertices[ indexA * 3 ]; + var a_y = vertices[ indexA * 3 + 1 ]; + var a_z = vertices[ indexA * 3 + 2 ]; + var b_x = vertices[ indexB * 3 ]; + var b_y = vertices[ indexB * 3 + 1 ]; + var b_z = vertices[ indexB * 3 + 2 ]; + var c_x = vertices[ indexC * 3 ]; + var c_y = vertices[ indexC * 3 + 1 ]; + var c_z = vertices[ indexC * 3 + 2 ]; + var d_x = vertices[ indexD * 3 ]; + var d_y = vertices[ indexD * 3 + 1 ]; + var d_z = vertices[ indexD * 3 + 2 ]; + + if ( Math.abs( a_y - b_y ) < 0.01 ) { + + return [ + new Vector2( a_x, 1 - a_z ), + new Vector2( b_x, 1 - b_z ), + new Vector2( c_x, 1 - c_z ), + new Vector2( d_x, 1 - d_z ) + ]; + + } else { + + return [ + new Vector2( a_y, 1 - a_z ), + new Vector2( b_y, 1 - b_z ), + new Vector2( c_y, 1 - c_z ), + new Vector2( d_y, 1 - d_z ) + ]; + + } + + } + }; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author alteredq / http://alteredqualia.com/ + * + * Text = 3D Text + * + * parameters = { + * font: <THREE.Font>, // font + * + * size: <float>, // size of the text + * height: <float>, // thickness to extrude text + * curveSegments: <int>, // number of points on the curves + * + * bevelEnabled: <bool>, // turn on bevel + * bevelThickness: <float>, // how deep into text bevel goes + * bevelSize: <float> // how far from text outline is bevel + * } + */ + + // TextGeometry + + function TextGeometry( text, parameters ) { + + Geometry.call( this ); + + this.type = 'TextGeometry'; + + this.parameters = { + text: text, + parameters: parameters + }; + + this.fromBufferGeometry( new TextBufferGeometry( text, parameters ) ); + this.mergeVertices(); + + } + + TextGeometry.prototype = Object.create( Geometry.prototype ); + TextGeometry.prototype.constructor = TextGeometry; + + // TextBufferGeometry + + function TextBufferGeometry( text, parameters ) { + + parameters = parameters || {}; + + var font = parameters.font; + + if ( ( font && font.isFont ) === false ) { + + console.error( 'THREE.TextGeometry: font parameter is not an instance of THREE.Font.' ); + return new Geometry(); + + } + + var shapes = font.generateShapes( text, parameters.size, parameters.curveSegments ); + + // translate parameters to ExtrudeGeometry API + + parameters.amount = parameters.height !== undefined ? parameters.height : 50; + + // defaults + + if ( parameters.bevelThickness === undefined ) parameters.bevelThickness = 10; + if ( parameters.bevelSize === undefined ) parameters.bevelSize = 8; + if ( parameters.bevelEnabled === undefined ) parameters.bevelEnabled = false; + + ExtrudeBufferGeometry.call( this, shapes, parameters ); + + this.type = 'TextBufferGeometry'; + + } + + TextBufferGeometry.prototype = Object.create( ExtrudeBufferGeometry.prototype ); + TextBufferGeometry.prototype.constructor = TextBufferGeometry; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author benaadams / https://twitter.com/ben_a_adams + * @author Mugen87 / https://github.com/Mugen87 + */ + + // SphereGeometry + + function SphereGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'SphereGeometry'; + + this.parameters = { + radius: radius, + widthSegments: widthSegments, + heightSegments: heightSegments, + phiStart: phiStart, + phiLength: phiLength, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) ); + this.mergeVertices(); + + } + + SphereGeometry.prototype = Object.create( Geometry.prototype ); + SphereGeometry.prototype.constructor = SphereGeometry; + + // SphereBufferGeometry + + function SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'SphereBufferGeometry'; + + this.parameters = { + radius: radius, + widthSegments: widthSegments, + heightSegments: heightSegments, + phiStart: phiStart, + phiLength: phiLength, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + radius = radius || 50; + + widthSegments = Math.max( 3, Math.floor( widthSegments ) || 8 ); + heightSegments = Math.max( 2, Math.floor( heightSegments ) || 6 ); + + phiStart = phiStart !== undefined ? phiStart : 0; + phiLength = phiLength !== undefined ? phiLength : Math.PI * 2; + + thetaStart = thetaStart !== undefined ? thetaStart : 0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI; + + var thetaEnd = thetaStart + thetaLength; + + var ix, iy; + + var index = 0; + var grid = []; + + var vertex = new Vector3(); + var normal = new Vector3(); + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // generate vertices, normals and uvs + + for ( iy = 0; iy <= heightSegments; iy ++ ) { + + var verticesRow = []; + + var v = iy / heightSegments; + + for ( ix = 0; ix <= widthSegments; ix ++ ) { + + var u = ix / widthSegments; + + // vertex + + vertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength ); + vertex.y = radius * Math.cos( thetaStart + v * thetaLength ); + vertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normal.set( vertex.x, vertex.y, vertex.z ).normalize(); + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( u, 1 - v ); + + verticesRow.push( index ++ ); + + } + + grid.push( verticesRow ); + + } + + // indices + + for ( iy = 0; iy < heightSegments; iy ++ ) { + + for ( ix = 0; ix < widthSegments; ix ++ ) { + + var a = grid[ iy ][ ix + 1 ]; + var b = grid[ iy ][ ix ]; + var c = grid[ iy + 1 ][ ix ]; + var d = grid[ iy + 1 ][ ix + 1 ]; + + if ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d ); + if ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + SphereBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + SphereBufferGeometry.prototype.constructor = SphereBufferGeometry; + + /** + * @author Kaleb Murphy + * @author Mugen87 / https://github.com/Mugen87 + */ + + // RingGeometry + + function RingGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'RingGeometry'; + + this.parameters = { + innerRadius: innerRadius, + outerRadius: outerRadius, + thetaSegments: thetaSegments, + phiSegments: phiSegments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) ); + this.mergeVertices(); + + } + + RingGeometry.prototype = Object.create( Geometry.prototype ); + RingGeometry.prototype.constructor = RingGeometry; + + // RingBufferGeometry + + function RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'RingBufferGeometry'; + + this.parameters = { + innerRadius: innerRadius, + outerRadius: outerRadius, + thetaSegments: thetaSegments, + phiSegments: phiSegments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + innerRadius = innerRadius || 20; + outerRadius = outerRadius || 50; + + thetaStart = thetaStart !== undefined ? thetaStart : 0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2; + + thetaSegments = thetaSegments !== undefined ? Math.max( 3, thetaSegments ) : 8; + phiSegments = phiSegments !== undefined ? Math.max( 1, phiSegments ) : 1; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // some helper variables + + var segment; + var radius = innerRadius; + var radiusStep = ( ( outerRadius - innerRadius ) / phiSegments ); + var vertex = new Vector3(); + var uv = new Vector2(); + var j, i; + + // generate vertices, normals and uvs + + for ( j = 0; j <= phiSegments; j ++ ) { + + for ( i = 0; i <= thetaSegments; i ++ ) { + + // values are generate from the inside of the ring to the outside + + segment = thetaStart + i / thetaSegments * thetaLength; + + // vertex + + vertex.x = radius * Math.cos( segment ); + vertex.y = radius * Math.sin( segment ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normals.push( 0, 0, 1 ); + + // uv + + uv.x = ( vertex.x / outerRadius + 1 ) / 2; + uv.y = ( vertex.y / outerRadius + 1 ) / 2; + + uvs.push( uv.x, uv.y ); + + } + + // increase the radius for next row of vertices + + radius += radiusStep; + + } + + // indices + + for ( j = 0; j < phiSegments; j ++ ) { + + var thetaSegmentLevel = j * ( thetaSegments + 1 ); + + for ( i = 0; i < thetaSegments; i ++ ) { + + segment = i + thetaSegmentLevel; + + var a = segment; + var b = segment + thetaSegments + 1; + var c = segment + thetaSegments + 2; + var d = segment + 1; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + RingBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + RingBufferGeometry.prototype.constructor = RingBufferGeometry; + + /** + * @author astrodud / http://astrodud.isgreat.org/ + * @author zz85 / https://github.com/zz85 + * @author bhouston / http://clara.io + * @author Mugen87 / https://github.com/Mugen87 + */ + + // LatheGeometry + + function LatheGeometry( points, segments, phiStart, phiLength ) { + + Geometry.call( this ); + + this.type = 'LatheGeometry'; + + this.parameters = { + points: points, + segments: segments, + phiStart: phiStart, + phiLength: phiLength + }; + + this.fromBufferGeometry( new LatheBufferGeometry( points, segments, phiStart, phiLength ) ); + this.mergeVertices(); + + } + + LatheGeometry.prototype = Object.create( Geometry.prototype ); + LatheGeometry.prototype.constructor = LatheGeometry; + + // LatheBufferGeometry + + function LatheBufferGeometry( points, segments, phiStart, phiLength ) { + + BufferGeometry.call( this ); + + this.type = 'LatheBufferGeometry'; + + this.parameters = { + points: points, + segments: segments, + phiStart: phiStart, + phiLength: phiLength + }; + + segments = Math.floor( segments ) || 12; + phiStart = phiStart || 0; + phiLength = phiLength || Math.PI * 2; + + // clamp phiLength so it's in range of [ 0, 2PI ] + + phiLength = _Math.clamp( phiLength, 0, Math.PI * 2 ); + + + // buffers + + var indices = []; + var vertices = []; + var uvs = []; + + // helper variables + + var base; + var inverseSegments = 1.0 / segments; + var vertex = new Vector3(); + var uv = new Vector2(); + var i, j; + + // generate vertices and uvs + + for ( i = 0; i <= segments; i ++ ) { + + var phi = phiStart + i * inverseSegments * phiLength; + + var sin = Math.sin( phi ); + var cos = Math.cos( phi ); + + for ( j = 0; j <= ( points.length - 1 ); j ++ ) { + + // vertex + + vertex.x = points[ j ].x * sin; + vertex.y = points[ j ].y; + vertex.z = points[ j ].x * cos; + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // uv + + uv.x = i / segments; + uv.y = j / ( points.length - 1 ); + + uvs.push( uv.x, uv.y ); + + + } + + } + + // indices + + for ( i = 0; i < segments; i ++ ) { + + for ( j = 0; j < ( points.length - 1 ); j ++ ) { + + base = j + i * points.length; + + var a = base; + var b = base + points.length; + var c = base + points.length + 1; + var d = base + 1; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + // generate normals + + this.computeVertexNormals(); + + // if the geometry is closed, we need to average the normals along the seam. + // because the corresponding vertices are identical (but still have different UVs). + + if ( phiLength === Math.PI * 2 ) { + + var normals = this.attributes.normal.array; + var n1 = new Vector3(); + var n2 = new Vector3(); + var n = new Vector3(); + + // this is the buffer offset for the last line of vertices + + base = segments * points.length * 3; + + for ( i = 0, j = 0; i < points.length; i ++, j += 3 ) { + + // select the normal of the vertex in the first line + + n1.x = normals[ j + 0 ]; + n1.y = normals[ j + 1 ]; + n1.z = normals[ j + 2 ]; + + // select the normal of the vertex in the last line + + n2.x = normals[ base + j + 0 ]; + n2.y = normals[ base + j + 1 ]; + n2.z = normals[ base + j + 2 ]; + + // average normals + + n.addVectors( n1, n2 ).normalize(); + + // assign the new values to both normals + + normals[ j + 0 ] = normals[ base + j + 0 ] = n.x; + normals[ j + 1 ] = normals[ base + j + 1 ] = n.y; + normals[ j + 2 ] = normals[ base + j + 2 ] = n.z; + + } + + } + + } + + LatheBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + LatheBufferGeometry.prototype.constructor = LatheBufferGeometry; + + /** + * @author jonobr1 / http://jonobr1.com + * @author Mugen87 / https://github.com/Mugen87 + */ + + // ShapeGeometry + + function ShapeGeometry( shapes, curveSegments ) { + + Geometry.call( this ); + + this.type = 'ShapeGeometry'; + + if ( typeof curveSegments === 'object' ) { + + console.warn( 'THREE.ShapeGeometry: Options parameter has been removed.' ); + + curveSegments = curveSegments.curveSegments; + + } + + this.parameters = { + shapes: shapes, + curveSegments: curveSegments + }; + + this.fromBufferGeometry( new ShapeBufferGeometry( shapes, curveSegments ) ); + this.mergeVertices(); + + } + + ShapeGeometry.prototype = Object.create( Geometry.prototype ); + ShapeGeometry.prototype.constructor = ShapeGeometry; + + // ShapeBufferGeometry + + function ShapeBufferGeometry( shapes, curveSegments ) { + + BufferGeometry.call( this ); + + this.type = 'ShapeBufferGeometry'; + + this.parameters = { + shapes: shapes, + curveSegments: curveSegments + }; + + curveSegments = curveSegments || 12; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var groupStart = 0; + var groupCount = 0; + + // allow single and array values for "shapes" parameter + + if ( Array.isArray( shapes ) === false ) { + + addShape( shapes ); + + } else { + + for ( var i = 0; i < shapes.length; i ++ ) { + + addShape( shapes[ i ] ); + + this.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support + + groupStart += groupCount; + groupCount = 0; + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + + // helper functions + + function addShape( shape ) { + + var i, l, shapeHole; + + var indexOffset = vertices.length / 3; + var points = shape.extractPoints( curveSegments ); + + var shapeVertices = points.shape; + var shapeHoles = points.holes; + + // check direction of vertices + + if ( ShapeUtils.isClockWise( shapeVertices ) === false ) { + + shapeVertices = shapeVertices.reverse(); + + // also check if holes are in the opposite direction + + for ( i = 0, l = shapeHoles.length; i < l; i ++ ) { + + shapeHole = shapeHoles[ i ]; + + if ( ShapeUtils.isClockWise( shapeHole ) === true ) { + + shapeHoles[ i ] = shapeHole.reverse(); + + } + + } + + } + + var faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles ); + + // join vertices of inner and outer paths to a single array + + for ( i = 0, l = shapeHoles.length; i < l; i ++ ) { + + shapeHole = shapeHoles[ i ]; + shapeVertices = shapeVertices.concat( shapeHole ); + + } + + // vertices, normals, uvs + + for ( i = 0, l = shapeVertices.length; i < l; i ++ ) { + + var vertex = shapeVertices[ i ]; + + vertices.push( vertex.x, vertex.y, 0 ); + normals.push( 0, 0, 1 ); + uvs.push( vertex.x, vertex.y ); // world uvs + + } + + // incides + + for ( i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + var a = face[ 0 ] + indexOffset; + var b = face[ 1 ] + indexOffset; + var c = face[ 2 ] + indexOffset; + + indices.push( a, b, c ); + groupCount += 3; + + } + + } + + } + + ShapeBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + ShapeBufferGeometry.prototype.constructor = ShapeBufferGeometry; + + /** + * @author WestLangley / http://github.com/WestLangley + * @author Mugen87 / https://github.com/Mugen87 + */ + + function EdgesGeometry( geometry, thresholdAngle ) { + + BufferGeometry.call( this ); + + this.type = 'EdgesGeometry'; + + this.parameters = { + thresholdAngle: thresholdAngle + }; + + thresholdAngle = ( thresholdAngle !== undefined ) ? thresholdAngle : 1; + + // buffer + + var vertices = []; + + // helper variables + + var thresholdDot = Math.cos( _Math.DEG2RAD * thresholdAngle ); + var edge = [ 0, 0 ], edges = {}, edge1, edge2; + var key, keys = [ 'a', 'b', 'c' ]; + + // prepare source geometry + + var geometry2; + + if ( geometry.isBufferGeometry ) { + + geometry2 = new Geometry(); + geometry2.fromBufferGeometry( geometry ); + + } else { + + geometry2 = geometry.clone(); + + } + + geometry2.mergeVertices(); + geometry2.computeFaceNormals(); + + var sourceVertices = geometry2.vertices; + var faces = geometry2.faces; + + // now create a data structure where each entry represents an edge with its adjoining faces + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + for ( var j = 0; j < 3; j ++ ) { + + edge1 = face[ keys[ j ] ]; + edge2 = face[ keys[ ( j + 1 ) % 3 ] ]; + edge[ 0 ] = Math.min( edge1, edge2 ); + edge[ 1 ] = Math.max( edge1, edge2 ); + + key = edge[ 0 ] + ',' + edge[ 1 ]; + + if ( edges[ key ] === undefined ) { + + edges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ], face1: i, face2: undefined }; + + } else { + + edges[ key ].face2 = i; + + } + + } + + } + + // generate vertices + + for ( key in edges ) { + + var e = edges[ key ]; + + // an edge is only rendered if the angle (in degrees) between the face normals of the adjoining faces exceeds this value. default = 1 degree. + + if ( e.face2 === undefined || faces[ e.face1 ].normal.dot( faces[ e.face2 ].normal ) <= thresholdDot ) { + + var vertex = sourceVertices[ e.index1 ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + vertex = sourceVertices[ e.index2 ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } + + // build geometry + + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + + } + + EdgesGeometry.prototype = Object.create( BufferGeometry.prototype ); + EdgesGeometry.prototype.constructor = EdgesGeometry; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + // CylinderGeometry + + function CylinderGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'CylinderGeometry'; + + this.parameters = { + radiusTop: radiusTop, + radiusBottom: radiusBottom, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) ); + this.mergeVertices(); + + } + + CylinderGeometry.prototype = Object.create( Geometry.prototype ); + CylinderGeometry.prototype.constructor = CylinderGeometry; + + // CylinderBufferGeometry + + function CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'CylinderBufferGeometry'; + + this.parameters = { + radiusTop: radiusTop, + radiusBottom: radiusBottom, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + var scope = this; + + radiusTop = radiusTop !== undefined ? radiusTop : 20; + radiusBottom = radiusBottom !== undefined ? radiusBottom : 20; + height = height !== undefined ? height : 100; + + radialSegments = Math.floor( radialSegments ) || 8; + heightSegments = Math.floor( heightSegments ) || 1; + + openEnded = openEnded !== undefined ? openEnded : false; + thetaStart = thetaStart !== undefined ? thetaStart : 0.0; + thetaLength = thetaLength !== undefined ? thetaLength : 2.0 * Math.PI; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var index = 0; + var indexArray = []; + var halfHeight = height / 2; + var groupStart = 0; + + // generate geometry + + generateTorso(); + + if ( openEnded === false ) { + + if ( radiusTop > 0 ) generateCap( true ); + if ( radiusBottom > 0 ) generateCap( false ); + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + function generateTorso() { + + var x, y; + var normal = new Vector3(); + var vertex = new Vector3(); + + var groupCount = 0; + + // this will be used to calculate the normal + var slope = ( radiusBottom - radiusTop ) / height; + + // generate vertices, normals and uvs + + for ( y = 0; y <= heightSegments; y ++ ) { + + var indexRow = []; + + var v = y / heightSegments; + + // calculate the radius of the current row + + var radius = v * ( radiusBottom - radiusTop ) + radiusTop; + + for ( x = 0; x <= radialSegments; x ++ ) { + + var u = x / radialSegments; + + var theta = u * thetaLength + thetaStart; + + var sinTheta = Math.sin( theta ); + var cosTheta = Math.cos( theta ); + + // vertex + + vertex.x = radius * sinTheta; + vertex.y = - v * height + halfHeight; + vertex.z = radius * cosTheta; + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normal.set( sinTheta, slope, cosTheta ).normalize(); + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( u, 1 - v ); + + // save index of vertex in respective row + + indexRow.push( index ++ ); + + } + + // now save vertices of the row in our index array + + indexArray.push( indexRow ); + + } + + // generate indices + + for ( x = 0; x < radialSegments; x ++ ) { + + for ( y = 0; y < heightSegments; y ++ ) { + + // we use the index array to access the correct indices + + var a = indexArray[ y ][ x ]; + var b = indexArray[ y + 1 ][ x ]; + var c = indexArray[ y + 1 ][ x + 1 ]; + var d = indexArray[ y ][ x + 1 ]; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + // update group counter + + groupCount += 6; + + } + + } + + // add a group to the geometry. this will ensure multi material support + + scope.addGroup( groupStart, groupCount, 0 ); + + // calculate new start value for groups + + groupStart += groupCount; + + } + + function generateCap( top ) { + + var x, centerIndexStart, centerIndexEnd; + + var uv = new Vector2(); + var vertex = new Vector3(); + + var groupCount = 0; + + var radius = ( top === true ) ? radiusTop : radiusBottom; + var sign = ( top === true ) ? 1 : - 1; + + // save the index of the first center vertex + centerIndexStart = index; + + // first we generate the center vertex data of the cap. + // because the geometry needs one set of uvs per face, + // we must generate a center vertex per face/segment + + for ( x = 1; x <= radialSegments; x ++ ) { + + // vertex + + vertices.push( 0, halfHeight * sign, 0 ); + + // normal + + normals.push( 0, sign, 0 ); + + // uv + + uvs.push( 0.5, 0.5 ); + + // increase index + + index ++; + + } + + // save the index of the last center vertex + + centerIndexEnd = index; + + // now we generate the surrounding vertices, normals and uvs + + for ( x = 0; x <= radialSegments; x ++ ) { + + var u = x / radialSegments; + var theta = u * thetaLength + thetaStart; + + var cosTheta = Math.cos( theta ); + var sinTheta = Math.sin( theta ); + + // vertex + + vertex.x = radius * sinTheta; + vertex.y = halfHeight * sign; + vertex.z = radius * cosTheta; + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normals.push( 0, sign, 0 ); + + // uv + + uv.x = ( cosTheta * 0.5 ) + 0.5; + uv.y = ( sinTheta * 0.5 * sign ) + 0.5; + uvs.push( uv.x, uv.y ); + + // increase index + + index ++; + + } + + // generate indices + + for ( x = 0; x < radialSegments; x ++ ) { + + var c = centerIndexStart + x; + var i = centerIndexEnd + x; + + if ( top === true ) { + + // face top + + indices.push( i, i + 1, c ); + + } else { + + // face bottom + + indices.push( i + 1, i, c ); + + } + + groupCount += 3; + + } + + // add a group to the geometry. this will ensure multi material support + + scope.addGroup( groupStart, groupCount, top === true ? 1 : 2 ); + + // calculate new start value for groups + + groupStart += groupCount; + + } + + } + + CylinderBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + CylinderBufferGeometry.prototype.constructor = CylinderBufferGeometry; + + /** + * @author abelnation / http://github.com/abelnation + */ + + // ConeGeometry + + function ConeGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + CylinderGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ); + + this.type = 'ConeGeometry'; + + this.parameters = { + radius: radius, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + } + + ConeGeometry.prototype = Object.create( CylinderGeometry.prototype ); + ConeGeometry.prototype.constructor = ConeGeometry; + + // ConeBufferGeometry + + function ConeBufferGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + CylinderBufferGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ); + + this.type = 'ConeBufferGeometry'; + + this.parameters = { + radius: radius, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + } + + ConeBufferGeometry.prototype = Object.create( CylinderBufferGeometry.prototype ); + ConeBufferGeometry.prototype.constructor = ConeBufferGeometry; + + /** + * @author benaadams / https://twitter.com/ben_a_adams + * @author Mugen87 / https://github.com/Mugen87 + * @author hughes + */ + + // CircleGeometry + + function CircleGeometry( radius, segments, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'CircleGeometry'; + + this.parameters = { + radius: radius, + segments: segments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) ); + this.mergeVertices(); + + } + + CircleGeometry.prototype = Object.create( Geometry.prototype ); + CircleGeometry.prototype.constructor = CircleGeometry; + + // CircleBufferGeometry + + function CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'CircleBufferGeometry'; + + this.parameters = { + radius: radius, + segments: segments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + radius = radius || 50; + segments = segments !== undefined ? Math.max( 3, segments ) : 8; + + thetaStart = thetaStart !== undefined ? thetaStart : 0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var i, s; + var vertex = new Vector3(); + var uv = new Vector2(); + + // center point + + vertices.push( 0, 0, 0 ); + normals.push( 0, 0, 1 ); + uvs.push( 0.5, 0.5 ); + + for ( s = 0, i = 3; s <= segments; s ++, i += 3 ) { + + var segment = thetaStart + s / segments * thetaLength; + + // vertex + + vertex.x = radius * Math.cos( segment ); + vertex.y = radius * Math.sin( segment ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normals.push( 0, 0, 1 ); + + // uvs + + uv.x = ( vertices[ i ] / radius + 1 ) / 2; + uv.y = ( vertices[ i + 1 ] / radius + 1 ) / 2; + + uvs.push( uv.x, uv.y ); + + } + + // indices + + for ( i = 1; i <= segments; i ++ ) { + + indices.push( i, i + 1, 0 ); + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + CircleBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + CircleBufferGeometry.prototype.constructor = CircleBufferGeometry; + + + + var Geometries = Object.freeze({ + WireframeGeometry: WireframeGeometry, + ParametricGeometry: ParametricGeometry, + ParametricBufferGeometry: ParametricBufferGeometry, + TetrahedronGeometry: TetrahedronGeometry, + TetrahedronBufferGeometry: TetrahedronBufferGeometry, + OctahedronGeometry: OctahedronGeometry, + OctahedronBufferGeometry: OctahedronBufferGeometry, + IcosahedronGeometry: IcosahedronGeometry, + IcosahedronBufferGeometry: IcosahedronBufferGeometry, + DodecahedronGeometry: DodecahedronGeometry, + DodecahedronBufferGeometry: DodecahedronBufferGeometry, + PolyhedronGeometry: PolyhedronGeometry, + PolyhedronBufferGeometry: PolyhedronBufferGeometry, + TubeGeometry: TubeGeometry, + TubeBufferGeometry: TubeBufferGeometry, + TorusKnotGeometry: TorusKnotGeometry, + TorusKnotBufferGeometry: TorusKnotBufferGeometry, + TorusGeometry: TorusGeometry, + TorusBufferGeometry: TorusBufferGeometry, + TextGeometry: TextGeometry, + TextBufferGeometry: TextBufferGeometry, + SphereGeometry: SphereGeometry, + SphereBufferGeometry: SphereBufferGeometry, + RingGeometry: RingGeometry, + RingBufferGeometry: RingBufferGeometry, + PlaneGeometry: PlaneGeometry, + PlaneBufferGeometry: PlaneBufferGeometry, + LatheGeometry: LatheGeometry, + LatheBufferGeometry: LatheBufferGeometry, + ShapeGeometry: ShapeGeometry, + ShapeBufferGeometry: ShapeBufferGeometry, + ExtrudeGeometry: ExtrudeGeometry, + ExtrudeBufferGeometry: ExtrudeBufferGeometry, + EdgesGeometry: EdgesGeometry, + ConeGeometry: ConeGeometry, + ConeBufferGeometry: ConeBufferGeometry, + CylinderGeometry: CylinderGeometry, + CylinderBufferGeometry: CylinderBufferGeometry, + CircleGeometry: CircleGeometry, + CircleBufferGeometry: CircleBufferGeometry, + BoxGeometry: BoxGeometry, + BoxBufferGeometry: BoxBufferGeometry + }); + + /** + * @author mrdoob / http://mrdoob.com/ + * + * parameters = { + * opacity: <float> + * } + */ + + function ShadowMaterial( parameters ) { + + ShaderMaterial.call( this, { + uniforms: UniformsUtils.merge( [ + UniformsLib.lights, + { + opacity: { value: 1.0 } + } + ] ), + vertexShader: ShaderChunk[ 'shadow_vert' ], + fragmentShader: ShaderChunk[ 'shadow_frag' ] + } ); + + this.lights = true; + this.transparent = true; + + Object.defineProperties( this, { + opacity: { + enumerable: true, + get: function () { + return this.uniforms.opacity.value; + }, + set: function ( value ) { + this.uniforms.opacity.value = value; + } + } + } ); + + this.setValues( parameters ); + + } + + ShadowMaterial.prototype = Object.create( ShaderMaterial.prototype ); + ShadowMaterial.prototype.constructor = ShadowMaterial; + + ShadowMaterial.prototype.isShadowMaterial = true; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function RawShaderMaterial( parameters ) { + + ShaderMaterial.call( this, parameters ); + + this.type = 'RawShaderMaterial'; + + } + + RawShaderMaterial.prototype = Object.create( ShaderMaterial.prototype ); + RawShaderMaterial.prototype.constructor = RawShaderMaterial; + + RawShaderMaterial.prototype.isRawShaderMaterial = true; + + /** + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * color: <hex>, + * roughness: <float>, + * metalness: <float>, + * opacity: <float>, + * + * map: new THREE.Texture( <Image> ), + * + * lightMap: new THREE.Texture( <Image> ), + * lightMapIntensity: <float> + * + * aoMap: new THREE.Texture( <Image> ), + * aoMapIntensity: <float> + * + * emissive: <hex>, + * emissiveIntensity: <float> + * emissiveMap: new THREE.Texture( <Image> ), + * + * bumpMap: new THREE.Texture( <Image> ), + * bumpScale: <float>, + * + * normalMap: new THREE.Texture( <Image> ), + * normalScale: <Vector2>, + * + * displacementMap: new THREE.Texture( <Image> ), + * displacementScale: <float>, + * displacementBias: <float>, + * + * roughnessMap: new THREE.Texture( <Image> ), + * + * metalnessMap: new THREE.Texture( <Image> ), + * + * alphaMap: new THREE.Texture( <Image> ), + * + * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), + * envMapIntensity: <float> + * + * refractionRatio: <float>, + * + * wireframe: <boolean>, + * wireframeLinewidth: <float>, + * + * skinning: <bool>, + * morphTargets: <bool>, + * morphNormals: <bool> + * } + */ + + function MeshStandardMaterial( parameters ) { + + Material.call( this ); + + this.defines = { 'STANDARD': '' }; + + this.type = 'MeshStandardMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + this.roughness = 0.5; + this.metalness = 0.5; + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.roughnessMap = null; + + this.metalnessMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.envMapIntensity = 1.0; + + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + + } + + MeshStandardMaterial.prototype = Object.create( Material.prototype ); + MeshStandardMaterial.prototype.constructor = MeshStandardMaterial; + + MeshStandardMaterial.prototype.isMeshStandardMaterial = true; + + MeshStandardMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.defines = { 'STANDARD': '' }; + + this.color.copy( source.color ); + this.roughness = source.roughness; + this.metalness = source.metalness; + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.roughnessMap = source.roughnessMap; + + this.metalnessMap = source.metalnessMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.envMapIntensity = source.envMapIntensity; + + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + + }; + + /** + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * reflectivity: <float> + * } + */ + + function MeshPhysicalMaterial( parameters ) { + + MeshStandardMaterial.call( this ); + + this.defines = { 'PHYSICAL': '' }; + + this.type = 'MeshPhysicalMaterial'; + + this.reflectivity = 0.5; // maps to F0 = 0.04 + + this.clearCoat = 0.0; + this.clearCoatRoughness = 0.0; + + this.setValues( parameters ); + + } + + MeshPhysicalMaterial.prototype = Object.create( MeshStandardMaterial.prototype ); + MeshPhysicalMaterial.prototype.constructor = MeshPhysicalMaterial; + + MeshPhysicalMaterial.prototype.isMeshPhysicalMaterial = true; + + MeshPhysicalMaterial.prototype.copy = function ( source ) { + + MeshStandardMaterial.prototype.copy.call( this, source ); + + this.defines = { 'PHYSICAL': '' }; + + this.reflectivity = source.reflectivity; + + this.clearCoat = source.clearCoat; + this.clearCoatRoughness = source.clearCoatRoughness; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: <hex>, + * specular: <hex>, + * shininess: <float>, + * opacity: <float>, + * + * map: new THREE.Texture( <Image> ), + * + * lightMap: new THREE.Texture( <Image> ), + * lightMapIntensity: <float> + * + * aoMap: new THREE.Texture( <Image> ), + * aoMapIntensity: <float> + * + * emissive: <hex>, + * emissiveIntensity: <float> + * emissiveMap: new THREE.Texture( <Image> ), + * + * bumpMap: new THREE.Texture( <Image> ), + * bumpScale: <float>, + * + * normalMap: new THREE.Texture( <Image> ), + * normalScale: <Vector2>, + * + * displacementMap: new THREE.Texture( <Image> ), + * displacementScale: <float>, + * displacementBias: <float>, + * + * specularMap: new THREE.Texture( <Image> ), + * + * alphaMap: new THREE.Texture( <Image> ), + * + * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: <float>, + * refractionRatio: <float>, + * + * wireframe: <boolean>, + * wireframeLinewidth: <float>, + * + * skinning: <bool>, + * morphTargets: <bool>, + * morphNormals: <bool> + * } + */ + + function MeshPhongMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshPhongMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + this.specular = new Color( 0x111111 ); + this.shininess = 30; + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + + } + + MeshPhongMaterial.prototype = Object.create( Material.prototype ); + MeshPhongMaterial.prototype.constructor = MeshPhongMaterial; + + MeshPhongMaterial.prototype.isMeshPhongMaterial = true; + + MeshPhongMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + this.specular.copy( source.specular ); + this.shininess = source.shininess; + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + + }; + + /** + * @author takahirox / http://github.com/takahirox + * + * parameters = { + * gradientMap: new THREE.Texture( <Image> ) + * } + */ + + function MeshToonMaterial( parameters ) { + + MeshPhongMaterial.call( this ); + + this.defines = { 'TOON': '' }; + + this.type = 'MeshToonMaterial'; + + this.gradientMap = null; + + this.setValues( parameters ); + + } + + MeshToonMaterial.prototype = Object.create( MeshPhongMaterial.prototype ); + MeshToonMaterial.prototype.constructor = MeshToonMaterial; + + MeshToonMaterial.prototype.isMeshToonMaterial = true; + + MeshToonMaterial.prototype.copy = function ( source ) { + + MeshPhongMaterial.prototype.copy.call( this, source ); + + this.gradientMap = source.gradientMap; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * opacity: <float>, + * + * bumpMap: new THREE.Texture( <Image> ), + * bumpScale: <float>, + * + * normalMap: new THREE.Texture( <Image> ), + * normalScale: <Vector2>, + * + * displacementMap: new THREE.Texture( <Image> ), + * displacementScale: <float>, + * displacementBias: <float>, + * + * wireframe: <boolean>, + * wireframeLinewidth: <float> + * + * skinning: <bool>, + * morphTargets: <bool>, + * morphNormals: <bool> + * } + */ + + function MeshNormalMaterial( parameters ) { + + Material.call( this, parameters ); + + this.type = 'MeshNormalMaterial'; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.fog = false; + this.lights = false; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + + } + + MeshNormalMaterial.prototype = Object.create( Material.prototype ); + MeshNormalMaterial.prototype.constructor = MeshNormalMaterial; + + MeshNormalMaterial.prototype.isMeshNormalMaterial = true; + + MeshNormalMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: <hex>, + * opacity: <float>, + * + * map: new THREE.Texture( <Image> ), + * + * lightMap: new THREE.Texture( <Image> ), + * lightMapIntensity: <float> + * + * aoMap: new THREE.Texture( <Image> ), + * aoMapIntensity: <float> + * + * emissive: <hex>, + * emissiveIntensity: <float> + * emissiveMap: new THREE.Texture( <Image> ), + * + * specularMap: new THREE.Texture( <Image> ), + * + * alphaMap: new THREE.Texture( <Image> ), + * + * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: <float>, + * refractionRatio: <float>, + * + * wireframe: <boolean>, + * wireframeLinewidth: <float>, + * + * skinning: <bool>, + * morphTargets: <bool>, + * morphNormals: <bool> + * } + */ + + function MeshLambertMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshLambertMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + + } + + MeshLambertMaterial.prototype = Object.create( Material.prototype ); + MeshLambertMaterial.prototype.constructor = MeshLambertMaterial; + + MeshLambertMaterial.prototype.isMeshLambertMaterial = true; + + MeshLambertMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: <hex>, + * opacity: <float>, + * + * linewidth: <float>, + * + * scale: <float>, + * dashSize: <float>, + * gapSize: <float> + * } + */ + + function LineDashedMaterial( parameters ) { + + Material.call( this ); + + this.type = 'LineDashedMaterial'; + + this.color = new Color( 0xffffff ); + + this.linewidth = 1; + + this.scale = 1; + this.dashSize = 3; + this.gapSize = 1; + + this.lights = false; + + this.setValues( parameters ); + + } + + LineDashedMaterial.prototype = Object.create( Material.prototype ); + LineDashedMaterial.prototype.constructor = LineDashedMaterial; + + LineDashedMaterial.prototype.isLineDashedMaterial = true; + + LineDashedMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.linewidth = source.linewidth; + + this.scale = source.scale; + this.dashSize = source.dashSize; + this.gapSize = source.gapSize; + + return this; + + }; + + + + var Materials = Object.freeze({ + ShadowMaterial: ShadowMaterial, + SpriteMaterial: SpriteMaterial, + RawShaderMaterial: RawShaderMaterial, + ShaderMaterial: ShaderMaterial, + PointsMaterial: PointsMaterial, + MeshPhysicalMaterial: MeshPhysicalMaterial, + MeshStandardMaterial: MeshStandardMaterial, + MeshPhongMaterial: MeshPhongMaterial, + MeshToonMaterial: MeshToonMaterial, + MeshNormalMaterial: MeshNormalMaterial, + MeshLambertMaterial: MeshLambertMaterial, + MeshDepthMaterial: MeshDepthMaterial, + MeshBasicMaterial: MeshBasicMaterial, + LineDashedMaterial: LineDashedMaterial, + LineBasicMaterial: LineBasicMaterial, + Material: Material + }); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + var Cache = { + + enabled: false, + + files: {}, + + add: function ( key, file ) { + + if ( this.enabled === false ) return; + + // console.log( 'THREE.Cache', 'Adding key:', key ); + + this.files[ key ] = file; + + }, + + get: function ( key ) { + + if ( this.enabled === false ) return; + + // console.log( 'THREE.Cache', 'Checking key:', key ); + + return this.files[ key ]; + + }, + + remove: function ( key ) { + + delete this.files[ key ]; + + }, + + clear: function () { + + this.files = {}; + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function LoadingManager( onLoad, onProgress, onError ) { + + var scope = this; + + var isLoading = false, itemsLoaded = 0, itemsTotal = 0; + + this.onStart = undefined; + this.onLoad = onLoad; + this.onProgress = onProgress; + this.onError = onError; + + this.itemStart = function ( url ) { + + itemsTotal ++; + + if ( isLoading === false ) { + + if ( scope.onStart !== undefined ) { + + scope.onStart( url, itemsLoaded, itemsTotal ); + + } + + } + + isLoading = true; + + }; + + this.itemEnd = function ( url ) { + + itemsLoaded ++; + + if ( scope.onProgress !== undefined ) { + + scope.onProgress( url, itemsLoaded, itemsTotal ); + + } + + if ( itemsLoaded === itemsTotal ) { + + isLoading = false; + + if ( scope.onLoad !== undefined ) { + + scope.onLoad(); + + } + + } + + }; + + this.itemError = function ( url ) { + + if ( scope.onError !== undefined ) { + + scope.onError( url ); + + } + + }; + + } + + var DefaultLoadingManager = new LoadingManager(); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function FileLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( FileLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + if ( url === undefined ) url = ''; + + if ( this.path !== undefined ) url = this.path + url; + + var scope = this; + + var cached = Cache.get( url ); + + if ( cached !== undefined ) { + + scope.manager.itemStart( url ); + + setTimeout( function () { + + if ( onLoad ) onLoad( cached ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + return cached; + + } + + // Check for data: URI + var dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/; + var dataUriRegexResult = url.match( dataUriRegex ); + + // Safari can not handle Data URIs through XMLHttpRequest so process manually + if ( dataUriRegexResult ) { + + var mimeType = dataUriRegexResult[ 1 ]; + var isBase64 = !! dataUriRegexResult[ 2 ]; + var data = dataUriRegexResult[ 3 ]; + + data = window.decodeURIComponent( data ); + + if ( isBase64 ) data = window.atob( data ); + + try { + + var response; + var responseType = ( this.responseType || '' ).toLowerCase(); + + switch ( responseType ) { + + case 'arraybuffer': + case 'blob': + + response = new ArrayBuffer( data.length ); + + var view = new Uint8Array( response ); + + for ( var i = 0; i < data.length; i ++ ) { + + view[ i ] = data.charCodeAt( i ); + + } + + if ( responseType === 'blob' ) { + + response = new Blob( [ response ], { type: mimeType } ); + + } + + break; + + case 'document': + + var parser = new DOMParser(); + response = parser.parseFromString( data, mimeType ); + + break; + + case 'json': + + response = JSON.parse( data ); + + break; + + default: // 'text' or other + + response = data; + + break; + + } + + // Wait for next browser tick + window.setTimeout( function () { + + if ( onLoad ) onLoad( response ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + } catch ( error ) { + + // Wait for next browser tick + window.setTimeout( function () { + + if ( onError ) onError( error ); + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + }, 0 ); + + } + + } else { + + var request = new XMLHttpRequest(); + request.open( 'GET', url, true ); + + request.addEventListener( 'load', function ( event ) { + + var response = event.target.response; + + Cache.add( url, response ); + + if ( this.status === 200 ) { + + if ( onLoad ) onLoad( response ); + + scope.manager.itemEnd( url ); + + } else if ( this.status === 0 ) { + + // Some browsers return HTTP Status 0 when using non-http protocol + // e.g. 'file://' or 'data://'. Handle as success. + + console.warn( 'THREE.FileLoader: HTTP Status 0 received.' ); + + if ( onLoad ) onLoad( response ); + + scope.manager.itemEnd( url ); + + } else { + + if ( onError ) onError( event ); + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + } + + }, false ); + + if ( onProgress !== undefined ) { + + request.addEventListener( 'progress', function ( event ) { + + onProgress( event ); + + }, false ); + + } + + request.addEventListener( 'error', function ( event ) { + + if ( onError ) onError( event ); + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + }, false ); + + if ( this.responseType !== undefined ) request.responseType = this.responseType; + if ( this.withCredentials !== undefined ) request.withCredentials = this.withCredentials; + + if ( request.overrideMimeType ) request.overrideMimeType( this.mimeType !== undefined ? this.mimeType : 'text/plain' ); + + for ( var header in this.requestHeader ) { + + request.setRequestHeader( header, this.requestHeader[ header ] ); + + } + + request.send( null ); + + } + + scope.manager.itemStart( url ); + + return request; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + }, + + setResponseType: function ( value ) { + + this.responseType = value; + return this; + + }, + + setWithCredentials: function ( value ) { + + this.withCredentials = value; + return this; + + }, + + setMimeType: function ( value ) { + + this.mimeType = value; + return this; + + }, + + setRequestHeader: function ( value ) { + + this.requestHeader = value; + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * + * Abstract Base class to block based textures loader (dds, pvr, ...) + */ + + function CompressedTextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + // override in sub classes + this._parser = null; + + } + + Object.assign( CompressedTextureLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var images = []; + + var texture = new CompressedTexture(); + texture.image = images; + + var loader = new FileLoader( this.manager ); + loader.setPath( this.path ); + loader.setResponseType( 'arraybuffer' ); + + function loadTexture( i ) { + + loader.load( url[ i ], function ( buffer ) { + + var texDatas = scope._parser( buffer, true ); + + images[ i ] = { + width: texDatas.width, + height: texDatas.height, + format: texDatas.format, + mipmaps: texDatas.mipmaps + }; + + loaded += 1; + + if ( loaded === 6 ) { + + if ( texDatas.mipmapCount === 1 ) + texture.minFilter = LinearFilter; + + texture.format = texDatas.format; + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + } + + }, onProgress, onError ); + + } + + if ( Array.isArray( url ) ) { + + var loaded = 0; + + for ( var i = 0, il = url.length; i < il; ++ i ) { + + loadTexture( i ); + + } + + } else { + + // compressed cubemap texture stored in a single DDS file + + loader.load( url, function ( buffer ) { + + var texDatas = scope._parser( buffer, true ); + + if ( texDatas.isCubemap ) { + + var faces = texDatas.mipmaps.length / texDatas.mipmapCount; + + for ( var f = 0; f < faces; f ++ ) { + + images[ f ] = { mipmaps : [] }; + + for ( var i = 0; i < texDatas.mipmapCount; i ++ ) { + + images[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] ); + images[ f ].format = texDatas.format; + images[ f ].width = texDatas.width; + images[ f ].height = texDatas.height; + + } + + } + + } else { + + texture.image.width = texDatas.width; + texture.image.height = texDatas.height; + texture.mipmaps = texDatas.mipmaps; + + } + + if ( texDatas.mipmapCount === 1 ) { + + texture.minFilter = LinearFilter; + + } + + texture.format = texDatas.format; + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + }, onProgress, onError ); + + } + + return texture; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author Nikos M. / https://github.com/foo123/ + * + * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...) + */ + + function DataTextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + // override in sub classes + this._parser = null; + + } + + Object.assign( DataTextureLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var texture = new DataTexture(); + + var loader = new FileLoader( this.manager ); + loader.setResponseType( 'arraybuffer' ); + + loader.load( url, function ( buffer ) { + + var texData = scope._parser( buffer ); + + if ( ! texData ) return; + + if ( undefined !== texData.image ) { + + texture.image = texData.image; + + } else if ( undefined !== texData.data ) { + + texture.image.width = texData.width; + texture.image.height = texData.height; + texture.image.data = texData.data; + + } + + texture.wrapS = undefined !== texData.wrapS ? texData.wrapS : ClampToEdgeWrapping; + texture.wrapT = undefined !== texData.wrapT ? texData.wrapT : ClampToEdgeWrapping; + + texture.magFilter = undefined !== texData.magFilter ? texData.magFilter : LinearFilter; + texture.minFilter = undefined !== texData.minFilter ? texData.minFilter : LinearMipMapLinearFilter; + + texture.anisotropy = undefined !== texData.anisotropy ? texData.anisotropy : 1; + + if ( undefined !== texData.format ) { + + texture.format = texData.format; + + } + if ( undefined !== texData.type ) { + + texture.type = texData.type; + + } + + if ( undefined !== texData.mipmaps ) { + + texture.mipmaps = texData.mipmaps; + + } + + if ( 1 === texData.mipmapCount ) { + + texture.minFilter = LinearFilter; + + } + + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture, texData ); + + }, onProgress, onError ); + + + return texture; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function ImageLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( ImageLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + if ( url === undefined ) url = ''; + + if ( this.path !== undefined ) url = this.path + url; + + var scope = this; + + var cached = Cache.get( url ); + + if ( cached !== undefined ) { + + scope.manager.itemStart( url ); + + setTimeout( function () { + + if ( onLoad ) onLoad( cached ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + return cached; + + } + + var image = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'img' ); + + image.addEventListener( 'load', function () { + + Cache.add( url, this ); + + if ( onLoad ) onLoad( this ); + + scope.manager.itemEnd( url ); + + }, false ); + + /* + image.addEventListener( 'progress', function ( event ) { + + if ( onProgress ) onProgress( event ); + + }, false ); + */ + + image.addEventListener( 'error', function ( event ) { + + if ( onError ) onError( event ); + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + }, false ); + + if ( url.substr( 0, 5 ) !== 'data:' ) { + + if ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin; + + } + + scope.manager.itemStart( url ); + + image.src = url; + + return image; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + return this; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function CubeTextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( CubeTextureLoader.prototype, { + + load: function ( urls, onLoad, onProgress, onError ) { + + var texture = new CubeTexture(); + + var loader = new ImageLoader( this.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.setPath( this.path ); + + var loaded = 0; + + function loadTexture( i ) { + + loader.load( urls[ i ], function ( image ) { + + texture.images[ i ] = image; + + loaded ++; + + if ( loaded === 6 ) { + + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + } + + }, undefined, onError ); + + } + + for ( var i = 0; i < urls.length; ++ i ) { + + loadTexture( i ); + + } + + return texture; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + return this; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function TextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( TextureLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var loader = new ImageLoader( this.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.setPath( this.path ); + + var texture = new Texture(); + texture.image = loader.load( url, function () { + + // JPEGs can't have an alpha channel, so memory can be saved by storing them as RGB. + var isJPEG = url.search( /\.(jpg|jpeg)$/ ) > 0 || url.search( /^data\:image\/jpeg/ ) === 0; + + texture.format = isJPEG ? RGBFormat : RGBAFormat; + texture.needsUpdate = true; + + if ( onLoad !== undefined ) { + + onLoad( texture ); + + } + + }, onProgress, onError ); + + return texture; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + return this; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Light( color, intensity ) { + + Object3D.call( this ); + + this.type = 'Light'; + + this.color = new Color( color ); + this.intensity = intensity !== undefined ? intensity : 1; + + this.receiveShadow = undefined; + + } + + Light.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Light, + + isLight: true, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + this.intensity = source.intensity; + + return this; + + }, + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.color = this.color.getHex(); + data.object.intensity = this.intensity; + + if ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex(); + + if ( this.distance !== undefined ) data.object.distance = this.distance; + if ( this.angle !== undefined ) data.object.angle = this.angle; + if ( this.decay !== undefined ) data.object.decay = this.decay; + if ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra; + + if ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON(); + + return data; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function HemisphereLight( skyColor, groundColor, intensity ) { + + Light.call( this, skyColor, intensity ); + + this.type = 'HemisphereLight'; + + this.castShadow = undefined; + + this.position.copy( Object3D.DefaultUp ); + this.updateMatrix(); + + this.groundColor = new Color( groundColor ); + + } + + HemisphereLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: HemisphereLight, + + isHemisphereLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.groundColor.copy( source.groundColor ); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function LightShadow( camera ) { + + this.camera = camera; + + this.bias = 0; + this.radius = 1; + + this.mapSize = new Vector2( 512, 512 ); + + this.map = null; + this.matrix = new Matrix4(); + + } + + Object.assign( LightShadow.prototype, { + + copy: function ( source ) { + + this.camera = source.camera.clone(); + + this.bias = source.bias; + this.radius = source.radius; + + this.mapSize.copy( source.mapSize ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + toJSON: function () { + + var object = {}; + + if ( this.bias !== 0 ) object.bias = this.bias; + if ( this.radius !== 1 ) object.radius = this.radius; + if ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray(); + + object.camera = this.camera.toJSON( false ).object; + delete object.camera.matrix; + + return object; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function SpotLightShadow() { + + LightShadow.call( this, new PerspectiveCamera( 50, 1, 0.5, 500 ) ); + + } + + SpotLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), { + + constructor: SpotLightShadow, + + isSpotLightShadow: true, + + update: function ( light ) { + + var camera = this.camera; + + var fov = _Math.RAD2DEG * 2 * light.angle; + var aspect = this.mapSize.width / this.mapSize.height; + var far = light.distance || camera.far; + + if ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) { + + camera.fov = fov; + camera.aspect = aspect; + camera.far = far; + camera.updateProjectionMatrix(); + + } + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function SpotLight( color, intensity, distance, angle, penumbra, decay ) { + + Light.call( this, color, intensity ); + + this.type = 'SpotLight'; + + this.position.copy( Object3D.DefaultUp ); + this.updateMatrix(); + + this.target = new Object3D(); + + Object.defineProperty( this, 'power', { + get: function () { + // intensity = power per solid angle. + // ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf + return this.intensity * Math.PI; + }, + set: function ( power ) { + // intensity = power per solid angle. + // ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf + this.intensity = power / Math.PI; + } + } ); + + this.distance = ( distance !== undefined ) ? distance : 0; + this.angle = ( angle !== undefined ) ? angle : Math.PI / 3; + this.penumbra = ( penumbra !== undefined ) ? penumbra : 0; + this.decay = ( decay !== undefined ) ? decay : 1; // for physically correct lights, should be 2. + + this.shadow = new SpotLightShadow(); + + } + + SpotLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: SpotLight, + + isSpotLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.distance = source.distance; + this.angle = source.angle; + this.penumbra = source.penumbra; + this.decay = source.decay; + + this.target = source.target.clone(); + + this.shadow = source.shadow.clone(); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + + function PointLight( color, intensity, distance, decay ) { + + Light.call( this, color, intensity ); + + this.type = 'PointLight'; + + Object.defineProperty( this, 'power', { + get: function () { + // intensity = power per solid angle. + // ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf + return this.intensity * 4 * Math.PI; + + }, + set: function ( power ) { + // intensity = power per solid angle. + // ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf + this.intensity = power / ( 4 * Math.PI ); + } + } ); + + this.distance = ( distance !== undefined ) ? distance : 0; + this.decay = ( decay !== undefined ) ? decay : 1; // for physically correct lights, should be 2. + + this.shadow = new LightShadow( new PerspectiveCamera( 90, 1, 0.5, 500 ) ); + + } + + PointLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: PointLight, + + isPointLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.distance = source.distance; + this.decay = source.decay; + + this.shadow = source.shadow.clone(); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function DirectionalLightShadow( ) { + + LightShadow.call( this, new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) ); + + } + + DirectionalLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), { + + constructor: DirectionalLightShadow + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function DirectionalLight( color, intensity ) { + + Light.call( this, color, intensity ); + + this.type = 'DirectionalLight'; + + this.position.copy( Object3D.DefaultUp ); + this.updateMatrix(); + + this.target = new Object3D(); + + this.shadow = new DirectionalLightShadow(); + + } + + DirectionalLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: DirectionalLight, + + isDirectionalLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.target = source.target.clone(); + + this.shadow = source.shadow.clone(); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function AmbientLight( color, intensity ) { + + Light.call( this, color, intensity ); + + this.type = 'AmbientLight'; + + this.castShadow = undefined; + + } + + AmbientLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: AmbientLight, + + isAmbientLight: true + + } ); + + /** + * @author abelnation / http://github.com/abelnation + */ + + function RectAreaLight( color, intensity, width, height ) { + + Light.call( this, color, intensity ); + + this.type = 'RectAreaLight'; + + this.position.set( 0, 1, 0 ); + this.updateMatrix(); + + this.width = ( width !== undefined ) ? width : 10; + this.height = ( height !== undefined ) ? height : 10; + + // TODO (abelnation): distance/decay + + // TODO (abelnation): update method for RectAreaLight to update transform to lookat target + + // TODO (abelnation): shadows + + } + + // TODO (abelnation): RectAreaLight update when light shape is changed + RectAreaLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: RectAreaLight, + + isRectAreaLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.width = source.width; + this.height = source.height; + + return this; + + }, + + toJSON: function ( meta ) { + + var data = Light.prototype.toJSON.call( this, meta ); + + data.object.width = this.width; + data.object.height = this.height; + + return data; + + } + + } ); + + /** + * @author tschw + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + + var AnimationUtils = { + + // same as Array.prototype.slice, but also works on typed arrays + arraySlice: function ( array, from, to ) { + + if ( AnimationUtils.isTypedArray( array ) ) { + + // in ios9 array.subarray(from, undefined) will return empty array + // but array.subarray(from) or array.subarray(from, len) is correct + return new array.constructor( array.subarray( from, to !== undefined ? to : array.length ) ); + + } + + return array.slice( from, to ); + + }, + + // converts an array to a specific type + convertArray: function ( array, type, forceClone ) { + + if ( ! array || // let 'undefined' and 'null' pass + ! forceClone && array.constructor === type ) return array; + + if ( typeof type.BYTES_PER_ELEMENT === 'number' ) { + + return new type( array ); // create typed array + + } + + return Array.prototype.slice.call( array ); // create Array + + }, + + isTypedArray: function ( object ) { + + return ArrayBuffer.isView( object ) && + ! ( object instanceof DataView ); + + }, + + // returns an array by which times and values can be sorted + getKeyframeOrder: function ( times ) { + + function compareTime( i, j ) { + + return times[ i ] - times[ j ]; + + } + + var n = times.length; + var result = new Array( n ); + for ( var i = 0; i !== n; ++ i ) result[ i ] = i; + + result.sort( compareTime ); + + return result; + + }, + + // uses the array previously returned by 'getKeyframeOrder' to sort data + sortedArray: function ( values, stride, order ) { + + var nValues = values.length; + var result = new values.constructor( nValues ); + + for ( var i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) { + + var srcOffset = order[ i ] * stride; + + for ( var j = 0; j !== stride; ++ j ) { + + result[ dstOffset ++ ] = values[ srcOffset + j ]; + + } + + } + + return result; + + }, + + // function for parsing AOS keyframe formats + flattenJSON: function ( jsonKeys, times, values, valuePropertyName ) { + + var i = 1, key = jsonKeys[ 0 ]; + + while ( key !== undefined && key[ valuePropertyName ] === undefined ) { + + key = jsonKeys[ i ++ ]; + + } + + if ( key === undefined ) return; // no data + + var value = key[ valuePropertyName ]; + if ( value === undefined ) return; // no data + + if ( Array.isArray( value ) ) { + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + values.push.apply( values, value ); // push all elements + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } else if ( value.toArray !== undefined ) { + + // ...assume THREE.Math-ish + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + value.toArray( values, values.length ); + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } else { + + // otherwise push as-is + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + values.push( value ); + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } + + } + + }; + + /** + * Abstract base class of interpolants over parametric samples. + * + * The parameter domain is one dimensional, typically the time or a path + * along a curve defined by the data. + * + * The sample values can have any dimensionality and derived classes may + * apply special interpretations to the data. + * + * This class provides the interval seek in a Template Method, deferring + * the actual interpolation to derived classes. + * + * Time complexity is O(1) for linear access crossing at most two points + * and O(log N) for random access, where N is the number of positions. + * + * References: + * + * http://www.oodesign.com/template-method-pattern.html + * + * @author tschw + */ + + function Interpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + this.parameterPositions = parameterPositions; + this._cachedIndex = 0; + + this.resultBuffer = resultBuffer !== undefined ? + resultBuffer : new sampleValues.constructor( sampleSize ); + this.sampleValues = sampleValues; + this.valueSize = sampleSize; + + } + + Object.assign( Interpolant.prototype, { + + evaluate: function( t ) { + + var pp = this.parameterPositions, + i1 = this._cachedIndex, + + t1 = pp[ i1 ], + t0 = pp[ i1 - 1 ]; + + validate_interval: { + + seek: { + + var right; + + linear_scan: { + //- See http://jsperf.com/comparison-to-undefined/3 + //- slower code: + //- + //- if ( t >= t1 || t1 === undefined ) { + forward_scan: if ( ! ( t < t1 ) ) { + + for ( var giveUpAt = i1 + 2; ;) { + + if ( t1 === undefined ) { + + if ( t < t0 ) break forward_scan; + + // after end + + i1 = pp.length; + this._cachedIndex = i1; + return this.afterEnd_( i1 - 1, t, t0 ); + + } + + if ( i1 === giveUpAt ) break; // this loop + + t0 = t1; + t1 = pp[ ++ i1 ]; + + if ( t < t1 ) { + + // we have arrived at the sought interval + break seek; + + } + + } + + // prepare binary search on the right side of the index + right = pp.length; + break linear_scan; + + } + + //- slower code: + //- if ( t < t0 || t0 === undefined ) { + if ( ! ( t >= t0 ) ) { + + // looping? + + var t1global = pp[ 1 ]; + + if ( t < t1global ) { + + i1 = 2; // + 1, using the scan for the details + t0 = t1global; + + } + + // linear reverse scan + + for ( var giveUpAt = i1 - 2; ;) { + + if ( t0 === undefined ) { + + // before start + + this._cachedIndex = 0; + return this.beforeStart_( 0, t, t1 ); + + } + + if ( i1 === giveUpAt ) break; // this loop + + t1 = t0; + t0 = pp[ -- i1 - 1 ]; + + if ( t >= t0 ) { + + // we have arrived at the sought interval + break seek; + + } + + } + + // prepare binary search on the left side of the index + right = i1; + i1 = 0; + break linear_scan; + + } + + // the interval is valid + + break validate_interval; + + } // linear scan + + // binary search + + while ( i1 < right ) { + + var mid = ( i1 + right ) >>> 1; + + if ( t < pp[ mid ] ) { + + right = mid; + + } else { + + i1 = mid + 1; + + } + + } + + t1 = pp[ i1 ]; + t0 = pp[ i1 - 1 ]; + + // check boundary cases, again + + if ( t0 === undefined ) { + + this._cachedIndex = 0; + return this.beforeStart_( 0, t, t1 ); + + } + + if ( t1 === undefined ) { + + i1 = pp.length; + this._cachedIndex = i1; + return this.afterEnd_( i1 - 1, t0, t ); + + } + + } // seek + + this._cachedIndex = i1; + + this.intervalChanged_( i1, t0, t1 ); + + } // validate_interval + + return this.interpolate_( i1, t0, t, t1 ); + + }, + + settings: null, // optional, subclass-specific settings structure + // Note: The indirection allows central control of many interpolants. + + // --- Protected interface + + DefaultSettings_: {}, + + getSettings_: function() { + + return this.settings || this.DefaultSettings_; + + }, + + copySampleValue_: function( index ) { + + // copies a sample value to the result buffer + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + offset = index * stride; + + for ( var i = 0; i !== stride; ++ i ) { + + result[ i ] = values[ offset + i ]; + + } + + return result; + + }, + + // Template methods for derived classes: + + interpolate_: function( i1, t0, t, t1 ) { + + throw new Error( "call to abstract method" ); + // implementations shall return this.resultBuffer + + }, + + intervalChanged_: function( i1, t0, t1 ) { + + // empty + + } + + } ); + + //!\ DECLARE ALIAS AFTER assign prototype ! + Object.assign( Interpolant.prototype, { + + //( 0, t, t0 ), returns this.resultBuffer + beforeStart_: Interpolant.prototype.copySampleValue_, + + //( N-1, tN-1, t ), returns this.resultBuffer + afterEnd_: Interpolant.prototype.copySampleValue_, + + } ); + + /** + * Fast and simple cubic spline interpolant. + * + * It was derived from a Hermitian construction setting the first derivative + * at each sample position to the linear slope between neighboring positions + * over their parameter interval. + * + * @author tschw + */ + + function CubicInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( + this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + this._weightPrev = -0; + this._offsetPrev = -0; + this._weightNext = -0; + this._offsetNext = -0; + + } + + CubicInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), { + + constructor: CubicInterpolant, + + DefaultSettings_: { + + endingStart: ZeroCurvatureEnding, + endingEnd: ZeroCurvatureEnding + + }, + + intervalChanged_: function( i1, t0, t1 ) { + + var pp = this.parameterPositions, + iPrev = i1 - 2, + iNext = i1 + 1, + + tPrev = pp[ iPrev ], + tNext = pp[ iNext ]; + + if ( tPrev === undefined ) { + + switch ( this.getSettings_().endingStart ) { + + case ZeroSlopeEnding: + + // f'(t0) = 0 + iPrev = i1; + tPrev = 2 * t0 - t1; + + break; + + case WrapAroundEnding: + + // use the other end of the curve + iPrev = pp.length - 2; + tPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ]; + + break; + + default: // ZeroCurvatureEnding + + // f''(t0) = 0 a.k.a. Natural Spline + iPrev = i1; + tPrev = t1; + + } + + } + + if ( tNext === undefined ) { + + switch ( this.getSettings_().endingEnd ) { + + case ZeroSlopeEnding: + + // f'(tN) = 0 + iNext = i1; + tNext = 2 * t1 - t0; + + break; + + case WrapAroundEnding: + + // use the other end of the curve + iNext = 1; + tNext = t1 + pp[ 1 ] - pp[ 0 ]; + + break; + + default: // ZeroCurvatureEnding + + // f''(tN) = 0, a.k.a. Natural Spline + iNext = i1 - 1; + tNext = t0; + + } + + } + + var halfDt = ( t1 - t0 ) * 0.5, + stride = this.valueSize; + + this._weightPrev = halfDt / ( t0 - tPrev ); + this._weightNext = halfDt / ( tNext - t1 ); + this._offsetPrev = iPrev * stride; + this._offsetNext = iNext * stride; + + }, + + interpolate_: function( i1, t0, t, t1 ) { + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + o1 = i1 * stride, o0 = o1 - stride, + oP = this._offsetPrev, oN = this._offsetNext, + wP = this._weightPrev, wN = this._weightNext, + + p = ( t - t0 ) / ( t1 - t0 ), + pp = p * p, + ppp = pp * p; + + // evaluate polynomials + + var sP = - wP * ppp + 2 * wP * pp - wP * p; + var s0 = ( 1 + wP ) * ppp + (-1.5 - 2 * wP ) * pp + ( -0.5 + wP ) * p + 1; + var s1 = (-1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p; + var sN = wN * ppp - wN * pp; + + // combine data linearly + + for ( var i = 0; i !== stride; ++ i ) { + + result[ i ] = + sP * values[ oP + i ] + + s0 * values[ o0 + i ] + + s1 * values[ o1 + i ] + + sN * values[ oN + i ]; + + } + + return result; + + } + + } ); + + /** + * @author tschw + */ + + function LinearInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + LinearInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), { + + constructor: LinearInterpolant, + + interpolate_: function( i1, t0, t, t1 ) { + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + offset1 = i1 * stride, + offset0 = offset1 - stride, + + weight1 = ( t - t0 ) / ( t1 - t0 ), + weight0 = 1 - weight1; + + for ( var i = 0; i !== stride; ++ i ) { + + result[ i ] = + values[ offset0 + i ] * weight0 + + values[ offset1 + i ] * weight1; + + } + + return result; + + } + + } ); + + /** + * + * Interpolant that evaluates to the sample value at the position preceeding + * the parameter. + * + * @author tschw + */ + + function DiscreteInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + DiscreteInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), { + + constructor: DiscreteInterpolant, + + interpolate_: function( i1, t0, t, t1 ) { + + return this.copySampleValue_( i1 - 1 ); + + } + + } ); + + var KeyframeTrackPrototype; + + KeyframeTrackPrototype = { + + TimeBufferType: Float32Array, + ValueBufferType: Float32Array, + + DefaultInterpolation: InterpolateLinear, + + InterpolantFactoryMethodDiscrete: function ( result ) { + + return new DiscreteInterpolant( + this.times, this.values, this.getValueSize(), result ); + + }, + + InterpolantFactoryMethodLinear: function ( result ) { + + return new LinearInterpolant( + this.times, this.values, this.getValueSize(), result ); + + }, + + InterpolantFactoryMethodSmooth: function ( result ) { + + return new CubicInterpolant( + this.times, this.values, this.getValueSize(), result ); + + }, + + setInterpolation: function ( interpolation ) { + + var factoryMethod; + + switch ( interpolation ) { + + case InterpolateDiscrete: + + factoryMethod = this.InterpolantFactoryMethodDiscrete; + + break; + + case InterpolateLinear: + + factoryMethod = this.InterpolantFactoryMethodLinear; + + break; + + case InterpolateSmooth: + + factoryMethod = this.InterpolantFactoryMethodSmooth; + + break; + + } + + if ( factoryMethod === undefined ) { + + var message = "unsupported interpolation for " + + this.ValueTypeName + " keyframe track named " + this.name; + + if ( this.createInterpolant === undefined ) { + + // fall back to default, unless the default itself is messed up + if ( interpolation !== this.DefaultInterpolation ) { + + this.setInterpolation( this.DefaultInterpolation ); + + } else { + + throw new Error( message ); // fatal, in this case + + } + + } + + console.warn( message ); + return; + + } + + this.createInterpolant = factoryMethod; + + }, + + getInterpolation: function () { + + switch ( this.createInterpolant ) { + + case this.InterpolantFactoryMethodDiscrete: + + return InterpolateDiscrete; + + case this.InterpolantFactoryMethodLinear: + + return InterpolateLinear; + + case this.InterpolantFactoryMethodSmooth: + + return InterpolateSmooth; + + } + + }, + + getValueSize: function () { + + return this.values.length / this.times.length; + + }, + + // move all keyframes either forwards or backwards in time + shift: function ( timeOffset ) { + + if ( timeOffset !== 0.0 ) { + + var times = this.times; + + for ( var i = 0, n = times.length; i !== n; ++ i ) { + + times[ i ] += timeOffset; + + } + + } + + return this; + + }, + + // scale all keyframe times by a factor (useful for frame <-> seconds conversions) + scale: function ( timeScale ) { + + if ( timeScale !== 1.0 ) { + + var times = this.times; + + for ( var i = 0, n = times.length; i !== n; ++ i ) { + + times[ i ] *= timeScale; + + } + + } + + return this; + + }, + + // removes keyframes before and after animation without changing any values within the range [startTime, endTime]. + // IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values + trim: function ( startTime, endTime ) { + + var times = this.times, + nKeys = times.length, + from = 0, + to = nKeys - 1; + + while ( from !== nKeys && times[ from ] < startTime ) ++ from; + while ( to !== - 1 && times[ to ] > endTime ) -- to; + + ++ to; // inclusive -> exclusive bound + + if ( from !== 0 || to !== nKeys ) { + + // empty tracks are forbidden, so keep at least one keyframe + if ( from >= to ) to = Math.max( to, 1 ), from = to - 1; + + var stride = this.getValueSize(); + this.times = AnimationUtils.arraySlice( times, from, to ); + this.values = AnimationUtils. + arraySlice( this.values, from * stride, to * stride ); + + } + + return this; + + }, + + // ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable + validate: function () { + + var valid = true; + + var valueSize = this.getValueSize(); + if ( valueSize - Math.floor( valueSize ) !== 0 ) { + + console.error( "invalid value size in track", this ); + valid = false; + + } + + var times = this.times, + values = this.values, + + nKeys = times.length; + + if ( nKeys === 0 ) { + + console.error( "track is empty", this ); + valid = false; + + } + + var prevTime = null; + + for ( var i = 0; i !== nKeys; i ++ ) { + + var currTime = times[ i ]; + + if ( typeof currTime === 'number' && isNaN( currTime ) ) { + + console.error( "time is not a valid number", this, i, currTime ); + valid = false; + break; + + } + + if ( prevTime !== null && prevTime > currTime ) { + + console.error( "out of order keys", this, i, currTime, prevTime ); + valid = false; + break; + + } + + prevTime = currTime; + + } + + if ( values !== undefined ) { + + if ( AnimationUtils.isTypedArray( values ) ) { + + for ( var i = 0, n = values.length; i !== n; ++ i ) { + + var value = values[ i ]; + + if ( isNaN( value ) ) { + + console.error( "value is not a valid number", this, i, value ); + valid = false; + break; + + } + + } + + } + + } + + return valid; + + }, + + // removes equivalent sequential keys as common in morph target sequences + // (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0) + optimize: function () { + + var times = this.times, + values = this.values, + stride = this.getValueSize(), + + smoothInterpolation = this.getInterpolation() === InterpolateSmooth, + + writeIndex = 1, + lastIndex = times.length - 1; + + for ( var i = 1; i < lastIndex; ++ i ) { + + var keep = false; + + var time = times[ i ]; + var timeNext = times[ i + 1 ]; + + // remove adjacent keyframes scheduled at the same time + + if ( time !== timeNext && ( i !== 1 || time !== time[ 0 ] ) ) { + + if ( ! smoothInterpolation ) { + + // remove unnecessary keyframes same as their neighbors + + var offset = i * stride, + offsetP = offset - stride, + offsetN = offset + stride; + + for ( var j = 0; j !== stride; ++ j ) { + + var value = values[ offset + j ]; + + if ( value !== values[ offsetP + j ] || + value !== values[ offsetN + j ] ) { + + keep = true; + break; + + } + + } + + } else keep = true; + + } + + // in-place compaction + + if ( keep ) { + + if ( i !== writeIndex ) { + + times[ writeIndex ] = times[ i ]; + + var readOffset = i * stride, + writeOffset = writeIndex * stride; + + for ( var j = 0; j !== stride; ++ j ) + + values[ writeOffset + j ] = values[ readOffset + j ]; + + } + + ++ writeIndex; + + } + + } + + // flush last keyframe (compaction looks ahead) + + if ( lastIndex > 0 ) { + + times[ writeIndex ] = times[ lastIndex ]; + + for ( var readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j ) + + values[ writeOffset + j ] = values[ readOffset + j ]; + + ++ writeIndex; + + } + + if ( writeIndex !== times.length ) { + + this.times = AnimationUtils.arraySlice( times, 0, writeIndex ); + this.values = AnimationUtils.arraySlice( values, 0, writeIndex * stride ); + + } + + return this; + + } + + }; + + function KeyframeTrackConstructor( name, times, values, interpolation ) { + + if ( name === undefined ) throw new Error( "track name is undefined" ); + + if ( times === undefined || times.length === 0 ) { + + throw new Error( "no keyframes in track named " + name ); + + } + + this.name = name; + + this.times = AnimationUtils.convertArray( times, this.TimeBufferType ); + this.values = AnimationUtils.convertArray( values, this.ValueBufferType ); + + this.setInterpolation( interpolation || this.DefaultInterpolation ); + + this.validate(); + this.optimize(); + + } + + /** + * + * A Track of vectored keyframe values. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function VectorKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrackConstructor.call( this, name, times, values, interpolation ); + + } + + VectorKeyframeTrack.prototype = + Object.assign( Object.create( KeyframeTrackPrototype ), { + + constructor: VectorKeyframeTrack, + + ValueTypeName: 'vector' + + // ValueBufferType is inherited + + // DefaultInterpolation is inherited + + } ); + + /** + * Spherical linear unit quaternion interpolant. + * + * @author tschw + */ + + function QuaternionLinearInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + QuaternionLinearInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), { + + constructor: QuaternionLinearInterpolant, + + interpolate_: function( i1, t0, t, t1 ) { + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + offset = i1 * stride, + + alpha = ( t - t0 ) / ( t1 - t0 ); + + for ( var end = offset + stride; offset !== end; offset += 4 ) { + + Quaternion.slerpFlat( result, 0, + values, offset - stride, values, offset, alpha ); + + } + + return result; + + } + + } ); + + /** + * + * A Track of quaternion keyframe values. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function QuaternionKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrackConstructor.call( this, name, times, values, interpolation ); + + } + + QuaternionKeyframeTrack.prototype = + Object.assign( Object.create( KeyframeTrackPrototype ), { + + constructor: QuaternionKeyframeTrack, + + ValueTypeName: 'quaternion', + + // ValueBufferType is inherited + + DefaultInterpolation: InterpolateLinear, + + InterpolantFactoryMethodLinear: function( result ) { + + return new QuaternionLinearInterpolant( + this.times, this.values, this.getValueSize(), result ); + + }, + + InterpolantFactoryMethodSmooth: undefined // not yet implemented + + } ); + + /** + * + * A Track of numeric keyframe values. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function NumberKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrackConstructor.call( this, name, times, values, interpolation ); + + } + + NumberKeyframeTrack.prototype = + Object.assign( Object.create( KeyframeTrackPrototype ), { + + constructor: NumberKeyframeTrack, + + ValueTypeName: 'number' + + // ValueBufferType is inherited + + // DefaultInterpolation is inherited + + } ); + + /** + * + * A Track that interpolates Strings + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function StringKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrackConstructor.call( this, name, times, values, interpolation ); + + } + + StringKeyframeTrack.prototype = + Object.assign( Object.create( KeyframeTrackPrototype ), { + + constructor: StringKeyframeTrack, + + ValueTypeName: 'string', + ValueBufferType: Array, + + DefaultInterpolation: InterpolateDiscrete, + + InterpolantFactoryMethodLinear: undefined, + + InterpolantFactoryMethodSmooth: undefined + + } ); + + /** + * + * A Track of Boolean keyframe values. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function BooleanKeyframeTrack( name, times, values ) { + + KeyframeTrackConstructor.call( this, name, times, values ); + + } + + BooleanKeyframeTrack.prototype = + Object.assign( Object.create( KeyframeTrackPrototype ), { + + constructor: BooleanKeyframeTrack, + + ValueTypeName: 'bool', + ValueBufferType: Array, + + DefaultInterpolation: InterpolateDiscrete, + + InterpolantFactoryMethodLinear: undefined, + InterpolantFactoryMethodSmooth: undefined + + // Note: Actually this track could have a optimized / compressed + // representation of a single value and a custom interpolant that + // computes "firstValue ^ isOdd( index )". + + } ); + + /** + * + * A Track of keyframe values that represent color. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function ColorKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrackConstructor.call( this, name, times, values, interpolation ); + + } + + ColorKeyframeTrack.prototype = + Object.assign( Object.create( KeyframeTrackPrototype ), { + + constructor: ColorKeyframeTrack, + + ValueTypeName: 'color' + + // ValueBufferType is inherited + + // DefaultInterpolation is inherited + + + // Note: Very basic implementation and nothing special yet. + // However, this is the place for color space parameterization. + + } ); + + /** + * + * A timed sequence of keyframes for a specific property. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function KeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrackConstructor.apply( this, arguments ); + + } + + KeyframeTrack.prototype = KeyframeTrackPrototype; + KeyframeTrackPrototype.constructor = KeyframeTrack; + + // Static methods: + + Object.assign( KeyframeTrack, { + + // Serialization (in static context, because of constructor invocation + // and automatic invocation of .toJSON): + + parse: function( json ) { + + if( json.type === undefined ) { + + throw new Error( "track type undefined, can not parse" ); + + } + + var trackType = KeyframeTrack._getTrackTypeForValueTypeName( json.type ); + + if ( json.times === undefined ) { + + var times = [], values = []; + + AnimationUtils.flattenJSON( json.keys, times, values, 'value' ); + + json.times = times; + json.values = values; + + } + + // derived classes can define a static parse method + if ( trackType.parse !== undefined ) { + + return trackType.parse( json ); + + } else { + + // by default, we asssume a constructor compatible with the base + return new trackType( + json.name, json.times, json.values, json.interpolation ); + + } + + }, + + toJSON: function( track ) { + + var trackType = track.constructor; + + var json; + + // derived classes can define a static toJSON method + if ( trackType.toJSON !== undefined ) { + + json = trackType.toJSON( track ); + + } else { + + // by default, we assume the data can be serialized as-is + json = { + + 'name': track.name, + 'times': AnimationUtils.convertArray( track.times, Array ), + 'values': AnimationUtils.convertArray( track.values, Array ) + + }; + + var interpolation = track.getInterpolation(); + + if ( interpolation !== track.DefaultInterpolation ) { + + json.interpolation = interpolation; + + } + + } + + json.type = track.ValueTypeName; // mandatory + + return json; + + }, + + _getTrackTypeForValueTypeName: function( typeName ) { + + switch( typeName.toLowerCase() ) { + + case "scalar": + case "double": + case "float": + case "number": + case "integer": + + return NumberKeyframeTrack; + + case "vector": + case "vector2": + case "vector3": + case "vector4": + + return VectorKeyframeTrack; + + case "color": + + return ColorKeyframeTrack; + + case "quaternion": + + return QuaternionKeyframeTrack; + + case "bool": + case "boolean": + + return BooleanKeyframeTrack; + + case "string": + + return StringKeyframeTrack; + + } + + throw new Error( "Unsupported typeName: " + typeName ); + + } + + } ); + + /** + * + * Reusable set of Tracks that represent an animation. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + + function AnimationClip( name, duration, tracks ) { + + this.name = name; + this.tracks = tracks; + this.duration = ( duration !== undefined ) ? duration : - 1; + + this.uuid = _Math.generateUUID(); + + // this means it should figure out its duration by scanning the tracks + if ( this.duration < 0 ) { + + this.resetDuration(); + + } + + this.optimize(); + + } + + Object.assign( AnimationClip, { + + parse: function ( json ) { + + var tracks = [], + jsonTracks = json.tracks, + frameTime = 1.0 / ( json.fps || 1.0 ); + + for ( var i = 0, n = jsonTracks.length; i !== n; ++ i ) { + + tracks.push( KeyframeTrack.parse( jsonTracks[ i ] ).scale( frameTime ) ); + + } + + return new AnimationClip( json.name, json.duration, tracks ); + + }, + + toJSON: function ( clip ) { + + var tracks = [], + clipTracks = clip.tracks; + + var json = { + + 'name': clip.name, + 'duration': clip.duration, + 'tracks': tracks + + }; + + for ( var i = 0, n = clipTracks.length; i !== n; ++ i ) { + + tracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) ); + + } + + return json; + + }, + + CreateFromMorphTargetSequence: function ( name, morphTargetSequence, fps, noLoop ) { + + var numMorphTargets = morphTargetSequence.length; + var tracks = []; + + for ( var i = 0; i < numMorphTargets; i ++ ) { + + var times = []; + var values = []; + + times.push( + ( i + numMorphTargets - 1 ) % numMorphTargets, + i, + ( i + 1 ) % numMorphTargets ); + + values.push( 0, 1, 0 ); + + var order = AnimationUtils.getKeyframeOrder( times ); + times = AnimationUtils.sortedArray( times, 1, order ); + values = AnimationUtils.sortedArray( values, 1, order ); + + // if there is a key at the first frame, duplicate it as the + // last frame as well for perfect loop. + if ( ! noLoop && times[ 0 ] === 0 ) { + + times.push( numMorphTargets ); + values.push( values[ 0 ] ); + + } + + tracks.push( + new NumberKeyframeTrack( + '.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']', + times, values + ).scale( 1.0 / fps ) ); + + } + + return new AnimationClip( name, - 1, tracks ); + + }, + + findByName: function ( objectOrClipArray, name ) { + + var clipArray = objectOrClipArray; + + if ( ! Array.isArray( objectOrClipArray ) ) { + + var o = objectOrClipArray; + clipArray = o.geometry && o.geometry.animations || o.animations; + + } + + for ( var i = 0; i < clipArray.length; i ++ ) { + + if ( clipArray[ i ].name === name ) { + + return clipArray[ i ]; + + } + + } + + return null; + + }, + + CreateClipsFromMorphTargetSequences: function ( morphTargets, fps, noLoop ) { + + var animationToMorphTargets = {}; + + // tested with https://regex101.com/ on trick sequences + // such flamingo_flyA_003, flamingo_run1_003, crdeath0059 + var pattern = /^([\w-]*?)([\d]+)$/; + + // sort morph target names into animation groups based + // patterns like Walk_001, Walk_002, Run_001, Run_002 + for ( var i = 0, il = morphTargets.length; i < il; i ++ ) { + + var morphTarget = morphTargets[ i ]; + var parts = morphTarget.name.match( pattern ); + + if ( parts && parts.length > 1 ) { + + var name = parts[ 1 ]; + + var animationMorphTargets = animationToMorphTargets[ name ]; + if ( ! animationMorphTargets ) { + + animationToMorphTargets[ name ] = animationMorphTargets = []; + + } + + animationMorphTargets.push( morphTarget ); + + } + + } + + var clips = []; + + for ( var name in animationToMorphTargets ) { + + clips.push( AnimationClip.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) ); + + } + + return clips; + + }, + + // parse the animation.hierarchy format + parseAnimation: function ( animation, bones ) { + + if ( ! animation ) { + + console.error( " no animation in JSONLoader data" ); + return null; + + } + + var addNonemptyTrack = function ( trackType, trackName, animationKeys, propertyName, destTracks ) { + + // only return track if there are actually keys. + if ( animationKeys.length !== 0 ) { + + var times = []; + var values = []; + + AnimationUtils.flattenJSON( animationKeys, times, values, propertyName ); + + // empty keys are filtered out, so check again + if ( times.length !== 0 ) { + + destTracks.push( new trackType( trackName, times, values ) ); + + } + + } + + }; + + var tracks = []; + + var clipName = animation.name || 'default'; + // automatic length determination in AnimationClip. + var duration = animation.length || - 1; + var fps = animation.fps || 30; + + var hierarchyTracks = animation.hierarchy || []; + + for ( var h = 0; h < hierarchyTracks.length; h ++ ) { + + var animationKeys = hierarchyTracks[ h ].keys; + + // skip empty tracks + if ( ! animationKeys || animationKeys.length === 0 ) continue; + + // process morph targets in a way exactly compatible + // with AnimationHandler.init( animation ) + if ( animationKeys[ 0 ].morphTargets ) { + + // figure out all morph targets used in this track + var morphTargetNames = {}; + + for ( var k = 0; k < animationKeys.length; k ++ ) { + + if ( animationKeys[ k ].morphTargets ) { + + for ( var m = 0; m < animationKeys[ k ].morphTargets.length; m ++ ) { + + morphTargetNames[ animationKeys[ k ].morphTargets[ m ] ] = - 1; + + } + + } + + } + + // create a track for each morph target with all zero + // morphTargetInfluences except for the keys in which + // the morphTarget is named. + for ( var morphTargetName in morphTargetNames ) { + + var times = []; + var values = []; + + for ( var m = 0; m !== animationKeys[ k ].morphTargets.length; ++ m ) { + + var animationKey = animationKeys[ k ]; + + times.push( animationKey.time ); + values.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 ); + + } + + tracks.push( new NumberKeyframeTrack( '.morphTargetInfluence[' + morphTargetName + ']', times, values ) ); + + } + + duration = morphTargetNames.length * ( fps || 1.0 ); + + } else { + + // ...assume skeletal animation + + var boneName = '.bones[' + bones[ h ].name + ']'; + + addNonemptyTrack( + VectorKeyframeTrack, boneName + '.position', + animationKeys, 'pos', tracks ); + + addNonemptyTrack( + QuaternionKeyframeTrack, boneName + '.quaternion', + animationKeys, 'rot', tracks ); + + addNonemptyTrack( + VectorKeyframeTrack, boneName + '.scale', + animationKeys, 'scl', tracks ); + + } + + } + + if ( tracks.length === 0 ) { + + return null; + + } + + var clip = new AnimationClip( clipName, duration, tracks ); + + return clip; + + } + + } ); + + Object.assign( AnimationClip.prototype, { + + resetDuration: function () { + + var tracks = this.tracks, duration = 0; + + for ( var i = 0, n = tracks.length; i !== n; ++ i ) { + + var track = this.tracks[ i ]; + + duration = Math.max( duration, track.times[ track.times.length - 1 ] ); + + } + + this.duration = duration; + + }, + + trim: function () { + + for ( var i = 0; i < this.tracks.length; i ++ ) { + + this.tracks[ i ].trim( 0, this.duration ); + + } + + return this; + + }, + + optimize: function () { + + for ( var i = 0; i < this.tracks.length; i ++ ) { + + this.tracks[ i ].optimize(); + + } + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function MaterialLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + this.textures = {}; + + } + + Object.assign( MaterialLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new FileLoader( scope.manager ); + loader.setResponseType( 'json' ); + loader.load( url, function ( json ) { + + onLoad( scope.parse( json ) ); + + }, onProgress, onError ); + + }, + + setTextures: function ( value ) { + + this.textures = value; + + }, + + parse: function ( json ) { + + var textures = this.textures; + + function getTexture( name ) { + + if ( textures[ name ] === undefined ) { + + console.warn( 'THREE.MaterialLoader: Undefined texture', name ); + + } + + return textures[ name ]; + + } + + var material = new Materials[ json.type ](); + + if ( json.uuid !== undefined ) material.uuid = json.uuid; + if ( json.name !== undefined ) material.name = json.name; + if ( json.color !== undefined ) material.color.setHex( json.color ); + if ( json.roughness !== undefined ) material.roughness = json.roughness; + if ( json.metalness !== undefined ) material.metalness = json.metalness; + if ( json.emissive !== undefined ) material.emissive.setHex( json.emissive ); + if ( json.specular !== undefined ) material.specular.setHex( json.specular ); + if ( json.shininess !== undefined ) material.shininess = json.shininess; + if ( json.clearCoat !== undefined ) material.clearCoat = json.clearCoat; + if ( json.clearCoatRoughness !== undefined ) material.clearCoatRoughness = json.clearCoatRoughness; + if ( json.uniforms !== undefined ) material.uniforms = json.uniforms; + if ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader; + if ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader; + if ( json.vertexColors !== undefined ) material.vertexColors = json.vertexColors; + if ( json.fog !== undefined ) material.fog = json.fog; + if ( json.shading !== undefined ) material.shading = json.shading; + if ( json.blending !== undefined ) material.blending = json.blending; + if ( json.side !== undefined ) material.side = json.side; + if ( json.opacity !== undefined ) material.opacity = json.opacity; + if ( json.transparent !== undefined ) material.transparent = json.transparent; + if ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest; + if ( json.depthTest !== undefined ) material.depthTest = json.depthTest; + if ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite; + if ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite; + if ( json.wireframe !== undefined ) material.wireframe = json.wireframe; + if ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth; + if ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap; + if ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin; + if ( json.skinning !== undefined ) material.skinning = json.skinning; + if ( json.morphTargets !== undefined ) material.morphTargets = json.morphTargets; + + // for PointsMaterial + + if ( json.size !== undefined ) material.size = json.size; + if ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation; + + // maps + + if ( json.map !== undefined ) material.map = getTexture( json.map ); + + if ( json.alphaMap !== undefined ) { + + material.alphaMap = getTexture( json.alphaMap ); + material.transparent = true; + + } + + if ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap ); + if ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale; + + if ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap ); + if ( json.normalScale !== undefined ) { + + var normalScale = json.normalScale; + + if ( Array.isArray( normalScale ) === false ) { + + // Blender exporter used to export a scalar. See #7459 + + normalScale = [ normalScale, normalScale ]; + + } + + material.normalScale = new Vector2().fromArray( normalScale ); + + } + + if ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap ); + if ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale; + if ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias; + + if ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap ); + if ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap ); + + if ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap ); + if ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity; + + if ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap ); + + if ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap ); + + if ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity; + + if ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap ); + if ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity; + + if ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap ); + if ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity; + + if ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap ); + + return material; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function BufferGeometryLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( BufferGeometryLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new FileLoader( scope.manager ); + loader.setResponseType( 'json' ); + loader.load( url, function ( json ) { + + onLoad( scope.parse( json ) ); + + }, onProgress, onError ); + + }, + + parse: function ( json ) { + + var geometry = new BufferGeometry(); + + var index = json.data.index; + + if ( index !== undefined ) { + + var typedArray = new TYPED_ARRAYS[ index.type ]( index.array ); + geometry.setIndex( new BufferAttribute( typedArray, 1 ) ); + + } + + var attributes = json.data.attributes; + + for ( var key in attributes ) { + + var attribute = attributes[ key ]; + var typedArray = new TYPED_ARRAYS[ attribute.type ]( attribute.array ); + + geometry.addAttribute( key, new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized ) ); + + } + + var groups = json.data.groups || json.data.drawcalls || json.data.offsets; + + if ( groups !== undefined ) { + + for ( var i = 0, n = groups.length; i !== n; ++ i ) { + + var group = groups[ i ]; + + geometry.addGroup( group.start, group.count, group.materialIndex ); + + } + + } + + var boundingSphere = json.data.boundingSphere; + + if ( boundingSphere !== undefined ) { + + var center = new Vector3(); + + if ( boundingSphere.center !== undefined ) { + + center.fromArray( boundingSphere.center ); + + } + + geometry.boundingSphere = new Sphere( center, boundingSphere.radius ); + + } + + return geometry; + + } + + } ); + + var TYPED_ARRAYS = { + Int8Array: Int8Array, + Uint8Array: Uint8Array, + Uint8ClampedArray: Uint8ClampedArray, + Int16Array: Int16Array, + Uint16Array: Uint16Array, + Int32Array: Int32Array, + Uint32Array: Uint32Array, + Float32Array: Float32Array, + Float64Array: Float64Array + }; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function Loader() { + + this.onLoadStart = function () {}; + this.onLoadProgress = function () {}; + this.onLoadComplete = function () {}; + + } + + Loader.Handlers = { + + handlers: [], + + add: function ( regex, loader ) { + + this.handlers.push( regex, loader ); + + }, + + get: function ( file ) { + + var handlers = this.handlers; + + for ( var i = 0, l = handlers.length; i < l; i += 2 ) { + + var regex = handlers[ i ]; + var loader = handlers[ i + 1 ]; + + if ( regex.test( file ) ) { + + return loader; + + } + + } + + return null; + + } + + }; + + Object.assign( Loader.prototype, { + + crossOrigin: undefined, + + extractUrlBase: function ( url ) { + + var parts = url.split( '/' ); + + if ( parts.length === 1 ) return './'; + + parts.pop(); + + return parts.join( '/' ) + '/'; + + }, + + initMaterials: function ( materials, texturePath, crossOrigin ) { + + var array = []; + + for ( var i = 0; i < materials.length; ++ i ) { + + array[ i ] = this.createMaterial( materials[ i ], texturePath, crossOrigin ); + + } + + return array; + + }, + + createMaterial: ( function () { + + var BlendingMode = { + NoBlending: NoBlending, + NormalBlending: NormalBlending, + AdditiveBlending: AdditiveBlending, + SubtractiveBlending: SubtractiveBlending, + MultiplyBlending: MultiplyBlending, + CustomBlending: CustomBlending + }; + + var color = new Color(); + var textureLoader = new TextureLoader(); + var materialLoader = new MaterialLoader(); + + return function createMaterial( m, texturePath, crossOrigin ) { + + // convert from old material format + + var textures = {}; + + function loadTexture( path, repeat, offset, wrap, anisotropy ) { + + var fullPath = texturePath + path; + var loader = Loader.Handlers.get( fullPath ); + + var texture; + + if ( loader !== null ) { + + texture = loader.load( fullPath ); + + } else { + + textureLoader.setCrossOrigin( crossOrigin ); + texture = textureLoader.load( fullPath ); + + } + + if ( repeat !== undefined ) { + + texture.repeat.fromArray( repeat ); + + if ( repeat[ 0 ] !== 1 ) texture.wrapS = RepeatWrapping; + if ( repeat[ 1 ] !== 1 ) texture.wrapT = RepeatWrapping; + + } + + if ( offset !== undefined ) { + + texture.offset.fromArray( offset ); + + } + + if ( wrap !== undefined ) { + + if ( wrap[ 0 ] === 'repeat' ) texture.wrapS = RepeatWrapping; + if ( wrap[ 0 ] === 'mirror' ) texture.wrapS = MirroredRepeatWrapping; + + if ( wrap[ 1 ] === 'repeat' ) texture.wrapT = RepeatWrapping; + if ( wrap[ 1 ] === 'mirror' ) texture.wrapT = MirroredRepeatWrapping; + + } + + if ( anisotropy !== undefined ) { + + texture.anisotropy = anisotropy; + + } + + var uuid = _Math.generateUUID(); + + textures[ uuid ] = texture; + + return uuid; + + } + + // + + var json = { + uuid: _Math.generateUUID(), + type: 'MeshLambertMaterial' + }; + + for ( var name in m ) { + + var value = m[ name ]; + + switch ( name ) { + + case 'DbgColor': + case 'DbgIndex': + case 'opticalDensity': + case 'illumination': + break; + case 'DbgName': + json.name = value; + break; + case 'blending': + json.blending = BlendingMode[ value ]; + break; + case 'colorAmbient': + case 'mapAmbient': + console.warn( 'THREE.Loader.createMaterial:', name, 'is no longer supported.' ); + break; + case 'colorDiffuse': + json.color = color.fromArray( value ).getHex(); + break; + case 'colorSpecular': + json.specular = color.fromArray( value ).getHex(); + break; + case 'colorEmissive': + json.emissive = color.fromArray( value ).getHex(); + break; + case 'specularCoef': + json.shininess = value; + break; + case 'shading': + if ( value.toLowerCase() === 'basic' ) json.type = 'MeshBasicMaterial'; + if ( value.toLowerCase() === 'phong' ) json.type = 'MeshPhongMaterial'; + if ( value.toLowerCase() === 'standard' ) json.type = 'MeshStandardMaterial'; + break; + case 'mapDiffuse': + json.map = loadTexture( value, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy ); + break; + case 'mapDiffuseRepeat': + case 'mapDiffuseOffset': + case 'mapDiffuseWrap': + case 'mapDiffuseAnisotropy': + break; + case 'mapEmissive': + json.emissiveMap = loadTexture( value, m.mapEmissiveRepeat, m.mapEmissiveOffset, m.mapEmissiveWrap, m.mapEmissiveAnisotropy ); + break; + case 'mapEmissiveRepeat': + case 'mapEmissiveOffset': + case 'mapEmissiveWrap': + case 'mapEmissiveAnisotropy': + break; + case 'mapLight': + json.lightMap = loadTexture( value, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy ); + break; + case 'mapLightRepeat': + case 'mapLightOffset': + case 'mapLightWrap': + case 'mapLightAnisotropy': + break; + case 'mapAO': + json.aoMap = loadTexture( value, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy ); + break; + case 'mapAORepeat': + case 'mapAOOffset': + case 'mapAOWrap': + case 'mapAOAnisotropy': + break; + case 'mapBump': + json.bumpMap = loadTexture( value, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy ); + break; + case 'mapBumpScale': + json.bumpScale = value; + break; + case 'mapBumpRepeat': + case 'mapBumpOffset': + case 'mapBumpWrap': + case 'mapBumpAnisotropy': + break; + case 'mapNormal': + json.normalMap = loadTexture( value, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy ); + break; + case 'mapNormalFactor': + json.normalScale = [ value, value ]; + break; + case 'mapNormalRepeat': + case 'mapNormalOffset': + case 'mapNormalWrap': + case 'mapNormalAnisotropy': + break; + case 'mapSpecular': + json.specularMap = loadTexture( value, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy ); + break; + case 'mapSpecularRepeat': + case 'mapSpecularOffset': + case 'mapSpecularWrap': + case 'mapSpecularAnisotropy': + break; + case 'mapMetalness': + json.metalnessMap = loadTexture( value, m.mapMetalnessRepeat, m.mapMetalnessOffset, m.mapMetalnessWrap, m.mapMetalnessAnisotropy ); + break; + case 'mapMetalnessRepeat': + case 'mapMetalnessOffset': + case 'mapMetalnessWrap': + case 'mapMetalnessAnisotropy': + break; + case 'mapRoughness': + json.roughnessMap = loadTexture( value, m.mapRoughnessRepeat, m.mapRoughnessOffset, m.mapRoughnessWrap, m.mapRoughnessAnisotropy ); + break; + case 'mapRoughnessRepeat': + case 'mapRoughnessOffset': + case 'mapRoughnessWrap': + case 'mapRoughnessAnisotropy': + break; + case 'mapAlpha': + json.alphaMap = loadTexture( value, m.mapAlphaRepeat, m.mapAlphaOffset, m.mapAlphaWrap, m.mapAlphaAnisotropy ); + break; + case 'mapAlphaRepeat': + case 'mapAlphaOffset': + case 'mapAlphaWrap': + case 'mapAlphaAnisotropy': + break; + case 'flipSided': + json.side = BackSide; + break; + case 'doubleSided': + json.side = DoubleSide; + break; + case 'transparency': + console.warn( 'THREE.Loader.createMaterial: transparency has been renamed to opacity' ); + json.opacity = value; + break; + case 'depthTest': + case 'depthWrite': + case 'colorWrite': + case 'opacity': + case 'reflectivity': + case 'transparent': + case 'visible': + case 'wireframe': + json[ name ] = value; + break; + case 'vertexColors': + if ( value === true ) json.vertexColors = VertexColors; + if ( value === 'face' ) json.vertexColors = FaceColors; + break; + default: + console.error( 'THREE.Loader.createMaterial: Unsupported', name, value ); + break; + + } + + } + + if ( json.type === 'MeshBasicMaterial' ) delete json.emissive; + if ( json.type !== 'MeshPhongMaterial' ) delete json.specular; + + if ( json.opacity < 1 ) json.transparent = true; + + materialLoader.setTextures( textures ); + + return materialLoader.parse( json ); + + }; + + } )() + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function JSONLoader( manager ) { + + if ( typeof manager === 'boolean' ) { + + console.warn( 'THREE.JSONLoader: showStatus parameter has been removed from constructor.' ); + manager = undefined; + + } + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + this.withCredentials = false; + + } + + Object.assign( JSONLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var texturePath = this.texturePath && ( typeof this.texturePath === "string" ) ? this.texturePath : Loader.prototype.extractUrlBase( url ); + + var loader = new FileLoader( this.manager ); + loader.setResponseType( 'json' ); + loader.setWithCredentials( this.withCredentials ); + loader.load( url, function ( json ) { + + var metadata = json.metadata; + + if ( metadata !== undefined ) { + + var type = metadata.type; + + if ( type !== undefined ) { + + if ( type.toLowerCase() === 'object' ) { + + console.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.ObjectLoader instead.' ); + return; + + } + + if ( type.toLowerCase() === 'scene' ) { + + console.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.SceneLoader instead.' ); + return; + + } + + } + + } + + var object = scope.parse( json, texturePath ); + onLoad( object.geometry, object.materials ); + + }, onProgress, onError ); + + }, + + setTexturePath: function ( value ) { + + this.texturePath = value; + + }, + + parse: ( function () { + + function parseModel( json, geometry ) { + + function isBitSet( value, position ) { + + return value & ( 1 << position ); + + } + + var i, j, fi, + + offset, zLength, + + colorIndex, normalIndex, uvIndex, materialIndex, + + type, + isQuad, + hasMaterial, + hasFaceVertexUv, + hasFaceNormal, hasFaceVertexNormal, + hasFaceColor, hasFaceVertexColor, + + vertex, face, faceA, faceB, hex, normal, + + uvLayer, uv, u, v, + + faces = json.faces, + vertices = json.vertices, + normals = json.normals, + colors = json.colors, + + scale = json.scale, + + nUvLayers = 0; + + + if ( json.uvs !== undefined ) { + + // disregard empty arrays + + for ( i = 0; i < json.uvs.length; i ++ ) { + + if ( json.uvs[ i ].length ) nUvLayers ++; + + } + + for ( i = 0; i < nUvLayers; i ++ ) { + + geometry.faceVertexUvs[ i ] = []; + + } + + } + + offset = 0; + zLength = vertices.length; + + while ( offset < zLength ) { + + vertex = new Vector3(); + + vertex.x = vertices[ offset ++ ] * scale; + vertex.y = vertices[ offset ++ ] * scale; + vertex.z = vertices[ offset ++ ] * scale; + + geometry.vertices.push( vertex ); + + } + + offset = 0; + zLength = faces.length; + + while ( offset < zLength ) { + + type = faces[ offset ++ ]; + + isQuad = isBitSet( type, 0 ); + hasMaterial = isBitSet( type, 1 ); + hasFaceVertexUv = isBitSet( type, 3 ); + hasFaceNormal = isBitSet( type, 4 ); + hasFaceVertexNormal = isBitSet( type, 5 ); + hasFaceColor = isBitSet( type, 6 ); + hasFaceVertexColor = isBitSet( type, 7 ); + + // console.log("type", type, "bits", isQuad, hasMaterial, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor); + + if ( isQuad ) { + + faceA = new Face3(); + faceA.a = faces[ offset ]; + faceA.b = faces[ offset + 1 ]; + faceA.c = faces[ offset + 3 ]; + + faceB = new Face3(); + faceB.a = faces[ offset + 1 ]; + faceB.b = faces[ offset + 2 ]; + faceB.c = faces[ offset + 3 ]; + + offset += 4; + + if ( hasMaterial ) { + + materialIndex = faces[ offset ++ ]; + faceA.materialIndex = materialIndex; + faceB.materialIndex = materialIndex; + + } + + // to get face <=> uv index correspondence + + fi = geometry.faces.length; + + if ( hasFaceVertexUv ) { + + for ( i = 0; i < nUvLayers; i ++ ) { + + uvLayer = json.uvs[ i ]; + + geometry.faceVertexUvs[ i ][ fi ] = []; + geometry.faceVertexUvs[ i ][ fi + 1 ] = []; + + for ( j = 0; j < 4; j ++ ) { + + uvIndex = faces[ offset ++ ]; + + u = uvLayer[ uvIndex * 2 ]; + v = uvLayer[ uvIndex * 2 + 1 ]; + + uv = new Vector2( u, v ); + + if ( j !== 2 ) geometry.faceVertexUvs[ i ][ fi ].push( uv ); + if ( j !== 0 ) geometry.faceVertexUvs[ i ][ fi + 1 ].push( uv ); + + } + + } + + } + + if ( hasFaceNormal ) { + + normalIndex = faces[ offset ++ ] * 3; + + faceA.normal.set( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + faceB.normal.copy( faceA.normal ); + + } + + if ( hasFaceVertexNormal ) { + + for ( i = 0; i < 4; i ++ ) { + + normalIndex = faces[ offset ++ ] * 3; + + normal = new Vector3( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + + if ( i !== 2 ) faceA.vertexNormals.push( normal ); + if ( i !== 0 ) faceB.vertexNormals.push( normal ); + + } + + } + + + if ( hasFaceColor ) { + + colorIndex = faces[ offset ++ ]; + hex = colors[ colorIndex ]; + + faceA.color.setHex( hex ); + faceB.color.setHex( hex ); + + } + + + if ( hasFaceVertexColor ) { + + for ( i = 0; i < 4; i ++ ) { + + colorIndex = faces[ offset ++ ]; + hex = colors[ colorIndex ]; + + if ( i !== 2 ) faceA.vertexColors.push( new Color( hex ) ); + if ( i !== 0 ) faceB.vertexColors.push( new Color( hex ) ); + + } + + } + + geometry.faces.push( faceA ); + geometry.faces.push( faceB ); + + } else { + + face = new Face3(); + face.a = faces[ offset ++ ]; + face.b = faces[ offset ++ ]; + face.c = faces[ offset ++ ]; + + if ( hasMaterial ) { + + materialIndex = faces[ offset ++ ]; + face.materialIndex = materialIndex; + + } + + // to get face <=> uv index correspondence + + fi = geometry.faces.length; + + if ( hasFaceVertexUv ) { + + for ( i = 0; i < nUvLayers; i ++ ) { + + uvLayer = json.uvs[ i ]; + + geometry.faceVertexUvs[ i ][ fi ] = []; + + for ( j = 0; j < 3; j ++ ) { + + uvIndex = faces[ offset ++ ]; + + u = uvLayer[ uvIndex * 2 ]; + v = uvLayer[ uvIndex * 2 + 1 ]; + + uv = new Vector2( u, v ); + + geometry.faceVertexUvs[ i ][ fi ].push( uv ); + + } + + } + + } + + if ( hasFaceNormal ) { + + normalIndex = faces[ offset ++ ] * 3; + + face.normal.set( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + } + + if ( hasFaceVertexNormal ) { + + for ( i = 0; i < 3; i ++ ) { + + normalIndex = faces[ offset ++ ] * 3; + + normal = new Vector3( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + face.vertexNormals.push( normal ); + + } + + } + + + if ( hasFaceColor ) { + + colorIndex = faces[ offset ++ ]; + face.color.setHex( colors[ colorIndex ] ); + + } + + + if ( hasFaceVertexColor ) { + + for ( i = 0; i < 3; i ++ ) { + + colorIndex = faces[ offset ++ ]; + face.vertexColors.push( new Color( colors[ colorIndex ] ) ); + + } + + } + + geometry.faces.push( face ); + + } + + } + + } + + function parseSkin( json, geometry ) { + + var influencesPerVertex = ( json.influencesPerVertex !== undefined ) ? json.influencesPerVertex : 2; + + if ( json.skinWeights ) { + + for ( var i = 0, l = json.skinWeights.length; i < l; i += influencesPerVertex ) { + + var x = json.skinWeights[ i ]; + var y = ( influencesPerVertex > 1 ) ? json.skinWeights[ i + 1 ] : 0; + var z = ( influencesPerVertex > 2 ) ? json.skinWeights[ i + 2 ] : 0; + var w = ( influencesPerVertex > 3 ) ? json.skinWeights[ i + 3 ] : 0; + + geometry.skinWeights.push( new Vector4( x, y, z, w ) ); + + } + + } + + if ( json.skinIndices ) { + + for ( var i = 0, l = json.skinIndices.length; i < l; i += influencesPerVertex ) { + + var a = json.skinIndices[ i ]; + var b = ( influencesPerVertex > 1 ) ? json.skinIndices[ i + 1 ] : 0; + var c = ( influencesPerVertex > 2 ) ? json.skinIndices[ i + 2 ] : 0; + var d = ( influencesPerVertex > 3 ) ? json.skinIndices[ i + 3 ] : 0; + + geometry.skinIndices.push( new Vector4( a, b, c, d ) ); + + } + + } + + geometry.bones = json.bones; + + if ( geometry.bones && geometry.bones.length > 0 && ( geometry.skinWeights.length !== geometry.skinIndices.length || geometry.skinIndices.length !== geometry.vertices.length ) ) { + + console.warn( 'When skinning, number of vertices (' + geometry.vertices.length + '), skinIndices (' + + geometry.skinIndices.length + '), and skinWeights (' + geometry.skinWeights.length + ') should match.' ); + + } + + } + + function parseMorphing( json, geometry ) { + + var scale = json.scale; + + if ( json.morphTargets !== undefined ) { + + for ( var i = 0, l = json.morphTargets.length; i < l; i ++ ) { + + geometry.morphTargets[ i ] = {}; + geometry.morphTargets[ i ].name = json.morphTargets[ i ].name; + geometry.morphTargets[ i ].vertices = []; + + var dstVertices = geometry.morphTargets[ i ].vertices; + var srcVertices = json.morphTargets[ i ].vertices; + + for ( var v = 0, vl = srcVertices.length; v < vl; v += 3 ) { + + var vertex = new Vector3(); + vertex.x = srcVertices[ v ] * scale; + vertex.y = srcVertices[ v + 1 ] * scale; + vertex.z = srcVertices[ v + 2 ] * scale; + + dstVertices.push( vertex ); + + } + + } + + } + + if ( json.morphColors !== undefined && json.morphColors.length > 0 ) { + + console.warn( 'THREE.JSONLoader: "morphColors" no longer supported. Using them as face colors.' ); + + var faces = geometry.faces; + var morphColors = json.morphColors[ 0 ].colors; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + faces[ i ].color.fromArray( morphColors, i * 3 ); + + } + + } + + } + + function parseAnimations( json, geometry ) { + + var outputAnimations = []; + + // parse old style Bone/Hierarchy animations + var animations = []; + + if ( json.animation !== undefined ) { + + animations.push( json.animation ); + + } + + if ( json.animations !== undefined ) { + + if ( json.animations.length ) { + + animations = animations.concat( json.animations ); + + } else { + + animations.push( json.animations ); + + } + + } + + for ( var i = 0; i < animations.length; i ++ ) { + + var clip = AnimationClip.parseAnimation( animations[ i ], geometry.bones ); + if ( clip ) outputAnimations.push( clip ); + + } + + // parse implicit morph animations + if ( geometry.morphTargets ) { + + // TODO: Figure out what an appropraite FPS is for morph target animations -- defaulting to 10, but really it is completely arbitrary. + var morphAnimationClips = AnimationClip.CreateClipsFromMorphTargetSequences( geometry.morphTargets, 10 ); + outputAnimations = outputAnimations.concat( morphAnimationClips ); + + } + + if ( outputAnimations.length > 0 ) geometry.animations = outputAnimations; + + } + + return function ( json, texturePath ) { + + if ( json.data !== undefined ) { + + // Geometry 4.0 spec + json = json.data; + + } + + if ( json.scale !== undefined ) { + + json.scale = 1.0 / json.scale; + + } else { + + json.scale = 1.0; + + } + + var geometry = new Geometry(); + + parseModel( json, geometry ); + parseSkin( json, geometry ); + parseMorphing( json, geometry ); + parseAnimations( json, geometry ); + + geometry.computeFaceNormals(); + geometry.computeBoundingSphere(); + + if ( json.materials === undefined || json.materials.length === 0 ) { + + return { geometry: geometry }; + + } else { + + var materials = Loader.prototype.initMaterials( json.materials, texturePath, this.crossOrigin ); + + return { geometry: geometry, materials: materials }; + + } + + }; + + } )() + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function ObjectLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + this.texturePath = ''; + + } + + Object.assign( ObjectLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + if ( this.texturePath === '' ) { + + this.texturePath = url.substring( 0, url.lastIndexOf( '/' ) + 1 ); + + } + + var scope = this; + + var loader = new FileLoader( scope.manager ); + loader.load( url, function ( text ) { + + var json = null; + + try { + + json = JSON.parse( text ); + + } catch ( error ) { + + if ( onError !== undefined ) onError( error ); + + console.error( 'THREE:ObjectLoader: Can\'t parse ' + url + '.', error.message ); + + return; + + } + + var metadata = json.metadata; + + if ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) { + + console.error( 'THREE.ObjectLoader: Can\'t load ' + url + '. Use THREE.JSONLoader instead.' ); + return; + + } + + scope.parse( json, onLoad ); + + }, onProgress, onError ); + + }, + + setTexturePath: function ( value ) { + + this.texturePath = value; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + + }, + + parse: function ( json, onLoad ) { + + var geometries = this.parseGeometries( json.geometries ); + + var images = this.parseImages( json.images, function () { + + if ( onLoad !== undefined ) onLoad( object ); + + } ); + + var textures = this.parseTextures( json.textures, images ); + var materials = this.parseMaterials( json.materials, textures ); + + var object = this.parseObject( json.object, geometries, materials ); + + if ( json.animations ) { + + object.animations = this.parseAnimations( json.animations ); + + } + + if ( json.images === undefined || json.images.length === 0 ) { + + if ( onLoad !== undefined ) onLoad( object ); + + } + + return object; + + }, + + parseGeometries: function ( json ) { + + var geometries = {}; + + if ( json !== undefined ) { + + var geometryLoader = new JSONLoader(); + var bufferGeometryLoader = new BufferGeometryLoader(); + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var geometry; + var data = json[ i ]; + + switch ( data.type ) { + + case 'PlaneGeometry': + case 'PlaneBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.width, + data.height, + data.widthSegments, + data.heightSegments + ); + + break; + + case 'BoxGeometry': + case 'BoxBufferGeometry': + case 'CubeGeometry': // backwards compatible + + geometry = new Geometries[ data.type ]( + data.width, + data.height, + data.depth, + data.widthSegments, + data.heightSegments, + data.depthSegments + ); + + break; + + case 'CircleGeometry': + case 'CircleBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.segments, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'CylinderGeometry': + case 'CylinderBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radiusTop, + data.radiusBottom, + data.height, + data.radialSegments, + data.heightSegments, + data.openEnded, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'ConeGeometry': + case 'ConeBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.height, + data.radialSegments, + data.heightSegments, + data.openEnded, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'SphereGeometry': + case 'SphereBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.widthSegments, + data.heightSegments, + data.phiStart, + data.phiLength, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'DodecahedronGeometry': + case 'IcosahedronGeometry': + case 'OctahedronGeometry': + case 'TetrahedronGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.detail + ); + + break; + + case 'RingGeometry': + case 'RingBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.innerRadius, + data.outerRadius, + data.thetaSegments, + data.phiSegments, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'TorusGeometry': + case 'TorusBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.tube, + data.radialSegments, + data.tubularSegments, + data.arc + ); + + break; + + case 'TorusKnotGeometry': + case 'TorusKnotBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.tube, + data.tubularSegments, + data.radialSegments, + data.p, + data.q + ); + + break; + + case 'LatheGeometry': + case 'LatheBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.points, + data.segments, + data.phiStart, + data.phiLength + ); + + break; + + case 'BufferGeometry': + + geometry = bufferGeometryLoader.parse( data ); + + break; + + case 'Geometry': + + geometry = geometryLoader.parse( data, this.texturePath ).geometry; + + break; + + default: + + console.warn( 'THREE.ObjectLoader: Unsupported geometry type "' + data.type + '"' ); + + continue; + + } + + geometry.uuid = data.uuid; + + if ( data.name !== undefined ) geometry.name = data.name; + + geometries[ data.uuid ] = geometry; + + } + + } + + return geometries; + + }, + + parseMaterials: function ( json, textures ) { + + var materials = {}; + + if ( json !== undefined ) { + + var loader = new MaterialLoader(); + loader.setTextures( textures ); + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var data = json[ i ]; + + if ( data.type === 'MultiMaterial' ) { + + // Deprecated + + var array = []; + + for ( var j = 0; j < data.materials.length; j ++ ) { + + array.push( loader.parse( data.materials[ j ] ) ); + + } + + materials[ data.uuid ] = array; + + } else { + + materials[ data.uuid ] = loader.parse( data ); + + } + + } + + } + + return materials; + + }, + + parseAnimations: function ( json ) { + + var animations = []; + + for ( var i = 0; i < json.length; i ++ ) { + + var clip = AnimationClip.parse( json[ i ] ); + + animations.push( clip ); + + } + + return animations; + + }, + + parseImages: function ( json, onLoad ) { + + var scope = this; + var images = {}; + + function loadImage( url ) { + + scope.manager.itemStart( url ); + + return loader.load( url, function () { + + scope.manager.itemEnd( url ); + + }, undefined, function () { + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + } ); + + } + + if ( json !== undefined && json.length > 0 ) { + + var manager = new LoadingManager( onLoad ); + + var loader = new ImageLoader( manager ); + loader.setCrossOrigin( this.crossOrigin ); + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var image = json[ i ]; + var path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test( image.url ) ? image.url : scope.texturePath + image.url; + + images[ image.uuid ] = loadImage( path ); + + } + + } + + return images; + + }, + + parseTextures: function ( json, images ) { + + function parseConstant( value, type ) { + + if ( typeof( value ) === 'number' ) return value; + + console.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value ); + + return type[ value ]; + + } + + var textures = {}; + + if ( json !== undefined ) { + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var data = json[ i ]; + + if ( data.image === undefined ) { + + console.warn( 'THREE.ObjectLoader: No "image" specified for', data.uuid ); + + } + + if ( images[ data.image ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined image', data.image ); + + } + + var texture = new Texture( images[ data.image ] ); + texture.needsUpdate = true; + + texture.uuid = data.uuid; + + if ( data.name !== undefined ) texture.name = data.name; + + if ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TEXTURE_MAPPING ); + + if ( data.offset !== undefined ) texture.offset.fromArray( data.offset ); + if ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat ); + if ( data.wrap !== undefined ) { + + texture.wrapS = parseConstant( data.wrap[ 0 ], TEXTURE_WRAPPING ); + texture.wrapT = parseConstant( data.wrap[ 1 ], TEXTURE_WRAPPING ); + + } + + if ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TEXTURE_FILTER ); + if ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TEXTURE_FILTER ); + if ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy; + + if ( data.flipY !== undefined ) texture.flipY = data.flipY; + + textures[ data.uuid ] = texture; + + } + + } + + return textures; + + }, + + parseObject: function () { + + var matrix = new Matrix4(); + + return function parseObject( data, geometries, materials ) { + + var object; + + function getGeometry( name ) { + + if ( geometries[ name ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined geometry', name ); + + } + + return geometries[ name ]; + + } + + function getMaterial( name ) { + + if ( name === undefined ) return undefined; + + if ( Array.isArray( name ) ) { + + var array = []; + + for ( var i = 0, l = name.length; i < l; i ++ ) { + + var uuid = name[ i ]; + + if ( materials[ uuid ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined material', uuid ); + + } + + array.push( materials[ uuid ] ); + + } + + return array; + + } + + if ( materials[ name ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined material', name ); + + } + + return materials[ name ]; + + } + + switch ( data.type ) { + + case 'Scene': + + object = new Scene(); + + if ( data.background !== undefined ) { + + if ( Number.isInteger( data.background ) ) { + + object.background = new Color( data.background ); + + } + + } + + if ( data.fog !== undefined ) { + + if ( data.fog.type === 'Fog' ) { + + object.fog = new Fog( data.fog.color, data.fog.near, data.fog.far ); + + } else if ( data.fog.type === 'FogExp2' ) { + + object.fog = new FogExp2( data.fog.color, data.fog.density ); + + } + + } + + break; + + case 'PerspectiveCamera': + + object = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far ); + + if ( data.focus !== undefined ) object.focus = data.focus; + if ( data.zoom !== undefined ) object.zoom = data.zoom; + if ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge; + if ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset; + if ( data.view !== undefined ) object.view = Object.assign( {}, data.view ); + + break; + + case 'OrthographicCamera': + + object = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far ); + + break; + + case 'AmbientLight': + + object = new AmbientLight( data.color, data.intensity ); + + break; + + case 'DirectionalLight': + + object = new DirectionalLight( data.color, data.intensity ); + + break; + + case 'PointLight': + + object = new PointLight( data.color, data.intensity, data.distance, data.decay ); + + break; + + case 'RectAreaLight': + + object = new RectAreaLight( data.color, data.intensity, data.width, data.height ); + + break; + + case 'SpotLight': + + object = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay ); + + break; + + case 'HemisphereLight': + + object = new HemisphereLight( data.color, data.groundColor, data.intensity ); + + break; + + case 'SkinnedMesh': + + console.warn( 'THREE.ObjectLoader.parseObject() does not support SkinnedMesh yet.' ); + + case 'Mesh': + + var geometry = getGeometry( data.geometry ); + var material = getMaterial( data.material ); + + if ( geometry.bones && geometry.bones.length > 0 ) { + + object = new SkinnedMesh( geometry, material ); + + } else { + + object = new Mesh( geometry, material ); + + } + + break; + + case 'LOD': + + object = new LOD(); + + break; + + case 'Line': + + object = new Line( getGeometry( data.geometry ), getMaterial( data.material ), data.mode ); + + break; + + case 'LineLoop': + + object = new LineLoop( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'LineSegments': + + object = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'PointCloud': + case 'Points': + + object = new Points( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'Sprite': + + object = new Sprite( getMaterial( data.material ) ); + + break; + + case 'Group': + + object = new Group(); + + break; + + default: + + object = new Object3D(); + + } + + object.uuid = data.uuid; + + if ( data.name !== undefined ) object.name = data.name; + if ( data.matrix !== undefined ) { + + matrix.fromArray( data.matrix ); + matrix.decompose( object.position, object.quaternion, object.scale ); + + } else { + + if ( data.position !== undefined ) object.position.fromArray( data.position ); + if ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation ); + if ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion ); + if ( data.scale !== undefined ) object.scale.fromArray( data.scale ); + + } + + if ( data.castShadow !== undefined ) object.castShadow = data.castShadow; + if ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow; + + if ( data.shadow ) { + + if ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias; + if ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius; + if ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize ); + if ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera ); + + } + + if ( data.visible !== undefined ) object.visible = data.visible; + if ( data.userData !== undefined ) object.userData = data.userData; + + if ( data.children !== undefined ) { + + for ( var child in data.children ) { + + object.add( this.parseObject( data.children[ child ], geometries, materials ) ); + + } + + } + + if ( data.type === 'LOD' ) { + + var levels = data.levels; + + for ( var l = 0; l < levels.length; l ++ ) { + + var level = levels[ l ]; + var child = object.getObjectByProperty( 'uuid', level.object ); + + if ( child !== undefined ) { + + object.addLevel( child, level.distance ); + + } + + } + + } + + return object; + + }; + + }() + + } ); + + var TEXTURE_MAPPING = { + UVMapping: UVMapping, + CubeReflectionMapping: CubeReflectionMapping, + CubeRefractionMapping: CubeRefractionMapping, + EquirectangularReflectionMapping: EquirectangularReflectionMapping, + EquirectangularRefractionMapping: EquirectangularRefractionMapping, + SphericalReflectionMapping: SphericalReflectionMapping, + CubeUVReflectionMapping: CubeUVReflectionMapping, + CubeUVRefractionMapping: CubeUVRefractionMapping + }; + + var TEXTURE_WRAPPING = { + RepeatWrapping: RepeatWrapping, + ClampToEdgeWrapping: ClampToEdgeWrapping, + MirroredRepeatWrapping: MirroredRepeatWrapping + }; + + var TEXTURE_FILTER = { + NearestFilter: NearestFilter, + NearestMipMapNearestFilter: NearestMipMapNearestFilter, + NearestMipMapLinearFilter: NearestMipMapLinearFilter, + LinearFilter: LinearFilter, + LinearMipMapNearestFilter: LinearMipMapNearestFilter, + LinearMipMapLinearFilter: LinearMipMapLinearFilter + }; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * + * Bezier Curves formulas obtained from + * http://en.wikipedia.org/wiki/Bézier_curve + */ + + function CatmullRom( t, p0, p1, p2, p3 ) { + + var v0 = ( p2 - p0 ) * 0.5; + var v1 = ( p3 - p1 ) * 0.5; + var t2 = t * t; + var t3 = t * t2; + return ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1; + + } + + // + + function QuadraticBezierP0( t, p ) { + + var k = 1 - t; + return k * k * p; + + } + + function QuadraticBezierP1( t, p ) { + + return 2 * ( 1 - t ) * t * p; + + } + + function QuadraticBezierP2( t, p ) { + + return t * t * p; + + } + + function QuadraticBezier( t, p0, p1, p2 ) { + + return QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) + + QuadraticBezierP2( t, p2 ); + + } + + // + + function CubicBezierP0( t, p ) { + + var k = 1 - t; + return k * k * k * p; + + } + + function CubicBezierP1( t, p ) { + + var k = 1 - t; + return 3 * k * k * t * p; + + } + + function CubicBezierP2( t, p ) { + + return 3 * ( 1 - t ) * t * t * p; + + } + + function CubicBezierP3( t, p ) { + + return t * t * t * p; + + } + + function CubicBezier( t, p0, p1, p2, p3 ) { + + return CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) + + CubicBezierP3( t, p3 ); + + } + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * Extensible curve object + * + * Some common of curve methods: + * .getPoint(t), getTangent(t) + * .getPointAt(u), getTangentAt(u) + * .getPoints(), .getSpacedPoints() + * .getLength() + * .updateArcLengths() + * + * This following curves inherit from THREE.Curve: + * + * -- 2D curves -- + * THREE.ArcCurve + * THREE.CubicBezierCurve + * THREE.EllipseCurve + * THREE.LineCurve + * THREE.QuadraticBezierCurve + * THREE.SplineCurve + * + * -- 3D curves -- + * THREE.CatmullRomCurve3 + * THREE.CubicBezierCurve3 + * THREE.LineCurve3 + * THREE.QuadraticBezierCurve3 + * + * A series of curves can be represented as a THREE.CurvePath. + * + **/ + + /************************************************************** + * Abstract Curve base class + **************************************************************/ + + function Curve() { + + this.arcLengthDivisions = 200; + + } + + Object.assign( Curve.prototype, { + + // Virtual base class method to overwrite and implement in subclasses + // - t [0 .. 1] + + getPoint: function () { + + console.warn( 'THREE.Curve: .getPoint() not implemented.' ); + return null; + + }, + + // Get point at relative position in curve according to arc length + // - u [0 .. 1] + + getPointAt: function ( u ) { + + var t = this.getUtoTmapping( u ); + return this.getPoint( t ); + + }, + + // Get sequence of points using getPoint( t ) + + getPoints: function ( divisions ) { + + if ( divisions === undefined ) divisions = 5; + + var points = []; + + for ( var d = 0; d <= divisions; d ++ ) { + + points.push( this.getPoint( d / divisions ) ); + + } + + return points; + + }, + + // Get sequence of points using getPointAt( u ) + + getSpacedPoints: function ( divisions ) { + + if ( divisions === undefined ) divisions = 5; + + var points = []; + + for ( var d = 0; d <= divisions; d ++ ) { + + points.push( this.getPointAt( d / divisions ) ); + + } + + return points; + + }, + + // Get total curve arc length + + getLength: function () { + + var lengths = this.getLengths(); + return lengths[ lengths.length - 1 ]; + + }, + + // Get list of cumulative segment lengths + + getLengths: function ( divisions ) { + + if ( divisions === undefined ) divisions = this.arcLengthDivisions; + + if ( this.cacheArcLengths && + ( this.cacheArcLengths.length === divisions + 1 ) && + ! this.needsUpdate ) { + + return this.cacheArcLengths; + + } + + this.needsUpdate = false; + + var cache = []; + var current, last = this.getPoint( 0 ); + var p, sum = 0; + + cache.push( 0 ); + + for ( p = 1; p <= divisions; p ++ ) { + + current = this.getPoint( p / divisions ); + sum += current.distanceTo( last ); + cache.push( sum ); + last = current; + + } + + this.cacheArcLengths = cache; + + return cache; // { sums: cache, sum: sum }; Sum is in the last element. + + }, + + updateArcLengths: function () { + + this.needsUpdate = true; + this.getLengths(); + + }, + + // Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant + + getUtoTmapping: function ( u, distance ) { + + var arcLengths = this.getLengths(); + + var i = 0, il = arcLengths.length; + + var targetArcLength; // The targeted u distance value to get + + if ( distance ) { + + targetArcLength = distance; + + } else { + + targetArcLength = u * arcLengths[ il - 1 ]; + + } + + // binary search for the index with largest value smaller than target u distance + + var low = 0, high = il - 1, comparison; + + while ( low <= high ) { + + i = Math.floor( low + ( high - low ) / 2 ); // less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats + + comparison = arcLengths[ i ] - targetArcLength; + + if ( comparison < 0 ) { + + low = i + 1; + + } else if ( comparison > 0 ) { + + high = i - 1; + + } else { + + high = i; + break; + + // DONE + + } + + } + + i = high; + + if ( arcLengths[ i ] === targetArcLength ) { + + return i / ( il - 1 ); + + } + + // we could get finer grain at lengths, or use simple interpolation between two points + + var lengthBefore = arcLengths[ i ]; + var lengthAfter = arcLengths[ i + 1 ]; + + var segmentLength = lengthAfter - lengthBefore; + + // determine where we are between the 'before' and 'after' points + + var segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength; + + // add that fractional amount to t + + var t = ( i + segmentFraction ) / ( il - 1 ); + + return t; + + }, + + // Returns a unit vector tangent at t + // In case any sub curve does not implement its tangent derivation, + // 2 points a small delta apart will be used to find its gradient + // which seems to give a reasonable approximation + + getTangent: function ( t ) { + + var delta = 0.0001; + var t1 = t - delta; + var t2 = t + delta; + + // Capping in case of danger + + if ( t1 < 0 ) t1 = 0; + if ( t2 > 1 ) t2 = 1; + + var pt1 = this.getPoint( t1 ); + var pt2 = this.getPoint( t2 ); + + var vec = pt2.clone().sub( pt1 ); + return vec.normalize(); + + }, + + getTangentAt: function ( u ) { + + var t = this.getUtoTmapping( u ); + return this.getTangent( t ); + + }, + + computeFrenetFrames: function ( segments, closed ) { + + // see http://www.cs.indiana.edu/pub/techreports/TR425.pdf + + var normal = new Vector3(); + + var tangents = []; + var normals = []; + var binormals = []; + + var vec = new Vector3(); + var mat = new Matrix4(); + + var i, u, theta; + + // compute the tangent vectors for each segment on the curve + + for ( i = 0; i <= segments; i ++ ) { + + u = i / segments; + + tangents[ i ] = this.getTangentAt( u ); + tangents[ i ].normalize(); + + } + + // select an initial normal vector perpendicular to the first tangent vector, + // and in the direction of the minimum tangent xyz component + + normals[ 0 ] = new Vector3(); + binormals[ 0 ] = new Vector3(); + var min = Number.MAX_VALUE; + var tx = Math.abs( tangents[ 0 ].x ); + var ty = Math.abs( tangents[ 0 ].y ); + var tz = Math.abs( tangents[ 0 ].z ); + + if ( tx <= min ) { + + min = tx; + normal.set( 1, 0, 0 ); + + } + + if ( ty <= min ) { + + min = ty; + normal.set( 0, 1, 0 ); + + } + + if ( tz <= min ) { + + normal.set( 0, 0, 1 ); + + } + + vec.crossVectors( tangents[ 0 ], normal ).normalize(); + + normals[ 0 ].crossVectors( tangents[ 0 ], vec ); + binormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] ); + + + // compute the slowly-varying normal and binormal vectors for each segment on the curve + + for ( i = 1; i <= segments; i ++ ) { + + normals[ i ] = normals[ i - 1 ].clone(); + + binormals[ i ] = binormals[ i - 1 ].clone(); + + vec.crossVectors( tangents[ i - 1 ], tangents[ i ] ); + + if ( vec.length() > Number.EPSILON ) { + + vec.normalize(); + + theta = Math.acos( _Math.clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors + + normals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) ); + + } + + binormals[ i ].crossVectors( tangents[ i ], normals[ i ] ); + + } + + // if the curve is closed, postprocess the vectors so the first and last normal vectors are the same + + if ( closed === true ) { + + theta = Math.acos( _Math.clamp( normals[ 0 ].dot( normals[ segments ] ), - 1, 1 ) ); + theta /= segments; + + if ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) { + + theta = - theta; + + } + + for ( i = 1; i <= segments; i ++ ) { + + // twist a little... + normals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) ); + binormals[ i ].crossVectors( tangents[ i ], normals[ i ] ); + + } + + } + + return { + tangents: tangents, + normals: normals, + binormals: binormals + }; + + } + + } ); + + function LineCurve( v1, v2 ) { + + Curve.call( this ); + + this.v1 = v1; + this.v2 = v2; + + } + + LineCurve.prototype = Object.create( Curve.prototype ); + LineCurve.prototype.constructor = LineCurve; + + LineCurve.prototype.isLineCurve = true; + + LineCurve.prototype.getPoint = function ( t ) { + + if ( t === 1 ) { + + return this.v2.clone(); + + } + + var point = this.v2.clone().sub( this.v1 ); + point.multiplyScalar( t ).add( this.v1 ); + + return point; + + }; + + // Line curve is linear, so we can overwrite default getPointAt + + LineCurve.prototype.getPointAt = function ( u ) { + + return this.getPoint( u ); + + }; + + LineCurve.prototype.getTangent = function ( t ) { + + var tangent = this.v2.clone().sub( this.v1 ); + + return tangent.normalize(); + + }; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * + **/ + + /************************************************************** + * Curved Path - a curve path is simply a array of connected + * curves, but retains the api of a curve + **************************************************************/ + + function CurvePath() { + + Curve.call( this ); + + this.curves = []; + + this.autoClose = false; // Automatically closes the path + + } + + CurvePath.prototype = Object.assign( Object.create( Curve.prototype ), { + + constructor: CurvePath, + + add: function ( curve ) { + + this.curves.push( curve ); + + }, + + closePath: function () { + + // Add a line curve if start and end of lines are not connected + var startPoint = this.curves[ 0 ].getPoint( 0 ); + var endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 ); + + if ( ! startPoint.equals( endPoint ) ) { + + this.curves.push( new LineCurve( endPoint, startPoint ) ); + + } + + }, + + // To get accurate point with reference to + // entire path distance at time t, + // following has to be done: + + // 1. Length of each sub path have to be known + // 2. Locate and identify type of curve + // 3. Get t for the curve + // 4. Return curve.getPointAt(t') + + getPoint: function ( t ) { + + var d = t * this.getLength(); + var curveLengths = this.getCurveLengths(); + var i = 0; + + // To think about boundaries points. + + while ( i < curveLengths.length ) { + + if ( curveLengths[ i ] >= d ) { + + var diff = curveLengths[ i ] - d; + var curve = this.curves[ i ]; + + var segmentLength = curve.getLength(); + var u = segmentLength === 0 ? 0 : 1 - diff / segmentLength; + + return curve.getPointAt( u ); + + } + + i ++; + + } + + return null; + + // loop where sum != 0, sum > d , sum+1 <d + + }, + + // We cannot use the default THREE.Curve getPoint() with getLength() because in + // THREE.Curve, getLength() depends on getPoint() but in THREE.CurvePath + // getPoint() depends on getLength + + getLength: function () { + + var lens = this.getCurveLengths(); + return lens[ lens.length - 1 ]; + + }, + + // cacheLengths must be recalculated. + updateArcLengths: function () { + + this.needsUpdate = true; + this.cacheLengths = null; + this.getCurveLengths(); + + }, + + // Compute lengths and cache them + // We cannot overwrite getLengths() because UtoT mapping uses it. + + getCurveLengths: function () { + + // We use cache values if curves and cache array are same length + + if ( this.cacheLengths && this.cacheLengths.length === this.curves.length ) { + + return this.cacheLengths; + + } + + // Get length of sub-curve + // Push sums into cached array + + var lengths = [], sums = 0; + + for ( var i = 0, l = this.curves.length; i < l; i ++ ) { + + sums += this.curves[ i ].getLength(); + lengths.push( sums ); + + } + + this.cacheLengths = lengths; + + return lengths; + + }, + + getSpacedPoints: function ( divisions ) { + + if ( divisions === undefined ) divisions = 40; + + var points = []; + + for ( var i = 0; i <= divisions; i ++ ) { + + points.push( this.getPoint( i / divisions ) ); + + } + + if ( this.autoClose ) { + + points.push( points[ 0 ] ); + + } + + return points; + + }, + + getPoints: function ( divisions ) { + + divisions = divisions || 12; + + var points = [], last; + + for ( var i = 0, curves = this.curves; i < curves.length; i ++ ) { + + var curve = curves[ i ]; + var resolution = (curve && curve.isEllipseCurve) ? divisions * 2 + : (curve && curve.isLineCurve) ? 1 + : (curve && curve.isSplineCurve) ? divisions * curve.points.length + : divisions; + + var pts = curve.getPoints( resolution ); + + for ( var j = 0; j < pts.length; j++ ) { + + var point = pts[ j ]; + + if ( last && last.equals( point ) ) continue; // ensures no consecutive points are duplicates + + points.push( point ); + last = point; + + } + + } + + if ( this.autoClose && points.length > 1 && !points[ points.length - 1 ].equals( points[ 0 ] ) ) { + + points.push( points[ 0 ] ); + + } + + return points; + + }, + + /************************************************************** + * Create Geometries Helpers + **************************************************************/ + + /// Generate geometry from path points (for Line or Points objects) + + createPointsGeometry: function ( divisions ) { + + var pts = this.getPoints( divisions ); + return this.createGeometry( pts ); + + }, + + // Generate geometry from equidistant sampling along the path + + createSpacedPointsGeometry: function ( divisions ) { + + var pts = this.getSpacedPoints( divisions ); + return this.createGeometry( pts ); + + }, + + createGeometry: function ( points ) { + + var geometry = new Geometry(); + + for ( var i = 0, l = points.length; i < l; i ++ ) { + + var point = points[ i ]; + geometry.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) ); + + } + + return geometry; + + } + + } ); + + function EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + Curve.call( this ); + + this.aX = aX; + this.aY = aY; + + this.xRadius = xRadius; + this.yRadius = yRadius; + + this.aStartAngle = aStartAngle; + this.aEndAngle = aEndAngle; + + this.aClockwise = aClockwise; + + this.aRotation = aRotation || 0; + + } + + EllipseCurve.prototype = Object.create( Curve.prototype ); + EllipseCurve.prototype.constructor = EllipseCurve; + + EllipseCurve.prototype.isEllipseCurve = true; + + EllipseCurve.prototype.getPoint = function ( t ) { + + var twoPi = Math.PI * 2; + var deltaAngle = this.aEndAngle - this.aStartAngle; + var samePoints = Math.abs( deltaAngle ) < Number.EPSILON; + + // ensures that deltaAngle is 0 .. 2 PI + while ( deltaAngle < 0 ) deltaAngle += twoPi; + while ( deltaAngle > twoPi ) deltaAngle -= twoPi; + + if ( deltaAngle < Number.EPSILON ) { + + if ( samePoints ) { + + deltaAngle = 0; + + } else { + + deltaAngle = twoPi; + + } + + } + + if ( this.aClockwise === true && ! samePoints ) { + + if ( deltaAngle === twoPi ) { + + deltaAngle = - twoPi; + + } else { + + deltaAngle = deltaAngle - twoPi; + + } + + } + + var angle = this.aStartAngle + t * deltaAngle; + var x = this.aX + this.xRadius * Math.cos( angle ); + var y = this.aY + this.yRadius * Math.sin( angle ); + + if ( this.aRotation !== 0 ) { + + var cos = Math.cos( this.aRotation ); + var sin = Math.sin( this.aRotation ); + + var tx = x - this.aX; + var ty = y - this.aY; + + // Rotate the point about the center of the ellipse. + x = tx * cos - ty * sin + this.aX; + y = tx * sin + ty * cos + this.aY; + + } + + return new Vector2( x, y ); + + }; + + function SplineCurve( points /* array of Vector2 */ ) { + + Curve.call( this ); + + this.points = ( points === undefined ) ? [] : points; + + } + + SplineCurve.prototype = Object.create( Curve.prototype ); + SplineCurve.prototype.constructor = SplineCurve; + + SplineCurve.prototype.isSplineCurve = true; + + SplineCurve.prototype.getPoint = function ( t ) { + + var points = this.points; + var point = ( points.length - 1 ) * t; + + var intPoint = Math.floor( point ); + var weight = point - intPoint; + + var point0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ]; + var point1 = points[ intPoint ]; + var point2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ]; + var point3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ]; + + return new Vector2( + CatmullRom( weight, point0.x, point1.x, point2.x, point3.x ), + CatmullRom( weight, point0.y, point1.y, point2.y, point3.y ) + ); + + }; + + function CubicBezierCurve( v0, v1, v2, v3 ) { + + Curve.call( this ); + + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + this.v3 = v3; + + } + + CubicBezierCurve.prototype = Object.create( Curve.prototype ); + CubicBezierCurve.prototype.constructor = CubicBezierCurve; + + CubicBezierCurve.prototype.getPoint = function ( t ) { + + var v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3; + + return new Vector2( + CubicBezier( t, v0.x, v1.x, v2.x, v3.x ), + CubicBezier( t, v0.y, v1.y, v2.y, v3.y ) + ); + + }; + + function QuadraticBezierCurve( v0, v1, v2 ) { + + Curve.call( this ); + + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + + } + + QuadraticBezierCurve.prototype = Object.create( Curve.prototype ); + QuadraticBezierCurve.prototype.constructor = QuadraticBezierCurve; + + QuadraticBezierCurve.prototype.getPoint = function ( t ) { + + var v0 = this.v0, v1 = this.v1, v2 = this.v2; + + return new Vector2( + QuadraticBezier( t, v0.x, v1.x, v2.x ), + QuadraticBezier( t, v0.y, v1.y, v2.y ) + ); + + }; + + var PathPrototype = Object.assign( Object.create( CurvePath.prototype ), { + + fromPoints: function ( vectors ) { + + this.moveTo( vectors[ 0 ].x, vectors[ 0 ].y ); + + for ( var i = 1, l = vectors.length; i < l; i ++ ) { + + this.lineTo( vectors[ i ].x, vectors[ i ].y ); + + } + + }, + + moveTo: function ( x, y ) { + + this.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying? + + }, + + lineTo: function ( x, y ) { + + var curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) ); + this.curves.push( curve ); + + this.currentPoint.set( x, y ); + + }, + + quadraticCurveTo: function ( aCPx, aCPy, aX, aY ) { + + var curve = new QuadraticBezierCurve( + this.currentPoint.clone(), + new Vector2( aCPx, aCPy ), + new Vector2( aX, aY ) + ); + + this.curves.push( curve ); + + this.currentPoint.set( aX, aY ); + + }, + + bezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) { + + var curve = new CubicBezierCurve( + this.currentPoint.clone(), + new Vector2( aCP1x, aCP1y ), + new Vector2( aCP2x, aCP2y ), + new Vector2( aX, aY ) + ); + + this.curves.push( curve ); + + this.currentPoint.set( aX, aY ); + + }, + + splineThru: function ( pts /*Array of Vector*/ ) { + + var npts = [ this.currentPoint.clone() ].concat( pts ); + + var curve = new SplineCurve( npts ); + this.curves.push( curve ); + + this.currentPoint.copy( pts[ pts.length - 1 ] ); + + }, + + arc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + var x0 = this.currentPoint.x; + var y0 = this.currentPoint.y; + + this.absarc( aX + x0, aY + y0, aRadius, + aStartAngle, aEndAngle, aClockwise ); + + }, + + absarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + this.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise ); + + }, + + ellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + var x0 = this.currentPoint.x; + var y0 = this.currentPoint.y; + + this.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ); + + }, + + absellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + var curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ); + + if ( this.curves.length > 0 ) { + + // if a previous curve is present, attempt to join + var firstPoint = curve.getPoint( 0 ); + + if ( ! firstPoint.equals( this.currentPoint ) ) { + + this.lineTo( firstPoint.x, firstPoint.y ); + + } + + } + + this.curves.push( curve ); + + var lastPoint = curve.getPoint( 1 ); + this.currentPoint.copy( lastPoint ); + + } + + } ); + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * Creates free form 2d path using series of points, lines or curves. + **/ + + function Path( points ) { + + CurvePath.call( this ); + this.currentPoint = new Vector2(); + + if ( points ) { + + this.fromPoints( points ); + + } + + } + + Path.prototype = PathPrototype; + PathPrototype.constructor = Path; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * Defines a 2d shape plane using paths. + **/ + + // STEP 1 Create a path. + // STEP 2 Turn path into shape. + // STEP 3 ExtrudeGeometry takes in Shape/Shapes + // STEP 3a - Extract points from each shape, turn to vertices + // STEP 3b - Triangulate each shape, add faces. + + function Shape() { + + Path.apply( this, arguments ); + + this.holes = []; + + } + + Shape.prototype = Object.assign( Object.create( PathPrototype ), { + + constructor: Shape, + + getPointsHoles: function ( divisions ) { + + var holesPts = []; + + for ( var i = 0, l = this.holes.length; i < l; i ++ ) { + + holesPts[ i ] = this.holes[ i ].getPoints( divisions ); + + } + + return holesPts; + + }, + + // Get points of shape and holes (keypoints based on segments parameter) + + extractAllPoints: function ( divisions ) { + + return { + + shape: this.getPoints( divisions ), + holes: this.getPointsHoles( divisions ) + + }; + + }, + + extractPoints: function ( divisions ) { + + return this.extractAllPoints( divisions ); + + } + + } ); + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * minimal class for proxing functions to Path. Replaces old "extractSubpaths()" + **/ + + function ShapePath() { + + this.subPaths = []; + this.currentPath = null; + + } + + Object.assign( ShapePath.prototype, { + + moveTo: function ( x, y ) { + + this.currentPath = new Path(); + this.subPaths.push( this.currentPath ); + this.currentPath.moveTo( x, y ); + + }, + + lineTo: function ( x, y ) { + + this.currentPath.lineTo( x, y ); + + }, + + quadraticCurveTo: function ( aCPx, aCPy, aX, aY ) { + + this.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY ); + + }, + + bezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) { + + this.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ); + + }, + + splineThru: function ( pts ) { + + this.currentPath.splineThru( pts ); + + }, + + toShapes: function ( isCCW, noHoles ) { + + function toShapesNoHoles( inSubpaths ) { + + var shapes = []; + + for ( var i = 0, l = inSubpaths.length; i < l; i ++ ) { + + var tmpPath = inSubpaths[ i ]; + + var tmpShape = new Shape(); + tmpShape.curves = tmpPath.curves; + + shapes.push( tmpShape ); + + } + + return shapes; + + } + + function isPointInsidePolygon( inPt, inPolygon ) { + + var polyLen = inPolygon.length; + + // inPt on polygon contour => immediate success or + // toggling of inside/outside at every single! intersection point of an edge + // with the horizontal line through inPt, left of inPt + // not counting lowerY endpoints of edges and whole edges on that line + var inside = false; + for ( var p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) { + + var edgeLowPt = inPolygon[ p ]; + var edgeHighPt = inPolygon[ q ]; + + var edgeDx = edgeHighPt.x - edgeLowPt.x; + var edgeDy = edgeHighPt.y - edgeLowPt.y; + + if ( Math.abs( edgeDy ) > Number.EPSILON ) { + + // not parallel + if ( edgeDy < 0 ) { + + edgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx; + edgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy; + + } + if ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) continue; + + if ( inPt.y === edgeLowPt.y ) { + + if ( inPt.x === edgeLowPt.x ) return true; // inPt is on contour ? + // continue; // no intersection or edgeLowPt => doesn't count !!! + + } else { + + var perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y ); + if ( perpEdge === 0 ) return true; // inPt is on contour ? + if ( perpEdge < 0 ) continue; + inside = ! inside; // true intersection left of inPt + + } + + } else { + + // parallel or collinear + if ( inPt.y !== edgeLowPt.y ) continue; // parallel + // edge lies on the same horizontal line as inPt + if ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) || + ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) ) return true; // inPt: Point on contour ! + // continue; + + } + + } + + return inside; + + } + + var isClockWise = ShapeUtils.isClockWise; + + var subPaths = this.subPaths; + if ( subPaths.length === 0 ) return []; + + if ( noHoles === true ) return toShapesNoHoles( subPaths ); + + + var solid, tmpPath, tmpShape, shapes = []; + + if ( subPaths.length === 1 ) { + + tmpPath = subPaths[ 0 ]; + tmpShape = new Shape(); + tmpShape.curves = tmpPath.curves; + shapes.push( tmpShape ); + return shapes; + + } + + var holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() ); + holesFirst = isCCW ? ! holesFirst : holesFirst; + + // console.log("Holes first", holesFirst); + + var betterShapeHoles = []; + var newShapes = []; + var newShapeHoles = []; + var mainIdx = 0; + var tmpPoints; + + newShapes[ mainIdx ] = undefined; + newShapeHoles[ mainIdx ] = []; + + for ( var i = 0, l = subPaths.length; i < l; i ++ ) { + + tmpPath = subPaths[ i ]; + tmpPoints = tmpPath.getPoints(); + solid = isClockWise( tmpPoints ); + solid = isCCW ? ! solid : solid; + + if ( solid ) { + + if ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) ) mainIdx ++; + + newShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints }; + newShapes[ mainIdx ].s.curves = tmpPath.curves; + + if ( holesFirst ) mainIdx ++; + newShapeHoles[ mainIdx ] = []; + + //console.log('cw', i); + + } else { + + newShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } ); + + //console.log('ccw', i); + + } + + } + + // only Holes? -> probably all Shapes with wrong orientation + if ( ! newShapes[ 0 ] ) return toShapesNoHoles( subPaths ); + + + if ( newShapes.length > 1 ) { + + var ambiguous = false; + var toChange = []; + + for ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) { + + betterShapeHoles[ sIdx ] = []; + + } + + for ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) { + + var sho = newShapeHoles[ sIdx ]; + + for ( var hIdx = 0; hIdx < sho.length; hIdx ++ ) { + + var ho = sho[ hIdx ]; + var hole_unassigned = true; + + for ( var s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) { + + if ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) { + + if ( sIdx !== s2Idx ) toChange.push( { froms: sIdx, tos: s2Idx, hole: hIdx } ); + if ( hole_unassigned ) { + + hole_unassigned = false; + betterShapeHoles[ s2Idx ].push( ho ); + + } else { + + ambiguous = true; + + } + + } + + } + if ( hole_unassigned ) { + + betterShapeHoles[ sIdx ].push( ho ); + + } + + } + + } + // console.log("ambiguous: ", ambiguous); + if ( toChange.length > 0 ) { + + // console.log("to change: ", toChange); + if ( ! ambiguous ) newShapeHoles = betterShapeHoles; + + } + + } + + var tmpHoles; + + for ( var i = 0, il = newShapes.length; i < il; i ++ ) { + + tmpShape = newShapes[ i ].s; + shapes.push( tmpShape ); + tmpHoles = newShapeHoles[ i ]; + + for ( var j = 0, jl = tmpHoles.length; j < jl; j ++ ) { + + tmpShape.holes.push( tmpHoles[ j ].h ); + + } + + } + + //console.log("shape", shapes); + + return shapes; + + } + + } ); + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author mrdoob / http://mrdoob.com/ + */ + + function Font( data ) { + + this.data = data; + + } + + Object.assign( Font.prototype, { + + isFont: true, + + generateShapes: function ( text, size, divisions ) { + + function createPaths( text ) { + + var chars = String( text ).split( '' ); + var scale = size / data.resolution; + var line_height = ( data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness ) * scale; + + var offsetX = 0, offsetY = 0; + + var paths = []; + + for ( var i = 0; i < chars.length; i ++ ) { + + var char = chars[ i ]; + + if ( char === '\n' ) { + + offsetX = 0; + offsetY -= line_height; + + } else { + + var ret = createPath( char, scale, offsetX, offsetY ); + offsetX += ret.offsetX; + paths.push( ret.path ); + + } + + } + + return paths; + + } + + function createPath( c, scale, offsetX, offsetY ) { + + var glyph = data.glyphs[ c ] || data.glyphs[ '?' ]; + + if ( ! glyph ) return; + + var path = new ShapePath(); + + var pts = []; + var x, y, cpx, cpy, cpx0, cpy0, cpx1, cpy1, cpx2, cpy2, laste; + + if ( glyph.o ) { + + var outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) ); + + for ( var i = 0, l = outline.length; i < l; ) { + + var action = outline[ i ++ ]; + + switch ( action ) { + + case 'm': // moveTo + + x = outline[ i ++ ] * scale + offsetX; + y = outline[ i ++ ] * scale + offsetY; + + path.moveTo( x, y ); + + break; + + case 'l': // lineTo + + x = outline[ i ++ ] * scale + offsetX; + y = outline[ i ++ ] * scale + offsetY; + + path.lineTo( x, y ); + + break; + + case 'q': // quadraticCurveTo + + cpx = outline[ i ++ ] * scale + offsetX; + cpy = outline[ i ++ ] * scale + offsetY; + cpx1 = outline[ i ++ ] * scale + offsetX; + cpy1 = outline[ i ++ ] * scale + offsetY; + + path.quadraticCurveTo( cpx1, cpy1, cpx, cpy ); + + laste = pts[ pts.length - 1 ]; + + if ( laste ) { + + cpx0 = laste.x; + cpy0 = laste.y; + + for ( var i2 = 1; i2 <= divisions; i2 ++ ) { + + var t = i2 / divisions; + QuadraticBezier( t, cpx0, cpx1, cpx ); + QuadraticBezier( t, cpy0, cpy1, cpy ); + + } + + } + + break; + + case 'b': // bezierCurveTo + + cpx = outline[ i ++ ] * scale + offsetX; + cpy = outline[ i ++ ] * scale + offsetY; + cpx1 = outline[ i ++ ] * scale + offsetX; + cpy1 = outline[ i ++ ] * scale + offsetY; + cpx2 = outline[ i ++ ] * scale + offsetX; + cpy2 = outline[ i ++ ] * scale + offsetY; + + path.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy ); + + laste = pts[ pts.length - 1 ]; + + if ( laste ) { + + cpx0 = laste.x; + cpy0 = laste.y; + + for ( var i2 = 1; i2 <= divisions; i2 ++ ) { + + var t = i2 / divisions; + CubicBezier( t, cpx0, cpx1, cpx2, cpx ); + CubicBezier( t, cpy0, cpy1, cpy2, cpy ); + + } + + } + + break; + + } + + } + + } + + return { offsetX: glyph.ha * scale, path: path }; + + } + + // + + if ( size === undefined ) size = 100; + if ( divisions === undefined ) divisions = 4; + + var data = this.data; + + var paths = createPaths( text ); + var shapes = []; + + for ( var p = 0, pl = paths.length; p < pl; p ++ ) { + + Array.prototype.push.apply( shapes, paths[ p ].toShapes() ); + + } + + return shapes; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function FontLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( FontLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new FileLoader( this.manager ); + loader.load( url, function ( text ) { + + var json; + + try { + + json = JSON.parse( text ); + + } catch ( e ) { + + console.warn( 'THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.' ); + json = JSON.parse( text.substring( 65, text.length - 2 ) ); + + } + + var font = scope.parse( json ); + + if ( onLoad ) onLoad( font ); + + }, onProgress, onError ); + + }, + + parse: function ( json ) { + + return new Font( json ); + + } + + } ); + + var context; + + var AudioContext = { + + getContext: function () { + + if ( context === undefined ) { + + context = new ( window.AudioContext || window.webkitAudioContext )(); + + } + + return context; + + }, + + setContext: function ( value ) { + + context = value; + + } + + }; + + /** + * @author Reece Aaron Lecrivain / http://reecenotes.com/ + */ + + function AudioLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( AudioLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var loader = new FileLoader( this.manager ); + loader.setResponseType( 'arraybuffer' ); + loader.load( url, function ( buffer ) { + + var context = AudioContext.getContext(); + + context.decodeAudioData( buffer, function ( audioBuffer ) { + + onLoad( audioBuffer ); + + } ); + + }, onProgress, onError ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function StereoCamera() { + + this.type = 'StereoCamera'; + + this.aspect = 1; + + this.eyeSep = 0.064; + + this.cameraL = new PerspectiveCamera(); + this.cameraL.layers.enable( 1 ); + this.cameraL.matrixAutoUpdate = false; + + this.cameraR = new PerspectiveCamera(); + this.cameraR.layers.enable( 2 ); + this.cameraR.matrixAutoUpdate = false; + + } + + Object.assign( StereoCamera.prototype, { + + update: ( function () { + + var instance, focus, fov, aspect, near, far, zoom, eyeSep; + + var eyeRight = new Matrix4(); + var eyeLeft = new Matrix4(); + + return function update( camera ) { + + var needsUpdate = instance !== this || focus !== camera.focus || fov !== camera.fov || + aspect !== camera.aspect * this.aspect || near !== camera.near || + far !== camera.far || zoom !== camera.zoom || eyeSep !== this.eyeSep; + + if ( needsUpdate ) { + + instance = this; + focus = camera.focus; + fov = camera.fov; + aspect = camera.aspect * this.aspect; + near = camera.near; + far = camera.far; + zoom = camera.zoom; + + // Off-axis stereoscopic effect based on + // http://paulbourke.net/stereographics/stereorender/ + + var projectionMatrix = camera.projectionMatrix.clone(); + eyeSep = this.eyeSep / 2; + var eyeSepOnProjection = eyeSep * near / focus; + var ymax = ( near * Math.tan( _Math.DEG2RAD * fov * 0.5 ) ) / zoom; + var xmin, xmax; + + // translate xOffset + + eyeLeft.elements[ 12 ] = - eyeSep; + eyeRight.elements[ 12 ] = eyeSep; + + // for left eye + + xmin = - ymax * aspect + eyeSepOnProjection; + xmax = ymax * aspect + eyeSepOnProjection; + + projectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin ); + projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin ); + + this.cameraL.projectionMatrix.copy( projectionMatrix ); + + // for right eye + + xmin = - ymax * aspect - eyeSepOnProjection; + xmax = ymax * aspect - eyeSepOnProjection; + + projectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin ); + projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin ); + + this.cameraR.projectionMatrix.copy( projectionMatrix ); + + } + + this.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( eyeLeft ); + this.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( eyeRight ); + + }; + + } )() + + } ); + + /** + * Camera for rendering cube maps + * - renders scene into axis-aligned cube + * + * @author alteredq / http://alteredqualia.com/ + */ + + function CubeCamera( near, far, cubeResolution ) { + + Object3D.call( this ); + + this.type = 'CubeCamera'; + + var fov = 90, aspect = 1; + + var cameraPX = new PerspectiveCamera( fov, aspect, near, far ); + cameraPX.up.set( 0, - 1, 0 ); + cameraPX.lookAt( new Vector3( 1, 0, 0 ) ); + this.add( cameraPX ); + + var cameraNX = new PerspectiveCamera( fov, aspect, near, far ); + cameraNX.up.set( 0, - 1, 0 ); + cameraNX.lookAt( new Vector3( - 1, 0, 0 ) ); + this.add( cameraNX ); + + var cameraPY = new PerspectiveCamera( fov, aspect, near, far ); + cameraPY.up.set( 0, 0, 1 ); + cameraPY.lookAt( new Vector3( 0, 1, 0 ) ); + this.add( cameraPY ); + + var cameraNY = new PerspectiveCamera( fov, aspect, near, far ); + cameraNY.up.set( 0, 0, - 1 ); + cameraNY.lookAt( new Vector3( 0, - 1, 0 ) ); + this.add( cameraNY ); + + var cameraPZ = new PerspectiveCamera( fov, aspect, near, far ); + cameraPZ.up.set( 0, - 1, 0 ); + cameraPZ.lookAt( new Vector3( 0, 0, 1 ) ); + this.add( cameraPZ ); + + var cameraNZ = new PerspectiveCamera( fov, aspect, near, far ); + cameraNZ.up.set( 0, - 1, 0 ); + cameraNZ.lookAt( new Vector3( 0, 0, - 1 ) ); + this.add( cameraNZ ); + + var options = { format: RGBFormat, magFilter: LinearFilter, minFilter: LinearFilter }; + + this.renderTarget = new WebGLRenderTargetCube( cubeResolution, cubeResolution, options ); + this.renderTarget.texture.name = "CubeCamera"; + + this.updateCubeMap = function ( renderer, scene ) { + + if ( this.parent === null ) this.updateMatrixWorld(); + + var renderTarget = this.renderTarget; + var generateMipmaps = renderTarget.texture.generateMipmaps; + + renderTarget.texture.generateMipmaps = false; + + renderTarget.activeCubeFace = 0; + renderer.render( scene, cameraPX, renderTarget ); + + renderTarget.activeCubeFace = 1; + renderer.render( scene, cameraNX, renderTarget ); + + renderTarget.activeCubeFace = 2; + renderer.render( scene, cameraPY, renderTarget ); + + renderTarget.activeCubeFace = 3; + renderer.render( scene, cameraNY, renderTarget ); + + renderTarget.activeCubeFace = 4; + renderer.render( scene, cameraPZ, renderTarget ); + + renderTarget.texture.generateMipmaps = generateMipmaps; + + renderTarget.activeCubeFace = 5; + renderer.render( scene, cameraNZ, renderTarget ); + + renderer.setRenderTarget( null ); + + }; + + } + + CubeCamera.prototype = Object.create( Object3D.prototype ); + CubeCamera.prototype.constructor = CubeCamera; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function ArrayCamera( array ) { + + PerspectiveCamera.call( this ); + + this.enabled = false; + this.cameras = array || []; + + } + + ArrayCamera.prototype = Object.assign( Object.create( PerspectiveCamera.prototype ), { + + constructor: ArrayCamera, + + isArrayCamera: true + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function AudioListener() { + + Object3D.call( this ); + + this.type = 'AudioListener'; + + this.context = AudioContext.getContext(); + + this.gain = this.context.createGain(); + this.gain.connect( this.context.destination ); + + this.filter = null; + + } + + AudioListener.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: AudioListener, + + getInput: function () { + + return this.gain; + + }, + + removeFilter: function ( ) { + + if ( this.filter !== null ) { + + this.gain.disconnect( this.filter ); + this.filter.disconnect( this.context.destination ); + this.gain.connect( this.context.destination ); + this.filter = null; + + } + + }, + + getFilter: function () { + + return this.filter; + + }, + + setFilter: function ( value ) { + + if ( this.filter !== null ) { + + this.gain.disconnect( this.filter ); + this.filter.disconnect( this.context.destination ); + + } else { + + this.gain.disconnect( this.context.destination ); + + } + + this.filter = value; + this.gain.connect( this.filter ); + this.filter.connect( this.context.destination ); + + }, + + getMasterVolume: function () { + + return this.gain.gain.value; + + }, + + setMasterVolume: function ( value ) { + + this.gain.gain.value = value; + + }, + + updateMatrixWorld: ( function () { + + var position = new Vector3(); + var quaternion = new Quaternion(); + var scale = new Vector3(); + + var orientation = new Vector3(); + + return function updateMatrixWorld( force ) { + + Object3D.prototype.updateMatrixWorld.call( this, force ); + + var listener = this.context.listener; + var up = this.up; + + this.matrixWorld.decompose( position, quaternion, scale ); + + orientation.set( 0, 0, - 1 ).applyQuaternion( quaternion ); + + if ( listener.positionX ) { + + listener.positionX.setValueAtTime( position.x, this.context.currentTime ); + listener.positionY.setValueAtTime( position.y, this.context.currentTime ); + listener.positionZ.setValueAtTime( position.z, this.context.currentTime ); + listener.forwardX.setValueAtTime( orientation.x, this.context.currentTime ); + listener.forwardY.setValueAtTime( orientation.y, this.context.currentTime ); + listener.forwardZ.setValueAtTime( orientation.z, this.context.currentTime ); + listener.upX.setValueAtTime( up.x, this.context.currentTime ); + listener.upY.setValueAtTime( up.y, this.context.currentTime ); + listener.upZ.setValueAtTime( up.z, this.context.currentTime ); + + } else { + + listener.setPosition( position.x, position.y, position.z ); + listener.setOrientation( orientation.x, orientation.y, orientation.z, up.x, up.y, up.z ); + + } + + }; + + } )() + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Reece Aaron Lecrivain / http://reecenotes.com/ + */ + + function Audio( listener ) { + + Object3D.call( this ); + + this.type = 'Audio'; + + this.context = listener.context; + + this.gain = this.context.createGain(); + this.gain.connect( listener.getInput() ); + + this.autoplay = false; + + this.buffer = null; + this.loop = false; + this.startTime = 0; + this.playbackRate = 1; + this.isPlaying = false; + this.hasPlaybackControl = true; + this.sourceType = 'empty'; + + this.filters = []; + + } + + Audio.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Audio, + + getOutput: function () { + + return this.gain; + + }, + + setNodeSource: function ( audioNode ) { + + this.hasPlaybackControl = false; + this.sourceType = 'audioNode'; + this.source = audioNode; + this.connect(); + + return this; + + }, + + setBuffer: function ( audioBuffer ) { + + this.buffer = audioBuffer; + this.sourceType = 'buffer'; + + if ( this.autoplay ) this.play(); + + return this; + + }, + + play: function () { + + if ( this.isPlaying === true ) { + + console.warn( 'THREE.Audio: Audio is already playing.' ); + return; + + } + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + var source = this.context.createBufferSource(); + + source.buffer = this.buffer; + source.loop = this.loop; + source.onended = this.onEnded.bind( this ); + source.playbackRate.setValueAtTime( this.playbackRate, this.startTime ); + source.start( 0, this.startTime ); + + this.isPlaying = true; + + this.source = source; + + return this.connect(); + + }, + + pause: function () { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.source.stop(); + this.startTime = this.context.currentTime; + this.isPlaying = false; + + return this; + + }, + + stop: function () { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.source.stop(); + this.startTime = 0; + this.isPlaying = false; + + return this; + + }, + + connect: function () { + + if ( this.filters.length > 0 ) { + + this.source.connect( this.filters[ 0 ] ); + + for ( var i = 1, l = this.filters.length; i < l; i ++ ) { + + this.filters[ i - 1 ].connect( this.filters[ i ] ); + + } + + this.filters[ this.filters.length - 1 ].connect( this.getOutput() ); + + } else { + + this.source.connect( this.getOutput() ); + + } + + return this; + + }, + + disconnect: function () { + + if ( this.filters.length > 0 ) { + + this.source.disconnect( this.filters[ 0 ] ); + + for ( var i = 1, l = this.filters.length; i < l; i ++ ) { + + this.filters[ i - 1 ].disconnect( this.filters[ i ] ); + + } + + this.filters[ this.filters.length - 1 ].disconnect( this.getOutput() ); + + } else { + + this.source.disconnect( this.getOutput() ); + + } + + return this; + + }, + + getFilters: function () { + + return this.filters; + + }, + + setFilters: function ( value ) { + + if ( ! value ) value = []; + + if ( this.isPlaying === true ) { + + this.disconnect(); + this.filters = value; + this.connect(); + + } else { + + this.filters = value; + + } + + return this; + + }, + + getFilter: function () { + + return this.getFilters()[ 0 ]; + + }, + + setFilter: function ( filter ) { + + return this.setFilters( filter ? [ filter ] : [] ); + + }, + + setPlaybackRate: function ( value ) { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.playbackRate = value; + + if ( this.isPlaying === true ) { + + this.source.playbackRate.setValueAtTime( this.playbackRate, this.context.currentTime ); + + } + + return this; + + }, + + getPlaybackRate: function () { + + return this.playbackRate; + + }, + + onEnded: function () { + + this.isPlaying = false; + + }, + + getLoop: function () { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return false; + + } + + return this.loop; + + }, + + setLoop: function ( value ) { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.loop = value; + + if ( this.isPlaying === true ) { + + this.source.loop = this.loop; + + } + + return this; + + }, + + getVolume: function () { + + return this.gain.gain.value; + + }, + + setVolume: function ( value ) { + + this.gain.gain.value = value; + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function PositionalAudio( listener ) { + + Audio.call( this, listener ); + + this.panner = this.context.createPanner(); + this.panner.connect( this.gain ); + + } + + PositionalAudio.prototype = Object.assign( Object.create( Audio.prototype ), { + + constructor: PositionalAudio, + + getOutput: function () { + + return this.panner; + + }, + + getRefDistance: function () { + + return this.panner.refDistance; + + }, + + setRefDistance: function ( value ) { + + this.panner.refDistance = value; + + }, + + getRolloffFactor: function () { + + return this.panner.rolloffFactor; + + }, + + setRolloffFactor: function ( value ) { + + this.panner.rolloffFactor = value; + + }, + + getDistanceModel: function () { + + return this.panner.distanceModel; + + }, + + setDistanceModel: function ( value ) { + + this.panner.distanceModel = value; + + }, + + getMaxDistance: function () { + + return this.panner.maxDistance; + + }, + + setMaxDistance: function ( value ) { + + this.panner.maxDistance = value; + + }, + + updateMatrixWorld: ( function () { + + var position = new Vector3(); + + return function updateMatrixWorld( force ) { + + Object3D.prototype.updateMatrixWorld.call( this, force ); + + position.setFromMatrixPosition( this.matrixWorld ); + + this.panner.setPosition( position.x, position.y, position.z ); + + }; + + } )() + + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function AudioAnalyser( audio, fftSize ) { + + this.analyser = audio.context.createAnalyser(); + this.analyser.fftSize = fftSize !== undefined ? fftSize : 2048; + + this.data = new Uint8Array( this.analyser.frequencyBinCount ); + + audio.getOutput().connect( this.analyser ); + + } + + Object.assign( AudioAnalyser.prototype, { + + getFrequencyData: function () { + + this.analyser.getByteFrequencyData( this.data ); + + return this.data; + + }, + + getAverageFrequency: function () { + + var value = 0, data = this.getFrequencyData(); + + for ( var i = 0; i < data.length; i ++ ) { + + value += data[ i ]; + + } + + return value / data.length; + + } + + } ); + + /** + * + * Buffered scene graph property that allows weighted accumulation. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function PropertyMixer( binding, typeName, valueSize ) { + + this.binding = binding; + this.valueSize = valueSize; + + var bufferType = Float64Array, + mixFunction; + + switch ( typeName ) { + + case 'quaternion': + mixFunction = this._slerp; + break; + + case 'string': + case 'bool': + bufferType = Array; + mixFunction = this._select; + break; + + default: + mixFunction = this._lerp; + + } + + this.buffer = new bufferType( valueSize * 4 ); + // layout: [ incoming | accu0 | accu1 | orig ] + // + // interpolators can use .buffer as their .result + // the data then goes to 'incoming' + // + // 'accu0' and 'accu1' are used frame-interleaved for + // the cumulative result and are compared to detect + // changes + // + // 'orig' stores the original state of the property + + this._mixBufferRegion = mixFunction; + + this.cumulativeWeight = 0; + + this.useCount = 0; + this.referenceCount = 0; + + } + + Object.assign( PropertyMixer.prototype, { + + // accumulate data in the 'incoming' region into 'accu<i>' + accumulate: function ( accuIndex, weight ) { + + // note: happily accumulating nothing when weight = 0, the caller knows + // the weight and shouldn't have made the call in the first place + + var buffer = this.buffer, + stride = this.valueSize, + offset = accuIndex * stride + stride, + + currentWeight = this.cumulativeWeight; + + if ( currentWeight === 0 ) { + + // accuN := incoming * weight + + for ( var i = 0; i !== stride; ++ i ) { + + buffer[ offset + i ] = buffer[ i ]; + + } + + currentWeight = weight; + + } else { + + // accuN := accuN + incoming * weight + + currentWeight += weight; + var mix = weight / currentWeight; + this._mixBufferRegion( buffer, offset, 0, mix, stride ); + + } + + this.cumulativeWeight = currentWeight; + + }, + + // apply the state of 'accu<i>' to the binding when accus differ + apply: function ( accuIndex ) { + + var stride = this.valueSize, + buffer = this.buffer, + offset = accuIndex * stride + stride, + + weight = this.cumulativeWeight, + + binding = this.binding; + + this.cumulativeWeight = 0; + + if ( weight < 1 ) { + + // accuN := accuN + original * ( 1 - cumulativeWeight ) + + var originalValueOffset = stride * 3; + + this._mixBufferRegion( + buffer, offset, originalValueOffset, 1 - weight, stride ); + + } + + for ( var i = stride, e = stride + stride; i !== e; ++ i ) { + + if ( buffer[ i ] !== buffer[ i + stride ] ) { + + // value has changed -> update scene graph + + binding.setValue( buffer, offset ); + break; + + } + + } + + }, + + // remember the state of the bound property and copy it to both accus + saveOriginalState: function () { + + var binding = this.binding; + + var buffer = this.buffer, + stride = this.valueSize, + + originalValueOffset = stride * 3; + + binding.getValue( buffer, originalValueOffset ); + + // accu[0..1] := orig -- initially detect changes against the original + for ( var i = stride, e = originalValueOffset; i !== e; ++ i ) { + + buffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ]; + + } + + this.cumulativeWeight = 0; + + }, + + // apply the state previously taken via 'saveOriginalState' to the binding + restoreOriginalState: function () { + + var originalValueOffset = this.valueSize * 3; + this.binding.setValue( this.buffer, originalValueOffset ); + + }, + + + // mix functions + + _select: function ( buffer, dstOffset, srcOffset, t, stride ) { + + if ( t >= 0.5 ) { + + for ( var i = 0; i !== stride; ++ i ) { + + buffer[ dstOffset + i ] = buffer[ srcOffset + i ]; + + } + + } + + }, + + _slerp: function ( buffer, dstOffset, srcOffset, t ) { + + Quaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t ); + + }, + + _lerp: function ( buffer, dstOffset, srcOffset, t, stride ) { + + var s = 1 - t; + + for ( var i = 0; i !== stride; ++ i ) { + + var j = dstOffset + i; + + buffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t; + + } + + } + + } ); + + /** + * + * A reference to a real property in the scene graph. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function Composite( targetGroup, path, optionalParsedPath ) { + + var parsedPath = optionalParsedPath || PropertyBinding.parseTrackName( path ); + + this._targetGroup = targetGroup; + this._bindings = targetGroup.subscribe_( path, parsedPath ); + + } + + Object.assign( Composite.prototype, { + + getValue: function ( array, offset ) { + + this.bind(); // bind all binding + + var firstValidIndex = this._targetGroup.nCachedObjects_, + binding = this._bindings[ firstValidIndex ]; + + // and only call .getValue on the first + if ( binding !== undefined ) binding.getValue( array, offset ); + + }, + + setValue: function ( array, offset ) { + + var bindings = this._bindings; + + for ( var i = this._targetGroup.nCachedObjects_, + n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].setValue( array, offset ); + + } + + }, + + bind: function () { + + var bindings = this._bindings; + + for ( var i = this._targetGroup.nCachedObjects_, + n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].bind(); + + } + + }, + + unbind: function () { + + var bindings = this._bindings; + + for ( var i = this._targetGroup.nCachedObjects_, + n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].unbind(); + + } + + } + + } ); + + + function PropertyBinding( rootNode, path, parsedPath ) { + + this.path = path; + this.parsedPath = parsedPath || PropertyBinding.parseTrackName( path ); + + this.node = PropertyBinding.findNode( rootNode, this.parsedPath.nodeName ) || rootNode; + + this.rootNode = rootNode; + + } + + Object.assign( PropertyBinding, { + + Composite: Composite, + + create: function ( root, path, parsedPath ) { + + if ( ! ( root && root.isAnimationObjectGroup ) ) { + + return new PropertyBinding( root, path, parsedPath ); + + } else { + + return new PropertyBinding.Composite( root, path, parsedPath ); + + } + + }, + + parseTrackName: function () { + + // Parent directories, delimited by '/' or ':'. Currently unused, but must + // be matched to parse the rest of the track name. + var directoryRe = /((?:[\w-]+[\/:])*)/; + + // Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'. + var nodeRe = /([\w-\.]+)?/; + + // Object on target node, and accessor. Name may contain only word + // characters. Accessor may contain any character except closing bracket. + var objectRe = /(?:\.([\w-]+)(?:\[(.+)\])?)?/; + + // Property and accessor. May contain only word characters. Accessor may + // contain any non-bracket characters. + var propertyRe = /\.([\w-]+)(?:\[(.+)\])?/; + + var trackRe = new RegExp('' + + '^' + + directoryRe.source + + nodeRe.source + + objectRe.source + + propertyRe.source + + '$' + ); + + var supportedObjectNames = [ 'material', 'materials', 'bones' ]; + + return function ( trackName ) { + + var matches = trackRe.exec( trackName ); + + if ( ! matches ) { + + throw new Error( 'PropertyBinding: Cannot parse trackName: ' + trackName ); + + } + + var results = { + // directoryName: matches[ 1 ], // (tschw) currently unused + nodeName: matches[ 2 ], + objectName: matches[ 3 ], + objectIndex: matches[ 4 ], + propertyName: matches[ 5 ], // required + propertyIndex: matches[ 6 ] + }; + + var lastDot = results.nodeName && results.nodeName.lastIndexOf( '.' ); + + if ( lastDot !== undefined && lastDot !== -1 ) { + + var objectName = results.nodeName.substring( lastDot + 1 ); + + // Object names must be checked against a whitelist. Otherwise, there + // is no way to parse 'foo.bar.baz': 'baz' must be a property, but + // 'bar' could be the objectName, or part of a nodeName (which can + // include '.' characters). + if ( supportedObjectNames.indexOf( objectName ) !== -1 ) { + + results.nodeName = results.nodeName.substring( 0, lastDot ); + results.objectName = objectName; + + } + + } + + if ( results.propertyName === null || results.propertyName.length === 0 ) { + + throw new Error( 'PropertyBinding: can not parse propertyName from trackName: ' + trackName ); + + } + + return results; + + }; + + }(), + + findNode: function ( root, nodeName ) { + + if ( ! nodeName || nodeName === "" || nodeName === "root" || nodeName === "." || nodeName === - 1 || nodeName === root.name || nodeName === root.uuid ) { + + return root; + + } + + // search into skeleton bones. + if ( root.skeleton ) { + + var searchSkeleton = function ( skeleton ) { + + for ( var i = 0; i < skeleton.bones.length; i ++ ) { + + var bone = skeleton.bones[ i ]; + + if ( bone.name === nodeName ) { + + return bone; + + } + + } + + return null; + + }; + + var bone = searchSkeleton( root.skeleton ); + + if ( bone ) { + + return bone; + + } + + } + + // search into node subtree. + if ( root.children ) { + + var searchNodeSubtree = function ( children ) { + + for ( var i = 0; i < children.length; i ++ ) { + + var childNode = children[ i ]; + + if ( childNode.name === nodeName || childNode.uuid === nodeName ) { + + return childNode; + + } + + var result = searchNodeSubtree( childNode.children ); + + if ( result ) return result; + + } + + return null; + + }; + + var subTreeNode = searchNodeSubtree( root.children ); + + if ( subTreeNode ) { + + return subTreeNode; + + } + + } + + return null; + + } + + } ); + + Object.assign( PropertyBinding.prototype, { // prototype, continued + + // these are used to "bind" a nonexistent property + _getValue_unavailable: function () {}, + _setValue_unavailable: function () {}, + + BindingType: { + Direct: 0, + EntireArray: 1, + ArrayElement: 2, + HasFromToArray: 3 + }, + + Versioning: { + None: 0, + NeedsUpdate: 1, + MatrixWorldNeedsUpdate: 2 + }, + + GetterByBindingType: [ + + function getValue_direct( buffer, offset ) { + + buffer[ offset ] = this.node[ this.propertyName ]; + + }, + + function getValue_array( buffer, offset ) { + + var source = this.resolvedProperty; + + for ( var i = 0, n = source.length; i !== n; ++ i ) { + + buffer[ offset ++ ] = source[ i ]; + + } + + }, + + function getValue_arrayElement( buffer, offset ) { + + buffer[ offset ] = this.resolvedProperty[ this.propertyIndex ]; + + }, + + function getValue_toArray( buffer, offset ) { + + this.resolvedProperty.toArray( buffer, offset ); + + } + + ], + + SetterByBindingTypeAndVersioning: [ + + [ + // Direct + + function setValue_direct( buffer, offset ) { + + this.node[ this.propertyName ] = buffer[ offset ]; + + }, + + function setValue_direct_setNeedsUpdate( buffer, offset ) { + + this.node[ this.propertyName ] = buffer[ offset ]; + this.targetObject.needsUpdate = true; + + }, + + function setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.node[ this.propertyName ] = buffer[ offset ]; + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ], [ + + // EntireArray + + function setValue_array( buffer, offset ) { + + var dest = this.resolvedProperty; + + for ( var i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + }, + + function setValue_array_setNeedsUpdate( buffer, offset ) { + + var dest = this.resolvedProperty; + + for ( var i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + this.targetObject.needsUpdate = true; + + }, + + function setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) { + + var dest = this.resolvedProperty; + + for ( var i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ], [ + + // ArrayElement + + function setValue_arrayElement( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + + }, + + function setValue_arrayElement_setNeedsUpdate( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + this.targetObject.needsUpdate = true; + + }, + + function setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ], [ + + // HasToFromArray + + function setValue_fromArray( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + + }, + + function setValue_fromArray_setNeedsUpdate( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + this.targetObject.needsUpdate = true; + + }, + + function setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ] + + ], + + getValue: function getValue_unbound( targetArray, offset ) { + + this.bind(); + this.getValue( targetArray, offset ); + + // Note: This class uses a State pattern on a per-method basis: + // 'bind' sets 'this.getValue' / 'setValue' and shadows the + // prototype version of these methods with one that represents + // the bound state. When the property is not found, the methods + // become no-ops. + + }, + + setValue: function getValue_unbound( sourceArray, offset ) { + + this.bind(); + this.setValue( sourceArray, offset ); + + }, + + // create getter / setter pair for a property in the scene graph + bind: function () { + + var targetObject = this.node, + parsedPath = this.parsedPath, + + objectName = parsedPath.objectName, + propertyName = parsedPath.propertyName, + propertyIndex = parsedPath.propertyIndex; + + if ( ! targetObject ) { + + targetObject = PropertyBinding.findNode( + this.rootNode, parsedPath.nodeName ) || this.rootNode; + + this.node = targetObject; + + } + + // set fail state so we can just 'return' on error + this.getValue = this._getValue_unavailable; + this.setValue = this._setValue_unavailable; + + // ensure there is a value node + if ( ! targetObject ) { + + console.error( " trying to update node for track: " + this.path + " but it wasn't found." ); + return; + + } + + if ( objectName ) { + + var objectIndex = parsedPath.objectIndex; + + // special cases were we need to reach deeper into the hierarchy to get the face materials.... + switch ( objectName ) { + + case 'materials': + + if ( ! targetObject.material ) { + + console.error( ' can not bind to material as node does not have a material', this ); + return; + + } + + if ( ! targetObject.material.materials ) { + + console.error( ' can not bind to material.materials as node.material does not have a materials array', this ); + return; + + } + + targetObject = targetObject.material.materials; + + break; + + case 'bones': + + if ( ! targetObject.skeleton ) { + + console.error( ' can not bind to bones as node does not have a skeleton', this ); + return; + + } + + // potential future optimization: skip this if propertyIndex is already an integer + // and convert the integer string to a true integer. + + targetObject = targetObject.skeleton.bones; + + // support resolving morphTarget names into indices. + for ( var i = 0; i < targetObject.length; i ++ ) { + + if ( targetObject[ i ].name === objectIndex ) { + + objectIndex = i; + break; + + } + + } + + break; + + default: + + if ( targetObject[ objectName ] === undefined ) { + + console.error( ' can not bind to objectName of node, undefined', this ); + return; + + } + + targetObject = targetObject[ objectName ]; + + } + + + if ( objectIndex !== undefined ) { + + if ( targetObject[ objectIndex ] === undefined ) { + + console.error( " trying to bind to objectIndex of objectName, but is undefined:", this, targetObject ); + return; + + } + + targetObject = targetObject[ objectIndex ]; + + } + + } + + // resolve property + var nodeProperty = targetObject[ propertyName ]; + + if ( nodeProperty === undefined ) { + + var nodeName = parsedPath.nodeName; + + console.error( " trying to update property for track: " + nodeName + + '.' + propertyName + " but it wasn't found.", targetObject ); + return; + + } + + // determine versioning scheme + var versioning = this.Versioning.None; + + if ( targetObject.needsUpdate !== undefined ) { // material + + versioning = this.Versioning.NeedsUpdate; + this.targetObject = targetObject; + + } else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform + + versioning = this.Versioning.MatrixWorldNeedsUpdate; + this.targetObject = targetObject; + + } + + // determine how the property gets bound + var bindingType = this.BindingType.Direct; + + if ( propertyIndex !== undefined ) { + + // access a sub element of the property array (only primitives are supported right now) + + if ( propertyName === "morphTargetInfluences" ) { + + // potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer. + + // support resolving morphTarget names into indices. + if ( ! targetObject.geometry ) { + + console.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry', this ); + return; + + } + + if ( ! targetObject.geometry.morphTargets ) { + + console.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry.morphTargets', this ); + return; + + } + + for ( var i = 0; i < this.node.geometry.morphTargets.length; i ++ ) { + + if ( targetObject.geometry.morphTargets[ i ].name === propertyIndex ) { + + propertyIndex = i; + break; + + } + + } + + } + + bindingType = this.BindingType.ArrayElement; + + this.resolvedProperty = nodeProperty; + this.propertyIndex = propertyIndex; + + } else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) { + + // must use copy for Object3D.Euler/Quaternion + + bindingType = this.BindingType.HasFromToArray; + + this.resolvedProperty = nodeProperty; + + } else if ( Array.isArray( nodeProperty ) ) { + + bindingType = this.BindingType.EntireArray; + + this.resolvedProperty = nodeProperty; + + } else { + + this.propertyName = propertyName; + + } + + // select getter / setter + this.getValue = this.GetterByBindingType[ bindingType ]; + this.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ]; + + }, + + unbind: function () { + + this.node = null; + + // back to the prototype version of getValue / setValue + // note: avoiding to mutate the shape of 'this' via 'delete' + this.getValue = this._getValue_unbound; + this.setValue = this._setValue_unbound; + + } + + } ); + + //!\ DECLARE ALIAS AFTER assign prototype ! + Object.assign( PropertyBinding.prototype, { + + // initial state of these methods that calls 'bind' + _getValue_unbound: PropertyBinding.prototype.getValue, + _setValue_unbound: PropertyBinding.prototype.setValue, + + } ); + + /** + * + * A group of objects that receives a shared animation state. + * + * Usage: + * + * - Add objects you would otherwise pass as 'root' to the + * constructor or the .clipAction method of AnimationMixer. + * + * - Instead pass this object as 'root'. + * + * - You can also add and remove objects later when the mixer + * is running. + * + * Note: + * + * Objects of this class appear as one object to the mixer, + * so cache control of the individual objects must be done + * on the group. + * + * Limitation: + * + * - The animated properties must be compatible among the + * all objects in the group. + * + * - A single property can either be controlled through a + * target group or directly, but not both. + * + * @author tschw + */ + + function AnimationObjectGroup( var_args ) { + + this.uuid = _Math.generateUUID(); + + // cached objects followed by the active ones + this._objects = Array.prototype.slice.call( arguments ); + + this.nCachedObjects_ = 0; // threshold + // note: read by PropertyBinding.Composite + + var indices = {}; + this._indicesByUUID = indices; // for bookkeeping + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + indices[ arguments[ i ].uuid ] = i; + + } + + this._paths = []; // inside: string + this._parsedPaths = []; // inside: { we don't care, here } + this._bindings = []; // inside: Array< PropertyBinding > + this._bindingsIndicesByPath = {}; // inside: indices in these arrays + + var scope = this; + + this.stats = { + + objects: { + get total() { return scope._objects.length; }, + get inUse() { return this.total - scope.nCachedObjects_; } + }, + + get bindingsPerObject() { return scope._bindings.length; } + + }; + + } + + Object.assign( AnimationObjectGroup.prototype, { + + isAnimationObjectGroup: true, + + add: function( var_args ) { + + var objects = this._objects, + nObjects = objects.length, + nCachedObjects = this.nCachedObjects_, + indicesByUUID = this._indicesByUUID, + paths = this._paths, + parsedPaths = this._parsedPaths, + bindings = this._bindings, + nBindings = bindings.length; + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + var object = arguments[ i ], + uuid = object.uuid, + index = indicesByUUID[ uuid ], + knownObject = undefined; + + if ( index === undefined ) { + + // unknown object -> add it to the ACTIVE region + + index = nObjects ++; + indicesByUUID[ uuid ] = index; + objects.push( object ); + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + bindings[ j ].push( + new PropertyBinding( + object, paths[ j ], parsedPaths[ j ] ) ); + + } + + } else if ( index < nCachedObjects ) { + + knownObject = objects[ index ]; + + // move existing object to the ACTIVE region + + var firstActiveIndex = -- nCachedObjects, + lastCachedObject = objects[ firstActiveIndex ]; + + indicesByUUID[ lastCachedObject.uuid ] = index; + objects[ index ] = lastCachedObject; + + indicesByUUID[ uuid ] = firstActiveIndex; + objects[ firstActiveIndex ] = object; + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ], + lastCached = bindingsForPath[ firstActiveIndex ], + binding = bindingsForPath[ index ]; + + bindingsForPath[ index ] = lastCached; + + if ( binding === undefined ) { + + // since we do not bother to create new bindings + // for objects that are cached, the binding may + // or may not exist + + binding = new PropertyBinding( + object, paths[ j ], parsedPaths[ j ] ); + + } + + bindingsForPath[ firstActiveIndex ] = binding; + + } + + } else if ( objects[ index ] !== knownObject ) { + + console.error( "Different objects with the same UUID " + + "detected. Clean the caches or recreate your " + + "infrastructure when reloading scenes..." ); + + } // else the object is already where we want it to be + + } // for arguments + + this.nCachedObjects_ = nCachedObjects; + + }, + + remove: function( var_args ) { + + var objects = this._objects, + nCachedObjects = this.nCachedObjects_, + indicesByUUID = this._indicesByUUID, + bindings = this._bindings, + nBindings = bindings.length; + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + var object = arguments[ i ], + uuid = object.uuid, + index = indicesByUUID[ uuid ]; + + if ( index !== undefined && index >= nCachedObjects ) { + + // move existing object into the CACHED region + + var lastCachedIndex = nCachedObjects ++, + firstActiveObject = objects[ lastCachedIndex ]; + + indicesByUUID[ firstActiveObject.uuid ] = index; + objects[ index ] = firstActiveObject; + + indicesByUUID[ uuid ] = lastCachedIndex; + objects[ lastCachedIndex ] = object; + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ], + firstActive = bindingsForPath[ lastCachedIndex ], + binding = bindingsForPath[ index ]; + + bindingsForPath[ index ] = firstActive; + bindingsForPath[ lastCachedIndex ] = binding; + + } + + } + + } // for arguments + + this.nCachedObjects_ = nCachedObjects; + + }, + + // remove & forget + uncache: function( var_args ) { + + var objects = this._objects, + nObjects = objects.length, + nCachedObjects = this.nCachedObjects_, + indicesByUUID = this._indicesByUUID, + bindings = this._bindings, + nBindings = bindings.length; + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + var object = arguments[ i ], + uuid = object.uuid, + index = indicesByUUID[ uuid ]; + + if ( index !== undefined ) { + + delete indicesByUUID[ uuid ]; + + if ( index < nCachedObjects ) { + + // object is cached, shrink the CACHED region + + var firstActiveIndex = -- nCachedObjects, + lastCachedObject = objects[ firstActiveIndex ], + lastIndex = -- nObjects, + lastObject = objects[ lastIndex ]; + + // last cached object takes this object's place + indicesByUUID[ lastCachedObject.uuid ] = index; + objects[ index ] = lastCachedObject; + + // last object goes to the activated slot and pop + indicesByUUID[ lastObject.uuid ] = firstActiveIndex; + objects[ firstActiveIndex ] = lastObject; + objects.pop(); + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ], + lastCached = bindingsForPath[ firstActiveIndex ], + last = bindingsForPath[ lastIndex ]; + + bindingsForPath[ index ] = lastCached; + bindingsForPath[ firstActiveIndex ] = last; + bindingsForPath.pop(); + + } + + } else { + + // object is active, just swap with the last and pop + + var lastIndex = -- nObjects, + lastObject = objects[ lastIndex ]; + + indicesByUUID[ lastObject.uuid ] = index; + objects[ index ] = lastObject; + objects.pop(); + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ]; + + bindingsForPath[ index ] = bindingsForPath[ lastIndex ]; + bindingsForPath.pop(); + + } + + } // cached or active + + } // if object is known + + } // for arguments + + this.nCachedObjects_ = nCachedObjects; + + }, + + // Internal interface used by befriended PropertyBinding.Composite: + + subscribe_: function ( path, parsedPath ) { + + // returns an array of bindings for the given path that is changed + // according to the contained objects in the group + + var indicesByPath = this._bindingsIndicesByPath, + index = indicesByPath[ path ], + bindings = this._bindings; + + if ( index !== undefined ) return bindings[ index ]; + + var paths = this._paths, + parsedPaths = this._parsedPaths, + objects = this._objects, + nObjects = objects.length, + nCachedObjects = this.nCachedObjects_, + bindingsForPath = new Array( nObjects ); + + index = bindings.length; + + indicesByPath[ path ] = index; + + paths.push( path ); + parsedPaths.push( parsedPath ); + bindings.push( bindingsForPath ); + + for ( var i = nCachedObjects, n = objects.length; i !== n; ++ i ) { + + var object = objects[ i ]; + bindingsForPath[ i ] = new PropertyBinding( object, path, parsedPath ); + + } + + return bindingsForPath; + + }, + + unsubscribe_: function ( path ) { + + // tells the group to forget about a property path and no longer + // update the array previously obtained with 'subscribe_' + + var indicesByPath = this._bindingsIndicesByPath, + index = indicesByPath[ path ]; + + if ( index !== undefined ) { + + var paths = this._paths, + parsedPaths = this._parsedPaths, + bindings = this._bindings, + lastBindingsIndex = bindings.length - 1, + lastBindings = bindings[ lastBindingsIndex ], + lastBindingsPath = path[ lastBindingsIndex ]; + + indicesByPath[ lastBindingsPath ] = index; + + bindings[ index ] = lastBindings; + bindings.pop(); + + parsedPaths[ index ] = parsedPaths[ lastBindingsIndex ]; + parsedPaths.pop(); + + paths[ index ] = paths[ lastBindingsIndex ]; + paths.pop(); + + } + + } + + } ); + + /** + * + * Action provided by AnimationMixer for scheduling clip playback on specific + * objects. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + * + */ + + function AnimationAction( mixer, clip, localRoot ) { + + this._mixer = mixer; + this._clip = clip; + this._localRoot = localRoot || null; + + var tracks = clip.tracks, + nTracks = tracks.length, + interpolants = new Array( nTracks ); + + var interpolantSettings = { + endingStart: ZeroCurvatureEnding, + endingEnd: ZeroCurvatureEnding + }; + + for ( var i = 0; i !== nTracks; ++ i ) { + + var interpolant = tracks[ i ].createInterpolant( null ); + interpolants[ i ] = interpolant; + interpolant.settings = interpolantSettings; + + } + + this._interpolantSettings = interpolantSettings; + + this._interpolants = interpolants; // bound by the mixer + + // inside: PropertyMixer (managed by the mixer) + this._propertyBindings = new Array( nTracks ); + + this._cacheIndex = null; // for the memory manager + this._byClipCacheIndex = null; // for the memory manager + + this._timeScaleInterpolant = null; + this._weightInterpolant = null; + + this.loop = LoopRepeat; + this._loopCount = -1; + + // global mixer time when the action is to be started + // it's set back to 'null' upon start of the action + this._startTime = null; + + // scaled local time of the action + // gets clamped or wrapped to 0..clip.duration according to loop + this.time = 0; + + this.timeScale = 1; + this._effectiveTimeScale = 1; + + this.weight = 1; + this._effectiveWeight = 1; + + this.repetitions = Infinity; // no. of repetitions when looping + + this.paused = false; // true -> zero effective time scale + this.enabled = true; // false -> zero effective weight + + this.clampWhenFinished = false; // keep feeding the last frame? + + this.zeroSlopeAtStart = true; // for smooth interpolation w/o separate + this.zeroSlopeAtEnd = true; // clips for start, loop and end + + } + + Object.assign( AnimationAction.prototype, { + + // State & Scheduling + + play: function() { + + this._mixer._activateAction( this ); + + return this; + + }, + + stop: function() { + + this._mixer._deactivateAction( this ); + + return this.reset(); + + }, + + reset: function() { + + this.paused = false; + this.enabled = true; + + this.time = 0; // restart clip + this._loopCount = -1; // forget previous loops + this._startTime = null; // forget scheduling + + return this.stopFading().stopWarping(); + + }, + + isRunning: function() { + + return this.enabled && ! this.paused && this.timeScale !== 0 && + this._startTime === null && this._mixer._isActiveAction( this ); + + }, + + // return true when play has been called + isScheduled: function() { + + return this._mixer._isActiveAction( this ); + + }, + + startAt: function( time ) { + + this._startTime = time; + + return this; + + }, + + setLoop: function( mode, repetitions ) { + + this.loop = mode; + this.repetitions = repetitions; + + return this; + + }, + + // Weight + + // set the weight stopping any scheduled fading + // although .enabled = false yields an effective weight of zero, this + // method does *not* change .enabled, because it would be confusing + setEffectiveWeight: function( weight ) { + + this.weight = weight; + + // note: same logic as when updated at runtime + this._effectiveWeight = this.enabled ? weight : 0; + + return this.stopFading(); + + }, + + // return the weight considering fading and .enabled + getEffectiveWeight: function() { + + return this._effectiveWeight; + + }, + + fadeIn: function( duration ) { + + return this._scheduleFading( duration, 0, 1 ); + + }, + + fadeOut: function( duration ) { + + return this._scheduleFading( duration, 1, 0 ); + + }, + + crossFadeFrom: function( fadeOutAction, duration, warp ) { + + fadeOutAction.fadeOut( duration ); + this.fadeIn( duration ); + + if( warp ) { + + var fadeInDuration = this._clip.duration, + fadeOutDuration = fadeOutAction._clip.duration, + + startEndRatio = fadeOutDuration / fadeInDuration, + endStartRatio = fadeInDuration / fadeOutDuration; + + fadeOutAction.warp( 1.0, startEndRatio, duration ); + this.warp( endStartRatio, 1.0, duration ); + + } + + return this; + + }, + + crossFadeTo: function( fadeInAction, duration, warp ) { + + return fadeInAction.crossFadeFrom( this, duration, warp ); + + }, + + stopFading: function() { + + var weightInterpolant = this._weightInterpolant; + + if ( weightInterpolant !== null ) { + + this._weightInterpolant = null; + this._mixer._takeBackControlInterpolant( weightInterpolant ); + + } + + return this; + + }, + + // Time Scale Control + + // set the time scale stopping any scheduled warping + // although .paused = true yields an effective time scale of zero, this + // method does *not* change .paused, because it would be confusing + setEffectiveTimeScale: function( timeScale ) { + + this.timeScale = timeScale; + this._effectiveTimeScale = this.paused ? 0 :timeScale; + + return this.stopWarping(); + + }, + + // return the time scale considering warping and .paused + getEffectiveTimeScale: function() { + + return this._effectiveTimeScale; + + }, + + setDuration: function( duration ) { + + this.timeScale = this._clip.duration / duration; + + return this.stopWarping(); + + }, + + syncWith: function( action ) { + + this.time = action.time; + this.timeScale = action.timeScale; + + return this.stopWarping(); + + }, + + halt: function( duration ) { + + return this.warp( this._effectiveTimeScale, 0, duration ); + + }, + + warp: function( startTimeScale, endTimeScale, duration ) { + + var mixer = this._mixer, now = mixer.time, + interpolant = this._timeScaleInterpolant, + + timeScale = this.timeScale; + + if ( interpolant === null ) { + + interpolant = mixer._lendControlInterpolant(); + this._timeScaleInterpolant = interpolant; + + } + + var times = interpolant.parameterPositions, + values = interpolant.sampleValues; + + times[ 0 ] = now; + times[ 1 ] = now + duration; + + values[ 0 ] = startTimeScale / timeScale; + values[ 1 ] = endTimeScale / timeScale; + + return this; + + }, + + stopWarping: function() { + + var timeScaleInterpolant = this._timeScaleInterpolant; + + if ( timeScaleInterpolant !== null ) { + + this._timeScaleInterpolant = null; + this._mixer._takeBackControlInterpolant( timeScaleInterpolant ); + + } + + return this; + + }, + + // Object Accessors + + getMixer: function() { + + return this._mixer; + + }, + + getClip: function() { + + return this._clip; + + }, + + getRoot: function() { + + return this._localRoot || this._mixer._root; + + }, + + // Interna + + _update: function( time, deltaTime, timeDirection, accuIndex ) { + + // called by the mixer + + if ( ! this.enabled ) { + + // call ._updateWeight() to update ._effectiveWeight + + this._updateWeight( time ); + return; + + } + + var startTime = this._startTime; + + if ( startTime !== null ) { + + // check for scheduled start of action + + var timeRunning = ( time - startTime ) * timeDirection; + if ( timeRunning < 0 || timeDirection === 0 ) { + + return; // yet to come / don't decide when delta = 0 + + } + + // start + + this._startTime = null; // unschedule + deltaTime = timeDirection * timeRunning; + + } + + // apply time scale and advance time + + deltaTime *= this._updateTimeScale( time ); + var clipTime = this._updateTime( deltaTime ); + + // note: _updateTime may disable the action resulting in + // an effective weight of 0 + + var weight = this._updateWeight( time ); + + if ( weight > 0 ) { + + var interpolants = this._interpolants; + var propertyMixers = this._propertyBindings; + + for ( var j = 0, m = interpolants.length; j !== m; ++ j ) { + + interpolants[ j ].evaluate( clipTime ); + propertyMixers[ j ].accumulate( accuIndex, weight ); + + } + + } + + }, + + _updateWeight: function( time ) { + + var weight = 0; + + if ( this.enabled ) { + + weight = this.weight; + var interpolant = this._weightInterpolant; + + if ( interpolant !== null ) { + + var interpolantValue = interpolant.evaluate( time )[ 0 ]; + + weight *= interpolantValue; + + if ( time > interpolant.parameterPositions[ 1 ] ) { + + this.stopFading(); + + if ( interpolantValue === 0 ) { + + // faded out, disable + this.enabled = false; + + } + + } + + } + + } + + this._effectiveWeight = weight; + return weight; + + }, + + _updateTimeScale: function( time ) { + + var timeScale = 0; + + if ( ! this.paused ) { + + timeScale = this.timeScale; + + var interpolant = this._timeScaleInterpolant; + + if ( interpolant !== null ) { + + var interpolantValue = interpolant.evaluate( time )[ 0 ]; + + timeScale *= interpolantValue; + + if ( time > interpolant.parameterPositions[ 1 ] ) { + + this.stopWarping(); + + if ( timeScale === 0 ) { + + // motion has halted, pause + this.paused = true; + + } else { + + // warp done - apply final time scale + this.timeScale = timeScale; + + } + + } + + } + + } + + this._effectiveTimeScale = timeScale; + return timeScale; + + }, + + _updateTime: function( deltaTime ) { + + var time = this.time + deltaTime; + + if ( deltaTime === 0 ) return time; + + var duration = this._clip.duration, + + loop = this.loop, + loopCount = this._loopCount; + + if ( loop === LoopOnce ) { + + if ( loopCount === -1 ) { + // just started + + this._loopCount = 0; + this._setEndings( true, true, false ); + + } + + handle_stop: { + + if ( time >= duration ) { + + time = duration; + + } else if ( time < 0 ) { + + time = 0; + + } else break handle_stop; + + if ( this.clampWhenFinished ) this.paused = true; + else this.enabled = false; + + this._mixer.dispatchEvent( { + type: 'finished', action: this, + direction: deltaTime < 0 ? -1 : 1 + } ); + + } + + } else { // repetitive Repeat or PingPong + + var pingPong = ( loop === LoopPingPong ); + + if ( loopCount === -1 ) { + // just started + + if ( deltaTime >= 0 ) { + + loopCount = 0; + + this._setEndings( + true, this.repetitions === 0, pingPong ); + + } else { + + // when looping in reverse direction, the initial + // transition through zero counts as a repetition, + // so leave loopCount at -1 + + this._setEndings( + this.repetitions === 0, true, pingPong ); + + } + + } + + if ( time >= duration || time < 0 ) { + // wrap around + + var loopDelta = Math.floor( time / duration ); // signed + time -= duration * loopDelta; + + loopCount += Math.abs( loopDelta ); + + var pending = this.repetitions - loopCount; + + if ( pending < 0 ) { + // have to stop (switch state, clamp time, fire event) + + if ( this.clampWhenFinished ) this.paused = true; + else this.enabled = false; + + time = deltaTime > 0 ? duration : 0; + + this._mixer.dispatchEvent( { + type: 'finished', action: this, + direction: deltaTime > 0 ? 1 : -1 + } ); + + } else { + // keep running + + if ( pending === 0 ) { + // entering the last round + + var atStart = deltaTime < 0; + this._setEndings( atStart, ! atStart, pingPong ); + + } else { + + this._setEndings( false, false, pingPong ); + + } + + this._loopCount = loopCount; + + this._mixer.dispatchEvent( { + type: 'loop', action: this, loopDelta: loopDelta + } ); + + } + + } + + if ( pingPong && ( loopCount & 1 ) === 1 ) { + // invert time for the "pong round" + + this.time = time; + return duration - time; + + } + + } + + this.time = time; + return time; + + }, + + _setEndings: function( atStart, atEnd, pingPong ) { + + var settings = this._interpolantSettings; + + if ( pingPong ) { + + settings.endingStart = ZeroSlopeEnding; + settings.endingEnd = ZeroSlopeEnding; + + } else { + + // assuming for LoopOnce atStart == atEnd == true + + if ( atStart ) { + + settings.endingStart = this.zeroSlopeAtStart ? + ZeroSlopeEnding : ZeroCurvatureEnding; + + } else { + + settings.endingStart = WrapAroundEnding; + + } + + if ( atEnd ) { + + settings.endingEnd = this.zeroSlopeAtEnd ? + ZeroSlopeEnding : ZeroCurvatureEnding; + + } else { + + settings.endingEnd = WrapAroundEnding; + + } + + } + + }, + + _scheduleFading: function( duration, weightNow, weightThen ) { + + var mixer = this._mixer, now = mixer.time, + interpolant = this._weightInterpolant; + + if ( interpolant === null ) { + + interpolant = mixer._lendControlInterpolant(); + this._weightInterpolant = interpolant; + + } + + var times = interpolant.parameterPositions, + values = interpolant.sampleValues; + + times[ 0 ] = now; values[ 0 ] = weightNow; + times[ 1 ] = now + duration; values[ 1 ] = weightThen; + + return this; + + } + + } ); + + /** + * + * Player for AnimationClips. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function AnimationMixer( root ) { + + this._root = root; + this._initMemoryManager(); + this._accuIndex = 0; + + this.time = 0; + + this.timeScale = 1.0; + + } + + Object.assign( AnimationMixer.prototype, EventDispatcher.prototype, { + + _bindAction: function ( action, prototypeAction ) { + + var root = action._localRoot || this._root, + tracks = action._clip.tracks, + nTracks = tracks.length, + bindings = action._propertyBindings, + interpolants = action._interpolants, + rootUuid = root.uuid, + bindingsByRoot = this._bindingsByRootAndName, + bindingsByName = bindingsByRoot[ rootUuid ]; + + if ( bindingsByName === undefined ) { + + bindingsByName = {}; + bindingsByRoot[ rootUuid ] = bindingsByName; + + } + + for ( var i = 0; i !== nTracks; ++ i ) { + + var track = tracks[ i ], + trackName = track.name, + binding = bindingsByName[ trackName ]; + + if ( binding !== undefined ) { + + bindings[ i ] = binding; + + } else { + + binding = bindings[ i ]; + + if ( binding !== undefined ) { + + // existing binding, make sure the cache knows + + if ( binding._cacheIndex === null ) { + + ++ binding.referenceCount; + this._addInactiveBinding( binding, rootUuid, trackName ); + + } + + continue; + + } + + var path = prototypeAction && prototypeAction. + _propertyBindings[ i ].binding.parsedPath; + + binding = new PropertyMixer( + PropertyBinding.create( root, trackName, path ), + track.ValueTypeName, track.getValueSize() ); + + ++ binding.referenceCount; + this._addInactiveBinding( binding, rootUuid, trackName ); + + bindings[ i ] = binding; + + } + + interpolants[ i ].resultBuffer = binding.buffer; + + } + + }, + + _activateAction: function ( action ) { + + if ( ! this._isActiveAction( action ) ) { + + if ( action._cacheIndex === null ) { + + // this action has been forgotten by the cache, but the user + // appears to be still using it -> rebind + + var rootUuid = ( action._localRoot || this._root ).uuid, + clipUuid = action._clip.uuid, + actionsForClip = this._actionsByClip[ clipUuid ]; + + this._bindAction( action, + actionsForClip && actionsForClip.knownActions[ 0 ] ); + + this._addInactiveAction( action, clipUuid, rootUuid ); + + } + + var bindings = action._propertyBindings; + + // increment reference counts / sort out state + for ( var i = 0, n = bindings.length; i !== n; ++ i ) { + + var binding = bindings[ i ]; + + if ( binding.useCount ++ === 0 ) { + + this._lendBinding( binding ); + binding.saveOriginalState(); + + } + + } + + this._lendAction( action ); + + } + + }, + + _deactivateAction: function ( action ) { + + if ( this._isActiveAction( action ) ) { + + var bindings = action._propertyBindings; + + // decrement reference counts / sort out state + for ( var i = 0, n = bindings.length; i !== n; ++ i ) { + + var binding = bindings[ i ]; + + if ( -- binding.useCount === 0 ) { + + binding.restoreOriginalState(); + this._takeBackBinding( binding ); + + } + + } + + this._takeBackAction( action ); + + } + + }, + + // Memory manager + + _initMemoryManager: function () { + + this._actions = []; // 'nActiveActions' followed by inactive ones + this._nActiveActions = 0; + + this._actionsByClip = {}; + // inside: + // { + // knownActions: Array< AnimationAction > - used as prototypes + // actionByRoot: AnimationAction - lookup + // } + + + this._bindings = []; // 'nActiveBindings' followed by inactive ones + this._nActiveBindings = 0; + + this._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer > + + + this._controlInterpolants = []; // same game as above + this._nActiveControlInterpolants = 0; + + var scope = this; + + this.stats = { + + actions: { + get total() { return scope._actions.length; }, + get inUse() { return scope._nActiveActions; } + }, + bindings: { + get total() { return scope._bindings.length; }, + get inUse() { return scope._nActiveBindings; } + }, + controlInterpolants: { + get total() { return scope._controlInterpolants.length; }, + get inUse() { return scope._nActiveControlInterpolants; } + } + + }; + + }, + + // Memory management for AnimationAction objects + + _isActiveAction: function ( action ) { + + var index = action._cacheIndex; + return index !== null && index < this._nActiveActions; + + }, + + _addInactiveAction: function ( action, clipUuid, rootUuid ) { + + var actions = this._actions, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[ clipUuid ]; + + if ( actionsForClip === undefined ) { + + actionsForClip = { + + knownActions: [ action ], + actionByRoot: {} + + }; + + action._byClipCacheIndex = 0; + + actionsByClip[ clipUuid ] = actionsForClip; + + } else { + + var knownActions = actionsForClip.knownActions; + + action._byClipCacheIndex = knownActions.length; + knownActions.push( action ); + + } + + action._cacheIndex = actions.length; + actions.push( action ); + + actionsForClip.actionByRoot[ rootUuid ] = action; + + }, + + _removeInactiveAction: function ( action ) { + + var actions = this._actions, + lastInactiveAction = actions[ actions.length - 1 ], + cacheIndex = action._cacheIndex; + + lastInactiveAction._cacheIndex = cacheIndex; + actions[ cacheIndex ] = lastInactiveAction; + actions.pop(); + + action._cacheIndex = null; + + + var clipUuid = action._clip.uuid, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[ clipUuid ], + knownActionsForClip = actionsForClip.knownActions, + + lastKnownAction = + knownActionsForClip[ knownActionsForClip.length - 1 ], + + byClipCacheIndex = action._byClipCacheIndex; + + lastKnownAction._byClipCacheIndex = byClipCacheIndex; + knownActionsForClip[ byClipCacheIndex ] = lastKnownAction; + knownActionsForClip.pop(); + + action._byClipCacheIndex = null; + + + var actionByRoot = actionsForClip.actionByRoot, + rootUuid = ( action._localRoot || this._root ).uuid; + + delete actionByRoot[ rootUuid ]; + + if ( knownActionsForClip.length === 0 ) { + + delete actionsByClip[ clipUuid ]; + + } + + this._removeInactiveBindingsForAction( action ); + + }, + + _removeInactiveBindingsForAction: function ( action ) { + + var bindings = action._propertyBindings; + for ( var i = 0, n = bindings.length; i !== n; ++ i ) { + + var binding = bindings[ i ]; + + if ( -- binding.referenceCount === 0 ) { + + this._removeInactiveBinding( binding ); + + } + + } + + }, + + _lendAction: function ( action ) { + + // [ active actions | inactive actions ] + // [ active actions >| inactive actions ] + // s a + // <-swap-> + // a s + + var actions = this._actions, + prevIndex = action._cacheIndex, + + lastActiveIndex = this._nActiveActions ++, + + firstInactiveAction = actions[ lastActiveIndex ]; + + action._cacheIndex = lastActiveIndex; + actions[ lastActiveIndex ] = action; + + firstInactiveAction._cacheIndex = prevIndex; + actions[ prevIndex ] = firstInactiveAction; + + }, + + _takeBackAction: function ( action ) { + + // [ active actions | inactive actions ] + // [ active actions |< inactive actions ] + // a s + // <-swap-> + // s a + + var actions = this._actions, + prevIndex = action._cacheIndex, + + firstInactiveIndex = -- this._nActiveActions, + + lastActiveAction = actions[ firstInactiveIndex ]; + + action._cacheIndex = firstInactiveIndex; + actions[ firstInactiveIndex ] = action; + + lastActiveAction._cacheIndex = prevIndex; + actions[ prevIndex ] = lastActiveAction; + + }, + + // Memory management for PropertyMixer objects + + _addInactiveBinding: function ( binding, rootUuid, trackName ) { + + var bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[ rootUuid ], + + bindings = this._bindings; + + if ( bindingByName === undefined ) { + + bindingByName = {}; + bindingsByRoot[ rootUuid ] = bindingByName; + + } + + bindingByName[ trackName ] = binding; + + binding._cacheIndex = bindings.length; + bindings.push( binding ); + + }, + + _removeInactiveBinding: function ( binding ) { + + var bindings = this._bindings, + propBinding = binding.binding, + rootUuid = propBinding.rootNode.uuid, + trackName = propBinding.path, + bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[ rootUuid ], + + lastInactiveBinding = bindings[ bindings.length - 1 ], + cacheIndex = binding._cacheIndex; + + lastInactiveBinding._cacheIndex = cacheIndex; + bindings[ cacheIndex ] = lastInactiveBinding; + bindings.pop(); + + delete bindingByName[ trackName ]; + + remove_empty_map: { + + for ( var _ in bindingByName ) break remove_empty_map; + + delete bindingsByRoot[ rootUuid ]; + + } + + }, + + _lendBinding: function ( binding ) { + + var bindings = this._bindings, + prevIndex = binding._cacheIndex, + + lastActiveIndex = this._nActiveBindings ++, + + firstInactiveBinding = bindings[ lastActiveIndex ]; + + binding._cacheIndex = lastActiveIndex; + bindings[ lastActiveIndex ] = binding; + + firstInactiveBinding._cacheIndex = prevIndex; + bindings[ prevIndex ] = firstInactiveBinding; + + }, + + _takeBackBinding: function ( binding ) { + + var bindings = this._bindings, + prevIndex = binding._cacheIndex, + + firstInactiveIndex = -- this._nActiveBindings, + + lastActiveBinding = bindings[ firstInactiveIndex ]; + + binding._cacheIndex = firstInactiveIndex; + bindings[ firstInactiveIndex ] = binding; + + lastActiveBinding._cacheIndex = prevIndex; + bindings[ prevIndex ] = lastActiveBinding; + + }, + + + // Memory management of Interpolants for weight and time scale + + _lendControlInterpolant: function () { + + var interpolants = this._controlInterpolants, + lastActiveIndex = this._nActiveControlInterpolants ++, + interpolant = interpolants[ lastActiveIndex ]; + + if ( interpolant === undefined ) { + + interpolant = new LinearInterpolant( + new Float32Array( 2 ), new Float32Array( 2 ), + 1, this._controlInterpolantsResultBuffer ); + + interpolant.__cacheIndex = lastActiveIndex; + interpolants[ lastActiveIndex ] = interpolant; + + } + + return interpolant; + + }, + + _takeBackControlInterpolant: function ( interpolant ) { + + var interpolants = this._controlInterpolants, + prevIndex = interpolant.__cacheIndex, + + firstInactiveIndex = -- this._nActiveControlInterpolants, + + lastActiveInterpolant = interpolants[ firstInactiveIndex ]; + + interpolant.__cacheIndex = firstInactiveIndex; + interpolants[ firstInactiveIndex ] = interpolant; + + lastActiveInterpolant.__cacheIndex = prevIndex; + interpolants[ prevIndex ] = lastActiveInterpolant; + + }, + + _controlInterpolantsResultBuffer: new Float32Array( 1 ), + + // return an action for a clip optionally using a custom root target + // object (this method allocates a lot of dynamic memory in case a + // previously unknown clip/root combination is specified) + clipAction: function ( clip, optionalRoot ) { + + var root = optionalRoot || this._root, + rootUuid = root.uuid, + + clipObject = typeof clip === 'string' ? + AnimationClip.findByName( root, clip ) : clip, + + clipUuid = clipObject !== null ? clipObject.uuid : clip, + + actionsForClip = this._actionsByClip[ clipUuid ], + prototypeAction = null; + + if ( actionsForClip !== undefined ) { + + var existingAction = + actionsForClip.actionByRoot[ rootUuid ]; + + if ( existingAction !== undefined ) { + + return existingAction; + + } + + // we know the clip, so we don't have to parse all + // the bindings again but can just copy + prototypeAction = actionsForClip.knownActions[ 0 ]; + + // also, take the clip from the prototype action + if ( clipObject === null ) + clipObject = prototypeAction._clip; + + } + + // clip must be known when specified via string + if ( clipObject === null ) return null; + + // allocate all resources required to run it + var newAction = new AnimationAction( this, clipObject, optionalRoot ); + + this._bindAction( newAction, prototypeAction ); + + // and make the action known to the memory manager + this._addInactiveAction( newAction, clipUuid, rootUuid ); + + return newAction; + + }, + + // get an existing action + existingAction: function ( clip, optionalRoot ) { + + var root = optionalRoot || this._root, + rootUuid = root.uuid, + + clipObject = typeof clip === 'string' ? + AnimationClip.findByName( root, clip ) : clip, + + clipUuid = clipObject ? clipObject.uuid : clip, + + actionsForClip = this._actionsByClip[ clipUuid ]; + + if ( actionsForClip !== undefined ) { + + return actionsForClip.actionByRoot[ rootUuid ] || null; + + } + + return null; + + }, + + // deactivates all previously scheduled actions + stopAllAction: function () { + + var actions = this._actions, + nActions = this._nActiveActions, + bindings = this._bindings, + nBindings = this._nActiveBindings; + + this._nActiveActions = 0; + this._nActiveBindings = 0; + + for ( var i = 0; i !== nActions; ++ i ) { + + actions[ i ].reset(); + + } + + for ( var i = 0; i !== nBindings; ++ i ) { + + bindings[ i ].useCount = 0; + + } + + return this; + + }, + + // advance the time and update apply the animation + update: function ( deltaTime ) { + + deltaTime *= this.timeScale; + + var actions = this._actions, + nActions = this._nActiveActions, + + time = this.time += deltaTime, + timeDirection = Math.sign( deltaTime ), + + accuIndex = this._accuIndex ^= 1; + + // run active actions + + for ( var i = 0; i !== nActions; ++ i ) { + + var action = actions[ i ]; + + action._update( time, deltaTime, timeDirection, accuIndex ); + + } + + // update scene graph + + var bindings = this._bindings, + nBindings = this._nActiveBindings; + + for ( var i = 0; i !== nBindings; ++ i ) { + + bindings[ i ].apply( accuIndex ); + + } + + return this; + + }, + + // return this mixer's root target object + getRoot: function () { + + return this._root; + + }, + + // free all resources specific to a particular clip + uncacheClip: function ( clip ) { + + var actions = this._actions, + clipUuid = clip.uuid, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[ clipUuid ]; + + if ( actionsForClip !== undefined ) { + + // note: just calling _removeInactiveAction would mess up the + // iteration state and also require updating the state we can + // just throw away + + var actionsToRemove = actionsForClip.knownActions; + + for ( var i = 0, n = actionsToRemove.length; i !== n; ++ i ) { + + var action = actionsToRemove[ i ]; + + this._deactivateAction( action ); + + var cacheIndex = action._cacheIndex, + lastInactiveAction = actions[ actions.length - 1 ]; + + action._cacheIndex = null; + action._byClipCacheIndex = null; + + lastInactiveAction._cacheIndex = cacheIndex; + actions[ cacheIndex ] = lastInactiveAction; + actions.pop(); + + this._removeInactiveBindingsForAction( action ); + + } + + delete actionsByClip[ clipUuid ]; + + } + + }, + + // free all resources specific to a particular root target object + uncacheRoot: function ( root ) { + + var rootUuid = root.uuid, + actionsByClip = this._actionsByClip; + + for ( var clipUuid in actionsByClip ) { + + var actionByRoot = actionsByClip[ clipUuid ].actionByRoot, + action = actionByRoot[ rootUuid ]; + + if ( action !== undefined ) { + + this._deactivateAction( action ); + this._removeInactiveAction( action ); + + } + + } + + var bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[ rootUuid ]; + + if ( bindingByName !== undefined ) { + + for ( var trackName in bindingByName ) { + + var binding = bindingByName[ trackName ]; + binding.restoreOriginalState(); + this._removeInactiveBinding( binding ); + + } + + } + + }, + + // remove a targeted clip from the cache + uncacheAction: function ( clip, optionalRoot ) { + + var action = this.existingAction( clip, optionalRoot ); + + if ( action !== null ) { + + this._deactivateAction( action ); + this._removeInactiveAction( action ); + + } + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Uniform( value ) { + + if ( typeof value === 'string' ) { + + console.warn( 'THREE.Uniform: Type parameter is no longer needed.' ); + value = arguments[ 1 ]; + + } + + this.value = value; + + } + + Uniform.prototype.clone = function () { + + return new Uniform( this.value.clone === undefined ? this.value : this.value.clone() ); + + }; + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InstancedBufferGeometry() { + + BufferGeometry.call( this ); + + this.type = 'InstancedBufferGeometry'; + this.maxInstancedCount = undefined; + + } + + InstancedBufferGeometry.prototype = Object.assign( Object.create( BufferGeometry.prototype ), { + + constructor: InstancedBufferGeometry, + + isInstancedBufferGeometry: true, + + addGroup: function ( start, count, materialIndex ) { + + this.groups.push( { + + start: start, + count: count, + materialIndex: materialIndex + + } ); + + }, + + copy: function ( source ) { + + var index = source.index; + + if ( index !== null ) { + + this.setIndex( index.clone() ); + + } + + var attributes = source.attributes; + + for ( var name in attributes ) { + + var attribute = attributes[ name ]; + this.addAttribute( name, attribute.clone() ); + + } + + var groups = source.groups; + + for ( var i = 0, l = groups.length; i < l; i ++ ) { + + var group = groups[ i ]; + this.addGroup( group.start, group.count, group.materialIndex ); + + } + + return this; + + } + + } ); + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, normalized ) { + + this.uuid = _Math.generateUUID(); + + this.data = interleavedBuffer; + this.itemSize = itemSize; + this.offset = offset; + + this.normalized = normalized === true; + + } + + Object.defineProperties( InterleavedBufferAttribute.prototype, { + + count: { + + get: function () { + + return this.data.count; + + } + + }, + + array: { + + get: function () { + + return this.data.array; + + } + + } + + } ); + + Object.assign( InterleavedBufferAttribute.prototype, { + + isInterleavedBufferAttribute: true, + + setX: function ( index, x ) { + + this.data.array[ index * this.data.stride + this.offset ] = x; + + return this; + + }, + + setY: function ( index, y ) { + + this.data.array[ index * this.data.stride + this.offset + 1 ] = y; + + return this; + + }, + + setZ: function ( index, z ) { + + this.data.array[ index * this.data.stride + this.offset + 2 ] = z; + + return this; + + }, + + setW: function ( index, w ) { + + this.data.array[ index * this.data.stride + this.offset + 3 ] = w; + + return this; + + }, + + getX: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset ]; + + }, + + getY: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 1 ]; + + }, + + getZ: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 2 ]; + + }, + + getW: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 3 ]; + + }, + + setXY: function ( index, x, y ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + + return this; + + }, + + setXYZ: function ( index, x, y, z ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + this.data.array[ index + 2 ] = z; + + return this; + + }, + + setXYZW: function ( index, x, y, z, w ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + this.data.array[ index + 2 ] = z; + this.data.array[ index + 3 ] = w; + + return this; + + } + + } ); + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InterleavedBuffer( array, stride ) { + + this.uuid = _Math.generateUUID(); + + this.array = array; + this.stride = stride; + this.count = array !== undefined ? array.length / stride : 0; + + this.dynamic = false; + this.updateRange = { offset: 0, count: - 1 }; + + this.onUploadCallback = function () {}; + + this.version = 0; + + } + + Object.defineProperty( InterleavedBuffer.prototype, 'needsUpdate', { + + set: function ( value ) { + + if ( value === true ) this.version ++; + + } + + } ); + + Object.assign( InterleavedBuffer.prototype, { + + isInterleavedBuffer: true, + + setArray: function ( array ) { + + if ( Array.isArray( array ) ) { + + throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); + + } + + this.count = array !== undefined ? array.length / this.stride : 0; + this.array = array; + + }, + + setDynamic: function ( value ) { + + this.dynamic = value; + + return this; + + }, + + copy: function ( source ) { + + this.array = new source.array.constructor( source.array ); + this.count = source.count; + this.stride = source.stride; + this.dynamic = source.dynamic; + + return this; + + }, + + copyAt: function ( index1, attribute, index2 ) { + + index1 *= this.stride; + index2 *= attribute.stride; + + for ( var i = 0, l = this.stride; i < l; i ++ ) { + + this.array[ index1 + i ] = attribute.array[ index2 + i ]; + + } + + return this; + + }, + + set: function ( value, offset ) { + + if ( offset === undefined ) offset = 0; + + this.array.set( value, offset ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + onUpload: function ( callback ) { + + this.onUploadCallback = callback; + + return this; + + } + + } ); + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InstancedInterleavedBuffer( array, stride, meshPerAttribute ) { + + InterleavedBuffer.call( this, array, stride ); + + this.meshPerAttribute = meshPerAttribute || 1; + + } + + InstancedInterleavedBuffer.prototype = Object.assign( Object.create( InterleavedBuffer.prototype ), { + + constructor: InstancedInterleavedBuffer, + + isInstancedInterleavedBuffer: true, + + copy: function ( source ) { + + InterleavedBuffer.prototype.copy.call( this, source ); + + this.meshPerAttribute = source.meshPerAttribute; + + return this; + + } + + } ); + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InstancedBufferAttribute( array, itemSize, meshPerAttribute ) { + + BufferAttribute.call( this, array, itemSize ); + + this.meshPerAttribute = meshPerAttribute || 1; + + } + + InstancedBufferAttribute.prototype = Object.assign( Object.create( BufferAttribute.prototype ), { + + constructor: InstancedBufferAttribute, + + isInstancedBufferAttribute: true, + + copy: function ( source ) { + + BufferAttribute.prototype.copy.call( this, source ); + + this.meshPerAttribute = source.meshPerAttribute; + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author bhouston / http://clara.io/ + * @author stephomi / http://stephaneginier.com/ + */ + + function Raycaster( origin, direction, near, far ) { + + this.ray = new Ray( origin, direction ); + // direction is assumed to be normalized (for accurate distance calculations) + + this.near = near || 0; + this.far = far || Infinity; + + this.params = { + Mesh: {}, + Line: {}, + LOD: {}, + Points: { threshold: 1 }, + Sprite: {} + }; + + Object.defineProperties( this.params, { + PointCloud: { + get: function () { + console.warn( 'THREE.Raycaster: params.PointCloud has been renamed to params.Points.' ); + return this.Points; + } + } + } ); + + } + + function ascSort( a, b ) { + + return a.distance - b.distance; + + } + + function intersectObject( object, raycaster, intersects, recursive ) { + + if ( object.visible === false ) return; + + object.raycast( raycaster, intersects ); + + if ( recursive === true ) { + + var children = object.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + intersectObject( children[ i ], raycaster, intersects, true ); + + } + + } + + } + + Object.assign( Raycaster.prototype, { + + linePrecision: 1, + + set: function ( origin, direction ) { + + // direction is assumed to be normalized (for accurate distance calculations) + + this.ray.set( origin, direction ); + + }, + + setFromCamera: function ( coords, camera ) { + + if ( ( camera && camera.isPerspectiveCamera ) ) { + + this.ray.origin.setFromMatrixPosition( camera.matrixWorld ); + this.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize(); + + } else if ( ( camera && camera.isOrthographicCamera ) ) { + + this.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera + this.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld ); + + } else { + + console.error( 'THREE.Raycaster: Unsupported camera type.' ); + + } + + }, + + intersectObject: function ( object, recursive ) { + + var intersects = []; + + intersectObject( object, this, intersects, recursive ); + + intersects.sort( ascSort ); + + return intersects; + + }, + + intersectObjects: function ( objects, recursive ) { + + var intersects = []; + + if ( Array.isArray( objects ) === false ) { + + console.warn( 'THREE.Raycaster.intersectObjects: objects is not an Array.' ); + return intersects; + + } + + for ( var i = 0, l = objects.length; i < l; i ++ ) { + + intersectObject( objects[ i ], this, intersects, recursive ); + + } + + intersects.sort( ascSort ); + + return intersects; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function Clock( autoStart ) { + + this.autoStart = ( autoStart !== undefined ) ? autoStart : true; + + this.startTime = 0; + this.oldTime = 0; + this.elapsedTime = 0; + + this.running = false; + + } + + Object.assign( Clock.prototype, { + + start: function () { + + this.startTime = ( typeof performance === 'undefined' ? Date : performance ).now(); // see #10732 + + this.oldTime = this.startTime; + this.elapsedTime = 0; + this.running = true; + + }, + + stop: function () { + + this.getElapsedTime(); + this.running = false; + + }, + + getElapsedTime: function () { + + this.getDelta(); + return this.elapsedTime; + + }, + + getDelta: function () { + + var diff = 0; + + if ( this.autoStart && ! this.running ) { + + this.start(); + return 0; + + } + + if ( this.running ) { + + var newTime = ( typeof performance === 'undefined' ? Date : performance ).now(); + + diff = ( newTime - this.oldTime ) / 1000; + this.oldTime = newTime; + + this.elapsedTime += diff; + + } + + return diff; + + } + + } ); + + /** + * @author bhouston / http://clara.io + * @author WestLangley / http://github.com/WestLangley + * + * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system + * + * The poles (phi) are at the positive and negative y axis. + * The equator starts at positive z. + */ + + function Spherical( radius, phi, theta ) { + + this.radius = ( radius !== undefined ) ? radius : 1.0; + this.phi = ( phi !== undefined ) ? phi : 0; // up / down towards top and bottom pole + this.theta = ( theta !== undefined ) ? theta : 0; // around the equator of the sphere + + return this; + + } + + Object.assign( Spherical.prototype, { + + set: function ( radius, phi, theta ) { + + this.radius = radius; + this.phi = phi; + this.theta = theta; + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( other ) { + + this.radius = other.radius; + this.phi = other.phi; + this.theta = other.theta; + + return this; + + }, + + // restrict phi to be betwee EPS and PI-EPS + makeSafe: function() { + + var EPS = 0.000001; + this.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) ); + + return this; + + }, + + setFromVector3: function( vec3 ) { + + this.radius = vec3.length(); + + if ( this.radius === 0 ) { + + this.theta = 0; + this.phi = 0; + + } else { + + this.theta = Math.atan2( vec3.x, vec3.z ); // equator angle around y-up axis + this.phi = Math.acos( _Math.clamp( vec3.y / this.radius, - 1, 1 ) ); // polar angle + + } + + return this; + + } + + } ); + + /** + * @author Mugen87 / https://github.com/Mugen87 + * + * Ref: https://en.wikipedia.org/wiki/Cylindrical_coordinate_system + * + */ + + function Cylindrical( radius, theta, y ) { + + this.radius = ( radius !== undefined ) ? radius : 1.0; // distance from the origin to a point in the x-z plane + this.theta = ( theta !== undefined ) ? theta : 0; // counterclockwise angle in the x-z plane measured in radians from the positive z-axis + this.y = ( y !== undefined ) ? y : 0; // height above the x-z plane + + return this; + + } + + Object.assign( Cylindrical.prototype, { + + set: function ( radius, theta, y ) { + + this.radius = radius; + this.theta = theta; + this.y = y; + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( other ) { + + this.radius = other.radius; + this.theta = other.theta; + this.y = other.y; + + return this; + + }, + + setFromVector3: function( vec3 ) { + + this.radius = Math.sqrt( vec3.x * vec3.x + vec3.z * vec3.z ); + this.theta = Math.atan2( vec3.x, vec3.z ); + this.y = vec3.y; + + return this; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function MorphBlendMesh( geometry, material ) { + + Mesh.call( this, geometry, material ); + + this.animationsMap = {}; + this.animationsList = []; + + // prepare default animation + // (all frames played together in 1 second) + + var numFrames = this.geometry.morphTargets.length; + + var name = "__default"; + + var startFrame = 0; + var endFrame = numFrames - 1; + + var fps = numFrames / 1; + + this.createAnimation( name, startFrame, endFrame, fps ); + this.setAnimationWeight( name, 1 ); + + } + + MorphBlendMesh.prototype = Object.create( Mesh.prototype ); + MorphBlendMesh.prototype.constructor = MorphBlendMesh; + + MorphBlendMesh.prototype.createAnimation = function ( name, start, end, fps ) { + + var animation = { + + start: start, + end: end, + + length: end - start + 1, + + fps: fps, + duration: ( end - start ) / fps, + + lastFrame: 0, + currentFrame: 0, + + active: false, + + time: 0, + direction: 1, + weight: 1, + + directionBackwards: false, + mirroredLoop: false + + }; + + this.animationsMap[ name ] = animation; + this.animationsList.push( animation ); + + }; + + MorphBlendMesh.prototype.autoCreateAnimations = function ( fps ) { + + var pattern = /([a-z]+)_?(\d+)/i; + + var firstAnimation, frameRanges = {}; + + var geometry = this.geometry; + + for ( var i = 0, il = geometry.morphTargets.length; i < il; i ++ ) { + + var morph = geometry.morphTargets[ i ]; + var chunks = morph.name.match( pattern ); + + if ( chunks && chunks.length > 1 ) { + + var name = chunks[ 1 ]; + + if ( ! frameRanges[ name ] ) frameRanges[ name ] = { start: Infinity, end: - Infinity }; + + var range = frameRanges[ name ]; + + if ( i < range.start ) range.start = i; + if ( i > range.end ) range.end = i; + + if ( ! firstAnimation ) firstAnimation = name; + + } + + } + + for ( var name in frameRanges ) { + + var range = frameRanges[ name ]; + this.createAnimation( name, range.start, range.end, fps ); + + } + + this.firstAnimation = firstAnimation; + + }; + + MorphBlendMesh.prototype.setAnimationDirectionForward = function ( name ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.direction = 1; + animation.directionBackwards = false; + + } + + }; + + MorphBlendMesh.prototype.setAnimationDirectionBackward = function ( name ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.direction = - 1; + animation.directionBackwards = true; + + } + + }; + + MorphBlendMesh.prototype.setAnimationFPS = function ( name, fps ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.fps = fps; + animation.duration = ( animation.end - animation.start ) / animation.fps; + + } + + }; + + MorphBlendMesh.prototype.setAnimationDuration = function ( name, duration ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.duration = duration; + animation.fps = ( animation.end - animation.start ) / animation.duration; + + } + + }; + + MorphBlendMesh.prototype.setAnimationWeight = function ( name, weight ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.weight = weight; + + } + + }; + + MorphBlendMesh.prototype.setAnimationTime = function ( name, time ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.time = time; + + } + + }; + + MorphBlendMesh.prototype.getAnimationTime = function ( name ) { + + var time = 0; + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + time = animation.time; + + } + + return time; + + }; + + MorphBlendMesh.prototype.getAnimationDuration = function ( name ) { + + var duration = - 1; + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + duration = animation.duration; + + } + + return duration; + + }; + + MorphBlendMesh.prototype.playAnimation = function ( name ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.time = 0; + animation.active = true; + + } else { + + console.warn( "THREE.MorphBlendMesh: animation[" + name + "] undefined in .playAnimation()" ); + + } + + }; + + MorphBlendMesh.prototype.stopAnimation = function ( name ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.active = false; + + } + + }; + + MorphBlendMesh.prototype.update = function ( delta ) { + + for ( var i = 0, il = this.animationsList.length; i < il; i ++ ) { + + var animation = this.animationsList[ i ]; + + if ( ! animation.active ) continue; + + var frameTime = animation.duration / animation.length; + + animation.time += animation.direction * delta; + + if ( animation.mirroredLoop ) { + + if ( animation.time > animation.duration || animation.time < 0 ) { + + animation.direction *= - 1; + + if ( animation.time > animation.duration ) { + + animation.time = animation.duration; + animation.directionBackwards = true; + + } + + if ( animation.time < 0 ) { + + animation.time = 0; + animation.directionBackwards = false; + + } + + } + + } else { + + animation.time = animation.time % animation.duration; + + if ( animation.time < 0 ) animation.time += animation.duration; + + } + + var keyframe = animation.start + _Math.clamp( Math.floor( animation.time / frameTime ), 0, animation.length - 1 ); + var weight = animation.weight; + + if ( keyframe !== animation.currentFrame ) { + + this.morphTargetInfluences[ animation.lastFrame ] = 0; + this.morphTargetInfluences[ animation.currentFrame ] = 1 * weight; + + this.morphTargetInfluences[ keyframe ] = 0; + + animation.lastFrame = animation.currentFrame; + animation.currentFrame = keyframe; + + } + + var mix = ( animation.time % frameTime ) / frameTime; + + if ( animation.directionBackwards ) mix = 1 - mix; + + if ( animation.currentFrame !== animation.lastFrame ) { + + this.morphTargetInfluences[ animation.currentFrame ] = mix * weight; + this.morphTargetInfluences[ animation.lastFrame ] = ( 1 - mix ) * weight; + + } else { + + this.morphTargetInfluences[ animation.currentFrame ] = weight; + + } + + } + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function ImmediateRenderObject( material ) { + + Object3D.call( this ); + + this.material = material; + this.render = function ( renderCallback ) {}; + + } + + ImmediateRenderObject.prototype = Object.create( Object3D.prototype ); + ImmediateRenderObject.prototype.constructor = ImmediateRenderObject; + + ImmediateRenderObject.prototype.isImmediateRenderObject = true; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function VertexNormalsHelper( object, size, hex, linewidth ) { + + this.object = object; + + this.size = ( size !== undefined ) ? size : 1; + + var color = ( hex !== undefined ) ? hex : 0xff0000; + + var width = ( linewidth !== undefined ) ? linewidth : 1; + + // + + var nNormals = 0; + + var objGeometry = this.object.geometry; + + if ( objGeometry && objGeometry.isGeometry ) { + + nNormals = objGeometry.faces.length * 3; + + } else if ( objGeometry && objGeometry.isBufferGeometry ) { + + nNormals = objGeometry.attributes.normal.count; + + } + + // + + var geometry = new BufferGeometry(); + + var positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 ); + + geometry.addAttribute( 'position', positions ); + + LineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) ); + + // + + this.matrixAutoUpdate = false; + + this.update(); + + } + + VertexNormalsHelper.prototype = Object.create( LineSegments.prototype ); + VertexNormalsHelper.prototype.constructor = VertexNormalsHelper; + + VertexNormalsHelper.prototype.update = ( function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + var normalMatrix = new Matrix3(); + + return function update() { + + var keys = [ 'a', 'b', 'c' ]; + + this.object.updateMatrixWorld( true ); + + normalMatrix.getNormalMatrix( this.object.matrixWorld ); + + var matrixWorld = this.object.matrixWorld; + + var position = this.geometry.attributes.position; + + // + + var objGeometry = this.object.geometry; + + if ( objGeometry && objGeometry.isGeometry ) { + + var vertices = objGeometry.vertices; + + var faces = objGeometry.faces; + + var idx = 0; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + for ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) { + + var vertex = vertices[ face[ keys[ j ] ] ]; + + var normal = face.vertexNormals[ j ]; + + v1.copy( vertex ).applyMatrix4( matrixWorld ); + + v2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 ); + + position.setXYZ( idx, v1.x, v1.y, v1.z ); + + idx = idx + 1; + + position.setXYZ( idx, v2.x, v2.y, v2.z ); + + idx = idx + 1; + + } + + } + + } else if ( objGeometry && objGeometry.isBufferGeometry ) { + + var objPos = objGeometry.attributes.position; + + var objNorm = objGeometry.attributes.normal; + + var idx = 0; + + // for simplicity, ignore index and drawcalls, and render every normal + + for ( var j = 0, jl = objPos.count; j < jl; j ++ ) { + + v1.set( objPos.getX( j ), objPos.getY( j ), objPos.getZ( j ) ).applyMatrix4( matrixWorld ); + + v2.set( objNorm.getX( j ), objNorm.getY( j ), objNorm.getZ( j ) ); + + v2.applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 ); + + position.setXYZ( idx, v1.x, v1.y, v1.z ); + + idx = idx + 1; + + position.setXYZ( idx, v2.x, v2.y, v2.z ); + + idx = idx + 1; + + } + + } + + position.needsUpdate = true; + + }; + + }() ); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function SpotLightHelper( light ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + var geometry = new BufferGeometry(); + + var positions = [ + 0, 0, 0, 0, 0, 1, + 0, 0, 0, 1, 0, 1, + 0, 0, 0, - 1, 0, 1, + 0, 0, 0, 0, 1, 1, + 0, 0, 0, 0, - 1, 1 + ]; + + for ( var i = 0, j = 1, l = 32; i < l; i ++, j ++ ) { + + var p1 = ( i / l ) * Math.PI * 2; + var p2 = ( j / l ) * Math.PI * 2; + + positions.push( + Math.cos( p1 ), Math.sin( p1 ), 1, + Math.cos( p2 ), Math.sin( p2 ), 1 + ); + + } + + geometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) ); + + var material = new LineBasicMaterial( { fog: false } ); + + this.cone = new LineSegments( geometry, material ); + this.add( this.cone ); + + this.update(); + + } + + SpotLightHelper.prototype = Object.create( Object3D.prototype ); + SpotLightHelper.prototype.constructor = SpotLightHelper; + + SpotLightHelper.prototype.dispose = function () { + + this.cone.geometry.dispose(); + this.cone.material.dispose(); + + }; + + SpotLightHelper.prototype.update = function () { + + var vector = new Vector3(); + var vector2 = new Vector3(); + + return function update() { + + var coneLength = this.light.distance ? this.light.distance : 1000; + var coneWidth = coneLength * Math.tan( this.light.angle ); + + this.cone.scale.set( coneWidth, coneWidth, coneLength ); + + vector.setFromMatrixPosition( this.light.matrixWorld ); + vector2.setFromMatrixPosition( this.light.target.matrixWorld ); + + this.cone.lookAt( vector2.sub( vector ) ); + + this.cone.material.color.copy( this.light.color ); + + }; + + }(); + + /** + * @author Sean Griffin / http://twitter.com/sgrif + * @author Michael Guerrero / http://realitymeltdown.com + * @author mrdoob / http://mrdoob.com/ + * @author ikerr / http://verold.com + * @author Mugen87 / https://github.com/Mugen87 + */ + + function SkeletonHelper( object ) { + + this.bones = this.getBoneList( object ); + + var geometry = new BufferGeometry(); + + var vertices = []; + var colors = []; + + var color1 = new Color( 0, 0, 1 ); + var color2 = new Color( 0, 1, 0 ); + + for ( var i = 0; i < this.bones.length; i ++ ) { + + var bone = this.bones[ i ]; + + if ( bone.parent && bone.parent.isBone ) { + + vertices.push( 0, 0, 0 ); + vertices.push( 0, 0, 0 ); + colors.push( color1.r, color1.g, color1.b ); + colors.push( color2.r, color2.g, color2.b ); + + } + + } + + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + var material = new LineBasicMaterial( { vertexColors: VertexColors, depthTest: false, depthWrite: false, transparent: true } ); + + LineSegments.call( this, geometry, material ); + + this.root = object; + + this.matrix = object.matrixWorld; + this.matrixAutoUpdate = false; + + this.update(); + + } + + + SkeletonHelper.prototype = Object.create( LineSegments.prototype ); + SkeletonHelper.prototype.constructor = SkeletonHelper; + + SkeletonHelper.prototype.getBoneList = function( object ) { + + var boneList = []; + + if ( object && object.isBone ) { + + boneList.push( object ); + + } + + for ( var i = 0; i < object.children.length; i ++ ) { + + boneList.push.apply( boneList, this.getBoneList( object.children[ i ] ) ); + + } + + return boneList; + + }; + + SkeletonHelper.prototype.update = function () { + + var vector = new Vector3(); + + var boneMatrix = new Matrix4(); + var matrixWorldInv = new Matrix4(); + + return function update() { + + var geometry = this.geometry; + var position = geometry.getAttribute( 'position' ); + + matrixWorldInv.getInverse( this.root.matrixWorld ); + + for ( var i = 0, j = 0; i < this.bones.length; i ++ ) { + + var bone = this.bones[ i ]; + + if ( bone.parent && bone.parent.isBone ) { + + boneMatrix.multiplyMatrices( matrixWorldInv, bone.matrixWorld ); + vector.setFromMatrixPosition( boneMatrix ); + position.setXYZ( j, vector.x, vector.y, vector.z ); + + boneMatrix.multiplyMatrices( matrixWorldInv, bone.parent.matrixWorld ); + vector.setFromMatrixPosition( boneMatrix ); + position.setXYZ( j + 1, vector.x, vector.y, vector.z ); + + j += 2; + + } + + } + + geometry.getAttribute( 'position' ).needsUpdate = true; + + }; + + }(); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + function PointLightHelper( light, sphereSize ) { + + this.light = light; + this.light.updateMatrixWorld(); + + var geometry = new SphereBufferGeometry( sphereSize, 4, 2 ); + var material = new MeshBasicMaterial( { wireframe: true, fog: false } ); + material.color.copy( this.light.color ); + + Mesh.call( this, geometry, material ); + + this.matrix = this.light.matrixWorld; + this.matrixAutoUpdate = false; + + /* + var distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 ); + var distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } ); + + this.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial ); + this.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial ); + + var d = light.distance; + + if ( d === 0.0 ) { + + this.lightDistance.visible = false; + + } else { + + this.lightDistance.scale.set( d, d, d ); + + } + + this.add( this.lightDistance ); + */ + + } + + PointLightHelper.prototype = Object.create( Mesh.prototype ); + PointLightHelper.prototype.constructor = PointLightHelper; + + PointLightHelper.prototype.dispose = function () { + + this.geometry.dispose(); + this.material.dispose(); + + }; + + PointLightHelper.prototype.update = function () { + + this.material.color.copy( this.light.color ); + + /* + var d = this.light.distance; + + if ( d === 0.0 ) { + + this.lightDistance.visible = false; + + } else { + + this.lightDistance.visible = true; + this.lightDistance.scale.set( d, d, d ); + + } + */ + + }; + + /** + * @author abelnation / http://github.com/abelnation + * @author Mugen87 / http://github.com/Mugen87 + * @author WestLangley / http://github.com/WestLangley + */ + + function RectAreaLightHelper( light ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + var material = new LineBasicMaterial( { color: light.color } ); + + var geometry = new BufferGeometry(); + + geometry.addAttribute( 'position', new BufferAttribute( new Float32Array( 5 * 3 ), 3 ) ); + + this.add( new Line( geometry, material ) ); + + this.update(); + + } + + RectAreaLightHelper.prototype = Object.create( Object3D.prototype ); + RectAreaLightHelper.prototype.constructor = RectAreaLightHelper; + + RectAreaLightHelper.prototype.dispose = function () { + + this.children[ 0 ].geometry.dispose(); + this.children[ 0 ].material.dispose(); + + }; + + RectAreaLightHelper.prototype.update = function () { + + var line = this.children[ 0 ]; + + // update material + + line.material.color.copy( this.light.color ); + + // calculate new dimensions of the helper + + var hx = this.light.width * 0.5; + var hy = this.light.height * 0.5; + + var position = line.geometry.attributes.position; + var array = position.array; + + // update vertices + + array[ 0 ] = hx; array[ 1 ] = - hy; array[ 2 ] = 0; + array[ 3 ] = hx; array[ 4 ] = hy; array[ 5 ] = 0; + array[ 6 ] = - hx; array[ 7 ] = hy; array[ 8 ] = 0; + array[ 9 ] = - hx; array[ 10 ] = - hy; array[ 11 ] = 0; + array[ 12 ] = hx; array[ 13 ] = - hy; array[ 14 ] = 0; + + position.needsUpdate = true; + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + function HemisphereLightHelper( light, size ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + var geometry = new OctahedronBufferGeometry( size ); + geometry.rotateY( Math.PI * 0.5 ); + + var material = new MeshBasicMaterial( { vertexColors: VertexColors, wireframe: true } ); + + var position = geometry.getAttribute( 'position' ); + var colors = new Float32Array( position.count * 3 ); + + geometry.addAttribute( 'color', new BufferAttribute( colors, 3 ) ); + + this.add( new Mesh( geometry, material ) ); + + this.update(); + + } + + HemisphereLightHelper.prototype = Object.create( Object3D.prototype ); + HemisphereLightHelper.prototype.constructor = HemisphereLightHelper; + + HemisphereLightHelper.prototype.dispose = function () { + + this.children[ 0 ].geometry.dispose(); + this.children[ 0 ].material.dispose(); + + }; + + HemisphereLightHelper.prototype.update = function () { + + var vector = new Vector3(); + + var color1 = new Color(); + var color2 = new Color(); + + return function update() { + + var mesh = this.children[ 0 ]; + + var colors = mesh.geometry.getAttribute( 'color' ); + + color1.copy( this.light.color ); + color2.copy( this.light.groundColor ); + + for ( var i = 0, l = colors.count; i < l; i ++ ) { + + var color = ( i < ( l / 2 ) ) ? color1 : color2; + + colors.setXYZ( i, color.r, color.g, color.b ); + + } + + mesh.lookAt( vector.setFromMatrixPosition( this.light.matrixWorld ).negate() ); + + colors.needsUpdate = true; + + }; + + }(); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function GridHelper( size, divisions, color1, color2 ) { + + size = size || 10; + divisions = divisions || 10; + color1 = new Color( color1 !== undefined ? color1 : 0x444444 ); + color2 = new Color( color2 !== undefined ? color2 : 0x888888 ); + + var center = divisions / 2; + var step = size / divisions; + var halfSize = size / 2; + + var vertices = [], colors = []; + + for ( var i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) { + + vertices.push( - halfSize, 0, k, halfSize, 0, k ); + vertices.push( k, 0, - halfSize, k, 0, halfSize ); + + var color = i === center ? color1 : color2; + + color.toArray( colors, j ); j += 3; + color.toArray( colors, j ); j += 3; + color.toArray( colors, j ); j += 3; + color.toArray( colors, j ); j += 3; + + } + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + var material = new LineBasicMaterial( { vertexColors: VertexColors } ); + + LineSegments.call( this, geometry, material ); + + } + + GridHelper.prototype = Object.create( LineSegments.prototype ); + GridHelper.prototype.constructor = GridHelper; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / http://github.com/Mugen87 + * @author Hectate / http://www.github.com/Hectate + */ + + function PolarGridHelper( radius, radials, circles, divisions, color1, color2 ) { + + radius = radius || 10; + radials = radials || 16; + circles = circles || 8; + divisions = divisions || 64; + color1 = new Color( color1 !== undefined ? color1 : 0x444444 ); + color2 = new Color( color2 !== undefined ? color2 : 0x888888 ); + + var vertices = []; + var colors = []; + + var x, z; + var v, i, j, r, color; + + // create the radials + + for ( i = 0; i <= radials; i ++ ) { + + v = ( i / radials ) * ( Math.PI * 2 ); + + x = Math.sin( v ) * radius; + z = Math.cos( v ) * radius; + + vertices.push( 0, 0, 0 ); + vertices.push( x, 0, z ); + + color = ( i & 1 ) ? color1 : color2; + + colors.push( color.r, color.g, color.b ); + colors.push( color.r, color.g, color.b ); + + } + + // create the circles + + for ( i = 0; i <= circles; i ++ ) { + + color = ( i & 1 ) ? color1 : color2; + + r = radius - ( radius / circles * i ); + + for ( j = 0; j < divisions; j ++ ) { + + // first vertex + + v = ( j / divisions ) * ( Math.PI * 2 ); + + x = Math.sin( v ) * r; + z = Math.cos( v ) * r; + + vertices.push( x, 0, z ); + colors.push( color.r, color.g, color.b ); + + // second vertex + + v = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 ); + + x = Math.sin( v ) * r; + z = Math.cos( v ) * r; + + vertices.push( x, 0, z ); + colors.push( color.r, color.g, color.b ); + + } + + } + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + var material = new LineBasicMaterial( { vertexColors: VertexColors } ); + + LineSegments.call( this, geometry, material ); + + } + + PolarGridHelper.prototype = Object.create( LineSegments.prototype ); + PolarGridHelper.prototype.constructor = PolarGridHelper; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function FaceNormalsHelper( object, size, hex, linewidth ) { + + // FaceNormalsHelper only supports THREE.Geometry + + this.object = object; + + this.size = ( size !== undefined ) ? size : 1; + + var color = ( hex !== undefined ) ? hex : 0xffff00; + + var width = ( linewidth !== undefined ) ? linewidth : 1; + + // + + var nNormals = 0; + + var objGeometry = this.object.geometry; + + if ( objGeometry && objGeometry.isGeometry ) { + + nNormals = objGeometry.faces.length; + + } else { + + console.warn( 'THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.' ); + + } + + // + + var geometry = new BufferGeometry(); + + var positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 ); + + geometry.addAttribute( 'position', positions ); + + LineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) ); + + // + + this.matrixAutoUpdate = false; + this.update(); + + } + + FaceNormalsHelper.prototype = Object.create( LineSegments.prototype ); + FaceNormalsHelper.prototype.constructor = FaceNormalsHelper; + + FaceNormalsHelper.prototype.update = ( function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + var normalMatrix = new Matrix3(); + + return function update() { + + this.object.updateMatrixWorld( true ); + + normalMatrix.getNormalMatrix( this.object.matrixWorld ); + + var matrixWorld = this.object.matrixWorld; + + var position = this.geometry.attributes.position; + + // + + var objGeometry = this.object.geometry; + + var vertices = objGeometry.vertices; + + var faces = objGeometry.faces; + + var idx = 0; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + var normal = face.normal; + + v1.copy( vertices[ face.a ] ) + .add( vertices[ face.b ] ) + .add( vertices[ face.c ] ) + .divideScalar( 3 ) + .applyMatrix4( matrixWorld ); + + v2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 ); + + position.setXYZ( idx, v1.x, v1.y, v1.z ); + + idx = idx + 1; + + position.setXYZ( idx, v2.x, v2.y, v2.z ); + + idx = idx + 1; + + } + + position.needsUpdate = true; + + }; + + }() ); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function DirectionalLightHelper( light, size ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + if ( size === undefined ) size = 1; + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( [ + - size, size, 0, + size, size, 0, + size, - size, 0, + - size, - size, 0, + - size, size, 0 + ], 3 ) ); + + var material = new LineBasicMaterial( { fog: false } ); + + this.add( new Line( geometry, material ) ); + + geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) ); + + this.add( new Line( geometry, material )); + + this.update(); + + } + + DirectionalLightHelper.prototype = Object.create( Object3D.prototype ); + DirectionalLightHelper.prototype.constructor = DirectionalLightHelper; + + DirectionalLightHelper.prototype.dispose = function () { + + var lightPlane = this.children[ 0 ]; + var targetLine = this.children[ 1 ]; + + lightPlane.geometry.dispose(); + lightPlane.material.dispose(); + targetLine.geometry.dispose(); + targetLine.material.dispose(); + + }; + + DirectionalLightHelper.prototype.update = function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + var v3 = new Vector3(); + + return function update() { + + v1.setFromMatrixPosition( this.light.matrixWorld ); + v2.setFromMatrixPosition( this.light.target.matrixWorld ); + v3.subVectors( v2, v1 ); + + var lightPlane = this.children[ 0 ]; + var targetLine = this.children[ 1 ]; + + lightPlane.lookAt( v3 ); + lightPlane.material.color.copy( this.light.color ); + + targetLine.lookAt( v3 ); + targetLine.scale.z = v3.length(); + + }; + + }(); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author Mugen87 / https://github.com/Mugen87 + * + * - shows frustum, line of sight and up of the camera + * - suitable for fast updates + * - based on frustum visualization in lightgl.js shadowmap example + * http://evanw.github.com/lightgl.js/tests/shadowmap.html + */ + + function CameraHelper( camera ) { + + var geometry = new BufferGeometry(); + var material = new LineBasicMaterial( { color: 0xffffff, vertexColors: FaceColors } ); + + var vertices = []; + var colors = []; + + var pointMap = {}; + + // colors + + var colorFrustum = new Color( 0xffaa00 ); + var colorCone = new Color( 0xff0000 ); + var colorUp = new Color( 0x00aaff ); + var colorTarget = new Color( 0xffffff ); + var colorCross = new Color( 0x333333 ); + + // near + + addLine( "n1", "n2", colorFrustum ); + addLine( "n2", "n4", colorFrustum ); + addLine( "n4", "n3", colorFrustum ); + addLine( "n3", "n1", colorFrustum ); + + // far + + addLine( "f1", "f2", colorFrustum ); + addLine( "f2", "f4", colorFrustum ); + addLine( "f4", "f3", colorFrustum ); + addLine( "f3", "f1", colorFrustum ); + + // sides + + addLine( "n1", "f1", colorFrustum ); + addLine( "n2", "f2", colorFrustum ); + addLine( "n3", "f3", colorFrustum ); + addLine( "n4", "f4", colorFrustum ); + + // cone + + addLine( "p", "n1", colorCone ); + addLine( "p", "n2", colorCone ); + addLine( "p", "n3", colorCone ); + addLine( "p", "n4", colorCone ); + + // up + + addLine( "u1", "u2", colorUp ); + addLine( "u2", "u3", colorUp ); + addLine( "u3", "u1", colorUp ); + + // target + + addLine( "c", "t", colorTarget ); + addLine( "p", "c", colorCross ); + + // cross + + addLine( "cn1", "cn2", colorCross ); + addLine( "cn3", "cn4", colorCross ); + + addLine( "cf1", "cf2", colorCross ); + addLine( "cf3", "cf4", colorCross ); + + function addLine( a, b, color ) { + + addPoint( a, color ); + addPoint( b, color ); + + } + + function addPoint( id, color ) { + + vertices.push( 0, 0, 0 ); + colors.push( color.r, color.g, color.b ); + + if ( pointMap[ id ] === undefined ) { + + pointMap[ id ] = []; + + } + + pointMap[ id ].push( ( vertices.length / 3 ) - 1 ); + + } + + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + LineSegments.call( this, geometry, material ); + + this.camera = camera; + if ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix(); + + this.matrix = camera.matrixWorld; + this.matrixAutoUpdate = false; + + this.pointMap = pointMap; + + this.update(); + + } + + CameraHelper.prototype = Object.create( LineSegments.prototype ); + CameraHelper.prototype.constructor = CameraHelper; + + CameraHelper.prototype.update = function () { + + var geometry, pointMap; + + var vector = new Vector3(); + var camera = new Camera(); + + function setPoint( point, x, y, z ) { + + vector.set( x, y, z ).unproject( camera ); + + var points = pointMap[ point ]; + + if ( points !== undefined ) { + + var position = geometry.getAttribute( 'position' ); + + for ( var i = 0, l = points.length; i < l; i ++ ) { + + position.setXYZ( points[ i ], vector.x, vector.y, vector.z ); + + } + + } + + } + + return function update() { + + geometry = this.geometry; + pointMap = this.pointMap; + + var w = 1, h = 1; + + // we need just camera projection matrix + // world matrix must be identity + + camera.projectionMatrix.copy( this.camera.projectionMatrix ); + + // center / target + + setPoint( "c", 0, 0, - 1 ); + setPoint( "t", 0, 0, 1 ); + + // near + + setPoint( "n1", - w, - h, - 1 ); + setPoint( "n2", w, - h, - 1 ); + setPoint( "n3", - w, h, - 1 ); + setPoint( "n4", w, h, - 1 ); + + // far + + setPoint( "f1", - w, - h, 1 ); + setPoint( "f2", w, - h, 1 ); + setPoint( "f3", - w, h, 1 ); + setPoint( "f4", w, h, 1 ); + + // up + + setPoint( "u1", w * 0.7, h * 1.1, - 1 ); + setPoint( "u2", - w * 0.7, h * 1.1, - 1 ); + setPoint( "u3", 0, h * 2, - 1 ); + + // cross + + setPoint( "cf1", - w, 0, 1 ); + setPoint( "cf2", w, 0, 1 ); + setPoint( "cf3", 0, - h, 1 ); + setPoint( "cf4", 0, h, 1 ); + + setPoint( "cn1", - w, 0, - 1 ); + setPoint( "cn2", w, 0, - 1 ); + setPoint( "cn3", 0, - h, - 1 ); + setPoint( "cn4", 0, h, - 1 ); + + geometry.getAttribute( 'position' ).needsUpdate = true; + + }; + + }(); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / http://github.com/Mugen87 + */ + + function BoxHelper( object, color ) { + + this.object = object; + + if ( color === undefined ) color = 0xffff00; + + var indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] ); + var positions = new Float32Array( 8 * 3 ); + + var geometry = new BufferGeometry(); + geometry.setIndex( new BufferAttribute( indices, 1 ) ); + geometry.addAttribute( 'position', new BufferAttribute( positions, 3 ) ); + + LineSegments.call( this, geometry, new LineBasicMaterial( { color: color } ) ); + + this.matrixAutoUpdate = false; + + this.update(); + + } + + BoxHelper.prototype = Object.create( LineSegments.prototype ); + BoxHelper.prototype.constructor = BoxHelper; + + BoxHelper.prototype.update = ( function () { + + var box = new Box3(); + + return function update( object ) { + + if ( object !== undefined ) { + + console.warn( 'THREE.BoxHelper: .update() has no longer arguments.' ); + + } + + if ( this.object !== undefined ) { + + box.setFromObject( this.object ); + + } + + if ( box.isEmpty() ) return; + + var min = box.min; + var max = box.max; + + /* + 5____4 + 1/___0/| + | 6__|_7 + 2/___3/ + + 0: max.x, max.y, max.z + 1: min.x, max.y, max.z + 2: min.x, min.y, max.z + 3: max.x, min.y, max.z + 4: max.x, max.y, min.z + 5: min.x, max.y, min.z + 6: min.x, min.y, min.z + 7: max.x, min.y, min.z + */ + + var position = this.geometry.attributes.position; + var array = position.array; + + array[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z; + array[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z; + array[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z; + array[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z; + array[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z; + array[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z; + array[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z; + array[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z; + + position.needsUpdate = true; + + this.geometry.computeBoundingSphere(); + + }; + + } )(); + + BoxHelper.prototype.setFromObject = function ( object ) { + + this.object = object; + this.update(); + + return this; + + }; + + /** + * @author WestLangley / http://github.com/WestLangley + * @author zz85 / http://github.com/zz85 + * @author bhouston / http://clara.io + * + * Creates an arrow for visualizing directions + * + * Parameters: + * dir - Vector3 + * origin - Vector3 + * length - Number + * color - color in hex value + * headLength - Number + * headWidth - Number + */ + + var lineGeometry; + var coneGeometry; + + function ArrowHelper( dir, origin, length, color, headLength, headWidth ) { + + // dir is assumed to be normalized + + Object3D.call( this ); + + if ( color === undefined ) color = 0xffff00; + if ( length === undefined ) length = 1; + if ( headLength === undefined ) headLength = 0.2 * length; + if ( headWidth === undefined ) headWidth = 0.2 * headLength; + + if ( lineGeometry === undefined ) { + + lineGeometry = new BufferGeometry(); + lineGeometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) ); + + coneGeometry = new CylinderBufferGeometry( 0, 0.5, 1, 5, 1 ); + coneGeometry.translate( 0, - 0.5, 0 ); + + } + + this.position.copy( origin ); + + this.line = new Line( lineGeometry, new LineBasicMaterial( { color: color } ) ); + this.line.matrixAutoUpdate = false; + this.add( this.line ); + + this.cone = new Mesh( coneGeometry, new MeshBasicMaterial( { color: color } ) ); + this.cone.matrixAutoUpdate = false; + this.add( this.cone ); + + this.setDirection( dir ); + this.setLength( length, headLength, headWidth ); + + } + + ArrowHelper.prototype = Object.create( Object3D.prototype ); + ArrowHelper.prototype.constructor = ArrowHelper; + + ArrowHelper.prototype.setDirection = ( function () { + + var axis = new Vector3(); + var radians; + + return function setDirection( dir ) { + + // dir is assumed to be normalized + + if ( dir.y > 0.99999 ) { + + this.quaternion.set( 0, 0, 0, 1 ); + + } else if ( dir.y < - 0.99999 ) { + + this.quaternion.set( 1, 0, 0, 0 ); + + } else { + + axis.set( dir.z, 0, - dir.x ).normalize(); + + radians = Math.acos( dir.y ); + + this.quaternion.setFromAxisAngle( axis, radians ); + + } + + }; + + }() ); + + ArrowHelper.prototype.setLength = function ( length, headLength, headWidth ) { + + if ( headLength === undefined ) headLength = 0.2 * length; + if ( headWidth === undefined ) headWidth = 0.2 * headLength; + + this.line.scale.set( 1, Math.max( 0, length - headLength ), 1 ); + this.line.updateMatrix(); + + this.cone.scale.set( headWidth, headLength, headWidth ); + this.cone.position.y = length; + this.cone.updateMatrix(); + + }; + + ArrowHelper.prototype.setColor = function ( color ) { + + this.line.material.color.copy( color ); + this.cone.material.color.copy( color ); + + }; + + /** + * @author sroucheray / http://sroucheray.org/ + * @author mrdoob / http://mrdoob.com/ + */ + + function AxisHelper( size ) { + + size = size || 1; + + var vertices = [ + 0, 0, 0, size, 0, 0, + 0, 0, 0, 0, size, 0, + 0, 0, 0, 0, 0, size + ]; + + var colors = [ + 1, 0, 0, 1, 0.6, 0, + 0, 1, 0, 0.6, 1, 0, + 0, 0, 1, 0, 0.6, 1 + ]; + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + var material = new LineBasicMaterial( { vertexColors: VertexColors } ); + + LineSegments.call( this, geometry, material ); + + } + + AxisHelper.prototype = Object.create( LineSegments.prototype ); + AxisHelper.prototype.constructor = AxisHelper; + + /** + * @author zz85 https://github.com/zz85 + * + * Centripetal CatmullRom Curve - which is useful for avoiding + * cusps and self-intersections in non-uniform catmull rom curves. + * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf + * + * curve.type accepts centripetal(default), chordal and catmullrom + * curve.tension is used for catmullrom which defaults to 0.5 + */ + + + /* + Based on an optimized c++ solution in + - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/ + - http://ideone.com/NoEbVM + + This CubicPoly class could be used for reusing some variables and calculations, + but for three.js curve use, it could be possible inlined and flatten into a single function call + which can be placed in CurveUtils. + */ + + function CubicPoly() { + + var c0 = 0, c1 = 0, c2 = 0, c3 = 0; + + /* + * Compute coefficients for a cubic polynomial + * p(s) = c0 + c1*s + c2*s^2 + c3*s^3 + * such that + * p(0) = x0, p(1) = x1 + * and + * p'(0) = t0, p'(1) = t1. + */ + function init( x0, x1, t0, t1 ) { + + c0 = x0; + c1 = t0; + c2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1; + c3 = 2 * x0 - 2 * x1 + t0 + t1; + + } + + return { + + initCatmullRom: function ( x0, x1, x2, x3, tension ) { + + init( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) ); + + }, + + initNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) { + + // compute tangents when parameterized in [t1,t2] + var t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1; + var t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2; + + // rescale tangents for parametrization in [0,1] + t1 *= dt1; + t2 *= dt1; + + init( x1, x2, t1, t2 ); + + }, + + calc: function ( t ) { + + var t2 = t * t; + var t3 = t2 * t; + return c0 + c1 * t + c2 * t2 + c3 * t3; + + } + + }; + + } + + // + + var tmp = new Vector3(); + var px = new CubicPoly(); + var py = new CubicPoly(); + var pz = new CubicPoly(); + + function CatmullRomCurve3( p /* array of Vector3 */ ) { + + Curve.call( this ); + + this.points = p || []; + this.closed = false; + + } + + CatmullRomCurve3.prototype = Object.create( Curve.prototype ); + CatmullRomCurve3.prototype.constructor = CatmullRomCurve3; + + CatmullRomCurve3.prototype.getPoint = function ( t ) { + + var points = this.points; + var l = points.length; + + if ( l < 2 ) console.log( 'duh, you need at least 2 points' ); + + var point = ( l - ( this.closed ? 0 : 1 ) ) * t; + var intPoint = Math.floor( point ); + var weight = point - intPoint; + + if ( this.closed ) { + + intPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / points.length ) + 1 ) * points.length; + + } else if ( weight === 0 && intPoint === l - 1 ) { + + intPoint = l - 2; + weight = 1; + + } + + var p0, p1, p2, p3; // 4 points + + if ( this.closed || intPoint > 0 ) { + + p0 = points[ ( intPoint - 1 ) % l ]; + + } else { + + // extrapolate first point + tmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] ); + p0 = tmp; + + } + + p1 = points[ intPoint % l ]; + p2 = points[ ( intPoint + 1 ) % l ]; + + if ( this.closed || intPoint + 2 < l ) { + + p3 = points[ ( intPoint + 2 ) % l ]; + + } else { + + // extrapolate last point + tmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] ); + p3 = tmp; + + } + + if ( this.type === undefined || this.type === 'centripetal' || this.type === 'chordal' ) { + + // init Centripetal / Chordal Catmull-Rom + var pow = this.type === 'chordal' ? 0.5 : 0.25; + var dt0 = Math.pow( p0.distanceToSquared( p1 ), pow ); + var dt1 = Math.pow( p1.distanceToSquared( p2 ), pow ); + var dt2 = Math.pow( p2.distanceToSquared( p3 ), pow ); + + // safety check for repeated points + if ( dt1 < 1e-4 ) dt1 = 1.0; + if ( dt0 < 1e-4 ) dt0 = dt1; + if ( dt2 < 1e-4 ) dt2 = dt1; + + px.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 ); + py.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 ); + pz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 ); + + } else if ( this.type === 'catmullrom' ) { + + var tension = this.tension !== undefined ? this.tension : 0.5; + px.initCatmullRom( p0.x, p1.x, p2.x, p3.x, tension ); + py.initCatmullRom( p0.y, p1.y, p2.y, p3.y, tension ); + pz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, tension ); + + } + + return new Vector3( px.calc( weight ), py.calc( weight ), pz.calc( weight ) ); + + }; + + function CubicBezierCurve3( v0, v1, v2, v3 ) { + + Curve.call( this ); + + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + this.v3 = v3; + + } + + CubicBezierCurve3.prototype = Object.create( Curve.prototype ); + CubicBezierCurve3.prototype.constructor = CubicBezierCurve3; + + CubicBezierCurve3.prototype.getPoint = function ( t ) { + + var v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3; + + return new Vector3( + CubicBezier( t, v0.x, v1.x, v2.x, v3.x ), + CubicBezier( t, v0.y, v1.y, v2.y, v3.y ), + CubicBezier( t, v0.z, v1.z, v2.z, v3.z ) + ); + + }; + + function QuadraticBezierCurve3( v0, v1, v2 ) { + + Curve.call( this ); + + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + + } + + QuadraticBezierCurve3.prototype = Object.create( Curve.prototype ); + QuadraticBezierCurve3.prototype.constructor = QuadraticBezierCurve3; + + QuadraticBezierCurve3.prototype.getPoint = function ( t ) { + + var v0 = this.v0, v1 = this.v1, v2 = this.v2; + + return new Vector3( + QuadraticBezier( t, v0.x, v1.x, v2.x ), + QuadraticBezier( t, v0.y, v1.y, v2.y ), + QuadraticBezier( t, v0.z, v1.z, v2.z ) + ); + + }; + + function LineCurve3( v1, v2 ) { + + Curve.call( this ); + + this.v1 = v1; + this.v2 = v2; + + } + + LineCurve3.prototype = Object.create( Curve.prototype ); + LineCurve3.prototype.constructor = LineCurve3; + + LineCurve3.prototype.getPoint = function ( t ) { + + if ( t === 1 ) { + + return this.v2.clone(); + + } + + var vector = new Vector3(); + + vector.subVectors( this.v2, this.v1 ); // diff + vector.multiplyScalar( t ); + vector.add( this.v1 ); + + return vector; + + }; + + function ArcCurve( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + EllipseCurve.call( this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise ); + + } + + ArcCurve.prototype = Object.create( EllipseCurve.prototype ); + ArcCurve.prototype.constructor = ArcCurve; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + var SceneUtils = { + + createMultiMaterialObject: function ( geometry, materials ) { + + var group = new Group(); + + for ( var i = 0, l = materials.length; i < l; i ++ ) { + + group.add( new Mesh( geometry, materials[ i ] ) ); + + } + + return group; + + }, + + detach: function ( child, parent, scene ) { + + child.applyMatrix( parent.matrixWorld ); + parent.remove( child ); + scene.add( child ); + + }, + + attach: function ( child, scene, parent ) { + + var matrixWorldInverse = new Matrix4(); + matrixWorldInverse.getInverse( parent.matrixWorld ); + child.applyMatrix( matrixWorldInverse ); + + scene.remove( child ); + parent.add( child ); + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Face4( a, b, c, d, normal, color, materialIndex ) { + + console.warn( 'THREE.Face4 has been removed. A THREE.Face3 will be created instead.' ); + return new Face3( a, b, c, normal, color, materialIndex ); + + } + + var LineStrip = 0; + + var LinePieces = 1; + + function MeshFaceMaterial( materials ) { + + console.warn( 'THREE.MeshFaceMaterial has been removed. Use an Array instead.' ); + return materials; + + } + + function MultiMaterial( materials ) { + + if ( materials === undefined ) materials = []; + + console.warn( 'THREE.MultiMaterial has been removed. Use an Array instead.' ); + materials.isMultiMaterial = true; + materials.materials = materials; + materials.clone = function () { + + return materials.slice(); + + }; + return materials; + + } + + function PointCloud( geometry, material ) { + + console.warn( 'THREE.PointCloud has been renamed to THREE.Points.' ); + return new Points( geometry, material ); + + } + + function Particle( material ) { + + console.warn( 'THREE.Particle has been renamed to THREE.Sprite.' ); + return new Sprite( material ); + + } + + function ParticleSystem( geometry, material ) { + + console.warn( 'THREE.ParticleSystem has been renamed to THREE.Points.' ); + return new Points( geometry, material ); + + } + + function PointCloudMaterial( parameters ) { + + console.warn( 'THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.' ); + return new PointsMaterial( parameters ); + + } + + function ParticleBasicMaterial( parameters ) { + + console.warn( 'THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.' ); + return new PointsMaterial( parameters ); + + } + + function ParticleSystemMaterial( parameters ) { + + console.warn( 'THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.' ); + return new PointsMaterial( parameters ); + + } + + function Vertex( x, y, z ) { + + console.warn( 'THREE.Vertex has been removed. Use THREE.Vector3 instead.' ); + return new Vector3( x, y, z ); + + } + + // + + function DynamicBufferAttribute( array, itemSize ) { + + console.warn( 'THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.' ); + return new BufferAttribute( array, itemSize ).setDynamic( true ); + + } + + function Int8Attribute( array, itemSize ) { + + console.warn( 'THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead.' ); + return new Int8BufferAttribute( array, itemSize ); + + } + + function Uint8Attribute( array, itemSize ) { + + console.warn( 'THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.' ); + return new Uint8BufferAttribute( array, itemSize ); + + } + + function Uint8ClampedAttribute( array, itemSize ) { + + console.warn( 'THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.' ); + return new Uint8ClampedBufferAttribute( array, itemSize ); + + } + + function Int16Attribute( array, itemSize ) { + + console.warn( 'THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.' ); + return new Int16BufferAttribute( array, itemSize ); + + } + + function Uint16Attribute( array, itemSize ) { + + console.warn( 'THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.' ); + return new Uint16BufferAttribute( array, itemSize ); + + } + + function Int32Attribute( array, itemSize ) { + + console.warn( 'THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.' ); + return new Int32BufferAttribute( array, itemSize ); + + } + + function Uint32Attribute( array, itemSize ) { + + console.warn( 'THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.' ); + return new Uint32BufferAttribute( array, itemSize ); + + } + + function Float32Attribute( array, itemSize ) { + + console.warn( 'THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead.' ); + return new Float32BufferAttribute( array, itemSize ); + + } + + function Float64Attribute( array, itemSize ) { + + console.warn( 'THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.' ); + return new Float64BufferAttribute( array, itemSize ); + + } + + // + + Curve.create = function ( construct, getPoint ) { + + console.log( 'THREE.Curve.create() has been deprecated' ); + + construct.prototype = Object.create( Curve.prototype ); + construct.prototype.constructor = construct; + construct.prototype.getPoint = getPoint; + + return construct; + + }; + + // + + function ClosedSplineCurve3( points ) { + + console.warn( 'THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' ); + + CatmullRomCurve3.call( this, points ); + this.type = 'catmullrom'; + this.closed = true; + + } + + ClosedSplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype ); + + // + + function SplineCurve3( points ) { + + console.warn( 'THREE.SplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' ); + + CatmullRomCurve3.call( this, points ); + this.type = 'catmullrom'; + + } + + SplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype ); + + // + + function Spline( points ) { + + console.warn( 'THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.' ); + + CatmullRomCurve3.call( this, points ); + this.type = 'catmullrom'; + + } + + Spline.prototype = Object.create( CatmullRomCurve3.prototype ); + + Object.assign( Spline.prototype, { + + initFromArray: function ( a ) { + + console.error( 'THREE.Spline: .initFromArray() has been removed.' ); + + }, + getControlPointsArray: function ( optionalTarget ) { + + console.error( 'THREE.Spline: .getControlPointsArray() has been removed.' ); + + }, + reparametrizeByArcLength: function ( samplingCoef ) { + + console.error( 'THREE.Spline: .reparametrizeByArcLength() has been removed.' ); + + } + + } ); + + // + function BoundingBoxHelper( object, color ) { + + console.warn( 'THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.' ); + return new BoxHelper( object, color ); + + } + + function EdgesHelper( object, hex ) { + + console.warn( 'THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.' ); + return new LineSegments( new EdgesGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) ); + + } + + GridHelper.prototype.setColors = function () { + + console.error( 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' ); + + }; + + function WireframeHelper( object, hex ) { + + console.warn( 'THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.' ); + return new LineSegments( new WireframeGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) ); + + } + + // + + function XHRLoader( manager ) { + + console.warn( 'THREE.XHRLoader has been renamed to THREE.FileLoader.' ); + return new FileLoader( manager ); + + } + + function BinaryTextureLoader( manager ) { + + console.warn( 'THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader.' ); + return new DataTextureLoader( manager ); + + } + + // + + Object.assign( Box2.prototype, { + + center: function ( optionalTarget ) { + + console.warn( 'THREE.Box2: .center() has been renamed to .getCenter().' ); + return this.getCenter( optionalTarget ); + + }, + empty: function () { + + console.warn( 'THREE.Box2: .empty() has been renamed to .isEmpty().' ); + return this.isEmpty(); + + }, + isIntersectionBox: function ( box ) { + + console.warn( 'THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().' ); + return this.intersectsBox( box ); + + }, + size: function ( optionalTarget ) { + + console.warn( 'THREE.Box2: .size() has been renamed to .getSize().' ); + return this.getSize( optionalTarget ); + + } + } ); + + Object.assign( Box3.prototype, { + + center: function ( optionalTarget ) { + + console.warn( 'THREE.Box3: .center() has been renamed to .getCenter().' ); + return this.getCenter( optionalTarget ); + + }, + empty: function () { + + console.warn( 'THREE.Box3: .empty() has been renamed to .isEmpty().' ); + return this.isEmpty(); + + }, + isIntersectionBox: function ( box ) { + + console.warn( 'THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().' ); + return this.intersectsBox( box ); + + }, + isIntersectionSphere: function ( sphere ) { + + console.warn( 'THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().' ); + return this.intersectsSphere( sphere ); + + }, + size: function ( optionalTarget ) { + + console.warn( 'THREE.Box3: .size() has been renamed to .getSize().' ); + return this.getSize( optionalTarget ); + + } + } ); + + Line3.prototype.center = function ( optionalTarget ) { + + console.warn( 'THREE.Line3: .center() has been renamed to .getCenter().' ); + return this.getCenter( optionalTarget ); + + }; + + _Math.random16 = function () { + + console.warn( 'THREE.Math.random16() has been deprecated. Use Math.random() instead.' ); + return Math.random(); + + }; + + Object.assign( Matrix3.prototype, { + + flattenToArrayOffset: function ( array, offset ) { + + console.warn( "THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead." ); + return this.toArray( array, offset ); + + }, + multiplyVector3: function ( vector ) { + + console.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' ); + return vector.applyMatrix3( this ); + + }, + multiplyVector3Array: function ( a ) { + + console.warn( 'THREE.Matrix3: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' ); + return this.applyToVector3Array( a ); + + }, + applyToBuffer: function( buffer, offset, length ) { + + console.warn( 'THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' ); + return this.applyToBufferAttribute( buffer ); + + }, + applyToVector3Array: function( array, offset, length ) { + + console.error( 'THREE.Matrix3: .applyToVector3Array() has been removed.' ); + + } + + } ); + + Object.assign( Matrix4.prototype, { + + extractPosition: function ( m ) { + + console.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' ); + return this.copyPosition( m ); + + }, + flattenToArrayOffset: function ( array, offset ) { + + console.warn( "THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead." ); + return this.toArray( array, offset ); + + }, + getPosition: function () { + + var v1; + + return function getPosition() { + + if ( v1 === undefined ) v1 = new Vector3(); + console.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' ); + return v1.setFromMatrixColumn( this, 3 ); + + }; + + }(), + setRotationFromQuaternion: function ( q ) { + + console.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' ); + return this.makeRotationFromQuaternion( q ); + + }, + multiplyToArray: function () { + + console.warn( 'THREE.Matrix4: .multiplyToArray() has been removed.' ); + + }, + multiplyVector3: function ( vector ) { + + console.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); + return vector.applyMatrix4( this ); + + }, + multiplyVector4: function ( vector ) { + + console.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); + return vector.applyMatrix4( this ); + + }, + multiplyVector3Array: function ( a ) { + + console.warn( 'THREE.Matrix4: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' ); + return this.applyToVector3Array( a ); + + }, + rotateAxis: function ( v ) { + + console.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' ); + v.transformDirection( this ); + + }, + crossVector: function ( vector ) { + + console.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); + return vector.applyMatrix4( this ); + + }, + translate: function () { + + console.error( 'THREE.Matrix4: .translate() has been removed.' ); + + }, + rotateX: function () { + + console.error( 'THREE.Matrix4: .rotateX() has been removed.' ); + + }, + rotateY: function () { + + console.error( 'THREE.Matrix4: .rotateY() has been removed.' ); + + }, + rotateZ: function () { + + console.error( 'THREE.Matrix4: .rotateZ() has been removed.' ); + + }, + rotateByAxis: function () { + + console.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' ); + + }, + applyToBuffer: function( buffer, offset, length ) { + + console.warn( 'THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' ); + return this.applyToBufferAttribute( buffer ); + + }, + applyToVector3Array: function( array, offset, length ) { + + console.error( 'THREE.Matrix4: .applyToVector3Array() has been removed.' ); + + }, + makeFrustum: function( left, right, bottom, top, near, far ) { + + console.warn( 'THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.' ); + return this.makePerspective( left, right, top, bottom, near, far ); + + } + + } ); + + Plane.prototype.isIntersectionLine = function ( line ) { + + console.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' ); + return this.intersectsLine( line ); + + }; + + Quaternion.prototype.multiplyVector3 = function ( vector ) { + + console.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' ); + return vector.applyQuaternion( this ); + + }; + + Object.assign( Ray.prototype, { + + isIntersectionBox: function ( box ) { + + console.warn( 'THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().' ); + return this.intersectsBox( box ); + + }, + isIntersectionPlane: function ( plane ) { + + console.warn( 'THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().' ); + return this.intersectsPlane( plane ); + + }, + isIntersectionSphere: function ( sphere ) { + + console.warn( 'THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().' ); + return this.intersectsSphere( sphere ); + + } + + } ); + + Object.assign( Shape.prototype, { + + extrude: function ( options ) { + + console.warn( 'THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.' ); + return new ExtrudeGeometry( this, options ); + + }, + makeGeometry: function ( options ) { + + console.warn( 'THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.' ); + return new ShapeGeometry( this, options ); + + } + + } ); + + Object.assign( Vector2.prototype, { + + fromAttribute: function ( attribute, index, offset ) { + + console.error( 'THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().' ); + return this.fromBufferAttribute( attribute, index, offset ); + + } + + } ); + + Object.assign( Vector3.prototype, { + + setEulerFromRotationMatrix: function () { + + console.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' ); + + }, + setEulerFromQuaternion: function () { + + console.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' ); + + }, + getPositionFromMatrix: function ( m ) { + + console.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' ); + return this.setFromMatrixPosition( m ); + + }, + getScaleFromMatrix: function ( m ) { + + console.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' ); + return this.setFromMatrixScale( m ); + + }, + getColumnFromMatrix: function ( index, matrix ) { + + console.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' ); + return this.setFromMatrixColumn( matrix, index ); + + }, + applyProjection: function ( m ) { + + console.warn( 'THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.' ); + return this.applyMatrix4( m ); + + }, + fromAttribute: function ( attribute, index, offset ) { + + console.error( 'THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().' ); + return this.fromBufferAttribute( attribute, index, offset ); + + } + + } ); + + Object.assign( Vector4.prototype, { + + fromAttribute: function ( attribute, index, offset ) { + + console.error( 'THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().' ); + return this.fromBufferAttribute( attribute, index, offset ); + + } + + } ); + + // + + Geometry.prototype.computeTangents = function () { + + console.warn( 'THREE.Geometry: .computeTangents() has been removed.' ); + + }; + + Object.assign( Object3D.prototype, { + + getChildByName: function ( name ) { + + console.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' ); + return this.getObjectByName( name ); + + }, + renderDepth: function () { + + console.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' ); + + }, + translate: function ( distance, axis ) { + + console.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' ); + return this.translateOnAxis( axis, distance ); + + } + + } ); + + Object.defineProperties( Object3D.prototype, { + + eulerOrder: { + get: function () { + + console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' ); + return this.rotation.order; + + }, + set: function ( value ) { + + console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' ); + this.rotation.order = value; + + } + }, + useQuaternion: { + get: function () { + + console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' ); + + }, + set: function () { + + console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' ); + + } + } + + } ); + + Object.defineProperties( LOD.prototype, { + + objects: { + get: function () { + + console.warn( 'THREE.LOD: .objects has been renamed to .levels.' ); + return this.levels; + + } + } + + } ); + + Object.defineProperty( Skeleton.prototype, 'useVertexTexture', { + + get: function () { + + console.warn( 'THREE.Skeleton: useVertexTexture has been removed.' ); + + }, + set: function () { + + console.warn( 'THREE.Skeleton: useVertexTexture has been removed.' ); + + } + + } ); + + Object.defineProperty( Curve.prototype, '__arcLengthDivisions', { + + get: function () { + + console.warn( 'THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.' ); + return this.arcLengthDivisions; + + }, + set: function ( value ) { + + console.warn( 'THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.' ); + this.arcLengthDivisions = value; + + } + + } ); + + // + + PerspectiveCamera.prototype.setLens = function ( focalLength, filmGauge ) { + + console.warn( "THREE.PerspectiveCamera.setLens is deprecated. " + + "Use .setFocalLength and .filmGauge for a photographic setup." ); + + if ( filmGauge !== undefined ) this.filmGauge = filmGauge; + this.setFocalLength( focalLength ); + + }; + + // + + Object.defineProperties( Light.prototype, { + onlyShadow: { + set: function () { + + console.warn( 'THREE.Light: .onlyShadow has been removed.' ); + + } + }, + shadowCameraFov: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraFov is now .shadow.camera.fov.' ); + this.shadow.camera.fov = value; + + } + }, + shadowCameraLeft: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraLeft is now .shadow.camera.left.' ); + this.shadow.camera.left = value; + + } + }, + shadowCameraRight: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraRight is now .shadow.camera.right.' ); + this.shadow.camera.right = value; + + } + }, + shadowCameraTop: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraTop is now .shadow.camera.top.' ); + this.shadow.camera.top = value; + + } + }, + shadowCameraBottom: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.' ); + this.shadow.camera.bottom = value; + + } + }, + shadowCameraNear: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraNear is now .shadow.camera.near.' ); + this.shadow.camera.near = value; + + } + }, + shadowCameraFar: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraFar is now .shadow.camera.far.' ); + this.shadow.camera.far = value; + + } + }, + shadowCameraVisible: { + set: function () { + + console.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' ); + + } + }, + shadowBias: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowBias is now .shadow.bias.' ); + this.shadow.bias = value; + + } + }, + shadowDarkness: { + set: function () { + + console.warn( 'THREE.Light: .shadowDarkness has been removed.' ); + + } + }, + shadowMapWidth: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.' ); + this.shadow.mapSize.width = value; + + } + }, + shadowMapHeight: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.' ); + this.shadow.mapSize.height = value; + + } + } + } ); + + // + + Object.defineProperties( BufferAttribute.prototype, { + + length: { + get: function () { + + console.warn( 'THREE.BufferAttribute: .length has been deprecated. Use .count instead.' ); + return this.array.length; + + } + } + + } ); + + Object.assign( BufferGeometry.prototype, { + + addIndex: function ( index ) { + + console.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' ); + this.setIndex( index ); + + }, + addDrawCall: function ( start, count, indexOffset ) { + + if ( indexOffset !== undefined ) { + + console.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' ); + + } + console.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' ); + this.addGroup( start, count ); + + }, + clearDrawCalls: function () { + + console.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' ); + this.clearGroups(); + + }, + computeTangents: function () { + + console.warn( 'THREE.BufferGeometry: .computeTangents() has been removed.' ); + + }, + computeOffsets: function () { + + console.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.' ); + + } + + } ); + + Object.defineProperties( BufferGeometry.prototype, { + + drawcalls: { + get: function () { + + console.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' ); + return this.groups; + + } + }, + offsets: { + get: function () { + + console.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' ); + return this.groups; + + } + } + + } ); + + // + + Object.defineProperties( Uniform.prototype, { + + dynamic: { + set: function () { + + console.warn( 'THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.' ); + + } + }, + onUpdate: { + value: function () { + + console.warn( 'THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.' ); + return this; + + } + } + + } ); + + // + + Object.defineProperties( Material.prototype, { + + wrapAround: { + get: function () { + + console.warn( 'THREE.Material: .wrapAround has been removed.' ); + + }, + set: function () { + + console.warn( 'THREE.Material: .wrapAround has been removed.' ); + + } + }, + wrapRGB: { + get: function () { + + console.warn( 'THREE.Material: .wrapRGB has been removed.' ); + return new Color(); + + } + } + + } ); + + Object.defineProperties( MeshPhongMaterial.prototype, { + + metal: { + get: function () { + + console.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.' ); + return false; + + }, + set: function () { + + console.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead' ); + + } + } + + } ); + + Object.defineProperties( ShaderMaterial.prototype, { + + derivatives: { + get: function () { + + console.warn( 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' ); + return this.extensions.derivatives; + + }, + set: function ( value ) { + + console.warn( 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' ); + this.extensions.derivatives = value; + + } + } + + } ); + + // + + Object.assign( WebGLRenderer.prototype, { + + getCurrentRenderTarget: function () { + + console.warn( 'THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().' ); + return this.getRenderTarget(); + + }, + + supportsFloatTextures: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \'OES_texture_float\' ).' ); + return this.extensions.get( 'OES_texture_float' ); + + }, + supportsHalfFloatTextures: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \'OES_texture_half_float\' ).' ); + return this.extensions.get( 'OES_texture_half_float' ); + + }, + supportsStandardDerivatives: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \'OES_standard_derivatives\' ).' ); + return this.extensions.get( 'OES_standard_derivatives' ); + + }, + supportsCompressedTextureS3TC: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \'WEBGL_compressed_texture_s3tc\' ).' ); + return this.extensions.get( 'WEBGL_compressed_texture_s3tc' ); + + }, + supportsCompressedTexturePVRTC: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \'WEBGL_compressed_texture_pvrtc\' ).' ); + return this.extensions.get( 'WEBGL_compressed_texture_pvrtc' ); + + }, + supportsBlendMinMax: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \'EXT_blend_minmax\' ).' ); + return this.extensions.get( 'EXT_blend_minmax' ); + + }, + supportsVertexTextures: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.' ); + return this.capabilities.vertexTextures; + + }, + supportsInstancedArrays: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \'ANGLE_instanced_arrays\' ).' ); + return this.extensions.get( 'ANGLE_instanced_arrays' ); + + }, + enableScissorTest: function ( boolean ) { + + console.warn( 'THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().' ); + this.setScissorTest( boolean ); + + }, + initMaterial: function () { + + console.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' ); + + }, + addPrePlugin: function () { + + console.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' ); + + }, + addPostPlugin: function () { + + console.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' ); + + }, + updateShadowMap: function () { + + console.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' ); + + } + + } ); + + Object.defineProperties( WebGLRenderer.prototype, { + + shadowMapEnabled: { + get: function () { + + return this.shadowMap.enabled; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' ); + this.shadowMap.enabled = value; + + } + }, + shadowMapType: { + get: function () { + + return this.shadowMap.type; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' ); + this.shadowMap.type = value; + + } + }, + shadowMapCullFace: { + get: function () { + + return this.shadowMap.cullFace; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace.' ); + this.shadowMap.cullFace = value; + + } + } + } ); + + Object.defineProperties( WebGLShadowMap.prototype, { + + cullFace: { + get: function () { + + return this.renderReverseSided ? CullFaceFront : CullFaceBack; + + }, + set: function ( cullFace ) { + + var value = ( cullFace !== CullFaceBack ); + console.warn( "WebGLRenderer: .shadowMap.cullFace is deprecated. Set .shadowMap.renderReverseSided to " + value + "." ); + this.renderReverseSided = value; + + } + } + + } ); + + // + + Object.defineProperties( WebGLRenderTarget.prototype, { + + wrapS: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' ); + return this.texture.wrapS; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' ); + this.texture.wrapS = value; + + } + }, + wrapT: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' ); + return this.texture.wrapT; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' ); + this.texture.wrapT = value; + + } + }, + magFilter: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' ); + return this.texture.magFilter; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' ); + this.texture.magFilter = value; + + } + }, + minFilter: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' ); + return this.texture.minFilter; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' ); + this.texture.minFilter = value; + + } + }, + anisotropy: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' ); + return this.texture.anisotropy; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' ); + this.texture.anisotropy = value; + + } + }, + offset: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' ); + return this.texture.offset; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' ); + this.texture.offset = value; + + } + }, + repeat: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' ); + return this.texture.repeat; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' ); + this.texture.repeat = value; + + } + }, + format: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' ); + return this.texture.format; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' ); + this.texture.format = value; + + } + }, + type: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' ); + return this.texture.type; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' ); + this.texture.type = value; + + } + }, + generateMipmaps: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' ); + return this.texture.generateMipmaps; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' ); + this.texture.generateMipmaps = value; + + } + } + + } ); + + // + + Audio.prototype.load = function ( file ) { + + console.warn( 'THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.' ); + var scope = this; + var audioLoader = new AudioLoader(); + audioLoader.load( file, function ( buffer ) { + + scope.setBuffer( buffer ); + + } ); + return this; + + }; + + AudioAnalyser.prototype.getData = function () { + + console.warn( 'THREE.AudioAnalyser: .getData() is now .getFrequencyData().' ); + return this.getFrequencyData(); + + }; + + // + + var GeometryUtils = { + + merge: function ( geometry1, geometry2, materialIndexOffset ) { + + console.warn( 'THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.' ); + var matrix; + + if ( geometry2.isMesh ) { + + geometry2.matrixAutoUpdate && geometry2.updateMatrix(); + + matrix = geometry2.matrix; + geometry2 = geometry2.geometry; + + } + + geometry1.merge( geometry2, matrix, materialIndexOffset ); + + }, + + center: function ( geometry ) { + + console.warn( 'THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.' ); + return geometry.center(); + + } + + }; + + var ImageUtils = { + + crossOrigin: undefined, + + loadTexture: function ( url, mapping, onLoad, onError ) { + + console.warn( 'THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.' ); + + var loader = new TextureLoader(); + loader.setCrossOrigin( this.crossOrigin ); + + var texture = loader.load( url, onLoad, undefined, onError ); + + if ( mapping ) texture.mapping = mapping; + + return texture; + + }, + + loadTextureCube: function ( urls, mapping, onLoad, onError ) { + + console.warn( 'THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.' ); + + var loader = new CubeTextureLoader(); + loader.setCrossOrigin( this.crossOrigin ); + + var texture = loader.load( urls, onLoad, undefined, onError ); + + if ( mapping ) texture.mapping = mapping; + + return texture; + + }, + + loadCompressedTexture: function () { + + console.error( 'THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.' ); + + }, + + loadCompressedTextureCube: function () { + + console.error( 'THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.' ); + + } + + }; + + // + + function Projector() { + + console.error( 'THREE.Projector has been moved to /examples/js/renderers/Projector.js.' ); + + this.projectVector = function ( vector, camera ) { + + console.warn( 'THREE.Projector: .projectVector() is now vector.project().' ); + vector.project( camera ); + + }; + + this.unprojectVector = function ( vector, camera ) { + + console.warn( 'THREE.Projector: .unprojectVector() is now vector.unproject().' ); + vector.unproject( camera ); + + }; + + this.pickingRay = function () { + + console.error( 'THREE.Projector: .pickingRay() is now raycaster.setFromCamera().' ); + + }; + + } + + // + + function CanvasRenderer() { + + console.error( 'THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js' ); + + this.domElement = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + this.clear = function () {}; + this.render = function () {}; + this.setClearColor = function () {}; + this.setSize = function () {}; + + } + + exports.WebGLRenderTargetCube = WebGLRenderTargetCube; + exports.WebGLRenderTarget = WebGLRenderTarget; + exports.WebGLRenderer = WebGLRenderer; + exports.ShaderLib = ShaderLib; + exports.UniformsLib = UniformsLib; + exports.UniformsUtils = UniformsUtils; + exports.ShaderChunk = ShaderChunk; + exports.FogExp2 = FogExp2; + exports.Fog = Fog; + exports.Scene = Scene; + exports.LensFlare = LensFlare; + exports.Sprite = Sprite; + exports.LOD = LOD; + exports.SkinnedMesh = SkinnedMesh; + exports.Skeleton = Skeleton; + exports.Bone = Bone; + exports.Mesh = Mesh; + exports.LineSegments = LineSegments; + exports.LineLoop = LineLoop; + exports.Line = Line; + exports.Points = Points; + exports.Group = Group; + exports.VideoTexture = VideoTexture; + exports.DataTexture = DataTexture; + exports.CompressedTexture = CompressedTexture; + exports.CubeTexture = CubeTexture; + exports.CanvasTexture = CanvasTexture; + exports.DepthTexture = DepthTexture; + exports.Texture = Texture; + exports.CompressedTextureLoader = CompressedTextureLoader; + exports.DataTextureLoader = DataTextureLoader; + exports.CubeTextureLoader = CubeTextureLoader; + exports.TextureLoader = TextureLoader; + exports.ObjectLoader = ObjectLoader; + exports.MaterialLoader = MaterialLoader; + exports.BufferGeometryLoader = BufferGeometryLoader; + exports.DefaultLoadingManager = DefaultLoadingManager; + exports.LoadingManager = LoadingManager; + exports.JSONLoader = JSONLoader; + exports.ImageLoader = ImageLoader; + exports.FontLoader = FontLoader; + exports.FileLoader = FileLoader; + exports.Loader = Loader; + exports.Cache = Cache; + exports.AudioLoader = AudioLoader; + exports.SpotLightShadow = SpotLightShadow; + exports.SpotLight = SpotLight; + exports.PointLight = PointLight; + exports.RectAreaLight = RectAreaLight; + exports.HemisphereLight = HemisphereLight; + exports.DirectionalLightShadow = DirectionalLightShadow; + exports.DirectionalLight = DirectionalLight; + exports.AmbientLight = AmbientLight; + exports.LightShadow = LightShadow; + exports.Light = Light; + exports.StereoCamera = StereoCamera; + exports.PerspectiveCamera = PerspectiveCamera; + exports.OrthographicCamera = OrthographicCamera; + exports.CubeCamera = CubeCamera; + exports.ArrayCamera = ArrayCamera; + exports.Camera = Camera; + exports.AudioListener = AudioListener; + exports.PositionalAudio = PositionalAudio; + exports.AudioContext = AudioContext; + exports.AudioAnalyser = AudioAnalyser; + exports.Audio = Audio; + exports.VectorKeyframeTrack = VectorKeyframeTrack; + exports.StringKeyframeTrack = StringKeyframeTrack; + exports.QuaternionKeyframeTrack = QuaternionKeyframeTrack; + exports.NumberKeyframeTrack = NumberKeyframeTrack; + exports.ColorKeyframeTrack = ColorKeyframeTrack; + exports.BooleanKeyframeTrack = BooleanKeyframeTrack; + exports.PropertyMixer = PropertyMixer; + exports.PropertyBinding = PropertyBinding; + exports.KeyframeTrack = KeyframeTrack; + exports.AnimationUtils = AnimationUtils; + exports.AnimationObjectGroup = AnimationObjectGroup; + exports.AnimationMixer = AnimationMixer; + exports.AnimationClip = AnimationClip; + exports.Uniform = Uniform; + exports.InstancedBufferGeometry = InstancedBufferGeometry; + exports.BufferGeometry = BufferGeometry; + exports.GeometryIdCount = GeometryIdCount; + exports.Geometry = Geometry; + exports.InterleavedBufferAttribute = InterleavedBufferAttribute; + exports.InstancedInterleavedBuffer = InstancedInterleavedBuffer; + exports.InterleavedBuffer = InterleavedBuffer; + exports.InstancedBufferAttribute = InstancedBufferAttribute; + exports.Face3 = Face3; + exports.Object3D = Object3D; + exports.Raycaster = Raycaster; + exports.Layers = Layers; + exports.EventDispatcher = EventDispatcher; + exports.Clock = Clock; + exports.QuaternionLinearInterpolant = QuaternionLinearInterpolant; + exports.LinearInterpolant = LinearInterpolant; + exports.DiscreteInterpolant = DiscreteInterpolant; + exports.CubicInterpolant = CubicInterpolant; + exports.Interpolant = Interpolant; + exports.Triangle = Triangle; + exports.Math = _Math; + exports.Spherical = Spherical; + exports.Cylindrical = Cylindrical; + exports.Plane = Plane; + exports.Frustum = Frustum; + exports.Sphere = Sphere; + exports.Ray = Ray; + exports.Matrix4 = Matrix4; + exports.Matrix3 = Matrix3; + exports.Box3 = Box3; + exports.Box2 = Box2; + exports.Line3 = Line3; + exports.Euler = Euler; + exports.Vector4 = Vector4; + exports.Vector3 = Vector3; + exports.Vector2 = Vector2; + exports.Quaternion = Quaternion; + exports.Color = Color; + exports.MorphBlendMesh = MorphBlendMesh; + exports.ImmediateRenderObject = ImmediateRenderObject; + exports.VertexNormalsHelper = VertexNormalsHelper; + exports.SpotLightHelper = SpotLightHelper; + exports.SkeletonHelper = SkeletonHelper; + exports.PointLightHelper = PointLightHelper; + exports.RectAreaLightHelper = RectAreaLightHelper; + exports.HemisphereLightHelper = HemisphereLightHelper; + exports.GridHelper = GridHelper; + exports.PolarGridHelper = PolarGridHelper; + exports.FaceNormalsHelper = FaceNormalsHelper; + exports.DirectionalLightHelper = DirectionalLightHelper; + exports.CameraHelper = CameraHelper; + exports.BoxHelper = BoxHelper; + exports.ArrowHelper = ArrowHelper; + exports.AxisHelper = AxisHelper; + exports.CatmullRomCurve3 = CatmullRomCurve3; + exports.CubicBezierCurve3 = CubicBezierCurve3; + exports.QuadraticBezierCurve3 = QuadraticBezierCurve3; + exports.LineCurve3 = LineCurve3; + exports.ArcCurve = ArcCurve; + exports.EllipseCurve = EllipseCurve; + exports.SplineCurve = SplineCurve; + exports.CubicBezierCurve = CubicBezierCurve; + exports.QuadraticBezierCurve = QuadraticBezierCurve; + exports.LineCurve = LineCurve; + exports.Shape = Shape; + exports.Path = Path; + exports.ShapePath = ShapePath; + exports.Font = Font; + exports.CurvePath = CurvePath; + exports.Curve = Curve; + exports.ShapeUtils = ShapeUtils; + exports.SceneUtils = SceneUtils; + exports.WireframeGeometry = WireframeGeometry; + exports.ParametricGeometry = ParametricGeometry; + exports.ParametricBufferGeometry = ParametricBufferGeometry; + exports.TetrahedronGeometry = TetrahedronGeometry; + exports.TetrahedronBufferGeometry = TetrahedronBufferGeometry; + exports.OctahedronGeometry = OctahedronGeometry; + exports.OctahedronBufferGeometry = OctahedronBufferGeometry; + exports.IcosahedronGeometry = IcosahedronGeometry; + exports.IcosahedronBufferGeometry = IcosahedronBufferGeometry; + exports.DodecahedronGeometry = DodecahedronGeometry; + exports.DodecahedronBufferGeometry = DodecahedronBufferGeometry; + exports.PolyhedronGeometry = PolyhedronGeometry; + exports.PolyhedronBufferGeometry = PolyhedronBufferGeometry; + exports.TubeGeometry = TubeGeometry; + exports.TubeBufferGeometry = TubeBufferGeometry; + exports.TorusKnotGeometry = TorusKnotGeometry; + exports.TorusKnotBufferGeometry = TorusKnotBufferGeometry; + exports.TorusGeometry = TorusGeometry; + exports.TorusBufferGeometry = TorusBufferGeometry; + exports.TextGeometry = TextGeometry; + exports.TextBufferGeometry = TextBufferGeometry; + exports.SphereGeometry = SphereGeometry; + exports.SphereBufferGeometry = SphereBufferGeometry; + exports.RingGeometry = RingGeometry; + exports.RingBufferGeometry = RingBufferGeometry; + exports.PlaneGeometry = PlaneGeometry; + exports.PlaneBufferGeometry = PlaneBufferGeometry; + exports.LatheGeometry = LatheGeometry; + exports.LatheBufferGeometry = LatheBufferGeometry; + exports.ShapeGeometry = ShapeGeometry; + exports.ShapeBufferGeometry = ShapeBufferGeometry; + exports.ExtrudeGeometry = ExtrudeGeometry; + exports.ExtrudeBufferGeometry = ExtrudeBufferGeometry; + exports.EdgesGeometry = EdgesGeometry; + exports.ConeGeometry = ConeGeometry; + exports.ConeBufferGeometry = ConeBufferGeometry; + exports.CylinderGeometry = CylinderGeometry; + exports.CylinderBufferGeometry = CylinderBufferGeometry; + exports.CircleGeometry = CircleGeometry; + exports.CircleBufferGeometry = CircleBufferGeometry; + exports.BoxGeometry = BoxGeometry; + exports.BoxBufferGeometry = BoxBufferGeometry; + exports.ShadowMaterial = ShadowMaterial; + exports.SpriteMaterial = SpriteMaterial; + exports.RawShaderMaterial = RawShaderMaterial; + exports.ShaderMaterial = ShaderMaterial; + exports.PointsMaterial = PointsMaterial; + exports.MeshPhysicalMaterial = MeshPhysicalMaterial; + exports.MeshStandardMaterial = MeshStandardMaterial; + exports.MeshPhongMaterial = MeshPhongMaterial; + exports.MeshToonMaterial = MeshToonMaterial; + exports.MeshNormalMaterial = MeshNormalMaterial; + exports.MeshLambertMaterial = MeshLambertMaterial; + exports.MeshDepthMaterial = MeshDepthMaterial; + exports.MeshBasicMaterial = MeshBasicMaterial; + exports.LineDashedMaterial = LineDashedMaterial; + exports.LineBasicMaterial = LineBasicMaterial; + exports.Material = Material; + exports.Float64BufferAttribute = Float64BufferAttribute; + exports.Float32BufferAttribute = Float32BufferAttribute; + exports.Uint32BufferAttribute = Uint32BufferAttribute; + exports.Int32BufferAttribute = Int32BufferAttribute; + exports.Uint16BufferAttribute = Uint16BufferAttribute; + exports.Int16BufferAttribute = Int16BufferAttribute; + exports.Uint8ClampedBufferAttribute = Uint8ClampedBufferAttribute; + exports.Uint8BufferAttribute = Uint8BufferAttribute; + exports.Int8BufferAttribute = Int8BufferAttribute; + exports.BufferAttribute = BufferAttribute; + exports.REVISION = REVISION; + exports.MOUSE = MOUSE; + exports.CullFaceNone = CullFaceNone; + exports.CullFaceBack = CullFaceBack; + exports.CullFaceFront = CullFaceFront; + exports.CullFaceFrontBack = CullFaceFrontBack; + exports.FrontFaceDirectionCW = FrontFaceDirectionCW; + exports.FrontFaceDirectionCCW = FrontFaceDirectionCCW; + exports.BasicShadowMap = BasicShadowMap; + exports.PCFShadowMap = PCFShadowMap; + exports.PCFSoftShadowMap = PCFSoftShadowMap; + exports.FrontSide = FrontSide; + exports.BackSide = BackSide; + exports.DoubleSide = DoubleSide; + exports.FlatShading = FlatShading; + exports.SmoothShading = SmoothShading; + exports.NoColors = NoColors; + exports.FaceColors = FaceColors; + exports.VertexColors = VertexColors; + exports.NoBlending = NoBlending; + exports.NormalBlending = NormalBlending; + exports.AdditiveBlending = AdditiveBlending; + exports.SubtractiveBlending = SubtractiveBlending; + exports.MultiplyBlending = MultiplyBlending; + exports.CustomBlending = CustomBlending; + exports.AddEquation = AddEquation; + exports.SubtractEquation = SubtractEquation; + exports.ReverseSubtractEquation = ReverseSubtractEquation; + exports.MinEquation = MinEquation; + exports.MaxEquation = MaxEquation; + exports.ZeroFactor = ZeroFactor; + exports.OneFactor = OneFactor; + exports.SrcColorFactor = SrcColorFactor; + exports.OneMinusSrcColorFactor = OneMinusSrcColorFactor; + exports.SrcAlphaFactor = SrcAlphaFactor; + exports.OneMinusSrcAlphaFactor = OneMinusSrcAlphaFactor; + exports.DstAlphaFactor = DstAlphaFactor; + exports.OneMinusDstAlphaFactor = OneMinusDstAlphaFactor; + exports.DstColorFactor = DstColorFactor; + exports.OneMinusDstColorFactor = OneMinusDstColorFactor; + exports.SrcAlphaSaturateFactor = SrcAlphaSaturateFactor; + exports.NeverDepth = NeverDepth; + exports.AlwaysDepth = AlwaysDepth; + exports.LessDepth = LessDepth; + exports.LessEqualDepth = LessEqualDepth; + exports.EqualDepth = EqualDepth; + exports.GreaterEqualDepth = GreaterEqualDepth; + exports.GreaterDepth = GreaterDepth; + exports.NotEqualDepth = NotEqualDepth; + exports.MultiplyOperation = MultiplyOperation; + exports.MixOperation = MixOperation; + exports.AddOperation = AddOperation; + exports.NoToneMapping = NoToneMapping; + exports.LinearToneMapping = LinearToneMapping; + exports.ReinhardToneMapping = ReinhardToneMapping; + exports.Uncharted2ToneMapping = Uncharted2ToneMapping; + exports.CineonToneMapping = CineonToneMapping; + exports.UVMapping = UVMapping; + exports.CubeReflectionMapping = CubeReflectionMapping; + exports.CubeRefractionMapping = CubeRefractionMapping; + exports.EquirectangularReflectionMapping = EquirectangularReflectionMapping; + exports.EquirectangularRefractionMapping = EquirectangularRefractionMapping; + exports.SphericalReflectionMapping = SphericalReflectionMapping; + exports.CubeUVReflectionMapping = CubeUVReflectionMapping; + exports.CubeUVRefractionMapping = CubeUVRefractionMapping; + exports.RepeatWrapping = RepeatWrapping; + exports.ClampToEdgeWrapping = ClampToEdgeWrapping; + exports.MirroredRepeatWrapping = MirroredRepeatWrapping; + exports.NearestFilter = NearestFilter; + exports.NearestMipMapNearestFilter = NearestMipMapNearestFilter; + exports.NearestMipMapLinearFilter = NearestMipMapLinearFilter; + exports.LinearFilter = LinearFilter; + exports.LinearMipMapNearestFilter = LinearMipMapNearestFilter; + exports.LinearMipMapLinearFilter = LinearMipMapLinearFilter; + exports.UnsignedByteType = UnsignedByteType; + exports.ByteType = ByteType; + exports.ShortType = ShortType; + exports.UnsignedShortType = UnsignedShortType; + exports.IntType = IntType; + exports.UnsignedIntType = UnsignedIntType; + exports.FloatType = FloatType; + exports.HalfFloatType = HalfFloatType; + exports.UnsignedShort4444Type = UnsignedShort4444Type; + exports.UnsignedShort5551Type = UnsignedShort5551Type; + exports.UnsignedShort565Type = UnsignedShort565Type; + exports.UnsignedInt248Type = UnsignedInt248Type; + exports.AlphaFormat = AlphaFormat; + exports.RGBFormat = RGBFormat; + exports.RGBAFormat = RGBAFormat; + exports.LuminanceFormat = LuminanceFormat; + exports.LuminanceAlphaFormat = LuminanceAlphaFormat; + exports.RGBEFormat = RGBEFormat; + exports.DepthFormat = DepthFormat; + exports.DepthStencilFormat = DepthStencilFormat; + exports.RGB_S3TC_DXT1_Format = RGB_S3TC_DXT1_Format; + exports.RGBA_S3TC_DXT1_Format = RGBA_S3TC_DXT1_Format; + exports.RGBA_S3TC_DXT3_Format = RGBA_S3TC_DXT3_Format; + exports.RGBA_S3TC_DXT5_Format = RGBA_S3TC_DXT5_Format; + exports.RGB_PVRTC_4BPPV1_Format = RGB_PVRTC_4BPPV1_Format; + exports.RGB_PVRTC_2BPPV1_Format = RGB_PVRTC_2BPPV1_Format; + exports.RGBA_PVRTC_4BPPV1_Format = RGBA_PVRTC_4BPPV1_Format; + exports.RGBA_PVRTC_2BPPV1_Format = RGBA_PVRTC_2BPPV1_Format; + exports.RGB_ETC1_Format = RGB_ETC1_Format; + exports.LoopOnce = LoopOnce; + exports.LoopRepeat = LoopRepeat; + exports.LoopPingPong = LoopPingPong; + exports.InterpolateDiscrete = InterpolateDiscrete; + exports.InterpolateLinear = InterpolateLinear; + exports.InterpolateSmooth = InterpolateSmooth; + exports.ZeroCurvatureEnding = ZeroCurvatureEnding; + exports.ZeroSlopeEnding = ZeroSlopeEnding; + exports.WrapAroundEnding = WrapAroundEnding; + exports.TrianglesDrawMode = TrianglesDrawMode; + exports.TriangleStripDrawMode = TriangleStripDrawMode; + exports.TriangleFanDrawMode = TriangleFanDrawMode; + exports.LinearEncoding = LinearEncoding; + exports.sRGBEncoding = sRGBEncoding; + exports.GammaEncoding = GammaEncoding; + exports.RGBEEncoding = RGBEEncoding; + exports.LogLuvEncoding = LogLuvEncoding; + exports.RGBM7Encoding = RGBM7Encoding; + exports.RGBM16Encoding = RGBM16Encoding; + exports.RGBDEncoding = RGBDEncoding; + exports.BasicDepthPacking = BasicDepthPacking; + exports.RGBADepthPacking = RGBADepthPacking; + exports.CubeGeometry = BoxGeometry; + exports.Face4 = Face4; + exports.LineStrip = LineStrip; + exports.LinePieces = LinePieces; + exports.MeshFaceMaterial = MeshFaceMaterial; + exports.MultiMaterial = MultiMaterial; + exports.PointCloud = PointCloud; + exports.Particle = Particle; + exports.ParticleSystem = ParticleSystem; + exports.PointCloudMaterial = PointCloudMaterial; + exports.ParticleBasicMaterial = ParticleBasicMaterial; + exports.ParticleSystemMaterial = ParticleSystemMaterial; + exports.Vertex = Vertex; + exports.DynamicBufferAttribute = DynamicBufferAttribute; + exports.Int8Attribute = Int8Attribute; + exports.Uint8Attribute = Uint8Attribute; + exports.Uint8ClampedAttribute = Uint8ClampedAttribute; + exports.Int16Attribute = Int16Attribute; + exports.Uint16Attribute = Uint16Attribute; + exports.Int32Attribute = Int32Attribute; + exports.Uint32Attribute = Uint32Attribute; + exports.Float32Attribute = Float32Attribute; + exports.Float64Attribute = Float64Attribute; + exports.ClosedSplineCurve3 = ClosedSplineCurve3; + exports.SplineCurve3 = SplineCurve3; + exports.Spline = Spline; + exports.BoundingBoxHelper = BoundingBoxHelper; + exports.EdgesHelper = EdgesHelper; + exports.WireframeHelper = WireframeHelper; + exports.XHRLoader = XHRLoader; + exports.BinaryTextureLoader = BinaryTextureLoader; + exports.GeometryUtils = GeometryUtils; + exports.ImageUtils = ImageUtils; + exports.Projector = Projector; + exports.CanvasRenderer = CanvasRenderer; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}))); \ No newline at end of file diff --git a/recursive_swarm/lib/three.min.js b/recursive_swarm/lib/three.min.js new file mode 100644 index 0000000000000000000000000000000000000000..4ff1c1e37b28361a12c0d2e8b6efc3d31b532c54 --- /dev/null +++ b/recursive_swarm/lib/three.min.js @@ -0,0 +1,914 @@ +// threejs.org/license +(function(l,xa){"object"===typeof exports&&"undefined"!==typeof module?xa(exports):"function"===typeof define&&define.amd?define(["exports"],xa):xa(l.THREE={})})(this,function(l){function xa(){}function C(a,b){this.x=a||0;this.y=b||0}function P(){this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];0<arguments.length&&console.error("THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.")}function ca(a,b,c,d){this._x=a||0;this._y=b||0;this._z=c||0;this._w=void 0!==d?d:1}function p(a, +b,c){this.x=a||0;this.y=b||0;this.z=c||0}function ta(){this.elements=[1,0,0,0,1,0,0,0,1];0<arguments.length&&console.error("THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.")}function aa(a,b,c,d,e,f,g,h,k,m){Object.defineProperty(this,"id",{value:xf++});this.uuid=S.generateUUID();this.name="";this.image=void 0!==a?a:aa.DEFAULT_IMAGE;this.mipmaps=[];this.mapping=void 0!==b?b:aa.DEFAULT_MAPPING;this.wrapS=void 0!==c?c:1001;this.wrapT=void 0!==d?d:1001;this.magFilter=void 0!== +e?e:1006;this.minFilter=void 0!==f?f:1008;this.anisotropy=void 0!==k?k:1;this.format=void 0!==g?g:1023;this.type=void 0!==h?h:1009;this.offset=new C(0,0);this.repeat=new C(1,1);this.center=new C(0,0);this.rotation=0;this.matrixAutoUpdate=!0;this.matrix=new ta;this.generateMipmaps=!0;this.premultiplyAlpha=!1;this.flipY=!0;this.unpackAlignment=4;this.encoding=void 0!==m?m:3E3;this.version=0;this.onUpdate=null}function X(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=void 0!==d?d:1}function jb(a, +b,c){this.uuid=S.generateUUID();this.width=a;this.height=b;this.scissor=new X(0,0,a,b);this.scissorTest=!1;this.viewport=new X(0,0,a,b);c=c||{};void 0===c.minFilter&&(c.minFilter=1006);this.texture=new aa(void 0,void 0,c.wrapS,c.wrapT,c.magFilter,c.minFilter,c.format,c.type,c.anisotropy,c.encoding);this.depthBuffer=void 0!==c.depthBuffer?c.depthBuffer:!0;this.stencilBuffer=void 0!==c.stencilBuffer?c.stencilBuffer:!0;this.depthTexture=void 0!==c.depthTexture?c.depthTexture:null}function Gb(a,b,c){jb.call(this, +a,b,c);this.activeMipMapLevel=this.activeCubeFace=0}function kb(a,b,c,d,e,f,g,h,k,m,v,n){aa.call(this,null,f,g,h,k,m,d,e,v,n);this.image={data:a,width:b,height:c};this.magFilter=void 0!==k?k:1003;this.minFilter=void 0!==m?m:1003;this.flipY=this.generateMipmaps=!1;this.unpackAlignment=1}function bb(a,b,c,d,e,f,g,h,k,m){a=void 0!==a?a:[];aa.call(this,a,void 0!==b?b:301,c,d,e,f,g,h,k,m);this.flipY=!1}function Hb(a,b,c){var d=a[0];if(0>=d||0<d)return a;var e=b*c,f=Ce[e];void 0===f&&(f=new Float32Array(e), +Ce[e]=f);if(0!==b)for(d.toArray(f,0),d=1,e=0;d!==b;++d)e+=c,a[d].toArray(f,e);return f}function De(a,b){var c=Ee[b];void 0===c&&(c=new Int32Array(b),Ee[b]=c);for(var d=0;d!==b;++d)c[d]=a.allocTextureUnit();return c}function yf(a,b){a.uniform1f(this.addr,b)}function zf(a,b){a.uniform1i(this.addr,b)}function Af(a,b){void 0===b.x?a.uniform2fv(this.addr,b):a.uniform2f(this.addr,b.x,b.y)}function Bf(a,b){void 0!==b.x?a.uniform3f(this.addr,b.x,b.y,b.z):void 0!==b.r?a.uniform3f(this.addr,b.r,b.g,b.b):a.uniform3fv(this.addr, +b)}function Cf(a,b){void 0===b.x?a.uniform4fv(this.addr,b):a.uniform4f(this.addr,b.x,b.y,b.z,b.w)}function Df(a,b){a.uniformMatrix2fv(this.addr,!1,b.elements||b)}function Ef(a,b){void 0===b.elements?a.uniformMatrix3fv(this.addr,!1,b):(Fe.set(b.elements),a.uniformMatrix3fv(this.addr,!1,Fe))}function Ff(a,b){void 0===b.elements?a.uniformMatrix4fv(this.addr,!1,b):(Ge.set(b.elements),a.uniformMatrix4fv(this.addr,!1,Ge))}function Gf(a,b,c){var d=c.allocTextureUnit();a.uniform1i(this.addr,d);c.setTexture2D(b|| +He,d)}function Hf(a,b,c){var d=c.allocTextureUnit();a.uniform1i(this.addr,d);c.setTextureCube(b||Ie,d)}function Je(a,b){a.uniform2iv(this.addr,b)}function Ke(a,b){a.uniform3iv(this.addr,b)}function Le(a,b){a.uniform4iv(this.addr,b)}function If(a){switch(a){case 5126:return yf;case 35664:return Af;case 35665:return Bf;case 35666:return Cf;case 35674:return Df;case 35675:return Ef;case 35676:return Ff;case 35678:case 36198:return Gf;case 35680:return Hf;case 5124:case 35670:return zf;case 35667:case 35671:return Je; +case 35668:case 35672:return Ke;case 35669:case 35673:return Le}}function Jf(a,b){a.uniform1fv(this.addr,b)}function Kf(a,b){a.uniform1iv(this.addr,b)}function Lf(a,b){a.uniform2fv(this.addr,Hb(b,this.size,2))}function Mf(a,b){a.uniform3fv(this.addr,Hb(b,this.size,3))}function Nf(a,b){a.uniform4fv(this.addr,Hb(b,this.size,4))}function Of(a,b){a.uniformMatrix2fv(this.addr,!1,Hb(b,this.size,4))}function Pf(a,b){a.uniformMatrix3fv(this.addr,!1,Hb(b,this.size,9))}function Qf(a,b){a.uniformMatrix4fv(this.addr, +!1,Hb(b,this.size,16))}function Rf(a,b,c){var d=b.length,e=De(c,d);a.uniform1iv(this.addr,e);for(a=0;a!==d;++a)c.setTexture2D(b[a]||He,e[a])}function Sf(a,b,c){var d=b.length,e=De(c,d);a.uniform1iv(this.addr,e);for(a=0;a!==d;++a)c.setTextureCube(b[a]||Ie,e[a])}function Tf(a){switch(a){case 5126:return Jf;case 35664:return Lf;case 35665:return Mf;case 35666:return Nf;case 35674:return Of;case 35675:return Pf;case 35676:return Qf;case 35678:return Rf;case 35680:return Sf;case 5124:case 35670:return Kf; +case 35667:case 35671:return Je;case 35668:case 35672:return Ke;case 35669:case 35673:return Le}}function Uf(a,b,c){this.id=a;this.addr=c;this.setValue=If(b.type)}function Vf(a,b,c){this.id=a;this.addr=c;this.size=b.size;this.setValue=Tf(b.type)}function Me(a){this.id=a;this.seq=[];this.map={}}function cb(a,b,c){this.seq=[];this.map={};this.renderer=c;c=a.getProgramParameter(b,a.ACTIVE_UNIFORMS);for(var d=0;d<c;++d){var e=a.getActiveUniform(b,d),f=a.getUniformLocation(b,e.name),g=this,h=e.name,k= +h.length;for(Qd.lastIndex=0;;){var m=Qd.exec(h),v=Qd.lastIndex,n=m[1],u=m[3];"]"===m[2]&&(n|=0);if(void 0===u||"["===u&&v+2===k){h=g;e=void 0===u?new Uf(n,e,f):new Vf(n,e,f);h.seq.push(e);h.map[e.id]=e;break}else u=g.map[n],void 0===u&&(u=new Me(n),n=g,g=u,n.seq.push(g),n.map[g.id]=g),g=u}}}function H(a,b,c){return void 0===b&&void 0===c?this.set(a):this.setRGB(a,b,c)}function qc(a,b,c,d,e,f,g,h,k){aa.call(this,a,b,c,d,e,f,g,h,k);this.needsUpdate=!0}function Wf(a,b,c,d,e){var f,g,h,k,m,v,n,u,q,r, +l,x,B,w,A,G,N,Z;function F(a,b){return a.renderOrder!==b.renderOrder?a.renderOrder-b.renderOrder:a.z!==b.z?b.z-a.z:b.id-a.id}var ya,Rd,ia,Ne,Xf=new p,C=new ca,D=new p;this.render=function(t,p,kd){if(0!==t.length){if(void 0===ia){var ma=new Float32Array([-.5,-.5,0,0,.5,-.5,1,0,.5,.5,1,1,-.5,.5,0,1]),T=new Uint16Array([0,1,2,0,2,3]);ya=b.createBuffer();Rd=b.createBuffer();b.bindBuffer(b.ARRAY_BUFFER,ya);b.bufferData(b.ARRAY_BUFFER,ma,b.STATIC_DRAW);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,Rd);b.bufferData(b.ELEMENT_ARRAY_BUFFER, +T,b.STATIC_DRAW);ma=b.createProgram();T=b.createShader(b.VERTEX_SHADER);var y=b.createShader(b.FRAGMENT_SHADER);b.shaderSource(T,["precision "+e.precision+" float;","#define SHADER_NAME SpriteMaterial\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform float rotation;\nuniform vec2 center;\nuniform vec2 scale;\nuniform vec2 uvOffset;\nuniform vec2 uvScale;\nattribute vec2 position;\nattribute vec2 uv;\nvarying vec2 vUV;\nvarying float fogDepth;\nvoid main() {\n\tvUV = uvOffset + uv * uvScale;\n\tvec2 alignedPosition = ( position - center ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tvec4 mvPosition;\n\tmvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\tfogDepth = - mvPosition.z;\n}"].join("\n")); +b.shaderSource(y,["precision "+e.precision+" float;","#define SHADER_NAME SpriteMaterial\nuniform vec3 color;\nuniform sampler2D map;\nuniform float opacity;\nuniform int fogType;\nuniform vec3 fogColor;\nuniform float fogDensity;\nuniform float fogNear;\nuniform float fogFar;\nuniform float alphaTest;\nvarying vec2 vUV;\nvarying float fogDepth;\nvoid main() {\n\tvec4 texture = texture2D( map, vUV );\n\tgl_FragColor = vec4( color * texture.xyz, texture.a * opacity );\n\tif ( gl_FragColor.a < alphaTest ) discard;\n\tif ( fogType > 0 ) {\n\t\tfloat fogFactor = 0.0;\n\t\tif ( fogType == 1 ) {\n\t\t\tfogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t\t} else {\n\t\t\tconst float LOG2 = 1.442695;\n\t\t\tfogFactor = exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 );\n\t\t\tfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\n\t\t}\n\t\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n\t}\n}"].join("\n")); +b.compileShader(T);b.compileShader(y);b.attachShader(ma,T);b.attachShader(ma,y);b.linkProgram(ma);ia=ma;N=b.getAttribLocation(ia,"position");Z=b.getAttribLocation(ia,"uv");f=b.getUniformLocation(ia,"uvOffset");g=b.getUniformLocation(ia,"uvScale");h=b.getUniformLocation(ia,"rotation");k=b.getUniformLocation(ia,"center");m=b.getUniformLocation(ia,"scale");v=b.getUniformLocation(ia,"color");n=b.getUniformLocation(ia,"map");u=b.getUniformLocation(ia,"opacity");q=b.getUniformLocation(ia,"modelViewMatrix"); +r=b.getUniformLocation(ia,"projectionMatrix");l=b.getUniformLocation(ia,"fogType");x=b.getUniformLocation(ia,"fogDensity");B=b.getUniformLocation(ia,"fogNear");w=b.getUniformLocation(ia,"fogFar");A=b.getUniformLocation(ia,"fogColor");b.getUniformLocation(ia,"fogDepth");G=b.getUniformLocation(ia,"alphaTest");ma=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");ma.width=8;ma.height=8;T=ma.getContext("2d");T.fillStyle="white";T.fillRect(0,0,8,8);Ne=new qc(ma)}c.useProgram(ia);c.initAttributes(); +c.enableAttribute(N);c.enableAttribute(Z);c.disableUnusedAttributes();c.disable(b.CULL_FACE);c.enable(b.BLEND);b.bindBuffer(b.ARRAY_BUFFER,ya);b.vertexAttribPointer(N,2,b.FLOAT,!1,16,0);b.vertexAttribPointer(Z,2,b.FLOAT,!1,16,8);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,Rd);b.uniformMatrix4fv(r,!1,kd.projectionMatrix.elements);c.activeTexture(b.TEXTURE0);b.uniform1i(n,0);T=ma=0;(y=p.fog)?(b.uniform3f(A,y.color.r,y.color.g,y.color.b),y.isFog?(b.uniform1f(B,y.near),b.uniform1f(w,y.far),b.uniform1i(l,1),T= +ma=1):y.isFogExp2&&(b.uniform1f(x,y.density),b.uniform1i(l,2),T=ma=2)):(b.uniform1i(l,0),T=ma=0);y=0;for(var z=t.length;y<z;y++){var Fa=t[y];Fa.modelViewMatrix.multiplyMatrices(kd.matrixWorldInverse,Fa.matrixWorld);Fa.z=-Fa.modelViewMatrix.elements[14]}t.sort(F);var J=[],H=[];y=0;for(z=t.length;y<z;y++){Fa=t[y];var Q=Fa.material;if(!1!==Q.visible){Fa.onBeforeRender(a,p,kd,void 0,Q,void 0);b.uniform1f(G,Q.alphaTest);b.uniformMatrix4fv(q,!1,Fa.modelViewMatrix.elements);Fa.matrixWorld.decompose(Xf,C, +D);J[0]=D.x;J[1]=D.y;H[0]=Fa.center.x-.5;H[1]=Fa.center.y-.5;var I=0;p.fog&&Q.fog&&(I=T);ma!==I&&(b.uniform1i(l,I),ma=I);null!==Q.map?(b.uniform2f(f,Q.map.offset.x,Q.map.offset.y),b.uniform2f(g,Q.map.repeat.x,Q.map.repeat.y)):(b.uniform2f(f,0,0),b.uniform2f(g,1,1));b.uniform1f(u,Q.opacity);b.uniform3f(v,Q.color.r,Q.color.g,Q.color.b);b.uniform1f(h,Q.rotation);b.uniform2fv(k,H);b.uniform2fv(m,J);c.setBlending(Q.blending,Q.blendEquation,Q.blendSrc,Q.blendDst,Q.blendEquationAlpha,Q.blendSrcAlpha,Q.blendDstAlpha, +Q.premultipliedAlpha);c.buffers.depth.setTest(Q.depthTest);c.buffers.depth.setMask(Q.depthWrite);c.buffers.color.setMask(Q.colorWrite);d.setTexture2D(Q.map||Ne,0);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0);Fa.onAfterRender(a,p,kd,void 0,Q,void 0)}}c.enable(b.CULL_FACE);c.reset()}}}function O(){Object.defineProperty(this,"id",{value:Yf++});this.uuid=S.generateUUID();this.name="";this.type="Material";this.lights=this.fog=!0;this.blending=1;this.side=0;this.flatShading=!1;this.vertexColors=0;this.opacity= +1;this.transparent=!1;this.blendSrc=204;this.blendDst=205;this.blendEquation=100;this.blendEquationAlpha=this.blendDstAlpha=this.blendSrcAlpha=null;this.depthFunc=3;this.depthWrite=this.depthTest=!0;this.clippingPlanes=null;this.clipShadows=this.clipIntersection=!1;this.shadowSide=null;this.colorWrite=!0;this.precision=null;this.polygonOffset=!1;this.polygonOffsetUnits=this.polygonOffsetFactor=0;this.dithering=!1;this.alphaTest=0;this.premultipliedAlpha=!1;this.overdraw=0;this.visible=!0;this.userData= +{};this.needsUpdate=!0}function db(a){O.call(this);this.type="MeshDepthMaterial";this.depthPacking=3200;this.morphTargets=this.skinning=!1;this.displacementMap=this.alphaMap=this.map=null;this.displacementScale=1;this.displacementBias=0;this.wireframe=!1;this.wireframeLinewidth=1;this.lights=this.fog=!1;this.setValues(a)}function eb(a){O.call(this);this.type="MeshDistanceMaterial";this.referencePosition=new p;this.nearDistance=1;this.farDistance=1E3;this.morphTargets=this.skinning=!1;this.displacementMap= +this.alphaMap=this.map=null;this.displacementScale=1;this.displacementBias=0;this.lights=this.fog=!1;this.setValues(a)}function Va(a,b){this.min=void 0!==a?a:new p(Infinity,Infinity,Infinity);this.max=void 0!==b?b:new p(-Infinity,-Infinity,-Infinity)}function Ca(a,b){this.center=void 0!==a?a:new p;this.radius=void 0!==b?b:0}function pa(a,b){this.normal=void 0!==a?a:new p(1,0,0);this.constant=void 0!==b?b:0}function ld(a,b,c,d,e,f){this.planes=[void 0!==a?a:new pa,void 0!==b?b:new pa,void 0!==c?c: +new pa,void 0!==d?d:new pa,void 0!==e?e:new pa,void 0!==f?f:new pa]}function Oe(a,b,c){function d(b,c,d,e,f,g){var h=b.geometry;var k=n;var m=b.customDepthMaterial;d&&(k=u,m=b.customDistanceMaterial);m?k=m:(m=!1,c.morphTargets&&(h&&h.isBufferGeometry?m=h.morphAttributes&&h.morphAttributes.position&&0<h.morphAttributes.position.length:h&&h.isGeometry&&(m=h.morphTargets&&0<h.morphTargets.length)),b.isSkinnedMesh&&!1===c.skinning&&console.warn("THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:", +b),b=b.isSkinnedMesh&&c.skinning,h=0,m&&(h|=1),b&&(h|=2),k=k[h]);a.localClippingEnabled&&!0===c.clipShadows&&0!==c.clippingPlanes.length&&(h=k.uuid,m=c.uuid,b=q[h],void 0===b&&(b={},q[h]=b),h=b[m],void 0===h&&(h=k.clone(),b[m]=h),k=h);k.visible=c.visible;k.wireframe=c.wireframe;k.side=null!=c.shadowSide?c.shadowSide:r[c.side];k.clipShadows=c.clipShadows;k.clippingPlanes=c.clippingPlanes;k.clipIntersection=c.clipIntersection;k.wireframeLinewidth=c.wireframeLinewidth;k.linewidth=c.linewidth;d&&k.isMeshDistanceMaterial&& +(k.referencePosition.copy(e),k.nearDistance=f,k.farDistance=g);return k}function e(c,g,h,k){if(!1!==c.visible){if(c.layers.test(g.layers)&&(c.isMesh||c.isLine||c.isPoints)&&c.castShadow&&(!c.frustumCulled||f.intersectsObject(c))){c.modelViewMatrix.multiplyMatrices(h.matrixWorldInverse,c.matrixWorld);var m=b.update(c),n=c.material;if(Array.isArray(n))for(var u=m.groups,r=0,q=u.length;r<q;r++){var l=u[r],t=n[l.materialIndex];t&&t.visible&&(t=d(c,t,k,v,h.near,h.far),a.renderBufferDirect(h,null,m,t,c, +l))}else n.visible&&(t=d(c,n,k,v,h.near,h.far),a.renderBufferDirect(h,null,m,t,c,null))}c=c.children;m=0;for(n=c.length;m<n;m++)e(c[m],g,h,k)}}var f=new ld,g=new P,h=new C,k=new C(c,c),m=new p,v=new p,n=Array(4),u=Array(4),q={},r={0:1,1:0,2:2},l=[new p(1,0,0),new p(-1,0,0),new p(0,0,1),new p(0,0,-1),new p(0,1,0),new p(0,-1,0)],x=[new p(0,1,0),new p(0,1,0),new p(0,1,0),new p(0,1,0),new p(0,0,1),new p(0,0,-1)],B=[new X,new X,new X,new X,new X,new X];for(c=0;4!==c;++c){var w=0!==(c&1),A=0!==(c&2),G= +new db({depthPacking:3201,morphTargets:w,skinning:A});n[c]=G;w=new eb({morphTargets:w,skinning:A});u[c]=w}var N=this;this.enabled=!1;this.autoUpdate=!0;this.needsUpdate=!1;this.type=1;this.render=function(b,c,d){if(!1!==N.enabled&&(!1!==N.autoUpdate||!1!==N.needsUpdate)&&0!==b.length){var n=a.state;n.disable(a.context.BLEND);n.buffers.color.setClear(1,1,1,1);n.buffers.depth.setTest(!0);n.setScissorTest(!1);for(var u,r=0,q=b.length;r<q;r++){var t=b[r];u=t.shadow;var p=t&&t.isPointLight;if(void 0=== +u)console.warn("THREE.WebGLShadowMap:",t,"has no shadow.");else{var w=u.camera;h.copy(u.mapSize);h.min(k);if(p){var Z=h.x,F=h.y;B[0].set(2*Z,F,Z,F);B[1].set(0,F,Z,F);B[2].set(3*Z,F,Z,F);B[3].set(Z,F,Z,F);B[4].set(3*Z,0,Z,F);B[5].set(Z,0,Z,F);h.x*=4;h.y*=2}null===u.map&&(u.map=new jb(h.x,h.y,{minFilter:1003,magFilter:1003,format:1023}),u.map.texture.name=t.name+".shadowMap",w.updateProjectionMatrix());u.isSpotLightShadow&&u.update(t);Z=u.map;F=u.matrix;v.setFromMatrixPosition(t.matrixWorld);w.position.copy(v); +p?(u=6,F.makeTranslation(-v.x,-v.y,-v.z)):(u=1,m.setFromMatrixPosition(t.target.matrixWorld),w.lookAt(m),w.updateMatrixWorld(),F.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1),F.multiply(w.projectionMatrix),F.multiply(w.matrixWorldInverse));a.setRenderTarget(Z);a.clear();for(t=0;t<u;t++)p&&(m.copy(w.position),m.add(l[t]),w.up.copy(x[t]),w.lookAt(m),w.updateMatrixWorld(),n.viewport(B[t])),g.multiplyMatrices(w.projectionMatrix,w.matrixWorldInverse),f.setFromMatrix(g),e(c,d,w,p)}}N.needsUpdate=!1}}}function Zf(a){var b= +{};return{get:function(a){a.isInterleavedBufferAttribute&&(a=a.data);return b[a.uuid]},remove:function(c){c.isInterleavedBufferAttribute&&(c=c.data);var d=b[c.uuid];d&&(a.deleteBuffer(d.buffer),delete b[c.uuid])},update:function(c,d){c.isInterleavedBufferAttribute&&(c=c.data);var e=b[c.uuid];if(void 0===e){e=c.uuid;var f=c.array,g=c.dynamic?a.DYNAMIC_DRAW:a.STATIC_DRAW,h=a.createBuffer();a.bindBuffer(d,h);a.bufferData(d,f,g);c.onUploadCallback();d=a.FLOAT;f instanceof Float32Array?d=a.FLOAT:f instanceof +Float64Array?console.warn("THREE.WebGLAttributes: Unsupported data buffer format: Float64Array."):f instanceof Uint16Array?d=a.UNSIGNED_SHORT:f instanceof Int16Array?d=a.SHORT:f instanceof Uint32Array?d=a.UNSIGNED_INT:f instanceof Int32Array?d=a.INT:f instanceof Int8Array?d=a.BYTE:f instanceof Uint8Array&&(d=a.UNSIGNED_BYTE);b[e]={buffer:h,type:d,bytesPerElement:f.BYTES_PER_ELEMENT,version:c.version}}else e.version<c.version&&(f=c,h=f.array,g=f.updateRange,a.bindBuffer(d,e.buffer),!1===f.dynamic? +a.bufferData(d,h,a.STATIC_DRAW):-1===g.count?a.bufferSubData(d,0,h):0===g.count?console.error("THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually."):(a.bufferSubData(d,g.offset*h.BYTES_PER_ELEMENT,h.subarray(g.offset,g.offset+g.count)),g.count=-1),e.version=c.version)}}}function fb(a,b,c,d){this._x=a||0;this._y=b||0;this._z=c||0;this._order=d||fb.DefaultOrder}function Sd(){this.mask= +1}function y(){Object.defineProperty(this,"id",{value:$f++});this.uuid=S.generateUUID();this.name="";this.type="Object3D";this.parent=null;this.children=[];this.up=y.DefaultUp.clone();var a=new p,b=new fb,c=new ca,d=new p(1,1,1);b.onChange(function(){c.setFromEuler(b,!1)});c.onChange(function(){b.setFromQuaternion(c,void 0,!1)});Object.defineProperties(this,{position:{enumerable:!0,value:a},rotation:{enumerable:!0,value:b},quaternion:{enumerable:!0,value:c},scale:{enumerable:!0,value:d},modelViewMatrix:{value:new P}, +normalMatrix:{value:new ta}});this.matrix=new P;this.matrixWorld=new P;this.matrixAutoUpdate=y.DefaultMatrixAutoUpdate;this.matrixWorldNeedsUpdate=!1;this.layers=new Sd;this.visible=!0;this.receiveShadow=this.castShadow=!1;this.frustumCulled=!0;this.renderOrder=0;this.userData={}}function Qa(){y.call(this);this.type="Camera";this.matrixWorldInverse=new P;this.projectionMatrix=new P}function Ib(a,b,c,d,e,f){Qa.call(this);this.type="OrthographicCamera";this.zoom=1;this.view=null;this.left=a;this.right= +b;this.top=c;this.bottom=d;this.near=void 0!==e?e:.1;this.far=void 0!==f?f:2E3;this.updateProjectionMatrix()}function Wa(a,b,c,d,e,f){this.a=a;this.b=b;this.c=c;this.normal=d&&d.isVector3?d:new p;this.vertexNormals=Array.isArray(d)?d:[];this.color=e&&e.isColor?e:new H;this.vertexColors=Array.isArray(e)?e:[];this.materialIndex=void 0!==f?f:0}function L(){Object.defineProperty(this,"id",{value:ag+=2});this.uuid=S.generateUUID();this.name="";this.type="Geometry";this.vertices=[];this.colors=[];this.faces= +[];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphNormals=[];this.skinWeights=[];this.skinIndices=[];this.lineDistances=[];this.boundingSphere=this.boundingBox=null;this.groupsNeedUpdate=this.lineDistancesNeedUpdate=this.colorsNeedUpdate=this.normalsNeedUpdate=this.uvsNeedUpdate=this.verticesNeedUpdate=this.elementsNeedUpdate=!1}function M(a,b,c){if(Array.isArray(a))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.uuid=S.generateUUID();this.name="";this.array= +a;this.itemSize=b;this.count=void 0!==a?a.length/b:0;this.normalized=!0===c;this.dynamic=!1;this.updateRange={offset:0,count:-1};this.onUploadCallback=function(){};this.version=0}function rc(a,b,c){M.call(this,new Int8Array(a),b,c)}function sc(a,b,c){M.call(this,new Uint8Array(a),b,c)}function tc(a,b,c){M.call(this,new Uint8ClampedArray(a),b,c)}function uc(a,b,c){M.call(this,new Int16Array(a),b,c)}function lb(a,b,c){M.call(this,new Uint16Array(a),b,c)}function vc(a,b,c){M.call(this,new Int32Array(a), +b,c)}function mb(a,b,c){M.call(this,new Uint32Array(a),b,c)}function D(a,b,c){M.call(this,new Float32Array(a),b,c)}function wc(a,b,c){M.call(this,new Float64Array(a),b,c)}function Pe(){this.indices=[];this.vertices=[];this.normals=[];this.colors=[];this.uvs=[];this.uvs2=[];this.groups=[];this.morphTargets={};this.skinWeights=[];this.skinIndices=[];this.boundingSphere=this.boundingBox=null;this.groupsNeedUpdate=this.uvsNeedUpdate=this.colorsNeedUpdate=this.normalsNeedUpdate=this.verticesNeedUpdate= +!1}function Td(a){if(0===a.length)return-Infinity;for(var b=a[0],c=1,d=a.length;c<d;++c)a[c]>b&&(b=a[c]);return b}function z(){Object.defineProperty(this,"id",{value:bg+=2});this.uuid=S.generateUUID();this.name="";this.type="BufferGeometry";this.index=null;this.attributes={};this.morphAttributes={};this.groups=[];this.boundingSphere=this.boundingBox=null;this.drawRange={start:0,count:Infinity}}function Jb(a,b,c,d,e,f){L.call(this);this.type="BoxGeometry";this.parameters={width:a,height:b,depth:c, +widthSegments:d,heightSegments:e,depthSegments:f};this.fromBufferGeometry(new nb(a,b,c,d,e,f));this.mergeVertices()}function nb(a,b,c,d,e,f){function g(a,b,c,d,e,f,g,l,Z,F,y){var r=f/Z,t=g/F,N=f/2,x=g/2,w=l/2;g=Z+1;var B=F+1,A=f=0,G,C,ya=new p;for(C=0;C<B;C++){var D=C*t-x;for(G=0;G<g;G++)ya[a]=(G*r-N)*d,ya[b]=D*e,ya[c]=w,m.push(ya.x,ya.y,ya.z),ya[a]=0,ya[b]=0,ya[c]=0<l?1:-1,v.push(ya.x,ya.y,ya.z),n.push(G/Z),n.push(1-C/F),f+=1}for(C=0;C<F;C++)for(G=0;G<Z;G++)a=u+G+g*(C+1),b=u+(G+1)+g*(C+1),c=u+(G+ +1)+g*C,k.push(u+G+g*C,a,c),k.push(a,b,c),A+=6;h.addGroup(q,A,y);q+=A;u+=f}z.call(this);this.type="BoxBufferGeometry";this.parameters={width:a,height:b,depth:c,widthSegments:d,heightSegments:e,depthSegments:f};var h=this;a=a||1;b=b||1;c=c||1;d=Math.floor(d)||1;e=Math.floor(e)||1;f=Math.floor(f)||1;var k=[],m=[],v=[],n=[],u=0,q=0;g("z","y","x",-1,-1,c,b,a,f,e,0);g("z","y","x",1,-1,c,b,-a,f,e,1);g("x","z","y",1,1,a,c,b,d,f,2);g("x","z","y",1,-1,a,c,-b,d,f,3);g("x","y","z",1,-1,a,b,c,d,e,4);g("x","y", +"z",-1,-1,a,b,-c,d,e,5);this.setIndex(k);this.addAttribute("position",new D(m,3));this.addAttribute("normal",new D(v,3));this.addAttribute("uv",new D(n,2))}function xc(a,b,c,d){L.call(this);this.type="PlaneGeometry";this.parameters={width:a,height:b,widthSegments:c,heightSegments:d};this.fromBufferGeometry(new ob(a,b,c,d));this.mergeVertices()}function ob(a,b,c,d){z.call(this);this.type="PlaneBufferGeometry";this.parameters={width:a,height:b,widthSegments:c,heightSegments:d};a=a||1;b=b||1;var e=a/ +2,f=b/2;c=Math.floor(c)||1;d=Math.floor(d)||1;var g=c+1,h=d+1,k=a/c,m=b/d,v=[],n=[],u=[],q=[];for(a=0;a<h;a++){var r=a*m-f;for(b=0;b<g;b++)n.push(b*k-e,-r,0),u.push(0,0,1),q.push(b/c),q.push(1-a/d)}for(a=0;a<d;a++)for(b=0;b<c;b++)e=b+g*(a+1),f=b+1+g*(a+1),h=b+1+g*a,v.push(b+g*a,e,h),v.push(e,f,h);this.setIndex(v);this.addAttribute("position",new D(n,3));this.addAttribute("normal",new D(u,3));this.addAttribute("uv",new D(q,2))}function za(a){O.call(this);this.type="MeshBasicMaterial";this.color=new H(16777215); +this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.envMap=this.alphaMap=this.specularMap=null;this.combine=0;this.reflectivity=1;this.refractionRatio=.98;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.lights=this.morphTargets=this.skinning=!1;this.setValues(a)}function Da(a){O.call(this);this.type="ShaderMaterial";this.defines={};this.uniforms={};this.vertexShader="void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}"; +this.fragmentShader="void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}";this.linewidth=1;this.wireframe=!1;this.wireframeLinewidth=1;this.morphNormals=this.morphTargets=this.skinning=this.clipping=this.lights=this.fog=!1;this.extensions={derivatives:!1,fragDepth:!1,drawBuffers:!1,shaderTextureLOD:!1};this.defaultAttributeValues={color:[1,1,1],uv:[0,0],uv2:[0,0]};this.index0AttributeName=void 0;this.uniformsNeedUpdate=!1;void 0!==a&&(void 0!==a.attributes&&console.error("THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead."), +this.setValues(a))}function pb(a,b){this.origin=void 0!==a?a:new p;this.direction=void 0!==b?b:new p}function Kb(a,b){this.start=void 0!==a?a:new p;this.end=void 0!==b?b:new p}function Xa(a,b,c){this.a=void 0!==a?a:new p;this.b=void 0!==b?b:new p;this.c=void 0!==c?c:new p}function ua(a,b){y.call(this);this.type="Mesh";this.geometry=void 0!==a?a:new z;this.material=void 0!==b?b:new za({color:16777215*Math.random()});this.drawMode=0;this.updateMorphTargets()}function cg(a,b,c,d){function e(a,c){b.buffers.color.setClear(a.r, +a.g,a.b,c,d)}var f=new H(0),g=0,h,k,m;return{getClearColor:function(){return f},setClearColor:function(a,b){f.set(a);g=void 0!==b?b:1;e(f,g)},getClearAlpha:function(){return g},setClearAlpha:function(a){g=a;e(f,g)},render:function(b,d,u,q){d=d.background;null===d?e(f,g):d&&d.isColor&&(e(d,1),q=!0);(a.autoClear||q)&&a.clear(a.autoClearColor,a.autoClearDepth,a.autoClearStencil);d&&d.isCubeTexture?(void 0===m&&(m=new ua(new nb(1,1,1),new Da({uniforms:qb.cube.uniforms,vertexShader:qb.cube.vertexShader, +fragmentShader:qb.cube.fragmentShader,side:1,depthTest:!0,depthWrite:!1,fog:!1})),m.geometry.removeAttribute("normal"),m.geometry.removeAttribute("uv"),m.onBeforeRender=function(a,b,c){this.matrixWorld.copyPosition(c.matrixWorld)},c.update(m.geometry)),m.material.uniforms.tCube.value=d,b.push(m,m.geometry,m.material,0,null)):d&&d.isTexture&&(void 0===h&&(h=new Ib(-1,1,1,-1,0,1),k=new ua(new ob(2,2),new za({depthTest:!1,depthWrite:!1,fog:!1})),c.update(k.geometry)),k.material.map=d,a.renderBufferDirect(h, +null,k.geometry,k.material,k,null))}}}function dg(a,b){return a.renderOrder!==b.renderOrder?a.renderOrder-b.renderOrder:a.program&&b.program&&a.program!==b.program?a.program.id-b.program.id:a.material.id!==b.material.id?a.material.id-b.material.id:a.z!==b.z?a.z-b.z:a.id-b.id}function eg(a,b){return a.renderOrder!==b.renderOrder?a.renderOrder-b.renderOrder:a.z!==b.z?b.z-a.z:a.id-b.id}function fg(){var a=[],b=0,c=[],d=[];return{opaque:c,transparent:d,init:function(){b=0;c.length=0;d.length=0},push:function(e, +f,g,h,k){var m=a[b];void 0===m?(m={id:e.id,object:e,geometry:f,material:g,program:g.program,renderOrder:e.renderOrder,z:h,group:k},a[b]=m):(m.id=e.id,m.object=e,m.geometry=f,m.material=g,m.program=g.program,m.renderOrder=e.renderOrder,m.z=h,m.group=k);(!0===g.transparent?d:c).push(m);b++},sort:function(){1<c.length&&c.sort(dg);1<d.length&&d.sort(eg)}}}function gg(){var a={};return{get:function(b,c){b=b.id+","+c.id;c=a[b];void 0===c&&(c=new fg,a[b]=c);return c},dispose:function(){a={}}}}function hg(a, +b){return Math.abs(b[1])-Math.abs(a[1])}function ig(a){var b={},c=new Float32Array(8);return{update:function(d,e,f,g){var h=d.morphTargetInfluences,k=h.length;d=b[e.id];if(void 0===d){d=[];for(var m=0;m<k;m++)d[m]=[m,0];b[e.id]=d}var v=f.morphTargets&&e.morphAttributes.position;f=f.morphNormals&&e.morphAttributes.normal;for(m=0;m<k;m++){var n=d[m];0!==n[1]&&(v&&e.removeAttribute("morphTarget"+m),f&&e.removeAttribute("morphNormal"+m))}for(m=0;m<k;m++)n=d[m],n[0]=m,n[1]=h[m];d.sort(hg);for(m=0;8>m;m++){if(n= +d[m])if(h=n[0],k=n[1]){v&&e.addAttribute("morphTarget"+m,v[h]);f&&e.addAttribute("morphNormal"+m,f[h]);c[m]=k;continue}c[m]=0}g.getUniforms().setValue(a,"morphTargetInfluences",c)}}}function jg(a,b,c){var d,e,f;this.setMode=function(a){d=a};this.setIndex=function(a){e=a.type;f=a.bytesPerElement};this.render=function(b,h){a.drawElements(d,h,e,b*f);c.calls++;c.vertices+=h;d===a.TRIANGLES?c.faces+=h/3:d===a.POINTS&&(c.points+=h)};this.renderInstances=function(g,h,k){var m=b.get("ANGLE_instanced_arrays"); +null===m?console.error("THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays."):(m.drawElementsInstancedANGLE(d,k,e,h*f,g.maxInstancedCount),c.calls++,c.vertices+=k*g.maxInstancedCount,d===a.TRIANGLES?c.faces+=g.maxInstancedCount*k/3:d===a.POINTS&&(c.points+=g.maxInstancedCount*k))}}function kg(a,b,c){var d;this.setMode=function(a){d=a};this.render=function(b,f){a.drawArrays(d,b,f);c.calls++;c.vertices+=f;d===a.TRIANGLES? +c.faces+=f/3:d===a.POINTS&&(c.points+=f)};this.renderInstances=function(e,f,g){var h=b.get("ANGLE_instanced_arrays");if(null===h)console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");else{var k=e.attributes.position;k.isInterleavedBufferAttribute?(g=k.data.count,h.drawArraysInstancedANGLE(d,0,g,e.maxInstancedCount)):h.drawArraysInstancedANGLE(d,f,g,e.maxInstancedCount);c.calls++;c.vertices+=g*e.maxInstancedCount; +d===a.TRIANGLES?c.faces+=e.maxInstancedCount*g/3:d===a.POINTS&&(c.points+=e.maxInstancedCount*g)}}}function lg(a,b,c){function d(a){a=a.target;var g=e[a.id];null!==g.index&&b.remove(g.index);for(var k in g.attributes)b.remove(g.attributes[k]);a.removeEventListener("dispose",d);delete e[a.id];if(k=f[a.id])b.remove(k),delete f[a.id];if(k=f[g.id])b.remove(k),delete f[g.id];c.geometries--}var e={},f={};return{get:function(a,b){var f=e[b.id];if(f)return f;b.addEventListener("dispose",d);b.isBufferGeometry? +f=b:b.isGeometry&&(void 0===b._bufferGeometry&&(b._bufferGeometry=(new z).setFromObject(a)),f=b._bufferGeometry);e[b.id]=f;c.geometries++;return f},update:function(c){var d=c.index,e=c.attributes;null!==d&&b.update(d,a.ELEMENT_ARRAY_BUFFER);for(var f in e)b.update(e[f],a.ARRAY_BUFFER);c=c.morphAttributes;for(f in c){d=c[f];e=0;for(var g=d.length;e<g;e++)b.update(d[e],a.ARRAY_BUFFER)}},getWireframeAttribute:function(c){var d=f[c.id];if(d)return d;d=[];var e=c.index,g=c.attributes;if(null!==e){e=e.array; +g=0;for(var v=e.length;g<v;g+=3){var n=e[g+0],u=e[g+1],q=e[g+2];d.push(n,u,u,q,q,n)}}else for(e=g.position.array,g=0,v=e.length/3-1;g<v;g+=3)n=g+0,u=g+1,q=g+2,d.push(n,u,u,q,q,n);d=new (65535<Td(d)?mb:lb)(d,1);b.update(d,a.ELEMENT_ARRAY_BUFFER);return f[c.id]=d}}}function mg(a,b){var c={};return{update:function(d){var e=b.frame,f=d.geometry,g=a.get(d,f);c[g.id]!==e&&(f.isGeometry&&g.updateFromObject(d),a.update(g),c[g.id]=e);return g},dispose:function(){c={}}}}function ng(a){a=a.split("\n");for(var b= +0;b<a.length;b++)a[b]=b+1+": "+a[b];return a.join("\n")}function Qe(a,b,c){var d=a.createShader(b);a.shaderSource(d,c);a.compileShader(d);!1===a.getShaderParameter(d,a.COMPILE_STATUS)&&console.error("THREE.WebGLShader: Shader couldn't compile.");""!==a.getShaderInfoLog(d)&&console.warn("THREE.WebGLShader: gl.getShaderInfoLog()",b===a.VERTEX_SHADER?"vertex":"fragment",a.getShaderInfoLog(d),ng(c));return d}function Re(a){switch(a){case 3E3:return["Linear","( value )"];case 3001:return["sRGB","( value )"]; +case 3002:return["RGBE","( value )"];case 3004:return["RGBM","( value, 7.0 )"];case 3005:return["RGBM","( value, 16.0 )"];case 3006:return["RGBD","( value, 256.0 )"];case 3007:return["Gamma","( value, float( GAMMA_FACTOR ) )"];default:throw Error("unsupported encoding: "+a);}}function Ud(a,b){b=Re(b);return"vec4 "+a+"( vec4 value ) { return "+b[0]+"ToLinear"+b[1]+"; }"}function og(a,b){b=Re(b);return"vec4 "+a+"( vec4 value ) { return LinearTo"+b[0]+b[1]+"; }"}function pg(a,b){switch(b){case 1:b="Linear"; +break;case 2:b="Reinhard";break;case 3:b="Uncharted2";break;case 4:b="OptimizedCineon";break;default:throw Error("unsupported toneMapping: "+b);}return"vec3 "+a+"( vec3 color ) { return "+b+"ToneMapping( color ); }"}function qg(a,b,c){a=a||{};return[a.derivatives||b.envMapCubeUV||b.bumpMap||b.normalMap||b.flatShading?"#extension GL_OES_standard_derivatives : enable":"",(a.fragDepth||b.logarithmicDepthBuffer)&&c.get("EXT_frag_depth")?"#extension GL_EXT_frag_depth : enable":"",a.drawBuffers&&c.get("WEBGL_draw_buffers")? +"#extension GL_EXT_draw_buffers : require":"",(a.shaderTextureLOD||b.envMap)&&c.get("EXT_shader_texture_lod")?"#extension GL_EXT_shader_texture_lod : enable":""].filter(yc).join("\n")}function rg(a){var b=[],c;for(c in a){var d=a[c];!1!==d&&b.push("#define "+c+" "+d)}return b.join("\n")}function yc(a){return""!==a}function Se(a,b){return a.replace(/NUM_DIR_LIGHTS/g,b.numDirLights).replace(/NUM_SPOT_LIGHTS/g,b.numSpotLights).replace(/NUM_RECT_AREA_LIGHTS/g,b.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g, +b.numPointLights).replace(/NUM_HEMI_LIGHTS/g,b.numHemiLights)}function Te(a,b){return a.replace(/NUM_CLIPPING_PLANES/g,b.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g,b.numClippingPlanes-b.numClipIntersection)}function Vd(a){return a.replace(/^[ \t]*#include +<([\w\d.]+)>/gm,function(a,c){a=R[c];if(void 0===a)throw Error("Can not resolve #include <"+c+">");return Vd(a)})}function Ue(a){return a.replace(/#pragma unroll_loop[\s]+?for \( int i = (\d+); i < (\d+); i \+\+ \) \{([\s\S]+?)(?=\})\}/g, +function(a,c,d,e){a="";for(c=parseInt(c);c<parseInt(d);c++)a+=e.replace(/\[ i \]/g,"[ "+c+" ]");return a})}function sg(a,b,c,d,e,f){var g=a.context,h=d.defines,k=e.vertexShader,m=e.fragmentShader,v="SHADOWMAP_TYPE_BASIC";1===f.shadowMapType?v="SHADOWMAP_TYPE_PCF":2===f.shadowMapType&&(v="SHADOWMAP_TYPE_PCF_SOFT");var n="ENVMAP_TYPE_CUBE",u="ENVMAP_MODE_REFLECTION",q="ENVMAP_BLENDING_MULTIPLY";if(f.envMap){switch(d.envMap.mapping){case 301:case 302:n="ENVMAP_TYPE_CUBE";break;case 306:case 307:n="ENVMAP_TYPE_CUBE_UV"; +break;case 303:case 304:n="ENVMAP_TYPE_EQUIREC";break;case 305:n="ENVMAP_TYPE_SPHERE"}switch(d.envMap.mapping){case 302:case 304:u="ENVMAP_MODE_REFRACTION"}switch(d.combine){case 0:q="ENVMAP_BLENDING_MULTIPLY";break;case 1:q="ENVMAP_BLENDING_MIX";break;case 2:q="ENVMAP_BLENDING_ADD"}}var r=0<a.gammaFactor?a.gammaFactor:1,l=qg(d.extensions,f,b),x=rg(h),p=g.createProgram();d.isRawShaderMaterial?(h=[x].filter(yc).join("\n"),0<h.length&&(h+="\n"),b=[l,x].filter(yc).join("\n"),0<b.length&&(b+="\n")):(h= +["precision "+f.precision+" float;","precision "+f.precision+" int;","#define SHADER_NAME "+e.name,x,f.supportsVertexTextures?"#define VERTEX_TEXTURES":"","#define GAMMA_FACTOR "+r,"#define MAX_BONES "+f.maxBones,f.useFog&&f.fog?"#define USE_FOG":"",f.useFog&&f.fogExp?"#define FOG_EXP2":"",f.map?"#define USE_MAP":"",f.envMap?"#define USE_ENVMAP":"",f.envMap?"#define "+u:"",f.lightMap?"#define USE_LIGHTMAP":"",f.aoMap?"#define USE_AOMAP":"",f.emissiveMap?"#define USE_EMISSIVEMAP":"",f.bumpMap?"#define USE_BUMPMAP": +"",f.normalMap?"#define USE_NORMALMAP":"",f.displacementMap&&f.supportsVertexTextures?"#define USE_DISPLACEMENTMAP":"",f.specularMap?"#define USE_SPECULARMAP":"",f.roughnessMap?"#define USE_ROUGHNESSMAP":"",f.metalnessMap?"#define USE_METALNESSMAP":"",f.alphaMap?"#define USE_ALPHAMAP":"",f.vertexColors?"#define USE_COLOR":"",f.flatShading?"#define FLAT_SHADED":"",f.skinning?"#define USE_SKINNING":"",f.useVertexTexture?"#define BONE_TEXTURE":"",f.morphTargets?"#define USE_MORPHTARGETS":"",f.morphNormals&& +!1===f.flatShading?"#define USE_MORPHNORMALS":"",f.doubleSided?"#define DOUBLE_SIDED":"",f.flipSided?"#define FLIP_SIDED":"",f.shadowMapEnabled?"#define USE_SHADOWMAP":"",f.shadowMapEnabled?"#define "+v:"",f.sizeAttenuation?"#define USE_SIZEATTENUATION":"",f.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",f.logarithmicDepthBuffer&&b.get("EXT_frag_depth")?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;", +"uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_COLOR","\tattribute vec3 color;","#endif","#ifdef USE_MORPHTARGETS","\tattribute vec3 morphTarget0;","\tattribute vec3 morphTarget1;","\tattribute vec3 morphTarget2;","\tattribute vec3 morphTarget3;","\t#ifdef USE_MORPHNORMALS","\t\tattribute vec3 morphNormal0;","\t\tattribute vec3 morphNormal1;","\t\tattribute vec3 morphNormal2;","\t\tattribute vec3 morphNormal3;", +"\t#else","\t\tattribute vec3 morphTarget4;","\t\tattribute vec3 morphTarget5;","\t\tattribute vec3 morphTarget6;","\t\tattribute vec3 morphTarget7;","\t#endif","#endif","#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(yc).join("\n"),b=[l,"precision "+f.precision+" float;","precision "+f.precision+" int;","#define SHADER_NAME "+e.name,x,f.alphaTest?"#define ALPHATEST "+f.alphaTest:"","#define GAMMA_FACTOR "+r,f.useFog&&f.fog?"#define USE_FOG": +"",f.useFog&&f.fogExp?"#define FOG_EXP2":"",f.map?"#define USE_MAP":"",f.envMap?"#define USE_ENVMAP":"",f.envMap?"#define "+n:"",f.envMap?"#define "+u:"",f.envMap?"#define "+q:"",f.lightMap?"#define USE_LIGHTMAP":"",f.aoMap?"#define USE_AOMAP":"",f.emissiveMap?"#define USE_EMISSIVEMAP":"",f.bumpMap?"#define USE_BUMPMAP":"",f.normalMap?"#define USE_NORMALMAP":"",f.specularMap?"#define USE_SPECULARMAP":"",f.roughnessMap?"#define USE_ROUGHNESSMAP":"",f.metalnessMap?"#define USE_METALNESSMAP":"",f.alphaMap? +"#define USE_ALPHAMAP":"",f.vertexColors?"#define USE_COLOR":"",f.gradientMap?"#define USE_GRADIENTMAP":"",f.flatShading?"#define FLAT_SHADED":"",f.doubleSided?"#define DOUBLE_SIDED":"",f.flipSided?"#define FLIP_SIDED":"",f.shadowMapEnabled?"#define USE_SHADOWMAP":"",f.shadowMapEnabled?"#define "+v:"",f.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",f.physicallyCorrectLights?"#define PHYSICALLY_CORRECT_LIGHTS":"",f.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",f.logarithmicDepthBuffer&& +b.get("EXT_frag_depth")?"#define USE_LOGDEPTHBUF_EXT":"",f.envMap&&b.get("EXT_shader_texture_lod")?"#define TEXTURE_LOD_EXT":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;",0!==f.toneMapping?"#define TONE_MAPPING":"",0!==f.toneMapping?R.tonemapping_pars_fragment:"",0!==f.toneMapping?pg("toneMapping",f.toneMapping):"",f.dithering?"#define DITHERING":"",f.outputEncoding||f.mapEncoding||f.envMapEncoding||f.emissiveMapEncoding?R.encodings_pars_fragment:"",f.mapEncoding?Ud("mapTexelToLinear", +f.mapEncoding):"",f.envMapEncoding?Ud("envMapTexelToLinear",f.envMapEncoding):"",f.emissiveMapEncoding?Ud("emissiveMapTexelToLinear",f.emissiveMapEncoding):"",f.outputEncoding?og("linearToOutputTexel",f.outputEncoding):"",f.depthPacking?"#define DEPTH_PACKING "+d.depthPacking:"","\n"].filter(yc).join("\n"));k=Vd(k);k=Se(k,f);k=Te(k,f);m=Vd(m);m=Se(m,f);m=Te(m,f);k=Ue(k);m=Ue(m);m=b+m;k=Qe(g,g.VERTEX_SHADER,h+k);m=Qe(g,g.FRAGMENT_SHADER,m);g.attachShader(p,k);g.attachShader(p,m);void 0!==d.index0AttributeName? +g.bindAttribLocation(p,0,d.index0AttributeName):!0===f.morphTargets&&g.bindAttribLocation(p,0,"position");g.linkProgram(p);f=g.getProgramInfoLog(p).trim();e=g.getShaderInfoLog(k).trim();v=g.getShaderInfoLog(m).trim();u=n=!0;if(!1===g.getProgramParameter(p,g.LINK_STATUS))n=!1,console.error("THREE.WebGLProgram: shader error: ",g.getError(),"gl.VALIDATE_STATUS",g.getProgramParameter(p,g.VALIDATE_STATUS),"gl.getProgramInfoLog",f,e,v);else if(""!==f)console.warn("THREE.WebGLProgram: gl.getProgramInfoLog()", +f);else if(""===e||""===v)u=!1;u&&(this.diagnostics={runnable:n,material:d,programLog:f,vertexShader:{log:e,prefix:h},fragmentShader:{log:v,prefix:b}});g.deleteShader(k);g.deleteShader(m);var w;this.getUniforms=function(){void 0===w&&(w=new cb(g,p,a));return w};var A;this.getAttributes=function(){if(void 0===A){for(var a={},b=g.getProgramParameter(p,g.ACTIVE_ATTRIBUTES),c=0;c<b;c++){var d=g.getActiveAttrib(p,c).name;a[d]=g.getAttribLocation(p,d)}A=a}return A};this.destroy=function(){g.deleteProgram(p); +this.program=void 0};Object.defineProperties(this,{uniforms:{get:function(){console.warn("THREE.WebGLProgram: .uniforms is now .getUniforms().");return this.getUniforms()}},attributes:{get:function(){console.warn("THREE.WebGLProgram: .attributes is now .getAttributes().");return this.getAttributes()}}});this.id=tg++;this.code=c;this.usedTimes=1;this.program=p;this.vertexShader=k;this.fragmentShader=m;return this}function ug(a,b,c){function d(a,b){if(a)a.isTexture?c=a.encoding:a.isWebGLRenderTarget&& +(console.warn("THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead."),c=a.texture.encoding);else var c=3E3;3E3===c&&b&&(c=3007);return c}var e=[],f={MeshDepthMaterial:"depth",MeshDistanceMaterial:"distanceRGBA",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",MeshPhongMaterial:"phong",MeshToonMaterial:"phong",MeshStandardMaterial:"physical",MeshPhysicalMaterial:"physical",LineBasicMaterial:"basic", +LineDashedMaterial:"dashed",PointsMaterial:"points",ShadowMaterial:"shadow"},g="precision supportsVertexTextures map mapEncoding envMap envMapMode envMapEncoding lightMap aoMap emissiveMap emissiveMapEncoding bumpMap normalMap displacementMap specularMap roughnessMap metalnessMap gradientMap alphaMap combine vertexColors fog useFog fogExp flatShading sizeAttenuation logarithmicDepthBuffer skinning maxBones useVertexTexture morphTargets morphNormals maxMorphTargets maxMorphNormals premultipliedAlpha numDirLights numPointLights numSpotLights numHemiLights numRectAreaLights shadowMapEnabled shadowMapType toneMapping physicallyCorrectLights alphaTest doubleSided flipSided numClippingPlanes numClipIntersection depthPacking dithering".split(" "); +this.getParameters=function(b,e,g,v,n,u,q){var h=f[b.type];if(q.isSkinnedMesh){var k=q.skeleton.bones;if(c.floatVertexTextures)k=1024;else{var m=Math.min(Math.floor((c.maxVertexUniforms-20)/4),k.length);m<k.length?(console.warn("THREE.WebGLRenderer: Skeleton has "+k.length+" bones. This GPU supports "+m+"."),k=0):k=m}}else k=0;m=c.precision;null!==b.precision&&(m=c.getMaxPrecision(b.precision),m!==b.precision&&console.warn("THREE.WebGLProgram.getParameters:",b.precision,"not supported, using",m,"instead.")); +var l=a.getRenderTarget();return{shaderID:h,precision:m,supportsVertexTextures:c.vertexTextures,outputEncoding:d(l?l.texture:null,a.gammaOutput),map:!!b.map,mapEncoding:d(b.map,a.gammaInput),envMap:!!b.envMap,envMapMode:b.envMap&&b.envMap.mapping,envMapEncoding:d(b.envMap,a.gammaInput),envMapCubeUV:!!b.envMap&&(306===b.envMap.mapping||307===b.envMap.mapping),lightMap:!!b.lightMap,aoMap:!!b.aoMap,emissiveMap:!!b.emissiveMap,emissiveMapEncoding:d(b.emissiveMap,a.gammaInput),bumpMap:!!b.bumpMap,normalMap:!!b.normalMap, +displacementMap:!!b.displacementMap,roughnessMap:!!b.roughnessMap,metalnessMap:!!b.metalnessMap,specularMap:!!b.specularMap,alphaMap:!!b.alphaMap,gradientMap:!!b.gradientMap,combine:b.combine,vertexColors:b.vertexColors,fog:!!v,useFog:b.fog,fogExp:v&&v.isFogExp2,flatShading:b.flatShading,sizeAttenuation:b.sizeAttenuation,logarithmicDepthBuffer:c.logarithmicDepthBuffer,skinning:b.skinning&&0<k,maxBones:k,useVertexTexture:c.floatVertexTextures,morphTargets:b.morphTargets,morphNormals:b.morphNormals, +maxMorphTargets:a.maxMorphTargets,maxMorphNormals:a.maxMorphNormals,numDirLights:e.directional.length,numPointLights:e.point.length,numSpotLights:e.spot.length,numRectAreaLights:e.rectArea.length,numHemiLights:e.hemi.length,numClippingPlanes:n,numClipIntersection:u,dithering:b.dithering,shadowMapEnabled:a.shadowMap.enabled&&q.receiveShadow&&0<g.length,shadowMapType:a.shadowMap.type,toneMapping:a.toneMapping,physicallyCorrectLights:a.physicallyCorrectLights,premultipliedAlpha:b.premultipliedAlpha, +alphaTest:b.alphaTest,doubleSided:2===b.side,flipSided:1===b.side,depthPacking:void 0!==b.depthPacking?b.depthPacking:!1}};this.getProgramCode=function(b,c){var d=[];c.shaderID?d.push(c.shaderID):(d.push(b.fragmentShader),d.push(b.vertexShader));if(void 0!==b.defines)for(var e in b.defines)d.push(e),d.push(b.defines[e]);for(e=0;e<g.length;e++)d.push(c[g[e]]);d.push(b.onBeforeCompile.toString());d.push(a.gammaOutput);return d.join()};this.acquireProgram=function(c,d,f,g){for(var h,k=0,m=e.length;k< +m;k++){var v=e[k];if(v.code===g){h=v;++h.usedTimes;break}}void 0===h&&(h=new sg(a,b,g,c,d,f),e.push(h));return h};this.releaseProgram=function(a){if(0===--a.usedTimes){var b=e.indexOf(a);e[b]=e[e.length-1];e.pop();a.destroy()}};this.programs=e}function vg(a,b,c,d,e,f,g,h){function k(a,b){if(a.width>b||a.height>b){b/=Math.max(a.width,a.height);var c=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");c.width=Math.floor(a.width*b);c.height=Math.floor(a.height*b);c.getContext("2d").drawImage(a, +0,0,a.width,a.height,0,0,c.width,c.height);console.warn("THREE.WebGLRenderer: image is too big ("+a.width+"x"+a.height+"). Resized to "+c.width+"x"+c.height,a);return c}return a}function m(a){return S.isPowerOfTwo(a.width)&&S.isPowerOfTwo(a.height)}function v(a,b){return a.generateMipmaps&&b&&1003!==a.minFilter&&1006!==a.minFilter}function n(b){return 1003===b||1004===b||1005===b?a.NEAREST:a.LINEAR}function u(b){b=b.target;b.removeEventListener("dispose",u);a:{var c=d.get(b);if(b.image&&c.__image__webglTextureCube)a.deleteTexture(c.__image__webglTextureCube); +else{if(void 0===c.__webglInit)break a;a.deleteTexture(c.__webglTexture)}d.remove(b)}b.isVideoTexture&&delete A[b.id];g.textures--}function q(b){b=b.target;b.removeEventListener("dispose",q);var c=d.get(b),e=d.get(b.texture);if(b){void 0!==e.__webglTexture&&a.deleteTexture(e.__webglTexture);b.depthTexture&&b.depthTexture.dispose();if(b.isWebGLRenderTargetCube)for(e=0;6>e;e++)a.deleteFramebuffer(c.__webglFramebuffer[e]),c.__webglDepthbuffer&&a.deleteRenderbuffer(c.__webglDepthbuffer[e]);else a.deleteFramebuffer(c.__webglFramebuffer), +c.__webglDepthbuffer&&a.deleteRenderbuffer(c.__webglDepthbuffer);d.remove(b.texture);d.remove(b)}g.textures--}function r(b,n){var r=d.get(b);if(b.isVideoTexture){var q=b.id,t=h.frame;A[q]!==t&&(A[q]=t,b.update())}if(0<b.version&&r.__version!==b.version)if(q=b.image,void 0===q)console.warn("THREE.WebGLRenderer: Texture marked for update but image is undefined",b);else if(!1===q.complete)console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete",b);else{void 0===r.__webglInit&& +(r.__webglInit=!0,b.addEventListener("dispose",u),r.__webglTexture=a.createTexture(),g.textures++);c.activeTexture(a.TEXTURE0+n);c.bindTexture(a.TEXTURE_2D,r.__webglTexture);a.pixelStorei(a.UNPACK_FLIP_Y_WEBGL,b.flipY);a.pixelStorei(a.UNPACK_PREMULTIPLY_ALPHA_WEBGL,b.premultiplyAlpha);a.pixelStorei(a.UNPACK_ALIGNMENT,b.unpackAlignment);var p=k(b.image,e.maxTextureSize);(1001!==b.wrapS||1001!==b.wrapT||1003!==b.minFilter&&1006!==b.minFilter)&&!1===m(p)&&(n=p,n instanceof HTMLImageElement||n instanceof +HTMLCanvasElement||n instanceof ImageBitmap?(void 0===G&&(G=document.createElementNS("http://www.w3.org/1999/xhtml","canvas")),G.width=S.floorPowerOfTwo(n.width),G.height=S.floorPowerOfTwo(n.height),G.getContext("2d").drawImage(n,0,0,G.width,G.height),console.warn("THREE.WebGLRenderer: image is not power of two ("+n.width+"x"+n.height+"). Resized to "+G.width+"x"+G.height,n),p=G):p=n);n=m(p);q=f.convert(b.format);t=f.convert(b.type);l(a.TEXTURE_2D,b,n);var x=b.mipmaps;if(b.isDepthTexture){x=a.DEPTH_COMPONENT; +if(1015===b.type){if(!w)throw Error("Float Depth Texture only supported in WebGL2.0");x=a.DEPTH_COMPONENT32F}else w&&(x=a.DEPTH_COMPONENT16);1026===b.format&&x===a.DEPTH_COMPONENT&&1012!==b.type&&1014!==b.type&&(console.warn("THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture."),b.type=1012,t=f.convert(b.type));1027===b.format&&(x=a.DEPTH_STENCIL,1020!==b.type&&(console.warn("THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture."), +b.type=1020,t=f.convert(b.type)));c.texImage2D(a.TEXTURE_2D,0,x,p.width,p.height,0,q,t,null)}else if(b.isDataTexture)if(0<x.length&&n){for(var N=0,Z=x.length;N<Z;N++)p=x[N],c.texImage2D(a.TEXTURE_2D,N,q,p.width,p.height,0,q,t,p.data);b.generateMipmaps=!1}else c.texImage2D(a.TEXTURE_2D,0,q,p.width,p.height,0,q,t,p.data);else if(b.isCompressedTexture)for(N=0,Z=x.length;N<Z;N++)p=x[N],1023!==b.format&&1022!==b.format?-1<c.getCompressedTextureFormats().indexOf(q)?c.compressedTexImage2D(a.TEXTURE_2D,N, +q,p.width,p.height,0,p.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()"):c.texImage2D(a.TEXTURE_2D,N,q,p.width,p.height,0,q,t,p.data);else if(0<x.length&&n){N=0;for(Z=x.length;N<Z;N++)p=x[N],c.texImage2D(a.TEXTURE_2D,N,q,q,t,p);b.generateMipmaps=!1}else c.texImage2D(a.TEXTURE_2D,0,q,q,t,p);v(b,n)&&a.generateMipmap(a.TEXTURE_2D);r.__version=b.version;if(b.onUpdate)b.onUpdate(b);return}c.activeTexture(a.TEXTURE0+n);c.bindTexture(a.TEXTURE_2D, +r.__webglTexture)}function l(c,g,h){h?(a.texParameteri(c,a.TEXTURE_WRAP_S,f.convert(g.wrapS)),a.texParameteri(c,a.TEXTURE_WRAP_T,f.convert(g.wrapT)),a.texParameteri(c,a.TEXTURE_MAG_FILTER,f.convert(g.magFilter)),a.texParameteri(c,a.TEXTURE_MIN_FILTER,f.convert(g.minFilter))):(a.texParameteri(c,a.TEXTURE_WRAP_S,a.CLAMP_TO_EDGE),a.texParameteri(c,a.TEXTURE_WRAP_T,a.CLAMP_TO_EDGE),1001===g.wrapS&&1001===g.wrapT||console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.", +g),a.texParameteri(c,a.TEXTURE_MAG_FILTER,n(g.magFilter)),a.texParameteri(c,a.TEXTURE_MIN_FILTER,n(g.minFilter)),1003!==g.minFilter&&1006!==g.minFilter&&console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.",g));!(h=b.get("EXT_texture_filter_anisotropic"))||1015===g.type&&null===b.get("OES_texture_float_linear")||1016===g.type&&null===b.get("OES_texture_half_float_linear")||!(1<g.anisotropy||d.get(g).__currentAnisotropy)|| +(a.texParameterf(c,h.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(g.anisotropy,e.getMaxAnisotropy())),d.get(g).__currentAnisotropy=g.anisotropy)}function p(b,e,g,h){var k=f.convert(e.texture.format),m=f.convert(e.texture.type);c.texImage2D(h,0,k,e.width,e.height,0,k,m,null);a.bindFramebuffer(a.FRAMEBUFFER,b);a.framebufferTexture2D(a.FRAMEBUFFER,g,h,d.get(e.texture).__webglTexture,0);a.bindFramebuffer(a.FRAMEBUFFER,null)}function B(b,c){a.bindRenderbuffer(a.RENDERBUFFER,b);c.depthBuffer&&!c.stencilBuffer?(a.renderbufferStorage(a.RENDERBUFFER, +a.DEPTH_COMPONENT16,c.width,c.height),a.framebufferRenderbuffer(a.FRAMEBUFFER,a.DEPTH_ATTACHMENT,a.RENDERBUFFER,b)):c.depthBuffer&&c.stencilBuffer?(a.renderbufferStorage(a.RENDERBUFFER,a.DEPTH_STENCIL,c.width,c.height),a.framebufferRenderbuffer(a.FRAMEBUFFER,a.DEPTH_STENCIL_ATTACHMENT,a.RENDERBUFFER,b)):a.renderbufferStorage(a.RENDERBUFFER,a.RGBA4,c.width,c.height);a.bindRenderbuffer(a.RENDERBUFFER,null)}var w="undefined"!==typeof WebGL2RenderingContext&&a instanceof WebGL2RenderingContext,A={},G; +this.setTexture2D=r;this.setTextureCube=function(b,h){var n=d.get(b);if(6===b.image.length)if(0<b.version&&n.__version!==b.version){n.__image__webglTextureCube||(b.addEventListener("dispose",u),n.__image__webglTextureCube=a.createTexture(),g.textures++);c.activeTexture(a.TEXTURE0+h);c.bindTexture(a.TEXTURE_CUBE_MAP,n.__image__webglTextureCube);a.pixelStorei(a.UNPACK_FLIP_Y_WEBGL,b.flipY);h=b&&b.isCompressedTexture;for(var r=b.image[0]&&b.image[0].isDataTexture,q=[],t=0;6>t;t++)q[t]=h||r?r?b.image[t].image: +b.image[t]:k(b.image[t],e.maxCubemapSize);var p=m(q[0]),x=f.convert(b.format),w=f.convert(b.type);l(a.TEXTURE_CUBE_MAP,b,p);for(t=0;6>t;t++)if(h)for(var N,B=q[t].mipmaps,A=0,G=B.length;A<G;A++)N=B[A],1023!==b.format&&1022!==b.format?-1<c.getCompressedTextureFormats().indexOf(x)?c.compressedTexImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+t,A,x,N.width,N.height,0,N.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()"):c.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+ +t,A,x,N.width,N.height,0,x,w,N.data);else r?c.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+t,0,x,q[t].width,q[t].height,0,x,w,q[t].data):c.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+t,0,x,x,w,q[t]);v(b,p)&&a.generateMipmap(a.TEXTURE_CUBE_MAP);n.__version=b.version;if(b.onUpdate)b.onUpdate(b)}else c.activeTexture(a.TEXTURE0+h),c.bindTexture(a.TEXTURE_CUBE_MAP,n.__image__webglTextureCube)};this.setTextureCubeDynamic=function(b,e){c.activeTexture(a.TEXTURE0+e);c.bindTexture(a.TEXTURE_CUBE_MAP,d.get(b).__webglTexture)}; +this.setupRenderTarget=function(b){var e=d.get(b),f=d.get(b.texture);b.addEventListener("dispose",q);f.__webglTexture=a.createTexture();g.textures++;var h=!0===b.isWebGLRenderTargetCube,k=m(b);if(h){e.__webglFramebuffer=[];for(var n=0;6>n;n++)e.__webglFramebuffer[n]=a.createFramebuffer()}else e.__webglFramebuffer=a.createFramebuffer();if(h){c.bindTexture(a.TEXTURE_CUBE_MAP,f.__webglTexture);l(a.TEXTURE_CUBE_MAP,b.texture,k);for(n=0;6>n;n++)p(e.__webglFramebuffer[n],b,a.COLOR_ATTACHMENT0,a.TEXTURE_CUBE_MAP_POSITIVE_X+ +n);v(b.texture,k)&&a.generateMipmap(a.TEXTURE_CUBE_MAP);c.bindTexture(a.TEXTURE_CUBE_MAP,null)}else c.bindTexture(a.TEXTURE_2D,f.__webglTexture),l(a.TEXTURE_2D,b.texture,k),p(e.__webglFramebuffer,b,a.COLOR_ATTACHMENT0,a.TEXTURE_2D),v(b.texture,k)&&a.generateMipmap(a.TEXTURE_2D),c.bindTexture(a.TEXTURE_2D,null);if(b.depthBuffer){e=d.get(b);f=!0===b.isWebGLRenderTargetCube;if(b.depthTexture){if(f)throw Error("target.depthTexture not supported in Cube render targets");if(b&&b.isWebGLRenderTargetCube)throw Error("Depth Texture with cube render targets is not supported"); +a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer);if(!b.depthTexture||!b.depthTexture.isDepthTexture)throw Error("renderTarget.depthTexture must be an instance of THREE.DepthTexture");d.get(b.depthTexture).__webglTexture&&b.depthTexture.image.width===b.width&&b.depthTexture.image.height===b.height||(b.depthTexture.image.width=b.width,b.depthTexture.image.height=b.height,b.depthTexture.needsUpdate=!0);r(b.depthTexture,0);e=d.get(b.depthTexture).__webglTexture;if(1026===b.depthTexture.format)a.framebufferTexture2D(a.FRAMEBUFFER, +a.DEPTH_ATTACHMENT,a.TEXTURE_2D,e,0);else if(1027===b.depthTexture.format)a.framebufferTexture2D(a.FRAMEBUFFER,a.DEPTH_STENCIL_ATTACHMENT,a.TEXTURE_2D,e,0);else throw Error("Unknown depthTexture format");}else if(f)for(e.__webglDepthbuffer=[],f=0;6>f;f++)a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer[f]),e.__webglDepthbuffer[f]=a.createRenderbuffer(),B(e.__webglDepthbuffer[f],b);else a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer),e.__webglDepthbuffer=a.createRenderbuffer(),B(e.__webglDepthbuffer, +b);a.bindFramebuffer(a.FRAMEBUFFER,null)}};this.updateRenderTargetMipmap=function(b){var e=b.texture,f=m(b);v(e,f)&&(b=b.isWebGLRenderTargetCube?a.TEXTURE_CUBE_MAP:a.TEXTURE_2D,e=d.get(e).__webglTexture,c.bindTexture(b,e),a.generateMipmap(b),c.bindTexture(b,null))}}function wg(){var a={};return{get:function(b){b=b.uuid;var c=a[b];void 0===c&&(c={},a[b]=c);return c},remove:function(b){delete a[b.uuid]},update:function(b,c,d){a[b.uuid][c]=d},dispose:function(){a={}}}}function xg(a,b,c){function d(b, +c,d){var e=new Uint8Array(4),f=a.createTexture();a.bindTexture(b,f);a.texParameteri(b,a.TEXTURE_MIN_FILTER,a.NEAREST);a.texParameteri(b,a.TEXTURE_MAG_FILTER,a.NEAREST);for(b=0;b<d;b++)a.texImage2D(c+b,0,a.RGBA,1,1,0,a.RGBA,a.UNSIGNED_BYTE,e);return f}function e(b){!0!==w[b]&&(a.enable(b),w[b]=!0)}function f(b){!1!==w[b]&&(a.disable(b),w[b]=!1)}function g(b,d,g,h,k,m,n,v){0!==b?e(a.BLEND):f(a.BLEND);if(5!==b){if(b!==N||v!==z)switch(b){case 2:v?(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.ONE, +a.ONE,a.ONE,a.ONE)):(a.blendEquation(a.FUNC_ADD),a.blendFunc(a.SRC_ALPHA,a.ONE));break;case 3:v?(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.ZERO,a.ZERO,a.ONE_MINUS_SRC_COLOR,a.ONE_MINUS_SRC_ALPHA)):(a.blendEquation(a.FUNC_ADD),a.blendFunc(a.ZERO,a.ONE_MINUS_SRC_COLOR));break;case 4:v?(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.ZERO,a.SRC_COLOR,a.ZERO,a.SRC_ALPHA)):(a.blendEquation(a.FUNC_ADD),a.blendFunc(a.ZERO,a.SRC_COLOR));break;default:v?(a.blendEquationSeparate(a.FUNC_ADD, +a.FUNC_ADD),a.blendFuncSeparate(a.ONE,a.ONE_MINUS_SRC_ALPHA,a.ONE,a.ONE_MINUS_SRC_ALPHA)):(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.SRC_ALPHA,a.ONE_MINUS_SRC_ALPHA,a.ONE,a.ONE_MINUS_SRC_ALPHA))}D=ia=y=C=F=Z=null}else{k=k||d;m=m||g;n=n||h;if(d!==Z||k!==y)a.blendEquationSeparate(c.convert(d),c.convert(k)),Z=d,y=k;if(g!==F||h!==C||m!==ia||n!==D)a.blendFuncSeparate(c.convert(g),c.convert(h),c.convert(m),c.convert(n)),F=g,C=h,ia=m,D=n}N=b;z=v}function h(b){I!==b&&(b?a.frontFace(a.CW): +a.frontFace(a.CCW),I=b)}function k(b){0!==b?(e(a.CULL_FACE),b!==H&&(1===b?a.cullFace(a.BACK):2===b?a.cullFace(a.FRONT):a.cullFace(a.FRONT_AND_BACK))):f(a.CULL_FACE);H=b}function m(b,c,d){if(b){if(e(a.POLYGON_OFFSET_FILL),K!==c||L!==d)a.polygonOffset(c,d),K=c,L=d}else f(a.POLYGON_OFFSET_FILL)}function v(b){void 0===b&&(b=a.TEXTURE0+P-1);M!==b&&(a.activeTexture(b),M=b)}var n=new function(){var b=!1,c=new X,d=null,e=new X(0,0,0,0);return{setMask:function(c){d===c||b||(a.colorMask(c,c,c,c),d=c)},setLocked:function(a){b= +a},setClear:function(b,d,f,g,h){!0===h&&(b*=g,d*=g,f*=g);c.set(b,d,f,g);!1===e.equals(c)&&(a.clearColor(b,d,f,g),e.copy(c))},reset:function(){b=!1;d=null;e.set(-1,0,0,0)}}},u=new function(){var b=!1,c=null,d=null,g=null;return{setTest:function(b){b?e(a.DEPTH_TEST):f(a.DEPTH_TEST)},setMask:function(d){c===d||b||(a.depthMask(d),c=d)},setFunc:function(b){if(d!==b){if(b)switch(b){case 0:a.depthFunc(a.NEVER);break;case 1:a.depthFunc(a.ALWAYS);break;case 2:a.depthFunc(a.LESS);break;case 3:a.depthFunc(a.LEQUAL); +break;case 4:a.depthFunc(a.EQUAL);break;case 5:a.depthFunc(a.GEQUAL);break;case 6:a.depthFunc(a.GREATER);break;case 7:a.depthFunc(a.NOTEQUAL);break;default:a.depthFunc(a.LEQUAL)}else a.depthFunc(a.LEQUAL);d=b}},setLocked:function(a){b=a},setClear:function(b){g!==b&&(a.clearDepth(b),g=b)},reset:function(){b=!1;g=d=c=null}}},q=new function(){var b=!1,c=null,d=null,g=null,h=null,k=null,m=null,n=null,v=null;return{setTest:function(b){b?e(a.STENCIL_TEST):f(a.STENCIL_TEST)},setMask:function(d){c===d||b|| +(a.stencilMask(d),c=d)},setFunc:function(b,c,e){if(d!==b||g!==c||h!==e)a.stencilFunc(b,c,e),d=b,g=c,h=e},setOp:function(b,c,d){if(k!==b||m!==c||n!==d)a.stencilOp(b,c,d),k=b,m=c,n=d},setLocked:function(a){b=a},setClear:function(b){v!==b&&(a.clearStencil(b),v=b)},reset:function(){b=!1;v=n=m=k=h=g=d=c=null}}},r=a.getParameter(a.MAX_VERTEX_ATTRIBS),l=new Uint8Array(r),p=new Uint8Array(r),B=new Uint8Array(r),w={},A=null,G=null,N=null,Z=null,F=null,C=null,y=null,ia=null,D=null,z=!1,I=null,H=null,T=null, +K=null,L=null,P=a.getParameter(a.MAX_COMBINED_TEXTURE_IMAGE_UNITS),S=!1;r=0;r=a.getParameter(a.VERSION);-1!==r.indexOf("WebGL")?(r=parseFloat(/^WebGL ([0-9])/.exec(r)[1]),S=1<=r):-1!==r.indexOf("OpenGL ES")&&(r=parseFloat(/^OpenGL ES ([0-9])/.exec(r)[1]),S=2<=r);var M=null,O={},R=new X,J=new X,V={};V[a.TEXTURE_2D]=d(a.TEXTURE_2D,a.TEXTURE_2D,1);V[a.TEXTURE_CUBE_MAP]=d(a.TEXTURE_CUBE_MAP,a.TEXTURE_CUBE_MAP_POSITIVE_X,6);n.setClear(0,0,0,1);u.setClear(1);q.setClear(0);e(a.DEPTH_TEST);u.setFunc(3);h(!1); +k(1);e(a.CULL_FACE);e(a.BLEND);g(1);return{buffers:{color:n,depth:u,stencil:q},initAttributes:function(){for(var a=0,b=l.length;a<b;a++)l[a]=0},enableAttribute:function(c){l[c]=1;0===p[c]&&(a.enableVertexAttribArray(c),p[c]=1);0!==B[c]&&(b.get("ANGLE_instanced_arrays").vertexAttribDivisorANGLE(c,0),B[c]=0)},enableAttributeAndDivisor:function(c,d){l[c]=1;0===p[c]&&(a.enableVertexAttribArray(c),p[c]=1);B[c]!==d&&(b.get("ANGLE_instanced_arrays").vertexAttribDivisorANGLE(c,d),B[c]=d)},disableUnusedAttributes:function(){for(var b= +0,c=p.length;b!==c;++b)p[b]!==l[b]&&(a.disableVertexAttribArray(b),p[b]=0)},enable:e,disable:f,getCompressedTextureFormats:function(){if(null===A&&(A=[],b.get("WEBGL_compressed_texture_pvrtc")||b.get("WEBGL_compressed_texture_s3tc")||b.get("WEBGL_compressed_texture_etc1")||b.get("WEBGL_compressed_texture_astc")))for(var c=a.getParameter(a.COMPRESSED_TEXTURE_FORMATS),d=0;d<c.length;d++)A.push(c[d]);return A},useProgram:function(b){return G!==b?(a.useProgram(b),G=b,!0):!1},setBlending:g,setMaterial:function(b, +c){2===b.side?f(a.CULL_FACE):e(a.CULL_FACE);var d=1===b.side;c&&(d=!d);h(d);!0===b.transparent?g(b.blending,b.blendEquation,b.blendSrc,b.blendDst,b.blendEquationAlpha,b.blendSrcAlpha,b.blendDstAlpha,b.premultipliedAlpha):g(0);u.setFunc(b.depthFunc);u.setTest(b.depthTest);u.setMask(b.depthWrite);n.setMask(b.colorWrite);m(b.polygonOffset,b.polygonOffsetFactor,b.polygonOffsetUnits)},setFlipSided:h,setCullFace:k,setLineWidth:function(b){b!==T&&(S&&a.lineWidth(b),T=b)},setPolygonOffset:m,setScissorTest:function(b){b? +e(a.SCISSOR_TEST):f(a.SCISSOR_TEST)},activeTexture:v,bindTexture:function(b,c){null===M&&v();var d=O[M];void 0===d&&(d={type:void 0,texture:void 0},O[M]=d);if(d.type!==b||d.texture!==c)a.bindTexture(b,c||V[b]),d.type=b,d.texture=c},compressedTexImage2D:function(){try{a.compressedTexImage2D.apply(a,arguments)}catch(Q){console.error("THREE.WebGLState:",Q)}},texImage2D:function(){try{a.texImage2D.apply(a,arguments)}catch(Q){console.error("THREE.WebGLState:",Q)}},scissor:function(b){!1===R.equals(b)&& +(a.scissor(b.x,b.y,b.z,b.w),R.copy(b))},viewport:function(b){!1===J.equals(b)&&(a.viewport(b.x,b.y,b.z,b.w),J.copy(b))},reset:function(){for(var b=0;b<p.length;b++)1===p[b]&&(a.disableVertexAttribArray(b),p[b]=0);w={};M=A=null;O={};H=I=N=G=null;n.reset();u.reset();q.reset()}}}function yg(a,b,c){function d(b){if("highp"===b){if(0<a.getShaderPrecisionFormat(a.VERTEX_SHADER,a.HIGH_FLOAT).precision&&0<a.getShaderPrecisionFormat(a.FRAGMENT_SHADER,a.HIGH_FLOAT).precision)return"highp";b="mediump"}return"mediump"=== +b&&0<a.getShaderPrecisionFormat(a.VERTEX_SHADER,a.MEDIUM_FLOAT).precision&&0<a.getShaderPrecisionFormat(a.FRAGMENT_SHADER,a.MEDIUM_FLOAT).precision?"mediump":"lowp"}var e,f=void 0!==c.precision?c.precision:"highp",g=d(f);g!==f&&(console.warn("THREE.WebGLRenderer:",f,"not supported, using",g,"instead."),f=g);c=!0===c.logarithmicDepthBuffer;g=a.getParameter(a.MAX_TEXTURE_IMAGE_UNITS);var h=a.getParameter(a.MAX_VERTEX_TEXTURE_IMAGE_UNITS),k=a.getParameter(a.MAX_TEXTURE_SIZE),m=a.getParameter(a.MAX_CUBE_MAP_TEXTURE_SIZE), +v=a.getParameter(a.MAX_VERTEX_ATTRIBS),n=a.getParameter(a.MAX_VERTEX_UNIFORM_VECTORS),u=a.getParameter(a.MAX_VARYING_VECTORS),q=a.getParameter(a.MAX_FRAGMENT_UNIFORM_VECTORS),r=0<h,l=!!b.get("OES_texture_float");return{getMaxAnisotropy:function(){if(void 0!==e)return e;var c=b.get("EXT_texture_filter_anisotropic");return e=null!==c?a.getParameter(c.MAX_TEXTURE_MAX_ANISOTROPY_EXT):0},getMaxPrecision:d,precision:f,logarithmicDepthBuffer:c,maxTextures:g,maxVertexTextures:h,maxTextureSize:k,maxCubemapSize:m, +maxAttributes:v,maxVertexUniforms:n,maxVaryings:u,maxFragmentUniforms:q,vertexTextures:r,floatFragmentTextures:l,floatVertexTextures:r&&l}}function na(a,b,c,d){Qa.call(this);this.type="PerspectiveCamera";this.fov=void 0!==a?a:50;this.zoom=1;this.near=void 0!==c?c:.1;this.far=void 0!==d?d:2E3;this.focus=10;this.aspect=void 0!==b?b:1;this.view=null;this.filmGauge=35;this.filmOffset=0;this.updateProjectionMatrix()}function od(a){na.call(this);this.cameras=a||[]}function Ve(a){function b(){if(null!== +d&&d.isPresenting){var b=d.getEyeParameters("left"),e=b.renderWidth;b=b.renderHeight;q=a.getPixelRatio();u=a.getSize();a.setDrawingBufferSize(2*e,b,1)}else c.enabled&&a.setDrawingBufferSize(u.width,u.height,q)}var c=this,d=null,e=null,f=null,g=new P,h=new P;"undefined"!==typeof window&&"VRFrameData"in window&&(e=new window.VRFrameData);var k=new P,m=new na;m.bounds=new X(0,0,.5,1);m.layers.enable(1);var v=new na;v.bounds=new X(.5,0,.5,1);v.layers.enable(2);var n=new od([m,v]);n.layers.enable(1);n.layers.enable(2); +var u,q;"undefined"!==typeof window&&window.addEventListener("vrdisplaypresentchange",b,!1);this.enabled=!1;this.userHeight=1.6;this.getDevice=function(){return d};this.setDevice=function(a){void 0!==a&&(d=a)};this.setPoseTarget=function(a){void 0!==a&&(f=a)};this.getCamera=function(a){if(null===d)return a;d.depthNear=a.near;d.depthFar=a.far;d.getFrameData(e);var b=e.pose,u=null!==f?f:a;null!==b.position?u.position.fromArray(b.position):u.position.set(0,0,0);null!==b.orientation&&u.quaternion.fromArray(b.orientation); +(b=d.stageParameters)?g.fromArray(b.sittingToStandingTransform):g.makeTranslation(0,c.userHeight,0);u.position.applyMatrix4(g);u.updateMatrixWorld();if(!1===d.isPresenting)return a;m.near=a.near;v.near=a.near;m.far=a.far;v.far=a.far;n.matrixWorld.copy(a.matrixWorld);n.matrixWorldInverse.copy(a.matrixWorldInverse);m.matrixWorldInverse.fromArray(e.leftViewMatrix);v.matrixWorldInverse.fromArray(e.rightViewMatrix);h.getInverse(g);m.matrixWorldInverse.multiply(h);v.matrixWorldInverse.multiply(h);a=u.parent; +null!==a&&(k.getInverse(a.matrixWorld),m.matrixWorldInverse.multiply(k),v.matrixWorldInverse.multiply(k));m.matrixWorld.getInverse(m.matrixWorldInverse);v.matrixWorld.getInverse(v.matrixWorldInverse);m.projectionMatrix.fromArray(e.leftProjectionMatrix);v.projectionMatrix.fromArray(e.rightProjectionMatrix);n.projectionMatrix.copy(m.projectionMatrix);a=d.getLayers();a.length&&(a=a[0],null!==a.leftBounds&&4===a.leftBounds.length&&m.bounds.fromArray(a.leftBounds),null!==a.rightBounds&&4===a.rightBounds.length&& +v.bounds.fromArray(a.rightBounds));return n};this.getStandingMatrix=function(){return g};this.submitFrame=function(){d&&d.isPresenting&&d.submitFrame()};this.dispose=function(){"undefined"!==typeof window&&window.removeEventListener("vrdisplaypresentchange",b)}}function zg(a){var b={};return{get:function(c){if(void 0!==b[c])return b[c];switch(c){case "WEBGL_depth_texture":var d=a.getExtension("WEBGL_depth_texture")||a.getExtension("MOZ_WEBGL_depth_texture")||a.getExtension("WEBKIT_WEBGL_depth_texture"); +break;case "EXT_texture_filter_anisotropic":d=a.getExtension("EXT_texture_filter_anisotropic")||a.getExtension("MOZ_EXT_texture_filter_anisotropic")||a.getExtension("WEBKIT_EXT_texture_filter_anisotropic");break;case "WEBGL_compressed_texture_s3tc":d=a.getExtension("WEBGL_compressed_texture_s3tc")||a.getExtension("MOZ_WEBGL_compressed_texture_s3tc")||a.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc");break;case "WEBGL_compressed_texture_pvrtc":d=a.getExtension("WEBGL_compressed_texture_pvrtc")|| +a.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc");break;case "WEBGL_compressed_texture_etc1":d=a.getExtension("WEBGL_compressed_texture_etc1");break;default:d=a.getExtension(c)}null===d&&console.warn("THREE.WebGLRenderer: "+c+" extension not supported.");return b[c]=d}}}function Ag(){function a(){m.value!==d&&(m.value=d,m.needsUpdate=0<e);c.numPlanes=e;c.numIntersection=0}function b(a,b,d,e){var f=null!==a?a.length:0,g=null;if(0!==f){g=m.value;if(!0!==e||null===g){e=d+4*f;b=b.matrixWorldInverse; +k.getNormalMatrix(b);if(null===g||g.length<e)g=new Float32Array(e);for(e=0;e!==f;++e,d+=4)h.copy(a[e]).applyMatrix4(b,k),h.normal.toArray(g,d),g[d+3]=h.constant}m.value=g;m.needsUpdate=!0}c.numPlanes=f;return g}var c=this,d=null,e=0,f=!1,g=!1,h=new pa,k=new ta,m={value:null,needsUpdate:!1};this.uniform=m;this.numIntersection=this.numPlanes=0;this.init=function(a,c,g){var h=0!==a.length||c||0!==e||f;f=c;d=b(a,g,0);e=a.length;return h};this.beginShadows=function(){g=!0;b(null)};this.endShadows=function(){g= +!1;a()};this.setState=function(c,h,k,q,l,t){if(!f||null===c||0===c.length||g&&!k)g?b(null):a();else{k=g?0:e;var n=4*k,v=l.clippingState||null;m.value=v;v=b(c,q,n,t);for(c=0;c!==n;++c)v[c]=d[c];l.clippingState=v;this.numIntersection=h?this.numPlanes:0;this.numPlanes+=k}}}function We(a,b){return{convert:function(c){if(1E3===c)return a.REPEAT;if(1001===c)return a.CLAMP_TO_EDGE;if(1002===c)return a.MIRRORED_REPEAT;if(1003===c)return a.NEAREST;if(1004===c)return a.NEAREST_MIPMAP_NEAREST;if(1005===c)return a.NEAREST_MIPMAP_LINEAR; +if(1006===c)return a.LINEAR;if(1007===c)return a.LINEAR_MIPMAP_NEAREST;if(1008===c)return a.LINEAR_MIPMAP_LINEAR;if(1009===c)return a.UNSIGNED_BYTE;if(1017===c)return a.UNSIGNED_SHORT_4_4_4_4;if(1018===c)return a.UNSIGNED_SHORT_5_5_5_1;if(1019===c)return a.UNSIGNED_SHORT_5_6_5;if(1010===c)return a.BYTE;if(1011===c)return a.SHORT;if(1012===c)return a.UNSIGNED_SHORT;if(1013===c)return a.INT;if(1014===c)return a.UNSIGNED_INT;if(1015===c)return a.FLOAT;if(1016===c){var d=b.get("OES_texture_half_float"); +if(null!==d)return d.HALF_FLOAT_OES}if(1021===c)return a.ALPHA;if(1022===c)return a.RGB;if(1023===c)return a.RGBA;if(1024===c)return a.LUMINANCE;if(1025===c)return a.LUMINANCE_ALPHA;if(1026===c)return a.DEPTH_COMPONENT;if(1027===c)return a.DEPTH_STENCIL;if(100===c)return a.FUNC_ADD;if(101===c)return a.FUNC_SUBTRACT;if(102===c)return a.FUNC_REVERSE_SUBTRACT;if(200===c)return a.ZERO;if(201===c)return a.ONE;if(202===c)return a.SRC_COLOR;if(203===c)return a.ONE_MINUS_SRC_COLOR;if(204===c)return a.SRC_ALPHA; +if(205===c)return a.ONE_MINUS_SRC_ALPHA;if(206===c)return a.DST_ALPHA;if(207===c)return a.ONE_MINUS_DST_ALPHA;if(208===c)return a.DST_COLOR;if(209===c)return a.ONE_MINUS_DST_COLOR;if(210===c)return a.SRC_ALPHA_SATURATE;if(33776===c||33777===c||33778===c||33779===c)if(d=b.get("WEBGL_compressed_texture_s3tc"),null!==d){if(33776===c)return d.COMPRESSED_RGB_S3TC_DXT1_EXT;if(33777===c)return d.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(33778===c)return d.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(33779===c)return d.COMPRESSED_RGBA_S3TC_DXT5_EXT}if(35840=== +c||35841===c||35842===c||35843===c)if(d=b.get("WEBGL_compressed_texture_pvrtc"),null!==d){if(35840===c)return d.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(35841===c)return d.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(35842===c)return d.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(35843===c)return d.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}if(36196===c&&(d=b.get("WEBGL_compressed_texture_etc1"),null!==d))return d.COMPRESSED_RGB_ETC1_WEBGL;if(37808===c||37809===c||37810===c||37811===c||37812===c||37813===c||37814===c||37815===c||37816=== +c||37817===c||37818===c||37819===c||37820===c||37821===c)if(d=b.get("WEBGL_compressed_texture_astc"),null!==d)return c;if(103===c||104===c)if(d=b.get("EXT_blend_minmax"),null!==d){if(103===c)return d.MIN_EXT;if(104===c)return d.MAX_EXT}return 1020===c&&(d=b.get("WEBGL_depth_texture"),null!==d)?d.UNSIGNED_INT_24_8_WEBGL:0}}}function Bg(){var a={};return{get:function(b){if(void 0!==a[b.id])return a[b.id];switch(b.type){case "DirectionalLight":var c={direction:new p,color:new H,shadow:!1,shadowBias:0, +shadowRadius:1,shadowMapSize:new C};break;case "SpotLight":c={position:new p,direction:new p,color:new H,distance:0,coneCos:0,penumbraCos:0,decay:0,shadow:!1,shadowBias:0,shadowRadius:1,shadowMapSize:new C};break;case "PointLight":c={position:new p,color:new H,distance:0,decay:0,shadow:!1,shadowBias:0,shadowRadius:1,shadowMapSize:new C,shadowCameraNear:1,shadowCameraFar:1E3};break;case "HemisphereLight":c={direction:new p,skyColor:new H,groundColor:new H};break;case "RectAreaLight":c={color:new H, +position:new p,halfWidth:new p,halfHeight:new p}}return a[b.id]=c}}}function Cg(){var a=new Bg,b={id:Dg++,hash:"",ambient:[0,0,0],directional:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotShadowMap:[],spotShadowMatrix:[],rectArea:[],point:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[]},c=new p,d=new P,e=new P;return{setup:function(f,g,h){var k=0,m=0,v=0,n=0,u=0,q=0,l=0,t=0;h=h.matrixWorldInverse;for(var p=0,B=f.length;p<B;p++){var w=f[p],A=w.color,G=w.intensity,N=w.distance, +Z=w.shadow&&w.shadow.map?w.shadow.map.texture:null;if(w.isAmbientLight)k+=A.r*G,m+=A.g*G,v+=A.b*G;else if(w.isDirectionalLight){var F=a.get(w);F.color.copy(w.color).multiplyScalar(w.intensity);F.direction.setFromMatrixPosition(w.matrixWorld);c.setFromMatrixPosition(w.target.matrixWorld);F.direction.sub(c);F.direction.transformDirection(h);if(F.shadow=w.castShadow)A=w.shadow,F.shadowBias=A.bias,F.shadowRadius=A.radius,F.shadowMapSize=A.mapSize;b.directionalShadowMap[n]=Z;b.directionalShadowMatrix[n]= +w.shadow.matrix;b.directional[n]=F;n++}else if(w.isSpotLight){F=a.get(w);F.position.setFromMatrixPosition(w.matrixWorld);F.position.applyMatrix4(h);F.color.copy(A).multiplyScalar(G);F.distance=N;F.direction.setFromMatrixPosition(w.matrixWorld);c.setFromMatrixPosition(w.target.matrixWorld);F.direction.sub(c);F.direction.transformDirection(h);F.coneCos=Math.cos(w.angle);F.penumbraCos=Math.cos(w.angle*(1-w.penumbra));F.decay=0===w.distance?0:w.decay;if(F.shadow=w.castShadow)A=w.shadow,F.shadowBias=A.bias, +F.shadowRadius=A.radius,F.shadowMapSize=A.mapSize;b.spotShadowMap[q]=Z;b.spotShadowMatrix[q]=w.shadow.matrix;b.spot[q]=F;q++}else if(w.isRectAreaLight)F=a.get(w),F.color.copy(A).multiplyScalar(G),F.position.setFromMatrixPosition(w.matrixWorld),F.position.applyMatrix4(h),e.identity(),d.copy(w.matrixWorld),d.premultiply(h),e.extractRotation(d),F.halfWidth.set(.5*w.width,0,0),F.halfHeight.set(0,.5*w.height,0),F.halfWidth.applyMatrix4(e),F.halfHeight.applyMatrix4(e),b.rectArea[l]=F,l++;else if(w.isPointLight){F= +a.get(w);F.position.setFromMatrixPosition(w.matrixWorld);F.position.applyMatrix4(h);F.color.copy(w.color).multiplyScalar(w.intensity);F.distance=w.distance;F.decay=0===w.distance?0:w.decay;if(F.shadow=w.castShadow)A=w.shadow,F.shadowBias=A.bias,F.shadowRadius=A.radius,F.shadowMapSize=A.mapSize,F.shadowCameraNear=A.camera.near,F.shadowCameraFar=A.camera.far;b.pointShadowMap[u]=Z;b.pointShadowMatrix[u]=w.shadow.matrix;b.point[u]=F;u++}else w.isHemisphereLight&&(F=a.get(w),F.direction.setFromMatrixPosition(w.matrixWorld), +F.direction.transformDirection(h),F.direction.normalize(),F.skyColor.copy(w.color).multiplyScalar(G),F.groundColor.copy(w.groundColor).multiplyScalar(G),b.hemi[t]=F,t++)}b.ambient[0]=k;b.ambient[1]=m;b.ambient[2]=v;b.directional.length=n;b.spot.length=q;b.rectArea.length=l;b.point.length=u;b.hemi.length=t;b.hash=b.id+","+n+","+u+","+q+","+l+","+t+","+g.length},state:b}}function Eg(){var a=new Cg,b=[],c=[],d=[];return{init:function(){b.length=0;c.length=0;d.length=0},state:{lightsArray:b,shadowsArray:c, +spritesArray:d,lights:a},setupLights:function(d){a.setup(b,c,d)},pushLight:function(a){b.push(a)},pushShadow:function(a){c.push(a)},pushSprite:function(a){d.push(a)}}}function Fg(){var a={};return{get:function(b,c){b=b.id+","+c.id;c=a[b];void 0===c&&(c=new Eg,a[b]=c);return c},dispose:function(){a={}}}}function Xd(a){function b(){ja=new zg(E);ja.get("WEBGL_depth_texture");ja.get("OES_texture_float");ja.get("OES_texture_float_linear");ja.get("OES_texture_half_float");ja.get("OES_texture_half_float_linear"); +ja.get("OES_standard_derivatives");ja.get("OES_element_index_uint");ja.get("ANGLE_instanced_arrays");oa=new We(E,ja);da=new yg(E,ja,a);ba=new xg(E,ja,oa);ba.scissor(Y.copy(ca).multiplyScalar(Q));ba.viewport(R.copy(ea).multiplyScalar(Q));W=new wg;fa=new vg(E,ja,ba,W,da,oa,Wd,Ra);sa=new Zf(E);ta=new lg(E,sa,Wd);ua=new mg(ta,Ra);xa=new ig(E);qa=new ug(z,ja,da);va=new gg;ra=new Fg;ka=new cg(z,ba,ta,Z);za=new kg(E,ja,Ra);Aa=new jg(E,ja,Ra);Ba=new Wf(z,E,ba,fa,da);z.info.programs=qa.programs;z.context= +E;z.capabilities=da;z.extensions=ja;z.properties=W;z.renderLists=va;z.state=ba}function c(a){a.preventDefault();console.log("THREE.WebGLRenderer: Context Lost.");H=!0}function d(){console.log("THREE.WebGLRenderer: Context Restored.");H=!1;b()}function e(a){a=a.target;a.removeEventListener("dispose",e);f(a);W.remove(a)}function f(a){var b=W.get(a).program;a.program=void 0;void 0!==b&&qa.releaseProgram(b)}function g(a,b,c){a.render(function(a){z.renderBufferImmediate(a,b,c)})}function h(){var a=pa.getDevice(); +a&&a.isPresenting?a.requestAnimationFrame(k):window.requestAnimationFrame(k)}function k(a){!1!==wa&&(Ca(a),h())}function m(a,b,c){if(!1!==a.visible){if(a.layers.test(b.layers))if(a.isLight)D.pushLight(a),a.castShadow&&D.pushShadow(a);else if(a.isSprite)a.frustumCulled&&!ha.intersectsSprite(a)||D.pushSprite(a);else if(a.isImmediateRenderObject)c&&Lb.setFromMatrixPosition(a.matrixWorld).applyMatrix4(nd),y.push(a,null,a.material,Lb.z,null);else if(a.isMesh||a.isLine||a.isPoints)if(a.isSkinnedMesh&&a.skeleton.update(), +!a.frustumCulled||ha.intersectsObject(a)){c&&Lb.setFromMatrixPosition(a.matrixWorld).applyMatrix4(nd);var d=ua.update(a),e=a.material;if(Array.isArray(e))for(var f=d.groups,g=0,h=f.length;g<h;g++){var k=f[g],n=e[k.materialIndex];n&&n.visible&&y.push(a,d,n,Lb.z,k)}else e.visible&&y.push(a,d,e,Lb.z,null)}a=a.children;g=0;for(h=a.length;g<h;g++)m(a[g],b,c)}}function v(a,b,c,d){for(var e=0,f=a.length;e<f;e++){var g=a[e],h=g.object,k=g.geometry,m=void 0===d?g.material:d;g=g.group;if(c.isArrayCamera){O= +c;for(var v=c.cameras,u=0,l=v.length;u<l;u++){var q=v[u];if(h.layers.test(q.layers)){var r=q.bounds;ba.viewport(R.set(r.x*J,r.y*V,r.z*J,r.w*V).multiplyScalar(Q));n(h,b,q,k,m,g)}}}else O=null,n(h,b,c,k,m,g)}}function n(a,b,c,d,e,f){a.onBeforeRender(z,b,c,d,e,f);D=ra.get(b,O||c);a.modelViewMatrix.multiplyMatrices(c.matrixWorldInverse,a.matrixWorld);a.normalMatrix.getNormalMatrix(a.modelViewMatrix);if(a.isImmediateRenderObject){var h=a.isMesh&&0>a.matrixWorld.determinant();ba.setMaterial(e,h);h=q(c, +b.fog,e,a);ma="";g(a,h,e)}else z.renderBufferDirect(c,b.fog,d,e,a,f);a.onAfterRender(z,b,c,d,e,f);D=ra.get(b,O||c)}function u(a,b,c){var d=W.get(a),g=D.state.lights;c=qa.getParameters(a,g.state,D.state.shadowsArray,b,Ga.numPlanes,Ga.numIntersection,c);var h=qa.getProgramCode(a,c),k=d.program,m=!0;if(void 0===k)a.addEventListener("dispose",e);else if(k.code!==h)f(a);else{if(d.lightsHash!==g.state.hash)W.update(a,"lightsHash",g.state.hash);else if(void 0!==c.shaderID)return;m=!1}m&&(c.shaderID?(k=qb[c.shaderID], +d.shader={name:a.type,uniforms:Ea.clone(k.uniforms),vertexShader:k.vertexShader,fragmentShader:k.fragmentShader}):d.shader={name:a.type,uniforms:a.uniforms,vertexShader:a.vertexShader,fragmentShader:a.fragmentShader},a.onBeforeCompile(d.shader),k=qa.acquireProgram(a,d.shader,c,h),d.program=k,a.program=k);c=k.getAttributes();if(a.morphTargets)for(h=a.numSupportedMorphTargets=0;h<z.maxMorphTargets;h++)0<=c["morphTarget"+h]&&a.numSupportedMorphTargets++;if(a.morphNormals)for(h=a.numSupportedMorphNormals= +0;h<z.maxMorphNormals;h++)0<=c["morphNormal"+h]&&a.numSupportedMorphNormals++;c=d.shader.uniforms;if(!a.isShaderMaterial&&!a.isRawShaderMaterial||!0===a.clipping)d.numClippingPlanes=Ga.numPlanes,d.numIntersection=Ga.numIntersection,c.clippingPlanes=Ga.uniform;d.fog=b;d.lightsHash=g.state.hash;a.lights&&(c.ambientLightColor.value=g.state.ambient,c.directionalLights.value=g.state.directional,c.spotLights.value=g.state.spot,c.rectAreaLights.value=g.state.rectArea,c.pointLights.value=g.state.point,c.hemisphereLights.value= +g.state.hemi,c.directionalShadowMap.value=g.state.directionalShadowMap,c.directionalShadowMatrix.value=g.state.directionalShadowMatrix,c.spotShadowMap.value=g.state.spotShadowMap,c.spotShadowMatrix.value=g.state.spotShadowMatrix,c.pointShadowMap.value=g.state.pointShadowMap,c.pointShadowMatrix.value=g.state.pointShadowMatrix);a=d.program.getUniforms();a=cb.seqWithValue(a.seq,c);d.uniformsList=a}function q(a,b,c,d){aa=0;var e=W.get(c),f=D.state.lights;md&&(la||a!==M)&&Ga.setState(c.clippingPlanes, +c.clipIntersection,c.clipShadows,a,e,a===M&&c.id===T);!1===c.needsUpdate&&(void 0===e.program?c.needsUpdate=!0:c.fog&&e.fog!==b?c.needsUpdate=!0:c.lights&&e.lightsHash!==f.state.hash?c.needsUpdate=!0:void 0===e.numClippingPlanes||e.numClippingPlanes===Ga.numPlanes&&e.numIntersection===Ga.numIntersection||(c.needsUpdate=!0));c.needsUpdate&&(u(c,b,d),c.needsUpdate=!1);var g=!1,h=!1,k=!1;f=e.program;var m=f.getUniforms(),n=e.shader.uniforms;ba.useProgram(f.program)&&(k=h=g=!0);c.id!==T&&(T=c.id,h=!0); +if(g||a!==M){m.setValue(E,"projectionMatrix",a.projectionMatrix);da.logarithmicDepthBuffer&&m.setValue(E,"logDepthBufFC",2/(Math.log(a.far+1)/Math.LN2));M!==(O||a)&&(M=O||a,k=h=!0);if(c.isShaderMaterial||c.isMeshPhongMaterial||c.isMeshStandardMaterial||c.envMap)g=m.map.cameraPosition,void 0!==g&&g.setValue(E,Lb.setFromMatrixPosition(a.matrixWorld));(c.isMeshPhongMaterial||c.isMeshLambertMaterial||c.isMeshBasicMaterial||c.isMeshStandardMaterial||c.isShaderMaterial||c.skinning)&&m.setValue(E,"viewMatrix", +a.matrixWorldInverse)}if(c.skinning&&(m.setOptional(E,d,"bindMatrix"),m.setOptional(E,d,"bindMatrixInverse"),a=d.skeleton))if(g=a.bones,da.floatVertexTextures){if(void 0===a.boneTexture){g=Math.sqrt(4*g.length);g=S.ceilPowerOfTwo(g);g=Math.max(g,4);var v=new Float32Array(g*g*4);v.set(a.boneMatrices);var q=new kb(v,g,g,1023,1015);q.needsUpdate=!0;a.boneMatrices=v;a.boneTexture=q;a.boneTextureSize=g}m.setValue(E,"boneTexture",a.boneTexture);m.setValue(E,"boneTextureSize",a.boneTextureSize)}else m.setOptional(E, +a,"boneMatrices");h&&(m.setValue(E,"toneMappingExposure",z.toneMappingExposure),m.setValue(E,"toneMappingWhitePoint",z.toneMappingWhitePoint),c.lights&&(h=k,n.ambientLightColor.needsUpdate=h,n.directionalLights.needsUpdate=h,n.pointLights.needsUpdate=h,n.spotLights.needsUpdate=h,n.rectAreaLights.needsUpdate=h,n.hemisphereLights.needsUpdate=h),b&&c.fog&&(n.fogColor.value=b.color,b.isFog?(n.fogNear.value=b.near,n.fogFar.value=b.far):b.isFogExp2&&(n.fogDensity.value=b.density)),c.isMeshBasicMaterial? +l(n,c):c.isMeshLambertMaterial?(l(n,c),c.emissiveMap&&(n.emissiveMap.value=c.emissiveMap)):c.isMeshPhongMaterial?(l(n,c),c.isMeshToonMaterial?(t(n,c),c.gradientMap&&(n.gradientMap.value=c.gradientMap)):t(n,c)):c.isMeshStandardMaterial?(l(n,c),c.isMeshPhysicalMaterial&&(n.clearCoat.value=c.clearCoat,n.clearCoatRoughness.value=c.clearCoatRoughness),n.roughness.value=c.roughness,n.metalness.value=c.metalness,c.roughnessMap&&(n.roughnessMap.value=c.roughnessMap),c.metalnessMap&&(n.metalnessMap.value= +c.metalnessMap),c.emissiveMap&&(n.emissiveMap.value=c.emissiveMap),c.bumpMap&&(n.bumpMap.value=c.bumpMap,n.bumpScale.value=c.bumpScale),c.normalMap&&(n.normalMap.value=c.normalMap,n.normalScale.value.copy(c.normalScale)),c.displacementMap&&(n.displacementMap.value=c.displacementMap,n.displacementScale.value=c.displacementScale,n.displacementBias.value=c.displacementBias),c.envMap&&(n.envMapIntensity.value=c.envMapIntensity)):c.isMeshDepthMaterial?(l(n,c),c.displacementMap&&(n.displacementMap.value= +c.displacementMap,n.displacementScale.value=c.displacementScale,n.displacementBias.value=c.displacementBias)):c.isMeshDistanceMaterial?(l(n,c),c.displacementMap&&(n.displacementMap.value=c.displacementMap,n.displacementScale.value=c.displacementScale,n.displacementBias.value=c.displacementBias),n.referencePosition.value.copy(c.referencePosition),n.nearDistance.value=c.nearDistance,n.farDistance.value=c.farDistance):c.isMeshNormalMaterial?(l(n,c),c.bumpMap&&(n.bumpMap.value=c.bumpMap,n.bumpScale.value= +c.bumpScale),c.normalMap&&(n.normalMap.value=c.normalMap,n.normalScale.value.copy(c.normalScale)),c.displacementMap&&(n.displacementMap.value=c.displacementMap,n.displacementScale.value=c.displacementScale,n.displacementBias.value=c.displacementBias)):c.isLineBasicMaterial?(n.diffuse.value=c.color,n.opacity.value=c.opacity,c.isLineDashedMaterial&&(n.dashSize.value=c.dashSize,n.totalSize.value=c.dashSize+c.gapSize,n.scale.value=c.scale)):c.isPointsMaterial?(n.diffuse.value=c.color,n.opacity.value= +c.opacity,n.size.value=c.size*Q,n.scale.value=.5*V,n.map.value=c.map,null!==c.map&&(!0===c.map.matrixAutoUpdate&&(b=c.map.offset,h=c.map.repeat,k=c.map.center,c.map.matrix.setUvTransform(b.x,b.y,h.x,h.y,c.map.rotation,k.x,k.y)),n.uvTransform.value.copy(c.map.matrix))):c.isShadowMaterial&&(n.color.value=c.color,n.opacity.value=c.opacity),void 0!==n.ltc_1&&(n.ltc_1.value=I.LTC_1),void 0!==n.ltc_2&&(n.ltc_2.value=I.LTC_2),cb.upload(E,e.uniformsList,n,z));c.isShaderMaterial&&!0===c.uniformsNeedUpdate&& +(cb.upload(E,e.uniformsList,n,z),c.uniformsNeedUpdate=!1);m.setValue(E,"modelViewMatrix",d.modelViewMatrix);m.setValue(E,"normalMatrix",d.normalMatrix);m.setValue(E,"modelMatrix",d.matrixWorld);return f}function l(a,b){a.opacity.value=b.opacity;b.color&&(a.diffuse.value=b.color);b.emissive&&a.emissive.value.copy(b.emissive).multiplyScalar(b.emissiveIntensity);b.map&&(a.map.value=b.map);b.alphaMap&&(a.alphaMap.value=b.alphaMap);b.specularMap&&(a.specularMap.value=b.specularMap);b.envMap&&(a.envMap.value= +b.envMap,a.flipEnvMap.value=b.envMap&&b.envMap.isCubeTexture?-1:1,a.reflectivity.value=b.reflectivity,a.refractionRatio.value=b.refractionRatio);b.lightMap&&(a.lightMap.value=b.lightMap,a.lightMapIntensity.value=b.lightMapIntensity);b.aoMap&&(a.aoMap.value=b.aoMap,a.aoMapIntensity.value=b.aoMapIntensity);if(b.map)var c=b.map;else b.specularMap?c=b.specularMap:b.displacementMap?c=b.displacementMap:b.normalMap?c=b.normalMap:b.bumpMap?c=b.bumpMap:b.roughnessMap?c=b.roughnessMap:b.metalnessMap?c=b.metalnessMap: +b.alphaMap?c=b.alphaMap:b.emissiveMap&&(c=b.emissiveMap);if(void 0!==c){c.isWebGLRenderTarget&&(c=c.texture);if(!0===c.matrixAutoUpdate){b=c.offset;var d=c.repeat,e=c.center;c.matrix.setUvTransform(b.x,b.y,d.x,d.y,c.rotation,e.x,e.y)}a.uvTransform.value.copy(c.matrix)}}function t(a,b){a.specular.value=b.specular;a.shininess.value=Math.max(b.shininess,1E-4);b.emissiveMap&&(a.emissiveMap.value=b.emissiveMap);b.bumpMap&&(a.bumpMap.value=b.bumpMap,a.bumpScale.value=b.bumpScale);b.normalMap&&(a.normalMap.value= +b.normalMap,a.normalScale.value.copy(b.normalScale));b.displacementMap&&(a.displacementMap.value=b.displacementMap,a.displacementScale.value=b.displacementScale,a.displacementBias.value=b.displacementBias)}console.log("THREE.WebGLRenderer","90");a=a||{};var x=void 0!==a.canvas?a.canvas:document.createElementNS("http://www.w3.org/1999/xhtml","canvas"),B=void 0!==a.context?a.context:null,w=void 0!==a.alpha?a.alpha:!1,A=void 0!==a.depth?a.depth:!0,G=void 0!==a.stencil?a.stencil:!0,N=void 0!==a.antialias? +a.antialias:!1,Z=void 0!==a.premultipliedAlpha?a.premultipliedAlpha:!0,F=void 0!==a.preserveDrawingBuffer?a.preserveDrawingBuffer:!1,C=void 0!==a.powerPreference?a.powerPreference:"default",y=null,D=null;this.domElement=x;this.context=null;this.sortObjects=this.autoClearStencil=this.autoClearDepth=this.autoClearColor=this.autoClear=!0;this.clippingPlanes=[];this.localClippingEnabled=!1;this.gammaFactor=2;this.physicallyCorrectLights=this.gammaOutput=this.gammaInput=!1;this.toneMappingWhitePoint=this.toneMappingExposure= +this.toneMapping=1;this.maxMorphTargets=8;this.maxMorphNormals=4;var z=this,H=!1,K=null,L=null,T=-1,ma="",M=null,O=null,R=new X,Y=new X,U=null,aa=0,J=x.width,V=x.height,Q=1,ea=new X(0,0,J,V),ca=new X(0,0,J,V),na=!1,ha=new ld,Ga=new Ag,md=!1,la=!1,nd=new P,Lb=new p,Wd={geometries:0,textures:0},Ra={frame:0,calls:0,vertices:0,faces:0,points:0};this.info={render:Ra,memory:Wd,programs:null,autoReset:!0,reset:function(){Ra.frame++;Ra.calls=0;Ra.vertices=0;Ra.faces=0;Ra.points=0}};try{w={alpha:w,depth:A, +stencil:G,antialias:N,premultipliedAlpha:Z,preserveDrawingBuffer:F,powerPreference:C};x.addEventListener("webglcontextlost",c,!1);x.addEventListener("webglcontextrestored",d,!1);var E=B||x.getContext("webgl",w)||x.getContext("experimental-webgl",w);if(null===E){if(null!==x.getContext("webgl"))throw Error("Error creating WebGL context with your selected attributes.");throw Error("Error creating WebGL context.");}void 0===E.getShaderPrecisionFormat&&(E.getShaderPrecisionFormat=function(){return{rangeMin:1, +rangeMax:1,precision:1}})}catch(Gg){console.error("THREE.WebGLRenderer: "+Gg.message)}var ja,da,ba,W,fa,sa,ta,ua,qa,va,ra,ka,xa,za,Aa,Ba,oa;b();var pa=new Ve(z);this.vr=pa;var Da=new Oe(z,ua,da.maxTextureSize);this.shadowMap=Da;this.getContext=function(){return E};this.getContextAttributes=function(){return E.getContextAttributes()};this.forceContextLoss=function(){var a=ja.get("WEBGL_lose_context");a&&a.loseContext()};this.forceContextRestore=function(){var a=ja.get("WEBGL_lose_context");a&&a.restoreContext()}; +this.getPixelRatio=function(){return Q};this.setPixelRatio=function(a){void 0!==a&&(Q=a,this.setSize(J,V,!1))};this.getSize=function(){return{width:J,height:V}};this.setSize=function(a,b,c){var d=pa.getDevice();d&&d.isPresenting?console.warn("THREE.WebGLRenderer: Can't change size while VR device is presenting."):(J=a,V=b,x.width=a*Q,x.height=b*Q,!1!==c&&(x.style.width=a+"px",x.style.height=b+"px"),this.setViewport(0,0,a,b))};this.getDrawingBufferSize=function(){return{width:J*Q,height:V*Q}};this.setDrawingBufferSize= +function(a,b,c){J=a;V=b;Q=c;x.width=a*c;x.height=b*c;this.setViewport(0,0,a,b)};this.getCurrentViewport=function(){return R};this.setViewport=function(a,b,c,d){ea.set(a,V-b-d,c,d);ba.viewport(R.copy(ea).multiplyScalar(Q))};this.setScissor=function(a,b,c,d){ca.set(a,V-b-d,c,d);ba.scissor(Y.copy(ca).multiplyScalar(Q))};this.setScissorTest=function(a){ba.setScissorTest(na=a)};this.getClearColor=function(){return ka.getClearColor()};this.setClearColor=function(){ka.setClearColor.apply(ka,arguments)}; +this.getClearAlpha=function(){return ka.getClearAlpha()};this.setClearAlpha=function(){ka.setClearAlpha.apply(ka,arguments)};this.clear=function(a,b,c){var d=0;if(void 0===a||a)d|=E.COLOR_BUFFER_BIT;if(void 0===b||b)d|=E.DEPTH_BUFFER_BIT;if(void 0===c||c)d|=E.STENCIL_BUFFER_BIT;E.clear(d)};this.clearColor=function(){this.clear(!0,!1,!1)};this.clearDepth=function(){this.clear(!1,!0,!1)};this.clearStencil=function(){this.clear(!1,!1,!0)};this.clearTarget=function(a,b,c,d){this.setRenderTarget(a);this.clear(b, +c,d)};this.dispose=function(){x.removeEventListener("webglcontextlost",c,!1);x.removeEventListener("webglcontextrestored",d,!1);va.dispose();ra.dispose();W.dispose();ua.dispose();pa.dispose();wa=!1};this.renderBufferImmediate=function(a,b,c){ba.initAttributes();var d=W.get(a);a.hasPositions&&!d.position&&(d.position=E.createBuffer());a.hasNormals&&!d.normal&&(d.normal=E.createBuffer());a.hasUvs&&!d.uv&&(d.uv=E.createBuffer());a.hasColors&&!d.color&&(d.color=E.createBuffer());b=b.getAttributes();a.hasPositions&& +(E.bindBuffer(E.ARRAY_BUFFER,d.position),E.bufferData(E.ARRAY_BUFFER,a.positionArray,E.DYNAMIC_DRAW),ba.enableAttribute(b.position),E.vertexAttribPointer(b.position,3,E.FLOAT,!1,0,0));if(a.hasNormals){E.bindBuffer(E.ARRAY_BUFFER,d.normal);if(!c.isMeshPhongMaterial&&!c.isMeshStandardMaterial&&!c.isMeshNormalMaterial&&!0===c.flatShading)for(var e=0,f=3*a.count;e<f;e+=9){var g=a.normalArray,h=(g[e+0]+g[e+3]+g[e+6])/3,k=(g[e+1]+g[e+4]+g[e+7])/3,m=(g[e+2]+g[e+5]+g[e+8])/3;g[e+0]=h;g[e+1]=k;g[e+2]=m;g[e+ +3]=h;g[e+4]=k;g[e+5]=m;g[e+6]=h;g[e+7]=k;g[e+8]=m}E.bufferData(E.ARRAY_BUFFER,a.normalArray,E.DYNAMIC_DRAW);ba.enableAttribute(b.normal);E.vertexAttribPointer(b.normal,3,E.FLOAT,!1,0,0)}a.hasUvs&&c.map&&(E.bindBuffer(E.ARRAY_BUFFER,d.uv),E.bufferData(E.ARRAY_BUFFER,a.uvArray,E.DYNAMIC_DRAW),ba.enableAttribute(b.uv),E.vertexAttribPointer(b.uv,2,E.FLOAT,!1,0,0));a.hasColors&&0!==c.vertexColors&&(E.bindBuffer(E.ARRAY_BUFFER,d.color),E.bufferData(E.ARRAY_BUFFER,a.colorArray,E.DYNAMIC_DRAW),ba.enableAttribute(b.color), +E.vertexAttribPointer(b.color,3,E.FLOAT,!1,0,0));ba.disableUnusedAttributes();E.drawArrays(E.TRIANGLES,0,a.count);a.count=0};this.renderBufferDirect=function(a,b,c,d,e,f){var g=e.isMesh&&0>e.matrixWorld.determinant();ba.setMaterial(d,g);var h=q(a,b,d,e);a=c.id+"_"+h.id+"_"+(!0===d.wireframe);var k=!1;a!==ma&&(ma=a,k=!0);e.morphTargetInfluences&&(xa.update(e,c,d,h),k=!0);g=c.index;var m=c.attributes.position;b=1;!0===d.wireframe&&(g=ta.getWireframeAttribute(c),b=2);a=za;if(null!==g){var n=sa.get(g); +a=Aa;a.setIndex(n)}if(k){k=void 0;if(c&&c.isInstancedBufferGeometry&&null===ja.get("ANGLE_instanced_arrays"))console.error("THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");else{void 0===k&&(k=0);ba.initAttributes();var v=c.attributes;h=h.getAttributes();var u=d.defaultAttributeValues;for(N in h){var l=h[N];if(0<=l){var r=v[N];if(void 0!==r){var t=r.normalized,p=r.itemSize,x=sa.get(r);if(void 0!==x){var w= +x.buffer,A=x.type;x=x.bytesPerElement;if(r.isInterleavedBufferAttribute){var B=r.data,G=B.stride;r=r.offset;B&&B.isInstancedInterleavedBuffer?(ba.enableAttributeAndDivisor(l,B.meshPerAttribute),void 0===c.maxInstancedCount&&(c.maxInstancedCount=B.meshPerAttribute*B.count)):ba.enableAttribute(l);E.bindBuffer(E.ARRAY_BUFFER,w);E.vertexAttribPointer(l,p,A,t,G*x,(k*G+r)*x)}else r.isInstancedBufferAttribute?(ba.enableAttributeAndDivisor(l,r.meshPerAttribute),void 0===c.maxInstancedCount&&(c.maxInstancedCount= +r.meshPerAttribute*r.count)):ba.enableAttribute(l),E.bindBuffer(E.ARRAY_BUFFER,w),E.vertexAttribPointer(l,p,A,t,0,k*p*x)}}else if(void 0!==u&&(t=u[N],void 0!==t))switch(t.length){case 2:E.vertexAttrib2fv(l,t);break;case 3:E.vertexAttrib3fv(l,t);break;case 4:E.vertexAttrib4fv(l,t);break;default:E.vertexAttrib1fv(l,t)}}}ba.disableUnusedAttributes()}null!==g&&E.bindBuffer(E.ELEMENT_ARRAY_BUFFER,n.buffer)}n=Infinity;null!==g?n=g.count:void 0!==m&&(n=m.count);g=c.drawRange.start*b;m=null!==f?f.start*b: +0;var N=Math.max(g,m);f=Math.max(0,Math.min(n,g+c.drawRange.count*b,m+(null!==f?f.count*b:Infinity))-1-N+1);if(0!==f){if(e.isMesh)if(!0===d.wireframe)ba.setLineWidth(d.wireframeLinewidth*(null===K?Q:1)),a.setMode(E.LINES);else switch(e.drawMode){case 0:a.setMode(E.TRIANGLES);break;case 1:a.setMode(E.TRIANGLE_STRIP);break;case 2:a.setMode(E.TRIANGLE_FAN)}else e.isLine?(d=d.linewidth,void 0===d&&(d=1),ba.setLineWidth(d*(null===K?Q:1)),e.isLineSegments?a.setMode(E.LINES):e.isLineLoop?a.setMode(E.LINE_LOOP): +a.setMode(E.LINE_STRIP)):e.isPoints&&a.setMode(E.POINTS);c&&c.isInstancedBufferGeometry?0<c.maxInstancedCount&&a.renderInstances(c,N,f):a.render(N,f)}};this.compile=function(a,b){D=ra.get(a,b);D.init();a.traverse(function(a){a.isLight&&(D.pushLight(a),a.castShadow&&D.pushShadow(a))});D.setupLights(b);a.traverse(function(b){if(b.material)if(Array.isArray(b.material))for(var c=0;c<b.material.length;c++)u(b.material[c],a.fog,b);else u(b.material,a.fog,b)})};var wa=!1,Ca=null;this.animate=function(a){Ca= +a;null!==Ca?wa||(h(),wa=!0):wa=!1};this.render=function(a,b,c,d){if(!b||!b.isCamera)console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.");else if(!H){ma="";T=-1;M=null;!0===a.autoUpdate&&a.updateMatrixWorld();null===b.parent&&b.updateMatrixWorld();pa.enabled&&(b=pa.getCamera(b));D=ra.get(a,b);D.init();a.onBeforeRender(z,a,b,c);nd.multiplyMatrices(b.projectionMatrix,b.matrixWorldInverse);ha.setFromMatrix(nd);la=this.localClippingEnabled;md=Ga.init(this.clippingPlanes, +la,b);y=va.get(a,b);y.init();m(a,b,z.sortObjects);!0===z.sortObjects&&y.sort();md&&Ga.beginShadows();Da.render(D.state.shadowsArray,a,b);D.setupLights(b);md&&Ga.endShadows();this.info.autoReset&&this.info.reset();void 0===c&&(c=null);this.setRenderTarget(c);ka.render(y,a,b,d);d=y.opaque;var e=y.transparent;if(a.overrideMaterial){var f=a.overrideMaterial;d.length&&v(d,a,b,f);e.length&&v(e,a,b,f)}else d.length&&v(d,a,b),e.length&&v(e,a,b);Ba.render(D.state.spritesArray,a,b);c&&fa.updateRenderTargetMipmap(c); +ba.buffers.depth.setTest(!0);ba.buffers.depth.setMask(!0);ba.buffers.color.setMask(!0);ba.setPolygonOffset(!1);a.onAfterRender(z,a,b);pa.enabled&&pa.submitFrame();D=y=null}};this.allocTextureUnit=function(){var a=aa;a>=da.maxTextures&&console.warn("THREE.WebGLRenderer: Trying to use "+a+" texture units while this GPU supports only "+da.maxTextures);aa+=1;return a};this.setTexture2D=function(){var a=!1;return function(b,c){b&&b.isWebGLRenderTarget&&(a||(console.warn("THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead."), +a=!0),b=b.texture);fa.setTexture2D(b,c)}}();this.setTexture=function(){var a=!1;return function(b,c){a||(console.warn("THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead."),a=!0);fa.setTexture2D(b,c)}}();this.setTextureCube=function(){var a=!1;return function(b,c){b&&b.isWebGLRenderTargetCube&&(a||(console.warn("THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead."),a=!0),b=b.texture);b&&b.isCubeTexture||Array.isArray(b.image)&& +6===b.image.length?fa.setTextureCube(b,c):fa.setTextureCubeDynamic(b,c)}}();this.getRenderTarget=function(){return K};this.setRenderTarget=function(a){(K=a)&&void 0===W.get(a).__webglFramebuffer&&fa.setupRenderTarget(a);var b=null,c=!1;a?(b=W.get(a).__webglFramebuffer,a.isWebGLRenderTargetCube&&(b=b[a.activeCubeFace],c=!0),R.copy(a.viewport),Y.copy(a.scissor),U=a.scissorTest):(R.copy(ea).multiplyScalar(Q),Y.copy(ca).multiplyScalar(Q),U=na);L!==b&&(E.bindFramebuffer(E.FRAMEBUFFER,b),L=b);ba.viewport(R); +ba.scissor(Y);ba.setScissorTest(U);c&&(c=W.get(a.texture),E.framebufferTexture2D(E.FRAMEBUFFER,E.COLOR_ATTACHMENT0,E.TEXTURE_CUBE_MAP_POSITIVE_X+a.activeCubeFace,c.__webglTexture,a.activeMipMapLevel))};this.readRenderTargetPixels=function(a,b,c,d,e,f){if(a&&a.isWebGLRenderTarget){var g=W.get(a).__webglFramebuffer;if(g){var h=!1;g!==L&&(E.bindFramebuffer(E.FRAMEBUFFER,g),h=!0);try{var k=a.texture,m=k.format,n=k.type;1023!==m&&oa.convert(m)!==E.getParameter(E.IMPLEMENTATION_COLOR_READ_FORMAT)?console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format."): +1009===n||oa.convert(n)===E.getParameter(E.IMPLEMENTATION_COLOR_READ_TYPE)||1015===n&&(ja.get("OES_texture_float")||ja.get("WEBGL_color_buffer_float"))||1016===n&&ja.get("EXT_color_buffer_half_float")?E.checkFramebufferStatus(E.FRAMEBUFFER)===E.FRAMEBUFFER_COMPLETE?0<=b&&b<=a.width-d&&0<=c&&c<=a.height-e&&E.readPixels(b,c,d,e,oa.convert(m),oa.convert(n),f):console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete."):console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.")}finally{h&& +E.bindFramebuffer(E.FRAMEBUFFER,L)}}}else console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.")};this.copyFramebufferToTexture=function(a,b,c){var d=b.image.width,e=b.image.height,f=oa.convert(b.format);this.setTexture2D(b,0);E.copyTexImage2D(E.TEXTURE_2D,c||0,f,a.x,a.y,d,e,0)}}function Mb(a,b){this.name="";this.color=new H(a);this.density=void 0!==b?b:2.5E-4}function Nb(a,b,c){this.name="";this.color=new H(a);this.near=void 0!==b?b:1;this.far=void 0!== +c?c:1E3}function pd(){y.call(this);this.type="Scene";this.overrideMaterial=this.fog=this.background=null;this.autoUpdate=!0}function gb(a){O.call(this);this.type="SpriteMaterial";this.color=new H(16777215);this.map=null;this.rotation=0;this.lights=this.fog=!1;this.setValues(a)}function zc(a){y.call(this);this.type="Sprite";this.material=void 0!==a?a:new gb;this.center=new C(.5,.5)}function Ac(){y.call(this);this.type="LOD";Object.defineProperties(this,{levels:{enumerable:!0,value:[]}})}function Bc(a, +b){a=a||[];this.bones=a.slice(0);this.boneMatrices=new Float32Array(16*this.bones.length);if(void 0===b)this.calculateInverses();else if(this.bones.length===b.length)this.boneInverses=b.slice(0);else for(console.warn("THREE.Skeleton boneInverses is the wrong length."),this.boneInverses=[],a=0,b=this.bones.length;a<b;a++)this.boneInverses.push(new P)}function qd(){y.call(this);this.type="Bone"}function rd(a,b){ua.call(this,a,b);this.type="SkinnedMesh";this.bindMode="attached";this.bindMatrix=new P; +this.bindMatrixInverse=new P;a=this.initBones();a=new Bc(a);this.bind(a,this.matrixWorld);this.normalizeSkinWeights()}function Y(a){O.call(this);this.type="LineBasicMaterial";this.color=new H(16777215);this.linewidth=1;this.linejoin=this.linecap="round";this.lights=!1;this.setValues(a)}function qa(a,b,c){if(1===c)return console.warn("THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead."),new U(a,b);y.call(this);this.type="Line";this.geometry=void 0!==a?a: +new z;this.material=void 0!==b?b:new Y({color:16777215*Math.random()})}function U(a,b){qa.call(this,a,b);this.type="LineSegments"}function sd(a,b){qa.call(this,a,b);this.type="LineLoop"}function Ha(a){O.call(this);this.type="PointsMaterial";this.color=new H(16777215);this.map=null;this.size=1;this.sizeAttenuation=!0;this.lights=!1;this.setValues(a)}function Ob(a,b){y.call(this);this.type="Points";this.geometry=void 0!==a?a:new z;this.material=void 0!==b?b:new Ha({color:16777215*Math.random()})}function td(){y.call(this); +this.type="Group"}function Yd(a,b,c,d,e,f,g,h,k){aa.call(this,a,b,c,d,e,f,g,h,k);this.generateMipmaps=!1}function Pb(a,b,c,d,e,f,g,h,k,m,v,n){aa.call(this,null,f,g,h,k,m,d,e,v,n);this.image={width:b,height:c};this.mipmaps=a;this.generateMipmaps=this.flipY=!1}function Cc(a,b,c,d,e,f,g,h,k,m){m=void 0!==m?m:1026;if(1026!==m&&1027!==m)throw Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");void 0===c&&1026===m&&(c=1012);void 0===c&&1027===m&&(c=1020);aa.call(this, +null,d,e,f,g,h,m,c,k);this.image={width:a,height:b};this.magFilter=void 0!==g?g:1003;this.minFilter=void 0!==h?h:1003;this.generateMipmaps=this.flipY=!1}function Qb(a){z.call(this);this.type="WireframeGeometry";var b=[],c,d,e,f=[0,0],g={},h=["a","b","c"];if(a&&a.isGeometry){var k=a.faces;var m=0;for(d=k.length;m<d;m++){var v=k[m];for(c=0;3>c;c++){var n=v[h[c]];var u=v[h[(c+1)%3]];f[0]=Math.min(n,u);f[1]=Math.max(n,u);n=f[0]+","+f[1];void 0===g[n]&&(g[n]={index1:f[0],index2:f[1]})}}for(n in g)m=g[n], +h=a.vertices[m.index1],b.push(h.x,h.y,h.z),h=a.vertices[m.index2],b.push(h.x,h.y,h.z)}else if(a&&a.isBufferGeometry)if(h=new p,null!==a.index){k=a.attributes.position;v=a.index;var l=a.groups;0===l.length&&(l=[{start:0,count:v.count,materialIndex:0}]);a=0;for(e=l.length;a<e;++a)for(m=l[a],c=m.start,d=m.count,m=c,d=c+d;m<d;m+=3)for(c=0;3>c;c++)n=v.getX(m+c),u=v.getX(m+(c+1)%3),f[0]=Math.min(n,u),f[1]=Math.max(n,u),n=f[0]+","+f[1],void 0===g[n]&&(g[n]={index1:f[0],index2:f[1]});for(n in g)m=g[n],h.fromBufferAttribute(k, +m.index1),b.push(h.x,h.y,h.z),h.fromBufferAttribute(k,m.index2),b.push(h.x,h.y,h.z)}else for(k=a.attributes.position,m=0,d=k.count/3;m<d;m++)for(c=0;3>c;c++)g=3*m+c,h.fromBufferAttribute(k,g),b.push(h.x,h.y,h.z),g=3*m+(c+1)%3,h.fromBufferAttribute(k,g),b.push(h.x,h.y,h.z);this.addAttribute("position",new D(b,3))}function Dc(a,b,c){L.call(this);this.type="ParametricGeometry";this.parameters={func:a,slices:b,stacks:c};this.fromBufferGeometry(new Rb(a,b,c));this.mergeVertices()}function Rb(a,b,c){z.call(this); +this.type="ParametricBufferGeometry";this.parameters={func:a,slices:b,stacks:c};var d=[],e=[],f=[],g=[],h=new p,k=new p,m=new p,v=new p,n=new p,u,l,r=b+1;for(u=0;u<=c;u++){var t=u/c;for(l=0;l<=b;l++){var x=l/b;k=a(x,t,k);e.push(k.x,k.y,k.z);0<=x-1E-5?(m=a(x-1E-5,t,m),v.subVectors(k,m)):(m=a(x+1E-5,t,m),v.subVectors(m,k));0<=t-1E-5?(m=a(x,t-1E-5,m),n.subVectors(k,m)):(m=a(x,t+1E-5,m),n.subVectors(m,k));h.crossVectors(v,n).normalize();f.push(h.x,h.y,h.z);g.push(x,t)}}for(u=0;u<c;u++)for(l=0;l<b;l++)a= +u*r+l+1,h=(u+1)*r+l+1,k=(u+1)*r+l,d.push(u*r+l,a,k),d.push(a,h,k);this.setIndex(d);this.addAttribute("position",new D(e,3));this.addAttribute("normal",new D(f,3));this.addAttribute("uv",new D(g,2))}function Ec(a,b,c,d){L.call(this);this.type="PolyhedronGeometry";this.parameters={vertices:a,indices:b,radius:c,detail:d};this.fromBufferGeometry(new va(a,b,c,d));this.mergeVertices()}function va(a,b,c,d){function e(a){h.push(a.x,a.y,a.z)}function f(b,c){b*=3;c.x=a[b+0];c.y=a[b+1];c.z=a[b+2]}function g(a, +b,c,d){0>d&&1===a.x&&(k[b]=a.x-1);0===c.x&&0===c.z&&(k[b]=d/2/Math.PI+.5)}z.call(this);this.type="PolyhedronBufferGeometry";this.parameters={vertices:a,indices:b,radius:c,detail:d};c=c||1;d=d||0;var h=[],k=[];(function(a){for(var c=new p,d=new p,g=new p,h=0;h<b.length;h+=3){f(b[h+0],c);f(b[h+1],d);f(b[h+2],g);var k,m,l=c,B=d,w=g,A=Math.pow(2,a),G=[];for(m=0;m<=A;m++){G[m]=[];var N=l.clone().lerp(w,m/A),Z=B.clone().lerp(w,m/A),F=A-m;for(k=0;k<=F;k++)G[m][k]=0===k&&m===A?N:N.clone().lerp(Z,k/F)}for(m= +0;m<A;m++)for(k=0;k<2*(A-m)-1;k++)l=Math.floor(k/2),0===k%2?(e(G[m][l+1]),e(G[m+1][l]),e(G[m][l])):(e(G[m][l+1]),e(G[m+1][l+1]),e(G[m+1][l]))}})(d);(function(a){for(var b=new p,c=0;c<h.length;c+=3)b.x=h[c+0],b.y=h[c+1],b.z=h[c+2],b.normalize().multiplyScalar(a),h[c+0]=b.x,h[c+1]=b.y,h[c+2]=b.z})(c);(function(){for(var a=new p,b=0;b<h.length;b+=3)a.x=h[b+0],a.y=h[b+1],a.z=h[b+2],k.push(Math.atan2(a.z,-a.x)/2/Math.PI+.5,1-(Math.atan2(-a.y,Math.sqrt(a.x*a.x+a.z*a.z))/Math.PI+.5));a=new p;b=new p;for(var c= +new p,d=new p,e=new C,f=new C,l=new C,x=0,B=0;x<h.length;x+=9,B+=6){a.set(h[x+0],h[x+1],h[x+2]);b.set(h[x+3],h[x+4],h[x+5]);c.set(h[x+6],h[x+7],h[x+8]);e.set(k[B+0],k[B+1]);f.set(k[B+2],k[B+3]);l.set(k[B+4],k[B+5]);d.copy(a).add(b).add(c).divideScalar(3);var w=Math.atan2(d.z,-d.x);g(e,B+0,a,w);g(f,B+2,b,w);g(l,B+4,c,w)}for(a=0;a<k.length;a+=6)b=k[a+0],c=k[a+2],d=k[a+4],e=Math.min(b,c,d),.9<Math.max(b,c,d)&&.1>e&&(.2>b&&(k[a+0]+=1),.2>c&&(k[a+2]+=1),.2>d&&(k[a+4]+=1))})();this.addAttribute("position", +new D(h,3));this.addAttribute("normal",new D(h.slice(),3));this.addAttribute("uv",new D(k,2));0===d?this.computeVertexNormals():this.normalizeNormals()}function Fc(a,b){L.call(this);this.type="TetrahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Sb(a,b));this.mergeVertices()}function Sb(a,b){va.call(this,[1,1,1,-1,-1,1,-1,1,-1,1,-1,-1],[2,1,0,0,3,2,1,3,0,2,3,1],a,b);this.type="TetrahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Gc(a,b){L.call(this); +this.type="OctahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new rb(a,b));this.mergeVertices()}function rb(a,b){va.call(this,[1,0,0,-1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-1],[0,2,4,0,4,3,0,3,5,0,5,2,1,2,5,1,5,3,1,3,4,1,4,2],a,b);this.type="OctahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Hc(a,b){L.call(this);this.type="IcosahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Tb(a,b));this.mergeVertices()}function Tb(a,b){var c= +(1+Math.sqrt(5))/2;va.call(this,[-1,c,0,1,c,0,-1,-c,0,1,-c,0,0,-1,c,0,1,c,0,-1,-c,0,1,-c,c,0,-1,c,0,1,-c,0,-1,-c,0,1],[0,11,5,0,5,1,0,1,7,0,7,10,0,10,11,1,5,9,5,11,4,11,10,2,10,7,6,7,1,8,3,9,4,3,4,2,3,2,6,3,6,8,3,8,9,4,9,5,2,4,11,6,2,10,8,6,7,9,8,1],a,b);this.type="IcosahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Ic(a,b){L.call(this);this.type="DodecahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Ub(a,b));this.mergeVertices()}function Ub(a,b){var c= +(1+Math.sqrt(5))/2,d=1/c;va.call(this,[-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-d,-c,0,-d,c,0,d,-c,0,d,c,-d,-c,0,-d,c,0,d,-c,0,d,c,0,-c,0,-d,c,0,-d,-c,0,d,c,0,d],[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],a,b);this.type="DodecahedronBufferGeometry";this.parameters= +{radius:a,detail:b}}function Jc(a,b,c,d,e,f){L.call(this);this.type="TubeGeometry";this.parameters={path:a,tubularSegments:b,radius:c,radialSegments:d,closed:e};void 0!==f&&console.warn("THREE.TubeGeometry: taper has been removed.");a=new Vb(a,b,c,d,e);this.tangents=a.tangents;this.normals=a.normals;this.binormals=a.binormals;this.fromBufferGeometry(a);this.mergeVertices()}function Vb(a,b,c,d,e){function f(e){v=a.getPointAt(e/b,v);var f=g.normals[e];e=g.binormals[e];for(l=0;l<=d;l++){var m=l/d*Math.PI* +2,n=Math.sin(m);m=-Math.cos(m);k.x=m*f.x+n*e.x;k.y=m*f.y+n*e.y;k.z=m*f.z+n*e.z;k.normalize();r.push(k.x,k.y,k.z);h.x=v.x+c*k.x;h.y=v.y+c*k.y;h.z=v.z+c*k.z;q.push(h.x,h.y,h.z)}}z.call(this);this.type="TubeBufferGeometry";this.parameters={path:a,tubularSegments:b,radius:c,radialSegments:d,closed:e};b=b||64;c=c||1;d=d||8;e=e||!1;var g=a.computeFrenetFrames(b,e);this.tangents=g.tangents;this.normals=g.normals;this.binormals=g.binormals;var h=new p,k=new p,m=new C,v=new p,n,l,q=[],r=[],t=[],x=[];for(n= +0;n<b;n++)f(n);f(!1===e?b:0);for(n=0;n<=b;n++)for(l=0;l<=d;l++)m.x=n/b,m.y=l/d,t.push(m.x,m.y);(function(){for(l=1;l<=b;l++)for(n=1;n<=d;n++){var a=(d+1)*l+(n-1),c=(d+1)*l+n,e=(d+1)*(l-1)+n;x.push((d+1)*(l-1)+(n-1),a,e);x.push(a,c,e)}})();this.setIndex(x);this.addAttribute("position",new D(q,3));this.addAttribute("normal",new D(r,3));this.addAttribute("uv",new D(t,2))}function Kc(a,b,c,d,e,f,g){L.call(this);this.type="TorusKnotGeometry";this.parameters={radius:a,tube:b,tubularSegments:c,radialSegments:d, +p:e,q:f};void 0!==g&&console.warn("THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.");this.fromBufferGeometry(new Wb(a,b,c,d,e,f));this.mergeVertices()}function Wb(a,b,c,d,e,f){function g(a,b,c,d,e){var f=Math.sin(a);b=c/b*a;c=Math.cos(b);e.x=d*(2+c)*.5*Math.cos(a);e.y=d*(2+c)*f*.5;e.z=d*Math.sin(b)*.5}z.call(this);this.type="TorusKnotBufferGeometry";this.parameters={radius:a,tube:b,tubularSegments:c,radialSegments:d,p:e,q:f};a=a||1;b=b||.4;c=Math.floor(c)|| +64;d=Math.floor(d)||8;e=e||2;f=f||3;var h=[],k=[],m=[],v=[],n,l=new p,q=new p,r=new p,t=new p,x=new p,B=new p,w=new p;for(n=0;n<=c;++n){var A=n/c*e*Math.PI*2;g(A,e,f,a,r);g(A+.01,e,f,a,t);B.subVectors(t,r);w.addVectors(t,r);x.crossVectors(B,w);w.crossVectors(x,B);x.normalize();w.normalize();for(A=0;A<=d;++A){var G=A/d*Math.PI*2,N=-b*Math.cos(G);G=b*Math.sin(G);l.x=r.x+(N*w.x+G*x.x);l.y=r.y+(N*w.y+G*x.y);l.z=r.z+(N*w.z+G*x.z);k.push(l.x,l.y,l.z);q.subVectors(l,r).normalize();m.push(q.x,q.y,q.z);v.push(n/ +c);v.push(A/d)}}for(A=1;A<=c;A++)for(n=1;n<=d;n++)a=(d+1)*A+(n-1),b=(d+1)*A+n,e=(d+1)*(A-1)+n,h.push((d+1)*(A-1)+(n-1),a,e),h.push(a,b,e);this.setIndex(h);this.addAttribute("position",new D(k,3));this.addAttribute("normal",new D(m,3));this.addAttribute("uv",new D(v,2))}function Lc(a,b,c,d,e){L.call(this);this.type="TorusGeometry";this.parameters={radius:a,tube:b,radialSegments:c,tubularSegments:d,arc:e};this.fromBufferGeometry(new Xb(a,b,c,d,e));this.mergeVertices()}function Xb(a,b,c,d,e){z.call(this); +this.type="TorusBufferGeometry";this.parameters={radius:a,tube:b,radialSegments:c,tubularSegments:d,arc:e};a=a||1;b=b||.4;c=Math.floor(c)||8;d=Math.floor(d)||6;e=e||2*Math.PI;var f=[],g=[],h=[],k=[],m=new p,v=new p,n=new p,l,q;for(l=0;l<=c;l++)for(q=0;q<=d;q++){var r=q/d*e,t=l/c*Math.PI*2;v.x=(a+b*Math.cos(t))*Math.cos(r);v.y=(a+b*Math.cos(t))*Math.sin(r);v.z=b*Math.sin(t);g.push(v.x,v.y,v.z);m.x=a*Math.cos(r);m.y=a*Math.sin(r);n.subVectors(v,m).normalize();h.push(n.x,n.y,n.z);k.push(q/d);k.push(l/ +c)}for(l=1;l<=c;l++)for(q=1;q<=d;q++)a=(d+1)*(l-1)+q-1,b=(d+1)*(l-1)+q,e=(d+1)*l+q,f.push((d+1)*l+q-1,a,e),f.push(a,b,e);this.setIndex(f);this.addAttribute("position",new D(g,3));this.addAttribute("normal",new D(h,3));this.addAttribute("uv",new D(k,2))}function Xe(a,b,c,d,e){for(var f,g=0,h=b,k=c-d;h<c;h+=d)g+=(a[k]-a[h])*(a[h+1]+a[k+1]),k=h;if(e===0<g)for(e=b;e<c;e+=d)f=Ye(e,a[e],a[e+1],f);else for(e=c-d;e>=b;e-=d)f=Ye(e,a[e],a[e+1],f);f&&sb(f,f.next)&&(Mc(f),f=f.next);return f}function Nc(a,b){if(!a)return a; +b||(b=a);do{var c=!1;if(a.steiner||!sb(a,a.next)&&0!==sa(a.prev,a,a.next))a=a.next;else{Mc(a);a=b=a.prev;if(a===a.next)break;c=!0}}while(c||a!==b);return b}function Oc(a,b,c,d,e,f,g){if(a){if(!g&&f){var h=a,k=h;do null===k.z&&(k.z=Zd(k.x,k.y,d,e,f)),k.prevZ=k.prev,k=k.nextZ=k.next;while(k!==h);k.prevZ.nextZ=null;k.prevZ=null;h=k;var m,v,n,l,q=1;do{k=h;var r=h=null;for(v=0;k;){v++;var p=k;for(m=n=0;m<q&&(n++,p=p.nextZ,p);m++);for(l=q;0<n||0<l&&p;)0!==n&&(0===l||!p||k.z<=p.z)?(m=k,k=k.nextZ,n--):(m= +p,p=p.nextZ,l--),r?r.nextZ=m:h=m,m.prevZ=r,r=m;k=p}r.nextZ=null;q*=2}while(1<v)}for(h=a;a.prev!==a.next;){k=a.prev;p=a.next;if(f)a:{r=a;l=d;var x=e,B=f;v=r.prev;n=r;q=r.next;if(0<=sa(v,n,q))r=!1;else{var w=v.x>n.x?v.x>q.x?v.x:q.x:n.x>q.x?n.x:q.x,A=v.y>n.y?v.y>q.y?v.y:q.y:n.y>q.y?n.y:q.y;m=Zd(v.x<n.x?v.x<q.x?v.x:q.x:n.x<q.x?n.x:q.x,v.y<n.y?v.y<q.y?v.y:q.y:n.y<q.y?n.y:q.y,l,x,B);l=Zd(w,A,l,x,B);for(x=r.nextZ;x&&x.z<=l;){if(x!==r.prev&&x!==r.next&&ud(v.x,v.y,n.x,n.y,q.x,q.y,x.x,x.y)&&0<=sa(x.prev,x, +x.next)){r=!1;break a}x=x.nextZ}for(x=r.prevZ;x&&x.z>=m;){if(x!==r.prev&&x!==r.next&&ud(v.x,v.y,n.x,n.y,q.x,q.y,x.x,x.y)&&0<=sa(x.prev,x,x.next)){r=!1;break a}x=x.prevZ}r=!0}}else a:if(r=a,v=r.prev,n=r,q=r.next,0<=sa(v,n,q))r=!1;else{for(m=r.next.next;m!==r.prev;){if(ud(v.x,v.y,n.x,n.y,q.x,q.y,m.x,m.y)&&0<=sa(m.prev,m,m.next)){r=!1;break a}m=m.next}r=!0}if(r)b.push(k.i/c),b.push(a.i/c),b.push(p.i/c),Mc(a),h=a=p.next;else if(a=p,a===h){if(!g)Oc(Nc(a),b,c,d,e,f,1);else if(1===g){g=b;h=c;k=a;do p=k.prev, +r=k.next.next,!sb(p,r)&&Ze(p,k,k.next,r)&&Pc(p,r)&&Pc(r,p)&&(g.push(p.i/h),g.push(k.i/h),g.push(r.i/h),Mc(k),Mc(k.next),k=a=r),k=k.next;while(k!==a);a=k;Oc(a,b,c,d,e,f,2)}else if(2===g)a:{g=a;do{for(h=g.next.next;h!==g.prev;){if(k=g.i!==h.i){k=g;p=h;if(r=k.next.i!==p.i&&k.prev.i!==p.i){b:{r=k;do{if(r.i!==k.i&&r.next.i!==k.i&&r.i!==p.i&&r.next.i!==p.i&&Ze(r,r.next,k,p)){r=!0;break b}r=r.next}while(r!==k);r=!1}r=!r}if(r=r&&Pc(k,p)&&Pc(p,k)){r=k;v=!1;n=(k.x+p.x)/2;p=(k.y+p.y)/2;do r.y>p!==r.next.y>p&& +r.next.y!==r.y&&n<(r.next.x-r.x)*(p-r.y)/(r.next.y-r.y)+r.x&&(v=!v),r=r.next;while(r!==k);r=v}k=r}if(k){a=$e(g,h);g=Nc(g,g.next);a=Nc(a,a.next);Oc(g,b,c,d,e,f);Oc(a,b,c,d,e,f);break a}h=h.next}g=g.next}while(g!==a)}break}}}}function Hg(a,b){return a.x-b.x}function Ig(a,b){var c=b,d=a.x,e=a.y,f=-Infinity;do{if(e<=c.y&&e>=c.next.y&&c.next.y!==c.y){var g=c.x+(e-c.y)*(c.next.x-c.x)/(c.next.y-c.y);if(g<=d&&g>f){f=g;if(g===d){if(e===c.y)return c;if(e===c.next.y)return c.next}var h=c.x<c.next.x?c:c.next}}c= +c.next}while(c!==b);if(!h)return null;if(d===f)return h.prev;b=h;g=h.x;var k=h.y,m=Infinity;for(c=h.next;c!==b;){if(d>=c.x&&c.x>=g&&d!==c.x&&ud(e<k?d:f,e,g,k,e<k?f:d,e,c.x,c.y)){var v=Math.abs(e-c.y)/(d-c.x);(v<m||v===m&&c.x>h.x)&&Pc(c,a)&&(h=c,m=v)}c=c.next}return h}function Zd(a,b,c,d,e){a=32767*(a-c)*e;b=32767*(b-d)*e;a=(a|a<<8)&16711935;a=(a|a<<4)&252645135;a=(a|a<<2)&858993459;b=(b|b<<8)&16711935;b=(b|b<<4)&252645135;b=(b|b<<2)&858993459;return(a|a<<1)&1431655765|((b|b<<1)&1431655765)<<1}function Jg(a){var b= +a,c=a;do b.x<c.x&&(c=b),b=b.next;while(b!==a);return c}function ud(a,b,c,d,e,f,g,h){return 0<=(e-g)*(b-h)-(a-g)*(f-h)&&0<=(a-g)*(d-h)-(c-g)*(b-h)&&0<=(c-g)*(f-h)-(e-g)*(d-h)}function sa(a,b,c){return(b.y-a.y)*(c.x-b.x)-(b.x-a.x)*(c.y-b.y)}function sb(a,b){return a.x===b.x&&a.y===b.y}function Ze(a,b,c,d){return sb(a,b)&&sb(c,d)||sb(a,d)&&sb(c,b)?!0:0<sa(a,b,c)!==0<sa(a,b,d)&&0<sa(c,d,a)!==0<sa(c,d,b)}function Pc(a,b){return 0>sa(a.prev,a,a.next)?0<=sa(a,b,a.next)&&0<=sa(a,a.prev,b):0>sa(a,b,a.prev)|| +0>sa(a,a.next,b)}function $e(a,b){var c=new $d(a.i,a.x,a.y),d=new $d(b.i,b.x,b.y),e=a.next,f=b.prev;a.next=b;b.prev=a;c.next=e;e.prev=c;d.next=c;c.prev=d;f.next=d;d.prev=f;return d}function Ye(a,b,c,d){a=new $d(a,b,c);d?(a.next=d.next,a.prev=d,d.next.prev=a,d.next=a):(a.prev=a,a.next=a);return a}function Mc(a){a.next.prev=a.prev;a.prev.next=a.next;a.prevZ&&(a.prevZ.nextZ=a.nextZ);a.nextZ&&(a.nextZ.prevZ=a.prevZ)}function $d(a,b,c){this.i=a;this.x=b;this.y=c;this.nextZ=this.prevZ=this.z=this.next= +this.prev=null;this.steiner=!1}function af(a){var b=a.length;2<b&&a[b-1].equals(a[0])&&a.pop()}function bf(a,b){for(var c=0;c<b.length;c++)a.push(b[c].x),a.push(b[c].y)}function hb(a,b){L.call(this);this.type="ExtrudeGeometry";this.parameters={shapes:a,options:b};this.fromBufferGeometry(new Ia(a,b));this.mergeVertices()}function Ia(a,b){"undefined"!==typeof a&&(z.call(this),this.type="ExtrudeBufferGeometry",a=Array.isArray(a)?a:[a],this.addShapeList(a,b),this.computeVertexNormals())}function Qc(a, +b){L.call(this);this.type="TextGeometry";this.parameters={text:a,parameters:b};this.fromBufferGeometry(new Yb(a,b));this.mergeVertices()}function Yb(a,b){b=b||{};var c=b.font;if(!c||!c.isFont)return console.error("THREE.TextGeometry: font parameter is not an instance of THREE.Font."),new L;a=c.generateShapes(a,b.size,b.curveSegments);b.amount=void 0!==b.height?b.height:50;void 0===b.bevelThickness&&(b.bevelThickness=10);void 0===b.bevelSize&&(b.bevelSize=8);void 0===b.bevelEnabled&&(b.bevelEnabled= +!1);Ia.call(this,a,b);this.type="TextBufferGeometry"}function Rc(a,b,c,d,e,f,g){L.call(this);this.type="SphereGeometry";this.parameters={radius:a,widthSegments:b,heightSegments:c,phiStart:d,phiLength:e,thetaStart:f,thetaLength:g};this.fromBufferGeometry(new tb(a,b,c,d,e,f,g));this.mergeVertices()}function tb(a,b,c,d,e,f,g){z.call(this);this.type="SphereBufferGeometry";this.parameters={radius:a,widthSegments:b,heightSegments:c,phiStart:d,phiLength:e,thetaStart:f,thetaLength:g};a=a||1;b=Math.max(3, +Math.floor(b)||8);c=Math.max(2,Math.floor(c)||6);d=void 0!==d?d:0;e=void 0!==e?e:2*Math.PI;f=void 0!==f?f:0;g=void 0!==g?g:Math.PI;var h=f+g,k,m,v=0,n=[],l=new p,q=new p,r=[],t=[],x=[],B=[];for(m=0;m<=c;m++){var w=[],A=m/c;for(k=0;k<=b;k++){var G=k/b;l.x=-a*Math.cos(d+G*e)*Math.sin(f+A*g);l.y=a*Math.cos(f+A*g);l.z=a*Math.sin(d+G*e)*Math.sin(f+A*g);t.push(l.x,l.y,l.z);q.set(l.x,l.y,l.z).normalize();x.push(q.x,q.y,q.z);B.push(G,1-A);w.push(v++)}n.push(w)}for(m=0;m<c;m++)for(k=0;k<b;k++)a=n[m][k+1], +d=n[m][k],e=n[m+1][k],g=n[m+1][k+1],(0!==m||0<f)&&r.push(a,d,g),(m!==c-1||h<Math.PI)&&r.push(d,e,g);this.setIndex(r);this.addAttribute("position",new D(t,3));this.addAttribute("normal",new D(x,3));this.addAttribute("uv",new D(B,2))}function Sc(a,b,c,d,e,f){L.call(this);this.type="RingGeometry";this.parameters={innerRadius:a,outerRadius:b,thetaSegments:c,phiSegments:d,thetaStart:e,thetaLength:f};this.fromBufferGeometry(new Zb(a,b,c,d,e,f));this.mergeVertices()}function Zb(a,b,c,d,e,f){z.call(this); +this.type="RingBufferGeometry";this.parameters={innerRadius:a,outerRadius:b,thetaSegments:c,phiSegments:d,thetaStart:e,thetaLength:f};a=a||.5;b=b||1;e=void 0!==e?e:0;f=void 0!==f?f:2*Math.PI;c=void 0!==c?Math.max(3,c):8;d=void 0!==d?Math.max(1,d):1;var g=[],h=[],k=[],m=[],v=a,n=(b-a)/d,l=new p,q=new C,r,t;for(r=0;r<=d;r++){for(t=0;t<=c;t++)a=e+t/c*f,l.x=v*Math.cos(a),l.y=v*Math.sin(a),h.push(l.x,l.y,l.z),k.push(0,0,1),q.x=(l.x/b+1)/2,q.y=(l.y/b+1)/2,m.push(q.x,q.y);v+=n}for(r=0;r<d;r++)for(b=r*(c+ +1),t=0;t<c;t++)a=t+b,e=a+c+1,f=a+c+2,v=a+1,g.push(a,e,v),g.push(e,f,v);this.setIndex(g);this.addAttribute("position",new D(h,3));this.addAttribute("normal",new D(k,3));this.addAttribute("uv",new D(m,2))}function Tc(a,b,c,d){L.call(this);this.type="LatheGeometry";this.parameters={points:a,segments:b,phiStart:c,phiLength:d};this.fromBufferGeometry(new $b(a,b,c,d));this.mergeVertices()}function $b(a,b,c,d){z.call(this);this.type="LatheBufferGeometry";this.parameters={points:a,segments:b,phiStart:c,phiLength:d}; +b=Math.floor(b)||12;c=c||0;d=d||2*Math.PI;d=S.clamp(d,0,2*Math.PI);var e=[],f=[],g=[],h=1/b,k=new p,m=new C,v;for(v=0;v<=b;v++){var n=c+v*h*d;var l=Math.sin(n),q=Math.cos(n);for(n=0;n<=a.length-1;n++)k.x=a[n].x*l,k.y=a[n].y,k.z=a[n].x*q,f.push(k.x,k.y,k.z),m.x=v/b,m.y=n/(a.length-1),g.push(m.x,m.y)}for(v=0;v<b;v++)for(n=0;n<a.length-1;n++)c=n+v*a.length,h=c+a.length,k=c+a.length+1,m=c+1,e.push(c,h,m),e.push(h,k,m);this.setIndex(e);this.addAttribute("position",new D(f,3));this.addAttribute("uv",new D(g, +2));this.computeVertexNormals();if(d===2*Math.PI)for(d=this.attributes.normal.array,e=new p,f=new p,g=new p,c=b*a.length*3,n=v=0;v<a.length;v++,n+=3)e.x=d[n+0],e.y=d[n+1],e.z=d[n+2],f.x=d[c+n+0],f.y=d[c+n+1],f.z=d[c+n+2],g.addVectors(e,f).normalize(),d[n+0]=d[c+n+0]=g.x,d[n+1]=d[c+n+1]=g.y,d[n+2]=d[c+n+2]=g.z}function ub(a,b){L.call(this);this.type="ShapeGeometry";"object"===typeof b&&(console.warn("THREE.ShapeGeometry: Options parameter has been removed."),b=b.curveSegments);this.parameters={shapes:a, +curveSegments:b};this.fromBufferGeometry(new vb(a,b));this.mergeVertices()}function vb(a,b){function c(a){var c,h=e.length/3;a=a.extractPoints(b);var m=a.shape,l=a.holes;if(!1===Ya.isClockWise(m))for(m=m.reverse(),a=0,c=l.length;a<c;a++){var v=l[a];!0===Ya.isClockWise(v)&&(l[a]=v.reverse())}var p=Ya.triangulateShape(m,l);a=0;for(c=l.length;a<c;a++)v=l[a],m=m.concat(v);a=0;for(c=m.length;a<c;a++)v=m[a],e.push(v.x,v.y,0),f.push(0,0,1),g.push(v.x,v.y);a=0;for(c=p.length;a<c;a++)m=p[a],d.push(m[0]+h, +m[1]+h,m[2]+h),k+=3}z.call(this);this.type="ShapeBufferGeometry";this.parameters={shapes:a,curveSegments:b};b=b||12;var d=[],e=[],f=[],g=[],h=0,k=0;if(!1===Array.isArray(a))c(a);else for(var m=0;m<a.length;m++)c(a[m]),this.addGroup(h,k,m),h+=k,k=0;this.setIndex(d);this.addAttribute("position",new D(e,3));this.addAttribute("normal",new D(f,3));this.addAttribute("uv",new D(g,2))}function cf(a,b){b.shapes=[];if(Array.isArray(a))for(var c=0,d=a.length;c<d;c++)b.shapes.push(a[c].uuid);else b.shapes.push(a.uuid); +return b}function ac(a,b){z.call(this);this.type="EdgesGeometry";this.parameters={thresholdAngle:b};var c=[];b=Math.cos(S.DEG2RAD*(void 0!==b?b:1));var d=[0,0],e={},f=["a","b","c"];if(a.isBufferGeometry){var g=new L;g.fromBufferGeometry(a)}else g=a.clone();g.mergeVertices();g.computeFaceNormals();a=g.vertices;g=g.faces;for(var h=0,k=g.length;h<k;h++)for(var m=g[h],l=0;3>l;l++){var n=m[f[l]];var u=m[f[(l+1)%3]];d[0]=Math.min(n,u);d[1]=Math.max(n,u);n=d[0]+","+d[1];void 0===e[n]?e[n]={index1:d[0],index2:d[1], +face1:h,face2:void 0}:e[n].face2=h}for(n in e)if(d=e[n],void 0===d.face2||g[d.face1].normal.dot(g[d.face2].normal)<=b)f=a[d.index1],c.push(f.x,f.y,f.z),f=a[d.index2],c.push(f.x,f.y,f.z);this.addAttribute("position",new D(c,3))}function wb(a,b,c,d,e,f,g,h){L.call(this);this.type="CylinderGeometry";this.parameters={radiusTop:a,radiusBottom:b,height:c,radialSegments:d,heightSegments:e,openEnded:f,thetaStart:g,thetaLength:h};this.fromBufferGeometry(new Za(a,b,c,d,e,f,g,h));this.mergeVertices()}function Za(a, +b,c,d,e,f,g,h){function k(c){var e,f=new C,k=new p,v=0,t=!0===c?a:b,w=!0===c?1:-1;var y=r;for(e=1;e<=d;e++)n.push(0,x*w,0),u.push(0,w,0),q.push(.5,.5),r++;var D=r;for(e=0;e<=d;e++){var z=e/d*h+g,H=Math.cos(z);z=Math.sin(z);k.x=t*z;k.y=x*w;k.z=t*H;n.push(k.x,k.y,k.z);u.push(0,w,0);f.x=.5*H+.5;f.y=.5*z*w+.5;q.push(f.x,f.y);r++}for(e=0;e<d;e++)f=y+e,k=D+e,!0===c?l.push(k,k+1,f):l.push(k+1,k,f),v+=3;m.addGroup(B,v,!0===c?1:2);B+=v}z.call(this);this.type="CylinderBufferGeometry";this.parameters={radiusTop:a, +radiusBottom:b,height:c,radialSegments:d,heightSegments:e,openEnded:f,thetaStart:g,thetaLength:h};var m=this;a=void 0!==a?a:1;b=void 0!==b?b:1;c=c||1;d=Math.floor(d)||8;e=Math.floor(e)||1;f=void 0!==f?f:!1;g=void 0!==g?g:0;h=void 0!==h?h:2*Math.PI;var l=[],n=[],u=[],q=[],r=0,t=[],x=c/2,B=0;(function(){var f,k,v=new p,N=new p,y=0,F=(b-a)/c;for(k=0;k<=e;k++){var C=[],D=k/e,z=D*(b-a)+a;for(f=0;f<=d;f++){var H=f/d,I=H*h+g,K=Math.sin(I);I=Math.cos(I);N.x=z*K;N.y=-D*c+x;N.z=z*I;n.push(N.x,N.y,N.z);v.set(K, +F,I).normalize();u.push(v.x,v.y,v.z);q.push(H,1-D);C.push(r++)}t.push(C)}for(f=0;f<d;f++)for(k=0;k<e;k++)v=t[k+1][f],N=t[k+1][f+1],F=t[k][f+1],l.push(t[k][f],v,F),l.push(v,N,F),y+=6;m.addGroup(B,y,0);B+=y})();!1===f&&(0<a&&k(!0),0<b&&k(!1));this.setIndex(l);this.addAttribute("position",new D(n,3));this.addAttribute("normal",new D(u,3));this.addAttribute("uv",new D(q,2))}function Uc(a,b,c,d,e,f,g){wb.call(this,0,a,b,c,d,e,f,g);this.type="ConeGeometry";this.parameters={radius:a,height:b,radialSegments:c, +heightSegments:d,openEnded:e,thetaStart:f,thetaLength:g}}function Vc(a,b,c,d,e,f,g){Za.call(this,0,a,b,c,d,e,f,g);this.type="ConeBufferGeometry";this.parameters={radius:a,height:b,radialSegments:c,heightSegments:d,openEnded:e,thetaStart:f,thetaLength:g}}function Wc(a,b,c,d){L.call(this);this.type="CircleGeometry";this.parameters={radius:a,segments:b,thetaStart:c,thetaLength:d};this.fromBufferGeometry(new bc(a,b,c,d));this.mergeVertices()}function bc(a,b,c,d){z.call(this);this.type="CircleBufferGeometry"; +this.parameters={radius:a,segments:b,thetaStart:c,thetaLength:d};a=a||1;b=void 0!==b?Math.max(3,b):8;c=void 0!==c?c:0;d=void 0!==d?d:2*Math.PI;var e=[],f=[],g=[],h=[],k,m=new p,l=new C;f.push(0,0,0);g.push(0,0,1);h.push(.5,.5);var n=0;for(k=3;n<=b;n++,k+=3){var u=c+n/b*d;m.x=a*Math.cos(u);m.y=a*Math.sin(u);f.push(m.x,m.y,m.z);g.push(0,0,1);l.x=(f[k]/a+1)/2;l.y=(f[k+1]/a+1)/2;h.push(l.x,l.y)}for(k=1;k<=b;k++)e.push(k,k+1,0);this.setIndex(e);this.addAttribute("position",new D(f,3));this.addAttribute("normal", +new D(g,3));this.addAttribute("uv",new D(h,2))}function cc(a){O.call(this);this.type="ShadowMaterial";this.color=new H(0);this.opacity=1;this.transparent=this.lights=!0;this.setValues(a)}function dc(a){Da.call(this,a);this.type="RawShaderMaterial"}function Sa(a){O.call(this);this.defines={STANDARD:""};this.type="MeshStandardMaterial";this.color=new H(16777215);this.metalness=this.roughness=.5;this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.emissive= +new H(0);this.emissiveIntensity=1;this.bumpMap=this.emissiveMap=null;this.bumpScale=1;this.normalMap=null;this.normalScale=new C(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.envMap=this.alphaMap=this.metalnessMap=this.roughnessMap=null;this.envMapIntensity=1;this.refractionRatio=.98;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)}function xb(a){Sa.call(this); +this.defines={PHYSICAL:""};this.type="MeshPhysicalMaterial";this.reflectivity=.5;this.clearCoatRoughness=this.clearCoat=0;this.setValues(a)}function Ja(a){O.call(this);this.type="MeshPhongMaterial";this.color=new H(16777215);this.specular=new H(1118481);this.shininess=30;this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.emissive=new H(0);this.emissiveIntensity=1;this.bumpMap=this.emissiveMap=null;this.bumpScale=1;this.normalMap=null;this.normalScale=new C(1, +1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.envMap=this.alphaMap=this.specularMap=null;this.combine=0;this.reflectivity=1;this.refractionRatio=.98;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)}function yb(a){Ja.call(this);this.defines={TOON:""};this.type="MeshToonMaterial";this.gradientMap=null;this.setValues(a)}function zb(a){O.call(this); +this.type="MeshNormalMaterial";this.bumpMap=null;this.bumpScale=1;this.normalMap=null;this.normalScale=new C(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.wireframe=!1;this.wireframeLinewidth=1;this.morphNormals=this.morphTargets=this.skinning=this.lights=this.fog=!1;this.setValues(a)}function Ab(a){O.call(this);this.type="MeshLambertMaterial";this.color=new H(16777215);this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity= +1;this.emissive=new H(0);this.emissiveIntensity=1;this.envMap=this.alphaMap=this.specularMap=this.emissiveMap=null;this.combine=0;this.reflectivity=1;this.refractionRatio=.98;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)}function Bb(a){Y.call(this);this.type="LineDashedMaterial";this.scale=1;this.dashSize=3;this.gapSize=1;this.setValues(a)}function ae(a,b,c){var d=this,e=!1,f= +0,g=0,h=void 0;this.onStart=void 0;this.onLoad=a;this.onProgress=b;this.onError=c;this.itemStart=function(a){g++;if(!1===e&&void 0!==d.onStart)d.onStart(a,f,g);e=!0};this.itemEnd=function(a){f++;if(void 0!==d.onProgress)d.onProgress(a,f,g);if(f===g&&(e=!1,void 0!==d.onLoad))d.onLoad()};this.itemError=function(a){if(void 0!==d.onError)d.onError(a)};this.resolveURL=function(a){return h?h(a):a};this.setURLModifier=function(a){h=a;return this}}function Ka(a){this.manager=void 0!==a?a:ra}function df(a){this.manager= +void 0!==a?a:ra;this._parser=null}function be(a){this.manager=void 0!==a?a:ra;this._parser=null}function Xc(a){this.manager=void 0!==a?a:ra}function ce(a){this.manager=void 0!==a?a:ra}function vd(a){this.manager=void 0!==a?a:ra}function K(){this.type="Curve";this.arcLengthDivisions=200}function Aa(a,b,c,d,e,f,g,h){K.call(this);this.type="EllipseCurve";this.aX=a||0;this.aY=b||0;this.xRadius=c||1;this.yRadius=d||1;this.aStartAngle=e||0;this.aEndAngle=f||2*Math.PI;this.aClockwise=g||!1;this.aRotation= +h||0}function ec(a,b,c,d,e,f){Aa.call(this,a,b,c,c,d,e,f);this.type="ArcCurve"}function de(){var a=0,b=0,c=0,d=0;return{initCatmullRom:function(e,f,g,h,k){e=k*(g-e);h=k*(h-f);a=f;b=e;c=-3*f+3*g-2*e-h;d=2*f-2*g+e+h},initNonuniformCatmullRom:function(e,f,g,h,k,m,l){e=((f-e)/k-(g-e)/(k+m)+(g-f)/m)*m;h=((g-f)/m-(h-f)/(m+l)+(h-g)/l)*m;a=f;b=e;c=-3*f+3*g-2*e-h;d=2*f-2*g+e+h},calc:function(e){var f=e*e;return a+b*e+c*f+d*f*e}}}function da(a,b,c,d){K.call(this);this.type="CatmullRomCurve3";this.points=a|| +[];this.closed=b||!1;this.curveType=c||"centripetal";this.tension=d||.5}function ef(a,b,c,d,e){b=.5*(d-b);e=.5*(e-c);var f=a*a;return(2*c-2*d+b+e)*a*f+(-3*c+3*d-2*b-e)*f+b*a+c}function Yc(a,b,c,d){var e=1-a;return e*e*b+2*(1-a)*a*c+a*a*d}function Zc(a,b,c,d,e){var f=1-a,g=1-a;return f*f*f*b+3*g*g*a*c+3*(1-a)*a*a*d+a*a*a*e}function La(a,b,c,d){K.call(this);this.type="CubicBezierCurve";this.v0=a||new C;this.v1=b||new C;this.v2=c||new C;this.v3=d||new C}function Ta(a,b,c,d){K.call(this);this.type="CubicBezierCurve3"; +this.v0=a||new p;this.v1=b||new p;this.v2=c||new p;this.v3=d||new p}function ka(a,b){K.call(this);this.type="LineCurve";this.v1=a||new C;this.v2=b||new C}function Ma(a,b){K.call(this);this.type="LineCurve3";this.v1=a||new p;this.v2=b||new p}function Na(a,b,c){K.call(this);this.type="QuadraticBezierCurve";this.v0=a||new C;this.v1=b||new C;this.v2=c||new C}function Ua(a,b,c){K.call(this);this.type="QuadraticBezierCurve3";this.v0=a||new p;this.v1=b||new p;this.v2=c||new p}function Oa(a){K.call(this); +this.type="SplineCurve";this.points=a||[]}function $a(){K.call(this);this.type="CurvePath";this.curves=[];this.autoClose=!1}function Pa(a){$a.call(this);this.type="Path";this.currentPoint=new C;a&&this.setFromPoints(a)}function ib(a){Pa.call(this,a);this.uuid=S.generateUUID();this.type="Shape";this.holes=[]}function ea(a,b){y.call(this);this.type="Light";this.color=new H(a);this.intensity=void 0!==b?b:1;this.receiveShadow=void 0}function wd(a,b,c){ea.call(this,a,c);this.type="HemisphereLight";this.castShadow= +void 0;this.position.copy(y.DefaultUp);this.updateMatrix();this.groundColor=new H(b)}function Cb(a){this.camera=a;this.bias=0;this.radius=1;this.mapSize=new C(512,512);this.map=null;this.matrix=new P}function xd(){Cb.call(this,new na(50,1,.5,500))}function yd(a,b,c,d,e,f){ea.call(this,a,b);this.type="SpotLight";this.position.copy(y.DefaultUp);this.updateMatrix();this.target=new y;Object.defineProperty(this,"power",{get:function(){return this.intensity*Math.PI},set:function(a){this.intensity=a/Math.PI}}); +this.distance=void 0!==c?c:0;this.angle=void 0!==d?d:Math.PI/3;this.penumbra=void 0!==e?e:0;this.decay=void 0!==f?f:1;this.shadow=new xd}function zd(a,b,c,d){ea.call(this,a,b);this.type="PointLight";Object.defineProperty(this,"power",{get:function(){return 4*this.intensity*Math.PI},set:function(a){this.intensity=a/(4*Math.PI)}});this.distance=void 0!==c?c:0;this.decay=void 0!==d?d:1;this.shadow=new Cb(new na(90,1,.5,500))}function Ad(){Cb.call(this,new Ib(-5,5,5,-5,.5,500))}function Bd(a,b){ea.call(this, +a,b);this.type="DirectionalLight";this.position.copy(y.DefaultUp);this.updateMatrix();this.target=new y;this.shadow=new Ad}function Cd(a,b){ea.call(this,a,b);this.type="AmbientLight";this.castShadow=void 0}function Dd(a,b,c,d){ea.call(this,a,b);this.type="RectAreaLight";this.width=void 0!==c?c:10;this.height=void 0!==d?d:10}function Ed(a,b,c,d){la.call(this,a,b,c,d)}function Fd(a,b,c){la.call(this,a,b,c)}function Ba(a,b,c,d){this.parameterPositions=a;this._cachedIndex=0;this.resultBuffer=void 0!== +d?d:new b.constructor(c);this.sampleValues=b;this.valueSize=c}function Gd(a,b,c,d){Ba.call(this,a,b,c,d)}function $c(a,b,c,d){la.call(this,a,b,c,d)}function Hd(a,b,c,d){la.call(this,a,b,c,d)}function fc(a,b,c,d){la.call(this,a,b,c,d)}function Id(a,b,c,d){Ba.call(this,a,b,c,d);this._offsetNext=this._weightNext=this._offsetPrev=this._weightPrev=-0}function ad(a,b,c,d){Ba.call(this,a,b,c,d)}function Jd(a,b,c,d){Ba.call(this,a,b,c,d)}function la(a,b,c,d){if(void 0===a)throw Error("THREE.KeyframeTrack: track name is undefined"); +if(void 0===b||0===b.length)throw Error("THREE.KeyframeTrack: no keyframes in track named "+a);this.name=a;this.times=W.convertArray(b,this.TimeBufferType);this.values=W.convertArray(c,this.ValueBufferType);this.setInterpolation(d||this.DefaultInterpolation);this.validate();this.optimize()}function gc(a,b,c,d){la.call(this,a,b,c,d)}function wa(a,b,c){this.name=a;this.tracks=c;this.duration=void 0!==b?b:-1;this.uuid=S.generateUUID();0>this.duration&&this.resetDuration();this.optimize()}function Kd(a){this.manager= +void 0!==a?a:ra;this.textures={}}function ee(a){this.manager=void 0!==a?a:ra}function hc(){this.onLoadStart=function(){};this.onLoadProgress=function(){};this.onLoadComplete=function(){}}function fe(a){"boolean"===typeof a&&(console.warn("THREE.JSONLoader: showStatus parameter has been removed from constructor."),a=void 0);this.manager=void 0!==a?a:ra;this.withCredentials=!1}function ff(a){this.manager=void 0!==a?a:ra;this.texturePath=""}function ge(a){"undefined"===typeof createImageBitmap&&console.warn("THREE.ImageBitmapLoader: createImageBitmap() not supported."); +"undefined"===typeof fetch&&console.warn("THREE.ImageBitmapLoader: fetch() not supported.");this.manager=void 0!==a?a:ra;this.options=void 0}function he(){this.type="ShapePath";this.subPaths=[];this.currentPath=null}function ie(a){this.type="Font";this.data=a}function gf(a){this.manager=void 0!==a?a:ra}function je(a){this.manager=void 0!==a?a:ra}function hf(){this.type="StereoCamera";this.aspect=1;this.eyeSep=.064;this.cameraL=new na;this.cameraL.layers.enable(1);this.cameraL.matrixAutoUpdate=!1; +this.cameraR=new na;this.cameraR.layers.enable(2);this.cameraR.matrixAutoUpdate=!1}function bd(a,b,c){y.call(this);this.type="CubeCamera";var d=new na(90,1,a,b);d.up.set(0,-1,0);d.lookAt(new p(1,0,0));this.add(d);var e=new na(90,1,a,b);e.up.set(0,-1,0);e.lookAt(new p(-1,0,0));this.add(e);var f=new na(90,1,a,b);f.up.set(0,0,1);f.lookAt(new p(0,1,0));this.add(f);var g=new na(90,1,a,b);g.up.set(0,0,-1);g.lookAt(new p(0,-1,0));this.add(g);var h=new na(90,1,a,b);h.up.set(0,-1,0);h.lookAt(new p(0,0,1)); +this.add(h);var k=new na(90,1,a,b);k.up.set(0,-1,0);k.lookAt(new p(0,0,-1));this.add(k);this.renderTarget=new Gb(c,c,{format:1022,magFilter:1006,minFilter:1006});this.renderTarget.texture.name="CubeCamera";this.update=function(a,b){null===this.parent&&this.updateMatrixWorld();var c=this.renderTarget,m=c.texture.generateMipmaps;c.texture.generateMipmaps=!1;c.activeCubeFace=0;a.render(b,d,c);c.activeCubeFace=1;a.render(b,e,c);c.activeCubeFace=2;a.render(b,f,c);c.activeCubeFace=3;a.render(b,g,c);c.activeCubeFace= +4;a.render(b,h,c);c.texture.generateMipmaps=m;c.activeCubeFace=5;a.render(b,k,c);a.setRenderTarget(null)};this.clear=function(a,b,c,d){for(var e=this.renderTarget,f=0;6>f;f++)e.activeCubeFace=f,a.setRenderTarget(e),a.clear(b,c,d);a.setRenderTarget(null)}}function ke(){y.call(this);this.type="AudioListener";this.context=le.getContext();this.gain=this.context.createGain();this.gain.connect(this.context.destination);this.filter=null}function ic(a){y.call(this);this.type="Audio";this.context=a.context; +this.gain=this.context.createGain();this.gain.connect(a.getInput());this.autoplay=!1;this.buffer=null;this.loop=!1;this.offset=this.startTime=0;this.playbackRate=1;this.isPlaying=!1;this.hasPlaybackControl=!0;this.sourceType="empty";this.filters=[]}function me(a){ic.call(this,a);this.panner=this.context.createPanner();this.panner.connect(this.gain)}function ne(a,b){this.analyser=a.context.createAnalyser();this.analyser.fftSize=void 0!==b?b:2048;this.data=new Uint8Array(this.analyser.frequencyBinCount); +a.getOutput().connect(this.analyser)}function oe(a,b,c){this.binding=a;this.valueSize=c;a=Float64Array;switch(b){case "quaternion":b=this._slerp;break;case "string":case "bool":a=Array;b=this._select;break;default:b=this._lerp}this.buffer=new a(4*c);this._mixBufferRegion=b;this.referenceCount=this.useCount=this.cumulativeWeight=0}function jf(a,b,c){c=c||fa.parseTrackName(b);this._targetGroup=a;this._bindings=a.subscribe_(b,c)}function fa(a,b,c){this.path=b;this.parsedPath=c||fa.parseTrackName(b); +this.node=fa.findNode(a,this.parsedPath.nodeName)||a;this.rootNode=a}function kf(){this.uuid=S.generateUUID();this._objects=Array.prototype.slice.call(arguments);this.nCachedObjects_=0;var a={};this._indicesByUUID=a;for(var b=0,c=arguments.length;b!==c;++b)a[arguments[b].uuid]=b;this._paths=[];this._parsedPaths=[];this._bindings=[];this._bindingsIndicesByPath={};var d=this;this.stats={objects:{get total(){return d._objects.length},get inUse(){return this.total-d.nCachedObjects_}},get bindingsPerObject(){return d._bindings.length}}} +function lf(a,b,c){this._mixer=a;this._clip=b;this._localRoot=c||null;a=b.tracks;b=a.length;c=Array(b);for(var d={endingStart:2400,endingEnd:2400},e=0;e!==b;++e){var f=a[e].createInterpolant(null);c[e]=f;f.settings=d}this._interpolantSettings=d;this._interpolants=c;this._propertyBindings=Array(b);this._weightInterpolant=this._timeScaleInterpolant=this._byClipCacheIndex=this._cacheIndex=null;this.loop=2201;this._loopCount=-1;this._startTime=null;this.time=0;this._effectiveWeight=this.weight=this._effectiveTimeScale= +this.timeScale=1;this.repetitions=Infinity;this.paused=!1;this.enabled=!0;this.clampWhenFinished=!1;this.zeroSlopeAtEnd=this.zeroSlopeAtStart=!0}function pe(a){this._root=a;this._initMemoryManager();this.time=this._accuIndex=0;this.timeScale=1}function Ld(a,b){"string"===typeof a&&(console.warn("THREE.Uniform: Type parameter is no longer needed."),a=b);this.value=a}function qe(){z.call(this);this.type="InstancedBufferGeometry";this.maxInstancedCount=void 0}function re(a,b,c,d){this.uuid=S.generateUUID(); +this.data=a;this.itemSize=b;this.offset=c;this.normalized=!0===d}function jc(a,b){this.uuid=S.generateUUID();this.array=a;this.stride=b;this.count=void 0!==a?a.length/b:0;this.dynamic=!1;this.updateRange={offset:0,count:-1};this.onUploadCallback=function(){};this.version=0}function se(a,b,c){jc.call(this,a,b);this.meshPerAttribute=c||1}function te(a,b,c){M.call(this,a,b);this.meshPerAttribute=c||1}function mf(a,b,c,d){this.ray=new pb(a,b);this.near=c||0;this.far=d||Infinity;this.params={Mesh:{},Line:{}, +LOD:{},Points:{threshold:1},Sprite:{}};Object.defineProperties(this.params,{PointCloud:{get:function(){console.warn("THREE.Raycaster: params.PointCloud has been renamed to params.Points.");return this.Points}}})}function nf(a,b){return a.distance-b.distance}function ue(a,b,c,d){if(!1!==a.visible&&(a.raycast(b,c),!0===d)){a=a.children;d=0;for(var e=a.length;d<e;d++)ue(a[d],b,c,!0)}}function of(a){this.autoStart=void 0!==a?a:!0;this.elapsedTime=this.oldTime=this.startTime=0;this.running=!1}function pf(a, +b,c){this.radius=void 0!==a?a:1;this.phi=void 0!==b?b:0;this.theta=void 0!==c?c:0;return this}function qf(a,b,c){this.radius=void 0!==a?a:1;this.theta=void 0!==b?b:0;this.y=void 0!==c?c:0;return this}function ve(a,b){this.min=void 0!==a?a:new C(Infinity,Infinity);this.max=void 0!==b?b:new C(-Infinity,-Infinity)}function cd(a){y.call(this);this.material=a;this.render=function(){}}function dd(a,b,c,d){this.object=a;this.size=void 0!==b?b:1;a=void 0!==c?c:16711680;d=void 0!==d?d:1;b=0;(c=this.object.geometry)&& +c.isGeometry?b=3*c.faces.length:c&&c.isBufferGeometry&&(b=c.attributes.normal.count);c=new z;b=new D(6*b,3);c.addAttribute("position",b);U.call(this,c,new Y({color:a,linewidth:d}));this.matrixAutoUpdate=!1;this.update()}function kc(a,b){y.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.color=b;a=new z;b=[0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,-1,0,1,0,0,0,0,1,1,0,0,0,0,-1,1];for(var c=0,d=1;32>c;c++,d++){var e=c/32*Math.PI*2,f=d/32*Math.PI*2;b.push(Math.cos(e), +Math.sin(e),1,Math.cos(f),Math.sin(f),1)}a.addAttribute("position",new D(b,3));b=new Y({fog:!1});this.cone=new U(a,b);this.add(this.cone);this.update()}function rf(a){var b=[];a&&a.isBone&&b.push(a);for(var c=0;c<a.children.length;c++)b.push.apply(b,rf(a.children[c]));return b}function lc(a){for(var b=rf(a),c=new z,d=[],e=[],f=new H(0,0,1),g=new H(0,1,0),h=0;h<b.length;h++){var k=b[h];k.parent&&k.parent.isBone&&(d.push(0,0,0),d.push(0,0,0),e.push(f.r,f.g,f.b),e.push(g.r,g.g,g.b))}c.addAttribute("position", +new D(d,3));c.addAttribute("color",new D(e,3));d=new Y({vertexColors:2,depthTest:!1,depthWrite:!1,transparent:!0});U.call(this,c,d);this.root=a;this.bones=b;this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1}function mc(a,b,c){this.light=a;this.light.updateMatrixWorld();this.color=c;a=new tb(b,4,2);b=new za({wireframe:!0,fog:!1});ua.call(this,a,b);this.matrix=this.light.matrixWorld;this.matrixAutoUpdate=!1;this.update()}function nc(a,b){y.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix= +a.matrixWorld;this.matrixAutoUpdate=!1;this.color=b;a=new Y({fog:!1});b=new z;b.addAttribute("position",new M(new Float32Array(15),3));this.line=new qa(b,a);this.add(this.line);this.update()}function oc(a,b,c){y.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.color=c;a=new rb(b);a.rotateY(.5*Math.PI);this.material=new za({wireframe:!0,fog:!1});void 0===this.color&&(this.material.vertexColors=2);b=a.getAttribute("position");b=new Float32Array(3* +b.count);a.addAttribute("color",new M(b,3));this.add(new ua(a,this.material));this.update()}function ed(a,b,c,d){a=a||10;b=b||10;c=new H(void 0!==c?c:4473924);d=new H(void 0!==d?d:8947848);var e=b/2,f=a/b,g=a/2;a=[];for(var h=[],k=0,m=0,l=-g;k<=b;k++,l+=f){a.push(-g,0,l,g,0,l);a.push(l,0,-g,l,0,g);var n=k===e?c:d;n.toArray(h,m);m+=3;n.toArray(h,m);m+=3;n.toArray(h,m);m+=3;n.toArray(h,m);m+=3}b=new z;b.addAttribute("position",new D(a,3));b.addAttribute("color",new D(h,3));c=new Y({vertexColors:2}); +U.call(this,b,c)}function Md(a,b,c,d,e,f){a=a||10;b=b||16;c=c||8;d=d||64;e=new H(void 0!==e?e:4473924);f=new H(void 0!==f?f:8947848);var g=[],h=[],k;for(k=0;k<=b;k++){var m=k/b*2*Math.PI;var l=Math.sin(m)*a;m=Math.cos(m)*a;g.push(0,0,0);g.push(l,0,m);var n=k&1?e:f;h.push(n.r,n.g,n.b);h.push(n.r,n.g,n.b)}for(k=0;k<=c;k++){n=k&1?e:f;var p=a-a/c*k;for(b=0;b<d;b++)m=b/d*2*Math.PI,l=Math.sin(m)*p,m=Math.cos(m)*p,g.push(l,0,m),h.push(n.r,n.g,n.b),m=(b+1)/d*2*Math.PI,l=Math.sin(m)*p,m=Math.cos(m)*p,g.push(l, +0,m),h.push(n.r,n.g,n.b)}a=new z;a.addAttribute("position",new D(g,3));a.addAttribute("color",new D(h,3));g=new Y({vertexColors:2});U.call(this,a,g)}function fd(a,b,c,d){this.object=a;this.size=void 0!==b?b:1;a=void 0!==c?c:16776960;d=void 0!==d?d:1;b=0;(c=this.object.geometry)&&c.isGeometry?b=c.faces.length:console.warn("THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.");c=new z;b=new D(6*b,3);c.addAttribute("position",b);U.call(this,c,new Y({color:a, +linewidth:d}));this.matrixAutoUpdate=!1;this.update()}function pc(a,b,c){y.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.color=c;void 0===b&&(b=1);a=new z;a.addAttribute("position",new D([-b,b,0,b,b,0,b,-b,0,-b,-b,0,-b,b,0],3));b=new Y({fog:!1});this.lightPlane=new qa(a,b);this.add(this.lightPlane);a=new z;a.addAttribute("position",new D([0,0,0,0,0,1],3));this.targetLine=new qa(a,b);this.add(this.targetLine);this.update()}function gd(a){function b(a, +b,d){c(a,d);c(b,d)}function c(a,b){f.push(0,0,0);g.push(b.r,b.g,b.b);void 0===h[a]&&(h[a]=[]);h[a].push(f.length/3-1)}var d=new z,e=new Y({color:16777215,vertexColors:1}),f=[],g=[],h={},k=new H(16755200),m=new H(16711680),l=new H(43775),n=new H(16777215),p=new H(3355443);b("n1","n2",k);b("n2","n4",k);b("n4","n3",k);b("n3","n1",k);b("f1","f2",k);b("f2","f4",k);b("f4","f3",k);b("f3","f1",k);b("n1","f1",k);b("n2","f2",k);b("n3","f3",k);b("n4","f4",k);b("p","n1",m);b("p","n2",m);b("p","n3",m);b("p","n4", +m);b("u1","u2",l);b("u2","u3",l);b("u3","u1",l);b("c","t",n);b("p","c",p);b("cn1","cn2",p);b("cn3","cn4",p);b("cf1","cf2",p);b("cf3","cf4",p);d.addAttribute("position",new D(f,3));d.addAttribute("color",new D(g,3));U.call(this,d,e);this.camera=a;this.camera.updateProjectionMatrix&&this.camera.updateProjectionMatrix();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.pointMap=h;this.update()}function Db(a,b){this.object=a;void 0===b&&(b=16776960);a=new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6, +7,7,4,0,4,1,5,2,6,3,7]);var c=new Float32Array(24),d=new z;d.setIndex(new M(a,1));d.addAttribute("position",new M(c,3));U.call(this,d,new Y({color:b}));this.matrixAutoUpdate=!1;this.update()}function hd(a,b){this.type="Box3Helper";this.box=a;a=void 0!==b?b:16776960;b=new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]);var c=new z;c.setIndex(new M(b,1));c.addAttribute("position",new D([1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1],3));U.call(this,c,new Y({color:a}));this.geometry.computeBoundingSphere()} +function id(a,b,c){this.type="PlaneHelper";this.plane=a;this.size=void 0===b?1:b;a=void 0!==c?c:16776960;b=new z;b.addAttribute("position",new D([1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,0,0,1,0,0,0],3));b.computeBoundingSphere();qa.call(this,b,new Y({color:a}));b=new z;b.addAttribute("position",new D([1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1],3));b.computeBoundingSphere();this.add(new ua(b,new za({color:a,opacity:.2,transparent:!0,depthWrite:!1})))}function Eb(a,b,c,d,e,f){y.call(this); +void 0===d&&(d=16776960);void 0===c&&(c=1);void 0===e&&(e=.2*c);void 0===f&&(f=.2*e);void 0===Nd&&(Nd=new z,Nd.addAttribute("position",new D([0,0,0,0,1,0],3)),we=new Za(0,.5,1,5,1),we.translate(0,-.5,0));this.position.copy(b);this.line=new qa(Nd,new Y({color:d}));this.line.matrixAutoUpdate=!1;this.add(this.line);this.cone=new ua(we,new za({color:d}));this.cone.matrixAutoUpdate=!1;this.add(this.cone);this.setDirection(a);this.setLength(c,e,f)}function jd(a){a=a||1;var b=[0,0,0,a,0,0,0,0,0,0,a,0,0, +0,0,0,0,a];a=new z;a.addAttribute("position",new D(b,3));a.addAttribute("color",new D([1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1],3));b=new Y({vertexColors:2});U.call(this,a,b)}function sf(a){console.warn("THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.");da.call(this,a);this.type="catmullrom";this.closed=!0}function tf(a){console.warn("THREE.SplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.");da.call(this,a);this.type="catmullrom"}function xe(a){console.warn("THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead."); +da.call(this,a);this.type="catmullrom"}void 0===Number.EPSILON&&(Number.EPSILON=Math.pow(2,-52));void 0===Number.isInteger&&(Number.isInteger=function(a){return"number"===typeof a&&isFinite(a)&&Math.floor(a)===a});void 0===Math.sign&&(Math.sign=function(a){return 0>a?-1:0<a?1:+a});!1==="name"in Function.prototype&&Object.defineProperty(Function.prototype,"name",{get:function(){return this.toString().match(/^\s*function\s*([^\(\s]*)/)[1]}});void 0===Object.assign&&function(){Object.assign=function(a){if(void 0=== +a||null===a)throw new TypeError("Cannot convert undefined or null to object");for(var b=Object(a),c=1;c<arguments.length;c++){var d=arguments[c];if(void 0!==d&&null!==d)for(var e in d)Object.prototype.hasOwnProperty.call(d,e)&&(b[e]=d[e])}return b}}();Object.assign(xa.prototype,{addEventListener:function(a,b){void 0===this._listeners&&(this._listeners={});var c=this._listeners;void 0===c[a]&&(c[a]=[]);-1===c[a].indexOf(b)&&c[a].push(b)},hasEventListener:function(a,b){if(void 0===this._listeners)return!1; +var c=this._listeners;return void 0!==c[a]&&-1!==c[a].indexOf(b)},removeEventListener:function(a,b){void 0!==this._listeners&&(a=this._listeners[a],void 0!==a&&(b=a.indexOf(b),-1!==b&&a.splice(b,1)))},dispatchEvent:function(a){if(void 0!==this._listeners){var b=this._listeners[a.type];if(void 0!==b){a.target=this;b=b.slice(0);for(var c=0,d=b.length;c<d;c++)b[c].call(this,a)}}}});var S={DEG2RAD:Math.PI/180,RAD2DEG:180/Math.PI,generateUUID:function(){for(var a=[],b=0;256>b;b++)a[b]=(16>b?"0":"")+b.toString(16).toUpperCase(); +return function(){var b=4294967295*Math.random()|0,d=4294967295*Math.random()|0,e=4294967295*Math.random()|0,f=4294967295*Math.random()|0;return a[b&255]+a[b>>8&255]+a[b>>16&255]+a[b>>24&255]+"-"+a[d&255]+a[d>>8&255]+"-"+a[d>>16&15|64]+a[d>>24&255]+"-"+a[e&63|128]+a[e>>8&255]+"-"+a[e>>16&255]+a[e>>24&255]+a[f&255]+a[f>>8&255]+a[f>>16&255]+a[f>>24&255]}}(),clamp:function(a,b,c){return Math.max(b,Math.min(c,a))},euclideanModulo:function(a,b){return(a%b+b)%b},mapLinear:function(a,b,c,d,e){return d+(a- +b)*(e-d)/(c-b)},lerp:function(a,b,c){return(1-c)*a+c*b},smoothstep:function(a,b,c){if(a<=b)return 0;if(a>=c)return 1;a=(a-b)/(c-b);return a*a*(3-2*a)},smootherstep:function(a,b,c){if(a<=b)return 0;if(a>=c)return 1;a=(a-b)/(c-b);return a*a*a*(a*(6*a-15)+10)},randInt:function(a,b){return a+Math.floor(Math.random()*(b-a+1))},randFloat:function(a,b){return a+Math.random()*(b-a)},randFloatSpread:function(a){return a*(.5-Math.random())},degToRad:function(a){return a*S.DEG2RAD},radToDeg:function(a){return a* +S.RAD2DEG},isPowerOfTwo:function(a){return 0===(a&a-1)&&0!==a},ceilPowerOfTwo:function(a){return Math.pow(2,Math.ceil(Math.log(a)/Math.LN2))},floorPowerOfTwo:function(a){return Math.pow(2,Math.floor(Math.log(a)/Math.LN2))}};Object.defineProperties(C.prototype,{width:{get:function(){return this.x},set:function(a){this.x=a}},height:{get:function(){return this.y},set:function(a){this.y=a}}});Object.assign(C.prototype,{isVector2:!0,set:function(a,b){this.x=a;this.y=b;return this},setScalar:function(a){this.y= +this.x=a;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;default:throw Error("index is out of range: "+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y)},copy:function(a){this.x=a.x;this.y=a.y;return this},add:function(a, +b){if(void 0!==b)return console.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;return this},addScalar:function(a){this.x+=a;this.y+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;return this},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."), +this.subVectors(a,b);this.x-=a.x;this.y-=a.y;return this},subScalar:function(a){this.x-=a;this.y-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;return this},multiply:function(a){this.x*=a.x;this.y*=a.y;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;return this},divide:function(a){this.x/=a.x;this.y/=a.y;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},applyMatrix3:function(a){var b=this.x,c=this.y;a=a.elements;this.x=a[0]*b+a[3]*c+a[6];this.y= +a[1]*b+a[4]*c+a[7];return this},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));return this},clampScalar:function(){var a=new C,b=new C;return function(c,d){a.set(c,c);b.set(d,d);return this.clamp(a,b)}}(),clampLength:function(a,b){var c=this.length();return this.divideScalar(c|| +1).multiplyScalar(Math.max(a,Math.min(b,c)))},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);return this},negate:function(){this.x=-this.x;this.y=-this.y;return this},dot:function(a){return this.x* +a.x+this.y*a.y},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)},normalize:function(){return this.divideScalar(this.length()||1)},angle:function(){var a=Math.atan2(this.y,this.x);0>a&&(a+=2*Math.PI);return a},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x;a=this.y-a.y;return b*b+a*a},manhattanDistanceTo:function(a){return Math.abs(this.x- +a.x)+Math.abs(this.y-a.y)},setLength:function(a){return this.normalize().multiplyScalar(a)},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;return this},lerpVectors:function(a,b,c){return this.subVectors(b,a).multiplyScalar(c).add(a)},equals:function(a){return a.x===this.x&&a.y===this.y},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;return a},fromBufferAttribute:function(a, +b,c){void 0!==c&&console.warn("THREE.Vector2: offset has been removed from .fromBufferAttribute().");this.x=a.getX(b);this.y=a.getY(b);return this},rotateAround:function(a,b){var c=Math.cos(b);b=Math.sin(b);var d=this.x-a.x,e=this.y-a.y;this.x=d*c-e*b+a.x;this.y=d*b+e*c+a.y;return this}});Object.assign(P.prototype,{isMatrix4:!0,set:function(a,b,c,d,e,f,g,h,k,m,l,n,p,q,r,t){var v=this.elements;v[0]=a;v[4]=b;v[8]=c;v[12]=d;v[1]=e;v[5]=f;v[9]=g;v[13]=h;v[2]=k;v[6]=m;v[10]=l;v[14]=n;v[3]=p;v[7]=q;v[11]= +r;v[15]=t;return this},identity:function(){this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this},clone:function(){return(new P).fromArray(this.elements)},copy:function(a){var b=this.elements;a=a.elements;b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];b[5]=a[5];b[6]=a[6];b[7]=a[7];b[8]=a[8];b[9]=a[9];b[10]=a[10];b[11]=a[11];b[12]=a[12];b[13]=a[13];b[14]=a[14];b[15]=a[15];return this},copyPosition:function(a){var b=this.elements;a=a.elements;b[12]=a[12];b[13]=a[13];b[14]=a[14];return this},extractBasis:function(a, +b,c){a.setFromMatrixColumn(this,0);b.setFromMatrixColumn(this,1);c.setFromMatrixColumn(this,2);return this},makeBasis:function(a,b,c){this.set(a.x,b.x,c.x,0,a.y,b.y,c.y,0,a.z,b.z,c.z,0,0,0,0,1);return this},extractRotation:function(){var a=new p;return function(b){var c=this.elements,d=b.elements,e=1/a.setFromMatrixColumn(b,0).length(),f=1/a.setFromMatrixColumn(b,1).length();b=1/a.setFromMatrixColumn(b,2).length();c[0]=d[0]*e;c[1]=d[1]*e;c[2]=d[2]*e;c[4]=d[4]*f;c[5]=d[5]*f;c[6]=d[6]*f;c[8]=d[8]*b; +c[9]=d[9]*b;c[10]=d[10]*b;return this}}(),makeRotationFromEuler:function(a){a&&a.isEuler||console.error("THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.");var b=this.elements,c=a.x,d=a.y,e=a.z,f=Math.cos(c);c=Math.sin(c);var g=Math.cos(d);d=Math.sin(d);var h=Math.cos(e);e=Math.sin(e);if("XYZ"===a.order){a=f*h;var k=f*e,m=c*h,l=c*e;b[0]=g*h;b[4]=-g*e;b[8]=d;b[1]=k+m*d;b[5]=a-l*d;b[9]=-c*g;b[2]=l-a*d;b[6]=m+k*d;b[10]=f*g}else"YXZ"===a.order?(a=g* +h,k=g*e,m=d*h,l=d*e,b[0]=a+l*c,b[4]=m*c-k,b[8]=f*d,b[1]=f*e,b[5]=f*h,b[9]=-c,b[2]=k*c-m,b[6]=l+a*c,b[10]=f*g):"ZXY"===a.order?(a=g*h,k=g*e,m=d*h,l=d*e,b[0]=a-l*c,b[4]=-f*e,b[8]=m+k*c,b[1]=k+m*c,b[5]=f*h,b[9]=l-a*c,b[2]=-f*d,b[6]=c,b[10]=f*g):"ZYX"===a.order?(a=f*h,k=f*e,m=c*h,l=c*e,b[0]=g*h,b[4]=m*d-k,b[8]=a*d+l,b[1]=g*e,b[5]=l*d+a,b[9]=k*d-m,b[2]=-d,b[6]=c*g,b[10]=f*g):"YZX"===a.order?(a=f*g,k=f*d,m=c*g,l=c*d,b[0]=g*h,b[4]=l-a*e,b[8]=m*e+k,b[1]=e,b[5]=f*h,b[9]=-c*h,b[2]=-d*h,b[6]=k*e+m,b[10]=a-l* +e):"XZY"===a.order&&(a=f*g,k=f*d,m=c*g,l=c*d,b[0]=g*h,b[4]=-e,b[8]=d*h,b[1]=a*e+l,b[5]=f*h,b[9]=k*e-m,b[2]=m*e-k,b[6]=c*h,b[10]=l*e+a);b[3]=0;b[7]=0;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return this},makeRotationFromQuaternion:function(a){var b=this.elements,c=a._x,d=a._y,e=a._z,f=a._w,g=c+c,h=d+d,k=e+e;a=c*g;var m=c*h;c*=k;var l=d*h;d*=k;e*=k;g*=f;h*=f;f*=k;b[0]=1-(l+e);b[4]=m-f;b[8]=c+h;b[1]=m+f;b[5]=1-(a+e);b[9]=d-g;b[2]=c-h;b[6]=d+g;b[10]=1-(a+l);b[3]=0;b[7]=0;b[11]=0;b[12]=0;b[13]=0;b[14]= +0;b[15]=1;return this},lookAt:function(){var a=new p,b=new p,c=new p;return function(d,e,f){var g=this.elements;c.subVectors(d,e);0===c.lengthSq()&&(c.z=1);c.normalize();a.crossVectors(f,c);0===a.lengthSq()&&(1===Math.abs(f.z)?c.x+=1E-4:c.z+=1E-4,c.normalize(),a.crossVectors(f,c));a.normalize();b.crossVectors(c,a);g[0]=a.x;g[4]=b.x;g[8]=c.x;g[1]=a.y;g[5]=b.y;g[9]=c.y;g[2]=a.z;g[6]=b.z;g[10]=c.z;return this}}(),multiply:function(a,b){return void 0!==b?(console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."), +this.multiplyMatrices(a,b)):this.multiplyMatrices(this,a)},premultiply:function(a){return this.multiplyMatrices(a,this)},multiplyMatrices:function(a,b){var c=a.elements,d=b.elements;b=this.elements;a=c[0];var e=c[4],f=c[8],g=c[12],h=c[1],k=c[5],m=c[9],l=c[13],n=c[2],p=c[6],q=c[10],r=c[14],t=c[3],x=c[7],B=c[11];c=c[15];var w=d[0],A=d[4],G=d[8],N=d[12],y=d[1],F=d[5],D=d[9],C=d[13],z=d[2],H=d[6],I=d[10],K=d[14],L=d[3],T=d[7],M=d[11];d=d[15];b[0]=a*w+e*y+f*z+g*L;b[4]=a*A+e*F+f*H+g*T;b[8]=a*G+e*D+f*I+ +g*M;b[12]=a*N+e*C+f*K+g*d;b[1]=h*w+k*y+m*z+l*L;b[5]=h*A+k*F+m*H+l*T;b[9]=h*G+k*D+m*I+l*M;b[13]=h*N+k*C+m*K+l*d;b[2]=n*w+p*y+q*z+r*L;b[6]=n*A+p*F+q*H+r*T;b[10]=n*G+p*D+q*I+r*M;b[14]=n*N+p*C+q*K+r*d;b[3]=t*w+x*y+B*z+c*L;b[7]=t*A+x*F+B*H+c*T;b[11]=t*G+x*D+B*I+c*M;b[15]=t*N+x*C+B*K+c*d;return this},multiplyScalar:function(a){var b=this.elements;b[0]*=a;b[4]*=a;b[8]*=a;b[12]*=a;b[1]*=a;b[5]*=a;b[9]*=a;b[13]*=a;b[2]*=a;b[6]*=a;b[10]*=a;b[14]*=a;b[3]*=a;b[7]*=a;b[11]*=a;b[15]*=a;return this},applyToBufferAttribute:function(){var a= +new p;return function(b){for(var c=0,d=b.count;c<d;c++)a.x=b.getX(c),a.y=b.getY(c),a.z=b.getZ(c),a.applyMatrix4(this),b.setXYZ(c,a.x,a.y,a.z);return b}}(),determinant:function(){var a=this.elements,b=a[0],c=a[4],d=a[8],e=a[12],f=a[1],g=a[5],h=a[9],k=a[13],m=a[2],l=a[6],n=a[10],p=a[14];return a[3]*(+e*h*l-d*k*l-e*g*n+c*k*n+d*g*p-c*h*p)+a[7]*(+b*h*p-b*k*n+e*f*n-d*f*p+d*k*m-e*h*m)+a[11]*(+b*k*l-b*g*p-e*f*l+c*f*p+e*g*m-c*k*m)+a[15]*(-d*g*m-b*h*l+b*g*n+d*f*l-c*f*n+c*h*m)},transpose:function(){var a=this.elements; +var b=a[1];a[1]=a[4];a[4]=b;b=a[2];a[2]=a[8];a[8]=b;b=a[6];a[6]=a[9];a[9]=b;b=a[3];a[3]=a[12];a[12]=b;b=a[7];a[7]=a[13];a[13]=b;b=a[11];a[11]=a[14];a[14]=b;return this},setPosition:function(a){var b=this.elements;b[12]=a.x;b[13]=a.y;b[14]=a.z;return this},getInverse:function(a,b){var c=this.elements,d=a.elements;a=d[0];var e=d[1],f=d[2],g=d[3],h=d[4],k=d[5],m=d[6],l=d[7],n=d[8],p=d[9],q=d[10],r=d[11],t=d[12],x=d[13],B=d[14];d=d[15];var w=p*B*l-x*q*l+x*m*r-k*B*r-p*m*d+k*q*d,A=t*q*l-n*B*l-t*m*r+h*B* +r+n*m*d-h*q*d,G=n*x*l-t*p*l+t*k*r-h*x*r-n*k*d+h*p*d,N=t*p*m-n*x*m-t*k*q+h*x*q+n*k*B-h*p*B,y=a*w+e*A+f*G+g*N;if(0===y){if(!0===b)throw Error("THREE.Matrix4: .getInverse() can't invert matrix, determinant is 0");console.warn("THREE.Matrix4: .getInverse() can't invert matrix, determinant is 0");return this.identity()}b=1/y;c[0]=w*b;c[1]=(x*q*g-p*B*g-x*f*r+e*B*r+p*f*d-e*q*d)*b;c[2]=(k*B*g-x*m*g+x*f*l-e*B*l-k*f*d+e*m*d)*b;c[3]=(p*m*g-k*q*g-p*f*l+e*q*l+k*f*r-e*m*r)*b;c[4]=A*b;c[5]=(n*B*g-t*q*g+t*f*r-a* +B*r-n*f*d+a*q*d)*b;c[6]=(t*m*g-h*B*g-t*f*l+a*B*l+h*f*d-a*m*d)*b;c[7]=(h*q*g-n*m*g+n*f*l-a*q*l-h*f*r+a*m*r)*b;c[8]=G*b;c[9]=(t*p*g-n*x*g-t*e*r+a*x*r+n*e*d-a*p*d)*b;c[10]=(h*x*g-t*k*g+t*e*l-a*x*l-h*e*d+a*k*d)*b;c[11]=(n*k*g-h*p*g-n*e*l+a*p*l+h*e*r-a*k*r)*b;c[12]=N*b;c[13]=(n*x*f-t*p*f+t*e*q-a*x*q-n*e*B+a*p*B)*b;c[14]=(t*k*f-h*x*f-t*e*m+a*x*m+h*e*B-a*k*B)*b;c[15]=(h*p*f-n*k*f+n*e*m-a*p*m-h*e*q+a*k*q)*b;return this},scale:function(a){var b=this.elements,c=a.x,d=a.y;a=a.z;b[0]*=c;b[4]*=d;b[8]*=a;b[1]*= +c;b[5]*=d;b[9]*=a;b[2]*=c;b[6]*=d;b[10]*=a;b[3]*=c;b[7]*=d;b[11]*=a;return this},getMaxScaleOnAxis:function(){var a=this.elements;return Math.sqrt(Math.max(a[0]*a[0]+a[1]*a[1]+a[2]*a[2],a[4]*a[4]+a[5]*a[5]+a[6]*a[6],a[8]*a[8]+a[9]*a[9]+a[10]*a[10]))},makeTranslation:function(a,b,c){this.set(1,0,0,a,0,1,0,b,0,0,1,c,0,0,0,1);return this},makeRotationX:function(a){var b=Math.cos(a);a=Math.sin(a);this.set(1,0,0,0,0,b,-a,0,0,a,b,0,0,0,0,1);return this},makeRotationY:function(a){var b=Math.cos(a);a=Math.sin(a); +this.set(b,0,a,0,0,1,0,0,-a,0,b,0,0,0,0,1);return this},makeRotationZ:function(a){var b=Math.cos(a);a=Math.sin(a);this.set(b,-a,0,0,a,b,0,0,0,0,1,0,0,0,0,1);return this},makeRotationAxis:function(a,b){var c=Math.cos(b);b=Math.sin(b);var d=1-c,e=a.x,f=a.y;a=a.z;var g=d*e,h=d*f;this.set(g*e+c,g*f-b*a,g*a+b*f,0,g*f+b*a,h*f+c,h*a-b*e,0,g*a-b*f,h*a+b*e,d*a*a+c,0,0,0,0,1);return this},makeScale:function(a,b,c){this.set(a,0,0,0,0,b,0,0,0,0,c,0,0,0,0,1);return this},makeShear:function(a,b,c){this.set(1,b, +c,0,a,1,c,0,a,b,1,0,0,0,0,1);return this},compose:function(a,b,c){this.makeRotationFromQuaternion(b);this.scale(c);this.setPosition(a);return this},decompose:function(){var a=new p,b=new P;return function(c,d,e){var f=this.elements,g=a.set(f[0],f[1],f[2]).length(),h=a.set(f[4],f[5],f[6]).length(),k=a.set(f[8],f[9],f[10]).length();0>this.determinant()&&(g=-g);c.x=f[12];c.y=f[13];c.z=f[14];b.copy(this);c=1/g;f=1/h;var m=1/k;b.elements[0]*=c;b.elements[1]*=c;b.elements[2]*=c;b.elements[4]*=f;b.elements[5]*= +f;b.elements[6]*=f;b.elements[8]*=m;b.elements[9]*=m;b.elements[10]*=m;d.setFromRotationMatrix(b);e.x=g;e.y=h;e.z=k;return this}}(),makePerspective:function(a,b,c,d,e,f){void 0===f&&console.warn("THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.");var g=this.elements;g[0]=2*e/(b-a);g[4]=0;g[8]=(b+a)/(b-a);g[12]=0;g[1]=0;g[5]=2*e/(c-d);g[9]=(c+d)/(c-d);g[13]=0;g[2]=0;g[6]=0;g[10]=-(f+e)/(f-e);g[14]=-2*f*e/(f-e);g[3]=0;g[7]=0;g[11]=-1;g[15]=0;return this}, +makeOrthographic:function(a,b,c,d,e,f){var g=this.elements,h=1/(b-a),k=1/(c-d),m=1/(f-e);g[0]=2*h;g[4]=0;g[8]=0;g[12]=-((b+a)*h);g[1]=0;g[5]=2*k;g[9]=0;g[13]=-((c+d)*k);g[2]=0;g[6]=0;g[10]=-2*m;g[14]=-((f+e)*m);g[3]=0;g[7]=0;g[11]=0;g[15]=1;return this},equals:function(a){var b=this.elements;a=a.elements;for(var c=0;16>c;c++)if(b[c]!==a[c])return!1;return!0},fromArray:function(a,b){void 0===b&&(b=0);for(var c=0;16>c;c++)this.elements[c]=a[c+b];return this},toArray:function(a,b){void 0===a&&(a=[]); +void 0===b&&(b=0);var c=this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];a[b+9]=c[9];a[b+10]=c[10];a[b+11]=c[11];a[b+12]=c[12];a[b+13]=c[13];a[b+14]=c[14];a[b+15]=c[15];return a}});Object.assign(ca,{slerp:function(a,b,c,d){return c.copy(a).slerp(b,d)},slerpFlat:function(a,b,c,d,e,f,g){var h=c[d+0],k=c[d+1],m=c[d+2];c=c[d+3];d=e[f+0];var l=e[f+1],n=e[f+2];e=e[f+3];if(c!==e||h!==d||k!==l||m!==n){f=1-g;var p=h*d+k*l+m*n+c*e,q=0<= +p?1:-1,r=1-p*p;r>Number.EPSILON&&(r=Math.sqrt(r),p=Math.atan2(r,p*q),f=Math.sin(f*p)/r,g=Math.sin(g*p)/r);q*=g;h=h*f+d*q;k=k*f+l*q;m=m*f+n*q;c=c*f+e*q;f===1-g&&(g=1/Math.sqrt(h*h+k*k+m*m+c*c),h*=g,k*=g,m*=g,c*=g)}a[b]=h;a[b+1]=k;a[b+2]=m;a[b+3]=c}});Object.defineProperties(ca.prototype,{x:{get:function(){return this._x},set:function(a){this._x=a;this.onChangeCallback()}},y:{get:function(){return this._y},set:function(a){this._y=a;this.onChangeCallback()}},z:{get:function(){return this._z},set:function(a){this._z= +a;this.onChangeCallback()}},w:{get:function(){return this._w},set:function(a){this._w=a;this.onChangeCallback()}}});Object.assign(ca.prototype,{set:function(a,b,c,d){this._x=a;this._y=b;this._z=c;this._w=d;this.onChangeCallback();return this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._w)},copy:function(a){this._x=a.x;this._y=a.y;this._z=a.z;this._w=a.w;this.onChangeCallback();return this},setFromEuler:function(a,b){if(!a||!a.isEuler)throw Error("THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order."); +var c=a._x,d=a._y,e=a._z;a=a.order;var f=Math.cos,g=Math.sin,h=f(c/2),k=f(d/2);f=f(e/2);c=g(c/2);d=g(d/2);e=g(e/2);"XYZ"===a?(this._x=c*k*f+h*d*e,this._y=h*d*f-c*k*e,this._z=h*k*e+c*d*f,this._w=h*k*f-c*d*e):"YXZ"===a?(this._x=c*k*f+h*d*e,this._y=h*d*f-c*k*e,this._z=h*k*e-c*d*f,this._w=h*k*f+c*d*e):"ZXY"===a?(this._x=c*k*f-h*d*e,this._y=h*d*f+c*k*e,this._z=h*k*e+c*d*f,this._w=h*k*f-c*d*e):"ZYX"===a?(this._x=c*k*f-h*d*e,this._y=h*d*f+c*k*e,this._z=h*k*e-c*d*f,this._w=h*k*f+c*d*e):"YZX"===a?(this._x= +c*k*f+h*d*e,this._y=h*d*f+c*k*e,this._z=h*k*e-c*d*f,this._w=h*k*f-c*d*e):"XZY"===a&&(this._x=c*k*f-h*d*e,this._y=h*d*f-c*k*e,this._z=h*k*e+c*d*f,this._w=h*k*f+c*d*e);if(!1!==b)this.onChangeCallback();return this},setFromAxisAngle:function(a,b){b/=2;var c=Math.sin(b);this._x=a.x*c;this._y=a.y*c;this._z=a.z*c;this._w=Math.cos(b);this.onChangeCallback();return this},setFromRotationMatrix:function(a){var b=a.elements,c=b[0];a=b[4];var d=b[8],e=b[1],f=b[5],g=b[9],h=b[2],k=b[6];b=b[10];var m=c+f+b;0<m? +(c=.5/Math.sqrt(m+1),this._w=.25/c,this._x=(k-g)*c,this._y=(d-h)*c,this._z=(e-a)*c):c>f&&c>b?(c=2*Math.sqrt(1+c-f-b),this._w=(k-g)/c,this._x=.25*c,this._y=(a+e)/c,this._z=(d+h)/c):f>b?(c=2*Math.sqrt(1+f-c-b),this._w=(d-h)/c,this._x=(a+e)/c,this._y=.25*c,this._z=(g+k)/c):(c=2*Math.sqrt(1+b-c-f),this._w=(e-a)/c,this._x=(d+h)/c,this._y=(g+k)/c,this._z=.25*c);this.onChangeCallback();return this},setFromUnitVectors:function(){var a=new p,b;return function(c,d){void 0===a&&(a=new p);b=c.dot(d)+1;1E-6>b? +(b=0,Math.abs(c.x)>Math.abs(c.z)?a.set(-c.y,c.x,0):a.set(0,-c.z,c.y)):a.crossVectors(c,d);this._x=a.x;this._y=a.y;this._z=a.z;this._w=b;return this.normalize()}}(),inverse:function(){return this.conjugate()},conjugate:function(){this._x*=-1;this._y*=-1;this._z*=-1;this.onChangeCallback();return this},dot:function(a){return this._x*a._x+this._y*a._y+this._z*a._z+this._w*a._w},lengthSq:function(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w},length:function(){return Math.sqrt(this._x* +this._x+this._y*this._y+this._z*this._z+this._w*this._w)},normalize:function(){var a=this.length();0===a?(this._z=this._y=this._x=0,this._w=1):(a=1/a,this._x*=a,this._y*=a,this._z*=a,this._w*=a);this.onChangeCallback();return this},multiply:function(a,b){return void 0!==b?(console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),this.multiplyQuaternions(a,b)):this.multiplyQuaternions(this,a)},premultiply:function(a){return this.multiplyQuaternions(a, +this)},multiplyQuaternions:function(a,b){var c=a._x,d=a._y,e=a._z;a=a._w;var f=b._x,g=b._y,h=b._z;b=b._w;this._x=c*b+a*f+d*h-e*g;this._y=d*b+a*g+e*f-c*h;this._z=e*b+a*h+c*g-d*f;this._w=a*b-c*f-d*g-e*h;this.onChangeCallback();return this},slerp:function(a,b){if(0===b)return this;if(1===b)return this.copy(a);var c=this._x,d=this._y,e=this._z,f=this._w,g=f*a._w+c*a._x+d*a._y+e*a._z;0>g?(this._w=-a._w,this._x=-a._x,this._y=-a._y,this._z=-a._z,g=-g):this.copy(a);if(1<=g)return this._w=f,this._x=c,this._y= +d,this._z=e,this;a=Math.sqrt(1-g*g);if(.001>Math.abs(a))return this._w=.5*(f+this._w),this._x=.5*(c+this._x),this._y=.5*(d+this._y),this._z=.5*(e+this._z),this;var h=Math.atan2(a,g);g=Math.sin((1-b)*h)/a;b=Math.sin(b*h)/a;this._w=f*g+this._w*b;this._x=c*g+this._x*b;this._y=d*g+this._y*b;this._z=e*g+this._z*b;this.onChangeCallback();return this},equals:function(a){return a._x===this._x&&a._y===this._y&&a._z===this._z&&a._w===this._w},fromArray:function(a,b){void 0===b&&(b=0);this._x=a[b];this._y=a[b+ +1];this._z=a[b+2];this._w=a[b+3];this.onChangeCallback();return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this._x;a[b+1]=this._y;a[b+2]=this._z;a[b+3]=this._w;return a},onChange:function(a){this.onChangeCallback=a;return this},onChangeCallback:function(){}});Object.assign(p.prototype,{isVector3:!0,set:function(a,b,c){this.x=a;this.y=b;this.z=c;return this},setScalar:function(a){this.z=this.y=this.x=a;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y= +a;return this},setZ:function(a){this.z=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;case 2:this.z=b;break;default:throw Error("index is out of range: "+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y,this.z)},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;return this}, +add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;return this},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;this.z+=a.z*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."), +this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;return this},subScalar:function(a){this.x-=a;this.y-=a;this.z-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;return this},multiply:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(a,b);this.x*=a.x;this.y*=a.y;this.z*=a.z;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*= +a;return this},multiplyVectors:function(a,b){this.x=a.x*b.x;this.y=a.y*b.y;this.z=a.z*b.z;return this},applyEuler:function(){var a=new ca;return function(b){b&&b.isEuler||console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.");return this.applyQuaternion(a.setFromEuler(b))}}(),applyAxisAngle:function(){var a=new ca;return function(b,c){return this.applyQuaternion(a.setFromAxisAngle(b,c))}}(),applyMatrix3:function(a){var b=this.x,c=this.y,d=this.z; +a=a.elements;this.x=a[0]*b+a[3]*c+a[6]*d;this.y=a[1]*b+a[4]*c+a[7]*d;this.z=a[2]*b+a[5]*c+a[8]*d;return this},applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;var e=1/(a[3]*b+a[7]*c+a[11]*d+a[15]);this.x=(a[0]*b+a[4]*c+a[8]*d+a[12])*e;this.y=(a[1]*b+a[5]*c+a[9]*d+a[13])*e;this.z=(a[2]*b+a[6]*c+a[10]*d+a[14])*e;return this},applyQuaternion:function(a){var b=this.x,c=this.y,d=this.z,e=a.x,f=a.y,g=a.z;a=a.w;var h=a*b+f*d-g*c,k=a*c+g*b-e*d,m=a*d+e*c-f*b;b=-e*b-f*c-g*d;this.x=h*a+b* +-e+k*-g-m*-f;this.y=k*a+b*-f+m*-e-h*-g;this.z=m*a+b*-g+h*-f-k*-e;return this},project:function(){var a=new P;return function(b){a.multiplyMatrices(b.projectionMatrix,a.getInverse(b.matrixWorld));return this.applyMatrix4(a)}}(),unproject:function(){var a=new P;return function(b){a.multiplyMatrices(b.matrixWorld,a.getInverse(b.projectionMatrix));return this.applyMatrix4(a)}}(),transformDirection:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d;this.y=a[1]*b+a[5]*c+ +a[9]*d;this.z=a[2]*b+a[6]*c+a[10]*d;return this.normalize()},divide:function(a){this.x/=a.x;this.y/=a.y;this.z/=a.z;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);this.z=Math.min(this.z,a.z);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);this.z=Math.max(this.z,a.z);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y, +this.y));this.z=Math.max(a.z,Math.min(b.z,this.z));return this},clampScalar:function(){var a=new p,b=new p;return function(c,d){a.set(c,c,c);b.set(d,d,d);return this.clamp(a,b)}}(),clampLength:function(a,b){var c=this.length();return this.divideScalar(c||1).multiplyScalar(Math.max(a,Math.min(b,c)))},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);this.z=Math.floor(this.z);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);this.z=Math.ceil(this.z);return this}, +round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);this.z=Math.round(this.z);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);this.z=0>this.z?Math.ceil(this.z):Math.floor(this.z);return this},negate:function(){this.x=-this.x;this.y=-this.y;this.z=-this.z;return this},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z}, +length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length()||1)},setLength:function(a){return this.normalize().multiplyScalar(a)},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;return this},lerpVectors:function(a,b,c){return this.subVectors(b,a).multiplyScalar(c).add(a)},cross:function(a,b){return void 0!== +b?(console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),this.crossVectors(a,b)):this.crossVectors(this,a)},crossVectors:function(a,b){var c=a.x,d=a.y;a=a.z;var e=b.x,f=b.y;b=b.z;this.x=d*b-a*f;this.y=a*e-c*b;this.z=c*f-d*e;return this},projectOnVector:function(a){var b=a.dot(this)/a.lengthSq();return this.copy(a).multiplyScalar(b)},projectOnPlane:function(){var a=new p;return function(b){a.copy(this).projectOnVector(b);return this.sub(a)}}(),reflect:function(){var a= +new p;return function(b){return this.sub(a.copy(b).multiplyScalar(2*this.dot(b)))}}(),angleTo:function(a){a=this.dot(a)/Math.sqrt(this.lengthSq()*a.lengthSq());return Math.acos(S.clamp(a,-1,1))},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x,c=this.y-a.y;a=this.z-a.z;return b*b+c*c+a*a},manhattanDistanceTo:function(a){return Math.abs(this.x-a.x)+Math.abs(this.y-a.y)+Math.abs(this.z-a.z)},setFromSpherical:function(a){var b=Math.sin(a.phi)* +a.radius;this.x=b*Math.sin(a.theta);this.y=Math.cos(a.phi)*a.radius;this.z=b*Math.cos(a.theta);return this},setFromCylindrical:function(a){this.x=a.radius*Math.sin(a.theta);this.y=a.y;this.z=a.radius*Math.cos(a.theta);return this},setFromMatrixPosition:function(a){a=a.elements;this.x=a[12];this.y=a[13];this.z=a[14];return this},setFromMatrixScale:function(a){var b=this.setFromMatrixColumn(a,0).length(),c=this.setFromMatrixColumn(a,1).length();a=this.setFromMatrixColumn(a,2).length();this.x=b;this.y= +c;this.z=a;return this},setFromMatrixColumn:function(a,b){return this.fromArray(a.elements,4*b)},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;a[b+2]=this.z;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector3: offset has been removed from .fromBufferAttribute()."); +this.x=a.getX(b);this.y=a.getY(b);this.z=a.getZ(b);return this}});Object.assign(ta.prototype,{isMatrix3:!0,set:function(a,b,c,d,e,f,g,h,k){var m=this.elements;m[0]=a;m[1]=d;m[2]=g;m[3]=b;m[4]=e;m[5]=h;m[6]=c;m[7]=f;m[8]=k;return this},identity:function(){this.set(1,0,0,0,1,0,0,0,1);return this},clone:function(){return(new this.constructor).fromArray(this.elements)},copy:function(a){var b=this.elements;a=a.elements;b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];b[5]=a[5];b[6]=a[6];b[7]=a[7];b[8]= +a[8];return this},setFromMatrix4:function(a){a=a.elements;this.set(a[0],a[4],a[8],a[1],a[5],a[9],a[2],a[6],a[10]);return this},applyToBufferAttribute:function(){var a=new p;return function(b){for(var c=0,d=b.count;c<d;c++)a.x=b.getX(c),a.y=b.getY(c),a.z=b.getZ(c),a.applyMatrix3(this),b.setXYZ(c,a.x,a.y,a.z);return b}}(),multiply:function(a){return this.multiplyMatrices(this,a)},premultiply:function(a){return this.multiplyMatrices(a,this)},multiplyMatrices:function(a,b){var c=a.elements,d=b.elements; +b=this.elements;a=c[0];var e=c[3],f=c[6],g=c[1],h=c[4],k=c[7],m=c[2],l=c[5];c=c[8];var n=d[0],p=d[3],q=d[6],r=d[1],t=d[4],x=d[7],B=d[2],w=d[5];d=d[8];b[0]=a*n+e*r+f*B;b[3]=a*p+e*t+f*w;b[6]=a*q+e*x+f*d;b[1]=g*n+h*r+k*B;b[4]=g*p+h*t+k*w;b[7]=g*q+h*x+k*d;b[2]=m*n+l*r+c*B;b[5]=m*p+l*t+c*w;b[8]=m*q+l*x+c*d;return this},multiplyScalar:function(a){var b=this.elements;b[0]*=a;b[3]*=a;b[6]*=a;b[1]*=a;b[4]*=a;b[7]*=a;b[2]*=a;b[5]*=a;b[8]*=a;return this},determinant:function(){var a=this.elements,b=a[0],c=a[1], +d=a[2],e=a[3],f=a[4],g=a[5],h=a[6],k=a[7];a=a[8];return b*f*a-b*g*k-c*e*a+c*g*h+d*e*k-d*f*h},getInverse:function(a,b){a&&a.isMatrix4&&console.error("THREE.Matrix3: .getInverse() no longer takes a Matrix4 argument.");var c=a.elements;a=this.elements;var d=c[0],e=c[1],f=c[2],g=c[3],h=c[4],k=c[5],m=c[6],l=c[7];c=c[8];var n=c*h-k*l,p=k*m-c*g,q=l*g-h*m,r=d*n+e*p+f*q;if(0===r){if(!0===b)throw Error("THREE.Matrix3: .getInverse() can't invert matrix, determinant is 0");console.warn("THREE.Matrix3: .getInverse() can't invert matrix, determinant is 0"); +return this.identity()}b=1/r;a[0]=n*b;a[1]=(f*l-c*e)*b;a[2]=(k*e-f*h)*b;a[3]=p*b;a[4]=(c*d-f*m)*b;a[5]=(f*g-k*d)*b;a[6]=q*b;a[7]=(e*m-l*d)*b;a[8]=(h*d-e*g)*b;return this},transpose:function(){var a=this.elements;var b=a[1];a[1]=a[3];a[3]=b;b=a[2];a[2]=a[6];a[6]=b;b=a[5];a[5]=a[7];a[7]=b;return this},getNormalMatrix:function(a){return this.setFromMatrix4(a).getInverse(this).transpose()},transposeIntoArray:function(a){var b=this.elements;a[0]=b[0];a[1]=b[3];a[2]=b[6];a[3]=b[1];a[4]=b[4];a[5]=b[7];a[6]= +b[2];a[7]=b[5];a[8]=b[8];return this},setUvTransform:function(a,b,c,d,e,f,g){var h=Math.cos(e);e=Math.sin(e);this.set(c*h,c*e,-c*(h*f+e*g)+f+a,-d*e,d*h,-d*(-e*f+h*g)+g+b,0,0,1)},scale:function(a,b){var c=this.elements;c[0]*=a;c[3]*=a;c[6]*=a;c[1]*=b;c[4]*=b;c[7]*=b;return this},rotate:function(a){var b=Math.cos(a);a=Math.sin(a);var c=this.elements,d=c[0],e=c[3],f=c[6],g=c[1],h=c[4],k=c[7];c[0]=b*d+a*g;c[3]=b*e+a*h;c[6]=b*f+a*k;c[1]=-a*d+b*g;c[4]=-a*e+b*h;c[7]=-a*f+b*k;return this},translate:function(a, +b){var c=this.elements;c[0]+=a*c[2];c[3]+=a*c[5];c[6]+=a*c[8];c[1]+=b*c[2];c[4]+=b*c[5];c[7]+=b*c[8];return this},equals:function(a){var b=this.elements;a=a.elements;for(var c=0;9>c;c++)if(b[c]!==a[c])return!1;return!0},fromArray:function(a,b){void 0===b&&(b=0);for(var c=0;9>c;c++)this.elements[c]=a[c+b];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);var c=this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8]; +return a}});var xf=0;aa.DEFAULT_IMAGE=void 0;aa.DEFAULT_MAPPING=300;aa.prototype=Object.assign(Object.create(xa.prototype),{constructor:aa,isTexture:!0,clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.name=a.name;this.image=a.image;this.mipmaps=a.mipmaps.slice(0);this.mapping=a.mapping;this.wrapS=a.wrapS;this.wrapT=a.wrapT;this.magFilter=a.magFilter;this.minFilter=a.minFilter;this.anisotropy=a.anisotropy;this.format=a.format;this.type=a.type;this.offset.copy(a.offset); +this.repeat.copy(a.repeat);this.center.copy(a.center);this.rotation=a.rotation;this.matrixAutoUpdate=a.matrixAutoUpdate;this.matrix.copy(a.matrix);this.generateMipmaps=a.generateMipmaps;this.premultiplyAlpha=a.premultiplyAlpha;this.flipY=a.flipY;this.unpackAlignment=a.unpackAlignment;this.encoding=a.encoding;return this},toJSON:function(a){var b=void 0===a||"string"===typeof a;if(!b&&void 0!==a.textures[this.uuid])return a.textures[this.uuid];var c={metadata:{version:4.5,type:"Texture",generator:"Texture.toJSON"}, +uuid:this.uuid,name:this.name,mapping:this.mapping,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY};if(void 0!==this.image){var d=this.image;void 0===d.uuid&&(d.uuid=S.generateUUID());if(!b&&void 0===a.images[d.uuid]){var e=a.images,f=d.uuid,g=d.uuid;if(d instanceof HTMLCanvasElement)var h=d; +else{h=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");h.width=d.width;h.height=d.height;var k=h.getContext("2d");d instanceof ImageData?k.putImageData(d,0,0):k.drawImage(d,0,0,d.width,d.height)}h=2048<h.width||2048<h.height?h.toDataURL("image/jpeg",.6):h.toDataURL("image/png");e[f]={uuid:g,url:h}}c.image=d.uuid}b||(a.textures[this.uuid]=c);return c},dispose:function(){this.dispatchEvent({type:"dispose"})},transformUv:function(a){if(300===this.mapping){a.applyMatrix3(this.matrix); +if(0>a.x||1<a.x)switch(this.wrapS){case 1E3:a.x-=Math.floor(a.x);break;case 1001:a.x=0>a.x?0:1;break;case 1002:a.x=1===Math.abs(Math.floor(a.x)%2)?Math.ceil(a.x)-a.x:a.x-Math.floor(a.x)}if(0>a.y||1<a.y)switch(this.wrapT){case 1E3:a.y-=Math.floor(a.y);break;case 1001:a.y=0>a.y?0:1;break;case 1002:a.y=1===Math.abs(Math.floor(a.y)%2)?Math.ceil(a.y)-a.y:a.y-Math.floor(a.y)}this.flipY&&(a.y=1-a.y)}}});Object.defineProperty(aa.prototype,"needsUpdate",{set:function(a){!0===a&&this.version++}});Object.assign(X.prototype, +{isVector4:!0,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},setScalar:function(a){this.w=this.z=this.y=this.x=a;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},setW:function(a){this.w=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;case 2:this.z=b;break;case 3:this.w=b;break;default:throw Error("index is out of range: "+a);}return this},getComponent:function(a){switch(a){case 0:return this.x; +case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y,this.z,this.w)},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=void 0!==a.w?a.w:1;return this},add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;this.w+=a.w;return this}, +addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;this.w+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;this.w=a.w+b.w;return this},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;this.z+=a.z*b;this.w+=a.w*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;this.w-=a.w;return this},subScalar:function(a){this.x-= +a;this.y-=a;this.z-=a;this.w-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;this.w=a.w-b.w;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;this.w*=a;return this},applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z,e=this.w;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d+a[12]*e;this.y=a[1]*b+a[5]*c+a[9]*d+a[13]*e;this.z=a[2]*b+a[6]*c+a[10]*d+a[14]*e;this.w=a[3]*b+a[7]*c+a[11]*d+a[15]*e;return this},divideScalar:function(a){return this.multiplyScalar(1/ +a)},setAxisAngleFromQuaternion:function(a){this.w=2*Math.acos(a.w);var b=Math.sqrt(1-a.w*a.w);1E-4>b?(this.x=1,this.z=this.y=0):(this.x=a.x/b,this.y=a.y/b,this.z=a.z/b);return this},setAxisAngleFromRotationMatrix:function(a){a=a.elements;var b=a[0];var c=a[4];var d=a[8],e=a[1],f=a[5],g=a[9];var h=a[2];var k=a[6];var m=a[10];if(.01>Math.abs(c-e)&&.01>Math.abs(d-h)&&.01>Math.abs(g-k)){if(.1>Math.abs(c+e)&&.1>Math.abs(d+h)&&.1>Math.abs(g+k)&&.1>Math.abs(b+f+m-3))return this.set(1,0,0,0),this;a=Math.PI; +b=(b+1)/2;f=(f+1)/2;m=(m+1)/2;c=(c+e)/4;d=(d+h)/4;g=(g+k)/4;b>f&&b>m?.01>b?(k=0,c=h=.707106781):(k=Math.sqrt(b),h=c/k,c=d/k):f>m?.01>f?(k=.707106781,h=0,c=.707106781):(h=Math.sqrt(f),k=c/h,c=g/h):.01>m?(h=k=.707106781,c=0):(c=Math.sqrt(m),k=d/c,h=g/c);this.set(k,h,c,a);return this}a=Math.sqrt((k-g)*(k-g)+(d-h)*(d-h)+(e-c)*(e-c));.001>Math.abs(a)&&(a=1);this.x=(k-g)/a;this.y=(d-h)/a;this.z=(e-c)/a;this.w=Math.acos((b+f+m-1)/2);return this},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y, +a.y);this.z=Math.min(this.z,a.z);this.w=Math.min(this.w,a.w);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);this.z=Math.max(this.z,a.z);this.w=Math.max(this.w,a.w);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));this.z=Math.max(a.z,Math.min(b.z,this.z));this.w=Math.max(a.w,Math.min(b.w,this.w));return this},clampScalar:function(){var a,b;return function(c,d){void 0===a&&(a=new X,b=new X);a.set(c, +c,c,c);b.set(d,d,d,d);return this.clamp(a,b)}}(),clampLength:function(a,b){var c=this.length();return this.divideScalar(c||1).multiplyScalar(Math.max(a,Math.min(b,c)))},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);this.z=Math.floor(this.z);this.w=Math.floor(this.w);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);this.z=Math.ceil(this.z);this.w=Math.ceil(this.w);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y); +this.z=Math.round(this.z);this.w=Math.round(this.w);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);this.z=0>this.z?Math.ceil(this.z):Math.floor(this.z);this.w=0>this.w?Math.ceil(this.w):Math.floor(this.w);return this},negate:function(){this.x=-this.x;this.y=-this.y;this.z=-this.z;this.w=-this.w;return this},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z+this.w*a.w},lengthSq:function(){return this.x* +this.x+this.y*this.y+this.z*this.z+this.w*this.w},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)},normalize:function(){return this.divideScalar(this.length()||1)},setLength:function(a){return this.normalize().multiplyScalar(a)},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;this.w+=(a.w-this.w)*b;return this},lerpVectors:function(a, +b,c){return this.subVectors(b,a).multiplyScalar(c).add(a)},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z&&a.w===this.w},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];this.w=a[b+3];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;a[b+2]=this.z;a[b+3]=this.w;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector4: offset has been removed from .fromBufferAttribute()."); +this.x=a.getX(b);this.y=a.getY(b);this.z=a.getZ(b);this.w=a.getW(b);return this}});jb.prototype=Object.assign(Object.create(xa.prototype),{constructor:jb,isWebGLRenderTarget:!0,setSize:function(a,b){if(this.width!==a||this.height!==b)this.width=a,this.height=b,this.dispose();this.viewport.set(0,0,a,b);this.scissor.set(0,0,a,b)},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.width=a.width;this.height=a.height;this.viewport.copy(a.viewport);this.texture=a.texture.clone(); +this.depthBuffer=a.depthBuffer;this.stencilBuffer=a.stencilBuffer;this.depthTexture=a.depthTexture;return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});Gb.prototype=Object.create(jb.prototype);Gb.prototype.constructor=Gb;Gb.prototype.isWebGLRenderTargetCube=!0;kb.prototype=Object.create(aa.prototype);kb.prototype.constructor=kb;kb.prototype.isDataTexture=!0;bb.prototype=Object.create(aa.prototype);bb.prototype.constructor=bb;bb.prototype.isCubeTexture=!0;Object.defineProperty(bb.prototype, +"images",{get:function(){return this.image},set:function(a){this.image=a}});var He=new aa,Ie=new bb,Ce=[],Ee=[],Ge=new Float32Array(16),Fe=new Float32Array(9);Me.prototype.setValue=function(a,b){for(var c=this.seq,d=0,e=c.length;d!==e;++d){var f=c[d];f.setValue(a,b[f.id])}};var Qd=/([\w\d_]+)(\])?(\[|\.)?/g;cb.prototype.setValue=function(a,b,c){b=this.map[b];void 0!==b&&b.setValue(a,c,this.renderer)};cb.prototype.setOptional=function(a,b,c){b=b[c];void 0!==b&&this.setValue(a,c,b)};cb.upload=function(a, +b,c,d){for(var e=0,f=b.length;e!==f;++e){var g=b[e],h=c[g.id];!1!==h.needsUpdate&&g.setValue(a,h.value,d)}};cb.seqWithValue=function(a,b){for(var c=[],d=0,e=a.length;d!==e;++d){var f=a[d];f.id in b&&c.push(f)}return c};var Kg={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272, +cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265, +dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323, +lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912, +mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864, +seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};Object.assign(H.prototype,{isColor:!0,r:1,g:1,b:1,set:function(a){a&&a.isColor?this.copy(a):"number"===typeof a?this.setHex(a):"string"=== +typeof a&&this.setStyle(a);return this},setScalar:function(a){this.b=this.g=this.r=a;return this},setHex:function(a){a=Math.floor(a);this.r=(a>>16&255)/255;this.g=(a>>8&255)/255;this.b=(a&255)/255;return this},setRGB:function(a,b,c){this.r=a;this.g=b;this.b=c;return this},setHSL:function(){function a(a,c,d){0>d&&(d+=1);1<d&&--d;return d<1/6?a+6*(c-a)*d:.5>d?c:d<2/3?a+6*(c-a)*(2/3-d):a}return function(b,c,d){b=S.euclideanModulo(b,1);c=S.clamp(c,0,1);d=S.clamp(d,0,1);0===c?this.r=this.g=this.b=d:(c= +.5>=d?d*(1+c):d+c-d*c,d=2*d-c,this.r=a(d,c,b+1/3),this.g=a(d,c,b),this.b=a(d,c,b-1/3));return this}}(),setStyle:function(a){function b(b){void 0!==b&&1>parseFloat(b)&&console.warn("THREE.Color: Alpha component of "+a+" will be ignored.")}var c;if(c=/^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec(a)){var d=c[2];switch(c[1]){case "rgb":case "rgba":if(c=/^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d))return this.r=Math.min(255,parseInt(c[1],10))/255,this.g=Math.min(255,parseInt(c[2],10))/ +255,this.b=Math.min(255,parseInt(c[3],10))/255,b(c[5]),this;if(c=/^(\d+)%\s*,\s*(\d+)%\s*,\s*(\d+)%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d))return this.r=Math.min(100,parseInt(c[1],10))/100,this.g=Math.min(100,parseInt(c[2],10))/100,this.b=Math.min(100,parseInt(c[3],10))/100,b(c[5]),this;break;case "hsl":case "hsla":if(c=/^([0-9]*\.?[0-9]+)\s*,\s*(\d+)%\s*,\s*(\d+)%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d)){d=parseFloat(c[1])/360;var e=parseInt(c[2],10)/100,f=parseInt(c[3],10)/100;b(c[5]);return this.setHSL(d, +e,f)}}}else if(c=/^#([A-Fa-f0-9]+)$/.exec(a)){c=c[1];d=c.length;if(3===d)return this.r=parseInt(c.charAt(0)+c.charAt(0),16)/255,this.g=parseInt(c.charAt(1)+c.charAt(1),16)/255,this.b=parseInt(c.charAt(2)+c.charAt(2),16)/255,this;if(6===d)return this.r=parseInt(c.charAt(0)+c.charAt(1),16)/255,this.g=parseInt(c.charAt(2)+c.charAt(3),16)/255,this.b=parseInt(c.charAt(4)+c.charAt(5),16)/255,this}a&&0<a.length&&(c=Kg[a],void 0!==c?this.setHex(c):console.warn("THREE.Color: Unknown color "+a));return this}, +clone:function(){return new this.constructor(this.r,this.g,this.b)},copy:function(a){this.r=a.r;this.g=a.g;this.b=a.b;return this},copyGammaToLinear:function(a,b){void 0===b&&(b=2);this.r=Math.pow(a.r,b);this.g=Math.pow(a.g,b);this.b=Math.pow(a.b,b);return this},copyLinearToGamma:function(a,b){void 0===b&&(b=2);b=0<b?1/b:1;this.r=Math.pow(a.r,b);this.g=Math.pow(a.g,b);this.b=Math.pow(a.b,b);return this},convertGammaToLinear:function(){var a=this.r,b=this.g,c=this.b;this.r=a*a;this.g=b*b;this.b=c* +c;return this},convertLinearToGamma:function(){this.r=Math.sqrt(this.r);this.g=Math.sqrt(this.g);this.b=Math.sqrt(this.b);return this},getHex:function(){return 255*this.r<<16^255*this.g<<8^255*this.b<<0},getHexString:function(){return("000000"+this.getHex().toString(16)).slice(-6)},getHSL:function(a){a=a||{h:0,s:0,l:0};var b=this.r,c=this.g,d=this.b,e=Math.max(b,c,d),f=Math.min(b,c,d),g,h=(f+e)/2;if(f===e)f=g=0;else{var k=e-f;f=.5>=h?k/(e+f):k/(2-e-f);switch(e){case b:g=(c-d)/k+(c<d?6:0);break;case c:g= +(d-b)/k+2;break;case d:g=(b-c)/k+4}g/=6}a.h=g;a.s=f;a.l=h;return a},getStyle:function(){return"rgb("+(255*this.r|0)+","+(255*this.g|0)+","+(255*this.b|0)+")"},offsetHSL:function(a,b,c){var d=this.getHSL();d.h+=a;d.s+=b;d.l+=c;this.setHSL(d.h,d.s,d.l);return this},add:function(a){this.r+=a.r;this.g+=a.g;this.b+=a.b;return this},addColors:function(a,b){this.r=a.r+b.r;this.g=a.g+b.g;this.b=a.b+b.b;return this},addScalar:function(a){this.r+=a;this.g+=a;this.b+=a;return this},sub:function(a){this.r=Math.max(0, +this.r-a.r);this.g=Math.max(0,this.g-a.g);this.b=Math.max(0,this.b-a.b);return this},multiply:function(a){this.r*=a.r;this.g*=a.g;this.b*=a.b;return this},multiplyScalar:function(a){this.r*=a;this.g*=a;this.b*=a;return this},lerp:function(a,b){this.r+=(a.r-this.r)*b;this.g+=(a.g-this.g)*b;this.b+=(a.b-this.b)*b;return this},equals:function(a){return a.r===this.r&&a.g===this.g&&a.b===this.b},fromArray:function(a,b){void 0===b&&(b=0);this.r=a[b];this.g=a[b+1];this.b=a[b+2];return this},toArray:function(a, +b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.r;a[b+1]=this.g;a[b+2]=this.b;return a},toJSON:function(){return this.getHex()}});var I={common:{diffuse:{value:new H(15658734)},opacity:{value:1},map:{value:null},uvTransform:{value:new ta},alphaMap:{value:null}},specularmap:{specularMap:{value:null}},envmap:{envMap:{value:null},flipEnvMap:{value:-1},reflectivity:{value:1},refractionRatio:{value:.98}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1}}, +emissivemap:{emissiveMap:{value:null}},bumpmap:{bumpMap:{value:null},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalScale:{value:new C(1,1)}},displacementmap:{displacementMap:{value:null},displacementScale:{value:1},displacementBias:{value:0}},roughnessmap:{roughnessMap:{value:null}},metalnessmap:{metalnessMap:{value:null}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:2.5E-4},fogNear:{value:1},fogFar:{value:2E3},fogColor:{value:new H(16777215)}},lights:{ambientLightColor:{value:[]}, +directionalLights:{value:[],properties:{direction:{},color:{},shadow:{},shadowBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{},shadow:{},shadowBias:{},shadowRadius:{},shadowMapSize:{}}},spotShadowMap:{value:[]},spotShadowMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{},shadow:{},shadowBias:{}, +shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}}},points:{diffuse:{value:new H(15658734)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},uvTransform:{value:new ta}}},Ea={merge:function(a){for(var b={},c=0;c<a.length;c++){var d=this.clone(a[c]), +e;for(e in d)b[e]=d[e]}return b},clone:function(a){var b={},c;for(c in a){b[c]={};for(var d in a[c]){var e=a[c][d];e&&(e.isColor||e.isMatrix3||e.isMatrix4||e.isVector2||e.isVector3||e.isVector4||e.isTexture)?b[c][d]=e.clone():Array.isArray(e)?b[c][d]=e.slice():b[c][d]=e}}return b}},R={alphamap_fragment:"#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif\n",alphamap_pars_fragment:"#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif\n",alphatest_fragment:"#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif\n", +aomap_fragment:"#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\n\t#endif\n#endif\n",aomap_pars_fragment:"#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif", +begin_vertex:"\nvec3 transformed = vec3( position );\n",beginnormal_vertex:"\nvec3 objectNormal = vec3( normal );\n",bsdfs:"float punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\tif( decayExponent > 0.0 ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\treturn distanceFalloff * maxDistanceCutoffFactor;\n#else\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n#endif\n\t}\n\treturn 1.0;\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\nvec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;\n\treturn specularColor * AB.x + AB.y;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n", +bumpmap_pars_fragment:"#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\t\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif\n", +clipping_planes_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\tif ( clipped ) discard;\n\t#endif\n#endif\n", +clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\t#if ! defined( PHYSICAL ) && ! defined( PHONG )\n\t\tvarying vec3 vViewPosition;\n\t#endif\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif\n",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvarying vec3 vViewPosition;\n#endif\n",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n", +color_fragment:"#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif\n",color_pars_vertex:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif",color_vertex:"#ifdef USE_COLOR\n\tvColor.xyz = color.xyz;\n#endif",common:"#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat linearToRelativeLuminance( const in vec3 color ) {\n\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\n\treturn dot( weights, color.rgb );\n}\n", +cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n#define cubeUV_textureSize (1024.0)\nint getFaceFromDirection(vec3 direction) {\n\tvec3 absDirection = abs(direction);\n\tint face = -1;\n\tif( absDirection.x > absDirection.z ) {\n\t\tif(absDirection.x > absDirection.y )\n\t\t\tface = direction.x > 0.0 ? 0 : 3;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\telse {\n\t\tif(absDirection.z > absDirection.y )\n\t\t\tface = direction.z > 0.0 ? 2 : 5;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\treturn face;\n}\n#define cubeUV_maxLods1 (log2(cubeUV_textureSize*0.25) - 1.0)\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\n\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\n\tfloat dxRoughness = dFdx(roughness);\n\tfloat dyRoughness = dFdy(roughness);\n\tvec3 dx = dFdx( vec * scale * dxRoughness );\n\tvec3 dy = dFdy( vec * scale * dyRoughness );\n\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\n\td = clamp(d, 1.0, cubeUV_rangeClamp);\n\tfloat mipLevel = 0.5 * log2(d);\n\treturn vec2(floor(mipLevel), fract(mipLevel));\n}\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\n\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\n\tfloat a = 16.0 * cubeUV_rcpTextureSize;\n\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\n\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\n\tfloat powScale = exp2_packed.x * exp2_packed.y;\n\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\n\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\n\tbool bRes = mipLevel == 0.0;\n\tscale = bRes && (scale < a) ? a : scale;\n\tvec3 r;\n\tvec2 offset;\n\tint face = getFaceFromDirection(direction);\n\tfloat rcpPowScale = 1.0 / powScale;\n\tif( face == 0) {\n\t\tr = vec3(direction.x, -direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 1) {\n\t\tr = vec3(direction.y, direction.x, direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 2) {\n\t\tr = vec3(direction.z, direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 3) {\n\t\tr = vec3(direction.x, direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse if( face == 4) {\n\t\tr = vec3(direction.y, direction.x, -direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse {\n\t\tr = vec3(direction.z, -direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\tr = normalize(r);\n\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\n\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\n\tvec2 base = offset + vec2( texelOffset );\n\treturn base + s * ( scale - 2.0 * texelOffset );\n}\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\n\tfloat roughnessVal = roughness* cubeUV_maxLods3;\n\tfloat r1 = floor(roughnessVal);\n\tfloat r2 = r1 + 1.0;\n\tfloat t = fract(roughnessVal);\n\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\n\tfloat s = mipInfo.y;\n\tfloat level0 = mipInfo.x;\n\tfloat level1 = level0 + 1.0;\n\tlevel1 = level1 > 5.0 ? 5.0 : level1;\n\tlevel0 += min( floor( s + 0.5 ), 5.0 );\n\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\n\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\n\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\n\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\n\tvec4 result = mix(color10, color20, t);\n\treturn vec4(result.rgb, 1.0);\n}\n#endif\n", +defaultnormal_vertex:"vec3 transformedNormal = normalMatrix * objectNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif\n",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\n#endif\n", +emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif\n",emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif\n",encodings_fragment:" gl_FragColor = linearToOutputTexel( gl_FragColor );\n",encodings_pars_fragment:"\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.w );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.w );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.xyz * value.w * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = min( floor( D ) / 255.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value ) {\n\tvec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\n\tXp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract(Le);\n\tvResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\n\treturn vec4( max(vRGB, 0.0), 1.0 );\n}\n", +envmap_fragment:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\treflectVec = normalize( reflectVec );\n\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\treflectVec = normalize( reflectVec );\n\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\n\t\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\tenvColor = envMapTexelToLinear( envColor );\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif\n", +envmap_pars_fragment:"#if defined( USE_ENVMAP ) || defined( PHYSICAL )\n\tuniform float reflectivity;\n\tuniform float envMapIntensity;\n#endif\n#ifdef USE_ENVMAP\n\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\n\t\tvarying vec3 vWorldPosition;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\tuniform float flipEnvMap;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL )\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif\n", +envmap_pars_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif\n",envmap_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif\n", +fog_vertex:"\n#ifdef USE_FOG\nfogDepth = -mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n varying float fogDepth;\n#endif\n",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif\n",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float fogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif\n", +gradientmap_pars_fragment:"#ifdef TOON\n\tuniform sampler2D gradientMap;\n\tvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\t\tfloat dotNL = dot( normal, lightDirection );\n\t\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t\t#ifdef USE_GRADIENTMAP\n\t\t\treturn texture2D( gradientMap, coord ).rgb;\n\t\t#else\n\t\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t\t#endif\n\t}\n#endif\n",lightmap_fragment:"#ifdef USE_LIGHTMAP\n\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n#endif\n", +lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_vertex:"vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\n#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n#endif\n", +lights_pars:"uniform vec3 ambientLightColor;\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t\tfloat shadowCameraNear;\n\t\tfloat shadowCameraFar;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( angleCos > spotLight.coneCos ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif\n#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar + 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\n\t\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\t\tvec2 sampleUV;\n\t\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif\n", +lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;\n",lights_phong_pars_fragment:"varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifdef TOON\n\t\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#else\n\t\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\t\tvec3 irradiance = dotNL * directLight.color;\n\t#endif\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)\n", +lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\n#ifdef STANDARD\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.clearCoat = saturate( clearCoat );\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\n#endif\n", +lights_physical_pars_fragment:"struct PhysicalMaterial {\n\tvec3\tdiffuseColor;\n\tfloat\tspecularRoughness;\n\tvec3\tspecularColor;\n\t#ifndef STANDARD\n\t\tfloat clearCoat;\n\t\tfloat clearCoatRoughness;\n\t#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.specularRoughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos - halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos + halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos + halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos - halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3( 0, 1, 0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifndef STANDARD\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\n\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\t#ifndef STANDARD\n\t\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifndef STANDARD\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\tfloat dotNL = dotNV;\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\n\t#ifndef STANDARD\n\t\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\n#define Material_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.specularRoughness )\n#define Material_ClearCoat_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}\n", +lights_template:"\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = normalize( vViewPosition );\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#ifdef USE_LIGHTMAP\n\t\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tirradiance += getLightProbeIndirectIrradiance( geometry, 8 );\n\t#endif\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tvec3 radiance = getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), 8 );\n\t#ifndef STANDARD\n\t\tvec3 clearCoatRadiance = getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), 8 );\n\t#else\n\t\tvec3 clearCoatRadiance = vec3( 0.0 );\n\t#endif\n\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\n#endif\n", +logdepthbuf_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#ifdef USE_LOGDEPTHBUF\n\tuniform float logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n#endif\n",logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n\tuniform float logDepthBufFC;\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t#else\n\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\tgl_Position.z *= gl_Position.w;\n\t#endif\n#endif\n", +map_fragment:"#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif\n",map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n",map_particle_fragment:"#ifdef USE_MAP\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n\tvec4 mapTexel = texture2D( map, uv );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n",map_particle_pars_fragment:"#ifdef USE_MAP\n\tuniform mat3 uvTransform;\n\tuniform sampler2D map;\n#endif\n", +metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif\n",metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\n\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\n\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\n\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\n#endif\n", +morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\t#ifndef USE_MORPHNORMALS\n\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\n\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\n\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\n\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\n\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\n\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\n\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\n\t#endif\n#endif\n", +normal_fragment:"#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t#endif\n#endif\n#ifdef USE_NORMALMAP\n\tnormal = perturbNormal2Arb( -vViewPosition, normal );\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif\n", +normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\n\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tvec3 S = normalize( q0 * st1.t - q1 * st0.t );\n\t\tvec3 T = normalize( -q0 * st1.s + q1 * st0.s );\n\t\tvec3 N = normalize( surf_norm );\n\t\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\tmapN.xy = normalScale * mapN.xy;\n\t\tmat3 tsn = mat3( S, T, N );\n\t\treturn normalize( tsn * mapN );\n\t}\n#endif\n", +packing:"vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}\n", +premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif\n",project_vertex:"vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\ngl_Position = projectionMatrix * mvPosition;\n",dithering_fragment:"#if defined( DITHERING )\n gl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif\n",dithering_pars_fragment:"#if defined( DITHERING )\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif\n", +roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif\n",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\n\t\tconst vec2 offset = vec2( 0.0, 1.0 );\n\t\tvec2 texelSize = vec2( 1.0 ) / size;\n\t\tvec2 centroidUV = floor( uv * size + 0.5 ) / size;\n\t\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\n\t\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\n\t\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\n\t\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\n\t\tvec2 f = fract( uv * size + 0.5 );\n\t\tfloat a = mix( lb, lt, f.y );\n\t\tfloat b = mix( rb, rt, f.y );\n\t\tfloat c = mix( a, b, f.x );\n\t\treturn c;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tshadow = (\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif\n", +shadowmap_pars_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n#endif\n", +shadowmap_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n#endif\n", +shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tDirectionalLight directionalLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tSpotLight spotLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tPointLight pointLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#endif\n\t#endif\n\treturn shadow;\n}\n", +skinbase_vertex:"#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif\n", +skinning_vertex:"#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif\n",skinnormal_vertex:"#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n#endif\n", +specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif\n",tonemapping_pars_fragment:"#ifndef saturate\n\t#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nuniform float toneMappingWhitePoint;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\nvec3 Uncharted2ToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\n", +uv_pars_fragment:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n#endif",uv_pars_vertex:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n\tuniform mat3 uvTransform;\n#endif\n", +uv_vertex:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n#endif",uv2_pars_fragment:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif",uv2_pars_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n#endif", +uv2_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = uv2;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\n\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n#endif\n",cube_frag:"uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldPosition;\nvoid main() {\n\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\n\tgl_FragColor.a *= opacity;\n}\n", +cube_vert:"varying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\tgl_Position.z = gl_Position.w;\n}\n",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <logdepthbuf_fragment>\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( gl_FragCoord.z ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\n\t#endif\n}\n", +depth_vert:"#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n}\n", +distanceRGBA_frag:"#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main () {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}\n", +distanceRGBA_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\tvWorldPosition = worldPosition.xyz;\n}\n", +equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvec3 direction = normalize( vWorldPosition );\n\tvec2 sampleUV;\n\tsampleUV.y = asin( clamp( direction.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n}\n",equirect_vert:"varying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}\n", +linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <color_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n", +linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}\n", +meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include <aomap_fragment>\n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n", +meshbasic_vert:"#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_ENVMAP\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <envmap_vertex>\n\t#include <fog_vertex>\n}\n", +meshlambert_frag:"uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <bsdfs>\n#include <lights_pars>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <emissivemap_fragment>\n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#include <lightmap_fragment>\n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n", +meshlambert_vert:"#define LAMBERT\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <bsdfs>\n#include <lights_pars>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <lights_lambert_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n", +meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <gradientmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars>\n#include <lights_phong_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_fragment>\n\t#include <emissivemap_fragment>\n\t#include <lights_phong_fragment>\n\t#include <lights_template>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n", +meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n", +meshphysical_frag:"#define PHYSICAL\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifndef STANDARD\n\tuniform float clearCoat;\n\tuniform float clearCoatRoughness;\n#endif\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <cube_uv_reflection_fragment>\n#include <lights_pars>\n#include <lights_physical_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <roughnessmap_pars_fragment>\n#include <metalnessmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <roughnessmap_fragment>\n\t#include <metalnessmap_fragment>\n\t#include <normal_fragment>\n\t#include <emissivemap_fragment>\n\t#include <lights_physical_fragment>\n\t#include <lights_template>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n", +meshphysical_vert:"#define PHYSICAL\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n", +normal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <packing>\n#include <uv_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\nvoid main() {\n\t#include <logdepthbuf_fragment>\n\t#include <normal_fragment>\n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}\n", +normal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}\n", +points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <color_pars_fragment>\n#include <map_particle_pars_fragment>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_particle_fragment>\n\t#include <color_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n", +points_vert:"uniform float size;\nuniform float scale;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#ifdef USE_SIZEATTENUATION\n\t\tgl_PointSize = size * ( scale / - mvPosition.z );\n\t#else\n\t\tgl_PointSize = size;\n\t#endif\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n", +shadow_frag:"uniform vec3 color;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include <fog_fragment>\n}\n",shadow_vert:"#include <fog_pars_vertex>\n#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n"}, +qb={basic:{uniforms:Ea.merge([I.common,I.specularmap,I.envmap,I.aomap,I.lightmap,I.fog]),vertexShader:R.meshbasic_vert,fragmentShader:R.meshbasic_frag},lambert:{uniforms:Ea.merge([I.common,I.specularmap,I.envmap,I.aomap,I.lightmap,I.emissivemap,I.fog,I.lights,{emissive:{value:new H(0)}}]),vertexShader:R.meshlambert_vert,fragmentShader:R.meshlambert_frag},phong:{uniforms:Ea.merge([I.common,I.specularmap,I.envmap,I.aomap,I.lightmap,I.emissivemap,I.bumpmap,I.normalmap,I.displacementmap,I.gradientmap, +I.fog,I.lights,{emissive:{value:new H(0)},specular:{value:new H(1118481)},shininess:{value:30}}]),vertexShader:R.meshphong_vert,fragmentShader:R.meshphong_frag},standard:{uniforms:Ea.merge([I.common,I.envmap,I.aomap,I.lightmap,I.emissivemap,I.bumpmap,I.normalmap,I.displacementmap,I.roughnessmap,I.metalnessmap,I.fog,I.lights,{emissive:{value:new H(0)},roughness:{value:.5},metalness:{value:.5},envMapIntensity:{value:1}}]),vertexShader:R.meshphysical_vert,fragmentShader:R.meshphysical_frag},points:{uniforms:Ea.merge([I.points, +I.fog]),vertexShader:R.points_vert,fragmentShader:R.points_frag},dashed:{uniforms:Ea.merge([I.common,I.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:R.linedashed_vert,fragmentShader:R.linedashed_frag},depth:{uniforms:Ea.merge([I.common,I.displacementmap]),vertexShader:R.depth_vert,fragmentShader:R.depth_frag},normal:{uniforms:Ea.merge([I.common,I.bumpmap,I.normalmap,I.displacementmap,{opacity:{value:1}}]),vertexShader:R.normal_vert,fragmentShader:R.normal_frag},cube:{uniforms:{tCube:{value:null}, +tFlip:{value:-1},opacity:{value:1}},vertexShader:R.cube_vert,fragmentShader:R.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:R.equirect_vert,fragmentShader:R.equirect_frag},distanceRGBA:{uniforms:Ea.merge([I.common,I.displacementmap,{referencePosition:{value:new p},nearDistance:{value:1},farDistance:{value:1E3}}]),vertexShader:R.distanceRGBA_vert,fragmentShader:R.distanceRGBA_frag},shadow:{uniforms:Ea.merge([I.lights,I.fog,{color:{value:new H(0)},opacity:{value:1}}]),vertexShader:R.shadow_vert, +fragmentShader:R.shadow_frag}};qb.physical={uniforms:Ea.merge([qb.standard.uniforms,{clearCoat:{value:0},clearCoatRoughness:{value:0}}]),vertexShader:R.meshphysical_vert,fragmentShader:R.meshphysical_frag};qc.prototype=Object.create(aa.prototype);qc.prototype.constructor=qc;var Yf=0;O.prototype=Object.assign(Object.create(xa.prototype),{constructor:O,isMaterial:!0,onBeforeCompile:function(){},setValues:function(a){if(void 0!==a)for(var b in a){var c=a[b];if(void 0===c)console.warn("THREE.Material: '"+ +b+"' parameter is undefined.");else if("shading"===b)console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead."),this.flatShading=1===c?!0:!1;else{var d=this[b];void 0===d?console.warn("THREE."+this.type+": '"+b+"' is not a property of this material."):d&&d.isColor?d.set(c):d&&d.isVector3&&c&&c.isVector3?d.copy(c):this[b]="overdraw"===b?Number(c):c}}},toJSON:function(a){function b(a){var b=[],c;for(c in a){var d=a[c];delete d.metadata;b.push(d)}return b}var c= +void 0===a||"string"===typeof a;c&&(a={textures:{},images:{}});var d={metadata:{version:4.5,type:"Material",generator:"Material.toJSON"}};d.uuid=this.uuid;d.type=this.type;""!==this.name&&(d.name=this.name);this.color&&this.color.isColor&&(d.color=this.color.getHex());void 0!==this.roughness&&(d.roughness=this.roughness);void 0!==this.metalness&&(d.metalness=this.metalness);this.emissive&&this.emissive.isColor&&(d.emissive=this.emissive.getHex());1!==this.emissiveIntensity&&(d.emissiveIntensity=this.emissiveIntensity); +this.specular&&this.specular.isColor&&(d.specular=this.specular.getHex());void 0!==this.shininess&&(d.shininess=this.shininess);void 0!==this.clearCoat&&(d.clearCoat=this.clearCoat);void 0!==this.clearCoatRoughness&&(d.clearCoatRoughness=this.clearCoatRoughness);this.map&&this.map.isTexture&&(d.map=this.map.toJSON(a).uuid);this.alphaMap&&this.alphaMap.isTexture&&(d.alphaMap=this.alphaMap.toJSON(a).uuid);this.lightMap&&this.lightMap.isTexture&&(d.lightMap=this.lightMap.toJSON(a).uuid);this.bumpMap&& +this.bumpMap.isTexture&&(d.bumpMap=this.bumpMap.toJSON(a).uuid,d.bumpScale=this.bumpScale);this.normalMap&&this.normalMap.isTexture&&(d.normalMap=this.normalMap.toJSON(a).uuid,d.normalScale=this.normalScale.toArray());this.displacementMap&&this.displacementMap.isTexture&&(d.displacementMap=this.displacementMap.toJSON(a).uuid,d.displacementScale=this.displacementScale,d.displacementBias=this.displacementBias);this.roughnessMap&&this.roughnessMap.isTexture&&(d.roughnessMap=this.roughnessMap.toJSON(a).uuid); +this.metalnessMap&&this.metalnessMap.isTexture&&(d.metalnessMap=this.metalnessMap.toJSON(a).uuid);this.emissiveMap&&this.emissiveMap.isTexture&&(d.emissiveMap=this.emissiveMap.toJSON(a).uuid);this.specularMap&&this.specularMap.isTexture&&(d.specularMap=this.specularMap.toJSON(a).uuid);this.envMap&&this.envMap.isTexture&&(d.envMap=this.envMap.toJSON(a).uuid,d.reflectivity=this.reflectivity);this.gradientMap&&this.gradientMap.isTexture&&(d.gradientMap=this.gradientMap.toJSON(a).uuid);void 0!==this.size&& +(d.size=this.size);void 0!==this.sizeAttenuation&&(d.sizeAttenuation=this.sizeAttenuation);1!==this.blending&&(d.blending=this.blending);!0===this.flatShading&&(d.flatShading=this.flatShading);0!==this.side&&(d.side=this.side);0!==this.vertexColors&&(d.vertexColors=this.vertexColors);1>this.opacity&&(d.opacity=this.opacity);!0===this.transparent&&(d.transparent=this.transparent);d.depthFunc=this.depthFunc;d.depthTest=this.depthTest;d.depthWrite=this.depthWrite;0!==this.rotation&&(d.rotation=this.rotation); +1!==this.linewidth&&(d.linewidth=this.linewidth);void 0!==this.dashSize&&(d.dashSize=this.dashSize);void 0!==this.gapSize&&(d.gapSize=this.gapSize);void 0!==this.scale&&(d.scale=this.scale);!0===this.dithering&&(d.dithering=!0);0<this.alphaTest&&(d.alphaTest=this.alphaTest);!0===this.premultipliedAlpha&&(d.premultipliedAlpha=this.premultipliedAlpha);!0===this.wireframe&&(d.wireframe=this.wireframe);1<this.wireframeLinewidth&&(d.wireframeLinewidth=this.wireframeLinewidth);"round"!==this.wireframeLinecap&& +(d.wireframeLinecap=this.wireframeLinecap);"round"!==this.wireframeLinejoin&&(d.wireframeLinejoin=this.wireframeLinejoin);!0===this.morphTargets&&(d.morphTargets=!0);!0===this.skinning&&(d.skinning=!0);!1===this.visible&&(d.visible=!1);"{}"!==JSON.stringify(this.userData)&&(d.userData=this.userData);c&&(c=b(a.textures),a=b(a.images),0<c.length&&(d.textures=c),0<a.length&&(d.images=a));return d},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.name=a.name;this.fog=a.fog; +this.lights=a.lights;this.blending=a.blending;this.side=a.side;this.flatShading=a.flatShading;this.vertexColors=a.vertexColors;this.opacity=a.opacity;this.transparent=a.transparent;this.blendSrc=a.blendSrc;this.blendDst=a.blendDst;this.blendEquation=a.blendEquation;this.blendSrcAlpha=a.blendSrcAlpha;this.blendDstAlpha=a.blendDstAlpha;this.blendEquationAlpha=a.blendEquationAlpha;this.depthFunc=a.depthFunc;this.depthTest=a.depthTest;this.depthWrite=a.depthWrite;this.colorWrite=a.colorWrite;this.precision= +a.precision;this.polygonOffset=a.polygonOffset;this.polygonOffsetFactor=a.polygonOffsetFactor;this.polygonOffsetUnits=a.polygonOffsetUnits;this.dithering=a.dithering;this.alphaTest=a.alphaTest;this.premultipliedAlpha=a.premultipliedAlpha;this.overdraw=a.overdraw;this.visible=a.visible;this.userData=JSON.parse(JSON.stringify(a.userData));this.clipShadows=a.clipShadows;this.clipIntersection=a.clipIntersection;var b=a.clippingPlanes,c=null;if(null!==b){var d=b.length;c=Array(d);for(var e=0;e!==d;++e)c[e]= +b[e].clone()}this.clippingPlanes=c;this.shadowSide=a.shadowSide;return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});db.prototype=Object.create(O.prototype);db.prototype.constructor=db;db.prototype.isMeshDepthMaterial=!0;db.prototype.copy=function(a){O.prototype.copy.call(this,a);this.depthPacking=a.depthPacking;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.map=a.map;this.alphaMap=a.alphaMap;this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale; +this.displacementBias=a.displacementBias;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;return this};eb.prototype=Object.create(O.prototype);eb.prototype.constructor=eb;eb.prototype.isMeshDistanceMaterial=!0;eb.prototype.copy=function(a){O.prototype.copy.call(this,a);this.referencePosition.copy(a.referencePosition);this.nearDistance=a.nearDistance;this.farDistance=a.farDistance;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.map=a.map;this.alphaMap=a.alphaMap; +this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;return this};Object.assign(Va.prototype,{isBox3:!0,set:function(a,b){this.min.copy(a);this.max.copy(b);return this},setFromArray:function(a){for(var b=Infinity,c=Infinity,d=Infinity,e=-Infinity,f=-Infinity,g=-Infinity,h=0,k=a.length;h<k;h+=3){var m=a[h],l=a[h+1],n=a[h+2];m<b&&(b=m);l<c&&(c=l);n<d&&(d=n);m>e&&(e=m);l>f&&(f=l);n>g&&(g=n)}this.min.set(b,c,d);this.max.set(e,f,g); +return this},setFromBufferAttribute:function(a){for(var b=Infinity,c=Infinity,d=Infinity,e=-Infinity,f=-Infinity,g=-Infinity,h=0,k=a.count;h<k;h++){var m=a.getX(h),l=a.getY(h),n=a.getZ(h);m<b&&(b=m);l<c&&(c=l);n<d&&(d=n);m>e&&(e=m);l>f&&(f=l);n>g&&(g=n)}this.min.set(b,c,d);this.max.set(e,f,g);return this},setFromPoints:function(a){this.makeEmpty();for(var b=0,c=a.length;b<c;b++)this.expandByPoint(a[b]);return this},setFromCenterAndSize:function(){var a=new p;return function(b,c){c=a.copy(c).multiplyScalar(.5); +this.min.copy(b).sub(c);this.max.copy(b).add(c);return this}}(),setFromObject:function(a){this.makeEmpty();return this.expandByObject(a)},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.min.copy(a.min);this.max.copy(a.max);return this},makeEmpty:function(){this.min.x=this.min.y=this.min.z=Infinity;this.max.x=this.max.y=this.max.z=-Infinity;return this},isEmpty:function(){return this.max.x<this.min.x||this.max.y<this.min.y||this.max.z<this.min.z},getCenter:function(a){a= +a||new p;return this.isEmpty()?a.set(0,0,0):a.addVectors(this.min,this.max).multiplyScalar(.5)},getSize:function(a){a=a||new p;return this.isEmpty()?a.set(0,0,0):a.subVectors(this.max,this.min)},expandByPoint:function(a){this.min.min(a);this.max.max(a);return this},expandByVector:function(a){this.min.sub(a);this.max.add(a);return this},expandByScalar:function(a){this.min.addScalar(-a);this.max.addScalar(a);return this},expandByObject:function(){function a(a){var f=a.geometry;if(void 0!==f)if(f.isGeometry)for(f= +f.vertices,c=0,d=f.length;c<d;c++)e.copy(f[c]),e.applyMatrix4(a.matrixWorld),b.expandByPoint(e);else if(f.isBufferGeometry&&(f=f.attributes.position,void 0!==f))for(c=0,d=f.count;c<d;c++)e.fromBufferAttribute(f,c).applyMatrix4(a.matrixWorld),b.expandByPoint(e)}var b,c,d,e=new p;return function(c){b=this;c.updateMatrixWorld(!0);c.traverse(a);return this}}(),containsPoint:function(a){return a.x<this.min.x||a.x>this.max.x||a.y<this.min.y||a.y>this.max.y||a.z<this.min.z||a.z>this.max.z?!1:!0},containsBox:function(a){return this.min.x<= +a.min.x&&a.max.x<=this.max.x&&this.min.y<=a.min.y&&a.max.y<=this.max.y&&this.min.z<=a.min.z&&a.max.z<=this.max.z},getParameter:function(a,b){return(b||new p).set((a.x-this.min.x)/(this.max.x-this.min.x),(a.y-this.min.y)/(this.max.y-this.min.y),(a.z-this.min.z)/(this.max.z-this.min.z))},intersectsBox:function(a){return a.max.x<this.min.x||a.min.x>this.max.x||a.max.y<this.min.y||a.min.y>this.max.y||a.max.z<this.min.z||a.min.z>this.max.z?!1:!0},intersectsSphere:function(){var a=new p;return function(b){this.clampPoint(b.center, +a);return a.distanceToSquared(b.center)<=b.radius*b.radius}}(),intersectsPlane:function(a){if(0<a.normal.x){var b=a.normal.x*this.min.x;var c=a.normal.x*this.max.x}else b=a.normal.x*this.max.x,c=a.normal.x*this.min.x;0<a.normal.y?(b+=a.normal.y*this.min.y,c+=a.normal.y*this.max.y):(b+=a.normal.y*this.max.y,c+=a.normal.y*this.min.y);0<a.normal.z?(b+=a.normal.z*this.min.z,c+=a.normal.z*this.max.z):(b+=a.normal.z*this.max.z,c+=a.normal.z*this.min.z);return b<=a.constant&&c>=a.constant},intersectsTriangle:function(){function a(a){var e; +var f=0;for(e=a.length-3;f<=e;f+=3){h.fromArray(a,f);var g=m.x*Math.abs(h.x)+m.y*Math.abs(h.y)+m.z*Math.abs(h.z),k=b.dot(h),n=c.dot(h),l=d.dot(h);if(Math.max(-Math.max(k,n,l),Math.min(k,n,l))>g)return!1}return!0}var b=new p,c=new p,d=new p,e=new p,f=new p,g=new p,h=new p,k=new p,m=new p,l=new p;return function(h){if(this.isEmpty())return!1;this.getCenter(k);m.subVectors(this.max,k);b.subVectors(h.a,k);c.subVectors(h.b,k);d.subVectors(h.c,k);e.subVectors(c,b);f.subVectors(d,c);g.subVectors(b,d);h= +[0,-e.z,e.y,0,-f.z,f.y,0,-g.z,g.y,e.z,0,-e.x,f.z,0,-f.x,g.z,0,-g.x,-e.y,e.x,0,-f.y,f.x,0,-g.y,g.x,0];if(!a(h))return!1;h=[1,0,0,0,1,0,0,0,1];if(!a(h))return!1;l.crossVectors(e,f);h=[l.x,l.y,l.z];return a(h)}}(),clampPoint:function(a,b){return(b||new p).copy(a).clamp(this.min,this.max)},distanceToPoint:function(){var a=new p;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(),getBoundingSphere:function(){var a=new p;return function(b){b=b||new Ca;this.getCenter(b.center); +b.radius=.5*this.getSize(a).length();return b}}(),intersect:function(a){this.min.max(a.min);this.max.min(a.max);this.isEmpty()&&this.makeEmpty();return this},union:function(a){this.min.min(a.min);this.max.max(a.max);return this},applyMatrix4:function(){var a=[new p,new p,new p,new p,new p,new p,new p,new p];return function(b){if(this.isEmpty())return this;a[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(b);a[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(b);a[2].set(this.min.x,this.max.y, +this.min.z).applyMatrix4(b);a[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(b);a[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(b);a[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(b);a[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(b);a[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(b);this.setFromPoints(a);return this}}(),translate:function(a){this.min.add(a);this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&&a.max.equals(this.max)}}); +Object.assign(Ca.prototype,{set:function(a,b){this.center.copy(a);this.radius=b;return this},setFromPoints:function(){var a=new Va;return function(b,c){var d=this.center;void 0!==c?d.copy(c):a.setFromPoints(b).getCenter(d);for(var e=c=0,f=b.length;e<f;e++)c=Math.max(c,d.distanceToSquared(b[e]));this.radius=Math.sqrt(c);return this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.center.copy(a.center);this.radius=a.radius;return this},empty:function(){return 0>=this.radius}, +containsPoint:function(a){return a.distanceToSquared(this.center)<=this.radius*this.radius},distanceToPoint:function(a){return a.distanceTo(this.center)-this.radius},intersectsSphere:function(a){var b=this.radius+a.radius;return a.center.distanceToSquared(this.center)<=b*b},intersectsBox:function(a){return a.intersectsSphere(this)},intersectsPlane:function(a){return Math.abs(a.distanceToPoint(this.center))<=this.radius},clampPoint:function(a,b){var c=this.center.distanceToSquared(a);b=b||new p;b.copy(a); +c>this.radius*this.radius&&(b.sub(this.center).normalize(),b.multiplyScalar(this.radius).add(this.center));return b},getBoundingBox:function(a){a=a||new Va;a.set(this.center,this.center);a.expandByScalar(this.radius);return a},applyMatrix4:function(a){this.center.applyMatrix4(a);this.radius*=a.getMaxScaleOnAxis();return this},translate:function(a){this.center.add(a);return this},equals:function(a){return a.center.equals(this.center)&&a.radius===this.radius}});Object.assign(pa.prototype,{set:function(a, +b){this.normal.copy(a);this.constant=b;return this},setComponents:function(a,b,c,d){this.normal.set(a,b,c);this.constant=d;return this},setFromNormalAndCoplanarPoint:function(a,b){this.normal.copy(a);this.constant=-b.dot(this.normal);return this},setFromCoplanarPoints:function(){var a=new p,b=new p;return function(c,d,e){d=a.subVectors(e,d).cross(b.subVectors(c,d)).normalize();this.setFromNormalAndCoplanarPoint(d,c);return this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.normal.copy(a.normal); +this.constant=a.constant;return this},normalize:function(){var a=1/this.normal.length();this.normal.multiplyScalar(a);this.constant*=a;return this},negate:function(){this.constant*=-1;this.normal.negate();return this},distanceToPoint:function(a){return this.normal.dot(a)+this.constant},distanceToSphere:function(a){return this.distanceToPoint(a.center)-a.radius},projectPoint:function(a,b){return(b||new p).copy(this.normal).multiplyScalar(-this.distanceToPoint(a)).add(a)},intersectLine:function(){var a= +new p;return function(b,c){c=c||new p;var d=b.delta(a),e=this.normal.dot(d);if(0===e){if(0===this.distanceToPoint(b.start))return c.copy(b.start)}else if(e=-(b.start.dot(this.normal)+this.constant)/e,!(0>e||1<e))return c.copy(d).multiplyScalar(e).add(b.start)}}(),intersectsLine:function(a){var b=this.distanceToPoint(a.start);a=this.distanceToPoint(a.end);return 0>b&&0<a||0>a&&0<b},intersectsBox:function(a){return a.intersectsPlane(this)},intersectsSphere:function(a){return a.intersectsPlane(this)}, +coplanarPoint:function(a){return(a||new p).copy(this.normal).multiplyScalar(-this.constant)},applyMatrix4:function(){var a=new p,b=new ta;return function(c,d){d=d||b.getNormalMatrix(c);c=this.coplanarPoint(a).applyMatrix4(c);d=this.normal.applyMatrix3(d).normalize();this.constant=-c.dot(d);return this}}(),translate:function(a){this.constant-=a.dot(this.normal);return this},equals:function(a){return a.normal.equals(this.normal)&&a.constant===this.constant}});Object.assign(ld.prototype,{set:function(a, +b,c,d,e,f){var g=this.planes;g[0].copy(a);g[1].copy(b);g[2].copy(c);g[3].copy(d);g[4].copy(e);g[5].copy(f);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){for(var b=this.planes,c=0;6>c;c++)b[c].copy(a.planes[c]);return this},setFromMatrix:function(a){var b=this.planes,c=a.elements;a=c[0];var d=c[1],e=c[2],f=c[3],g=c[4],h=c[5],k=c[6],m=c[7],l=c[8],n=c[9],p=c[10],q=c[11],r=c[12],t=c[13],x=c[14];c=c[15];b[0].setComponents(f-a,m-g,q-l,c-r).normalize();b[1].setComponents(f+ +a,m+g,q+l,c+r).normalize();b[2].setComponents(f+d,m+h,q+n,c+t).normalize();b[3].setComponents(f-d,m-h,q-n,c-t).normalize();b[4].setComponents(f-e,m-k,q-p,c-x).normalize();b[5].setComponents(f+e,m+k,q+p,c+x).normalize();return this},intersectsObject:function(){var a=new Ca;return function(b){var c=b.geometry;null===c.boundingSphere&&c.computeBoundingSphere();a.copy(c.boundingSphere).applyMatrix4(b.matrixWorld);return this.intersectsSphere(a)}}(),intersectsSprite:function(){var a=new Ca;return function(b){a.center.set(0, +0,0);a.radius=.7071067811865476;a.applyMatrix4(b.matrixWorld);return this.intersectsSphere(a)}}(),intersectsSphere:function(a){var b=this.planes,c=a.center;a=-a.radius;for(var d=0;6>d;d++)if(b[d].distanceToPoint(c)<a)return!1;return!0},intersectsBox:function(){var a=new p,b=new p;return function(c){for(var d=this.planes,e=0;6>e;e++){var f=d[e];a.x=0<f.normal.x?c.min.x:c.max.x;b.x=0<f.normal.x?c.max.x:c.min.x;a.y=0<f.normal.y?c.min.y:c.max.y;b.y=0<f.normal.y?c.max.y:c.min.y;a.z=0<f.normal.z?c.min.z: +c.max.z;b.z=0<f.normal.z?c.max.z:c.min.z;var g=f.distanceToPoint(a);f=f.distanceToPoint(b);if(0>g&&0>f)return!1}return!0}}(),containsPoint:function(a){for(var b=this.planes,c=0;6>c;c++)if(0>b[c].distanceToPoint(a))return!1;return!0}});fb.RotationOrders="XYZ YZX ZXY XZY YXZ ZYX".split(" ");fb.DefaultOrder="XYZ";Object.defineProperties(fb.prototype,{x:{get:function(){return this._x},set:function(a){this._x=a;this.onChangeCallback()}},y:{get:function(){return this._y},set:function(a){this._y=a;this.onChangeCallback()}}, +z:{get:function(){return this._z},set:function(a){this._z=a;this.onChangeCallback()}},order:{get:function(){return this._order},set:function(a){this._order=a;this.onChangeCallback()}}});Object.assign(fb.prototype,{isEuler:!0,set:function(a,b,c,d){this._x=a;this._y=b;this._z=c;this._order=d||this._order;this.onChangeCallback();return this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._order)},copy:function(a){this._x=a._x;this._y=a._y;this._z=a._z;this._order=a._order; +this.onChangeCallback();return this},setFromRotationMatrix:function(a,b,c){var d=S.clamp,e=a.elements;a=e[0];var f=e[4],g=e[8],h=e[1],k=e[5],m=e[9],l=e[2],n=e[6];e=e[10];b=b||this._order;"XYZ"===b?(this._y=Math.asin(d(g,-1,1)),.99999>Math.abs(g)?(this._x=Math.atan2(-m,e),this._z=Math.atan2(-f,a)):(this._x=Math.atan2(n,k),this._z=0)):"YXZ"===b?(this._x=Math.asin(-d(m,-1,1)),.99999>Math.abs(m)?(this._y=Math.atan2(g,e),this._z=Math.atan2(h,k)):(this._y=Math.atan2(-l,a),this._z=0)):"ZXY"===b?(this._x= +Math.asin(d(n,-1,1)),.99999>Math.abs(n)?(this._y=Math.atan2(-l,e),this._z=Math.atan2(-f,k)):(this._y=0,this._z=Math.atan2(h,a))):"ZYX"===b?(this._y=Math.asin(-d(l,-1,1)),.99999>Math.abs(l)?(this._x=Math.atan2(n,e),this._z=Math.atan2(h,a)):(this._x=0,this._z=Math.atan2(-f,k))):"YZX"===b?(this._z=Math.asin(d(h,-1,1)),.99999>Math.abs(h)?(this._x=Math.atan2(-m,k),this._y=Math.atan2(-l,a)):(this._x=0,this._y=Math.atan2(g,e))):"XZY"===b?(this._z=Math.asin(-d(f,-1,1)),.99999>Math.abs(f)?(this._x=Math.atan2(n, +k),this._y=Math.atan2(g,a)):(this._x=Math.atan2(-m,e),this._y=0)):console.warn("THREE.Euler: .setFromRotationMatrix() given unsupported order: "+b);this._order=b;if(!1!==c)this.onChangeCallback();return this},setFromQuaternion:function(){var a=new P;return function(b,c,d){a.makeRotationFromQuaternion(b);return this.setFromRotationMatrix(a,c,d)}}(),setFromVector3:function(a,b){return this.set(a.x,a.y,a.z,b||this._order)},reorder:function(){var a=new ca;return function(b){a.setFromEuler(this);return this.setFromQuaternion(a, +b)}}(),equals:function(a){return a._x===this._x&&a._y===this._y&&a._z===this._z&&a._order===this._order},fromArray:function(a){this._x=a[0];this._y=a[1];this._z=a[2];void 0!==a[3]&&(this._order=a[3]);this.onChangeCallback();return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this._x;a[b+1]=this._y;a[b+2]=this._z;a[b+3]=this._order;return a},toVector3:function(a){return a?a.set(this._x,this._y,this._z):new p(this._x,this._y,this._z)},onChange:function(a){this.onChangeCallback= +a;return this},onChangeCallback:function(){}});Object.assign(Sd.prototype,{set:function(a){this.mask=1<<a|0},enable:function(a){this.mask=this.mask|1<<a|0},toggle:function(a){this.mask^=1<<a|0},disable:function(a){this.mask&=~(1<<a|0)},test:function(a){return 0!==(this.mask&a.mask)}});var $f=0;y.DefaultUp=new p(0,1,0);y.DefaultMatrixAutoUpdate=!0;y.prototype=Object.assign(Object.create(xa.prototype),{constructor:y,isObject3D:!0,onBeforeRender:function(){},onAfterRender:function(){},applyMatrix:function(a){this.matrix.multiplyMatrices(a, +this.matrix);this.matrix.decompose(this.position,this.quaternion,this.scale)},applyQuaternion:function(a){this.quaternion.premultiply(a);return this},setRotationFromAxisAngle:function(a,b){this.quaternion.setFromAxisAngle(a,b)},setRotationFromEuler:function(a){this.quaternion.setFromEuler(a,!0)},setRotationFromMatrix:function(a){this.quaternion.setFromRotationMatrix(a)},setRotationFromQuaternion:function(a){this.quaternion.copy(a)},rotateOnAxis:function(){var a=new ca;return function(b,c){a.setFromAxisAngle(b, +c);this.quaternion.multiply(a);return this}}(),rotateOnWorldAxis:function(){var a=new ca;return function(b,c){a.setFromAxisAngle(b,c);this.quaternion.premultiply(a);return this}}(),rotateX:function(){var a=new p(1,0,0);return function(b){return this.rotateOnAxis(a,b)}}(),rotateY:function(){var a=new p(0,1,0);return function(b){return this.rotateOnAxis(a,b)}}(),rotateZ:function(){var a=new p(0,0,1);return function(b){return this.rotateOnAxis(a,b)}}(),translateOnAxis:function(){var a=new p;return function(b, +c){a.copy(b).applyQuaternion(this.quaternion);this.position.add(a.multiplyScalar(c));return this}}(),translateX:function(){var a=new p(1,0,0);return function(b){return this.translateOnAxis(a,b)}}(),translateY:function(){var a=new p(0,1,0);return function(b){return this.translateOnAxis(a,b)}}(),translateZ:function(){var a=new p(0,0,1);return function(b){return this.translateOnAxis(a,b)}}(),localToWorld:function(a){return a.applyMatrix4(this.matrixWorld)},worldToLocal:function(){var a=new P;return function(b){return b.applyMatrix4(a.getInverse(this.matrixWorld))}}(), +lookAt:function(){var a=new P,b=new p;return function(c,d,e){c.isVector3?b.copy(c):b.set(c,d,e);this.isCamera?a.lookAt(this.position,b,this.up):a.lookAt(b,this.position,this.up);this.quaternion.setFromRotationMatrix(a)}}(),add:function(a){if(1<arguments.length){for(var b=0;b<arguments.length;b++)this.add(arguments[b]);return this}if(a===this)return console.error("THREE.Object3D.add: object can't be added as a child of itself.",a),this;a&&a.isObject3D?(null!==a.parent&&a.parent.remove(a),a.parent= +this,a.dispatchEvent({type:"added"}),this.children.push(a)):console.error("THREE.Object3D.add: object not an instance of THREE.Object3D.",a);return this},remove:function(a){if(1<arguments.length){for(var b=0;b<arguments.length;b++)this.remove(arguments[b]);return this}b=this.children.indexOf(a);-1!==b&&(a.parent=null,a.dispatchEvent({type:"removed"}),this.children.splice(b,1));return this},getObjectById:function(a){return this.getObjectByProperty("id",a)},getObjectByName:function(a){return this.getObjectByProperty("name", +a)},getObjectByProperty:function(a,b){if(this[a]===b)return this;for(var c=0,d=this.children.length;c<d;c++){var e=this.children[c].getObjectByProperty(a,b);if(void 0!==e)return e}},getWorldPosition:function(a){a=a||new p;this.updateMatrixWorld(!0);return a.setFromMatrixPosition(this.matrixWorld)},getWorldQuaternion:function(){var a=new p,b=new p;return function(c){c=c||new ca;this.updateMatrixWorld(!0);this.matrixWorld.decompose(a,c,b);return c}}(),getWorldRotation:function(){var a=new ca;return function(b){b= +b||new fb;this.getWorldQuaternion(a);return b.setFromQuaternion(a,this.rotation.order,!1)}}(),getWorldScale:function(){var a=new p,b=new ca;return function(c){c=c||new p;this.updateMatrixWorld(!0);this.matrixWorld.decompose(a,b,c);return c}}(),getWorldDirection:function(){var a=new ca;return function(b){b=b||new p;this.getWorldQuaternion(a);return b.set(0,0,1).applyQuaternion(a)}}(),raycast:function(){},traverse:function(a){a(this);for(var b=this.children,c=0,d=b.length;c<d;c++)b[c].traverse(a)}, +traverseVisible:function(a){if(!1!==this.visible){a(this);for(var b=this.children,c=0,d=b.length;c<d;c++)b[c].traverseVisible(a)}},traverseAncestors:function(a){var b=this.parent;null!==b&&(a(b),b.traverseAncestors(a))},updateMatrix:function(){this.matrix.compose(this.position,this.quaternion,this.scale);this.matrixWorldNeedsUpdate=!0},updateMatrixWorld:function(a){this.matrixAutoUpdate&&this.updateMatrix();if(this.matrixWorldNeedsUpdate||a)null===this.parent?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld, +this.matrix),this.matrixWorldNeedsUpdate=!1,a=!0;for(var b=this.children,c=0,d=b.length;c<d;c++)b[c].updateMatrixWorld(a)},toJSON:function(a){function b(b,c){void 0===b[c.uuid]&&(b[c.uuid]=c.toJSON(a));return c.uuid}function c(a){var b=[],c;for(c in a){var d=a[c];delete d.metadata;b.push(d)}return b}var d=void 0===a||"string"===typeof a,e={};d&&(a={geometries:{},materials:{},textures:{},images:{},shapes:{}},e.metadata={version:4.5,type:"Object",generator:"Object3D.toJSON"});var f={};f.uuid=this.uuid; +f.type=this.type;""!==this.name&&(f.name=this.name);!0===this.castShadow&&(f.castShadow=!0);!0===this.receiveShadow&&(f.receiveShadow=!0);!1===this.visible&&(f.visible=!1);"{}"!==JSON.stringify(this.userData)&&(f.userData=this.userData);f.matrix=this.matrix.toArray();if(void 0!==this.geometry){f.geometry=b(a.geometries,this.geometry);var g=this.geometry.parameters;if(void 0!==g&&void 0!==g.shapes)if(g=g.shapes,Array.isArray(g))for(var h=0,k=g.length;h<k;h++)b(a.shapes,g[h]);else b(a.shapes,g)}if(void 0!== +this.material)if(Array.isArray(this.material)){g=[];h=0;for(k=this.material.length;h<k;h++)g.push(b(a.materials,this.material[h]));f.material=g}else f.material=b(a.materials,this.material);if(0<this.children.length)for(f.children=[],h=0;h<this.children.length;h++)f.children.push(this.children[h].toJSON(a).object);if(d){d=c(a.geometries);h=c(a.materials);k=c(a.textures);var m=c(a.images);g=c(a.shapes);0<d.length&&(e.geometries=d);0<h.length&&(e.materials=h);0<k.length&&(e.textures=k);0<m.length&&(e.images= +m);0<g.length&&(e.shapes=g)}e.object=f;return e},clone:function(a){return(new this.constructor).copy(this,a)},copy:function(a,b){void 0===b&&(b=!0);this.name=a.name;this.up.copy(a.up);this.position.copy(a.position);this.quaternion.copy(a.quaternion);this.scale.copy(a.scale);this.matrix.copy(a.matrix);this.matrixWorld.copy(a.matrixWorld);this.matrixAutoUpdate=a.matrixAutoUpdate;this.matrixWorldNeedsUpdate=a.matrixWorldNeedsUpdate;this.layers.mask=a.layers.mask;this.visible=a.visible;this.castShadow= +a.castShadow;this.receiveShadow=a.receiveShadow;this.frustumCulled=a.frustumCulled;this.renderOrder=a.renderOrder;this.userData=JSON.parse(JSON.stringify(a.userData));if(!0===b)for(b=0;b<a.children.length;b++)this.add(a.children[b].clone());return this}});Qa.prototype=Object.assign(Object.create(y.prototype),{constructor:Qa,isCamera:!0,copy:function(a,b){y.prototype.copy.call(this,a,b);this.matrixWorldInverse.copy(a.matrixWorldInverse);this.projectionMatrix.copy(a.projectionMatrix);return this},getWorldDirection:function(){var a= +new ca;return function(b){b=b||new p;this.getWorldQuaternion(a);return b.set(0,0,-1).applyQuaternion(a)}}(),updateMatrixWorld:function(a){y.prototype.updateMatrixWorld.call(this,a);this.matrixWorldInverse.getInverse(this.matrixWorld)},clone:function(){return(new this.constructor).copy(this)}});Ib.prototype=Object.assign(Object.create(Qa.prototype),{constructor:Ib,isOrthographicCamera:!0,copy:function(a,b){Qa.prototype.copy.call(this,a,b);this.left=a.left;this.right=a.right;this.top=a.top;this.bottom= +a.bottom;this.near=a.near;this.far=a.far;this.zoom=a.zoom;this.view=null===a.view?null:Object.assign({},a.view);return this},setViewOffset:function(a,b,c,d,e,f){null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1});this.view.enabled=!0;this.view.fullWidth=a;this.view.fullHeight=b;this.view.offsetX=c;this.view.offsetY=d;this.view.width=e;this.view.height=f;this.updateProjectionMatrix()},clearViewOffset:function(){null!==this.view&&(this.view.enabled= +!1);this.updateProjectionMatrix()},updateProjectionMatrix:function(){var a=(this.right-this.left)/(2*this.zoom),b=(this.top-this.bottom)/(2*this.zoom),c=(this.right+this.left)/2,d=(this.top+this.bottom)/2,e=c-a;c+=a;a=d+b;b=d-b;if(null!==this.view&&this.view.enabled){c=this.zoom/(this.view.width/this.view.fullWidth);b=this.zoom/(this.view.height/this.view.fullHeight);var f=(this.right-this.left)/this.view.width;d=(this.top-this.bottom)/this.view.height;e+=this.view.offsetX/c*f;c=e+this.view.width/ +c*f;a-=this.view.offsetY/b*d;b=a-this.view.height/b*d}this.projectionMatrix.makeOrthographic(e,c,a,b,this.near,this.far)},toJSON:function(a){a=y.prototype.toJSON.call(this,a);a.object.zoom=this.zoom;a.object.left=this.left;a.object.right=this.right;a.object.top=this.top;a.object.bottom=this.bottom;a.object.near=this.near;a.object.far=this.far;null!==this.view&&(a.object.view=Object.assign({},this.view));return a}});Object.assign(Wa.prototype,{clone:function(){return(new this.constructor).copy(this)}, +copy:function(a){this.a=a.a;this.b=a.b;this.c=a.c;this.normal.copy(a.normal);this.color.copy(a.color);this.materialIndex=a.materialIndex;for(var b=0,c=a.vertexNormals.length;b<c;b++)this.vertexNormals[b]=a.vertexNormals[b].clone();b=0;for(c=a.vertexColors.length;b<c;b++)this.vertexColors[b]=a.vertexColors[b].clone();return this}});var ag=0;L.prototype=Object.assign(Object.create(xa.prototype),{constructor:L,isGeometry:!0,applyMatrix:function(a){for(var b=(new ta).getNormalMatrix(a),c=0,d=this.vertices.length;c< +d;c++)this.vertices[c].applyMatrix4(a);c=0;for(d=this.faces.length;c<d;c++){a=this.faces[c];a.normal.applyMatrix3(b).normalize();for(var e=0,f=a.vertexNormals.length;e<f;e++)a.vertexNormals[e].applyMatrix3(b).normalize()}null!==this.boundingBox&&this.computeBoundingBox();null!==this.boundingSphere&&this.computeBoundingSphere();this.normalsNeedUpdate=this.verticesNeedUpdate=!0;return this},rotateX:function(){var a=new P;return function(b){a.makeRotationX(b);this.applyMatrix(a);return this}}(),rotateY:function(){var a= +new P;return function(b){a.makeRotationY(b);this.applyMatrix(a);return this}}(),rotateZ:function(){var a=new P;return function(b){a.makeRotationZ(b);this.applyMatrix(a);return this}}(),translate:function(){var a=new P;return function(b,c,d){a.makeTranslation(b,c,d);this.applyMatrix(a);return this}}(),scale:function(){var a=new P;return function(b,c,d){a.makeScale(b,c,d);this.applyMatrix(a);return this}}(),lookAt:function(){var a=new y;return function(b){a.lookAt(b);a.updateMatrix();this.applyMatrix(a.matrix)}}(), +fromBufferGeometry:function(a){function b(a,b,d,e){var f=void 0!==g?[l[a].clone(),l[b].clone(),l[d].clone()]:[],p=void 0!==h?[c.colors[a].clone(),c.colors[b].clone(),c.colors[d].clone()]:[];e=new Wa(a,b,d,f,p,e);c.faces.push(e);void 0!==k&&c.faceVertexUvs[0].push([n[a].clone(),n[b].clone(),n[d].clone()]);void 0!==m&&c.faceVertexUvs[1].push([u[a].clone(),u[b].clone(),u[d].clone()])}var c=this,d=null!==a.index?a.index.array:void 0,e=a.attributes,f=e.position.array,g=void 0!==e.normal?e.normal.array: +void 0,h=void 0!==e.color?e.color.array:void 0,k=void 0!==e.uv?e.uv.array:void 0,m=void 0!==e.uv2?e.uv2.array:void 0;void 0!==m&&(this.faceVertexUvs[1]=[]);for(var l=[],n=[],u=[],q=e=0;e<f.length;e+=3,q+=2)c.vertices.push(new p(f[e],f[e+1],f[e+2])),void 0!==g&&l.push(new p(g[e],g[e+1],g[e+2])),void 0!==h&&c.colors.push(new H(h[e],h[e+1],h[e+2])),void 0!==k&&n.push(new C(k[q],k[q+1])),void 0!==m&&u.push(new C(m[q],m[q+1]));var r=a.groups;if(0<r.length)for(e=0;e<r.length;e++){f=r[e];var t=f.start,x= +f.count;q=t;for(t+=x;q<t;q+=3)void 0!==d?b(d[q],d[q+1],d[q+2],f.materialIndex):b(q,q+1,q+2,f.materialIndex)}else if(void 0!==d)for(e=0;e<d.length;e+=3)b(d[e],d[e+1],d[e+2]);else for(e=0;e<f.length/3;e+=3)b(e,e+1,e+2);this.computeFaceNormals();null!==a.boundingBox&&(this.boundingBox=a.boundingBox.clone());null!==a.boundingSphere&&(this.boundingSphere=a.boundingSphere.clone());return this},center:function(){this.computeBoundingBox();var a=this.boundingBox.getCenter().negate();this.translate(a.x,a.y, +a.z);return a},normalize:function(){this.computeBoundingSphere();var a=this.boundingSphere.center,b=this.boundingSphere.radius;b=0===b?1:1/b;var c=new P;c.set(b,0,0,-b*a.x,0,b,0,-b*a.y,0,0,b,-b*a.z,0,0,0,1);this.applyMatrix(c);return this},computeFaceNormals:function(){for(var a=new p,b=new p,c=0,d=this.faces.length;c<d;c++){var e=this.faces[c],f=this.vertices[e.a],g=this.vertices[e.b];a.subVectors(this.vertices[e.c],g);b.subVectors(f,g);a.cross(b);a.normalize();e.normal.copy(a)}},computeVertexNormals:function(a){void 0=== +a&&(a=!0);var b;var c=Array(this.vertices.length);var d=0;for(b=this.vertices.length;d<b;d++)c[d]=new p;if(a){var e=new p,f=new p;a=0;for(d=this.faces.length;a<d;a++){b=this.faces[a];var g=this.vertices[b.a];var h=this.vertices[b.b];var k=this.vertices[b.c];e.subVectors(k,h);f.subVectors(g,h);e.cross(f);c[b.a].add(e);c[b.b].add(e);c[b.c].add(e)}}else for(this.computeFaceNormals(),a=0,d=this.faces.length;a<d;a++)b=this.faces[a],c[b.a].add(b.normal),c[b.b].add(b.normal),c[b.c].add(b.normal);d=0;for(b= +this.vertices.length;d<b;d++)c[d].normalize();a=0;for(d=this.faces.length;a<d;a++)b=this.faces[a],g=b.vertexNormals,3===g.length?(g[0].copy(c[b.a]),g[1].copy(c[b.b]),g[2].copy(c[b.c])):(g[0]=c[b.a].clone(),g[1]=c[b.b].clone(),g[2]=c[b.c].clone());0<this.faces.length&&(this.normalsNeedUpdate=!0)},computeFlatVertexNormals:function(){var a;this.computeFaceNormals();var b=0;for(a=this.faces.length;b<a;b++){var c=this.faces[b];var d=c.vertexNormals;3===d.length?(d[0].copy(c.normal),d[1].copy(c.normal), +d[2].copy(c.normal)):(d[0]=c.normal.clone(),d[1]=c.normal.clone(),d[2]=c.normal.clone())}0<this.faces.length&&(this.normalsNeedUpdate=!0)},computeMorphNormals:function(){var a,b;var c=0;for(b=this.faces.length;c<b;c++){var d=this.faces[c];d.__originalFaceNormal?d.__originalFaceNormal.copy(d.normal):d.__originalFaceNormal=d.normal.clone();d.__originalVertexNormals||(d.__originalVertexNormals=[]);var e=0;for(a=d.vertexNormals.length;e<a;e++)d.__originalVertexNormals[e]?d.__originalVertexNormals[e].copy(d.vertexNormals[e]): +d.__originalVertexNormals[e]=d.vertexNormals[e].clone()}var f=new L;f.faces=this.faces;e=0;for(a=this.morphTargets.length;e<a;e++){if(!this.morphNormals[e]){this.morphNormals[e]={};this.morphNormals[e].faceNormals=[];this.morphNormals[e].vertexNormals=[];d=this.morphNormals[e].faceNormals;var g=this.morphNormals[e].vertexNormals;c=0;for(b=this.faces.length;c<b;c++){var h=new p;var k={a:new p,b:new p,c:new p};d.push(h);g.push(k)}}g=this.morphNormals[e];f.vertices=this.morphTargets[e].vertices;f.computeFaceNormals(); +f.computeVertexNormals();c=0;for(b=this.faces.length;c<b;c++)d=this.faces[c],h=g.faceNormals[c],k=g.vertexNormals[c],h.copy(d.normal),k.a.copy(d.vertexNormals[0]),k.b.copy(d.vertexNormals[1]),k.c.copy(d.vertexNormals[2])}c=0;for(b=this.faces.length;c<b;c++)d=this.faces[c],d.normal=d.__originalFaceNormal,d.vertexNormals=d.__originalVertexNormals},computeBoundingBox:function(){null===this.boundingBox&&(this.boundingBox=new Va);this.boundingBox.setFromPoints(this.vertices)},computeBoundingSphere:function(){null=== +this.boundingSphere&&(this.boundingSphere=new Ca);this.boundingSphere.setFromPoints(this.vertices)},merge:function(a,b,c){if(a&&a.isGeometry){var d,e=this.vertices.length,f=this.vertices,g=a.vertices,h=this.faces,k=a.faces,m=this.faceVertexUvs[0],l=a.faceVertexUvs[0],n=this.colors,p=a.colors;void 0===c&&(c=0);void 0!==b&&(d=(new ta).getNormalMatrix(b));a=0;for(var q=g.length;a<q;a++){var r=g[a].clone();void 0!==b&&r.applyMatrix4(b);f.push(r)}a=0;for(q=p.length;a<q;a++)n.push(p[a].clone());a=0;for(q= +k.length;a<q;a++){g=k[a];var t=g.vertexNormals;p=g.vertexColors;n=new Wa(g.a+e,g.b+e,g.c+e);n.normal.copy(g.normal);void 0!==d&&n.normal.applyMatrix3(d).normalize();b=0;for(f=t.length;b<f;b++)r=t[b].clone(),void 0!==d&&r.applyMatrix3(d).normalize(),n.vertexNormals.push(r);n.color.copy(g.color);b=0;for(f=p.length;b<f;b++)r=p[b],n.vertexColors.push(r.clone());n.materialIndex=g.materialIndex+c;h.push(n)}a=0;for(q=l.length;a<q;a++)if(c=l[a],d=[],void 0!==c){b=0;for(f=c.length;b<f;b++)d.push(c[b].clone()); +m.push(d)}}else console.error("THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.",a)},mergeMesh:function(a){a&&a.isMesh?(a.matrixAutoUpdate&&a.updateMatrix(),this.merge(a.geometry,a.matrix)):console.error("THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.",a)},mergeVertices:function(){var a={},b=[],c=[],d=Math.pow(10,4),e;var f=0;for(e=this.vertices.length;f<e;f++){var g=this.vertices[f];g=Math.round(g.x*d)+"_"+Math.round(g.y*d)+"_"+Math.round(g.z*d);void 0===a[g]? +(a[g]=f,b.push(this.vertices[f]),c[f]=b.length-1):c[f]=c[a[g]]}a=[];f=0;for(e=this.faces.length;f<e;f++)for(d=this.faces[f],d.a=c[d.a],d.b=c[d.b],d.c=c[d.c],d=[d.a,d.b,d.c],g=0;3>g;g++)if(d[g]===d[(g+1)%3]){a.push(f);break}for(f=a.length-1;0<=f;f--)for(d=a[f],this.faces.splice(d,1),c=0,e=this.faceVertexUvs.length;c<e;c++)this.faceVertexUvs[c].splice(d,1);f=this.vertices.length-b.length;this.vertices=b;return f},setFromPoints:function(a){this.vertices=[];for(var b=0,c=a.length;b<c;b++){var d=a[b]; +this.vertices.push(new p(d.x,d.y,d.z||0))}return this},sortFacesByMaterialIndex:function(){for(var a=this.faces,b=a.length,c=0;c<b;c++)a[c]._id=c;a.sort(function(a,b){return a.materialIndex-b.materialIndex});var d=this.faceVertexUvs[0],e=this.faceVertexUvs[1],f,g;d&&d.length===b&&(f=[]);e&&e.length===b&&(g=[]);for(c=0;c<b;c++){var h=a[c]._id;f&&f.push(d[h]);g&&g.push(e[h])}f&&(this.faceVertexUvs[0]=f);g&&(this.faceVertexUvs[1]=g)},toJSON:function(){function a(a,b,c){return c?a|1<<b:a&~(1<<b)}function b(a){var b= +a.x.toString()+a.y.toString()+a.z.toString();if(void 0!==m[b])return m[b];m[b]=k.length/3;k.push(a.x,a.y,a.z);return m[b]}function c(a){var b=a.r.toString()+a.g.toString()+a.b.toString();if(void 0!==n[b])return n[b];n[b]=l.length;l.push(a.getHex());return n[b]}function d(a){var b=a.x.toString()+a.y.toString();if(void 0!==q[b])return q[b];q[b]=p.length/2;p.push(a.x,a.y);return q[b]}var e={metadata:{version:4.5,type:"Geometry",generator:"Geometry.toJSON"}};e.uuid=this.uuid;e.type=this.type;""!==this.name&& +(e.name=this.name);if(void 0!==this.parameters){var f=this.parameters,g;for(g in f)void 0!==f[g]&&(e[g]=f[g]);return e}f=[];for(g=0;g<this.vertices.length;g++){var h=this.vertices[g];f.push(h.x,h.y,h.z)}h=[];var k=[],m={},l=[],n={},p=[],q={};for(g=0;g<this.faces.length;g++){var r=this.faces[g],t=void 0!==this.faceVertexUvs[0][g],x=0<r.normal.length(),B=0<r.vertexNormals.length,w=1!==r.color.r||1!==r.color.g||1!==r.color.b,A=0<r.vertexColors.length,G=0;G=a(G,0,0);G=a(G,1,!0);G=a(G,2,!1);G=a(G,3,t); +G=a(G,4,x);G=a(G,5,B);G=a(G,6,w);G=a(G,7,A);h.push(G);h.push(r.a,r.b,r.c);h.push(r.materialIndex);t&&(t=this.faceVertexUvs[0][g],h.push(d(t[0]),d(t[1]),d(t[2])));x&&h.push(b(r.normal));B&&(x=r.vertexNormals,h.push(b(x[0]),b(x[1]),b(x[2])));w&&h.push(c(r.color));A&&(r=r.vertexColors,h.push(c(r[0]),c(r[1]),c(r[2])))}e.data={};e.data.vertices=f;e.data.normals=k;0<l.length&&(e.data.colors=l);0<p.length&&(e.data.uvs=[p]);e.data.faces=h;return e},clone:function(){return(new L).copy(this)},copy:function(a){var b, +c,d;this.vertices=[];this.colors=[];this.faces=[];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphNormals=[];this.skinWeights=[];this.skinIndices=[];this.lineDistances=[];this.boundingSphere=this.boundingBox=null;this.name=a.name;var e=a.vertices;var f=0;for(b=e.length;f<b;f++)this.vertices.push(e[f].clone());e=a.colors;f=0;for(b=e.length;f<b;f++)this.colors.push(e[f].clone());e=a.faces;f=0;for(b=e.length;f<b;f++)this.faces.push(e[f].clone());f=0;for(b=a.faceVertexUvs.length;f<b;f++){var g= +a.faceVertexUvs[f];void 0===this.faceVertexUvs[f]&&(this.faceVertexUvs[f]=[]);e=0;for(c=g.length;e<c;e++){var h=g[e],k=[];var m=0;for(d=h.length;m<d;m++)k.push(h[m].clone());this.faceVertexUvs[f].push(k)}}m=a.morphTargets;f=0;for(b=m.length;f<b;f++){d={};d.name=m[f].name;if(void 0!==m[f].vertices)for(d.vertices=[],e=0,c=m[f].vertices.length;e<c;e++)d.vertices.push(m[f].vertices[e].clone());if(void 0!==m[f].normals)for(d.normals=[],e=0,c=m[f].normals.length;e<c;e++)d.normals.push(m[f].normals[e].clone()); +this.morphTargets.push(d)}m=a.morphNormals;f=0;for(b=m.length;f<b;f++){d={};if(void 0!==m[f].vertexNormals)for(d.vertexNormals=[],e=0,c=m[f].vertexNormals.length;e<c;e++)g=m[f].vertexNormals[e],h={},h.a=g.a.clone(),h.b=g.b.clone(),h.c=g.c.clone(),d.vertexNormals.push(h);if(void 0!==m[f].faceNormals)for(d.faceNormals=[],e=0,c=m[f].faceNormals.length;e<c;e++)d.faceNormals.push(m[f].faceNormals[e].clone());this.morphNormals.push(d)}e=a.skinWeights;f=0;for(b=e.length;f<b;f++)this.skinWeights.push(e[f].clone()); +e=a.skinIndices;f=0;for(b=e.length;f<b;f++)this.skinIndices.push(e[f].clone());e=a.lineDistances;f=0;for(b=e.length;f<b;f++)this.lineDistances.push(e[f]);f=a.boundingBox;null!==f&&(this.boundingBox=f.clone());f=a.boundingSphere;null!==f&&(this.boundingSphere=f.clone());this.elementsNeedUpdate=a.elementsNeedUpdate;this.verticesNeedUpdate=a.verticesNeedUpdate;this.uvsNeedUpdate=a.uvsNeedUpdate;this.normalsNeedUpdate=a.normalsNeedUpdate;this.colorsNeedUpdate=a.colorsNeedUpdate;this.lineDistancesNeedUpdate= +a.lineDistancesNeedUpdate;this.groupsNeedUpdate=a.groupsNeedUpdate;return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});Object.defineProperty(M.prototype,"needsUpdate",{set:function(a){!0===a&&this.version++}});Object.assign(M.prototype,{isBufferAttribute:!0,setArray:function(a){if(Array.isArray(a))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.count=void 0!==a?a.length/this.itemSize:0;this.array=a},setDynamic:function(a){this.dynamic=a;return this}, +copy:function(a){this.array=new a.array.constructor(a.array);this.itemSize=a.itemSize;this.count=a.count;this.normalized=a.normalized;this.dynamic=a.dynamic;return this},copyAt:function(a,b,c){a*=this.itemSize;c*=b.itemSize;for(var d=0,e=this.itemSize;d<e;d++)this.array[a+d]=b.array[c+d];return this},copyArray:function(a){this.array.set(a);return this},copyColorsArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn("THREE.BufferAttribute.copyColorsArray(): color is undefined", +d),f=new H);b[c++]=f.r;b[c++]=f.g;b[c++]=f.b}return this},copyIndicesArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];b[c++]=f.a;b[c++]=f.b;b[c++]=f.c}return this},copyVector2sArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn("THREE.BufferAttribute.copyVector2sArray(): vector is undefined",d),f=new C);b[c++]=f.x;b[c++]=f.y}return this},copyVector3sArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f= +a[d];void 0===f&&(console.warn("THREE.BufferAttribute.copyVector3sArray(): vector is undefined",d),f=new p);b[c++]=f.x;b[c++]=f.y;b[c++]=f.z}return this},copyVector4sArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn("THREE.BufferAttribute.copyVector4sArray(): vector is undefined",d),f=new X);b[c++]=f.x;b[c++]=f.y;b[c++]=f.z;b[c++]=f.w}return this},set:function(a,b){void 0===b&&(b=0);this.array.set(a,b);return this},getX:function(a){return this.array[a* +this.itemSize]},setX:function(a,b){this.array[a*this.itemSize]=b;return this},getY:function(a){return this.array[a*this.itemSize+1]},setY:function(a,b){this.array[a*this.itemSize+1]=b;return this},getZ:function(a){return this.array[a*this.itemSize+2]},setZ:function(a,b){this.array[a*this.itemSize+2]=b;return this},getW:function(a){return this.array[a*this.itemSize+3]},setW:function(a,b){this.array[a*this.itemSize+3]=b;return this},setXY:function(a,b,c){a*=this.itemSize;this.array[a+0]=b;this.array[a+ +1]=c;return this},setXYZ:function(a,b,c,d){a*=this.itemSize;this.array[a+0]=b;this.array[a+1]=c;this.array[a+2]=d;return this},setXYZW:function(a,b,c,d,e){a*=this.itemSize;this.array[a+0]=b;this.array[a+1]=c;this.array[a+2]=d;this.array[a+3]=e;return this},onUpload:function(a){this.onUploadCallback=a;return this},clone:function(){return(new this.constructor(this.array,this.itemSize)).copy(this)}});rc.prototype=Object.create(M.prototype);rc.prototype.constructor=rc;sc.prototype=Object.create(M.prototype); +sc.prototype.constructor=sc;tc.prototype=Object.create(M.prototype);tc.prototype.constructor=tc;uc.prototype=Object.create(M.prototype);uc.prototype.constructor=uc;lb.prototype=Object.create(M.prototype);lb.prototype.constructor=lb;vc.prototype=Object.create(M.prototype);vc.prototype.constructor=vc;mb.prototype=Object.create(M.prototype);mb.prototype.constructor=mb;D.prototype=Object.create(M.prototype);D.prototype.constructor=D;wc.prototype=Object.create(M.prototype);wc.prototype.constructor=wc; +Object.assign(Pe.prototype,{computeGroups:function(a){var b=[],c=void 0;a=a.faces;for(var d=0;d<a.length;d++){var e=a[d];if(e.materialIndex!==c){c=e.materialIndex;void 0!==f&&(f.count=3*d-f.start,b.push(f));var f={start:3*d,materialIndex:c}}}void 0!==f&&(f.count=3*d-f.start,b.push(f));this.groups=b},fromGeometry:function(a){var b=a.faces,c=a.vertices,d=a.faceVertexUvs,e=d[0]&&0<d[0].length,f=d[1]&&0<d[1].length,g=a.morphTargets,h=g.length;if(0<h){var k=[];for(var m=0;m<h;m++)k[m]=[];this.morphTargets.position= +k}var l=a.morphNormals,n=l.length;if(0<n){var p=[];for(m=0;m<n;m++)p[m]=[];this.morphTargets.normal=p}var q=a.skinIndices,r=a.skinWeights,t=q.length===c.length,x=r.length===c.length;for(m=0;m<b.length;m++){var B=b[m];this.vertices.push(c[B.a],c[B.b],c[B.c]);var w=B.vertexNormals;3===w.length?this.normals.push(w[0],w[1],w[2]):(w=B.normal,this.normals.push(w,w,w));w=B.vertexColors;3===w.length?this.colors.push(w[0],w[1],w[2]):(w=B.color,this.colors.push(w,w,w));!0===e&&(w=d[0][m],void 0!==w?this.uvs.push(w[0], +w[1],w[2]):(console.warn("THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ",m),this.uvs.push(new C,new C,new C)));!0===f&&(w=d[1][m],void 0!==w?this.uvs2.push(w[0],w[1],w[2]):(console.warn("THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ",m),this.uvs2.push(new C,new C,new C)));for(w=0;w<h;w++){var A=g[w].vertices;k[w].push(A[B.a],A[B.b],A[B.c])}for(w=0;w<n;w++)A=l[w].vertexNormals[m],p[w].push(A.a,A.b,A.c);t&&this.skinIndices.push(q[B.a],q[B.b],q[B.c]);x&&this.skinWeights.push(r[B.a], +r[B.b],r[B.c])}this.computeGroups(a);this.verticesNeedUpdate=a.verticesNeedUpdate;this.normalsNeedUpdate=a.normalsNeedUpdate;this.colorsNeedUpdate=a.colorsNeedUpdate;this.uvsNeedUpdate=a.uvsNeedUpdate;this.groupsNeedUpdate=a.groupsNeedUpdate;return this}});var bg=1;z.prototype=Object.assign(Object.create(xa.prototype),{constructor:z,isBufferGeometry:!0,getIndex:function(){return this.index},setIndex:function(a){Array.isArray(a)?this.index=new (65535<Td(a)?mb:lb)(a,1):this.index=a},addAttribute:function(a, +b,c){if(b&&b.isBufferAttribute||b&&b.isInterleavedBufferAttribute)if("index"===a)console.warn("THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute."),this.setIndex(b);else return this.attributes[a]=b,this;else console.warn("THREE.BufferGeometry: .addAttribute() now expects ( name, attribute )."),this.addAttribute(a,new M(b,c))},getAttribute:function(a){return this.attributes[a]},removeAttribute:function(a){delete this.attributes[a];return this},addGroup:function(a,b,c){this.groups.push({start:a, +count:b,materialIndex:void 0!==c?c:0})},clearGroups:function(){this.groups=[]},setDrawRange:function(a,b){this.drawRange.start=a;this.drawRange.count=b},applyMatrix:function(a){var b=this.attributes.position;void 0!==b&&(a.applyToBufferAttribute(b),b.needsUpdate=!0);b=this.attributes.normal;void 0!==b&&((new ta).getNormalMatrix(a).applyToBufferAttribute(b),b.needsUpdate=!0);null!==this.boundingBox&&this.computeBoundingBox();null!==this.boundingSphere&&this.computeBoundingSphere();return this},rotateX:function(){var a= +new P;return function(b){a.makeRotationX(b);this.applyMatrix(a);return this}}(),rotateY:function(){var a=new P;return function(b){a.makeRotationY(b);this.applyMatrix(a);return this}}(),rotateZ:function(){var a=new P;return function(b){a.makeRotationZ(b);this.applyMatrix(a);return this}}(),translate:function(){var a=new P;return function(b,c,d){a.makeTranslation(b,c,d);this.applyMatrix(a);return this}}(),scale:function(){var a=new P;return function(b,c,d){a.makeScale(b,c,d);this.applyMatrix(a);return this}}(), +lookAt:function(){var a=new y;return function(b){a.lookAt(b);a.updateMatrix();this.applyMatrix(a.matrix)}}(),center:function(){this.computeBoundingBox();var a=this.boundingBox.getCenter().negate();this.translate(a.x,a.y,a.z);return a},setFromObject:function(a){var b=a.geometry;if(a.isPoints||a.isLine){a=new D(3*b.vertices.length,3);var c=new D(3*b.colors.length,3);this.addAttribute("position",a.copyVector3sArray(b.vertices));this.addAttribute("color",c.copyColorsArray(b.colors));b.lineDistances&& +b.lineDistances.length===b.vertices.length&&(a=new D(b.lineDistances.length,1),this.addAttribute("lineDistance",a.copyArray(b.lineDistances)));null!==b.boundingSphere&&(this.boundingSphere=b.boundingSphere.clone());null!==b.boundingBox&&(this.boundingBox=b.boundingBox.clone())}else a.isMesh&&b&&b.isGeometry&&this.fromGeometry(b);return this},setFromPoints:function(a){for(var b=[],c=0,d=a.length;c<d;c++){var e=a[c];b.push(e.x,e.y,e.z||0)}this.addAttribute("position",new D(b,3));return this},updateFromObject:function(a){var b= +a.geometry;if(a.isMesh){var c=b.__directGeometry;!0===b.elementsNeedUpdate&&(c=void 0,b.elementsNeedUpdate=!1);if(void 0===c)return this.fromGeometry(b);c.verticesNeedUpdate=b.verticesNeedUpdate;c.normalsNeedUpdate=b.normalsNeedUpdate;c.colorsNeedUpdate=b.colorsNeedUpdate;c.uvsNeedUpdate=b.uvsNeedUpdate;c.groupsNeedUpdate=b.groupsNeedUpdate;b.verticesNeedUpdate=!1;b.normalsNeedUpdate=!1;b.colorsNeedUpdate=!1;b.uvsNeedUpdate=!1;b.groupsNeedUpdate=!1;b=c}!0===b.verticesNeedUpdate&&(c=this.attributes.position, +void 0!==c&&(c.copyVector3sArray(b.vertices),c.needsUpdate=!0),b.verticesNeedUpdate=!1);!0===b.normalsNeedUpdate&&(c=this.attributes.normal,void 0!==c&&(c.copyVector3sArray(b.normals),c.needsUpdate=!0),b.normalsNeedUpdate=!1);!0===b.colorsNeedUpdate&&(c=this.attributes.color,void 0!==c&&(c.copyColorsArray(b.colors),c.needsUpdate=!0),b.colorsNeedUpdate=!1);b.uvsNeedUpdate&&(c=this.attributes.uv,void 0!==c&&(c.copyVector2sArray(b.uvs),c.needsUpdate=!0),b.uvsNeedUpdate=!1);b.lineDistancesNeedUpdate&& +(c=this.attributes.lineDistance,void 0!==c&&(c.copyArray(b.lineDistances),c.needsUpdate=!0),b.lineDistancesNeedUpdate=!1);b.groupsNeedUpdate&&(b.computeGroups(a.geometry),this.groups=b.groups,b.groupsNeedUpdate=!1);return this},fromGeometry:function(a){a.__directGeometry=(new Pe).fromGeometry(a);return this.fromDirectGeometry(a.__directGeometry)},fromDirectGeometry:function(a){var b=new Float32Array(3*a.vertices.length);this.addAttribute("position",(new M(b,3)).copyVector3sArray(a.vertices));0<a.normals.length&& +(b=new Float32Array(3*a.normals.length),this.addAttribute("normal",(new M(b,3)).copyVector3sArray(a.normals)));0<a.colors.length&&(b=new Float32Array(3*a.colors.length),this.addAttribute("color",(new M(b,3)).copyColorsArray(a.colors)));0<a.uvs.length&&(b=new Float32Array(2*a.uvs.length),this.addAttribute("uv",(new M(b,2)).copyVector2sArray(a.uvs)));0<a.uvs2.length&&(b=new Float32Array(2*a.uvs2.length),this.addAttribute("uv2",(new M(b,2)).copyVector2sArray(a.uvs2)));0<a.indices.length&&(b=new (65535< +Td(a.indices)?Uint32Array:Uint16Array)(3*a.indices.length),this.setIndex((new M(b,1)).copyIndicesArray(a.indices)));this.groups=a.groups;for(var c in a.morphTargets){b=[];for(var d=a.morphTargets[c],e=0,f=d.length;e<f;e++){var g=d[e],h=new D(3*g.length,3);b.push(h.copyVector3sArray(g))}this.morphAttributes[c]=b}0<a.skinIndices.length&&(c=new D(4*a.skinIndices.length,4),this.addAttribute("skinIndex",c.copyVector4sArray(a.skinIndices)));0<a.skinWeights.length&&(c=new D(4*a.skinWeights.length,4),this.addAttribute("skinWeight", +c.copyVector4sArray(a.skinWeights)));null!==a.boundingSphere&&(this.boundingSphere=a.boundingSphere.clone());null!==a.boundingBox&&(this.boundingBox=a.boundingBox.clone());return this},computeBoundingBox:function(){null===this.boundingBox&&(this.boundingBox=new Va);var a=this.attributes.position;void 0!==a?this.boundingBox.setFromBufferAttribute(a):this.boundingBox.makeEmpty();(isNaN(this.boundingBox.min.x)||isNaN(this.boundingBox.min.y)||isNaN(this.boundingBox.min.z))&&console.error('THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The "position" attribute is likely to have NaN values.', +this)},computeBoundingSphere:function(){var a=new Va,b=new p;return function(){null===this.boundingSphere&&(this.boundingSphere=new Ca);var c=this.attributes.position;if(c){var d=this.boundingSphere.center;a.setFromBufferAttribute(c);a.getCenter(d);for(var e=0,f=0,g=c.count;f<g;f++)b.x=c.getX(f),b.y=c.getY(f),b.z=c.getZ(f),e=Math.max(e,d.distanceToSquared(b));this.boundingSphere.radius=Math.sqrt(e);isNaN(this.boundingSphere.radius)&&console.error('THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.', +this)}}}(),computeFaceNormals:function(){},computeVertexNormals:function(){var a=this.index,b=this.attributes,c=this.groups;if(b.position){var d=b.position.array;if(void 0===b.normal)this.addAttribute("normal",new M(new Float32Array(d.length),3));else for(var e=b.normal.array,f=0,g=e.length;f<g;f++)e[f]=0;e=b.normal.array;var h=new p,k=new p,m=new p,l=new p,n=new p;if(a){a=a.array;0===c.length&&this.addGroup(0,a.length);for(var u=0,q=c.length;u<q;++u){f=c[u];g=f.start;var r=f.count;f=g;for(g+=r;f< +g;f+=3){r=3*a[f+0];var t=3*a[f+1];var x=3*a[f+2];h.fromArray(d,r);k.fromArray(d,t);m.fromArray(d,x);l.subVectors(m,k);n.subVectors(h,k);l.cross(n);e[r]+=l.x;e[r+1]+=l.y;e[r+2]+=l.z;e[t]+=l.x;e[t+1]+=l.y;e[t+2]+=l.z;e[x]+=l.x;e[x+1]+=l.y;e[x+2]+=l.z}}}else for(f=0,g=d.length;f<g;f+=9)h.fromArray(d,f),k.fromArray(d,f+3),m.fromArray(d,f+6),l.subVectors(m,k),n.subVectors(h,k),l.cross(n),e[f]=l.x,e[f+1]=l.y,e[f+2]=l.z,e[f+3]=l.x,e[f+4]=l.y,e[f+5]=l.z,e[f+6]=l.x,e[f+7]=l.y,e[f+8]=l.z;this.normalizeNormals(); +b.normal.needsUpdate=!0}},merge:function(a,b){if(a&&a.isBufferGeometry){void 0===b&&(b=0);var c=this.attributes,d;for(d in c)if(void 0!==a.attributes[d]){var e=c[d].array,f=a.attributes[d],g=f.array,h=0;for(f=f.itemSize*b;h<g.length;h++,f++)e[f]=g[h]}return this}console.error("THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.",a)},normalizeNormals:function(){var a=new p;return function(){for(var b=this.attributes.normal,c=0,d=b.count;c<d;c++)a.x=b.getX(c),a.y=b.getY(c), +a.z=b.getZ(c),a.normalize(),b.setXYZ(c,a.x,a.y,a.z)}}(),toNonIndexed:function(){if(null===this.index)return console.warn("THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed."),this;var a=new z,b=this.index.array,c=this.attributes,d;for(d in c){var e=c[d],f=e.array;e=e.itemSize;for(var g=new f.constructor(b.length*e),h,k=0,m=0,l=b.length;m<l;m++){h=b[m]*e;for(var n=0;n<e;n++)g[k++]=f[h++]}a.addAttribute(d,new M(g,e))}return a},toJSON:function(){var a={metadata:{version:4.5,type:"BufferGeometry", +generator:"BufferGeometry.toJSON"}};a.uuid=this.uuid;a.type=this.type;""!==this.name&&(a.name=this.name);if(void 0!==this.parameters){var b=this.parameters;for(e in b)void 0!==b[e]&&(a[e]=b[e]);return a}a.data={attributes:{}};var c=this.index;null!==c&&(b=Array.prototype.slice.call(c.array),a.data.index={type:c.array.constructor.name,array:b});c=this.attributes;for(e in c){var d=c[e];b=Array.prototype.slice.call(d.array);a.data.attributes[e]={itemSize:d.itemSize,type:d.array.constructor.name,array:b, +normalized:d.normalized}}var e=this.groups;0<e.length&&(a.data.groups=JSON.parse(JSON.stringify(e)));e=this.boundingSphere;null!==e&&(a.data.boundingSphere={center:e.center.toArray(),radius:e.radius});return a},clone:function(){return(new z).copy(this)},copy:function(a){var b;this.index=null;this.attributes={};this.morphAttributes={};this.groups=[];this.boundingSphere=this.boundingBox=null;this.name=a.name;var c=a.index;null!==c&&this.setIndex(c.clone());c=a.attributes;for(g in c)this.addAttribute(g, +c[g].clone());var d=a.morphAttributes;for(g in d){var e=[],f=d[g];c=0;for(b=f.length;c<b;c++)e.push(f[c].clone());this.morphAttributes[g]=e}var g=a.groups;c=0;for(b=g.length;c<b;c++)d=g[c],this.addGroup(d.start,d.count,d.materialIndex);g=a.boundingBox;null!==g&&(this.boundingBox=g.clone());g=a.boundingSphere;null!==g&&(this.boundingSphere=g.clone());this.drawRange.start=a.drawRange.start;this.drawRange.count=a.drawRange.count;return this},dispose:function(){this.dispatchEvent({type:"dispose"})}}); +Jb.prototype=Object.create(L.prototype);Jb.prototype.constructor=Jb;nb.prototype=Object.create(z.prototype);nb.prototype.constructor=nb;xc.prototype=Object.create(L.prototype);xc.prototype.constructor=xc;ob.prototype=Object.create(z.prototype);ob.prototype.constructor=ob;za.prototype=Object.create(O.prototype);za.prototype.constructor=za;za.prototype.isMeshBasicMaterial=!0;za.prototype.copy=function(a){O.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.lightMap=a.lightMap; +this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.combine=a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;return this};Da.prototype= +Object.create(O.prototype);Da.prototype.constructor=Da;Da.prototype.isShaderMaterial=!0;Da.prototype.copy=function(a){O.prototype.copy.call(this,a);this.fragmentShader=a.fragmentShader;this.vertexShader=a.vertexShader;this.uniforms=Ea.clone(a.uniforms);this.defines=a.defines;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.lights=a.lights;this.clipping=a.clipping;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;this.extensions= +a.extensions;return this};Da.prototype.toJSON=function(a){a=O.prototype.toJSON.call(this,a);a.uniforms=this.uniforms;a.vertexShader=this.vertexShader;a.fragmentShader=this.fragmentShader;return a};Object.assign(pb.prototype,{set:function(a,b){this.origin.copy(a);this.direction.copy(b);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.origin.copy(a.origin);this.direction.copy(a.direction);return this},at:function(a,b){return(b||new p).copy(this.direction).multiplyScalar(a).add(this.origin)}, +lookAt:function(a){this.direction.copy(a).sub(this.origin).normalize();return this},recast:function(){var a=new p;return function(b){this.origin.copy(this.at(b,a));return this}}(),closestPointToPoint:function(a,b){b=b||new p;b.subVectors(a,this.origin);a=b.dot(this.direction);return 0>a?b.copy(this.origin):b.copy(this.direction).multiplyScalar(a).add(this.origin)},distanceToPoint:function(a){return Math.sqrt(this.distanceSqToPoint(a))},distanceSqToPoint:function(){var a=new p;return function(b){var c= +a.subVectors(b,this.origin).dot(this.direction);if(0>c)return this.origin.distanceToSquared(b);a.copy(this.direction).multiplyScalar(c).add(this.origin);return a.distanceToSquared(b)}}(),distanceSqToSegment:function(){var a=new p,b=new p,c=new p;return function(d,e,f,g){a.copy(d).add(e).multiplyScalar(.5);b.copy(e).sub(d).normalize();c.copy(this.origin).sub(a);var h=.5*d.distanceTo(e),k=-this.direction.dot(b),m=c.dot(this.direction),l=-c.dot(b),n=c.lengthSq(),p=Math.abs(1-k*k);if(0<p){d=k*l-m;e=k* +m-l;var q=h*p;0<=d?e>=-q?e<=q?(h=1/p,d*=h,e*=h,k=d*(d+k*e+2*m)+e*(k*d+e+2*l)+n):(e=h,d=Math.max(0,-(k*e+m)),k=-d*d+e*(e+2*l)+n):(e=-h,d=Math.max(0,-(k*e+m)),k=-d*d+e*(e+2*l)+n):e<=-q?(d=Math.max(0,-(-k*h+m)),e=0<d?-h:Math.min(Math.max(-h,-l),h),k=-d*d+e*(e+2*l)+n):e<=q?(d=0,e=Math.min(Math.max(-h,-l),h),k=e*(e+2*l)+n):(d=Math.max(0,-(k*h+m)),e=0<d?h:Math.min(Math.max(-h,-l),h),k=-d*d+e*(e+2*l)+n)}else e=0<k?-h:h,d=Math.max(0,-(k*e+m)),k=-d*d+e*(e+2*l)+n;f&&f.copy(this.direction).multiplyScalar(d).add(this.origin); +g&&g.copy(b).multiplyScalar(e).add(a);return k}}(),intersectSphere:function(){var a=new p;return function(b,c){a.subVectors(b.center,this.origin);var d=a.dot(this.direction),e=a.dot(a)-d*d;b=b.radius*b.radius;if(e>b)return null;b=Math.sqrt(b-e);e=d-b;d+=b;return 0>e&&0>d?null:0>e?this.at(d,c):this.at(e,c)}}(),intersectsSphere:function(a){return this.distanceToPoint(a.center)<=a.radius},distanceToPlane:function(a){var b=a.normal.dot(this.direction);if(0===b)return 0===a.distanceToPoint(this.origin)? +0:null;a=-(this.origin.dot(a.normal)+a.constant)/b;return 0<=a?a:null},intersectPlane:function(a,b){a=this.distanceToPlane(a);return null===a?null:this.at(a,b)},intersectsPlane:function(a){var b=a.distanceToPoint(this.origin);return 0===b||0>a.normal.dot(this.direction)*b?!0:!1},intersectBox:function(a,b){var c=1/this.direction.x;var d=1/this.direction.y;var e=1/this.direction.z,f=this.origin;if(0<=c){var g=(a.min.x-f.x)*c;c*=a.max.x-f.x}else g=(a.max.x-f.x)*c,c*=a.min.x-f.x;if(0<=d){var h=(a.min.y- +f.y)*d;d*=a.max.y-f.y}else h=(a.max.y-f.y)*d,d*=a.min.y-f.y;if(g>d||h>c)return null;if(h>g||g!==g)g=h;if(d<c||c!==c)c=d;0<=e?(h=(a.min.z-f.z)*e,a=(a.max.z-f.z)*e):(h=(a.max.z-f.z)*e,a=(a.min.z-f.z)*e);if(g>a||h>c)return null;if(h>g||g!==g)g=h;if(a<c||c!==c)c=a;return 0>c?null:this.at(0<=g?g:c,b)},intersectsBox:function(){var a=new p;return function(b){return null!==this.intersectBox(b,a)}}(),intersectTriangle:function(){var a=new p,b=new p,c=new p,d=new p;return function(e,f,g,h,k){b.subVectors(f, +e);c.subVectors(g,e);d.crossVectors(b,c);f=this.direction.dot(d);if(0<f){if(h)return null;h=1}else if(0>f)h=-1,f=-f;else return null;a.subVectors(this.origin,e);e=h*this.direction.dot(c.crossVectors(a,c));if(0>e)return null;g=h*this.direction.dot(b.cross(a));if(0>g||e+g>f)return null;e=-h*a.dot(d);return 0>e?null:this.at(e/f,k)}}(),applyMatrix4:function(a){this.origin.applyMatrix4(a);this.direction.transformDirection(a);return this},equals:function(a){return a.origin.equals(this.origin)&&a.direction.equals(this.direction)}}); +Object.assign(Kb.prototype,{set:function(a,b){this.start.copy(a);this.end.copy(b);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.start.copy(a.start);this.end.copy(a.end);return this},getCenter:function(a){return(a||new p).addVectors(this.start,this.end).multiplyScalar(.5)},delta:function(a){return(a||new p).subVectors(this.end,this.start)},distanceSq:function(){return this.start.distanceToSquared(this.end)},distance:function(){return this.start.distanceTo(this.end)}, +at:function(a,b){b=b||new p;return this.delta(b).multiplyScalar(a).add(this.start)},closestPointToPointParameter:function(){var a=new p,b=new p;return function(c,d){a.subVectors(c,this.start);b.subVectors(this.end,this.start);c=b.dot(b);c=b.dot(a)/c;d&&(c=S.clamp(c,0,1));return c}}(),closestPointToPoint:function(a,b,c){a=this.closestPointToPointParameter(a,b);c=c||new p;return this.delta(c).multiplyScalar(a).add(this.start)},applyMatrix4:function(a){this.start.applyMatrix4(a);this.end.applyMatrix4(a); +return this},equals:function(a){return a.start.equals(this.start)&&a.end.equals(this.end)}});Object.assign(Xa,{normal:function(){var a=new p;return function(b,c,d,e){e=e||new p;e.subVectors(d,c);a.subVectors(b,c);e.cross(a);b=e.lengthSq();return 0<b?e.multiplyScalar(1/Math.sqrt(b)):e.set(0,0,0)}}(),barycoordFromPoint:function(){var a=new p,b=new p,c=new p;return function(d,e,f,g,h){a.subVectors(g,e);b.subVectors(f,e);c.subVectors(d,e);d=a.dot(a);e=a.dot(b);f=a.dot(c);var k=b.dot(b);g=b.dot(c);var m= +d*k-e*e;h=h||new p;if(0===m)return h.set(-2,-1,-1);m=1/m;k=(k*f-e*g)*m;d=(d*g-e*f)*m;return h.set(1-k-d,d,k)}}(),containsPoint:function(){var a=new p;return function(b,c,d,e){b=Xa.barycoordFromPoint(b,c,d,e,a);return 0<=b.x&&0<=b.y&&1>=b.x+b.y}}()});Object.assign(Xa.prototype,{set:function(a,b,c){this.a.copy(a);this.b.copy(b);this.c.copy(c);return this},setFromPointsAndIndices:function(a,b,c,d){this.a.copy(a[b]);this.b.copy(a[c]);this.c.copy(a[d]);return this},clone:function(){return(new this.constructor).copy(this)}, +copy:function(a){this.a.copy(a.a);this.b.copy(a.b);this.c.copy(a.c);return this},area:function(){var a=new p,b=new p;return function(){a.subVectors(this.c,this.b);b.subVectors(this.a,this.b);return.5*a.cross(b).length()}}(),midpoint:function(a){return(a||new p).addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)},normal:function(a){return Xa.normal(this.a,this.b,this.c,a)},plane:function(a){return(a||new pa).setFromCoplanarPoints(this.a,this.b,this.c)},barycoordFromPoint:function(a,b){return Xa.barycoordFromPoint(a, +this.a,this.b,this.c,b)},containsPoint:function(a){return Xa.containsPoint(a,this.a,this.b,this.c)},intersectsBox:function(a){return a.intersectsTriangle(this)},closestPointToPoint:function(){var a=new pa,b=[new Kb,new Kb,new Kb],c=new p,d=new p;return function(e,f){f=f||new p;var g=Infinity;a.setFromCoplanarPoints(this.a,this.b,this.c);a.projectPoint(e,c);if(!0===this.containsPoint(c))f.copy(c);else for(b[0].set(this.a,this.b),b[1].set(this.b,this.c),b[2].set(this.c,this.a),e=0;e<b.length;e++){b[e].closestPointToPoint(c, +!0,d);var h=c.distanceToSquared(d);h<g&&(g=h,f.copy(d))}return f}}(),equals:function(a){return a.a.equals(this.a)&&a.b.equals(this.b)&&a.c.equals(this.c)}});ua.prototype=Object.assign(Object.create(y.prototype),{constructor:ua,isMesh:!0,setDrawMode:function(a){this.drawMode=a},copy:function(a){y.prototype.copy.call(this,a);this.drawMode=a.drawMode;void 0!==a.morphTargetInfluences&&(this.morphTargetInfluences=a.morphTargetInfluences.slice());void 0!==a.morphTargetDictionary&&(this.morphTargetDictionary= +Object.assign({},a.morphTargetDictionary));return this},updateMorphTargets:function(){var a=this.geometry;if(a.isBufferGeometry){a=a.morphAttributes;var b=Object.keys(a);if(0<b.length){var c=a[b[0]];if(void 0!==c)for(this.morphTargetInfluences=[],this.morphTargetDictionary={},a=0,b=c.length;a<b;a++){var d=c[a].name||String(a);this.morphTargetInfluences.push(0);this.morphTargetDictionary[d]=a}}}else if(c=a.morphTargets,void 0!==c&&0<c.length)for(this.morphTargetInfluences=[],this.morphTargetDictionary= +{},a=0,b=c.length;a<b;a++)d=c[a].name||String(a),this.morphTargetInfluences.push(0),this.morphTargetDictionary[d]=a},raycast:function(){function a(a,b,c,d,e,f,g){Xa.barycoordFromPoint(a,b,c,d,t);e.multiplyScalar(t.x);f.multiplyScalar(t.y);g.multiplyScalar(t.z);e.add(f).add(g);return e.clone()}function b(a,b,c,d,e,f,g,h){if(null===(1===b.side?d.intersectTriangle(g,f,e,!0,h):d.intersectTriangle(e,f,g,2!==b.side,h)))return null;B.copy(h);B.applyMatrix4(a.matrixWorld);b=c.ray.origin.distanceTo(B);return b< +c.near||b>c.far?null:{distance:b,point:B.clone(),object:a}}function c(c,d,e,f,m,l,n,p){g.fromBufferAttribute(f,l);h.fromBufferAttribute(f,n);k.fromBufferAttribute(f,p);if(c=b(c,c.material,d,e,g,h,k,x))m&&(u.fromBufferAttribute(m,l),q.fromBufferAttribute(m,n),r.fromBufferAttribute(m,p),c.uv=a(x,g,h,k,u,q,r)),c.face=new Wa(l,n,p,Xa.normal(g,h,k)),c.faceIndex=l;return c}var d=new P,e=new pb,f=new Ca,g=new p,h=new p,k=new p,m=new p,l=new p,n=new p,u=new C,q=new C,r=new C,t=new p,x=new p,B=new p;return function(p, +v){var t=this.geometry,w=this.material,B=this.matrixWorld;if(void 0!==w&&(null===t.boundingSphere&&t.computeBoundingSphere(),f.copy(t.boundingSphere),f.applyMatrix4(B),!1!==p.ray.intersectsSphere(f)&&(d.getInverse(B),e.copy(p.ray).applyMatrix4(d),null===t.boundingBox||!1!==e.intersectsBox(t.boundingBox)))){var A;if(t.isBufferGeometry){w=t.index;var y=t.attributes.position;B=t.attributes.uv;var D;if(null!==w){var C=0;for(D=w.count;C<D;C+=3){t=w.getX(C);var z=w.getX(C+1);var H=w.getX(C+2);if(A=c(this, +p,e,y,B,t,z,H))A.faceIndex=Math.floor(C/3),v.push(A)}}else if(void 0!==y)for(C=0,D=y.count;C<D;C+=3)if(t=C,z=C+1,H=C+2,A=c(this,p,e,y,B,t,z,H))A.index=t,v.push(A)}else if(t.isGeometry){B=Array.isArray(w);C=t.vertices;D=t.faces;z=t.faceVertexUvs[0];0<z.length&&(y=z);for(var I=0,K=D.length;I<K;I++){var L=D[I];A=B?w[L.materialIndex]:w;if(void 0!==A){z=C[L.a];H=C[L.b];var M=C[L.c];if(!0===A.morphTargets){var O=t.morphTargets,P=this.morphTargetInfluences;g.set(0,0,0);h.set(0,0,0);k.set(0,0,0);for(var S= +0,R=O.length;S<R;S++){var Y=P[S];if(0!==Y){var W=O[S].vertices;g.addScaledVector(m.subVectors(W[L.a],z),Y);h.addScaledVector(l.subVectors(W[L.b],H),Y);k.addScaledVector(n.subVectors(W[L.c],M),Y)}}g.add(z);h.add(H);k.add(M);z=g;H=h;M=k}if(A=b(this,A,p,e,z,H,M,x))y&&y[I]&&(O=y[I],u.copy(O[0]),q.copy(O[1]),r.copy(O[2]),A.uv=a(x,z,H,M,u,q,r)),A.face=L,A.faceIndex=I,v.push(A)}}}}}}(),clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});var tg=0;na.prototype=Object.assign(Object.create(Qa.prototype), +{constructor:na,isPerspectiveCamera:!0,copy:function(a,b){Qa.prototype.copy.call(this,a,b);this.fov=a.fov;this.zoom=a.zoom;this.near=a.near;this.far=a.far;this.focus=a.focus;this.aspect=a.aspect;this.view=null===a.view?null:Object.assign({},a.view);this.filmGauge=a.filmGauge;this.filmOffset=a.filmOffset;return this},setFocalLength:function(a){a=.5*this.getFilmHeight()/a;this.fov=2*S.RAD2DEG*Math.atan(a);this.updateProjectionMatrix()},getFocalLength:function(){var a=Math.tan(.5*S.DEG2RAD*this.fov); +return.5*this.getFilmHeight()/a},getEffectiveFOV:function(){return 2*S.RAD2DEG*Math.atan(Math.tan(.5*S.DEG2RAD*this.fov)/this.zoom)},getFilmWidth:function(){return this.filmGauge*Math.min(this.aspect,1)},getFilmHeight:function(){return this.filmGauge/Math.max(this.aspect,1)},setViewOffset:function(a,b,c,d,e,f){this.aspect=a/b;null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1});this.view.enabled=!0;this.view.fullWidth=a;this.view.fullHeight=b;this.view.offsetX= +c;this.view.offsetY=d;this.view.width=e;this.view.height=f;this.updateProjectionMatrix()},clearViewOffset:function(){null!==this.view&&(this.view.enabled=!1);this.updateProjectionMatrix()},updateProjectionMatrix:function(){var a=this.near,b=a*Math.tan(.5*S.DEG2RAD*this.fov)/this.zoom,c=2*b,d=this.aspect*c,e=-.5*d,f=this.view;if(null!==this.view&&this.view.enabled){var g=f.fullWidth,h=f.fullHeight;e+=f.offsetX*d/g;b-=f.offsetY*c/h;d*=f.width/g;c*=f.height/h}f=this.filmOffset;0!==f&&(e+=a*f/this.getFilmWidth()); +this.projectionMatrix.makePerspective(e,e+d,b,b-c,a,this.far)},toJSON:function(a){a=y.prototype.toJSON.call(this,a);a.object.fov=this.fov;a.object.zoom=this.zoom;a.object.near=this.near;a.object.far=this.far;a.object.focus=this.focus;a.object.aspect=this.aspect;null!==this.view&&(a.object.view=Object.assign({},this.view));a.object.filmGauge=this.filmGauge;a.object.filmOffset=this.filmOffset;return a}});od.prototype=Object.assign(Object.create(na.prototype),{constructor:od,isArrayCamera:!0});var Dg= +0;Mb.prototype.isFogExp2=!0;Mb.prototype.clone=function(){return new Mb(this.color.getHex(),this.density)};Mb.prototype.toJSON=function(){return{type:"FogExp2",color:this.color.getHex(),density:this.density}};Nb.prototype.isFog=!0;Nb.prototype.clone=function(){return new Nb(this.color.getHex(),this.near,this.far)};Nb.prototype.toJSON=function(){return{type:"Fog",color:this.color.getHex(),near:this.near,far:this.far}};pd.prototype=Object.assign(Object.create(y.prototype),{constructor:pd,copy:function(a, +b){y.prototype.copy.call(this,a,b);null!==a.background&&(this.background=a.background.clone());null!==a.fog&&(this.fog=a.fog.clone());null!==a.overrideMaterial&&(this.overrideMaterial=a.overrideMaterial.clone());this.autoUpdate=a.autoUpdate;this.matrixAutoUpdate=a.matrixAutoUpdate;return this},toJSON:function(a){var b=y.prototype.toJSON.call(this,a);null!==this.background&&(b.object.background=this.background.toJSON(a));null!==this.fog&&(b.object.fog=this.fog.toJSON());return b}});gb.prototype=Object.create(O.prototype); +gb.prototype.constructor=gb;gb.prototype.isSpriteMaterial=!0;gb.prototype.copy=function(a){O.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.rotation=a.rotation;return this};zc.prototype=Object.assign(Object.create(y.prototype),{constructor:zc,isSprite:!0,raycast:function(){var a=new p,b=new p,c=new p;return function(d,e){b.setFromMatrixPosition(this.matrixWorld);d.ray.closestPointToPoint(b,a);c.setFromMatrixScale(this.matrixWorld);var f=c.x*c.y/4;b.distanceToSquared(a)>f|| +(f=d.ray.origin.distanceTo(a),f<d.near||f>d.far||e.push({distance:f,point:a.clone(),face:null,object:this}))}}(),clone:function(){return(new this.constructor(this.material)).copy(this)},copy:function(a){y.prototype.copy.call(this,a);void 0!==a.center&&this.center.copy(a.center);return this}});Ac.prototype=Object.assign(Object.create(y.prototype),{constructor:Ac,copy:function(a){y.prototype.copy.call(this,a,!1);a=a.levels;for(var b=0,c=a.length;b<c;b++){var d=a[b];this.addLevel(d.object.clone(),d.distance)}return this}, +addLevel:function(a,b){void 0===b&&(b=0);b=Math.abs(b);for(var c=this.levels,d=0;d<c.length&&!(b<c[d].distance);d++);c.splice(d,0,{distance:b,object:a});this.add(a)},getObjectForDistance:function(a){for(var b=this.levels,c=1,d=b.length;c<d&&!(a<b[c].distance);c++);return b[c-1].object},raycast:function(){var a=new p;return function(b,c){a.setFromMatrixPosition(this.matrixWorld);var d=b.ray.origin.distanceTo(a);this.getObjectForDistance(d).raycast(b,c)}}(),update:function(){var a=new p,b=new p;return function(c){var d= +this.levels;if(1<d.length){a.setFromMatrixPosition(c.matrixWorld);b.setFromMatrixPosition(this.matrixWorld);c=a.distanceTo(b);d[0].object.visible=!0;for(var e=1,f=d.length;e<f;e++)if(c>=d[e].distance)d[e-1].object.visible=!1,d[e].object.visible=!0;else break;for(;e<f;e++)d[e].object.visible=!1}}}(),toJSON:function(a){a=y.prototype.toJSON.call(this,a);a.object.levels=[];for(var b=this.levels,c=0,d=b.length;c<d;c++){var e=b[c];a.object.levels.push({object:e.object.uuid,distance:e.distance})}return a}}); +Object.assign(Bc.prototype,{calculateInverses:function(){this.boneInverses=[];for(var a=0,b=this.bones.length;a<b;a++){var c=new P;this.bones[a]&&c.getInverse(this.bones[a].matrixWorld);this.boneInverses.push(c)}},pose:function(){var a,b;var c=0;for(b=this.bones.length;c<b;c++)(a=this.bones[c])&&a.matrixWorld.getInverse(this.boneInverses[c]);c=0;for(b=this.bones.length;c<b;c++)if(a=this.bones[c])a.parent&&a.parent.isBone?(a.matrix.getInverse(a.parent.matrixWorld),a.matrix.multiply(a.matrixWorld)): +a.matrix.copy(a.matrixWorld),a.matrix.decompose(a.position,a.quaternion,a.scale)},update:function(){var a=new P,b=new P;return function(){for(var c=this.bones,d=this.boneInverses,e=this.boneMatrices,f=this.boneTexture,g=0,h=c.length;g<h;g++)a.multiplyMatrices(c[g]?c[g].matrixWorld:b,d[g]),a.toArray(e,16*g);void 0!==f&&(f.needsUpdate=!0)}}(),clone:function(){return new Bc(this.bones,this.boneInverses)},getBoneByName:function(a){for(var b=0,c=this.bones.length;b<c;b++){var d=this.bones[b];if(d.name=== +a)return d}}});qd.prototype=Object.assign(Object.create(y.prototype),{constructor:qd,isBone:!0});rd.prototype=Object.assign(Object.create(ua.prototype),{constructor:rd,isSkinnedMesh:!0,initBones:function(){var a=[],b;if(this.geometry&&void 0!==this.geometry.bones){var c=0;for(b=this.geometry.bones.length;c<b;c++){var d=this.geometry.bones[c];var e=new qd;a.push(e);e.name=d.name;e.position.fromArray(d.pos);e.quaternion.fromArray(d.rotq);void 0!==d.scl&&e.scale.fromArray(d.scl)}c=0;for(b=this.geometry.bones.length;c< +b;c++)d=this.geometry.bones[c],-1!==d.parent&&null!==d.parent&&void 0!==a[d.parent]?a[d.parent].add(a[c]):this.add(a[c])}this.updateMatrixWorld(!0);return a},bind:function(a,b){this.skeleton=a;void 0===b&&(this.updateMatrixWorld(!0),this.skeleton.calculateInverses(),b=this.matrixWorld);this.bindMatrix.copy(b);this.bindMatrixInverse.getInverse(b)},pose:function(){this.skeleton.pose()},normalizeSkinWeights:function(){var a;if(this.geometry&&this.geometry.isGeometry)for(a=0;a<this.geometry.skinWeights.length;a++){var b= +this.geometry.skinWeights[a];var c=1/b.manhattanLength();Infinity!==c?b.multiplyScalar(c):b.set(1,0,0,0)}else if(this.geometry&&this.geometry.isBufferGeometry){b=new X;var d=this.geometry.attributes.skinWeight;for(a=0;a<d.count;a++)b.x=d.getX(a),b.y=d.getY(a),b.z=d.getZ(a),b.w=d.getW(a),c=1/b.manhattanLength(),Infinity!==c?b.multiplyScalar(c):b.set(1,0,0,0),d.setXYZW(a,b.x,b.y,b.z,b.w)}},updateMatrixWorld:function(a){ua.prototype.updateMatrixWorld.call(this,a);"attached"===this.bindMode?this.bindMatrixInverse.getInverse(this.matrixWorld): +"detached"===this.bindMode?this.bindMatrixInverse.getInverse(this.bindMatrix):console.warn("THREE.SkinnedMesh: Unrecognized bindMode: "+this.bindMode)},clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});Y.prototype=Object.create(O.prototype);Y.prototype.constructor=Y;Y.prototype.isLineBasicMaterial=!0;Y.prototype.copy=function(a){O.prototype.copy.call(this,a);this.color.copy(a.color);this.linewidth=a.linewidth;this.linecap=a.linecap;this.linejoin=a.linejoin;return this}; +qa.prototype=Object.assign(Object.create(y.prototype),{constructor:qa,isLine:!0,computeLineDistances:function(){var a=new p,b=new p;return function(){var c=this.geometry;if(c.isBufferGeometry)if(null===c.index){for(var d=c.attributes.position,e=[0],f=1,g=d.count;f<g;f++)a.fromBufferAttribute(d,f-1),b.fromBufferAttribute(d,f),e[f]=e[f-1],e[f]+=a.distanceTo(b);c.addAttribute("lineDistance",new THREE.Float32BufferAttribute(e,1))}else console.warn("THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry."); +else if(c.isGeometry)for(d=c.vertices,e=c.lineDistances,e[0]=0,f=1,g=d.length;f<g;f++)e[f]=e[f-1],e[f]+=d[f-1].distanceTo(d[f]);return this}}(),raycast:function(){var a=new P,b=new pb,c=new Ca;return function(d,e){var f=d.linePrecision;f*=f;var g=this.geometry,h=this.matrixWorld;null===g.boundingSphere&&g.computeBoundingSphere();c.copy(g.boundingSphere);c.applyMatrix4(h);if(!1!==d.ray.intersectsSphere(c)){a.getInverse(h);b.copy(d.ray).applyMatrix4(a);var k=new p,m=new p;h=new p;var l=new p,n=this&& +this.isLineSegments?2:1;if(g.isBufferGeometry){var u=g.index,q=g.attributes.position.array;if(null!==u){u=u.array;g=0;for(var r=u.length-1;g<r;g+=n){var t=u[g+1];k.fromArray(q,3*u[g]);m.fromArray(q,3*t);t=b.distanceSqToSegment(k,m,l,h);t>f||(l.applyMatrix4(this.matrixWorld),t=d.ray.origin.distanceTo(l),t<d.near||t>d.far||e.push({distance:t,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}}else for(g=0,r=q.length/3-1;g<r;g+=n)k.fromArray(q,3*g),m.fromArray(q, +3*g+3),t=b.distanceSqToSegment(k,m,l,h),t>f||(l.applyMatrix4(this.matrixWorld),t=d.ray.origin.distanceTo(l),t<d.near||t>d.far||e.push({distance:t,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}else if(g.isGeometry)for(k=g.vertices,m=k.length,g=0;g<m-1;g+=n)t=b.distanceSqToSegment(k[g],k[g+1],l,h),t>f||(l.applyMatrix4(this.matrixWorld),t=d.ray.origin.distanceTo(l),t<d.near||t>d.far||e.push({distance:t,point:h.clone().applyMatrix4(this.matrixWorld),index:g, +face:null,faceIndex:null,object:this}))}}}(),clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});U.prototype=Object.assign(Object.create(qa.prototype),{constructor:U,isLineSegments:!0,computeLineDistances:function(){var a=new p,b=new p;return function(){var c=this.geometry;if(c.isBufferGeometry)if(null===c.index){for(var d=c.attributes.position,e=[],f=0,g=d.count;f<g;f+=2)a.fromBufferAttribute(d,f),b.fromBufferAttribute(d,f+1),e[f]=0===f?0:e[f-1],e[f+1]=e[f]+a.distanceTo(b); +c.addAttribute("lineDistance",new THREE.Float32BufferAttribute(e,1))}else console.warn("THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.");else if(c.isGeometry)for(d=c.vertices,e=c.lineDistances,f=0,g=d.length;f<g;f+=2)a.copy(d[f]),b.copy(d[f+1]),e[f]=0===f?0:e[f-1],e[f+1]=e[f]+a.distanceTo(b);return this}}()});sd.prototype=Object.assign(Object.create(qa.prototype),{constructor:sd,isLineLoop:!0});Ha.prototype=Object.create(O.prototype);Ha.prototype.constructor= +Ha;Ha.prototype.isPointsMaterial=!0;Ha.prototype.copy=function(a){O.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.size=a.size;this.sizeAttenuation=a.sizeAttenuation;return this};Ob.prototype=Object.assign(Object.create(y.prototype),{constructor:Ob,isPoints:!0,raycast:function(){var a=new P,b=new pb,c=new Ca;return function(d,e){function f(a,c){var f=b.distanceSqToPoint(a);if(f<l){a=b.closestPointToPoint(a);a.applyMatrix4(k);var h=d.ray.origin.distanceTo(a);h<d.near||h>d.far|| +e.push({distance:h,distanceToRay:Math.sqrt(f),point:a.clone(),index:c,face:null,object:g})}}var g=this,h=this.geometry,k=this.matrixWorld,m=d.params.Points.threshold;null===h.boundingSphere&&h.computeBoundingSphere();c.copy(h.boundingSphere);c.applyMatrix4(k);c.radius+=m;if(!1!==d.ray.intersectsSphere(c)){a.getInverse(k);b.copy(d.ray).applyMatrix4(a);m/=(this.scale.x+this.scale.y+this.scale.z)/3;var l=m*m;m=new p;if(h.isBufferGeometry){var n=h.index;h=h.attributes.position.array;if(null!==n){var u= +n.array;n=0;for(var q=u.length;n<q;n++){var r=u[n];m.fromArray(h,3*r);f(m,r)}}else for(n=0,u=h.length/3;n<u;n++)m.fromArray(h,3*n),f(m,n)}else for(m=h.vertices,n=0,u=m.length;n<u;n++)f(m[n],n)}}}(),clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});td.prototype=Object.assign(Object.create(y.prototype),{constructor:td,isGroup:!0});Yd.prototype=Object.assign(Object.create(aa.prototype),{constructor:Yd,isVideoTexture:!0,update:function(){var a=this.image;a.readyState>= +a.HAVE_CURRENT_DATA&&(this.needsUpdate=!0)}});Pb.prototype=Object.create(aa.prototype);Pb.prototype.constructor=Pb;Pb.prototype.isCompressedTexture=!0;Cc.prototype=Object.create(aa.prototype);Cc.prototype.constructor=Cc;Cc.prototype.isDepthTexture=!0;Qb.prototype=Object.create(z.prototype);Qb.prototype.constructor=Qb;Dc.prototype=Object.create(L.prototype);Dc.prototype.constructor=Dc;Rb.prototype=Object.create(z.prototype);Rb.prototype.constructor=Rb;Ec.prototype=Object.create(L.prototype);Ec.prototype.constructor= +Ec;va.prototype=Object.create(z.prototype);va.prototype.constructor=va;Fc.prototype=Object.create(L.prototype);Fc.prototype.constructor=Fc;Sb.prototype=Object.create(va.prototype);Sb.prototype.constructor=Sb;Gc.prototype=Object.create(L.prototype);Gc.prototype.constructor=Gc;rb.prototype=Object.create(va.prototype);rb.prototype.constructor=rb;Hc.prototype=Object.create(L.prototype);Hc.prototype.constructor=Hc;Tb.prototype=Object.create(va.prototype);Tb.prototype.constructor=Tb;Ic.prototype=Object.create(L.prototype); +Ic.prototype.constructor=Ic;Ub.prototype=Object.create(va.prototype);Ub.prototype.constructor=Ub;Jc.prototype=Object.create(L.prototype);Jc.prototype.constructor=Jc;Vb.prototype=Object.create(z.prototype);Vb.prototype.constructor=Vb;Kc.prototype=Object.create(L.prototype);Kc.prototype.constructor=Kc;Wb.prototype=Object.create(z.prototype);Wb.prototype.constructor=Wb;Lc.prototype=Object.create(L.prototype);Lc.prototype.constructor=Lc;Xb.prototype=Object.create(z.prototype);Xb.prototype.constructor= +Xb;var Lg={triangulate:function(a,b,c){c=c||2;var d=b&&b.length,e=d?b[0]*c:a.length,f=Xe(a,0,e,c,!0),g=[];if(!f)return g;var h;if(d){var k=c;d=[];var m;var l=0;for(m=b.length;l<m;l++){var n=b[l]*k;var p=l<m-1?b[l+1]*k:a.length;n=Xe(a,n,p,k,!1);n===n.next&&(n.steiner=!0);d.push(Jg(n))}d.sort(Hg);for(l=0;l<d.length;l++){b=d[l];k=f;if(k=Ig(b,k))b=$e(k,b),Nc(b,b.next);f=Nc(f,f.next)}}if(a.length>80*c){var q=h=a[0];var r=d=a[1];for(k=c;k<e;k+=c)l=a[k],b=a[k+1],l<q&&(q=l),b<r&&(r=b),l>h&&(h=l),b>d&&(d= +b);h=Math.max(h-q,d-r);h=0!==h?1/h:0}Oc(f,g,c,q,r,h);return g}},Ya={area:function(a){for(var b=a.length,c=0,d=b-1,e=0;e<b;d=e++)c+=a[d].x*a[e].y-a[e].x*a[d].y;return.5*c},isClockWise:function(a){return 0>Ya.area(a)},triangulateShape:function(a,b){var c=[],d=[],e=[];af(a);bf(c,a);var f=a.length;b.forEach(af);for(a=0;a<b.length;a++)d.push(f),f+=b[a].length,bf(c,b[a]);b=Lg.triangulate(c,d);for(a=0;a<b.length;a+=3)e.push(b.slice(a,a+3));return e}};hb.prototype=Object.create(L.prototype);hb.prototype.constructor= +hb;Ia.prototype=Object.create(z.prototype);Ia.prototype.constructor=Ia;Ia.prototype.getArrays=function(){var a=this.getAttribute("position");a=a?Array.prototype.slice.call(a.array):[];var b=this.getAttribute("uv");b=b?Array.prototype.slice.call(b.array):[];var c=this.index;c=c?Array.prototype.slice.call(c.array):[];return{position:a,uv:b,index:c}};Ia.prototype.addShapeList=function(a,b){var c=a.length;b.arrays=this.getArrays();for(var d=0;d<c;d++)this.addShape(a[d],b);this.setIndex(b.arrays.index); +this.addAttribute("position",new D(b.arrays.position,3));this.addAttribute("uv",new D(b.arrays.uv,2))};Ia.prototype.addShape=function(a,b){function c(a,b,c){b||console.error("THREE.ExtrudeGeometry: vec does not exist");return b.clone().multiplyScalar(c).add(a)}function d(a,b,c){var d=a.x-b.x;var e=a.y-b.y;var f=c.x-a.x;var g=c.y-a.y,h=d*d+e*e;if(Math.abs(d*g-e*f)>Number.EPSILON){var k=Math.sqrt(h),m=Math.sqrt(f*f+g*g);h=b.x-e/k;b=b.y+d/k;g=((c.x-g/m-h)*g-(c.y+f/m-b)*f)/(d*g-e*f);f=h+d*g-a.x;d=b+e* +g-a.y;e=f*f+d*d;if(2>=e)return new C(f,d);e=Math.sqrt(e/2)}else a=!1,d>Number.EPSILON?f>Number.EPSILON&&(a=!0):d<-Number.EPSILON?f<-Number.EPSILON&&(a=!0):Math.sign(e)===Math.sign(g)&&(a=!0),a?(f=-e,e=Math.sqrt(h)):(f=d,d=e,e=Math.sqrt(h/2));return new C(f/e,d/e)}function e(a,b){for(J=a.length;0<=--J;){var c=J;var d=J-1;0>d&&(d=a.length-1);var e,f=A+2*x;for(e=0;e<f;e++){var g=aa*e,m=aa*(e+1),n=b+d+g,p=b+d+m;m=b+c+m;h(b+c+g);h(n);h(m);h(n);h(p);h(m);g=l.length/3;g=H.generateSideWallUV(S,l,g-6,g-3, +g-2,g-1);k(g[0]);k(g[1]);k(g[3]);k(g[1]);k(g[2]);k(g[3])}}}function f(a,b,c){q.push(a);q.push(b);q.push(c)}function g(a,b,c){h(a);h(b);h(c);a=l.length/3;a=H.generateTopUV(S,l,a-3,a-2,a-1);k(a[0]);k(a[1]);k(a[2])}function h(a){n.push(l.length/3);l.push(q[3*a]);l.push(q[3*a+1]);l.push(q[3*a+2])}function k(a){u.push(a.x);u.push(a.y)}var m=b.arrays?b.arrays:this.getArrays(),l=m.position,n=m.index,u=m.uv,q=[];m=void 0!==b.amount?b.amount:100;var r=void 0!==b.bevelThickness?b.bevelThickness:6,t=void 0!== +b.bevelSize?b.bevelSize:r-2,x=void 0!==b.bevelSegments?b.bevelSegments:3,B=void 0!==b.bevelEnabled?b.bevelEnabled:!0,w=void 0!==b.curveSegments?b.curveSegments:12,A=void 0!==b.steps?b.steps:1,y=b.extrudePath,z=!1,H=void 0!==b.UVGenerator?b.UVGenerator:hb.WorldUVGenerator;if(y){var F=y.getSpacedPoints(A);z=!0;B=!1;var I=void 0!==b.frames?b.frames:y.computeFrenetFrames(A,!1);var K=new p;var L=new p;var M=new p}B||(t=r=x=0);var O,S=this;w=a.extractPoints(w);a=w.shape;var P=w.holes;if(!Ya.isClockWise(a)){a= +a.reverse();var T=0;for(O=P.length;T<O;T++){var R=P[T];Ya.isClockWise(R)&&(P[T]=R.reverse())}}var Y=Ya.triangulateShape(a,P),W=a;T=0;for(O=P.length;T<O;T++)R=P[T],a=a.concat(R);var U,aa=a.length,X,da=Y.length;w=[];var J=0;var V=W.length;var Q=V-1;for(U=J+1;J<V;J++,Q++,U++)Q===V&&(Q=0),U===V&&(U=0),w[J]=d(W[J],W[Q],W[U]);y=[];var ea=w.concat();T=0;for(O=P.length;T<O;T++){R=P[T];var ca=[];J=0;V=R.length;Q=V-1;for(U=J+1;J<V;J++,Q++,U++)Q===V&&(Q=0),U===V&&(U=0),ca[J]=d(R[J],R[Q],R[U]);y.push(ca);ea= +ea.concat(ca)}for(Q=0;Q<x;Q++){V=Q/x;var fa=r*Math.cos(V*Math.PI/2);U=t*Math.sin(V*Math.PI/2);J=0;for(V=W.length;J<V;J++){var ha=c(W[J],w[J],U);f(ha.x,ha.y,-fa)}T=0;for(O=P.length;T<O;T++)for(R=P[T],ca=y[T],J=0,V=R.length;J<V;J++)ha=c(R[J],ca[J],U),f(ha.x,ha.y,-fa)}U=t;for(J=0;J<aa;J++)ha=B?c(a[J],ea[J],U):a[J],z?(L.copy(I.normals[0]).multiplyScalar(ha.x),K.copy(I.binormals[0]).multiplyScalar(ha.y),M.copy(F[0]).add(L).add(K),f(M.x,M.y,M.z)):f(ha.x,ha.y,0);for(V=1;V<=A;V++)for(J=0;J<aa;J++)ha=B?c(a[J], +ea[J],U):a[J],z?(L.copy(I.normals[V]).multiplyScalar(ha.x),K.copy(I.binormals[V]).multiplyScalar(ha.y),M.copy(F[V]).add(L).add(K),f(M.x,M.y,M.z)):f(ha.x,ha.y,m/A*V);for(Q=x-1;0<=Q;Q--){V=Q/x;fa=r*Math.cos(V*Math.PI/2);U=t*Math.sin(V*Math.PI/2);J=0;for(V=W.length;J<V;J++)ha=c(W[J],w[J],U),f(ha.x,ha.y,m+fa);T=0;for(O=P.length;T<O;T++)for(R=P[T],ca=y[T],J=0,V=R.length;J<V;J++)ha=c(R[J],ca[J],U),z?f(ha.x,ha.y+F[A-1].y,F[A-1].x+fa):f(ha.x,ha.y,m+fa)}(function(){var a=l.length/3;if(B){var c=0*aa;for(J= +0;J<da;J++)X=Y[J],g(X[2]+c,X[1]+c,X[0]+c);c=aa*(A+2*x);for(J=0;J<da;J++)X=Y[J],g(X[0]+c,X[1]+c,X[2]+c)}else{for(J=0;J<da;J++)X=Y[J],g(X[2],X[1],X[0]);for(J=0;J<da;J++)X=Y[J],g(X[0]+aa*A,X[1]+aa*A,X[2]+aa*A)}S.addGroup(a,l.length/3-a,void 0!==b.material?b.material:0)})();(function(){var a=l.length/3,c=0;e(W,c);c+=W.length;T=0;for(O=P.length;T<O;T++)R=P[T],e(R,c),c+=R.length;S.addGroup(a,l.length/3-a,void 0!==b.extrudeMaterial?b.extrudeMaterial:1)})();b.arrays||(this.setIndex(n),this.addAttribute("position", +new D(l,3)),this.addAttribute("uv",new D(u,2)))};hb.WorldUVGenerator={generateTopUV:function(a,b,c,d,e){a=b[3*d];d=b[3*d+1];var f=b[3*e];e=b[3*e+1];return[new C(b[3*c],b[3*c+1]),new C(a,d),new C(f,e)]},generateSideWallUV:function(a,b,c,d,e,f){a=b[3*c];var g=b[3*c+1];c=b[3*c+2];var h=b[3*d],k=b[3*d+1];d=b[3*d+2];var m=b[3*e],l=b[3*e+1];e=b[3*e+2];var n=b[3*f],p=b[3*f+1];b=b[3*f+2];return.01>Math.abs(g-k)?[new C(a,1-c),new C(h,1-d),new C(m,1-e),new C(n,1-b)]:[new C(g,1-c),new C(k,1-d),new C(l,1-e), +new C(p,1-b)]}};Qc.prototype=Object.create(L.prototype);Qc.prototype.constructor=Qc;Yb.prototype=Object.create(Ia.prototype);Yb.prototype.constructor=Yb;Rc.prototype=Object.create(L.prototype);Rc.prototype.constructor=Rc;tb.prototype=Object.create(z.prototype);tb.prototype.constructor=tb;Sc.prototype=Object.create(L.prototype);Sc.prototype.constructor=Sc;Zb.prototype=Object.create(z.prototype);Zb.prototype.constructor=Zb;Tc.prototype=Object.create(L.prototype);Tc.prototype.constructor=Tc;$b.prototype= +Object.create(z.prototype);$b.prototype.constructor=$b;ub.prototype=Object.create(L.prototype);ub.prototype.constructor=ub;ub.prototype.toJSON=function(){var a=L.prototype.toJSON.call(this);return cf(this.parameters.shapes,a)};vb.prototype=Object.create(z.prototype);vb.prototype.constructor=vb;vb.prototype.toJSON=function(){var a=z.prototype.toJSON.call(this);return cf(this.parameters.shapes,a)};ac.prototype=Object.create(z.prototype);ac.prototype.constructor=ac;wb.prototype=Object.create(L.prototype); +wb.prototype.constructor=wb;Za.prototype=Object.create(z.prototype);Za.prototype.constructor=Za;Uc.prototype=Object.create(wb.prototype);Uc.prototype.constructor=Uc;Vc.prototype=Object.create(Za.prototype);Vc.prototype.constructor=Vc;Wc.prototype=Object.create(L.prototype);Wc.prototype.constructor=Wc;bc.prototype=Object.create(z.prototype);bc.prototype.constructor=bc;var oa=Object.freeze({WireframeGeometry:Qb,ParametricGeometry:Dc,ParametricBufferGeometry:Rb,TetrahedronGeometry:Fc,TetrahedronBufferGeometry:Sb, +OctahedronGeometry:Gc,OctahedronBufferGeometry:rb,IcosahedronGeometry:Hc,IcosahedronBufferGeometry:Tb,DodecahedronGeometry:Ic,DodecahedronBufferGeometry:Ub,PolyhedronGeometry:Ec,PolyhedronBufferGeometry:va,TubeGeometry:Jc,TubeBufferGeometry:Vb,TorusKnotGeometry:Kc,TorusKnotBufferGeometry:Wb,TorusGeometry:Lc,TorusBufferGeometry:Xb,TextGeometry:Qc,TextBufferGeometry:Yb,SphereGeometry:Rc,SphereBufferGeometry:tb,RingGeometry:Sc,RingBufferGeometry:Zb,PlaneGeometry:xc,PlaneBufferGeometry:ob,LatheGeometry:Tc, +LatheBufferGeometry:$b,ShapeGeometry:ub,ShapeBufferGeometry:vb,ExtrudeGeometry:hb,ExtrudeBufferGeometry:Ia,EdgesGeometry:ac,ConeGeometry:Uc,ConeBufferGeometry:Vc,CylinderGeometry:wb,CylinderBufferGeometry:Za,CircleGeometry:Wc,CircleBufferGeometry:bc,BoxGeometry:Jb,BoxBufferGeometry:nb});cc.prototype=Object.create(O.prototype);cc.prototype.constructor=cc;cc.prototype.isShadowMaterial=!0;dc.prototype=Object.create(Da.prototype);dc.prototype.constructor=dc;dc.prototype.isRawShaderMaterial=!0;Sa.prototype= +Object.create(O.prototype);Sa.prototype.constructor=Sa;Sa.prototype.isMeshStandardMaterial=!0;Sa.prototype.copy=function(a){O.prototype.copy.call(this,a);this.defines={STANDARD:""};this.color.copy(a.color);this.roughness=a.roughness;this.metalness=a.metalness;this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity; +this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.roughnessMap=a.roughnessMap;this.metalnessMap=a.metalnessMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.envMapIntensity=a.envMapIntensity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap= +a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};xb.prototype=Object.create(Sa.prototype);xb.prototype.constructor=xb;xb.prototype.isMeshPhysicalMaterial=!0;xb.prototype.copy=function(a){Sa.prototype.copy.call(this,a);this.defines={PHYSICAL:""};this.reflectivity=a.reflectivity;this.clearCoat=a.clearCoat;this.clearCoatRoughness=a.clearCoatRoughness;return this};Ja.prototype=Object.create(O.prototype); +Ja.prototype.constructor=Ja;Ja.prototype.isMeshPhongMaterial=!0;Ja.prototype.copy=function(a){O.prototype.copy.call(this,a);this.color.copy(a.color);this.specular.copy(a.specular);this.shininess=a.shininess;this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale; +this.normalMap=a.normalMap;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.combine=a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin; +this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};yb.prototype=Object.create(Ja.prototype);yb.prototype.constructor=yb;yb.prototype.isMeshToonMaterial=!0;yb.prototype.copy=function(a){Ja.prototype.copy.call(this,a);this.gradientMap=a.gradientMap;return this};zb.prototype=Object.create(O.prototype);zb.prototype.constructor=zb;zb.prototype.isMeshNormalMaterial=!0;zb.prototype.copy=function(a){O.prototype.copy.call(this,a);this.bumpMap=a.bumpMap; +this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};Ab.prototype=Object.create(O.prototype);Ab.prototype.constructor=Ab;Ab.prototype.isMeshLambertMaterial=!0;Ab.prototype.copy= +function(a){O.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.combine=a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe; +this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};Bb.prototype=Object.create(Y.prototype);Bb.prototype.constructor=Bb;Bb.prototype.isLineDashedMaterial=!0;Bb.prototype.copy=function(a){Y.prototype.copy.call(this,a);this.scale=a.scale;this.dashSize=a.dashSize;this.gapSize=a.gapSize;return this};var Mg=Object.freeze({ShadowMaterial:cc, +SpriteMaterial:gb,RawShaderMaterial:dc,ShaderMaterial:Da,PointsMaterial:Ha,MeshPhysicalMaterial:xb,MeshStandardMaterial:Sa,MeshPhongMaterial:Ja,MeshToonMaterial:yb,MeshNormalMaterial:zb,MeshLambertMaterial:Ab,MeshDepthMaterial:db,MeshDistanceMaterial:eb,MeshBasicMaterial:za,LineDashedMaterial:Bb,LineBasicMaterial:Y,Material:O}),Fb={enabled:!1,files:{},add:function(a,b){!1!==this.enabled&&(this.files[a]=b)},get:function(a){if(!1!==this.enabled)return this.files[a]},remove:function(a){delete this.files[a]}, +clear:function(){this.files={}}},ra=new ae,ab={};Object.assign(Ka.prototype,{load:function(a,b,c,d){void 0===a&&(a="");void 0!==this.path&&(a=this.path+a);a=this.manager.resolveURL(a);var e=this,f=Fb.get(a);if(void 0!==f)return e.manager.itemStart(a),setTimeout(function(){b&&b(f);e.manager.itemEnd(a)},0),f;if(void 0!==ab[a])ab[a].push({onLoad:b,onProgress:c,onError:d});else{var g=a.match(/^data:(.*?)(;base64)?,(.*)$/);if(g){c=g[1];var h=!!g[2];g=g[3];g=window.decodeURIComponent(g);h&&(g=window.atob(g)); +try{var k=(this.responseType||"").toLowerCase();switch(k){case "arraybuffer":case "blob":var m=new Uint8Array(g.length);for(h=0;h<g.length;h++)m[h]=g.charCodeAt(h);var l="blob"===k?new Blob([m.buffer],{type:c}):m.buffer;break;case "document":l=(new DOMParser).parseFromString(g,c);break;case "json":l=JSON.parse(g);break;default:l=g}window.setTimeout(function(){b&&b(l);e.manager.itemEnd(a)},0)}catch(u){window.setTimeout(function(){d&&d(u);e.manager.itemEnd(a);e.manager.itemError(a)},0)}}else{ab[a]= +[];ab[a].push({onLoad:b,onProgress:c,onError:d});var n=new XMLHttpRequest;n.open("GET",a,!0);n.addEventListener("load",function(b){var c=this.response;Fb.add(a,c);var d=ab[a];delete ab[a];if(200===this.status){for(var f=0,g=d.length;f<g;f++){var h=d[f];if(h.onLoad)h.onLoad(c)}e.manager.itemEnd(a)}else if(0===this.status){console.warn("THREE.FileLoader: HTTP Status 0 received.");f=0;for(g=d.length;f<g;f++)if(h=d[f],h.onLoad)h.onLoad(c);e.manager.itemEnd(a)}else{f=0;for(g=d.length;f<g;f++)if(h=d[f], +h.onError)h.onError(b);e.manager.itemEnd(a);e.manager.itemError(a)}},!1);n.addEventListener("progress",function(b){for(var c=ab[a],d=0,e=c.length;d<e;d++){var f=c[d];if(f.onProgress)f.onProgress(b)}},!1);n.addEventListener("error",function(b){var c=ab[a];delete ab[a];for(var d=0,f=c.length;d<f;d++){var g=c[d];if(g.onError)g.onError(b)}e.manager.itemEnd(a);e.manager.itemError(a)},!1);void 0!==this.responseType&&(n.responseType=this.responseType);void 0!==this.withCredentials&&(n.withCredentials=this.withCredentials); +n.overrideMimeType&&n.overrideMimeType(void 0!==this.mimeType?this.mimeType:"text/plain");for(h in this.requestHeader)n.setRequestHeader(h,this.requestHeader[h]);n.send(null)}e.manager.itemStart(a);return n}},setPath:function(a){this.path=a;return this},setResponseType:function(a){this.responseType=a;return this},setWithCredentials:function(a){this.withCredentials=a;return this},setMimeType:function(a){this.mimeType=a;return this},setRequestHeader:function(a){this.requestHeader=a;return this}});Object.assign(df.prototype, +{load:function(a,b,c,d){function e(e){k.load(a[e],function(a){a=f._parser(a,!0);g[e]={width:a.width,height:a.height,format:a.format,mipmaps:a.mipmaps};m+=1;6===m&&(1===a.mipmapCount&&(h.minFilter=1006),h.format=a.format,h.needsUpdate=!0,b&&b(h))},c,d)}var f=this,g=[],h=new Pb;h.image=g;var k=new Ka(this.manager);k.setPath(this.path);k.setResponseType("arraybuffer");if(Array.isArray(a))for(var m=0,l=0,n=a.length;l<n;++l)e(l);else k.load(a,function(a){a=f._parser(a,!0);if(a.isCubemap)for(var c=a.mipmaps.length/ +a.mipmapCount,d=0;d<c;d++){g[d]={mipmaps:[]};for(var e=0;e<a.mipmapCount;e++)g[d].mipmaps.push(a.mipmaps[d*a.mipmapCount+e]),g[d].format=a.format,g[d].width=a.width,g[d].height=a.height}else h.image.width=a.width,h.image.height=a.height,h.mipmaps=a.mipmaps;1===a.mipmapCount&&(h.minFilter=1006);h.format=a.format;h.needsUpdate=!0;b&&b(h)},c,d);return h},setPath:function(a){this.path=a;return this}});Object.assign(be.prototype,{load:function(a,b,c,d){var e=this,f=new kb,g=new Ka(this.manager);g.setResponseType("arraybuffer"); +g.load(a,function(a){if(a=e._parser(a))void 0!==a.image?f.image=a.image:void 0!==a.data&&(f.image.width=a.width,f.image.height=a.height,f.image.data=a.data),f.wrapS=void 0!==a.wrapS?a.wrapS:1001,f.wrapT=void 0!==a.wrapT?a.wrapT:1001,f.magFilter=void 0!==a.magFilter?a.magFilter:1006,f.minFilter=void 0!==a.minFilter?a.minFilter:1008,f.anisotropy=void 0!==a.anisotropy?a.anisotropy:1,void 0!==a.format&&(f.format=a.format),void 0!==a.type&&(f.type=a.type),void 0!==a.mipmaps&&(f.mipmaps=a.mipmaps),1=== +a.mipmapCount&&(f.minFilter=1006),f.needsUpdate=!0,b&&b(f,a)},c,d);return f}});Object.assign(Xc.prototype,{crossOrigin:"Anonymous",load:function(a,b,c,d){void 0===a&&(a="");void 0!==this.path&&(a=this.path+a);a=this.manager.resolveURL(a);var e=this,f=Fb.get(a);if(void 0!==f)return e.manager.itemStart(a),setTimeout(function(){b&&b(f);e.manager.itemEnd(a)},0),f;c=document.createElementNS("http://www.w3.org/1999/xhtml","img");c.addEventListener("load",function(){Fb.add(a,this);b&&b(this);e.manager.itemEnd(a)}, +!1);c.addEventListener("error",function(b){d&&d(b);e.manager.itemEnd(a);e.manager.itemError(a)},!1);"data:"!==a.substr(0,5)&&void 0!==this.crossOrigin&&(c.crossOrigin=this.crossOrigin);e.manager.itemStart(a);c.src=a;return c},setCrossOrigin:function(a){this.crossOrigin=a;return this},setPath:function(a){this.path=a;return this}});Object.assign(ce.prototype,{crossOrigin:"Anonymous",load:function(a,b,c,d){function e(c){g.load(a[c],function(a){f.images[c]=a;h++;6===h&&(f.needsUpdate=!0,b&&b(f))},void 0, +d)}var f=new bb,g=new Xc(this.manager);g.setCrossOrigin(this.crossOrigin);g.setPath(this.path);var h=0;for(c=0;c<a.length;++c)e(c);return f},setCrossOrigin:function(a){this.crossOrigin=a;return this},setPath:function(a){this.path=a;return this}});Object.assign(vd.prototype,{crossOrigin:"Anonymous",load:function(a,b,c,d){var e=new aa,f=new Xc(this.manager);f.setCrossOrigin(this.crossOrigin);f.setPath(this.path);f.load(a,function(c){e.image=c;c=0<a.search(/\.(jpg|jpeg)$/)||0===a.search(/^data:image\/jpeg/); +e.format=c?1022:1023;e.needsUpdate=!0;void 0!==b&&b(e)},c,d);return e},setCrossOrigin:function(a){this.crossOrigin=a;return this},setPath:function(a){this.path=a;return this}});Object.assign(K.prototype,{getPoint:function(){console.warn("THREE.Curve: .getPoint() not implemented.");return null},getPointAt:function(a,b){a=this.getUtoTmapping(a);return this.getPoint(a,b)},getPoints:function(a){void 0===a&&(a=5);for(var b=[],c=0;c<=a;c++)b.push(this.getPoint(c/a));return b},getSpacedPoints:function(a){void 0=== +a&&(a=5);for(var b=[],c=0;c<=a;c++)b.push(this.getPointAt(c/a));return b},getLength:function(){var a=this.getLengths();return a[a.length-1]},getLengths:function(a){void 0===a&&(a=this.arcLengthDivisions);if(this.cacheArcLengths&&this.cacheArcLengths.length===a+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;var b=[],c=this.getPoint(0),d,e=0;b.push(0);for(d=1;d<=a;d++){var f=this.getPoint(d/a);e+=f.distanceTo(c);b.push(e);c=f}return this.cacheArcLengths=b},updateArcLengths:function(){this.needsUpdate= +!0;this.getLengths()},getUtoTmapping:function(a,b){var c=this.getLengths(),d=c.length;b=b?b:a*c[d-1];for(var e=0,f=d-1,g;e<=f;)if(a=Math.floor(e+(f-e)/2),g=c[a]-b,0>g)e=a+1;else if(0<g)f=a-1;else{f=a;break}a=f;if(c[a]===b)return a/(d-1);e=c[a];return(a+(b-e)/(c[a+1]-e))/(d-1)},getTangent:function(a){var b=a-1E-4;a+=1E-4;0>b&&(b=0);1<a&&(a=1);b=this.getPoint(b);return this.getPoint(a).clone().sub(b).normalize()},getTangentAt:function(a){a=this.getUtoTmapping(a);return this.getTangent(a)},computeFrenetFrames:function(a, +b){var c=new p,d=[],e=[],f=[],g=new p,h=new P,k;for(k=0;k<=a;k++){var m=k/a;d[k]=this.getTangentAt(m);d[k].normalize()}e[0]=new p;f[0]=new p;k=Number.MAX_VALUE;m=Math.abs(d[0].x);var l=Math.abs(d[0].y),n=Math.abs(d[0].z);m<=k&&(k=m,c.set(1,0,0));l<=k&&(k=l,c.set(0,1,0));n<=k&&c.set(0,0,1);g.crossVectors(d[0],c).normalize();e[0].crossVectors(d[0],g);f[0].crossVectors(d[0],e[0]);for(k=1;k<=a;k++)e[k]=e[k-1].clone(),f[k]=f[k-1].clone(),g.crossVectors(d[k-1],d[k]),g.length()>Number.EPSILON&&(g.normalize(), +c=Math.acos(S.clamp(d[k-1].dot(d[k]),-1,1)),e[k].applyMatrix4(h.makeRotationAxis(g,c))),f[k].crossVectors(d[k],e[k]);if(!0===b)for(c=Math.acos(S.clamp(e[0].dot(e[a]),-1,1)),c/=a,0<d[0].dot(g.crossVectors(e[0],e[a]))&&(c=-c),k=1;k<=a;k++)e[k].applyMatrix4(h.makeRotationAxis(d[k],c*k)),f[k].crossVectors(d[k],e[k]);return{tangents:d,normals:e,binormals:f}},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.arcLengthDivisions=a.arcLengthDivisions;return this},toJSON:function(){var a= +{metadata:{version:4.5,type:"Curve",generator:"Curve.toJSON"}};a.arcLengthDivisions=this.arcLengthDivisions;a.type=this.type;return a},fromJSON:function(a){this.arcLengthDivisions=a.arcLengthDivisions;return this}});Aa.prototype=Object.create(K.prototype);Aa.prototype.constructor=Aa;Aa.prototype.isEllipseCurve=!0;Aa.prototype.getPoint=function(a,b){b=b||new C;for(var c=2*Math.PI,d=this.aEndAngle-this.aStartAngle,e=Math.abs(d)<Number.EPSILON;0>d;)d+=c;for(;d>c;)d-=c;d<Number.EPSILON&&(d=e?0:c);!0!== +this.aClockwise||e||(d=d===c?-c:d-c);c=this.aStartAngle+a*d;a=this.aX+this.xRadius*Math.cos(c);var f=this.aY+this.yRadius*Math.sin(c);0!==this.aRotation&&(c=Math.cos(this.aRotation),d=Math.sin(this.aRotation),e=a-this.aX,f-=this.aY,a=e*c-f*d+this.aX,f=e*d+f*c+this.aY);return b.set(a,f)};Aa.prototype.copy=function(a){K.prototype.copy.call(this,a);this.aX=a.aX;this.aY=a.aY;this.xRadius=a.xRadius;this.yRadius=a.yRadius;this.aStartAngle=a.aStartAngle;this.aEndAngle=a.aEndAngle;this.aClockwise=a.aClockwise; +this.aRotation=a.aRotation;return this};Aa.prototype.toJSON=function(){var a=K.prototype.toJSON.call(this);a.aX=this.aX;a.aY=this.aY;a.xRadius=this.xRadius;a.yRadius=this.yRadius;a.aStartAngle=this.aStartAngle;a.aEndAngle=this.aEndAngle;a.aClockwise=this.aClockwise;a.aRotation=this.aRotation;return a};Aa.prototype.fromJSON=function(a){K.prototype.fromJSON.call(this,a);this.aX=a.aX;this.aY=a.aY;this.xRadius=a.xRadius;this.yRadius=a.yRadius;this.aStartAngle=a.aStartAngle;this.aEndAngle=a.aEndAngle; +this.aClockwise=a.aClockwise;this.aRotation=a.aRotation;return this};ec.prototype=Object.create(Aa.prototype);ec.prototype.constructor=ec;ec.prototype.isArcCurve=!0;var Od=new p,ye=new de,ze=new de,Ae=new de;da.prototype=Object.create(K.prototype);da.prototype.constructor=da;da.prototype.isCatmullRomCurve3=!0;da.prototype.getPoint=function(a,b){b=b||new p;var c=this.points,d=c.length;a*=d-(this.closed?0:1);var e=Math.floor(a);a-=e;this.closed?e+=0<e?0:(Math.floor(Math.abs(e)/c.length)+1)*c.length: +0===a&&e===d-1&&(e=d-2,a=1);if(this.closed||0<e)var f=c[(e-1)%d];else Od.subVectors(c[0],c[1]).add(c[0]),f=Od;var g=c[e%d];var h=c[(e+1)%d];this.closed||e+2<d?c=c[(e+2)%d]:(Od.subVectors(c[d-1],c[d-2]).add(c[d-1]),c=Od);if("centripetal"===this.curveType||"chordal"===this.curveType){var k="chordal"===this.curveType?.5:.25;d=Math.pow(f.distanceToSquared(g),k);e=Math.pow(g.distanceToSquared(h),k);k=Math.pow(h.distanceToSquared(c),k);1E-4>e&&(e=1);1E-4>d&&(d=e);1E-4>k&&(k=e);ye.initNonuniformCatmullRom(f.x, +g.x,h.x,c.x,d,e,k);ze.initNonuniformCatmullRom(f.y,g.y,h.y,c.y,d,e,k);Ae.initNonuniformCatmullRom(f.z,g.z,h.z,c.z,d,e,k)}else"catmullrom"===this.curveType&&(ye.initCatmullRom(f.x,g.x,h.x,c.x,this.tension),ze.initCatmullRom(f.y,g.y,h.y,c.y,this.tension),Ae.initCatmullRom(f.z,g.z,h.z,c.z,this.tension));b.set(ye.calc(a),ze.calc(a),Ae.calc(a));return b};da.prototype.copy=function(a){K.prototype.copy.call(this,a);this.points=[];for(var b=0,c=a.points.length;b<c;b++)this.points.push(a.points[b].clone()); +this.closed=a.closed;this.curveType=a.curveType;this.tension=a.tension;return this};da.prototype.toJSON=function(){var a=K.prototype.toJSON.call(this);a.points=[];for(var b=0,c=this.points.length;b<c;b++)a.points.push(this.points[b].toArray());a.closed=this.closed;a.curveType=this.curveType;a.tension=this.tension;return a};da.prototype.fromJSON=function(a){K.prototype.fromJSON.call(this,a);this.points=[];for(var b=0,c=a.points.length;b<c;b++){var d=a.points[b];this.points.push((new p).fromArray(d))}this.closed= +a.closed;this.curveType=a.curveType;this.tension=a.tension;return this};La.prototype=Object.create(K.prototype);La.prototype.constructor=La;La.prototype.isCubicBezierCurve=!0;La.prototype.getPoint=function(a,b){b=b||new C;var c=this.v0,d=this.v1,e=this.v2,f=this.v3;b.set(Zc(a,c.x,d.x,e.x,f.x),Zc(a,c.y,d.y,e.y,f.y));return b};La.prototype.copy=function(a){K.prototype.copy.call(this,a);this.v0.copy(a.v0);this.v1.copy(a.v1);this.v2.copy(a.v2);this.v3.copy(a.v3);return this};La.prototype.toJSON=function(){var a= +K.prototype.toJSON.call(this);a.v0=this.v0.toArray();a.v1=this.v1.toArray();a.v2=this.v2.toArray();a.v3=this.v3.toArray();return a};La.prototype.fromJSON=function(a){K.prototype.fromJSON.call(this,a);this.v0.fromArray(a.v0);this.v1.fromArray(a.v1);this.v2.fromArray(a.v2);this.v3.fromArray(a.v3);return this};Ta.prototype=Object.create(K.prototype);Ta.prototype.constructor=Ta;Ta.prototype.isCubicBezierCurve3=!0;Ta.prototype.getPoint=function(a,b){b=b||new p;var c=this.v0,d=this.v1,e=this.v2,f=this.v3; +b.set(Zc(a,c.x,d.x,e.x,f.x),Zc(a,c.y,d.y,e.y,f.y),Zc(a,c.z,d.z,e.z,f.z));return b};Ta.prototype.copy=function(a){K.prototype.copy.call(this,a);this.v0.copy(a.v0);this.v1.copy(a.v1);this.v2.copy(a.v2);this.v3.copy(a.v3);return this};Ta.prototype.toJSON=function(){var a=K.prototype.toJSON.call(this);a.v0=this.v0.toArray();a.v1=this.v1.toArray();a.v2=this.v2.toArray();a.v3=this.v3.toArray();return a};Ta.prototype.fromJSON=function(a){K.prototype.fromJSON.call(this,a);this.v0.fromArray(a.v0);this.v1.fromArray(a.v1); +this.v2.fromArray(a.v2);this.v3.fromArray(a.v3);return this};ka.prototype=Object.create(K.prototype);ka.prototype.constructor=ka;ka.prototype.isLineCurve=!0;ka.prototype.getPoint=function(a,b){b=b||new C;1===a?b.copy(this.v2):(b.copy(this.v2).sub(this.v1),b.multiplyScalar(a).add(this.v1));return b};ka.prototype.getPointAt=function(a,b){return this.getPoint(a,b)};ka.prototype.getTangent=function(){return this.v2.clone().sub(this.v1).normalize()};ka.prototype.copy=function(a){K.prototype.copy.call(this, +a);this.v1.copy(a.v1);this.v2.copy(a.v2);return this};ka.prototype.toJSON=function(){var a=K.prototype.toJSON.call(this);a.v1=this.v1.toArray();a.v2=this.v2.toArray();return a};ka.prototype.fromJSON=function(a){K.prototype.fromJSON.call(this,a);this.v1.fromArray(a.v1);this.v2.fromArray(a.v2);return this};Ma.prototype=Object.create(K.prototype);Ma.prototype.constructor=Ma;Ma.prototype.isLineCurve3=!0;Ma.prototype.getPoint=function(a,b){b=b||new p;1===a?b.copy(this.v2):(b.copy(this.v2).sub(this.v1), +b.multiplyScalar(a).add(this.v1));return b};Ma.prototype.getPointAt=function(a,b){return this.getPoint(a,b)};Ma.prototype.copy=function(a){K.prototype.copy.call(this,a);this.v1.copy(a.v1);this.v2.copy(a.v2);return this};Ma.prototype.toJSON=function(){var a=K.prototype.toJSON.call(this);a.v1=this.v1.toArray();a.v2=this.v2.toArray();return a};Ma.prototype.fromJSON=function(a){K.prototype.fromJSON.call(this,a);this.v1.fromArray(a.v1);this.v2.fromArray(a.v2);return this};Na.prototype=Object.create(K.prototype); +Na.prototype.constructor=Na;Na.prototype.isQuadraticBezierCurve=!0;Na.prototype.getPoint=function(a,b){b=b||new C;var c=this.v0,d=this.v1,e=this.v2;b.set(Yc(a,c.x,d.x,e.x),Yc(a,c.y,d.y,e.y));return b};Na.prototype.copy=function(a){K.prototype.copy.call(this,a);this.v0.copy(a.v0);this.v1.copy(a.v1);this.v2.copy(a.v2);return this};Na.prototype.toJSON=function(){var a=K.prototype.toJSON.call(this);a.v0=this.v0.toArray();a.v1=this.v1.toArray();a.v2=this.v2.toArray();return a};Na.prototype.fromJSON=function(a){K.prototype.fromJSON.call(this, +a);this.v0.fromArray(a.v0);this.v1.fromArray(a.v1);this.v2.fromArray(a.v2);return this};Ua.prototype=Object.create(K.prototype);Ua.prototype.constructor=Ua;Ua.prototype.isQuadraticBezierCurve3=!0;Ua.prototype.getPoint=function(a,b){b=b||new p;var c=this.v0,d=this.v1,e=this.v2;b.set(Yc(a,c.x,d.x,e.x),Yc(a,c.y,d.y,e.y),Yc(a,c.z,d.z,e.z));return b};Ua.prototype.copy=function(a){K.prototype.copy.call(this,a);this.v0.copy(a.v0);this.v1.copy(a.v1);this.v2.copy(a.v2);return this};Ua.prototype.toJSON=function(){var a= +K.prototype.toJSON.call(this);a.v0=this.v0.toArray();a.v1=this.v1.toArray();a.v2=this.v2.toArray();return a};Ua.prototype.fromJSON=function(a){K.prototype.fromJSON.call(this,a);this.v0.fromArray(a.v0);this.v1.fromArray(a.v1);this.v2.fromArray(a.v2);return this};Oa.prototype=Object.create(K.prototype);Oa.prototype.constructor=Oa;Oa.prototype.isSplineCurve=!0;Oa.prototype.getPoint=function(a,b){b=b||new C;var c=this.points,d=(c.length-1)*a;a=Math.floor(d);d-=a;var e=c[0===a?a:a-1],f=c[a],g=c[a>c.length- +2?c.length-1:a+1];c=c[a>c.length-3?c.length-1:a+2];b.set(ef(d,e.x,f.x,g.x,c.x),ef(d,e.y,f.y,g.y,c.y));return b};Oa.prototype.copy=function(a){K.prototype.copy.call(this,a);this.points=[];for(var b=0,c=a.points.length;b<c;b++)this.points.push(a.points[b].clone());return this};Oa.prototype.toJSON=function(){var a=K.prototype.toJSON.call(this);a.points=[];for(var b=0,c=this.points.length;b<c;b++)a.points.push(this.points[b].toArray());return a};Oa.prototype.fromJSON=function(a){K.prototype.fromJSON.call(this, +a);this.points=[];for(var b=0,c=a.points.length;b<c;b++){var d=a.points[b];this.points.push((new C).fromArray(d))}return this};var Ng=Object.freeze({ArcCurve:ec,CatmullRomCurve3:da,CubicBezierCurve:La,CubicBezierCurve3:Ta,EllipseCurve:Aa,LineCurve:ka,LineCurve3:Ma,QuadraticBezierCurve:Na,QuadraticBezierCurve3:Ua,SplineCurve:Oa});$a.prototype=Object.assign(Object.create(K.prototype),{constructor:$a,add:function(a){this.curves.push(a)},closePath:function(){var a=this.curves[0].getPoint(0),b=this.curves[this.curves.length- +1].getPoint(1);a.equals(b)||this.curves.push(new ka(b,a))},getPoint:function(a){var b=a*this.getLength(),c=this.getCurveLengths();for(a=0;a<c.length;){if(c[a]>=b)return b=c[a]-b,a=this.curves[a],c=a.getLength(),a.getPointAt(0===c?0:1-b/c);a++}return null},getLength:function(){var a=this.getCurveLengths();return a[a.length-1]},updateArcLengths:function(){this.needsUpdate=!0;this.cacheLengths=null;this.getCurveLengths()},getCurveLengths:function(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths; +for(var a=[],b=0,c=0,d=this.curves.length;c<d;c++)b+=this.curves[c].getLength(),a.push(b);return this.cacheLengths=a},getSpacedPoints:function(a){void 0===a&&(a=40);for(var b=[],c=0;c<=a;c++)b.push(this.getPoint(c/a));this.autoClose&&b.push(b[0]);return b},getPoints:function(a){a=a||12;for(var b=[],c,d=0,e=this.curves;d<e.length;d++){var f=e[d];f=f.getPoints(f&&f.isEllipseCurve?2*a:f&&f.isLineCurve?1:f&&f.isSplineCurve?a*f.points.length:a);for(var g=0;g<f.length;g++){var h=f[g];c&&c.equals(h)||(b.push(h), +c=h)}}this.autoClose&&1<b.length&&!b[b.length-1].equals(b[0])&&b.push(b[0]);return b},copy:function(a){K.prototype.copy.call(this,a);this.curves=[];for(var b=0,c=a.curves.length;b<c;b++)this.curves.push(a.curves[b].clone());this.autoClose=a.autoClose;return this},toJSON:function(){var a=K.prototype.toJSON.call(this);a.autoClose=this.autoClose;a.curves=[];for(var b=0,c=this.curves.length;b<c;b++)a.curves.push(this.curves[b].toJSON());return a},fromJSON:function(a){K.prototype.fromJSON.call(this,a); +this.autoClose=a.autoClose;this.curves=[];for(var b=0,c=a.curves.length;b<c;b++){var d=a.curves[b];this.curves.push((new Ng[d.type]).fromJSON(d))}return this}});Pa.prototype=Object.assign(Object.create($a.prototype),{constructor:Pa,setFromPoints:function(a){this.moveTo(a[0].x,a[0].y);for(var b=1,c=a.length;b<c;b++)this.lineTo(a[b].x,a[b].y)},moveTo:function(a,b){this.currentPoint.set(a,b)},lineTo:function(a,b){var c=new ka(this.currentPoint.clone(),new C(a,b));this.curves.push(c);this.currentPoint.set(a, +b)},quadraticCurveTo:function(a,b,c,d){a=new Na(this.currentPoint.clone(),new C(a,b),new C(c,d));this.curves.push(a);this.currentPoint.set(c,d)},bezierCurveTo:function(a,b,c,d,e,f){a=new La(this.currentPoint.clone(),new C(a,b),new C(c,d),new C(e,f));this.curves.push(a);this.currentPoint.set(e,f)},splineThru:function(a){var b=[this.currentPoint.clone()].concat(a);b=new Oa(b);this.curves.push(b);this.currentPoint.copy(a[a.length-1])},arc:function(a,b,c,d,e,f){this.absarc(a+this.currentPoint.x,b+this.currentPoint.y, +c,d,e,f)},absarc:function(a,b,c,d,e,f){this.absellipse(a,b,c,c,d,e,f)},ellipse:function(a,b,c,d,e,f,g,h){this.absellipse(a+this.currentPoint.x,b+this.currentPoint.y,c,d,e,f,g,h)},absellipse:function(a,b,c,d,e,f,g,h){a=new Aa(a,b,c,d,e,f,g,h);0<this.curves.length&&(b=a.getPoint(0),b.equals(this.currentPoint)||this.lineTo(b.x,b.y));this.curves.push(a);a=a.getPoint(1);this.currentPoint.copy(a)},copy:function(a){$a.prototype.copy.call(this,a);this.currentPoint.copy(a.currentPoint);return this},toJSON:function(){var a= +$a.prototype.toJSON.call(this);a.currentPoint=this.currentPoint.toArray();return a},fromJSON:function(a){$a.prototype.fromJSON.call(this,a);this.currentPoint.fromArray(a.currentPoint);return this}});ib.prototype=Object.assign(Object.create(Pa.prototype),{constructor:ib,getPointsHoles:function(a){for(var b=[],c=0,d=this.holes.length;c<d;c++)b[c]=this.holes[c].getPoints(a);return b},extractPoints:function(a){return{shape:this.getPoints(a),holes:this.getPointsHoles(a)}},copy:function(a){Pa.prototype.copy.call(this, +a);this.holes=[];for(var b=0,c=a.holes.length;b<c;b++)this.holes.push(a.holes[b].clone());return this},toJSON:function(){var a=Pa.prototype.toJSON.call(this);a.uuid=this.uuid;a.holes=[];for(var b=0,c=this.holes.length;b<c;b++)a.holes.push(this.holes[b].toJSON());return a},fromJSON:function(a){Pa.prototype.fromJSON.call(this,a);this.uuid=a.uuid;this.holes=[];for(var b=0,c=a.holes.length;b<c;b++){var d=a.holes[b];this.holes.push((new Pa).fromJSON(d))}return this}});ea.prototype=Object.assign(Object.create(y.prototype), +{constructor:ea,isLight:!0,copy:function(a){y.prototype.copy.call(this,a);this.color.copy(a.color);this.intensity=a.intensity;return this},toJSON:function(a){a=y.prototype.toJSON.call(this,a);a.object.color=this.color.getHex();a.object.intensity=this.intensity;void 0!==this.groundColor&&(a.object.groundColor=this.groundColor.getHex());void 0!==this.distance&&(a.object.distance=this.distance);void 0!==this.angle&&(a.object.angle=this.angle);void 0!==this.decay&&(a.object.decay=this.decay);void 0!== +this.penumbra&&(a.object.penumbra=this.penumbra);void 0!==this.shadow&&(a.object.shadow=this.shadow.toJSON());return a}});wd.prototype=Object.assign(Object.create(ea.prototype),{constructor:wd,isHemisphereLight:!0,copy:function(a){ea.prototype.copy.call(this,a);this.groundColor.copy(a.groundColor);return this}});Object.assign(Cb.prototype,{copy:function(a){this.camera=a.camera.clone();this.bias=a.bias;this.radius=a.radius;this.mapSize.copy(a.mapSize);return this},clone:function(){return(new this.constructor).copy(this)}, +toJSON:function(){var a={};0!==this.bias&&(a.bias=this.bias);1!==this.radius&&(a.radius=this.radius);if(512!==this.mapSize.x||512!==this.mapSize.y)a.mapSize=this.mapSize.toArray();a.camera=this.camera.toJSON(!1).object;delete a.camera.matrix;return a}});xd.prototype=Object.assign(Object.create(Cb.prototype),{constructor:xd,isSpotLightShadow:!0,update:function(a){var b=this.camera,c=2*S.RAD2DEG*a.angle,d=this.mapSize.width/this.mapSize.height;a=a.distance||b.far;if(c!==b.fov||d!==b.aspect||a!==b.far)b.fov= +c,b.aspect=d,b.far=a,b.updateProjectionMatrix()}});yd.prototype=Object.assign(Object.create(ea.prototype),{constructor:yd,isSpotLight:!0,copy:function(a){ea.prototype.copy.call(this,a);this.distance=a.distance;this.angle=a.angle;this.penumbra=a.penumbra;this.decay=a.decay;this.target=a.target.clone();this.shadow=a.shadow.clone();return this}});zd.prototype=Object.assign(Object.create(ea.prototype),{constructor:zd,isPointLight:!0,copy:function(a){ea.prototype.copy.call(this,a);this.distance=a.distance; +this.decay=a.decay;this.shadow=a.shadow.clone();return this}});Ad.prototype=Object.assign(Object.create(Cb.prototype),{constructor:Ad});Bd.prototype=Object.assign(Object.create(ea.prototype),{constructor:Bd,isDirectionalLight:!0,copy:function(a){ea.prototype.copy.call(this,a);this.target=a.target.clone();this.shadow=a.shadow.clone();return this}});Cd.prototype=Object.assign(Object.create(ea.prototype),{constructor:Cd,isAmbientLight:!0});Dd.prototype=Object.assign(Object.create(ea.prototype),{constructor:Dd, +isRectAreaLight:!0,copy:function(a){ea.prototype.copy.call(this,a);this.width=a.width;this.height=a.height;return this},toJSON:function(a){a=ea.prototype.toJSON.call(this,a);a.object.width=this.width;a.object.height=this.height;return a}});Ed.prototype=Object.assign(Object.create(la.prototype),{constructor:Ed,ValueTypeName:"string",ValueBufferType:Array,DefaultInterpolation:2300,InterpolantFactoryMethodLinear:void 0,InterpolantFactoryMethodSmooth:void 0});Fd.prototype=Object.assign(Object.create(la.prototype), +{constructor:Fd,ValueTypeName:"bool",ValueBufferType:Array,DefaultInterpolation:2300,InterpolantFactoryMethodLinear:void 0,InterpolantFactoryMethodSmooth:void 0});Object.assign(Ba.prototype,{evaluate:function(a){var b=this.parameterPositions,c=this._cachedIndex,d=b[c],e=b[c-1];a:{b:{c:{d:if(!(a<d)){for(var f=c+2;;){if(void 0===d){if(a<e)break d;this._cachedIndex=c=b.length;return this.afterEnd_(c-1,a,e)}if(c===f)break;e=d;d=b[++c];if(a<d)break b}d=b.length;break c}if(a>=e)break a;else{f=b[1];a<f&& +(c=2,e=f);for(f=c-2;;){if(void 0===e)return this._cachedIndex=0,this.beforeStart_(0,a,d);if(c===f)break;d=e;e=b[--c-1];if(a>=e)break b}d=c;c=0}}for(;c<d;)e=c+d>>>1,a<b[e]?d=e:c=e+1;d=b[c];e=b[c-1];if(void 0===e)return this._cachedIndex=0,this.beforeStart_(0,a,d);if(void 0===d)return this._cachedIndex=c=b.length,this.afterEnd_(c-1,e,a)}this._cachedIndex=c;this.intervalChanged_(c,e,d)}return this.interpolate_(c,e,a,d)},settings:null,DefaultSettings_:{},getSettings_:function(){return this.settings|| +this.DefaultSettings_},copySampleValue_:function(a){var b=this.resultBuffer,c=this.sampleValues,d=this.valueSize;a*=d;for(var e=0;e!==d;++e)b[e]=c[a+e];return b},interpolate_:function(){throw Error("call to abstract method");},intervalChanged_:function(){}});Object.assign(Ba.prototype,{beforeStart_:Ba.prototype.copySampleValue_,afterEnd_:Ba.prototype.copySampleValue_});Gd.prototype=Object.assign(Object.create(Ba.prototype),{constructor:Gd,interpolate_:function(a,b,c,d){var e=this.resultBuffer,f=this.sampleValues, +g=this.valueSize;a*=g;b=(c-b)/(d-b);for(c=a+g;a!==c;a+=4)ca.slerpFlat(e,0,f,a-g,f,a,b);return e}});$c.prototype=Object.assign(Object.create(la.prototype),{constructor:$c,ValueTypeName:"quaternion",DefaultInterpolation:2301,InterpolantFactoryMethodLinear:function(a){return new Gd(this.times,this.values,this.getValueSize(),a)},InterpolantFactoryMethodSmooth:void 0});Hd.prototype=Object.assign(Object.create(la.prototype),{constructor:Hd,ValueTypeName:"color"});fc.prototype=Object.assign(Object.create(la.prototype), +{constructor:fc,ValueTypeName:"number"});Id.prototype=Object.assign(Object.create(Ba.prototype),{constructor:Id,DefaultSettings_:{endingStart:2400,endingEnd:2400},intervalChanged_:function(a,b,c){var d=this.parameterPositions,e=a-2,f=a+1,g=d[e],h=d[f];if(void 0===g)switch(this.getSettings_().endingStart){case 2401:e=a;g=2*b-c;break;case 2402:e=d.length-2;g=b+d[e]-d[e+1];break;default:e=a,g=c}if(void 0===h)switch(this.getSettings_().endingEnd){case 2401:f=a;h=2*c-b;break;case 2402:f=1;h=c+d[1]-d[0]; +break;default:f=a-1,h=b}a=.5*(c-b);d=this.valueSize;this._weightPrev=a/(b-g);this._weightNext=a/(h-c);this._offsetPrev=e*d;this._offsetNext=f*d},interpolate_:function(a,b,c,d){var e=this.resultBuffer,f=this.sampleValues,g=this.valueSize;a*=g;var h=a-g,k=this._offsetPrev,m=this._offsetNext,l=this._weightPrev,n=this._weightNext,p=(c-b)/(d-b);c=p*p;d=c*p;b=-l*d+2*l*c-l*p;l=(1+l)*d+(-1.5-2*l)*c+(-.5+l)*p+1;p=(-1-n)*d+(1.5+n)*c+.5*p;n=n*d-n*c;for(c=0;c!==g;++c)e[c]=b*f[k+c]+l*f[h+c]+p*f[a+c]+n*f[m+c]; +return e}});ad.prototype=Object.assign(Object.create(Ba.prototype),{constructor:ad,interpolate_:function(a,b,c,d){var e=this.resultBuffer,f=this.sampleValues,g=this.valueSize;a*=g;var h=a-g;b=(c-b)/(d-b);c=1-b;for(d=0;d!==g;++d)e[d]=f[h+d]*c+f[a+d]*b;return e}});Jd.prototype=Object.assign(Object.create(Ba.prototype),{constructor:Jd,interpolate_:function(a){return this.copySampleValue_(a-1)}});var W={arraySlice:function(a,b,c){return W.isTypedArray(a)?new a.constructor(a.subarray(b,void 0!==c?c:a.length)): +a.slice(b,c)},convertArray:function(a,b,c){return!a||!c&&a.constructor===b?a:"number"===typeof b.BYTES_PER_ELEMENT?new b(a):Array.prototype.slice.call(a)},isTypedArray:function(a){return ArrayBuffer.isView(a)&&!(a instanceof DataView)},getKeyframeOrder:function(a){for(var b=a.length,c=Array(b),d=0;d!==b;++d)c[d]=d;c.sort(function(b,c){return a[b]-a[c]});return c},sortedArray:function(a,b,c){for(var d=a.length,e=new a.constructor(d),f=0,g=0;g!==d;++f)for(var h=c[f]*b,k=0;k!==b;++k)e[g++]=a[h+k];return e}, +flattenJSON:function(a,b,c,d){for(var e=1,f=a[0];void 0!==f&&void 0===f[d];)f=a[e++];if(void 0!==f){var g=f[d];if(void 0!==g)if(Array.isArray(g)){do g=f[d],void 0!==g&&(b.push(f.time),c.push.apply(c,g)),f=a[e++];while(void 0!==f)}else if(void 0!==g.toArray){do g=f[d],void 0!==g&&(b.push(f.time),g.toArray(c,c.length)),f=a[e++];while(void 0!==f)}else{do g=f[d],void 0!==g&&(b.push(f.time),c.push(g)),f=a[e++];while(void 0!==f)}}}};Object.assign(la,{parse:function(a){if(void 0===a.type)throw Error("THREE.KeyframeTrack: track type undefined, can not parse"); +var b=la._getTrackTypeForValueTypeName(a.type);if(void 0===a.times){var c=[],d=[];W.flattenJSON(a.keys,c,d,"value");a.times=c;a.values=d}return void 0!==b.parse?b.parse(a):new b(a.name,a.times,a.values,a.interpolation)},toJSON:function(a){var b=a.constructor;if(void 0!==b.toJSON)b=b.toJSON(a);else{b={name:a.name,times:W.convertArray(a.times,Array),values:W.convertArray(a.values,Array)};var c=a.getInterpolation();c!==a.DefaultInterpolation&&(b.interpolation=c)}b.type=a.ValueTypeName;return b},_getTrackTypeForValueTypeName:function(a){switch(a.toLowerCase()){case "scalar":case "double":case "float":case "number":case "integer":return fc; +case "vector":case "vector2":case "vector3":case "vector4":return gc;case "color":return Hd;case "quaternion":return $c;case "bool":case "boolean":return Fd;case "string":return Ed}throw Error("THREE.KeyframeTrack: Unsupported typeName: "+a);}});Object.assign(la.prototype,{constructor:la,TimeBufferType:Float32Array,ValueBufferType:Float32Array,DefaultInterpolation:2301,InterpolantFactoryMethodDiscrete:function(a){return new Jd(this.times,this.values,this.getValueSize(),a)},InterpolantFactoryMethodLinear:function(a){return new ad(this.times, +this.values,this.getValueSize(),a)},InterpolantFactoryMethodSmooth:function(a){return new Id(this.times,this.values,this.getValueSize(),a)},setInterpolation:function(a){switch(a){case 2300:var b=this.InterpolantFactoryMethodDiscrete;break;case 2301:b=this.InterpolantFactoryMethodLinear;break;case 2302:b=this.InterpolantFactoryMethodSmooth}if(void 0===b){b="unsupported interpolation for "+this.ValueTypeName+" keyframe track named "+this.name;if(void 0===this.createInterpolant)if(a!==this.DefaultInterpolation)this.setInterpolation(this.DefaultInterpolation); +else throw Error(b);console.warn("THREE.KeyframeTrack:",b)}else this.createInterpolant=b},getInterpolation:function(){switch(this.createInterpolant){case this.InterpolantFactoryMethodDiscrete:return 2300;case this.InterpolantFactoryMethodLinear:return 2301;case this.InterpolantFactoryMethodSmooth:return 2302}},getValueSize:function(){return this.values.length/this.times.length},shift:function(a){if(0!==a)for(var b=this.times,c=0,d=b.length;c!==d;++c)b[c]+=a;return this},scale:function(a){if(1!==a)for(var b= +this.times,c=0,d=b.length;c!==d;++c)b[c]*=a;return this},trim:function(a,b){for(var c=this.times,d=c.length,e=0,f=d-1;e!==d&&c[e]<a;)++e;for(;-1!==f&&c[f]>b;)--f;++f;if(0!==e||f!==d)e>=f&&(f=Math.max(f,1),e=f-1),a=this.getValueSize(),this.times=W.arraySlice(c,e,f),this.values=W.arraySlice(this.values,e*a,f*a);return this},validate:function(){var a=!0,b=this.getValueSize();0!==b-Math.floor(b)&&(console.error("THREE.KeyframeTrack: Invalid value size in track.",this),a=!1);var c=this.times;b=this.values; +var d=c.length;0===d&&(console.error("THREE.KeyframeTrack: Track is empty.",this),a=!1);for(var e=null,f=0;f!==d;f++){var g=c[f];if("number"===typeof g&&isNaN(g)){console.error("THREE.KeyframeTrack: Time is not a valid number.",this,f,g);a=!1;break}if(null!==e&&e>g){console.error("THREE.KeyframeTrack: Out of order keys.",this,f,g,e);a=!1;break}e=g}if(void 0!==b&&W.isTypedArray(b))for(f=0,c=b.length;f!==c;++f)if(d=b[f],isNaN(d)){console.error("THREE.KeyframeTrack: Value is not a valid number.",this, +f,d);a=!1;break}return a},optimize:function(){for(var a=this.times,b=this.values,c=this.getValueSize(),d=2302===this.getInterpolation(),e=1,f=a.length-1,g=1;g<f;++g){var h=!1,k=a[g];if(k!==a[g+1]&&(1!==g||k!==k[0]))if(d)h=!0;else{var m=g*c,l=m-c,n=m+c;for(k=0;k!==c;++k){var p=b[m+k];if(p!==b[l+k]||p!==b[n+k]){h=!0;break}}}if(h){if(g!==e)for(a[e]=a[g],h=g*c,m=e*c,k=0;k!==c;++k)b[m+k]=b[h+k];++e}}if(0<f){a[e]=a[f];h=f*c;m=e*c;for(k=0;k!==c;++k)b[m+k]=b[h+k];++e}e!==a.length&&(this.times=W.arraySlice(a, +0,e),this.values=W.arraySlice(b,0,e*c));return this}});gc.prototype=Object.assign(Object.create(la.prototype),{constructor:gc,ValueTypeName:"vector"});Object.assign(wa,{parse:function(a){for(var b=[],c=a.tracks,d=1/(a.fps||1),e=0,f=c.length;e!==f;++e)b.push(la.parse(c[e]).scale(d));return new wa(a.name,a.duration,b)},toJSON:function(a){var b=[],c=a.tracks;a={name:a.name,duration:a.duration,tracks:b};for(var d=0,e=c.length;d!==e;++d)b.push(la.toJSON(c[d]));return a},CreateFromMorphTargetSequence:function(a, +b,c,d){for(var e=b.length,f=[],g=0;g<e;g++){var h=[],k=[];h.push((g+e-1)%e,g,(g+1)%e);k.push(0,1,0);var m=W.getKeyframeOrder(h);h=W.sortedArray(h,1,m);k=W.sortedArray(k,1,m);d||0!==h[0]||(h.push(e),k.push(k[0]));f.push((new fc(".morphTargetInfluences["+b[g].name+"]",h,k)).scale(1/c))}return new wa(a,-1,f)},findByName:function(a,b){var c=a;Array.isArray(a)||(c=a.geometry&&a.geometry.animations||a.animations);for(a=0;a<c.length;a++)if(c[a].name===b)return c[a];return null},CreateClipsFromMorphTargetSequences:function(a, +b,c){for(var d={},e=/^([\w-]*?)([\d]+)$/,f=0,g=a.length;f<g;f++){var h=a[f],k=h.name.match(e);if(k&&1<k.length){var m=k[1];(k=d[m])||(d[m]=k=[]);k.push(h)}}a=[];for(m in d)a.push(wa.CreateFromMorphTargetSequence(m,d[m],b,c));return a},parseAnimation:function(a,b){if(!a)return console.error("THREE.AnimationClip: No animation in JSONLoader data."),null;var c=function(a,b,c,d,e){if(0!==c.length){var f=[],g=[];W.flattenJSON(c,f,g,d);0!==f.length&&e.push(new a(b,f,g))}},d=[],e=a.name||"default",f=a.length|| +-1,g=a.fps||30;a=a.hierarchy||[];for(var h=0;h<a.length;h++){var k=a[h].keys;if(k&&0!==k.length)if(k[0].morphTargets){f={};for(var m=0;m<k.length;m++)if(k[m].morphTargets)for(var l=0;l<k[m].morphTargets.length;l++)f[k[m].morphTargets[l]]=-1;for(var n in f){var p=[],q=[];for(l=0;l!==k[m].morphTargets.length;++l){var r=k[m];p.push(r.time);q.push(r.morphTarget===n?1:0)}d.push(new fc(".morphTargetInfluence["+n+"]",p,q))}f=f.length*(g||1)}else m=".bones["+b[h].name+"]",c(gc,m+".position",k,"pos",d),c($c, +m+".quaternion",k,"rot",d),c(gc,m+".scale",k,"scl",d)}return 0===d.length?null:new wa(e,f,d)}});Object.assign(wa.prototype,{resetDuration:function(){for(var a=0,b=0,c=this.tracks.length;b!==c;++b){var d=this.tracks[b];a=Math.max(a,d.times[d.times.length-1])}this.duration=a},trim:function(){for(var a=0;a<this.tracks.length;a++)this.tracks[a].trim(0,this.duration);return this},optimize:function(){for(var a=0;a<this.tracks.length;a++)this.tracks[a].optimize();return this}});Object.assign(Kd.prototype, +{load:function(a,b,c,d){var e=this;(new Ka(e.manager)).load(a,function(a){b(e.parse(JSON.parse(a)))},c,d)},setTextures:function(a){this.textures=a},parse:function(a){function b(a){void 0===c[a]&&console.warn("THREE.MaterialLoader: Undefined texture",a);return c[a]}var c=this.textures,d=new Mg[a.type];void 0!==a.uuid&&(d.uuid=a.uuid);void 0!==a.name&&(d.name=a.name);void 0!==a.color&&d.color.setHex(a.color);void 0!==a.roughness&&(d.roughness=a.roughness);void 0!==a.metalness&&(d.metalness=a.metalness); +void 0!==a.emissive&&d.emissive.setHex(a.emissive);void 0!==a.specular&&d.specular.setHex(a.specular);void 0!==a.shininess&&(d.shininess=a.shininess);void 0!==a.clearCoat&&(d.clearCoat=a.clearCoat);void 0!==a.clearCoatRoughness&&(d.clearCoatRoughness=a.clearCoatRoughness);void 0!==a.uniforms&&(d.uniforms=a.uniforms);void 0!==a.vertexShader&&(d.vertexShader=a.vertexShader);void 0!==a.fragmentShader&&(d.fragmentShader=a.fragmentShader);void 0!==a.vertexColors&&(d.vertexColors=a.vertexColors);void 0!== +a.fog&&(d.fog=a.fog);void 0!==a.flatShading&&(d.flatShading=a.flatShading);void 0!==a.blending&&(d.blending=a.blending);void 0!==a.side&&(d.side=a.side);void 0!==a.opacity&&(d.opacity=a.opacity);void 0!==a.transparent&&(d.transparent=a.transparent);void 0!==a.alphaTest&&(d.alphaTest=a.alphaTest);void 0!==a.depthTest&&(d.depthTest=a.depthTest);void 0!==a.depthWrite&&(d.depthWrite=a.depthWrite);void 0!==a.colorWrite&&(d.colorWrite=a.colorWrite);void 0!==a.wireframe&&(d.wireframe=a.wireframe);void 0!== +a.wireframeLinewidth&&(d.wireframeLinewidth=a.wireframeLinewidth);void 0!==a.wireframeLinecap&&(d.wireframeLinecap=a.wireframeLinecap);void 0!==a.wireframeLinejoin&&(d.wireframeLinejoin=a.wireframeLinejoin);void 0!==a.rotation&&(d.rotation=a.rotation);1!==a.linewidth&&(d.linewidth=a.linewidth);void 0!==a.dashSize&&(d.dashSize=a.dashSize);void 0!==a.gapSize&&(d.gapSize=a.gapSize);void 0!==a.scale&&(d.scale=a.scale);void 0!==a.skinning&&(d.skinning=a.skinning);void 0!==a.morphTargets&&(d.morphTargets= +a.morphTargets);void 0!==a.dithering&&(d.dithering=a.dithering);void 0!==a.visible&&(d.visible=a.visible);void 0!==a.userData&&(d.userData=a.userData);void 0!==a.shading&&(d.flatShading=1===a.shading);void 0!==a.size&&(d.size=a.size);void 0!==a.sizeAttenuation&&(d.sizeAttenuation=a.sizeAttenuation);void 0!==a.map&&(d.map=b(a.map));void 0!==a.alphaMap&&(d.alphaMap=b(a.alphaMap),d.transparent=!0);void 0!==a.bumpMap&&(d.bumpMap=b(a.bumpMap));void 0!==a.bumpScale&&(d.bumpScale=a.bumpScale);void 0!==a.normalMap&& +(d.normalMap=b(a.normalMap));if(void 0!==a.normalScale){var e=a.normalScale;!1===Array.isArray(e)&&(e=[e,e]);d.normalScale=(new C).fromArray(e)}void 0!==a.displacementMap&&(d.displacementMap=b(a.displacementMap));void 0!==a.displacementScale&&(d.displacementScale=a.displacementScale);void 0!==a.displacementBias&&(d.displacementBias=a.displacementBias);void 0!==a.roughnessMap&&(d.roughnessMap=b(a.roughnessMap));void 0!==a.metalnessMap&&(d.metalnessMap=b(a.metalnessMap));void 0!==a.emissiveMap&&(d.emissiveMap= +b(a.emissiveMap));void 0!==a.emissiveIntensity&&(d.emissiveIntensity=a.emissiveIntensity);void 0!==a.specularMap&&(d.specularMap=b(a.specularMap));void 0!==a.envMap&&(d.envMap=b(a.envMap));void 0!==a.reflectivity&&(d.reflectivity=a.reflectivity);void 0!==a.lightMap&&(d.lightMap=b(a.lightMap));void 0!==a.lightMapIntensity&&(d.lightMapIntensity=a.lightMapIntensity);void 0!==a.aoMap&&(d.aoMap=b(a.aoMap));void 0!==a.aoMapIntensity&&(d.aoMapIntensity=a.aoMapIntensity);void 0!==a.gradientMap&&(d.gradientMap= +b(a.gradientMap));return d}});Object.assign(ee.prototype,{load:function(a,b,c,d){var e=this;(new Ka(e.manager)).load(a,function(a){b(e.parse(JSON.parse(a)))},c,d)},parse:function(a){var b=new z,c=a.data.index;void 0!==c&&(c=new uf[c.type](c.array),b.setIndex(new M(c,1)));var d=a.data.attributes;for(f in d){var e=d[f];c=new uf[e.type](e.array);b.addAttribute(f,new M(c,e.itemSize,e.normalized))}var f=a.data.groups||a.data.drawcalls||a.data.offsets;if(void 0!==f)for(c=0,d=f.length;c!==d;++c)e=f[c],b.addGroup(e.start, +e.count,e.materialIndex);a=a.data.boundingSphere;void 0!==a&&(f=new p,void 0!==a.center&&f.fromArray(a.center),b.boundingSphere=new Ca(f,a.radius));return b}});var uf={Int8Array:Int8Array,Uint8Array:Uint8Array,Uint8ClampedArray:"undefined"!==typeof Uint8ClampedArray?Uint8ClampedArray:Uint8Array,Int16Array:Int16Array,Uint16Array:Uint16Array,Int32Array:Int32Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array};hc.Handlers={handlers:[],add:function(a,b){this.handlers.push(a, +b)},get:function(a){for(var b=this.handlers,c=0,d=b.length;c<d;c+=2){var e=b[c+1];if(b[c].test(a))return e}return null}};Object.assign(hc.prototype,{crossOrigin:void 0,initMaterials:function(a,b,c){for(var d=[],e=0;e<a.length;++e)d[e]=this.createMaterial(a[e],b,c);return d},createMaterial:function(){var a={NoBlending:0,NormalBlending:1,AdditiveBlending:2,SubtractiveBlending:3,MultiplyBlending:4,CustomBlending:5},b=new H,c=new vd,d=new Kd;return function(e,f,g){function h(a,b,d,e,h){a=f+a;var m=hc.Handlers.get(a); +null!==m?a=m.load(a):(c.setCrossOrigin(g),a=c.load(a));void 0!==b&&(a.repeat.fromArray(b),1!==b[0]&&(a.wrapS=1E3),1!==b[1]&&(a.wrapT=1E3));void 0!==d&&a.offset.fromArray(d);void 0!==e&&("repeat"===e[0]&&(a.wrapS=1E3),"mirror"===e[0]&&(a.wrapS=1002),"repeat"===e[1]&&(a.wrapT=1E3),"mirror"===e[1]&&(a.wrapT=1002));void 0!==h&&(a.anisotropy=h);b=S.generateUUID();k[b]=a;return b}var k={},m={uuid:S.generateUUID(),type:"MeshLambertMaterial"},l;for(l in e){var n=e[l];switch(l){case "DbgColor":case "DbgIndex":case "opticalDensity":case "illumination":break; +case "DbgName":m.name=n;break;case "blending":m.blending=a[n];break;case "colorAmbient":case "mapAmbient":console.warn("THREE.Loader.createMaterial:",l,"is no longer supported.");break;case "colorDiffuse":m.color=b.fromArray(n).getHex();break;case "colorSpecular":m.specular=b.fromArray(n).getHex();break;case "colorEmissive":m.emissive=b.fromArray(n).getHex();break;case "specularCoef":m.shininess=n;break;case "shading":"basic"===n.toLowerCase()&&(m.type="MeshBasicMaterial");"phong"===n.toLowerCase()&& +(m.type="MeshPhongMaterial");"standard"===n.toLowerCase()&&(m.type="MeshStandardMaterial");break;case "mapDiffuse":m.map=h(n,e.mapDiffuseRepeat,e.mapDiffuseOffset,e.mapDiffuseWrap,e.mapDiffuseAnisotropy);break;case "mapDiffuseRepeat":case "mapDiffuseOffset":case "mapDiffuseWrap":case "mapDiffuseAnisotropy":break;case "mapEmissive":m.emissiveMap=h(n,e.mapEmissiveRepeat,e.mapEmissiveOffset,e.mapEmissiveWrap,e.mapEmissiveAnisotropy);break;case "mapEmissiveRepeat":case "mapEmissiveOffset":case "mapEmissiveWrap":case "mapEmissiveAnisotropy":break; +case "mapLight":m.lightMap=h(n,e.mapLightRepeat,e.mapLightOffset,e.mapLightWrap,e.mapLightAnisotropy);break;case "mapLightRepeat":case "mapLightOffset":case "mapLightWrap":case "mapLightAnisotropy":break;case "mapAO":m.aoMap=h(n,e.mapAORepeat,e.mapAOOffset,e.mapAOWrap,e.mapAOAnisotropy);break;case "mapAORepeat":case "mapAOOffset":case "mapAOWrap":case "mapAOAnisotropy":break;case "mapBump":m.bumpMap=h(n,e.mapBumpRepeat,e.mapBumpOffset,e.mapBumpWrap,e.mapBumpAnisotropy);break;case "mapBumpScale":m.bumpScale= +n;break;case "mapBumpRepeat":case "mapBumpOffset":case "mapBumpWrap":case "mapBumpAnisotropy":break;case "mapNormal":m.normalMap=h(n,e.mapNormalRepeat,e.mapNormalOffset,e.mapNormalWrap,e.mapNormalAnisotropy);break;case "mapNormalFactor":m.normalScale=[n,n];break;case "mapNormalRepeat":case "mapNormalOffset":case "mapNormalWrap":case "mapNormalAnisotropy":break;case "mapSpecular":m.specularMap=h(n,e.mapSpecularRepeat,e.mapSpecularOffset,e.mapSpecularWrap,e.mapSpecularAnisotropy);break;case "mapSpecularRepeat":case "mapSpecularOffset":case "mapSpecularWrap":case "mapSpecularAnisotropy":break; +case "mapMetalness":m.metalnessMap=h(n,e.mapMetalnessRepeat,e.mapMetalnessOffset,e.mapMetalnessWrap,e.mapMetalnessAnisotropy);break;case "mapMetalnessRepeat":case "mapMetalnessOffset":case "mapMetalnessWrap":case "mapMetalnessAnisotropy":break;case "mapRoughness":m.roughnessMap=h(n,e.mapRoughnessRepeat,e.mapRoughnessOffset,e.mapRoughnessWrap,e.mapRoughnessAnisotropy);break;case "mapRoughnessRepeat":case "mapRoughnessOffset":case "mapRoughnessWrap":case "mapRoughnessAnisotropy":break;case "mapAlpha":m.alphaMap= +h(n,e.mapAlphaRepeat,e.mapAlphaOffset,e.mapAlphaWrap,e.mapAlphaAnisotropy);break;case "mapAlphaRepeat":case "mapAlphaOffset":case "mapAlphaWrap":case "mapAlphaAnisotropy":break;case "flipSided":m.side=1;break;case "doubleSided":m.side=2;break;case "transparency":console.warn("THREE.Loader.createMaterial: transparency has been renamed to opacity");m.opacity=n;break;case "depthTest":case "depthWrite":case "colorWrite":case "opacity":case "reflectivity":case "transparent":case "visible":case "wireframe":m[l]= +n;break;case "vertexColors":!0===n&&(m.vertexColors=2);"face"===n&&(m.vertexColors=1);break;default:console.error("THREE.Loader.createMaterial: Unsupported",l,n)}}"MeshBasicMaterial"===m.type&&delete m.emissive;"MeshPhongMaterial"!==m.type&&delete m.specular;1>m.opacity&&(m.transparent=!0);d.setTextures(k);return d.parse(m)}}()});var Be={decodeText:function(a){if("undefined"!==typeof TextDecoder)return(new TextDecoder).decode(a);for(var b="",c=0,d=a.length;c<d;c++)b+=String.fromCharCode(a[c]);return decodeURIComponent(escape(b))}, +extractUrlBase:function(a){a=a.split("/");if(1===a.length)return"./";a.pop();return a.join("/")+"/"}};Object.assign(fe.prototype,{load:function(a,b,c,d){var e=this,f=this.texturePath&&"string"===typeof this.texturePath?this.texturePath:Be.extractUrlBase(a),g=new Ka(this.manager);g.setWithCredentials(this.withCredentials);g.load(a,function(c){c=JSON.parse(c);var d=c.metadata;if(void 0!==d&&(d=d.type,void 0!==d)){if("object"===d.toLowerCase()){console.error("THREE.JSONLoader: "+a+" should be loaded with THREE.ObjectLoader instead."); +return}if("scene"===d.toLowerCase()){console.error("THREE.JSONLoader: "+a+" should be loaded with THREE.SceneLoader instead.");return}}c=e.parse(c,f);b(c.geometry,c.materials)},c,d)},setTexturePath:function(a){this.texturePath=a},parse:function(){return function(a,b){void 0!==a.data&&(a=a.data);a.scale=void 0!==a.scale?1/a.scale:1;var c=new L,d=a,e,f,g,h=d.faces;var k=d.vertices;var m=d.normals,l=d.colors;var n=d.scale;var u=0;if(void 0!==d.uvs){for(e=0;e<d.uvs.length;e++)d.uvs[e].length&&u++;for(e= +0;e<u;e++)c.faceVertexUvs[e]=[]}var q=0;for(g=k.length;q<g;)e=new p,e.x=k[q++]*n,e.y=k[q++]*n,e.z=k[q++]*n,c.vertices.push(e);q=0;for(g=h.length;q<g;){k=h[q++];var r=k&1;var t=k&2;e=k&8;var x=k&16;var B=k&32;n=k&64;k&=128;if(r){r=new Wa;r.a=h[q];r.b=h[q+1];r.c=h[q+3];var w=new Wa;w.a=h[q+1];w.b=h[q+2];w.c=h[q+3];q+=4;t&&(t=h[q++],r.materialIndex=t,w.materialIndex=t);t=c.faces.length;if(e)for(e=0;e<u;e++){var A=d.uvs[e];c.faceVertexUvs[e][t]=[];c.faceVertexUvs[e][t+1]=[];for(f=0;4>f;f++){var y=h[q++]; +var z=A[2*y];y=A[2*y+1];z=new C(z,y);2!==f&&c.faceVertexUvs[e][t].push(z);0!==f&&c.faceVertexUvs[e][t+1].push(z)}}x&&(x=3*h[q++],r.normal.set(m[x++],m[x++],m[x]),w.normal.copy(r.normal));if(B)for(e=0;4>e;e++)x=3*h[q++],B=new p(m[x++],m[x++],m[x]),2!==e&&r.vertexNormals.push(B),0!==e&&w.vertexNormals.push(B);n&&(n=h[q++],n=l[n],r.color.setHex(n),w.color.setHex(n));if(k)for(e=0;4>e;e++)n=h[q++],n=l[n],2!==e&&r.vertexColors.push(new H(n)),0!==e&&w.vertexColors.push(new H(n));c.faces.push(r);c.faces.push(w)}else{r= +new Wa;r.a=h[q++];r.b=h[q++];r.c=h[q++];t&&(t=h[q++],r.materialIndex=t);t=c.faces.length;if(e)for(e=0;e<u;e++)for(A=d.uvs[e],c.faceVertexUvs[e][t]=[],f=0;3>f;f++)y=h[q++],z=A[2*y],y=A[2*y+1],z=new C(z,y),c.faceVertexUvs[e][t].push(z);x&&(x=3*h[q++],r.normal.set(m[x++],m[x++],m[x]));if(B)for(e=0;3>e;e++)x=3*h[q++],B=new p(m[x++],m[x++],m[x]),r.vertexNormals.push(B);n&&(n=h[q++],r.color.setHex(l[n]));if(k)for(e=0;3>e;e++)n=h[q++],r.vertexColors.push(new H(l[n]));c.faces.push(r)}}d=a;q=void 0!==d.influencesPerVertex? +d.influencesPerVertex:2;if(d.skinWeights)for(g=0,h=d.skinWeights.length;g<h;g+=q)c.skinWeights.push(new X(d.skinWeights[g],1<q?d.skinWeights[g+1]:0,2<q?d.skinWeights[g+2]:0,3<q?d.skinWeights[g+3]:0));if(d.skinIndices)for(g=0,h=d.skinIndices.length;g<h;g+=q)c.skinIndices.push(new X(d.skinIndices[g],1<q?d.skinIndices[g+1]:0,2<q?d.skinIndices[g+2]:0,3<q?d.skinIndices[g+3]:0));c.bones=d.bones;c.bones&&0<c.bones.length&&(c.skinWeights.length!==c.skinIndices.length||c.skinIndices.length!==c.vertices.length)&& +console.warn("When skinning, number of vertices ("+c.vertices.length+"), skinIndices ("+c.skinIndices.length+"), and skinWeights ("+c.skinWeights.length+") should match.");g=a;h=g.scale;if(void 0!==g.morphTargets)for(d=0,q=g.morphTargets.length;d<q;d++)for(c.morphTargets[d]={},c.morphTargets[d].name=g.morphTargets[d].name,c.morphTargets[d].vertices=[],m=c.morphTargets[d].vertices,l=g.morphTargets[d].vertices,u=0,k=l.length;u<k;u+=3)n=new p,n.x=l[u]*h,n.y=l[u+1]*h,n.z=l[u+2]*h,m.push(n);if(void 0!== +g.morphColors&&0<g.morphColors.length)for(console.warn('THREE.JSONLoader: "morphColors" no longer supported. Using them as face colors.'),h=c.faces,g=g.morphColors[0].colors,d=0,q=h.length;d<q;d++)h[d].color.fromArray(g,3*d);g=a;d=[];q=[];void 0!==g.animation&&q.push(g.animation);void 0!==g.animations&&(g.animations.length?q=q.concat(g.animations):q.push(g.animations));for(g=0;g<q.length;g++)(h=wa.parseAnimation(q[g],c.bones))&&d.push(h);c.morphTargets&&(q=wa.CreateClipsFromMorphTargetSequences(c.morphTargets, +10),d=d.concat(q));0<d.length&&(c.animations=d);c.computeFaceNormals();c.computeBoundingSphere();if(void 0===a.materials||0===a.materials.length)return{geometry:c};a=hc.prototype.initMaterials(a.materials,b,this.crossOrigin);return{geometry:c,materials:a}}}()});Object.assign(ff.prototype,{load:function(a,b,c,d){""===this.texturePath&&(this.texturePath=a.substring(0,a.lastIndexOf("/")+1));var e=this;(new Ka(e.manager)).load(a,function(c){var f=null;try{f=JSON.parse(c)}catch(h){void 0!==d&&d(h);console.error("THREE:ObjectLoader: Can't parse "+ +a+".",h.message);return}c=f.metadata;void 0===c||void 0===c.type||"geometry"===c.type.toLowerCase()?console.error("THREE.ObjectLoader: Can't load "+a+". Use THREE.JSONLoader instead."):e.parse(f,b)},c,d)},setTexturePath:function(a){this.texturePath=a},setCrossOrigin:function(a){this.crossOrigin=a},parse:function(a,b){var c=this.parseShape(a.shapes);c=this.parseGeometries(a.geometries,c);var d=this.parseImages(a.images,function(){void 0!==b&&b(e)});d=this.parseTextures(a.textures,d);d=this.parseMaterials(a.materials, +d);var e=this.parseObject(a.object,c,d);a.animations&&(e.animations=this.parseAnimations(a.animations));void 0!==a.images&&0!==a.images.length||void 0===b||b(e);return e},parseShape:function(a){var b={};if(void 0!==a)for(var c=0,d=a.length;c<d;c++){var e=(new ib).fromJSON(a[c]);b[e.uuid]=e}return b},parseGeometries:function(a,b){var c={};if(void 0!==a)for(var d=new fe,e=new ee,f=0,g=a.length;f<g;f++){var h=a[f];switch(h.type){case "PlaneGeometry":case "PlaneBufferGeometry":var k=new oa[h.type](h.width, +h.height,h.widthSegments,h.heightSegments);break;case "BoxGeometry":case "BoxBufferGeometry":case "CubeGeometry":k=new oa[h.type](h.width,h.height,h.depth,h.widthSegments,h.heightSegments,h.depthSegments);break;case "CircleGeometry":case "CircleBufferGeometry":k=new oa[h.type](h.radius,h.segments,h.thetaStart,h.thetaLength);break;case "CylinderGeometry":case "CylinderBufferGeometry":k=new oa[h.type](h.radiusTop,h.radiusBottom,h.height,h.radialSegments,h.heightSegments,h.openEnded,h.thetaStart,h.thetaLength); +break;case "ConeGeometry":case "ConeBufferGeometry":k=new oa[h.type](h.radius,h.height,h.radialSegments,h.heightSegments,h.openEnded,h.thetaStart,h.thetaLength);break;case "SphereGeometry":case "SphereBufferGeometry":k=new oa[h.type](h.radius,h.widthSegments,h.heightSegments,h.phiStart,h.phiLength,h.thetaStart,h.thetaLength);break;case "DodecahedronGeometry":case "DodecahedronBufferGeometry":case "IcosahedronGeometry":case "IcosahedronBufferGeometry":case "OctahedronGeometry":case "OctahedronBufferGeometry":case "TetrahedronGeometry":case "TetrahedronBufferGeometry":k= +new oa[h.type](h.radius,h.detail);break;case "RingGeometry":case "RingBufferGeometry":k=new oa[h.type](h.innerRadius,h.outerRadius,h.thetaSegments,h.phiSegments,h.thetaStart,h.thetaLength);break;case "TorusGeometry":case "TorusBufferGeometry":k=new oa[h.type](h.radius,h.tube,h.radialSegments,h.tubularSegments,h.arc);break;case "TorusKnotGeometry":case "TorusKnotBufferGeometry":k=new oa[h.type](h.radius,h.tube,h.tubularSegments,h.radialSegments,h.p,h.q);break;case "LatheGeometry":case "LatheBufferGeometry":k= +new oa[h.type](h.points,h.segments,h.phiStart,h.phiLength);break;case "PolyhedronGeometry":case "PolyhedronBufferGeometry":k=new oa[h.type](h.vertices,h.indices,h.radius,h.details);break;case "ShapeGeometry":case "ShapeBufferGeometry":k=[];f=0;for(g=h.shapes.length;f<g;f++)k.push(b[h.shapes[f]]);k=new oa[h.type](k,h.curveSegments);break;case "BufferGeometry":k=e.parse(h);break;case "Geometry":k=d.parse(h,this.texturePath).geometry;break;default:console.warn('THREE.ObjectLoader: Unsupported geometry type "'+ +h.type+'"');continue}k.uuid=h.uuid;void 0!==h.name&&(k.name=h.name);c[h.uuid]=k}return c},parseMaterials:function(a,b){var c={};if(void 0!==a){var d=new Kd;d.setTextures(b);b=0;for(var e=a.length;b<e;b++){var f=a[b];if("MultiMaterial"===f.type){for(var g=[],h=0;h<f.materials.length;h++)g.push(d.parse(f.materials[h]));c[f.uuid]=g}else c[f.uuid]=d.parse(f)}}return c},parseAnimations:function(a){for(var b=[],c=0;c<a.length;c++){var d=wa.parse(a[c]);b.push(d)}return b},parseImages:function(a,b){function c(a){d.manager.itemStart(a); +return f.load(a,function(){d.manager.itemEnd(a)},void 0,function(){d.manager.itemEnd(a);d.manager.itemError(a)})}var d=this,e={};if(void 0!==a&&0<a.length){b=new ae(b);var f=new Xc(b);f.setCrossOrigin(this.crossOrigin);b=0;for(var g=a.length;b<g;b++){var h=a[b],k=/^(\/\/)|([a-z]+:(\/\/)?)/i.test(h.url)?h.url:d.texturePath+h.url;e[h.uuid]=c(k)}}return e},parseTextures:function(a,b){function c(a,b){if("number"===typeof a)return a;console.warn("THREE.ObjectLoader.parseTexture: Constant should be in numeric form.", +a);return b[a]}var d={};if(void 0!==a)for(var e=0,f=a.length;e<f;e++){var g=a[e];void 0===g.image&&console.warn('THREE.ObjectLoader: No "image" specified for',g.uuid);void 0===b[g.image]&&console.warn("THREE.ObjectLoader: Undefined image",g.image);var h=new aa(b[g.image]);h.needsUpdate=!0;h.uuid=g.uuid;void 0!==g.name&&(h.name=g.name);void 0!==g.mapping&&(h.mapping=c(g.mapping,Og));void 0!==g.offset&&h.offset.fromArray(g.offset);void 0!==g.repeat&&h.repeat.fromArray(g.repeat);void 0!==g.center&&h.center.fromArray(g.center); +void 0!==g.rotation&&(h.rotation=g.rotation);void 0!==g.wrap&&(h.wrapS=c(g.wrap[0],vf),h.wrapT=c(g.wrap[1],vf));void 0!==g.minFilter&&(h.minFilter=c(g.minFilter,wf));void 0!==g.magFilter&&(h.magFilter=c(g.magFilter,wf));void 0!==g.anisotropy&&(h.anisotropy=g.anisotropy);void 0!==g.flipY&&(h.flipY=g.flipY);d[g.uuid]=h}return d},parseObject:function(a,b,c){function d(a){void 0===b[a]&&console.warn("THREE.ObjectLoader: Undefined geometry",a);return b[a]}function e(a){if(void 0!==a){if(Array.isArray(a)){for(var b= +[],d=0,e=a.length;d<e;d++){var f=a[d];void 0===c[f]&&console.warn("THREE.ObjectLoader: Undefined material",f);b.push(c[f])}return b}void 0===c[a]&&console.warn("THREE.ObjectLoader: Undefined material",a);return c[a]}}switch(a.type){case "Scene":var f=new pd;void 0!==a.background&&Number.isInteger(a.background)&&(f.background=new H(a.background));void 0!==a.fog&&("Fog"===a.fog.type?f.fog=new Nb(a.fog.color,a.fog.near,a.fog.far):"FogExp2"===a.fog.type&&(f.fog=new Mb(a.fog.color,a.fog.density)));break; +case "PerspectiveCamera":f=new na(a.fov,a.aspect,a.near,a.far);void 0!==a.focus&&(f.focus=a.focus);void 0!==a.zoom&&(f.zoom=a.zoom);void 0!==a.filmGauge&&(f.filmGauge=a.filmGauge);void 0!==a.filmOffset&&(f.filmOffset=a.filmOffset);void 0!==a.view&&(f.view=Object.assign({},a.view));break;case "OrthographicCamera":f=new Ib(a.left,a.right,a.top,a.bottom,a.near,a.far);break;case "AmbientLight":f=new Cd(a.color,a.intensity);break;case "DirectionalLight":f=new Bd(a.color,a.intensity);break;case "PointLight":f= +new zd(a.color,a.intensity,a.distance,a.decay);break;case "RectAreaLight":f=new Dd(a.color,a.intensity,a.width,a.height);break;case "SpotLight":f=new yd(a.color,a.intensity,a.distance,a.angle,a.penumbra,a.decay);break;case "HemisphereLight":f=new wd(a.color,a.groundColor,a.intensity);break;case "SkinnedMesh":console.warn("THREE.ObjectLoader.parseObject() does not support SkinnedMesh yet.");case "Mesh":f=d(a.geometry);var g=e(a.material);f=f.bones&&0<f.bones.length?new rd(f,g):new ua(f,g);break;case "LOD":f= +new Ac;break;case "Line":f=new qa(d(a.geometry),e(a.material),a.mode);break;case "LineLoop":f=new sd(d(a.geometry),e(a.material));break;case "LineSegments":f=new U(d(a.geometry),e(a.material));break;case "PointCloud":case "Points":f=new Ob(d(a.geometry),e(a.material));break;case "Sprite":f=new zc(e(a.material));break;case "Group":f=new td;break;default:f=new y}f.uuid=a.uuid;void 0!==a.name&&(f.name=a.name);void 0!==a.matrix?(f.matrix.fromArray(a.matrix),f.matrix.decompose(f.position,f.quaternion, +f.scale)):(void 0!==a.position&&f.position.fromArray(a.position),void 0!==a.rotation&&f.rotation.fromArray(a.rotation),void 0!==a.quaternion&&f.quaternion.fromArray(a.quaternion),void 0!==a.scale&&f.scale.fromArray(a.scale));void 0!==a.castShadow&&(f.castShadow=a.castShadow);void 0!==a.receiveShadow&&(f.receiveShadow=a.receiveShadow);a.shadow&&(void 0!==a.shadow.bias&&(f.shadow.bias=a.shadow.bias),void 0!==a.shadow.radius&&(f.shadow.radius=a.shadow.radius),void 0!==a.shadow.mapSize&&f.shadow.mapSize.fromArray(a.shadow.mapSize), +void 0!==a.shadow.camera&&(f.shadow.camera=this.parseObject(a.shadow.camera)));void 0!==a.visible&&(f.visible=a.visible);void 0!==a.userData&&(f.userData=a.userData);if(void 0!==a.children){g=a.children;for(var h=0;h<g.length;h++)f.add(this.parseObject(g[h],b,c))}if("LOD"===a.type)for(a=a.levels,g=0;g<a.length;g++){h=a[g];var k=f.getObjectByProperty("uuid",h.object);void 0!==k&&f.addLevel(k,h.distance)}return f}});var Og={UVMapping:300,CubeReflectionMapping:301,CubeRefractionMapping:302,EquirectangularReflectionMapping:303, +EquirectangularRefractionMapping:304,SphericalReflectionMapping:305,CubeUVReflectionMapping:306,CubeUVRefractionMapping:307},vf={RepeatWrapping:1E3,ClampToEdgeWrapping:1001,MirroredRepeatWrapping:1002},wf={NearestFilter:1003,NearestMipMapNearestFilter:1004,NearestMipMapLinearFilter:1005,LinearFilter:1006,LinearMipMapNearestFilter:1007,LinearMipMapLinearFilter:1008};ge.prototype={constructor:ge,setOptions:function(a){this.options=a;return this},load:function(a,b,c,d){void 0===a&&(a="");void 0!==this.path&& +(a=this.path+a);var e=this,f=Fb.get(a);if(void 0!==f)return e.manager.itemStart(a),setTimeout(function(){b&&b(f);e.manager.itemEnd(a)},0),f;fetch(a).then(function(a){return a.blob()}).then(function(a){return createImageBitmap(a,e.options)}).then(function(c){Fb.add(a,c);b&&b(c);e.manager.itemEnd(a)}).catch(function(b){d&&d(b);e.manager.itemEnd(a);e.manager.itemError(a)})},setCrossOrigin:function(){return this},setPath:function(a){this.path=a;return this}};Object.assign(he.prototype,{moveTo:function(a, +b){this.currentPath=new Pa;this.subPaths.push(this.currentPath);this.currentPath.moveTo(a,b)},lineTo:function(a,b){this.currentPath.lineTo(a,b)},quadraticCurveTo:function(a,b,c,d){this.currentPath.quadraticCurveTo(a,b,c,d)},bezierCurveTo:function(a,b,c,d,e,f){this.currentPath.bezierCurveTo(a,b,c,d,e,f)},splineThru:function(a){this.currentPath.splineThru(a)},toShapes:function(a,b){function c(a){for(var b=[],c=0,d=a.length;c<d;c++){var e=a[c],f=new ib;f.curves=e.curves;b.push(f)}return b}function d(a, +b){for(var c=b.length,d=!1,e=c-1,f=0;f<c;e=f++){var g=b[e],h=b[f],k=h.x-g.x,l=h.y-g.y;if(Math.abs(l)>Number.EPSILON){if(0>l&&(g=b[f],k=-k,h=b[e],l=-l),!(a.y<g.y||a.y>h.y))if(a.y===g.y){if(a.x===g.x)return!0}else{e=l*(a.x-g.x)-k*(a.y-g.y);if(0===e)return!0;0>e||(d=!d)}}else if(a.y===g.y&&(h.x<=a.x&&a.x<=g.x||g.x<=a.x&&a.x<=h.x))return!0}return d}var e=Ya.isClockWise,f=this.subPaths;if(0===f.length)return[];if(!0===b)return c(f);b=[];if(1===f.length){var g=f[0];var h=new ib;h.curves=g.curves;b.push(h); +return b}var k=!e(f[0].getPoints());k=a?!k:k;h=[];var l=[],p=[],n=0;l[n]=void 0;p[n]=[];for(var u=0,q=f.length;u<q;u++){g=f[u];var r=g.getPoints();var t=e(r);(t=a?!t:t)?(!k&&l[n]&&n++,l[n]={s:new ib,p:r},l[n].s.curves=g.curves,k&&n++,p[n]=[]):p[n].push({h:g,p:r[0]})}if(!l[0])return c(f);if(1<l.length){u=!1;a=[];e=0;for(f=l.length;e<f;e++)h[e]=[];e=0;for(f=l.length;e<f;e++)for(g=p[e],t=0;t<g.length;t++){k=g[t];n=!0;for(r=0;r<l.length;r++)d(k.p,l[r].p)&&(e!==r&&a.push({froms:e,tos:r,hole:t}),n?(n=!1, +h[r].push(k)):u=!0);n&&h[e].push(k)}0<a.length&&(u||(p=h))}u=0;for(e=l.length;u<e;u++)for(h=l[u].s,b.push(h),a=p[u],f=0,g=a.length;f<g;f++)h.holes.push(a[f].h);return b}});Object.assign(ie.prototype,{isFont:!0,generateShapes:function(a,b,c){void 0===b&&(b=100);c=[];var d=b;b=this.data;var e=String(a).split("");d/=b.resolution;var f=(b.boundingBox.yMax-b.boundingBox.yMin+b.underlineThickness)*d;a=[];for(var g=0,h=0,k=0;k<e.length;k++){var l=e[k];if("\n"===l)g=0,h-=f;else{var p=d;var n=g,u=h;if(l=b.glyphs[l]|| +b.glyphs["?"]){var q=new he;if(l.o)for(var r=l._cachedOutline||(l._cachedOutline=l.o.split(" ")),t=0,x=r.length;t<x;)switch(r[t++]){case "m":var y=r[t++]*p+n;var w=r[t++]*p+u;q.moveTo(y,w);break;case "l":y=r[t++]*p+n;w=r[t++]*p+u;q.lineTo(y,w);break;case "q":var A=r[t++]*p+n;var z=r[t++]*p+u;var C=r[t++]*p+n;var D=r[t++]*p+u;q.quadraticCurveTo(C,D,A,z);break;case "b":A=r[t++]*p+n,z=r[t++]*p+u,C=r[t++]*p+n,D=r[t++]*p+u,y=r[t++]*p+n,w=r[t++]*p+u,q.bezierCurveTo(C,D,y,w,A,z)}p={offsetX:l.ha*p,path:q}}else p= +void 0;g+=p.offsetX;a.push(p.path)}}b=0;for(e=a.length;b<e;b++)Array.prototype.push.apply(c,a[b].toShapes());return c}});Object.assign(gf.prototype,{load:function(a,b,c,d){var e=this,f=new Ka(this.manager);f.setPath(this.path);f.load(a,function(a){try{var c=JSON.parse(a)}catch(k){console.warn("THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead."),c=JSON.parse(a.substring(65,a.length-2))}a=e.parse(c);b&&b(a)},c,d)},parse:function(a){return new ie(a)},setPath:function(a){this.path= +a;return this}});var Pd,le={getContext:function(){void 0===Pd&&(Pd=new (window.AudioContext||window.webkitAudioContext));return Pd},setContext:function(a){Pd=a}};Object.assign(je.prototype,{load:function(a,b,c,d){var e=new Ka(this.manager);e.setResponseType("arraybuffer");e.load(a,function(a){le.getContext().decodeAudioData(a,function(a){b(a)})},c,d)}});Object.assign(hf.prototype,{update:function(){var a,b,c,d,e,f,g,h,k=new P,l=new P;return function(m){if(a!==this||b!==m.focus||c!==m.fov||d!==m.aspect* +this.aspect||e!==m.near||f!==m.far||g!==m.zoom||h!==this.eyeSep){a=this;b=m.focus;c=m.fov;d=m.aspect*this.aspect;e=m.near;f=m.far;g=m.zoom;var n=m.projectionMatrix.clone();h=this.eyeSep/2;var p=h*e/b,q=e*Math.tan(S.DEG2RAD*c*.5)/g;l.elements[12]=-h;k.elements[12]=h;var r=-q*d+p;var t=q*d+p;n.elements[0]=2*e/(t-r);n.elements[8]=(t+r)/(t-r);this.cameraL.projectionMatrix.copy(n);r=-q*d-p;t=q*d-p;n.elements[0]=2*e/(t-r);n.elements[8]=(t+r)/(t-r);this.cameraR.projectionMatrix.copy(n)}this.cameraL.matrixWorld.copy(m.matrixWorld).multiply(l); +this.cameraR.matrixWorld.copy(m.matrixWorld).multiply(k)}}()});bd.prototype=Object.create(y.prototype);bd.prototype.constructor=bd;ke.prototype=Object.assign(Object.create(y.prototype),{constructor:ke,getInput:function(){return this.gain},removeFilter:function(){null!==this.filter&&(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination),this.gain.connect(this.context.destination),this.filter=null)},getFilter:function(){return this.filter},setFilter:function(a){null!==this.filter? +(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination)):this.gain.disconnect(this.context.destination);this.filter=a;this.gain.connect(this.filter);this.filter.connect(this.context.destination)},getMasterVolume:function(){return this.gain.gain.value},setMasterVolume:function(a){this.gain.gain.value=a},updateMatrixWorld:function(){var a=new p,b=new ca,c=new p,d=new p;return function(e){y.prototype.updateMatrixWorld.call(this,e);e=this.context.listener;var f=this.up;this.matrixWorld.decompose(a, +b,c);d.set(0,0,-1).applyQuaternion(b);e.positionX?(e.positionX.setValueAtTime(a.x,this.context.currentTime),e.positionY.setValueAtTime(a.y,this.context.currentTime),e.positionZ.setValueAtTime(a.z,this.context.currentTime),e.forwardX.setValueAtTime(d.x,this.context.currentTime),e.forwardY.setValueAtTime(d.y,this.context.currentTime),e.forwardZ.setValueAtTime(d.z,this.context.currentTime),e.upX.setValueAtTime(f.x,this.context.currentTime),e.upY.setValueAtTime(f.y,this.context.currentTime),e.upZ.setValueAtTime(f.z, +this.context.currentTime)):(e.setPosition(a.x,a.y,a.z),e.setOrientation(d.x,d.y,d.z,f.x,f.y,f.z))}}()});ic.prototype=Object.assign(Object.create(y.prototype),{constructor:ic,getOutput:function(){return this.gain},setNodeSource:function(a){this.hasPlaybackControl=!1;this.sourceType="audioNode";this.source=a;this.connect();return this},setBuffer:function(a){this.buffer=a;this.sourceType="buffer";this.autoplay&&this.play();return this},play:function(){if(!0===this.isPlaying)console.warn("THREE.Audio: Audio is already playing."); +else if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");else{var a=this.context.createBufferSource();a.buffer=this.buffer;a.loop=this.loop;a.onended=this.onEnded.bind(this);a.playbackRate.setValueAtTime(this.playbackRate,this.startTime);this.startTime=this.context.currentTime;a.start(this.startTime,this.offset);this.isPlaying=!0;this.source=a;return this.connect()}},pause:function(){if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control."); +else return!0===this.isPlaying&&(this.source.stop(),this.offset+=(this.context.currentTime-this.startTime)*this.playbackRate,this.isPlaying=!1),this},stop:function(){if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");else return this.source.stop(),this.offset=0,this.isPlaying=!1,this},connect:function(){if(0<this.filters.length){this.source.connect(this.filters[0]);for(var a=1,b=this.filters.length;a<b;a++)this.filters[a-1].connect(this.filters[a]);this.filters[this.filters.length- +1].connect(this.getOutput())}else this.source.connect(this.getOutput());return this},disconnect:function(){if(0<this.filters.length){this.source.disconnect(this.filters[0]);for(var a=1,b=this.filters.length;a<b;a++)this.filters[a-1].disconnect(this.filters[a]);this.filters[this.filters.length-1].disconnect(this.getOutput())}else this.source.disconnect(this.getOutput());return this},getFilters:function(){return this.filters},setFilters:function(a){a||(a=[]);!0===this.isPlaying?(this.disconnect(),this.filters= +a,this.connect()):this.filters=a;return this},getFilter:function(){return this.getFilters()[0]},setFilter:function(a){return this.setFilters(a?[a]:[])},setPlaybackRate:function(a){if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");else return this.playbackRate=a,!0===this.isPlaying&&this.source.playbackRate.setValueAtTime(this.playbackRate,this.context.currentTime),this},getPlaybackRate:function(){return this.playbackRate},onEnded:function(){this.isPlaying= +!1},getLoop:function(){return!1===this.hasPlaybackControl?(console.warn("THREE.Audio: this Audio has no playback control."),!1):this.loop},setLoop:function(a){if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");else return this.loop=a,!0===this.isPlaying&&(this.source.loop=this.loop),this},getVolume:function(){return this.gain.gain.value},setVolume:function(a){this.gain.gain.value=a;return this}});me.prototype=Object.assign(Object.create(ic.prototype), +{constructor:me,getOutput:function(){return this.panner},getRefDistance:function(){return this.panner.refDistance},setRefDistance:function(a){this.panner.refDistance=a},getRolloffFactor:function(){return this.panner.rolloffFactor},setRolloffFactor:function(a){this.panner.rolloffFactor=a},getDistanceModel:function(){return this.panner.distanceModel},setDistanceModel:function(a){this.panner.distanceModel=a},getMaxDistance:function(){return this.panner.maxDistance},setMaxDistance:function(a){this.panner.maxDistance= +a},updateMatrixWorld:function(){var a=new p;return function(b){y.prototype.updateMatrixWorld.call(this,b);a.setFromMatrixPosition(this.matrixWorld);this.panner.setPosition(a.x,a.y,a.z)}}()});Object.assign(ne.prototype,{getFrequencyData:function(){this.analyser.getByteFrequencyData(this.data);return this.data},getAverageFrequency:function(){for(var a=0,b=this.getFrequencyData(),c=0;c<b.length;c++)a+=b[c];return a/b.length}});Object.assign(oe.prototype,{accumulate:function(a,b){var c=this.buffer,d= +this.valueSize;a=a*d+d;var e=this.cumulativeWeight;if(0===e){for(e=0;e!==d;++e)c[a+e]=c[e];e=b}else e+=b,this._mixBufferRegion(c,a,0,b/e,d);this.cumulativeWeight=e},apply:function(a){var b=this.valueSize,c=this.buffer;a=a*b+b;var d=this.cumulativeWeight,e=this.binding;this.cumulativeWeight=0;1>d&&this._mixBufferRegion(c,a,3*b,1-d,b);d=b;for(var f=b+b;d!==f;++d)if(c[d]!==c[d+b]){e.setValue(c,a);break}},saveOriginalState:function(){var a=this.buffer,b=this.valueSize,c=3*b;this.binding.getValue(a,c); +for(var d=b;d!==c;++d)a[d]=a[c+d%b];this.cumulativeWeight=0},restoreOriginalState:function(){this.binding.setValue(this.buffer,3*this.valueSize)},_select:function(a,b,c,d,e){if(.5<=d)for(d=0;d!==e;++d)a[b+d]=a[c+d]},_slerp:function(a,b,c,d){ca.slerpFlat(a,b,a,b,a,c,d)},_lerp:function(a,b,c,d,e){for(var f=1-d,g=0;g!==e;++g){var h=b+g;a[h]=a[h]*f+a[c+g]*d}}});Object.assign(jf.prototype,{getValue:function(a,b){this.bind();var c=this._bindings[this._targetGroup.nCachedObjects_];void 0!==c&&c.getValue(a, +b)},setValue:function(a,b){for(var c=this._bindings,d=this._targetGroup.nCachedObjects_,e=c.length;d!==e;++d)c[d].setValue(a,b)},bind:function(){for(var a=this._bindings,b=this._targetGroup.nCachedObjects_,c=a.length;b!==c;++b)a[b].bind()},unbind:function(){for(var a=this._bindings,b=this._targetGroup.nCachedObjects_,c=a.length;b!==c;++b)a[b].unbind()}});Object.assign(fa,{Composite:jf,create:function(a,b,c){return a&&a.isAnimationObjectGroup?new fa.Composite(a,b,c):new fa(a,b,c)},sanitizeNodeName:function(){var a= +/[\[\]\.:\/]/g;return function(b){return b.replace(/\s/g,"_").replace(a,"")}}(),parseTrackName:function(){var a="[^"+"\\[\\]\\.:\\/".replace("\\.","")+"]",b=/((?:WC+[\/:])*)/.source.replace("WC","[^\\[\\]\\.:\\/]");a=/(WCOD+)?/.source.replace("WCOD",a);var c=/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC","[^\\[\\]\\.:\\/]"),d=/\.(WC+)(?:\[(.+)\])?/.source.replace("WC","[^\\[\\]\\.:\\/]"),e=new RegExp("^"+b+a+c+d+"$"),f=["material","materials","bones"];return function(a){var b=e.exec(a);if(!b)throw Error("PropertyBinding: Cannot parse trackName: "+ +a);b={nodeName:b[2],objectName:b[3],objectIndex:b[4],propertyName:b[5],propertyIndex:b[6]};var c=b.nodeName&&b.nodeName.lastIndexOf(".");if(void 0!==c&&-1!==c){var d=b.nodeName.substring(c+1);-1!==f.indexOf(d)&&(b.nodeName=b.nodeName.substring(0,c),b.objectName=d)}if(null===b.propertyName||0===b.propertyName.length)throw Error("PropertyBinding: can not parse propertyName from trackName: "+a);return b}}(),findNode:function(a,b){if(!b||""===b||"root"===b||"."===b||-1===b||b===a.name||b===a.uuid)return a; +if(a.skeleton){var c=a.skeleton.getBoneByName(b);if(void 0!==c)return c}if(a.children){var d=function(a){for(var c=0;c<a.length;c++){var e=a[c];if(e.name===b||e.uuid===b||(e=d(e.children)))return e}return null};if(a=d(a.children))return a}return null}});Object.assign(fa.prototype,{_getValue_unavailable:function(){},_setValue_unavailable:function(){},BindingType:{Direct:0,EntireArray:1,ArrayElement:2,HasFromToArray:3},Versioning:{None:0,NeedsUpdate:1,MatrixWorldNeedsUpdate:2},GetterByBindingType:[function(a, +b){a[b]=this.node[this.propertyName]},function(a,b){for(var c=this.resolvedProperty,d=0,e=c.length;d!==e;++d)a[b++]=c[d]},function(a,b){a[b]=this.resolvedProperty[this.propertyIndex]},function(a,b){this.resolvedProperty.toArray(a,b)}],SetterByBindingTypeAndVersioning:[[function(a,b){this.targetObject[this.propertyName]=a[b]},function(a,b){this.targetObject[this.propertyName]=a[b];this.targetObject.needsUpdate=!0},function(a,b){this.targetObject[this.propertyName]=a[b];this.targetObject.matrixWorldNeedsUpdate= +!0}],[function(a,b){for(var c=this.resolvedProperty,d=0,e=c.length;d!==e;++d)c[d]=a[b++]},function(a,b){for(var c=this.resolvedProperty,d=0,e=c.length;d!==e;++d)c[d]=a[b++];this.targetObject.needsUpdate=!0},function(a,b){for(var c=this.resolvedProperty,d=0,e=c.length;d!==e;++d)c[d]=a[b++];this.targetObject.matrixWorldNeedsUpdate=!0}],[function(a,b){this.resolvedProperty[this.propertyIndex]=a[b]},function(a,b){this.resolvedProperty[this.propertyIndex]=a[b];this.targetObject.needsUpdate=!0},function(a, +b){this.resolvedProperty[this.propertyIndex]=a[b];this.targetObject.matrixWorldNeedsUpdate=!0}],[function(a,b){this.resolvedProperty.fromArray(a,b)},function(a,b){this.resolvedProperty.fromArray(a,b);this.targetObject.needsUpdate=!0},function(a,b){this.resolvedProperty.fromArray(a,b);this.targetObject.matrixWorldNeedsUpdate=!0}]],getValue:function(a,b){this.bind();this.getValue(a,b)},setValue:function(a,b){this.bind();this.setValue(a,b)},bind:function(){var a=this.node,b=this.parsedPath,c=b.objectName, +d=b.propertyName,e=b.propertyIndex;a||(this.node=a=fa.findNode(this.rootNode,b.nodeName)||this.rootNode);this.getValue=this._getValue_unavailable;this.setValue=this._setValue_unavailable;if(a){if(c){var f=b.objectIndex;switch(c){case "materials":if(!a.material){console.error("THREE.PropertyBinding: Can not bind to material as node does not have a material.",this);return}if(!a.material.materials){console.error("THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.", +this);return}a=a.material.materials;break;case "bones":if(!a.skeleton){console.error("THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.",this);return}a=a.skeleton.bones;for(c=0;c<a.length;c++)if(a[c].name===f){f=c;break}break;default:if(void 0===a[c]){console.error("THREE.PropertyBinding: Can not bind to objectName of node undefined.",this);return}a=a[c]}if(void 0!==f){if(void 0===a[f]){console.error("THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.", +this,a);return}a=a[f]}}f=a[d];if(void 0===f)console.error("THREE.PropertyBinding: Trying to update property for track: "+b.nodeName+"."+d+" but it wasn't found.",a);else{b=this.Versioning.None;void 0!==a.needsUpdate?(b=this.Versioning.NeedsUpdate,this.targetObject=a):void 0!==a.matrixWorldNeedsUpdate&&(b=this.Versioning.MatrixWorldNeedsUpdate,this.targetObject=a);c=this.BindingType.Direct;if(void 0!==e){if("morphTargetInfluences"===d){if(!a.geometry){console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.", +this);return}if(a.geometry.isBufferGeometry){if(!a.geometry.morphAttributes){console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.",this);return}for(c=0;c<this.node.geometry.morphAttributes.position.length;c++)if(a.geometry.morphAttributes.position[c].name===e){e=c;break}}else{if(!a.geometry.morphTargets){console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphTargets.", +this);return}for(c=0;c<this.node.geometry.morphTargets.length;c++)if(a.geometry.morphTargets[c].name===e){e=c;break}}}c=this.BindingType.ArrayElement;this.resolvedProperty=f;this.propertyIndex=e}else void 0!==f.fromArray&&void 0!==f.toArray?(c=this.BindingType.HasFromToArray,this.resolvedProperty=f):Array.isArray(f)?(c=this.BindingType.EntireArray,this.resolvedProperty=f):this.propertyName=d;this.getValue=this.GetterByBindingType[c];this.setValue=this.SetterByBindingTypeAndVersioning[c][b]}}else console.error("THREE.PropertyBinding: Trying to update node for track: "+ +this.path+" but it wasn't found.")},unbind:function(){this.node=null;this.getValue=this._getValue_unbound;this.setValue=this._setValue_unbound}});Object.assign(fa.prototype,{_getValue_unbound:fa.prototype.getValue,_setValue_unbound:fa.prototype.setValue});Object.assign(kf.prototype,{isAnimationObjectGroup:!0,add:function(){for(var a=this._objects,b=a.length,c=this.nCachedObjects_,d=this._indicesByUUID,e=this._paths,f=this._parsedPaths,g=this._bindings,h=g.length,k=void 0,l=0,p=arguments.length;l!== +p;++l){var n=arguments[l],u=n.uuid,q=d[u];if(void 0===q){q=b++;d[u]=q;a.push(n);u=0;for(var r=h;u!==r;++u)g[u].push(new fa(n,e[u],f[u]))}else if(q<c){k=a[q];var t=--c;r=a[t];d[r.uuid]=q;a[q]=r;d[u]=t;a[t]=n;u=0;for(r=h;u!==r;++u){var x=g[u],y=x[q];x[q]=x[t];void 0===y&&(y=new fa(n,e[u],f[u]));x[t]=y}}else a[q]!==k&&console.error("THREE.AnimationObjectGroup: Different objects with the same UUID detected. Clean the caches or recreate your infrastructure when reloading scenes.")}this.nCachedObjects_= +c},remove:function(){for(var a=this._objects,b=this.nCachedObjects_,c=this._indicesByUUID,d=this._bindings,e=d.length,f=0,g=arguments.length;f!==g;++f){var h=arguments[f],k=h.uuid,l=c[k];if(void 0!==l&&l>=b){var p=b++,n=a[p];c[n.uuid]=l;a[l]=n;c[k]=p;a[p]=h;h=0;for(k=e;h!==k;++h){n=d[h];var u=n[l];n[l]=n[p];n[p]=u}}}this.nCachedObjects_=b},uncache:function(){for(var a=this._objects,b=a.length,c=this.nCachedObjects_,d=this._indicesByUUID,e=this._bindings,f=e.length,g=0,h=arguments.length;g!==h;++g){var k= +arguments[g].uuid,l=d[k];if(void 0!==l)if(delete d[k],l<c){k=--c;var p=a[k],n=--b,u=a[n];d[p.uuid]=l;a[l]=p;d[u.uuid]=k;a[k]=u;a.pop();p=0;for(u=f;p!==u;++p){var q=e[p],r=q[n];q[l]=q[k];q[k]=r;q.pop()}}else for(n=--b,u=a[n],d[u.uuid]=l,a[l]=u,a.pop(),p=0,u=f;p!==u;++p)q=e[p],q[l]=q[n],q.pop()}this.nCachedObjects_=c},subscribe_:function(a,b){var c=this._bindingsIndicesByPath,d=c[a],e=this._bindings;if(void 0!==d)return e[d];var f=this._paths,g=this._parsedPaths,h=this._objects,k=this.nCachedObjects_, +l=Array(h.length);d=e.length;c[a]=d;f.push(a);g.push(b);e.push(l);c=k;for(d=h.length;c!==d;++c)l[c]=new fa(h[c],a,b);return l},unsubscribe_:function(a){var b=this._bindingsIndicesByPath,c=b[a];if(void 0!==c){var d=this._paths,e=this._parsedPaths,f=this._bindings,g=f.length-1,h=f[g];b[a[g]]=c;f[c]=h;f.pop();e[c]=e[g];e.pop();d[c]=d[g];d.pop()}}});Object.assign(lf.prototype,{play:function(){this._mixer._activateAction(this);return this},stop:function(){this._mixer._deactivateAction(this);return this.reset()}, +reset:function(){this.paused=!1;this.enabled=!0;this.time=0;this._loopCount=-1;this._startTime=null;return this.stopFading().stopWarping()},isRunning:function(){return this.enabled&&!this.paused&&0!==this.timeScale&&null===this._startTime&&this._mixer._isActiveAction(this)},isScheduled:function(){return this._mixer._isActiveAction(this)},startAt:function(a){this._startTime=a;return this},setLoop:function(a,b){this.loop=a;this.repetitions=b;return this},setEffectiveWeight:function(a){this.weight=a; +this._effectiveWeight=this.enabled?a:0;return this.stopFading()},getEffectiveWeight:function(){return this._effectiveWeight},fadeIn:function(a){return this._scheduleFading(a,0,1)},fadeOut:function(a){return this._scheduleFading(a,1,0)},crossFadeFrom:function(a,b,c){a.fadeOut(b);this.fadeIn(b);if(c){c=this._clip.duration;var d=a._clip.duration,e=c/d;a.warp(1,d/c,b);this.warp(e,1,b)}return this},crossFadeTo:function(a,b,c){return a.crossFadeFrom(this,b,c)},stopFading:function(){var a=this._weightInterpolant; +null!==a&&(this._weightInterpolant=null,this._mixer._takeBackControlInterpolant(a));return this},setEffectiveTimeScale:function(a){this.timeScale=a;this._effectiveTimeScale=this.paused?0:a;return this.stopWarping()},getEffectiveTimeScale:function(){return this._effectiveTimeScale},setDuration:function(a){this.timeScale=this._clip.duration/a;return this.stopWarping()},syncWith:function(a){this.time=a.time;this.timeScale=a.timeScale;return this.stopWarping()},halt:function(a){return this.warp(this._effectiveTimeScale, +0,a)},warp:function(a,b,c){var d=this._mixer,e=d.time,f=this._timeScaleInterpolant,g=this.timeScale;null===f&&(this._timeScaleInterpolant=f=d._lendControlInterpolant());d=f.parameterPositions;f=f.sampleValues;d[0]=e;d[1]=e+c;f[0]=a/g;f[1]=b/g;return this},stopWarping:function(){var a=this._timeScaleInterpolant;null!==a&&(this._timeScaleInterpolant=null,this._mixer._takeBackControlInterpolant(a));return this},getMixer:function(){return this._mixer},getClip:function(){return this._clip},getRoot:function(){return this._localRoot|| +this._mixer._root},_update:function(a,b,c,d){if(this.enabled){var e=this._startTime;if(null!==e){b=(a-e)*c;if(0>b||0===c)return;this._startTime=null;b*=c}b*=this._updateTimeScale(a);c=this._updateTime(b);a=this._updateWeight(a);if(0<a){b=this._interpolants;e=this._propertyBindings;for(var f=0,g=b.length;f!==g;++f)b[f].evaluate(c),e[f].accumulate(d,a)}}else this._updateWeight(a)},_updateWeight:function(a){var b=0;if(this.enabled){b=this.weight;var c=this._weightInterpolant;if(null!==c){var d=c.evaluate(a)[0]; +b*=d;a>c.parameterPositions[1]&&(this.stopFading(),0===d&&(this.enabled=!1))}}return this._effectiveWeight=b},_updateTimeScale:function(a){var b=0;if(!this.paused){b=this.timeScale;var c=this._timeScaleInterpolant;if(null!==c){var d=c.evaluate(a)[0];b*=d;a>c.parameterPositions[1]&&(this.stopWarping(),0===b?this.paused=!0:this.timeScale=b)}}return this._effectiveTimeScale=b},_updateTime:function(a){var b=this.time+a;if(0===a)return b;var c=this._clip.duration,d=this.loop,e=this._loopCount;if(2200=== +d)a:{if(-1===e&&(this._loopCount=0,this._setEndings(!0,!0,!1)),b>=c)b=c;else if(0>b)b=0;else break a;this.clampWhenFinished?this.paused=!0:this.enabled=!1;this._mixer.dispatchEvent({type:"finished",action:this,direction:0>a?-1:1})}else{d=2202===d;-1===e&&(0<=a?(e=0,this._setEndings(!0,0===this.repetitions,d)):this._setEndings(0===this.repetitions,!0,d));if(b>=c||0>b){var f=Math.floor(b/c);b-=c*f;e+=Math.abs(f);var g=this.repetitions-e;0>g?(this.clampWhenFinished?this.paused=!0:this.enabled=!1,b=0< +a?c:0,this._mixer.dispatchEvent({type:"finished",action:this,direction:0<a?1:-1})):(0===g?(a=0>a,this._setEndings(a,!a,d)):this._setEndings(!1,!1,d),this._loopCount=e,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:f}))}if(d&&1===(e&1))return this.time=b,c-b}return this.time=b},_setEndings:function(a,b,c){var d=this._interpolantSettings;c?(d.endingStart=2401,d.endingEnd=2401):(d.endingStart=a?this.zeroSlopeAtStart?2401:2400:2402,d.endingEnd=b?this.zeroSlopeAtEnd?2401:2400:2402)},_scheduleFading:function(a, +b,c){var d=this._mixer,e=d.time,f=this._weightInterpolant;null===f&&(this._weightInterpolant=f=d._lendControlInterpolant());d=f.parameterPositions;f=f.sampleValues;d[0]=e;f[0]=b;d[1]=e+a;f[1]=c;return this}});pe.prototype=Object.assign(Object.create(xa.prototype),{constructor:pe,_bindAction:function(a,b){var c=a._localRoot||this._root,d=a._clip.tracks,e=d.length,f=a._propertyBindings;a=a._interpolants;var g=c.uuid,h=this._bindingsByRootAndName,k=h[g];void 0===k&&(k={},h[g]=k);for(h=0;h!==e;++h){var l= +d[h],p=l.name,n=k[p];if(void 0===n){n=f[h];if(void 0!==n){null===n._cacheIndex&&(++n.referenceCount,this._addInactiveBinding(n,g,p));continue}n=new oe(fa.create(c,p,b&&b._propertyBindings[h].binding.parsedPath),l.ValueTypeName,l.getValueSize());++n.referenceCount;this._addInactiveBinding(n,g,p)}f[h]=n;a[h].resultBuffer=n.buffer}},_activateAction:function(a){if(!this._isActiveAction(a)){if(null===a._cacheIndex){var b=(a._localRoot||this._root).uuid,c=a._clip.uuid,d=this._actionsByClip[c];this._bindAction(a, +d&&d.knownActions[0]);this._addInactiveAction(a,c,b)}b=a._propertyBindings;c=0;for(d=b.length;c!==d;++c){var e=b[c];0===e.useCount++&&(this._lendBinding(e),e.saveOriginalState())}this._lendAction(a)}},_deactivateAction:function(a){if(this._isActiveAction(a)){for(var b=a._propertyBindings,c=0,d=b.length;c!==d;++c){var e=b[c];0===--e.useCount&&(e.restoreOriginalState(),this._takeBackBinding(e))}this._takeBackAction(a)}},_initMemoryManager:function(){this._actions=[];this._nActiveActions=0;this._actionsByClip= +{};this._bindings=[];this._nActiveBindings=0;this._bindingsByRootAndName={};this._controlInterpolants=[];this._nActiveControlInterpolants=0;var a=this;this.stats={actions:{get total(){return a._actions.length},get inUse(){return a._nActiveActions}},bindings:{get total(){return a._bindings.length},get inUse(){return a._nActiveBindings}},controlInterpolants:{get total(){return a._controlInterpolants.length},get inUse(){return a._nActiveControlInterpolants}}}},_isActiveAction:function(a){a=a._cacheIndex; +return null!==a&&a<this._nActiveActions},_addInactiveAction:function(a,b,c){var d=this._actions,e=this._actionsByClip,f=e[b];void 0===f?(f={knownActions:[a],actionByRoot:{}},a._byClipCacheIndex=0,e[b]=f):(b=f.knownActions,a._byClipCacheIndex=b.length,b.push(a));a._cacheIndex=d.length;d.push(a);f.actionByRoot[c]=a},_removeInactiveAction:function(a){var b=this._actions,c=b[b.length-1],d=a._cacheIndex;c._cacheIndex=d;b[d]=c;b.pop();a._cacheIndex=null;b=a._clip.uuid;c=this._actionsByClip;d=c[b];var e= +d.knownActions,f=e[e.length-1],g=a._byClipCacheIndex;f._byClipCacheIndex=g;e[g]=f;e.pop();a._byClipCacheIndex=null;delete d.actionByRoot[(a._localRoot||this._root).uuid];0===e.length&&delete c[b];this._removeInactiveBindingsForAction(a)},_removeInactiveBindingsForAction:function(a){a=a._propertyBindings;for(var b=0,c=a.length;b!==c;++b){var d=a[b];0===--d.referenceCount&&this._removeInactiveBinding(d)}},_lendAction:function(a){var b=this._actions,c=a._cacheIndex,d=this._nActiveActions++,e=b[d];a._cacheIndex= +d;b[d]=a;e._cacheIndex=c;b[c]=e},_takeBackAction:function(a){var b=this._actions,c=a._cacheIndex,d=--this._nActiveActions,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_addInactiveBinding:function(a,b,c){var d=this._bindingsByRootAndName,e=d[b],f=this._bindings;void 0===e&&(e={},d[b]=e);e[c]=a;a._cacheIndex=f.length;f.push(a)},_removeInactiveBinding:function(a){var b=this._bindings,c=a.binding,d=c.rootNode.uuid;c=c.path;var e=this._bindingsByRootAndName,f=e[d],g=b[b.length-1];a=a._cacheIndex; +g._cacheIndex=a;b[a]=g;b.pop();delete f[c];a:{for(var h in f)break a;delete e[d]}},_lendBinding:function(a){var b=this._bindings,c=a._cacheIndex,d=this._nActiveBindings++,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_takeBackBinding:function(a){var b=this._bindings,c=a._cacheIndex,d=--this._nActiveBindings,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_lendControlInterpolant:function(){var a=this._controlInterpolants,b=this._nActiveControlInterpolants++,c=a[b];void 0===c&&(c=new ad(new Float32Array(2), +new Float32Array(2),1,this._controlInterpolantsResultBuffer),c.__cacheIndex=b,a[b]=c);return c},_takeBackControlInterpolant:function(a){var b=this._controlInterpolants,c=a.__cacheIndex,d=--this._nActiveControlInterpolants,e=b[d];a.__cacheIndex=d;b[d]=a;e.__cacheIndex=c;b[c]=e},_controlInterpolantsResultBuffer:new Float32Array(1),clipAction:function(a,b){var c=b||this._root,d=c.uuid;c="string"===typeof a?wa.findByName(c,a):a;a=null!==c?c.uuid:a;var e=this._actionsByClip[a],f=null;if(void 0!==e){f= +e.actionByRoot[d];if(void 0!==f)return f;f=e.knownActions[0];null===c&&(c=f._clip)}if(null===c)return null;b=new lf(this,c,b);this._bindAction(b,f);this._addInactiveAction(b,a,d);return b},existingAction:function(a,b){var c=b||this._root;b=c.uuid;c="string"===typeof a?wa.findByName(c,a):a;a=this._actionsByClip[c?c.uuid:a];return void 0!==a?a.actionByRoot[b]||null:null},stopAllAction:function(){for(var a=this._actions,b=this._nActiveActions,c=this._bindings,d=this._nActiveBindings,e=this._nActiveBindings= +this._nActiveActions=0;e!==b;++e)a[e].reset();for(e=0;e!==d;++e)c[e].useCount=0;return this},update:function(a){a*=this.timeScale;for(var b=this._actions,c=this._nActiveActions,d=this.time+=a,e=Math.sign(a),f=this._accuIndex^=1,g=0;g!==c;++g)b[g]._update(d,a,e,f);a=this._bindings;b=this._nActiveBindings;for(g=0;g!==b;++g)a[g].apply(f);return this},getRoot:function(){return this._root},uncacheClip:function(a){var b=this._actions;a=a.uuid;var c=this._actionsByClip,d=c[a];if(void 0!==d){d=d.knownActions; +for(var e=0,f=d.length;e!==f;++e){var g=d[e];this._deactivateAction(g);var h=g._cacheIndex,k=b[b.length-1];g._cacheIndex=null;g._byClipCacheIndex=null;k._cacheIndex=h;b[h]=k;b.pop();this._removeInactiveBindingsForAction(g)}delete c[a]}},uncacheRoot:function(a){a=a.uuid;var b=this._actionsByClip;for(d in b){var c=b[d].actionByRoot[a];void 0!==c&&(this._deactivateAction(c),this._removeInactiveAction(c))}var d=this._bindingsByRootAndName[a];if(void 0!==d)for(var e in d)a=d[e],a.restoreOriginalState(), +this._removeInactiveBinding(a)},uncacheAction:function(a,b){a=this.existingAction(a,b);null!==a&&(this._deactivateAction(a),this._removeInactiveAction(a))}});Ld.prototype.clone=function(){return new Ld(void 0===this.value.clone?this.value:this.value.clone())};qe.prototype=Object.assign(Object.create(z.prototype),{constructor:qe,isInstancedBufferGeometry:!0,copy:function(a){z.prototype.copy.call(this,a);this.maxInstancedCount=a.maxInstancedCount;return this},clone:function(){return(new this.constructor).copy(this)}}); +Object.defineProperties(re.prototype,{count:{get:function(){return this.data.count}},array:{get:function(){return this.data.array}}});Object.assign(re.prototype,{isInterleavedBufferAttribute:!0,setX:function(a,b){this.data.array[a*this.data.stride+this.offset]=b;return this},setY:function(a,b){this.data.array[a*this.data.stride+this.offset+1]=b;return this},setZ:function(a,b){this.data.array[a*this.data.stride+this.offset+2]=b;return this},setW:function(a,b){this.data.array[a*this.data.stride+this.offset+ +3]=b;return this},getX:function(a){return this.data.array[a*this.data.stride+this.offset]},getY:function(a){return this.data.array[a*this.data.stride+this.offset+1]},getZ:function(a){return this.data.array[a*this.data.stride+this.offset+2]},getW:function(a){return this.data.array[a*this.data.stride+this.offset+3]},setXY:function(a,b,c){a=a*this.data.stride+this.offset;this.data.array[a+0]=b;this.data.array[a+1]=c;return this},setXYZ:function(a,b,c,d){a=a*this.data.stride+this.offset;this.data.array[a+ +0]=b;this.data.array[a+1]=c;this.data.array[a+2]=d;return this},setXYZW:function(a,b,c,d,e){a=a*this.data.stride+this.offset;this.data.array[a+0]=b;this.data.array[a+1]=c;this.data.array[a+2]=d;this.data.array[a+3]=e;return this}});Object.defineProperty(jc.prototype,"needsUpdate",{set:function(a){!0===a&&this.version++}});Object.assign(jc.prototype,{isInterleavedBuffer:!0,setArray:function(a){if(Array.isArray(a))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.count= +void 0!==a?a.length/this.stride:0;this.array=a},setDynamic:function(a){this.dynamic=a;return this},copy:function(a){this.array=new a.array.constructor(a.array);this.count=a.count;this.stride=a.stride;this.dynamic=a.dynamic;return this},copyAt:function(a,b,c){a*=this.stride;c*=b.stride;for(var d=0,e=this.stride;d<e;d++)this.array[a+d]=b.array[c+d];return this},set:function(a,b){void 0===b&&(b=0);this.array.set(a,b);return this},clone:function(){return(new this.constructor).copy(this)},onUpload:function(a){this.onUploadCallback= +a;return this}});se.prototype=Object.assign(Object.create(jc.prototype),{constructor:se,isInstancedInterleavedBuffer:!0,copy:function(a){jc.prototype.copy.call(this,a);this.meshPerAttribute=a.meshPerAttribute;return this}});te.prototype=Object.assign(Object.create(M.prototype),{constructor:te,isInstancedBufferAttribute:!0,copy:function(a){M.prototype.copy.call(this,a);this.meshPerAttribute=a.meshPerAttribute;return this}});Object.assign(mf.prototype,{linePrecision:1,set:function(a,b){this.ray.set(a, +b)},setFromCamera:function(a,b){b&&b.isPerspectiveCamera?(this.ray.origin.setFromMatrixPosition(b.matrixWorld),this.ray.direction.set(a.x,a.y,.5).unproject(b).sub(this.ray.origin).normalize()):b&&b.isOrthographicCamera?(this.ray.origin.set(a.x,a.y,(b.near+b.far)/(b.near-b.far)).unproject(b),this.ray.direction.set(0,0,-1).transformDirection(b.matrixWorld)):console.error("THREE.Raycaster: Unsupported camera type.")},intersectObject:function(a,b){var c=[];ue(a,this,c,b);c.sort(nf);return c},intersectObjects:function(a, +b){var c=[];if(!1===Array.isArray(a))return console.warn("THREE.Raycaster.intersectObjects: objects is not an Array."),c;for(var d=0,e=a.length;d<e;d++)ue(a[d],this,c,b);c.sort(nf);return c}});Object.assign(of.prototype,{start:function(){this.oldTime=this.startTime=("undefined"===typeof performance?Date:performance).now();this.elapsedTime=0;this.running=!0},stop:function(){this.getElapsedTime();this.autoStart=this.running=!1},getElapsedTime:function(){this.getDelta();return this.elapsedTime},getDelta:function(){var a= +0;if(this.autoStart&&!this.running)return this.start(),0;if(this.running){var b=("undefined"===typeof performance?Date:performance).now();a=(b-this.oldTime)/1E3;this.oldTime=b;this.elapsedTime+=a}return a}});Object.assign(pf.prototype,{set:function(a,b,c){this.radius=a;this.phi=b;this.theta=c;return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.radius=a.radius;this.phi=a.phi;this.theta=a.theta;return this},makeSafe:function(){this.phi=Math.max(1E-6,Math.min(Math.PI- +1E-6,this.phi));return this},setFromVector3:function(a){this.radius=a.length();0===this.radius?this.phi=this.theta=0:(this.theta=Math.atan2(a.x,a.z),this.phi=Math.acos(S.clamp(a.y/this.radius,-1,1)));return this}});Object.assign(qf.prototype,{set:function(a,b,c){this.radius=a;this.theta=b;this.y=c;return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.radius=a.radius;this.theta=a.theta;this.y=a.y;return this},setFromVector3:function(a){this.radius=Math.sqrt(a.x* +a.x+a.z*a.z);this.theta=Math.atan2(a.x,a.z);this.y=a.y;return this}});Object.assign(ve.prototype,{set:function(a,b){this.min.copy(a);this.max.copy(b);return this},setFromPoints:function(a){this.makeEmpty();for(var b=0,c=a.length;b<c;b++)this.expandByPoint(a[b]);return this},setFromCenterAndSize:function(){var a=new C;return function(b,c){c=a.copy(c).multiplyScalar(.5);this.min.copy(b).sub(c);this.max.copy(b).add(c);return this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.min.copy(a.min); +this.max.copy(a.max);return this},makeEmpty:function(){this.min.x=this.min.y=Infinity;this.max.x=this.max.y=-Infinity;return this},isEmpty:function(){return this.max.x<this.min.x||this.max.y<this.min.y},getCenter:function(a){a=a||new C;return this.isEmpty()?a.set(0,0):a.addVectors(this.min,this.max).multiplyScalar(.5)},getSize:function(a){a=a||new C;return this.isEmpty()?a.set(0,0):a.subVectors(this.max,this.min)},expandByPoint:function(a){this.min.min(a);this.max.max(a);return this},expandByVector:function(a){this.min.sub(a); +this.max.add(a);return this},expandByScalar:function(a){this.min.addScalar(-a);this.max.addScalar(a);return this},containsPoint:function(a){return a.x<this.min.x||a.x>this.max.x||a.y<this.min.y||a.y>this.max.y?!1:!0},containsBox:function(a){return this.min.x<=a.min.x&&a.max.x<=this.max.x&&this.min.y<=a.min.y&&a.max.y<=this.max.y},getParameter:function(a,b){return(b||new C).set((a.x-this.min.x)/(this.max.x-this.min.x),(a.y-this.min.y)/(this.max.y-this.min.y))},intersectsBox:function(a){return a.max.x< +this.min.x||a.min.x>this.max.x||a.max.y<this.min.y||a.min.y>this.max.y?!1:!0},clampPoint:function(a,b){return(b||new C).copy(a).clamp(this.min,this.max)},distanceToPoint:function(){var a=new C;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(),intersect:function(a){this.min.max(a.min);this.max.min(a.max);return this},union:function(a){this.min.min(a.min);this.max.max(a.max);return this},translate:function(a){this.min.add(a);this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&& +a.max.equals(this.max)}});cd.prototype=Object.create(y.prototype);cd.prototype.constructor=cd;cd.prototype.isImmediateRenderObject=!0;dd.prototype=Object.create(U.prototype);dd.prototype.constructor=dd;dd.prototype.update=function(){var a=new p,b=new p,c=new ta;return function(){var d=["a","b","c"];this.object.updateMatrixWorld(!0);c.getNormalMatrix(this.object.matrixWorld);var e=this.object.matrixWorld,f=this.geometry.attributes.position,g=this.object.geometry;if(g&&g.isGeometry)for(var h=g.vertices, +k=g.faces,l=g=0,p=k.length;l<p;l++)for(var n=k[l],u=0,q=n.vertexNormals.length;u<q;u++){var r=n.vertexNormals[u];a.copy(h[n[d[u]]]).applyMatrix4(e);b.copy(r).applyMatrix3(c).normalize().multiplyScalar(this.size).add(a);f.setXYZ(g,a.x,a.y,a.z);g+=1;f.setXYZ(g,b.x,b.y,b.z);g+=1}else if(g&&g.isBufferGeometry)for(d=g.attributes.position,h=g.attributes.normal,u=g=0,q=d.count;u<q;u++)a.set(d.getX(u),d.getY(u),d.getZ(u)).applyMatrix4(e),b.set(h.getX(u),h.getY(u),h.getZ(u)),b.applyMatrix3(c).normalize().multiplyScalar(this.size).add(a), +f.setXYZ(g,a.x,a.y,a.z),g+=1,f.setXYZ(g,b.x,b.y,b.z),g+=1;f.needsUpdate=!0}}();kc.prototype=Object.create(y.prototype);kc.prototype.constructor=kc;kc.prototype.dispose=function(){this.cone.geometry.dispose();this.cone.material.dispose()};kc.prototype.update=function(){var a=new p,b=new p;return function(){this.light.updateMatrixWorld();var c=this.light.distance?this.light.distance:1E3,d=c*Math.tan(this.light.angle);this.cone.scale.set(d,d,c);a.setFromMatrixPosition(this.light.matrixWorld);b.setFromMatrixPosition(this.light.target.matrixWorld); +this.cone.lookAt(b.sub(a));void 0!==this.color?this.cone.material.color.set(this.color):this.cone.material.color.copy(this.light.color)}}();lc.prototype=Object.create(U.prototype);lc.prototype.constructor=lc;lc.prototype.updateMatrixWorld=function(){var a=new p,b=new P,c=new P;return function(d){var e=this.bones,f=this.geometry,g=f.getAttribute("position");c.getInverse(this.root.matrixWorld);for(var h=0,k=0;h<e.length;h++){var l=e[h];l.parent&&l.parent.isBone&&(b.multiplyMatrices(c,l.matrixWorld), +a.setFromMatrixPosition(b),g.setXYZ(k,a.x,a.y,a.z),b.multiplyMatrices(c,l.parent.matrixWorld),a.setFromMatrixPosition(b),g.setXYZ(k+1,a.x,a.y,a.z),k+=2)}f.getAttribute("position").needsUpdate=!0;y.prototype.updateMatrixWorld.call(this,d)}}();mc.prototype=Object.create(ua.prototype);mc.prototype.constructor=mc;mc.prototype.dispose=function(){this.geometry.dispose();this.material.dispose()};mc.prototype.update=function(){void 0!==this.color?this.material.color.set(this.color):this.material.color.copy(this.light.color)}; +nc.prototype=Object.create(y.prototype);nc.prototype.constructor=nc;nc.prototype.dispose=function(){this.children[0].geometry.dispose();this.children[0].material.dispose()};nc.prototype.update=function(){var a=.5*this.light.width,b=.5*this.light.height,c=this.line.geometry.attributes.position,d=c.array;d[0]=a;d[1]=-b;d[2]=0;d[3]=a;d[4]=b;d[5]=0;d[6]=-a;d[7]=b;d[8]=0;d[9]=-a;d[10]=-b;d[11]=0;d[12]=a;d[13]=-b;d[14]=0;c.needsUpdate=!0;void 0!==this.color?this.line.material.color.set(this.color):this.line.material.color.copy(this.light.color)}; +oc.prototype=Object.create(y.prototype);oc.prototype.constructor=oc;oc.prototype.dispose=function(){this.children[0].geometry.dispose();this.children[0].material.dispose()};oc.prototype.update=function(){var a=new p,b=new H,c=new H;return function(){var d=this.children[0];if(void 0!==this.color)this.material.color.set(this.color);else{var e=d.geometry.getAttribute("color");b.copy(this.light.color);c.copy(this.light.groundColor);for(var f=0,g=e.count;f<g;f++){var h=f<g/2?b:c;e.setXYZ(f,h.r,h.g,h.b)}e.needsUpdate= +!0}d.lookAt(a.setFromMatrixPosition(this.light.matrixWorld).negate())}}();ed.prototype=Object.create(U.prototype);ed.prototype.constructor=ed;Md.prototype=Object.create(U.prototype);Md.prototype.constructor=Md;fd.prototype=Object.create(U.prototype);fd.prototype.constructor=fd;fd.prototype.update=function(){var a=new p,b=new p,c=new ta;return function(){this.object.updateMatrixWorld(!0);c.getNormalMatrix(this.object.matrixWorld);var d=this.object.matrixWorld,e=this.geometry.attributes.position,f= +this.object.geometry,g=f.vertices;f=f.faces;for(var h=0,k=0,l=f.length;k<l;k++){var p=f[k],n=p.normal;a.copy(g[p.a]).add(g[p.b]).add(g[p.c]).divideScalar(3).applyMatrix4(d);b.copy(n).applyMatrix3(c).normalize().multiplyScalar(this.size).add(a);e.setXYZ(h,a.x,a.y,a.z);h+=1;e.setXYZ(h,b.x,b.y,b.z);h+=1}e.needsUpdate=!0}}();pc.prototype=Object.create(y.prototype);pc.prototype.constructor=pc;pc.prototype.dispose=function(){this.lightPlane.geometry.dispose();this.lightPlane.material.dispose();this.targetLine.geometry.dispose(); +this.targetLine.material.dispose()};pc.prototype.update=function(){var a=new p,b=new p,c=new p;return function(){a.setFromMatrixPosition(this.light.matrixWorld);b.setFromMatrixPosition(this.light.target.matrixWorld);c.subVectors(b,a);this.lightPlane.lookAt(c);void 0!==this.color?(this.lightPlane.material.color.set(this.color),this.targetLine.material.color.set(this.color)):(this.lightPlane.material.color.copy(this.light.color),this.targetLine.material.color.copy(this.light.color));this.targetLine.lookAt(c); +this.targetLine.scale.z=c.length()}}();gd.prototype=Object.create(U.prototype);gd.prototype.constructor=gd;gd.prototype.update=function(){function a(a,g,h,k){d.set(g,h,k).unproject(e);a=c[a];if(void 0!==a)for(g=b.getAttribute("position"),h=0,k=a.length;h<k;h++)g.setXYZ(a[h],d.x,d.y,d.z)}var b,c,d=new p,e=new Qa;return function(){b=this.geometry;c=this.pointMap;e.projectionMatrix.copy(this.camera.projectionMatrix);a("c",0,0,-1);a("t",0,0,1);a("n1",-1,-1,-1);a("n2",1,-1,-1);a("n3",-1,1,-1);a("n4",1, +1,-1);a("f1",-1,-1,1);a("f2",1,-1,1);a("f3",-1,1,1);a("f4",1,1,1);a("u1",.7,1.1,-1);a("u2",-.7,1.1,-1);a("u3",0,2,-1);a("cf1",-1,0,1);a("cf2",1,0,1);a("cf3",0,-1,1);a("cf4",0,1,1);a("cn1",-1,0,-1);a("cn2",1,0,-1);a("cn3",0,-1,-1);a("cn4",0,1,-1);b.getAttribute("position").needsUpdate=!0}}();Db.prototype=Object.create(U.prototype);Db.prototype.constructor=Db;Db.prototype.update=function(){var a=new Va;return function(b){void 0!==b&&console.warn("THREE.BoxHelper: .update() has no longer arguments."); +void 0!==this.object&&a.setFromObject(this.object);if(!a.isEmpty()){b=a.min;var c=a.max,d=this.geometry.attributes.position,e=d.array;e[0]=c.x;e[1]=c.y;e[2]=c.z;e[3]=b.x;e[4]=c.y;e[5]=c.z;e[6]=b.x;e[7]=b.y;e[8]=c.z;e[9]=c.x;e[10]=b.y;e[11]=c.z;e[12]=c.x;e[13]=c.y;e[14]=b.z;e[15]=b.x;e[16]=c.y;e[17]=b.z;e[18]=b.x;e[19]=b.y;e[20]=b.z;e[21]=c.x;e[22]=b.y;e[23]=b.z;d.needsUpdate=!0;this.geometry.computeBoundingSphere()}}}();Db.prototype.setFromObject=function(a){this.object=a;this.update();return this}; +hd.prototype=Object.create(U.prototype);hd.prototype.constructor=hd;hd.prototype.updateMatrixWorld=function(a){var b=this.box;b.isEmpty()||(b.getCenter(this.position),b.getSize(this.scale),this.scale.multiplyScalar(.5),y.prototype.updateMatrixWorld.call(this,a))};id.prototype=Object.create(qa.prototype);id.prototype.constructor=id;id.prototype.updateMatrixWorld=function(a){var b=-this.plane.constant;1E-8>Math.abs(b)&&(b=1E-8);this.scale.set(.5*this.size,.5*this.size,b);this.lookAt(this.plane.normal); +y.prototype.updateMatrixWorld.call(this,a)};var Nd,we;Eb.prototype=Object.create(y.prototype);Eb.prototype.constructor=Eb;Eb.prototype.setDirection=function(){var a=new p,b;return function(c){.99999<c.y?this.quaternion.set(0,0,0,1):-.99999>c.y?this.quaternion.set(1,0,0,0):(a.set(c.z,0,-c.x).normalize(),b=Math.acos(c.y),this.quaternion.setFromAxisAngle(a,b))}}();Eb.prototype.setLength=function(a,b,c){void 0===b&&(b=.2*a);void 0===c&&(c=.2*b);this.line.scale.set(1,Math.max(0,a-b),1);this.line.updateMatrix(); +this.cone.scale.set(c,b,c);this.cone.position.y=a;this.cone.updateMatrix()};Eb.prototype.setColor=function(a){this.line.material.color.copy(a);this.cone.material.color.copy(a)};jd.prototype=Object.create(U.prototype);jd.prototype.constructor=jd;K.create=function(a,b){console.log("THREE.Curve.create() has been deprecated");a.prototype=Object.create(K.prototype);a.prototype.constructor=a;a.prototype.getPoint=b;return a};Object.assign($a.prototype,{createPointsGeometry:function(a){console.warn("THREE.CurvePath: .createPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead."); +a=this.getPoints(a);return this.createGeometry(a)},createSpacedPointsGeometry:function(a){console.warn("THREE.CurvePath: .createSpacedPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.");a=this.getSpacedPoints(a);return this.createGeometry(a)},createGeometry:function(a){console.warn("THREE.CurvePath: .createGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.");for(var b=new L,c=0,d=a.length;c<d;c++){var e=a[c];b.vertices.push(new p(e.x, +e.y,e.z||0))}return b}});Object.assign(Pa.prototype,{fromPoints:function(a){console.warn("THREE.Path: .fromPoints() has been renamed to .setFromPoints().");this.setFromPoints(a)}});sf.prototype=Object.create(da.prototype);tf.prototype=Object.create(da.prototype);xe.prototype=Object.create(da.prototype);Object.assign(xe.prototype,{initFromArray:function(){console.error("THREE.Spline: .initFromArray() has been removed.")},getControlPointsArray:function(){console.error("THREE.Spline: .getControlPointsArray() has been removed.")}, +reparametrizeByArcLength:function(){console.error("THREE.Spline: .reparametrizeByArcLength() has been removed.")}});ed.prototype.setColors=function(){console.error("THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.")};lc.prototype.update=function(){console.error("THREE.SkeletonHelper: update() no longer needs to be called.")};Object.assign(hc.prototype,{extractUrlBase:function(a){console.warn("THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead."); +return Be.extractUrlBase(a)}});Object.assign(ve.prototype,{center:function(a){console.warn("THREE.Box2: .center() has been renamed to .getCenter().");return this.getCenter(a)},empty:function(){console.warn("THREE.Box2: .empty() has been renamed to .isEmpty().");return this.isEmpty()},isIntersectionBox:function(a){console.warn("THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().");return this.intersectsBox(a)},size:function(a){console.warn("THREE.Box2: .size() has been renamed to .getSize()."); +return this.getSize(a)}});Object.assign(Va.prototype,{center:function(a){console.warn("THREE.Box3: .center() has been renamed to .getCenter().");return this.getCenter(a)},empty:function(){console.warn("THREE.Box3: .empty() has been renamed to .isEmpty().");return this.isEmpty()},isIntersectionBox:function(a){console.warn("THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().");return this.intersectsBox(a)},isIntersectionSphere:function(a){console.warn("THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere()."); +return this.intersectsSphere(a)},size:function(a){console.warn("THREE.Box3: .size() has been renamed to .getSize().");return this.getSize(a)}});Kb.prototype.center=function(a){console.warn("THREE.Line3: .center() has been renamed to .getCenter().");return this.getCenter(a)};Object.assign(S,{random16:function(){console.warn("THREE.Math: .random16() has been deprecated. Use Math.random() instead.");return Math.random()},nearestPowerOfTwo:function(a){console.warn("THREE.Math: .nearestPowerOfTwo() has been renamed to .floorPowerOfTwo()."); +return S.floorPowerOfTwo(a)},nextPowerOfTwo:function(a){console.warn("THREE.Math: .nextPowerOfTwo() has been renamed to .ceilPowerOfTwo().");return S.ceilPowerOfTwo(a)}});Object.assign(ta.prototype,{flattenToArrayOffset:function(a,b){console.warn("THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.");return this.toArray(a,b)},multiplyVector3:function(a){console.warn("THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.");return a.applyMatrix3(this)}, +multiplyVector3Array:function(){console.error("THREE.Matrix3: .multiplyVector3Array() has been removed.")},applyToBuffer:function(a){console.warn("THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.");return this.applyToBufferAttribute(a)},applyToVector3Array:function(){console.error("THREE.Matrix3: .applyToVector3Array() has been removed.")}});Object.assign(P.prototype,{extractPosition:function(a){console.warn("THREE.Matrix4: .extractPosition() has been renamed to .copyPosition()."); +return this.copyPosition(a)},flattenToArrayOffset:function(a,b){console.warn("THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.");return this.toArray(a,b)},getPosition:function(){var a;return function(){void 0===a&&(a=new p);console.warn("THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.");return a.setFromMatrixColumn(this,3)}}(),setRotationFromQuaternion:function(a){console.warn("THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion()."); +return this.makeRotationFromQuaternion(a)},multiplyToArray:function(){console.warn("THREE.Matrix4: .multiplyToArray() has been removed.")},multiplyVector3:function(a){console.warn("THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.");return a.applyMatrix4(this)},multiplyVector4:function(a){console.warn("THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.");return a.applyMatrix4(this)},multiplyVector3Array:function(){console.error("THREE.Matrix4: .multiplyVector3Array() has been removed.")}, +rotateAxis:function(a){console.warn("THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.");a.transformDirection(this)},crossVector:function(a){console.warn("THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.");return a.applyMatrix4(this)},translate:function(){console.error("THREE.Matrix4: .translate() has been removed.")},rotateX:function(){console.error("THREE.Matrix4: .rotateX() has been removed.")},rotateY:function(){console.error("THREE.Matrix4: .rotateY() has been removed.")}, +rotateZ:function(){console.error("THREE.Matrix4: .rotateZ() has been removed.")},rotateByAxis:function(){console.error("THREE.Matrix4: .rotateByAxis() has been removed.")},applyToBuffer:function(a){console.warn("THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.");return this.applyToBufferAttribute(a)},applyToVector3Array:function(){console.error("THREE.Matrix4: .applyToVector3Array() has been removed.")},makeFrustum:function(a,b,c,d,e,f){console.warn("THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead."); +return this.makePerspective(a,b,d,c,e,f)}});pa.prototype.isIntersectionLine=function(a){console.warn("THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().");return this.intersectsLine(a)};ca.prototype.multiplyVector3=function(a){console.warn("THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.");return a.applyQuaternion(this)};Object.assign(pb.prototype,{isIntersectionBox:function(a){console.warn("THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox()."); +return this.intersectsBox(a)},isIntersectionPlane:function(a){console.warn("THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().");return this.intersectsPlane(a)},isIntersectionSphere:function(a){console.warn("THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().");return this.intersectsSphere(a)}});Object.assign(ib.prototype,{extractAllPoints:function(a){console.warn("THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead.");return this.extractPoints(a)}, +extrude:function(a){console.warn("THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.");return new hb(this,a)},makeGeometry:function(a){console.warn("THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.");return new ub(this,a)}});Object.assign(C.prototype,{fromAttribute:function(a,b,c){console.warn("THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().");return this.fromBufferAttribute(a,b,c)},distanceToManhattan:function(a){console.warn("THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo()."); +return this.manhattanDistanceTo(a)},lengthManhattan:function(){console.warn("THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength().");return this.manhattanLength()}});Object.assign(p.prototype,{setEulerFromRotationMatrix:function(){console.error("THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.")},setEulerFromQuaternion:function(){console.error("THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.")}, +getPositionFromMatrix:function(a){console.warn("THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().");return this.setFromMatrixPosition(a)},getScaleFromMatrix:function(a){console.warn("THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().");return this.setFromMatrixScale(a)},getColumnFromMatrix:function(a,b){console.warn("THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().");return this.setFromMatrixColumn(b, +a)},applyProjection:function(a){console.warn("THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.");return this.applyMatrix4(a)},fromAttribute:function(a,b,c){console.warn("THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().");return this.fromBufferAttribute(a,b,c)},distanceToManhattan:function(a){console.warn("THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo().");return this.manhattanDistanceTo(a)},lengthManhattan:function(){console.warn("THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength()."); +return this.manhattanLength()}});Object.assign(X.prototype,{fromAttribute:function(a,b,c){console.warn("THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().");return this.fromBufferAttribute(a,b,c)},lengthManhattan:function(){console.warn("THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength().");return this.manhattanLength()}});Object.assign(L.prototype,{computeTangents:function(){console.error("THREE.Geometry: .computeTangents() has been removed.")},computeLineDistances:function(){console.error("THREE.Geometry: .computeLineDistances() has been removed. Use THREE.Line.computeLineDistances() instead.")}}); +Object.assign(y.prototype,{getChildByName:function(a){console.warn("THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().");return this.getObjectByName(a)},renderDepth:function(){console.warn("THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.")},translate:function(a,b){console.warn("THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.");return this.translateOnAxis(b,a)}});Object.defineProperties(y.prototype,{eulerOrder:{get:function(){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order."); +return this.rotation.order},set:function(a){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order.");this.rotation.order=a}},useQuaternion:{get:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")},set:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")}}});Object.defineProperties(Ac.prototype,{objects:{get:function(){console.warn("THREE.LOD: .objects has been renamed to .levels."); +return this.levels}}});Object.defineProperty(Bc.prototype,"useVertexTexture",{get:function(){console.warn("THREE.Skeleton: useVertexTexture has been removed.")},set:function(){console.warn("THREE.Skeleton: useVertexTexture has been removed.")}});Object.defineProperty(K.prototype,"__arcLengthDivisions",{get:function(){console.warn("THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.");return this.arcLengthDivisions},set:function(a){console.warn("THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions."); +this.arcLengthDivisions=a}});na.prototype.setLens=function(a,b){console.warn("THREE.PerspectiveCamera.setLens is deprecated. Use .setFocalLength and .filmGauge for a photographic setup.");void 0!==b&&(this.filmGauge=b);this.setFocalLength(a)};Object.defineProperties(ea.prototype,{onlyShadow:{set:function(){console.warn("THREE.Light: .onlyShadow has been removed.")}},shadowCameraFov:{set:function(a){console.warn("THREE.Light: .shadowCameraFov is now .shadow.camera.fov.");this.shadow.camera.fov=a}}, +shadowCameraLeft:{set:function(a){console.warn("THREE.Light: .shadowCameraLeft is now .shadow.camera.left.");this.shadow.camera.left=a}},shadowCameraRight:{set:function(a){console.warn("THREE.Light: .shadowCameraRight is now .shadow.camera.right.");this.shadow.camera.right=a}},shadowCameraTop:{set:function(a){console.warn("THREE.Light: .shadowCameraTop is now .shadow.camera.top.");this.shadow.camera.top=a}},shadowCameraBottom:{set:function(a){console.warn("THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom."); +this.shadow.camera.bottom=a}},shadowCameraNear:{set:function(a){console.warn("THREE.Light: .shadowCameraNear is now .shadow.camera.near.");this.shadow.camera.near=a}},shadowCameraFar:{set:function(a){console.warn("THREE.Light: .shadowCameraFar is now .shadow.camera.far.");this.shadow.camera.far=a}},shadowCameraVisible:{set:function(){console.warn("THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.")}},shadowBias:{set:function(a){console.warn("THREE.Light: .shadowBias is now .shadow.bias."); +this.shadow.bias=a}},shadowDarkness:{set:function(){console.warn("THREE.Light: .shadowDarkness has been removed.")}},shadowMapWidth:{set:function(a){console.warn("THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.");this.shadow.mapSize.width=a}},shadowMapHeight:{set:function(a){console.warn("THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.");this.shadow.mapSize.height=a}}});Object.defineProperties(M.prototype,{length:{get:function(){console.warn("THREE.BufferAttribute: .length has been deprecated. Use .count instead."); +return this.array.length}}});Object.assign(z.prototype,{addIndex:function(a){console.warn("THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().");this.setIndex(a)},addDrawCall:function(a,b,c){void 0!==c&&console.warn("THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.");console.warn("THREE.BufferGeometry: .addDrawCall() is now .addGroup().");this.addGroup(a,b)},clearDrawCalls:function(){console.warn("THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups()."); +this.clearGroups()},computeTangents:function(){console.warn("THREE.BufferGeometry: .computeTangents() has been removed.")},computeOffsets:function(){console.warn("THREE.BufferGeometry: .computeOffsets() has been removed.")}});Object.defineProperties(z.prototype,{drawcalls:{get:function(){console.error("THREE.BufferGeometry: .drawcalls has been renamed to .groups.");return this.groups}},offsets:{get:function(){console.warn("THREE.BufferGeometry: .offsets has been renamed to .groups.");return this.groups}}}); +Object.defineProperties(Ld.prototype,{dynamic:{set:function(){console.warn("THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.")}},onUpdate:{value:function(){console.warn("THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.");return this}}});Object.defineProperties(O.prototype,{wrapAround:{get:function(){console.warn("THREE.Material: .wrapAround has been removed.")},set:function(){console.warn("THREE.Material: .wrapAround has been removed.")}}, +wrapRGB:{get:function(){console.warn("THREE.Material: .wrapRGB has been removed.");return new H}},shading:{get:function(){console.error("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead.")},set:function(a){console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead.");this.flatShading=1===a}}});Object.defineProperties(Ja.prototype,{metal:{get:function(){console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead."); +return!1},set:function(){console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead")}}});Object.defineProperties(Da.prototype,{derivatives:{get:function(){console.warn("THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.");return this.extensions.derivatives},set:function(a){console.warn("THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.");this.extensions.derivatives=a}}});Object.assign(Xd.prototype, +{getCurrentRenderTarget:function(){console.warn("THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().");return this.getRenderTarget()},getMaxAnisotropy:function(){console.warn("THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy().");return this.capabilities.getMaxAnisotropy()},getPrecision:function(){console.warn("THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision.");return this.capabilities.precision},resetGLState:function(){console.warn("THREE.WebGLRenderer: .resetGLState() is now .state.reset()."); +return this.state.reset()},supportsFloatTextures:function(){console.warn("THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( 'OES_texture_float' ).");return this.extensions.get("OES_texture_float")},supportsHalfFloatTextures:function(){console.warn("THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( 'OES_texture_half_float' ).");return this.extensions.get("OES_texture_half_float")},supportsStandardDerivatives:function(){console.warn("THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( 'OES_standard_derivatives' )."); +return this.extensions.get("OES_standard_derivatives")},supportsCompressedTextureS3TC:function(){console.warn("THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( 'WEBGL_compressed_texture_s3tc' ).");return this.extensions.get("WEBGL_compressed_texture_s3tc")},supportsCompressedTexturePVRTC:function(){console.warn("THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( 'WEBGL_compressed_texture_pvrtc' ).");return this.extensions.get("WEBGL_compressed_texture_pvrtc")}, +supportsBlendMinMax:function(){console.warn("THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( 'EXT_blend_minmax' ).");return this.extensions.get("EXT_blend_minmax")},supportsVertexTextures:function(){console.warn("THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.");return this.capabilities.vertexTextures},supportsInstancedArrays:function(){console.warn("THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( 'ANGLE_instanced_arrays' )."); +return this.extensions.get("ANGLE_instanced_arrays")},enableScissorTest:function(a){console.warn("THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().");this.setScissorTest(a)},initMaterial:function(){console.warn("THREE.WebGLRenderer: .initMaterial() has been removed.")},addPrePlugin:function(){console.warn("THREE.WebGLRenderer: .addPrePlugin() has been removed.")},addPostPlugin:function(){console.warn("THREE.WebGLRenderer: .addPostPlugin() has been removed.")},updateShadowMap:function(){console.warn("THREE.WebGLRenderer: .updateShadowMap() has been removed.")}, +setFaceCulling:function(){console.warn("THREE.WebGLRenderer: .setFaceCulling() has been removed.")}});Object.defineProperties(Xd.prototype,{shadowMapEnabled:{get:function(){return this.shadowMap.enabled},set:function(a){console.warn("THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.");this.shadowMap.enabled=a}},shadowMapType:{get:function(){return this.shadowMap.type},set:function(a){console.warn("THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.");this.shadowMap.type=a}}, +shadowMapCullFace:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.")}}});Object.defineProperties(Oe.prototype,{cullFace:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.")}}, +renderReverseSided:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.")}},renderSingleSided:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.")}}}); +Object.defineProperties(jb.prototype,{wrapS:{get:function(){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.");return this.texture.wrapS},set:function(a){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.");this.texture.wrapS=a}},wrapT:{get:function(){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.");return this.texture.wrapT},set:function(a){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.");this.texture.wrapT=a}},magFilter:{get:function(){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter."); +return this.texture.magFilter},set:function(a){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.");this.texture.magFilter=a}},minFilter:{get:function(){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.");return this.texture.minFilter},set:function(a){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.");this.texture.minFilter=a}},anisotropy:{get:function(){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy."); +return this.texture.anisotropy},set:function(a){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.");this.texture.anisotropy=a}},offset:{get:function(){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset.");return this.texture.offset},set:function(a){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset.");this.texture.offset=a}},repeat:{get:function(){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat.");return this.texture.repeat}, +set:function(a){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat.");this.texture.repeat=a}},format:{get:function(){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format.");return this.texture.format},set:function(a){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format.");this.texture.format=a}},type:{get:function(){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type.");return this.texture.type},set:function(a){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type."); +this.texture.type=a}},generateMipmaps:{get:function(){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.");return this.texture.generateMipmaps},set:function(a){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.");this.texture.generateMipmaps=a}}});Object.defineProperties(Ve.prototype,{standing:{set:function(){console.warn("THREE.WebVRManager: .standing has been removed.")}}});ic.prototype.load=function(a){console.warn("THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead."); +var b=this;(new je).load(a,function(a){b.setBuffer(a)});return this};ne.prototype.getData=function(){console.warn("THREE.AudioAnalyser: .getData() is now .getFrequencyData().");return this.getFrequencyData()};bd.prototype.updateCubeMap=function(a,b){console.warn("THREE.CubeCamera: .updateCubeMap() is now .update().");return this.update(a,b)};l.WebGLRenderTargetCube=Gb;l.WebGLRenderTarget=jb;l.WebGLRenderer=Xd;l.ShaderLib=qb;l.UniformsLib=I;l.UniformsUtils=Ea;l.ShaderChunk=R;l.FogExp2=Mb;l.Fog=Nb; +l.Scene=pd;l.Sprite=zc;l.LOD=Ac;l.SkinnedMesh=rd;l.Skeleton=Bc;l.Bone=qd;l.Mesh=ua;l.LineSegments=U;l.LineLoop=sd;l.Line=qa;l.Points=Ob;l.Group=td;l.VideoTexture=Yd;l.DataTexture=kb;l.CompressedTexture=Pb;l.CubeTexture=bb;l.CanvasTexture=qc;l.DepthTexture=Cc;l.Texture=aa;l.CompressedTextureLoader=df;l.DataTextureLoader=be;l.CubeTextureLoader=ce;l.TextureLoader=vd;l.ObjectLoader=ff;l.MaterialLoader=Kd;l.BufferGeometryLoader=ee;l.DefaultLoadingManager=ra;l.LoadingManager=ae;l.JSONLoader=fe;l.ImageLoader= +Xc;l.ImageBitmapLoader=ge;l.FontLoader=gf;l.FileLoader=Ka;l.Loader=hc;l.LoaderUtils=Be;l.Cache=Fb;l.AudioLoader=je;l.SpotLightShadow=xd;l.SpotLight=yd;l.PointLight=zd;l.RectAreaLight=Dd;l.HemisphereLight=wd;l.DirectionalLightShadow=Ad;l.DirectionalLight=Bd;l.AmbientLight=Cd;l.LightShadow=Cb;l.Light=ea;l.StereoCamera=hf;l.PerspectiveCamera=na;l.OrthographicCamera=Ib;l.CubeCamera=bd;l.ArrayCamera=od;l.Camera=Qa;l.AudioListener=ke;l.PositionalAudio=me;l.AudioContext=le;l.AudioAnalyser=ne;l.Audio=ic; +l.VectorKeyframeTrack=gc;l.StringKeyframeTrack=Ed;l.QuaternionKeyframeTrack=$c;l.NumberKeyframeTrack=fc;l.ColorKeyframeTrack=Hd;l.BooleanKeyframeTrack=Fd;l.PropertyMixer=oe;l.PropertyBinding=fa;l.KeyframeTrack=la;l.AnimationUtils=W;l.AnimationObjectGroup=kf;l.AnimationMixer=pe;l.AnimationClip=wa;l.Uniform=Ld;l.InstancedBufferGeometry=qe;l.BufferGeometry=z;l.Geometry=L;l.InterleavedBufferAttribute=re;l.InstancedInterleavedBuffer=se;l.InterleavedBuffer=jc;l.InstancedBufferAttribute=te;l.Face3=Wa;l.Object3D= +y;l.Raycaster=mf;l.Layers=Sd;l.EventDispatcher=xa;l.Clock=of;l.QuaternionLinearInterpolant=Gd;l.LinearInterpolant=ad;l.DiscreteInterpolant=Jd;l.CubicInterpolant=Id;l.Interpolant=Ba;l.Triangle=Xa;l.Math=S;l.Spherical=pf;l.Cylindrical=qf;l.Plane=pa;l.Frustum=ld;l.Sphere=Ca;l.Ray=pb;l.Matrix4=P;l.Matrix3=ta;l.Box3=Va;l.Box2=ve;l.Line3=Kb;l.Euler=fb;l.Vector4=X;l.Vector3=p;l.Vector2=C;l.Quaternion=ca;l.Color=H;l.ImmediateRenderObject=cd;l.VertexNormalsHelper=dd;l.SpotLightHelper=kc;l.SkeletonHelper=lc; +l.PointLightHelper=mc;l.RectAreaLightHelper=nc;l.HemisphereLightHelper=oc;l.GridHelper=ed;l.PolarGridHelper=Md;l.FaceNormalsHelper=fd;l.DirectionalLightHelper=pc;l.CameraHelper=gd;l.BoxHelper=Db;l.Box3Helper=hd;l.PlaneHelper=id;l.ArrowHelper=Eb;l.AxesHelper=jd;l.Shape=ib;l.Path=Pa;l.ShapePath=he;l.Font=ie;l.CurvePath=$a;l.Curve=K;l.ShapeUtils=Ya;l.WebGLUtils=We;l.WireframeGeometry=Qb;l.ParametricGeometry=Dc;l.ParametricBufferGeometry=Rb;l.TetrahedronGeometry=Fc;l.TetrahedronBufferGeometry=Sb;l.OctahedronGeometry= +Gc;l.OctahedronBufferGeometry=rb;l.IcosahedronGeometry=Hc;l.IcosahedronBufferGeometry=Tb;l.DodecahedronGeometry=Ic;l.DodecahedronBufferGeometry=Ub;l.PolyhedronGeometry=Ec;l.PolyhedronBufferGeometry=va;l.TubeGeometry=Jc;l.TubeBufferGeometry=Vb;l.TorusKnotGeometry=Kc;l.TorusKnotBufferGeometry=Wb;l.TorusGeometry=Lc;l.TorusBufferGeometry=Xb;l.TextGeometry=Qc;l.TextBufferGeometry=Yb;l.SphereGeometry=Rc;l.SphereBufferGeometry=tb;l.RingGeometry=Sc;l.RingBufferGeometry=Zb;l.PlaneGeometry=xc;l.PlaneBufferGeometry= +ob;l.LatheGeometry=Tc;l.LatheBufferGeometry=$b;l.ShapeGeometry=ub;l.ShapeBufferGeometry=vb;l.ExtrudeGeometry=hb;l.ExtrudeBufferGeometry=Ia;l.EdgesGeometry=ac;l.ConeGeometry=Uc;l.ConeBufferGeometry=Vc;l.CylinderGeometry=wb;l.CylinderBufferGeometry=Za;l.CircleGeometry=Wc;l.CircleBufferGeometry=bc;l.BoxGeometry=Jb;l.BoxBufferGeometry=nb;l.ShadowMaterial=cc;l.SpriteMaterial=gb;l.RawShaderMaterial=dc;l.ShaderMaterial=Da;l.PointsMaterial=Ha;l.MeshPhysicalMaterial=xb;l.MeshStandardMaterial=Sa;l.MeshPhongMaterial= +Ja;l.MeshToonMaterial=yb;l.MeshNormalMaterial=zb;l.MeshLambertMaterial=Ab;l.MeshDepthMaterial=db;l.MeshDistanceMaterial=eb;l.MeshBasicMaterial=za;l.LineDashedMaterial=Bb;l.LineBasicMaterial=Y;l.Material=O;l.Float64BufferAttribute=wc;l.Float32BufferAttribute=D;l.Uint32BufferAttribute=mb;l.Int32BufferAttribute=vc;l.Uint16BufferAttribute=lb;l.Int16BufferAttribute=uc;l.Uint8ClampedBufferAttribute=tc;l.Uint8BufferAttribute=sc;l.Int8BufferAttribute=rc;l.BufferAttribute=M;l.ArcCurve=ec;l.CatmullRomCurve3= +da;l.CubicBezierCurve=La;l.CubicBezierCurve3=Ta;l.EllipseCurve=Aa;l.LineCurve=ka;l.LineCurve3=Ma;l.QuadraticBezierCurve=Na;l.QuadraticBezierCurve3=Ua;l.SplineCurve=Oa;l.REVISION="90";l.MOUSE={LEFT:0,MIDDLE:1,RIGHT:2};l.CullFaceNone=0;l.CullFaceBack=1;l.CullFaceFront=2;l.CullFaceFrontBack=3;l.FrontFaceDirectionCW=0;l.FrontFaceDirectionCCW=1;l.BasicShadowMap=0;l.PCFShadowMap=1;l.PCFSoftShadowMap=2;l.FrontSide=0;l.BackSide=1;l.DoubleSide=2;l.FlatShading=1;l.SmoothShading=2;l.NoColors=0;l.FaceColors= +1;l.VertexColors=2;l.NoBlending=0;l.NormalBlending=1;l.AdditiveBlending=2;l.SubtractiveBlending=3;l.MultiplyBlending=4;l.CustomBlending=5;l.AddEquation=100;l.SubtractEquation=101;l.ReverseSubtractEquation=102;l.MinEquation=103;l.MaxEquation=104;l.ZeroFactor=200;l.OneFactor=201;l.SrcColorFactor=202;l.OneMinusSrcColorFactor=203;l.SrcAlphaFactor=204;l.OneMinusSrcAlphaFactor=205;l.DstAlphaFactor=206;l.OneMinusDstAlphaFactor=207;l.DstColorFactor=208;l.OneMinusDstColorFactor=209;l.SrcAlphaSaturateFactor= +210;l.NeverDepth=0;l.AlwaysDepth=1;l.LessDepth=2;l.LessEqualDepth=3;l.EqualDepth=4;l.GreaterEqualDepth=5;l.GreaterDepth=6;l.NotEqualDepth=7;l.MultiplyOperation=0;l.MixOperation=1;l.AddOperation=2;l.NoToneMapping=0;l.LinearToneMapping=1;l.ReinhardToneMapping=2;l.Uncharted2ToneMapping=3;l.CineonToneMapping=4;l.UVMapping=300;l.CubeReflectionMapping=301;l.CubeRefractionMapping=302;l.EquirectangularReflectionMapping=303;l.EquirectangularRefractionMapping=304;l.SphericalReflectionMapping=305;l.CubeUVReflectionMapping= +306;l.CubeUVRefractionMapping=307;l.RepeatWrapping=1E3;l.ClampToEdgeWrapping=1001;l.MirroredRepeatWrapping=1002;l.NearestFilter=1003;l.NearestMipMapNearestFilter=1004;l.NearestMipMapLinearFilter=1005;l.LinearFilter=1006;l.LinearMipMapNearestFilter=1007;l.LinearMipMapLinearFilter=1008;l.UnsignedByteType=1009;l.ByteType=1010;l.ShortType=1011;l.UnsignedShortType=1012;l.IntType=1013;l.UnsignedIntType=1014;l.FloatType=1015;l.HalfFloatType=1016;l.UnsignedShort4444Type=1017;l.UnsignedShort5551Type=1018; +l.UnsignedShort565Type=1019;l.UnsignedInt248Type=1020;l.AlphaFormat=1021;l.RGBFormat=1022;l.RGBAFormat=1023;l.LuminanceFormat=1024;l.LuminanceAlphaFormat=1025;l.RGBEFormat=1023;l.DepthFormat=1026;l.DepthStencilFormat=1027;l.RGB_S3TC_DXT1_Format=33776;l.RGBA_S3TC_DXT1_Format=33777;l.RGBA_S3TC_DXT3_Format=33778;l.RGBA_S3TC_DXT5_Format=33779;l.RGB_PVRTC_4BPPV1_Format=35840;l.RGB_PVRTC_2BPPV1_Format=35841;l.RGBA_PVRTC_4BPPV1_Format=35842;l.RGBA_PVRTC_2BPPV1_Format=35843;l.RGB_ETC1_Format=36196;l.RGBA_ASTC_4x4_Format= +37808;l.RGBA_ASTC_5x4_Format=37809;l.RGBA_ASTC_5x5_Format=37810;l.RGBA_ASTC_6x5_Format=37811;l.RGBA_ASTC_6x6_Format=37812;l.RGBA_ASTC_8x5_Format=37813;l.RGBA_ASTC_8x6_Format=37814;l.RGBA_ASTC_8x8_Format=37815;l.RGBA_ASTC_10x5_Format=37816;l.RGBA_ASTC_10x6_Format=37817;l.RGBA_ASTC_10x8_Format=37818;l.RGBA_ASTC_10x10_Format=37819;l.RGBA_ASTC_12x10_Format=37820;l.RGBA_ASTC_12x12_Format=37821;l.LoopOnce=2200;l.LoopRepeat=2201;l.LoopPingPong=2202;l.InterpolateDiscrete=2300;l.InterpolateLinear=2301;l.InterpolateSmooth= +2302;l.ZeroCurvatureEnding=2400;l.ZeroSlopeEnding=2401;l.WrapAroundEnding=2402;l.TrianglesDrawMode=0;l.TriangleStripDrawMode=1;l.TriangleFanDrawMode=2;l.LinearEncoding=3E3;l.sRGBEncoding=3001;l.GammaEncoding=3007;l.RGBEEncoding=3002;l.LogLuvEncoding=3003;l.RGBM7Encoding=3004;l.RGBM16Encoding=3005;l.RGBDEncoding=3006;l.BasicDepthPacking=3200;l.RGBADepthPacking=3201;l.CubeGeometry=Jb;l.Face4=function(a,b,c,d,e,f,g){console.warn("THREE.Face4 has been removed. A THREE.Face3 will be created instead."); +return new Wa(a,b,c,e,f,g)};l.LineStrip=0;l.LinePieces=1;l.MeshFaceMaterial=function(a){console.warn("THREE.MeshFaceMaterial has been removed. Use an Array instead.");return a};l.MultiMaterial=function(a){void 0===a&&(a=[]);console.warn("THREE.MultiMaterial has been removed. Use an Array instead.");a.isMultiMaterial=!0;a.materials=a;a.clone=function(){return a.slice()};return a};l.PointCloud=function(a,b){console.warn("THREE.PointCloud has been renamed to THREE.Points.");return new Ob(a,b)};l.Particle= +function(a){console.warn("THREE.Particle has been renamed to THREE.Sprite.");return new zc(a)};l.ParticleSystem=function(a,b){console.warn("THREE.ParticleSystem has been renamed to THREE.Points.");return new Ob(a,b)};l.PointCloudMaterial=function(a){console.warn("THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.");return new Ha(a)};l.ParticleBasicMaterial=function(a){console.warn("THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.");return new Ha(a)};l.ParticleSystemMaterial= +function(a){console.warn("THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.");return new Ha(a)};l.Vertex=function(a,b,c){console.warn("THREE.Vertex has been removed. Use THREE.Vector3 instead.");return new p(a,b,c)};l.DynamicBufferAttribute=function(a,b){console.warn("THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.");return(new M(a,b)).setDynamic(!0)};l.Int8Attribute=function(a,b){console.warn("THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead."); +return new rc(a,b)};l.Uint8Attribute=function(a,b){console.warn("THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.");return new sc(a,b)};l.Uint8ClampedAttribute=function(a,b){console.warn("THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.");return new tc(a,b)};l.Int16Attribute=function(a,b){console.warn("THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.");return new uc(a,b)};l.Uint16Attribute= +function(a,b){console.warn("THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.");return new lb(a,b)};l.Int32Attribute=function(a,b){console.warn("THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.");return new vc(a,b)};l.Uint32Attribute=function(a,b){console.warn("THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.");return new mb(a,b)};l.Float32Attribute=function(a,b){console.warn("THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead."); +return new D(a,b)};l.Float64Attribute=function(a,b){console.warn("THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.");return new wc(a,b)};l.ClosedSplineCurve3=sf;l.SplineCurve3=tf;l.Spline=xe;l.AxisHelper=function(a){console.warn("THREE.AxisHelper has been renamed to THREE.AxesHelper.");return new jd(a)};l.BoundingBoxHelper=function(a,b){console.warn("THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.");return new Db(a,b)};l.EdgesHelper= +function(a,b){console.warn("THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.");return new U(new ac(a.geometry),new Y({color:void 0!==b?b:16777215}))};l.WireframeHelper=function(a,b){console.warn("THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.");return new U(new Qb(a.geometry),new Y({color:void 0!==b?b:16777215}))};l.XHRLoader=function(a){console.warn("THREE.XHRLoader has been renamed to THREE.FileLoader.");return new Ka(a)};l.BinaryTextureLoader=function(a){console.warn("THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader."); +return new be(a)};l.GeometryUtils={merge:function(a,b,c){console.warn("THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.");if(b.isMesh){b.matrixAutoUpdate&&b.updateMatrix();var d=b.matrix;b=b.geometry}a.merge(b,d,c)},center:function(a){console.warn("THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.");return a.center()}};l.ImageUtils={crossOrigin:void 0,loadTexture:function(a,b,c,d){console.warn("THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead."); +var e=new vd;e.setCrossOrigin(this.crossOrigin);a=e.load(a,c,void 0,d);b&&(a.mapping=b);return a},loadTextureCube:function(a,b,c,d){console.warn("THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.");var e=new ce;e.setCrossOrigin(this.crossOrigin);a=e.load(a,c,void 0,d);b&&(a.mapping=b);return a},loadCompressedTexture:function(){console.error("THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.")},loadCompressedTextureCube:function(){console.error("THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.")}}; +l.Projector=function(){console.error("THREE.Projector has been moved to /examples/js/renderers/Projector.js.");this.projectVector=function(a,b){console.warn("THREE.Projector: .projectVector() is now vector.project().");a.project(b)};this.unprojectVector=function(a,b){console.warn("THREE.Projector: .unprojectVector() is now vector.unproject().");a.unproject(b)};this.pickingRay=function(){console.error("THREE.Projector: .pickingRay() is now raycaster.setFromCamera().")}};l.CanvasRenderer=function(){console.error("THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js"); +this.domElement=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");this.clear=function(){};this.render=function(){};this.setClearColor=function(){};this.setSize=function(){}};l.SceneUtils={createMultiMaterialObject:function(){console.error("THREE.SceneUtils has been moved to /examples/js/utils/SceneUtils.js")},detach:function(){console.error("THREE.SceneUtils has been moved to /examples/js/utils/SceneUtils.js")},attach:function(){console.error("THREE.SceneUtils has been moved to /examples/js/utils/SceneUtils.js")}}; +l.LensFlare=function(){console.error("THREE.LensFlare has been moved to /examples/js/objects/Lensflare.js")};Object.defineProperty(l,"__esModule",{value:!0})});