diff --git a/build/mathbox-bundle.js b/build/mathbox-bundle.js index 1dcc8b60..391404ef 100644 --- a/build/mathbox-bundle.js +++ b/build/mathbox-bundle.js @@ -46205,9 +46205,9 @@ const formatPrimes = [ ]; const prettyNumber = function (options) { - let cache, compact, e, pi, precision, tau, threshold; + let cache, compact, e, pi, tau; if (options) { - ({ cache, compact, tau, pi, e, threshold, precision } = options); + ({ cache, compact, tau, pi, e } = options); } compact = +!!(compact != null ? compact : true); @@ -46454,7 +46454,8 @@ const prettyFormat = function (str) { str = escapeHTML(str); - for (let arg of Array.from(args)) { + // eslint-disable-next-line no-unused-vars + for (let _arg of Array.from(args)) { str = str.replace(/%([a-z])/, function (_, f) { const v = args.shift(); switch (f) { @@ -68062,7 +68063,7 @@ class TextAtlas extends Atlas { } draw(text) { - let data, i, imageData, j; + let data, i, j; let w = this.width; const h = this.lineHeight; const o = this.outline; @@ -68086,7 +68087,7 @@ class TextAtlas extends Atlas { // Alpha sprite (fast) let asc, end; ctx.fillText(text, x, y); - ({ data } = imageData = ctx.getImageData(0, 0, w, h)); + ({ data } = ctx.getImageData(0, 0, w, h)); j = 3; // Skip to alpha channel for ( i = 0, end = data.length / 4, asc = 0 <= end; @@ -68124,7 +68125,7 @@ class TextAtlas extends Atlas { ctx.fillText(text, x, y); // Pull image data - ({ data } = imageData = ctx.getImageData(0, 0, w, h)); + ({ data } = ctx.getImageData(0, 0, w, h)); j = 0; const { gamma } = this; @@ -72880,7 +72881,7 @@ class Animation { invalid = true; return null; }); - if (value !== undefined) { + if (value !== undefined && !invalid) { target = value; } @@ -73655,7 +73656,7 @@ Context.initClass(); -const version = "2.0.0"; +const version = "2.1.0"; // Just because const π = Math.PI; diff --git a/build/mathbox-bundle.js.map b/build/mathbox-bundle.js.map index 24705a4c..3c3c15af 100644 --- a/build/mathbox-bundle.js.map +++ b/build/mathbox-bundle.js.map @@ -1 +1 @@ -{"version":3,"file":"mathbox-bundle.js","mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,O;;;;;;ACVA,kBAAkB,2CAA2C,0BAA0B,0BAA0B,2BAA2B,8BAA8B,0BAA0B,2BAA2B,6BAA6B,uBAAuB,wBAAwB,8DAA8D,4GAA4G,mCAAmC,mDAAmD,kDAAkD,GAAG,4DAA4D,+BAA+B,0BAA0B,8DAA8D,4CAA4C,KAAK,mCAAmC,2BAA2B,mBAAmB,qJAAqJ,KAAK,uEAAuE,2DAA2D,yBAAyB,sLAAsL,yBAAyB,kCAAkC,wDAAwD,2CAA2C,+BAA+B,8DAA8D,iLAAiL,GAAG,6BAA6B,4BAA4B,8CAA8C,oEAAoE,qDAAqD,+CAA+C,KAAK;AACnkE,wCAAwC,4BAA4B,sDAAsD,4CAA4C,GAAG;AACzK,+CAA+C,+DAA+D,gDAAgD,GAAG;AACjK,gDAAgD,2BAA2B,yBAAyB,0BAA0B,gEAAgE,+CAA+C,GAAG;AAChP,2CAA2C,kCAAkC,8CAA8C,GAAG;AAC9H,+CAA+C,gCAAgC,GAAG;AAClF,4CAA4C,2BAA2B,8DAA8D,4BAA4B,0CAA0C,+BAA+B,GAAG;AAC7O,kDAAkD,8DAA8D,yBAAyB,sBAAsB,yBAAyB,oEAAoE,iBAAiB,kDAAkD,gDAAgD,gDAAgD,mCAAmC,4CAA4C,GAAG,kCAAkC,wBAAwB,iDAAiD,uBAAuB,uEAAuE,wBAAwB,oBAAoB,GAAG;AACzuB,oSAAoS,wBAAwB,iCAAiC,GAAG,2CAA2C,uCAAuC,GAAG,2CAA2C,0CAA0C,GAAG,0DAA0D,8BAA8B,sBAAsB,yDAAyD,GAAG,mCAAmC,6CAA6C,6CAA6C,oBAAoB,uCAAuC,8CAA8C,iEAAiE,qCAAqC,wDAAwD,wDAAwD,4DAA4D,6DAA6D,sGAAsG,mFAAmF,6CAA6C,GAAG;AACr9C,+CAA+C,8BAA8B,2BAA2B,oCAAoC,iCAAiC,gCAAgC,qDAAqD,sCAAsC,gCAAgC,gCAAgC,GAAG;AAC3W,4CAA4C,uDAAuD,kCAAkC,yDAAyD,qDAAqD,GAAG;AACtP,wDAAwD,iCAAiC,gCAAgC,+BAA+B,oCAAoC,+BAA+B,iDAAiD,mBAAmB,cAAc,+BAA+B,KAAK,UAAU,gCAAgC,KAAK,qFAAqF,kCAAkC,cAAc,KAAK,GAAG;AAC7gB,wDAAwD,iCAAiC,gCAAgC,+BAA+B,oCAAoC,+BAA+B,iDAAiD,mBAAmB,cAAc,+BAA+B,KAAK,UAAU,gCAAgC,KAAK,qFAAqF,iCAAiC,cAAc,KAAK,GAAG;AAC5gB,8CAA8C,6BAA6B,wDAAwD,GAAG;AACtI,yDAAyD,kCAAkC,uCAAuC,GAAG;AACrI,sDAAsD,yBAAyB,GAAG;AAClF,+DAA+D,gBAAgB,GAAG;AAClF,sDAAsD,+BAA+B,yBAAyB,GAAG;AACjH,4DAA4D,gCAAgC,yBAAyB,GAAG;AACxH,4CAA4C,wBAAwB,wBAAwB,6BAA6B,qCAAqC,8DAA8D,oDAAoD,4BAA4B,GAAG;AAC/S,0CAA0C,yBAAyB,2BAA2B,8BAA8B,mCAAmC,+CAA+C,sCAAsC,oCAAoC,8CAA8C,GAAG;AACzU,2CAA2C,8BAA8B,8BAA8B,0BAA0B,uCAAuC,iCAAiC,+BAA+B,gCAAgC,gCAAgC,iCAAiC,6EAA6E,GAAG;AACzZ,yCAAyC,sDAAsD,oDAAoD,oDAAoD,qCAAqC,0BAA0B,8BAA8B,GAAG;AACvS,gDAAgD,mBAAmB,GAAG;AACtE,8CAA8C,4BAA4B,6BAA6B,6BAA6B,0CAA0C,wDAAwD,uCAAuC,2BAA2B,gDAAgD,qCAAqC,kDAAkD,2BAA2B,cAAc,KAAK,6BAA6B,4BAA4B,6EAA6E,KAAK,8CAA8C,GAAG;AACzpB,2CAA2C,yBAAyB,wDAAwD,6CAA6C,GAAG;AAC5K,uDAAuD,+BAA+B,qBAAqB,uBAAuB,oBAAoB,gDAAgD,gDAAgD,mCAAmC,+BAA+B,0BAA0B,GAAG;AACrV,wDAAwD,gCAAgC,qBAAqB,uBAAuB,oBAAoB,gDAAgD,gDAAgD,mCAAmC,+BAA+B,0BAA0B,GAAG;AACvV,uDAAuD,+BAA+B,qBAAqB,uBAAuB,oBAAoB,yCAAyC,yCAAyC,mCAAmC,+BAA+B,0BAA0B,GAAG;AACvU,uDAAuD,+BAA+B,qBAAqB,uBAAuB,oBAAoB,yCAAyC,yCAAyC,mCAAmC,+BAA+B,0BAA0B,GAAG;AACvU,oEAAoE,0BAA0B,0BAA0B,2BAA2B,qDAAqD,2BAA2B,qEAAqE,sFAAsF,iCAAiC,kIAAkI,+BAA+B,iHAAiH,iCAAiC,gCAAgC,+BAA+B,oCAAoC,sEAAsE,yFAAyF,0BAA0B,0BAA0B,yBAAyB,2BAA2B,qDAAqD,0EAA0E,yCAAyC,4EAA4E,yCAAyC,mDAAmD,uCAAuC,mGAAmG,4BAA4B,8BAA8B,uDAAuD,4BAA4B,uCAAuC,8CAA8C,OAAO,yEAAyE,yJAAyJ,8CAA8C,4CAA4C,0DAA0D,qCAAqC,uCAAuC,KAAK,8BAA8B,yDAAyD,4BAA4B,yCAAyC,8CAA8C,OAAO,yEAAyE,yJAAyJ,8CAA8C,4CAA4C,+DAA+D,uCAAuC,uCAAuC,KAAK,OAAO,kGAAkG,wEAAwE,0BAA0B,yBAAyB,6DAA6D,sCAAsC,OAAO,+BAA+B,8DAA8D,uCAAuC,OAAO,KAAK,0BAA0B,2BAA2B,2DAA2D,oCAAoC,OAAO,KAAK,2BAA2B,2BAA2B,6DAA6D,sCAAsC,OAAO,KAAK,GAAG,oJAAoJ,0CAA0C,sDAAsD,qEAAqE,qEAAqE,GAAG,gMAAgM,+BAA+B,qCAAqC,uCAAuC,yCAAyC,oBAAoB,kBAAkB,kCAAkC,uCAAuC,+BAA+B,+BAA+B,0BAA0B,0CAA0C,kCAAkC,oCAAoC,sDAAsD,kGAAkG,0BAA0B,OAAO,0CAA0C,kCAAkC,oCAAoC,sDAAsD,mGAAmG,0BAA0B,OAAO,YAAY,mGAAmG,wIAAwI,+BAA+B,mCAAmC,2CAA2C,+DAA+D,iFAAiF,kCAAkC,mEAAmE,oCAAoC,8HAA8H,sEAAsE,sEAAsE,kDAAkD,mCAAmC,+DAA+D,+FAA+F,iDAAiD,oBAAoB,oCAAoC,oCAAoC,SAAS,cAAc,oCAAoC,oCAAoC,SAAS,8FAA8F,sHAAsH,uCAAuC,iCAAiC,kFAAkF,2HAA2H,kCAAkC,2IAA2I,0CAA0C,yJAAyJ,2HAA2H,SAAS,iBAAiB,6BAA6B,KAAK,UAAU,uBAAuB,KAAK,KAAK,8DAA8D,mCAAmC,kDAAkD,wCAAwC,4DAA4D,mDAAmD,6FAA6F,4GAA4G,2BAA2B,oCAAoC,2BAA2B,4EAA4E,+BAA+B,0BAA0B,+DAA+D,4CAA4C,KAAK,mBAAmB,sDAAsD,yGAAyG,8CAA8C,mDAAmD,yDAAyD,yBAAyB,GAAG;AAC9sR,4CAA4C,2BAA2B,6BAA6B,+CAA+C,GAAG;AACtJ,iDAAiD,2BAA2B,6BAA6B,sDAAsD,GAAG;AAClK,uEAAuE,iBAAiB,gBAAgB,GAAG;AAC3G,8CAA8C,4BAA4B,GAAG;AAC7E,gDAAgD,8BAA8B,oCAAoC,yBAAyB,qBAAqB,qBAAqB,qBAAqB,2EAA2E,GAAG;AACxR,4CAA4C,qBAAqB,kBAAkB,GAAG;AACtF,+DAA+D,8CAA8C,+CAA+C,iDAAiD,mDAAmD,iDAAiD,wBAAwB,8CAA8C,mCAAmC,yEAAyE,oEAAoE,iEAAiE,8DAA8D,6CAA6C,GAAG;AACttB,2CAA2C,yBAAyB,2BAA2B,mCAAmC,GAAG,sBAAsB,8BAA8B,wCAAwC,GAAG;AACpO,oEAAoE,8CAA8C,+CAA+C,iDAAiD,mDAAmD,iDAAiD,sCAAsC,0BAA0B,uCAAuC,kDAAkD,qDAAqD,mDAAmD,qDAAqD,6CAA6C,GAAG;AAC5pB,8CAA8C,sBAAsB,yBAAyB,kCAAkC,yBAAyB,uBAAuB,GAAG,oCAAoC,8BAA8B,wCAAwC,uCAAuC,mCAAmC,yCAAyC,oDAAoD,8CAA8C,gEAAgE,sDAAsD,+DAA+D,2CAA2C,oFAAoF,GAAG;AACxyB;AACA,mDAAmD,6CAA6C,GAAG;AACnG,qDAAqD,wCAAwC,GAAG;AAChG,sDAAsD,gBAAgB,GAAG;AACzE,4CAA4C,2BAA2B,8DAA8D,4BAA4B,0CAA0C,+BAA+B,GAAG;AAC7O,+CAA+C,4BAA4B,sBAAsB,2CAA2C,wBAAwB,0CAA0C,0BAA0B,GAAG;AAC3O,8CAA8C,kCAAkC,4BAA4B,sBAAsB,4CAA4C,sBAAsB,0CAA0C,8CAA8C,GAAG;AAC/R,yDAAyD,6CAA6C,8CAA8C,+CAA+C,iDAAiD,mDAAmD,uFAAuF,sDAAsD,qDAAqD,kDAAkD,mDAAmD,gDAAgD,wDAAwD,2DAA2D,8DAA8D,4DAA4D,iBAAiB,yBAAyB,GAAG;AACx5B,gDAAgD,+BAA+B,gCAAgC,+BAA+B,+BAA+B,iCAAiC,2BAA2B,uBAAuB,yBAAyB,2BAA2B,+BAA+B,GAAG,4DAA4D,4CAA4C,sCAAsC,mCAAmC,mCAAmC,oCAAoC,mCAAmC,iCAAiC,wDAAwD,+CAA+C,oDAAoD,gDAAgD,GAAG;AACh2B,iDAAiD,qBAAqB,GAAG;AACzE,gDAAgD,oCAAoC,oHAAoH,qDAAqD,GAAG;AAChQ,uDAAuD,0CAA0C,4DAA4D,GAAG;AAChK,iDAAiD,uCAAuC,2CAA2C,GAAG;AACtI,wDAAwD,6CAA6C,sDAAsD,GAAG;AAC9J,oCAAoC,iCAAiC,mCAAmC,2CAA2C,wCAAwC,qBAAqB,cAAc,KAAK,uCAAuC,uBAAuB,cAAc,KAAK,oDAAoD,GAAG;AAC3W,oCAAoC,iCAAiC,mCAAmC,2CAA2C,wCAAwC,qBAAqB,cAAc,KAAK,uCAAuC,sBAAsB,cAAc,KAAK,yBAAyB,GAAG;AAC/U,+CAA+C,kCAAkC,uBAAuB,GAAG;AAC3G,gDAAgD,mCAAmC,qBAAqB,qBAAqB,GAAG;AAChI,6CAA6C,wCAAwC,gBAAgB,wDAAwD,GAAG;AAChK,6CAA6C,wCAAwC,gBAAgB,wDAAwD,GAAG;AAChK,8CAA8C,yCAAyC,gBAAgB,yDAAyD,GAAG;AACnK,+CAA+C,kCAAkC,qBAAqB,yBAAyB,GAAG;AAClI,2CAA2C,sCAAsC,gBAAgB,yDAAyD,GAAG;AAC7J,4CAA4C,4BAA4B,4BAA4B,+BAA+B,2BAA2B,8BAA8B,2BAA2B,wBAAwB,yBAAyB,2BAA2B,+CAA+C,+CAA+C,+CAA+C,6BAA6B,0CAA0C,sCAAsC,+GAA+G,iDAAiD,oHAAoH,yDAAyD,mCAAmC,kMAAkM,uCAAuC,6CAA6C,8BAA8B,wBAAwB,iFAAiF,GAAG;AAC7yC,+CAA+C,mCAAmC,qBAAqB,GAAG;AAC1G,+CAA+C,8BAA8B,mCAAmC,yCAAyC,GAAG;AAC5J,2CAA2C,2BAA2B,4BAA4B,2BAA2B,4BAA4B,2DAA2D,0BAA0B,gCAAgC,iMAAiM,kCAAkC,uQAAuQ,OAAO,YAAY,6DAA6D,yCAAyC,0MAA0M,OAAO,KAAK,UAAU,kDAAkD,KAAK,GAAG;AAC3oC,8CAA8C,4BAA4B,qCAAqC,sDAAsD,6EAA6E,kBAAkB,wEAAwE,8BAA8B,8DAA8D,KAAK,0BAA0B,GAAG;AAC1c,wHAAwH,qDAAqD,sDAAsD,iCAAiC,yBAAyB,uCAAuC,KAAK,UAAU,sCAAsC,KAAK,GAAG;AACjY,kDAAkD,2BAA2B,gCAAgC,qCAAqC,GAAG;AACrJ,+CAA+C,mCAAmC,8CAA8C,GAAG;AACnI,+CAA+C,qCAAqC,+BAA+B,GAAG;AACtH,kDAAkD,sCAAsC,iCAAiC,GAAG;AAC5H,8CAA8C,+BAA+B,gCAAgC,+BAA+B,+BAA+B,iCAAiC,2CAA2C,2CAA2C,sCAAsC,mCAAmC,mCAAmC,oCAAoC,mCAAmC,iCAAiC,wDAAwD,yEAAyE,iCAAiC,iCAAiC,yBAAyB,GAAG;AACrtB,yFAAyF,sBAAsB,gDAAgD,GAAG;AAClK,4CAA4C,4BAA4B,sCAAsC,GAAG;AACjH,0CAA0C,2BAA2B,6BAA6B,sCAAsC,0DAA0D,GAAG;AACrM,gDAAgD,kDAAkD,iCAAiC,gBAAgB,GAAG;AACtJ,4CAA4C,4CAA4C,yDAAyD,GAAG;AACpJ,8CAA8C,4BAA4B,+BAA+B,8CAA8C,4CAA4C,mCAAmC,yBAAyB,wBAAwB,iCAAiC,0CAA0C,GAAG;AACrW,4DAA4D,mBAAmB,GAAG;AAClF,2DAA2D,0DAA0D,GAAG;AACxH,4CAA4C,oCAAoC,8BAA8B,GAAG;AACjH,mDAAmD,+BAA+B,iCAAiC,iCAAiC,gCAAgC,4BAA4B,+DAA+D,iCAAiC,4HAA4H,4CAA4C,yCAAyC,iMAAiM,KAAK,UAAU,kDAAkD,KAAK,GAAG;AAC3wB,6CAA6C,+BAA+B,0BAA0B,4BAA4B,kCAAkC,+BAA+B,6CAA6C,+CAA+C,GAAG;AAClS,8CAA8C,4BAA4B,2CAA2C,qCAAqC,kCAAkC,yDAAyD,GAAG;AACxP,yCAAyC,4BAA4B,2BAA2B,8BAA8B,GAAG;AACjI,8CAA8C,4BAA4B,4BAA4B,2BAA2B,2BAA2B,4BAA4B,+BAA+B,0BAA0B,2BAA2B,8BAA8B,2BAA2B,wBAAwB,6BAA6B,8DAA8D,4BAA4B,8BAA8B,4DAA4D,uCAAuC,qBAAqB,oCAAoC,KAAK,2DAA2D,8BAA8B,sGAAsG,4DAA4D,6FAA6F,+HAA+H,kBAAkB,4BAA4B,8CAA8C,KAAK,8EAA8E,mCAAmC,+GAA+G,2BAA2B,kEAAkE,qEAAqE,2BAA2B,wMAAwM,KAAK,UAAU,gFAAgF,KAAK,KAAK;AACz5D,oDAAoD,4BAA4B,4DAA4D,8BAA8B,gCAAgC,4BAA4B,0BAA0B,yCAAyC,wDAAwD,8CAA8C,KAAK,UAAU,kDAAkD,KAAK,GAAG;AACxd,qDAAqD,0BAA0B,2BAA2B,0BAA0B,sBAAsB,oEAAoE,yBAAyB,8BAA8B,mCAAmC,+BAA+B,+CAA+C,6DAA6D,KAAK,UAAU,6BAA6B,KAAK,yDAAyD,sDAAsD,mDAAmD,GAAG;AACzpB,oCAAoC,4BAA4B,wBAAwB,0BAA0B,GAAG;AACrH,kCAAkC,8BAA8B,kBAAkB,GAAG;AACrF,oDAAoD,2BAA2B,uBAAuB,8DAA8D,yBAAyB,sBAAsB,yBAAyB,iFAAiF,iBAAiB,mCAAmC,oDAAoD,oDAAoD,wDAAwD,gBAAgB,GAAG,mCAAmC,wBAAwB,4CAA4C,iDAAiD,uBAAuB,uEAAuE,wBAAwB,oBAAoB,GAAG;AACz0B,wCAAwC,6BAA6B,0BAA0B,0CAA0C,GAAG;AAC5I,iDAAiD,4CAA4C,oCAAoC,qBAAqB,uBAAuB,oBAAoB,oDAAoD,8DAA8D,sDAAsD,GAAG;AAC5W,sDAAsD,4CAA4C,wCAAwC,qBAAqB,uBAAuB,oBAAoB,oDAAoD,8DAA8D,4CAA4C,gDAAgD,mCAAmC,+BAA+B,0BAA0B,GAAG;AACvf,kDAAkD,4CAA4C,qCAAqC,qBAAqB,uBAAuB,oBAAoB,oDAAoD,8DAA8D,sDAAsD,GAAG;AAC9W,uDAAuD,4CAA4C,yCAAyC,qBAAqB,uBAAuB,oBAAoB,oDAAoD,8DAA8D,4CAA4C,gDAAgD,mCAAmC,+BAA+B,0BAA0B,GAAG;AACzf,iDAAiD,4CAA4C,oCAAoC,qBAAqB,uBAAuB,oBAAoB,oDAAoD,8DAA8D,+CAA+C,GAAG;AACrW,sDAAsD,4CAA4C,wCAAwC,qBAAqB,uBAAuB,oBAAoB,oDAAoD,8DAA8D,qCAAqC,yCAAyC,mCAAmC,+BAA+B,0BAA0B,GAAG;AACze,iDAAiD,4CAA4C,oCAAoC,qBAAqB,uBAAuB,oBAAoB,oDAAoD,8DAA8D,+CAA+C,GAAG;AACrW,sDAAsD,4CAA4C,wCAAwC,qBAAqB,uBAAuB,oBAAoB,oDAAoD,8DAA8D,qCAAqC,yCAAyC,mCAAmC,+BAA+B,0BAA0B,GAAG;AACze,iDAAiD,2CAA2C,yCAAyC,iCAAiC,kCAAkC,eAAe,GAAG;AAC1N,+CAA+C,kCAAkC,uBAAuB,6BAA6B,8DAA8D,+BAA+B,0CAA0C,mCAAmC,sIAAsI,sDAAsD,iCAAiC,GAAG;AAC/gB,iDAAiD,kCAAkC,4BAA4B,2BAA2B,yBAAyB,8DAA8D,8IAA8I,2CAA2C,2CAA2C,uFAAuF,uEAAuE,uEAAuE,uEAAuE,uEAAuE,wFAAwF,qCAAqC,qCAAqC,iHAAiH,iHAAiH,GAAG,mFAAmF,2BAA2B,2BAA2B,2BAA2B,0BAA0B,0BAA0B,KAAK,+BAA+B,GAAG,yBAAyB,sBAAsB,yBAAyB,qCAAqC,uCAAuC,4CAA4C,iFAAiF,gEAAgE,wEAAwE,sDAAsD,kHAAkH,sDAAsD,sCAAsC,GAAG;AAC9lE,2CAA2C,2BAA2B,yBAAyB,4BAA4B,2BAA2B,0BAA0B,8BAA8B,4EAA4E,uEAAuE,gCAAgC,mFAAmF,kDAAkD,6DAA6D,yDAAyD,gCAAgC,2EAA2E,wDAAwD,4DAA4D,kGAAkG,+CAA+C,sBAAsB,4BAA4B,aAAa,mDAAmD,6CAA6C,4EAA4E,mBAAmB,kCAAkC,mEAAmE,GAAG;AACl1C,qDAAqD,4DAA4D,qDAAqD,GAAG;AACzK,qDAAqD,+BAA+B,4DAA4D,wDAAwD,GAAG;AAC3M,2EAA2E,0DAA0D,kDAAkD,GAAG;;;;;;;;;AC7G9K;;AAEZ,kBAAkB;AAClB,mBAAmB;AACnB,qBAAqB;;AAErB;AACA;AACA;;AAEA;AACA,mCAAmC,SAAS;AAC5C;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,sBAAsB,SAAS;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,2CAA2C,UAAU;AACrD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;;;;;;;ACrJA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEY;;AAEZ,aAAa,mBAAO,CAAC,GAAW;AAChC,cAAc,mBAAO,CAAC,GAAS;AAC/B,cAAc,mBAAO,CAAC,GAAS;;AAE/B,cAAc;AACd,kBAAkB;AAClB,yBAAyB;;AAEzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,6BAA6B,qBAAM;AACnC,IAAI,qBAAM;AACV;;AAEA;AACA;AACA;AACA,kBAAkB;;AAElB;AACA;AACA;AACA,qBAAqB,oDAAoD;AACzE;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,oBAAoB,UAAU;AAC9B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kBAAkB,YAAY;AAC9B;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,wCAAwC,SAAS;AACjD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAgB,iBAAiB;AACjC;AACA;AACA;;AAEA;AACA;AACA,cAAc,iBAAiB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kBAAkB,SAAS;AAC3B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kBAAkB,SAAS;AAC3B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kBAAkB,SAAS;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gDAAgD,EAAE;AAClD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,kBAAkB,SAAS;AAC3B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA,yBAAyB,eAAe;AACxC;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,yBAAyB,QAAQ;AACjC;AACA,sBAAsB,eAAe;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,kBAAkB,YAAY;AAC9B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,sBAAsB,SAAS;AAC/B;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,sBAAsB,SAAS;AAC/B;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,sBAAsB,SAAS;AAC/B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,kBAAkB,kBAAkB;AACpC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,oBAAoB,cAAc;AAClC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,wDAAwD,OAAO;AAC/D;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA,wDAAwD,OAAO;AAC/D;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,mBAAmB;AACnB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,sBAAsB,QAAQ;AAC9B;AACA;AACA,IAAI;AACJ;AACA,gBAAgB,SAAS;AACzB;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,oBAAoB,SAAS;AAC7B;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,gBAAgB,iBAAiB;AACjC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,kBAAkB,YAAY;AAC9B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,kBAAkB,gBAAgB;AAClC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,kBAAkB,gBAAgB;AAClC;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,kBAAkB,YAAY;AAC9B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;AC5vDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;;AAEf;AACA;AACA;AACA,iBAAiB;;AAEjB;AACA;AACA;AACA,cAAc;;AAEd;AACA;AACA;AACA,yBAAyB;;AAEzB;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA,mBAAmB;;AAEnB;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA,cAAc;;AAEd;AACA;AACA;AACA,eAAe;;AAEf;AACA;AACA;AACA,kBAAkB;;AAElB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;;AAEnB,2DAAoD;;AAEpD;AACA;AACA;;;;;;;;AC1GA;;AAEA,gBAAgB,mBAAO,CAAC,GAAa;;AAErC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,uCAAuC,+BAA+B;AACtE;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,2CAA2C,SAAS;AACpD;AACA;AACA;AACA;AACA;;AAEA,qBAAqB,YAAY;AACjC;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,+CAA+C,SAAS;AACxD;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;;AAEN;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,0CAA0C,SAAS;AACnD;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,0CAA0C,SAAS;AACnD;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,yBAAyB;AACzB;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,6BAA6B,iBAAiB;AAC9C;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,2BAA2B;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;AC1bA;;AAEA,cAAc,mBAAO,CAAC,GAAS;;AAE/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,mCAAmC;AACnC,2CAA2C;AAC3C,oCAAoC;AACpC,6CAA6C;AAC7C,8CAA8C;AAC9C,yCAAyC;AACzC;AACA,2CAA2C;AAC3C,+CAA+C;AAC/C;AACA;AACA,oCAAoC;AACpC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,kCAAkC;AAClC,qCAAqC;AACrC,2CAA2C;AAC3C,0CAA0C;AAC1C,iCAAiC;AACjC,8BAA8B;AAC9B,+BAA+B;AAC/B,gDAAgD;AAChD,4CAA4C;AAC5C,6CAA6C,OAAO;AACpD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEa;;AAEb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB;;AAEnB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,kBAAkB,sBAAsB;AACxC;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,eAAe;AACf;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA,oBAAoB,SAAS;AAC7B;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;;AAEA,kCAAkC,QAAQ;AAC1C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,oBAAoB,iBAAiB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,QAAQ;AACR;AACA,uCAAuC,QAAQ;AAC/C;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,kBAAkB,OAAO;AACzB;AACA;AACA;;AAEA;AACA,SAAS,yBAAyB;AAClC;AACA;AACA;;AAEA;AACA;AACA,kBAAkB,gBAAgB;AAClC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,8DAA8D,YAAY;AAC1E;AACA,8DAA8D,YAAY;AAC1E;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,qCAAqC,YAAY;AACjD;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,IAAI;AACJ;AACA;AACA;;;;;;;;AChfA,YAAY,mBAAO,CAAC,GAAa;AACjC;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,mBAAmB;AACrC;AACA;AACA;AACA;AACA;;;;;;;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,SAAS;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,sBAAsB;AACtB,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;;;;;;;;ACxQA;AACA;AACA,sBAAsB,mBAAO,CAAC,GAAQ;AACtC,YAAY,mBAAO,CAAC,GAAS;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,4FAA4C;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,uCAAuC;AACvC,+BAA+B;AAC/B,uCAAuC;AACvC,+BAA+B;AAC/B,6CAA6C;AAC7C,yCAAyC;AACzC,iCAAiC;AACjC,qCAAqC;AACrC,uDAAuD;AACvD,uCAAuC;AACvC,gDAAgD;AAChD,qCAAqC;AACrC,yCAAyC;AACzC,6CAA6C;AAC7C,mCAAmC;AACnC,2BAA2B;AAC3B,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,SAAS;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,SAAS;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,qBAAqB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA,4BAA4B;AAC5B;AACA;AACA,0BAA0B;AAC1B;AACA;AACA,4BAA4B;AAC5B;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,QAAQ;AACR,wCAAwC,mCAAmC;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,QAAQ;AACR,wCAAwC,mCAAmC;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,QAAQ;AACR,wCAAwC,mCAAmC;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,wCAAwC,mCAAmC;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,aAAa,0BAA0B;AACvC,aAAa,0BAA0B;AACvC,uCAAuC;AACvC,uCAAuC;AACvC;AACA;AACA;AACA,gEAAgE;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,KAAK;AAC/B;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA,gCAAgC;AAChC,wCAAwC,gDAAgD;AACxF;AACA;AACA;AACA;AACA;AACA,uBAAuB,qBAAqB;AAC5C,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA,gCAAgC,KAAK,gBAAgB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,kCAAkC;AAClC;AACA,oBAAoB;AACpB,yBAAyB;AACzB,oBAAoB;AACpB;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC,wCAAwC;AACxC;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,SAAS;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA,kBAAkB;AAClB,qBAAqB,oBAAoB;AACzC,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA,sCAAsC,uBAAuB,gBAAgB;AAC7E,mCAAmC,eAAe;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,gBAAgB;AACnD,mCAAmC,eAAe;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC79BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,QAAQ;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACrCA;AACA;AACA,kBAAkB,mBAAO,CAAC,GAAgB;AAC1C,gBAAgB,mBAAO,CAAC,GAAiB;AACzC,kBAAkB,mBAAO,CAAC,GAAgB;AAC1C,oBAAoB,mBAAO,CAAC,GAAsB;AAClD,oBAAoB,mBAAO,CAAC,GAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB,kBAAkB,wBAAwB;AAC1C;AACA;AACA,kBAAkB,wBAAwB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD;AACjD,+CAA+C;AAC/C,+CAA+C;AAC/C,uCAAuC;AACvC,qCAAqC;AACrC,6BAA6B;AAC7B,mCAAmC;AACnC,qCAAqC;AACrC,2CAA2C;AAC3C,mCAAmC;AACnC;AACA;AACA;AACA;AACA,8BAA8B,QAAQ;AACtC,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACtXA;AACA,WAAW,mBAAO,CAAC,GAAY;AAC/B;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACrJA,WAAW,mBAAO,CAAC,GAAY;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACtFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC7FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,MAAM;AACN,MAAM;AACN;;;;;;;;AC9CA,eAAe,mBAAO,CAAC,GAAS;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACZA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,SAAS,WAAW;;AAEpB;AACA;AACA;AACA,SAAS,WAAW;;AAEpB;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA,SAAS,WAAW;;AAEpB;AACA;AACA,SAAS,UAAU;;AAEnB;AACA;;;;;;;;ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC1BA,iBAAiB;;AAEjB;AACA;AACA;;;;;;;;;;ACJa;;AAEb,WAAW,OAAO;AAClB,KAAK,OAAO;AACZ,IAAI,OAAO;AACX,IAAI,OAAO,iCAAiC,OAAO;AACnD,qBAAqB;AACrB,EAAE;AACF,mBAAmB,OAAO;AAC1B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA,WAAW,OAAO;AAClB;AACA,KAAK;AACL;AACA,WAAW,OAAO;AAClB;AACA,KAAK;AACL;AACA,WAAW,OAAO;AAClB;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA,KAAK;AACL;AACA;;;;;;;;;AC3CA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,MAAM;AACN;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,sCAAsC;;AAEtC;AACA;AACA;;AAEA,4BAA4B;AAC5B;AACA;AACA;AACA,6BAA6B;;;;;;;;ACvL7B,yCAAmD;;;;;;;;;ACAnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEa;;AAEb;;AAEA,UAAU,mBAAO,CAAC,GAAsB;AACxC;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;;AAEA;AACA,yBAAyB,mBAAO,CAAC,GAAc;AAC/C,gBAAgB,mBAAO,CAAC,GAAU;AAClC;;AAEA,eAAe,mBAAO,CAAC,GAAoB;AAC3C,eAAe,mBAAO,CAAC,GAAoB;;AAE3C;;AAEA;AACA;AACA;AACA,kBAAkB,iBAAiB;AACnC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;;AAEA;AACA;;;;;;;;AClIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEa;;AAEb;;AAEA,gBAAgB,mBAAO,CAAC,GAAqB;;AAE7C;AACA,yBAAyB,mBAAO,CAAC,GAAc;AAC/C,gBAAgB,mBAAO,CAAC,GAAU;AAClC;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;;;;;;;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEa;;AAEb;;AAEA,UAAU,mBAAO,CAAC,GAAsB;AACxC;;AAEA;;AAEA;AACA,cAAc,mBAAO,CAAC,GAAS;AAC/B;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,SAAS,uCAA8B;;AAEvC;AACA;AACA;AACA;;AAEA;AACA,aAAa,mBAAO,CAAC,GAA2B;AAChD;;AAEA;;AAEA,aAAa,iCAA6B;AAC1C,oBAAoB,qBAAM;AAC1B;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,yBAAyB,mBAAO,CAAC,GAAc;AAC/C,gBAAgB,mBAAO,CAAC,GAAU;AAClC;;AAEA;AACA,gBAAgB,mBAAO,CAAC,GAAM;AAC9B;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;;AAEA,iBAAiB,mBAAO,CAAC,EAA+B;AACxD,kBAAkB,mBAAO,CAAC,GAA4B;AACtD;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,yEAAyE,6EAA6E;AACtJ;;AAEA;AACA,qBAAqB,mBAAO,CAAC,GAAkB;;AAE/C;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,iDAAiD,0FAA0F;;AAE3I;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,wCAAwC,iDAAwC;AAChF;AACA;AACA;AACA;;AAEA;AACA,qBAAqB,mBAAO,CAAC,GAAkB;;AAE/C;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA,kGAAkG;AAClG,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA,4FAA4F;AAC5F,UAAU;AACV;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,gDAAgD;;AAEhD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,sCAAsC,iDAAwC;AAC9E;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,6DAA6D;AAC7D;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,sCAAsC;;AAEtC;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gEAAgE,OAAO,oBAAoB,OAAO;;AAElG;AACA,4CAA4C;;AAE5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,qBAAqB;;AAErB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,oBAAoB,SAAS;AAC7B;AACA,KAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA,4EAA4E;;AAE5E;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA,kBAAkB,yBAAyB;AAC3C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mDAAmD;AACnD;AACA,mDAAmD,iEAAiE;AACpH;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA,uCAAuC;AACvC,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,iCAAiC,OAAO;AACxC;AACA;AACA;AACA;;;;;;;;AC1/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,aAAa;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEa;;AAEb;;AAEA,aAAa,mBAAO,CAAC,GAAkB;;AAEvC;AACA,yBAAyB,mBAAO,CAAC,GAAc;AAC/C,gBAAgB,mBAAO,CAAC,GAAU;AAClC;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;;;;;;;;ACrNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEa;;AAEb;;AAEA,UAAU,mBAAO,CAAC,GAAsB;AACxC;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,kBAAkB,OAAO,uCAAuC,OAAO;AACvE;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,yBAAyB,mBAAO,CAAC,GAAc;AAC/C,gBAAgB,mBAAO,CAAC,GAAU;AAClC;;AAEA;AACA;AACA,aAAa,mBAAO,CAAC,GAAgB;AACrC;AACA;;AAEA;AACA,aAAa,mBAAO,CAAC,GAA2B;AAChD;;AAEA;;AAEA,aAAa,iCAA6B;AAC1C,oBAAoB,qBAAM;AAC1B;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,kBAAkB,mBAAO,CAAC,GAA4B;;AAEtD;;AAEA;;AAEA;AACA,qBAAqB,mBAAO,CAAC,GAAkB;;AAE/C;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,iDAAiD,0FAA0F;;AAE3I;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL,IAAI;AACJ,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH,EAAE;AACF;AACA;AACA;AACA;;AAEA;AACA,qBAAqB,mBAAO,CAAC,GAAkB;;AAE/C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iCAAiC;;AAEjC;;AAEA,2CAA2C;AAC3C;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mDAAmD;AACnD;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,oDAAoD;AACpD;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC9qBa;;AAEb,kDAAkD,0CAA0C;;AAE5F,aAAa,iCAA6B;AAC1C,WAAW,mBAAO,CAAC,GAAM;;AAEzB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,kBAAkB;AAClB,gDAAgD;AAChD;AACA;AACA;;AAEA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,CAAC;;AAED;AACA;AACA,6BAA6B,qBAAqB;AAClD;AACA;AACA;;;;;;;;AC9Ea;;AAEb;;AAEA,UAAU,mBAAO,CAAC,GAAsB;AACxC;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;ACzEA,sDAA+C;;;;;;;;ACA/C,qDAAkD;;;;;;;;ACAlD,UAAU,yCAAqD;AAC/D,cAAc;AACd,gBAAgB;AAChB,2CAAuD;AACvD,yCAAmD;AACnD,4CAAyD;AACzD,8CAA6D;;;;;;;;ACN7D,mDAAgD;;;;;;;;ACAhD,yCAAqD;;;;;;;;ACArD;AACA,aAAa,mBAAO,CAAC,GAAQ;AAC7B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA,EAAE,cAAc;AAChB;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC7DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAY;;AAEZ,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;;AAEA,WAAW;AACX;AACA;AACA,IAAI;AACJ;AACA;AACA;;;;;;;;ACpDA;AACA,eAAe,KAAsD,oBAAoB,CAA4D,CAAC,kBAAkB,iBAAiB,cAAc,qBAAqB,SAAS,cAAc,YAAY,oBAAoB,qDAAqD,IAAI,wCAAwC,gCAAgC,MAAM,OAAO,eAAe,YAAY,eAAe,uCAAuC;AAClf,yBAAyB,KAAK,mHAAmH,sFAAsF,KAAK,OAAO,0DAA0D,4BAA4B,gBAAgB,IAAI,gCAAgC,kBAAkB,mDAAmD,yBAAyB;AAC3d,mCAAmC,SAAS,mBAAmB,aAAa,0BAA0B,wBAAwB,wJAAwJ,UAAU,WAAW,4BAA4B,aAAa,yBAAyB,mDAAmD,qBAAqB,cAAc,oBAAoB,cAAc;AACre,oBAAoB,cAAc,iBAAiB,oBAAoB,OAAO,2BAA2B,gBAAgB,gBAAgB,cAAc,gBAAgB,oBAAoB,cAAc,kDAAkD,qCAAqC,wBAAwB,cAAc,iBAAiB,sCAAsC,SAAS;;;;;;;;ACJtY;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,SAAS,uCAA8B;AACvC,eAAe,mBAAO,CAAC,GAAU;;AAEjC;AACA,kBAAkB,mBAAO,CAAC,GAA6B;AACvD,kBAAkB,mBAAO,CAAC,GAA6B;AACvD,gBAAgB,mBAAO,CAAC,EAA2B;AACnD,mBAAmB,mBAAO,CAAC,GAA8B;AACzD,qBAAqB,mBAAO,CAAC,GAAgC;;AAE7D;AACA;;;;AAIA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;;;;;;;;AC9HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEa;;AAEb;;AAEA,aAAa,iCAA6B;AAC1C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,6BAA6B,sCAAsC,sCAAsC;AACzG;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;ACvSA,aAAa,mBAAO,CAAC,GAAQ;;AAE7B;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,qCAAqC;AACrC,6BAA6B;;AAE7B;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM,OAAO;AACb;AACA,OAAO;AACP,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;ACzGA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,UAAU;AACrB,WAAW,QAAQ;AACnB,aAAa,UAAU;AACvB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA,SAAS,qBAAM;AACf,IAAI;AACJ;AACA;AACA,YAAY,qBAAM;AAClB;AACA;AACA;;;;;;;;;AClEA;;;;;;;ACAA;;;;;;;ACAA;;;;;;UCAA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;;WCtBA;WACA;WACA;WACA;WACA;WACA,iCAAiC,WAAW;WAC5C;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,GAAG;WACH;WACA;WACA,CAAC;;;;;WCPD;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACNO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,QAAQ;;AAER;;AAEA;AACA,qBAAqB,oDAAoD;AACzE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;;AAEA;AACA;AACA;AACA;;;AC5CA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,sCAAsC,OAAO;;AAE7C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAG2B;;;ACtFyC;;AAE7D;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;;AAET;AACA,qBAAqB;AACrB;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,8BAA8B,0CAA0C;AACxE,8BAA8B,0CAA0C;AACxE,iCAAiC,6CAA6C;;AAE9E;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,sBAAsB,YAAY;AAClC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;;ACjI4B;AACM;;AAElC;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;;AAEA;AACA;AACA,kCAAkC;AAClC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,uCAAuC;AACvC,sCAAsC;AACtC;;AAEA,qCAAqC,4BAA4B;;AAEjE;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,mBAAmB,iBAAiB;;AAEpC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,kCAAkC;;AAElC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,sDAAsD;AACtD;;AAEA;AACA;AACA;;AAEA;AACA,mBAAmB,iCAAiC;;AAEpD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,mBAAmB,mCAAmC;AACtD;;AAEA;AACA;AACA,uBAAuB,eAAe;AACtC;AACA;AACA;;AAEA;;AAEA;AACA,iCAAiC,8BAA8B;AAC/D;;AAEA;AACA;AACA,cAAc;AACd,+BAA+B;AAC/B,iCAAiC;AACjC;;AAEA,YAAY;AACZ,YAAY;AACZ,SAAS;;;AClQT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEmE;;AAEnE,wBAAwB;AACxB;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA,YAAY,QAAQ;AACpB;AACA,4CAA4C,MAAM;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA,YAAY,iBAAiB;;AAE7B;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,CAAC;;;ACzIuC;;AAExC,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;;AAEA,uBAAuB;;;ACpBkB;AACN;;AAEnC,wBAAwB;AACxB;AACA;AACA;AACA;AACA;;AAEA,iBAAiB,WAAW;AAC5B,mBAAmB,aAAa;;AAEhC;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP,GAAG;;AAEH;AACA;AACA,GAAG;AACH,CAAC;;;ACrCD;;AAEA,iBAAiB,SAAS;;AAE1B;;AAEA;;AAEA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,GAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,SAAS,sBAAY;;AAErB;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;;;;AA4BE;;;ACjQ0C;;AAE5C;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;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EA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;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,gEAAgE;;AAEhE;;AAEA;;AAEA;;AAEA;;AAE8B;;;;;ACvIuB;AACwB;AACF;AAClC;;AAEzC,wBAAwB;AACxB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;AACA,kBAAkB;AAClB,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,uBAAuB,iCAAiB;AACxC,wBAAwB,kBAAkB;AAC1C,SAAS;AACT,QAAQ,MAAM;;AAEd;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP,GAAG;;AAEH;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;AACH,CAAC;;;ACjFwC;;AAEzC,wBAAwB;AACxB;AACA;AACA;AACA;AACA,+DAA+D,aAAa,aAAa;AACzF,+BAA+B,sCAAsC;AACrE,wCAAwC,eAAe,wBAAwB,mBAAmB;AAClG;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,oBAAoB;AACpB;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA,GAAG;AACH,CAAC;;;AC7DwC;;AAEzC,wBAAwB;AACxB;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;AACH,CAAC;;;ACvEwC;;AAEzC,wBAAwB;AACxB;AACA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA,eAAe;AACf,KAAK;AACL,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;;AAEA,oBAAoB,eAAe;AACnC,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;;AAEA,oBAAoB,cAAc;AAClC,GAAG;AACH,CAAC;;;AC/DwC;;AAEzC,wBAAwB;AACxB;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH,CAAC;;;ACVM,MAAM,kBAAQ;AACd,gBAAgB;AAChB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,2BAA2B;;;AClLK;;AAEvC;;AAEA,wBAAwB,OAAO,kDAAkD,OAAO;;AAExF;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,qCAAqC,OAAO;;AAE5C;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,wCAAwC,OAAO;;AAE/C;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,uCAAuC,QAAQ;;AAE/C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAmB,WAAO;;AAE1B;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,yCAAyC,OAAO;;AAEhD,KAAK,WAAO;AACZ,yBAAyB,WAAO;;AAEhC;;AAEA,KAAK;;AAEL;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,wCAAwC,OAAO;;AAE/C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA,kCAAkC,WAAO;;AAEzC;AACA,SAAS,WAAO;;AAEhB;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,EAAE,OAAG;AACL;;AAEA;AACA,kBAAkB,OAAG;AACrB,uBAAuB,OAAG;AAC1B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,OAAG;;AAEnC;;AAEA;;AAEA;AACA;AACA,gCAAgC,OAAG;;AAEnC;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,gCAAgC,OAAG;;AAEnC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,uBAAuB,WAAO;;AAE9B;;AAEA;;AAEA;;AAEA;;AAEA,gCAAgC,WAAO;;AAEvC;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA,iFAAiF;AACjF,iFAAiF;AACjF,iFAAiF;AACjF,iFAAiF;AACjF,iFAAiF;AACjF,iFAAiF;AACjF,iFAAiF;AACjF,iFAAiF;;AAEjF;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,mBAAmB,OAAO;AAC1B,mBAAmB,OAAO;AAC1B,mBAAmB,OAAO;AAC1B,mBAAmB,OAAO;AAC1B,mBAAmB,OAAO;AAC1B,mBAAmB,OAAO;AAC1B,mBAAmB,OAAO;AAC1B,mBAAmB,OAAO;AAC1B;;AAEA,MAAM,WAAO,qBAAqB,OAAO;;AAEzC;;AAEA;;AAEA,8BAA8B,OAAO;AACrC,MAAM,OAAG,qBAAqB,OAAO;AACrC,8BAA8B,OAAO;;AAErC;;AAEA,8BAA8B,OAAO;AACrC,8BAA8B,OAAO;AACrC,8BAA8B,OAAO;;AAErC,kCAAkC,OAAO;AACzC,mCAAmC,OAAO;AAC1C,0CAA0C,OAAO;AACjD,oCAAoC,OAAO;;AAE3C;;AAEA,uCAAuC,QAAQ;;AAE/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEgB;;;ACnhBiB;AACM;;AAEvC,MAAM,UAAI,qBAAqB,IAAI;AACnC,MAAM,SAAG,qBAAqB,OAAO;AACrC,2CAA2C,OAAO;AAClD,mCAAmC,OAAO;;AAE1C;;AAEA,2BAA2B,OAAO;;AAElC;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ,GAAG,UAAI;;AAEP;;AAEA;;AAEA,uCAAuC,QAAQ;;AAE/C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;;AAGA,IAAI;;AAEJ;;AAEA;;AAEA,sBAAsB,SAAG;AACzB,sBAAsB,SAAG;;AAEzB;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEkB;;;ACnOqB;AACA;;AAEvC,mCAAmC,OAAO;AAC1C,mCAAmC,OAAO;AAC1C,wCAAwC,OAAO;;AAE/C;;AAEA,2BAA2B,OAAO;;AAElC;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEiB;;;AC5MsB;AACF;AACF;;AAEnC,kCAAkC,MAAM;AACxC,MAAM,cAAO,qBAAqB,OAAO;;AAEzC;;AAEA,uBAAuB,KAAK,aAAa,KAAK,aAAa,KAAK,aAAa,KAAK,aAAa,KAAK,aAAa,KAAK;;AAEtH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAmB,OAAO;;AAE1B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,mBAAmB,OAAO;;AAE1B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAmB,OAAO;;AAE1B;;AAEA;;AAEA,GAAG,cAAO;AACV,GAAG,cAAO;AACV,GAAG,cAAO;;AAEV,+BAA+B,cAAO;;AAEtC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAmB,OAAO;;AAE1B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGmB;;;ACjKnB;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,2BAA2B;AAC3B,2BAA2B;AAC3B,2BAA2B;AAC3B,2BAA2B;AAC3B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,IAAI;;AAEJ;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,sBAAsB;AACtB;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,iBAAiB;;AAEjB;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,MAAM;;AAEN;AACA;AACA;;AAEA;;AAEA,KAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;;AAEA,MAAM;;AAEN;AACA;AACA;;AAEA;;AAEA,KAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;;AAEA,MAAM;;AAEN;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,gBAAgB;;AAEhB;;AAEA;;AAEA;AACA;AACA,oCAAoC;;AAEpC;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEmB;;;ACvpBnB;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,GAAG;;AAEH;;AAEA;;AAEA;;AAEA,GAAG;;AAEH;;AAEA;;AAEA,GAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAE0B;;;ACpD1B;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;;AAEA,MAAM;;AAEN;;AAEA;;AAEA,KAAK;;AAEL;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA;AACA;;AAEA,KAAK;;AAEL;AACA;;AAEA;;AAEA,4BAA4B;;AAE5B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;;AAEN;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;;AAG2B;;;AChM3B;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,2BAA2B;AAC3B,2BAA2B;AAC3B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AA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ACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,wDAAwD;;AAExD;;AAEA;AACA;AACA,8EAA8E;AAC9E,8FAA8F;AAC9F;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,IAAI;;AAEJ;AACA;;AAEA,IAAI;;AAEJ;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,wGAAwG;AACxG;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,CAAC,EAAC;;;ACrTF,2EAAyB;AACzB;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AA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AAEA;AACA;;AAEO,MAAM,sBAAQ;AACrB;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;;AClCO,MAAM,sBAAM;AACnB;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEO,MAAM,wBAAQ;AACrB;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA,mCAAmC;;AAEnC;AACA;AACA;AACA;AACA;;AAEA;AACA;;;ACpEO,MAAM,qBAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEO,MAAM,uBAAQ;AACrB;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;AClHO,MAAM,uBAAM;AACnB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO,MAAM,yBAAQ;AACrB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACrJO,MAAM,sBAAM;AACnB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEO,MAAM,wBAAQ;AACrB;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,qEAAqE;;AAErE;;AAEA;;AAEA;;AAEA,iEAAiE;;AAEjE;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;ACzGO,MAAM,sBAAM;AACnB;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEO,MAAM,wBAAQ;AACrB;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;;ACjFO,MAAM,qBAAM;AACnB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEO,MAAM,uBAAQ;AACrB;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;AC5HO,MAAM,wBAAM;AACnB;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEO,MAAM,0BAAQ;AACrB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;AC7MO,MAAM,oBAAM;AACnB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEO,MAAM,sBAAQ;AACrB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;ACnHO,MAAM,kBAAM;AACnB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEO,MAAM,oBAAQ;AACrB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;ACrEO,MAAM,kBAAM;AACnB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEO,MAAM,oBAAQ;AACrB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;;AChDO,MAAM,kBAAM;AACnB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEO,MAAM,oBAAQ;AACrB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;;AC9EwE;AACU;AACR;AACU;AAClB;AACU;AACd;AACY;AAC1B;AACgC;AACM;AACU;AACJ;AACV;AAChB;AACU;AACJ;AACV;AACZ;AAC0C;AACd;AACc;AACV;AACJ;AACU;AACd;AACU;AAChB;AACwB;AACd;AACJ;AACV;AACN;AACU;AACN;AACU;AACgB;AAChB;AACU;AACF;AACR;AACwB;AAClB;AACU;AACR;AACU;AACJ;AACU;AAChB;AACF;AACF;AACE;AACU;AACJ;AACV;AACZ;AACU;AACQ;AACU;AACV;AACU;AAChB;AACU;AACV;AACM;AACF;AACA;AACJ;AACV;AACoB;AACgB;AACF;AACd;AAChB;AAChB;AAC0C;AAC5B;AACQ;AACU;AACJ;AACU;AACN;AACJ;AACV;AACgB;AAClB;AACU;AACV;AACI;AACM;AACU;AACV;AACU;AACR;AACU;AACpB;AACJ;AACV;AACgB;AACJ;AACV;AACU;;AAEP;AACZ;AACE;AACc;AACR;AACI;AACF;AACI;AACF;AACA;AACF;AACM;AACR;AACJ;AACA;AACA;;AAE9C;AACP,oBAAoB,sBAAiB;AACrC,yBAAyB,2BAAsB;AAC/C,qBAAqB,uBAAkB;AACvC,0BAA0B,4BAAuB;AACjD,iBAAiB,mBAAc;AAC/B,sBAAsB,wBAAmB;AACzC,eAAe,iBAAY;AAC3B,qBAAqB,uBAAkB;AACvC,QAAQ,UAAK;AACb,wBAAwB,0BAAqB;AAC7C,2BAA2B,6BAAwB;AACnD,gCAAgC,kCAA6B;AAC7D,8BAA8B,g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CA;;AAEA;;AAEA,kBAAkB,SAAS;;AAE3B;AACA;;AAEA,IAAI;;AAEJ;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,yKAAyK,cAAc;AACvL;AACA;AACA;AACA;AACA,yDAAyD,uBAAuB,2BAA2B,uBAAuB;AAClI;AACA;AACA;AACA;AACA;AACA,oDAAoD,oBAAoB;AACxE,qDAAqD,qBAAqB;;AAE1E,kHAAkH,YAAY;;AAE9H;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,6DAA6D,aAAa;AAC1E;;AAEA;;AAEA,kCAAkC,UAAU;AAC5C,gCAAgC,QAAQ;;AAExC;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A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EA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;AACA;;AAEA,IAAI;;AAEJ,wCAAwC;;AAExC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA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;AACA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA;AACA;;AAEA,KAAK;;AAEL;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,kEAAkE,eAAe;;AAEjF;;AAEA;;AAEA;;AAEyB;;;AC7mE0B;;AAEnD,6BAA6B,aAAa;;AAE1C;;AAE0B;;;ACN6C;AAC9B;;AAEzC,wBAAwB;AACxB;AACA,WAAW,cAAc;AACzB;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,CAAC;;;ACnDiD;AACT;;AAEzC,wBAAwB;AACxB;AACA,sBAAsB,qBAAK;AAC3B,GAAG;;AAEH;AACA;AACA,GAAG;AACH,CAAC;;;ACXwC;;AAEzC,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;AACH,CAAC;;;AC3IwC;;AAEzC,wBAAwB;AACxB;AACA;AACA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;AACH,CAAC;;;ACzFwC;;AAEzC,wBAAwB;AACxB;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,CAAC;;;ACtBe;AACE;AACE;AACJ;AACA;AACE;AACE;AACH;AACD;AACA;AACE;;;ACVyD;AAClC;;AAEzC,wBAAwB;AACxB;;AAEA;AACA;AACA,kBAAkB;AAClB,GAAG;;AAEH;AACA;;AAEA;;AAEA,uCAAuC,iCAAiB;AACxD;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,MAAM;AACN;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;AACH,CAAC;;;ACtDwC;;AAEzC,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,CAAC;;;AC/DwC;;AAEzC,wBAAwB;AACxB;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,sCAAsC,0BAA0B;;AAEhE;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR,8CAA8C;AAC9C;AACA,MAAM;AACN;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR,wCAAwC;AACxC;AACA;AACA,GAAG;AACH,CAAC;;;;;;AChF2C;AACH;;AAEzC,wBAAwB;AACxB;;AAEA;AACA,kCAAkC,qBAAK;AACvC;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;AACH,CAAC;;;AC9BwC;;AAEzC,wBAAwB;AACxB;AACA;AACA;AACA,wBAAwB,oBAAoB,aAAa,YAAY,cAAc;AACnF,+BAA+B,WAAW,iBAAiB;AAC3D,iCAAiC,qBAAqB;AACtD,mCAAmC,UAAU,qBAAqB;AAClE,mCAAmC,wBAAwB,mBAAmB;AAC9E,kCAAkC,aAAa;AAC/C,oCAAoC;AACpC,kCAAkC,aAAa;AAC/C;AACA,yCAAyC;AACzC,GAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,qBAAqB,YAAY;AACjC;AACA;AACA,GAAG;;AAEH;AACA;AACA,kDAAkD,YAAY;AAC9D,GAAG;;AAEH;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,qBAAqB,cAAc;AACnC;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;AACH,CAAC;;;AC3FD;AACA;AACA;AACA;AACA;AACA;AAC2E;AACvB;;AAE7C;AACP;AACA;;AAEA,qBAAqB,uBAAO;AAC5B,0BAA0B,iCAAiB;AAC3C,2BAA2B,iCAAiB;;AAE5C;AACA,uBAAuB,uBAAO;AAC9B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;ACzH4C;AACY;;AAExD;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;;AAEA;AACA;AACA,eAAe,QAAQ,qBAAqB,WAAW,sBAAsB;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,oBAAoB,mBAAmB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,sBAAsB,mBAAmB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA,SAAS,UAAU;AACnB,gBAAgB,UAAU;;AAE1B;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,GAAG;AACH,CAAC;;;AC5NmB;AACF;AACI;AACL;AACH;AACA;;;ACLd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEoD;;AAE7C;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;ACrHyB;;;ACAzB;AACA;AACA;AACA;AACiC;;AAE1B;AACP;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,oBAAoB,4BAA4B;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,oBAAoB,2BAA2B;AAC/C;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,oBAAoB,2BAA2B;AAC/C;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,2BAA2B;AAC/C;AACA;AACA;AACA;;;ACjEyB;AACH;;;ACDH;AACD;AACG;AACL;AACC;;AAEjB;AACoB;AACC;;AAEsB;AACW;AACO;AACN;;;ACbvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,cAAc,4BAA4B,IAAI,aAAa;AAC3D;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU,kCAAkC;AAC5C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,mBAAmB,yBAAyB,MAAM;AAC/D;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,mBAAmB,+BAA+B,IAAI,EAAE,EAAE,OAAO;AAChF;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,mBAAmB,+BAA+B,IAAI,EAAE,EAAE,OAAO;AAChF;AACA;;AAEA;AACA;AACA;AACA,eAAe,mBAAmB,kCAAkC,IAAI,EAAE,EAAE,OAAO;AACnF;AACA;;AAEA;AACA;AACA;AACA,eAAe,mBAAmB,+BAA+B,IAAI,EAAE,EAAE,OAAO;AAChF;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,mBAAmB,iBAAiB,IAAI,GAAG,EAAE,MAAM;AAChE;AACA;AACA;AACA;AACA,aAAa,mBAAmB,eAAe,IAAI,GAAG,EAAE,MAAM;AAC9D;AACA;AACA;AACA;AACA,aAAa,mBAAmB,eAAe,IAAI;AACnD;AACA;AACA;AACA,2BAA2B,mBAAmB,eAAe,IAAI;AACjE;;AAEA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,mBAAmB,oBAAoB,IAAI,EAAE,EAAE,OAAO;AACnE;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,UAAU;AACnB,SAAS,UAAU;;AAEnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,iCAAiC,MAAM;AACvC;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AC3mBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,EAAE;AAChB;AACA;AACA,eAAe,EAAE;AACjB;AACA;AACA,cAAc,EAAE;AAChB;AACA;AACA,cAAc,EAAE,EAAE,EAAE;AACpB,IAAI;AACJ,cAAc,EAAE,GAAG,EAAE;AACrB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,sBAAsB,EAAE,QAAQ,EAAE;AAClC;;AAEA,YAAY,EAAE,GAAG,EAAE;AACnB;;AAEA;AACA,IAAI,MAAM;AACV,IAAI,sBAAsB;AAC1B,IAAI,kBAAkB;AACtB,IAAI,kCAAkC;AACtC,IAAI,iBAAiB;AACrB,IAAI,iCAAiC;AACrC,IAAI,6BAA6B;AACjC,IAAI,6CAA6C;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO,mDAAmD;AAC1D;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,iCAAiC;;AAEjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,EAAE;AACtC;AACA;;AAEA,iBAAiB,EAAE;AACnB;AACA;AACA;AACA;AACA,iBAAiB,EAAE;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,qCAAqC;AACtD,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,qBAAqB,yCAAyC;AAC9D;AACA;AACA;AACA;AACA;;AAEA,WAAW,EAAE;AACb,eAAe,gCAAgC;AAC/C;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,aAAa,gBAAgB;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,KAAK;AACvC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,KAAK;AAC7B;AACA;AACA;AACA;AACA;AACA,wBAAwB,KAAK;AAC7B,cAAc;AACd;AACA,0BAA0B,KAAK;AAC/B;AACA,iBAAiB;AACjB;AACA;AACA,0BAA0B,KAAK;AAC/B,cAAc;AACd;AACA;AACA,iBAAiB;AACjB;AACA;AACA,wBAAwB,KAAK;AAC7B,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,sCAAsC,gBAAgB;;AAEtD;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,iBAAiB,EAAE,GAAG;AACtB;AACA;AACA;AACA;AACA,mBAAmB,wBAAwB;AAC3C;;AAEA;AACA;AACA;AACA,yBAAyB,EAAE;AAC3B,YAAY;AACZ,uBAAuB,EAAE;AACzB;AACA;AACA,iBAAiB,EAAE;AACnB;AACA,iBAAiB,EAAE;AACnB,YAAY;AACZ,eAAe,EAAE;AACjB;AACA;AACA;AACA,gCAAgC,gBAAgB,OAAO,IAAI;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA,qCAAqC,QAAQ,IAAI,UAAU;AAC3D;AACA;AACA;AACA,iBAAiB;AACjB,kBAAkB;AAClB;AACA;AACA,YAAY;AACZ,sBAAsB,kBAAkB;AACxC;AACA;AACA;;AAEA;AACA;AACA,CAAC;;AAED;AACA,gCAAgC;AAChC,+BAA+B;AAC/B,yCAAyC;AACzC;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,wCAAwC,cAAc;AACtD;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;;AAEO,cAAc;;AAOnB;;AAEF;AACA;AACA,6BAA6B;AAC7B;;;ACzVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE4C;AACiB;;AAE7D;;AAEO,MAAM,SAAI;AACjB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,UAAU,kCAAkC;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,qBAAqB;AACrB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS,SAAS;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,iBAAiB;AAC7C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,cAAc,IAAI;AAClB;AACA,gBAAgB,uBAAuB;AACvC;;AAEA;AACA;AACA;AACA,mBAAmB,GAAG,KAAK,MAAM,MAAM,IAAI;AAC3C,QAAQ;AACR,mBAAmB,GAAG,KAAK,IAAI;AAC/B;AACA,MAAM;AACN,iBAAiB,IAAI;AACrB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU,OAAO;;AAEjB;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,sBAAsB,QAAe;AACrC;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,qBAAqB,QAAe;AACpC;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,uBAAuB,IAAI,EAAE,KAAK;AAClC,yBAAyB,IAAI;;AAE7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,MAAM;AACN,gBAAgB,OAAO,GAAG,IAAI,EAAE,MAAM;AACtC;AACA;;AAEA;AACA,WAAW,WAAY;AACvB;AACA;;AAEA,YAAY,CAAC,SAAI;;;AC/QjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACiC;;AAE1B,MAAM,WAAK,SAAS,SAAI;AAC/B;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,oBAAoB,0BAA0B;AAC9C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC3DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,aAAa;;AAEzB,UAAU,QAAQ;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iBAAiB,mBAAO,CAAC,GAAU;;AAEnC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,mBAAmB;;AAEnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;;AAEA;;AAEA;AACA;AACA;AACA,+CAA+C,GAAG;AAClD;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,wBAAwB,eAAe;AACvC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA,YAAY,SAAS;AACrB;AACA;AACA;AACA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,UAAU;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,mBAAmB,YAAS;AAC5B;AACA;AACA,sBAAsB,YAAS;AAC/B;AACA;AACA,sBAAsB,YAAS;AAC/B;AACA;AACA,qBAAqB,YAAS;AAC9B;AACA;AACA,qBAAqB,YAAS;AAC9B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,YAAS;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,YAAS;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,SAAS,YAAS;AAClB;AACA;AACA;AACA;;;ACxcgC;AACL;AACA;AACA;AACD;;;ACJ1B;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,0BAA0B,kBAAkB;AAC5C,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAEM;AACP;AACA;AACA;AACA;;AAEO,MAAM,YAAO;AACpB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEO;AACP;AACA;AACA;;AAEA,UAAU,WAAW;AACrB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,gCAAgC,YAAO;AACvC;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,wBAAwB,aAAa;AACrC;AACA,8BAA8B,yBAAyB;AACvD;AACA;AACA;AACA,kBAAkB;AAClB,8BAA8B,yBAAyB;AACvD;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,2BAA2B,YAAO;AAClC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,wBAAwB,YAAO;AAC/B;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAY,WAAW;AACvB;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,UAAU;AACV;AACA,0BAA0B,qBAAqB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,iEAAiE;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,qBAAqB,+BAA+B;AACpD;AACA;AACA;AACA;;;ACljBO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEwC;AACD;;AAEhC,kBAAkB,OAAO;AAChC;AACA,wBAAwB,YAAY;AACpC,0BAA0B,IAAS;AACnC,2BAA2B,KAAU;AACrC,6BAA6B,OAAY;AACzC;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,UAAU,OAAO;;AAEjB;AACA,YAAY,UAAU;AACtB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACpF+B;;AAExB,kBAAkB,KAAK,GAAG;;;ACFwB;AAC5B;AACA;;;ACF7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEkC;AAC2B;;AAEtD;AACP;AACA,gBAAgB,SAAU;AAC1B,iBAAiB,WAAW;;AAE5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;;AAEA;AACA,uBAAuB,WAAW;;AAElC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,yBAAyB,IAAI;AAC7B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,uCAAuC;AACvC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,4BAA4B,SAAU;AACtC;AACA;;AAEA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,kBAAkB,SAAS;AAC3B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,sBAAsB,mBAAmB,OAAO,IAAI,SAAS;AAC1E;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,MAAM;AACN;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAY;;;AC1ZZ;AACA;AACA;AACA;AACA;AACA;AACA;AAC+C;;AAExC,qBAAqB,SAAS;AACrC;AACA,iBAAiB,eAAe;AAChC;AACA;AACA;AACA;;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACqC;;AAE9B,MAAM,gBAAK,SAAS,MAAM;AACjC;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAK;;;ACzBL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACqC;;AAE9B,sBAAsB,MAAM;AACnC;AACA;AACA;;AAEA;AACA;AACA,sCAAsC,qCAAqC;AAC3E;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACqC;;AAE9B,mBAAmB,MAAM;AAChC;AACA;AACA;;AAEA;AACA;;AAEA,yBAAyB;AACzB,sBAAsB;AACtB,yBAAyB;AACzB,yBAAyB;AACzB,uBAAuB;;AAEvB,wBAAwB;;AAExB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mBAAmB,WAAS;AAC5B;AACA;AACA;AACA;AACA;AACA,4BAA4B,qBAAqB;AACjD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAAS,WAAS;AAClB;AACA;AACA;AACA;;;AC5JA;AACA;AACA;AACA;AACA;AACA;AACA;AACqC;;AAE9B,mBAAmB,MAAM;AAChC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC5B2B;AACE;AACH;AACA;;;ACH1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACgD;;AAEA;AACI;AACM;AACN;;AAE7C;AACP,YAAY,8BAAoB;AAChC;AACA;AACA,YAAY,mCAAyB;AACrC;AACA;AACA,YAAY,sCAA4B;AACxC;AACA;;AAEA,YAAY,6BAAmB;AAC/B;AACA;AACA,YAAY,0CAAgC;AAC5C;AACA;AACA,YAAY,yCAA+B;AAC3C;AACA;;AAEA,YAAY,4BAAkB;AAC9B;AACA;AACA,YAAY,yCAA+B;AAC3C;AACA;AACA,YAAY,wCAA8B;AAC1C;AACA;;AAEA,YAAY,gCAAsB;AAClC;AACA;AACA,YAAY,qCAA2B;AACvC;AACA;AACA,YAAY,qCAA2B;AACvC;AACA;AACA,YAAY,wBAAc;AAC1B;AACA;AACA,YAAY,yBAAe;AAC3B;AACA;AACA,YAAY,iCAAuB;AACnC;AACA;AACA,YAAY,uBAAa;AACzB;AACA;AACA,YAAY,+BAAqB;AACjC;AACA;AACA,YAAY,yBAAe;AAC3B;AACA;;AAEA,YAAY,2BAAiB;AAC7B;AACA;AACA,YAAY,yBAAe;AAC3B;AACA;AACA,YAAY,0BAAgB;AAC5B;AACA;AACA,YAAY,+BAAqB;AACjC;AACA;AACA,YAAY,oCAA0B;AACtC;AACA;;AAEA,YAAY,2BAAiB;AAC7B;AACA;AACA,YAAY,gCAAsB;AAClC;AACA;AACA,YAAY,uCAA6B;AACzC;AACA;;AAEA,YAAY,0BAAgB;AAC5B;AACA;AACA,YAAY,yBAAe;AAC3B;AACA;AACA,YAAY,8BAAoB;AAChC;AACA;AACA,YAAY,sCAA4B;AACxC;AACA;AACA,YAAY,8BAAoB;AAChC;AACA;AACA,YAAY,sCAA4B;AACxC;AACA;AACA,YAAY,8BAAoB;AAChC;AACA;AACA,YAAY,sCAA4B;AACxC;AACA;;AAEA,YAAY,8BAAoB;AAChC;AACA;AACA,YAAY,sCAA4B;AACxC;AACA;AACA,YAAY,sCAA4B;AACxC;AACA;;AAEA;AACA;;AAEO;AACP;AACA,SAAS,gCAAsB;AAC/B;AACA,SAAS,wBAAc;AACvB;AACA,SAAS,yBAAe;AACxB;AACA,SAAS,iCAAuB;AAChC;AACA,SAAS,uBAAa;AACtB;AACA,SAAS,+BAAqB;AAC9B;AACA,SAAS,yBAAe;AACxB;AACA;AACA;;AAEO;AACP;;AAEO;AACP,oBAAoB,qBAAK;AACzB,mBAAmB,0BAAU;AAC7B,kBAAkB,uBAAO;AACzB,kBAAkB,uBAAO;AACzB,wBAAwB,uBAAO;;AAE/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;AC5MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEiD;AACD;AACD;AACW;;AAEnD,MAAM,aAAM,SAAS,SAAS;AACrC;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,qBAAqB,qBAAK;AAC1B,4BAA4B,0BAAU;AACtC;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,kDAAkD;;AAEhE;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA,YAAY,mBAA0B;AACtC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAM;;;ACtFsB;;;ACA5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA,UAAU,wCAAwC;;AAElD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA,WAAW;AACX;;AAEO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,WAAS;AACtB;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,WAAS;AACtB;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;;AAEA,SAAS,WAAS;AAClB;AACA;AACA;AACA,qBAAqB,+BAA+B;AACpD;AACA;AACA;AACA;;;AC3rBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA,oCAAoC;AACpC;AACA,CAAC;AACD;AACA;;AAEA;AACO,MAAM,kBAAa;AAC1B;AACA;AACA;AACA;AACA,gCAAgC,EAAE,OAAO;AACzC;AACA,MAAM;AACN;AACA;AACA,UAAU,UAAU;AACpB,IAAI;AACJ;AACA;AACA,IAAI;AACJ,CAAC;AACD;AACA;AACA;AACA;;AAEA;;AAEA;AACA,iCAAiC,SAAS;;AAE1C;AACA,IAAI;AACJ,CAAC;AACD;AACA;;AAEA;AACO;AACP;AACA;AACA;AACA,EAAE,MAAM,iBAAiB,MAAM;AAC/B,aAAa,IAAI,EAAE;AACnB,CAAC;AACD;AACA,IAAI;AACJ;AACA,EAAE,MAAM,iBAAiB,MAAM,KAAK,MAAM;AAC1C,aAAa,IAAI;AACjB,CAAC;AACD;AACA;AACA;;AAEA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,gBAAgB,WAAS;AACzB;AACA;AACA,MAAM;AACN;AACA;AACA,GAAG;AACH;;AAEA;AACA,EAAE,IAAI,YAAY,MAAM,KAAK,SAAS,GAAG,GAAG,KAAK,IAAI;AACrD;AACA;;AAEA;AACO;AACP;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,EAAE,IAAI,cAAc,MAAM,KAAK,UAAU,WAAW;AACpD;AACA;;AAEA;AACO;AACP;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,GAAG;;AAEH,kBAAkB,kBAAkB;AACpC;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,cAAc,KAAK;AACnB,gBAAgB,KAAK;AACrB,CAAC;AACD;AACA;;AAEA;AACO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA,KAAK,MAAM;AACX,cAAc,KAAK,GAAG,KAAK;AAC3B,CAAC;AACD;AACA;;AAEA;AACO;AACP;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,GAAG;;AAEH,kBAAkB,kBAAkB;AACpC;AACA;AACA;;AAEA,0BAA0B,IAAI;AAC9B;;AAEA;;AAEA;AACA;AACA,gBAAgB,KAAK;AACrB,CAAC;AACD;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,KAAK,KAAK;AAC1B;AACA,IAAI;AACJ;AACA,EAAE,MAAM,WAAW,MAAM;AACzB;AACA,CAAC;AACD;AACA;AACA;;AAEO;AACP,EAAE,MAAM;AACR,SAAS;AACT,CAAC;AACD;;AAEA,SAAS,WAAS;AAClB;AACA;AACA;AACA,qBAAqB,+BAA+B;AACpD;AACA;AACA;AACA;;;AC7RA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE8C;AACC;;AAExC,qBAAqB,SAAS;AACrC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA,uBAAuB,QAAa;AACpC;AACA;AACA,uBAAuB,QAAa;AACpC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;AACJ;;AAEpC,MAAM,SAAI,SAAS,MAAM;AAChC;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,OAAO;AACnB,YAAY,OAAO;AACnB,YAAY,OAAO;;AAEnB;AACA;AACA;AACA,oBAAoB,QAAc;;AAElC;AACA;AACA,sBAAsB,QAAc;AACpC;AACA,UAAU,WAAiB;AAC3B;AACA;AACA;;AAEA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAI;;;ACrFJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACiC;;AAE1B,qBAAqB,SAAI;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,YAAY,kBAAkB;;AAE9B;AACA;;AAEA;AACA;AACA,cAAc,MAAM;AACpB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY,6CAA6C;;AAEzD;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP,MAAM;AACN;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;;AAEA;AACA,YAAY,gCAAgC;AAC5C;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,sBAAsB;AACjC;AACA;;AAEA;AACA;AACA;AACA;;;ACnJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;AACV;;AAE9B,qBAAqB,MAAM;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,kBAAkB;;AAElB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB;AACA,YAAY,WAAW;AACvB,YAAY,QAAQ;;AAEpB,8BAA8B,wBAAwB;;AAEtD;AACA;;AAEA;AACA,YAAY,OAAO;AACnB,WAAW,aAAmB;;AAE9B,YAAY,QAAQ;AACpB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,YAAY,OAAO;AACnB,YAAY,cAAc;AAC1B;;AAEA;;AAEA;AACA;AACA,qBAAqB,aAAmB;;AAExC;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;;AAEA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;;AChOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACoC;;AAE7B,uBAAuB,MAAM;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU,QAAQ;AAClB,YAAY,WAAW;AACvB;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP,MAAM;AACN;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;ACtFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;AACV;;AAE9B,qBAAqB,MAAM;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,QAAQ;AACpB,YAAY,SAAS;AACrB,YAAY,UAAU;AACtB;AACA;AACA,YAAY,WAAW;AACvB,YAAY,QAAQ;;AAEpB,8BAA8B,gCAAgC;;AAE9D;AACA;;AAEA;AACA,YAAY,OAAO;AACnB,WAAW,aAAmB;;AAE9B,YAAY,QAAQ;AACpB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,YAAY,OAAO;AACnB,YAAY,cAAc;AAC1B;AACA;;AAEA;;AAEA;AACA;AACA,qBAAqB,aAAmB;;AAExC;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;;AC7PA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEqC;;AAE9B,mBAAmB,MAAM;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU,QAAQ;AAClB,UAAU,SAAS;;AAEnB,YAAY,YAAY;AACxB,YAAY,YAAY;;AAExB;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,MAAM;AACN;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;AC9GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;AACV;;AAE9B,oBAAoB,MAAM;AACjC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,QAAQ;AACpB,YAAY,SAAS;AACrB,YAAY,QAAQ;AACpB;AACA;AACA;AACA,YAAY,WAAW;AACvB,YAAY,QAAQ;;AAEpB,8BAA8B,uCAAuC;;AAErE;AACA;;AAEA;AACA,YAAY,OAAO;AACnB,WAAW,aAAmB;;AAE9B,YAAY,QAAQ;AACpB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;;AAEA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,YAAY,OAAO;AACnB,YAAY,cAAc;AAC1B;AACA;AACA;;AAEA;;AAEA;AACA;AACA,qBAAqB,aAAmB;;AAExC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;;AC1QA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACmC;;AAE5B,qBAAqB,KAAK;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU,QAAQ;AAClB,UAAU,SAAS;AACnB,UAAU,QAAQ;;AAElB,YAAY,YAAY;AACxB,YAAY,YAAY;AACxB,YAAY,YAAY;;AAExB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;AC3IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACoD;;AAE7C;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO;AACP,gBAAgB,uBAAO;AACvB;AACA;AACA;AACA;AACA,CAAC;;AAEM;AACP;AACA;AACA;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,CAAC;;;ACvED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;AACJ;;AAEpC,oBAAoB,MAAM;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,OAAO;;AAEnB;AACA,YAAY,eAAe;AAC3B;;AAEA;AACA;AACA;AACA;;AAEA,IAAI,YAAkB;AACtB,IAAI,SAAe;;AAEnB;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;;AC7I2B;AACG;AACF;AACF;AACC;AACC;AACD;;;ACN3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO;;AAEA;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV;AACA;AACA,sCAAsC,IAAI;AAC1C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC5EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;AACJ;AACI;;AAExC,mBAAmB,SAAS;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,SAAS;AACrB;AACA;;AAEA;AACA,YAAY,aAAa;;AAEzB;AACA,YAAY,eAAe;;AAE3B;AACA;;AAEA;AACA;;AAEA;AACA,YAAY,gBAAgB;AAC5B;AACA;AACA;AACA;;AAEA;AACA,qBAAqB,KAAS;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,YAAY,eAAe;;AAE3B;;AAEA;AACA;;AAEA,IAAI,YAAkB;AACtB,IAAI,YAAkB;AACtB;AACA;;AAEA,WAAW,SAAe;AAC1B;AACA;AACA;;;ACxLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;AACJ;AACI;;AAExC,mBAAmB,SAAS;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,YAAY,8BAA8B;;AAE1C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ,wCAAwC;AAChD,QAAQ,wCAAwC;AAChD,QAAQ,iCAAiC;AACzC;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,8BAA8B;;AAE1C;AACA,YAAY,mCAAmC;;AAE/C;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB,WAAiB;AACpC;;AAEA,iBAAiB,KAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA,iBAAiB,KAAS,gCAAgC;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,cAAc,wBAAwB;AACtC;AACA;AACA;AACA;AACA;;;ACrMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;AACJ;AACI;;AAExC,mBAAmB,SAAS;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,uBAAuB,KAAS;;AAEhC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA,eAAe;AACf;;AAEA;AACA,YAAY,8BAA8B;AAC1C;;AAEA;AACA,UAAU,eAAe;;AAEzB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc,oDAAoD;;AAElE;AACA;AACA;AACA,MAAM,YAAkB;AACxB,MAAM,YAAkB;AACxB;AACA;;AAEA;AACA,MAAM,SAAe;;AAErB;AACA;AACA;AACA;AACA,MAAM,YAAkB;;AAExB;AACA;AACA;AACA;;AAEA;AACA,UAAU,eAAe;AACzB;AACA;;AAEA;AACA,YAAY,eAAe;;AAE3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACzOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE2C;AACI;;AAExC,mBAAmB,SAAS;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ,wCAAwC;AAChD,QAAQ,wCAAwC;AAChD;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,aAAa;;AAEzB;AACA,YAAY,0BAA0B;AACtC;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,qBAAqB,KAAS;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACtMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE2C;AACI;;AAExC,oBAAoB,SAAS;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,YAAY,8BAA8B;;AAE1C;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ,wCAAwC;AAChD,QAAQ,wCAAwC;AAChD,QAAQ,oCAAoC;AAC5C;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,YAAY,8BAA8B;;AAE1C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,YAAY,QAAQ;AACpB,YAAY,OAAO;AACnB,YAAY,UAAU;;AAEtB;AACA,qBAAqB,KAAS;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC7IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;AACJ;AACI;;AAExC,oBAAoB,SAAS;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,YAAY,8BAA8B;;AAE1C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ,wCAAwC;AAChD,QAAQ,wCAAwC;AAChD,QAAQ,iCAAiC;AACzC;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,UAAU,OAAO;AACjB,UAAU,SAAS;AACnB,UAAU,OAAO;;AAEjB;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,8BAA8B;;AAE1C;AACA,OAAO,mCAAmC;;AAE1C;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB,WAAiB;AACpC;;AAEA,iBAAiB,KAAS;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA,iBAAiB,KAAS,kBAAkB;;AAE5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,cAAc,wBAAwB;AACtC;AACA;AACA;AACA;AACA;;;AC/MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE2C;AACK;AACD;;AAExC,sBAAsB,SAAS;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,YAAY,8BAA8B;;AAE1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ,wCAAwC;AAChD,QAAQ,wCAAwC;AAChD,QAAQ,iCAAiC;AACzC;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,qBAAK;;AAEhC;AACA;AACA,YAAY,8BAA8B;;AAE1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,YAAY,oBAAoB;AAChC,mBAAmB,KAAS;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA,iBAAiB,KAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,+BAA+B;;AAE7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACxSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE2C;AACI;;AAExC,oBAAoB,SAAS;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ,wCAAwC;AAChD,QAAQ,wCAAwC;AAChD;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,qBAAqB,KAAS;;AAE9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,YAAY,eAAe;;AAE3B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,YAAY,UAAU;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACxJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE2C;AACI;;AAExC,qBAAqB,SAAS;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ,wCAAwC;AAChD,QAAQ,wCAAwC;AAChD;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,aAAa;;AAEzB;AACA,YAAY,0BAA0B;AACtC;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,YAAY,oBAAoB;AAChC;AACA;AACA;AACA;;AAEA;AACA,qBAAqB,KAAS;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC7M0B;AACA;AACA;AACA;AACC;AACA;AACE;AACF;AACC;;;ACR5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACyC;;AAElC,mBAAmB,KAAK;AAC/B;AACA;AACA,oBAAoB;AACpB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,YAAY,8BAA8B;;AAE1C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,YAAY,KAAK;;AAEjB;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC+C;;AAExC,MAAM,OAAG,SAAS,SAAS;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,QAAQ,+BAA+B;AACvC,QAAQ,mCAAmC;AAC3C;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,8CAA8C,+BAA+B;AAC7E;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,KAAK;;AAEjB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,oCAAoC,GAAG,MAAM,IAAI;AACjD;AACA,WAAW,kCAAkC,MAAM,GAAG,MAAM;AAC5D;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,+BAA+B,yBAAyB;;AAExD,qCAAqC,0BAA0B;AAC/D;AACA;AACA;AACA;AACA,2BAA2B,WAAW;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAG;;;AC1SuB;AACD;;;ACDzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;;AAEmB;AACvB;AACF;;AAElC,mBAAmB,KAAK;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU,6BAA6B;;AAEvC;AACA,YAAY,4CAA4C;;AAExD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,qBAAqB,6BAAa;AAClC,qBAAqB,6BAAa;AAClC,gBAAgB,yBAAS;;AAEzB;AACA,IAAI,0BAA0B;;AAE9B;AACA;AACA;AACA;;AAEA;AACA,YAAY,QAAQ;AACpB,YAAY,SAAS;AACrB,YAAY,QAAQ;AACpB;AACA;AACA;AACA,YAAY,WAAW;AACvB,YAAY,QAAQ;;AAEpB,8BAA8B,uCAAuC;;AAErE;AACA;;AAEA;AACA,YAAY,OAAO;AACnB,WAAW,aAAmB;;AAE9B,YAAY,QAAQ;AACpB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,YAAY,QAAQ;AACpB,YAAY,OAAO;AACnB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACnJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACwC;;AAEjC,uBAAuB,MAAM;AACpC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,iCAAiC,wCAAwC;AACzE;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;;AC9EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEkE;AACf;;AAE5C,qBAAqB,QAAQ;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,+BAA+B,qCAAqC;;AAEpE;AACA,UAAU,6BAA6B;;AAEvC;AACA,YAAY,4CAA4C;;AAExD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,gBAAgB,6BAAa;AAC7B,gBAAgB,6BAAa;AAC7B,WAAW,yBAAS;;AAEpB;AACA;AACA,YAAY,8BAA8B;;AAE1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,YAAY,QAAQ;AACpB,YAAY,OAAO;AACnB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,YAAY,OAAO;;AAEnB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,qBAAqB;;AAEjC;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA,cAAc,SAAS;;AAEvB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACpMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE2C;;AAEI;;AAExC,oBAAoB,SAAS;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,QAAQ,iCAAiC;AACzC,QAAQ,wCAAwC;AAChD,QAAQ,wCAAwC;AAChD;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,qBAAqB,KAAS;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAY,OAAO;AACnB,YAAY,UAAU;AACtB,YAAY,SAAS;AACrB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;ACjKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;AACN;;AAElC,uBAAuB,QAAQ;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ,uDAAuD;AAC/D;;AAEA;AACA,YAAY,oBAAoB;AAChC,YAAY,SAAS;;AAErB;AACA,YAAY,4CAA4C;;AAExD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,oBAAoB,qBAAqB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,IAAI;AACxB;AACA,oBAAoB,cAAoB;AACxC;AACA,qBAAqB,cAAoB;AACzC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,qBAAqB,QAAc;AACnC;AACA;;AAEA;AACA;AACA,sBAAsB,WAAiB;AACvC;;AAEA;AACA;AACA,sBAAsB,SAAe;AACrC;AACA;AACA,sBAAsB,cAAoB;AAC1C;AACA;AACA;AACA,sBAAsB,WAAiB;AACvC;AACA;;AAEA;AACA;AACA;;AAEA;AACA,sBAAsB,SAAe;AACrC;AACA,MAAM;AACN;AACA,sBAAsB,cAAoB;AAC1C;AACA;AACA;;AAEA;AACA,mBAAmB,cAAoB;AACvC;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC5WA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACmD;;AAE5C,qBAAqB,QAAQ;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,iCAAiC,sCAAsC;AACvE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC5C0B;AACE;AACD;AACC;;;ACH5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC2C;;AAEpC,oBAAoB,MAAM;AACjC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,YAAY,+CAA+C;;AAE3D;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC2C;;AAEpC,kBAAkB,MAAM;AAC/B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,oBAAoB;;AAEhC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;ACpE2B;AACF;;;ACDzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC2C;;AAEpC,wBAAwB,MAAM;AACrC;AACA;AACA;;AAEA;AACA;AACA,mBAAmB,gBAAS;AAC5B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,mBAAmB,gBAAS;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAAS,gBAAS;AAClB;AACA;AACA;AACA;;;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEiD;AACN;;AAEpC,yBAAyB,SAAS;AACzC;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,4BAA4B,iBAAwB;AACpD;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC7DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC2C;;AAEpC,yBAAyB,SAAS;AACzC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC2C;;AAEpC,qBAAqB,SAAS;AACrC;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ,uDAAuD;AAC/D;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC2C;;AAEpC,uBAAuB,SAAS;AACvC;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ,uDAAuD;AAC/D;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC2C;;AAEpC,oBAAoB,SAAS;AACpC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,UAAU,aAAa;;AAEvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;AACJ;;AAEpC,mBAAmB,MAAM;AAChC;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ,uDAAuD;AAC/D;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAc;AAC7B;AACA;AACA;AACA;AACA;AACA,kDAAkD,mBAAmB;AACrE,QAAQ;AACR;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA,mBAAmB,WAAS;AAC5B;AACA;AACA;AACA;AACA;;AAEA,SAAS,WAAS;AAClB;AACA;AACA;AACA;;;ACpE+B;AACC;AACA;AACJ;AACE;AACH;AACD;;;ACN1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACyC;;AAElC,oBAAoB,QAAQ;AACnC;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,uBAAuB;AACvB;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACyC;;AAElC,mBAAmB,QAAQ;AAClC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,sBAAsB,kBAAkB;AACxC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;AC1FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;AACN;;AAEzC;AACA;AACA;AACA;AACA;AACA;;AAEO,mBAAmB,QAAQ;AAClC;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY,sBAAsB;;AAElC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA,oBAAoB,mBAAmB;AACvC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,YAAY,QAAQ;AACpB,UAAU,OAAO;AACjB,UAAU,UAAU;;AAEpB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,sBAAsB,WAAiB;AACvC,sBAAsB,WAAiB;AACvC,sBAAsB,UAAgB;AACtC;AACA,mBAAmB,iBAAuB;;AAE1C;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACxKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;AACN;;AAElC,mBAAmB,QAAQ;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,oCAAoC;;AAEhD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB,qBAAqB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,oBAAoB,IAAI;AACxB;AACA,oBAAoB,cAAoB;AACxC,mBAAmB,cAAoB;AACvC;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN,oBAAoB,QAAc;AAClC,mBAAmB,QAAc;AACjC;;AAEA;AACA;AACA,oBAAoB,cAAoB;AACxC,mBAAmB,cAAoB;AACvC;;AAEA;AACA;;AAEA;AACA;AACA,gBAAgB,sBAAsB;AACtC;AACA,yBAAyB,IAAI;;AAE7B;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC9RA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACsC;;AAE/B,mBAAmB,QAAQ;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,YAAY,6BAA6B;;AAEzC;AACA;AACA,YAAY,8BAA8B;;AAE1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,uBAAuB;;AAEnC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACrHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC+C;;AAExC,uBAAuB,SAAS;AACvC;AACA;AACA,oBAAoB;AACpB;;AAEA;AACA;AACA,4BAA4B;AAC5B;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,+BAA+B,wCAAwC;;AAEvE;AACA;AACA;;AAEA;AACA,YAAY,uBAAuB;;AAEnC;AACA;AACA;;AAEA;AACA,YAAY,8BAA8B;;AAE1C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,8BAA8B;AAC1C;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;AC1IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACyC;;AAElC,qBAAqB,QAAQ;AACpC;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACpGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;AACN;;AAElC,sBAAsB,QAAQ;AACrC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,QAAQ;AACpB;AACA,8BAA8B,WAAiB;AAC/C;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACyC;;AAElC,qBAAqB,QAAQ;AACpC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,YAAY,OAAO;AACnB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,kBAAkB,kBAAkB;AACpC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA,wBAAwB,QAAQ;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;AC5HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;AACN;;AAEzC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO,oBAAoB,QAAQ;AACnC;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,QAAQ;AACpB,YAAY,OAAO;AACnB,YAAY,UAAU;AACtB,YAAY,SAAS;AACrB,YAAY,SAAS;;AAErB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;;AAEA;AACA,oBAAoB,mBAAmB;AACvC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAY,QAAQ;AACpB,UAAU,OAAO;AACjB,UAAU,UAAU;AACpB,YAAY,SAAS;;AAErB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,sBAAsB,WAAiB;AACvC,sBAAsB,WAAiB;AACvC,sBAAsB,UAAgB;AACtC;AACA,mBAAmB,iBAAuB;;AAE1C;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACrLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACyC;;AAElC,oBAAoB,QAAQ;AACnC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;AC1GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;AACN;;AAElC,wBAAwB,QAAQ;AACvC;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU,oCAAoC;;AAE9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN,oBAAoB,QAAc;AAClC,mBAAmB,QAAc;AACjC;;AAEA;AACA;AACA;;AAEA;AACA;AACA,oBAAoB,qBAAqB;AACzC;AACA,8BAA8B,IAAI,EAAE,KAAK;;AAEzC;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC7KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;AACN;;AAEzC;AACA;AACA;AACA;AACA;AACA;;AAEO,wBAAwB,QAAQ;AACvC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,oBAAoB,QAAQ;AAC5B;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,QAAQ;AACpB;AACA,sBAAsB,iBAAuB;AAC7C;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC/F2B;AACD;AACA;AACA;AACA;AACI;AACA;AACF;AACC;AACD;AACD;AACA;AACI;AACA;;;ACb/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC2C;;AAEpC,yBAAyB,MAAM;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,YAAY,UAAU;AACtB,YAAY,QAAQ;AACpB;;AAEA,sFAAsF;;AAEtF,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,wCAAwC;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,+BAA+B;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,6DAA6D,kBAAkB,GAAG;AAClF;AACA,UAAU,mBAAmB;AAC7B,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;;AAEN,UAAU,cAAc;;AAExB;AACA;AACA,SAAS,QAAQ;AACjB;AACA;AACA,SAAS,OAAO;AAChB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,qBAAqB,wBAAwB;AAC7C;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,4BAA4B,uBAAuB;AACnD;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,cAAc,UAAU;;AAExB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACxQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC6C;;AAEtC,mBAAmB,UAAU;AACpC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mBAAmB,WAAS;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAAS,WAAS;AAClB;AACA;AACA;AACA;;;ACjDO,SAAS,UAAK;AACrB;AACA;;AAEO;AACP,8BAA8B,UAAK;AACnC;;AAEO;AACP;AACA;;AAEO;AACP;AACA;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE8C;AACC;;AAE/C;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;;AAEO,oBAAoB,SAAS;AACpC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ,mDAAmD;AAC3D;;AAEA,YAAY,SAAS;AACrB,YAAY,OAAO;;AAEnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA,kBAAkB,OAAO;AACzB;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,mBAAmB;AACzC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,yDAAyD;AACzD,wDAAwD;AACxD;AACA,QAAQ;AACR;AACA;AACA,mBAAmB;AACnB,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,oBAAoB;AACpB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,mBAAmB,sBAAsB,WAAW,QAAQ,WAAW,EAAE;AACzE;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,uBAAuB,sBAAsB;AAC7C;AACA,WAAW,mBAAmB,EAAE;AAChC;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,UAAU,mBAAmB;AAC7B,YAAY,aAAa;AACzB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAY,UAAU;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mBAAmB,UAAU;AAC7B;AACA;AACA,mBAAmB,MAAW;AAC9B;AACA;AACA,mBAAmB,MAAW;AAC9B;AACA;AACA,mBAAmB,IAAS;AAC5B;AACA,mBAAmB,MAAW;AAC9B;AACA,OAAO;;AAEP;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,sBAAsB,yCAAyC,IAAI;AAClF;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;ACrcA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACmC;;AAE5B,mBAAmB,KAAK;AAC/B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,cAAc,UAAU;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,cAAc,yCAAyC;;AAEvD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,QAAQ;AACR;AACA;;AAEA;AACA,KAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC1FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC2C;;AAEpC,sBAAsB,MAAM;AACnC;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB,QAAQ;AACxB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,0BAA0B,iBAAiB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,QAAQ;AACR;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA,iCAAiC;;AAEjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACnVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;AACF;;AAEtC,qBAAqB,UAAU;AACtC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,QAAc;AAC3B;AACA;AACA;AACA;AACA;AACA,gDAAgD,mBAAmB;AACnE,MAAM;AACN;AACA;AACA;;AAEA,mBAAmB,aAAS;AAC5B;AACA;AACA;AACA;AACA;;AAEA,SAAS,aAAS;AAClB;AACA;AACA;AACA;;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC2C;;AAEpC,oBAAoB,MAAM;AACjC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,sBAAsB;AACjC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACzFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACmC;;AAE5B,mBAAmB,KAAK;AAC/B;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;;AAEL;AACA;AACA;AACA,UAAU,WAAS;;AAEnB;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,YAAY,gEAAgE;AAC5E;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,yCAAyC,iCAAiC;AAC1E;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,KAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAAS,WAAS;AAClB;AACA;AACA;AACA,qBAAqB,+BAA+B;AACpD;AACA;AACA;AACA;;;ACpJ0B;AACA;AACG;AACD;AACD;AACD;;;ACL1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC2C;;AAEpC,kBAAkB,MAAM;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA,YAAY,6BAA6B;;AAEzC,YAAY,+BAA+B;;AAE3C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,OAAO,sBAAsB;AAC7B;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mBAAmB,UAAS;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,qBAAqB;AACjD,MAAM;AACN,4BAA4B,qBAAqB;AACjD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAAS,UAAS;AAClB;AACA;AACA;AACA;;;ACnRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC+C;;AAExC,sBAAsB,SAAS;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,YAAY,QAAQ;AACpB,YAAY,SAAS;;AAErB;AACA;;AAEA;AACA;AACA,+BAA+B,wCAAwC;;AAEvE;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,QAAQ;;AAEpB;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC9GyB;AACI;;;ACD7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEsD;;AAE/C,mBAAmB,SAAS;AACnC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEiD;AAChB;;AAE1B,wBAAwB,IAAI;AACnC;AACA;AACA;;AAEA;AACA;;AAEA,sBAAsB;;AAEtB;AACA,oBAAoB,iBAAwB;AAC5C;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAY,IAAI;AAChB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC1FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACiC;;AAE1B,yBAAyB,IAAI;AACpC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,YAAY,IAAI;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACzFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;AACE;;AAEG;AACnB;;AAE1B,oBAAoB,IAAI;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,iBAAwB;;AAE5C;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAY,IAAI;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,yBAAyB,YAAkB;;AAE3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,eAAe,uBAAO;AACtB;AACA;AACA;;;ACxJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;AACE;;AAEG;AACnB;;AAE1B,wBAAwB,IAAI;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,iBAAwB;;AAE5C;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAY,IAAI;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,yBAAyB,YAAkB;AAC3C,yBAAyB,YAAkB;;AAE3C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,iDAAiD;AACjD;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,eAAe,uBAAO;AACtB;AACA;AACA;;;AC3KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;AACE;;AAEhB;;AAE1B,4BAA4B,IAAI;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,4BAA4B,iBAAwB;AACpD;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAY,IAAI;AAChB;AACA;AACA;AACA;AACA;;AAEA;AACA,yBAAyB,YAAkB;;AAE3C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACrHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;;AAEd;;AAE1B,6BAA6B,IAAI;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,YAAY,IAAI;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,yBAAyB,YAAkB;;AAE3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AClH0B;AACK;AACC;AACL;AACI;AACI;AACC;;;ACNpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC+C;;AAExC,qBAAqB,SAAS;AACrC;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,YAAY,iBAAiB;AAC7B;AACA;AACA;;AAEA;AACA;AACA,QAAQ,uDAAuD;AAC/D;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,8BAA8B,SAAS,qBAAqB;AAC5D;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY,OAAO;;AAEnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AC3I4B;;;ACA5B;AACoD;AAClB;AAC4C;AAW9D;AACsB;AACe;AACjB;AAQf;AAgBD;AACiD;AAChC;AASrB;;AAEkB;;AAE3B,MAAM,eAAO;AACpB,QAAQ,IAAI;AACZ,QAAQ,IAAI;AACZ,QAAQ,IAAI;AACZ,QAAQ,IAAI;AACZ,SAAS,KAAK;AACd,SAAS,KAAK;AACd,WAAW,OAAO;AAClB,SAAS,KAAK;AACd,UAAU,MAAM;;AAEhB,QAAQ,IAAI;AACZ,aAAa,SAAS;AACtB,cAAc,UAAU;AACxB,SAAS,KAAK;AACd,aAAa,SAAS;AACtB,iBAAiB,aAAa;AAC9B,kBAAkB,cAAc;;AAEhC,aAAa,UAAU;AACvB,cAAc,UAAU;AACxB,UAAU,MAAM;AAChB,YAAY,QAAQ;AACpB,SAAS,KAAK;AACd,QAAQ,IAAI;;AAEZ,SAAS,MAAM;AACf,YAAY,QAAQ;AACpB,UAAU,MAAM;AAChB,QAAQ,IAAI;AACZ,SAAS,KAAK;AACd,UAAU,MAAM;AAChB,SAAS,KAAK;;AAEd,QAAQ,IAAI;AACZ,OAAO,OAAG;;AAEV,QAAQ,IAAI;AACZ,UAAU,MAAM;AAChB,SAAS,KAAK;AACd,UAAU,MAAM;;AAEhB,SAAS,KAAK;AACd,QAAQ,IAAI;AACZ,QAAQ,IAAI;AACZ,QAAQ,IAAI;AACZ,QAAQ,IAAI;AACZ,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,UAAU,MAAM;AAChB,WAAW,OAAO;AAClB,UAAU,MAAM;AAChB,SAAS,KAAK;AACd,SAAS,KAAK;AACd,aAAa,SAAS;AACtB,aAAa,SAAS;;AAEtB,SAAS,gBAAK;AACd,WAAW,OAAO;AAClB,QAAQ,IAAI;AACZ,QAAQ,IAAI;;AAEZ,UAAU,MAAM;;AAEhB,UAAU,aAAM;;AAEhB,OAAO,GAAG;AACV,WAAW,OAAO;;AAElB,SAAS,KAAK;AACd,OAAO,GAAG;;AAEV,QAAQ,IAAI;AACZ,QAAQ,IAAI;AACZ,WAAW,OAAO;AAClB,UAAU,MAAM;AAChB,SAAS,KAAK;AACd,QAAQ,IAAI;AACZ;;;ACtIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE4C;AACJ;;AAgBR;AACgB;AACI;AACA;AACM;AACN;AACA;AACA;;AAEpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB,OAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,sBAAsB,kBAAkB;AACxC;AACA;AACA;AACA;;AAEA,kBAAkB,WAAK;;AAEvB;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,kBAAkB,WAAK;;AAEvB;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,eAAe,cAAoB;AACnC,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,mBAAmB,uBAAO;AAC1B,OAAO;AACP;AACA;AACA;AACA;;AAEA,6BAA6B,uBAAO;AACpC;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,WAAK;AACtB,YAAY,WAAW;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,mBAAmB,uBAAO;AAC1B,OAAO;AACP;AACA;AACA;AACA;;AAEA,6BAA6B,uBAAO;AACpC;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,WAAK;AACtB,YAAY,WAAW;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,mBAAmB,uBAAO;AAC1B,OAAO;AACP;AACA;AACA;AACA;;AAEA,6BAA6B,uBAAO;AACpC;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,WAAK;AACtB,YAAY,WAAW;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA,sBAAsB,uBAAO;AAC7B;AACA;AACA,OAAO;AACP;AACA,6BAA6B,uBAAO;AACpC;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA,sBAAsB,uBAAO;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,6BAA6B,uBAAO;AACpC;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,WAAK;;AAEtB;AACA;AACA;AACA,OAAO;AACP;AACA,mBAAmB,0BAAU;AAC7B,OAAO;AACP;AACA,6BAA6B,0BAAU;AACvC;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,UAAU,gCAAgB;AAC1B;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA,mBAAmB,qBAAK;AACxB,OAAO;AACP;AACA;AACA,sBAAsB,qBAAK;AAC3B,UAAU;AACV,sBAAsB,qBAAK;AAC3B;;AAEA,6BAA6B,qBAAK;AAClC;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,uBAAuB,WAAK,SAAS,WAAK;AAC1C,sBAAsB,WAAK,SAAS,WAAK;;AAEzC;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,WAAK,SAAS,WAAK;AAC1C,sBAAsB,WAAK,SAAS,WAAK;;AAEzC;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;AACA;AACA;AACA,GAAG;;AAEH;AACA,wBAAwB,WAAK,OAAO,WAAK;;AAEzC;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,WAAW,WAAK;AAChB,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,eAAe,6BAAa;AAC5B,4BAA4B,0CAA0B;AACtD,2BAA2B,yCAAyB;AACpD,cAAc,4BAAY;AAC1B,2BAA2B,yCAAyB;AACpD,0BAA0B,wCAAwB;AAClD;;AAEA,WAAW,WAAK;AAChB,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,oBAAoB,gCAAgB;AACpC,YAAY,wBAAQ;AACpB,aAAa,yBAAS;AACtB,qBAAqB,iCAAiB;AACtC,WAAW,uBAAO;AAClB,mBAAmB,+BAAe;AAClC,aAAa,yBAAS;AACtB;;AAEA,WAAW,WAAK;AAChB,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,WAAW,WAAK;AAChB,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,WAAW,WAAK;AAChB,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,WAAW,WAAK;AAChB,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,WAAW,WAAK;AAChB,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,WAAW,WAAK;AAChB,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,WAAW,WAAK;AAChB,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,WAAW,WAAK;AAChB,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,WAAW,WAAK;AAChB,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,WAAW,WAAK;AAChB,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,WAAW,WAAK;AAChB,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,WAAW,WAAK;AAChB,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,WAAW,WAAK;AAChB,GAAG;;AAEH;AACA;AACA;AACA;AACA,kBAAkB,WAAe;AACjC;AACA;AACA;AACA,wBAAwB,WAAK,OAAO,WAAK;;AAEzC;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA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AC1B,UAAU,kBAAY;AACtB,WAAW,kBAAY;AACvB,YAAY,kBAAY;AACxB,UAAU,gBAAU;AACpB,cAAc,gBAAU;AACxB,GAAG;AACH;AACA,WAAW,kBAAY;AACvB,UAAU,kBAAY;AACtB,WAAW,kBAAY;AACvB,UAAU,kBAAY;AACtB,QAAQ,kBAAY;AACpB,cAAc,gBAAU;AACxB,UAAU,gBAAU;AACpB,GAAG;AACH;AACA,SAAS,oBAAc,CAAC,qBAAe;AACvC,UAAU,oBAAc,CAAC,kBAAY;AACrC,UAAU,kBAAY;AACtB,WAAW,kBAAY;AACvB,GAAG;AACH;;;AC5cA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AChMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE4C;AACE;;AAEU;AACJ;AACA;AACpD;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,kDAAkD;;AAEhE;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;;AAEA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,oBAAoB;AAC3C;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA,sBAAsB,uBAAO;;AAE7B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,oBAAoB,IAAW;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,MAAM;;AAEpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,WAAW;AACpC,iBAAiB,cAAS;AAC1B;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,WAAW;AACpC,iBAAiB,cAAS;AAC1B;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,gBAAgB,WAAiB;AACjC;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,gBAAgB,WAAiB;AACjC;AACA,gBAAgB,WAAiB;AACjC;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA,kBAAkB;;AAElB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA,kBAAkB;;AAElB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,iBAAiB,8BAAc;AAC/B;AACA;;AAEA;AACA,WAAW,UAAU;AACrB,WAAW,WAAW;AACtB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,QAAQ;AACnB;;AAEA;AACA,gBAAgB,UAAU;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,sBAAsB,uBAAO;AAC7B,yBAAyB,uBAAO;;AAEhC;AACA;AACA;AACA;AACA;;AAEA;;AAEA,gBAAgB,QAAQ;AACxB,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;AACL,GAAG;AACH;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAAS,cAAS;AAClB;AACA;AACA;AACA;;;ACnrB6B;AACF;AACC;AACC;;;ACH7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,mDAAmD,KAAK;AACxD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AC5CiC;;AAE0B;AAC5B;AACxB,MAAM,gBAAK,GAAG,gCAAK;;;ACJ1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEsD;AACqB;AAC9B;AACmB;AACa;;AAE7E;AACA;AACA;AACA,sBAAsB,wBAAQ;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACO,oBAAoB,UAAU;AACrC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,uBAAuB,qBAAU;AACjC;;AAEA;AACA;;AAEA,uBAAuB,iCAAiB;AACxC,sBAAsB,iCAAiB;AACvC;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY,WAAW;;AAEvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;AChJA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE4C;AACE;;AAE9C;AACA;AACA;AACO,MAAM,aAAM,SAAS,UAAU;AACtC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,WAAiB;AAC5B;AACA;;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEgD;AACC;;AAEO;AACJ;;AAEpD;AACA;;AAEA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,6BAAmB;AAC7B;AACA;AACA;AACA;AACA;AACA,UAAU,6BAAmB;AAC7B;AACA;AACA;AACA;AACA;AACA,UAAU,yBAAe;;AAEzB,qBAAqB,SAAgB;AACrC,qBAAqB,SAAgB;AACrC,gBAAgB,SAAgB;AAChC,gBAAgB,mBAA0B;;AAE1C;AACA;;AAEA;AACA,YAAY,KAAK;AACjB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,+BAAqB;AAC3B,MAAM,oCAA0B;AAChC,MAAM,yBAAe;AACrB,MAAM,0BAAgB;AACtB;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,6BAA6B,uBAAO;AACpC;AACA,MAAM,yBAAe;AACrB,MAAM,mCAAyB;AAC/B,MAAM,mCAAyB;AAC/B;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,8BAA8B,yBAAe;AAC7C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB,uBAAO;AAC1B,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA,YAAY,KAAK;AACjB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;AChKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE4C;AACA;;AAEP;AACkB;AACH;;AAEpD;AACA;AACA;AACA;AACA;AACA;AACA;AACO,yBAAyB,aAAM;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,SAAe;AACnC;AACA;AACA,MAAM;AACN;AACA,oBAAoB,WAAiB;AACrC;AACA;;AAEA;AACA,8BAA8B,KAAK;AACnC;AACA;AACA;AACA,QAAQ,WAAiB;AACzB;AACA;AACA;AACA;;AAEA;AACA;AACA,uBAAuB,WAAW;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,qBAAqB,uBAAuB,uBAAO,IAAI;AACvD,sBAAsB,8BAA8B;AACpD,uBAAuB,+BAA+B;AACtD,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,YAAY,gBAAgB;AAC5B,YAAY,OAAO;;AAEnB;;AAEA;AACA,WAAW,UAAgB;;AAE3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;ACvKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE4C;AACC;;AAE7C;AACA;AACA;AACO,2BAA2B,UAAU;AAC5C;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,YAAY,WAAW;AACvB;AACA;AACA;;AAEA,YAAY,2BAA2B;AACvC;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,gBAAgB;AAC5B,YAAY,OAAO;;AAEnB;;AAEA;AACA,WAAW,UAAgB;;AAE3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;ACnGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEkE;;AAE3D,uBAAuB,8BAAc;AAC5C;AACA;AACA,QAAQ,8BAAc;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,oBAAoB,iBAAiB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY,QAAQ;;AAEpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEyC;AACW;;AAEpD;AACO,2BAA2B,QAAQ;AAC1C;AACA,4BAA4B,uBAAO;AACnC,kCAAkC,uBAAO;AACzC,uBAAuB,uBAAO;;AAE9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;;ACvEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEoE;AACnB;;AAEjD;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEO,4BAA4B,YAAY;AAC/C;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,sBAAsB,+BAAe;;AAErC;AACA;AACA,UAAU,+BAAe;AACzB;AACA;AACA;AACA,UAAU,+BAAe;AACzB;AACA;AACA;AACA,UAAU,+BAAe;AACzB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS,UAAU;AACnB;AACA;AACA,SAAS,SAAS;AAClB;AACA;AACA,SAAS,UAAU;AACnB;AACA;AACA,SAAS,SAAS;AAClB;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;;ACzLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE4C;;AAEiC;AAC/B;;AAEvC,mBAAmB,UAAU;AACpC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,gBAAgB,WAAW;AAC3B,gBAAgB,WAAW;AAC3B;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;;AAEA;AACA,gBAAgB,WAAW;AAC3B,gBAAgB,WAAW;AAC3B;AACA,4BAA4B;AAC5B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB,iCAAiB;;AAE1C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,cAAoB;AACnC;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,eAAe,QAAc;AAC7B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA,iBAAiB,cAAoB;AACrC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,eAAe,QAAc;AAC7B;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,cAAoB;AACnC;AACA;;AAEA;AACA;AACA;;;AC1SA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE6D;AAC5B;AACmB;AACH;;AAE1C,oBAAoB,IAAI;AAC/B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;;AAEA,wBAAwB,aAAa;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,YAAY,0BAAU;AACtB,KAAK;AACL;;AAEA,uBAAuB,oBAAI;AAC3B;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC7FA;AACA;AACA;AACA;AACA;AACA;AACA;AAC+C;;AAE/C;AACA;;AAEA;AACA;AACA;AACA;AACO,4BAA4B,WAAW;AAC9C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,YAAY,KAAK;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,YAAY,QAAQ;AACpB;AACA,YAAY,WAAW;;AAEvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;ACzFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE4C;;AAEe;AACJ;AACT;AACM;;AAEpD;AACA;AACA;AACA;AACA;AACA;AACO,oBAAoB,UAAU;AACrC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ,WAAiB;AACzB;AACA;AACA;AACA;;AAEA;AACA;AACA,uCAAuC,aAAa,GAAG,WAAW;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,mBAAmB,uBAAO;AAC1B,OAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,uCAAuC,MAAM,GAAG,OAAO;AACvD,MAAM;AACN,0CAA0C,MAAM,GAAG,OAAO;AAC1D;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,OAAO;AACnB;AACA;AACA,cAAc,YAAS;AACvB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,oBAAoB,sBAAsB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,SAAS;;AAElB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAAS,YAAS;AAClB;AACA;AACA;AACA;;;ACtOA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEiC;AACmB;AACH;AAC4B;AACP;;AAE/D,oBAAoB,IAAI;AAC/B;AACA;;AAEA,wBAAwB,6BAAa;AACrC,wBAAwB,iCAAiB,GAAG,kBAAkB;AAC9D,yBAAyB,0BAAU;;AAEnC,uBAAuB,oBAAI;AAC3B;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEoE;AACnB;;AAEjD;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEO,2BAA2B,YAAY;AAC9C;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,sBAAsB,+BAAe;;AAErC;AACA;AACA,UAAU,+BAAe;AACzB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,SAAS,QAAQ;AACjB;AACA;AACA,SAAS,SAAS;AAClB;AACA;AACA,SAAS,QAAQ;AACjB;AACA;AACA,SAAS,QAAQ;AACjB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACrIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEiC;AACmB;AACO;AACV;;AAE1C,MAAM,SAAI,SAAS,IAAI;AAC9B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;;AAEN;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,wBAAwB,YAAY;AACpC;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,YAAY,0BAAU;AACtB,KAAK;AACL;;AAEA,uBAAuB,oBAAI;AAC3B;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACjGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEoE;AACnB;;AAEjD;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEO,2BAA2B,YAAY;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,sBAAsB,+BAAe;;AAErC;AACA;AACA,UAAU,+BAAe;AACzB;AACA;AACA;AACA,UAAU,+BAAe;AACzB;AACA;AACA;AACA,UAAU,+BAAe;AACzB;AACA;AACA;AACA;AACA,YAAY,+BAAe;AAC3B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA,YAAY;AACZ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS,SAAS;AAClB;AACA;AACA,SAAS,UAAU;AACnB;AACA;AACA,SAAS,SAAS;AAClB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACtRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEiC;AACmB;AACO;AACV;;AAE1C,MAAM,SAAI,SAAS,IAAI;AAC9B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;;AAEN;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,qBAAqB,8BAA8B;;AAEnD,wBAAwB,YAAY;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,8BAA8B,OAAO;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,YAAY,0BAAU;AACtB,KAAK;AACL;;AAEA,uBAAuB,oBAAI;AAC3B;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACnIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE4C;AACC;;AAE7C;AACA;AACA;AACO,2BAA2B,UAAU;AAC5C;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,iBAAiB;AACjB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,WAAW;AACvB;AACA;AACA;;AAEA,YAAY,iCAAiC;AAC7C;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,sBAAsB;AAClC,YAAY,OAAO;;AAEnB;;AAEA;AACA,WAAW,UAAgB;;AAE3B;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;ACjKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAMgC;AACoB;AACyB;;AAEtE;AACP;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,6BAAa;AACvC;AACA;AACA,0BAA0B,6BAAa;AACvC;AACA;AACA,uBAAuB,0BAAU;AACjC;AACA;AACA,qBAAqB,gCAAgB;AACrC;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,UAAU,iCAAiB;;AAE3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB,uBAAO;AAC1B,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC3HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE4C;;AAE+B;AAClB;AACX;AACI;AACE;AACA;;AAEpD;AACA;AACA;AACO,8BAA8B,UAAU;AAC/C;AACA;;AAEA,6DAA6D,qBAAK;AAClE;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,WAAiB;AACrC;AACA;AACA;AACA,MAAM;AACN,4BAA4B,kBAAmB;AAC/C;AACA;AACA;AACA,oBAAoB,SAAe;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,wBAAwB,iCAAiB;AACzC;AACA,6BAA6B,uBAAO;AACpC;AACA;AACA;AACA;;AAEA,sBAAsB,YAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB,uBAAO;AAC1B,OAAO;AACP,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS,SAAS;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;;AC3JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEoD;AACG;;AAEvD;AACA;AACA;AACO,MAAM,SAAI,SAAS,eAAe;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,qBAAqB,0BAAU;AAC/B;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,sBAAsB,8BAA8B;AACpD,uBAAuB,+BAA+B;AACtD,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEoE;AACnB;;AAEjD;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEO,8BAA8B,YAAY;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,sBAAsB,+BAAe;;AAErC;AACA;AACA,UAAU,+BAAe;AACzB;AACA;AACA;AACA,UAAU,+BAAe;AACzB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA,YAAY;AACZ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA,YAAY;AACZ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,SAAS,QAAQ;AACjB;AACA;AACA,SAAS,SAAS;AAClB;AACA;AACA,SAAS,WAAW;AACpB;AACA;AACA,SAAS,SAAS;AAClB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS,QAAQ;AACjB;AACA;AACA,SAAS,SAAS;AAClB;AACA;AACA,SAAS,WAAW;AACpB;AACA;AACA,SAAS,SAAS;AAClB;AACA;AACA;AACA;;;AC5NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEuD;AACH;;AAEpD;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEO,6BAA6B,eAAe;AACnD;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB,uBAAO;AACxB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS,QAAQ;AACjB;AACA;AACA,SAAS,SAAS;AAClB;AACA;AACA,SAAS,WAAW;AACpB;AACA;AACA,SAAS,SAAS;AAClB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACzFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEiC;AACmB;AACH;AACc;;AAExD,qBAAqB,IAAI;AAChC;AACA;AACA;;AAEA,UAAU,uCAAuC;AACjD;AACA;AACA;;AAEA;;AAEA,wBAAwB,cAAc;AACtC;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,YAAY,0BAAU;AACtB,KAAK;AACL;;AAEA,uBAAuB,oBAAI;AAC3B;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEqC;AACe;AACA;;AAE7C,yBAAyB,MAAM;AACtC;AACA,YAAY,oCAAoC;;AAEhD;AACA;;AAEA;AACA;AACA;AACA,mBAAmB,uBAAO;AAC1B,OAAO;AACP;AACA;AACA,mBAAmB,uBAAO;AAC1B,OAAO;AACP;AACA;AACA,mBAAmB,uBAAO;AAC1B,OAAO;AACP;AACA;AACA,mBAAmB,uBAAO;AAC1B,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,+BAA+B,mBAAmB;AAClD;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS,QAAQ;AACjB;AACA;AACA,SAAS,SAAS;AAClB;AACA;AACA,SAAS,QAAQ;AACjB;AACA;AACA,SAAS,QAAQ;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;ACxFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEoE;AACnB;;AAEjD;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEO,6BAA6B,YAAY;AAChD;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,sBAAsB,+BAAe;;AAErC;AACA;AACA,UAAU,+BAAe;AACzB;AACA;AACA;AACA,UAAU,+BAAe;AACzB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,SAAS,QAAQ;AACjB;AACA;AACA,SAAS,SAAS;AAClB;AACA;AACA,SAAS,QAAQ;AACjB;AACA;AACA,SAAS,QAAQ;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACjJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEiC;AACmB;AACH;AACc;;AAExD,MAAM,WAAK,SAAS,IAAI;AAC/B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;;AAEN;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,KAAK;;AAExC,wBAAwB,cAAc;AACtC;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA,sBAAsB;;AAEtB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,4BAA4B,OAAO;AACnC,6BAA6B,MAAM;AACnC;;AAEA;AACA;AACA;AACA,4BAA4B,OAAO;AACnC,6BAA6B,MAAM;AACnC;;AAEA;AACA,YAAY,0BAAU;AACtB,KAAK;AACL;;AAEA;AACA,YAAY,0BAAU;AACtB,KAAK;AACL;;AAEA,0BAA0B,oBAAI;AAC9B,0BAA0B,oBAAI;;AAE9B;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC3KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACqC;;AAErC;AACA;AACA;AACO,yBAAyB,aAAM;AACtC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,iBAAiB;AACjB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,iBAAS;AACpB;;AAEA;AACA;AACA,YAAY,WAAW;AACvB;AACA;AACA;;AAEA,YAAY,iCAAiC;AAC7C;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,SAAS,iBAAS;AAClB;AACA;AACA;AACA,qBAAqB,+BAA+B;AACpD;AACA;AACA;AACA;;;AC5IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE4C;AACA;;AAEyB;AACpC;AACoB;AACP;AACM;;AAEpD;AACA;AACA;AACO,MAAM,iBAAQ,SAAS,UAAU;AACxC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,yBAAS;AAC3C;AACA;AACA;AACA;AACA,iCAAiC,yBAAS;;AAE1C;;AAEA;;AAEA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,MAAM;AAClB,YAAY,UAAU;AACtB;;AAEA,UAAU,oCAAoC;;AAE9C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,qBAAqB,uBAAO;AAC5B,SAAS;AACT,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,2BAA2B,SAAI;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,yBAAS;AACvB,OAAO;;AAEP,8BAA8B,UAAU;AACxC;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB;AACpB,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,mBAAmB,mBAAyB;AAC5C;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,mBAAmB,WAAiB;AACpC;AACA;AACA;;AAEA;AACA,wBAAwB,SAAI;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,gCAAgB;AAC5B,KAAK;;AAEL,2BAA2B,UAAU;AACrC;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;;AAEA;AACA;AACA;;AAEA;;AAEA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;;AAEA,oBAAoB;AACpB,qBAAqB;AACrB,kBAAkB;AAClB,iBAAiB;;AAEjB;AACA;;AAEA;AACA;;AAEA;AACA,WAAW,WAAiB;AAC5B,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO,QAAQ;AACf,OAAO,QAAQ;AACf;AACA,OAAO,QAAQ;AACf;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAY,oCAAoC;AAChD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC1YA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEiC;AACmB;AACH;AACc;;AAExD,qBAAqB,IAAI;AAChC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;;AAEA,wBAAwB,cAAc;AACtC;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,YAAY,0BAAU;AACtB,KAAK;AACL;;AAEA;AACA,YAAY,0BAAU;AACtB,KAAK;AACL;;AAEA,0BAA0B,oBAAI;AAC9B,0BAA0B,oBAAI;;AAE9B;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC1HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEoE;AACnB;;AAEjD;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEO,4BAA4B,YAAY;AAC/C;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,sBAAsB,+BAAe;;AAErC;AACA;AACA,UAAU,+BAAe;AACzB;AACA;AACA;AACA,UAAU,+BAAe;AACzB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,SAAS,QAAQ;AACjB;AACA;AACA,SAAS,SAAS;AAClB;AACA;AACA,SAAS,QAAQ;AACjB;AACA;AACA,SAAS,QAAQ;AACjB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC5JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEiC;AACmB;AACH;AACY;;AAEtD,MAAM,WAAK,SAAS,IAAI;AAC/B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;;AAEN;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,wBAAwB,aAAa;AACrC;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,YAAY,0BAAU;AACtB,KAAK;AACL;;AAEA,uBAAuB,oBAAI;AAC3B;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACjGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEiC;AACmB;AACH;AACgB;;AAE1D,MAAM,eAAO,SAAS,IAAI;AACjC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;;AAEN;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,wBAAwB,eAAe;AACvC;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA,eAAe;AACf;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,YAAY,0BAAU;AACtB,KAAK;AACL;;AAEA,uBAAuB,oBAAI;AAC3B;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACxGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEmC;AACuB;;AAE1D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO,wBAAwB,KAAK;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,gCAAgB;AACnC;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,8BAA8B,iCAAiC;AAC/D;;AAEA;AACA,sBAAsB,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,UAAU,KAAK,KAAK;AACvF;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,sDAAsD,QAAQ,SAAS,cAAc,uBAAuB,gCAAgC;AAC5I;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,4BAA4B;AAC5B;;AAEA;AACA;AACA;;AAEA;AACA,YAAY,SAAS;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,SAAS;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,SAAS;;AAErB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS,OAAO;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,SAAS,OAAO;AAChB;AACA,cAAc,QAAQ;;AAEtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AClRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE4C;AACC;;AAE7C;AACA;AACA;AACO,0BAA0B,UAAU;AAC3C;AACA;AACA,iBAAiB;AACjB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,WAAW;AACvB;AACA;AACA;;AAEA,YAAY,iCAAiC;AAC7C;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,YAAY,sBAAsB;AAClC,YAAY,OAAO;;AAEnB;;AAEA;AACA;AACA,WAAW,UAAgB;;AAE3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;AClJuD;AACb;AACA;AACU;AACV;AACF;AACA;AACgB;AAChB;AACY;AACV;AACU;AACJ;AACc;AAC3B;AACS;AACA;AACF;AACI;AACI;AACI;;AAE/C,MAAM,sBAAO;AACpB,UAAU,MAAM;AAChB,SAAS,WAAK;AACd,QAAQ,SAAI;AACZ,WAAW,eAAO;AAClB,QAAQ,SAAI;AACZ,SAAS,WAAK;AACd,SAAS,KAAK;AACd,UAAU,MAAM;AAChB,cAAc,UAAU;AACxB,SAAS,KAAK;AACd,cAAc,UAAU;AACxB,eAAe,YAAY;AAC3B,gBAAgB,YAAY;AAC5B,eAAe,WAAW;AAC1B,cAAc,UAAU;AACxB,mBAAmB,eAAe;AAClC,QAAQ,SAAI;AACZ,YAAY,iBAAQ;AACpB,SAAS,KAAK;AACd,aAAa,SAAS;AACtB,SAAS,KAAK;AACd;;;AC5C2B;AAC6B;AAC7B;AACE;;;ACH7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AC9GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACgC;;AAEhC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,eAAe,GAAG,KAAK;AACzC;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,uBAAuB,QAAQ,qBAAqB,SAAS;AAC7D;AACA;;AAEA;AACA,uBAAuB,SAAS,qBAAqB,QAAQ;AAC7D;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACzIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACgC;AACE;;AAElC;AACA;AACA;AACO,MAAM,eAAI;AACjB;AACA;AACA;AACA;AACA,aAAa,eAAI;AACjB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,eAAI;;AAElB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,MAAM;AACxC,qBAAqB,WAAW;AAChC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gCAAgC,MAAM;AACtC;AACA;AACA,UAAU;AACV;AACA,kCAAkC,MAAM;AACxC,qBAAqB,WAAW;AAChC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS,OAAO;AAChB;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,SAAS,OAAO;AAChB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO;AAChB;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,qEAAqE,IAAI;AACzE;;AAEA;AACA;;AAEA;AACA,yBAAyB,QAAQ;AACjC;AACA;AACA,yBAAyB,SAAS;AAClC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,yBAAyB,QAAQ;AACjC;AACA;AACA,yBAAyB,SAAS;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,eAAI;;;ACnQ4B;AACzB,QAAQ,UAAU,EAAE,KAAK;;AAER;AACD;AACE;;;ACLzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,kBAAkB,gBAAgB;AAClC;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C,sCAAsC;AACtC;AACA;AACA,MAAM;AACN;AACA,0CAA0C;AAC1C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,GAAG,EAAE,EAAE;AACxC;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;ACtMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACkC;AACK;;AAEvC;AACA;;AAEA;AACA;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,mBAAmB,uBAAgB;AACxC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,cAAc,OAAO;AACrB,cAAc,QAAQ;;AAEtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,gCAAgC,mBAAY;AAC5C,MAAM;AACN,qCAAqC,gBAAgB;AACrD;AACA;;AAEA;AACA;AACA;AACA,eAAe,oBAAa;;AAE5B;AACA;AACA;AACA,0BAA0B,oBAAa;AACvC;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA,yBAAyB,EAAQ;AACjC;AACA,MAAM,0BAA0B,GAAS;AACzC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO,OAAO;;AAEd;AACA;;AAEA;AACA;;;ACnMA;AACA;AACA;AACA;AACA;AACA;AACA;AACoC;AACE;;AAEtC;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,kBAAkB,gBAAgB;AAClC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN,yBAAyB;AACzB;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kCAAkC,cAAc;AAChD;;AAEA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA,wBAAwB,OAAO;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACkC;AACK;;AAEvC;AACA;;AAEA;;AAEA;AACA;;AAEO,MAAM,SAAI;AACjB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,mBAAmB,uBAAgB;AACxC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gCAAgC,mBAAY;AAC5C,MAAM;AACN,qCAAqC,gBAAgB;AACrD;AACA;;AAEA;AACA;AACA;AACA,eAAe,oBAAa;;AAE5B;AACA;AACA;AACA,0BAA0B,oBAAa;AACvC;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,KAAK,UAAU,OAAO;AAC7E;AACA;;AAEA,yBAAyB,EAAQ;AACjC;AACA,MAAM,0BAA0B,GAAS;AACzC;AACA;AACA;;AAEA;AACA;;;AC1JA;AACA;AACA;AACA;AACA;AACA;AACoC;AACN;;AAE9B;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,6BAA6B,wCAAwC;AACrE;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,kCAAkC,wBAAwB;AAC1D;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,iBAAiB,SAAI;AACrB,wBAAwB,OAAO;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;;;AC/DoC;;AAE7B,QAAQ,OAAO,EAAE,OAAO;;AAEL;AACA;AACD;AACE;AACJ;AACI;;;ACT3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEkC;AACU;;AAE5C,IAAI,WAAK;;AAEF;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,uBAAuB,aAAa;AACpC;AACA,4BAA4B,eAAU;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,wBAAwB,OAAO;AAC/B;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,uBAAuB,MAAM;AAC7B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,mBAAmB,WAAiB;AACpC;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,YAAS;AACnB;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI,WAAK;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,qBAAqB;AAC1D;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,qCAAqC,qBAAqB;AAC1D;AACA;;AAEA,QAAQ,WAAK;AACb;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,IAAI,WAAK;AACT;AACA;AACA;AACA;AACA;AACA,UAAU,YAAS;AACnB;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,SAAS,YAAS;AAClB;AACA;AACA;AACA;;;ACvNA;AACA;AACA;AACA;AACA;AACA;AACgC;;AAEzB,mBAAmB,KAAK;AAC/B;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,YAAY,YAAY;AACxB,YAAY,UAAU;;AAEtB;AACA,6BAA6B,iBAAiB;AAC9C;AACA;AACA,qCAAqC,gBAAgB;AACrD;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACiC;AACD;;AAEhC;AACA;AACA;AACO,uBAAuB,KAAK;AACnC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,6BAA6B,QAAQ;AACrC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,qBAAqB,IAAI,IAAI,KAAK;;AAElC;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA,OAAO;AACP,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC7GA;AACA;AACA;AACA;AACA;AACA;AACA;AACiC;AACD;;AAEhC;AACA;AACA;AACO,sBAAsB,KAAK;AAClC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,SAAS;AACpC;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACgC;;AAEhC;AACA;AACA;AACO,MAAM,SAAI,SAAS,KAAK;AAC/B;AACA;AACA;AACA;AACA;;AAEA;AACA,eAAe,SAAI;AACnB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;;AChDwB;AACD;AACI;AACD;AACH;;;ACJvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACkC;;AAE3B;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,YAAY,SAAS;AACrB,YAAY,UAAU;;AAEtB;;AAEA,yBAAyB,IAAU;AACnC;AACA;AACA;AACA,MAAM,0BAA0B,QAAc;AAC9C;AACA;AACA;AACA,MAAM,0BAA0B,OAAa;AAC7C;AACA;AACA;AACA,MAAM,0BAA0B,SAAU;AAC1C;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA,WAAW;AACX;;;ACnGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO,OAAO;AACd;AACA;;AAEO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA,2BAA2B;AAC3B,iBAAiB;;AAEjB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;ACjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACuC;;AAEvC;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB,IAAI;;AAEpB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,yBAAyB;AACzB,wBAAwB;AACxB,wBAAwB;AACxB,yBAAyB;AACzB,0BAA0B;AAC1B;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,4CAA4C,UAAU;;AAEtD;AACA,kCAAkC,sBAAsB;AACxD;;AAEA;AACA;;AAEA;AACA;AACA,8CAA8C,MAAM;AACpD;AACA,oDAAoD,MAAM;AAC1D,8CAA8C,MAAM,IAAI;AACxD;AACA,QAAQ;AACR,gCAAgC,wBAAwB;AACxD;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEO;AACP;AACA;;AAEA;AACA;AACA,4BAA4B;;AAE5B;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO,MAAM,YAAK;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,IAAI;AACJ;AACA;AACA;;;AC/VA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEsD;AAClB;;AAE7B,MAAM,mBAAS,GAAG,SAAU;AAC5B,eAAe,sBAAO;;AAE7B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,eAAe,mBAAS;AACxB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,IAAI,eAAK;AACT;AACA;AACA;AACA,uBAAuB,eAAK;AAC5B,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEO;AACP,eAAe,eAAK;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;AC/EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACiC;AACC;AACQ;;AAE1C;AACA;;AAEA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY,KAAK;AACjB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,sBAAsB,KAAK;AAC3B;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,mBAAmB;AAC9B;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,kBAAkB,OAAa;AAC/B,MAAM;AACN;AACA,QAAQ,OAAiB;AACzB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,kBAAkB,QAAc;AAChC,MAAM;AACN;AACA,QAAQ,OAAiB;AACzB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,OAAa;AACjC,QAAQ;AACR;AACA,UAAU,OAAiB;AAC3B;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,QAAc;AAClC,QAAQ;AACR;AACA,UAAU,OAAiB;AAC3B;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,sBAAsB,IAAU;AAChC;AACA;;AAEA;AACA;AACA,yBAAyB,KAAK;AAC9B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB,SAAU;AAC3B;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,MAAM,OAAiB;AACvB;;AAEA;AACA;AACA,2BAA2B;AAC3B,kBAAkB;AAClB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY,OAAO;AACnB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY,OAAO;AACnB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,OAAO;AACnB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AChdA;AACA;AACA;AACA;AACA;AACA;;AAE0C;;AAE1C,IAAI,cAAK;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO,MAAM,iBAAQ;AACrB;AACA;AACA;AACA,QAAQ,cAAK;AACb;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,OAAiB;AACvB;AACA;AACA;AACA;AACA;;AAEA,QAAQ,cAAK;AACb;AACA;;AAEA;AACA;;AAEA;AACA,WAAW,OAAiB;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;;;AC1FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,+BAA+B;AAC/B;AACO;AACP;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,+CAA+C,KAAK;AACpD;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;ACvDA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,OAAO;AACnB,YAAY,OAAO;;AAEnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA,eAAe;AACf;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;ACnFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACgC;AACF;;AAEvB;AACP;AACA,eAAe,KAAK;;AAEpB;AACA;AACA,0CAA0C,IAAI;;AAE9C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AClC0B;AACC;;AAED;AACF;AACA;AACD;;;ACNvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO;AACP,UAAU,mBAAmB;;AAE7B;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,gCAAgC,KAAK,EAAE,MAAM;AAC7C;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEoD;AACA;AACA;AACA;AACA;;AAE7C;;AAEP;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,kBAAkB,0BAA0B;AAC5C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,mDAAmD,OAAO,EAAE,KAAK,EAAE,OAAO;AAC1E;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,kBAAkB,uBAAO;AACzB,kBAAkB,uBAAO;AACzB,kBAAkB,uBAAO;AACzB;AACA,kBAAkB,uBAAO;AACzB,kBAAkB,uBAAO;AACzB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,qBAAqB;;AAErB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC/OO;AACA;;;ACDP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC6C;AACL;AACV;AACuB;;AAErD,IAAI,WAAK;;AAET;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM,WAAK;AACX,WAAW,UAAI;AACf;;AAEA;AACA,mBAAmB,gBAAQ;AAC3B,UAAU,gBAAM;AAChB,IAAI;AACJ,gBAAgB,YAAY;AAC5B;;AAEA,MAAM,WAAK;AACX;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,oCAAoC,WAAW,IAAI,KAAK;AACxD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,MAAM;AAC7B;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,MAAM,WAAK;AACX,WAAW,UAAI;AACf;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,MAAM,WAAK;AACX;AACA;;AAEA,WAAW;AACX;;AAEA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,QAAQ;AACR;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,IAAI,SAAS;AACb;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,sBAAsB,UAAU;AAChC;AACA;;AAEA,kBAAkB,UAAO;AACzB,kBAAkB,QAAQ;AAC1B,mBAAmB;AACnB,kBAAkB,UAAU;AAC5B,mBAAmB;;AAEnB;AACA;AACA;;AAEA;AACA;AACA,wBAAwB,SAAS,CAAC,UAAU;AAC5C;;AAEA;AACA;AACA;AACA;AACA,wBAAwB,UAAO;AAC/B;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,wBAAwB,QAAQ;AAChC;AACA;AACA;AACA;AACA,KAAK;AACL,qBAAqB,QAAQ,IAAI,SAAS;;AAE1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,yBAAyB,QAAQ;;AAEjC;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,2BAA2B,UAAO;AAClC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,WAAK;;AAEE;AACP,EAAE,WAAK;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,oBAAoB,0BAA0B;AAC9C;AACA,+CAA+C,WAAK;AACpD;AACA;;AAEA;AACA;;AAEA;;AAEA,IAAI,UAAI;AACR;AACA;AACA;AACA;AACA;AACA;AACA;;;ACzSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEkC;AACD;;AAEjC;AACA;AACA;;AAEA;AACO;AACP,4BAA4B,UAAY;AACxC;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACO;AACP;AACA;AACO;AACP;AACA;AACO;AACP,sBAAsB;AACtB;;AAEA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACO,SAAS,eAAM;AACtB,oBAAoB,GAAG,EAAE,EAAE;AAC3B;;AAEA;AACO;AACP,YAAY,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,KAAK,EAAE,OAAO;AACzD;;AAEA;AACO;AACP,iBAAiB,KAAK;AACtB;AACA,cAAc,IAAI,EAAE,MAAM,GAAG,KAAK;AAClC;;AAEA;AACO;AACP,kBAAkB,cAAc;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,UAAY,kBAAkB,UAAY;AAC9D;AACA;AACA;AACA;AACA;;AAEA;AACO;AACP;AACA;;AAEA;AACA;AACA,YAAY,OAAO;;AAEnB;AACA;AACA;AACA;;AAEA,8BAA8B,UAAY;;AAE1C;AACA;AACA;AACA;AACA;AACA,6BAA6B,OAAO,IAAI,GAAG;;AAE3C;AACA;AACA,UAAU;AACV,mBAAmB;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,mBAAmB;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,GAAG;AACvC;AACA,UAAU;AACV;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;;AAEA;AACO;AACP,UAAU,QAAQ;AAClB;;AAEA;AACA;AACA;AACA;;AAEA;AACA,aAAa,eAAM;AACnB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,OAAO,QAAQ;AACf,YAAY,OAAO;AACnB,UAAU,SAAS;AACnB,YAAY,OAAO;AACnB;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACO;AACP;AACA;AACA;AACA;;AAEA;AACA,IAAI,aAAI;AACR;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACO,MAAM,aAAI;AACjB;AACA,UAAU,yBAAyB;AACnC,UAAU,OAAO;AACjB,UAAU,QAAQ;;AAElB;AACA;AACA,yBAAyB,eAAM;AAC/B;;AAEA;;AAEA;AACA;AACA;AACA;AACA,uCAAuC,UAAY;;AAEnD;AACA,yBAAyB,EAAQ;AACjC;AACA;;AAEA;AACA,yBAAyB,EAAQ;AACjC;AACA;;AAEA;AACA,kBAAkB,UAAY;AAC9B;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,6CAA6C;AAC7C;AACA;;AAEA;AACO;AACP;AACA;AACA,qEAAqE;AACrE;;AAEA;AACA,mCAAmC;AACnC;AACA,kBAAkB,mBAAmB;AACrC;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,sBAAsB,iBAAiB;AACvC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACO;AACP;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;AC7Y0B;AACF;AACG;AACC;;;ACH5B;AACA;AACA;AACA;AACA;AACA;AACgC;AACK;AACN;AACE;AACE;AACM;;AAEzC,QAAQ,OAAO,oBAAO,cAAG,EAAE,2BAAO;AAC3B,QAAQ,SAAS,wBAAS,gBAAG,EAAE,yBAAS;AAC/C,QAAQ,OAAO,gBAAG,EAAE,sBAAM;;AAE1B,MAAM,SAAK,sBAAsB;AACjC;AACA;AACA;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,kBAAkB,SAAK;AACvB,iBAAiB,SAAK,CAAC,WAAO,CAAC,wBAAI,YAAY,WAAO;AACtD;;AAEA;AACA;AACA;AACA;AACA,oBAAoB,SAAK;AACzB,eAAe,OAAe,CAAC,wBAAI;AACnC;;AAEA;AACA,eAAe,iBAAgB;AAC/B;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,WAAO;AAClB;AACA;AACA,WAAW,aAAS;AACpB;AACA;;AAEA;AACA,oBAAoB,KAAK;AACzB,sBAAsB,2BAAO;AAC7B,mBAAmB,wBAAI;AACvB,oBAAoB,yBAAK;AACzB,qBAAqB,sBAAM;AAC3B,wBAAwB,yBAAS;;AAE1B,SAAS,QAAI,sBAAsB;AAC1C;AACA;;;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE2C;;AAEpC,MAAM,eAAO;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,iCAAiC,KAAK;AACtC;AACA;AACA;AACA;;AAEA,wCAAwC,KAAK;AAC7C;;AAEA,SAAS,QAAgB,UAAU,mBAAmB;AACtD;;;AC/B6B;;AAE7B;AACO,iBAAiB,mBAAO,CAAC,GAAwB;;;ACHxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACwC;;AAEjC;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;;AAEA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,UAAU,SAAS;AACnB;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,QAAQ;AACpB;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY,QAAQ;;AAEpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,wCAAwC;;AAEpD;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU,eAAe;;AAEzB;AACA;AACA;AACA,YAAY,6CAA6C;;AAEzD;AACA;AACA;;AAEA,cAAc,UAAU;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;;AAER;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,MAAW;AAC9B;AACA;AACA,mBAAmB,MAAW;AAC9B;AACA;AACA,mBAAmB,IAAS;AAC5B;AACA,mBAAmB,MAAW;AAC9B;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;;;ACzRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC4C;AACD;;AAEpC;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,0BAA0B;AAC9C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,WAAW,UAAS;AACpB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,aAAa;;AAEzB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,gBAAgB;AACjC,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,IAAI,WAAY;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,sBAAsB,MAAM;AAC5B;AACA,sBAAsB,MAAM;AAC5B;AACA;AACA,WAAW,WAAmB;AAC9B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,SAAS,UAAS;AAClB;AACA;AACA;AACA,qBAAqB,+BAA+B;AACpD;AACA;AACA;AACA;;;AChUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACvEA;AACA;AAC8B;AACL;AACO;;;ACJE;AACA;AACA;AACA;AACJ;AACQ;AACF;AACA;AACF;;AAE3B,MAAM,SAAI,GAAG,oBAAI;AACjB,MAAM,SAAI,GAAG,oBAAI;AACjB,aAAa,oBAAI;AACjB,aAAa,oBAAI;AACjB,WAAW,kBAAE;AACb,eAAe,sBAAM;AACrB,cAAc,qBAAK;AACnB,MAAM,UAAK,GAAG,0BAAK;AACnB,aAAa,oBAAI;;;AClBxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEiC;AACI;AACM;AACR;AACE;AACJ;AACF;;AAE4C;;AAEpE;AACP;AACA;AACA;AACA,WAAW;AACX,aAAa;AACb,gBAAgB;AAChB,YAAY;AACZ,aAAa;AACb,WAAW;AACX,UAAU;AACV,WAAW,IAAS;AACpB;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mBAAmB,eAAe,CAAC,QAAgB;;AAEnD,2BAA2B,aAAc;AACzC,MAAM,sBAAc;AACpB;AACA;AACA;AACA,wBAAwB,cAAe,CAAC,OAAe;;AAEvD,kDAAkD,OAAO;AACzD;AACA,oCAAoC,iCAAiB;;AAErD;AACA,0BAA0B,UAAgB,CAAC,gBAAgB;AAC3D,0BAA0B,gBAAkB,CAAC,gBAAgB;;AAE7D;;AAEA;AACA,qBAAqB,KAAW;AAChC,qBAAqB,KAAW;;AAEhC;AACA,0BAA0B,UAAgB;AAC1C,wBAAwB,QAAc;;AAEtC;AACA,mBAAmB,GAAS;;AAE5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;ACrOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEqB;;AAErB;AAC+B;;AAEE;AACI;AACM;AACR;AACE;AACJ;AACF;;AAEoC;AACrB;;AAEvC;;AAEP;AACO;AACA;AACA;AACA,MAAM,WAAO,GAAG,OAAG;AACnB,MAAM,SAAK,GAAG,yBAAK;AACnB,MAAM,WAAO,GAAG,2BAAO;AACvB,mBAAmB,0BAAU;AAC7B,eAAe,0BAAM;AACrB,gBAAgB,uBAAO;AACvB,cAAc,qBAAK;AACnB,aAAa,oBAAI;AACjB,MAAM,OAAG,GAAG,IAAS;;AAErB;AACP,oBAAoB,SAAS;;AAE7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,2BAA2B,WAAO;;AAElC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;;AAEA,wBAAwB,gDAAgD;;AAExE;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,qBAAqB,2BAA2B;;AAEhD;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,CAAC","sources":["webpack://MathBox/webpack/universalModuleDefinition","webpack://MathBox/./build/shaders.js","webpack://MathBox/./node_modules/base64-js/index.js","webpack://MathBox/./node_modules/buffer/index.js","webpack://MathBox/./node_modules/core-util-is/lib/util.js","webpack://MathBox/./node_modules/cssauron/index.js","webpack://MathBox/./node_modules/cssauron/tokenizer.js","webpack://MathBox/./node_modules/events/events.js","webpack://MathBox/./node_modules/glsl-parser/direct.js","webpack://MathBox/./node_modules/glsl-parser/lib/expr.js","webpack://MathBox/./node_modules/glsl-parser/lib/index.js","webpack://MathBox/./node_modules/glsl-parser/lib/scope.js","webpack://MathBox/./node_modules/glsl-tokenizer/index.js","webpack://MathBox/./node_modules/glsl-tokenizer/lib/builtins-300es.js","webpack://MathBox/./node_modules/glsl-tokenizer/lib/builtins.js","webpack://MathBox/./node_modules/glsl-tokenizer/lib/literals-300es.js","webpack://MathBox/./node_modules/glsl-tokenizer/lib/literals.js","webpack://MathBox/./node_modules/glsl-tokenizer/lib/operators.js","webpack://MathBox/./node_modules/glsl-tokenizer/string.js","webpack://MathBox/./node_modules/ieee754/index.js","webpack://MathBox/./node_modules/inherits/inherits_browser.js","webpack://MathBox/./node_modules/isarray/index.js","webpack://MathBox/./node_modules/process-nextick-args/index.js","webpack://MathBox/./node_modules/process/browser.js","webpack://MathBox/./node_modules/readable-stream/duplex-browser.js","webpack://MathBox/./node_modules/readable-stream/lib/_stream_duplex.js","webpack://MathBox/./node_modules/readable-stream/lib/_stream_passthrough.js","webpack://MathBox/./node_modules/readable-stream/lib/_stream_readable.js","webpack://MathBox/./node_modules/readable-stream/lib/_stream_transform.js","webpack://MathBox/./node_modules/readable-stream/lib/_stream_writable.js","webpack://MathBox/./node_modules/readable-stream/lib/internal/streams/BufferList.js","webpack://MathBox/./node_modules/readable-stream/lib/internal/streams/destroy.js","webpack://MathBox/./node_modules/readable-stream/lib/internal/streams/stream-browser.js","webpack://MathBox/./node_modules/readable-stream/passthrough.js","webpack://MathBox/./node_modules/readable-stream/readable-browser.js","webpack://MathBox/./node_modules/readable-stream/transform.js","webpack://MathBox/./node_modules/readable-stream/writable-browser.js","webpack://MathBox/./node_modules/safe-buffer/index.js","webpack://MathBox/./node_modules/shadergraph/src/linker/priority.js","webpack://MathBox/./node_modules/stats.js/build/stats.min.js","webpack://MathBox/./node_modules/stream-browserify/index.js","webpack://MathBox/./node_modules/string_decoder/lib/string_decoder.js","webpack://MathBox/./node_modules/through/index.js","webpack://MathBox/./node_modules/util-deprecate/browser.js","webpack://MathBox/external umd \"THREE\"","webpack://MathBox/ignored|/Users/sritchie/code/js/mathbox/node_modules/readable-stream/lib/internal/streams|util","webpack://MathBox/ignored|/Users/sritchie/code/js/mathbox/node_modules/readable-stream/lib|util","webpack://MathBox/webpack/bootstrap","webpack://MathBox/webpack/runtime/compat get default export","webpack://MathBox/webpack/runtime/define property getters","webpack://MathBox/webpack/runtime/global","webpack://MathBox/webpack/runtime/hasOwnProperty shorthand","webpack://MathBox/webpack/runtime/make namespace object","webpack://MathBox/./node_modules/@sicmutils/threestrap/src/api.js","webpack://MathBox/./node_modules/three/src/core/EventDispatcher.js","webpack://MathBox/./node_modules/@sicmutils/threestrap/src/binder.js","webpack://MathBox/./node_modules/@sicmutils/threestrap/src/bootstrap.js","webpack://MathBox/./src/splash.js","webpack://MathBox/./node_modules/@sicmutils/threestrap/src/aliases.js","webpack://MathBox/./node_modules/@sicmutils/threestrap/src/core/bind.js","webpack://MathBox/./node_modules/three/src/math/MathUtils.js","webpack://MathBox/./node_modules/three/src/math/Quaternion.js","webpack://MathBox/./node_modules/three/src/math/Vector3.js","webpack://MathBox/./node_modules/three/src/math/Matrix4.js","webpack://MathBox/./node_modules/three/src/math/Euler.js","webpack://MathBox/./node_modules/three/src/core/Layers.js","webpack://MathBox/./node_modules/three/src/math/Matrix3.js","webpack://MathBox/./node_modules/three/src/core/Object3D.js","webpack://MathBox/./node_modules/three/src/cameras/Camera.js","webpack://MathBox/./node_modules/three/src/cameras/OrthographicCamera.js","webpack://MathBox/./node_modules/@sicmutils/threestrap/src/core/camera.js","webpack://MathBox/./node_modules/@sicmutils/threestrap/src/core/fallback.js","webpack://MathBox/./node_modules/@sicmutils/threestrap/src/core/fill.js","webpack://MathBox/./node_modules/@sicmutils/threestrap/src/core/loop.js","webpack://MathBox/./node_modules/@sicmutils/threestrap/src/core/render.js","webpack://MathBox/./node_modules/three/src/constants.js","webpack://MathBox/./node_modules/three/src/math/Box3.js","webpack://MathBox/./node_modules/three/src/math/Sphere.js","webpack://MathBox/./node_modules/three/src/math/Plane.js","webpack://MathBox/./node_modules/three/src/math/Frustum.js","webpack://MathBox/./node_modules/three/src/math/Vector4.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLAnimation.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLAttributes.js","webpack://MathBox/./node_modules/three/src/math/Vector2.js","webpack://MathBox/./node_modules/three/src/math/Color.js","webpack://MathBox/./node_modules/three/src/core/BufferAttribute.js","webpack://MathBox/./node_modules/three/src/utils.js","webpack://MathBox/./node_modules/three/src/core/BufferGeometry.js","webpack://MathBox/./node_modules/three/src/geometries/BoxGeometry.js","webpack://MathBox/./node_modules/three/src/geometries/PlaneGeometry.js","webpack://MathBox/./node_modules/three/src/materials/Material.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/UniformsUtils.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/default_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/default_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/materials/ShaderMaterial.js","webpack://MathBox/./node_modules/three/src/math/Ray.js","webpack://MathBox/./node_modules/three/src/math/Triangle.js","webpack://MathBox/./node_modules/three/src/materials/MeshBasicMaterial.js","webpack://MathBox/./node_modules/three/src/objects/Mesh.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/alphamap_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/alphamap_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/alphatest_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/alphatest_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/aomap_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/aomap_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/begin_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/beginnormal_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/bsdfs.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/clipping_planes_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/clipping_planes_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/clipping_planes_pars_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/clipping_planes_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/common.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/displacementmap_pars_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/displacementmap_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/emissivemap_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/emissivemap_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/encodings_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/encodings_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/envmap_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/envmap_pars_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/envmap_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/fog_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/fog_pars_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/fog_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/fog_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/gradientmap_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/lightmap_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/lightmap_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/lights_lambert_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/lights_toon_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/lights_toon_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/lights_phong_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/map_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/map_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/map_particle_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/map_particle_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/metalnessmap_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/metalnessmap_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/morphnormal_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/morphtarget_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/normal_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/normal_pars_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/normal_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/normalmap_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/clearcoat_normal_fragment_begin.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/clearcoat_normal_fragment_maps.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/clearcoat_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/output_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/packing.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/project_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/dithering_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/dithering_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/roughnessmap_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/roughnessmap_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/skinbase_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/skinning_pars_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/skinning_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/skinnormal_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/specularmap_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/specularmap_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/tonemapping_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/uv_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/uv2_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/uv2_pars_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/uv2_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/worldpos_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/background.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/cube.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/depth.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/distanceRGBA.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/equirect.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/linedashed.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/meshbasic.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/meshlambert.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/meshnormal.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/meshphong.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/meshphysical.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/meshtoon.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/points.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/shadow.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/sprite.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/UniformsLib.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLBackground.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLBindingStates.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLBufferRenderer.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLCapabilities.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLClipping.js","webpack://MathBox/./node_modules/three/src/extras/ImageUtils.js","webpack://MathBox/./node_modules/three/src/textures/Texture.js","webpack://MathBox/./node_modules/three/src/renderers/WebGLRenderTarget.js","webpack://MathBox/./node_modules/three/src/cameras/PerspectiveCamera.js","webpack://MathBox/./node_modules/three/src/cameras/CubeCamera.js","webpack://MathBox/./node_modules/three/src/textures/CubeTexture.js","webpack://MathBox/./node_modules/three/src/renderers/WebGLCubeRenderTarget.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLCubeMaps.js","webpack://MathBox/./node_modules/three/src/materials/RawShaderMaterial.js","webpack://MathBox/./node_modules/three/src/extras/PMREMGenerator.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLCubeUVMaps.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLExtensions.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLGeometries.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLIndexedBufferRenderer.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLInfo.js","webpack://MathBox/./node_modules/three/src/textures/DataTexture2DArray.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLMorphtargets.js","webpack://MathBox/./node_modules/three/src/renderers/WebGLMultisampleRenderTarget.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLObjects.js","webpack://MathBox/./node_modules/three/src/textures/DataTexture3D.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLUniforms.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLShader.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLProgram.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLShaderCache.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLPrograms.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLProperties.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLRenderLists.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLLights.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLRenderStates.js","webpack://MathBox/./node_modules/three/src/materials/MeshDepthMaterial.js","webpack://MathBox/./node_modules/three/src/materials/MeshDistanceMaterial.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/vsm.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLShadowMap.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLState.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLTextures.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLUtils.js","webpack://MathBox/./node_modules/three/src/cameras/ArrayCamera.js","webpack://MathBox/./node_modules/three/src/objects/Group.js","webpack://MathBox/./node_modules/three/src/renderers/webxr/WebXRController.js","webpack://MathBox/./node_modules/three/src/textures/DepthTexture.js","webpack://MathBox/./node_modules/three/src/renderers/webxr/WebXRManager.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLMaterials.js","webpack://MathBox/./node_modules/three/src/renderers/WebGLRenderer.js","webpack://MathBox/./node_modules/three/src/renderers/WebGL1Renderer.js","webpack://MathBox/./node_modules/@sicmutils/threestrap/src/core/renderer.js","webpack://MathBox/./node_modules/@sicmutils/threestrap/src/core/scene.js","webpack://MathBox/./node_modules/@sicmutils/threestrap/src/core/size.js","webpack://MathBox/./node_modules/@sicmutils/threestrap/src/core/time.js","webpack://MathBox/./node_modules/@sicmutils/threestrap/src/core/warmup.js","webpack://MathBox/./node_modules/@sicmutils/threestrap/src/core/index.js","webpack://MathBox/./node_modules/@sicmutils/threestrap/src/extra/controls.js","webpack://MathBox/./node_modules/@sicmutils/threestrap/src/extra/cursor.js","webpack://MathBox/./node_modules/@sicmutils/threestrap/src/extra/fullscreen.js","webpack://MathBox/./node_modules/@sicmutils/threestrap/src/extra/stats.js","webpack://MathBox/./node_modules/@sicmutils/threestrap/src/extra/ui.js","webpack://MathBox/./node_modules/@sicmutils/threestrap/src/renderers/VRRenderer.js","webpack://MathBox/./node_modules/@sicmutils/threestrap/src/extra/vr.js","webpack://MathBox/./node_modules/@sicmutils/threestrap/src/extra/index.js","webpack://MathBox/./node_modules/@sicmutils/threestrap/src/controls/VRControls.js","webpack://MathBox/./node_modules/@sicmutils/threestrap/src/controls/index.js","webpack://MathBox/./node_modules/@sicmutils/threestrap/src/renderers/MultiRenderer.js","webpack://MathBox/./node_modules/@sicmutils/threestrap/src/renderers/index.js","webpack://MathBox/./node_modules/@sicmutils/threestrap/src/index.js","webpack://MathBox/./src/model/attributes.js","webpack://MathBox/./src/util/pretty.js","webpack://MathBox/./src/model/node.js","webpack://MathBox/./src/model/group.js","webpack://MathBox/./src/model/guard.js","webpack://MathBox/./src/model/model.js","webpack://MathBox/./src/model/index.js","webpack://MathBox/./src/overlay/factory.js","webpack://MathBox/./src/util/vdom.js","webpack://MathBox/./src/overlay/overlay.js","webpack://MathBox/./src/overlay/dom.js","webpack://MathBox/./src/overlay/classes.js","webpack://MathBox/./src/overlay/index.js","webpack://MathBox/./src/primitives/primitive.js","webpack://MathBox/./src/primitives/types/base/parent.js","webpack://MathBox/./src/primitives/types/base/group.js","webpack://MathBox/./src/primitives/types/base/inherit.js","webpack://MathBox/./src/primitives/types/base/root.js","webpack://MathBox/./src/primitives/types/base/unit.js","webpack://MathBox/./src/primitives/types/base/index.js","webpack://MathBox/./src/util/three.js","webpack://MathBox/./src/primitives/types/camera/camera.js","webpack://MathBox/./src/primitives/types/camera/index.js","webpack://MathBox/./src/util/data.js","webpack://MathBox/./src/util/glsl.js","webpack://MathBox/./src/primitives/types/base/source.js","webpack://MathBox/./src/primitives/types/data/data.js","webpack://MathBox/./src/primitives/types/data/buffer.js","webpack://MathBox/./src/primitives/types/data/array.js","webpack://MathBox/./src/primitives/types/data/interval.js","webpack://MathBox/./src/primitives/types/data/matrix.js","webpack://MathBox/./src/primitives/types/data/area.js","webpack://MathBox/./src/primitives/types/data/voxel.js","webpack://MathBox/./src/primitives/types/data/volume.js","webpack://MathBox/./src/util/axis.js","webpack://MathBox/./src/primitives/types/data/scale.js","webpack://MathBox/./src/primitives/types/data/index.js","webpack://MathBox/./src/util/js.js","webpack://MathBox/./src/primitives/types/draw/axis.js","webpack://MathBox/./src/primitives/types/draw/face.js","webpack://MathBox/./src/primitives/types/draw/grid.js","webpack://MathBox/./src/primitives/types/draw/line.js","webpack://MathBox/./src/primitives/types/draw/point.js","webpack://MathBox/./src/primitives/types/draw/strip.js","webpack://MathBox/./src/primitives/types/draw/surface.js","webpack://MathBox/./src/primitives/types/draw/ticks.js","webpack://MathBox/./src/primitives/types/draw/vector.js","webpack://MathBox/./src/primitives/types/draw/index.js","webpack://MathBox/./src/primitives/types/overlay/html.js","webpack://MathBox/./src/primitives/types/overlay/dom.js","webpack://MathBox/./src/primitives/types/overlay/index.js","webpack://MathBox/./src/primitives/types/text/text.js","webpack://MathBox/./src/primitives/types/operator/operator.js","webpack://MathBox/./src/primitives/types/text/format.js","webpack://MathBox/./src/primitives/types/text/label.js","webpack://MathBox/./src/primitives/types/operator/resample.js","webpack://MathBox/./src/primitives/types/text/retext.js","webpack://MathBox/./src/primitives/types/text/index.js","webpack://MathBox/./src/primitives/types/time/clock.js","webpack://MathBox/./src/primitives/types/time/now.js","webpack://MathBox/./src/primitives/types/time/index.js","webpack://MathBox/./src/primitives/types/transform/transform.js","webpack://MathBox/./src/primitives/types/transform/transform3.js","webpack://MathBox/./src/primitives/types/transform/transform4.js","webpack://MathBox/./src/primitives/types/transform/vertex.js","webpack://MathBox/./src/primitives/types/transform/fragment.js","webpack://MathBox/./src/primitives/types/transform/layer.js","webpack://MathBox/./src/primitives/types/transform/mask.js","webpack://MathBox/./src/primitives/types/transform/index.js","webpack://MathBox/./src/primitives/types/operator/clamp.js","webpack://MathBox/./src/primitives/types/operator/grow.js","webpack://MathBox/./src/primitives/types/operator/join.js","webpack://MathBox/./src/primitives/types/operator/lerp.js","webpack://MathBox/./src/primitives/types/operator/memo.js","webpack://MathBox/./src/primitives/types/operator/readback.js","webpack://MathBox/./src/primitives/types/operator/repeat.js","webpack://MathBox/./src/primitives/types/operator/swizzle.js","webpack://MathBox/./src/primitives/types/operator/spread.js","webpack://MathBox/./src/primitives/types/operator/split.js","webpack://MathBox/./src/primitives/types/operator/slice.js","webpack://MathBox/./src/primitives/types/operator/subdivide.js","webpack://MathBox/./src/primitives/types/operator/transpose.js","webpack://MathBox/./src/primitives/types/operator/index.js","webpack://MathBox/./src/primitives/types/present/transition.js","webpack://MathBox/./src/primitives/types/present/move.js","webpack://MathBox/./src/util/ease.js","webpack://MathBox/./src/primitives/types/present/track.js","webpack://MathBox/./src/primitives/types/present/play.js","webpack://MathBox/./src/primitives/types/present/present.js","webpack://MathBox/./src/primitives/types/present/reveal.js","webpack://MathBox/./src/primitives/types/present/slide.js","webpack://MathBox/./src/primitives/types/present/step.js","webpack://MathBox/./src/primitives/types/present/index.js","webpack://MathBox/./src/primitives/types/rtt/rtt.js","webpack://MathBox/./src/primitives/types/rtt/compose.js","webpack://MathBox/./src/primitives/types/rtt/index.js","webpack://MathBox/./src/primitives/types/view/view.js","webpack://MathBox/./src/primitives/types/view/cartesian.js","webpack://MathBox/./src/primitives/types/view/cartesian4.js","webpack://MathBox/./src/primitives/types/view/polar.js","webpack://MathBox/./src/primitives/types/view/spherical.js","webpack://MathBox/./src/primitives/types/view/stereographic.js","webpack://MathBox/./src/primitives/types/view/stereographic4.js","webpack://MathBox/./src/primitives/types/view/index.js","webpack://MathBox/./src/primitives/types/shader/shader.js","webpack://MathBox/./src/primitives/types/shader/index.js","webpack://MathBox/./src/primitives/types/classes.js","webpack://MathBox/./src/primitives/types/types.js","webpack://MathBox/./src/primitives/types/traits.js","webpack://MathBox/./src/util/ticks.js","webpack://MathBox/./src/primitives/types/helpers.js","webpack://MathBox/./src/primitives/types/index.js","webpack://MathBox/./src/primitives/factory.js","webpack://MathBox/./src/primitives/index.js","webpack://MathBox/./src/render/renderable.js","webpack://MathBox/./src/render/scene.js","webpack://MathBox/./src/render/factory.js","webpack://MathBox/./src/render/buffer/buffer.js","webpack://MathBox/./src/render/buffer/texture/datatexture.js","webpack://MathBox/./src/render/buffer/databuffer.js","webpack://MathBox/./src/render/buffer/arraybuffer.js","webpack://MathBox/./src/render/geometry/geometry.js","webpack://MathBox/./src/render/geometry/clipgeometry.js","webpack://MathBox/./src/render/geometry/arrowgeometry.js","webpack://MathBox/./src/render/meshes/base.js","webpack://MathBox/./src/render/meshes/arrow.js","webpack://MathBox/./src/render/buffer/texture/backedtexture.js","webpack://MathBox/./src/render/buffer/atlas.js","webpack://MathBox/./src/render/meshes/debug.js","webpack://MathBox/./src/render/geometry/facegeometry.js","webpack://MathBox/./src/render/meshes/face.js","webpack://MathBox/./src/render/geometry/linegeometry.js","webpack://MathBox/./src/render/meshes/line.js","webpack://MathBox/./src/render/buffer/matrixbuffer.js","webpack://MathBox/./src/render/buffer/texture/rendertarget.js","webpack://MathBox/./src/render/buffer/rendertotexture.js","webpack://MathBox/./src/render/buffer/memo.js","webpack://MathBox/./src/render/geometry/surfacegeometry.js","webpack://MathBox/./src/render/geometry/screengeometry.js","webpack://MathBox/./src/render/meshes/screen.js","webpack://MathBox/./src/render/meshes/memoscreen.js","webpack://MathBox/./src/render/geometry/spritegeometry.js","webpack://MathBox/./src/render/meshes/point.js","webpack://MathBox/./src/render/buffer/pushbuffer.js","webpack://MathBox/./src/render/buffer/readback.js","webpack://MathBox/./src/render/meshes/sprite.js","webpack://MathBox/./src/render/geometry/stripgeometry.js","webpack://MathBox/./src/render/meshes/strip.js","webpack://MathBox/./src/render/meshes/surface.js","webpack://MathBox/./src/render/buffer/textatlas.js","webpack://MathBox/./src/render/buffer/voxelbuffer.js","webpack://MathBox/./src/render/classes.js","webpack://MathBox/./src/render/index.js","webpack://MathBox/./node_modules/shadergraph/src/graph/graph.js","webpack://MathBox/./node_modules/shadergraph/src/graph/outlet.js","webpack://MathBox/./node_modules/shadergraph/src/graph/node.js","webpack://MathBox/./node_modules/shadergraph/src/graph/index.js","webpack://MathBox/./node_modules/shadergraph/src/linker/snippet.js","webpack://MathBox/./node_modules/shadergraph/src/linker/assemble.js","webpack://MathBox/./node_modules/shadergraph/src/linker/program.js","webpack://MathBox/./node_modules/shadergraph/src/linker/link.js","webpack://MathBox/./node_modules/shadergraph/src/linker/layout.js","webpack://MathBox/./node_modules/shadergraph/src/linker/index.js","webpack://MathBox/./node_modules/shadergraph/src/block/block.js","webpack://MathBox/./node_modules/shadergraph/src/block/call.js","webpack://MathBox/./node_modules/shadergraph/src/block/callback.js","webpack://MathBox/./node_modules/shadergraph/src/block/isolate.js","webpack://MathBox/./node_modules/shadergraph/src/block/join.js","webpack://MathBox/./node_modules/shadergraph/src/block/index.js","webpack://MathBox/./node_modules/shadergraph/src/visualize/serialize.js","webpack://MathBox/./node_modules/shadergraph/src/factory/hash.js","webpack://MathBox/./node_modules/shadergraph/src/visualize/markup.js","webpack://MathBox/./node_modules/shadergraph/src/visualize/index.js","webpack://MathBox/./node_modules/shadergraph/src/factory/factory.js","webpack://MathBox/./node_modules/shadergraph/src/factory/material.js","webpack://MathBox/./node_modules/shadergraph/src/factory/library.js","webpack://MathBox/./node_modules/shadergraph/src/factory/queue.js","webpack://MathBox/./node_modules/shadergraph/src/factory/cache.js","webpack://MathBox/./node_modules/shadergraph/src/factory/index.js","webpack://MathBox/./node_modules/shadergraph/src/glsl/compile.js","webpack://MathBox/./node_modules/shadergraph/src/glsl/decl.js","webpack://MathBox/./node_modules/shadergraph/src/glsl/constants.js","webpack://MathBox/./node_modules/shadergraph/src/glsl/parse.js","webpack://MathBox/./node_modules/shadergraph/src/glsl/generate.js","webpack://MathBox/./node_modules/shadergraph/src/glsl/index.js","webpack://MathBox/./node_modules/shadergraph/src/index.js","webpack://MathBox/./src/shaders/factory.js","webpack://MathBox/./src/shaders/index.js","webpack://MathBox/./src/stage/animator.js","webpack://MathBox/./src/stage/api.js","webpack://MathBox/./src/stage/controller.js","webpack://MathBox/./src/stage/index.js","webpack://MathBox/./src/util/index.js","webpack://MathBox/./src/context.js","webpack://MathBox/./src/index.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"THREE\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"MathBox\", [\"THREE\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"MathBox\"] = factory(require(\"THREE\"));\n\telse\n\t\troot[\"MathBox\"] = factory(root[\"THREE\"]);\n})(self, function(__WEBPACK_EXTERNAL_MODULE__824__) {\nreturn ","module.exports = {\"arrow.position\": \"uniform float worldUnit;\\nuniform float lineDepth;\\nuniform float lineWidth;\\nuniform float focusDepth;\\n\\nuniform vec4 geometryClip;\\nuniform float arrowSize;\\nuniform float arrowSpace;\\n\\nattribute vec4 position4;\\nattribute vec3 arrow;\\nattribute vec2 attach;\\n\\n// External\\nvec3 getPosition(vec4 xyzw, float canonical);\\n\\nvoid getArrowGeometry(vec4 xyzw, float near, float far, out vec3 left, out vec3 right, out vec3 start) {\\n right = getPosition(xyzw, 1.0);\\n left = getPosition(vec4(near, xyzw.yzw), 0.0);\\n start = getPosition(vec4(far, xyzw.yzw), 0.0);\\n}\\n\\nmat4 getArrowMatrix(vec3 left, vec3 right, vec3 start) {\\n\\n float depth = focusDepth;\\n if (lineDepth < 1.0) {\\n // Depth blending\\n float z = max(0.00001, -right.z);\\n depth = mix(z, focusDepth, lineDepth);\\n }\\n \\n vec3 diff = left - right;\\n float l = length(diff);\\n if (l == 0.0) {\\n return mat4(1.0, 0.0, 0.0, 0.0,\\n 0.0, 1.0, 0.0, 0.0,\\n 0.0, 0.0, 1.0, 0.0,\\n 0.0, 0.0, 0.0, 1.0);\\n }\\n\\n // Construct TBN matrix around shaft\\n vec3 t = normalize(diff);\\n vec3 n = normalize(cross(t, t.yzx + vec3(.1, .2, .3)));\\n vec3 b = cross(n, t);\\n \\n // Shrink arrows when vector gets too small\\n // Approach linear scaling with cubic ease the smaller we get\\n float size = arrowSize * lineWidth * worldUnit * depth * 1.25;\\n diff = right - start;\\n l = length(diff) * arrowSpace;\\n float mini = clamp(1.0 - l / size * .333, 0.0, 1.0);\\n float scale = 1.0 - mini * mini * mini;\\n float range = size * scale;\\n \\n // Size to 2.5:1 ratio\\n float rangeNB = range / 2.5;\\n\\n // Anchor at end position\\n return mat4(vec4(n * rangeNB, 0),\\n vec4(b * rangeNB, 0),\\n vec4(t * range, 0),\\n vec4(right, 1.0));\\n}\\n\\nvec3 getArrowPosition() {\\n vec3 left, right, start;\\n \\n vec4 p = min(geometryClip, position4);\\n \\n getArrowGeometry(p, attach.x, attach.y, left, right, start);\\n mat4 matrix = getArrowMatrix(left, right, start);\\n return (matrix * vec4(arrow.xyz, 1.0)).xyz;\\n\\n}\\n\",\n\"axis.position\": \"uniform vec4 axisStep;\\nuniform vec4 axisPosition;\\n\\nvec4 getAxisPosition(vec4 xyzw, inout vec4 stpq) {\\n return axisStep * xyzw.x + axisPosition;\\n}\\n\",\n\"cartesian.position\": \"uniform mat4 viewMatrix;\\n\\nvec4 getCartesianPosition(vec4 position, inout vec4 stpq) {\\n return viewMatrix * vec4(position.xyz, 1.0);\\n}\\n\",\n\"cartesian4.position\": \"uniform vec4 basisScale;\\nuniform vec4 basisOffset;\\nuniform vec4 viewScale;\\nuniform vec4 viewOffset;\\n\\nvec4 getCartesian4Position(vec4 position, inout vec4 stpq) {\\n return position * basisScale + basisOffset;\\n}\\n\",\n\"clamp.position\": \"uniform vec4 clampLimit;\\n\\nvec4 getClampXYZW(vec4 xyzw) {\\n return clamp(xyzw, vec4(0.0), clampLimit);\\n}\\n\",\n\"color.opaque\": \"vec4 opaqueColor(vec4 color) {\\n return vec4(color.rgb, 1.0);\\n}\\n\",\n\"face.position\": \"uniform vec4 geometryClip;\\nattribute vec4 position4;\\n\\n// External\\nvec3 getPosition(vec4 xyzw, float canonical);\\n\\nvec3 getFacePosition() {\\n vec4 p = min(geometryClip, position4);\\n return getPosition(p, 1.0);\\n}\\n\",\n\"face.position.normal\": \"attribute vec4 position4;\\n\\n// External\\nvec3 getPosition(vec4 xyzw, float canonical);\\n\\nvarying vec3 vNormal;\\nvarying vec3 vLight;\\nvarying vec3 vPosition;\\n\\nvoid getFaceGeometry(vec4 xyzw, out vec3 pos, out vec3 normal) {\\n vec3 a, b, c;\\n\\n a = getPosition(vec4(xyzw.xyz, 0.0), 0.0);\\n b = getPosition(vec4(xyzw.xyz, 1.0), 0.0);\\n c = getPosition(vec4(xyzw.xyz, 2.0), 0.0);\\n\\n pos = getPosition(xyzw, 1.0);\\n normal = normalize(cross(c - a, b - a));\\n}\\n\\nvec3 getFacePositionNormal() {\\n vec3 center, normal;\\n\\n getFaceGeometry(position4, center, normal);\\n vNormal = normal;\\n vLight = normalize((viewMatrix * vec4(1.0, 2.0, 2.0, 0.0)).xyz);\\n vPosition = -center;\\n\\n return center;\\n}\\n\",\n\"float.encode\": \"/*\\nFloat encoding technique by\\nCarlos Scheidegger\\nhttps://github.com/cscheid/lux/blob/master/src/shade/bits/encode_float.js\\n\\nConversion to GLSL by:\\nhttp://concord-consortium.github.io/lab/experiments/webgl-gpgpu/script.js\\n*/\\n\\nfloat shift_right(float v, float amt) { \\n v = floor(v) + 0.5; \\n return floor(v / exp2(amt)); \\n}\\n\\nfloat shift_left(float v, float amt) { \\n return floor(v * exp2(amt) + 0.5); \\n}\\n\\nfloat mask_last(float v, float bits) { \\n return mod(v, shift_left(1.0, bits)); \\n}\\n\\nfloat extract_bits(float num, float from, float to) { \\n from = floor(from + 0.5); to = floor(to + 0.5); \\n return mask_last(shift_right(num, from), to - from); \\n}\\n\\nvec4 encode_float(float val) { \\n if (val == 0.0) return vec4(0, 0, 0, 0); \\n float valuesign = val > 0.0 ? 0.0 : 1.0; \\n val = abs(val); \\n float exponent = floor(log2(val)); \\n float biased_exponent = exponent + 127.0; \\n float fraction = ((val / exp2(exponent)) - 1.0) * 8388608.0; \\n float t = biased_exponent / 2.0; \\n float last_bit_of_biased_exponent = fract(t) * 2.0; \\n float remaining_bits_of_biased_exponent = floor(t); \\n float byte4 = extract_bits(fraction, 0.0, 8.0) / 255.0; \\n float byte3 = extract_bits(fraction, 8.0, 16.0) / 255.0; \\n float byte2 = (last_bit_of_biased_exponent * 128.0 + extract_bits(fraction, 16.0, 23.0)) / 255.0; \\n float byte1 = (valuesign * 128.0 + remaining_bits_of_biased_exponent) / 255.0; \\n return vec4(byte4, byte3, byte2, byte1); \\n}\\n\",\n\"float.index.pack\": \"uniform vec4 indexModulus;\\n\\nvec4 getSample(vec4 xyzw);\\nvec4 getIndex(vec4 xyzw);\\n\\nvec4 floatPackIndex(vec4 xyzw) {\\n vec4 value = getSample(xyzw);\\n vec4 index = getIndex(xyzw);\\n\\n vec4 offset = floor(index + .5) * indexModulus;\\n vec2 sum2 = offset.xy + offset.zw;\\n float sum = sum2.x + sum2.y;\\n return vec4(value.xyz, sum);\\n}\",\n\"float.stretch\": \"vec4 getSample(vec4 xyzw);\\n\\nfloat floatStretch(vec4 xyzw, float channelIndex) {\\n vec4 sample = getSample(xyzw);\\n vec2 xy = channelIndex > 1.5 ? sample.zw : sample.xy;\\n return mod(channelIndex, 2.0) > .5 ? xy.y : xy.x;\\n}\",\n\"fragment.clip.dashed\": \"varying float vClipStrokeWidth;\\nvarying float vClipStrokeIndex;\\nvarying vec3 vClipStrokeEven;\\nvarying vec3 vClipStrokeOdd;\\nvarying vec3 vClipStrokePosition;\\n\\nvoid clipStrokeFragment() {\\n bool odd = mod(vClipStrokeIndex, 2.0) >= 1.0;\\n\\n vec3 tangent;\\n if (odd) {\\n tangent = vClipStrokeOdd;\\n }\\n else {\\n tangent = vClipStrokeEven;\\n }\\n\\n float travel = dot(vClipStrokePosition, normalize(tangent)) / vClipStrokeWidth;\\n if (mod(travel, 16.0) > 8.0) {\\n discard;\\n }\\n}\\n\",\n\"fragment.clip.dotted\": \"varying float vClipStrokeWidth;\\nvarying float vClipStrokeIndex;\\nvarying vec3 vClipStrokeEven;\\nvarying vec3 vClipStrokeOdd;\\nvarying vec3 vClipStrokePosition;\\n\\nvoid clipStrokeFragment() {\\n bool odd = mod(vClipStrokeIndex, 2.0) >= 1.0;\\n\\n vec3 tangent;\\n if (odd) {\\n tangent = vClipStrokeOdd;\\n }\\n else {\\n tangent = vClipStrokeEven;\\n }\\n\\n float travel = dot(vClipStrokePosition, normalize(tangent)) / vClipStrokeWidth;\\n if (mod(travel, 4.0) > 2.0) {\\n discard;\\n }\\n}\\n\",\n\"fragment.clip.ends\": \"varying vec2 vClipEnds;\\n\\nvoid clipEndsFragment() {\\n if (vClipEnds.x < 0.0 || vClipEnds.y < 0.0) discard;\\n}\\n\",\n\"fragment.clip.proximity\": \"varying float vClipProximity;\\n\\nvoid clipProximityFragment() {\\n if (vClipProximity >= 0.5) discard;\\n}\",\n\"fragment.color\": \"void setFragmentColor(vec4 color) {\\n gl_FragColor = color;\\n}\",\n\"fragment.map.rgba\": \"vec4 fragmentRGBA(vec4 rgba, vec4 stpq) {\\n return rgba;\\n}\",\n\"fragment.solid\": \"void setFragmentColor(vec4 color) {\\n if (color.a < 1.0) discard;\\n gl_FragColor = color;\\n}\",\n\"fragment.transparent\": \"void setFragmentColor(vec4 color) {\\n if (color.a >= 1.0) discard;\\n gl_FragColor = color;\\n}\",\n\"grid.position\": \"uniform vec4 gridPosition;\\nuniform vec4 gridStep;\\nuniform vec4 gridAxis;\\n\\nvec4 sampleData(vec2 xy);\\n\\nvec4 getGridPosition(vec4 xyzw) {\\n vec4 onAxis = gridAxis * sampleData(vec2(xyzw.y, 0.0)).x;\\n vec4 offAxis = gridStep * xyzw.x + gridPosition;\\n return onAxis + offAxis;\\n}\\n\",\n\"grow.position\": \"uniform float growScale;\\nuniform vec4 growMask;\\nuniform vec4 growAnchor;\\n\\nvec4 getSample(vec4 xyzw);\\n\\nvec4 getGrowSample(vec4 xyzw) {\\n vec4 anchor = xyzw * growMask + growAnchor;\\n\\n vec4 position = getSample(xyzw);\\n vec4 center = getSample(anchor);\\n\\n return mix(center, position, growScale);\\n}\",\n\"join.position\": \"uniform float joinStride;\\nuniform float joinStrideInv;\\n\\nfloat getIndex(vec4 xyzw);\\nvec4 getRest(vec4 xyzw);\\nvec4 injectIndices(float a, float b);\\n\\nvec4 getJoinXYZW(vec4 xyzw) {\\n\\n float a = getIndex(xyzw);\\n float b = a * joinStrideInv;\\n\\n float integer = floor(b);\\n float fraction = b - integer;\\n \\n return injectIndices(fraction * joinStride, integer) + getRest(xyzw);\\n}\\n\",\n\"label.alpha\": \"varying float vPixelSize;\\n\\nvec4 getLabelAlphaColor(vec4 color, vec4 sample) {\\n float mask = clamp(sample.r * 1000.0, 0.0, 1.0);\\n float alpha = (sample.r - .5) * vPixelSize + .5;\\n float a = mask * alpha * color.a;\\n if (a <= 0.0) discard;\\n return vec4(color.xyz, a);\\n}\\n\",\n\"label.map\": \"vec2 mapUV(vec4 uvwo, vec4 stpq) {\\n return uvwo.xy;\\n}\\n\",\n\"label.outline\": \"uniform float outlineExpand;\\nuniform float outlineStep;\\nuniform vec3 outlineColor;\\n\\nvarying float vPixelSize;\\n\\nconst float PIXEL_STEP = 255.0 / 16.0;\\n\\nvec4 getLabelOutlineColor(vec4 color, vec4 sample) {\\n float ps = vPixelSize * PIXEL_STEP;\\n float os = outlineStep;\\n\\n float sdf = sample.r - .5 + outlineExpand;\\n vec2 sdfs = vec2(sdf, sdf + os);\\n vec2 alpha = clamp(sdfs * ps + .5, 0.0, 1.0);\\n\\n if (alpha.y <= 0.0) {\\n discard;\\n }\\n\\n vec3 blend = color.xyz;\\n if (alpha.y > alpha.x) {\\n blend = sqrt(mix(outlineColor * outlineColor, blend * blend, alpha.x));\\n }\\n \\n return vec4(blend, alpha.y * color.a);\\n}\\n\",\n\"layer.position\": \"uniform vec4 layerScale;\\nuniform vec4 layerBias;\\n\\nvec4 layerPosition(vec4 position, inout vec4 stpq) {\\n return layerScale * position + layerBias;\\n}\\n\",\n\"lerp.depth\": \"// External\\nvec4 sampleData(vec4 xyzw);\\n\\nvec4 lerpDepth(vec4 xyzw) {\\n float x = xyzw.z;\\n float i = floor(x);\\n float f = x - i;\\n \\n vec4 xyzw1 = vec4(xyzw.xy, i, xyzw.w);\\n vec4 xyzw2 = vec4(xyzw.xy, i + 1.0, xyzw.w);\\n \\n vec4 a = sampleData(xyzw1);\\n vec4 b = sampleData(xyzw2);\\n\\n return mix(a, b, f);\\n}\\n\",\n\"lerp.height\": \"// External\\nvec4 sampleData(vec4 xyzw);\\n\\nvec4 lerpHeight(vec4 xyzw) {\\n float x = xyzw.y;\\n float i = floor(x);\\n float f = x - i;\\n \\n vec4 xyzw1 = vec4(xyzw.x, i, xyzw.zw);\\n vec4 xyzw2 = vec4(xyzw.x, i + 1.0, xyzw.zw);\\n \\n vec4 a = sampleData(xyzw1);\\n vec4 b = sampleData(xyzw2);\\n\\n return mix(a, b, f);\\n}\\n\",\n\"lerp.items\": \"// External\\nvec4 sampleData(vec4 xyzw);\\n\\nvec4 lerpItems(vec4 xyzw) {\\n float x = xyzw.w;\\n float i = floor(x);\\n float f = x - i;\\n \\n vec4 xyzw1 = vec4(xyzw.xyz, i);\\n vec4 xyzw2 = vec4(xyzw.xyz, i + 1.0);\\n \\n vec4 a = sampleData(xyzw1);\\n vec4 b = sampleData(xyzw2);\\n\\n return mix(a, b, f);\\n}\\n\",\n\"lerp.width\": \"// External\\nvec4 sampleData(vec4 xyzw);\\n\\nvec4 lerpWidth(vec4 xyzw) {\\n float x = xyzw.x;\\n float i = floor(x);\\n float f = x - i;\\n \\n vec4 xyzw1 = vec4(i, xyzw.yzw);\\n vec4 xyzw2 = vec4(i + 1.0, xyzw.yzw);\\n \\n vec4 a = sampleData(xyzw1);\\n vec4 b = sampleData(xyzw2);\\n\\n return mix(a, b, f);\\n}\\n\",\n\"line.position\": \"// Units and calibration\\nuniform float worldUnit;\\nuniform float lineWidth;\\nuniform float lineDepth;\\nuniform float focusDepth;\\n\\n// General data index\\nuniform vec4 geometryClip;\\nattribute vec4 position4;\\n\\n// (Start/mid/end -1/0/1, top/bottom -1,1) \\nattribute vec2 line;\\n\\n// 0...1 for round or bevel joins\\n#ifdef LINE_JOIN_DETAIL\\nattribute float joint;\\n#else\\nconst float joint = 0.0;\\n#endif\\n\\n// Knock out excessively long line segments (e.g. for asymtpotes)\\n#ifdef LINE_PROXIMITY\\nuniform float lineProximity;\\nvarying float vClipProximity;\\n#endif\\n\\n// Ghetto line stroking (local only, not global)\\n#ifdef LINE_STROKE\\nvarying float vClipStrokeWidth;\\nvarying float vClipStrokeIndex;\\nvarying vec3 vClipStrokeEven;\\nvarying vec3 vClipStrokeOdd;\\nvarying vec3 vClipStrokePosition;\\n#endif\\n\\n// External\\nvec3 getPosition(vec4 xyzw, float canonical);\\n\\n// Clip line ends for arrows / decoration\\n#ifdef LINE_CLIP\\nuniform float clipRange;\\nuniform vec2 clipStyle;\\nuniform float clipSpace;\\n\\nattribute vec2 strip;\\n\\nvarying vec2 vClipEnds;\\n\\nvoid clipEnds(vec4 xyzw, vec3 center, vec3 pos) {\\n\\n // Sample end of line strip\\n vec4 xyzwE = vec4(strip.y, xyzw.yzw);\\n vec3 end = getPosition(xyzwE, 0.0);\\n\\n // Sample start of line strip\\n vec4 xyzwS = vec4(strip.x, xyzw.yzw);\\n vec3 start = getPosition(xyzwS, 0.0);\\n\\n // Measure length\\n vec3 diff = end - start;\\n float l = length(diff) * clipSpace;\\n\\n // Arrow length (=2.5x radius)\\n float arrowSize = 1.25 * clipRange * lineWidth * worldUnit;\\n\\n vClipEnds = vec2(1.0);\\n\\n if (clipStyle.y > 0.0) {\\n // Depth blend end\\n float depth = focusDepth;\\n if (lineDepth < 1.0) {\\n float z = max(0.00001, -end.z);\\n depth = mix(z, focusDepth, lineDepth);\\n }\\n \\n // Absolute arrow length\\n float size = arrowSize * depth;\\n\\n // Adjust clip range\\n // Approach linear scaling with cubic ease the smaller we get\\n float mini = clamp(1.0 - l / size * .333, 0.0, 1.0);\\n float scale = 1.0 - mini * mini * mini; \\n float invrange = 1.0 / (size * scale);\\n \\n // Clip end\\n diff = normalize(end - center);\\n float d = dot(end - pos, diff);\\n vClipEnds.x = d * invrange - 1.0;\\n }\\n\\n if (clipStyle.x > 0.0) {\\n // Depth blend start\\n float depth = focusDepth;\\n if (lineDepth < 1.0) {\\n float z = max(0.00001, -start.z);\\n depth = mix(z, focusDepth, lineDepth);\\n }\\n \\n // Absolute arrow length\\n float size = arrowSize * depth;\\n\\n // Adjust clip range\\n // Approach linear scaling with cubic ease the smaller we get\\n float mini = clamp(1.0 - l / size * .333, 0.0, 1.0);\\n float scale = 1.0 - mini * mini * mini; \\n float invrange = 1.0 / (size * scale);\\n \\n // Clip start \\n diff = normalize(center - start);\\n float d = dot(pos - start, diff);\\n vClipEnds.y = d * invrange - 1.0;\\n }\\n\\n\\n}\\n#endif\\n\\n// Adjust left/center/right to be inside near/far z range\\nconst float epsilon = 1e-5;\\nvoid fixCenter(inout vec3 left, inout vec3 center, inout vec3 right) {\\n if (center.z >= 0.0) {\\n if (left.z < 0.0) {\\n float d = (center.z + epsilon) / (center.z - left.z);\\n center = mix(center, left, d);\\n }\\n else if (right.z < 0.0) {\\n float d = (center.z + epsilon) / (center.z - right.z);\\n center = mix(center, right, d);\\n }\\n }\\n\\n if (left.z >= 0.0) {\\n if (center.z < 0.0) {\\n float d = (left.z + epsilon) / (left.z - center.z);\\n left = mix(left, center, d);\\n }\\n }\\n\\n if (right.z >= 0.0) {\\n if (center.z < 0.0) {\\n float d = (right.z + epsilon) / (right.z - center.z);\\n right = mix(right, center, d);\\n }\\n }\\n}\\n\\n// Sample the source data in an edge-aware manner\\nvoid getLineGeometry(vec4 xyzw, float edge, out vec3 left, out vec3 center, out vec3 right) {\\n vec4 delta = vec4(1.0, 0.0, 0.0, 0.0);\\n\\n center = getPosition(xyzw, 1.0);\\n left = (edge > -0.5) ? getPosition(xyzw - delta, 0.0) : center;\\n right = (edge < 0.5) ? getPosition(xyzw + delta, 0.0) : center;\\n}\\n\\n// Calculate the position for a vertex along the line, including joins\\nvec3 getLineJoin(float edge, bool odd, vec3 left, vec3 center, vec3 right, float width, float offset, float joint) {\\n vec2 join = vec2(1.0, 0.0);\\n\\n fixCenter(left, center, right);\\n\\n vec4 a = vec4(left.xy, right.xy);\\n vec4 b = a / vec4(left.zz, right.zz);\\n\\n vec2 l = b.xy;\\n vec2 r = b.zw;\\n vec2 c = center.xy / center.z;\\n\\n vec4 d = vec4(l, c) - vec4(c, r);\\n float l1 = dot(d.xy, d.xy);\\n float l2 = dot(d.zw, d.zw);\\n\\n if (l1 + l2 > 0.0) {\\n \\n if (edge > 0.5 || l2 == 0.0) {\\n vec2 nl = normalize(d.xy);\\n vec2 tl = vec2(nl.y, -nl.x);\\n\\n#ifdef LINE_PROXIMITY\\n vClipProximity = 1.0;\\n#endif\\n\\n#ifdef LINE_STROKE\\n vClipStrokeEven = vClipStrokeOdd = normalize(left - center);\\n#endif\\n join = tl;\\n }\\n else if (edge < -0.5 || l1 == 0.0) {\\n vec2 nr = normalize(d.zw);\\n vec2 tr = vec2(nr.y, -nr.x);\\n\\n#ifdef LINE_PROXIMITY\\n vClipProximity = 1.0;\\n#endif\\n\\n#ifdef LINE_STROKE\\n vClipStrokeEven = vClipStrokeOdd = normalize(center - right);\\n#endif\\n join = tr;\\n }\\n else {\\n // Limit join stretch for tiny segments\\n float lmin2 = min(l1, l2) / (width * width);\\n\\n // Hide line segment if ratio of leg lengths exceeds promixity threshold\\n#ifdef LINE_PROXIMITY\\n float lr = l1 / l2;\\n float rl = l2 / l1;\\n float ratio = max(lr, rl);\\n float thresh = lineProximity + 1.0;\\n vClipProximity = (ratio > thresh * thresh) ? 1.0 : 0.0;\\n#endif\\n\\n // Calculate normals/tangents\\n vec2 nl = normalize(d.xy);\\n vec2 nr = normalize(d.zw);\\n\\n // Calculate tangents\\n vec2 tl = vec2(nl.y, -nl.x);\\n vec2 tr = vec2(nr.y, -nr.x);\\n\\n#ifdef LINE_PROXIMITY\\n // Mix tangents according to leg lengths\\n vec2 tc = normalize(mix(tl, tr, l1/(l1+l2)));\\n#else\\n // Average tangent\\n vec2 tc = normalize(tl + tr);\\n#endif\\n \\n // Miter join\\n float cosA = dot(nl, tc);\\n float sinA = max(0.1, abs(dot(tl, tc)));\\n float factor = cosA / sinA;\\n float scale = sqrt(1.0 + min(lmin2, factor * factor));\\n\\n // Stroke normals\\n#ifdef LINE_STROKE\\n vec3 stroke1 = normalize(left - center);\\n vec3 stroke2 = normalize(center - right);\\n\\n if (odd) {\\n vClipStrokeEven = stroke1;\\n vClipStrokeOdd = stroke2;\\n }\\n else {\\n vClipStrokeEven = stroke2;\\n vClipStrokeOdd = stroke1;\\n }\\n#endif\\n\\n#ifdef LINE_JOIN_MITER\\n // Apply straight up miter\\n join = tc * scale;\\n#endif\\n\\n#ifdef LINE_JOIN_ROUND\\n // Slerp bevel join into circular arc\\n float dotProduct = dot(nl, nr);\\n float angle = acos(dotProduct);\\n float sinT = sin(angle);\\n join = (sin((1.0 - joint) * angle) * tl + sin(joint * angle) * tr) / sinT;\\n#endif\\n\\n#ifdef LINE_JOIN_BEVEL\\n // Direct bevel join between two flat ends\\n float dotProduct = dot(nl, nr);\\n join = mix(tl, tr, joint);\\n#endif\\n\\n#ifdef LINE_JOIN_DETAIL\\n // Check if on inside or outside of joint\\n float crossProduct = nl.x * nr.y - nl.y * nr.x;\\n if (offset * crossProduct < 0.0) {\\n // For near-180-degree bends, correct back to a miter to avoid discontinuities\\n float ratio = clamp(-dotProduct * 2.0 - 1.0, 0.0, 1.0);\\n // Otherwise collapse the inside vertices into one.\\n join = mix(tc * scale, join, ratio * ratio * ratio);\\n }\\n#endif\\n\\n }\\n return vec3(join, 0.0);\\n }\\n else {\\n return vec3(0.0);\\n }\\n\\n}\\n\\n// Calculate final line position\\nvec3 getLinePosition() {\\n vec3 left, center, right, join;\\n\\n // left/center/right\\n float edge = line.x;\\n // up/down\\n float offset = line.y;\\n\\n // Clip data\\n vec4 p = min(geometryClip, position4);\\n edge += max(0.0, position4.x - geometryClip.x);\\n\\n // Get position + adjacent neighbours\\n getLineGeometry(p, edge, left, center, right);\\n\\n#ifdef LINE_STROKE\\n // Set parameters for line stroke fragment shader\\n vClipStrokePosition = center;\\n vClipStrokeIndex = p.x;\\n bool odd = mod(p.x, 2.0) >= 1.0;\\n#else\\n bool odd = true;\\n#endif\\n\\n // Divide line width up/down\\n float width = lineWidth * 0.5;\\n\\n float depth = focusDepth;\\n if (lineDepth < 1.0) {\\n // Depth blending\\n float z = max(0.00001, -center.z);\\n depth = mix(z, focusDepth, lineDepth);\\n }\\n width *= depth;\\n\\n // Convert to world units\\n width *= worldUnit;\\n\\n // Calculate line join\\n join = getLineJoin(edge, odd, left, center, right, width, offset, joint);\\n vec3 pos = center + join * offset * width;\\n\\n#ifdef LINE_STROKE\\n vClipStrokeWidth = width;\\n#endif\\n\\n#ifdef LINE_CLIP\\n clipEnds(p, center, pos);\\n#endif\\n\\n return pos;\\n}\\n\",\n\"map.2d.data\": \"uniform vec2 dataResolution;\\nuniform vec2 dataPointer;\\n\\nvec2 map2DData(vec2 xy) {\\n return (xy + dataPointer) * dataResolution;\\n}\\n\",\n\"map.2d.data.wrap\": \"uniform vec2 dataResolution;\\nuniform vec2 dataPointer;\\n\\nvec2 map2DData(vec2 xy) {\\n return fract((xy + dataPointer) * dataResolution);\\n}\\n\",\n\"map.xyzw.2dv\": \"void mapXyzw2DV(vec4 xyzw, out vec2 xy, out float z) {\\n xy = xyzw.xy;\\n z = xyzw.z;\\n}\\n\\n\",\n\"map.xyzw.align\": \"vec4 alignXYZW(vec4 xyzw) {\\n return floor(xyzw + .5);\\n}\\n\\n\",\n\"map.xyzw.texture\": \"uniform float textureItems;\\nuniform float textureHeight;\\n\\nvec2 mapXyzwTexture(vec4 xyzw) {\\n \\n float x = xyzw.x;\\n float y = xyzw.y;\\n float z = xyzw.z;\\n float i = xyzw.w;\\n \\n return vec2(i, y) + vec2(x, z) * vec2(textureItems, textureHeight);\\n}\\n\\n\",\n\"mesh.fragment.color\": \"varying vec4 vColor;\\n\\nvec4 getColor() {\\n return vColor;\\n}\\n\",\n\"mesh.fragment.map\": \"#ifdef POSITION_STPQ\\nvarying vec4 vSTPQ;\\n#endif\\n#ifdef POSITION_U\\nvarying float vU;\\n#endif\\n#ifdef POSITION_UV\\nvarying vec2 vUV;\\n#endif\\n#ifdef POSITION_UVW\\nvarying vec3 vUVW;\\n#endif\\n#ifdef POSITION_UVWO\\nvarying vec4 vUVWO;\\n#endif\\n\\nvec4 getSample(vec4 uvwo, vec4 stpq);\\n\\nvec4 getMapColor() {\\n #ifdef POSITION_STPQ\\n vec4 stpq = vSTPQ;\\n #else\\n vec4 stpq = vec4(0.0);\\n #endif\\n\\n #ifdef POSITION_U\\n vec4 uvwo = vec4(vU, 0.0, 0.0, 0.0);\\n #endif\\n #ifdef POSITION_UV\\n vec4 uvwo = vec4(vUV, 0.0, 0.0);\\n #endif\\n #ifdef POSITION_UVW\\n vec4 uvwo = vec4(vUVW, 0.0);\\n #endif\\n #ifdef POSITION_UVWO\\n vec4 uvwo = vec4(vUVWO);\\n #endif\\n\\n return getSample(uvwo, stpq);\\n}\\n\",\n\"mesh.fragment.mask\": \"varying float vMask;\\n\\nfloat ease(float t) {\\n t = clamp(t, 0.0, 1.0);\\n return t * t * (3.0 - 2.0 * t);\\n}\\n\\nvec4 maskColor() {\\n if (vMask <= 0.0) discard;\\n return vec4(vec3(1.0), ease(vMask));\\n}\\n\",\n\"mesh.fragment.material\": \"#ifdef POSITION_STPQ\\nvarying vec4 vSTPQ;\\n#endif\\n#ifdef POSITION_U\\nvarying float vU;\\n#endif\\n#ifdef POSITION_UV\\nvarying vec2 vUV;\\n#endif\\n#ifdef POSITION_UVW\\nvarying vec3 vUVW;\\n#endif\\n#ifdef POSITION_UVWO\\nvarying vec4 vUVWO;\\n#endif\\n\\nvec4 getSample(vec4 rgba, vec4 stpq);\\n\\nvec4 getMaterialColor(vec4 rgba) {\\n vec4 stpq = vec4(0.0);\\n\\n #ifdef POSITION_U\\n stpq.x = vU;\\n #endif\\n #ifdef POSITION_UV\\n stpq.xy = vUV;\\n #endif\\n #ifdef POSITION_UVW\\n stpq.xyz = vUVW;\\n #endif\\n #ifdef POSITION_UVWO\\n stpq = vUVWO;\\n #endif\\n\\n #ifdef POSITION_STPQ\\n stpq = vSTPQ;\\n #endif\\n\\n return getSample(rgba, stpq);\\n}\\n\",\n\"mesh.fragment.shaded\": \"varying vec3 vNormal;\\nvarying vec3 vLight;\\nvarying vec3 vPosition;\\n\\nvec3 offSpecular(vec3 color) {\\n vec3 c = 1.0 - color;\\n return 1.0 - c * c;\\n}\\n\\nvec4 getShadedColor(vec4 rgba) {\\n \\n vec3 color = rgba.xyz;\\n vec3 color2 = offSpecular(rgba.xyz);\\n\\n vec3 normal = normalize(vNormal);\\n vec3 light = normalize(vLight);\\n vec3 position = normalize(vPosition);\\n \\n float side = gl_FrontFacing ? -1.0 : 1.0;\\n float cosine = side * dot(normal, light);\\n float diffuse = mix(max(0.0, cosine), .5 + .5 * cosine, .1);\\n \\n vec3 halfLight = normalize(light + position);\\n\\tfloat cosineHalf = max(0.0, side * dot(normal, halfLight));\\n\\tfloat specular = pow(cosineHalf, 16.0);\\n\\t\\n\\treturn vec4(color * (diffuse * .9 + .05) + .25 * color2 * specular, rgba.a);\\n}\\n\",\n\"mesh.fragment.texture\": \"\",\n\"mesh.gamma.in\": \"vec4 getGammaInColor(vec4 rgba) {\\n return vec4(rgba.rgb * rgba.rgb, rgba.a);\\n}\\n\",\n\"mesh.gamma.out\": \"vec4 getGammaOutColor(vec4 rgba) {\\n return vec4(sqrt(rgba.rgb), rgba.a);\\n}\\n\",\n\"mesh.map.uvwo\": \"vec4 mapUVWO(vec4 uvwo, vec4 stpq) {\\n return uvwo;\\n}\\n\",\n\"mesh.position\": \"uniform vec4 geometryClip;\\nattribute vec4 position4;\\n\\n// External\\nvec3 getPosition(vec4 xyzw, float canonical);\\n\\nvec3 getMeshPosition() {\\n vec4 p = min(geometryClip, position4);\\n return getPosition(p, 1.0);\\n}\\n\",\n\"mesh.vertex.color\": \"attribute vec4 position4;\\nuniform vec4 geometryClip;\\nvarying vec4 vColor;\\n\\n// External\\nvec4 getSample(vec4 xyzw);\\n\\nvoid vertexColor() {\\n vec4 p = min(geometryClip, position4);\\n vColor = getSample(p);\\n}\\n\",\n\"mesh.vertex.mask\": \"attribute vec4 position4;\\nuniform vec4 geometryResolution;\\nuniform vec4 geometryClip;\\nvarying float vMask;\\n\\n// External\\nfloat getSample(vec4 xyzw);\\n\\nvoid maskLevel() {\\n vec4 p = min(geometryClip, position4);\\n vMask = getSample(p * geometryResolution);\\n}\\n\",\n\"mesh.vertex.position\": \"uniform vec4 geometryResolution;\\n\\n#ifdef POSITION_STPQ\\nvarying vec4 vSTPQ;\\n#endif\\n#ifdef POSITION_U\\nvarying float vU;\\n#endif\\n#ifdef POSITION_UV\\nvarying vec2 vUV;\\n#endif\\n#ifdef POSITION_UVW\\nvarying vec3 vUVW;\\n#endif\\n#ifdef POSITION_UVWO\\nvarying vec4 vUVWO;\\n#endif\\n\\n// External\\nvec3 getPosition(vec4 xyzw, in vec4 stpqIn, out vec4 stpqOut);\\n\\nvec3 getMeshPosition(vec4 xyzw, float canonical) {\\n vec4 stpqOut, stpqIn = xyzw * geometryResolution;\\n vec3 xyz = getPosition(xyzw, stpqIn, stpqOut);\\n\\n #ifdef POSITION_MAP\\n if (canonical > 0.5) {\\n #ifdef POSITION_STPQ\\n vSTPQ = stpqOut;\\n #endif\\n #ifdef POSITION_U\\n vU = stpqOut.x;\\n #endif\\n #ifdef POSITION_UV\\n vUV = stpqOut.xy;\\n #endif\\n #ifdef POSITION_UVW\\n vUVW = stpqOut.xyz;\\n #endif\\n #ifdef POSITION_UVWO\\n vUVWO = stpqOut;\\n #endif\\n }\\n #endif\\n return xyz;\\n}\\n\",\n\"move.position\": \"uniform float transitionEnter;\\nuniform float transitionExit;\\nuniform vec4 transitionScale;\\nuniform vec4 transitionBias;\\nuniform float transitionSkew;\\nuniform float transitionActive;\\n\\nuniform vec4 moveFrom;\\nuniform vec4 moveTo;\\n\\nfloat ease(float t) {\\n t = clamp(t, 0.0, 1.0);\\n return 1.0 - (2.0 - t) * t;\\n}\\n\\nvec4 getTransitionPosition(vec4 xyzw, inout vec4 stpq) {\\n if (transitionActive < 0.5) return xyzw;\\n\\n float enter = transitionEnter;\\n float exit = transitionExit;\\n float skew = transitionSkew;\\n vec4 scale = transitionScale;\\n vec4 bias = transitionBias;\\n\\n float factor = 1.0 + skew;\\n float offset = dot(vec4(1.0), stpq * scale + bias);\\n\\n float a1 = ease(enter * factor - offset);\\n float a2 = ease(exit * factor + offset - skew);\\n\\n return xyzw + a1 * moveFrom + a2 * moveTo;\\n}\",\n\"object.mask.default\": \"vec4 getMask(vec4 xyzw) {\\n return vec4(1.0);\\n}\",\n\"point.alpha.circle\": \"varying float vPixelSize;\\n\\nfloat getDiscAlpha(float mask) {\\n // Approximation: 1 - x*x is approximately linear around x = 1 with slope 2\\n return vPixelSize * (1.0 - mask);\\n // return vPixelSize * 2.0 * (1.0 - sqrt(mask));\\n}\\n\",\n\"point.alpha.circle.hollow\": \"varying float vPixelSize;\\n\\nfloat getDiscHollowAlpha(float mask) {\\n return vPixelSize * (0.5 - 2.0 * abs(sqrt(mask) - .75));\\n}\\n\",\n\"point.alpha.generic\": \"varying float vPixelSize;\\n\\nfloat getGenericAlpha(float mask) {\\n return vPixelSize * 2.0 * (1.0 - mask);\\n}\\n\",\n\"point.alpha.generic.hollow\": \"varying float vPixelSize;\\n\\nfloat getGenericHollowAlpha(float mask) {\\n return vPixelSize * (0.5 - 2.0 * abs(mask - .75));\\n}\\n\",\n\"point.edge\": \"varying vec2 vSprite;\\n\\nfloat getSpriteMask(vec2 xy);\\nfloat getSpriteAlpha(float mask);\\n\\nvoid setFragmentColorFill(vec4 color) {\\n float mask = getSpriteMask(vSprite);\\n if (mask > 1.0) {\\n discard;\\n }\\n float alpha = getSpriteAlpha(mask);\\n if (alpha >= 1.0) {\\n discard;\\n }\\n gl_FragColor = vec4(color.rgb, alpha * color.a);\\n}\\n\",\n\"point.fill\": \"varying vec2 vSprite;\\n\\nfloat getSpriteMask(vec2 xy);\\nfloat getSpriteAlpha(float mask);\\n\\nvoid setFragmentColorFill(vec4 color) {\\n float mask = getSpriteMask(vSprite);\\n if (mask > 1.0) {\\n discard;\\n }\\n float alpha = getSpriteAlpha(mask);\\n if (alpha < 1.0) {\\n discard;\\n }\\n gl_FragColor = color;\\n}\\n\\n\",\n\"point.mask.circle\": \"varying float vPixelSize;\\n\\nfloat getCircleMask(vec2 uv) {\\n return dot(uv, uv);\\n}\\n\",\n\"point.mask.diamond\": \"varying float vPixelSize;\\n\\nfloat getDiamondMask(vec2 uv) {\\n vec2 a = abs(uv);\\n return a.x + a.y;\\n}\\n\",\n\"point.mask.down\": \"varying float vPixelSize;\\n\\nfloat getTriangleDownMask(vec2 uv) {\\n uv.y += .25;\\n return max(uv.y, abs(uv.x) * .866 - uv.y * .5 + .6);\\n}\\n\",\n\"point.mask.left\": \"varying float vPixelSize;\\n\\nfloat getTriangleLeftMask(vec2 uv) {\\n uv.x += .25;\\n return max(uv.x, abs(uv.y) * .866 - uv.x * .5 + .6);\\n}\\n\",\n\"point.mask.right\": \"varying float vPixelSize;\\n\\nfloat getTriangleRightMask(vec2 uv) {\\n uv.x -= .25;\\n return max(-uv.x, abs(uv.y) * .866 + uv.x * .5 + .6);\\n}\\n\",\n\"point.mask.square\": \"varying float vPixelSize;\\n\\nfloat getSquareMask(vec2 uv) {\\n vec2 a = abs(uv);\\n return max(a.x, a.y);\\n}\\n\",\n\"point.mask.up\": \"varying float vPixelSize;\\n\\nfloat getTriangleUpMask(vec2 uv) {\\n uv.y -= .25;\\n return max(-uv.y, abs(uv.x) * .866 + uv.y * .5 + .6);\\n}\\n\",\n\"point.position\": \"uniform float pointDepth;\\n\\nuniform float pixelUnit;\\nuniform float renderScale;\\nuniform float renderScaleInv;\\nuniform float focusDepth;\\n\\nuniform vec4 geometryClip;\\nattribute vec4 position4;\\nattribute vec2 sprite;\\n\\nvarying vec2 vSprite;\\nvarying float vPixelSize;\\n\\nconst float pointScale = POINT_SHAPE_SCALE;\\n\\n// External\\nfloat getPointSize(vec4 xyzw);\\nvec3 getPosition(vec4 xyzw, float canonical);\\n\\nvec3 getPointPosition() {\\n vec4 p = min(geometryClip, position4);\\n vec3 center = getPosition(p, 1.0);\\n\\n // Depth blending\\n // TODO: orthographic camera\\n // Workaround: set depth = 0\\n float z = -center.z;\\n float depth = mix(z, focusDepth, pointDepth);\\n \\n // Match device/unit mapping \\n // Sprite goes from -1..1, width = 2.\\n float pointSize = getPointSize(p);\\n float size = pointScale * pointSize * pixelUnit * .5;\\n float depthSize = depth * size;\\n \\n // Pad sprite by half a pixel to make the anti-aliasing straddle the pixel edge\\n // Note: pixelsize measures radius\\n float pixelSize = .5 * (pointDepth > 0.0 ? depthSize / z : size);\\n float paddedSize = pixelSize + 0.5;\\n float padFactor = paddedSize / pixelSize;\\n\\n vPixelSize = paddedSize;\\n vSprite = sprite;\\n\\n return center + vec3(sprite * depthSize * renderScaleInv * padFactor, 0.0);\\n}\\n\",\n\"point.size.uniform\": \"uniform float pointSize;\\n\\nfloat getPointSize(vec4 xyzw) {\\n return pointSize;\\n}\",\n\"point.size.varying\": \"uniform float pointSize;\\n\\nvec4 getSample(vec4 xyzw);\\n\\nfloat getPointSize(vec4 xyzw) {\\n return pointSize * getSample(xyzw).x;\\n}\",\n\"polar.position\": \"uniform float polarBend;\\nuniform float polarFocus;\\nuniform float polarAspect;\\nuniform float polarHelix;\\n\\nuniform mat4 viewMatrix;\\n\\nvec4 getPolarPosition(vec4 position, inout vec4 stpq) {\\n if (polarBend > 0.0) {\\n\\n if (polarBend < 0.001) {\\n // Factor out large addition/subtraction of polarFocus\\n // to avoid numerical error\\n // sin(x) ~ x\\n // cos(x) ~ 1 - x * x / 2\\n vec2 pb = position.xy * polarBend;\\n float ppbbx = pb.x * pb.x;\\n return viewMatrix * vec4(\\n position.x * (1.0 - polarBend + (pb.y * polarAspect)),\\n position.y * (1.0 - .5 * ppbbx) - (.5 * ppbbx) * polarFocus / polarAspect,\\n position.z + position.x * polarHelix * polarBend,\\n 1.0\\n );\\n }\\n else {\\n vec2 xy = position.xy * vec2(polarBend, polarAspect);\\n float radius = polarFocus + xy.y;\\n return viewMatrix * vec4(\\n sin(xy.x) * radius,\\n (cos(xy.x) * radius - polarFocus) / polarAspect,\\n position.z + position.x * polarHelix * polarBend,\\n 1.0\\n );\\n }\\n }\\n else {\\n return viewMatrix * vec4(position.xyz, 1.0);\\n }\\n}\",\n\"project.position\": \"uniform float styleZBias;\\nuniform float styleZIndex;\\n\\nvoid setPosition(vec3 position) {\\n vec4 pos = projectionMatrix * vec4(position, 1.0);\\n\\n // Apply relative Z bias\\n float bias = (1.0 - styleZBias / 32768.0);\\n pos.z *= bias;\\n \\n // Apply large scale Z index changes\\n if (styleZIndex > 0.0) {\\n float z = pos.z / pos.w;\\n pos.z = ((z + 1.0) / (styleZIndex + 1.0) - 1.0) * pos.w;\\n }\\n \\n gl_Position = pos;\\n}\",\n\"project.readback\": \"// This is three.js' global uniform, missing from fragment shaders.\\nuniform mat4 projectionMatrix;\\n\\nvec4 readbackPosition(vec3 position, vec4 stpq) {\\n vec4 pos = projectionMatrix * vec4(position, 1.0);\\n vec3 final = pos.xyz / pos.w;\\n if (final.z < -1.0) {\\n return vec4(0.0, 0.0, 0.0, -1.0);\\n }\\n else {\\n return vec4(final, -position.z);\\n }\\n}\\n\",\n\"raw.position.scale\": \"uniform vec4 geometryScale;\\nattribute vec4 position4;\\n\\nvec4 getRawPositionScale() {\\n return geometryScale * position4;\\n}\\n\",\n\"repeat.position\": \"uniform vec4 repeatModulus;\\n\\nvec4 getRepeatXYZW(vec4 xyzw) {\\n return mod(xyzw + .5, repeatModulus) - .5;\\n}\\n\",\n\"resample.padding\": \"uniform vec4 resampleBias;\\n\\nvec4 resamplePadding(vec4 xyzw) {\\n return xyzw + resampleBias;\\n}\",\n\"resample.relative\": \"uniform vec4 resampleFactor;\\n\\nvec4 resampleRelative(vec4 xyzw) {\\n return xyzw * resampleFactor;\\n}\",\n\"reveal.mask\": \"uniform float transitionEnter;\\nuniform float transitionExit;\\nuniform vec4 transitionScale;\\nuniform vec4 transitionBias;\\nuniform float transitionSkew;\\nuniform float transitionActive;\\n\\nfloat getTransitionSDFMask(vec4 stpq) {\\n if (transitionActive < 0.5) return 1.0;\\n\\n float enter = transitionEnter;\\n float exit = transitionExit;\\n float skew = transitionSkew;\\n vec4 scale = transitionScale;\\n vec4 bias = transitionBias;\\n\\n float factor = 1.0 + skew;\\n float offset = dot(vec4(1.0), stpq * scale + bias);\\n\\n vec2 d = vec2(enter, exit) * factor + vec2(-offset, offset - skew);\\n if (exit == 1.0) return d.x;\\n if (enter == 1.0) return d.y;\\n return min(d.x, d.y);\\n}\",\n\"root.position\": \"vec3 getRootPosition(vec4 position, in vec4 stpqIn, out vec4 stpqOut) {\\n stpqOut = stpqIn; // avoid inout confusion\\n return position.xyz;\\n}\",\n\"sample.2d\": \"uniform sampler2D dataTexture;\\n\\nvec4 sample2D(vec2 uv) {\\n return texture2D(dataTexture, uv);\\n}\\n\",\n\"scale.position\": \"uniform vec4 scaleAxis;\\nuniform vec4 scaleOffset;\\n\\nvec4 sampleData(float x);\\n\\nvec4 getScalePosition(vec4 xyzw) {\\n return scaleAxis * sampleData(xyzw.x).x + scaleOffset;\\n}\\n\",\n\"screen.map.stpq\": \"uniform vec4 remapSTPQScale;\\n\\nvec4 screenMapSTPQ(vec4 xyzw, out vec4 stpq) {\\n stpq = xyzw * remapSTPQScale;\\n return xyzw;\\n}\\n\",\n\"screen.map.xy\": \"uniform vec2 remapUVScale;\\n\\nvec4 screenMapXY(vec4 uvwo, vec4 stpq) {\\n return vec4(floor(remapUVScale * uvwo.xy), 0.0, 0.0);\\n}\\n\",\n\"screen.map.xyzw\": \"uniform vec2 remapUVScale;\\nuniform vec2 remapModulus;\\nuniform vec2 remapModulusInv;\\n\\nvec4 screenMapXYZW(vec4 uvwo, vec4 stpq) {\\n vec2 st = floor(remapUVScale * uvwo.xy);\\n vec2 xy = st * remapModulusInv;\\n vec2 ixy = floor(xy);\\n vec2 fxy = xy - ixy;\\n vec2 zw = fxy * remapModulus;\\n return vec4(ixy.x, zw.y, ixy.y, zw.x);\\n}\\n\",\n\"screen.pass.uv\": \"vec2 screenPassUV(vec4 uvwo, vec4 stpq) {\\n return uvwo.xy;\\n}\\n\",\n\"screen.position\": \"void setScreenPosition(vec4 position) {\\n gl_Position = vec4(position.xy * 2.0 - 1.0, 0.5, 1.0);\\n}\\n\",\n\"slice.position\": \"uniform vec4 sliceOffset;\\n\\nvec4 getSliceOffset(vec4 xyzw) {\\n return xyzw + sliceOffset;\\n}\\n\",\n\"spherical.position\": \"uniform float sphericalBend;\\nuniform float sphericalFocus;\\nuniform float sphericalAspectX;\\nuniform float sphericalAspectY;\\nuniform float sphericalScaleY;\\n\\nuniform mat4 viewMatrix;\\n\\nvec4 getSphericalPosition(vec4 position, inout vec4 stpq) {\\n if (sphericalBend > 0.0001) {\\n\\n vec3 xyz = position.xyz * vec3(sphericalBend, sphericalBend / sphericalAspectY * sphericalScaleY, sphericalAspectX);\\n float radius = sphericalFocus + xyz.z;\\n float cosine = cos(xyz.y) * radius;\\n\\n return viewMatrix * vec4(\\n sin(xyz.x) * cosine,\\n sin(xyz.y) * radius * sphericalAspectY,\\n (cos(xyz.x) * cosine - sphericalFocus) / sphericalAspectX,\\n 1.0\\n );\\n }\\n else {\\n return viewMatrix * vec4(position.xyz, 1.0);\\n }\\n}\",\n\"split.position\": \"uniform float splitStride;\\n\\nvec2 getIndices(vec4 xyzw);\\nvec4 getRest(vec4 xyzw);\\nvec4 injectIndex(float v);\\n\\nvec4 getSplitXYZW(vec4 xyzw) {\\n vec2 uv = getIndices(xyzw);\\n float offset = uv.x + uv.y * splitStride;\\n return injectIndex(offset) + getRest(xyzw);\\n}\\n\",\n\"spread.position\": \"uniform vec4 spreadOffset;\\nuniform mat4 spreadMatrix;\\n\\n// External\\nvec4 getSample(vec4 xyzw);\\n\\nvec4 getSpreadSample(vec4 xyzw) {\\n vec4 sample = getSample(xyzw);\\n return sample + spreadMatrix * (spreadOffset + xyzw);\\n}\\n\",\n\"sprite.fragment\": \"varying vec2 vSprite;\\n\\nvec4 getSample(vec2 xy);\\n\\nvec4 getSpriteColor() {\\n return getSample(vSprite);\\n}\",\n\"sprite.position\": \"uniform vec2 spriteOffset;\\nuniform float spriteScale;\\nuniform float spriteDepth;\\nuniform float spriteSnap;\\n\\nuniform vec2 renderOdd;\\nuniform float renderScale;\\nuniform float renderScaleInv;\\nuniform float pixelUnit;\\nuniform float focusDepth;\\n\\nuniform vec4 geometryClip;\\nattribute vec4 position4;\\nattribute vec2 sprite;\\n\\nvarying float vPixelSize;\\n\\n// External\\nvec3 getPosition(vec4 xyzw, float canonical);\\nvec4 getSprite(vec4 xyzw);\\n\\nvec3 getSpritePosition() {\\n // Clip points\\n vec4 p = min(geometryClip, position4);\\n float diff = length(position4 - p);\\n if (diff > 0.0) {\\n return vec3(0.0, 0.0, 1000.0);\\n }\\n\\n // Make sprites\\n vec3 center = getPosition(p, 1.0);\\n vec4 atlas = getSprite(p);\\n\\n // Sprite goes from -1..1, width = 2.\\n // -1..1 -> -0.5..0.5\\n vec2 halfSprite = sprite * .5;\\n vec2 halfFlipSprite = vec2(halfSprite.x, -halfSprite.y);\\n\\n#ifdef POSITION_UV\\n // Assign UVs\\n vUV = atlas.xy + atlas.zw * (halfFlipSprite + .5);\\n#endif\\n\\n // Depth blending\\n // TODO: orthographic camera\\n // Workaround: set depth = 0\\n float depth = focusDepth, z;\\n z = -center.z;\\n if (spriteDepth < 1.0) {\\n depth = mix(z, focusDepth, spriteDepth);\\n }\\n \\n // Match device/unit mapping \\n float size = pixelUnit * spriteScale;\\n float depthSize = depth * size;\\n\\n // Calculate pixelSize for anti-aliasing\\n float pixelSize = (spriteDepth > 0.0 ? depthSize / z : size);\\n vPixelSize = pixelSize;\\n\\n // Position sprite\\n vec2 atlasOdd = fract(atlas.zw / 2.0);\\n vec2 offset = (spriteOffset + halfSprite * atlas.zw) * depthSize;\\n if (spriteSnap > 0.5) {\\n // Snap to pixel (w/ epsilon shift to avoid jitter)\\n return vec3(((floor(center.xy / center.z * renderScale + 0.001) + renderOdd + atlasOdd) * center.z + offset) * renderScaleInv, center.z);\\n }\\n else {\\n // Place directly\\n return center + vec3(offset * renderScaleInv, 0.0);\\n }\\n\\n}\\n\",\n\"stereographic.position\": \"uniform float stereoBend;\\n\\nuniform mat4 viewMatrix;\\n\\nvec4 getStereoPosition(vec4 position, inout vec4 stpq) {\\n if (stereoBend > 0.0001) {\\n\\n vec3 pos = position.xyz;\\n float r = length(pos);\\n float z = r + pos.z;\\n vec3 project = vec3(pos.xy / z, r);\\n \\n vec3 lerped = mix(pos, project, stereoBend);\\n\\n return viewMatrix * vec4(lerped, 1.0);\\n }\\n else {\\n return viewMatrix * vec4(position.xyz, 1.0);\\n }\\n}\",\n\"stereographic4.position\": \"uniform float stereoBend;\\nuniform vec4 basisScale;\\nuniform vec4 basisOffset;\\nuniform mat4 viewMatrix;\\nuniform vec2 view4D;\\n\\nvec4 getStereographic4Position(vec4 position, inout vec4 stpq) {\\n \\n vec4 transformed;\\n if (stereoBend > 0.0001) {\\n\\n float r = length(position);\\n float w = r + position.w;\\n vec4 project = vec4(position.xyz / w, r);\\n \\n transformed = mix(position, project, stereoBend);\\n }\\n else {\\n transformed = position;\\n }\\n\\n vec4 pos4 = transformed * basisScale - basisOffset;\\n vec3 xyz = (viewMatrix * vec4(pos4.xyz, 1.0)).xyz;\\n return vec4(xyz, pos4.w * view4D.y + view4D.x);\\n}\\n\",\n\"stpq.sample.2d\": \"varying vec2 vST;\\n\\nvec4 getSample(vec2 st);\\n\\nvec4 getSTSample() {\\n return getSample(vST);\\n}\\n\",\n\"stpq.xyzw.2d\": \"varying vec2 vUV;\\n\\nvoid setRawUV(vec4 xyzw) {\\n vUV = xyzw.xy;\\n}\\n\",\n\"strip.position.normal\": \"uniform vec4 geometryClip;\\nattribute vec4 position4;\\nattribute vec3 strip;\\n\\n// External\\nvec3 getPosition(vec4 xyzw, float canonical);\\n\\nvarying vec3 vNormal;\\nvarying vec3 vLight;\\nvarying vec3 vPosition;\\n\\nvoid getStripGeometry(vec4 xyzw, vec3 strip, out vec3 pos, out vec3 normal) {\\n vec3 a, b, c;\\n\\n a = getPosition(xyzw, 1.0);\\n b = getPosition(vec4(xyzw.xyz, strip.x), 0.0);\\n c = getPosition(vec4(xyzw.xyz, strip.y), 0.0);\\n\\n normal = normalize(cross(c - a, b - a)) * strip.z;\\n \\n pos = a;\\n}\\n\\nvec3 getStripPositionNormal() {\\n vec3 center, normal;\\n\\n vec4 p = min(geometryClip, position4);\\n\\n getStripGeometry(p, strip, center, normal);\\n vNormal = normal;\\n vLight = normalize((viewMatrix * vec4(1.0, 2.0, 2.0, 0.0)).xyz);\\n vPosition = -center;\\n\\n return center;\\n}\\n\",\n\"style.color\": \"uniform vec3 styleColor;\\nuniform float styleOpacity;\\n\\nvec4 getStyleColor() {\\n return vec4(styleColor, styleOpacity);\\n}\\n\",\n\"subdivide.depth\": \"uniform float subdivideBevel;\\n\\n// External\\nvec4 sampleData(vec4 xyzw);\\n\\nvec4 subdivideDepth(vec4 xyzw) {\\n float x = xyzw.z;\\n float i = floor(x);\\n float f = x - i;\\n\\n float minf = subdivideBevel * min(f, 1.0 - f);\\n float g = (f > 0.5) ? 1.0 - minf : (f < 0.5) ? minf : 0.5;\\n\\n return sampleData(vec4(xyzw.xy, i + g, xyzw.w));\\n}\\n\",\n\"subdivide.depth.lerp\": \"uniform float subdivideBevel;\\n\\n// External\\nvec4 sampleData(vec4 xyzw);\\n\\nvec4 subdivideDepthLerp(vec4 xyzw) {\\n float x = xyzw.z;\\n float i = floor(x);\\n float f = x - i;\\n\\n float minf = subdivideBevel * min(f, 1.0 - f);\\n float g = (f > 0.5) ? 1.0 - minf : (f < 0.5) ? minf : 0.5;\\n\\n vec4 xyzw1 = vec4(xyzw.xy, i, xyzw.w);\\n vec4 xyzw2 = vec4(xyzw.xy, i + 1.0, xyzw.w);\\n \\n vec4 a = sampleData(xyzw1);\\n vec4 b = sampleData(xyzw2);\\n\\n return mix(a, b, g);\\n}\\n\",\n\"subdivide.height\": \"uniform float subdivideBevel;\\n\\n// External\\nvec4 sampleData(vec4 xyzw);\\n\\nvec4 subdivideHeight(vec4 xyzw) {\\n float x = xyzw.y;\\n float i = floor(x);\\n float f = x - i;\\n\\n float minf = subdivideBevel * min(f, 1.0 - f);\\n float g = (f > 0.5) ? 1.0 - minf : (f < 0.5) ? minf : 0.5;\\n\\n return sampleData(vec4(xyzw.x, i + g, xyzw.zw));\\n}\\n\",\n\"subdivide.height.lerp\": \"uniform float subdivideBevel;\\n\\n// External\\nvec4 sampleData(vec4 xyzw);\\n\\nvec4 subdivideHeightLerp(vec4 xyzw) {\\n float x = xyzw.y;\\n float i = floor(x);\\n float f = x - i;\\n\\n float minf = subdivideBevel * min(f, 1.0 - f);\\n float g = (f > 0.5) ? 1.0 - minf : (f < 0.5) ? minf : 0.5;\\n\\n vec4 xyzw1 = vec4(xyzw.x, i, xyzw.zw);\\n vec4 xyzw2 = vec4(xyzw.x, i + 1.0, xyzw.zw);\\n \\n vec4 a = sampleData(xyzw1);\\n vec4 b = sampleData(xyzw2);\\n\\n return mix(a, b, g);\\n}\\n\",\n\"subdivide.items\": \"uniform float subdivideBevel;\\n\\n// External\\nvec4 sampleData(vec4 xyzw);\\n\\nvec4 subdivideItems(vec4 xyzw) {\\n float x = xyzw.w;\\n float i = floor(x);\\n float f = x - i;\\n\\n float minf = subdivideBevel * min(f, 1.0 - f);\\n float g = (f > 0.5) ? 1.0 - minf : (f < 0.5) ? minf : 0.5;\\n\\n return sampleData(vec4(xyzw.xyz, i + g));\\n}\\n\",\n\"subdivide.items.lerp\": \"uniform float subdivideBevel;\\n\\n// External\\nvec4 sampleData(vec4 xyzw);\\n\\nvec4 subdivideItemsLerp(vec4 xyzw) {\\n float x = xyzw.w;\\n float i = floor(x);\\n float f = x - i;\\n\\n float minf = subdivideBevel * min(f, 1.0 - f);\\n float g = (f > 0.5) ? 1.0 - minf : (f < 0.5) ? minf : 0.5;\\n\\n vec4 xyzw1 = vec4(xyzw.xyz, i);\\n vec4 xyzw2 = vec4(xyzw.xyz, i + 1.0);\\n \\n vec4 a = sampleData(xyzw1);\\n vec4 b = sampleData(xyzw2);\\n\\n return mix(a, b, g);\\n}\\n\",\n\"subdivide.width\": \"uniform float subdivideBevel;\\n\\n// External\\nvec4 sampleData(vec4 xyzw);\\n\\nvec4 subdivideWidth(vec4 xyzw) {\\n float x = xyzw.x;\\n float i = floor(x);\\n float f = x - i;\\n\\n float minf = subdivideBevel * min(f, 1.0 - f);\\n float g = (f > 0.5) ? 1.0 - minf : (f < 0.5) ? minf : 0.5;\\n\\n return sampleData(vec4(i + g, xyzw.yzw));\\n}\\n\",\n\"subdivide.width.lerp\": \"uniform float subdivideBevel;\\n\\n// External\\nvec4 sampleData(vec4 xyzw);\\n\\nvec4 subdivideWidthLerp(vec4 xyzw) {\\n float x = xyzw.x;\\n float i = floor(x);\\n float f = x - i;\\n\\n float minf = subdivideBevel * min(f, 1.0 - f);\\n float g = (f > 0.5) ? 1.0 - minf : (f < 0.5) ? minf : 0.5;\\n\\n vec4 xyzw1 = vec4(i, xyzw.yzw);\\n vec4 xyzw2 = vec4(i + 1.0, xyzw.yzw);\\n \\n vec4 a = sampleData(xyzw1);\\n vec4 b = sampleData(xyzw2);\\n\\n return mix(a, b, g);\\n}\\n\",\n\"surface.mask.hollow\": \"attribute vec4 position4;\\n\\nfloat getSurfaceHollowMask(vec4 xyzw) {\\n vec4 df = abs(fract(position4) - .5);\\n vec2 df2 = min(df.xy, df.zw);\\n float df3 = min(df2.x, df2.y);\\n return df3;\\n}\",\n\"surface.position\": \"uniform vec4 geometryClip;\\nuniform vec4 geometryResolution;\\nuniform vec4 mapSize;\\n\\nattribute vec4 position4;\\n\\n// External\\nvec3 getPosition(vec4 xyzw, float canonical);\\n\\nvec3 getSurfacePosition() {\\n vec4 p = min(geometryClip, position4);\\n vec3 xyz = getPosition(p, 1.0);\\n\\n // Overwrite UVs\\n#ifdef POSITION_UV\\n#ifdef POSITION_UV_INT\\n vUV = -.5 + (position4.xy * geometryResolution.xy) * mapSize.xy;\\n#else\\n vUV = position4.xy * geometryResolution.xy;\\n#endif\\n#endif\\n\\n return xyz;\\n}\\n\",\n\"surface.position.normal\": \"uniform vec4 mapSize;\\nuniform vec4 geometryResolution;\\nuniform vec4 geometryClip;\\nattribute vec4 position4;\\nattribute vec2 surface;\\n\\n// External\\nvec3 getPosition(vec4 xyzw, float canonical);\\n\\nvoid getSurfaceGeometry(vec4 xyzw, float edgeX, float edgeY, out vec3 left, out vec3 center, out vec3 right, out vec3 up, out vec3 down) {\\n vec4 deltaX = vec4(1.0, 0.0, 0.0, 0.0);\\n vec4 deltaY = vec4(0.0, 1.0, 0.0, 0.0);\\n\\n /*\\n // high quality, 5 tap\\n center = getPosition(xyzw, 1.0);\\n left = (edgeX > -0.5) ? getPosition(xyzw - deltaX, 0.0) : center;\\n right = (edgeX < 0.5) ? getPosition(xyzw + deltaX, 0.0) : center;\\n down = (edgeY > -0.5) ? getPosition(xyzw - deltaY, 0.0) : center;\\n up = (edgeY < 0.5) ? getPosition(xyzw + deltaY, 0.0) : center;\\n */\\n \\n // low quality, 3 tap\\n center = getPosition(xyzw, 1.0);\\n left = center;\\n down = center;\\n right = (edgeX < 0.5) ? getPosition(xyzw + deltaX, 0.0) : (2.0 * center - getPosition(xyzw - deltaX, 0.0));\\n up = (edgeY < 0.5) ? getPosition(xyzw + deltaY, 0.0) : (2.0 * center - getPosition(xyzw - deltaY, 0.0));\\n}\\n\\nvec3 getSurfaceNormal(vec3 left, vec3 center, vec3 right, vec3 up, vec3 down) {\\n vec3 dx = right - left;\\n vec3 dy = up - down;\\n vec3 n = cross(dy, dx);\\n if (length(n) > 0.0) {\\n return normalize(n);\\n }\\n return vec3(0.0, 1.0, 0.0);\\n}\\n\\nvarying vec3 vNormal;\\nvarying vec3 vLight;\\nvarying vec3 vPosition;\\n\\nvec3 getSurfacePositionNormal() {\\n vec3 left, center, right, up, down;\\n\\n vec4 p = min(geometryClip, position4);\\n\\n getSurfaceGeometry(p, surface.x, surface.y, left, center, right, up, down);\\n vNormal = getSurfaceNormal(left, center, right, up, down);\\n vLight = normalize((viewMatrix * vec4(1.0, 2.0, 2.0, 0.0)).xyz); // hardcoded directional light\\n vPosition = -center;\\n\\n#ifdef POSITION_UV\\n#ifdef POSITION_UV_INT\\n vUV = -.5 + (position4.xy * geometryResolution.xy) * mapSize.xy;\\n#else\\n vUV = position4.xy * geometryResolution.xy;\\n#endif\\n#endif\\n \\n return center;\\n}\\n\",\n\"ticks.position\": \"uniform float worldUnit;\\nuniform float focusDepth;\\nuniform float tickSize;\\nuniform float tickEpsilon;\\nuniform vec3 tickNormal;\\nuniform vec2 tickStrip;\\n\\nvec4 getSample(vec4 xyzw);\\n\\nvec3 transformPosition(vec4 position, in vec4 stpqIn, out vec4 stpqOut);\\n\\nvec3 getTickPosition(vec4 xyzw, in vec4 stpqIn, out vec4 stpqOut) {\\n float epsilon = tickEpsilon;\\n\\n // determine tick direction\\n float leftX = max(tickStrip.x, xyzw.y - 1.0);\\n float rightX = min(tickStrip.y, xyzw.y + 1.0);\\n \\n vec4 left = getSample(vec4(leftX, xyzw.zw, 0.0));\\n vec4 right = getSample(vec4(rightX, xyzw.zw, 0.0));\\n vec4 diff = right - left;\\n\\n vec3 normal = cross(normalize(diff.xyz + vec3(diff.w)), tickNormal);\\n float bias = max(0.0, 1.0 - length(normal) * 2.0);\\n normal = mix(normal, tickNormal.yzx, bias * bias);\\n \\n // transform (point) and (point + delta)\\n vec4 center = getSample(vec4(xyzw.yzw, 0.0));\\n vec4 delta = vec4(normal, 0.0) * epsilon;\\n\\n vec4 a = center;\\n vec4 b = center + delta;\\n\\n vec4 _;\\n vec3 c = transformPosition(a, stpqIn, stpqOut);\\n vec3 d = transformPosition(b, stpqIn, _);\\n \\n // sample on either side to create line\\n float line = xyzw.x - .5;\\n vec3 mid = c;\\n vec3 side = normalize(d - c);\\n\\n return mid + side * line * tickSize * worldUnit * focusDepth;\\n}\\n\",\n\"transform3.position\": \"uniform mat4 transformMatrix;\\n\\nvec4 transformPosition(vec4 position, inout vec4 stpq) {\\n return transformMatrix * vec4(position.xyz, 1.0);\\n}\\n\",\n\"transform4.position\": \"uniform mat4 transformMatrix;\\nuniform vec4 transformOffset;\\n\\nvec4 transformPosition(vec4 position, inout vec4 stpq) {\\n return transformMatrix * position + transformOffset;\\n}\\n\",\n\"view.position\": \"// Implicit three.js uniform\\n// uniform mat4 viewMatrix;\\n\\nvec4 getViewPosition(vec4 position, inout vec4 stpq) {\\n return (viewMatrix * vec4(position.xyz, 1.0));\\n}\\n\"};\n","'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n var i\n for (i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n","/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh \n * @license MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nvar base64 = require('base64-js')\nvar ieee754 = require('ieee754')\nvar isArray = require('isarray')\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n * === true Use Uint8Array implementation (fastest)\n * === false Use Object implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * Due to various browser bugs, sometimes the Object implementation will be used even\n * when the browser supports typed arrays.\n *\n * Note:\n *\n * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,\n * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.\n *\n * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.\n *\n * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of\n * incorrect length in some situations.\n\n * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they\n * get the Object implementation, which is slower but behaves correctly.\n */\nBuffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined\n ? global.TYPED_ARRAY_SUPPORT\n : typedArraySupport()\n\n/*\n * Export kMaxLength after typed array support is determined.\n */\nexports.kMaxLength = kMaxLength()\n\nfunction typedArraySupport () {\n try {\n var arr = new Uint8Array(1)\n arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}\n return arr.foo() === 42 && // typed array instances can be augmented\n typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`\n arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`\n } catch (e) {\n return false\n }\n}\n\nfunction kMaxLength () {\n return Buffer.TYPED_ARRAY_SUPPORT\n ? 0x7fffffff\n : 0x3fffffff\n}\n\nfunction createBuffer (that, length) {\n if (kMaxLength() < length) {\n throw new RangeError('Invalid typed array length')\n }\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n // Return an augmented `Uint8Array` instance, for best performance\n that = new Uint8Array(length)\n that.__proto__ = Buffer.prototype\n } else {\n // Fallback: Return an object instance of the Buffer class\n if (that === null) {\n that = new Buffer(length)\n }\n that.length = length\n }\n\n return that\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {\n return new Buffer(arg, encodingOrOffset, length)\n }\n\n // Common case.\n if (typeof arg === 'number') {\n if (typeof encodingOrOffset === 'string') {\n throw new Error(\n 'If encoding is specified then the first argument must be a string'\n )\n }\n return allocUnsafe(this, arg)\n }\n return from(this, arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\n// TODO: Legacy, not needed anymore. Remove in next major version.\nBuffer._augment = function (arr) {\n arr.__proto__ = Buffer.prototype\n return arr\n}\n\nfunction from (that, value, encodingOrOffset, length) {\n if (typeof value === 'number') {\n throw new TypeError('\"value\" argument must not be a number')\n }\n\n if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {\n return fromArrayBuffer(that, value, encodingOrOffset, length)\n }\n\n if (typeof value === 'string') {\n return fromString(that, value, encodingOrOffset)\n }\n\n return fromObject(that, value)\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n return from(null, value, encodingOrOffset, length)\n}\n\nif (Buffer.TYPED_ARRAY_SUPPORT) {\n Buffer.prototype.__proto__ = Uint8Array.prototype\n Buffer.__proto__ = Uint8Array\n if (typeof Symbol !== 'undefined' && Symbol.species &&\n Buffer[Symbol.species] === Buffer) {\n // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97\n Object.defineProperty(Buffer, Symbol.species, {\n value: null,\n configurable: true\n })\n }\n}\n\nfunction assertSize (size) {\n if (typeof size !== 'number') {\n throw new TypeError('\"size\" argument must be a number')\n } else if (size < 0) {\n throw new RangeError('\"size\" argument must not be negative')\n }\n}\n\nfunction alloc (that, size, fill, encoding) {\n assertSize(size)\n if (size <= 0) {\n return createBuffer(that, size)\n }\n if (fill !== undefined) {\n // Only pay attention to encoding if it's a string. This\n // prevents accidentally sending in a number that would\n // be interpretted as a start offset.\n return typeof encoding === 'string'\n ? createBuffer(that, size).fill(fill, encoding)\n : createBuffer(that, size).fill(fill)\n }\n return createBuffer(that, size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n return alloc(null, size, fill, encoding)\n}\n\nfunction allocUnsafe (that, size) {\n assertSize(size)\n that = createBuffer(that, size < 0 ? 0 : checked(size) | 0)\n if (!Buffer.TYPED_ARRAY_SUPPORT) {\n for (var i = 0; i < size; ++i) {\n that[i] = 0\n }\n }\n return that\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n return allocUnsafe(null, size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n return allocUnsafe(null, size)\n}\n\nfunction fromString (that, string, encoding) {\n if (typeof encoding !== 'string' || encoding === '') {\n encoding = 'utf8'\n }\n\n if (!Buffer.isEncoding(encoding)) {\n throw new TypeError('\"encoding\" must be a valid string encoding')\n }\n\n var length = byteLength(string, encoding) | 0\n that = createBuffer(that, length)\n\n var actual = that.write(string, encoding)\n\n if (actual !== length) {\n // Writing a hex string, for example, that contains invalid characters will\n // cause everything after the first invalid character to be ignored. (e.g.\n // 'abxxcd' will be treated as 'ab')\n that = that.slice(0, actual)\n }\n\n return that\n}\n\nfunction fromArrayLike (that, array) {\n var length = array.length < 0 ? 0 : checked(array.length) | 0\n that = createBuffer(that, length)\n for (var i = 0; i < length; i += 1) {\n that[i] = array[i] & 255\n }\n return that\n}\n\nfunction fromArrayBuffer (that, array, byteOffset, length) {\n array.byteLength // this throws if `array` is not a valid ArrayBuffer\n\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\\'offset\\' is out of bounds')\n }\n\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\\'length\\' is out of bounds')\n }\n\n if (byteOffset === undefined && length === undefined) {\n array = new Uint8Array(array)\n } else if (length === undefined) {\n array = new Uint8Array(array, byteOffset)\n } else {\n array = new Uint8Array(array, byteOffset, length)\n }\n\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n // Return an augmented `Uint8Array` instance, for best performance\n that = array\n that.__proto__ = Buffer.prototype\n } else {\n // Fallback: Return an object instance of the Buffer class\n that = fromArrayLike(that, array)\n }\n return that\n}\n\nfunction fromObject (that, obj) {\n if (Buffer.isBuffer(obj)) {\n var len = checked(obj.length) | 0\n that = createBuffer(that, len)\n\n if (that.length === 0) {\n return that\n }\n\n obj.copy(that, 0, 0, len)\n return that\n }\n\n if (obj) {\n if ((typeof ArrayBuffer !== 'undefined' &&\n obj.buffer instanceof ArrayBuffer) || 'length' in obj) {\n if (typeof obj.length !== 'number' || isnan(obj.length)) {\n return createBuffer(that, 0)\n }\n return fromArrayLike(that, obj)\n }\n\n if (obj.type === 'Buffer' && isArray(obj.data)) {\n return fromArrayLike(that, obj.data)\n }\n }\n\n throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')\n}\n\nfunction checked (length) {\n // Note: cannot use `length < kMaxLength()` here because that fails when\n // length is NaN (which is otherwise coerced to zero.)\n if (length >= kMaxLength()) {\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n 'size: 0x' + kMaxLength().toString(16) + ' bytes')\n }\n return length | 0\n}\n\nfunction SlowBuffer (length) {\n if (+length != length) { // eslint-disable-line eqeqeq\n length = 0\n }\n return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n return !!(b != null && b._isBuffer)\n}\n\nBuffer.compare = function compare (a, b) {\n if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n throw new TypeError('Arguments must be Buffers')\n }\n\n if (a === b) return 0\n\n var x = a.length\n var y = b.length\n\n for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i]\n y = b[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return true\n default:\n return false\n }\n}\n\nBuffer.concat = function concat (list, length) {\n if (!isArray(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n\n if (list.length === 0) {\n return Buffer.alloc(0)\n }\n\n var i\n if (length === undefined) {\n length = 0\n for (i = 0; i < list.length; ++i) {\n length += list[i].length\n }\n }\n\n var buffer = Buffer.allocUnsafe(length)\n var pos = 0\n for (i = 0; i < list.length; ++i) {\n var buf = list[i]\n if (!Buffer.isBuffer(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n buf.copy(buffer, pos)\n pos += buf.length\n }\n return buffer\n}\n\nfunction byteLength (string, encoding) {\n if (Buffer.isBuffer(string)) {\n return string.length\n }\n if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&\n (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {\n return string.byteLength\n }\n if (typeof string !== 'string') {\n string = '' + string\n }\n\n var len = string.length\n if (len === 0) return 0\n\n // Use a for loop to avoid recursion\n var loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'ascii':\n case 'latin1':\n case 'binary':\n return len\n case 'utf8':\n case 'utf-8':\n case undefined:\n return utf8ToBytes(string).length\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return len * 2\n case 'hex':\n return len >>> 1\n case 'base64':\n return base64ToBytes(string).length\n default:\n if (loweredCase) return utf8ToBytes(string).length // assume utf8\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n var loweredCase = false\n\n // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n // property of a typed array.\n\n // This behaves neither like String nor Uint8Array in that we set start/end\n // to their upper/lower bounds if the value passed is out of range.\n // undefined is handled specially as per ECMA-262 6th Edition,\n // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n if (start === undefined || start < 0) {\n start = 0\n }\n // Return early if start > this.length. Done here to prevent potential uint32\n // coercion fail below.\n if (start > this.length) {\n return ''\n }\n\n if (end === undefined || end > this.length) {\n end = this.length\n }\n\n if (end <= 0) {\n return ''\n }\n\n // Force coersion to uint32. This will also coerce falsey/NaN values to 0.\n end >>>= 0\n start >>>= 0\n\n if (end <= start) {\n return ''\n }\n\n if (!encoding) encoding = 'utf8'\n\n while (true) {\n switch (encoding) {\n case 'hex':\n return hexSlice(this, start, end)\n\n case 'utf8':\n case 'utf-8':\n return utf8Slice(this, start, end)\n\n case 'ascii':\n return asciiSlice(this, start, end)\n\n case 'latin1':\n case 'binary':\n return latin1Slice(this, start, end)\n\n case 'base64':\n return base64Slice(this, start, end)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return utf16leSlice(this, start, end)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = (encoding + '').toLowerCase()\n loweredCase = true\n }\n }\n}\n\n// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect\n// Buffer instances.\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n var i = b[n]\n b[n] = b[m]\n b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n var len = this.length\n if (len % 2 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 16-bits')\n }\n for (var i = 0; i < len; i += 2) {\n swap(this, i, i + 1)\n }\n return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n var len = this.length\n if (len % 4 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 32-bits')\n }\n for (var i = 0; i < len; i += 4) {\n swap(this, i, i + 3)\n swap(this, i + 1, i + 2)\n }\n return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n var len = this.length\n if (len % 8 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 64-bits')\n }\n for (var i = 0; i < len; i += 8) {\n swap(this, i, i + 7)\n swap(this, i + 1, i + 6)\n swap(this, i + 2, i + 5)\n swap(this, i + 3, i + 4)\n }\n return this\n}\n\nBuffer.prototype.toString = function toString () {\n var length = this.length | 0\n if (length === 0) return ''\n if (arguments.length === 0) return utf8Slice(this, 0, length)\n return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.equals = function equals (b) {\n if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n if (this === b) return true\n return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n var str = ''\n var max = exports.INSPECT_MAX_BYTES\n if (this.length > 0) {\n str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')\n if (this.length > max) str += ' ... '\n }\n return ''\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n if (!Buffer.isBuffer(target)) {\n throw new TypeError('Argument must be a Buffer')\n }\n\n if (start === undefined) {\n start = 0\n }\n if (end === undefined) {\n end = target ? target.length : 0\n }\n if (thisStart === undefined) {\n thisStart = 0\n }\n if (thisEnd === undefined) {\n thisEnd = this.length\n }\n\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n throw new RangeError('out of range index')\n }\n\n if (thisStart >= thisEnd && start >= end) {\n return 0\n }\n if (thisStart >= thisEnd) {\n return -1\n }\n if (start >= end) {\n return 1\n }\n\n start >>>= 0\n end >>>= 0\n thisStart >>>= 0\n thisEnd >>>= 0\n\n if (this === target) return 0\n\n var x = thisEnd - thisStart\n var y = end - start\n var len = Math.min(x, y)\n\n var thisCopy = this.slice(thisStart, thisEnd)\n var targetCopy = target.slice(start, end)\n\n for (var i = 0; i < len; ++i) {\n if (thisCopy[i] !== targetCopy[i]) {\n x = thisCopy[i]\n y = targetCopy[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n // Empty buffer means no match\n if (buffer.length === 0) return -1\n\n // Normalize byteOffset\n if (typeof byteOffset === 'string') {\n encoding = byteOffset\n byteOffset = 0\n } else if (byteOffset > 0x7fffffff) {\n byteOffset = 0x7fffffff\n } else if (byteOffset < -0x80000000) {\n byteOffset = -0x80000000\n }\n byteOffset = +byteOffset // Coerce to Number.\n if (isNaN(byteOffset)) {\n // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n byteOffset = dir ? 0 : (buffer.length - 1)\n }\n\n // Normalize byteOffset: negative offsets start from the end of the buffer\n if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n if (byteOffset >= buffer.length) {\n if (dir) return -1\n else byteOffset = buffer.length - 1\n } else if (byteOffset < 0) {\n if (dir) byteOffset = 0\n else return -1\n }\n\n // Normalize val\n if (typeof val === 'string') {\n val = Buffer.from(val, encoding)\n }\n\n // Finally, search either indexOf (if dir is true) or lastIndexOf\n if (Buffer.isBuffer(val)) {\n // Special case: looking for empty string/buffer always fails\n if (val.length === 0) {\n return -1\n }\n return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n } else if (typeof val === 'number') {\n val = val & 0xFF // Search for a byte value [0-255]\n if (Buffer.TYPED_ARRAY_SUPPORT &&\n typeof Uint8Array.prototype.indexOf === 'function') {\n if (dir) {\n return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n } else {\n return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n }\n }\n return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)\n }\n\n throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n var indexSize = 1\n var arrLength = arr.length\n var valLength = val.length\n\n if (encoding !== undefined) {\n encoding = String(encoding).toLowerCase()\n if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n encoding === 'utf16le' || encoding === 'utf-16le') {\n if (arr.length < 2 || val.length < 2) {\n return -1\n }\n indexSize = 2\n arrLength /= 2\n valLength /= 2\n byteOffset /= 2\n }\n }\n\n function read (buf, i) {\n if (indexSize === 1) {\n return buf[i]\n } else {\n return buf.readUInt16BE(i * indexSize)\n }\n }\n\n var i\n if (dir) {\n var foundIndex = -1\n for (i = byteOffset; i < arrLength; i++) {\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n if (foundIndex === -1) foundIndex = i\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n } else {\n if (foundIndex !== -1) i -= i - foundIndex\n foundIndex = -1\n }\n }\n } else {\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n for (i = byteOffset; i >= 0; i--) {\n var found = true\n for (var j = 0; j < valLength; j++) {\n if (read(arr, i + j) !== read(val, j)) {\n found = false\n break\n }\n }\n if (found) return i\n }\n }\n\n return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n offset = Number(offset) || 0\n var remaining = buf.length - offset\n if (!length) {\n length = remaining\n } else {\n length = Number(length)\n if (length > remaining) {\n length = remaining\n }\n }\n\n // must be an even number of digits\n var strLen = string.length\n if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')\n\n if (length > strLen / 2) {\n length = strLen / 2\n }\n for (var i = 0; i < length; ++i) {\n var parsed = parseInt(string.substr(i * 2, 2), 16)\n if (isNaN(parsed)) return i\n buf[offset + i] = parsed\n }\n return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction latin1Write (buf, string, offset, length) {\n return asciiWrite(buf, string, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n // Buffer#write(string)\n if (offset === undefined) {\n encoding = 'utf8'\n length = this.length\n offset = 0\n // Buffer#write(string, encoding)\n } else if (length === undefined && typeof offset === 'string') {\n encoding = offset\n length = this.length\n offset = 0\n // Buffer#write(string, offset[, length][, encoding])\n } else if (isFinite(offset)) {\n offset = offset | 0\n if (isFinite(length)) {\n length = length | 0\n if (encoding === undefined) encoding = 'utf8'\n } else {\n encoding = length\n length = undefined\n }\n // legacy write(string, encoding, offset, length) - remove in v0.13\n } else {\n throw new Error(\n 'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n )\n }\n\n var remaining = this.length - offset\n if (length === undefined || length > remaining) length = remaining\n\n if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n throw new RangeError('Attempt to write outside buffer bounds')\n }\n\n if (!encoding) encoding = 'utf8'\n\n var loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'hex':\n return hexWrite(this, string, offset, length)\n\n case 'utf8':\n case 'utf-8':\n return utf8Write(this, string, offset, length)\n\n case 'ascii':\n return asciiWrite(this, string, offset, length)\n\n case 'latin1':\n case 'binary':\n return latin1Write(this, string, offset, length)\n\n case 'base64':\n // Warning: maxLength not taken into account in base64Write\n return base64Write(this, string, offset, length)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return ucs2Write(this, string, offset, length)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n return {\n type: 'Buffer',\n data: Array.prototype.slice.call(this._arr || this, 0)\n }\n}\n\nfunction base64Slice (buf, start, end) {\n if (start === 0 && end === buf.length) {\n return base64.fromByteArray(buf)\n } else {\n return base64.fromByteArray(buf.slice(start, end))\n }\n}\n\nfunction utf8Slice (buf, start, end) {\n end = Math.min(buf.length, end)\n var res = []\n\n var i = start\n while (i < end) {\n var firstByte = buf[i]\n var codePoint = null\n var bytesPerSequence = (firstByte > 0xEF) ? 4\n : (firstByte > 0xDF) ? 3\n : (firstByte > 0xBF) ? 2\n : 1\n\n if (i + bytesPerSequence <= end) {\n var secondByte, thirdByte, fourthByte, tempCodePoint\n\n switch (bytesPerSequence) {\n case 1:\n if (firstByte < 0x80) {\n codePoint = firstByte\n }\n break\n case 2:\n secondByte = buf[i + 1]\n if ((secondByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n if (tempCodePoint > 0x7F) {\n codePoint = tempCodePoint\n }\n }\n break\n case 3:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n codePoint = tempCodePoint\n }\n }\n break\n case 4:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n fourthByte = buf[i + 3]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n codePoint = tempCodePoint\n }\n }\n }\n }\n\n if (codePoint === null) {\n // we did not generate a valid codePoint so insert a\n // replacement char (U+FFFD) and advance only 1 byte\n codePoint = 0xFFFD\n bytesPerSequence = 1\n } else if (codePoint > 0xFFFF) {\n // encode to utf16 (surrogate pair dance)\n codePoint -= 0x10000\n res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n codePoint = 0xDC00 | codePoint & 0x3FF\n }\n\n res.push(codePoint)\n i += bytesPerSequence\n }\n\n return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n var len = codePoints.length\n if (len <= MAX_ARGUMENTS_LENGTH) {\n return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n }\n\n // Decode in chunks to avoid \"call stack size exceeded\".\n var res = ''\n var i = 0\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n )\n }\n return res\n}\n\nfunction asciiSlice (buf, start, end) {\n var ret = ''\n end = Math.min(buf.length, end)\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i] & 0x7F)\n }\n return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n var ret = ''\n end = Math.min(buf.length, end)\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i])\n }\n return ret\n}\n\nfunction hexSlice (buf, start, end) {\n var len = buf.length\n\n if (!start || start < 0) start = 0\n if (!end || end < 0 || end > len) end = len\n\n var out = ''\n for (var i = start; i < end; ++i) {\n out += toHex(buf[i])\n }\n return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n var bytes = buf.slice(start, end)\n var res = ''\n for (var i = 0; i < bytes.length; i += 2) {\n res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)\n }\n return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n var len = this.length\n start = ~~start\n end = end === undefined ? len : ~~end\n\n if (start < 0) {\n start += len\n if (start < 0) start = 0\n } else if (start > len) {\n start = len\n }\n\n if (end < 0) {\n end += len\n if (end < 0) end = 0\n } else if (end > len) {\n end = len\n }\n\n if (end < start) end = start\n\n var newBuf\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n newBuf = this.subarray(start, end)\n newBuf.__proto__ = Buffer.prototype\n } else {\n var sliceLen = end - start\n newBuf = new Buffer(sliceLen, undefined)\n for (var i = 0; i < sliceLen; ++i) {\n newBuf[i] = this[i + start]\n }\n }\n\n return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var val = this[offset]\n var mul = 1\n var i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) {\n checkOffset(offset, byteLength, this.length)\n }\n\n var val = this[offset + --byteLength]\n var mul = 1\n while (byteLength > 0 && (mul *= 0x100)) {\n val += this[offset + --byteLength] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 1, this.length)\n return this[offset]\n}\n\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return ((this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16)) +\n (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] * 0x1000000) +\n ((this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n this[offset + 3])\n}\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var val = this[offset]\n var mul = 1\n var i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var i = byteLength\n var mul = 1\n var val = this[offset + --i]\n while (i > 0 && (mul *= 0x100)) {\n val += this[offset + --i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 1, this.length)\n if (!(this[offset] & 0x80)) return (this[offset])\n return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n var val = this[offset] | (this[offset + 1] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n var val = this[offset + 1] | (this[offset] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16) |\n (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] << 24) |\n (this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n (this[offset + 3])\n}\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n var mul = 1\n var i = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n var i = byteLength - 1\n var mul = 1\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nfunction objectWriteUInt16 (buf, value, offset, littleEndian) {\n if (value < 0) value = 0xffff + value + 1\n for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {\n buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>\n (littleEndian ? i : 1 - i) * 8\n }\n}\n\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n } else {\n objectWriteUInt16(this, value, offset, true)\n }\n return offset + 2\n}\n\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n } else {\n objectWriteUInt16(this, value, offset, false)\n }\n return offset + 2\n}\n\nfunction objectWriteUInt32 (buf, value, offset, littleEndian) {\n if (value < 0) value = 0xffffffff + value + 1\n for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {\n buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff\n }\n}\n\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset + 3] = (value >>> 24)\n this[offset + 2] = (value >>> 16)\n this[offset + 1] = (value >>> 8)\n this[offset] = (value & 0xff)\n } else {\n objectWriteUInt32(this, value, offset, true)\n }\n return offset + 4\n}\n\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n } else {\n objectWriteUInt32(this, value, offset, false)\n }\n return offset + 4\n}\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) {\n var limit = Math.pow(2, 8 * byteLength - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n var i = 0\n var mul = 1\n var sub = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) {\n var limit = Math.pow(2, 8 * byteLength - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n var i = byteLength - 1\n var mul = 1\n var sub = 0\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n if (value < 0) value = 0xff + value + 1\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n } else {\n objectWriteUInt16(this, value, offset, true)\n }\n return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n } else {\n objectWriteUInt16(this, value, offset, false)\n }\n return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n this[offset + 2] = (value >>> 16)\n this[offset + 3] = (value >>> 24)\n } else {\n objectWriteUInt32(this, value, offset, true)\n }\n return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (value < 0) value = 0xffffffff + value + 1\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n } else {\n objectWriteUInt32(this, value, offset, false)\n }\n return offset + 4\n}\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n }\n ieee754.write(buf, value, offset, littleEndian, 23, 4)\n return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n }\n ieee754.write(buf, value, offset, littleEndian, 52, 8)\n return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n if (!start) start = 0\n if (!end && end !== 0) end = this.length\n if (targetStart >= target.length) targetStart = target.length\n if (!targetStart) targetStart = 0\n if (end > 0 && end < start) end = start\n\n // Copy 0 bytes; we're done\n if (end === start) return 0\n if (target.length === 0 || this.length === 0) return 0\n\n // Fatal error conditions\n if (targetStart < 0) {\n throw new RangeError('targetStart out of bounds')\n }\n if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')\n if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n // Are we oob?\n if (end > this.length) end = this.length\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start\n }\n\n var len = end - start\n var i\n\n if (this === target && start < targetStart && targetStart < end) {\n // descending copy from end\n for (i = len - 1; i >= 0; --i) {\n target[i + targetStart] = this[i + start]\n }\n } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {\n // ascending copy from start\n for (i = 0; i < len; ++i) {\n target[i + targetStart] = this[i + start]\n }\n } else {\n Uint8Array.prototype.set.call(\n target,\n this.subarray(start, start + len),\n targetStart\n )\n }\n\n return len\n}\n\n// Usage:\n// buffer.fill(number[, offset[, end]])\n// buffer.fill(buffer[, offset[, end]])\n// buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n // Handle string cases:\n if (typeof val === 'string') {\n if (typeof start === 'string') {\n encoding = start\n start = 0\n end = this.length\n } else if (typeof end === 'string') {\n encoding = end\n end = this.length\n }\n if (val.length === 1) {\n var code = val.charCodeAt(0)\n if (code < 256) {\n val = code\n }\n }\n if (encoding !== undefined && typeof encoding !== 'string') {\n throw new TypeError('encoding must be a string')\n }\n if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n } else if (typeof val === 'number') {\n val = val & 255\n }\n\n // Invalid ranges are not set to a default, so can range check early.\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError('Out of range index')\n }\n\n if (end <= start) {\n return this\n }\n\n start = start >>> 0\n end = end === undefined ? this.length : end >>> 0\n\n if (!val) val = 0\n\n var i\n if (typeof val === 'number') {\n for (i = start; i < end; ++i) {\n this[i] = val\n }\n } else {\n var bytes = Buffer.isBuffer(val)\n ? val\n : utf8ToBytes(new Buffer(val, encoding).toString())\n var len = bytes.length\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len]\n }\n }\n\n return this\n}\n\n// HELPER FUNCTIONS\n// ================\n\nvar INVALID_BASE64_RE = /[^+\\/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n str = stringtrim(str).replace(INVALID_BASE64_RE, '')\n // Node converts strings with length < 2 to ''\n if (str.length < 2) return ''\n // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n while (str.length % 4 !== 0) {\n str = str + '='\n }\n return str\n}\n\nfunction stringtrim (str) {\n if (str.trim) return str.trim()\n return str.replace(/^\\s+|\\s+$/g, '')\n}\n\nfunction toHex (n) {\n if (n < 16) return '0' + n.toString(16)\n return n.toString(16)\n}\n\nfunction utf8ToBytes (string, units) {\n units = units || Infinity\n var codePoint\n var length = string.length\n var leadSurrogate = null\n var bytes = []\n\n for (var i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i)\n\n // is surrogate component\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\n // last char was a lead\n if (!leadSurrogate) {\n // no lead yet\n if (codePoint > 0xDBFF) {\n // unexpected trail\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n } else if (i + 1 === length) {\n // unpaired lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n }\n\n // valid lead\n leadSurrogate = codePoint\n\n continue\n }\n\n // 2 leads in a row\n if (codePoint < 0xDC00) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n leadSurrogate = codePoint\n continue\n }\n\n // valid surrogate pair\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n } else if (leadSurrogate) {\n // valid bmp char, but last char was a lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n }\n\n leadSurrogate = null\n\n // encode utf8\n if (codePoint < 0x80) {\n if ((units -= 1) < 0) break\n bytes.push(codePoint)\n } else if (codePoint < 0x800) {\n if ((units -= 2) < 0) break\n bytes.push(\n codePoint >> 0x6 | 0xC0,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x10000) {\n if ((units -= 3) < 0) break\n bytes.push(\n codePoint >> 0xC | 0xE0,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x110000) {\n if ((units -= 4) < 0) break\n bytes.push(\n codePoint >> 0x12 | 0xF0,\n codePoint >> 0xC & 0x3F | 0x80,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else {\n throw new Error('Invalid code point')\n }\n }\n\n return bytes\n}\n\nfunction asciiToBytes (str) {\n var byteArray = []\n for (var i = 0; i < str.length; ++i) {\n // Node's code seems to be doing this and not & 0x7F..\n byteArray.push(str.charCodeAt(i) & 0xFF)\n }\n return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n var c, hi, lo\n var byteArray = []\n for (var i = 0; i < str.length; ++i) {\n if ((units -= 2) < 0) break\n\n c = str.charCodeAt(i)\n hi = c >> 8\n lo = c % 256\n byteArray.push(lo)\n byteArray.push(hi)\n }\n\n return byteArray\n}\n\nfunction base64ToBytes (str) {\n return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n for (var i = 0; i < length; ++i) {\n if ((i + offset >= dst.length) || (i >= src.length)) break\n dst[i + offset] = src[i]\n }\n return i\n}\n\nfunction isnan (val) {\n return val !== val // eslint-disable-line no-self-compare\n}\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// NOTE: These type checking functions intentionally don't use `instanceof`\n// because it is fragile and can be easily faked with `Object.create()`.\n\nfunction isArray(arg) {\n if (Array.isArray) {\n return Array.isArray(arg);\n }\n return objectToString(arg) === '[object Array]';\n}\nexports.isArray = isArray;\n\nfunction isBoolean(arg) {\n return typeof arg === 'boolean';\n}\nexports.isBoolean = isBoolean;\n\nfunction isNull(arg) {\n return arg === null;\n}\nexports.isNull = isNull;\n\nfunction isNullOrUndefined(arg) {\n return arg == null;\n}\nexports.isNullOrUndefined = isNullOrUndefined;\n\nfunction isNumber(arg) {\n return typeof arg === 'number';\n}\nexports.isNumber = isNumber;\n\nfunction isString(arg) {\n return typeof arg === 'string';\n}\nexports.isString = isString;\n\nfunction isSymbol(arg) {\n return typeof arg === 'symbol';\n}\nexports.isSymbol = isSymbol;\n\nfunction isUndefined(arg) {\n return arg === void 0;\n}\nexports.isUndefined = isUndefined;\n\nfunction isRegExp(re) {\n return objectToString(re) === '[object RegExp]';\n}\nexports.isRegExp = isRegExp;\n\nfunction isObject(arg) {\n return typeof arg === 'object' && arg !== null;\n}\nexports.isObject = isObject;\n\nfunction isDate(d) {\n return objectToString(d) === '[object Date]';\n}\nexports.isDate = isDate;\n\nfunction isError(e) {\n return (objectToString(e) === '[object Error]' || e instanceof Error);\n}\nexports.isError = isError;\n\nfunction isFunction(arg) {\n return typeof arg === 'function';\n}\nexports.isFunction = isFunction;\n\nfunction isPrimitive(arg) {\n return arg === null ||\n typeof arg === 'boolean' ||\n typeof arg === 'number' ||\n typeof arg === 'string' ||\n typeof arg === 'symbol' || // ES6 symbol\n typeof arg === 'undefined';\n}\nexports.isPrimitive = isPrimitive;\n\nexports.isBuffer = require('buffer').Buffer.isBuffer;\n\nfunction objectToString(o) {\n return Object.prototype.toString.call(o);\n}\n","module.exports = language\n\nvar tokenizer = require('./tokenizer')\n\nfunction language(lookups, matchComparison) {\n return function(selector) {\n return parse(selector, remap(lookups),\n matchComparison || caseSensitiveComparison)\n }\n}\n\nfunction remap(opts) {\n for(var key in opts) if(opt_okay(opts, key)) {\n opts[key] = Function(\n 'return function(node, attr) { return node.' + opts[key] + ' }'\n )\n opts[key] = opts[key]()\n }\n\n return opts\n}\n\nfunction opt_okay(opts, key) {\n return opts.hasOwnProperty(key) && typeof opts[key] === 'string'\n}\n\nfunction parse(selector, options, matchComparison) {\n var stream = tokenizer()\n , default_subj = true\n , selectors = [[]]\n , traversal\n , bits\n\n bits = selectors[0]\n\n traversal = {\n '': any_parents\n , '>': direct_parent\n , '+': direct_sibling\n , '~': any_sibling\n }\n\n stream\n .on('data', group)\n .end(selector)\n\n function group(token) {\n var crnt\n\n if(token.type === 'comma') {\n selectors.unshift(bits = [])\n\n return\n }\n\n if(token.type === 'op' || token.type === 'any-child') {\n bits.unshift(traversal[token.data])\n bits.unshift(check())\n\n return\n }\n\n bits[0] = bits[0] || check()\n crnt = bits[0]\n\n if(token.type === '!') {\n crnt.subject =\n selectors[0].subject = true\n\n return\n }\n\n crnt.push(\n token.type === 'class' ? listContains(token.type, token.data) :\n token.type === 'attr' ? attr(token) :\n token.type === ':' || token.type === '::' ? pseudo(token) :\n token.type === '*' ? Boolean :\n matches(token.type, token.data, matchComparison)\n )\n }\n\n return selector_fn\n\n function selector_fn(node, as_boolean) {\n var current\n , length\n , orig\n , subj\n , set\n\n orig = node\n set = []\n\n for(var i = 0, len = selectors.length; i < len; ++i) {\n bits = selectors[i]\n current = entry\n length = bits.length\n node = orig\n subj = []\n\n for(var j = 0; j < length; j += 2) {\n node = current(node, bits[j], subj)\n\n if(!node) {\n break\n }\n\n current = bits[j + 1]\n }\n\n if(j >= length) {\n if(as_boolean) {\n return true\n }\n\n add(!bits.subject ? [orig] : subj)\n }\n }\n\n if(as_boolean) {\n return false\n }\n\n return !set.length ? false :\n set.length === 1 ? set[0] :\n set\n\n function add(items) {\n var next\n\n while(items.length) {\n next = items.shift()\n\n if(set.indexOf(next) === -1) {\n set.push(next)\n }\n }\n }\n }\n\n function check() {\n _check.bits = []\n _check.subject = false\n _check.push = function(token) {\n _check.bits.push(token)\n }\n\n return _check\n\n function _check(node, subj) {\n for(var i = 0, len = _check.bits.length; i < len; ++i) {\n if(!_check.bits[i](node)) {\n return false\n }\n }\n\n if(_check.subject) {\n subj.push(node)\n }\n\n return true\n }\n }\n\n function listContains(type, data) {\n return function(node) {\n var val = options[type](node)\n val =\n Array.isArray(val) ? val :\n val ? val.toString().split(/\\s+/) :\n []\n return val.indexOf(data) >= 0\n }\n }\n\n function attr(token) {\n return token.data.lhs ?\n valid_attr(\n options.attr\n , token.data.lhs\n , token.data.cmp\n , token.data.rhs\n ) :\n valid_attr(options.attr, token.data)\n }\n\n function matches(type, data, matchComparison) {\n return function(node) {\n return matchComparison(type, options[type](node), data);\n }\n }\n\n function any_parents(node, next, subj) {\n do {\n node = options.parent(node)\n } while(node && !next(node, subj))\n\n return node\n }\n\n function direct_parent(node, next, subj) {\n node = options.parent(node)\n\n return node && next(node, subj) ? node : null\n }\n\n function direct_sibling(node, next, subj) {\n var parent = options.parent(node)\n , idx = 0\n , children\n\n children = options.children(parent)\n\n for(var i = 0, len = children.length; i < len; ++i) {\n if(children[i] === node) {\n idx = i\n\n break\n }\n }\n\n return children[idx - 1] && next(children[idx - 1], subj) ?\n children[idx - 1] :\n null\n }\n\n function any_sibling(node, next, subj) {\n var parent = options.parent(node)\n , children\n\n children = options.children(parent)\n\n for(var i = 0, len = children.length; i < len; ++i) {\n if(children[i] === node) {\n return null\n }\n\n if(next(children[i], subj)) {\n return children[i]\n }\n }\n\n return null\n }\n\n function pseudo(token) {\n return valid_pseudo(options, token.data, matchComparison)\n }\n\n}\n\nfunction entry(node, next, subj) {\n return next(node, subj) ? node : null\n}\n\nfunction valid_pseudo(options, match, matchComparison) {\n switch(match) {\n case 'empty': return valid_empty(options)\n case 'first-child': return valid_first_child(options)\n case 'last-child': return valid_last_child(options)\n case 'root': return valid_root(options)\n }\n\n if(match.indexOf('contains') === 0) {\n return valid_contains(options, match.slice(9, -1))\n }\n\n if(match.indexOf('any') === 0) {\n return valid_any_match(options, match.slice(4, -1), matchComparison)\n }\n\n if(match.indexOf('not') === 0) {\n return valid_not_match(options, match.slice(4, -1), matchComparison)\n }\n\n if(match.indexOf('nth-child') === 0) {\n return valid_nth_child(options, match.slice(10, -1))\n }\n\n return function() {\n return false\n }\n}\n\nfunction valid_not_match(options, selector, matchComparison) {\n var fn = parse(selector, options, matchComparison)\n\n return not_function\n\n function not_function(node) {\n return !fn(node, true)\n }\n}\n\nfunction valid_any_match(options, selector, matchComparison) {\n var fn = parse(selector, options, matchComparison)\n\n return fn\n}\n\nfunction valid_attr(fn, lhs, cmp, rhs) {\n return function(node) {\n var attr = fn(node, lhs)\n\n if(!cmp) {\n return !!attr\n }\n\n if(cmp.length === 1) {\n return attr == rhs\n }\n\n if(attr === void 0 || attr === null) {\n return false\n }\n\n return checkattr[cmp.charAt(0)](attr, rhs)\n }\n}\n\nfunction valid_first_child(options) {\n return function(node) {\n return options.children(options.parent(node))[0] === node\n }\n}\n\nfunction valid_last_child(options) {\n return function(node) {\n var children = options.children(options.parent(node))\n\n return children[children.length - 1] === node\n }\n}\n\nfunction valid_empty(options) {\n return function(node) {\n return options.children(node).length === 0\n }\n}\n\nfunction valid_root(options) {\n return function(node) {\n return !options.parent(node)\n }\n}\n\nfunction valid_contains(options, contents) {\n return function(node) {\n return options.contents(node).indexOf(contents) !== -1\n }\n}\n\nfunction valid_nth_child(options, nth) {\n var test = function(){ return false }\n if (nth == 'odd') {\n nth = '2n+1'\n } else if (nth == 'even') {\n nth = '2n'\n }\n var regexp = /( ?([-|\\+])?(\\d*)n)? ?((\\+|-)? ?(\\d+))? ?/\n var matches = nth.match(regexp)\n if (matches) {\n var growth = 0;\n if (matches[1]) {\n var positiveGrowth = (matches[2] != '-')\n growth = parseInt(matches[3] == '' ? 1 : matches[3])\n growth = growth * (positiveGrowth ? 1 : -1)\n }\n var offset = 0\n if (matches[4]) {\n offset = parseInt(matches[6])\n var positiveOffset = (matches[5] != '-')\n offset = offset * (positiveOffset ? 1 : -1)\n }\n if (growth == 0) {\n if (offset != 0) {\n test = function(children, node) {\n return children[offset - 1] === node\n }\n }\n } else {\n test = function(children, node) {\n var validPositions = []\n var len = children.length\n for (var position=1; position <= len; position++) {\n var divisible = ((position - offset) % growth) == 0;\n if (divisible) {\n if (growth > 0) {\n validPositions.push(position);\n } else {\n if ((position - offset) / growth >= 0) {\n validPositions.push(position);\n }\n }\n }\n }\n for(var i=0; i < validPositions.length; i++) {\n if (children[validPositions[i] - 1] === node) {\n return true\n }\n }\n return false\n }\n }\n }\n return function(node) {\n var children = options.children(options.parent(node))\n\n return test(children, node)\n }\n}\n\nvar checkattr = {\n '$': check_end\n , '^': check_beg\n , '*': check_any\n , '~': check_spc\n , '|': check_dsh\n}\n\nfunction check_end(l, r) {\n return l.slice(l.length - r.length) === r\n}\n\nfunction check_beg(l, r) {\n return l.slice(0, r.length) === r\n}\n\nfunction check_any(l, r) {\n return l.indexOf(r) > -1\n}\n\nfunction check_spc(l, r) {\n return l.split(/\\s+/).indexOf(r) > -1\n}\n\nfunction check_dsh(l, r) {\n return l.split('-').indexOf(r) > -1\n}\n\nfunction caseSensitiveComparison(type, pattern, data) {\n return pattern === data;\n}\n","module.exports = tokenize\n\nvar through = require('through')\n\nvar PSEUDOSTART = 'pseudo-start'\n , ATTR_START = 'attr-start'\n , ANY_CHILD = 'any-child'\n , ATTR_COMP = 'attr-comp'\n , ATTR_END = 'attr-end'\n , PSEUDOPSEUDO = '::'\n , PSEUDOCLASS = ':'\n , READY = '(ready)'\n , OPERATION = 'op'\n , CLASS = 'class'\n , COMMA = 'comma'\n , ATTR = 'attr'\n , SUBJECT = '!'\n , TAG = 'tag'\n , STAR = '*'\n , ID = 'id'\n\nfunction tokenize() {\n var escaped = false\n , gathered = []\n , state = READY \n , data = []\n , idx = 0\n , stream\n , length\n , quote\n , depth\n , lhs\n , rhs\n , cmp\n , c\n\n return stream = through(ondata, onend)\n\n function ondata(chunk) {\n data = data.concat(chunk.split(''))\n length = data.length\n\n while(idx < length && (c = data[idx++])) {\n switch(state) {\n case READY: state_ready(); break\n case ANY_CHILD: state_any_child(); break\n case OPERATION: state_op(); break\n case ATTR_START: state_attr_start(); break\n case ATTR_COMP: state_attr_compare(); break\n case ATTR_END: state_attr_end(); break\n case PSEUDOCLASS:\n case PSEUDOPSEUDO: state_pseudo(); break\n case PSEUDOSTART: state_pseudostart(); break\n case ID:\n case TAG:\n case CLASS: state_gather(); break\n }\n }\n\n data = data.slice(idx)\n }\n\n function onend(chunk) {\n if(arguments.length) {\n ondata(chunk)\n }\n\n if(gathered.length) {\n stream.queue(token())\n }\n }\n\n function state_ready() {\n switch(true) {\n case '#' === c: state = ID; break\n case '.' === c: state = CLASS; break\n case ':' === c: state = PSEUDOCLASS; break\n case '[' === c: state = ATTR_START; break\n case '!' === c: subject(); break\n case '*' === c: star(); break\n case ',' === c: comma(); break\n case /[>\\+~]/.test(c): state = OPERATION; break\n case /\\s/.test(c): state = ANY_CHILD; break\n case /[\\w\\d\\-_]/.test(c): state = TAG; --idx; break\n }\n }\n\n function subject() {\n state = SUBJECT\n gathered = ['!']\n stream.queue(token())\n state = READY\n }\n\n function star() {\n state = STAR\n gathered = ['*']\n stream.queue(token())\n state = READY\n }\n\n function comma() {\n state = COMMA\n gathered = [',']\n stream.queue(token())\n state = READY\n }\n\n function state_op() {\n if(/[>\\+~]/.test(c)) {\n return gathered.push(c)\n }\n\n // chomp down the following whitespace.\n if(/\\s/.test(c)) {\n return\n }\n\n stream.queue(token())\n state = READY\n --idx\n }\n\n function state_any_child() {\n if(/\\s/.test(c)) {\n return\n }\n\n if(/[>\\+~]/.test(c)) {\n return --idx, state = OPERATION\n }\n\n stream.queue(token())\n state = READY\n --idx\n }\n\n function state_pseudo() {\n rhs = state\n state_gather(true)\n\n if(state !== READY) {\n return\n }\n\n if(c === '(') {\n lhs = gathered.join('')\n state = PSEUDOSTART\n gathered.length = 0\n depth = 1\n ++idx\n\n return\n }\n\n state = PSEUDOCLASS\n stream.queue(token())\n state = READY\n }\n\n function state_pseudostart() {\n if(gathered.length === 0 && !quote) {\n quote = /['\"]/.test(c) ? c : null\n\n if(quote) {\n return\n }\n }\n\n if(quote) {\n if(!escaped && c === quote) {\n quote = null\n\n return\n }\n\n if(c === '\\\\') {\n escaped ? gathered.push(c) : (escaped = true)\n\n return\n }\n\n escaped = false\n gathered.push(c)\n\n return\n }\n\n gathered.push(c)\n\n if(c === '(') {\n ++depth\n } else if(c === ')') {\n --depth\n }\n \n if(!depth) {\n gathered.pop()\n stream.queue({\n type: rhs \n , data: lhs + '(' + gathered.join('') + ')'\n })\n\n state = READY\n lhs = rhs = cmp = null\n gathered.length = 0\n }\n\n return \n }\n\n function state_attr_start() {\n state_gather(true)\n\n if(state !== READY) {\n return\n }\n\n if(c === ']') {\n state = ATTR\n stream.queue(token())\n state = READY\n\n return\n }\n\n lhs = gathered.join('')\n gathered.length = 0\n state = ATTR_COMP\n }\n\n function state_attr_compare() {\n if(/[=~|$^*]/.test(c)) {\n gathered.push(c)\n }\n\n if(gathered.length === 2 || c === '=') {\n cmp = gathered.join('')\n gathered.length = 0\n state = ATTR_END\n quote = null\n\n return\n }\n }\n\n function state_attr_end() {\n if(!gathered.length && !quote) {\n quote = /['\"]/.test(c) ? c : null\n\n if(quote) {\n return\n }\n }\n\n if(quote) {\n if(!escaped && c === quote) {\n quote = null\n\n return\n }\n\n if(c === '\\\\') {\n if(escaped) {\n gathered.push(c)\n }\n\n escaped = !escaped\n\n return\n }\n\n escaped = false\n gathered.push(c)\n\n return\n }\n\n state_gather(true)\n\n if(state !== READY) {\n return\n }\n\n stream.queue({\n type: ATTR\n , data: {\n lhs: lhs\n , rhs: gathered.join('')\n , cmp: cmp\n }\n })\n\n state = READY\n lhs = rhs = cmp = null\n gathered.length = 0\n\n return \n }\n\n function state_gather(quietly) {\n if(/[^\\d\\w\\-_]/.test(c) && !escaped) {\n if(c === '\\\\') {\n escaped = true\n } else {\n !quietly && stream.queue(token())\n state = READY\n --idx\n }\n\n return\n }\n\n escaped = false\n gathered.push(c)\n }\n\n function token() {\n var data = gathered.join('')\n\n gathered.length = 0\n\n return {\n type: state\n , data: data\n }\n }\n}\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n ? R.apply\n : function ReflectApply(target, receiver, args) {\n return Function.prototype.apply.call(target, receiver, args);\n }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target)\n .concat(Object.getOwnPropertySymbols(target));\n };\n} else {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target);\n };\n}\n\nfunction ProcessEmitWarning(warning) {\n if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n return value !== value;\n}\n\nfunction EventEmitter() {\n EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\nmodule.exports.once = once;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nfunction checkListener(listener) {\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n}\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n enumerable: true,\n get: function() {\n return defaultMaxListeners;\n },\n set: function(arg) {\n if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n }\n defaultMaxListeners = arg;\n }\n});\n\nEventEmitter.init = function() {\n\n if (this._events === undefined ||\n this._events === Object.getPrototypeOf(this)._events) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n }\n\n this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n }\n this._maxListeners = n;\n return this;\n};\n\nfunction _getMaxListeners(that) {\n if (that._maxListeners === undefined)\n return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return _getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n var args = [];\n for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n var doError = (type === 'error');\n\n var events = this._events;\n if (events !== undefined)\n doError = (doError && events.error === undefined);\n else if (!doError)\n return false;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n var er;\n if (args.length > 0)\n er = args[0];\n if (er instanceof Error) {\n // Note: The comments on the `throw` lines are intentional, they show\n // up in Node's output if this results in an unhandled exception.\n throw er; // Unhandled 'error' event\n }\n // At least give some kind of context to the user\n var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n err.context = er;\n throw err; // Unhandled 'error' event\n }\n\n var handler = events[type];\n\n if (handler === undefined)\n return false;\n\n if (typeof handler === 'function') {\n ReflectApply(handler, this, args);\n } else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n ReflectApply(listeners[i], this, args);\n }\n\n return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n\n checkListener(listener);\n\n events = target._events;\n if (events === undefined) {\n events = target._events = Object.create(null);\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener !== undefined) {\n target.emit('newListener', type,\n listener.listener ? listener.listener : listener);\n\n // Re-assign `events` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n\n if (existing === undefined) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] =\n prepend ? [listener, existing] : [existing, listener];\n // If we've already got an array, just append.\n } else if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n\n // Check for listener leak\n m = _getMaxListeners(target);\n if (m > 0 && existing.length > m && !existing.warned) {\n existing.warned = true;\n // No error code for this since it is a Warning\n // eslint-disable-next-line no-restricted-syntax\n var w = new Error('Possible EventEmitter memory leak detected. ' +\n existing.length + ' ' + String(type) + ' listeners ' +\n 'added. Use emitter.setMaxListeners() to ' +\n 'increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n ProcessEmitWarning(w);\n }\n }\n\n return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n\nfunction onceWrapper() {\n if (!this.fired) {\n this.target.removeListener(this.type, this.wrapFn);\n this.fired = true;\n if (arguments.length === 0)\n return this.listener.call(this.target);\n return this.listener.apply(this.target, arguments);\n }\n}\n\nfunction _onceWrap(target, type, listener) {\n var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n var wrapped = onceWrapper.bind(state);\n wrapped.listener = listener;\n state.wrapFn = wrapped;\n return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n checkListener(listener);\n this.on(type, _onceWrap(this, type, listener));\n return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n function prependOnceListener(type, listener) {\n checkListener(listener);\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n\n checkListener(listener);\n\n events = this._events;\n if (events === undefined)\n return this;\n\n list = events[type];\n if (list === undefined)\n return this;\n\n if (list === listener || list.listener === listener) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else {\n delete events[type];\n if (events.removeListener)\n this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n\n for (i = list.length - 1; i >= 0; i--) {\n if (list[i] === listener || list[i].listener === listener) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (position === 0)\n list.shift();\n else {\n spliceOne(list, position);\n }\n\n if (list.length === 1)\n events[type] = list[0];\n\n if (events.removeListener !== undefined)\n this.emit('removeListener', type, originalListener || listener);\n }\n\n return this;\n };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n function removeAllListeners(type) {\n var listeners, events, i;\n\n events = this._events;\n if (events === undefined)\n return this;\n\n // not listening for removeListener, no need to emit\n if (events.removeListener === undefined) {\n if (arguments.length === 0) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n } else if (events[type] !== undefined) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else\n delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n var key;\n for (i = 0; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = Object.create(null);\n this._eventsCount = 0;\n return this;\n }\n\n listeners = events[type];\n\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners !== undefined) {\n // LIFO order\n for (i = listeners.length - 1; i >= 0; i--) {\n this.removeListener(type, listeners[i]);\n }\n }\n\n return this;\n };\n\nfunction _listeners(target, type, unwrap) {\n var events = target._events;\n\n if (events === undefined)\n return [];\n\n var evlistener = events[type];\n if (evlistener === undefined)\n return [];\n\n if (typeof evlistener === 'function')\n return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n return unwrap ?\n unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n var events = this._events;\n\n if (events !== undefined) {\n var evlistener = events[type];\n\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener !== undefined) {\n return evlistener.length;\n }\n }\n\n return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n var copy = new Array(n);\n for (var i = 0; i < n; ++i)\n copy[i] = arr[i];\n return copy;\n}\n\nfunction spliceOne(list, index) {\n for (; index + 1 < list.length; index++)\n list[index] = list[index + 1];\n list.pop();\n}\n\nfunction unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n}\n\nfunction once(emitter, name) {\n return new Promise(function (resolve, reject) {\n function errorListener(err) {\n emitter.removeListener(name, resolver);\n reject(err);\n }\n\n function resolver() {\n if (typeof emitter.removeListener === 'function') {\n emitter.removeListener('error', errorListener);\n }\n resolve([].slice.call(arguments));\n };\n\n eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });\n if (name !== 'error') {\n addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });\n }\n });\n}\n\nfunction addErrorHandlerIfEventEmitter(emitter, handler, flags) {\n if (typeof emitter.on === 'function') {\n eventTargetAgnosticAddListener(emitter, 'error', handler, flags);\n }\n}\n\nfunction eventTargetAgnosticAddListener(emitter, name, listener, flags) {\n if (typeof emitter.on === 'function') {\n if (flags.once) {\n emitter.once(name, listener);\n } else {\n emitter.on(name, listener);\n }\n } else if (typeof emitter.addEventListener === 'function') {\n // EventTarget does not have `error` event semantics like Node\n // EventEmitters, we do not listen for `error` events here.\n emitter.addEventListener(name, function wrapListener(arg) {\n // IE does not have builtin `{ once: true }` support so we\n // have to do it manually.\n if (flags.once) {\n emitter.removeEventListener(name, wrapListener);\n }\n listener(arg);\n });\n } else {\n throw new TypeError('The \"emitter\" argument must be of type EventEmitter. Received type ' + typeof emitter);\n }\n}\n","var parse = require('./lib/index')\r\n\r\nmodule.exports = parseArray\r\n\r\nfunction parseArray(tokens) {\r\n var parser = parse()\r\n\r\n for (var i = 0; i < tokens.length; i++) {\r\n parser(tokens[i])\r\n }\r\n\r\n return parser(null)\r\n}\r\n","var state\r\n , token\r\n , tokens\r\n , idx\r\n\r\nvar original_symbol = {\r\n nud: function() { return this.children && this.children.length ? this : fail('unexpected')() }\r\n , led: fail('missing operator')\r\n}\r\n\r\nvar symbol_table = {}\r\n\r\nfunction itself() {\r\n return this\r\n}\r\n\r\nsymbol('(ident)').nud = itself\r\nsymbol('(keyword)').nud = itself\r\nsymbol('(builtin)').nud = itself\r\nsymbol('(literal)').nud = itself\r\nsymbol('(end)')\r\n\r\nsymbol(':')\r\nsymbol(';')\r\nsymbol(',')\r\nsymbol(')')\r\nsymbol(']')\r\nsymbol('}')\r\n\r\ninfixr('&&', 30)\r\ninfixr('||', 30)\r\ninfix('|', 43)\r\ninfix('^', 44)\r\ninfix('&', 45)\r\ninfix('==', 46)\r\ninfix('!=', 46)\r\ninfix('<', 47)\r\ninfix('<=', 47)\r\ninfix('>', 47)\r\ninfix('>=', 47)\r\ninfix('>>', 48)\r\ninfix('<<', 48)\r\ninfix('+', 50)\r\ninfix('-', 50)\r\ninfix('*', 60)\r\ninfix('/', 60)\r\ninfix('%', 60)\r\ninfix('?', 20, function(left) {\r\n this.children = [left, expression(0), (advance(':'), expression(0))]\r\n this.type = 'ternary'\r\n return this\r\n})\r\ninfix('.', 80, function(left) {\r\n token.type = 'literal'\r\n state.fake(token)\r\n this.children = [left, token]\r\n advance()\r\n return this\r\n})\r\ninfix('[', 80, function(left) {\r\n this.children = [left, expression(0)]\r\n this.type = 'binary'\r\n advance(']')\r\n return this\r\n})\r\ninfix('(', 80, function(left) {\r\n this.children = [left]\r\n this.type = 'call'\r\n\r\n if(token.data !== ')') while(1) {\r\n this.children.push(expression(0))\r\n if(token.data !== ',') break\r\n advance(',')\r\n }\r\n advance(')')\r\n return this\r\n})\r\n\r\nprefix('-')\r\nprefix('+')\r\nprefix('!')\r\nprefix('~')\r\nprefix('defined')\r\nprefix('(', function() {\r\n this.type = 'group'\r\n this.children = [expression(0)]\r\n advance(')')\r\n return this\r\n})\r\nprefix('++')\r\nprefix('--')\r\nsuffix('++')\r\nsuffix('--')\r\n\r\nassignment('=')\r\nassignment('+=')\r\nassignment('-=')\r\nassignment('*=')\r\nassignment('/=')\r\nassignment('%=')\r\nassignment('&=')\r\nassignment('|=')\r\nassignment('^=')\r\nassignment('>>=')\r\nassignment('<<=')\r\n\r\nmodule.exports = function(incoming_state, incoming_tokens) {\r\n state = incoming_state\r\n tokens = incoming_tokens\r\n idx = 0\r\n var result\r\n\r\n if(!tokens.length) return\r\n\r\n advance()\r\n result = expression(0)\r\n result.parent = state[0]\r\n emit(result)\r\n\r\n if(idx < tokens.length) {\r\n throw new Error('did not use all tokens')\r\n }\r\n\r\n result.parent.children = [result]\r\n\r\n function emit(node) {\r\n state.unshift(node, false)\r\n for(var i = 0, len = node.children.length; i < len; ++i) {\r\n emit(node.children[i])\r\n }\r\n state.shift()\r\n }\r\n\r\n}\r\n\r\nfunction symbol(id, binding_power) {\r\n var sym = symbol_table[id]\r\n binding_power = binding_power || 0\r\n if(sym) {\r\n if(binding_power > sym.lbp) {\r\n sym.lbp = binding_power\r\n }\r\n } else {\r\n sym = Object.create(original_symbol)\r\n sym.id = id\r\n sym.lbp = binding_power\r\n symbol_table[id] = sym\r\n }\r\n return sym\r\n}\r\n\r\nfunction expression(rbp) {\r\n var left, t = token\r\n advance()\r\n\r\n left = t.nud()\r\n while(rbp < token.lbp) {\r\n t = token\r\n advance()\r\n left = t.led(left)\r\n }\r\n return left\r\n}\r\n\r\nfunction infix(id, bp, led) {\r\n var sym = symbol(id, bp)\r\n sym.led = led || function(left) {\r\n this.children = [left, expression(bp)]\r\n this.type = 'binary'\r\n return this\r\n }\r\n}\r\n\r\nfunction infixr(id, bp, led) {\r\n var sym = symbol(id, bp)\r\n sym.led = led || function(left) {\r\n this.children = [left, expression(bp - 1)]\r\n this.type = 'binary'\r\n return this\r\n }\r\n return sym\r\n}\r\n\r\nfunction prefix(id, nud) {\r\n var sym = symbol(id)\r\n sym.nud = nud || function() {\r\n this.children = [expression(70)]\r\n this.type = 'unary'\r\n return this\r\n }\r\n return sym\r\n}\r\n\r\nfunction suffix(id) {\r\n var sym = symbol(id, 150)\r\n sym.led = function(left) {\r\n this.children = [left]\r\n this.type = 'suffix'\r\n return this\r\n }\r\n}\r\n\r\nfunction assignment(id) {\r\n return infixr(id, 10, function(left) {\r\n this.children = [left, expression(9)]\r\n this.assignment = true\r\n this.type = 'assign'\r\n return this\r\n })\r\n}\r\n\r\nfunction advance(id) {\r\n var next\r\n , value\r\n , type\r\n , output\r\n\r\n if(id && token.data !== id) {\r\n return state.unexpected('expected `'+ id + '`, got `'+token.data+'`')\r\n }\r\n\r\n if(idx >= tokens.length) {\r\n token = symbol_table['(end)']\r\n return\r\n }\r\n\r\n next = tokens[idx++]\r\n value = next.data\r\n type = next.type\r\n\r\n if(type === 'ident') {\r\n output = state.scope.find(value) || state.create_node()\r\n type = output.type\r\n } else if(type === 'builtin') {\r\n output = symbol_table['(builtin)']\r\n } else if(type === 'keyword') {\r\n output = symbol_table['(keyword)']\r\n } else if(type === 'operator') {\r\n output = symbol_table[value]\r\n if(!output) {\r\n return state.unexpected('unknown operator `'+value+'`')\r\n }\r\n } else if(type === 'float' || type === 'integer') {\r\n type = 'literal'\r\n output = symbol_table['(literal)']\r\n } else {\r\n return state.unexpected('unexpected token.')\r\n }\r\n\r\n if(output) {\r\n if(!output.nud) { output.nud = itself }\r\n if(!output.children) { output.children = [] }\r\n }\r\n\r\n output = Object.create(output)\r\n output.token = next\r\n output.type = type\r\n if(!output.data) output.data = value\r\n\r\n return token = output\r\n}\r\n\r\nfunction fail(message) {\r\n return function() { return state.unexpected(message) }\r\n}\r\n","module.exports = parser\r\n\r\nvar full_parse_expr = require('./expr')\r\n , Scope = require('./scope')\r\n\r\n// singleton!\r\nvar Advance = new Object\r\n\r\nvar DEBUG = false\r\n\r\nvar _ = 0\r\n , IDENT = _++\r\n , STMT = _++\r\n , STMTLIST = _++\r\n , STRUCT = _++\r\n , FUNCTION = _++\r\n , FUNCTIONARGS = _++\r\n , DECL = _++\r\n , DECLLIST = _++\r\n , FORLOOP = _++\r\n , WHILELOOP = _++\r\n , IF = _++\r\n , EXPR = _++\r\n , PRECISION = _++\r\n , COMMENT = _++\r\n , PREPROCESSOR = _++\r\n , KEYWORD = _++\r\n , KEYWORD_OR_IDENT = _++\r\n , RETURN = _++\r\n , BREAK = _++\r\n , CONTINUE = _++\r\n , DISCARD = _++\r\n , DOWHILELOOP = _++\r\n , PLACEHOLDER = _++\r\n , QUANTIFIER = _++\r\n\r\nvar DECL_ALLOW_ASSIGN = 0x1\r\n , DECL_ALLOW_COMMA = 0x2\r\n , DECL_REQUIRE_NAME = 0x4\r\n , DECL_ALLOW_INVARIANT = 0x8\r\n , DECL_ALLOW_STORAGE = 0x10\r\n , DECL_NO_INOUT = 0x20\r\n , DECL_ALLOW_STRUCT = 0x40\r\n , DECL_STATEMENT = 0xFF\r\n , DECL_FUNCTION = DECL_STATEMENT & ~(DECL_ALLOW_ASSIGN | DECL_ALLOW_COMMA | DECL_NO_INOUT | DECL_ALLOW_INVARIANT | DECL_REQUIRE_NAME)\r\n , DECL_STRUCT = DECL_STATEMENT & ~(DECL_ALLOW_ASSIGN | DECL_ALLOW_INVARIANT | DECL_ALLOW_STORAGE | DECL_ALLOW_STRUCT)\r\n\r\nvar QUALIFIERS = ['const', 'attribute', 'uniform', 'varying']\r\n\r\nvar NO_ASSIGN_ALLOWED = false\r\n , NO_COMMA_ALLOWED = false\r\n\r\n// map of tokens to stmt types\r\nvar token_map = {\r\n 'block-comment': COMMENT\r\n , 'line-comment': COMMENT\r\n , 'preprocessor': PREPROCESSOR\r\n}\r\n\r\n// map of stmt types to human\r\nvar stmt_type = _ = [\r\n 'ident'\r\n , 'stmt'\r\n , 'stmtlist'\r\n , 'struct'\r\n , 'function'\r\n , 'functionargs'\r\n , 'decl'\r\n , 'decllist'\r\n , 'forloop'\r\n , 'whileloop'\r\n , 'if'\r\n , 'expr'\r\n , 'precision'\r\n , 'comment'\r\n , 'preprocessor'\r\n , 'keyword'\r\n , 'keyword_or_ident'\r\n , 'return'\r\n , 'break'\r\n , 'continue'\r\n , 'discard'\r\n , 'do-while'\r\n , 'placeholder'\r\n , 'quantifier'\r\n]\r\n\r\nfunction parser() {\r\n var stmtlist = n(STMTLIST)\r\n , stmt = n(STMT)\r\n , decllist = n(DECLLIST)\r\n , precision = n(PRECISION)\r\n , ident = n(IDENT)\r\n , keyword_or_ident = n(KEYWORD_OR_IDENT)\r\n , fn = n(FUNCTION)\r\n , fnargs = n(FUNCTIONARGS)\r\n , forstmt = n(FORLOOP)\r\n , ifstmt = n(IF)\r\n , whilestmt = n(WHILELOOP)\r\n , returnstmt = n(RETURN)\r\n , dowhilestmt = n(DOWHILELOOP)\r\n , quantifier = n(QUANTIFIER)\r\n\r\n var parse_struct\r\n , parse_precision\r\n , parse_quantifier\r\n , parse_forloop\r\n , parse_if\r\n , parse_return\r\n , parse_whileloop\r\n , parse_dowhileloop\r\n , parse_function\r\n , parse_function_args\r\n\r\n var check = arguments.length ? [].slice.call(arguments) : []\r\n , complete = false\r\n , ended = false\r\n , depth = 0\r\n , state = []\r\n , nodes = []\r\n , tokens = []\r\n , whitespace = []\r\n , errored = false\r\n , program\r\n , token\r\n , node\r\n\r\n // setup state\r\n state.shift = special_shift\r\n state.unshift = special_unshift\r\n state.fake = special_fake\r\n state.unexpected = unexpected\r\n state.scope = new Scope(state)\r\n state.create_node = function() {\r\n var n = mknode(IDENT, token)\r\n n.parent = reader.program\r\n return n\r\n }\r\n\r\n setup_stative_parsers()\r\n\r\n // setup root node\r\n node = stmtlist()\r\n node.expecting = '(eof)'\r\n node.mode = STMTLIST\r\n node.token = {type: '(program)', data: '(program)'}\r\n program = node\r\n\r\n reader.program = program\r\n reader.scope = function(scope) {\r\n if(arguments.length === 1) {\r\n state.scope = scope\r\n }\r\n return state.scope\r\n }\r\n\r\n state.unshift(node)\r\n return reader\r\n\r\n function reader(data) {\r\n if (data === null) {\r\n return end(), program\r\n }\r\n\r\n nodes = []\r\n write(data)\r\n return nodes\r\n }\r\n\r\n // stream functions ---------------------------------------------\r\n\r\n function write(input) {\r\n if(input.type === 'whitespace' || input.type === 'line-comment' || input.type === 'block-comment') {\r\n\r\n whitespace.push(input)\r\n return\r\n }\r\n tokens.push(input)\r\n token = token || tokens[0]\r\n\r\n if(token && whitespace.length) {\r\n token.preceding = token.preceding || []\r\n token.preceding = token.preceding.concat(whitespace)\r\n whitespace = []\r\n }\r\n\r\n while(take()) switch(state[0].mode) {\r\n case STMT: parse_stmt(); break\r\n case STMTLIST: parse_stmtlist(); break\r\n case DECL: parse_decl(); break\r\n case DECLLIST: parse_decllist(); break\r\n case EXPR: parse_expr(); break\r\n case STRUCT: parse_struct(true, true); break\r\n case PRECISION: parse_precision(); break\r\n case IDENT: parse_ident(); break\r\n case KEYWORD: parse_keyword(); break\r\n case KEYWORD_OR_IDENT: parse_keyword_or_ident(); break\r\n case FUNCTION: parse_function(); break\r\n case FUNCTIONARGS: parse_function_args(); break\r\n case FORLOOP: parse_forloop(); break\r\n case WHILELOOP: parse_whileloop(); break\r\n case DOWHILELOOP: parse_dowhileloop(); break\r\n case RETURN: parse_return(); break\r\n case IF: parse_if(); break\r\n case QUANTIFIER: parse_quantifier(); break\r\n }\r\n }\r\n\r\n function end(tokens) {\r\n if(arguments.length) {\r\n write(tokens)\r\n }\r\n\r\n if(state.length > 1) {\r\n unexpected('unexpected EOF')\r\n return\r\n }\r\n\r\n complete = true\r\n }\r\n\r\n function take() {\r\n if(errored || !state.length)\r\n return false\r\n\r\n return (token = tokens[0])\r\n }\r\n\r\n // ----- state manipulation --------\r\n\r\n function special_fake(x) {\r\n state.unshift(x)\r\n state.shift()\r\n }\r\n\r\n function special_unshift(_node, add_child) {\r\n _node.parent = state[0]\r\n\r\n var ret = [].unshift.call(this, _node)\r\n\r\n add_child = add_child === undefined ? true : add_child\r\n\r\n if(DEBUG) {\r\n var pad = ''\r\n for(var i = 0, len = this.length - 1; i < len; ++i) {\r\n pad += ' |'\r\n }\r\n console.log(pad, '\\\\'+_node.type, _node.token.data)\r\n }\r\n\r\n if(add_child && node !== _node) node.children.push(_node)\r\n node = _node\r\n\r\n return ret\r\n }\r\n\r\n function special_shift() {\r\n var _node = [].shift.call(this)\r\n , okay = check[this.length]\r\n , emit = false\r\n\r\n if(DEBUG) {\r\n var pad = ''\r\n for(var i = 0, len = this.length; i < len; ++i) {\r\n pad += ' |'\r\n }\r\n console.log(pad, '/'+_node.type)\r\n }\r\n\r\n if(check.length) {\r\n if(typeof check[0] === 'function') {\r\n emit = check[0](_node)\r\n } else if(okay !== undefined) {\r\n emit = okay.test ? okay.test(_node.type) : okay === _node.type\r\n }\r\n } else {\r\n emit = true\r\n }\r\n\r\n if(emit && !errored) nodes.push(_node)\r\n\r\n node = _node.parent\r\n return _node\r\n }\r\n\r\n // parse states ---------------\r\n\r\n function parse_stmtlist() {\r\n // determine the type of the statement\r\n // and then start parsing\r\n return stative(\r\n function() { state.scope.enter(); return Advance }\r\n , normal_mode\r\n )()\r\n\r\n function normal_mode() {\r\n if(token.data === state[0].expecting) {\r\n return state.scope.exit(), state.shift()\r\n }\r\n switch(token.type) {\r\n case 'preprocessor':\r\n state.fake(adhoc())\r\n tokens.shift()\r\n return\r\n default:\r\n state.unshift(stmt())\r\n return\r\n }\r\n }\r\n }\r\n\r\n function parse_stmt() {\r\n if(state[0].brace) {\r\n if(token.data !== '}') {\r\n return unexpected('expected `}`, got '+token.data)\r\n }\r\n state[0].brace = false\r\n return tokens.shift(), state.shift()\r\n }\r\n switch(token.type) {\r\n case 'eof': return got_eof()\r\n case 'keyword':\r\n switch(token.data) {\r\n case 'for': return state.unshift(forstmt());\r\n case 'if': return state.unshift(ifstmt());\r\n case 'while': return state.unshift(whilestmt());\r\n case 'do': return state.unshift(dowhilestmt());\r\n case 'break': return state.fake(mknode(BREAK, token)), tokens.shift()\r\n case 'continue': return state.fake(mknode(CONTINUE, token)), tokens.shift()\r\n case 'discard': return state.fake(mknode(DISCARD, token)), tokens.shift()\r\n case 'return': return state.unshift(returnstmt());\r\n case 'precision': return state.unshift(precision());\r\n }\r\n return state.unshift(decl(DECL_STATEMENT))\r\n case 'ident':\r\n var lookup\r\n if(lookup = state.scope.find(token.data)) {\r\n if(lookup.parent.type === 'struct') {\r\n // this is strictly untrue, you could have an\r\n // expr that starts with a struct constructor.\r\n // ... sigh\r\n return state.unshift(decl(DECL_STATEMENT))\r\n }\r\n return state.unshift(expr(';'))\r\n }\r\n case 'operator':\r\n if(token.data === '{') {\r\n state[0].brace = true\r\n var n = stmtlist()\r\n n.expecting = '}'\r\n return tokens.shift(), state.unshift(n)\r\n }\r\n if(token.data === ';') {\r\n return tokens.shift(), state.shift()\r\n }\r\n default: return state.unshift(expr(';'))\r\n }\r\n }\r\n\r\n function got_eof() {\r\n if (ended) errored = true\r\n ended = true\r\n return state.shift()\r\n }\r\n\r\n function parse_decl() {\r\n var stmt = state[0]\r\n\r\n return stative(\r\n invariant_or_not,\r\n storage_or_not,\r\n parameter_or_not,\r\n precision_or_not,\r\n struct_or_type,\r\n maybe_name,\r\n maybe_lparen, // lparen means we're a function\r\n is_decllist,\r\n done\r\n )()\r\n\r\n function invariant_or_not() {\r\n if(token.data === 'invariant') {\r\n if(stmt.flags & DECL_ALLOW_INVARIANT) {\r\n state.unshift(keyword())\r\n return Advance\r\n } else {\r\n return unexpected('`invariant` is not allowed here')\r\n }\r\n } else {\r\n state.fake(mknode(PLACEHOLDER, {data: '', position: token.position}))\r\n return Advance\r\n }\r\n }\r\n\r\n function storage_or_not() {\r\n if(is_storage(token)) {\r\n if(stmt.flags & DECL_ALLOW_STORAGE) {\r\n state.unshift(keyword())\r\n return Advance\r\n } else {\r\n return unexpected('storage is not allowed here')\r\n }\r\n } else {\r\n state.fake(mknode(PLACEHOLDER, {data: '', position: token.position}))\r\n return Advance\r\n }\r\n }\r\n\r\n function parameter_or_not() {\r\n if(is_parameter(token)) {\r\n if(!(stmt.flags & DECL_NO_INOUT)) {\r\n state.unshift(keyword())\r\n return Advance\r\n } else {\r\n return unexpected('parameter is not allowed here')\r\n }\r\n } else {\r\n state.fake(mknode(PLACEHOLDER, {data: '', position: token.position}))\r\n return Advance\r\n }\r\n }\r\n\r\n function precision_or_not() {\r\n if(is_precision(token)) {\r\n state.unshift(keyword())\r\n return Advance\r\n } else {\r\n state.fake(mknode(PLACEHOLDER, {data: '', position: token.position}))\r\n return Advance\r\n }\r\n }\r\n\r\n function struct_or_type() {\r\n if(token.data === 'struct') {\r\n if(!(stmt.flags & DECL_ALLOW_STRUCT)) {\r\n return unexpected('cannot nest structs')\r\n }\r\n state.unshift(struct())\r\n return Advance\r\n }\r\n\r\n if(token.type === 'keyword') {\r\n state.unshift(keyword())\r\n return Advance\r\n }\r\n\r\n var lookup = state.scope.find(token.data)\r\n\r\n if(lookup) {\r\n state.fake(Object.create(lookup))\r\n tokens.shift()\r\n return Advance\r\n }\r\n return unexpected('expected user defined type, struct or keyword, got '+token.data)\r\n }\r\n\r\n function maybe_name() {\r\n if(token.data === ',' && !(stmt.flags & DECL_ALLOW_COMMA)) {\r\n return state.shift()\r\n }\r\n\r\n if(token.data === '[') {\r\n // oh lord.\r\n state.unshift(quantifier())\r\n return\r\n }\r\n\r\n if(token.data === ')') return state.shift()\r\n\r\n if(token.data === ';') {\r\n return stmt.stage + 3\r\n }\r\n\r\n if(token.type !== 'ident' && token.type !== 'builtin') {\r\n return unexpected('expected identifier, got '+token.data)\r\n }\r\n\r\n stmt.collected_name = tokens.shift()\r\n return Advance\r\n }\r\n\r\n function maybe_lparen() {\r\n if(token.data === '(') {\r\n tokens.unshift(stmt.collected_name)\r\n delete stmt.collected_name\r\n state.unshift(fn())\r\n return stmt.stage + 2\r\n }\r\n return Advance\r\n }\r\n\r\n function is_decllist() {\r\n tokens.unshift(stmt.collected_name)\r\n delete stmt.collected_name\r\n state.unshift(decllist())\r\n return Advance\r\n }\r\n\r\n function done() {\r\n return state.shift()\r\n }\r\n }\r\n\r\n function parse_decllist() {\r\n // grab ident\r\n\r\n if(token.type === 'ident' || token.type === 'builtin') {\r\n var name = token.data\r\n state.unshift(ident())\r\n state.scope.define(name)\r\n return\r\n }\r\n\r\n if(token.type === 'operator') {\r\n\r\n if(token.data === ',') {\r\n // multi-decl!\r\n if(!(state[1].flags & DECL_ALLOW_COMMA)) {\r\n return state.shift()\r\n }\r\n\r\n return tokens.shift()\r\n } else if(token.data === '=') {\r\n if(!(state[1].flags & DECL_ALLOW_ASSIGN)) return unexpected('`=` is not allowed here.')\r\n\r\n tokens.shift()\r\n\r\n state.unshift(expr(',', ';'))\r\n return\r\n } else if(token.data === '[') {\r\n state.unshift(quantifier())\r\n return\r\n }\r\n }\r\n return state.shift()\r\n }\r\n\r\n function parse_keyword_or_ident() {\r\n if(token.type === 'keyword') {\r\n state[0].type = 'keyword'\r\n state[0].mode = KEYWORD\r\n return\r\n }\r\n\r\n if(token.type === 'ident') {\r\n state[0].type = 'ident'\r\n state[0].mode = IDENT\r\n return\r\n }\r\n\r\n return unexpected('expected keyword or user-defined name, got '+token.data)\r\n }\r\n\r\n function parse_keyword() {\r\n if(token.type !== 'keyword') {\r\n return unexpected('expected keyword, got '+token.data)\r\n }\r\n\r\n return state.shift(), tokens.shift()\r\n }\r\n\r\n function parse_ident() {\r\n if(token.type !== 'ident' && token.type !== 'builtin') {\r\n return unexpected('expected user-defined name, got '+token.data)\r\n }\r\n\r\n state[0].data = token.data\r\n return state.shift(), tokens.shift()\r\n }\r\n\r\n\r\n function parse_expr() {\r\n var expecting = state[0].expecting\r\n\r\n state[0].tokens = state[0].tokens || []\r\n\r\n if(state[0].parenlevel === undefined) {\r\n state[0].parenlevel = 0\r\n state[0].bracelevel = 0\r\n }\r\n if(state[0].parenlevel < 1 && expecting.indexOf(token.data) > -1) {\r\n return parseexpr(state[0].tokens)\r\n }\r\n if(token.data === '(') {\r\n ++state[0].parenlevel\r\n } else if(token.data === ')') {\r\n --state[0].parenlevel\r\n }\r\n\r\n switch(token.data) {\r\n case '{': ++state[0].bracelevel; break\r\n case '}': --state[0].bracelevel; break\r\n case '(': ++state[0].parenlevel; break\r\n case ')': --state[0].parenlevel; break\r\n }\r\n\r\n if(state[0].parenlevel < 0) return unexpected('unexpected `)`')\r\n if(state[0].bracelevel < 0) return unexpected('unexpected `}`')\r\n\r\n state[0].tokens.push(tokens.shift())\r\n return\r\n\r\n function parseexpr(tokens) {\r\n try {\r\n full_parse_expr(state, tokens)\r\n } catch(err) {\r\n errored = true\r\n throw err\r\n }\r\n\r\n return state.shift()\r\n }\r\n }\r\n\r\n // node types ---------------\r\n\r\n function n(type) {\r\n // this is a function factory that suffices for most kinds of expressions and statements\r\n return function() {\r\n return mknode(type, token)\r\n }\r\n }\r\n\r\n function adhoc() {\r\n return mknode(token_map[token.type], token, node)\r\n }\r\n\r\n function decl(flags) {\r\n var _ = mknode(DECL, token, node)\r\n _.flags = flags\r\n\r\n return _\r\n }\r\n\r\n function struct(allow_assign, allow_comma) {\r\n var _ = mknode(STRUCT, token, node)\r\n _.allow_assign = allow_assign === undefined ? true : allow_assign\r\n _.allow_comma = allow_comma === undefined ? true : allow_comma\r\n return _\r\n }\r\n\r\n function expr() {\r\n var n = mknode(EXPR, token, node)\r\n\r\n n.expecting = [].slice.call(arguments)\r\n return n\r\n }\r\n\r\n function keyword(default_value) {\r\n var t = token\r\n if(default_value) {\r\n t = {'type': '(implied)', data: '(default)', position: t.position}\r\n }\r\n return mknode(KEYWORD, t, node)\r\n }\r\n\r\n // utils ----------------------------\r\n\r\n function unexpected(str) {\r\n errored = true\r\n throw new Error(\r\n (str || 'unexpected '+state) +\r\n ' at line '+state[0].token.line\r\n )\r\n }\r\n\r\n function assert(type, data) {\r\n return 1,\r\n assert_null_string_or_array(type, token.type) &&\r\n assert_null_string_or_array(data, token.data)\r\n }\r\n\r\n function assert_null_string_or_array(x, y) {\r\n switch(typeof x) {\r\n case 'string': if(y !== x) {\r\n unexpected('expected `'+x+'`, got '+y+'\\n'+token.data);\r\n } return !errored\r\n\r\n case 'object': if(x && x.indexOf(y) === -1) {\r\n unexpected('expected one of `'+x.join('`, `')+'`, got '+y);\r\n } return !errored\r\n }\r\n return true\r\n }\r\n\r\n // stative ----------------------------\r\n\r\n function stative() {\r\n var steps = [].slice.call(arguments)\r\n , step\r\n , result\r\n\r\n return function() {\r\n var current = state[0]\r\n\r\n current.stage || (current.stage = 0)\r\n\r\n step = steps[current.stage]\r\n if(!step) return unexpected('parser in undefined state!')\r\n\r\n result = step()\r\n\r\n if(result === Advance) return ++current.stage\r\n if(result === undefined) return\r\n current.stage = result\r\n }\r\n }\r\n\r\n function advance(op, t) {\r\n t = t || 'operator'\r\n return function() {\r\n if(!assert(t, op)) return\r\n\r\n var last = tokens.shift()\r\n , children = state[0].children\r\n , last_node = children[children.length - 1]\r\n\r\n if(last_node && last_node.token && last.preceding) {\r\n last_node.token.succeeding = last_node.token.succeeding || []\r\n last_node.token.succeeding = last_node.token.succeeding.concat(last.preceding)\r\n }\r\n return Advance\r\n }\r\n }\r\n\r\n function advance_expr(until) {\r\n return function() {\r\n state.unshift(expr(until))\r\n return Advance\r\n }\r\n }\r\n\r\n function advance_ident(declare) {\r\n return declare ? function() {\r\n var name = token.data\r\n return assert('ident') && (state.unshift(ident()), state.scope.define(name), Advance)\r\n } : function() {\r\n if(!assert('ident')) return\r\n\r\n var s = Object.create(state.scope.find(token.data))\r\n s.token = token\r\n\r\n return (tokens.shift(), Advance)\r\n }\r\n }\r\n\r\n function advance_stmtlist() {\r\n return function() {\r\n var n = stmtlist()\r\n n.expecting = '}'\r\n return state.unshift(n), Advance\r\n }\r\n }\r\n\r\n function maybe_stmtlist(skip) {\r\n return function() {\r\n var current = state[0].stage\r\n if(token.data !== '{') { return state.unshift(stmt()), current + skip }\r\n return tokens.shift(), Advance\r\n }\r\n }\r\n\r\n function popstmt() {\r\n return function() { return state.shift(), state.shift() }\r\n }\r\n\r\n\r\n function setup_stative_parsers() {\r\n\r\n // could also be\r\n // struct { } decllist\r\n parse_struct =\r\n stative(\r\n advance('struct', 'keyword')\r\n , function() {\r\n if(token.data === '{') {\r\n state.fake(mknode(IDENT, {data:'', position: token.position, type:'ident'}))\r\n return Advance\r\n }\r\n\r\n return advance_ident(true)()\r\n }\r\n , function() { state.scope.enter(); return Advance }\r\n , advance('{')\r\n , function() {\r\n if(token.type === 'preprocessor') {\r\n state.fake(adhoc())\r\n tokens.shift()\r\n return\r\n }\r\n if(token.data === '}') {\r\n state.scope.exit()\r\n tokens.shift()\r\n return state.shift()\r\n }\r\n if(token.data === ';') { tokens.shift(); return }\r\n state.unshift(decl(DECL_STRUCT))\r\n }\r\n )\r\n\r\n parse_precision =\r\n stative(\r\n function() { return tokens.shift(), Advance }\r\n , function() {\r\n return assert(\r\n 'keyword', ['lowp', 'mediump', 'highp']\r\n ) && (state.unshift(keyword()), Advance)\r\n }\r\n , function() { return (state.unshift(keyword()), Advance) }\r\n , function() { return state.shift() }\r\n )\r\n\r\n parse_quantifier =\r\n stative(\r\n advance('[')\r\n , advance_expr(']')\r\n , advance(']')\r\n , function() { return state.shift() }\r\n )\r\n\r\n parse_forloop =\r\n stative(\r\n advance('for', 'keyword')\r\n , advance('(')\r\n , function() {\r\n var lookup\r\n if(token.type === 'ident') {\r\n if(!(lookup = state.scope.find(token.data))) {\r\n lookup = state.create_node()\r\n }\r\n\r\n if(lookup.parent.type === 'struct') {\r\n return state.unshift(decl(DECL_STATEMENT)), Advance\r\n }\r\n } else if(token.type === 'builtin' || token.type === 'keyword') {\r\n return state.unshift(decl(DECL_STATEMENT)), Advance\r\n }\r\n return advance_expr(';')()\r\n }\r\n , advance(';')\r\n , advance_expr(';')\r\n , advance(';')\r\n , advance_expr(')')\r\n , advance(')')\r\n , maybe_stmtlist(3)\r\n , advance_stmtlist()\r\n , advance('}')\r\n , popstmt()\r\n )\r\n\r\n parse_if =\r\n stative(\r\n advance('if', 'keyword')\r\n , advance('(')\r\n , advance_expr(')')\r\n , advance(')')\r\n , maybe_stmtlist(3)\r\n , advance_stmtlist()\r\n , advance('}')\r\n , function() {\r\n if(token.data === 'else') {\r\n return tokens.shift(), state.unshift(stmt()), Advance\r\n }\r\n return popstmt()()\r\n }\r\n , popstmt()\r\n )\r\n\r\n parse_return =\r\n stative(\r\n advance('return', 'keyword')\r\n , function() {\r\n if(token.data === ';') return Advance\r\n return state.unshift(expr(';')), Advance\r\n }\r\n , function() { tokens.shift(), popstmt()() }\r\n )\r\n\r\n parse_whileloop =\r\n stative(\r\n advance('while', 'keyword')\r\n , advance('(')\r\n , advance_expr(')')\r\n , advance(')')\r\n , maybe_stmtlist(3)\r\n , advance_stmtlist()\r\n , advance('}')\r\n , popstmt()\r\n )\r\n\r\n parse_dowhileloop =\r\n stative(\r\n advance('do', 'keyword')\r\n , maybe_stmtlist(3)\r\n , advance_stmtlist()\r\n , advance('}')\r\n , advance('while', 'keyword')\r\n , advance('(')\r\n , advance_expr(')')\r\n , advance(')')\r\n , popstmt()\r\n )\r\n\r\n parse_function =\r\n stative(\r\n function() {\r\n for(var i = 1, len = state.length; i < len; ++i) if(state[i].mode === FUNCTION) {\r\n return unexpected('function definition is not allowed within another function')\r\n }\r\n\r\n return Advance\r\n }\r\n , function() {\r\n if(!assert(\"ident\")) return\r\n\r\n var name = token.data\r\n , lookup = state.scope.find(name)\r\n\r\n state.unshift(ident())\r\n state.scope.define(name)\r\n\r\n state.scope.enter(lookup ? lookup.scope : null)\r\n return Advance\r\n }\r\n , advance('(')\r\n , function() { return state.unshift(fnargs()), Advance }\r\n , advance(')')\r\n , function() {\r\n // forward decl\r\n if(token.data === ';') {\r\n return state.scope.exit(), state.shift(), state.shift()\r\n }\r\n return Advance\r\n }\r\n , advance('{')\r\n , advance_stmtlist()\r\n , advance('}')\r\n , function() { state.scope.exit(); return Advance }\r\n , function() { return state.shift(), state.shift(), state.shift() }\r\n )\r\n\r\n parse_function_args =\r\n stative(\r\n function() {\r\n if(token.data === 'void') { state.fake(keyword()); tokens.shift(); return Advance }\r\n if(token.data === ')') { state.shift(); return }\r\n if(token.data === 'struct') {\r\n state.unshift(struct(NO_ASSIGN_ALLOWED, NO_COMMA_ALLOWED))\r\n return Advance\r\n }\r\n state.unshift(decl(DECL_FUNCTION))\r\n return Advance\r\n }\r\n , function() {\r\n if(token.data === ',') { tokens.shift(); return 0 }\r\n if(token.data === ')') { state.shift(); return }\r\n unexpected('expected one of `,` or `)`, got '+token.data)\r\n }\r\n )\r\n }\r\n}\r\n\r\nfunction mknode(mode, sourcetoken) {\r\n return {\r\n mode: mode\r\n , token: sourcetoken\r\n , children: []\r\n , type: stmt_type[mode]\r\n , id: (Math.random() * 0xFFFFFFFF).toString(16)\r\n }\r\n}\r\n\r\nfunction is_storage(token) {\r\n return token.data === 'const' ||\r\n token.data === 'attribute' ||\r\n token.data === 'uniform' ||\r\n token.data === 'varying'\r\n}\r\n\r\nfunction is_parameter(token) {\r\n return token.data === 'in' ||\r\n token.data === 'inout' ||\r\n token.data === 'out'\r\n}\r\n\r\nfunction is_precision(token) {\r\n return token.data === 'highp' ||\r\n token.data === 'mediump' ||\r\n token.data === 'lowp'\r\n}\r\n","module.exports = scope\r\n\r\nfunction scope(state) {\r\n if(this.constructor !== scope)\r\n return new scope(state)\r\n\r\n this.state = state\r\n this.scopes = []\r\n this.current = null\r\n}\r\n\r\nvar cons = scope\r\n , proto = cons.prototype\r\n\r\nproto.enter = function(s) {\r\n this.scopes.push(\r\n this.current = this.state[0].scope = s || {}\r\n )\r\n}\r\n\r\nproto.exit = function() {\r\n this.scopes.pop()\r\n this.current = this.scopes[this.scopes.length - 1]\r\n}\r\n\r\nproto.define = function(str) {\r\n this.current[str] = this.state[0]\r\n}\r\n\r\nproto.find = function(name, fail) {\r\n for(var i = this.scopes.length - 1; i > -1; --i) {\r\n if(this.scopes[i].hasOwnProperty(name)) {\r\n return this.scopes[i][name]\r\n }\r\n }\r\n\r\n return null\r\n}\r\n","module.exports = tokenize\r\n\r\nvar literals100 = require('./lib/literals')\r\n , operators = require('./lib/operators')\r\n , builtins100 = require('./lib/builtins')\r\n , literals300es = require('./lib/literals-300es')\r\n , builtins300es = require('./lib/builtins-300es')\r\n\r\nvar NORMAL = 999 // <-- never emitted\r\n , TOKEN = 9999 // <-- never emitted\r\n , BLOCK_COMMENT = 0\r\n , LINE_COMMENT = 1\r\n , PREPROCESSOR = 2\r\n , OPERATOR = 3\r\n , INTEGER = 4\r\n , FLOAT = 5\r\n , IDENT = 6\r\n , BUILTIN = 7\r\n , KEYWORD = 8\r\n , WHITESPACE = 9\r\n , EOF = 10\r\n , HEX = 11\r\n\r\nvar map = [\r\n 'block-comment'\r\n , 'line-comment'\r\n , 'preprocessor'\r\n , 'operator'\r\n , 'integer'\r\n , 'float'\r\n , 'ident'\r\n , 'builtin'\r\n , 'keyword'\r\n , 'whitespace'\r\n , 'eof'\r\n , 'integer'\r\n]\r\n\r\nfunction tokenize(opt) {\r\n var i = 0\r\n , total = 0\r\n , mode = NORMAL\r\n , c\r\n , last\r\n , content = []\r\n , tokens = []\r\n , token_idx = 0\r\n , token_offs = 0\r\n , line = 1\r\n , col = 0\r\n , start = 0\r\n , isnum = false\r\n , isoperator = false\r\n , input = ''\r\n , len\r\n\r\n opt = opt || {}\r\n var allBuiltins = builtins100\r\n var allLiterals = literals100\r\n if (opt.version === '300 es') {\r\n allBuiltins = builtins300es\r\n allLiterals = literals300es\r\n }\r\n\r\n // cache by name\r\n var builtinsDict = {}, literalsDict = {}\r\n for (var i = 0; i < allBuiltins.length; i++) {\r\n builtinsDict[allBuiltins[i]] = true\r\n }\r\n for (var i = 0; i < allLiterals.length; i++) {\r\n literalsDict[allLiterals[i]] = true\r\n }\r\n\r\n return function(data) {\r\n tokens = []\r\n if (data !== null) return write(data)\r\n return end()\r\n }\r\n\r\n function token(data) {\r\n if (data.length) {\r\n tokens.push({\r\n type: map[mode]\r\n , data: data\r\n , position: start\r\n , line: line\r\n , column: col\r\n })\r\n }\r\n }\r\n\r\n function write(chunk) {\r\n i = 0\r\n\r\n if (chunk.toString) chunk = chunk.toString()\r\n\r\n input += chunk.replace(/\\r\\n/g, '\\n')\r\n len = input.length\r\n\r\n\r\n var last\r\n\r\n while(c = input[i], i < len) {\r\n last = i\r\n\r\n switch(mode) {\r\n case BLOCK_COMMENT: i = block_comment(); break\r\n case LINE_COMMENT: i = line_comment(); break\r\n case PREPROCESSOR: i = preprocessor(); break\r\n case OPERATOR: i = operator(); break\r\n case INTEGER: i = integer(); break\r\n case HEX: i = hex(); break\r\n case FLOAT: i = decimal(); break\r\n case TOKEN: i = readtoken(); break\r\n case WHITESPACE: i = whitespace(); break\r\n case NORMAL: i = normal(); break\r\n }\r\n\r\n if(last !== i) {\r\n switch(input[last]) {\r\n case '\\n': col = 0; ++line; break\r\n default: ++col; break\r\n }\r\n }\r\n }\r\n\r\n total += i\r\n input = input.slice(i)\r\n return tokens\r\n }\r\n\r\n function end(chunk) {\r\n if(content.length) {\r\n token(content.join(''))\r\n }\r\n\r\n mode = EOF\r\n token('(eof)')\r\n return tokens\r\n }\r\n\r\n function normal() {\r\n content = content.length ? [] : content\r\n\r\n if(last === '/' && c === '*') {\r\n start = total + i - 1\r\n mode = BLOCK_COMMENT\r\n last = c\r\n return i + 1\r\n }\r\n\r\n if(last === '/' && c === '/') {\r\n start = total + i - 1\r\n mode = LINE_COMMENT\r\n last = c\r\n return i + 1\r\n }\r\n\r\n if(c === '#') {\r\n mode = PREPROCESSOR\r\n start = total + i\r\n return i\r\n }\r\n\r\n if(/\\s/.test(c)) {\r\n mode = WHITESPACE\r\n start = total + i\r\n return i\r\n }\r\n\r\n isnum = /\\d/.test(c)\r\n isoperator = /[^\\w_]/.test(c)\r\n\r\n start = total + i\r\n mode = isnum ? INTEGER : isoperator ? OPERATOR : TOKEN\r\n return i\r\n }\r\n\r\n function whitespace() {\r\n if(/[^\\s]/g.test(c)) {\r\n token(content.join(''))\r\n mode = NORMAL\r\n return i\r\n }\r\n content.push(c)\r\n last = c\r\n return i + 1\r\n }\r\n\r\n function preprocessor() {\r\n if((c === '\\r' || c === '\\n') && last !== '\\\\') {\r\n token(content.join(''))\r\n mode = NORMAL\r\n return i\r\n }\r\n content.push(c)\r\n last = c\r\n return i + 1\r\n }\r\n\r\n function line_comment() {\r\n return preprocessor()\r\n }\r\n\r\n function block_comment() {\r\n if(c === '/' && last === '*') {\r\n content.push(c)\r\n token(content.join(''))\r\n mode = NORMAL\r\n return i + 1\r\n }\r\n\r\n content.push(c)\r\n last = c\r\n return i + 1\r\n }\r\n\r\n function operator() {\r\n if(last === '.' && /\\d/.test(c)) {\r\n mode = FLOAT\r\n return i\r\n }\r\n\r\n if(last === '/' && c === '*') {\r\n mode = BLOCK_COMMENT\r\n return i\r\n }\r\n\r\n if(last === '/' && c === '/') {\r\n mode = LINE_COMMENT\r\n return i\r\n }\r\n\r\n if(c === '.' && content.length) {\r\n while(determine_operator(content));\r\n\r\n mode = FLOAT\r\n return i\r\n }\r\n\r\n if(c === ';' || c === ')' || c === '(') {\r\n if(content.length) while(determine_operator(content));\r\n token(c)\r\n mode = NORMAL\r\n return i + 1\r\n }\r\n\r\n var is_composite_operator = content.length === 2 && c !== '='\r\n if(/[\\w_\\d\\s]/.test(c) || is_composite_operator) {\r\n while(determine_operator(content));\r\n mode = NORMAL\r\n return i\r\n }\r\n\r\n content.push(c)\r\n last = c\r\n return i + 1\r\n }\r\n\r\n function determine_operator(buf) {\r\n var j = 0\r\n , idx\r\n , res\r\n\r\n do {\r\n idx = operators.indexOf(buf.slice(0, buf.length + j).join(''))\r\n res = operators[idx]\r\n\r\n if(idx === -1) {\r\n if(j-- + buf.length > 0) continue\r\n res = buf.slice(0, 1).join('')\r\n }\r\n\r\n token(res)\r\n\r\n start += res.length\r\n content = content.slice(res.length)\r\n return content.length\r\n } while(1)\r\n }\r\n\r\n function hex() {\r\n if(/[^a-fA-F0-9]/.test(c)) {\r\n token(content.join(''))\r\n mode = NORMAL\r\n return i\r\n }\r\n\r\n content.push(c)\r\n last = c\r\n return i + 1\r\n }\r\n\r\n function integer() {\r\n if(c === '.') {\r\n content.push(c)\r\n mode = FLOAT\r\n last = c\r\n return i + 1\r\n }\r\n\r\n if(/[eE]/.test(c)) {\r\n content.push(c)\r\n mode = FLOAT\r\n last = c\r\n return i + 1\r\n }\r\n\r\n if(c === 'x' && content.length === 1 && content[0] === '0') {\r\n mode = HEX\r\n content.push(c)\r\n last = c\r\n return i + 1\r\n }\r\n\r\n if(/[^\\d]/.test(c)) {\r\n token(content.join(''))\r\n mode = NORMAL\r\n return i\r\n }\r\n\r\n content.push(c)\r\n last = c\r\n return i + 1\r\n }\r\n\r\n function decimal() {\r\n if(c === 'f') {\r\n content.push(c)\r\n last = c\r\n i += 1\r\n }\r\n\r\n if(/[eE]/.test(c)) {\r\n content.push(c)\r\n last = c\r\n return i + 1\r\n }\r\n\r\n if ((c === '-' || c === '+') && /[eE]/.test(last)) {\r\n content.push(c)\r\n last = c\r\n return i + 1\r\n }\r\n\r\n if(/[^\\d]/.test(c)) {\r\n token(content.join(''))\r\n mode = NORMAL\r\n return i\r\n }\r\n\r\n content.push(c)\r\n last = c\r\n return i + 1\r\n }\r\n\r\n function readtoken() {\r\n if(/[^\\d\\w_]/.test(c)) {\r\n var contentstr = content.join('')\r\n if(literalsDict[contentstr]) {\r\n mode = KEYWORD\r\n } else if(builtinsDict[contentstr]) {\r\n mode = BUILTIN\r\n } else {\r\n mode = IDENT\r\n }\r\n token(content.join(''))\r\n mode = NORMAL\r\n return i\r\n }\r\n content.push(c)\r\n last = c\r\n return i + 1\r\n }\r\n}\r\n","// 300es builtins/reserved words that were previously valid in v100\r\nvar v100 = require('./builtins')\r\n\r\n// The texture2D|Cube functions have been removed\r\n// And the gl_ features are updated\r\nv100 = v100.slice().filter(function (b) {\r\n return !/^(gl\\_|texture)/.test(b)\r\n})\r\n\r\nmodule.exports = v100.concat([\r\n // the updated gl_ constants\r\n 'gl_VertexID'\r\n , 'gl_InstanceID'\r\n , 'gl_Position'\r\n , 'gl_PointSize'\r\n , 'gl_FragCoord'\r\n , 'gl_FrontFacing'\r\n , 'gl_FragDepth'\r\n , 'gl_PointCoord'\r\n , 'gl_MaxVertexAttribs'\r\n , 'gl_MaxVertexUniformVectors'\r\n , 'gl_MaxVertexOutputVectors'\r\n , 'gl_MaxFragmentInputVectors'\r\n , 'gl_MaxVertexTextureImageUnits'\r\n , 'gl_MaxCombinedTextureImageUnits'\r\n , 'gl_MaxTextureImageUnits'\r\n , 'gl_MaxFragmentUniformVectors'\r\n , 'gl_MaxDrawBuffers'\r\n , 'gl_MinProgramTexelOffset'\r\n , 'gl_MaxProgramTexelOffset'\r\n , 'gl_DepthRangeParameters'\r\n , 'gl_DepthRange'\r\n\r\n // other builtins\r\n , 'trunc'\r\n , 'round'\r\n , 'roundEven'\r\n , 'isnan'\r\n , 'isinf'\r\n , 'floatBitsToInt'\r\n , 'floatBitsToUint'\r\n , 'intBitsToFloat'\r\n , 'uintBitsToFloat'\r\n , 'packSnorm2x16'\r\n , 'unpackSnorm2x16'\r\n , 'packUnorm2x16'\r\n , 'unpackUnorm2x16'\r\n , 'packHalf2x16'\r\n , 'unpackHalf2x16'\r\n , 'outerProduct'\r\n , 'transpose'\r\n , 'determinant'\r\n , 'inverse'\r\n , 'texture'\r\n , 'textureSize'\r\n , 'textureProj'\r\n , 'textureLod'\r\n , 'textureOffset'\r\n , 'texelFetch'\r\n , 'texelFetchOffset'\r\n , 'textureProjOffset'\r\n , 'textureLodOffset'\r\n , 'textureProjLod'\r\n , 'textureProjLodOffset'\r\n , 'textureGrad'\r\n , 'textureGradOffset'\r\n , 'textureProjGrad'\r\n , 'textureProjGradOffset'\r\n])\r\n","module.exports = [\r\n // Keep this list sorted\r\n 'abs'\r\n , 'acos'\r\n , 'all'\r\n , 'any'\r\n , 'asin'\r\n , 'atan'\r\n , 'ceil'\r\n , 'clamp'\r\n , 'cos'\r\n , 'cross'\r\n , 'dFdx'\r\n , 'dFdy'\r\n , 'degrees'\r\n , 'distance'\r\n , 'dot'\r\n , 'equal'\r\n , 'exp'\r\n , 'exp2'\r\n , 'faceforward'\r\n , 'floor'\r\n , 'fract'\r\n , 'gl_BackColor'\r\n , 'gl_BackLightModelProduct'\r\n , 'gl_BackLightProduct'\r\n , 'gl_BackMaterial'\r\n , 'gl_BackSecondaryColor'\r\n , 'gl_ClipPlane'\r\n , 'gl_ClipVertex'\r\n , 'gl_Color'\r\n , 'gl_DepthRange'\r\n , 'gl_DepthRangeParameters'\r\n , 'gl_EyePlaneQ'\r\n , 'gl_EyePlaneR'\r\n , 'gl_EyePlaneS'\r\n , 'gl_EyePlaneT'\r\n , 'gl_Fog'\r\n , 'gl_FogCoord'\r\n , 'gl_FogFragCoord'\r\n , 'gl_FogParameters'\r\n , 'gl_FragColor'\r\n , 'gl_FragCoord'\r\n , 'gl_FragData'\r\n , 'gl_FragDepth'\r\n , 'gl_FragDepthEXT'\r\n , 'gl_FrontColor'\r\n , 'gl_FrontFacing'\r\n , 'gl_FrontLightModelProduct'\r\n , 'gl_FrontLightProduct'\r\n , 'gl_FrontMaterial'\r\n , 'gl_FrontSecondaryColor'\r\n , 'gl_LightModel'\r\n , 'gl_LightModelParameters'\r\n , 'gl_LightModelProducts'\r\n , 'gl_LightProducts'\r\n , 'gl_LightSource'\r\n , 'gl_LightSourceParameters'\r\n , 'gl_MaterialParameters'\r\n , 'gl_MaxClipPlanes'\r\n , 'gl_MaxCombinedTextureImageUnits'\r\n , 'gl_MaxDrawBuffers'\r\n , 'gl_MaxFragmentUniformComponents'\r\n , 'gl_MaxLights'\r\n , 'gl_MaxTextureCoords'\r\n , 'gl_MaxTextureImageUnits'\r\n , 'gl_MaxTextureUnits'\r\n , 'gl_MaxVaryingFloats'\r\n , 'gl_MaxVertexAttribs'\r\n , 'gl_MaxVertexTextureImageUnits'\r\n , 'gl_MaxVertexUniformComponents'\r\n , 'gl_ModelViewMatrix'\r\n , 'gl_ModelViewMatrixInverse'\r\n , 'gl_ModelViewMatrixInverseTranspose'\r\n , 'gl_ModelViewMatrixTranspose'\r\n , 'gl_ModelViewProjectionMatrix'\r\n , 'gl_ModelViewProjectionMatrixInverse'\r\n , 'gl_ModelViewProjectionMatrixInverseTranspose'\r\n , 'gl_ModelViewProjectionMatrixTranspose'\r\n , 'gl_MultiTexCoord0'\r\n , 'gl_MultiTexCoord1'\r\n , 'gl_MultiTexCoord2'\r\n , 'gl_MultiTexCoord3'\r\n , 'gl_MultiTexCoord4'\r\n , 'gl_MultiTexCoord5'\r\n , 'gl_MultiTexCoord6'\r\n , 'gl_MultiTexCoord7'\r\n , 'gl_Normal'\r\n , 'gl_NormalMatrix'\r\n , 'gl_NormalScale'\r\n , 'gl_ObjectPlaneQ'\r\n , 'gl_ObjectPlaneR'\r\n , 'gl_ObjectPlaneS'\r\n , 'gl_ObjectPlaneT'\r\n , 'gl_Point'\r\n , 'gl_PointCoord'\r\n , 'gl_PointParameters'\r\n , 'gl_PointSize'\r\n , 'gl_Position'\r\n , 'gl_ProjectionMatrix'\r\n , 'gl_ProjectionMatrixInverse'\r\n , 'gl_ProjectionMatrixInverseTranspose'\r\n , 'gl_ProjectionMatrixTranspose'\r\n , 'gl_SecondaryColor'\r\n , 'gl_TexCoord'\r\n , 'gl_TextureEnvColor'\r\n , 'gl_TextureMatrix'\r\n , 'gl_TextureMatrixInverse'\r\n , 'gl_TextureMatrixInverseTranspose'\r\n , 'gl_TextureMatrixTranspose'\r\n , 'gl_Vertex'\r\n , 'greaterThan'\r\n , 'greaterThanEqual'\r\n , 'inversesqrt'\r\n , 'length'\r\n , 'lessThan'\r\n , 'lessThanEqual'\r\n , 'log'\r\n , 'log2'\r\n , 'matrixCompMult'\r\n , 'max'\r\n , 'min'\r\n , 'mix'\r\n , 'mod'\r\n , 'normalize'\r\n , 'not'\r\n , 'notEqual'\r\n , 'pow'\r\n , 'radians'\r\n , 'reflect'\r\n , 'refract'\r\n , 'sign'\r\n , 'sin'\r\n , 'smoothstep'\r\n , 'sqrt'\r\n , 'step'\r\n , 'tan'\r\n , 'texture2D'\r\n , 'texture2DLod'\r\n , 'texture2DProj'\r\n , 'texture2DProjLod'\r\n , 'textureCube'\r\n , 'textureCubeLod'\r\n , 'texture2DLodEXT'\r\n , 'texture2DProjLodEXT'\r\n , 'textureCubeLodEXT'\r\n , 'texture2DGradEXT'\r\n , 'texture2DProjGradEXT'\r\n , 'textureCubeGradEXT'\r\n]\r\n","var v100 = require('./literals')\r\n\r\nmodule.exports = v100.slice().concat([\r\n 'layout'\r\n , 'centroid'\r\n , 'smooth'\r\n , 'case'\r\n , 'mat2x2'\r\n , 'mat2x3'\r\n , 'mat2x4'\r\n , 'mat3x2'\r\n , 'mat3x3'\r\n , 'mat3x4'\r\n , 'mat4x2'\r\n , 'mat4x3'\r\n , 'mat4x4'\r\n , 'uvec2'\r\n , 'uvec3'\r\n , 'uvec4'\r\n , 'samplerCubeShadow'\r\n , 'sampler2DArray'\r\n , 'sampler2DArrayShadow'\r\n , 'isampler2D'\r\n , 'isampler3D'\r\n , 'isamplerCube'\r\n , 'isampler2DArray'\r\n , 'usampler2D'\r\n , 'usampler3D'\r\n , 'usamplerCube'\r\n , 'usampler2DArray'\r\n , 'coherent'\r\n , 'restrict'\r\n , 'readonly'\r\n , 'writeonly'\r\n , 'resource'\r\n , 'atomic_uint'\r\n , 'noperspective'\r\n , 'patch'\r\n , 'sample'\r\n , 'subroutine'\r\n , 'common'\r\n , 'partition'\r\n , 'active'\r\n , 'filter'\r\n , 'image1D'\r\n , 'image2D'\r\n , 'image3D'\r\n , 'imageCube'\r\n , 'iimage1D'\r\n , 'iimage2D'\r\n , 'iimage3D'\r\n , 'iimageCube'\r\n , 'uimage1D'\r\n , 'uimage2D'\r\n , 'uimage3D'\r\n , 'uimageCube'\r\n , 'image1DArray'\r\n , 'image2DArray'\r\n , 'iimage1DArray'\r\n , 'iimage2DArray'\r\n , 'uimage1DArray'\r\n , 'uimage2DArray'\r\n , 'image1DShadow'\r\n , 'image2DShadow'\r\n , 'image1DArrayShadow'\r\n , 'image2DArrayShadow'\r\n , 'imageBuffer'\r\n , 'iimageBuffer'\r\n , 'uimageBuffer'\r\n , 'sampler1DArray'\r\n , 'sampler1DArrayShadow'\r\n , 'isampler1D'\r\n , 'isampler1DArray'\r\n , 'usampler1D'\r\n , 'usampler1DArray'\r\n , 'isampler2DRect'\r\n , 'usampler2DRect'\r\n , 'samplerBuffer'\r\n , 'isamplerBuffer'\r\n , 'usamplerBuffer'\r\n , 'sampler2DMS'\r\n , 'isampler2DMS'\r\n , 'usampler2DMS'\r\n , 'sampler2DMSArray'\r\n , 'isampler2DMSArray'\r\n , 'usampler2DMSArray'\r\n])\r\n","module.exports = [\r\n // current\r\n 'precision'\r\n , 'highp'\r\n , 'mediump'\r\n , 'lowp'\r\n , 'attribute'\r\n , 'const'\r\n , 'uniform'\r\n , 'varying'\r\n , 'break'\r\n , 'continue'\r\n , 'do'\r\n , 'for'\r\n , 'while'\r\n , 'if'\r\n , 'else'\r\n , 'in'\r\n , 'out'\r\n , 'inout'\r\n , 'float'\r\n , 'int'\r\n , 'uint'\r\n , 'void'\r\n , 'bool'\r\n , 'true'\r\n , 'false'\r\n , 'discard'\r\n , 'return'\r\n , 'mat2'\r\n , 'mat3'\r\n , 'mat4'\r\n , 'vec2'\r\n , 'vec3'\r\n , 'vec4'\r\n , 'ivec2'\r\n , 'ivec3'\r\n , 'ivec4'\r\n , 'bvec2'\r\n , 'bvec3'\r\n , 'bvec4'\r\n , 'sampler1D'\r\n , 'sampler2D'\r\n , 'sampler3D'\r\n , 'samplerCube'\r\n , 'sampler1DShadow'\r\n , 'sampler2DShadow'\r\n , 'struct'\r\n\r\n // future\r\n , 'asm'\r\n , 'class'\r\n , 'union'\r\n , 'enum'\r\n , 'typedef'\r\n , 'template'\r\n , 'this'\r\n , 'packed'\r\n , 'goto'\r\n , 'switch'\r\n , 'default'\r\n , 'inline'\r\n , 'noinline'\r\n , 'volatile'\r\n , 'public'\r\n , 'static'\r\n , 'extern'\r\n , 'external'\r\n , 'interface'\r\n , 'long'\r\n , 'short'\r\n , 'double'\r\n , 'half'\r\n , 'fixed'\r\n , 'unsigned'\r\n , 'input'\r\n , 'output'\r\n , 'hvec2'\r\n , 'hvec3'\r\n , 'hvec4'\r\n , 'dvec2'\r\n , 'dvec3'\r\n , 'dvec4'\r\n , 'fvec2'\r\n , 'fvec3'\r\n , 'fvec4'\r\n , 'sampler2DRect'\r\n , 'sampler3DRect'\r\n , 'sampler2DRectShadow'\r\n , 'sizeof'\r\n , 'cast'\r\n , 'namespace'\r\n , 'using'\r\n]\r\n","module.exports = [\r\n '<<='\r\n , '>>='\r\n , '++'\r\n , '--'\r\n , '<<'\r\n , '>>'\r\n , '<='\r\n , '>='\r\n , '=='\r\n , '!='\r\n , '&&'\r\n , '||'\r\n , '+='\r\n , '-='\r\n , '*='\r\n , '/='\r\n , '%='\r\n , '&='\r\n , '^^'\r\n , '^='\r\n , '|='\r\n , '('\r\n , ')'\r\n , '['\r\n , ']'\r\n , '.'\r\n , '!'\r\n , '~'\r\n , '*'\r\n , '/'\r\n , '%'\r\n , '+'\r\n , '-'\r\n , '<'\r\n , '>'\r\n , '&'\r\n , '^'\r\n , '|'\r\n , '?'\r\n , ':'\r\n , '='\r\n , ','\r\n , ';'\r\n , '{'\r\n , '}'\r\n]\r\n","var tokenize = require('./index')\r\n\r\nmodule.exports = tokenizeString\r\n\r\nfunction tokenizeString(str, opt) {\r\n var generator = tokenize(opt)\r\n var tokens = []\r\n\r\n tokens = tokens.concat(generator(str))\r\n tokens = tokens.concat(generator(null))\r\n\r\n return tokens\r\n}\r\n","/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh */\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n var e, m\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var nBits = -7\n var i = isLE ? (nBytes - 1) : 0\n var d = isLE ? -1 : 1\n var s = buffer[offset + i]\n\n i += d\n\n e = s & ((1 << (-nBits)) - 1)\n s >>= (-nBits)\n nBits += eLen\n for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & ((1 << (-nBits)) - 1)\n e >>= (-nBits)\n nBits += mLen\n for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen)\n e = e - eBias\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n var i = isLE ? 0 : (nBytes - 1)\n var d = isLE ? 1 : -1\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n value = Math.abs(value)\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0\n e = eMax\n } else {\n e = Math.floor(Math.log(value) / Math.LN2)\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--\n c *= 2\n }\n if (e + eBias >= 1) {\n value += rt / c\n } else {\n value += rt * Math.pow(2, 1 - eBias)\n }\n if (value * c >= 2) {\n e++\n c /= 2\n }\n\n if (e + eBias >= eMax) {\n m = 0\n e = eMax\n } else if (e + eBias >= 1) {\n m = ((value * c) - 1) * Math.pow(2, mLen)\n e = e + eBias\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n e = 0\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = (e << mLen) | m\n eLen += mLen\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128\n}\n","if (typeof Object.create === 'function') {\n // implementation from standard node.js 'util' module\n module.exports = function inherits(ctor, superCtor) {\n if (superCtor) {\n ctor.super_ = superCtor\n ctor.prototype = Object.create(superCtor.prototype, {\n constructor: {\n value: ctor,\n enumerable: false,\n writable: true,\n configurable: true\n }\n })\n }\n };\n} else {\n // old school shim for old browsers\n module.exports = function inherits(ctor, superCtor) {\n if (superCtor) {\n ctor.super_ = superCtor\n var TempCtor = function () {}\n TempCtor.prototype = superCtor.prototype\n ctor.prototype = new TempCtor()\n ctor.prototype.constructor = ctor\n }\n }\n}\n","var toString = {}.toString;\n\nmodule.exports = Array.isArray || function (arr) {\n return toString.call(arr) == '[object Array]';\n};\n","'use strict';\n\nif (typeof process === 'undefined' ||\n !process.version ||\n process.version.indexOf('v0.') === 0 ||\n process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) {\n module.exports = { nextTick: nextTick };\n} else {\n module.exports = process\n}\n\nfunction nextTick(fn, arg1, arg2, arg3) {\n if (typeof fn !== 'function') {\n throw new TypeError('\"callback\" argument must be a function');\n }\n var len = arguments.length;\n var args, i;\n switch (len) {\n case 0:\n case 1:\n return process.nextTick(fn);\n case 2:\n return process.nextTick(function afterTickOne() {\n fn.call(null, arg1);\n });\n case 3:\n return process.nextTick(function afterTickTwo() {\n fn.call(null, arg1, arg2);\n });\n case 4:\n return process.nextTick(function afterTickThree() {\n fn.call(null, arg1, arg2, arg3);\n });\n default:\n args = new Array(len - 1);\n i = 0;\n while (i < args.length) {\n args[i++] = arguments[i];\n }\n return process.nextTick(function afterTick() {\n fn.apply(null, args);\n });\n }\n}\n\n","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n","module.exports = require('./lib/_stream_duplex.js');\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// a duplex stream is just a stream that is both readable and writable.\n// Since JS doesn't have multiple prototypal inheritance, this class\n// prototypally inherits from Readable, and then parasitically from\n// Writable.\n\n'use strict';\n\n/**/\n\nvar pna = require('process-nextick-args');\n/**/\n\n/**/\nvar objectKeys = Object.keys || function (obj) {\n var keys = [];\n for (var key in obj) {\n keys.push(key);\n }return keys;\n};\n/**/\n\nmodule.exports = Duplex;\n\n/**/\nvar util = Object.create(require('core-util-is'));\nutil.inherits = require('inherits');\n/**/\n\nvar Readable = require('./_stream_readable');\nvar Writable = require('./_stream_writable');\n\nutil.inherits(Duplex, Readable);\n\n{\n // avoid scope creep, the keys array can then be collected\n var keys = objectKeys(Writable.prototype);\n for (var v = 0; v < keys.length; v++) {\n var method = keys[v];\n if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];\n }\n}\n\nfunction Duplex(options) {\n if (!(this instanceof Duplex)) return new Duplex(options);\n\n Readable.call(this, options);\n Writable.call(this, options);\n\n if (options && options.readable === false) this.readable = false;\n\n if (options && options.writable === false) this.writable = false;\n\n this.allowHalfOpen = true;\n if (options && options.allowHalfOpen === false) this.allowHalfOpen = false;\n\n this.once('end', onend);\n}\n\nObject.defineProperty(Duplex.prototype, 'writableHighWaterMark', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function () {\n return this._writableState.highWaterMark;\n }\n});\n\n// the no-half-open enforcer\nfunction onend() {\n // if we allow half-open state, or if the writable side ended,\n // then we're ok.\n if (this.allowHalfOpen || this._writableState.ended) return;\n\n // no more data can be written.\n // But allow more writes to happen in this tick.\n pna.nextTick(onEndNT, this);\n}\n\nfunction onEndNT(self) {\n self.end();\n}\n\nObject.defineProperty(Duplex.prototype, 'destroyed', {\n get: function () {\n if (this._readableState === undefined || this._writableState === undefined) {\n return false;\n }\n return this._readableState.destroyed && this._writableState.destroyed;\n },\n set: function (value) {\n // we ignore the value if the stream\n // has not been initialized yet\n if (this._readableState === undefined || this._writableState === undefined) {\n return;\n }\n\n // backward compatibility, the user is explicitly\n // managing destroyed\n this._readableState.destroyed = value;\n this._writableState.destroyed = value;\n }\n});\n\nDuplex.prototype._destroy = function (err, cb) {\n this.push(null);\n this.end();\n\n pna.nextTick(cb, err);\n};","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// a passthrough stream.\n// basically just the most minimal sort of Transform stream.\n// Every written chunk gets output as-is.\n\n'use strict';\n\nmodule.exports = PassThrough;\n\nvar Transform = require('./_stream_transform');\n\n/**/\nvar util = Object.create(require('core-util-is'));\nutil.inherits = require('inherits');\n/**/\n\nutil.inherits(PassThrough, Transform);\n\nfunction PassThrough(options) {\n if (!(this instanceof PassThrough)) return new PassThrough(options);\n\n Transform.call(this, options);\n}\n\nPassThrough.prototype._transform = function (chunk, encoding, cb) {\n cb(null, chunk);\n};","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\n/**/\n\nvar pna = require('process-nextick-args');\n/**/\n\nmodule.exports = Readable;\n\n/**/\nvar isArray = require('isarray');\n/**/\n\n/**/\nvar Duplex;\n/**/\n\nReadable.ReadableState = ReadableState;\n\n/**/\nvar EE = require('events').EventEmitter;\n\nvar EElistenerCount = function (emitter, type) {\n return emitter.listeners(type).length;\n};\n/**/\n\n/**/\nvar Stream = require('./internal/streams/stream');\n/**/\n\n/**/\n\nvar Buffer = require('safe-buffer').Buffer;\nvar OurUint8Array = global.Uint8Array || function () {};\nfunction _uint8ArrayToBuffer(chunk) {\n return Buffer.from(chunk);\n}\nfunction _isUint8Array(obj) {\n return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;\n}\n\n/**/\n\n/**/\nvar util = Object.create(require('core-util-is'));\nutil.inherits = require('inherits');\n/**/\n\n/**/\nvar debugUtil = require('util');\nvar debug = void 0;\nif (debugUtil && debugUtil.debuglog) {\n debug = debugUtil.debuglog('stream');\n} else {\n debug = function () {};\n}\n/**/\n\nvar BufferList = require('./internal/streams/BufferList');\nvar destroyImpl = require('./internal/streams/destroy');\nvar StringDecoder;\n\nutil.inherits(Readable, Stream);\n\nvar kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume'];\n\nfunction prependListener(emitter, event, fn) {\n // Sadly this is not cacheable as some libraries bundle their own\n // event emitter implementation with them.\n if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn);\n\n // This is a hack to make sure that our error handler is attached before any\n // userland ones. NEVER DO THIS. This is here only because this code needs\n // to continue to work with older versions of Node.js that do not include\n // the prependListener() method. The goal is to eventually remove this hack.\n if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];\n}\n\nfunction ReadableState(options, stream) {\n Duplex = Duplex || require('./_stream_duplex');\n\n options = options || {};\n\n // Duplex streams are both readable and writable, but share\n // the same options object.\n // However, some cases require setting options to different\n // values for the readable and the writable sides of the duplex stream.\n // These options can be provided separately as readableXXX and writableXXX.\n var isDuplex = stream instanceof Duplex;\n\n // object stream flag. Used to make read(n) ignore n and to\n // make all the buffer merging and length checks go away\n this.objectMode = !!options.objectMode;\n\n if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode;\n\n // the point at which it stops calling _read() to fill the buffer\n // Note: 0 is a valid value, means \"don't call _read preemptively ever\"\n var hwm = options.highWaterMark;\n var readableHwm = options.readableHighWaterMark;\n var defaultHwm = this.objectMode ? 16 : 16 * 1024;\n\n if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm;\n\n // cast to ints.\n this.highWaterMark = Math.floor(this.highWaterMark);\n\n // A linked list is used to store data chunks instead of an array because the\n // linked list can remove elements from the beginning faster than\n // array.shift()\n this.buffer = new BufferList();\n this.length = 0;\n this.pipes = null;\n this.pipesCount = 0;\n this.flowing = null;\n this.ended = false;\n this.endEmitted = false;\n this.reading = false;\n\n // a flag to be able to tell if the event 'readable'/'data' is emitted\n // immediately, or on a later tick. We set this to true at first, because\n // any actions that shouldn't happen until \"later\" should generally also\n // not happen before the first read call.\n this.sync = true;\n\n // whenever we return null, then we set a flag to say\n // that we're awaiting a 'readable' event emission.\n this.needReadable = false;\n this.emittedReadable = false;\n this.readableListening = false;\n this.resumeScheduled = false;\n\n // has it been destroyed\n this.destroyed = false;\n\n // Crypto is kind of old and crusty. Historically, its default string\n // encoding is 'binary' so we have to make this configurable.\n // Everything else in the universe uses 'utf8', though.\n this.defaultEncoding = options.defaultEncoding || 'utf8';\n\n // the number of writers that are awaiting a drain event in .pipe()s\n this.awaitDrain = 0;\n\n // if true, a maybeReadMore has been scheduled\n this.readingMore = false;\n\n this.decoder = null;\n this.encoding = null;\n if (options.encoding) {\n if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;\n this.decoder = new StringDecoder(options.encoding);\n this.encoding = options.encoding;\n }\n}\n\nfunction Readable(options) {\n Duplex = Duplex || require('./_stream_duplex');\n\n if (!(this instanceof Readable)) return new Readable(options);\n\n this._readableState = new ReadableState(options, this);\n\n // legacy\n this.readable = true;\n\n if (options) {\n if (typeof options.read === 'function') this._read = options.read;\n\n if (typeof options.destroy === 'function') this._destroy = options.destroy;\n }\n\n Stream.call(this);\n}\n\nObject.defineProperty(Readable.prototype, 'destroyed', {\n get: function () {\n if (this._readableState === undefined) {\n return false;\n }\n return this._readableState.destroyed;\n },\n set: function (value) {\n // we ignore the value if the stream\n // has not been initialized yet\n if (!this._readableState) {\n return;\n }\n\n // backward compatibility, the user is explicitly\n // managing destroyed\n this._readableState.destroyed = value;\n }\n});\n\nReadable.prototype.destroy = destroyImpl.destroy;\nReadable.prototype._undestroy = destroyImpl.undestroy;\nReadable.prototype._destroy = function (err, cb) {\n this.push(null);\n cb(err);\n};\n\n// Manually shove something into the read() buffer.\n// This returns true if the highWaterMark has not been hit yet,\n// similar to how Writable.write() returns true if you should\n// write() some more.\nReadable.prototype.push = function (chunk, encoding) {\n var state = this._readableState;\n var skipChunkCheck;\n\n if (!state.objectMode) {\n if (typeof chunk === 'string') {\n encoding = encoding || state.defaultEncoding;\n if (encoding !== state.encoding) {\n chunk = Buffer.from(chunk, encoding);\n encoding = '';\n }\n skipChunkCheck = true;\n }\n } else {\n skipChunkCheck = true;\n }\n\n return readableAddChunk(this, chunk, encoding, false, skipChunkCheck);\n};\n\n// Unshift should *always* be something directly out of read()\nReadable.prototype.unshift = function (chunk) {\n return readableAddChunk(this, chunk, null, true, false);\n};\n\nfunction readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) {\n var state = stream._readableState;\n if (chunk === null) {\n state.reading = false;\n onEofChunk(stream, state);\n } else {\n var er;\n if (!skipChunkCheck) er = chunkInvalid(state, chunk);\n if (er) {\n stream.emit('error', er);\n } else if (state.objectMode || chunk && chunk.length > 0) {\n if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) {\n chunk = _uint8ArrayToBuffer(chunk);\n }\n\n if (addToFront) {\n if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true);\n } else if (state.ended) {\n stream.emit('error', new Error('stream.push() after EOF'));\n } else {\n state.reading = false;\n if (state.decoder && !encoding) {\n chunk = state.decoder.write(chunk);\n if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state);\n } else {\n addChunk(stream, state, chunk, false);\n }\n }\n } else if (!addToFront) {\n state.reading = false;\n }\n }\n\n return needMoreData(state);\n}\n\nfunction addChunk(stream, state, chunk, addToFront) {\n if (state.flowing && state.length === 0 && !state.sync) {\n stream.emit('data', chunk);\n stream.read(0);\n } else {\n // update the buffer info.\n state.length += state.objectMode ? 1 : chunk.length;\n if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);\n\n if (state.needReadable) emitReadable(stream);\n }\n maybeReadMore(stream, state);\n}\n\nfunction chunkInvalid(state, chunk) {\n var er;\n if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {\n er = new TypeError('Invalid non-string/buffer chunk');\n }\n return er;\n}\n\n// if it's past the high water mark, we can push in some more.\n// Also, if we have no data yet, we can stand some\n// more bytes. This is to work around cases where hwm=0,\n// such as the repl. Also, if the push() triggered a\n// readable event, and the user called read(largeNumber) such that\n// needReadable was set, then we ought to push more, so that another\n// 'readable' event will be triggered.\nfunction needMoreData(state) {\n return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0);\n}\n\nReadable.prototype.isPaused = function () {\n return this._readableState.flowing === false;\n};\n\n// backwards compatibility.\nReadable.prototype.setEncoding = function (enc) {\n if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;\n this._readableState.decoder = new StringDecoder(enc);\n this._readableState.encoding = enc;\n return this;\n};\n\n// Don't raise the hwm > 8MB\nvar MAX_HWM = 0x800000;\nfunction computeNewHighWaterMark(n) {\n if (n >= MAX_HWM) {\n n = MAX_HWM;\n } else {\n // Get the next highest power of 2 to prevent increasing hwm excessively in\n // tiny amounts\n n--;\n n |= n >>> 1;\n n |= n >>> 2;\n n |= n >>> 4;\n n |= n >>> 8;\n n |= n >>> 16;\n n++;\n }\n return n;\n}\n\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction howMuchToRead(n, state) {\n if (n <= 0 || state.length === 0 && state.ended) return 0;\n if (state.objectMode) return 1;\n if (n !== n) {\n // Only flow one buffer at a time\n if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;\n }\n // If we're asking for more than the current hwm, then raise the hwm.\n if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);\n if (n <= state.length) return n;\n // Don't have enough\n if (!state.ended) {\n state.needReadable = true;\n return 0;\n }\n return state.length;\n}\n\n// you can override either this method, or the async _read(n) below.\nReadable.prototype.read = function (n) {\n debug('read', n);\n n = parseInt(n, 10);\n var state = this._readableState;\n var nOrig = n;\n\n if (n !== 0) state.emittedReadable = false;\n\n // if we're doing read(0) to trigger a readable event, but we\n // already have a bunch of data in the buffer, then just trigger\n // the 'readable' event and move on.\n if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) {\n debug('read: emitReadable', state.length, state.ended);\n if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);\n return null;\n }\n\n n = howMuchToRead(n, state);\n\n // if we've ended, and we're now clear, then finish it up.\n if (n === 0 && state.ended) {\n if (state.length === 0) endReadable(this);\n return null;\n }\n\n // All the actual chunk generation logic needs to be\n // *below* the call to _read. The reason is that in certain\n // synthetic stream cases, such as passthrough streams, _read\n // may be a completely synchronous operation which may change\n // the state of the read buffer, providing enough data when\n // before there was *not* enough.\n //\n // So, the steps are:\n // 1. Figure out what the state of things will be after we do\n // a read from the buffer.\n //\n // 2. If that resulting state will trigger a _read, then call _read.\n // Note that this may be asynchronous, or synchronous. Yes, it is\n // deeply ugly to write APIs this way, but that still doesn't mean\n // that the Readable class should behave improperly, as streams are\n // designed to be sync/async agnostic.\n // Take note if the _read call is sync or async (ie, if the read call\n // has returned yet), so that we know whether or not it's safe to emit\n // 'readable' etc.\n //\n // 3. Actually pull the requested chunks out of the buffer and return.\n\n // if we need a readable event, then we need to do some reading.\n var doRead = state.needReadable;\n debug('need readable', doRead);\n\n // if we currently have less than the highWaterMark, then also read some\n if (state.length === 0 || state.length - n < state.highWaterMark) {\n doRead = true;\n debug('length less than watermark', doRead);\n }\n\n // however, if we've ended, then there's no point, and if we're already\n // reading, then it's unnecessary.\n if (state.ended || state.reading) {\n doRead = false;\n debug('reading or ended', doRead);\n } else if (doRead) {\n debug('do read');\n state.reading = true;\n state.sync = true;\n // if the length is currently zero, then we *need* a readable event.\n if (state.length === 0) state.needReadable = true;\n // call internal read method\n this._read(state.highWaterMark);\n state.sync = false;\n // If _read pushed data synchronously, then `reading` will be false,\n // and we need to re-evaluate how much data we can return to the user.\n if (!state.reading) n = howMuchToRead(nOrig, state);\n }\n\n var ret;\n if (n > 0) ret = fromList(n, state);else ret = null;\n\n if (ret === null) {\n state.needReadable = true;\n n = 0;\n } else {\n state.length -= n;\n }\n\n if (state.length === 0) {\n // If we have nothing in the buffer, then we want to know\n // as soon as we *do* get something into the buffer.\n if (!state.ended) state.needReadable = true;\n\n // If we tried to read() past the EOF, then emit end on the next tick.\n if (nOrig !== n && state.ended) endReadable(this);\n }\n\n if (ret !== null) this.emit('data', ret);\n\n return ret;\n};\n\nfunction onEofChunk(stream, state) {\n if (state.ended) return;\n if (state.decoder) {\n var chunk = state.decoder.end();\n if (chunk && chunk.length) {\n state.buffer.push(chunk);\n state.length += state.objectMode ? 1 : chunk.length;\n }\n }\n state.ended = true;\n\n // emit 'readable' now to make sure it gets picked up.\n emitReadable(stream);\n}\n\n// Don't emit readable right away in sync mode, because this can trigger\n// another read() call => stack overflow. This way, it might trigger\n// a nextTick recursion warning, but that's not so bad.\nfunction emitReadable(stream) {\n var state = stream._readableState;\n state.needReadable = false;\n if (!state.emittedReadable) {\n debug('emitReadable', state.flowing);\n state.emittedReadable = true;\n if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream);\n }\n}\n\nfunction emitReadable_(stream) {\n debug('emit readable');\n stream.emit('readable');\n flow(stream);\n}\n\n// at this point, the user has presumably seen the 'readable' event,\n// and called read() to consume some data. that may have triggered\n// in turn another _read(n) call, in which case reading = true if\n// it's in progress.\n// However, if we're not ended, or reading, and the length < hwm,\n// then go ahead and try to read some more preemptively.\nfunction maybeReadMore(stream, state) {\n if (!state.readingMore) {\n state.readingMore = true;\n pna.nextTick(maybeReadMore_, stream, state);\n }\n}\n\nfunction maybeReadMore_(stream, state) {\n var len = state.length;\n while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) {\n debug('maybeReadMore read 0');\n stream.read(0);\n if (len === state.length)\n // didn't get any data, stop spinning.\n break;else len = state.length;\n }\n state.readingMore = false;\n}\n\n// abstract method. to be overridden in specific implementation classes.\n// call cb(er, data) where data is <= n in length.\n// for virtual (non-string, non-buffer) streams, \"length\" is somewhat\n// arbitrary, and perhaps not very meaningful.\nReadable.prototype._read = function (n) {\n this.emit('error', new Error('_read() is not implemented'));\n};\n\nReadable.prototype.pipe = function (dest, pipeOpts) {\n var src = this;\n var state = this._readableState;\n\n switch (state.pipesCount) {\n case 0:\n state.pipes = dest;\n break;\n case 1:\n state.pipes = [state.pipes, dest];\n break;\n default:\n state.pipes.push(dest);\n break;\n }\n state.pipesCount += 1;\n debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);\n\n var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;\n\n var endFn = doEnd ? onend : unpipe;\n if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn);\n\n dest.on('unpipe', onunpipe);\n function onunpipe(readable, unpipeInfo) {\n debug('onunpipe');\n if (readable === src) {\n if (unpipeInfo && unpipeInfo.hasUnpiped === false) {\n unpipeInfo.hasUnpiped = true;\n cleanup();\n }\n }\n }\n\n function onend() {\n debug('onend');\n dest.end();\n }\n\n // when the dest drains, it reduces the awaitDrain counter\n // on the source. This would be more elegant with a .once()\n // handler in flow(), but adding and removing repeatedly is\n // too slow.\n var ondrain = pipeOnDrain(src);\n dest.on('drain', ondrain);\n\n var cleanedUp = false;\n function cleanup() {\n debug('cleanup');\n // cleanup event handlers once the pipe is broken\n dest.removeListener('close', onclose);\n dest.removeListener('finish', onfinish);\n dest.removeListener('drain', ondrain);\n dest.removeListener('error', onerror);\n dest.removeListener('unpipe', onunpipe);\n src.removeListener('end', onend);\n src.removeListener('end', unpipe);\n src.removeListener('data', ondata);\n\n cleanedUp = true;\n\n // if the reader is waiting for a drain event from this\n // specific writer, then it would cause it to never start\n // flowing again.\n // So, if this is awaiting a drain, then we just call it now.\n // If we don't know, then assume that we are waiting for one.\n if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();\n }\n\n // If the user pushes more data while we're writing to dest then we'll end up\n // in ondata again. However, we only want to increase awaitDrain once because\n // dest will only emit one 'drain' event for the multiple writes.\n // => Introduce a guard on increasing awaitDrain.\n var increasedAwaitDrain = false;\n src.on('data', ondata);\n function ondata(chunk) {\n debug('ondata');\n increasedAwaitDrain = false;\n var ret = dest.write(chunk);\n if (false === ret && !increasedAwaitDrain) {\n // If the user unpiped during `dest.write()`, it is possible\n // to get stuck in a permanently paused state if that write\n // also returned false.\n // => Check whether `dest` is still a piping destination.\n if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {\n debug('false write response, pause', src._readableState.awaitDrain);\n src._readableState.awaitDrain++;\n increasedAwaitDrain = true;\n }\n src.pause();\n }\n }\n\n // if the dest has an error, then stop piping into it.\n // however, don't suppress the throwing behavior for this.\n function onerror(er) {\n debug('onerror', er);\n unpipe();\n dest.removeListener('error', onerror);\n if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er);\n }\n\n // Make sure our error handler is attached before userland ones.\n prependListener(dest, 'error', onerror);\n\n // Both close and finish should trigger unpipe, but only once.\n function onclose() {\n dest.removeListener('finish', onfinish);\n unpipe();\n }\n dest.once('close', onclose);\n function onfinish() {\n debug('onfinish');\n dest.removeListener('close', onclose);\n unpipe();\n }\n dest.once('finish', onfinish);\n\n function unpipe() {\n debug('unpipe');\n src.unpipe(dest);\n }\n\n // tell the dest that it's being piped to\n dest.emit('pipe', src);\n\n // start the flow if it hasn't been started already.\n if (!state.flowing) {\n debug('pipe resume');\n src.resume();\n }\n\n return dest;\n};\n\nfunction pipeOnDrain(src) {\n return function () {\n var state = src._readableState;\n debug('pipeOnDrain', state.awaitDrain);\n if (state.awaitDrain) state.awaitDrain--;\n if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {\n state.flowing = true;\n flow(src);\n }\n };\n}\n\nReadable.prototype.unpipe = function (dest) {\n var state = this._readableState;\n var unpipeInfo = { hasUnpiped: false };\n\n // if we're not piping anywhere, then do nothing.\n if (state.pipesCount === 0) return this;\n\n // just one destination. most common case.\n if (state.pipesCount === 1) {\n // passed in one, but it's not the right one.\n if (dest && dest !== state.pipes) return this;\n\n if (!dest) dest = state.pipes;\n\n // got a match.\n state.pipes = null;\n state.pipesCount = 0;\n state.flowing = false;\n if (dest) dest.emit('unpipe', this, unpipeInfo);\n return this;\n }\n\n // slow case. multiple pipe destinations.\n\n if (!dest) {\n // remove all.\n var dests = state.pipes;\n var len = state.pipesCount;\n state.pipes = null;\n state.pipesCount = 0;\n state.flowing = false;\n\n for (var i = 0; i < len; i++) {\n dests[i].emit('unpipe', this, unpipeInfo);\n }return this;\n }\n\n // try to find the right one.\n var index = indexOf(state.pipes, dest);\n if (index === -1) return this;\n\n state.pipes.splice(index, 1);\n state.pipesCount -= 1;\n if (state.pipesCount === 1) state.pipes = state.pipes[0];\n\n dest.emit('unpipe', this, unpipeInfo);\n\n return this;\n};\n\n// set up data events if they are asked for\n// Ensure readable listeners eventually get something\nReadable.prototype.on = function (ev, fn) {\n var res = Stream.prototype.on.call(this, ev, fn);\n\n if (ev === 'data') {\n // Start flowing on next tick if stream isn't explicitly paused\n if (this._readableState.flowing !== false) this.resume();\n } else if (ev === 'readable') {\n var state = this._readableState;\n if (!state.endEmitted && !state.readableListening) {\n state.readableListening = state.needReadable = true;\n state.emittedReadable = false;\n if (!state.reading) {\n pna.nextTick(nReadingNextTick, this);\n } else if (state.length) {\n emitReadable(this);\n }\n }\n }\n\n return res;\n};\nReadable.prototype.addListener = Readable.prototype.on;\n\nfunction nReadingNextTick(self) {\n debug('readable nexttick read 0');\n self.read(0);\n}\n\n// pause() and resume() are remnants of the legacy readable stream API\n// If the user uses them, then switch into old mode.\nReadable.prototype.resume = function () {\n var state = this._readableState;\n if (!state.flowing) {\n debug('resume');\n state.flowing = true;\n resume(this, state);\n }\n return this;\n};\n\nfunction resume(stream, state) {\n if (!state.resumeScheduled) {\n state.resumeScheduled = true;\n pna.nextTick(resume_, stream, state);\n }\n}\n\nfunction resume_(stream, state) {\n if (!state.reading) {\n debug('resume read 0');\n stream.read(0);\n }\n\n state.resumeScheduled = false;\n state.awaitDrain = 0;\n stream.emit('resume');\n flow(stream);\n if (state.flowing && !state.reading) stream.read(0);\n}\n\nReadable.prototype.pause = function () {\n debug('call pause flowing=%j', this._readableState.flowing);\n if (false !== this._readableState.flowing) {\n debug('pause');\n this._readableState.flowing = false;\n this.emit('pause');\n }\n return this;\n};\n\nfunction flow(stream) {\n var state = stream._readableState;\n debug('flow', state.flowing);\n while (state.flowing && stream.read() !== null) {}\n}\n\n// wrap an old-style stream as the async data source.\n// This is *not* part of the readable stream interface.\n// It is an ugly unfortunate mess of history.\nReadable.prototype.wrap = function (stream) {\n var _this = this;\n\n var state = this._readableState;\n var paused = false;\n\n stream.on('end', function () {\n debug('wrapped end');\n if (state.decoder && !state.ended) {\n var chunk = state.decoder.end();\n if (chunk && chunk.length) _this.push(chunk);\n }\n\n _this.push(null);\n });\n\n stream.on('data', function (chunk) {\n debug('wrapped data');\n if (state.decoder) chunk = state.decoder.write(chunk);\n\n // don't skip over falsy values in objectMode\n if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;\n\n var ret = _this.push(chunk);\n if (!ret) {\n paused = true;\n stream.pause();\n }\n });\n\n // proxy all the other methods.\n // important when wrapping filters and duplexes.\n for (var i in stream) {\n if (this[i] === undefined && typeof stream[i] === 'function') {\n this[i] = function (method) {\n return function () {\n return stream[method].apply(stream, arguments);\n };\n }(i);\n }\n }\n\n // proxy certain important events.\n for (var n = 0; n < kProxyEvents.length; n++) {\n stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n]));\n }\n\n // when we try to consume some more bytes, simply unpause the\n // underlying stream.\n this._read = function (n) {\n debug('wrapped _read', n);\n if (paused) {\n paused = false;\n stream.resume();\n }\n };\n\n return this;\n};\n\nObject.defineProperty(Readable.prototype, 'readableHighWaterMark', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function () {\n return this._readableState.highWaterMark;\n }\n});\n\n// exposed for testing purposes only.\nReadable._fromList = fromList;\n\n// Pluck off n bytes from an array of buffers.\n// Length is the combined lengths of all the buffers in the list.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction fromList(n, state) {\n // nothing buffered\n if (state.length === 0) return null;\n\n var ret;\n if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {\n // read it all, truncate the list\n if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length);\n state.buffer.clear();\n } else {\n // read part of list\n ret = fromListPartial(n, state.buffer, state.decoder);\n }\n\n return ret;\n}\n\n// Extracts only enough buffered data to satisfy the amount requested.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction fromListPartial(n, list, hasStrings) {\n var ret;\n if (n < list.head.data.length) {\n // slice is the same for buffers and strings\n ret = list.head.data.slice(0, n);\n list.head.data = list.head.data.slice(n);\n } else if (n === list.head.data.length) {\n // first chunk is a perfect match\n ret = list.shift();\n } else {\n // result spans more than one buffer\n ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list);\n }\n return ret;\n}\n\n// Copies a specified amount of characters from the list of buffered data\n// chunks.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction copyFromBufferString(n, list) {\n var p = list.head;\n var c = 1;\n var ret = p.data;\n n -= ret.length;\n while (p = p.next) {\n var str = p.data;\n var nb = n > str.length ? str.length : n;\n if (nb === str.length) ret += str;else ret += str.slice(0, n);\n n -= nb;\n if (n === 0) {\n if (nb === str.length) {\n ++c;\n if (p.next) list.head = p.next;else list.head = list.tail = null;\n } else {\n list.head = p;\n p.data = str.slice(nb);\n }\n break;\n }\n ++c;\n }\n list.length -= c;\n return ret;\n}\n\n// Copies a specified amount of bytes from the list of buffered data chunks.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction copyFromBuffer(n, list) {\n var ret = Buffer.allocUnsafe(n);\n var p = list.head;\n var c = 1;\n p.data.copy(ret);\n n -= p.data.length;\n while (p = p.next) {\n var buf = p.data;\n var nb = n > buf.length ? buf.length : n;\n buf.copy(ret, ret.length - n, 0, nb);\n n -= nb;\n if (n === 0) {\n if (nb === buf.length) {\n ++c;\n if (p.next) list.head = p.next;else list.head = list.tail = null;\n } else {\n list.head = p;\n p.data = buf.slice(nb);\n }\n break;\n }\n ++c;\n }\n list.length -= c;\n return ret;\n}\n\nfunction endReadable(stream) {\n var state = stream._readableState;\n\n // If we get here before consuming all the bytes, then that is a\n // bug in node. Should never happen.\n if (state.length > 0) throw new Error('\"endReadable()\" called on non-empty stream');\n\n if (!state.endEmitted) {\n state.ended = true;\n pna.nextTick(endReadableNT, state, stream);\n }\n}\n\nfunction endReadableNT(state, stream) {\n // Check that we didn't get one last unshift.\n if (!state.endEmitted && state.length === 0) {\n state.endEmitted = true;\n stream.readable = false;\n stream.emit('end');\n }\n}\n\nfunction indexOf(xs, x) {\n for (var i = 0, l = xs.length; i < l; i++) {\n if (xs[i] === x) return i;\n }\n return -1;\n}","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// a transform stream is a readable/writable stream where you do\n// something with the data. Sometimes it's called a \"filter\",\n// but that's not a great name for it, since that implies a thing where\n// some bits pass through, and others are simply ignored. (That would\n// be a valid example of a transform, of course.)\n//\n// While the output is causally related to the input, it's not a\n// necessarily symmetric or synchronous transformation. For example,\n// a zlib stream might take multiple plain-text writes(), and then\n// emit a single compressed chunk some time in the future.\n//\n// Here's how this works:\n//\n// The Transform stream has all the aspects of the readable and writable\n// stream classes. When you write(chunk), that calls _write(chunk,cb)\n// internally, and returns false if there's a lot of pending writes\n// buffered up. When you call read(), that calls _read(n) until\n// there's enough pending readable data buffered up.\n//\n// In a transform stream, the written data is placed in a buffer. When\n// _read(n) is called, it transforms the queued up data, calling the\n// buffered _write cb's as it consumes chunks. If consuming a single\n// written chunk would result in multiple output chunks, then the first\n// outputted bit calls the readcb, and subsequent chunks just go into\n// the read buffer, and will cause it to emit 'readable' if necessary.\n//\n// This way, back-pressure is actually determined by the reading side,\n// since _read has to be called to start processing a new chunk. However,\n// a pathological inflate type of transform can cause excessive buffering\n// here. For example, imagine a stream where every byte of input is\n// interpreted as an integer from 0-255, and then results in that many\n// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in\n// 1kb of data being output. In this case, you could write a very small\n// amount of input, and end up with a very large amount of output. In\n// such a pathological inflating mechanism, there'd be no way to tell\n// the system to stop doing the transform. A single 4MB write could\n// cause the system to run out of memory.\n//\n// However, even in such a pathological case, only a single written chunk\n// would be consumed, and then the rest would wait (un-transformed) until\n// the results of the previous transformed chunk were consumed.\n\n'use strict';\n\nmodule.exports = Transform;\n\nvar Duplex = require('./_stream_duplex');\n\n/**/\nvar util = Object.create(require('core-util-is'));\nutil.inherits = require('inherits');\n/**/\n\nutil.inherits(Transform, Duplex);\n\nfunction afterTransform(er, data) {\n var ts = this._transformState;\n ts.transforming = false;\n\n var cb = ts.writecb;\n\n if (!cb) {\n return this.emit('error', new Error('write callback called multiple times'));\n }\n\n ts.writechunk = null;\n ts.writecb = null;\n\n if (data != null) // single equals check for both `null` and `undefined`\n this.push(data);\n\n cb(er);\n\n var rs = this._readableState;\n rs.reading = false;\n if (rs.needReadable || rs.length < rs.highWaterMark) {\n this._read(rs.highWaterMark);\n }\n}\n\nfunction Transform(options) {\n if (!(this instanceof Transform)) return new Transform(options);\n\n Duplex.call(this, options);\n\n this._transformState = {\n afterTransform: afterTransform.bind(this),\n needTransform: false,\n transforming: false,\n writecb: null,\n writechunk: null,\n writeencoding: null\n };\n\n // start out asking for a readable event once data is transformed.\n this._readableState.needReadable = true;\n\n // we have implemented the _read method, and done the other things\n // that Readable wants before the first _read call, so unset the\n // sync guard flag.\n this._readableState.sync = false;\n\n if (options) {\n if (typeof options.transform === 'function') this._transform = options.transform;\n\n if (typeof options.flush === 'function') this._flush = options.flush;\n }\n\n // When the writable side finishes, then flush out anything remaining.\n this.on('prefinish', prefinish);\n}\n\nfunction prefinish() {\n var _this = this;\n\n if (typeof this._flush === 'function') {\n this._flush(function (er, data) {\n done(_this, er, data);\n });\n } else {\n done(this, null, null);\n }\n}\n\nTransform.prototype.push = function (chunk, encoding) {\n this._transformState.needTransform = false;\n return Duplex.prototype.push.call(this, chunk, encoding);\n};\n\n// This is the part where you do stuff!\n// override this function in implementation classes.\n// 'chunk' is an input chunk.\n//\n// Call `push(newChunk)` to pass along transformed output\n// to the readable side. You may call 'push' zero or more times.\n//\n// Call `cb(err)` when you are done with this chunk. If you pass\n// an error, then that'll put the hurt on the whole operation. If you\n// never call cb(), then you'll never get another chunk.\nTransform.prototype._transform = function (chunk, encoding, cb) {\n throw new Error('_transform() is not implemented');\n};\n\nTransform.prototype._write = function (chunk, encoding, cb) {\n var ts = this._transformState;\n ts.writecb = cb;\n ts.writechunk = chunk;\n ts.writeencoding = encoding;\n if (!ts.transforming) {\n var rs = this._readableState;\n if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);\n }\n};\n\n// Doesn't matter what the args are here.\n// _transform does all the work.\n// That we got here means that the readable side wants more data.\nTransform.prototype._read = function (n) {\n var ts = this._transformState;\n\n if (ts.writechunk !== null && ts.writecb && !ts.transforming) {\n ts.transforming = true;\n this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);\n } else {\n // mark that we need a transform, so that any data that comes in\n // will get processed, now that we've asked for it.\n ts.needTransform = true;\n }\n};\n\nTransform.prototype._destroy = function (err, cb) {\n var _this2 = this;\n\n Duplex.prototype._destroy.call(this, err, function (err2) {\n cb(err2);\n _this2.emit('close');\n });\n};\n\nfunction done(stream, er, data) {\n if (er) return stream.emit('error', er);\n\n if (data != null) // single equals check for both `null` and `undefined`\n stream.push(data);\n\n // if there's nothing in the write buffer, then that means\n // that nothing more will ever be provided\n if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0');\n\n if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming');\n\n return stream.push(null);\n}","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// A bit simpler than readable streams.\n// Implement an async ._write(chunk, encoding, cb), and it'll handle all\n// the drain event emission and buffering.\n\n'use strict';\n\n/**/\n\nvar pna = require('process-nextick-args');\n/**/\n\nmodule.exports = Writable;\n\n/* */\nfunction WriteReq(chunk, encoding, cb) {\n this.chunk = chunk;\n this.encoding = encoding;\n this.callback = cb;\n this.next = null;\n}\n\n// It seems a linked list but it is not\n// there will be only 2 of these for each stream\nfunction CorkedRequest(state) {\n var _this = this;\n\n this.next = null;\n this.entry = null;\n this.finish = function () {\n onCorkedFinish(_this, state);\n };\n}\n/* */\n\n/**/\nvar asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick;\n/**/\n\n/**/\nvar Duplex;\n/**/\n\nWritable.WritableState = WritableState;\n\n/**/\nvar util = Object.create(require('core-util-is'));\nutil.inherits = require('inherits');\n/**/\n\n/**/\nvar internalUtil = {\n deprecate: require('util-deprecate')\n};\n/**/\n\n/**/\nvar Stream = require('./internal/streams/stream');\n/**/\n\n/**/\n\nvar Buffer = require('safe-buffer').Buffer;\nvar OurUint8Array = global.Uint8Array || function () {};\nfunction _uint8ArrayToBuffer(chunk) {\n return Buffer.from(chunk);\n}\nfunction _isUint8Array(obj) {\n return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;\n}\n\n/**/\n\nvar destroyImpl = require('./internal/streams/destroy');\n\nutil.inherits(Writable, Stream);\n\nfunction nop() {}\n\nfunction WritableState(options, stream) {\n Duplex = Duplex || require('./_stream_duplex');\n\n options = options || {};\n\n // Duplex streams are both readable and writable, but share\n // the same options object.\n // However, some cases require setting options to different\n // values for the readable and the writable sides of the duplex stream.\n // These options can be provided separately as readableXXX and writableXXX.\n var isDuplex = stream instanceof Duplex;\n\n // object stream flag to indicate whether or not this stream\n // contains buffers or objects.\n this.objectMode = !!options.objectMode;\n\n if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode;\n\n // the point at which write() starts returning false\n // Note: 0 is a valid value, means that we always return false if\n // the entire buffer is not flushed immediately on write()\n var hwm = options.highWaterMark;\n var writableHwm = options.writableHighWaterMark;\n var defaultHwm = this.objectMode ? 16 : 16 * 1024;\n\n if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm;\n\n // cast to ints.\n this.highWaterMark = Math.floor(this.highWaterMark);\n\n // if _final has been called\n this.finalCalled = false;\n\n // drain event flag.\n this.needDrain = false;\n // at the start of calling end()\n this.ending = false;\n // when end() has been called, and returned\n this.ended = false;\n // when 'finish' is emitted\n this.finished = false;\n\n // has it been destroyed\n this.destroyed = false;\n\n // should we decode strings into buffers before passing to _write?\n // this is here so that some node-core streams can optimize string\n // handling at a lower level.\n var noDecode = options.decodeStrings === false;\n this.decodeStrings = !noDecode;\n\n // Crypto is kind of old and crusty. Historically, its default string\n // encoding is 'binary' so we have to make this configurable.\n // Everything else in the universe uses 'utf8', though.\n this.defaultEncoding = options.defaultEncoding || 'utf8';\n\n // not an actual buffer we keep track of, but a measurement\n // of how much we're waiting to get pushed to some underlying\n // socket or file.\n this.length = 0;\n\n // a flag to see when we're in the middle of a write.\n this.writing = false;\n\n // when true all writes will be buffered until .uncork() call\n this.corked = 0;\n\n // a flag to be able to tell if the onwrite cb is called immediately,\n // or on a later tick. We set this to true at first, because any\n // actions that shouldn't happen until \"later\" should generally also\n // not happen before the first write call.\n this.sync = true;\n\n // a flag to know if we're processing previously buffered items, which\n // may call the _write() callback in the same tick, so that we don't\n // end up in an overlapped onwrite situation.\n this.bufferProcessing = false;\n\n // the callback that's passed to _write(chunk,cb)\n this.onwrite = function (er) {\n onwrite(stream, er);\n };\n\n // the callback that the user supplies to write(chunk,encoding,cb)\n this.writecb = null;\n\n // the amount that is being written when _write is called.\n this.writelen = 0;\n\n this.bufferedRequest = null;\n this.lastBufferedRequest = null;\n\n // number of pending user-supplied write callbacks\n // this must be 0 before 'finish' can be emitted\n this.pendingcb = 0;\n\n // emit prefinish if the only thing we're waiting for is _write cbs\n // This is relevant for synchronous Transform streams\n this.prefinished = false;\n\n // True if the error was already emitted and should not be thrown again\n this.errorEmitted = false;\n\n // count buffered requests\n this.bufferedRequestCount = 0;\n\n // allocate the first CorkedRequest, there is always\n // one allocated and free to use, and we maintain at most two\n this.corkedRequestsFree = new CorkedRequest(this);\n}\n\nWritableState.prototype.getBuffer = function getBuffer() {\n var current = this.bufferedRequest;\n var out = [];\n while (current) {\n out.push(current);\n current = current.next;\n }\n return out;\n};\n\n(function () {\n try {\n Object.defineProperty(WritableState.prototype, 'buffer', {\n get: internalUtil.deprecate(function () {\n return this.getBuffer();\n }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003')\n });\n } catch (_) {}\n})();\n\n// Test _writableState for inheritance to account for Duplex streams,\n// whose prototype chain only points to Readable.\nvar realHasInstance;\nif (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') {\n realHasInstance = Function.prototype[Symbol.hasInstance];\n Object.defineProperty(Writable, Symbol.hasInstance, {\n value: function (object) {\n if (realHasInstance.call(this, object)) return true;\n if (this !== Writable) return false;\n\n return object && object._writableState instanceof WritableState;\n }\n });\n} else {\n realHasInstance = function (object) {\n return object instanceof this;\n };\n}\n\nfunction Writable(options) {\n Duplex = Duplex || require('./_stream_duplex');\n\n // Writable ctor is applied to Duplexes, too.\n // `realHasInstance` is necessary because using plain `instanceof`\n // would return false, as no `_writableState` property is attached.\n\n // Trying to use the custom `instanceof` for Writable here will also break the\n // Node.js LazyTransform implementation, which has a non-trivial getter for\n // `_writableState` that would lead to infinite recursion.\n if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) {\n return new Writable(options);\n }\n\n this._writableState = new WritableState(options, this);\n\n // legacy.\n this.writable = true;\n\n if (options) {\n if (typeof options.write === 'function') this._write = options.write;\n\n if (typeof options.writev === 'function') this._writev = options.writev;\n\n if (typeof options.destroy === 'function') this._destroy = options.destroy;\n\n if (typeof options.final === 'function') this._final = options.final;\n }\n\n Stream.call(this);\n}\n\n// Otherwise people can pipe Writable streams, which is just wrong.\nWritable.prototype.pipe = function () {\n this.emit('error', new Error('Cannot pipe, not readable'));\n};\n\nfunction writeAfterEnd(stream, cb) {\n var er = new Error('write after end');\n // TODO: defer error events consistently everywhere, not just the cb\n stream.emit('error', er);\n pna.nextTick(cb, er);\n}\n\n// Checks that a user-supplied chunk is valid, especially for the particular\n// mode the stream is in. Currently this means that `null` is never accepted\n// and undefined/non-string values are only allowed in object mode.\nfunction validChunk(stream, state, chunk, cb) {\n var valid = true;\n var er = false;\n\n if (chunk === null) {\n er = new TypeError('May not write null values to stream');\n } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {\n er = new TypeError('Invalid non-string/buffer chunk');\n }\n if (er) {\n stream.emit('error', er);\n pna.nextTick(cb, er);\n valid = false;\n }\n return valid;\n}\n\nWritable.prototype.write = function (chunk, encoding, cb) {\n var state = this._writableState;\n var ret = false;\n var isBuf = !state.objectMode && _isUint8Array(chunk);\n\n if (isBuf && !Buffer.isBuffer(chunk)) {\n chunk = _uint8ArrayToBuffer(chunk);\n }\n\n if (typeof encoding === 'function') {\n cb = encoding;\n encoding = null;\n }\n\n if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;\n\n if (typeof cb !== 'function') cb = nop;\n\n if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) {\n state.pendingcb++;\n ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb);\n }\n\n return ret;\n};\n\nWritable.prototype.cork = function () {\n var state = this._writableState;\n\n state.corked++;\n};\n\nWritable.prototype.uncork = function () {\n var state = this._writableState;\n\n if (state.corked) {\n state.corked--;\n\n if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);\n }\n};\n\nWritable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {\n // node::ParseEncoding() requires lower case.\n if (typeof encoding === 'string') encoding = encoding.toLowerCase();\n if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding);\n this._writableState.defaultEncoding = encoding;\n return this;\n};\n\nfunction decodeChunk(state, chunk, encoding) {\n if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {\n chunk = Buffer.from(chunk, encoding);\n }\n return chunk;\n}\n\nObject.defineProperty(Writable.prototype, 'writableHighWaterMark', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function () {\n return this._writableState.highWaterMark;\n }\n});\n\n// if we're already writing something, then just put this\n// in the queue, and wait our turn. Otherwise, call _write\n// If we return false, then we need a drain event, so set that flag.\nfunction writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) {\n if (!isBuf) {\n var newChunk = decodeChunk(state, chunk, encoding);\n if (chunk !== newChunk) {\n isBuf = true;\n encoding = 'buffer';\n chunk = newChunk;\n }\n }\n var len = state.objectMode ? 1 : chunk.length;\n\n state.length += len;\n\n var ret = state.length < state.highWaterMark;\n // we must ensure that previous needDrain will not be reset to false.\n if (!ret) state.needDrain = true;\n\n if (state.writing || state.corked) {\n var last = state.lastBufferedRequest;\n state.lastBufferedRequest = {\n chunk: chunk,\n encoding: encoding,\n isBuf: isBuf,\n callback: cb,\n next: null\n };\n if (last) {\n last.next = state.lastBufferedRequest;\n } else {\n state.bufferedRequest = state.lastBufferedRequest;\n }\n state.bufferedRequestCount += 1;\n } else {\n doWrite(stream, state, false, len, chunk, encoding, cb);\n }\n\n return ret;\n}\n\nfunction doWrite(stream, state, writev, len, chunk, encoding, cb) {\n state.writelen = len;\n state.writecb = cb;\n state.writing = true;\n state.sync = true;\n if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);\n state.sync = false;\n}\n\nfunction onwriteError(stream, state, sync, er, cb) {\n --state.pendingcb;\n\n if (sync) {\n // defer the callback if we are being called synchronously\n // to avoid piling up things on the stack\n pna.nextTick(cb, er);\n // this can emit finish, and it will always happen\n // after error\n pna.nextTick(finishMaybe, stream, state);\n stream._writableState.errorEmitted = true;\n stream.emit('error', er);\n } else {\n // the caller expect this to happen before if\n // it is async\n cb(er);\n stream._writableState.errorEmitted = true;\n stream.emit('error', er);\n // this can emit finish, but finish must\n // always follow error\n finishMaybe(stream, state);\n }\n}\n\nfunction onwriteStateUpdate(state) {\n state.writing = false;\n state.writecb = null;\n state.length -= state.writelen;\n state.writelen = 0;\n}\n\nfunction onwrite(stream, er) {\n var state = stream._writableState;\n var sync = state.sync;\n var cb = state.writecb;\n\n onwriteStateUpdate(state);\n\n if (er) onwriteError(stream, state, sync, er, cb);else {\n // Check if we're actually ready to finish, but don't emit yet\n var finished = needFinish(state);\n\n if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {\n clearBuffer(stream, state);\n }\n\n if (sync) {\n /**/\n asyncWrite(afterWrite, stream, state, finished, cb);\n /**/\n } else {\n afterWrite(stream, state, finished, cb);\n }\n }\n}\n\nfunction afterWrite(stream, state, finished, cb) {\n if (!finished) onwriteDrain(stream, state);\n state.pendingcb--;\n cb();\n finishMaybe(stream, state);\n}\n\n// Must force callback to be called on nextTick, so that we don't\n// emit 'drain' before the write() consumer gets the 'false' return\n// value, and has a chance to attach a 'drain' listener.\nfunction onwriteDrain(stream, state) {\n if (state.length === 0 && state.needDrain) {\n state.needDrain = false;\n stream.emit('drain');\n }\n}\n\n// if there's something in the buffer waiting, then process it\nfunction clearBuffer(stream, state) {\n state.bufferProcessing = true;\n var entry = state.bufferedRequest;\n\n if (stream._writev && entry && entry.next) {\n // Fast case, write everything using _writev()\n var l = state.bufferedRequestCount;\n var buffer = new Array(l);\n var holder = state.corkedRequestsFree;\n holder.entry = entry;\n\n var count = 0;\n var allBuffers = true;\n while (entry) {\n buffer[count] = entry;\n if (!entry.isBuf) allBuffers = false;\n entry = entry.next;\n count += 1;\n }\n buffer.allBuffers = allBuffers;\n\n doWrite(stream, state, true, state.length, buffer, '', holder.finish);\n\n // doWrite is almost always async, defer these to save a bit of time\n // as the hot path ends with doWrite\n state.pendingcb++;\n state.lastBufferedRequest = null;\n if (holder.next) {\n state.corkedRequestsFree = holder.next;\n holder.next = null;\n } else {\n state.corkedRequestsFree = new CorkedRequest(state);\n }\n state.bufferedRequestCount = 0;\n } else {\n // Slow case, write chunks one-by-one\n while (entry) {\n var chunk = entry.chunk;\n var encoding = entry.encoding;\n var cb = entry.callback;\n var len = state.objectMode ? 1 : chunk.length;\n\n doWrite(stream, state, false, len, chunk, encoding, cb);\n entry = entry.next;\n state.bufferedRequestCount--;\n // if we didn't call the onwrite immediately, then\n // it means that we need to wait until it does.\n // also, that means that the chunk and cb are currently\n // being processed, so move the buffer counter past them.\n if (state.writing) {\n break;\n }\n }\n\n if (entry === null) state.lastBufferedRequest = null;\n }\n\n state.bufferedRequest = entry;\n state.bufferProcessing = false;\n}\n\nWritable.prototype._write = function (chunk, encoding, cb) {\n cb(new Error('_write() is not implemented'));\n};\n\nWritable.prototype._writev = null;\n\nWritable.prototype.end = function (chunk, encoding, cb) {\n var state = this._writableState;\n\n if (typeof chunk === 'function') {\n cb = chunk;\n chunk = null;\n encoding = null;\n } else if (typeof encoding === 'function') {\n cb = encoding;\n encoding = null;\n }\n\n if (chunk !== null && chunk !== undefined) this.write(chunk, encoding);\n\n // .end() fully uncorks\n if (state.corked) {\n state.corked = 1;\n this.uncork();\n }\n\n // ignore unnecessary end() calls.\n if (!state.ending && !state.finished) endWritable(this, state, cb);\n};\n\nfunction needFinish(state) {\n return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;\n}\nfunction callFinal(stream, state) {\n stream._final(function (err) {\n state.pendingcb--;\n if (err) {\n stream.emit('error', err);\n }\n state.prefinished = true;\n stream.emit('prefinish');\n finishMaybe(stream, state);\n });\n}\nfunction prefinish(stream, state) {\n if (!state.prefinished && !state.finalCalled) {\n if (typeof stream._final === 'function') {\n state.pendingcb++;\n state.finalCalled = true;\n pna.nextTick(callFinal, stream, state);\n } else {\n state.prefinished = true;\n stream.emit('prefinish');\n }\n }\n}\n\nfunction finishMaybe(stream, state) {\n var need = needFinish(state);\n if (need) {\n prefinish(stream, state);\n if (state.pendingcb === 0) {\n state.finished = true;\n stream.emit('finish');\n }\n }\n return need;\n}\n\nfunction endWritable(stream, state, cb) {\n state.ending = true;\n finishMaybe(stream, state);\n if (cb) {\n if (state.finished) pna.nextTick(cb);else stream.once('finish', cb);\n }\n state.ended = true;\n stream.writable = false;\n}\n\nfunction onCorkedFinish(corkReq, state, err) {\n var entry = corkReq.entry;\n corkReq.entry = null;\n while (entry) {\n var cb = entry.callback;\n state.pendingcb--;\n cb(err);\n entry = entry.next;\n }\n if (state.corkedRequestsFree) {\n state.corkedRequestsFree.next = corkReq;\n } else {\n state.corkedRequestsFree = corkReq;\n }\n}\n\nObject.defineProperty(Writable.prototype, 'destroyed', {\n get: function () {\n if (this._writableState === undefined) {\n return false;\n }\n return this._writableState.destroyed;\n },\n set: function (value) {\n // we ignore the value if the stream\n // has not been initialized yet\n if (!this._writableState) {\n return;\n }\n\n // backward compatibility, the user is explicitly\n // managing destroyed\n this._writableState.destroyed = value;\n }\n});\n\nWritable.prototype.destroy = destroyImpl.destroy;\nWritable.prototype._undestroy = destroyImpl.undestroy;\nWritable.prototype._destroy = function (err, cb) {\n this.end();\n cb(err);\n};","'use strict';\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Buffer = require('safe-buffer').Buffer;\nvar util = require('util');\n\nfunction copyBuffer(src, target, offset) {\n src.copy(target, offset);\n}\n\nmodule.exports = function () {\n function BufferList() {\n _classCallCheck(this, BufferList);\n\n this.head = null;\n this.tail = null;\n this.length = 0;\n }\n\n BufferList.prototype.push = function push(v) {\n var entry = { data: v, next: null };\n if (this.length > 0) this.tail.next = entry;else this.head = entry;\n this.tail = entry;\n ++this.length;\n };\n\n BufferList.prototype.unshift = function unshift(v) {\n var entry = { data: v, next: this.head };\n if (this.length === 0) this.tail = entry;\n this.head = entry;\n ++this.length;\n };\n\n BufferList.prototype.shift = function shift() {\n if (this.length === 0) return;\n var ret = this.head.data;\n if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;\n --this.length;\n return ret;\n };\n\n BufferList.prototype.clear = function clear() {\n this.head = this.tail = null;\n this.length = 0;\n };\n\n BufferList.prototype.join = function join(s) {\n if (this.length === 0) return '';\n var p = this.head;\n var ret = '' + p.data;\n while (p = p.next) {\n ret += s + p.data;\n }return ret;\n };\n\n BufferList.prototype.concat = function concat(n) {\n if (this.length === 0) return Buffer.alloc(0);\n if (this.length === 1) return this.head.data;\n var ret = Buffer.allocUnsafe(n >>> 0);\n var p = this.head;\n var i = 0;\n while (p) {\n copyBuffer(p.data, ret, i);\n i += p.data.length;\n p = p.next;\n }\n return ret;\n };\n\n return BufferList;\n}();\n\nif (util && util.inspect && util.inspect.custom) {\n module.exports.prototype[util.inspect.custom] = function () {\n var obj = util.inspect({ length: this.length });\n return this.constructor.name + ' ' + obj;\n };\n}","'use strict';\n\n/**/\n\nvar pna = require('process-nextick-args');\n/**/\n\n// undocumented cb() API, needed for core, not for public API\nfunction destroy(err, cb) {\n var _this = this;\n\n var readableDestroyed = this._readableState && this._readableState.destroyed;\n var writableDestroyed = this._writableState && this._writableState.destroyed;\n\n if (readableDestroyed || writableDestroyed) {\n if (cb) {\n cb(err);\n } else if (err && (!this._writableState || !this._writableState.errorEmitted)) {\n pna.nextTick(emitErrorNT, this, err);\n }\n return this;\n }\n\n // we set destroyed to true before firing error callbacks in order\n // to make it re-entrance safe in case destroy() is called within callbacks\n\n if (this._readableState) {\n this._readableState.destroyed = true;\n }\n\n // if this is a duplex stream mark the writable part as destroyed as well\n if (this._writableState) {\n this._writableState.destroyed = true;\n }\n\n this._destroy(err || null, function (err) {\n if (!cb && err) {\n pna.nextTick(emitErrorNT, _this, err);\n if (_this._writableState) {\n _this._writableState.errorEmitted = true;\n }\n } else if (cb) {\n cb(err);\n }\n });\n\n return this;\n}\n\nfunction undestroy() {\n if (this._readableState) {\n this._readableState.destroyed = false;\n this._readableState.reading = false;\n this._readableState.ended = false;\n this._readableState.endEmitted = false;\n }\n\n if (this._writableState) {\n this._writableState.destroyed = false;\n this._writableState.ended = false;\n this._writableState.ending = false;\n this._writableState.finished = false;\n this._writableState.errorEmitted = false;\n }\n}\n\nfunction emitErrorNT(self, err) {\n self.emit('error', err);\n}\n\nmodule.exports = {\n destroy: destroy,\n undestroy: undestroy\n};","module.exports = require('events').EventEmitter;\n","module.exports = require('./readable').PassThrough\n","exports = module.exports = require('./lib/_stream_readable.js');\nexports.Stream = exports;\nexports.Readable = exports;\nexports.Writable = require('./lib/_stream_writable.js');\nexports.Duplex = require('./lib/_stream_duplex.js');\nexports.Transform = require('./lib/_stream_transform.js');\nexports.PassThrough = require('./lib/_stream_passthrough.js');\n","module.exports = require('./readable').Transform\n","module.exports = require('./lib/_stream_writable.js');\n","/* eslint-disable node/no-deprecated-api */\nvar buffer = require('buffer')\nvar Buffer = buffer.Buffer\n\n// alternative to using Object.keys for old browsers\nfunction copyProps (src, dst) {\n for (var key in src) {\n dst[key] = src[key]\n }\n}\nif (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {\n module.exports = buffer\n} else {\n // Copy properties from require('buffer')\n copyProps(buffer, exports)\n exports.Buffer = SafeBuffer\n}\n\nfunction SafeBuffer (arg, encodingOrOffset, length) {\n return Buffer(arg, encodingOrOffset, length)\n}\n\n// Copy static methods from Buffer\ncopyProps(Buffer, SafeBuffer)\n\nSafeBuffer.from = function (arg, encodingOrOffset, length) {\n if (typeof arg === 'number') {\n throw new TypeError('Argument must not be a number')\n }\n return Buffer(arg, encodingOrOffset, length)\n}\n\nSafeBuffer.alloc = function (size, fill, encoding) {\n if (typeof size !== 'number') {\n throw new TypeError('Argument must be a number')\n }\n var buf = Buffer(size)\n if (fill !== undefined) {\n if (typeof encoding === 'string') {\n buf.fill(fill, encoding)\n } else {\n buf.fill(fill)\n }\n } else {\n buf.fill(0)\n }\n return buf\n}\n\nSafeBuffer.allocUnsafe = function (size) {\n if (typeof size !== 'number') {\n throw new TypeError('Argument must be a number')\n }\n return Buffer(size)\n}\n\nSafeBuffer.allocUnsafeSlow = function (size) {\n if (typeof size !== 'number') {\n throw new TypeError('Argument must be a number')\n }\n return buffer.SlowBuffer(size)\n}\n","/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS202: Simplify dynamic range loops\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nexports.make = function (x) {\n if (x == null) {\n x = [];\n }\n if (!(x instanceof Array)) {\n x = [+x != null ? +x : 0];\n }\n return x;\n};\n\nexports.nest = (a, b) => a.concat(b);\n\nexports.compare = function (a, b) {\n const n = Math.min(a.length, b.length);\n for (\n let i = 0, end = n, asc = 0 <= end;\n asc ? i < end : i > end;\n asc ? i++ : i--\n ) {\n const p = a[i];\n const q = b[i];\n if (p > q) {\n return -1;\n }\n if (p < q) {\n return 1;\n }\n }\n a = a.length;\n b = b.length;\n if (a > b) {\n return -1;\n } else if (a < b) {\n return 1;\n } else {\n return 0;\n }\n};\n\nexports.max = function (a, b) {\n if (exports.compare(a, b) > 0) {\n return b;\n } else {\n return a;\n }\n};\n","// stats.js - http://github.com/mrdoob/stats.js\n(function(f,e){\"object\"===typeof exports&&\"undefined\"!==typeof module?module.exports=e():\"function\"===typeof define&&define.amd?define(e):f.Stats=e()})(this,function(){var f=function(){function e(a){c.appendChild(a.dom);return a}function u(a){for(var d=0;dg+1E3&&(r.update(1E3*a/(c-g),100),g=c,a=0,t)){var d=performance.memory;t.update(d.usedJSHeapSize/\n1048576,d.jsHeapSizeLimit/1048576)}return c},update:function(){k=this.end()},domElement:c,setMode:u}};f.Panel=function(e,f,l){var c=Infinity,k=0,g=Math.round,a=g(window.devicePixelRatio||1),r=80*a,h=48*a,t=3*a,v=2*a,d=3*a,m=15*a,n=74*a,p=30*a,q=document.createElement(\"canvas\");q.width=r;q.height=h;q.style.cssText=\"width:80px;height:48px\";var b=q.getContext(\"2d\");b.font=\"bold \"+9*a+\"px Helvetica,Arial,sans-serif\";b.textBaseline=\"top\";b.fillStyle=l;b.fillRect(0,0,r,h);b.fillStyle=f;b.fillText(e,t,v);\nb.fillRect(d,m,n,p);b.fillStyle=l;b.globalAlpha=.9;b.fillRect(d,m,n,p);return{dom:q,update:function(h,w){c=Math.min(c,h);k=Math.max(k,h);b.fillStyle=l;b.globalAlpha=1;b.fillRect(0,0,r,m);b.fillStyle=f;b.fillText(g(h)+\" \"+e+\" (\"+g(c)+\"-\"+g(k)+\")\",t,v);b.drawImage(q,d+a,m,n-a,p,d,m,n-a,p);b.fillRect(d+n-a,m,a,p);b.fillStyle=l;b.globalAlpha=.9;b.fillRect(d+n-a,m,a,g((1-h/w)*p))}}};return f});\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nmodule.exports = Stream;\n\nvar EE = require('events').EventEmitter;\nvar inherits = require('inherits');\n\ninherits(Stream, EE);\nStream.Readable = require('readable-stream/readable.js');\nStream.Writable = require('readable-stream/writable.js');\nStream.Duplex = require('readable-stream/duplex.js');\nStream.Transform = require('readable-stream/transform.js');\nStream.PassThrough = require('readable-stream/passthrough.js');\n\n// Backwards-compat with node 0.4.x\nStream.Stream = Stream;\n\n\n\n// old-style streams. Note that the pipe method (the only relevant\n// part of this class) is overridden in the Readable class.\n\nfunction Stream() {\n EE.call(this);\n}\n\nStream.prototype.pipe = function(dest, options) {\n var source = this;\n\n function ondata(chunk) {\n if (dest.writable) {\n if (false === dest.write(chunk) && source.pause) {\n source.pause();\n }\n }\n }\n\n source.on('data', ondata);\n\n function ondrain() {\n if (source.readable && source.resume) {\n source.resume();\n }\n }\n\n dest.on('drain', ondrain);\n\n // If the 'end' option is not supplied, dest.end() will be called when\n // source gets the 'end' or 'close' events. Only dest.end() once.\n if (!dest._isStdio && (!options || options.end !== false)) {\n source.on('end', onend);\n source.on('close', onclose);\n }\n\n var didOnEnd = false;\n function onend() {\n if (didOnEnd) return;\n didOnEnd = true;\n\n dest.end();\n }\n\n\n function onclose() {\n if (didOnEnd) return;\n didOnEnd = true;\n\n if (typeof dest.destroy === 'function') dest.destroy();\n }\n\n // don't leave dangling pipes when there are errors.\n function onerror(er) {\n cleanup();\n if (EE.listenerCount(this, 'error') === 0) {\n throw er; // Unhandled stream error in pipe.\n }\n }\n\n source.on('error', onerror);\n dest.on('error', onerror);\n\n // remove all the event listeners that were added.\n function cleanup() {\n source.removeListener('data', ondata);\n dest.removeListener('drain', ondrain);\n\n source.removeListener('end', onend);\n source.removeListener('close', onclose);\n\n source.removeListener('error', onerror);\n dest.removeListener('error', onerror);\n\n source.removeListener('end', cleanup);\n source.removeListener('close', cleanup);\n\n dest.removeListener('close', cleanup);\n }\n\n source.on('end', cleanup);\n source.on('close', cleanup);\n\n dest.on('close', cleanup);\n\n dest.emit('pipe', source);\n\n // Allow for unix-like usage: A.pipe(B).pipe(C)\n return dest;\n};\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\n/**/\n\nvar Buffer = require('safe-buffer').Buffer;\n/**/\n\nvar isEncoding = Buffer.isEncoding || function (encoding) {\n encoding = '' + encoding;\n switch (encoding && encoding.toLowerCase()) {\n case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw':\n return true;\n default:\n return false;\n }\n};\n\nfunction _normalizeEncoding(enc) {\n if (!enc) return 'utf8';\n var retried;\n while (true) {\n switch (enc) {\n case 'utf8':\n case 'utf-8':\n return 'utf8';\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return 'utf16le';\n case 'latin1':\n case 'binary':\n return 'latin1';\n case 'base64':\n case 'ascii':\n case 'hex':\n return enc;\n default:\n if (retried) return; // undefined\n enc = ('' + enc).toLowerCase();\n retried = true;\n }\n }\n};\n\n// Do not cache `Buffer.isEncoding` when checking encoding names as some\n// modules monkey-patch it to support additional encodings\nfunction normalizeEncoding(enc) {\n var nenc = _normalizeEncoding(enc);\n if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc);\n return nenc || enc;\n}\n\n// StringDecoder provides an interface for efficiently splitting a series of\n// buffers into a series of JS strings without breaking apart multi-byte\n// characters.\nexports.StringDecoder = StringDecoder;\nfunction StringDecoder(encoding) {\n this.encoding = normalizeEncoding(encoding);\n var nb;\n switch (this.encoding) {\n case 'utf16le':\n this.text = utf16Text;\n this.end = utf16End;\n nb = 4;\n break;\n case 'utf8':\n this.fillLast = utf8FillLast;\n nb = 4;\n break;\n case 'base64':\n this.text = base64Text;\n this.end = base64End;\n nb = 3;\n break;\n default:\n this.write = simpleWrite;\n this.end = simpleEnd;\n return;\n }\n this.lastNeed = 0;\n this.lastTotal = 0;\n this.lastChar = Buffer.allocUnsafe(nb);\n}\n\nStringDecoder.prototype.write = function (buf) {\n if (buf.length === 0) return '';\n var r;\n var i;\n if (this.lastNeed) {\n r = this.fillLast(buf);\n if (r === undefined) return '';\n i = this.lastNeed;\n this.lastNeed = 0;\n } else {\n i = 0;\n }\n if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i);\n return r || '';\n};\n\nStringDecoder.prototype.end = utf8End;\n\n// Returns only complete characters in a Buffer\nStringDecoder.prototype.text = utf8Text;\n\n// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer\nStringDecoder.prototype.fillLast = function (buf) {\n if (this.lastNeed <= buf.length) {\n buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed);\n return this.lastChar.toString(this.encoding, 0, this.lastTotal);\n }\n buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length);\n this.lastNeed -= buf.length;\n};\n\n// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a\n// continuation byte. If an invalid byte is detected, -2 is returned.\nfunction utf8CheckByte(byte) {\n if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4;\n return byte >> 6 === 0x02 ? -1 : -2;\n}\n\n// Checks at most 3 bytes at the end of a Buffer in order to detect an\n// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4)\n// needed to complete the UTF-8 character (if applicable) are returned.\nfunction utf8CheckIncomplete(self, buf, i) {\n var j = buf.length - 1;\n if (j < i) return 0;\n var nb = utf8CheckByte(buf[j]);\n if (nb >= 0) {\n if (nb > 0) self.lastNeed = nb - 1;\n return nb;\n }\n if (--j < i || nb === -2) return 0;\n nb = utf8CheckByte(buf[j]);\n if (nb >= 0) {\n if (nb > 0) self.lastNeed = nb - 2;\n return nb;\n }\n if (--j < i || nb === -2) return 0;\n nb = utf8CheckByte(buf[j]);\n if (nb >= 0) {\n if (nb > 0) {\n if (nb === 2) nb = 0;else self.lastNeed = nb - 3;\n }\n return nb;\n }\n return 0;\n}\n\n// Validates as many continuation bytes for a multi-byte UTF-8 character as\n// needed or are available. If we see a non-continuation byte where we expect\n// one, we \"replace\" the validated continuation bytes we've seen so far with\n// a single UTF-8 replacement character ('\\ufffd'), to match v8's UTF-8 decoding\n// behavior. The continuation byte check is included three times in the case\n// where all of the continuation bytes for a character exist in the same buffer.\n// It is also done this way as a slight performance increase instead of using a\n// loop.\nfunction utf8CheckExtraBytes(self, buf, p) {\n if ((buf[0] & 0xC0) !== 0x80) {\n self.lastNeed = 0;\n return '\\ufffd';\n }\n if (self.lastNeed > 1 && buf.length > 1) {\n if ((buf[1] & 0xC0) !== 0x80) {\n self.lastNeed = 1;\n return '\\ufffd';\n }\n if (self.lastNeed > 2 && buf.length > 2) {\n if ((buf[2] & 0xC0) !== 0x80) {\n self.lastNeed = 2;\n return '\\ufffd';\n }\n }\n }\n}\n\n// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer.\nfunction utf8FillLast(buf) {\n var p = this.lastTotal - this.lastNeed;\n var r = utf8CheckExtraBytes(this, buf, p);\n if (r !== undefined) return r;\n if (this.lastNeed <= buf.length) {\n buf.copy(this.lastChar, p, 0, this.lastNeed);\n return this.lastChar.toString(this.encoding, 0, this.lastTotal);\n }\n buf.copy(this.lastChar, p, 0, buf.length);\n this.lastNeed -= buf.length;\n}\n\n// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a\n// partial character, the character's bytes are buffered until the required\n// number of bytes are available.\nfunction utf8Text(buf, i) {\n var total = utf8CheckIncomplete(this, buf, i);\n if (!this.lastNeed) return buf.toString('utf8', i);\n this.lastTotal = total;\n var end = buf.length - (total - this.lastNeed);\n buf.copy(this.lastChar, 0, end);\n return buf.toString('utf8', i, end);\n}\n\n// For UTF-8, a replacement character is added when ending on a partial\n// character.\nfunction utf8End(buf) {\n var r = buf && buf.length ? this.write(buf) : '';\n if (this.lastNeed) return r + '\\ufffd';\n return r;\n}\n\n// UTF-16LE typically needs two bytes per character, but even if we have an even\n// number of bytes available, we need to check if we end on a leading/high\n// surrogate. In that case, we need to wait for the next two bytes in order to\n// decode the last character properly.\nfunction utf16Text(buf, i) {\n if ((buf.length - i) % 2 === 0) {\n var r = buf.toString('utf16le', i);\n if (r) {\n var c = r.charCodeAt(r.length - 1);\n if (c >= 0xD800 && c <= 0xDBFF) {\n this.lastNeed = 2;\n this.lastTotal = 4;\n this.lastChar[0] = buf[buf.length - 2];\n this.lastChar[1] = buf[buf.length - 1];\n return r.slice(0, -1);\n }\n }\n return r;\n }\n this.lastNeed = 1;\n this.lastTotal = 2;\n this.lastChar[0] = buf[buf.length - 1];\n return buf.toString('utf16le', i, buf.length - 1);\n}\n\n// For UTF-16LE we do not explicitly append special replacement characters if we\n// end on a partial character, we simply let v8 handle that.\nfunction utf16End(buf) {\n var r = buf && buf.length ? this.write(buf) : '';\n if (this.lastNeed) {\n var end = this.lastTotal - this.lastNeed;\n return r + this.lastChar.toString('utf16le', 0, end);\n }\n return r;\n}\n\nfunction base64Text(buf, i) {\n var n = (buf.length - i) % 3;\n if (n === 0) return buf.toString('base64', i);\n this.lastNeed = 3 - n;\n this.lastTotal = 3;\n if (n === 1) {\n this.lastChar[0] = buf[buf.length - 1];\n } else {\n this.lastChar[0] = buf[buf.length - 2];\n this.lastChar[1] = buf[buf.length - 1];\n }\n return buf.toString('base64', i, buf.length - n);\n}\n\nfunction base64End(buf) {\n var r = buf && buf.length ? this.write(buf) : '';\n if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed);\n return r;\n}\n\n// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex)\nfunction simpleWrite(buf) {\n return buf.toString(this.encoding);\n}\n\nfunction simpleEnd(buf) {\n return buf && buf.length ? this.write(buf) : '';\n}","var Stream = require('stream')\n\n// through\n//\n// a stream that does nothing but re-emit the input.\n// useful for aggregating a series of changing but not ending streams into one stream)\n\nexports = module.exports = through\nthrough.through = through\n\n//create a readable writable stream.\n\nfunction through (write, end, opts) {\n write = write || function (data) { this.queue(data) }\n end = end || function () { this.queue(null) }\n\n var ended = false, destroyed = false, buffer = [], _ended = false\n var stream = new Stream()\n stream.readable = stream.writable = true\n stream.paused = false\n\n// stream.autoPause = !(opts && opts.autoPause === false)\n stream.autoDestroy = !(opts && opts.autoDestroy === false)\n\n stream.write = function (data) {\n write.call(this, data)\n return !stream.paused\n }\n\n function drain() {\n while(buffer.length && !stream.paused) {\n var data = buffer.shift()\n if(null === data)\n return stream.emit('end')\n else\n stream.emit('data', data)\n }\n }\n\n stream.queue = stream.push = function (data) {\n// console.error(ended)\n if(_ended) return stream\n if(data === null) _ended = true\n buffer.push(data)\n drain()\n return stream\n }\n\n //this will be registered as the first 'end' listener\n //must call destroy next tick, to make sure we're after any\n //stream piped from here.\n //this is only a problem if end is not emitted synchronously.\n //a nicer way to do this is to make sure this is the last listener for 'end'\n\n stream.on('end', function () {\n stream.readable = false\n if(!stream.writable && stream.autoDestroy)\n process.nextTick(function () {\n stream.destroy()\n })\n })\n\n function _end () {\n stream.writable = false\n end.call(stream)\n if(!stream.readable && stream.autoDestroy)\n stream.destroy()\n }\n\n stream.end = function (data) {\n if(ended) return\n ended = true\n if(arguments.length) stream.write(data)\n _end() // will emit or queue\n return stream\n }\n\n stream.destroy = function () {\n if(destroyed) return\n destroyed = true\n ended = true\n buffer.length = 0\n stream.writable = stream.readable = false\n stream.emit('close')\n return stream\n }\n\n stream.pause = function () {\n if(stream.paused) return\n stream.paused = true\n return stream\n }\n\n stream.resume = function () {\n if(stream.paused) {\n stream.paused = false\n stream.emit('resume')\n }\n drain()\n //may have become paused again,\n //as drain emits 'data'.\n if(!stream.paused)\n stream.emit('drain')\n return stream\n }\n return stream\n}\n\n","\n/**\n * Module exports.\n */\n\nmodule.exports = deprecate;\n\n/**\n * Mark that a method should not be used.\n * Returns a modified function which warns once by default.\n *\n * If `localStorage.noDeprecation = true` is set, then it is a no-op.\n *\n * If `localStorage.throwDeprecation = true` is set, then deprecated functions\n * will throw an Error when invoked.\n *\n * If `localStorage.traceDeprecation = true` is set, then deprecated functions\n * will invoke `console.trace()` instead of `console.error()`.\n *\n * @param {Function} fn - the function to deprecate\n * @param {String} msg - the string to print to the console when `fn` is invoked\n * @returns {Function} a new \"deprecated\" version of `fn`\n * @api public\n */\n\nfunction deprecate (fn, msg) {\n if (config('noDeprecation')) {\n return fn;\n }\n\n var warned = false;\n function deprecated() {\n if (!warned) {\n if (config('throwDeprecation')) {\n throw new Error(msg);\n } else if (config('traceDeprecation')) {\n console.trace(msg);\n } else {\n console.warn(msg);\n }\n warned = true;\n }\n return fn.apply(this, arguments);\n }\n\n return deprecated;\n}\n\n/**\n * Checks `localStorage` for boolean values for the given `name`.\n *\n * @param {String} name\n * @returns {Boolean}\n * @api private\n */\n\nfunction config (name) {\n // accessing global.localStorage can trigger a DOMException in sandboxed iframes\n try {\n if (!global.localStorage) return false;\n } catch (_) {\n return false;\n }\n var val = global.localStorage[name];\n if (null == val) return false;\n return String(val).toLowerCase() === 'true';\n}\n","module.exports = __WEBPACK_EXTERNAL_MODULE__824__;","/* (ignored) */","/* (ignored) */","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","export class Api {\n static apply(object) {\n object.set = function (options) {\n var o = this.options || {};\n\n // Diff out changes\n var changes = Object.entries(options).reduce(function (\n result,\n [key, value]\n ) {\n if (o[key] !== value) result[key] = value;\n return result;\n },\n {});\n\n this.options = Object.assign(o, changes);\n\n // Notify\n this.trigger({ type: \"change\", options: options, changes: changes });\n };\n\n object.get = function () {\n return this.options;\n };\n\n object.api = function (object, context) {\n if (!object) {\n object = {};\n }\n\n // Append context argument to API methods\n context &&\n Object.entries(object).forEach(function ([key, callback]) {\n if (typeof callback === \"function\") {\n object[key] = (...args) => callback(...args, context);\n }\n });\n\n object.set = this.set.bind(this);\n object.get = this.get.bind(this);\n\n return object;\n };\n }\n}\n","/**\n * https://github.com/mrdoob/eventdispatcher.js/\n */\n\nclass EventDispatcher {\n\n\taddEventListener( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) this._listeners = {};\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners[ type ] === undefined ) {\n\n\t\t\tlisteners[ type ] = [];\n\n\t\t}\n\n\t\tif ( listeners[ type ].indexOf( listener ) === - 1 ) {\n\n\t\t\tlisteners[ type ].push( listener );\n\n\t\t}\n\n\t}\n\n\thasEventListener( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) return false;\n\n\t\tconst listeners = this._listeners;\n\n\t\treturn listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1;\n\n\t}\n\n\tremoveEventListener( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) return;\n\n\t\tconst listeners = this._listeners;\n\t\tconst listenerArray = listeners[ type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tconst index = listenerArray.indexOf( listener );\n\n\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\tlistenerArray.splice( index, 1 );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tdispatchEvent( event ) {\n\n\t\tif ( this._listeners === undefined ) return;\n\n\t\tconst listeners = this._listeners;\n\t\tconst listenerArray = listeners[ event.type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tevent.target = this;\n\n\t\t\t// Make a copy, in case listeners are removed while iterating.\n\t\t\tconst array = listenerArray.slice( 0 );\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\tarray[ i ].call( this, event );\n\n\t\t\t}\n\n\t\t\tevent.target = null;\n\n\t\t}\n\n\t}\n\n}\n\n\nexport { EventDispatcher };\n","import { EventDispatcher } from \"three/src/core/EventDispatcher.js\";\n\nexport class Binder {\n static bind(context, globals) {\n return function (key, object) {\n // Prepare object\n if (!object.__binds) {\n object.__binds = [];\n }\n\n // Set base target\n var fallback = context;\n\n if (Array.isArray(key)) {\n fallback = key[0];\n key = key[1];\n }\n\n // Match key\n var match = /^([^.:]*(?:\\.[^.:]+)*)?(?::(.*))?$/.exec(key);\n var path = match[1].split(/\\./g);\n\n var name = path.pop();\n var dest = match[2] || name;\n\n // Whitelisted objects\n var selector = path.shift();\n\n var target =\n {\n this: object,\n }[selector] ||\n globals[selector] ||\n context[selector] ||\n fallback;\n\n // Look up keys\n while (target && (key = path.shift())) {\n target = target[key];\n }\n\n // Attach event handler at last level\n if (target && (target.on || target.addEventListener)) {\n var callback = function (event) {\n object[dest] && object[dest](event, context);\n };\n\n // Polyfill for both styles of event listener adders\n Binder._polyfill(target, [\"addEventListener\", \"on\"], function (method) {\n target[method](name, callback);\n });\n\n // Store bind for removal later\n var bind = { target: target, name: name, callback: callback };\n object.__binds.push(bind);\n\n // Return callback\n return callback;\n } else {\n throw \"Cannot bind '\" + key + \"' in \" + this.__name;\n }\n };\n }\n\n static unbind() {\n return function (object) {\n // Remove all binds belonging to object\n if (object.__binds) {\n object.__binds.forEach(\n function (bind) {\n // Polyfill for both styles of event listener removers\n Binder._polyfill(\n bind.target,\n [\"removeEventListener\", \"off\"],\n function (method) {\n bind.target[method](bind.name, bind.callback);\n }\n );\n }.bind(this)\n );\n\n object.__binds = [];\n }\n };\n }\n\n static apply(object) {\n object.trigger = Binder._trigger;\n object.triggerOnce = Binder._triggerOnce;\n\n object.hasEventListener = EventDispatcher.prototype.hasEventListener;\n object.addEventListener = EventDispatcher.prototype.addEventListener;\n object.removeEventListener = EventDispatcher.prototype.removeEventListener;\n\n object.on = object.addEventListener;\n object.off = object.removeEventListener;\n object.dispatchEvent = object.trigger;\n }\n\n static _triggerOnce(event) {\n this.trigger(event);\n if (this._listeners) {\n delete this._listeners[event.type];\n }\n }\n\n static _trigger(event) {\n if (this._listeners === undefined) return;\n\n var type = event.type;\n var listeners = this._listeners[type];\n if (listeners !== undefined) {\n listeners = listeners.slice();\n var length = listeners.length;\n\n event.target = this;\n for (var i = 0; i < length; i++) {\n // add original target as parameter for convenience\n listeners[i].call(this, event, this);\n }\n }\n }\n\n static _polyfill(object, methods, callback) {\n methods.map(function (_method) {\n return object.method;\n });\n if (methods.length) callback(methods[0]);\n }\n}\n","import { Api } from \"./api\";\nimport { Binder } from \"./binder\";\n\nfunction isString(str) {\n return str && typeof str.valueOf() === \"string\";\n}\n\nexport class Bootstrap {\n static initClass() {\n this.Plugins = {};\n this.Aliases = {};\n }\n\n static registerPlugin(name, spec) {\n var ctor = function (options) {\n Bootstrap.Plugin.call(this, options);\n this.__name = name;\n };\n ctor.prototype = Object.assign(new Bootstrap.Plugin(), spec);\n\n this.Plugins[name] = ctor;\n }\n\n static unregisterPlugin(name) {\n delete this.Plugins[name];\n }\n\n static registerAlias(name, plugins) {\n this.Aliases[name] = plugins;\n }\n\n static unregisterAlias(name) {\n delete this.Aliases[name];\n }\n\n constructor(options) {\n if (options) {\n let args = [].slice.apply(arguments);\n options = {};\n\n // (element, ...)\n if (args[0] instanceof Node) {\n const node = args[0];\n args = args.slice(1);\n options.element = node;\n }\n\n // (..., plugin, plugin, plugin)\n if (isString(args[0])) {\n options.plugins = args;\n } else if (Array.isArray(args[0])) {\n // (..., [plugin, plugin, plugin])\n options.plugins = args[0];\n } else if (args[0]) {\n // (..., options)\n\n // else, merge any arguments on the right that have NOT been set into the\n // options dict on the left.\n options = Object.assign({}, args[0], options);\n }\n }\n\n // Apply defaults\n const defaultOpts = {\n init: true,\n element: document.body,\n plugins: [\"core\"],\n aliases: {},\n plugindb: Bootstrap.Plugins || {},\n aliasdb: Bootstrap.Aliases || {},\n };\n\n this.__options = Object.assign({}, defaultOpts, options || {});\n\n // Hidden state\n this.__inited = false;\n this.__destroyed = false;\n this.__installed = [];\n\n // Query element\n var element = this.__options.element;\n if (element === \"\" + element) {\n element = document.querySelector(element);\n }\n\n // Global context\n this.plugins = {};\n this.element = element;\n\n // Update cycle\n this.trigger = this.trigger.bind(this);\n this.frame = this.frame.bind(this);\n this.events = [\"pre\", \"update\", \"render\", \"post\"].map(function (type) {\n return { type: type };\n });\n\n // Auto-init\n if (this.__options.init) {\n this.init();\n }\n }\n\n init() {\n if (this.__inited) return;\n this.__inited = true;\n\n // Install plugins\n this.install(this.__options.plugins);\n }\n\n destroy() {\n if (!this.__inited) return;\n if (this.__destroyed) return;\n this.__destroyed = true;\n\n // Notify of imminent destruction\n this.trigger({ type: \"destroy\" });\n\n // Then uninstall plugins\n this.uninstall();\n }\n\n frame() {\n this.events.map(this.trigger);\n }\n\n resolve(plugins) {\n plugins = Array.isArray(plugins) ? plugins : [plugins];\n\n // Resolve alias database\n var o = this.__options;\n var aliases = Object.assign({}, o.aliasdb, o.aliases);\n\n // Remove inline alias defs from plugins\n var pred = function (name) {\n var key = name.split(\":\");\n if (!key[1]) return true;\n aliases[key[0]] = [key[1]];\n return false;\n };\n plugins = plugins.filter(pred);\n\n // Unify arrays\n Object.entries(aliases).forEach(function ([key, alias]) {\n aliases[key] = Array.isArray(alias) ? alias : [alias];\n });\n\n // Look up aliases recursively\n function recurse(list, out, level) {\n if (level >= 256) throw \"Plug-in alias recursion detected.\";\n list = list.filter(pred);\n list.forEach(function (name) {\n var alias = aliases[name];\n if (!alias) {\n out.push(name);\n } else {\n out = out.concat(recurse(alias, [], level + 1));\n }\n });\n return out;\n }\n\n return recurse(plugins, [], 0);\n }\n\n install(plugins) {\n plugins = Array.isArray(plugins) ? plugins : [plugins];\n\n // Resolve aliases\n plugins = this.resolve(plugins);\n\n // Install in order\n plugins.forEach((name) => this.__install(name));\n\n // Fire off ready event\n this.__ready();\n }\n\n uninstall(plugins) {\n if (plugins) {\n plugins = Array.isArray(plugins) ? plugins : [plugins];\n\n // Resolve aliases\n plugins = this.resolve(plugins);\n }\n\n // Uninstall in reverse order\n (plugins || this.__installed)\n .reverse()\n .forEach((p) => this.__uninstall(p.__name));\n }\n\n __install(name) {\n // Sanity check\n var ctor = this.__options.plugindb[name];\n if (!ctor)\n throw \"[three.install] Cannot install. '\" + name + \"' is not registered.\";\n\n if (this.plugins[name])\n return console.warn(\"[three.install] \" + name + \" is already installed.\");\n\n // Construct\n var Plugin = ctor;\n var plugin = new Plugin(this.__options[name] || {}, name);\n this.plugins[name] = plugin;\n\n // Install\n const flag = plugin.install(this);\n this.__installed.push(plugin);\n\n // Then notify\n this.trigger({ type: \"install\", plugin: plugin });\n\n // Allow early abort\n return flag;\n }\n\n __uninstall(name) {\n // Sanity check\n const plugin = isString(name) ? this.plugins[name] : name;\n if (!plugin) {\n console.warn(\"[three.uninstall] \" + name + \"' is not installed.\");\n return;\n }\n\n name = plugin.__name;\n\n // Uninstall\n plugin.uninstall(this);\n this.__installed = this.__installed.filter((p) => p !== plugin);\n delete this.plugins[name];\n\n // Then notify\n this.trigger({ type: \"uninstall\", plugin: plugin });\n }\n\n __ready() {\n // Notify and remove event handlers\n this.triggerOnce({ type: \"ready\" });\n }\n}\nBootstrap.initClass();\n\n// Plugin Creation\n\nBootstrap.Plugin = function (options) {\n this.options = Object.assign({}, this.defaults, options || {});\n};\n\nBootstrap.Plugin.prototype = {\n listen: [],\n defaults: {},\n install: function (_three) {},\n uninstall: function (_three) {},\n};\n\nBinder.apply(Bootstrap.prototype);\nBinder.apply(Bootstrap.Plugin.prototype);\nApi.apply(Bootstrap.Plugin.prototype);\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\n// Threestrap plugin\n\nimport { Bootstrap } from \"@sicmutils/threestrap/src/bootstrap.js\";\n\nBootstrap.registerPlugin(\"splash\", {\n defaults: {\n color: \"mono\",\n fancy: true,\n },\n\n listen: [\n \"ready\",\n \"mathbox/init:init\",\n \"mathbox/progress:progress\",\n \"mathbox/destroy:destroy\",\n ],\n\n uninstall() {\n return this.destroy();\n },\n\n ready(event, three) {\n if (three.MathBox && !this.div) {\n // TODO woah seems wrong!!!\n return this.init(event, three);\n }\n },\n\n init(event, three) {\n let div;\n this.destroy();\n\n const { color } = this.options;\n const html = `\\\n
\n
\n
\n
\n
\n
\n
\\\n`;\n\n this.div = div = document.createElement(\"div\");\n div.innerHTML = html;\n three.element.appendChild(div);\n\n const x = Math.random() * 2 - 1;\n const y = Math.random() * 2 - 1;\n const z = Math.random() * 2 - 1;\n const l = 1 / Math.sqrt(x * x + y * y + z * z);\n\n this.loader = div.querySelector(\".mathbox-loader\");\n this.bar = div.querySelector(\".mathbox-progress > div\");\n this.gyro = div.querySelectorAll(\".mathbox-logo > div\");\n this.transforms = [\n \"rotateZ(22deg) rotateX(24deg) rotateY(30deg)\",\n \"rotateZ(11deg) rotateX(12deg) rotateY(15deg) scale3d(.6, .6, .6)\",\n ];\n this.random = [x * l, y * l, z * l];\n this.start = three.Time.now;\n return (this.timer = null);\n },\n\n // Update splash screen state and animation\n progress(event, three) {\n if (!this.div) {\n return;\n }\n\n const { current, total } = event;\n\n // Display splash screen\n const visible = current < total;\n clearTimeout(this.timer);\n if (visible) {\n this.loader.classList.remove(\"mathbox-exit\");\n this.loader.style.display = \"block\";\n } else {\n this.loader.classList.add(\"mathbox-exit\");\n this.timer = setTimeout(() => {\n return (this.loader.style.display = \"none\");\n }, 150);\n }\n\n // Update splash progress\n const width =\n current < total\n ? Math.round((1000 * current) / total) * 0.1 + \"%\"\n : \"100%\";\n this.bar.style.width = width;\n\n if (this.options.fancy) {\n // Spinny gyros\n const weights = this.random;\n\n // Lerp clock speed\n const f = Math.max(0, Math.min(1, three.Time.now - this.start));\n const increment = function (transform, j) {\n if (j == null) {\n j = 0;\n }\n return transform.replace(\n /(-?[0-9.e]+)deg/g,\n (_, n) => +n + weights[j++] * f * three.Time.step * 60 + \"deg\"\n );\n };\n\n return (() => {\n const result = [];\n for (let i = 0; i < this.gyro.length; i++) {\n var t;\n const el = this.gyro[i];\n this.transforms[i] = t = increment(this.transforms[i]);\n result.push((el.style.transform = el.style.WebkitTransform = t));\n }\n return result;\n })();\n }\n },\n\n destroy() {\n if (this.div != null) {\n this.div.remove();\n }\n return (this.div = null);\n },\n});\n","import { Bootstrap } from \"./bootstrap\";\n\nBootstrap.registerAlias(\"empty\", [\n \"fallback\",\n \"bind\",\n \"renderer\",\n \"size\",\n \"fill\",\n \"loop\",\n \"time\",\n]);\n\nBootstrap.registerAlias(\"core\", [\n \"empty\",\n \"scene\",\n \"camera\",\n \"render\",\n \"warmup\",\n]);\n\nBootstrap.registerAlias(\"VR\", [\"core\", \"cursor\", \"fullscreen\", \"render:vr\"]);\n","import { Bootstrap } from \"../bootstrap\";\nimport { Binder } from \"../binder\";\n\nBootstrap.registerPlugin(\"bind\", {\n install: function (three) {\n var globals = {\n three: three,\n window: window,\n };\n\n three.bind = Binder.bind(three, globals);\n three.unbind = Binder.unbind(three);\n\n three.bind(\"install:bind\", this);\n three.bind(\"uninstall:unbind\", this);\n },\n\n uninstall: function (three) {\n three.unbind(this);\n\n delete three.bind;\n delete three.unbind;\n },\n\n bind: function (event, three) {\n var plugin = event.plugin;\n var listen = plugin.listen;\n\n listen &&\n listen.forEach(function (key) {\n three.bind(key, plugin);\n });\n },\n\n unbind: function (event, three) {\n three.unbind(event.plugin);\n },\n});\n","const _lut = [];\n\nfor ( let i = 0; i < 256; i ++ ) {\n\n\t_lut[ i ] = ( i < 16 ? '0' : '' ) + ( i ).toString( 16 );\n\n}\n\nlet _seed = 1234567;\n\n\nconst DEG2RAD = Math.PI / 180;\nconst RAD2DEG = 180 / Math.PI;\n\n// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136\nfunction generateUUID() {\n\n\tconst d0 = Math.random() * 0xffffffff | 0;\n\tconst d1 = Math.random() * 0xffffffff | 0;\n\tconst d2 = Math.random() * 0xffffffff | 0;\n\tconst d3 = Math.random() * 0xffffffff | 0;\n\tconst uuid = _lut[ d0 & 0xff ] + _lut[ d0 >> 8 & 0xff ] + _lut[ d0 >> 16 & 0xff ] + _lut[ d0 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d1 & 0xff ] + _lut[ d1 >> 8 & 0xff ] + '-' + _lut[ d1 >> 16 & 0x0f | 0x40 ] + _lut[ d1 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d2 & 0x3f | 0x80 ] + _lut[ d2 >> 8 & 0xff ] + '-' + _lut[ d2 >> 16 & 0xff ] + _lut[ d2 >> 24 & 0xff ] +\n\t\t\t_lut[ d3 & 0xff ] + _lut[ d3 >> 8 & 0xff ] + _lut[ d3 >> 16 & 0xff ] + _lut[ d3 >> 24 & 0xff ];\n\n\t// .toUpperCase() here flattens concatenated strings to save heap memory space.\n\treturn uuid.toUpperCase();\n\n}\n\nfunction clamp( value, min, max ) {\n\n\treturn Math.max( min, Math.min( max, value ) );\n\n}\n\n// compute euclidian modulo of m % n\n// https://en.wikipedia.org/wiki/Modulo_operation\nfunction euclideanModulo( n, m ) {\n\n\treturn ( ( n % m ) + m ) % m;\n\n}\n\n// Linear mapping from range to range \nfunction mapLinear( x, a1, a2, b1, b2 ) {\n\n\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n}\n\n// https://www.gamedev.net/tutorials/programming/general-and-gameplay-programming/inverse-lerp-a-super-useful-yet-often-overlooked-function-r5230/\nfunction inverseLerp( x, y, value ) {\n\n\tif ( x !== y ) {\n\n\t\treturn ( value - x ) / ( y - x );\n\n\t} else {\n\n\t\treturn 0;\n\n\t}\n\n}\n\n// https://en.wikipedia.org/wiki/Linear_interpolation\nfunction lerp( x, y, t ) {\n\n\treturn ( 1 - t ) * x + t * y;\n\n}\n\n// http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/\nfunction damp( x, y, lambda, dt ) {\n\n\treturn lerp( x, y, 1 - Math.exp( - lambda * dt ) );\n\n}\n\n// https://www.desmos.com/calculator/vcsjnyz7x4\nfunction pingpong( x, length = 1 ) {\n\n\treturn length - Math.abs( euclideanModulo( x, length * 2 ) - length );\n\n}\n\n// http://en.wikipedia.org/wiki/Smoothstep\nfunction smoothstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * ( 3 - 2 * x );\n\n}\n\nfunction smootherstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n}\n\n// Random integer from interval\nfunction randInt( low, high ) {\n\n\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n}\n\n// Random float from interval\nfunction randFloat( low, high ) {\n\n\treturn low + Math.random() * ( high - low );\n\n}\n\n// Random float from <-range/2, range/2> interval\nfunction randFloatSpread( range ) {\n\n\treturn range * ( 0.5 - Math.random() );\n\n}\n\n// Deterministic pseudo-random float in the interval [ 0, 1 ]\nfunction seededRandom( s ) {\n\n\tif ( s !== undefined ) _seed = s % 2147483647;\n\n\t// Park-Miller algorithm\n\n\t_seed = _seed * 16807 % 2147483647;\n\n\treturn ( _seed - 1 ) / 2147483646;\n\n}\n\nfunction degToRad( degrees ) {\n\n\treturn degrees * DEG2RAD;\n\n}\n\nfunction radToDeg( radians ) {\n\n\treturn radians * RAD2DEG;\n\n}\n\nfunction isPowerOfTwo( value ) {\n\n\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n}\n\nfunction ceilPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) );\n\n}\n\nfunction floorPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) );\n\n}\n\nfunction setQuaternionFromProperEuler( q, a, b, c, order ) {\n\n\t// Intrinsic Proper Euler Angles - see https://en.wikipedia.org/wiki/Euler_angles\n\n\t// rotations are applied to the axes in the order specified by 'order'\n\t// rotation by angle 'a' is applied first, then by angle 'b', then by angle 'c'\n\t// angles are in radians\n\n\tconst cos = Math.cos;\n\tconst sin = Math.sin;\n\n\tconst c2 = cos( b / 2 );\n\tconst s2 = sin( b / 2 );\n\n\tconst c13 = cos( ( a + c ) / 2 );\n\tconst s13 = sin( ( a + c ) / 2 );\n\n\tconst c1_3 = cos( ( a - c ) / 2 );\n\tconst s1_3 = sin( ( a - c ) / 2 );\n\n\tconst c3_1 = cos( ( c - a ) / 2 );\n\tconst s3_1 = sin( ( c - a ) / 2 );\n\n\tswitch ( order ) {\n\n\t\tcase 'XYX':\n\t\t\tq.set( c2 * s13, s2 * c1_3, s2 * s1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YZY':\n\t\t\tq.set( s2 * s1_3, c2 * s13, s2 * c1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZXZ':\n\t\t\tq.set( s2 * c1_3, s2 * s1_3, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'XZX':\n\t\t\tq.set( c2 * s13, s2 * s3_1, s2 * c3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YXY':\n\t\t\tq.set( s2 * c3_1, c2 * s13, s2 * s3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZYZ':\n\t\t\tq.set( s2 * s3_1, s2 * c3_1, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: ' + order );\n\n\t}\n\n}\n\n\n\n\nexport {\n\tDEG2RAD,\n\tRAD2DEG,\n\tgenerateUUID,\n\tclamp,\n\teuclideanModulo,\n\tmapLinear,\n\tinverseLerp,\n\tlerp,\n\tdamp,\n\tpingpong,\n\tsmoothstep,\n\tsmootherstep,\n\trandInt,\n\trandFloat,\n\trandFloatSpread,\n\tseededRandom,\n\tdegToRad,\n\tradToDeg,\n\tisPowerOfTwo,\n\tceilPowerOfTwo,\n\tfloorPowerOfTwo,\n\tsetQuaternionFromProperEuler,\n};\n","import * as MathUtils from './MathUtils.js';\n\nclass Quaternion {\n\n\tconstructor( x = 0, y = 0, z = 0, w = 1 ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t}\n\n\tstatic slerp( qa, qb, qm, t ) {\n\n\t\tconsole.warn( 'THREE.Quaternion: Static .slerp() has been deprecated. Use qm.slerpQuaternions( qa, qb, t ) instead.' );\n\t\treturn qm.slerpQuaternions( qa, qb, t );\n\n\t}\n\n\tstatic slerpFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {\n\n\t\t// fuzz-free, array-based Quaternion SLERP operation\n\n\t\tlet x0 = src0[ srcOffset0 + 0 ],\n\t\t\ty0 = src0[ srcOffset0 + 1 ],\n\t\t\tz0 = src0[ srcOffset0 + 2 ],\n\t\t\tw0 = src0[ srcOffset0 + 3 ];\n\n\t\tconst x1 = src1[ srcOffset1 + 0 ],\n\t\t\ty1 = src1[ srcOffset1 + 1 ],\n\t\t\tz1 = src1[ srcOffset1 + 2 ],\n\t\t\tw1 = src1[ srcOffset1 + 3 ];\n\n\t\tif ( t === 0 ) {\n\n\t\t\tdst[ dstOffset + 0 ] = x0;\n\t\t\tdst[ dstOffset + 1 ] = y0;\n\t\t\tdst[ dstOffset + 2 ] = z0;\n\t\t\tdst[ dstOffset + 3 ] = w0;\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( t === 1 ) {\n\n\t\t\tdst[ dstOffset + 0 ] = x1;\n\t\t\tdst[ dstOffset + 1 ] = y1;\n\t\t\tdst[ dstOffset + 2 ] = z1;\n\t\t\tdst[ dstOffset + 3 ] = w1;\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {\n\n\t\t\tlet s = 1 - t;\n\t\t\tconst cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1,\n\t\t\t\tdir = ( cos >= 0 ? 1 : - 1 ),\n\t\t\t\tsqrSin = 1 - cos * cos;\n\n\t\t\t// Skip the Slerp for tiny steps to avoid numeric problems:\n\t\t\tif ( sqrSin > Number.EPSILON ) {\n\n\t\t\t\tconst sin = Math.sqrt( sqrSin ),\n\t\t\t\t\tlen = Math.atan2( sin, cos * dir );\n\n\t\t\t\ts = Math.sin( s * len ) / sin;\n\t\t\t\tt = Math.sin( t * len ) / sin;\n\n\t\t\t}\n\n\t\t\tconst tDir = t * dir;\n\n\t\t\tx0 = x0 * s + x1 * tDir;\n\t\t\ty0 = y0 * s + y1 * tDir;\n\t\t\tz0 = z0 * s + z1 * tDir;\n\t\t\tw0 = w0 * s + w1 * tDir;\n\n\t\t\t// Normalize in case we just did a lerp:\n\t\t\tif ( s === 1 - t ) {\n\n\t\t\t\tconst f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 );\n\n\t\t\t\tx0 *= f;\n\t\t\t\ty0 *= f;\n\t\t\t\tz0 *= f;\n\t\t\t\tw0 *= f;\n\n\t\t\t}\n\n\t\t}\n\n\t\tdst[ dstOffset ] = x0;\n\t\tdst[ dstOffset + 1 ] = y0;\n\t\tdst[ dstOffset + 2 ] = z0;\n\t\tdst[ dstOffset + 3 ] = w0;\n\n\t}\n\n\tstatic multiplyQuaternionsFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1 ) {\n\n\t\tconst x0 = src0[ srcOffset0 ];\n\t\tconst y0 = src0[ srcOffset0 + 1 ];\n\t\tconst z0 = src0[ srcOffset0 + 2 ];\n\t\tconst w0 = src0[ srcOffset0 + 3 ];\n\n\t\tconst x1 = src1[ srcOffset1 ];\n\t\tconst y1 = src1[ srcOffset1 + 1 ];\n\t\tconst z1 = src1[ srcOffset1 + 2 ];\n\t\tconst w1 = src1[ srcOffset1 + 3 ];\n\n\t\tdst[ dstOffset ] = x0 * w1 + w0 * x1 + y0 * z1 - z0 * y1;\n\t\tdst[ dstOffset + 1 ] = y0 * w1 + w0 * y1 + z0 * x1 - x0 * z1;\n\t\tdst[ dstOffset + 2 ] = z0 * w1 + w0 * z1 + x0 * y1 - y0 * x1;\n\t\tdst[ dstOffset + 3 ] = w0 * w1 - x0 * x1 - y0 * y1 - z0 * z1;\n\n\t\treturn dst;\n\n\t}\n\n\tget x() {\n\n\t\treturn this._x;\n\n\t}\n\n\tset x( value ) {\n\n\t\tthis._x = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget y() {\n\n\t\treturn this._y;\n\n\t}\n\n\tset y( value ) {\n\n\t\tthis._y = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget z() {\n\n\t\treturn this._z;\n\n\t}\n\n\tset z( value ) {\n\n\t\tthis._z = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget w() {\n\n\t\treturn this._w;\n\n\t}\n\n\tset w( value ) {\n\n\t\tthis._w = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tset( x, y, z, w ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._w );\n\n\t}\n\n\tcopy( quaternion ) {\n\n\t\tthis._x = quaternion.x;\n\t\tthis._y = quaternion.y;\n\t\tthis._z = quaternion.z;\n\t\tthis._w = quaternion.w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromEuler( euler, update ) {\n\n\t\tif ( ! ( euler && euler.isEuler ) ) {\n\n\t\t\tthrow new Error( 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t}\n\n\t\tconst x = euler._x, y = euler._y, z = euler._z, order = euler._order;\n\n\t\t// http://www.mathworks.com/matlabcentral/fileexchange/\n\t\t// \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n\t\t//\tcontent/SpinCalc.m\n\n\t\tconst cos = Math.cos;\n\t\tconst sin = Math.sin;\n\n\t\tconst c1 = cos( x / 2 );\n\t\tconst c2 = cos( y / 2 );\n\t\tconst c3 = cos( z / 2 );\n\n\t\tconst s1 = sin( x / 2 );\n\t\tconst s2 = sin( y / 2 );\n\t\tconst s3 = sin( z / 2 );\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tconsole.warn( 'THREE.Quaternion: .setFromEuler() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tif ( update !== false ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromAxisAngle( axis, angle ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n\n\t\t// assumes axis is normalized\n\n\t\tconst halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n\t\tthis._x = axis.x * s;\n\t\tthis._y = axis.y * s;\n\t\tthis._z = axis.z * s;\n\t\tthis._w = Math.cos( halfAngle );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromRotationMatrix( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tconst te = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],\n\n\t\t\ttrace = m11 + m22 + m33;\n\n\t\tif ( trace > 0 ) {\n\n\t\t\tconst s = 0.5 / Math.sqrt( trace + 1.0 );\n\n\t\t\tthis._w = 0.25 / s;\n\t\t\tthis._x = ( m32 - m23 ) * s;\n\t\t\tthis._y = ( m13 - m31 ) * s;\n\t\t\tthis._z = ( m21 - m12 ) * s;\n\n\t\t} else if ( m11 > m22 && m11 > m33 ) {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );\n\n\t\t\tthis._w = ( m32 - m23 ) / s;\n\t\t\tthis._x = 0.25 * s;\n\t\t\tthis._y = ( m12 + m21 ) / s;\n\t\t\tthis._z = ( m13 + m31 ) / s;\n\n\t\t} else if ( m22 > m33 ) {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );\n\n\t\t\tthis._w = ( m13 - m31 ) / s;\n\t\t\tthis._x = ( m12 + m21 ) / s;\n\t\t\tthis._y = 0.25 * s;\n\t\t\tthis._z = ( m23 + m32 ) / s;\n\n\t\t} else {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );\n\n\t\t\tthis._w = ( m21 - m12 ) / s;\n\t\t\tthis._x = ( m13 + m31 ) / s;\n\t\t\tthis._y = ( m23 + m32 ) / s;\n\t\t\tthis._z = 0.25 * s;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromUnitVectors( vFrom, vTo ) {\n\n\t\t// assumes direction vectors vFrom and vTo are normalized\n\n\t\tlet r = vFrom.dot( vTo ) + 1;\n\n\t\tif ( r < Number.EPSILON ) {\n\n\t\t\t// vFrom and vTo point in opposite directions\n\n\t\t\tr = 0;\n\n\t\t\tif ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n\n\t\t\t\tthis._x = - vFrom.y;\n\t\t\t\tthis._y = vFrom.x;\n\t\t\t\tthis._z = 0;\n\t\t\t\tthis._w = r;\n\n\t\t\t} else {\n\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._y = - vFrom.z;\n\t\t\t\tthis._z = vFrom.y;\n\t\t\t\tthis._w = r;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// crossVectors( vFrom, vTo ); // inlined to avoid cyclic dependency on Vector3\n\n\t\t\tthis._x = vFrom.y * vTo.z - vFrom.z * vTo.y;\n\t\t\tthis._y = vFrom.z * vTo.x - vFrom.x * vTo.z;\n\t\t\tthis._z = vFrom.x * vTo.y - vFrom.y * vTo.x;\n\t\t\tthis._w = r;\n\n\t\t}\n\n\t\treturn this.normalize();\n\n\t}\n\n\tangleTo( q ) {\n\n\t\treturn 2 * Math.acos( Math.abs( MathUtils.clamp( this.dot( q ), - 1, 1 ) ) );\n\n\t}\n\n\trotateTowards( q, step ) {\n\n\t\tconst angle = this.angleTo( q );\n\n\t\tif ( angle === 0 ) return this;\n\n\t\tconst t = Math.min( 1, step / angle );\n\n\t\tthis.slerp( q, t );\n\n\t\treturn this;\n\n\t}\n\n\tidentity() {\n\n\t\treturn this.set( 0, 0, 0, 1 );\n\n\t}\n\n\tinvert() {\n\n\t\t// quaternion is assumed to have unit length\n\n\t\treturn this.conjugate();\n\n\t}\n\n\tconjugate() {\n\n\t\tthis._x *= - 1;\n\t\tthis._y *= - 1;\n\t\tthis._z *= - 1;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\n\n\t}\n\n\tlengthSq() {\n\n\t\treturn this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );\n\n\t}\n\n\tnormalize() {\n\n\t\tlet l = this.length();\n\n\t\tif ( l === 0 ) {\n\n\t\t\tthis._x = 0;\n\t\t\tthis._y = 0;\n\t\t\tthis._z = 0;\n\t\t\tthis._w = 1;\n\n\t\t} else {\n\n\t\t\tl = 1 / l;\n\n\t\t\tthis._x = this._x * l;\n\t\t\tthis._y = this._y * l;\n\t\t\tthis._z = this._z * l;\n\t\t\tthis._w = this._w * l;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( q, p ) {\n\n\t\tif ( p !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' );\n\t\t\treturn this.multiplyQuaternions( q, p );\n\n\t\t}\n\n\t\treturn this.multiplyQuaternions( this, q );\n\n\t}\n\n\tpremultiply( q ) {\n\n\t\treturn this.multiplyQuaternions( q, this );\n\n\t}\n\n\tmultiplyQuaternions( a, b ) {\n\n\t\t// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n\t\tconst qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;\n\t\tconst qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;\n\n\t\tthis._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n\t\tthis._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n\t\tthis._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n\t\tthis._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tslerp( qb, t ) {\n\n\t\tif ( t === 0 ) return this;\n\t\tif ( t === 1 ) return this.copy( qb );\n\n\t\tconst x = this._x, y = this._y, z = this._z, w = this._w;\n\n\t\t// http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n\n\t\tlet cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;\n\n\t\tif ( cosHalfTheta < 0 ) {\n\n\t\t\tthis._w = - qb._w;\n\t\t\tthis._x = - qb._x;\n\t\t\tthis._y = - qb._y;\n\t\t\tthis._z = - qb._z;\n\n\t\t\tcosHalfTheta = - cosHalfTheta;\n\n\t\t} else {\n\n\t\t\tthis.copy( qb );\n\n\t\t}\n\n\t\tif ( cosHalfTheta >= 1.0 ) {\n\n\t\t\tthis._w = w;\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst sqrSinHalfTheta = 1.0 - cosHalfTheta * cosHalfTheta;\n\n\t\tif ( sqrSinHalfTheta <= Number.EPSILON ) {\n\n\t\t\tconst s = 1 - t;\n\t\t\tthis._w = s * w + t * this._w;\n\t\t\tthis._x = s * x + t * this._x;\n\t\t\tthis._y = s * y + t * this._y;\n\t\t\tthis._z = s * z + t * this._z;\n\n\t\t\tthis.normalize();\n\t\t\tthis._onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst sinHalfTheta = Math.sqrt( sqrSinHalfTheta );\n\t\tconst halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta );\n\t\tconst ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,\n\t\t\tratioB = Math.sin( t * halfTheta ) / sinHalfTheta;\n\n\t\tthis._w = ( w * ratioA + this._w * ratioB );\n\t\tthis._x = ( x * ratioA + this._x * ratioB );\n\t\tthis._y = ( y * ratioA + this._y * ratioB );\n\t\tthis._z = ( z * ratioA + this._z * ratioB );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tslerpQuaternions( qa, qb, t ) {\n\n\t\treturn this.copy( qa ).slerp( qb, t );\n\n\t}\n\n\trandom() {\n\n\t\t// Derived from http://planning.cs.uiuc.edu/node198.html\n\t\t// Note, this source uses w, x, y, z ordering,\n\t\t// so we swap the order below.\n\n\t\tconst u1 = Math.random();\n\t\tconst sqrt1u1 = Math.sqrt( 1 - u1 );\n\t\tconst sqrtu1 = Math.sqrt( u1 );\n\n\t\tconst u2 = 2 * Math.PI * Math.random();\n\n\t\tconst u3 = 2 * Math.PI * Math.random();\n\n\t\treturn this.set(\n\t\t\tsqrt1u1 * Math.cos( u2 ),\n\t\t\tsqrtu1 * Math.sin( u3 ),\n\t\t\tsqrtu1 * Math.cos( u3 ),\n\t\t\tsqrt1u1 * Math.sin( u2 ),\n\t\t);\n\n\t}\n\n\tequals( quaternion ) {\n\n\t\treturn ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis._x = array[ offset ];\n\t\tthis._y = array[ offset + 1 ];\n\t\tthis._z = array[ offset + 2 ];\n\t\tthis._w = array[ offset + 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._w;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis._x = attribute.getX( index );\n\t\tthis._y = attribute.getY( index );\n\t\tthis._z = attribute.getZ( index );\n\t\tthis._w = attribute.getW( index );\n\n\t\treturn this;\n\n\t}\n\n\t_onChange( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t_onChangeCallback() {}\n\n}\n\nQuaternion.prototype.isQuaternion = true;\n\nexport { Quaternion };\n","import * as MathUtils from './MathUtils.js';\nimport { Quaternion } from './Quaternion.js';\n\nclass Vector3 {\n\n\tconstructor( x = 0, y = 0, z = 0 ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\n\t}\n\n\tset( x, y, z ) {\n\n\t\tif ( z === undefined ) z = this.z; // sprite.scale.set(x,y)\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\n\t\treturn this;\n\n\t}\n\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetZ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y, this.z );\n\n\t}\n\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\n\t\treturn this;\n\n\t}\n\n\tadd( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\treturn this.addVectors( v, w );\n\n\t\t}\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\n\t\treturn this;\n\n\t}\n\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\n\t\treturn this;\n\n\t}\n\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\n\t\treturn this;\n\n\t}\n\n\tsub( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\treturn this.subVectors( v, w );\n\n\t\t}\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\n\t\treturn this;\n\n\t}\n\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\n\t\treturn this;\n\n\t}\n\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' );\n\t\t\treturn this.multiplyVectors( v, w );\n\n\t\t}\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyVectors( a, b ) {\n\n\t\tthis.x = a.x * b.x;\n\t\tthis.y = a.y * b.y;\n\t\tthis.z = a.z * b.z;\n\n\t\treturn this;\n\n\t}\n\n\tapplyEuler( euler ) {\n\n\t\tif ( ! ( euler && euler.isEuler ) ) {\n\n\t\t\tconsole.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t}\n\n\t\treturn this.applyQuaternion( _quaternion.setFromEuler( euler ) );\n\n\t}\n\n\tapplyAxisAngle( axis, angle ) {\n\n\t\treturn this.applyQuaternion( _quaternion.setFromAxisAngle( axis, angle ) );\n\n\t}\n\n\tapplyMatrix3( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;\n\n\t\treturn this;\n\n\t}\n\n\tapplyNormalMatrix( m ) {\n\n\t\treturn this.applyMatrix3( m ).normalize();\n\n\t}\n\n\tapplyMatrix4( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tconst w = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] );\n\n\t\tthis.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * w;\n\t\tthis.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * w;\n\t\tthis.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * w;\n\n\t\treturn this;\n\n\t}\n\n\tapplyQuaternion( q ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst qx = q.x, qy = q.y, qz = q.z, qw = q.w;\n\n\t\t// calculate quat * vector\n\n\t\tconst ix = qw * x + qy * z - qz * y;\n\t\tconst iy = qw * y + qz * x - qx * z;\n\t\tconst iz = qw * z + qx * y - qy * x;\n\t\tconst iw = - qx * x - qy * y - qz * z;\n\n\t\t// calculate result * inverse quat\n\n\t\tthis.x = ix * qw + iw * - qx + iy * - qz - iz * - qy;\n\t\tthis.y = iy * qw + iw * - qy + iz * - qx - ix * - qz;\n\t\tthis.z = iz * qw + iw * - qz + ix * - qy - iy * - qx;\n\n\t\treturn this;\n\n\t}\n\n\tproject( camera ) {\n\n\t\treturn this.applyMatrix4( camera.matrixWorldInverse ).applyMatrix4( camera.projectionMatrix );\n\n\t}\n\n\tunproject( camera ) {\n\n\t\treturn this.applyMatrix4( camera.projectionMatrixInverse ).applyMatrix4( camera.matrixWorld );\n\n\t}\n\n\ttransformDirection( m ) {\n\n\t\t// input: THREE.Matrix4 affine matrix\n\t\t// vector interpreted as a direction\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;\n\n\t\treturn this.normalize();\n\n\t}\n\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\t\tthis.z /= v.z;\n\n\t\treturn this;\n\n\t}\n\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\n\t\treturn this;\n\n\t}\n\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\n\t\treturn this;\n\n\t}\n\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = Math.max( minVal, Math.min( maxVal, this.x ) );\n\t\tthis.y = Math.max( minVal, Math.min( maxVal, this.y ) );\n\t\tthis.z = Math.max( minVal, Math.min( maxVal, this.z ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t}\n\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\n\t\treturn this;\n\n\t}\n\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\n\t\treturn this;\n\n\t}\n\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\n\t\treturn this;\n\n\t}\n\n\troundToZero() {\n\n\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\n\n\t}\n\n\t// TODO lengthSquared?\n\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n\n\t}\n\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );\n\n\t}\n\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\t\tthis.z = v1.z + ( v2.z - v1.z ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tcross( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' );\n\t\t\treturn this.crossVectors( v, w );\n\n\t\t}\n\n\t\treturn this.crossVectors( this, v );\n\n\t}\n\n\tcrossVectors( a, b ) {\n\n\t\tconst ax = a.x, ay = a.y, az = a.z;\n\t\tconst bx = b.x, by = b.y, bz = b.z;\n\n\t\tthis.x = ay * bz - az * by;\n\t\tthis.y = az * bx - ax * bz;\n\t\tthis.z = ax * by - ay * bx;\n\n\t\treturn this;\n\n\t}\n\n\tprojectOnVector( v ) {\n\n\t\tconst denominator = v.lengthSq();\n\n\t\tif ( denominator === 0 ) return this.set( 0, 0, 0 );\n\n\t\tconst scalar = v.dot( this ) / denominator;\n\n\t\treturn this.copy( v ).multiplyScalar( scalar );\n\n\t}\n\n\tprojectOnPlane( planeNormal ) {\n\n\t\t_vector.copy( this ).projectOnVector( planeNormal );\n\n\t\treturn this.sub( _vector );\n\n\t}\n\n\treflect( normal ) {\n\n\t\t// reflect incident vector off plane orthogonal to normal\n\t\t// normal is assumed to have unit length\n\n\t\treturn this.sub( _vector.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );\n\n\t}\n\n\tangleTo( v ) {\n\n\t\tconst denominator = Math.sqrt( this.lengthSq() * v.lengthSq() );\n\n\t\tif ( denominator === 0 ) return Math.PI / 2;\n\n\t\tconst theta = this.dot( v ) / denominator;\n\n\t\t// clamp, to handle numerical problems\n\n\t\treturn Math.acos( MathUtils.clamp( theta, - 1, 1 ) );\n\n\t}\n\n\tdistanceTo( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t}\n\n\tdistanceToSquared( v ) {\n\n\t\tconst dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;\n\n\t\treturn dx * dx + dy * dy + dz * dz;\n\n\t}\n\n\tmanhattanDistanceTo( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z );\n\n\t}\n\n\tsetFromSpherical( s ) {\n\n\t\treturn this.setFromSphericalCoords( s.radius, s.phi, s.theta );\n\n\t}\n\n\tsetFromSphericalCoords( radius, phi, theta ) {\n\n\t\tconst sinPhiRadius = Math.sin( phi ) * radius;\n\n\t\tthis.x = sinPhiRadius * Math.sin( theta );\n\t\tthis.y = Math.cos( phi ) * radius;\n\t\tthis.z = sinPhiRadius * Math.cos( theta );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromCylindrical( c ) {\n\n\t\treturn this.setFromCylindricalCoords( c.radius, c.theta, c.y );\n\n\t}\n\n\tsetFromCylindricalCoords( radius, theta, y ) {\n\n\t\tthis.x = radius * Math.sin( theta );\n\t\tthis.y = y;\n\t\tthis.z = radius * Math.cos( theta );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrixPosition( m ) {\n\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 12 ];\n\t\tthis.y = e[ 13 ];\n\t\tthis.z = e[ 14 ];\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrixScale( m ) {\n\n\t\tconst sx = this.setFromMatrixColumn( m, 0 ).length();\n\t\tconst sy = this.setFromMatrixColumn( m, 1 ).length();\n\t\tconst sz = this.setFromMatrixColumn( m, 2 ).length();\n\n\t\tthis.x = sx;\n\t\tthis.y = sy;\n\t\tthis.z = sz;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrixColumn( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 4 );\n\n\t}\n\n\tsetFromMatrix3Column( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 3 );\n\n\t}\n\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index, offset ) {\n\n\t\tif ( offset !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: offset has been removed from .fromBufferAttribute().' );\n\n\t\t}\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\n\t\treturn this;\n\n\t}\n\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\trandomDirection() {\n\n\t\t// Derived from https://mathworld.wolfram.com/SpherePointPicking.html\n\n\t\tconst u = ( Math.random() - 0.5 ) * 2;\n\t\tconst t = Math.random() * Math.PI * 2;\n\t\tconst f = Math.sqrt( 1 - u ** 2 );\n\n\t\tthis.x = f * Math.cos( t );\n\t\tthis.y = f * Math.sin( t );\n\t\tthis.z = u;\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\t\tyield this.z;\n\n\t}\n\n}\n\nVector3.prototype.isVector3 = true;\n\nconst _vector = /*@__PURE__*/ new Vector3();\nconst _quaternion = /*@__PURE__*/ new Quaternion();\n\nexport { Vector3 };\n","import { Vector3 } from './Vector3.js';\n\nclass Matrix4 {\n\n\tconstructor() {\n\n\t\tthis.elements = [\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t];\n\n\t\tif ( arguments.length > 0 ) {\n\n\t\t\tconsole.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' );\n\n\t\t}\n\n\t}\n\n\tset( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14;\n\t\tte[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24;\n\t\tte[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34;\n\t\tte[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44;\n\n\t\treturn this;\n\n\t}\n\n\tidentity() {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new Matrix4().fromArray( this.elements );\n\n\t}\n\n\tcopy( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; te[ 3 ] = me[ 3 ];\n\t\tte[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ];\n\t\tte[ 8 ] = me[ 8 ]; te[ 9 ] = me[ 9 ]; te[ 10 ] = me[ 10 ]; te[ 11 ] = me[ 11 ];\n\t\tte[ 12 ] = me[ 12 ]; te[ 13 ] = me[ 13 ]; te[ 14 ] = me[ 14 ]; te[ 15 ] = me[ 15 ];\n\n\t\treturn this;\n\n\t}\n\n\tcopyPosition( m ) {\n\n\t\tconst te = this.elements, me = m.elements;\n\n\t\tte[ 12 ] = me[ 12 ];\n\t\tte[ 13 ] = me[ 13 ];\n\t\tte[ 14 ] = me[ 14 ];\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrix3( m ) {\n\n\t\tconst me = m.elements;\n\n\t\tthis.set(\n\n\t\t\tme[ 0 ], me[ 3 ], me[ 6 ], 0,\n\t\t\tme[ 1 ], me[ 4 ], me[ 7 ], 0,\n\t\t\tme[ 2 ], me[ 5 ], me[ 8 ], 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\textractBasis( xAxis, yAxis, zAxis ) {\n\n\t\txAxis.setFromMatrixColumn( this, 0 );\n\t\tyAxis.setFromMatrixColumn( this, 1 );\n\t\tzAxis.setFromMatrixColumn( this, 2 );\n\n\t\treturn this;\n\n\t}\n\n\tmakeBasis( xAxis, yAxis, zAxis ) {\n\n\t\tthis.set(\n\t\t\txAxis.x, yAxis.x, zAxis.x, 0,\n\t\t\txAxis.y, yAxis.y, zAxis.y, 0,\n\t\t\txAxis.z, yAxis.z, zAxis.z, 0,\n\t\t\t0, 0, 0, 1\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\textractRotation( m ) {\n\n\t\t// this method does not support reflection matrices\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tconst scaleX = 1 / _v1.setFromMatrixColumn( m, 0 ).length();\n\t\tconst scaleY = 1 / _v1.setFromMatrixColumn( m, 1 ).length();\n\t\tconst scaleZ = 1 / _v1.setFromMatrixColumn( m, 2 ).length();\n\n\t\tte[ 0 ] = me[ 0 ] * scaleX;\n\t\tte[ 1 ] = me[ 1 ] * scaleX;\n\t\tte[ 2 ] = me[ 2 ] * scaleX;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = me[ 4 ] * scaleY;\n\t\tte[ 5 ] = me[ 5 ] * scaleY;\n\t\tte[ 6 ] = me[ 6 ] * scaleY;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = me[ 8 ] * scaleZ;\n\t\tte[ 9 ] = me[ 9 ] * scaleZ;\n\t\tte[ 10 ] = me[ 10 ] * scaleZ;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationFromEuler( euler ) {\n\n\t\tif ( ! ( euler && euler.isEuler ) ) {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' );\n\n\t\t}\n\n\t\tconst te = this.elements;\n\n\t\tconst x = euler.x, y = euler.y, z = euler.z;\n\t\tconst a = Math.cos( x ), b = Math.sin( x );\n\t\tconst c = Math.cos( y ), d = Math.sin( y );\n\t\tconst e = Math.cos( z ), f = Math.sin( z );\n\n\t\tif ( euler.order === 'XYZ' ) {\n\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - c * f;\n\t\t\tte[ 8 ] = d;\n\n\t\t\tte[ 1 ] = af + be * d;\n\t\t\tte[ 5 ] = ae - bf * d;\n\t\t\tte[ 9 ] = - b * c;\n\n\t\t\tte[ 2 ] = bf - ae * d;\n\t\t\tte[ 6 ] = be + af * d;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YXZ' ) {\n\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce + df * b;\n\t\t\tte[ 4 ] = de * b - cf;\n\t\t\tte[ 8 ] = a * d;\n\n\t\t\tte[ 1 ] = a * f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b;\n\n\t\t\tte[ 2 ] = cf * b - de;\n\t\t\tte[ 6 ] = df + ce * b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZXY' ) {\n\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce - df * b;\n\t\t\tte[ 4 ] = - a * f;\n\t\t\tte[ 8 ] = de + cf * b;\n\n\t\t\tte[ 1 ] = cf + de * b;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = df - ce * b;\n\n\t\t\tte[ 2 ] = - a * d;\n\t\t\tte[ 6 ] = b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZYX' ) {\n\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = be * d - af;\n\t\t\tte[ 8 ] = ae * d + bf;\n\n\t\t\tte[ 1 ] = c * f;\n\t\t\tte[ 5 ] = bf * d + ae;\n\t\t\tte[ 9 ] = af * d - be;\n\n\t\t\tte[ 2 ] = - d;\n\t\t\tte[ 6 ] = b * c;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YZX' ) {\n\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = bd - ac * f;\n\t\t\tte[ 8 ] = bc * f + ad;\n\n\t\t\tte[ 1 ] = f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b * e;\n\n\t\t\tte[ 2 ] = - d * e;\n\t\t\tte[ 6 ] = ad * f + bc;\n\t\t\tte[ 10 ] = ac - bd * f;\n\n\t\t} else if ( euler.order === 'XZY' ) {\n\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - f;\n\t\t\tte[ 8 ] = d * e;\n\n\t\t\tte[ 1 ] = ac * f + bd;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = ad * f - bc;\n\n\t\t\tte[ 2 ] = bc * f - ad;\n\t\t\tte[ 6 ] = b * e;\n\t\t\tte[ 10 ] = bd * f + ac;\n\n\t\t}\n\n\t\t// bottom row\n\t\tte[ 3 ] = 0;\n\t\tte[ 7 ] = 0;\n\t\tte[ 11 ] = 0;\n\n\t\t// last column\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationFromQuaternion( q ) {\n\n\t\treturn this.compose( _zero, q, _one );\n\n\t}\n\n\tlookAt( eye, target, up ) {\n\n\t\tconst te = this.elements;\n\n\t\t_z.subVectors( eye, target );\n\n\t\tif ( _z.lengthSq() === 0 ) {\n\n\t\t\t// eye and target are in the same position\n\n\t\t\t_z.z = 1;\n\n\t\t}\n\n\t\t_z.normalize();\n\t\t_x.crossVectors( up, _z );\n\n\t\tif ( _x.lengthSq() === 0 ) {\n\n\t\t\t// up and z are parallel\n\n\t\t\tif ( Math.abs( up.z ) === 1 ) {\n\n\t\t\t\t_z.x += 0.0001;\n\n\t\t\t} else {\n\n\t\t\t\t_z.z += 0.0001;\n\n\t\t\t}\n\n\t\t\t_z.normalize();\n\t\t\t_x.crossVectors( up, _z );\n\n\t\t}\n\n\t\t_x.normalize();\n\t\t_y.crossVectors( _z, _x );\n\n\t\tte[ 0 ] = _x.x; te[ 4 ] = _y.x; te[ 8 ] = _z.x;\n\t\tte[ 1 ] = _x.y; te[ 5 ] = _y.y; te[ 9 ] = _z.y;\n\t\tte[ 2 ] = _x.z; te[ 6 ] = _y.z; te[ 10 ] = _z.z;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( m, n ) {\n\n\t\tif ( n !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' );\n\t\t\treturn this.multiplyMatrices( m, n );\n\n\t\t}\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t}\n\n\tpremultiply( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t}\n\n\tmultiplyMatrices( a, b ) {\n\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];\n\t\tconst a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];\n\t\tconst a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];\n\t\tconst a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];\n\n\t\tconst b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];\n\t\tconst b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];\n\t\tconst b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];\n\t\tconst b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n\t\tte[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n\t\tte[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n\t\tte[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n\t\tte[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n\t\tte[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n\t\tte[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n\t\tte[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n\t\tte[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n\t\tte[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n\n\t\tte[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n\t\tte[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n\t\tte[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n\t\tte[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( s ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s;\n\t\tte[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s;\n\t\tte[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s;\n\t\tte[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s;\n\n\t\treturn this;\n\n\t}\n\n\tdeterminant() {\n\n\t\tconst te = this.elements;\n\n\t\tconst n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];\n\t\tconst n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];\n\t\tconst n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];\n\t\tconst n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];\n\n\t\t//TODO: make this more efficient\n\t\t//( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )\n\n\t\treturn (\n\t\t\tn41 * (\n\t\t\t\t+ n14 * n23 * n32\n\t\t\t\t - n13 * n24 * n32\n\t\t\t\t - n14 * n22 * n33\n\t\t\t\t + n12 * n24 * n33\n\t\t\t\t + n13 * n22 * n34\n\t\t\t\t - n12 * n23 * n34\n\t\t\t) +\n\t\t\tn42 * (\n\t\t\t\t+ n11 * n23 * n34\n\t\t\t\t - n11 * n24 * n33\n\t\t\t\t + n14 * n21 * n33\n\t\t\t\t - n13 * n21 * n34\n\t\t\t\t + n13 * n24 * n31\n\t\t\t\t - n14 * n23 * n31\n\t\t\t) +\n\t\t\tn43 * (\n\t\t\t\t+ n11 * n24 * n32\n\t\t\t\t - n11 * n22 * n34\n\t\t\t\t - n14 * n21 * n32\n\t\t\t\t + n12 * n21 * n34\n\t\t\t\t + n14 * n22 * n31\n\t\t\t\t - n12 * n24 * n31\n\t\t\t) +\n\t\t\tn44 * (\n\t\t\t\t- n13 * n22 * n31\n\t\t\t\t - n11 * n23 * n32\n\t\t\t\t + n11 * n22 * n33\n\t\t\t\t + n13 * n21 * n32\n\t\t\t\t - n12 * n21 * n33\n\t\t\t\t + n12 * n23 * n31\n\t\t\t)\n\n\t\t);\n\n\t}\n\n\ttranspose() {\n\n\t\tconst te = this.elements;\n\t\tlet tmp;\n\n\t\ttmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;\n\t\ttmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;\n\t\ttmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;\n\n\t\ttmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;\n\t\ttmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;\n\t\ttmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;\n\n\t\treturn this;\n\n\t}\n\n\tsetPosition( x, y, z ) {\n\n\t\tconst te = this.elements;\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\tte[ 12 ] = x.x;\n\t\t\tte[ 13 ] = x.y;\n\t\t\tte[ 14 ] = x.z;\n\n\t\t} else {\n\n\t\t\tte[ 12 ] = x;\n\t\t\tte[ 13 ] = y;\n\t\t\tte[ 14 ] = z;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tinvert() {\n\n\t\t// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ], n41 = te[ 3 ],\n\t\t\tn12 = te[ 4 ], n22 = te[ 5 ], n32 = te[ 6 ], n42 = te[ 7 ],\n\t\t\tn13 = te[ 8 ], n23 = te[ 9 ], n33 = te[ 10 ], n43 = te[ 11 ],\n\t\t\tn14 = te[ 12 ], n24 = te[ 13 ], n34 = te[ 14 ], n44 = te[ 15 ],\n\n\t\t\tt11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,\n\t\t\tt12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,\n\t\t\tt13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,\n\t\t\tt14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;\n\n\t\tconst det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\n\t\tif ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;\n\t\tte[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;\n\t\tte[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv;\n\n\t\tte[ 4 ] = t12 * detInv;\n\t\tte[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;\n\t\tte[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;\n\t\tte[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv;\n\n\t\tte[ 8 ] = t13 * detInv;\n\t\tte[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;\n\t\tte[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;\n\t\tte[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv;\n\n\t\tte[ 12 ] = t14 * detInv;\n\t\tte[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;\n\t\tte[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;\n\t\tte[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv;\n\n\t\treturn this;\n\n\t}\n\n\tscale( v ) {\n\n\t\tconst te = this.elements;\n\t\tconst x = v.x, y = v.y, z = v.z;\n\n\t\tte[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z;\n\t\tte[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z;\n\t\tte[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z;\n\t\tte[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z;\n\n\t\treturn this;\n\n\t}\n\n\tgetMaxScaleOnAxis() {\n\n\t\tconst te = this.elements;\n\n\t\tconst scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];\n\t\tconst scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];\n\t\tconst scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];\n\n\t\treturn Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) );\n\n\t}\n\n\tmakeTranslation( x, y, z ) {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, x,\n\t\t\t0, 1, 0, y,\n\t\t\t0, 0, 1, z,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationX( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, c, - s, 0,\n\t\t\t0, s, c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationY( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t c, 0, s, 0,\n\t\t\t 0, 1, 0, 0,\n\t\t\t- s, 0, c, 0,\n\t\t\t 0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationZ( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\tc, - s, 0, 0,\n\t\t\ts, c, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationAxis( axis, angle ) {\n\n\t\t// Based on http://www.gamedev.net/reference/articles/article1199.asp\n\n\t\tconst c = Math.cos( angle );\n\t\tconst s = Math.sin( angle );\n\t\tconst t = 1 - c;\n\t\tconst x = axis.x, y = axis.y, z = axis.z;\n\t\tconst tx = t * x, ty = t * y;\n\n\t\tthis.set(\n\n\t\t\ttx * x + c, tx * y - s * z, tx * z + s * y, 0,\n\t\t\ttx * y + s * z, ty * y + c, ty * z - s * x, 0,\n\t\t\ttx * z - s * y, ty * z + s * x, t * z * z + c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeScale( x, y, z ) {\n\n\t\tthis.set(\n\n\t\t\tx, 0, 0, 0,\n\t\t\t0, y, 0, 0,\n\t\t\t0, 0, z, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeShear( xy, xz, yx, yz, zx, zy ) {\n\n\t\tthis.set(\n\n\t\t\t1, yx, zx, 0,\n\t\t\txy, 1, zy, 0,\n\t\t\txz, yz, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tcompose( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w;\n\t\tconst x2 = x + x,\ty2 = y + y, z2 = z + z;\n\t\tconst xx = x * x2, xy = x * y2, xz = x * z2;\n\t\tconst yy = y * y2, yz = y * z2, zz = z * z2;\n\t\tconst wx = w * x2, wy = w * y2, wz = w * z2;\n\n\t\tconst sx = scale.x, sy = scale.y, sz = scale.z;\n\n\t\tte[ 0 ] = ( 1 - ( yy + zz ) ) * sx;\n\t\tte[ 1 ] = ( xy + wz ) * sx;\n\t\tte[ 2 ] = ( xz - wy ) * sx;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = ( xy - wz ) * sy;\n\t\tte[ 5 ] = ( 1 - ( xx + zz ) ) * sy;\n\t\tte[ 6 ] = ( yz + wx ) * sy;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = ( xz + wy ) * sz;\n\t\tte[ 9 ] = ( yz - wx ) * sz;\n\t\tte[ 10 ] = ( 1 - ( xx + yy ) ) * sz;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = position.x;\n\t\tte[ 13 ] = position.y;\n\t\tte[ 14 ] = position.z;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tdecompose( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tlet sx = _v1.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();\n\t\tconst sy = _v1.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();\n\t\tconst sz = _v1.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();\n\n\t\t// if determine is negative, we need to invert one scale\n\t\tconst det = this.determinant();\n\t\tif ( det < 0 ) sx = - sx;\n\n\t\tposition.x = te[ 12 ];\n\t\tposition.y = te[ 13 ];\n\t\tposition.z = te[ 14 ];\n\n\t\t// scale the rotation part\n\t\t_m1.copy( this );\n\n\t\tconst invSX = 1 / sx;\n\t\tconst invSY = 1 / sy;\n\t\tconst invSZ = 1 / sz;\n\n\t\t_m1.elements[ 0 ] *= invSX;\n\t\t_m1.elements[ 1 ] *= invSX;\n\t\t_m1.elements[ 2 ] *= invSX;\n\n\t\t_m1.elements[ 4 ] *= invSY;\n\t\t_m1.elements[ 5 ] *= invSY;\n\t\t_m1.elements[ 6 ] *= invSY;\n\n\t\t_m1.elements[ 8 ] *= invSZ;\n\t\t_m1.elements[ 9 ] *= invSZ;\n\t\t_m1.elements[ 10 ] *= invSZ;\n\n\t\tquaternion.setFromRotationMatrix( _m1 );\n\n\t\tscale.x = sx;\n\t\tscale.y = sy;\n\t\tscale.z = sz;\n\n\t\treturn this;\n\n\t}\n\n\tmakePerspective( left, right, top, bottom, near, far ) {\n\n\t\tif ( far === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.' );\n\n\t\t}\n\n\t\tconst te = this.elements;\n\t\tconst x = 2 * near / ( right - left );\n\t\tconst y = 2 * near / ( top - bottom );\n\n\t\tconst a = ( right + left ) / ( right - left );\n\t\tconst b = ( top + bottom ) / ( top - bottom );\n\t\tconst c = - ( far + near ) / ( far - near );\n\t\tconst d = - 2 * far * near / ( far - near );\n\n\t\tte[ 0 ] = x;\tte[ 4 ] = 0;\tte[ 8 ] = a;\tte[ 12 ] = 0;\n\t\tte[ 1 ] = 0;\tte[ 5 ] = y;\tte[ 9 ] = b;\tte[ 13 ] = 0;\n\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = c;\tte[ 14 ] = d;\n\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = - 1;\tte[ 15 ] = 0;\n\n\t\treturn this;\n\n\t}\n\n\tmakeOrthographic( left, right, top, bottom, near, far ) {\n\n\t\tconst te = this.elements;\n\t\tconst w = 1.0 / ( right - left );\n\t\tconst h = 1.0 / ( top - bottom );\n\t\tconst p = 1.0 / ( far - near );\n\n\t\tconst x = ( right + left ) * w;\n\t\tconst y = ( top + bottom ) * h;\n\t\tconst z = ( far + near ) * p;\n\n\t\tte[ 0 ] = 2 * w;\tte[ 4 ] = 0;\tte[ 8 ] = 0;\tte[ 12 ] = - x;\n\t\tte[ 1 ] = 0;\tte[ 5 ] = 2 * h;\tte[ 9 ] = 0;\tte[ 13 ] = - y;\n\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = - 2 * p;\tte[ 14 ] = - z;\n\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = 0;\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tequals( matrix ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\t\tarray[ offset + 9 ] = te[ 9 ];\n\t\tarray[ offset + 10 ] = te[ 10 ];\n\t\tarray[ offset + 11 ] = te[ 11 ];\n\n\t\tarray[ offset + 12 ] = te[ 12 ];\n\t\tarray[ offset + 13 ] = te[ 13 ];\n\t\tarray[ offset + 14 ] = te[ 14 ];\n\t\tarray[ offset + 15 ] = te[ 15 ];\n\n\t\treturn array;\n\n\t}\n\n}\n\nMatrix4.prototype.isMatrix4 = true;\n\nconst _v1 = /*@__PURE__*/ new Vector3();\nconst _m1 = /*@__PURE__*/ new Matrix4();\nconst _zero = /*@__PURE__*/ new Vector3( 0, 0, 0 );\nconst _one = /*@__PURE__*/ new Vector3( 1, 1, 1 );\nconst _x = /*@__PURE__*/ new Vector3();\nconst _y = /*@__PURE__*/ new Vector3();\nconst _z = /*@__PURE__*/ new Vector3();\n\nexport { Matrix4 };\n","import { Quaternion } from './Quaternion.js';\nimport { Vector3 } from './Vector3.js';\nimport { Matrix4 } from './Matrix4.js';\nimport { clamp } from './MathUtils.js';\n\nconst _matrix = /*@__PURE__*/ new Matrix4();\nconst _quaternion = /*@__PURE__*/ new Quaternion();\n\nclass Euler {\n\n\tconstructor( x = 0, y = 0, z = 0, order = Euler.DefaultOrder ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\n\t}\n\n\tget x() {\n\n\t\treturn this._x;\n\n\t}\n\n\tset x( value ) {\n\n\t\tthis._x = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget y() {\n\n\t\treturn this._y;\n\n\t}\n\n\tset y( value ) {\n\n\t\tthis._y = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget z() {\n\n\t\treturn this._z;\n\n\t}\n\n\tset z( value ) {\n\n\t\tthis._z = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget order() {\n\n\t\treturn this._order;\n\n\t}\n\n\tset order( value ) {\n\n\t\tthis._order = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tset( x, y, z, order = this._order ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._order );\n\n\t}\n\n\tcopy( euler ) {\n\n\t\tthis._x = euler._x;\n\t\tthis._y = euler._y;\n\t\tthis._z = euler._z;\n\t\tthis._order = euler._order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromRotationMatrix( m, order = this._order, update = true ) {\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tconst te = m.elements;\n\t\tconst m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];\n\t\tconst m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];\n\t\tconst m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\n\t\t\t\tthis._y = Math.asin( clamp( m13, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m13 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\n\t\t\t\tthis._x = Math.asin( - clamp( m23, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m23 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\n\t\t\t\tthis._x = Math.asin( clamp( m32, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m32 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = 0;\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\n\t\t\t\tthis._y = Math.asin( - clamp( m31, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m31 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\n\t\t\t\tthis._z = Math.asin( clamp( m21, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m21 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m22 );\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\n\t\t\t\tthis._z = Math.asin( - clamp( m12, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m12 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._y = Math.atan2( m13, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._y = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tconsole.warn( 'THREE.Euler: .setFromRotationMatrix() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tthis._order = order;\n\n\t\tif ( update === true ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromQuaternion( q, order, update ) {\n\n\t\t_matrix.makeRotationFromQuaternion( q );\n\n\t\treturn this.setFromRotationMatrix( _matrix, order, update );\n\n\t}\n\n\tsetFromVector3( v, order = this._order ) {\n\n\t\treturn this.set( v.x, v.y, v.z, order );\n\n\t}\n\n\treorder( newOrder ) {\n\n\t\t// WARNING: this discards revolution information -bhouston\n\n\t\t_quaternion.setFromEuler( this );\n\n\t\treturn this.setFromQuaternion( _quaternion, newOrder );\n\n\t}\n\n\tequals( euler ) {\n\n\t\treturn ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );\n\n\t}\n\n\tfromArray( array ) {\n\n\t\tthis._x = array[ 0 ];\n\t\tthis._y = array[ 1 ];\n\t\tthis._z = array[ 2 ];\n\t\tif ( array[ 3 ] !== undefined ) this._order = array[ 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._order;\n\n\t\treturn array;\n\n\t}\n\n\ttoVector3( optionalResult ) {\n\n\t\tif ( optionalResult ) {\n\n\t\t\treturn optionalResult.set( this._x, this._y, this._z );\n\n\t\t} else {\n\n\t\t\treturn new Vector3( this._x, this._y, this._z );\n\n\t\t}\n\n\t}\n\n\t_onChange( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t_onChangeCallback() {}\n\n}\n\nEuler.prototype.isEuler = true;\n\nEuler.DefaultOrder = 'XYZ';\nEuler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ];\n\nexport { Euler };\n","class Layers {\n\n\tconstructor() {\n\n\t\tthis.mask = 1 | 0;\n\n\t}\n\n\tset( channel ) {\n\n\t\tthis.mask = ( 1 << channel | 0 ) >>> 0;\n\n\t}\n\n\tenable( channel ) {\n\n\t\tthis.mask |= 1 << channel | 0;\n\n\t}\n\n\tenableAll() {\n\n\t\tthis.mask = 0xffffffff | 0;\n\n\t}\n\n\ttoggle( channel ) {\n\n\t\tthis.mask ^= 1 << channel | 0;\n\n\t}\n\n\tdisable( channel ) {\n\n\t\tthis.mask &= ~ ( 1 << channel | 0 );\n\n\t}\n\n\tdisableAll() {\n\n\t\tthis.mask = 0;\n\n\t}\n\n\ttest( layers ) {\n\n\t\treturn ( this.mask & layers.mask ) !== 0;\n\n\t}\n\n\tisEnabled( channel ) {\n\n\t\treturn ( this.mask & ( 1 << channel | 0 ) ) !== 0;\n\n\t}\n\n}\n\n\nexport { Layers };\n","class Matrix3 {\n\n\tconstructor() {\n\n\t\tthis.elements = [\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t];\n\n\t\tif ( arguments.length > 0 ) {\n\n\t\t\tconsole.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' );\n\n\t\t}\n\n\t}\n\n\tset( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31;\n\t\tte[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32;\n\t\tte[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33;\n\n\t\treturn this;\n\n\t}\n\n\tidentity() {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tcopy( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ];\n\t\tte[ 3 ] = me[ 3 ]; te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ];\n\t\tte[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; te[ 8 ] = me[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\textractBasis( xAxis, yAxis, zAxis ) {\n\n\t\txAxis.setFromMatrix3Column( this, 0 );\n\t\tyAxis.setFromMatrix3Column( this, 1 );\n\t\tzAxis.setFromMatrix3Column( this, 2 );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrix4( m ) {\n\n\t\tconst me = m.elements;\n\n\t\tthis.set(\n\n\t\t\tme[ 0 ], me[ 4 ], me[ 8 ],\n\t\t\tme[ 1 ], me[ 5 ], me[ 9 ],\n\t\t\tme[ 2 ], me[ 6 ], me[ 10 ]\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( m ) {\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t}\n\n\tpremultiply( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t}\n\n\tmultiplyMatrices( a, b ) {\n\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[ 0 ], a12 = ae[ 3 ], a13 = ae[ 6 ];\n\t\tconst a21 = ae[ 1 ], a22 = ae[ 4 ], a23 = ae[ 7 ];\n\t\tconst a31 = ae[ 2 ], a32 = ae[ 5 ], a33 = ae[ 8 ];\n\n\t\tconst b11 = be[ 0 ], b12 = be[ 3 ], b13 = be[ 6 ];\n\t\tconst b21 = be[ 1 ], b22 = be[ 4 ], b23 = be[ 7 ];\n\t\tconst b31 = be[ 2 ], b32 = be[ 5 ], b33 = be[ 8 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31;\n\t\tte[ 3 ] = a11 * b12 + a12 * b22 + a13 * b32;\n\t\tte[ 6 ] = a11 * b13 + a12 * b23 + a13 * b33;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31;\n\t\tte[ 4 ] = a21 * b12 + a22 * b22 + a23 * b32;\n\t\tte[ 7 ] = a21 * b13 + a22 * b23 + a23 * b33;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31;\n\t\tte[ 5 ] = a31 * b12 + a32 * b22 + a33 * b32;\n\t\tte[ 8 ] = a31 * b13 + a32 * b23 + a33 * b33;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( s ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s;\n\t\tte[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s;\n\t\tte[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s;\n\n\t\treturn this;\n\n\t}\n\n\tdeterminant() {\n\n\t\tconst te = this.elements;\n\n\t\tconst a = te[ 0 ], b = te[ 1 ], c = te[ 2 ],\n\t\t\td = te[ 3 ], e = te[ 4 ], f = te[ 5 ],\n\t\t\tg = te[ 6 ], h = te[ 7 ], i = te[ 8 ];\n\n\t\treturn a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;\n\n\t}\n\n\tinvert() {\n\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ],\n\t\t\tn12 = te[ 3 ], n22 = te[ 4 ], n32 = te[ 5 ],\n\t\t\tn13 = te[ 6 ], n23 = te[ 7 ], n33 = te[ 8 ],\n\n\t\t\tt11 = n33 * n22 - n32 * n23,\n\t\t\tt12 = n32 * n13 - n33 * n12,\n\t\t\tt13 = n23 * n12 - n22 * n13,\n\n\t\t\tdet = n11 * t11 + n21 * t12 + n31 * t13;\n\n\t\tif ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0 );\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv;\n\t\tte[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv;\n\n\t\tte[ 3 ] = t12 * detInv;\n\t\tte[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv;\n\t\tte[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv;\n\n\t\tte[ 6 ] = t13 * detInv;\n\t\tte[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv;\n\t\tte[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv;\n\n\t\treturn this;\n\n\t}\n\n\ttranspose() {\n\n\t\tlet tmp;\n\t\tconst m = this.elements;\n\n\t\ttmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp;\n\t\ttmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp;\n\t\ttmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp;\n\n\t\treturn this;\n\n\t}\n\n\tgetNormalMatrix( matrix4 ) {\n\n\t\treturn this.setFromMatrix4( matrix4 ).invert().transpose();\n\n\t}\n\n\ttransposeIntoArray( r ) {\n\n\t\tconst m = this.elements;\n\n\t\tr[ 0 ] = m[ 0 ];\n\t\tr[ 1 ] = m[ 3 ];\n\t\tr[ 2 ] = m[ 6 ];\n\t\tr[ 3 ] = m[ 1 ];\n\t\tr[ 4 ] = m[ 4 ];\n\t\tr[ 5 ] = m[ 7 ];\n\t\tr[ 6 ] = m[ 2 ];\n\t\tr[ 7 ] = m[ 5 ];\n\t\tr[ 8 ] = m[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\tsetUvTransform( tx, ty, sx, sy, rotation, cx, cy ) {\n\n\t\tconst c = Math.cos( rotation );\n\t\tconst s = Math.sin( rotation );\n\n\t\tthis.set(\n\t\t\tsx * c, sx * s, - sx * ( c * cx + s * cy ) + cx + tx,\n\t\t\t- sy * s, sy * c, - sy * ( - s * cx + c * cy ) + cy + ty,\n\t\t\t0, 0, 1\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tscale( sx, sy ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= sx; te[ 3 ] *= sx; te[ 6 ] *= sx;\n\t\tte[ 1 ] *= sy; te[ 4 ] *= sy; te[ 7 ] *= sy;\n\n\t\treturn this;\n\n\t}\n\n\trotate( theta ) {\n\n\t\tconst c = Math.cos( theta );\n\t\tconst s = Math.sin( theta );\n\n\t\tconst te = this.elements;\n\n\t\tconst a11 = te[ 0 ], a12 = te[ 3 ], a13 = te[ 6 ];\n\t\tconst a21 = te[ 1 ], a22 = te[ 4 ], a23 = te[ 7 ];\n\n\t\tte[ 0 ] = c * a11 + s * a21;\n\t\tte[ 3 ] = c * a12 + s * a22;\n\t\tte[ 6 ] = c * a13 + s * a23;\n\n\t\tte[ 1 ] = - s * a11 + c * a21;\n\t\tte[ 4 ] = - s * a12 + c * a22;\n\t\tte[ 7 ] = - s * a13 + c * a23;\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( tx, ty ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] += tx * te[ 2 ]; te[ 3 ] += tx * te[ 5 ]; te[ 6 ] += tx * te[ 8 ];\n\t\tte[ 1 ] += ty * te[ 2 ]; te[ 4 ] += ty * te[ 5 ]; te[ 7 ] += ty * te[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\tequals( matrix ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\n\t\treturn array;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().fromArray( this.elements );\n\n\t}\n\n}\n\nMatrix3.prototype.isMatrix3 = true;\n\nexport { Matrix3 };\n","import { Quaternion } from '../math/Quaternion.js';\nimport { Vector3 } from '../math/Vector3.js';\nimport { Matrix4 } from '../math/Matrix4.js';\nimport { EventDispatcher } from './EventDispatcher.js';\nimport { Euler } from '../math/Euler.js';\nimport { Layers } from './Layers.js';\nimport { Matrix3 } from '../math/Matrix3.js';\nimport * as MathUtils from '../math/MathUtils.js';\n\nlet _object3DId = 0;\n\nconst _v1 = /*@__PURE__*/ new Vector3();\nconst _q1 = /*@__PURE__*/ new Quaternion();\nconst _m1 = /*@__PURE__*/ new Matrix4();\nconst _target = /*@__PURE__*/ new Vector3();\n\nconst _position = /*@__PURE__*/ new Vector3();\nconst _scale = /*@__PURE__*/ new Vector3();\nconst _quaternion = /*@__PURE__*/ new Quaternion();\n\nconst _xAxis = /*@__PURE__*/ new Vector3( 1, 0, 0 );\nconst _yAxis = /*@__PURE__*/ new Vector3( 0, 1, 0 );\nconst _zAxis = /*@__PURE__*/ new Vector3( 0, 0, 1 );\n\nconst _addedEvent = { type: 'added' };\nconst _removedEvent = { type: 'removed' };\n\nclass Object3D extends EventDispatcher {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tObject.defineProperty( this, 'id', { value: _object3DId ++ } );\n\n\t\tthis.uuid = MathUtils.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Object3D';\n\n\t\tthis.parent = null;\n\t\tthis.children = [];\n\n\t\tthis.up = Object3D.DefaultUp.clone();\n\n\t\tconst position = new Vector3();\n\t\tconst rotation = new Euler();\n\t\tconst quaternion = new Quaternion();\n\t\tconst scale = new Vector3( 1, 1, 1 );\n\n\t\tfunction onRotationChange() {\n\n\t\t\tquaternion.setFromEuler( rotation, false );\n\n\t\t}\n\n\t\tfunction onQuaternionChange() {\n\n\t\t\trotation.setFromQuaternion( quaternion, undefined, false );\n\n\t\t}\n\n\t\trotation._onChange( onRotationChange );\n\t\tquaternion._onChange( onQuaternionChange );\n\n\t\tObject.defineProperties( this, {\n\t\t\tposition: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: position\n\t\t\t},\n\t\t\trotation: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: rotation\n\t\t\t},\n\t\t\tquaternion: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: quaternion\n\t\t\t},\n\t\t\tscale: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: scale\n\t\t\t},\n\t\t\tmodelViewMatrix: {\n\t\t\t\tvalue: new Matrix4()\n\t\t\t},\n\t\t\tnormalMatrix: {\n\t\t\t\tvalue: new Matrix3()\n\t\t\t}\n\t\t} );\n\n\t\tthis.matrix = new Matrix4();\n\t\tthis.matrixWorld = new Matrix4();\n\n\t\tthis.matrixAutoUpdate = Object3D.DefaultMatrixAutoUpdate;\n\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\tthis.layers = new Layers();\n\t\tthis.visible = true;\n\n\t\tthis.castShadow = false;\n\t\tthis.receiveShadow = false;\n\n\t\tthis.frustumCulled = true;\n\t\tthis.renderOrder = 0;\n\n\t\tthis.animations = [];\n\n\t\tthis.userData = {};\n\n\t}\n\n\tonBeforeRender( /* renderer, scene, camera, geometry, material, group */ ) {}\n\n\tonAfterRender( /* renderer, scene, camera, geometry, material, group */ ) {}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tthis.matrix.premultiply( matrix );\n\n\t\tthis.matrix.decompose( this.position, this.quaternion, this.scale );\n\n\t}\n\n\tapplyQuaternion( q ) {\n\n\t\tthis.quaternion.premultiply( q );\n\n\t\treturn this;\n\n\t}\n\n\tsetRotationFromAxisAngle( axis, angle ) {\n\n\t\t// assumes axis is normalized\n\n\t\tthis.quaternion.setFromAxisAngle( axis, angle );\n\n\t}\n\n\tsetRotationFromEuler( euler ) {\n\n\t\tthis.quaternion.setFromEuler( euler, true );\n\n\t}\n\n\tsetRotationFromMatrix( m ) {\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tthis.quaternion.setFromRotationMatrix( m );\n\n\t}\n\n\tsetRotationFromQuaternion( q ) {\n\n\t\t// assumes q is normalized\n\n\t\tthis.quaternion.copy( q );\n\n\t}\n\n\trotateOnAxis( axis, angle ) {\n\n\t\t// rotate object on axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\t_q1.setFromAxisAngle( axis, angle );\n\n\t\tthis.quaternion.multiply( _q1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateOnWorldAxis( axis, angle ) {\n\n\t\t// rotate object on axis in world space\n\t\t// axis is assumed to be normalized\n\t\t// method assumes no rotated parent\n\n\t\t_q1.setFromAxisAngle( axis, angle );\n\n\t\tthis.quaternion.premultiply( _q1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateX( angle ) {\n\n\t\treturn this.rotateOnAxis( _xAxis, angle );\n\n\t}\n\n\trotateY( angle ) {\n\n\t\treturn this.rotateOnAxis( _yAxis, angle );\n\n\t}\n\n\trotateZ( angle ) {\n\n\t\treturn this.rotateOnAxis( _zAxis, angle );\n\n\t}\n\n\ttranslateOnAxis( axis, distance ) {\n\n\t\t// translate object by distance along axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\t_v1.copy( axis ).applyQuaternion( this.quaternion );\n\n\t\tthis.position.add( _v1.multiplyScalar( distance ) );\n\n\t\treturn this;\n\n\t}\n\n\ttranslateX( distance ) {\n\n\t\treturn this.translateOnAxis( _xAxis, distance );\n\n\t}\n\n\ttranslateY( distance ) {\n\n\t\treturn this.translateOnAxis( _yAxis, distance );\n\n\t}\n\n\ttranslateZ( distance ) {\n\n\t\treturn this.translateOnAxis( _zAxis, distance );\n\n\t}\n\n\tlocalToWorld( vector ) {\n\n\t\treturn vector.applyMatrix4( this.matrixWorld );\n\n\t}\n\n\tworldToLocal( vector ) {\n\n\t\treturn vector.applyMatrix4( _m1.copy( this.matrixWorld ).invert() );\n\n\t}\n\n\tlookAt( x, y, z ) {\n\n\t\t// This method does not support objects having non-uniformly-scaled parent(s)\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\t_target.copy( x );\n\n\t\t} else {\n\n\t\t\t_target.set( x, y, z );\n\n\t\t}\n\n\t\tconst parent = this.parent;\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\t_position.setFromMatrixPosition( this.matrixWorld );\n\n\t\tif ( this.isCamera || this.isLight ) {\n\n\t\t\t_m1.lookAt( _position, _target, this.up );\n\n\t\t} else {\n\n\t\t\t_m1.lookAt( _target, _position, this.up );\n\n\t\t}\n\n\t\tthis.quaternion.setFromRotationMatrix( _m1 );\n\n\t\tif ( parent ) {\n\n\t\t\t_m1.extractRotation( parent.matrixWorld );\n\t\t\t_q1.setFromRotationMatrix( _m1 );\n\t\t\tthis.quaternion.premultiply( _q1.invert() );\n\n\t\t}\n\n\t}\n\n\tadd( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( let i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.add( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( object === this ) {\n\n\t\t\tconsole.error( 'THREE.Object3D.add: object can\\'t be added as a child of itself.', object );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( object && object.isObject3D ) {\n\n\t\t\tif ( object.parent !== null ) {\n\n\t\t\t\tobject.parent.remove( object );\n\n\t\t\t}\n\n\t\t\tobject.parent = this;\n\t\t\tthis.children.push( object );\n\n\t\t\tobject.dispatchEvent( _addedEvent );\n\n\t\t} else {\n\n\t\t\tconsole.error( 'THREE.Object3D.add: object not an instance of THREE.Object3D.', object );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tremove( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( let i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.remove( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst index = this.children.indexOf( object );\n\n\t\tif ( index !== - 1 ) {\n\n\t\t\tobject.parent = null;\n\t\t\tthis.children.splice( index, 1 );\n\n\t\t\tobject.dispatchEvent( _removedEvent );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tremoveFromParent() {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tparent.remove( this );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclear() {\n\n\t\tfor ( let i = 0; i < this.children.length; i ++ ) {\n\n\t\t\tconst object = this.children[ i ];\n\n\t\t\tobject.parent = null;\n\n\t\t\tobject.dispatchEvent( _removedEvent );\n\n\t\t}\n\n\t\tthis.children.length = 0;\n\n\t\treturn this;\n\n\n\t}\n\n\tattach( object ) {\n\n\t\t// adds object as a child of this, while maintaining the object's world transform\n\n\t\t// Note: This method does not support scene graphs having non-uniformly-scaled nodes(s)\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\t_m1.copy( this.matrixWorld ).invert();\n\n\t\tif ( object.parent !== null ) {\n\n\t\t\tobject.parent.updateWorldMatrix( true, false );\n\n\t\t\t_m1.multiply( object.parent.matrixWorld );\n\n\t\t}\n\n\t\tobject.applyMatrix4( _m1 );\n\n\t\tthis.add( object );\n\n\t\tobject.updateWorldMatrix( false, true );\n\n\t\treturn this;\n\n\t}\n\n\tgetObjectById( id ) {\n\n\t\treturn this.getObjectByProperty( 'id', id );\n\n\t}\n\n\tgetObjectByName( name ) {\n\n\t\treturn this.getObjectByProperty( 'name', name );\n\n\t}\n\n\tgetObjectByProperty( name, value ) {\n\n\t\tif ( this[ name ] === value ) return this;\n\n\t\tfor ( let i = 0, l = this.children.length; i < l; i ++ ) {\n\n\t\t\tconst child = this.children[ i ];\n\t\t\tconst object = child.getObjectByProperty( name, value );\n\n\t\t\tif ( object !== undefined ) {\n\n\t\t\t\treturn object;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn undefined;\n\n\t}\n\n\tgetWorldPosition( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn target.setFromMatrixPosition( this.matrixWorld );\n\n\t}\n\n\tgetWorldQuaternion( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tthis.matrixWorld.decompose( _position, target, _scale );\n\n\t\treturn target;\n\n\t}\n\n\tgetWorldScale( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tthis.matrixWorld.decompose( _position, _quaternion, target );\n\n\t\treturn target;\n\n\t}\n\n\tgetWorldDirection( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tconst e = this.matrixWorld.elements;\n\n\t\treturn target.set( e[ 8 ], e[ 9 ], e[ 10 ] ).normalize();\n\n\t}\n\n\traycast( /* raycaster, intersects */ ) {}\n\n\ttraverse( callback ) {\n\n\t\tcallback( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverse( callback );\n\n\t\t}\n\n\t}\n\n\ttraverseVisible( callback ) {\n\n\t\tif ( this.visible === false ) return;\n\n\t\tcallback( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverseVisible( callback );\n\n\t\t}\n\n\t}\n\n\ttraverseAncestors( callback ) {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tcallback( parent );\n\n\t\t\tparent.traverseAncestors( callback );\n\n\t\t}\n\n\t}\n\n\tupdateMatrix() {\n\n\t\tthis.matrix.compose( this.position, this.quaternion, this.scale );\n\n\t\tthis.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.matrixWorldNeedsUpdate || force ) {\n\n\t\t\tif ( this.parent === null ) {\n\n\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t} else {\n\n\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t}\n\n\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\tforce = true;\n\n\t\t}\n\n\t\t// update children\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].updateMatrixWorld( force );\n\n\t\t}\n\n\t}\n\n\tupdateWorldMatrix( updateParents, updateChildren ) {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( updateParents === true && parent !== null ) {\n\n\t\t\tparent.updateWorldMatrix( true, false );\n\n\t\t}\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.parent === null ) {\n\n\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t} else {\n\n\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t}\n\n\t\t// update children\n\n\t\tif ( updateChildren === true ) {\n\n\t\t\tconst children = this.children;\n\n\t\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].updateWorldMatrix( false, true );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\t// meta is a string when called from JSON.stringify\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tconst output = {};\n\n\t\t// meta is a hash used to collect geometries, materials.\n\t\t// not providing it implies that this is the root object\n\t\t// being serialized.\n\t\tif ( isRootObject ) {\n\n\t\t\t// initialize meta obj\n\t\t\tmeta = {\n\t\t\t\tgeometries: {},\n\t\t\t\tmaterials: {},\n\t\t\t\ttextures: {},\n\t\t\t\timages: {},\n\t\t\t\tshapes: {},\n\t\t\t\tskeletons: {},\n\t\t\t\tanimations: {}\n\t\t\t};\n\n\t\t\toutput.metadata = {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Object',\n\t\t\t\tgenerator: 'Object3D.toJSON'\n\t\t\t};\n\n\t\t}\n\n\t\t// standard Object3D serialization\n\n\t\tconst object = {};\n\n\t\tobject.uuid = this.uuid;\n\t\tobject.type = this.type;\n\n\t\tif ( this.name !== '' ) object.name = this.name;\n\t\tif ( this.castShadow === true ) object.castShadow = true;\n\t\tif ( this.receiveShadow === true ) object.receiveShadow = true;\n\t\tif ( this.visible === false ) object.visible = false;\n\t\tif ( this.frustumCulled === false ) object.frustumCulled = false;\n\t\tif ( this.renderOrder !== 0 ) object.renderOrder = this.renderOrder;\n\t\tif ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData;\n\n\t\tobject.layers = this.layers.mask;\n\t\tobject.matrix = this.matrix.toArray();\n\n\t\tif ( this.matrixAutoUpdate === false ) object.matrixAutoUpdate = false;\n\n\t\t// object specific properties\n\n\t\tif ( this.isInstancedMesh ) {\n\n\t\t\tobject.type = 'InstancedMesh';\n\t\t\tobject.count = this.count;\n\t\t\tobject.instanceMatrix = this.instanceMatrix.toJSON();\n\t\t\tif ( this.instanceColor !== null ) object.instanceColor = this.instanceColor.toJSON();\n\n\t\t}\n\n\t\t//\n\n\t\tfunction serialize( library, element ) {\n\n\t\t\tif ( library[ element.uuid ] === undefined ) {\n\n\t\t\t\tlibrary[ element.uuid ] = element.toJSON( meta );\n\n\t\t\t}\n\n\t\t\treturn element.uuid;\n\n\t\t}\n\n\t\tif ( this.isScene ) {\n\n\t\t\tif ( this.background ) {\n\n\t\t\t\tif ( this.background.isColor ) {\n\n\t\t\t\t\tobject.background = this.background.toJSON();\n\n\t\t\t\t} else if ( this.background.isTexture ) {\n\n\t\t\t\t\tobject.background = this.background.toJSON( meta ).uuid;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.environment && this.environment.isTexture ) {\n\n\t\t\t\tobject.environment = this.environment.toJSON( meta ).uuid;\n\n\t\t\t}\n\n\t\t} else if ( this.isMesh || this.isLine || this.isPoints ) {\n\n\t\t\tobject.geometry = serialize( meta.geometries, this.geometry );\n\n\t\t\tconst parameters = this.geometry.parameters;\n\n\t\t\tif ( parameters !== undefined && parameters.shapes !== undefined ) {\n\n\t\t\t\tconst shapes = parameters.shapes;\n\n\t\t\t\tif ( Array.isArray( shapes ) ) {\n\n\t\t\t\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst shape = shapes[ i ];\n\n\t\t\t\t\t\tserialize( meta.shapes, shape );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tserialize( meta.shapes, shapes );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.isSkinnedMesh ) {\n\n\t\t\tobject.bindMode = this.bindMode;\n\t\t\tobject.bindMatrix = this.bindMatrix.toArray();\n\n\t\t\tif ( this.skeleton !== undefined ) {\n\n\t\t\t\tserialize( meta.skeletons, this.skeleton );\n\n\t\t\t\tobject.skeleton = this.skeleton.uuid;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.material !== undefined ) {\n\n\t\t\tif ( Array.isArray( this.material ) ) {\n\n\t\t\t\tconst uuids = [];\n\n\t\t\t\tfor ( let i = 0, l = this.material.length; i < l; i ++ ) {\n\n\t\t\t\t\tuuids.push( serialize( meta.materials, this.material[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tobject.material = uuids;\n\n\t\t\t} else {\n\n\t\t\t\tobject.material = serialize( meta.materials, this.material );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.children.length > 0 ) {\n\n\t\t\tobject.children = [];\n\n\t\t\tfor ( let i = 0; i < this.children.length; i ++ ) {\n\n\t\t\t\tobject.children.push( this.children[ i ].toJSON( meta ).object );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.animations.length > 0 ) {\n\n\t\t\tobject.animations = [];\n\n\t\t\tfor ( let i = 0; i < this.animations.length; i ++ ) {\n\n\t\t\t\tconst animation = this.animations[ i ];\n\n\t\t\t\tobject.animations.push( serialize( meta.animations, animation ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( isRootObject ) {\n\n\t\t\tconst geometries = extractFromCache( meta.geometries );\n\t\t\tconst materials = extractFromCache( meta.materials );\n\t\t\tconst textures = extractFromCache( meta.textures );\n\t\t\tconst images = extractFromCache( meta.images );\n\t\t\tconst shapes = extractFromCache( meta.shapes );\n\t\t\tconst skeletons = extractFromCache( meta.skeletons );\n\t\t\tconst animations = extractFromCache( meta.animations );\n\n\t\t\tif ( geometries.length > 0 ) output.geometries = geometries;\n\t\t\tif ( materials.length > 0 ) output.materials = materials;\n\t\t\tif ( textures.length > 0 ) output.textures = textures;\n\t\t\tif ( images.length > 0 ) output.images = images;\n\t\t\tif ( shapes.length > 0 ) output.shapes = shapes;\n\t\t\tif ( skeletons.length > 0 ) output.skeletons = skeletons;\n\t\t\tif ( animations.length > 0 ) output.animations = animations;\n\n\t\t}\n\n\t\toutput.object = object;\n\n\t\treturn output;\n\n\t\t// extract data from the cache hash\n\t\t// remove metadata on each item\n\t\t// and return as array\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tconst values = [];\n\t\t\tfor ( const key in cache ) {\n\n\t\t\t\tconst data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t}\n\n\tclone( recursive ) {\n\n\t\treturn new this.constructor().copy( this, recursive );\n\n\t}\n\n\tcopy( source, recursive = true ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.up.copy( source.up );\n\n\t\tthis.position.copy( source.position );\n\t\tthis.rotation.order = source.rotation.order;\n\t\tthis.quaternion.copy( source.quaternion );\n\t\tthis.scale.copy( source.scale );\n\n\t\tthis.matrix.copy( source.matrix );\n\t\tthis.matrixWorld.copy( source.matrixWorld );\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\tthis.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;\n\n\t\tthis.layers.mask = source.layers.mask;\n\t\tthis.visible = source.visible;\n\n\t\tthis.castShadow = source.castShadow;\n\t\tthis.receiveShadow = source.receiveShadow;\n\n\t\tthis.frustumCulled = source.frustumCulled;\n\t\tthis.renderOrder = source.renderOrder;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\tif ( recursive === true ) {\n\n\t\t\tfor ( let i = 0; i < source.children.length; i ++ ) {\n\n\t\t\t\tconst child = source.children[ i ];\n\t\t\t\tthis.add( child.clone() );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nObject3D.DefaultUp = new Vector3( 0, 1, 0 );\nObject3D.DefaultMatrixAutoUpdate = true;\n\nObject3D.prototype.isObject3D = true;\n\nexport { Object3D };\n","import { Matrix4 } from '../math/Matrix4.js';\nimport { Object3D } from '../core/Object3D.js';\n\nclass Camera extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'Camera';\n\n\t\tthis.matrixWorldInverse = new Matrix4();\n\n\t\tthis.projectionMatrix = new Matrix4();\n\t\tthis.projectionMatrixInverse = new Matrix4();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.matrixWorldInverse.copy( source.matrixWorldInverse );\n\n\t\tthis.projectionMatrix.copy( source.projectionMatrix );\n\t\tthis.projectionMatrixInverse.copy( source.projectionMatrixInverse );\n\n\t\treturn this;\n\n\t}\n\n\tgetWorldDirection( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tconst e = this.matrixWorld.elements;\n\n\t\treturn target.set( - e[ 8 ], - e[ 9 ], - e[ 10 ] ).normalize();\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tthis.matrixWorldInverse.copy( this.matrixWorld ).invert();\n\n\t}\n\n\tupdateWorldMatrix( updateParents, updateChildren ) {\n\n\t\tsuper.updateWorldMatrix( updateParents, updateChildren );\n\n\t\tthis.matrixWorldInverse.copy( this.matrixWorld ).invert();\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nCamera.prototype.isCamera = true;\n\nexport { Camera };\n","import { Camera } from './Camera.js';\n\nclass OrthographicCamera extends Camera {\n\n\tconstructor( left = - 1, right = 1, top = 1, bottom = - 1, near = 0.1, far = 2000 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'OrthographicCamera';\n\n\t\tthis.zoom = 1;\n\t\tthis.view = null;\n\n\t\tthis.left = left;\n\t\tthis.right = right;\n\t\tthis.top = top;\n\t\tthis.bottom = bottom;\n\n\t\tthis.near = near;\n\t\tthis.far = far;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.left = source.left;\n\t\tthis.right = source.right;\n\t\tthis.top = source.top;\n\t\tthis.bottom = source.bottom;\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\n\t\tthis.zoom = source.zoom;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\treturn this;\n\n\t}\n\n\tsetViewOffset( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tclearViewOffset() {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tupdateProjectionMatrix() {\n\n\t\tconst dx = ( this.right - this.left ) / ( 2 * this.zoom );\n\t\tconst dy = ( this.top - this.bottom ) / ( 2 * this.zoom );\n\t\tconst cx = ( this.right + this.left ) / 2;\n\t\tconst cy = ( this.top + this.bottom ) / 2;\n\n\t\tlet left = cx - dx;\n\t\tlet right = cx + dx;\n\t\tlet top = cy + dy;\n\t\tlet bottom = cy - dy;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tconst scaleW = ( this.right - this.left ) / this.view.fullWidth / this.zoom;\n\t\t\tconst scaleH = ( this.top - this.bottom ) / this.view.fullHeight / this.zoom;\n\n\t\t\tleft += scaleW * this.view.offsetX;\n\t\t\tright = left + scaleW * this.view.width;\n\t\t\ttop -= scaleH * this.view.offsetY;\n\t\t\tbottom = top - scaleH * this.view.height;\n\n\t\t}\n\n\t\tthis.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far );\n\n\t\tthis.projectionMatrixInverse.copy( this.projectionMatrix ).invert();\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.zoom = this.zoom;\n\t\tdata.object.left = this.left;\n\t\tdata.object.right = this.right;\n\t\tdata.object.top = this.top;\n\t\tdata.object.bottom = this.bottom;\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\treturn data;\n\n\t}\n\n}\n\nOrthographicCamera.prototype.isOrthographicCamera = true;\n\nexport { OrthographicCamera };\n","import { Camera } from \"three/src/cameras/Camera.js\";\nimport { OrthographicCamera } from \"three/src/cameras/OrthographicCamera.js\";\nimport { PerspectiveCamera } from \"three/src/cameras/PerspectiveCamera.js\";\nimport { Bootstrap } from \"../bootstrap\";\n\nBootstrap.registerPlugin(\"camera\", {\n defaults: {\n near: 0.01,\n far: 10000,\n\n type: \"perspective\",\n fov: 60,\n aspect: null,\n\n // type: 'orthographic',\n left: -1,\n right: 1,\n bottom: -1,\n top: 1,\n\n klass: null,\n parameters: null,\n },\n\n listen: [\"resize\", \"this.change\"],\n\n install: function (three) {\n three.Camera = this.api();\n three.camera = null;\n\n this.aspect = 1;\n this.change({}, three);\n },\n\n uninstall: function (three) {\n delete three.Camera;\n delete three.camera;\n },\n\n change: function (event, three) {\n var o = this.options;\n var old = three.camera;\n\n if (!three.camera || event.changes.type || event.changes.klass) {\n var klass =\n o.klass ||\n {\n perspective: PerspectiveCamera,\n orthographic: OrthographicCamera,\n }[o.type] ||\n Camera;\n\n three.camera = o.parameters ? new klass(o.parameters) : new klass();\n }\n\n Object.entries(o).forEach(\n function ([key]) {\n if (Object.prototype.hasOwnProperty.call(three.camera, key))\n three.camera[key] = o[key];\n }.bind(this)\n );\n\n this.update(three);\n\n old === three.camera ||\n three.trigger({\n type: \"camera\",\n camera: three.camera,\n });\n },\n\n resize: function (event, three) {\n this.aspect = event.viewWidth / Math.max(1, event.viewHeight);\n\n this.update(three);\n },\n\n update: function (three) {\n three.camera.aspect = this.options.aspect || this.aspect;\n three.camera.updateProjectionMatrix();\n },\n});\n","import { Bootstrap } from \"../bootstrap\";\n\nBootstrap.registerPlugin(\"fallback\", {\n defaults: {\n force: false,\n fill: true,\n begin:\n '
' +\n '
',\n end: \"
\",\n message:\n \"This example requires WebGL
\" +\n 'Visit get.webgl.org for more info',\n },\n\n install: function (three) {\n var cnv, gl;\n try {\n cnv = document.createElement(\"canvas\");\n gl = cnv.getContext(\"webgl\") || cnv.getContext(\"experimental-webgl\");\n if (!gl || this.options.force) {\n throw \"WebGL unavailable.\";\n }\n three.fallback = false;\n } catch (e) {\n var message = this.options.message;\n var begin = this.options.begin;\n var end = this.options.end;\n var fill = this.options.fill;\n\n var div = document.createElement(\"div\");\n div.innerHTML = begin + message + end;\n\n this.children = [];\n\n while (div.childNodes.length > 0) {\n this.children.push(div.firstChild);\n three.element.appendChild(div.firstChild);\n }\n\n if (fill) {\n three.install(\"fill\");\n }\n\n this.div = div;\n three.fallback = true;\n return false; // Abort install\n }\n },\n\n uninstall: function (three) {\n if (this.children) {\n this.children.forEach(function (child) {\n child.parentNode.removeChild(child);\n });\n this.children = null;\n }\n\n delete three.fallback;\n },\n});\n","import { Bootstrap } from \"../bootstrap\";\n\nBootstrap.registerPlugin(\"fill\", {\n defaults: {\n block: true,\n body: true,\n layout: true,\n },\n\n install: function (three) {\n function is(element) {\n var h = element.style.height;\n return h == \"auto\" || h == \"\";\n }\n\n function set(element) {\n element.style.height = \"100%\";\n element.style.margin = 0;\n element.style.padding = 0;\n return element;\n }\n\n if (this.options.body && three.element == document.body) {\n // Fix body height if we're naked\n this.applied = [three.element, document.documentElement]\n .filter(is)\n .map(set);\n }\n\n if (this.options.block && three.canvas) {\n three.canvas.style.display = \"block\";\n this.block = true;\n }\n\n if (this.options.layout && three.element) {\n var style = window.getComputedStyle(three.element);\n if (style.position == \"static\") {\n three.element.style.position = \"relative\";\n this.layout = true;\n }\n }\n },\n\n uninstall: function (three) {\n if (this.applied) {\n const set = function (element) {\n element.style.height = \"\";\n element.style.margin = \"\";\n element.style.padding = \"\";\n return element;\n };\n\n this.applied.map(set);\n delete this.applied;\n }\n\n if (this.block && three.canvas) {\n three.canvas.style.display = \"\";\n delete this.block;\n }\n\n if (this.layout && three.element) {\n three.element.style.position = \"\";\n delete this.layout;\n }\n },\n\n change: function (three) {\n this.uninstall(three);\n this.install(three);\n },\n});\n","import { Bootstrap } from \"../bootstrap\";\n\nBootstrap.registerPlugin(\"loop\", {\n defaults: {\n start: true,\n each: 1,\n },\n\n listen: [\"ready\"],\n\n install: function (three) {\n this.running = false;\n this.lastRequestId = null;\n\n three.Loop = this.api(\n {\n start: this.start.bind(this),\n stop: this.stop.bind(this),\n running: false,\n window: window,\n },\n three\n );\n\n this.events = [\"pre\", \"update\", \"render\", \"post\"].map(function (type) {\n return { type: type };\n });\n },\n\n uninstall: function (three) {\n this.stop(three);\n },\n\n ready: function (event, three) {\n if (this.options.start) this.start(three);\n },\n\n start: function (three) {\n if (this.running) return;\n\n three.Loop.running = this.running = true;\n\n var trigger = three.trigger.bind(three);\n var loop = function () {\n if (!this.running) return;\n this.lastRequestId = three.Loop.window.requestAnimationFrame(loop);\n this.events.map(trigger);\n }.bind(this);\n\n this.lastRequestId = three.Loop.window.requestAnimationFrame(loop);\n\n three.trigger({ type: \"start\" });\n },\n\n stop: function (three) {\n if (!this.running) return;\n three.Loop.running = this.running = false;\n\n three.Loop.window.cancelAnimationFrame(this.lastRequestId);\n this.lastRequestId = null;\n\n three.trigger({ type: \"stop\" });\n },\n});\n","import { Bootstrap } from \"../bootstrap\";\n\nBootstrap.registerPlugin(\"render\", {\n listen: [\"render\"],\n\n render: function (event, three) {\n if (three.scene && three.camera) {\n three.renderer.render(three.scene, three.camera);\n }\n },\n});\n","export const REVISION = '137';\nexport const MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2, ROTATE: 0, DOLLY: 1, PAN: 2 };\nexport const TOUCH = { ROTATE: 0, PAN: 1, DOLLY_PAN: 2, DOLLY_ROTATE: 3 };\nexport const CullFaceNone = 0;\nexport const CullFaceBack = 1;\nexport const CullFaceFront = 2;\nexport const CullFaceFrontBack = 3;\nexport const BasicShadowMap = 0;\nexport const PCFShadowMap = 1;\nexport const PCFSoftShadowMap = 2;\nexport const VSMShadowMap = 3;\nexport const FrontSide = 0;\nexport const BackSide = 1;\nexport const DoubleSide = 2;\nexport const FlatShading = 1;\nexport const SmoothShading = 2;\nexport const NoBlending = 0;\nexport const NormalBlending = 1;\nexport const AdditiveBlending = 2;\nexport const SubtractiveBlending = 3;\nexport const MultiplyBlending = 4;\nexport const CustomBlending = 5;\nexport const AddEquation = 100;\nexport const SubtractEquation = 101;\nexport const ReverseSubtractEquation = 102;\nexport const MinEquation = 103;\nexport const MaxEquation = 104;\nexport const ZeroFactor = 200;\nexport const OneFactor = 201;\nexport const SrcColorFactor = 202;\nexport const OneMinusSrcColorFactor = 203;\nexport const SrcAlphaFactor = 204;\nexport const OneMinusSrcAlphaFactor = 205;\nexport const DstAlphaFactor = 206;\nexport const OneMinusDstAlphaFactor = 207;\nexport const DstColorFactor = 208;\nexport const OneMinusDstColorFactor = 209;\nexport const SrcAlphaSaturateFactor = 210;\nexport const NeverDepth = 0;\nexport const AlwaysDepth = 1;\nexport const LessDepth = 2;\nexport const LessEqualDepth = 3;\nexport const EqualDepth = 4;\nexport const GreaterEqualDepth = 5;\nexport const GreaterDepth = 6;\nexport const NotEqualDepth = 7;\nexport const MultiplyOperation = 0;\nexport const MixOperation = 1;\nexport const AddOperation = 2;\nexport const NoToneMapping = 0;\nexport const LinearToneMapping = 1;\nexport const ReinhardToneMapping = 2;\nexport const CineonToneMapping = 3;\nexport const ACESFilmicToneMapping = 4;\nexport const CustomToneMapping = 5;\n\nexport const UVMapping = 300;\nexport const CubeReflectionMapping = 301;\nexport const CubeRefractionMapping = 302;\nexport const EquirectangularReflectionMapping = 303;\nexport const EquirectangularRefractionMapping = 304;\nexport const CubeUVReflectionMapping = 306;\nexport const CubeUVRefractionMapping = 307;\nexport const RepeatWrapping = 1000;\nexport const ClampToEdgeWrapping = 1001;\nexport const MirroredRepeatWrapping = 1002;\nexport const NearestFilter = 1003;\nexport const NearestMipmapNearestFilter = 1004;\nexport const NearestMipMapNearestFilter = 1004;\nexport const NearestMipmapLinearFilter = 1005;\nexport const NearestMipMapLinearFilter = 1005;\nexport const LinearFilter = 1006;\nexport const LinearMipmapNearestFilter = 1007;\nexport const LinearMipMapNearestFilter = 1007;\nexport const LinearMipmapLinearFilter = 1008;\nexport const LinearMipMapLinearFilter = 1008;\nexport const UnsignedByteType = 1009;\nexport const ByteType = 1010;\nexport const ShortType = 1011;\nexport const UnsignedShortType = 1012;\nexport const IntType = 1013;\nexport const UnsignedIntType = 1014;\nexport const FloatType = 1015;\nexport const HalfFloatType = 1016;\nexport const UnsignedShort4444Type = 1017;\nexport const UnsignedShort5551Type = 1018;\nexport const UnsignedInt248Type = 1020;\nexport const AlphaFormat = 1021;\nexport const RGBFormat = 1022;\nexport const RGBAFormat = 1023;\nexport const LuminanceFormat = 1024;\nexport const LuminanceAlphaFormat = 1025;\nexport const DepthFormat = 1026;\nexport const DepthStencilFormat = 1027;\nexport const RedFormat = 1028;\nexport const RedIntegerFormat = 1029;\nexport const RGFormat = 1030;\nexport const RGIntegerFormat = 1031;\nexport const RGBAIntegerFormat = 1033;\n\nexport const RGB_S3TC_DXT1_Format = 33776;\nexport const RGBA_S3TC_DXT1_Format = 33777;\nexport const RGBA_S3TC_DXT3_Format = 33778;\nexport const RGBA_S3TC_DXT5_Format = 33779;\nexport const RGB_PVRTC_4BPPV1_Format = 35840;\nexport const RGB_PVRTC_2BPPV1_Format = 35841;\nexport const RGBA_PVRTC_4BPPV1_Format = 35842;\nexport const RGBA_PVRTC_2BPPV1_Format = 35843;\nexport const RGB_ETC1_Format = 36196;\nexport const RGB_ETC2_Format = 37492;\nexport const RGBA_ETC2_EAC_Format = 37496;\nexport const RGBA_ASTC_4x4_Format = 37808;\nexport const RGBA_ASTC_5x4_Format = 37809;\nexport const RGBA_ASTC_5x5_Format = 37810;\nexport const RGBA_ASTC_6x5_Format = 37811;\nexport const RGBA_ASTC_6x6_Format = 37812;\nexport const RGBA_ASTC_8x5_Format = 37813;\nexport const RGBA_ASTC_8x6_Format = 37814;\nexport const RGBA_ASTC_8x8_Format = 37815;\nexport const RGBA_ASTC_10x5_Format = 37816;\nexport const RGBA_ASTC_10x6_Format = 37817;\nexport const RGBA_ASTC_10x8_Format = 37818;\nexport const RGBA_ASTC_10x10_Format = 37819;\nexport const RGBA_ASTC_12x10_Format = 37820;\nexport const RGBA_ASTC_12x12_Format = 37821;\nexport const RGBA_BPTC_Format = 36492;\nexport const LoopOnce = 2200;\nexport const LoopRepeat = 2201;\nexport const LoopPingPong = 2202;\nexport const InterpolateDiscrete = 2300;\nexport const InterpolateLinear = 2301;\nexport const InterpolateSmooth = 2302;\nexport const ZeroCurvatureEnding = 2400;\nexport const ZeroSlopeEnding = 2401;\nexport const WrapAroundEnding = 2402;\nexport const NormalAnimationBlendMode = 2500;\nexport const AdditiveAnimationBlendMode = 2501;\nexport const TrianglesDrawMode = 0;\nexport const TriangleStripDrawMode = 1;\nexport const TriangleFanDrawMode = 2;\nexport const LinearEncoding = 3000;\nexport const sRGBEncoding = 3001;\nexport const BasicDepthPacking = 3200;\nexport const RGBADepthPacking = 3201;\nexport const TangentSpaceNormalMap = 0;\nexport const ObjectSpaceNormalMap = 1;\n\nexport const ZeroStencilOp = 0;\nexport const KeepStencilOp = 7680;\nexport const ReplaceStencilOp = 7681;\nexport const IncrementStencilOp = 7682;\nexport const DecrementStencilOp = 7683;\nexport const IncrementWrapStencilOp = 34055;\nexport const DecrementWrapStencilOp = 34056;\nexport const InvertStencilOp = 5386;\n\nexport const NeverStencilFunc = 512;\nexport const LessStencilFunc = 513;\nexport const EqualStencilFunc = 514;\nexport const LessEqualStencilFunc = 515;\nexport const GreaterStencilFunc = 516;\nexport const NotEqualStencilFunc = 517;\nexport const GreaterEqualStencilFunc = 518;\nexport const AlwaysStencilFunc = 519;\n\nexport const StaticDrawUsage = 35044;\nexport const DynamicDrawUsage = 35048;\nexport const StreamDrawUsage = 35040;\nexport const StaticReadUsage = 35045;\nexport const DynamicReadUsage = 35049;\nexport const StreamReadUsage = 35041;\nexport const StaticCopyUsage = 35046;\nexport const DynamicCopyUsage = 35050;\nexport const StreamCopyUsage = 35042;\n\nexport const GLSL1 = '100';\nexport const GLSL3 = '300 es';\n\nexport const _SRGBAFormat = 1035; // fallback for WebGL 1\n","import { Vector3 } from './Vector3.js';\n\nclass Box3 {\n\n\tconstructor( min = new Vector3( + Infinity, + Infinity, + Infinity ), max = new Vector3( - Infinity, - Infinity, - Infinity ) ) {\n\n\t\tthis.min = min;\n\t\tthis.max = max;\n\n\t}\n\n\tset( min, max ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromArray( array ) {\n\n\t\tlet minX = + Infinity;\n\t\tlet minY = + Infinity;\n\t\tlet minZ = + Infinity;\n\n\t\tlet maxX = - Infinity;\n\t\tlet maxY = - Infinity;\n\t\tlet maxZ = - Infinity;\n\n\t\tfor ( let i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\tconst x = array[ i ];\n\t\t\tconst y = array[ i + 1 ];\n\t\t\tconst z = array[ i + 2 ];\n\n\t\t\tif ( x < minX ) minX = x;\n\t\t\tif ( y < minY ) minY = y;\n\t\t\tif ( z < minZ ) minZ = z;\n\n\t\t\tif ( x > maxX ) maxX = x;\n\t\t\tif ( y > maxY ) maxY = y;\n\t\t\tif ( z > maxZ ) maxZ = z;\n\n\t\t}\n\n\t\tthis.min.set( minX, minY, minZ );\n\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromBufferAttribute( attribute ) {\n\n\t\tlet minX = + Infinity;\n\t\tlet minY = + Infinity;\n\t\tlet minZ = + Infinity;\n\n\t\tlet maxX = - Infinity;\n\t\tlet maxY = - Infinity;\n\t\tlet maxZ = - Infinity;\n\n\t\tfor ( let i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\tconst x = attribute.getX( i );\n\t\t\tconst y = attribute.getY( i );\n\t\t\tconst z = attribute.getZ( i );\n\n\t\t\tif ( x < minX ) minX = x;\n\t\t\tif ( y < minY ) minY = y;\n\t\t\tif ( z < minZ ) minZ = z;\n\n\t\t\tif ( x > maxX ) maxX = x;\n\t\t\tif ( y > maxY ) maxY = y;\n\t\t\tif ( z > maxZ ) maxZ = z;\n\n\t\t}\n\n\t\tthis.min.set( minX, minY, minZ );\n\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPoints( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetFromCenterAndSize( center, size ) {\n\n\t\tconst halfSize = _vector.copy( size ).multiplyScalar( 0.5 );\n\n\t\tthis.min.copy( center ).sub( halfSize );\n\t\tthis.max.copy( center ).add( halfSize );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromObject( object, precise = false ) {\n\n\t\tthis.makeEmpty();\n\n\t\treturn this.expandByObject( object, precise );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( box ) {\n\n\t\tthis.min.copy( box.min );\n\t\tthis.max.copy( box.max );\n\n\t\treturn this;\n\n\t}\n\n\tmakeEmpty() {\n\n\t\tthis.min.x = this.min.y = this.min.z = + Infinity;\n\t\tthis.max.x = this.max.y = this.max.z = - Infinity;\n\n\t\treturn this;\n\n\t}\n\n\tisEmpty() {\n\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );\n\n\t}\n\n\tgetCenter( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t}\n\n\tgetSize( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t}\n\n\texpandByPoint( point ) {\n\n\t\tthis.min.min( point );\n\t\tthis.max.max( point );\n\n\t\treturn this;\n\n\t}\n\n\texpandByVector( vector ) {\n\n\t\tthis.min.sub( vector );\n\t\tthis.max.add( vector );\n\n\t\treturn this;\n\n\t}\n\n\texpandByScalar( scalar ) {\n\n\t\tthis.min.addScalar( - scalar );\n\t\tthis.max.addScalar( scalar );\n\n\t\treturn this;\n\n\t}\n\n\texpandByObject( object, precise = false ) {\n\n\t\t// Computes the world-axis-aligned bounding box of an object (including its children),\n\t\t// accounting for both the object's, and children's, world transforms\n\n\t\tobject.updateWorldMatrix( false, false );\n\n\t\tconst geometry = object.geometry;\n\n\t\tif ( geometry !== undefined ) {\n\n\t\t\tif ( precise && geometry.attributes != undefined && geometry.attributes.position !== undefined ) {\n\n\t\t\t\tconst position = geometry.attributes.position;\n\t\t\t\tfor ( let i = 0, l = position.count; i < l; i ++ ) {\n\n\t\t\t\t\t_vector.fromBufferAttribute( position, i ).applyMatrix4( object.matrixWorld );\n\t\t\t\t\tthis.expandByPoint( _vector );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( geometry.boundingBox === null ) {\n\n\t\t\t\t\tgeometry.computeBoundingBox();\n\n\t\t\t\t}\n\n\t\t\t\t_box.copy( geometry.boundingBox );\n\t\t\t\t_box.applyMatrix4( object.matrixWorld );\n\n\t\t\t\tthis.union( _box );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tthis.expandByObject( children[ i ], precise );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\treturn point.x < this.min.x || point.x > this.max.x ||\n\t\t\tpoint.y < this.min.y || point.y > this.max.y ||\n\t\t\tpoint.z < this.min.z || point.z > this.max.z ? false : true;\n\n\t}\n\n\tcontainsBox( box ) {\n\n\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y &&\n\t\t\tthis.min.z <= box.min.z && box.max.z <= this.max.z;\n\n\t}\n\n\tgetParameter( point, target ) {\n\n\t\t// This can potentially have a divide by zero if the box\n\t\t// has a size dimension of 0.\n\n\t\treturn target.set(\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y ),\n\t\t\t( point.z - this.min.z ) / ( this.max.z - this.min.z )\n\t\t);\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\t// using 6 splitting planes to rule out intersections.\n\t\treturn box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\tbox.max.y < this.min.y || box.min.y > this.max.y ||\n\t\t\tbox.max.z < this.min.z || box.min.z > this.max.z ? false : true;\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\t// Find the point on the AABB closest to the sphere center.\n\t\tthis.clampPoint( sphere.center, _vector );\n\n\t\t// If that point is inside the sphere, the AABB and sphere intersect.\n\t\treturn _vector.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t}\n\n\tintersectsPlane( plane ) {\n\n\t\t// We compute the minimum and maximum dot product values. If those values\n\t\t// are on the same side (back or front) of the plane, then there is no intersection.\n\n\t\tlet min, max;\n\n\t\tif ( plane.normal.x > 0 ) {\n\n\t\t\tmin = plane.normal.x * this.min.x;\n\t\t\tmax = plane.normal.x * this.max.x;\n\n\t\t} else {\n\n\t\t\tmin = plane.normal.x * this.max.x;\n\t\t\tmax = plane.normal.x * this.min.x;\n\n\t\t}\n\n\t\tif ( plane.normal.y > 0 ) {\n\n\t\t\tmin += plane.normal.y * this.min.y;\n\t\t\tmax += plane.normal.y * this.max.y;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.y * this.max.y;\n\t\t\tmax += plane.normal.y * this.min.y;\n\n\t\t}\n\n\t\tif ( plane.normal.z > 0 ) {\n\n\t\t\tmin += plane.normal.z * this.min.z;\n\t\t\tmax += plane.normal.z * this.max.z;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.z * this.max.z;\n\t\t\tmax += plane.normal.z * this.min.z;\n\n\t\t}\n\n\t\treturn ( min <= - plane.constant && max >= - plane.constant );\n\n\t}\n\n\tintersectsTriangle( triangle ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// compute box center and extents\n\t\tthis.getCenter( _center );\n\t\t_extents.subVectors( this.max, _center );\n\n\t\t// translate triangle to aabb origin\n\t\t_v0.subVectors( triangle.a, _center );\n\t\t_v1.subVectors( triangle.b, _center );\n\t\t_v2.subVectors( triangle.c, _center );\n\n\t\t// compute edge vectors for triangle\n\t\t_f0.subVectors( _v1, _v0 );\n\t\t_f1.subVectors( _v2, _v1 );\n\t\t_f2.subVectors( _v0, _v2 );\n\n\t\t// test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb\n\t\t// make an axis testing of each of the 3 sides of the aabb against each of the 3 sides of the triangle = 9 axis of separation\n\t\t// axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned)\n\t\tlet axes = [\n\t\t\t0, - _f0.z, _f0.y, 0, - _f1.z, _f1.y, 0, - _f2.z, _f2.y,\n\t\t\t_f0.z, 0, - _f0.x, _f1.z, 0, - _f1.x, _f2.z, 0, - _f2.x,\n\t\t\t- _f0.y, _f0.x, 0, - _f1.y, _f1.x, 0, - _f2.y, _f2.x, 0\n\t\t];\n\t\tif ( ! satForAxes( axes, _v0, _v1, _v2, _extents ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// test 3 face normals from the aabb\n\t\taxes = [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ];\n\t\tif ( ! satForAxes( axes, _v0, _v1, _v2, _extents ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// finally testing the face normal of the triangle\n\t\t// use already existing triangle edge vectors here\n\t\t_triangleNormal.crossVectors( _f0, _f1 );\n\t\taxes = [ _triangleNormal.x, _triangleNormal.y, _triangleNormal.z ];\n\n\t\treturn satForAxes( axes, _v0, _v1, _v2, _extents );\n\n\t}\n\n\tclampPoint( point, target ) {\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\tconst clampedPoint = _vector.copy( point ).clamp( this.min, this.max );\n\n\t\treturn clampedPoint.sub( point ).length();\n\n\t}\n\n\tgetBoundingSphere( target ) {\n\n\t\tthis.getCenter( target.center );\n\n\t\ttarget.radius = this.getSize( _vector ).length() * 0.5;\n\n\t\treturn target;\n\n\t}\n\n\tintersect( box ) {\n\n\t\tthis.min.max( box.min );\n\t\tthis.max.min( box.max );\n\n\t\t// 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.\n\t\tif ( this.isEmpty() ) this.makeEmpty();\n\n\t\treturn this;\n\n\t}\n\n\tunion( box ) {\n\n\t\tthis.min.min( box.min );\n\t\tthis.max.max( box.max );\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\t// transform of empty box is an empty box.\n\t\tif ( this.isEmpty() ) return this;\n\n\t\t// NOTE: I am using a binary pattern to specify all 2^3 combinations below\n\t\t_points[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000\n\t\t_points[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001\n\t\t_points[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010\n\t\t_points[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011\n\t\t_points[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100\n\t\t_points[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101\n\t\t_points[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110\n\t\t_points[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111\n\n\t\tthis.setFromPoints( _points );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( offset ) {\n\n\t\tthis.min.add( offset );\n\t\tthis.max.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\tequals( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n}\n\nBox3.prototype.isBox3 = true;\n\nconst _points = [\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3()\n];\n\nconst _vector = /*@__PURE__*/ new Vector3();\n\nconst _box = /*@__PURE__*/ new Box3();\n\n// triangle centered vertices\n\nconst _v0 = /*@__PURE__*/ new Vector3();\nconst _v1 = /*@__PURE__*/ new Vector3();\nconst _v2 = /*@__PURE__*/ new Vector3();\n\n// triangle edge vectors\n\nconst _f0 = /*@__PURE__*/ new Vector3();\nconst _f1 = /*@__PURE__*/ new Vector3();\nconst _f2 = /*@__PURE__*/ new Vector3();\n\nconst _center = /*@__PURE__*/ new Vector3();\nconst _extents = /*@__PURE__*/ new Vector3();\nconst _triangleNormal = /*@__PURE__*/ new Vector3();\nconst _testAxis = /*@__PURE__*/ new Vector3();\n\nfunction satForAxes( axes, v0, v1, v2, extents ) {\n\n\tfor ( let i = 0, j = axes.length - 3; i <= j; i += 3 ) {\n\n\t\t_testAxis.fromArray( axes, i );\n\t\t// project the aabb onto the seperating axis\n\t\tconst r = extents.x * Math.abs( _testAxis.x ) + extents.y * Math.abs( _testAxis.y ) + extents.z * Math.abs( _testAxis.z );\n\t\t// project all 3 vertices of the triangle onto the seperating axis\n\t\tconst p0 = v0.dot( _testAxis );\n\t\tconst p1 = v1.dot( _testAxis );\n\t\tconst p2 = v2.dot( _testAxis );\n\t\t// actual test, basically see if either of the most extreme of the triangle points intersects r\n\t\tif ( Math.max( - Math.max( p0, p1, p2 ), Math.min( p0, p1, p2 ) ) > r ) {\n\n\t\t\t// points of the projected triangle are outside the projected half-length of the aabb\n\t\t\t// the axis is seperating and we can exit\n\t\t\treturn false;\n\n\t\t}\n\n\t}\n\n\treturn true;\n\n}\n\nexport { Box3 };\n","import { Box3 } from './Box3.js';\nimport { Vector3 } from './Vector3.js';\n\nconst _box = /*@__PURE__*/ new Box3();\nconst _v1 = /*@__PURE__*/ new Vector3();\nconst _toFarthestPoint = /*@__PURE__*/ new Vector3();\nconst _toPoint = /*@__PURE__*/ new Vector3();\n\nclass Sphere {\n\n\tconstructor( center = new Vector3(), radius = - 1 ) {\n\n\t\tthis.center = center;\n\t\tthis.radius = radius;\n\n\t}\n\n\tset( center, radius ) {\n\n\t\tthis.center.copy( center );\n\t\tthis.radius = radius;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPoints( points, optionalCenter ) {\n\n\t\tconst center = this.center;\n\n\t\tif ( optionalCenter !== undefined ) {\n\n\t\t\tcenter.copy( optionalCenter );\n\n\t\t} else {\n\n\t\t\t_box.setFromPoints( points ).getCenter( center );\n\n\t\t}\n\n\t\tlet maxRadiusSq = 0;\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );\n\n\t\t}\n\n\t\tthis.radius = Math.sqrt( maxRadiusSq );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( sphere ) {\n\n\t\tthis.center.copy( sphere.center );\n\t\tthis.radius = sphere.radius;\n\n\t\treturn this;\n\n\t}\n\n\tisEmpty() {\n\n\t\treturn ( this.radius < 0 );\n\n\t}\n\n\tmakeEmpty() {\n\n\t\tthis.center.set( 0, 0, 0 );\n\t\tthis.radius = - 1;\n\n\t\treturn this;\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\treturn ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\treturn ( point.distanceTo( this.center ) - this.radius );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\tconst radiusSum = this.radius + sphere.radius;\n\n\t\treturn sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsSphere( this );\n\n\t}\n\n\tintersectsPlane( plane ) {\n\n\t\treturn Math.abs( plane.distanceToPoint( this.center ) ) <= this.radius;\n\n\t}\n\n\tclampPoint( point, target ) {\n\n\t\tconst deltaLengthSq = this.center.distanceToSquared( point );\n\n\t\ttarget.copy( point );\n\n\t\tif ( deltaLengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\ttarget.sub( this.center ).normalize();\n\t\t\ttarget.multiplyScalar( this.radius ).add( this.center );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\tgetBoundingBox( target ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\t// Empty sphere produces empty bounding box\n\t\t\ttarget.makeEmpty();\n\t\t\treturn target;\n\n\t\t}\n\n\t\ttarget.set( this.center, this.center );\n\t\ttarget.expandByScalar( this.radius );\n\n\t\treturn target;\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tthis.center.applyMatrix4( matrix );\n\t\tthis.radius = this.radius * matrix.getMaxScaleOnAxis();\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( offset ) {\n\n\t\tthis.center.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\texpandByPoint( point ) {\n\n\t\t// from https://github.com/juj/MathGeoLib/blob/2940b99b99cfe575dd45103ef20f4019dee15b54/src/Geometry/Sphere.cpp#L649-L671\n\n\t\t_toPoint.subVectors( point, this.center );\n\n\t\tconst lengthSq = _toPoint.lengthSq();\n\n\t\tif ( lengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\tconst length = Math.sqrt( lengthSq );\n\t\t\tconst missingRadiusHalf = ( length - this.radius ) * 0.5;\n\n\t\t\t// Nudge this sphere towards the target point. Add half the missing distance to radius,\n\t\t\t// and the other half to position. This gives a tighter enclosure, instead of if\n\t\t\t// the whole missing distance were just added to radius.\n\n\t\t\tthis.center.add( _toPoint.multiplyScalar( missingRadiusHalf / length ) );\n\t\t\tthis.radius += missingRadiusHalf;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tunion( sphere ) {\n\n\t\t// from https://github.com/juj/MathGeoLib/blob/2940b99b99cfe575dd45103ef20f4019dee15b54/src/Geometry/Sphere.cpp#L759-L769\n\n\t\t// To enclose another sphere into this sphere, we only need to enclose two points:\n\t\t// 1) Enclose the farthest point on the other sphere into this sphere.\n\t\t// 2) Enclose the opposite point of the farthest point into this sphere.\n\n\t\t if ( this.center.equals( sphere.center ) === true ) {\n\n\t\t\t _toFarthestPoint.set( 0, 0, 1 ).multiplyScalar( sphere.radius );\n\n\n\t\t} else {\n\n\t\t\t_toFarthestPoint.subVectors( sphere.center, this.center ).normalize().multiplyScalar( sphere.radius );\n\n\t\t}\n\n\t\tthis.expandByPoint( _v1.copy( sphere.center ).add( _toFarthestPoint ) );\n\t\tthis.expandByPoint( _v1.copy( sphere.center ).sub( _toFarthestPoint ) );\n\n\t\treturn this;\n\n\t}\n\n\tequals( sphere ) {\n\n\t\treturn sphere.center.equals( this.center ) && ( sphere.radius === this.radius );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nexport { Sphere };\n","import { Matrix3 } from './Matrix3.js';\nimport { Vector3 } from './Vector3.js';\n\nconst _vector1 = /*@__PURE__*/ new Vector3();\nconst _vector2 = /*@__PURE__*/ new Vector3();\nconst _normalMatrix = /*@__PURE__*/ new Matrix3();\n\nclass Plane {\n\n\tconstructor( normal = new Vector3( 1, 0, 0 ), constant = 0 ) {\n\n\t\t// normal is assumed to be normalized\n\n\t\tthis.normal = normal;\n\t\tthis.constant = constant;\n\n\t}\n\n\tset( normal, constant ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = constant;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponents( x, y, z, w ) {\n\n\t\tthis.normal.set( x, y, z );\n\t\tthis.constant = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromNormalAndCoplanarPoint( normal, point ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = - point.dot( this.normal );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromCoplanarPoints( a, b, c ) {\n\n\t\tconst normal = _vector1.subVectors( c, b ).cross( _vector2.subVectors( a, b ) ).normalize();\n\n\t\t// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?\n\n\t\tthis.setFromNormalAndCoplanarPoint( normal, a );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( plane ) {\n\n\t\tthis.normal.copy( plane.normal );\n\t\tthis.constant = plane.constant;\n\n\t\treturn this;\n\n\t}\n\n\tnormalize() {\n\n\t\t// Note: will lead to a divide by zero if the plane is invalid.\n\n\t\tconst inverseNormalLength = 1.0 / this.normal.length();\n\t\tthis.normal.multiplyScalar( inverseNormalLength );\n\t\tthis.constant *= inverseNormalLength;\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.constant *= - 1;\n\t\tthis.normal.negate();\n\n\t\treturn this;\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\treturn this.normal.dot( point ) + this.constant;\n\n\t}\n\n\tdistanceToSphere( sphere ) {\n\n\t\treturn this.distanceToPoint( sphere.center ) - sphere.radius;\n\n\t}\n\n\tprojectPoint( point, target ) {\n\n\t\treturn target.copy( this.normal ).multiplyScalar( - this.distanceToPoint( point ) ).add( point );\n\n\t}\n\n\tintersectLine( line, target ) {\n\n\t\tconst direction = line.delta( _vector1 );\n\n\t\tconst denominator = this.normal.dot( direction );\n\n\t\tif ( denominator === 0 ) {\n\n\t\t\t// line is coplanar, return origin\n\t\t\tif ( this.distanceToPoint( line.start ) === 0 ) {\n\n\t\t\t\treturn target.copy( line.start );\n\n\t\t\t}\n\n\t\t\t// Unsure if this is the correct method to handle this case.\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;\n\n\t\tif ( t < 0 || t > 1 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn target.copy( direction ).multiplyScalar( t ).add( line.start );\n\n\t}\n\n\tintersectsLine( line ) {\n\n\t\t// Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it.\n\n\t\tconst startSign = this.distanceToPoint( line.start );\n\t\tconst endSign = this.distanceToPoint( line.end );\n\n\t\treturn ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsPlane( this );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\treturn sphere.intersectsPlane( this );\n\n\t}\n\n\tcoplanarPoint( target ) {\n\n\t\treturn target.copy( this.normal ).multiplyScalar( - this.constant );\n\n\t}\n\n\tapplyMatrix4( matrix, optionalNormalMatrix ) {\n\n\t\tconst normalMatrix = optionalNormalMatrix || _normalMatrix.getNormalMatrix( matrix );\n\n\t\tconst referencePoint = this.coplanarPoint( _vector1 ).applyMatrix4( matrix );\n\n\t\tconst normal = this.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\tthis.constant = - referencePoint.dot( normal );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( offset ) {\n\n\t\tthis.constant -= offset.dot( this.normal );\n\n\t\treturn this;\n\n\t}\n\n\tequals( plane ) {\n\n\t\treturn plane.normal.equals( this.normal ) && ( plane.constant === this.constant );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nPlane.prototype.isPlane = true;\n\nexport { Plane };\n","import { Vector3 } from './Vector3.js';\nimport { Sphere } from './Sphere.js';\nimport { Plane } from './Plane.js';\n\nconst _sphere = /*@__PURE__*/ new Sphere();\nconst _vector = /*@__PURE__*/ new Vector3();\n\nclass Frustum {\n\n\tconstructor( p0 = new Plane(), p1 = new Plane(), p2 = new Plane(), p3 = new Plane(), p4 = new Plane(), p5 = new Plane() ) {\n\n\t\tthis.planes = [ p0, p1, p2, p3, p4, p5 ];\n\n\t}\n\n\tset( p0, p1, p2, p3, p4, p5 ) {\n\n\t\tconst planes = this.planes;\n\n\t\tplanes[ 0 ].copy( p0 );\n\t\tplanes[ 1 ].copy( p1 );\n\t\tplanes[ 2 ].copy( p2 );\n\t\tplanes[ 3 ].copy( p3 );\n\t\tplanes[ 4 ].copy( p4 );\n\t\tplanes[ 5 ].copy( p5 );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( frustum ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tplanes[ i ].copy( frustum.planes[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetFromProjectionMatrix( m ) {\n\n\t\tconst planes = this.planes;\n\t\tconst me = m.elements;\n\t\tconst me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];\n\t\tconst me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];\n\t\tconst me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];\n\t\tconst me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];\n\n\t\tplanes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();\n\t\tplanes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();\n\t\tplanes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();\n\t\tplanes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();\n\t\tplanes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize();\n\t\tplanes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize();\n\n\t\treturn this;\n\n\t}\n\n\tintersectsObject( object ) {\n\n\t\tconst geometry = object.geometry;\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere.copy( geometry.boundingSphere ).applyMatrix4( object.matrixWorld );\n\n\t\treturn this.intersectsSphere( _sphere );\n\n\t}\n\n\tintersectsSprite( sprite ) {\n\n\t\t_sphere.center.set( 0, 0, 0 );\n\t\t_sphere.radius = 0.7071067811865476;\n\t\t_sphere.applyMatrix4( sprite.matrixWorld );\n\n\t\treturn this.intersectsSphere( _sphere );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\tconst planes = this.planes;\n\t\tconst center = sphere.center;\n\t\tconst negRadius = - sphere.radius;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst distance = planes[ i ].distanceToPoint( center );\n\n\t\t\tif ( distance < negRadius ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst plane = planes[ i ];\n\n\t\t\t// corner at max distance\n\n\t\t\t_vector.x = plane.normal.x > 0 ? box.max.x : box.min.x;\n\t\t\t_vector.y = plane.normal.y > 0 ? box.max.y : box.min.y;\n\t\t\t_vector.z = plane.normal.z > 0 ? box.max.z : box.min.z;\n\n\t\t\tif ( plane.distanceToPoint( _vector ) < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tif ( planes[ i ].distanceToPoint( point ) < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n\nexport { Frustum };\n","class Vector4 {\n\n\tconstructor( x = 0, y = 0, z = 0, w = 1 ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\n\t}\n\n\tget width() {\n\n\t\treturn this.z;\n\n\t}\n\n\tset width( value ) {\n\n\t\tthis.z = value;\n\n\t}\n\n\tget height() {\n\n\t\treturn this.w;\n\n\t}\n\n\tset height( value ) {\n\n\t\tthis.w = value;\n\n\t}\n\n\tset( x, y, z, w ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\t\tthis.w = scalar;\n\n\t\treturn this;\n\n\t}\n\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetZ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetW( w ) {\n\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tcase 3: this.w = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tcase 3: return this.w;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y, this.z, this.w );\n\n\t}\n\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\t\tthis.w = ( v.w !== undefined ) ? v.w : 1;\n\n\t\treturn this;\n\n\t}\n\n\tadd( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\treturn this.addVectors( v, w );\n\n\t\t}\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\t\tthis.w += v.w;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\t\tthis.w += s;\n\n\t\treturn this;\n\n\t}\n\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\t\tthis.w = a.w + b.w;\n\n\t\treturn this;\n\n\t}\n\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\t\tthis.w += v.w * s;\n\n\t\treturn this;\n\n\t}\n\n\tsub( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\treturn this.subVectors( v, w );\n\n\t\t}\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\t\tthis.w -= v.w;\n\n\t\treturn this;\n\n\t}\n\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\t\tthis.w -= s;\n\n\t\treturn this;\n\n\t}\n\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\t\tthis.w = a.w - b.w;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\t\tthis.w *= v.w;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\t\tthis.w *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix4( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z, w = this.w;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w;\n\t\tthis.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w;\n\n\t\treturn this;\n\n\t}\n\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\tsetAxisAngleFromQuaternion( q ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\n\n\t\t// q is assumed to be normalized\n\n\t\tthis.w = 2 * Math.acos( q.w );\n\n\t\tconst s = Math.sqrt( 1 - q.w * q.w );\n\n\t\tif ( s < 0.0001 ) {\n\n\t\t\tthis.x = 1;\n\t\t\tthis.y = 0;\n\t\t\tthis.z = 0;\n\n\t\t} else {\n\n\t\t\tthis.x = q.x / s;\n\t\t\tthis.y = q.y / s;\n\t\t\tthis.z = q.z / s;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetAxisAngleFromRotationMatrix( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tlet angle, x, y, z; // variables for result\n\t\tconst epsilon = 0.01,\t\t// margin to allow for rounding errors\n\t\t\tepsilon2 = 0.1,\t\t// margin to distinguish between 0 and 180 degrees\n\n\t\t\tte = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\tif ( ( Math.abs( m12 - m21 ) < epsilon ) &&\n\t\t ( Math.abs( m13 - m31 ) < epsilon ) &&\n\t\t ( Math.abs( m23 - m32 ) < epsilon ) ) {\n\n\t\t\t// singularity found\n\t\t\t// first check for identity matrix which must have +1 for all terms\n\t\t\t// in leading diagonal and zero in other terms\n\n\t\t\tif ( ( Math.abs( m12 + m21 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m13 + m31 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m23 + m32 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {\n\n\t\t\t\t// this singularity is identity matrix so angle = 0\n\n\t\t\t\tthis.set( 1, 0, 0, 0 );\n\n\t\t\t\treturn this; // zero angle, arbitrary axis\n\n\t\t\t}\n\n\t\t\t// otherwise this singularity is angle = 180\n\n\t\t\tangle = Math.PI;\n\n\t\t\tconst xx = ( m11 + 1 ) / 2;\n\t\t\tconst yy = ( m22 + 1 ) / 2;\n\t\t\tconst zz = ( m33 + 1 ) / 2;\n\t\t\tconst xy = ( m12 + m21 ) / 4;\n\t\t\tconst xz = ( m13 + m31 ) / 4;\n\t\t\tconst yz = ( m23 + m32 ) / 4;\n\n\t\t\tif ( ( xx > yy ) && ( xx > zz ) ) {\n\n\t\t\t\t// m11 is the largest diagonal term\n\n\t\t\t\tif ( xx < epsilon ) {\n\n\t\t\t\t\tx = 0;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tx = Math.sqrt( xx );\n\t\t\t\t\ty = xy / x;\n\t\t\t\t\tz = xz / x;\n\n\t\t\t\t}\n\n\t\t\t} else if ( yy > zz ) {\n\n\t\t\t\t// m22 is the largest diagonal term\n\n\t\t\t\tif ( yy < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ty = Math.sqrt( yy );\n\t\t\t\t\tx = xy / y;\n\t\t\t\t\tz = yz / y;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// m33 is the largest diagonal term so base result on this\n\n\t\t\t\tif ( zz < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tz = Math.sqrt( zz );\n\t\t\t\t\tx = xz / z;\n\t\t\t\t\ty = yz / z;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.set( x, y, z, angle );\n\n\t\t\treturn this; // return 180 deg rotation\n\n\t\t}\n\n\t\t// as we have reached here there are no singularities so we can handle normally\n\n\t\tlet s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) +\n\t\t\t( m13 - m31 ) * ( m13 - m31 ) +\n\t\t\t( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize\n\n\t\tif ( Math.abs( s ) < 0.001 ) s = 1;\n\n\t\t// prevent divide by zero, should not happen if matrix is orthogonal and should be\n\t\t// caught by singularity test above, but I've left it in just in case\n\n\t\tthis.x = ( m32 - m23 ) / s;\n\t\tthis.y = ( m13 - m31 ) / s;\n\t\tthis.z = ( m21 - m12 ) / s;\n\t\tthis.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );\n\n\t\treturn this;\n\n\t}\n\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\t\tthis.w = Math.min( this.w, v.w );\n\n\t\treturn this;\n\n\t}\n\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\t\tthis.w = Math.max( this.w, v.w );\n\n\t\treturn this;\n\n\t}\n\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\t\tthis.w = Math.max( min.w, Math.min( max.w, this.w ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = Math.max( minVal, Math.min( maxVal, this.x ) );\n\t\tthis.y = Math.max( minVal, Math.min( maxVal, this.y ) );\n\t\tthis.z = Math.max( minVal, Math.min( maxVal, this.z ) );\n\t\tthis.w = Math.max( minVal, Math.min( maxVal, this.w ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t}\n\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\t\tthis.w = Math.floor( this.w );\n\n\t\treturn this;\n\n\t}\n\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\t\tthis.w = Math.ceil( this.w );\n\n\t\treturn this;\n\n\t}\n\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\t\tthis.w = Math.round( this.w );\n\n\t\treturn this;\n\n\t}\n\n\troundToZero() {\n\n\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\t\tthis.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w );\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\t\tthis.w = - this.w;\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n\n\t}\n\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n\t}\n\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );\n\n\t}\n\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\t\tthis.w += ( v.w - this.w ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\t\tthis.z = v1.z + ( v2.z - v1.z ) * alpha;\n\t\tthis.w = v1.w + ( v2.w - v1.w ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\t\tthis.w = array[ offset + 3 ];\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\t\tarray[ offset + 3 ] = this.w;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index, offset ) {\n\n\t\tif ( offset !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector4: offset has been removed from .fromBufferAttribute().' );\n\n\t\t}\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\t\tthis.w = attribute.getW( index );\n\n\t\treturn this;\n\n\t}\n\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\t\tthis.w = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\t\tyield this.z;\n\t\tyield this.w;\n\n\t}\n\n}\n\nVector4.prototype.isVector4 = true;\n\nexport { Vector4 };\n","function WebGLAnimation() {\n\n\tlet context = null;\n\tlet isAnimating = false;\n\tlet animationLoop = null;\n\tlet requestId = null;\n\n\tfunction onAnimationFrame( time, frame ) {\n\n\t\tanimationLoop( time, frame );\n\n\t\trequestId = context.requestAnimationFrame( onAnimationFrame );\n\n\t}\n\n\treturn {\n\n\t\tstart: function () {\n\n\t\t\tif ( isAnimating === true ) return;\n\t\t\tif ( animationLoop === null ) return;\n\n\t\t\trequestId = context.requestAnimationFrame( onAnimationFrame );\n\n\t\t\tisAnimating = true;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tcontext.cancelAnimationFrame( requestId );\n\n\t\t\tisAnimating = false;\n\n\t\t},\n\n\t\tsetAnimationLoop: function ( callback ) {\n\n\t\t\tanimationLoop = callback;\n\n\t\t},\n\n\t\tsetContext: function ( value ) {\n\n\t\t\tcontext = value;\n\n\t\t}\n\n\t};\n\n}\n\nexport { WebGLAnimation };\n","function WebGLAttributes( gl, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tconst buffers = new WeakMap();\n\n\tfunction createBuffer( attribute, bufferType ) {\n\n\t\tconst array = attribute.array;\n\t\tconst usage = attribute.usage;\n\n\t\tconst buffer = gl.createBuffer();\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\t\tgl.bufferData( bufferType, array, usage );\n\n\t\tattribute.onUploadCallback();\n\n\t\tlet type = gl.FLOAT;\n\n\t\tif ( array instanceof Float32Array ) {\n\n\t\t\ttype = gl.FLOAT;\n\n\t\t} else if ( array instanceof Float64Array ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLAttributes: Unsupported data buffer format: Float64Array.' );\n\n\t\t} else if ( array instanceof Uint16Array ) {\n\n\t\t\tif ( attribute.isFloat16BufferAttribute ) {\n\n\t\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\t\ttype = gl.HALF_FLOAT;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLAttributes: Usage of Float16BufferAttribute requires WebGL2.' );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\ttype = gl.UNSIGNED_SHORT;\n\n\t\t\t}\n\n\t\t} else if ( array instanceof Int16Array ) {\n\n\t\t\ttype = gl.SHORT;\n\n\t\t} else if ( array instanceof Uint32Array ) {\n\n\t\t\ttype = gl.UNSIGNED_INT;\n\n\t\t} else if ( array instanceof Int32Array ) {\n\n\t\t\ttype = gl.INT;\n\n\t\t} else if ( array instanceof Int8Array ) {\n\n\t\t\ttype = gl.BYTE;\n\n\t\t} else if ( array instanceof Uint8Array ) {\n\n\t\t\ttype = gl.UNSIGNED_BYTE;\n\n\t\t} else if ( array instanceof Uint8ClampedArray ) {\n\n\t\t\ttype = gl.UNSIGNED_BYTE;\n\n\t\t}\n\n\t\treturn {\n\t\t\tbuffer: buffer,\n\t\t\ttype: type,\n\t\t\tbytesPerElement: array.BYTES_PER_ELEMENT,\n\t\t\tversion: attribute.version\n\t\t};\n\n\t}\n\n\tfunction updateBuffer( buffer, attribute, bufferType ) {\n\n\t\tconst array = attribute.array;\n\t\tconst updateRange = attribute.updateRange;\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\n\t\tif ( updateRange.count === - 1 ) {\n\n\t\t\t// Not using update ranges\n\n\t\t\tgl.bufferSubData( bufferType, 0, array );\n\n\t\t} else {\n\n\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\tgl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT,\n\t\t\t\t\tarray, updateRange.offset, updateRange.count );\n\n\t\t\t} else {\n\n\t\t\t\tgl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT,\n\t\t\t\t\tarray.subarray( updateRange.offset, updateRange.offset + updateRange.count ) );\n\n\t\t\t}\n\n\t\t\tupdateRange.count = - 1; // reset range\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction get( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\treturn buffers.get( attribute );\n\n\t}\n\n\tfunction remove( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tconst data = buffers.get( attribute );\n\n\t\tif ( data ) {\n\n\t\t\tgl.deleteBuffer( data.buffer );\n\n\t\t\tbuffers.delete( attribute );\n\n\t\t}\n\n\t}\n\n\tfunction update( attribute, bufferType ) {\n\n\t\tif ( attribute.isGLBufferAttribute ) {\n\n\t\t\tconst cached = buffers.get( attribute );\n\n\t\t\tif ( ! cached || cached.version < attribute.version ) {\n\n\t\t\t\tbuffers.set( attribute, {\n\t\t\t\t\tbuffer: attribute.buffer,\n\t\t\t\t\ttype: attribute.type,\n\t\t\t\t\tbytesPerElement: attribute.elementSize,\n\t\t\t\t\tversion: attribute.version\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tconst data = buffers.get( attribute );\n\n\t\tif ( data === undefined ) {\n\n\t\t\tbuffers.set( attribute, createBuffer( attribute, bufferType ) );\n\n\t\t} else if ( data.version < attribute.version ) {\n\n\t\t\tupdateBuffer( data.buffer, attribute, bufferType );\n\n\t\t\tdata.version = attribute.version;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update\n\n\t};\n\n}\n\n\nexport { WebGLAttributes };\n","class Vector2 {\n\n\tconstructor( x = 0, y = 0 ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\n\t}\n\n\tget width() {\n\n\t\treturn this.x;\n\n\t}\n\n\tset width( value ) {\n\n\t\tthis.x = value;\n\n\t}\n\n\tget height() {\n\n\t\treturn this.y;\n\n\t}\n\n\tset height( value ) {\n\n\t\tthis.y = value;\n\n\t}\n\n\tset( x, y ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\n\t\treturn this;\n\n\t}\n\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y );\n\n\t}\n\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\n\t\treturn this;\n\n\t}\n\n\tadd( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\treturn this.addVectors( v, w );\n\n\t\t}\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\n\t\treturn this;\n\n\t}\n\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\n\t\treturn this;\n\n\t}\n\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\n\t\treturn this;\n\n\t}\n\n\tsub( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\treturn this.subVectors( v, w );\n\n\t\t}\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\n\t\treturn this;\n\n\t}\n\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\n\t\treturn this;\n\n\t}\n\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\n\t\treturn this;\n\n\t}\n\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\tapplyMatrix3( m ) {\n\n\t\tconst x = this.x, y = this.y;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ];\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ];\n\n\t\treturn this;\n\n\t}\n\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\n\t\treturn this;\n\n\t}\n\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\n\t\treturn this;\n\n\t}\n\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = Math.max( minVal, Math.min( maxVal, this.x ) );\n\t\tthis.y = Math.max( minVal, Math.min( maxVal, this.y ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t}\n\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\n\t\treturn this;\n\n\t}\n\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\n\t\treturn this;\n\n\t}\n\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\n\t\treturn this;\n\n\t}\n\n\troundToZero() {\n\n\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y;\n\n\t}\n\n\tcross( v ) {\n\n\t\treturn this.x * v.y - this.y * v.x;\n\n\t}\n\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y );\n\n\t}\n\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y );\n\n\t}\n\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\tangle() {\n\n\t\t// computes the angle in radians with respect to the positive x-axis\n\n\t\tconst angle = Math.atan2( - this.y, - this.x ) + Math.PI;\n\n\t\treturn angle;\n\n\t}\n\n\tdistanceTo( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t}\n\n\tdistanceToSquared( v ) {\n\n\t\tconst dx = this.x - v.x, dy = this.y - v.y;\n\t\treturn dx * dx + dy * dy;\n\n\t}\n\n\tmanhattanDistanceTo( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y );\n\n\t}\n\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index, offset ) {\n\n\t\tif ( offset !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector2: offset has been removed from .fromBufferAttribute().' );\n\n\t\t}\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\n\t\treturn this;\n\n\t}\n\n\trotateAround( center, angle ) {\n\n\t\tconst c = Math.cos( angle ), s = Math.sin( angle );\n\n\t\tconst x = this.x - center.x;\n\t\tconst y = this.y - center.y;\n\n\t\tthis.x = x * c - y * s + center.x;\n\t\tthis.y = x * s + y * c + center.y;\n\n\t\treturn this;\n\n\t}\n\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\n\t}\n\n}\n\nVector2.prototype.isVector2 = true;\n\nexport { Vector2 };\n","import * as MathUtils from './MathUtils.js';\n\nconst _colorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF,\n\t'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2,\n\t'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50,\n\t'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B,\n\t'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B,\n\t'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F,\n\t'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3,\n\t'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222,\n\t'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700,\n\t'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4,\n\t'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00,\n\t'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3,\n\t'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA,\n\t'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32,\n\t'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3,\n\t'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC,\n\t'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD,\n\t'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6,\n\t'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9,\n\t'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'rebeccapurple': 0x663399, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F,\n\t'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE,\n\t'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA,\n\t'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0,\n\t'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 };\n\nconst _hslA = { h: 0, s: 0, l: 0 };\nconst _hslB = { h: 0, s: 0, l: 0 };\n\nfunction hue2rgb( p, q, t ) {\n\n\tif ( t < 0 ) t += 1;\n\tif ( t > 1 ) t -= 1;\n\tif ( t < 1 / 6 ) return p + ( q - p ) * 6 * t;\n\tif ( t < 1 / 2 ) return q;\n\tif ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t );\n\treturn p;\n\n}\n\nfunction SRGBToLinear( c ) {\n\n\treturn ( c < 0.04045 ) ? c * 0.0773993808 : Math.pow( c * 0.9478672986 + 0.0521327014, 2.4 );\n\n}\n\nfunction LinearToSRGB( c ) {\n\n\treturn ( c < 0.0031308 ) ? c * 12.92 : 1.055 * ( Math.pow( c, 0.41666 ) ) - 0.055;\n\n}\n\nclass Color {\n\n\tconstructor( r, g, b ) {\n\n\t\tif ( g === undefined && b === undefined ) {\n\n\t\t\t// r is THREE.Color, hex or string\n\t\t\treturn this.set( r );\n\n\t\t}\n\n\t\treturn this.setRGB( r, g, b );\n\n\t}\n\n\tset( value ) {\n\n\t\tif ( value && value.isColor ) {\n\n\t\t\tthis.copy( value );\n\n\t\t} else if ( typeof value === 'number' ) {\n\n\t\t\tthis.setHex( value );\n\n\t\t} else if ( typeof value === 'string' ) {\n\n\t\t\tthis.setStyle( value );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( scalar ) {\n\n\t\tthis.r = scalar;\n\t\tthis.g = scalar;\n\t\tthis.b = scalar;\n\n\t\treturn this;\n\n\t}\n\n\tsetHex( hex ) {\n\n\t\thex = Math.floor( hex );\n\n\t\tthis.r = ( hex >> 16 & 255 ) / 255;\n\t\tthis.g = ( hex >> 8 & 255 ) / 255;\n\t\tthis.b = ( hex & 255 ) / 255;\n\n\t\treturn this;\n\n\t}\n\n\tsetRGB( r, g, b ) {\n\n\t\tthis.r = r;\n\t\tthis.g = g;\n\t\tthis.b = b;\n\n\t\treturn this;\n\n\t}\n\n\tsetHSL( h, s, l ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\t\th = MathUtils.euclideanModulo( h, 1 );\n\t\ts = MathUtils.clamp( s, 0, 1 );\n\t\tl = MathUtils.clamp( l, 0, 1 );\n\n\t\tif ( s === 0 ) {\n\n\t\t\tthis.r = this.g = this.b = l;\n\n\t\t} else {\n\n\t\t\tconst p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );\n\t\t\tconst q = ( 2 * l ) - p;\n\n\t\t\tthis.r = hue2rgb( q, p, h + 1 / 3 );\n\t\t\tthis.g = hue2rgb( q, p, h );\n\t\t\tthis.b = hue2rgb( q, p, h - 1 / 3 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetStyle( style ) {\n\n\t\tfunction handleAlpha( string ) {\n\n\t\t\tif ( string === undefined ) return;\n\n\t\t\tif ( parseFloat( string ) < 1 ) {\n\n\t\t\t\tconsole.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' );\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tlet m;\n\n\t\tif ( m = /^((?:rgb|hsl)a?)\\(([^\\)]*)\\)/.exec( style ) ) {\n\n\t\t\t// rgb / hsl\n\n\t\t\tlet color;\n\t\t\tconst name = m[ 1 ];\n\t\t\tconst components = m[ 2 ];\n\n\t\t\tswitch ( name ) {\n\n\t\t\t\tcase 'rgb':\n\t\t\t\tcase 'rgba':\n\n\t\t\t\t\tif ( color = /^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(255,0,0) rgba(255,0,0,0.5)\n\t\t\t\t\t\tthis.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255;\n\t\t\t\t\t\tthis.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255;\n\t\t\t\t\t\tthis.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255;\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( color = /^\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)\n\t\t\t\t\t\tthis.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100;\n\t\t\t\t\t\tthis.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100;\n\t\t\t\t\t\tthis.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100;\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'hsl':\n\t\t\t\tcase 'hsla':\n\n\t\t\t\t\tif ( color = /^\\s*(\\d*\\.?\\d+)\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// hsl(120,50%,50%) hsla(120,50%,50%,0.5)\n\t\t\t\t\t\tconst h = parseFloat( color[ 1 ] ) / 360;\n\t\t\t\t\t\tconst s = parseInt( color[ 2 ], 10 ) / 100;\n\t\t\t\t\t\tconst l = parseInt( color[ 3 ], 10 ) / 100;\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this.setHSL( h, s, l );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t} else if ( m = /^\\#([A-Fa-f\\d]+)$/.exec( style ) ) {\n\n\t\t\t// hex color\n\n\t\t\tconst hex = m[ 1 ];\n\t\t\tconst size = hex.length;\n\n\t\t\tif ( size === 3 ) {\n\n\t\t\t\t// #ff0\n\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255;\n\t\t\t\tthis.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\tthis.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255;\n\n\t\t\t\treturn this;\n\n\t\t\t} else if ( size === 6 ) {\n\n\t\t\t\t// #ff0000\n\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\tthis.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255;\n\t\t\t\tthis.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255;\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( style && style.length > 0 ) {\n\n\t\t\treturn this.setColorName( style );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetColorName( style ) {\n\n\t\t// color keywords\n\t\tconst hex = _colorKeywords[ style.toLowerCase() ];\n\n\t\tif ( hex !== undefined ) {\n\n\t\t\t// red\n\t\t\tthis.setHex( hex );\n\n\t\t} else {\n\n\t\t\t// unknown color\n\t\t\tconsole.warn( 'THREE.Color: Unknown color ' + style );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.r, this.g, this.b );\n\n\t}\n\n\tcopy( color ) {\n\n\t\tthis.r = color.r;\n\t\tthis.g = color.g;\n\t\tthis.b = color.b;\n\n\t\treturn this;\n\n\t}\n\n\tcopySRGBToLinear( color ) {\n\n\t\tthis.r = SRGBToLinear( color.r );\n\t\tthis.g = SRGBToLinear( color.g );\n\t\tthis.b = SRGBToLinear( color.b );\n\n\t\treturn this;\n\n\t}\n\n\tcopyLinearToSRGB( color ) {\n\n\t\tthis.r = LinearToSRGB( color.r );\n\t\tthis.g = LinearToSRGB( color.g );\n\t\tthis.b = LinearToSRGB( color.b );\n\n\t\treturn this;\n\n\t}\n\n\tconvertSRGBToLinear() {\n\n\t\tthis.copySRGBToLinear( this );\n\n\t\treturn this;\n\n\t}\n\n\tconvertLinearToSRGB() {\n\n\t\tthis.copyLinearToSRGB( this );\n\n\t\treturn this;\n\n\t}\n\n\tgetHex() {\n\n\t\treturn ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0;\n\n\t}\n\n\tgetHexString() {\n\n\t\treturn ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 );\n\n\t}\n\n\tgetHSL( target ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\n\t\tconst r = this.r, g = this.g, b = this.b;\n\n\t\tconst max = Math.max( r, g, b );\n\t\tconst min = Math.min( r, g, b );\n\n\t\tlet hue, saturation;\n\t\tconst lightness = ( min + max ) / 2.0;\n\n\t\tif ( min === max ) {\n\n\t\t\thue = 0;\n\t\t\tsaturation = 0;\n\n\t\t} else {\n\n\t\t\tconst delta = max - min;\n\n\t\t\tsaturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min );\n\n\t\t\tswitch ( max ) {\n\n\t\t\t\tcase r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break;\n\t\t\t\tcase g: hue = ( b - r ) / delta + 2; break;\n\t\t\t\tcase b: hue = ( r - g ) / delta + 4; break;\n\n\t\t\t}\n\n\t\t\thue /= 6;\n\n\t\t}\n\n\t\ttarget.h = hue;\n\t\ttarget.s = saturation;\n\t\ttarget.l = lightness;\n\n\t\treturn target;\n\n\t}\n\n\tgetStyle() {\n\n\t\treturn 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')';\n\n\t}\n\n\toffsetHSL( h, s, l ) {\n\n\t\tthis.getHSL( _hslA );\n\n\t\t_hslA.h += h; _hslA.s += s; _hslA.l += l;\n\n\t\tthis.setHSL( _hslA.h, _hslA.s, _hslA.l );\n\n\t\treturn this;\n\n\t}\n\n\tadd( color ) {\n\n\t\tthis.r += color.r;\n\t\tthis.g += color.g;\n\t\tthis.b += color.b;\n\n\t\treturn this;\n\n\t}\n\n\taddColors( color1, color2 ) {\n\n\t\tthis.r = color1.r + color2.r;\n\t\tthis.g = color1.g + color2.g;\n\t\tthis.b = color1.b + color2.b;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( s ) {\n\n\t\tthis.r += s;\n\t\tthis.g += s;\n\t\tthis.b += s;\n\n\t\treturn this;\n\n\t}\n\n\tsub( color ) {\n\n\t\tthis.r = Math.max( 0, this.r - color.r );\n\t\tthis.g = Math.max( 0, this.g - color.g );\n\t\tthis.b = Math.max( 0, this.b - color.b );\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( color ) {\n\n\t\tthis.r *= color.r;\n\t\tthis.g *= color.g;\n\t\tthis.b *= color.b;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( s ) {\n\n\t\tthis.r *= s;\n\t\tthis.g *= s;\n\t\tthis.b *= s;\n\n\t\treturn this;\n\n\t}\n\n\tlerp( color, alpha ) {\n\n\t\tthis.r += ( color.r - this.r ) * alpha;\n\t\tthis.g += ( color.g - this.g ) * alpha;\n\t\tthis.b += ( color.b - this.b ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpColors( color1, color2, alpha ) {\n\n\t\tthis.r = color1.r + ( color2.r - color1.r ) * alpha;\n\t\tthis.g = color1.g + ( color2.g - color1.g ) * alpha;\n\t\tthis.b = color1.b + ( color2.b - color1.b ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpHSL( color, alpha ) {\n\n\t\tthis.getHSL( _hslA );\n\t\tcolor.getHSL( _hslB );\n\n\t\tconst h = MathUtils.lerp( _hslA.h, _hslB.h, alpha );\n\t\tconst s = MathUtils.lerp( _hslA.s, _hslB.s, alpha );\n\t\tconst l = MathUtils.lerp( _hslA.l, _hslB.l, alpha );\n\n\t\tthis.setHSL( h, s, l );\n\n\t\treturn this;\n\n\t}\n\n\tequals( c ) {\n\n\t\treturn ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.r = array[ offset ];\n\t\tthis.g = array[ offset + 1 ];\n\t\tthis.b = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.r;\n\t\tarray[ offset + 1 ] = this.g;\n\t\tarray[ offset + 2 ] = this.b;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.r = attribute.getX( index );\n\t\tthis.g = attribute.getY( index );\n\t\tthis.b = attribute.getZ( index );\n\n\t\tif ( attribute.normalized === true ) {\n\n\t\t\t// assuming Uint8Array\n\n\t\t\tthis.r /= 255;\n\t\t\tthis.g /= 255;\n\t\t\tthis.b /= 255;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\treturn this.getHex();\n\n\t}\n\n}\n\nColor.NAMES = _colorKeywords;\n\nColor.prototype.isColor = true;\nColor.prototype.r = 1;\nColor.prototype.g = 1;\nColor.prototype.b = 1;\n\nexport { Color, SRGBToLinear };\n","import { Vector4 } from '../math/Vector4.js';\nimport { Vector3 } from '../math/Vector3.js';\nimport { Vector2 } from '../math/Vector2.js';\nimport { Color } from '../math/Color.js';\nimport { StaticDrawUsage } from '../constants.js';\n\nconst _vector = /*@__PURE__*/ new Vector3();\nconst _vector2 = /*@__PURE__*/ new Vector2();\n\nclass BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tif ( Array.isArray( array ) ) {\n\n\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t}\n\n\t\tthis.name = '';\n\n\t\tthis.array = array;\n\t\tthis.itemSize = itemSize;\n\t\tthis.count = array !== undefined ? array.length / itemSize : 0;\n\t\tthis.normalized = normalized === true;\n\n\t\tthis.usage = StaticDrawUsage;\n\t\tthis.updateRange = { offset: 0, count: - 1 };\n\n\t\tthis.version = 0;\n\n\t}\n\n\tonUploadCallback() {}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\t\tthis.array = new source.array.constructor( source.array );\n\t\tthis.itemSize = source.itemSize;\n\t\tthis.count = source.count;\n\t\tthis.normalized = source.normalized;\n\n\t\tthis.usage = source.usage;\n\n\t\treturn this;\n\n\t}\n\n\tcopyAt( index1, attribute, index2 ) {\n\n\t\tindex1 *= this.itemSize;\n\t\tindex2 *= attribute.itemSize;\n\n\t\tfor ( let i = 0, l = this.itemSize; i < l; i ++ ) {\n\n\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcopyArray( array ) {\n\n\t\tthis.array.set( array );\n\n\t\treturn this;\n\n\t}\n\n\tcopyColorsArray( colors ) {\n\n\t\tconst array = this.array;\n\t\tlet offset = 0;\n\n\t\tfor ( let i = 0, l = colors.length; i < l; i ++ ) {\n\n\t\t\tlet color = colors[ i ];\n\n\t\t\tif ( color === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i );\n\t\t\t\tcolor = new Color();\n\n\t\t\t}\n\n\t\t\tarray[ offset ++ ] = color.r;\n\t\t\tarray[ offset ++ ] = color.g;\n\t\t\tarray[ offset ++ ] = color.b;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcopyVector2sArray( vectors ) {\n\n\t\tconst array = this.array;\n\t\tlet offset = 0;\n\n\t\tfor ( let i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\tlet vector = vectors[ i ];\n\n\t\t\tif ( vector === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i );\n\t\t\t\tvector = new Vector2();\n\n\t\t\t}\n\n\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\tarray[ offset ++ ] = vector.y;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcopyVector3sArray( vectors ) {\n\n\t\tconst array = this.array;\n\t\tlet offset = 0;\n\n\t\tfor ( let i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\tlet vector = vectors[ i ];\n\n\t\t\tif ( vector === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i );\n\t\t\t\tvector = new Vector3();\n\n\t\t\t}\n\n\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\tarray[ offset ++ ] = vector.z;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcopyVector4sArray( vectors ) {\n\n\t\tconst array = this.array;\n\t\tlet offset = 0;\n\n\t\tfor ( let i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\tlet vector = vectors[ i ];\n\n\t\t\tif ( vector === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i );\n\t\t\t\tvector = new Vector4();\n\n\t\t\t}\n\n\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\tarray[ offset ++ ] = vector.z;\n\t\t\tarray[ offset ++ ] = vector.w;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix3( m ) {\n\n\t\tif ( this.itemSize === 2 ) {\n\n\t\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t\t_vector2.fromBufferAttribute( this, i );\n\t\t\t\t_vector2.applyMatrix3( m );\n\n\t\t\t\tthis.setXY( i, _vector2.x, _vector2.y );\n\n\t\t\t}\n\n\t\t} else if ( this.itemSize === 3 ) {\n\n\t\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t\t_vector.fromBufferAttribute( this, i );\n\t\t\t\t_vector.applyMatrix3( m );\n\n\t\t\t\tthis.setXYZ( i, _vector.x, _vector.y, _vector.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix4( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector.x = this.getX( i );\n\t\t\t_vector.y = this.getY( i );\n\t\t\t_vector.z = this.getZ( i );\n\n\t\t\t_vector.applyMatrix4( m );\n\n\t\t\tthis.setXYZ( i, _vector.x, _vector.y, _vector.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyNormalMatrix( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector.x = this.getX( i );\n\t\t\t_vector.y = this.getY( i );\n\t\t\t_vector.z = this.getZ( i );\n\n\t\t\t_vector.applyNormalMatrix( m );\n\n\t\t\tthis.setXYZ( i, _vector.x, _vector.y, _vector.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttransformDirection( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector.x = this.getX( i );\n\t\t\t_vector.y = this.getY( i );\n\t\t\t_vector.z = this.getZ( i );\n\n\t\t\t_vector.transformDirection( m );\n\n\t\t\tthis.setXYZ( i, _vector.x, _vector.y, _vector.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tset( value, offset = 0 ) {\n\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t}\n\n\tgetX( index ) {\n\n\t\treturn this.array[ index * this.itemSize ];\n\n\t}\n\n\tsetX( index, x ) {\n\n\t\tthis.array[ index * this.itemSize ] = x;\n\n\t\treturn this;\n\n\t}\n\n\tgetY( index ) {\n\n\t\treturn this.array[ index * this.itemSize + 1 ];\n\n\t}\n\n\tsetY( index, y ) {\n\n\t\tthis.array[ index * this.itemSize + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\tgetZ( index ) {\n\n\t\treturn this.array[ index * this.itemSize + 2 ];\n\n\t}\n\n\tsetZ( index, z ) {\n\n\t\tthis.array[ index * this.itemSize + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\tgetW( index ) {\n\n\t\treturn this.array[ index * this.itemSize + 3 ];\n\n\t}\n\n\tsetW( index, w ) {\n\n\t\tthis.array[ index * this.itemSize + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetXY( index, x, y ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\t\tthis.array[ index + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\tonUpload( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.array, this.itemSize ).copy( this );\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\titemSize: this.itemSize,\n\t\t\ttype: this.array.constructor.name,\n\t\t\tarray: Array.prototype.slice.call( this.array ),\n\t\t\tnormalized: this.normalized\n\t\t};\n\n\t\tif ( this.name !== '' ) data.name = this.name;\n\t\tif ( this.usage !== StaticDrawUsage ) data.usage = this.usage;\n\t\tif ( this.updateRange.offset !== 0 || this.updateRange.count !== - 1 ) data.updateRange = this.updateRange;\n\n\t\treturn data;\n\n\t}\n\n}\n\nBufferAttribute.prototype.isBufferAttribute = true;\n\n//\n\nclass Int8BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int8Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint8BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint8Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint8ClampedBufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint8ClampedArray( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Int16BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int16Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint16BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint16Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Int32BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint32BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Float16BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint16Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nFloat16BufferAttribute.prototype.isFloat16BufferAttribute = true;\n\nclass Float32BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Float32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Float64BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Float64Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n//\n\nexport {\n\tFloat64BufferAttribute,\n\tFloat32BufferAttribute,\n\tFloat16BufferAttribute,\n\tUint32BufferAttribute,\n\tInt32BufferAttribute,\n\tUint16BufferAttribute,\n\tInt16BufferAttribute,\n\tUint8ClampedBufferAttribute,\n\tUint8BufferAttribute,\n\tInt8BufferAttribute,\n\tBufferAttribute\n};\n","function arrayMin( array ) {\n\n\tif ( array.length === 0 ) return Infinity;\n\n\tlet min = array[ 0 ];\n\n\tfor ( let i = 1, l = array.length; i < l; ++ i ) {\n\n\t\tif ( array[ i ] < min ) min = array[ i ];\n\n\t}\n\n\treturn min;\n\n}\n\nfunction arrayMax( array ) {\n\n\tif ( array.length === 0 ) return - Infinity;\n\n\tlet max = array[ 0 ];\n\n\tfor ( let i = 1, l = array.length; i < l; ++ i ) {\n\n\t\tif ( array[ i ] > max ) max = array[ i ];\n\n\t}\n\n\treturn max;\n\n}\n\nfunction arrayNeedsUint32( array ) {\n\n\t// assumes larger values usually on last\n\n\tfor ( let i = array.length - 1; i >= 0; -- i ) {\n\n\t\tif ( array[ i ] > 65535 ) return true;\n\n\t}\n\n\treturn false;\n\n}\n\nconst TYPED_ARRAYS = {\n\tInt8Array: Int8Array,\n\tUint8Array: Uint8Array,\n\tUint8ClampedArray: Uint8ClampedArray,\n\tInt16Array: Int16Array,\n\tUint16Array: Uint16Array,\n\tInt32Array: Int32Array,\n\tUint32Array: Uint32Array,\n\tFloat32Array: Float32Array,\n\tFloat64Array: Float64Array\n};\n\nfunction getTypedArray( type, buffer ) {\n\n\treturn new TYPED_ARRAYS[ type ]( buffer );\n\n}\n\nfunction createElementNS( name ) {\n\n\treturn document.createElementNS( 'http://www.w3.org/1999/xhtml', name );\n\n}\n\nexport { arrayMin, arrayMax, arrayNeedsUint32, getTypedArray, createElementNS };\n","import { Vector3 } from '../math/Vector3.js';\nimport { Vector2 } from '../math/Vector2.js';\nimport { Box3 } from '../math/Box3.js';\nimport { EventDispatcher } from './EventDispatcher.js';\nimport { BufferAttribute, Float32BufferAttribute, Uint16BufferAttribute, Uint32BufferAttribute } from './BufferAttribute.js';\nimport { Sphere } from '../math/Sphere.js';\nimport { Object3D } from './Object3D.js';\nimport { Matrix4 } from '../math/Matrix4.js';\nimport { Matrix3 } from '../math/Matrix3.js';\nimport * as MathUtils from '../math/MathUtils.js';\nimport { arrayNeedsUint32 } from '../utils.js';\n\nlet _id = 0;\n\nconst _m1 = /*@__PURE__*/ new Matrix4();\nconst _obj = /*@__PURE__*/ new Object3D();\nconst _offset = /*@__PURE__*/ new Vector3();\nconst _box = /*@__PURE__*/ new Box3();\nconst _boxMorphTargets = /*@__PURE__*/ new Box3();\nconst _vector = /*@__PURE__*/ new Vector3();\n\nclass BufferGeometry extends EventDispatcher {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tObject.defineProperty( this, 'id', { value: _id ++ } );\n\n\t\tthis.uuid = MathUtils.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'BufferGeometry';\n\n\t\tthis.index = null;\n\t\tthis.attributes = {};\n\n\t\tthis.morphAttributes = {};\n\t\tthis.morphTargetsRelative = false;\n\n\t\tthis.groups = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\tthis.drawRange = { start: 0, count: Infinity };\n\n\t\tthis.userData = {};\n\n\t}\n\n\tgetIndex() {\n\n\t\treturn this.index;\n\n\t}\n\n\tsetIndex( index ) {\n\n\t\tif ( Array.isArray( index ) ) {\n\n\t\t\tthis.index = new ( arrayNeedsUint32( index ) ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 );\n\n\t\t} else {\n\n\t\t\tthis.index = index;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetAttribute( name ) {\n\n\t\treturn this.attributes[ name ];\n\n\t}\n\n\tsetAttribute( name, attribute ) {\n\n\t\tthis.attributes[ name ] = attribute;\n\n\t\treturn this;\n\n\t}\n\n\tdeleteAttribute( name ) {\n\n\t\tdelete this.attributes[ name ];\n\n\t\treturn this;\n\n\t}\n\n\thasAttribute( name ) {\n\n\t\treturn this.attributes[ name ] !== undefined;\n\n\t}\n\n\taddGroup( start, count, materialIndex = 0 ) {\n\n\t\tthis.groups.push( {\n\n\t\t\tstart: start,\n\t\t\tcount: count,\n\t\t\tmaterialIndex: materialIndex\n\n\t\t} );\n\n\t}\n\n\tclearGroups() {\n\n\t\tthis.groups = [];\n\n\t}\n\n\tsetDrawRange( start, count ) {\n\n\t\tthis.drawRange.start = start;\n\t\tthis.drawRange.count = count;\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tconst position = this.attributes.position;\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tposition.applyMatrix4( matrix );\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t}\n\n\t\tconst normal = this.attributes.normal;\n\n\t\tif ( normal !== undefined ) {\n\n\t\t\tconst normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\tnormal.applyNormalMatrix( normalMatrix );\n\n\t\t\tnormal.needsUpdate = true;\n\n\t\t}\n\n\t\tconst tangent = this.attributes.tangent;\n\n\t\tif ( tangent !== undefined ) {\n\n\t\t\ttangent.transformDirection( matrix );\n\n\t\t\ttangent.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t}\n\n\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyQuaternion( q ) {\n\n\t\t_m1.makeRotationFromQuaternion( q );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateX( angle ) {\n\n\t\t// rotate geometry around world x-axis\n\n\t\t_m1.makeRotationX( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateY( angle ) {\n\n\t\t// rotate geometry around world y-axis\n\n\t\t_m1.makeRotationY( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateZ( angle ) {\n\n\t\t// rotate geometry around world z-axis\n\n\t\t_m1.makeRotationZ( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( x, y, z ) {\n\n\t\t// translate geometry\n\n\t\t_m1.makeTranslation( x, y, z );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\tscale( x, y, z ) {\n\n\t\t// scale geometry\n\n\t\t_m1.makeScale( x, y, z );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\tlookAt( vector ) {\n\n\t\t_obj.lookAt( vector );\n\n\t\t_obj.updateMatrix();\n\n\t\tthis.applyMatrix4( _obj.matrix );\n\n\t\treturn this;\n\n\t}\n\n\tcenter() {\n\n\t\tthis.computeBoundingBox();\n\n\t\tthis.boundingBox.getCenter( _offset ).negate();\n\n\t\tthis.translate( _offset.x, _offset.y, _offset.z );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPoints( points ) {\n\n\t\tconst position = [];\n\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tconst point = points[ i ];\n\t\t\tposition.push( point.x, point.y, point.z || 0 );\n\n\t\t}\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( position, 3 ) );\n\n\t\treturn this;\n\n\t}\n\n\tcomputeBoundingBox() {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tconst position = this.attributes.position;\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif ( position && position.isGLBufferAttribute ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box. Alternatively set \"mesh.frustumCulled\" to \"false\".', this );\n\n\t\t\tthis.boundingBox.set(\n\t\t\t\tnew Vector3( - Infinity, - Infinity, - Infinity ),\n\t\t\t\tnew Vector3( + Infinity, + Infinity, + Infinity )\n\t\t\t);\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tthis.boundingBox.setFromBufferAttribute( position );\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t_box.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\tif ( this.morphTargetsRelative ) {\n\n\t\t\t\t\t\t_vector.addVectors( this.boundingBox.min, _box.min );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _vector );\n\n\t\t\t\t\t\t_vector.addVectors( this.boundingBox.max, _box.max );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _vector );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _box.min );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _box.max );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthis.boundingBox.makeEmpty();\n\n\t\t}\n\n\t\tif ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingBox(): Computed min/max have NaN values. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t}\n\n\t}\n\n\tcomputeBoundingSphere() {\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tconst position = this.attributes.position;\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif ( position && position.isGLBufferAttribute ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingSphere(): GLBufferAttribute requires a manual bounding sphere. Alternatively set \"mesh.frustumCulled\" to \"false\".', this );\n\n\t\t\tthis.boundingSphere.set( new Vector3(), Infinity );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( position ) {\n\n\t\t\t// first, find the center of the bounding sphere\n\n\t\t\tconst center = this.boundingSphere.center;\n\n\t\t\t_box.setFromBufferAttribute( position );\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t_boxMorphTargets.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\tif ( this.morphTargetsRelative ) {\n\n\t\t\t\t\t\t_vector.addVectors( _box.min, _boxMorphTargets.min );\n\t\t\t\t\t\t_box.expandByPoint( _vector );\n\n\t\t\t\t\t\t_vector.addVectors( _box.max, _boxMorphTargets.max );\n\t\t\t\t\t\t_box.expandByPoint( _vector );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_box.expandByPoint( _boxMorphTargets.min );\n\t\t\t\t\t\t_box.expandByPoint( _boxMorphTargets.max );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_box.getCenter( center );\n\n\t\t\t// second, try to find a boundingSphere with a radius smaller than the\n\t\t\t// boundingSphere of the boundingBox: sqrt(3) smaller in the best case\n\n\t\t\tlet maxRadiusSq = 0;\n\n\t\t\tfor ( let i = 0, il = position.count; i < il; i ++ ) {\n\n\t\t\t\t_vector.fromBufferAttribute( position, i );\n\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector ) );\n\n\t\t\t}\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\tconst morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t\t\t\tfor ( let j = 0, jl = morphAttribute.count; j < jl; j ++ ) {\n\n\t\t\t\t\t\t_vector.fromBufferAttribute( morphAttribute, j );\n\n\t\t\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t\t\t_offset.fromBufferAttribute( position, j );\n\t\t\t\t\t\t\t_vector.add( _offset );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcomputeTangents() {\n\n\t\tconst index = this.index;\n\t\tconst attributes = this.attributes;\n\n\t\t// based on http://www.terathon.com/code/tangent.html\n\t\t// (per vertex tangents)\n\n\t\tif ( index === null ||\n\t\t\t attributes.position === undefined ||\n\t\t\t attributes.normal === undefined ||\n\t\t\t attributes.uv === undefined ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry: .computeTangents() failed. Missing required attributes (index, position, normal or uv)' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst indices = index.array;\n\t\tconst positions = attributes.position.array;\n\t\tconst normals = attributes.normal.array;\n\t\tconst uvs = attributes.uv.array;\n\n\t\tconst nVertices = positions.length / 3;\n\n\t\tif ( attributes.tangent === undefined ) {\n\n\t\t\tthis.setAttribute( 'tangent', new BufferAttribute( new Float32Array( 4 * nVertices ), 4 ) );\n\n\t\t}\n\n\t\tconst tangents = attributes.tangent.array;\n\n\t\tconst tan1 = [], tan2 = [];\n\n\t\tfor ( let i = 0; i < nVertices; i ++ ) {\n\n\t\t\ttan1[ i ] = new Vector3();\n\t\t\ttan2[ i ] = new Vector3();\n\n\t\t}\n\n\t\tconst vA = new Vector3(),\n\t\t\tvB = new Vector3(),\n\t\t\tvC = new Vector3(),\n\n\t\t\tuvA = new Vector2(),\n\t\t\tuvB = new Vector2(),\n\t\t\tuvC = new Vector2(),\n\n\t\t\tsdir = new Vector3(),\n\t\t\ttdir = new Vector3();\n\n\t\tfunction handleTriangle( a, b, c ) {\n\n\t\t\tvA.fromArray( positions, a * 3 );\n\t\t\tvB.fromArray( positions, b * 3 );\n\t\t\tvC.fromArray( positions, c * 3 );\n\n\t\t\tuvA.fromArray( uvs, a * 2 );\n\t\t\tuvB.fromArray( uvs, b * 2 );\n\t\t\tuvC.fromArray( uvs, c * 2 );\n\n\t\t\tvB.sub( vA );\n\t\t\tvC.sub( vA );\n\n\t\t\tuvB.sub( uvA );\n\t\t\tuvC.sub( uvA );\n\n\t\t\tconst r = 1.0 / ( uvB.x * uvC.y - uvC.x * uvB.y );\n\n\t\t\t// silently ignore degenerate uv triangles having coincident or colinear vertices\n\n\t\t\tif ( ! isFinite( r ) ) return;\n\n\t\t\tsdir.copy( vB ).multiplyScalar( uvC.y ).addScaledVector( vC, - uvB.y ).multiplyScalar( r );\n\t\t\ttdir.copy( vC ).multiplyScalar( uvB.x ).addScaledVector( vB, - uvC.x ).multiplyScalar( r );\n\n\t\t\ttan1[ a ].add( sdir );\n\t\t\ttan1[ b ].add( sdir );\n\t\t\ttan1[ c ].add( sdir );\n\n\t\t\ttan2[ a ].add( tdir );\n\t\t\ttan2[ b ].add( tdir );\n\t\t\ttan2[ c ].add( tdir );\n\n\t\t}\n\n\t\tlet groups = this.groups;\n\n\t\tif ( groups.length === 0 ) {\n\n\t\t\tgroups = [ {\n\t\t\t\tstart: 0,\n\t\t\t\tcount: indices.length\n\t\t\t} ];\n\n\t\t}\n\n\t\tfor ( let i = 0, il = groups.length; i < il; ++ i ) {\n\n\t\t\tconst group = groups[ i ];\n\n\t\t\tconst start = group.start;\n\t\t\tconst count = group.count;\n\n\t\t\tfor ( let j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\thandleTriangle(\n\t\t\t\t\tindices[ j + 0 ],\n\t\t\t\t\tindices[ j + 1 ],\n\t\t\t\t\tindices[ j + 2 ]\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst tmp = new Vector3(), tmp2 = new Vector3();\n\t\tconst n = new Vector3(), n2 = new Vector3();\n\n\t\tfunction handleVertex( v ) {\n\n\t\t\tn.fromArray( normals, v * 3 );\n\t\t\tn2.copy( n );\n\n\t\t\tconst t = tan1[ v ];\n\n\t\t\t// Gram-Schmidt orthogonalize\n\n\t\t\ttmp.copy( t );\n\t\t\ttmp.sub( n.multiplyScalar( n.dot( t ) ) ).normalize();\n\n\t\t\t// Calculate handedness\n\n\t\t\ttmp2.crossVectors( n2, t );\n\t\t\tconst test = tmp2.dot( tan2[ v ] );\n\t\t\tconst w = ( test < 0.0 ) ? - 1.0 : 1.0;\n\n\t\t\ttangents[ v * 4 ] = tmp.x;\n\t\t\ttangents[ v * 4 + 1 ] = tmp.y;\n\t\t\ttangents[ v * 4 + 2 ] = tmp.z;\n\t\t\ttangents[ v * 4 + 3 ] = w;\n\n\t\t}\n\n\t\tfor ( let i = 0, il = groups.length; i < il; ++ i ) {\n\n\t\t\tconst group = groups[ i ];\n\n\t\t\tconst start = group.start;\n\t\t\tconst count = group.count;\n\n\t\t\tfor ( let j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\thandleVertex( indices[ j + 0 ] );\n\t\t\t\thandleVertex( indices[ j + 1 ] );\n\t\t\t\thandleVertex( indices[ j + 2 ] );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcomputeVertexNormals() {\n\n\t\tconst index = this.index;\n\t\tconst positionAttribute = this.getAttribute( 'position' );\n\n\t\tif ( positionAttribute !== undefined ) {\n\n\t\t\tlet normalAttribute = this.getAttribute( 'normal' );\n\n\t\t\tif ( normalAttribute === undefined ) {\n\n\t\t\t\tnormalAttribute = new BufferAttribute( new Float32Array( positionAttribute.count * 3 ), 3 );\n\t\t\t\tthis.setAttribute( 'normal', normalAttribute );\n\n\t\t\t} else {\n\n\t\t\t\t// reset existing normals to zero\n\n\t\t\t\tfor ( let i = 0, il = normalAttribute.count; i < il; i ++ ) {\n\n\t\t\t\t\tnormalAttribute.setXYZ( i, 0, 0, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst pA = new Vector3(), pB = new Vector3(), pC = new Vector3();\n\t\t\tconst nA = new Vector3(), nB = new Vector3(), nC = new Vector3();\n\t\t\tconst cb = new Vector3(), ab = new Vector3();\n\n\t\t\t// indexed elements\n\n\t\t\tif ( index ) {\n\n\t\t\t\tfor ( let i = 0, il = index.count; i < il; i += 3 ) {\n\n\t\t\t\t\tconst vA = index.getX( i + 0 );\n\t\t\t\t\tconst vB = index.getX( i + 1 );\n\t\t\t\t\tconst vC = index.getX( i + 2 );\n\n\t\t\t\t\tpA.fromBufferAttribute( positionAttribute, vA );\n\t\t\t\t\tpB.fromBufferAttribute( positionAttribute, vB );\n\t\t\t\t\tpC.fromBufferAttribute( positionAttribute, vC );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnA.fromBufferAttribute( normalAttribute, vA );\n\t\t\t\t\tnB.fromBufferAttribute( normalAttribute, vB );\n\t\t\t\t\tnC.fromBufferAttribute( normalAttribute, vC );\n\n\t\t\t\t\tnA.add( cb );\n\t\t\t\t\tnB.add( cb );\n\t\t\t\t\tnC.add( cb );\n\n\t\t\t\t\tnormalAttribute.setXYZ( vA, nA.x, nA.y, nA.z );\n\t\t\t\t\tnormalAttribute.setXYZ( vB, nB.x, nB.y, nB.z );\n\t\t\t\t\tnormalAttribute.setXYZ( vC, nC.x, nC.y, nC.z );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed elements (unconnected triangle soup)\n\n\t\t\t\tfor ( let i = 0, il = positionAttribute.count; i < il; i += 3 ) {\n\n\t\t\t\t\tpA.fromBufferAttribute( positionAttribute, i + 0 );\n\t\t\t\t\tpB.fromBufferAttribute( positionAttribute, i + 1 );\n\t\t\t\t\tpC.fromBufferAttribute( positionAttribute, i + 2 );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnormalAttribute.setXYZ( i + 0, cb.x, cb.y, cb.z );\n\t\t\t\t\tnormalAttribute.setXYZ( i + 1, cb.x, cb.y, cb.z );\n\t\t\t\t\tnormalAttribute.setXYZ( i + 2, cb.x, cb.y, cb.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.normalizeNormals();\n\n\t\t\tnormalAttribute.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\tmerge( geometry, offset ) {\n\n\t\tif ( ! ( geometry && geometry.isBufferGeometry ) ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( offset === undefined ) {\n\n\t\t\toffset = 0;\n\n\t\t\tconsole.warn(\n\t\t\t\t'THREE.BufferGeometry.merge(): Overwriting original geometry, starting at offset=0. '\n\t\t\t\t+ 'Use BufferGeometryUtils.mergeBufferGeometries() for lossless merge.'\n\t\t\t);\n\n\t\t}\n\n\t\tconst attributes = this.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tif ( geometry.attributes[ key ] === undefined ) continue;\n\n\t\t\tconst attribute1 = attributes[ key ];\n\t\t\tconst attributeArray1 = attribute1.array;\n\n\t\t\tconst attribute2 = geometry.attributes[ key ];\n\t\t\tconst attributeArray2 = attribute2.array;\n\n\t\t\tconst attributeOffset = attribute2.itemSize * offset;\n\t\t\tconst length = Math.min( attributeArray2.length, attributeArray1.length - attributeOffset );\n\n\t\t\tfor ( let i = 0, j = attributeOffset; i < length; i ++, j ++ ) {\n\n\t\t\t\tattributeArray1[ j ] = attributeArray2[ i ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tnormalizeNormals() {\n\n\t\tconst normals = this.attributes.normal;\n\n\t\tfor ( let i = 0, il = normals.count; i < il; i ++ ) {\n\n\t\t\t_vector.fromBufferAttribute( normals, i );\n\n\t\t\t_vector.normalize();\n\n\t\t\tnormals.setXYZ( i, _vector.x, _vector.y, _vector.z );\n\n\t\t}\n\n\t}\n\n\ttoNonIndexed() {\n\n\t\tfunction convertBufferAttribute( attribute, indices ) {\n\n\t\t\tconst array = attribute.array;\n\t\t\tconst itemSize = attribute.itemSize;\n\t\t\tconst normalized = attribute.normalized;\n\n\t\t\tconst array2 = new array.constructor( indices.length * itemSize );\n\n\t\t\tlet index = 0, index2 = 0;\n\n\t\t\tfor ( let i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\tindex = indices[ i ] * attribute.data.stride + attribute.offset;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tindex = indices[ i ] * itemSize;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let j = 0; j < itemSize; j ++ ) {\n\n\t\t\t\t\tarray2[ index2 ++ ] = array[ index ++ ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new BufferAttribute( array2, itemSize, normalized );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.index === null ) {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry.toNonIndexed(): BufferGeometry is already non-indexed.' );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst geometry2 = new BufferGeometry();\n\n\t\tconst indices = this.index.array;\n\t\tconst attributes = this.attributes;\n\n\t\t// attributes\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\n\t\t\tconst newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\tgeometry2.setAttribute( name, newAttribute );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = this.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst morphArray = [];\n\t\t\tconst morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( let i = 0, il = morphAttribute.length; i < il; i ++ ) {\n\n\t\t\t\tconst attribute = morphAttribute[ i ];\n\n\t\t\t\tconst newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\t\tmorphArray.push( newAttribute );\n\n\t\t\t}\n\n\t\t\tgeometry2.morphAttributes[ name ] = morphArray;\n\n\t\t}\n\n\t\tgeometry2.morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t// groups\n\n\t\tconst groups = this.groups;\n\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst group = groups[ i ];\n\t\t\tgeometry2.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\treturn geometry2;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'BufferGeometry',\n\t\t\t\tgenerator: 'BufferGeometry.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard BufferGeometry serialization\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\t\tif ( this.name !== '' ) data.name = this.name;\n\t\tif ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData;\n\n\t\tif ( this.parameters !== undefined ) {\n\n\t\t\tconst parameters = this.parameters;\n\n\t\t\tfor ( const key in parameters ) {\n\n\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\t// for simplicity the code assumes attributes are not shared across geometries, see #15811\n\n\t\tdata.data = { attributes: {} };\n\n\t\tconst index = this.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tdata.data.index = {\n\t\t\t\ttype: index.array.constructor.name,\n\t\t\t\tarray: Array.prototype.slice.call( index.array )\n\t\t\t};\n\n\t\t}\n\n\t\tconst attributes = this.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attribute = attributes[ key ];\n\n\t\t\tdata.data.attributes[ key ] = attribute.toJSON( data.data );\n\n\t\t}\n\n\t\tconst morphAttributes = {};\n\t\tlet hasMorphAttributes = false;\n\n\t\tfor ( const key in this.morphAttributes ) {\n\n\t\t\tconst attributeArray = this.morphAttributes[ key ];\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0, il = attributeArray.length; i < il; i ++ ) {\n\n\t\t\t\tconst attribute = attributeArray[ i ];\n\n\t\t\t\tarray.push( attribute.toJSON( data.data ) );\n\n\t\t\t}\n\n\t\t\tif ( array.length > 0 ) {\n\n\t\t\t\tmorphAttributes[ key ] = array;\n\n\t\t\t\thasMorphAttributes = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( hasMorphAttributes ) {\n\n\t\t\tdata.data.morphAttributes = morphAttributes;\n\t\t\tdata.data.morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t}\n\n\t\tconst groups = this.groups;\n\n\t\tif ( groups.length > 0 ) {\n\n\t\t\tdata.data.groups = JSON.parse( JSON.stringify( groups ) );\n\n\t\t}\n\n\t\tconst boundingSphere = this.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tdata.data.boundingSphere = {\n\t\t\t\tcenter: boundingSphere.center.toArray(),\n\t\t\t\tradius: boundingSphere.radius\n\t\t\t};\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tclone() {\n\n\t\t return new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\t// reset\n\n\t\tthis.index = null;\n\t\tthis.attributes = {};\n\t\tthis.morphAttributes = {};\n\t\tthis.groups = [];\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// used for storing cloned, shared data\n\n\t\tconst data = {};\n\n\t\t// name\n\n\t\tthis.name = source.name;\n\n\t\t// index\n\n\t\tconst index = source.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tthis.setIndex( index.clone( data ) );\n\n\t\t}\n\n\t\t// attributes\n\n\t\tconst attributes = source.attributes;\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\t\t\tthis.setAttribute( name, attribute.clone( data ) );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = source.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst array = [];\n\t\t\tconst morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( let i = 0, l = morphAttribute.length; i < l; i ++ ) {\n\n\t\t\t\tarray.push( morphAttribute[ i ].clone( data ) );\n\n\t\t\t}\n\n\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t}\n\n\t\tthis.morphTargetsRelative = source.morphTargetsRelative;\n\n\t\t// groups\n\n\t\tconst groups = source.groups;\n\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst group = groups[ i ];\n\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\t// bounding box\n\n\t\tconst boundingBox = source.boundingBox;\n\n\t\tif ( boundingBox !== null ) {\n\n\t\t\tthis.boundingBox = boundingBox.clone();\n\n\t\t}\n\n\t\t// bounding sphere\n\n\t\tconst boundingSphere = source.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tthis.boundingSphere = boundingSphere.clone();\n\n\t\t}\n\n\t\t// draw range\n\n\t\tthis.drawRange.start = source.drawRange.start;\n\t\tthis.drawRange.count = source.drawRange.count;\n\n\t\t// user data\n\n\t\tthis.userData = source.userData;\n\n\t\t// geometry generator parameters\n\n\t\tif ( source.parameters !== undefined ) this.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n}\n\nBufferGeometry.prototype.isBufferGeometry = true;\n\nexport { BufferGeometry };\n","import { BufferGeometry } from '../core/BufferGeometry.js';\nimport { Float32BufferAttribute } from '../core/BufferAttribute.js';\nimport { Vector3 } from '../math/Vector3.js';\n\nclass BoxGeometry extends BufferGeometry {\n\n\tconstructor( width = 1, height = 1, depth = 1, widthSegments = 1, heightSegments = 1, depthSegments = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'BoxGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\tdepth: depth,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tdepthSegments: depthSegments\n\t\t};\n\n\t\tconst scope = this;\n\n\t\t// segments\n\n\t\twidthSegments = Math.floor( widthSegments );\n\t\theightSegments = Math.floor( heightSegments );\n\t\tdepthSegments = Math.floor( depthSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet numberOfVertices = 0;\n\t\tlet groupStart = 0;\n\n\t\t// build each side of the box geometry\n\n\t\tbuildPlane( 'z', 'y', 'x', - 1, - 1, depth, height, width, depthSegments, heightSegments, 0 ); // px\n\t\tbuildPlane( 'z', 'y', 'x', 1, - 1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx\n\t\tbuildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py\n\t\tbuildPlane( 'x', 'z', 'y', 1, - 1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny\n\t\tbuildPlane( 'x', 'y', 'z', 1, - 1, width, height, depth, widthSegments, heightSegments, 4 ); // pz\n\t\tbuildPlane( 'x', 'y', 'z', - 1, - 1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) {\n\n\t\t\tconst segmentWidth = width / gridX;\n\t\t\tconst segmentHeight = height / gridY;\n\n\t\t\tconst widthHalf = width / 2;\n\t\t\tconst heightHalf = height / 2;\n\t\t\tconst depthHalf = depth / 2;\n\n\t\t\tconst gridX1 = gridX + 1;\n\t\t\tconst gridY1 = gridY + 1;\n\n\t\t\tlet vertexCounter = 0;\n\t\t\tlet groupCount = 0;\n\n\t\t\tconst vector = new Vector3();\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( let iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\t\tconst y = iy * segmentHeight - heightHalf;\n\n\t\t\t\tfor ( let ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\t\tconst x = ix * segmentWidth - widthHalf;\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = x * udir;\n\t\t\t\t\tvector[ v ] = y * vdir;\n\t\t\t\t\tvector[ w ] = depthHalf;\n\n\t\t\t\t\t// now apply vector to vertex buffer\n\n\t\t\t\t\tvertices.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = 0;\n\t\t\t\t\tvector[ v ] = 0;\n\t\t\t\t\tvector[ w ] = depth > 0 ? 1 : - 1;\n\n\t\t\t\t\t// now apply vector to normal buffer\n\n\t\t\t\t\tnormals.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// uvs\n\n\t\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t\t\t// counters\n\n\t\t\t\t\tvertexCounter += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\t// 1. you need three indices to draw a single face\n\t\t\t// 2. a single segment consists of two faces\n\t\t\t// 3. so we need to generate six (2*3) indices per segment\n\n\t\t\tfor ( let iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\t\tfor ( let ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\t\tconst a = numberOfVertices + ix + gridX1 * iy;\n\t\t\t\t\tconst b = numberOfVertices + ix + gridX1 * ( iy + 1 );\n\t\t\t\t\tconst c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\t\tconst d = numberOfVertices + ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// increase counter\n\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, materialIndex );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t\t// update total number of vertices\n\n\t\t\tnumberOfVertices += vertexCounter;\n\n\t\t}\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new BoxGeometry( data.width, data.height, data.depth, data.widthSegments, data.heightSegments, data.depthSegments );\n\n\t}\n\n}\n\nexport { BoxGeometry, BoxGeometry as BoxBufferGeometry };\n","import { BufferGeometry } from '../core/BufferGeometry.js';\nimport { Float32BufferAttribute } from '../core/BufferAttribute.js';\n\nclass PlaneGeometry extends BufferGeometry {\n\n\tconstructor( width = 1, height = 1, widthSegments = 1, heightSegments = 1 ) {\n\n\t\tsuper();\n\t\tthis.type = 'PlaneGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments\n\t\t};\n\n\t\tconst width_half = width / 2;\n\t\tconst height_half = height / 2;\n\n\t\tconst gridX = Math.floor( widthSegments );\n\t\tconst gridY = Math.floor( heightSegments );\n\n\t\tconst gridX1 = gridX + 1;\n\t\tconst gridY1 = gridY + 1;\n\n\t\tconst segment_width = width / gridX;\n\t\tconst segment_height = height / gridY;\n\n\t\t//\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\tfor ( let iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\tconst y = iy * segment_height - height_half;\n\n\t\t\tfor ( let ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\tconst x = ix * segment_width - width_half;\n\n\t\t\t\tvertices.push( x, - y, 0 );\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\tfor ( let ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\tconst a = ix + gridX1 * iy;\n\t\t\t\tconst b = ix + gridX1 * ( iy + 1 );\n\t\t\t\tconst c = ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\tconst d = ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new PlaneGeometry( data.width, data.height, data.widthSegments, data.heightSegments );\n\n\t}\n\n}\n\nexport { PlaneGeometry, PlaneGeometry as PlaneBufferGeometry };\n","import { EventDispatcher } from '../core/EventDispatcher.js';\nimport { FrontSide, FlatShading, NormalBlending, LessEqualDepth, AddEquation, OneMinusSrcAlphaFactor, SrcAlphaFactor, AlwaysStencilFunc, KeepStencilOp } from '../constants.js';\nimport * as MathUtils from '../math/MathUtils.js';\n\nlet materialId = 0;\n\nclass Material extends EventDispatcher {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tObject.defineProperty( this, 'id', { value: materialId ++ } );\n\n\t\tthis.uuid = MathUtils.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Material';\n\n\t\tthis.fog = true;\n\n\t\tthis.blending = NormalBlending;\n\t\tthis.side = FrontSide;\n\t\tthis.vertexColors = false;\n\n\t\tthis.opacity = 1;\n\t\tthis.transparent = false;\n\n\t\tthis.blendSrc = SrcAlphaFactor;\n\t\tthis.blendDst = OneMinusSrcAlphaFactor;\n\t\tthis.blendEquation = AddEquation;\n\t\tthis.blendSrcAlpha = null;\n\t\tthis.blendDstAlpha = null;\n\t\tthis.blendEquationAlpha = null;\n\n\t\tthis.depthFunc = LessEqualDepth;\n\t\tthis.depthTest = true;\n\t\tthis.depthWrite = true;\n\n\t\tthis.stencilWriteMask = 0xff;\n\t\tthis.stencilFunc = AlwaysStencilFunc;\n\t\tthis.stencilRef = 0;\n\t\tthis.stencilFuncMask = 0xff;\n\t\tthis.stencilFail = KeepStencilOp;\n\t\tthis.stencilZFail = KeepStencilOp;\n\t\tthis.stencilZPass = KeepStencilOp;\n\t\tthis.stencilWrite = false;\n\n\t\tthis.clippingPlanes = null;\n\t\tthis.clipIntersection = false;\n\t\tthis.clipShadows = false;\n\n\t\tthis.shadowSide = null;\n\n\t\tthis.colorWrite = true;\n\n\t\tthis.precision = null; // override the renderer's default precision for this material\n\n\t\tthis.polygonOffset = false;\n\t\tthis.polygonOffsetFactor = 0;\n\t\tthis.polygonOffsetUnits = 0;\n\n\t\tthis.dithering = false;\n\n\t\tthis.alphaToCoverage = false;\n\t\tthis.premultipliedAlpha = false;\n\n\t\tthis.visible = true;\n\n\t\tthis.toneMapped = true;\n\n\t\tthis.userData = {};\n\n\t\tthis.version = 0;\n\n\t\tthis._alphaTest = 0;\n\n\t}\n\n\tget alphaTest() {\n\n\t\treturn this._alphaTest;\n\n\t}\n\n\tset alphaTest( value ) {\n\n\t\tif ( this._alphaTest > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._alphaTest = value;\n\n\t}\n\n\tonBuild( /* shaderobject, renderer */ ) {}\n\n\tonBeforeRender( /* renderer, scene, camera, geometry, object, group */ ) {}\n\n\tonBeforeCompile( /* shaderobject, renderer */ ) {}\n\n\tcustomProgramCacheKey() {\n\n\t\treturn this.onBeforeCompile.toString();\n\n\t}\n\n\tsetValues( values ) {\n\n\t\tif ( values === undefined ) return;\n\n\t\tfor ( const key in values ) {\n\n\t\t\tconst newValue = values[ key ];\n\n\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Material: \\'' + key + '\\' parameter is undefined.' );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// for backward compatability if shading is set in the constructor\n\t\t\tif ( key === 'shading' ) {\n\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' );\n\t\t\t\tthis.flatShading = ( newValue === FlatShading ) ? true : false;\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst currentValue = this[ key ];\n\n\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': \\'' + key + '\\' is not a property of this material.' );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( currentValue && currentValue.isColor ) {\n\n\t\t\t\tcurrentValue.set( newValue );\n\n\t\t\t} else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else {\n\n\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst isRoot = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( isRoot ) {\n\n\t\t\tmeta = {\n\t\t\t\ttextures: {},\n\t\t\t\timages: {}\n\t\t\t};\n\n\t\t}\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Material',\n\t\t\t\tgenerator: 'Material.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard Material serialization\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\n\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\tif ( this.color && this.color.isColor ) data.color = this.color.getHex();\n\n\t\tif ( this.roughness !== undefined ) data.roughness = this.roughness;\n\t\tif ( this.metalness !== undefined ) data.metalness = this.metalness;\n\n\t\tif ( this.sheen !== undefined ) data.sheen = this.sheen;\n\t\tif ( this.sheenColor && this.sheenColor.isColor ) data.sheenColor = this.sheenColor.getHex();\n\t\tif ( this.sheenRoughness !== undefined ) data.sheenRoughness = this.sheenRoughness;\n\t\tif ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex();\n\t\tif ( this.emissiveIntensity && this.emissiveIntensity !== 1 ) data.emissiveIntensity = this.emissiveIntensity;\n\n\t\tif ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex();\n\t\tif ( this.specularIntensity !== undefined ) data.specularIntensity = this.specularIntensity;\n\t\tif ( this.specularColor && this.specularColor.isColor ) data.specularColor = this.specularColor.getHex();\n\t\tif ( this.shininess !== undefined ) data.shininess = this.shininess;\n\t\tif ( this.clearcoat !== undefined ) data.clearcoat = this.clearcoat;\n\t\tif ( this.clearcoatRoughness !== undefined ) data.clearcoatRoughness = this.clearcoatRoughness;\n\n\t\tif ( this.clearcoatMap && this.clearcoatMap.isTexture ) {\n\n\t\t\tdata.clearcoatMap = this.clearcoatMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.clearcoatRoughnessMap && this.clearcoatRoughnessMap.isTexture ) {\n\n\t\t\tdata.clearcoatRoughnessMap = this.clearcoatRoughnessMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.clearcoatNormalMap && this.clearcoatNormalMap.isTexture ) {\n\n\t\t\tdata.clearcoatNormalMap = this.clearcoatNormalMap.toJSON( meta ).uuid;\n\t\t\tdata.clearcoatNormalScale = this.clearcoatNormalScale.toArray();\n\n\t\t}\n\n\t\tif ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid;\n\t\tif ( this.matcap && this.matcap.isTexture ) data.matcap = this.matcap.toJSON( meta ).uuid;\n\t\tif ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid;\n\n\t\tif ( this.lightMap && this.lightMap.isTexture ) {\n\n\t\t\tdata.lightMap = this.lightMap.toJSON( meta ).uuid;\n\t\t\tdata.lightMapIntensity = this.lightMapIntensity;\n\n\t\t}\n\n\t\tif ( this.aoMap && this.aoMap.isTexture ) {\n\n\t\t\tdata.aoMap = this.aoMap.toJSON( meta ).uuid;\n\t\t\tdata.aoMapIntensity = this.aoMapIntensity;\n\n\t\t}\n\n\t\tif ( this.bumpMap && this.bumpMap.isTexture ) {\n\n\t\t\tdata.bumpMap = this.bumpMap.toJSON( meta ).uuid;\n\t\t\tdata.bumpScale = this.bumpScale;\n\n\t\t}\n\n\t\tif ( this.normalMap && this.normalMap.isTexture ) {\n\n\t\t\tdata.normalMap = this.normalMap.toJSON( meta ).uuid;\n\t\t\tdata.normalMapType = this.normalMapType;\n\t\t\tdata.normalScale = this.normalScale.toArray();\n\n\t\t}\n\n\t\tif ( this.displacementMap && this.displacementMap.isTexture ) {\n\n\t\t\tdata.displacementMap = this.displacementMap.toJSON( meta ).uuid;\n\t\t\tdata.displacementScale = this.displacementScale;\n\t\t\tdata.displacementBias = this.displacementBias;\n\n\t\t}\n\n\t\tif ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid;\n\t\tif ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid;\n\n\t\tif ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid;\n\t\tif ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid;\n\t\tif ( this.specularIntensityMap && this.specularIntensityMap.isTexture ) data.specularIntensityMap = this.specularIntensityMap.toJSON( meta ).uuid;\n\t\tif ( this.specularColorMap && this.specularColorMap.isTexture ) data.specularColorMap = this.specularColorMap.toJSON( meta ).uuid;\n\n\t\tif ( this.envMap && this.envMap.isTexture ) {\n\n\t\t\tdata.envMap = this.envMap.toJSON( meta ).uuid;\n\n\t\t\tif ( this.combine !== undefined ) data.combine = this.combine;\n\n\t\t}\n\n\t\tif ( this.envMapIntensity !== undefined ) data.envMapIntensity = this.envMapIntensity;\n\t\tif ( this.reflectivity !== undefined ) data.reflectivity = this.reflectivity;\n\t\tif ( this.refractionRatio !== undefined ) data.refractionRatio = this.refractionRatio;\n\n\t\tif ( this.gradientMap && this.gradientMap.isTexture ) {\n\n\t\t\tdata.gradientMap = this.gradientMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.transmission !== undefined ) data.transmission = this.transmission;\n\t\tif ( this.transmissionMap && this.transmissionMap.isTexture ) data.transmissionMap = this.transmissionMap.toJSON( meta ).uuid;\n\t\tif ( this.thickness !== undefined ) data.thickness = this.thickness;\n\t\tif ( this.thicknessMap && this.thicknessMap.isTexture ) data.thicknessMap = this.thicknessMap.toJSON( meta ).uuid;\n\t\tif ( this.attenuationDistance !== undefined ) data.attenuationDistance = this.attenuationDistance;\n\t\tif ( this.attenuationColor !== undefined ) data.attenuationColor = this.attenuationColor.getHex();\n\n\t\tif ( this.size !== undefined ) data.size = this.size;\n\t\tif ( this.shadowSide !== null ) data.shadowSide = this.shadowSide;\n\t\tif ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation;\n\n\t\tif ( this.blending !== NormalBlending ) data.blending = this.blending;\n\t\tif ( this.side !== FrontSide ) data.side = this.side;\n\t\tif ( this.vertexColors ) data.vertexColors = true;\n\n\t\tif ( this.opacity < 1 ) data.opacity = this.opacity;\n\t\tif ( this.transparent === true ) data.transparent = this.transparent;\n\n\t\tdata.depthFunc = this.depthFunc;\n\t\tdata.depthTest = this.depthTest;\n\t\tdata.depthWrite = this.depthWrite;\n\t\tdata.colorWrite = this.colorWrite;\n\n\t\tdata.stencilWrite = this.stencilWrite;\n\t\tdata.stencilWriteMask = this.stencilWriteMask;\n\t\tdata.stencilFunc = this.stencilFunc;\n\t\tdata.stencilRef = this.stencilRef;\n\t\tdata.stencilFuncMask = this.stencilFuncMask;\n\t\tdata.stencilFail = this.stencilFail;\n\t\tdata.stencilZFail = this.stencilZFail;\n\t\tdata.stencilZPass = this.stencilZPass;\n\n\t\t// rotation (SpriteMaterial)\n\t\tif ( this.rotation && this.rotation !== 0 ) data.rotation = this.rotation;\n\n\t\tif ( this.polygonOffset === true ) data.polygonOffset = true;\n\t\tif ( this.polygonOffsetFactor !== 0 ) data.polygonOffsetFactor = this.polygonOffsetFactor;\n\t\tif ( this.polygonOffsetUnits !== 0 ) data.polygonOffsetUnits = this.polygonOffsetUnits;\n\n\t\tif ( this.linewidth && this.linewidth !== 1 ) data.linewidth = this.linewidth;\n\t\tif ( this.dashSize !== undefined ) data.dashSize = this.dashSize;\n\t\tif ( this.gapSize !== undefined ) data.gapSize = this.gapSize;\n\t\tif ( this.scale !== undefined ) data.scale = this.scale;\n\n\t\tif ( this.dithering === true ) data.dithering = true;\n\n\t\tif ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest;\n\t\tif ( this.alphaToCoverage === true ) data.alphaToCoverage = this.alphaToCoverage;\n\t\tif ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha;\n\n\t\tif ( this.wireframe === true ) data.wireframe = this.wireframe;\n\t\tif ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth;\n\t\tif ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap;\n\t\tif ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin;\n\n\t\tif ( this.flatShading === true ) data.flatShading = this.flatShading;\n\n\t\tif ( this.visible === false ) data.visible = false;\n\n\t\tif ( this.toneMapped === false ) data.toneMapped = false;\n\n\t\tif ( JSON.stringify( this.userData ) !== '{}' ) data.userData = this.userData;\n\n\t\t// TODO: Copied from Object3D.toJSON\n\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tconst values = [];\n\n\t\t\tfor ( const key in cache ) {\n\n\t\t\t\tconst data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t\tif ( isRoot ) {\n\n\t\t\tconst textures = extractFromCache( meta.textures );\n\t\t\tconst images = extractFromCache( meta.images );\n\n\t\t\tif ( textures.length > 0 ) data.textures = textures;\n\t\t\tif ( images.length > 0 ) data.images = images;\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.fog = source.fog;\n\n\t\tthis.blending = source.blending;\n\t\tthis.side = source.side;\n\t\tthis.vertexColors = source.vertexColors;\n\n\t\tthis.opacity = source.opacity;\n\t\tthis.transparent = source.transparent;\n\n\t\tthis.blendSrc = source.blendSrc;\n\t\tthis.blendDst = source.blendDst;\n\t\tthis.blendEquation = source.blendEquation;\n\t\tthis.blendSrcAlpha = source.blendSrcAlpha;\n\t\tthis.blendDstAlpha = source.blendDstAlpha;\n\t\tthis.blendEquationAlpha = source.blendEquationAlpha;\n\n\t\tthis.depthFunc = source.depthFunc;\n\t\tthis.depthTest = source.depthTest;\n\t\tthis.depthWrite = source.depthWrite;\n\n\t\tthis.stencilWriteMask = source.stencilWriteMask;\n\t\tthis.stencilFunc = source.stencilFunc;\n\t\tthis.stencilRef = source.stencilRef;\n\t\tthis.stencilFuncMask = source.stencilFuncMask;\n\t\tthis.stencilFail = source.stencilFail;\n\t\tthis.stencilZFail = source.stencilZFail;\n\t\tthis.stencilZPass = source.stencilZPass;\n\t\tthis.stencilWrite = source.stencilWrite;\n\n\t\tconst srcPlanes = source.clippingPlanes;\n\t\tlet dstPlanes = null;\n\n\t\tif ( srcPlanes !== null ) {\n\n\t\t\tconst n = srcPlanes.length;\n\t\t\tdstPlanes = new Array( n );\n\n\t\t\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\t\t\tdstPlanes[ i ] = srcPlanes[ i ].clone();\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.clippingPlanes = dstPlanes;\n\t\tthis.clipIntersection = source.clipIntersection;\n\t\tthis.clipShadows = source.clipShadows;\n\n\t\tthis.shadowSide = source.shadowSide;\n\n\t\tthis.colorWrite = source.colorWrite;\n\n\t\tthis.precision = source.precision;\n\n\t\tthis.polygonOffset = source.polygonOffset;\n\t\tthis.polygonOffsetFactor = source.polygonOffsetFactor;\n\t\tthis.polygonOffsetUnits = source.polygonOffsetUnits;\n\n\t\tthis.dithering = source.dithering;\n\n\t\tthis.alphaTest = source.alphaTest;\n\t\tthis.alphaToCoverage = source.alphaToCoverage;\n\t\tthis.premultipliedAlpha = source.premultipliedAlpha;\n\n\t\tthis.visible = source.visible;\n\n\t\tthis.toneMapped = source.toneMapped;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n}\n\nMaterial.prototype.isMaterial = true;\n\nexport { Material };\n","/**\n * Uniform Utilities\n */\n\nexport function cloneUniforms( src ) {\n\n\tconst dst = {};\n\n\tfor ( const u in src ) {\n\n\t\tdst[ u ] = {};\n\n\t\tfor ( const p in src[ u ] ) {\n\n\t\t\tconst property = src[ u ][ p ];\n\n\t\t\tif ( property && ( property.isColor ||\n\t\t\t\tproperty.isMatrix3 || property.isMatrix4 ||\n\t\t\t\tproperty.isVector2 || property.isVector3 || property.isVector4 ||\n\t\t\t\tproperty.isTexture || property.isQuaternion ) ) {\n\n\t\t\t\tdst[ u ][ p ] = property.clone();\n\n\t\t\t} else if ( Array.isArray( property ) ) {\n\n\t\t\t\tdst[ u ][ p ] = property.slice();\n\n\t\t\t} else {\n\n\t\t\t\tdst[ u ][ p ] = property;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn dst;\n\n}\n\nexport function mergeUniforms( uniforms ) {\n\n\tconst merged = {};\n\n\tfor ( let u = 0; u < uniforms.length; u ++ ) {\n\n\t\tconst tmp = cloneUniforms( uniforms[ u ] );\n\n\t\tfor ( const p in tmp ) {\n\n\t\t\tmerged[ p ] = tmp[ p ];\n\n\t\t}\n\n\t}\n\n\treturn merged;\n\n}\n\n// Legacy\n\nconst UniformsUtils = { clone: cloneUniforms, merge: mergeUniforms };\n\nexport { UniformsUtils };\n","export default /* glsl */`\nvoid main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}\n`;\n","export default /* glsl */`\nvoid main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}\n`;\n","import { Material } from './Material.js';\nimport { cloneUniforms } from '../renderers/shaders/UniformsUtils.js';\n\nimport default_vertex from '../renderers/shaders/ShaderChunk/default_vertex.glsl.js';\nimport default_fragment from '../renderers/shaders/ShaderChunk/default_fragment.glsl.js';\n\n/**\n * parameters = {\n * defines: { \"label\" : \"value\" },\n * uniforms: { \"parameter1\": { value: 1.0 }, \"parameter2\": { value2: 2 } },\n *\n * fragmentShader: ,\n * vertexShader: ,\n *\n * wireframe: ,\n * wireframeLinewidth: ,\n *\n * lights: \n * }\n */\n\nclass ShaderMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ShaderMaterial';\n\n\t\tthis.defines = {};\n\t\tthis.uniforms = {};\n\n\t\tthis.vertexShader = default_vertex;\n\t\tthis.fragmentShader = default_fragment;\n\n\t\tthis.linewidth = 1;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.fog = false; // set to use scene fog\n\t\tthis.lights = false; // set to use scene lights\n\t\tthis.clipping = false; // set to use user-defined clipping planes\n\n\t\tthis.extensions = {\n\t\t\tderivatives: false, // set to use derivatives\n\t\t\tfragDepth: false, // set to use fragment depth values\n\t\t\tdrawBuffers: false, // set to use draw buffers\n\t\t\tshaderTextureLOD: false // set to use shader texture LOD\n\t\t};\n\n\t\t// When rendered geometry doesn't include these attributes but the material does,\n\t\t// use these default values in WebGL. This avoids errors when buffer data is missing.\n\t\tthis.defaultAttributeValues = {\n\t\t\t'color': [ 1, 1, 1 ],\n\t\t\t'uv': [ 0, 0 ],\n\t\t\t'uv2': [ 0, 0 ]\n\t\t};\n\n\t\tthis.index0AttributeName = undefined;\n\t\tthis.uniformsNeedUpdate = false;\n\n\t\tthis.glslVersion = null;\n\n\t\tif ( parameters !== undefined ) {\n\n\t\t\tif ( parameters.attributes !== undefined ) {\n\n\t\t\t\tconsole.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' );\n\n\t\t\t}\n\n\t\t\tthis.setValues( parameters );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.fragmentShader = source.fragmentShader;\n\t\tthis.vertexShader = source.vertexShader;\n\n\t\tthis.uniforms = cloneUniforms( source.uniforms );\n\n\t\tthis.defines = Object.assign( {}, source.defines );\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.lights = source.lights;\n\t\tthis.clipping = source.clipping;\n\n\t\tthis.extensions = Object.assign( {}, source.extensions );\n\n\t\tthis.glslVersion = source.glslVersion;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.glslVersion = this.glslVersion;\n\t\tdata.uniforms = {};\n\n\t\tfor ( const name in this.uniforms ) {\n\n\t\t\tconst uniform = this.uniforms[ name ];\n\t\t\tconst value = uniform.value;\n\n\t\t\tif ( value && value.isTexture ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 't',\n\t\t\t\t\tvalue: value.toJSON( meta ).uuid\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isColor ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'c',\n\t\t\t\t\tvalue: value.getHex()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector2 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v2',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector3 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v3',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector4 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v4',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isMatrix3 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'm3',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isMatrix4 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'm4',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\tvalue: value\n\t\t\t\t};\n\n\t\t\t\t// note: the array variants v2v, v3v, v4v, m4v and tv are not supported so far\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( Object.keys( this.defines ).length > 0 ) data.defines = this.defines;\n\n\t\tdata.vertexShader = this.vertexShader;\n\t\tdata.fragmentShader = this.fragmentShader;\n\n\t\tconst extensions = {};\n\n\t\tfor ( const key in this.extensions ) {\n\n\t\t\tif ( this.extensions[ key ] === true ) extensions[ key ] = true;\n\n\t\t}\n\n\t\tif ( Object.keys( extensions ).length > 0 ) data.extensions = extensions;\n\n\t\treturn data;\n\n\t}\n\n}\n\nShaderMaterial.prototype.isShaderMaterial = true;\n\nexport { ShaderMaterial };\n","import { Vector3 } from './Vector3.js';\n\nconst _vector = /*@__PURE__*/ new Vector3();\nconst _segCenter = /*@__PURE__*/ new Vector3();\nconst _segDir = /*@__PURE__*/ new Vector3();\nconst _diff = /*@__PURE__*/ new Vector3();\n\nconst _edge1 = /*@__PURE__*/ new Vector3();\nconst _edge2 = /*@__PURE__*/ new Vector3();\nconst _normal = /*@__PURE__*/ new Vector3();\n\nclass Ray {\n\n\tconstructor( origin = new Vector3(), direction = new Vector3( 0, 0, - 1 ) ) {\n\n\t\tthis.origin = origin;\n\t\tthis.direction = direction;\n\n\t}\n\n\tset( origin, direction ) {\n\n\t\tthis.origin.copy( origin );\n\t\tthis.direction.copy( direction );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( ray ) {\n\n\t\tthis.origin.copy( ray.origin );\n\t\tthis.direction.copy( ray.direction );\n\n\t\treturn this;\n\n\t}\n\n\tat( t, target ) {\n\n\t\treturn target.copy( this.direction ).multiplyScalar( t ).add( this.origin );\n\n\t}\n\n\tlookAt( v ) {\n\n\t\tthis.direction.copy( v ).sub( this.origin ).normalize();\n\n\t\treturn this;\n\n\t}\n\n\trecast( t ) {\n\n\t\tthis.origin.copy( this.at( t, _vector ) );\n\n\t\treturn this;\n\n\t}\n\n\tclosestPointToPoint( point, target ) {\n\n\t\ttarget.subVectors( point, this.origin );\n\n\t\tconst directionDistance = target.dot( this.direction );\n\n\t\tif ( directionDistance < 0 ) {\n\n\t\t\treturn target.copy( this.origin );\n\n\t\t}\n\n\t\treturn target.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\treturn Math.sqrt( this.distanceSqToPoint( point ) );\n\n\t}\n\n\tdistanceSqToPoint( point ) {\n\n\t\tconst directionDistance = _vector.subVectors( point, this.origin ).dot( this.direction );\n\n\t\t// point behind the ray\n\n\t\tif ( directionDistance < 0 ) {\n\n\t\t\treturn this.origin.distanceToSquared( point );\n\n\t\t}\n\n\t\t_vector.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t\treturn _vector.distanceToSquared( point );\n\n\t}\n\n\tdistanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) {\n\n\t\t// from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteDistRaySegment.h\n\t\t// It returns the min distance between the ray and the segment\n\t\t// defined by v0 and v1\n\t\t// It can also set two optional targets :\n\t\t// - The closest point on the ray\n\t\t// - The closest point on the segment\n\n\t\t_segCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 );\n\t\t_segDir.copy( v1 ).sub( v0 ).normalize();\n\t\t_diff.copy( this.origin ).sub( _segCenter );\n\n\t\tconst segExtent = v0.distanceTo( v1 ) * 0.5;\n\t\tconst a01 = - this.direction.dot( _segDir );\n\t\tconst b0 = _diff.dot( this.direction );\n\t\tconst b1 = - _diff.dot( _segDir );\n\t\tconst c = _diff.lengthSq();\n\t\tconst det = Math.abs( 1 - a01 * a01 );\n\t\tlet s0, s1, sqrDist, extDet;\n\n\t\tif ( det > 0 ) {\n\n\t\t\t// The ray and segment are not parallel.\n\n\t\t\ts0 = a01 * b1 - b0;\n\t\t\ts1 = a01 * b0 - b1;\n\t\t\textDet = segExtent * det;\n\n\t\t\tif ( s0 >= 0 ) {\n\n\t\t\t\tif ( s1 >= - extDet ) {\n\n\t\t\t\t\tif ( s1 <= extDet ) {\n\n\t\t\t\t\t\t// region 0\n\t\t\t\t\t\t// Minimum at interior points of ray and segment.\n\n\t\t\t\t\t\tconst invDet = 1 / det;\n\t\t\t\t\t\ts0 *= invDet;\n\t\t\t\t\t\ts1 *= invDet;\n\t\t\t\t\t\tsqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// region 1\n\n\t\t\t\t\t\ts1 = segExtent;\n\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// region 5\n\n\t\t\t\t\ts1 = - segExtent;\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( s1 <= - extDet ) {\n\n\t\t\t\t\t// region 4\n\n\t\t\t\t\ts0 = Math.max( 0, - ( - a01 * segExtent + b0 ) );\n\t\t\t\t\ts1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t} else if ( s1 <= extDet ) {\n\n\t\t\t\t\t// region 3\n\n\t\t\t\t\ts0 = 0;\n\t\t\t\t\ts1 = Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// region 2\n\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * segExtent + b0 ) );\n\t\t\t\t\ts1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// Ray and segment are parallel.\n\n\t\t\ts1 = ( a01 > 0 ) ? - segExtent : segExtent;\n\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t}\n\n\t\tif ( optionalPointOnRay ) {\n\n\t\t\toptionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin );\n\n\t\t}\n\n\t\tif ( optionalPointOnSegment ) {\n\n\t\t\toptionalPointOnSegment.copy( _segDir ).multiplyScalar( s1 ).add( _segCenter );\n\n\t\t}\n\n\t\treturn sqrDist;\n\n\t}\n\n\tintersectSphere( sphere, target ) {\n\n\t\t_vector.subVectors( sphere.center, this.origin );\n\t\tconst tca = _vector.dot( this.direction );\n\t\tconst d2 = _vector.dot( _vector ) - tca * tca;\n\t\tconst radius2 = sphere.radius * sphere.radius;\n\n\t\tif ( d2 > radius2 ) return null;\n\n\t\tconst thc = Math.sqrt( radius2 - d2 );\n\n\t\t// t0 = first intersect point - entrance on front of sphere\n\t\tconst t0 = tca - thc;\n\n\t\t// t1 = second intersect point - exit point on back of sphere\n\t\tconst t1 = tca + thc;\n\n\t\t// test to see if both t0 and t1 are behind the ray - if so, return null\n\t\tif ( t0 < 0 && t1 < 0 ) return null;\n\n\t\t// test to see if t0 is behind the ray:\n\t\t// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,\n\t\t// in order to always return an intersect point that is in front of the ray.\n\t\tif ( t0 < 0 ) return this.at( t1, target );\n\n\t\t// else t0 is in front of the ray, so return the first collision point scaled by t0\n\t\treturn this.at( t0, target );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\treturn this.distanceSqToPoint( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t}\n\n\tdistanceToPlane( plane ) {\n\n\t\tconst denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator === 0 ) {\n\n\t\t\t// line is coplanar, return origin\n\t\t\tif ( plane.distanceToPoint( this.origin ) === 0 ) {\n\n\t\t\t\treturn 0;\n\n\t\t\t}\n\n\t\t\t// Null is preferable to undefined since undefined means.... it is undefined\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator;\n\n\t\t// Return if the ray never intersects the plane\n\n\t\treturn t >= 0 ? t : null;\n\n\t}\n\n\tintersectPlane( plane, target ) {\n\n\t\tconst t = this.distanceToPlane( plane );\n\n\t\tif ( t === null ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn this.at( t, target );\n\n\t}\n\n\tintersectsPlane( plane ) {\n\n\t\t// check if the ray lies on the plane first\n\n\t\tconst distToPoint = plane.distanceToPoint( this.origin );\n\n\t\tif ( distToPoint === 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tconst denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator * distToPoint < 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\t// ray origin is behind the plane (and is pointing behind it)\n\n\t\treturn false;\n\n\t}\n\n\tintersectBox( box, target ) {\n\n\t\tlet tmin, tmax, tymin, tymax, tzmin, tzmax;\n\n\t\tconst invdirx = 1 / this.direction.x,\n\t\t\tinvdiry = 1 / this.direction.y,\n\t\t\tinvdirz = 1 / this.direction.z;\n\n\t\tconst origin = this.origin;\n\n\t\tif ( invdirx >= 0 ) {\n\n\t\t\ttmin = ( box.min.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.max.x - origin.x ) * invdirx;\n\n\t\t} else {\n\n\t\t\ttmin = ( box.max.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.min.x - origin.x ) * invdirx;\n\n\t\t}\n\n\t\tif ( invdiry >= 0 ) {\n\n\t\t\ttymin = ( box.min.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.max.y - origin.y ) * invdiry;\n\n\t\t} else {\n\n\t\t\ttymin = ( box.max.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.min.y - origin.y ) * invdiry;\n\n\t\t}\n\n\t\tif ( ( tmin > tymax ) || ( tymin > tmax ) ) return null;\n\n\t\t// These lines also handle the case where tmin or tmax is NaN\n\t\t// (result of 0 * Infinity). x !== x returns true if x is NaN\n\n\t\tif ( tymin > tmin || tmin !== tmin ) tmin = tymin;\n\n\t\tif ( tymax < tmax || tmax !== tmax ) tmax = tymax;\n\n\t\tif ( invdirz >= 0 ) {\n\n\t\t\ttzmin = ( box.min.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.max.z - origin.z ) * invdirz;\n\n\t\t} else {\n\n\t\t\ttzmin = ( box.max.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.min.z - origin.z ) * invdirz;\n\n\t\t}\n\n\t\tif ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null;\n\n\t\tif ( tzmin > tmin || tmin !== tmin ) tmin = tzmin;\n\n\t\tif ( tzmax < tmax || tmax !== tmax ) tmax = tzmax;\n\n\t\t//return point closest to the ray (positive side)\n\n\t\tif ( tmax < 0 ) return null;\n\n\t\treturn this.at( tmin >= 0 ? tmin : tmax, target );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn this.intersectBox( box, _vector ) !== null;\n\n\t}\n\n\tintersectTriangle( a, b, c, backfaceCulling, target ) {\n\n\t\t// Compute the offset origin, edges, and normal.\n\n\t\t// from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n\n\t\t_edge1.subVectors( b, a );\n\t\t_edge2.subVectors( c, a );\n\t\t_normal.crossVectors( _edge1, _edge2 );\n\n\t\t// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,\n\t\t// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by\n\t\t// |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))\n\t\t// |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))\n\t\t// |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)\n\t\tlet DdN = this.direction.dot( _normal );\n\t\tlet sign;\n\n\t\tif ( DdN > 0 ) {\n\n\t\t\tif ( backfaceCulling ) return null;\n\t\t\tsign = 1;\n\n\t\t} else if ( DdN < 0 ) {\n\n\t\t\tsign = - 1;\n\t\t\tDdN = - DdN;\n\n\t\t} else {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t_diff.subVectors( this.origin, a );\n\t\tconst DdQxE2 = sign * this.direction.dot( _edge2.crossVectors( _diff, _edge2 ) );\n\n\t\t// b1 < 0, no intersection\n\t\tif ( DdQxE2 < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst DdE1xQ = sign * this.direction.dot( _edge1.cross( _diff ) );\n\n\t\t// b2 < 0, no intersection\n\t\tif ( DdE1xQ < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// b1+b2 > 1, no intersection\n\t\tif ( DdQxE2 + DdE1xQ > DdN ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// Line intersects triangle, check if ray does.\n\t\tconst QdN = - sign * _diff.dot( _normal );\n\n\t\t// t < 0, no intersection\n\t\tif ( QdN < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// Ray intersects triangle.\n\t\treturn this.at( QdN / DdN, target );\n\n\t}\n\n\tapplyMatrix4( matrix4 ) {\n\n\t\tthis.origin.applyMatrix4( matrix4 );\n\t\tthis.direction.transformDirection( matrix4 );\n\n\t\treturn this;\n\n\t}\n\n\tequals( ray ) {\n\n\t\treturn ray.origin.equals( this.origin ) && ray.direction.equals( this.direction );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nexport { Ray };\n","import { Vector3 } from './Vector3.js';\n\nconst _v0 = /*@__PURE__*/ new Vector3();\nconst _v1 = /*@__PURE__*/ new Vector3();\nconst _v2 = /*@__PURE__*/ new Vector3();\nconst _v3 = /*@__PURE__*/ new Vector3();\n\nconst _vab = /*@__PURE__*/ new Vector3();\nconst _vac = /*@__PURE__*/ new Vector3();\nconst _vbc = /*@__PURE__*/ new Vector3();\nconst _vap = /*@__PURE__*/ new Vector3();\nconst _vbp = /*@__PURE__*/ new Vector3();\nconst _vcp = /*@__PURE__*/ new Vector3();\n\nclass Triangle {\n\n\tconstructor( a = new Vector3(), b = new Vector3(), c = new Vector3() ) {\n\n\t\tthis.a = a;\n\t\tthis.b = b;\n\t\tthis.c = c;\n\n\t}\n\n\tstatic getNormal( a, b, c, target ) {\n\n\t\ttarget.subVectors( c, b );\n\t\t_v0.subVectors( a, b );\n\t\ttarget.cross( _v0 );\n\n\t\tconst targetLengthSq = target.lengthSq();\n\t\tif ( targetLengthSq > 0 ) {\n\n\t\t\treturn target.multiplyScalar( 1 / Math.sqrt( targetLengthSq ) );\n\n\t\t}\n\n\t\treturn target.set( 0, 0, 0 );\n\n\t}\n\n\t// static/instance method to calculate barycentric coordinates\n\t// based on: http://www.blackpawn.com/texts/pointinpoly/default.html\n\tstatic getBarycoord( point, a, b, c, target ) {\n\n\t\t_v0.subVectors( c, a );\n\t\t_v1.subVectors( b, a );\n\t\t_v2.subVectors( point, a );\n\n\t\tconst dot00 = _v0.dot( _v0 );\n\t\tconst dot01 = _v0.dot( _v1 );\n\t\tconst dot02 = _v0.dot( _v2 );\n\t\tconst dot11 = _v1.dot( _v1 );\n\t\tconst dot12 = _v1.dot( _v2 );\n\n\t\tconst denom = ( dot00 * dot11 - dot01 * dot01 );\n\n\t\t// collinear or singular triangle\n\t\tif ( denom === 0 ) {\n\n\t\t\t// arbitrary location outside of triangle?\n\t\t\t// not sure if this is the best idea, maybe should be returning undefined\n\t\t\treturn target.set( - 2, - 1, - 1 );\n\n\t\t}\n\n\t\tconst invDenom = 1 / denom;\n\t\tconst u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;\n\t\tconst v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;\n\n\t\t// barycentric coordinates must always sum to 1\n\t\treturn target.set( 1 - u - v, v, u );\n\n\t}\n\n\tstatic containsPoint( point, a, b, c ) {\n\n\t\tthis.getBarycoord( point, a, b, c, _v3 );\n\n\t\treturn ( _v3.x >= 0 ) && ( _v3.y >= 0 ) && ( ( _v3.x + _v3.y ) <= 1 );\n\n\t}\n\n\tstatic getUV( point, p1, p2, p3, uv1, uv2, uv3, target ) {\n\n\t\tthis.getBarycoord( point, p1, p2, p3, _v3 );\n\n\t\ttarget.set( 0, 0 );\n\t\ttarget.addScaledVector( uv1, _v3.x );\n\t\ttarget.addScaledVector( uv2, _v3.y );\n\t\ttarget.addScaledVector( uv3, _v3.z );\n\n\t\treturn target;\n\n\t}\n\n\tstatic isFrontFacing( a, b, c, direction ) {\n\n\t\t_v0.subVectors( c, b );\n\t\t_v1.subVectors( a, b );\n\n\t\t// strictly front facing\n\t\treturn ( _v0.cross( _v1 ).dot( direction ) < 0 ) ? true : false;\n\n\t}\n\n\tset( a, b, c ) {\n\n\t\tthis.a.copy( a );\n\t\tthis.b.copy( b );\n\t\tthis.c.copy( c );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPointsAndIndices( points, i0, i1, i2 ) {\n\n\t\tthis.a.copy( points[ i0 ] );\n\t\tthis.b.copy( points[ i1 ] );\n\t\tthis.c.copy( points[ i2 ] );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromAttributeAndIndices( attribute, i0, i1, i2 ) {\n\n\t\tthis.a.fromBufferAttribute( attribute, i0 );\n\t\tthis.b.fromBufferAttribute( attribute, i1 );\n\t\tthis.c.fromBufferAttribute( attribute, i2 );\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( triangle ) {\n\n\t\tthis.a.copy( triangle.a );\n\t\tthis.b.copy( triangle.b );\n\t\tthis.c.copy( triangle.c );\n\n\t\treturn this;\n\n\t}\n\n\tgetArea() {\n\n\t\t_v0.subVectors( this.c, this.b );\n\t\t_v1.subVectors( this.a, this.b );\n\n\t\treturn _v0.cross( _v1 ).length() * 0.5;\n\n\t}\n\n\tgetMidpoint( target ) {\n\n\t\treturn target.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );\n\n\t}\n\n\tgetNormal( target ) {\n\n\t\treturn Triangle.getNormal( this.a, this.b, this.c, target );\n\n\t}\n\n\tgetPlane( target ) {\n\n\t\treturn target.setFromCoplanarPoints( this.a, this.b, this.c );\n\n\t}\n\n\tgetBarycoord( point, target ) {\n\n\t\treturn Triangle.getBarycoord( point, this.a, this.b, this.c, target );\n\n\t}\n\n\tgetUV( point, uv1, uv2, uv3, target ) {\n\n\t\treturn Triangle.getUV( point, this.a, this.b, this.c, uv1, uv2, uv3, target );\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\treturn Triangle.containsPoint( point, this.a, this.b, this.c );\n\n\t}\n\n\tisFrontFacing( direction ) {\n\n\t\treturn Triangle.isFrontFacing( this.a, this.b, this.c, direction );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsTriangle( this );\n\n\t}\n\n\tclosestPointToPoint( p, target ) {\n\n\t\tconst a = this.a, b = this.b, c = this.c;\n\t\tlet v, w;\n\n\t\t// algorithm thanks to Real-Time Collision Detection by Christer Ericson,\n\t\t// published by Morgan Kaufmann Publishers, (c) 2005 Elsevier Inc.,\n\t\t// under the accompanying license; see chapter 5.1.5 for detailed explanation.\n\t\t// basically, we're distinguishing which of the voronoi regions of the triangle\n\t\t// the point lies in with the minimum amount of redundant computation.\n\n\t\t_vab.subVectors( b, a );\n\t\t_vac.subVectors( c, a );\n\t\t_vap.subVectors( p, a );\n\t\tconst d1 = _vab.dot( _vap );\n\t\tconst d2 = _vac.dot( _vap );\n\t\tif ( d1 <= 0 && d2 <= 0 ) {\n\n\t\t\t// vertex region of A; barycentric coords (1, 0, 0)\n\t\t\treturn target.copy( a );\n\n\t\t}\n\n\t\t_vbp.subVectors( p, b );\n\t\tconst d3 = _vab.dot( _vbp );\n\t\tconst d4 = _vac.dot( _vbp );\n\t\tif ( d3 >= 0 && d4 <= d3 ) {\n\n\t\t\t// vertex region of B; barycentric coords (0, 1, 0)\n\t\t\treturn target.copy( b );\n\n\t\t}\n\n\t\tconst vc = d1 * d4 - d3 * d2;\n\t\tif ( vc <= 0 && d1 >= 0 && d3 <= 0 ) {\n\n\t\t\tv = d1 / ( d1 - d3 );\n\t\t\t// edge region of AB; barycentric coords (1-v, v, 0)\n\t\t\treturn target.copy( a ).addScaledVector( _vab, v );\n\n\t\t}\n\n\t\t_vcp.subVectors( p, c );\n\t\tconst d5 = _vab.dot( _vcp );\n\t\tconst d6 = _vac.dot( _vcp );\n\t\tif ( d6 >= 0 && d5 <= d6 ) {\n\n\t\t\t// vertex region of C; barycentric coords (0, 0, 1)\n\t\t\treturn target.copy( c );\n\n\t\t}\n\n\t\tconst vb = d5 * d2 - d1 * d6;\n\t\tif ( vb <= 0 && d2 >= 0 && d6 <= 0 ) {\n\n\t\t\tw = d2 / ( d2 - d6 );\n\t\t\t// edge region of AC; barycentric coords (1-w, 0, w)\n\t\t\treturn target.copy( a ).addScaledVector( _vac, w );\n\n\t\t}\n\n\t\tconst va = d3 * d6 - d5 * d4;\n\t\tif ( va <= 0 && ( d4 - d3 ) >= 0 && ( d5 - d6 ) >= 0 ) {\n\n\t\t\t_vbc.subVectors( c, b );\n\t\t\tw = ( d4 - d3 ) / ( ( d4 - d3 ) + ( d5 - d6 ) );\n\t\t\t// edge region of BC; barycentric coords (0, 1-w, w)\n\t\t\treturn target.copy( b ).addScaledVector( _vbc, w ); // edge region of BC\n\n\t\t}\n\n\t\t// face region\n\t\tconst denom = 1 / ( va + vb + vc );\n\t\t// u = va * denom\n\t\tv = vb * denom;\n\t\tw = vc * denom;\n\n\t\treturn target.copy( a ).addScaledVector( _vab, v ).addScaledVector( _vac, w );\n\n\t}\n\n\tequals( triangle ) {\n\n\t\treturn triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );\n\n\t}\n\n}\n\nexport { Triangle };\n","import { Material } from './Material.js';\nimport { MultiplyOperation } from '../constants.js';\nimport { Color } from '../math/Color.js';\n\n/**\n * parameters = {\n * color: ,\n * opacity: ,\n * map: new THREE.Texture( ),\n *\n * lightMap: new THREE.Texture( ),\n * lightMapIntensity: \n *\n * aoMap: new THREE.Texture( ),\n * aoMapIntensity: \n *\n * specularMap: new THREE.Texture( ),\n *\n * alphaMap: new THREE.Texture( ),\n *\n * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),\n * combine: THREE.Multiply,\n * reflectivity: ,\n * refractionRatio: ,\n *\n * depthTest: ,\n * depthWrite: ,\n *\n * wireframe: ,\n * wireframeLinewidth: ,\n * }\n */\n\nclass MeshBasicMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'MeshBasicMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // emissive\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\treturn this;\n\n\t}\n\n}\n\nMeshBasicMaterial.prototype.isMeshBasicMaterial = true;\n\nexport { MeshBasicMaterial };\n","import { Vector3 } from '../math/Vector3.js';\nimport { Vector2 } from '../math/Vector2.js';\nimport { Sphere } from '../math/Sphere.js';\nimport { Ray } from '../math/Ray.js';\nimport { Matrix4 } from '../math/Matrix4.js';\nimport { Object3D } from '../core/Object3D.js';\nimport { Triangle } from '../math/Triangle.js';\nimport { DoubleSide, BackSide } from '../constants.js';\nimport { MeshBasicMaterial } from '../materials/MeshBasicMaterial.js';\nimport { BufferGeometry } from '../core/BufferGeometry.js';\n\nconst _inverseMatrix = /*@__PURE__*/ new Matrix4();\nconst _ray = /*@__PURE__*/ new Ray();\nconst _sphere = /*@__PURE__*/ new Sphere();\n\nconst _vA = /*@__PURE__*/ new Vector3();\nconst _vB = /*@__PURE__*/ new Vector3();\nconst _vC = /*@__PURE__*/ new Vector3();\n\nconst _tempA = /*@__PURE__*/ new Vector3();\nconst _tempB = /*@__PURE__*/ new Vector3();\nconst _tempC = /*@__PURE__*/ new Vector3();\n\nconst _morphA = /*@__PURE__*/ new Vector3();\nconst _morphB = /*@__PURE__*/ new Vector3();\nconst _morphC = /*@__PURE__*/ new Vector3();\n\nconst _uvA = /*@__PURE__*/ new Vector2();\nconst _uvB = /*@__PURE__*/ new Vector2();\nconst _uvC = /*@__PURE__*/ new Vector2();\n\nconst _intersectionPoint = /*@__PURE__*/ new Vector3();\nconst _intersectionPointWorld = /*@__PURE__*/ new Vector3();\n\nclass Mesh extends Object3D {\n\n\tconstructor( geometry = new BufferGeometry(), material = new MeshBasicMaterial() ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Mesh';\n\n\t\tthis.geometry = geometry;\n\t\tthis.material = material;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tif ( source.morphTargetInfluences !== undefined ) {\n\n\t\t\tthis.morphTargetInfluences = source.morphTargetInfluences.slice();\n\n\t\t}\n\n\t\tif ( source.morphTargetDictionary !== undefined ) {\n\n\t\t\tthis.morphTargetDictionary = Object.assign( {}, source.morphTargetDictionary );\n\n\t\t}\n\n\t\tthis.material = source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tconst morphAttributes = geometry.morphAttributes;\n\t\t\tconst keys = Object.keys( morphAttributes );\n\n\t\t\tif ( keys.length > 0 ) {\n\n\t\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst morphTargets = geometry.morphTargets;\n\n\t\t\tif ( morphTargets !== undefined && morphTargets.length > 0 ) {\n\n\t\t\t\tconsole.error( 'THREE.Mesh.updateMorphTargets() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst material = this.material;\n\t\tconst matrixWorld = this.matrixWorld;\n\n\t\tif ( material === undefined ) return;\n\n\t\t// Checking boundingSphere distance to ray\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere.copy( geometry.boundingSphere );\n\t\t_sphere.applyMatrix4( matrixWorld );\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere ) === false ) return;\n\n\t\t//\n\n\t\t_inverseMatrix.copy( matrixWorld ).invert();\n\t\t_ray.copy( raycaster.ray ).applyMatrix4( _inverseMatrix );\n\n\t\t// Check boundingBox before continuing\n\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tif ( _ray.intersectsBox( geometry.boundingBox ) === false ) return;\n\n\t\t}\n\n\t\tlet intersection;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tconst index = geometry.index;\n\t\t\tconst position = geometry.attributes.position;\n\t\t\tconst morphPosition = geometry.morphAttributes.position;\n\t\t\tconst morphTargetsRelative = geometry.morphTargetsRelative;\n\t\t\tconst uv = geometry.attributes.uv;\n\t\t\tconst uv2 = geometry.attributes.uv2;\n\t\t\tconst groups = geometry.groups;\n\t\t\tconst drawRange = geometry.drawRange;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\t// indexed buffer geometry\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\tconst start = Math.max( group.start, drawRange.start );\n\t\t\t\t\t\tconst end = Math.min( index.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) );\n\n\t\t\t\t\t\tfor ( let j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\t\t\tconst a = index.getX( j );\n\t\t\t\t\t\t\tconst b = index.getX( j + 1 );\n\t\t\t\t\t\t\tconst c = index.getX( j + 2 );\n\n\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, groupMaterial, raycaster, _ray, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c );\n\n\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( j / 3 ); // triangle number in indexed buffer semantics\n\t\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\t\tfor ( let i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\t\t\tconst a = index.getX( i );\n\t\t\t\t\t\tconst b = index.getX( i + 1 );\n\t\t\t\t\t\tconst c = index.getX( i + 2 );\n\n\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, material, raycaster, _ray, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in indexed buffer semantics\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( position !== undefined ) {\n\n\t\t\t\t// non-indexed buffer geometry\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\tconst start = Math.max( group.start, drawRange.start );\n\t\t\t\t\t\tconst end = Math.min( position.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) );\n\n\t\t\t\t\t\tfor ( let j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\t\t\tconst a = j;\n\t\t\t\t\t\t\tconst b = j + 1;\n\t\t\t\t\t\t\tconst c = j + 2;\n\n\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, groupMaterial, raycaster, _ray, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c );\n\n\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( j / 3 ); // triangle number in non-indexed buffer semantics\n\t\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\t\tconst end = Math.min( position.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\t\tfor ( let i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\t\t\tconst a = i;\n\t\t\t\t\t\tconst b = i + 1;\n\t\t\t\t\t\tconst c = i + 2;\n\n\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, material, raycaster, _ray, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in non-indexed buffer semantics\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\tconsole.error( 'THREE.Mesh.raycast() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' );\n\n\t\t}\n\n\t}\n\n}\n\nMesh.prototype.isMesh = true;\n\nfunction checkIntersection( object, material, raycaster, ray, pA, pB, pC, point ) {\n\n\tlet intersect;\n\n\tif ( material.side === BackSide ) {\n\n\t\tintersect = ray.intersectTriangle( pC, pB, pA, true, point );\n\n\t} else {\n\n\t\tintersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide, point );\n\n\t}\n\n\tif ( intersect === null ) return null;\n\n\t_intersectionPointWorld.copy( point );\n\t_intersectionPointWorld.applyMatrix4( object.matrixWorld );\n\n\tconst distance = raycaster.ray.origin.distanceTo( _intersectionPointWorld );\n\n\tif ( distance < raycaster.near || distance > raycaster.far ) return null;\n\n\treturn {\n\t\tdistance: distance,\n\t\tpoint: _intersectionPointWorld.clone(),\n\t\tobject: object\n\t};\n\n}\n\nfunction checkBufferGeometryIntersection( object, material, raycaster, ray, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c ) {\n\n\t_vA.fromBufferAttribute( position, a );\n\t_vB.fromBufferAttribute( position, b );\n\t_vC.fromBufferAttribute( position, c );\n\n\tconst morphInfluences = object.morphTargetInfluences;\n\n\tif ( morphPosition && morphInfluences ) {\n\n\t\t_morphA.set( 0, 0, 0 );\n\t\t_morphB.set( 0, 0, 0 );\n\t\t_morphC.set( 0, 0, 0 );\n\n\t\tfor ( let i = 0, il = morphPosition.length; i < il; i ++ ) {\n\n\t\t\tconst influence = morphInfluences[ i ];\n\t\t\tconst morphAttribute = morphPosition[ i ];\n\n\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t_tempA.fromBufferAttribute( morphAttribute, a );\n\t\t\t_tempB.fromBufferAttribute( morphAttribute, b );\n\t\t\t_tempC.fromBufferAttribute( morphAttribute, c );\n\n\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t_morphA.addScaledVector( _tempA, influence );\n\t\t\t\t_morphB.addScaledVector( _tempB, influence );\n\t\t\t\t_morphC.addScaledVector( _tempC, influence );\n\n\t\t\t} else {\n\n\t\t\t\t_morphA.addScaledVector( _tempA.sub( _vA ), influence );\n\t\t\t\t_morphB.addScaledVector( _tempB.sub( _vB ), influence );\n\t\t\t\t_morphC.addScaledVector( _tempC.sub( _vC ), influence );\n\n\t\t\t}\n\n\t\t}\n\n\t\t_vA.add( _morphA );\n\t\t_vB.add( _morphB );\n\t\t_vC.add( _morphC );\n\n\t}\n\n\tif ( object.isSkinnedMesh ) {\n\n\t\tobject.boneTransform( a, _vA );\n\t\tobject.boneTransform( b, _vB );\n\t\tobject.boneTransform( c, _vC );\n\n\t}\n\n\tconst intersection = checkIntersection( object, material, raycaster, ray, _vA, _vB, _vC, _intersectionPoint );\n\n\tif ( intersection ) {\n\n\t\tif ( uv ) {\n\n\t\t\t_uvA.fromBufferAttribute( uv, a );\n\t\t\t_uvB.fromBufferAttribute( uv, b );\n\t\t\t_uvC.fromBufferAttribute( uv, c );\n\n\t\t\tintersection.uv = Triangle.getUV( _intersectionPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC, new Vector2() );\n\n\t\t}\n\n\t\tif ( uv2 ) {\n\n\t\t\t_uvA.fromBufferAttribute( uv2, a );\n\t\t\t_uvB.fromBufferAttribute( uv2, b );\n\t\t\t_uvC.fromBufferAttribute( uv2, c );\n\n\t\t\tintersection.uv2 = Triangle.getUV( _intersectionPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC, new Vector2() );\n\n\t\t}\n\n\t\tconst face = {\n\t\t\ta: a,\n\t\t\tb: b,\n\t\t\tc: c,\n\t\t\tnormal: new Vector3(),\n\t\t\tmaterialIndex: 0\n\t\t};\n\n\t\tTriangle.getNormal( _vA, _vB, _vC, face.normal );\n\n\t\tintersection.face = face;\n\n\t}\n\n\treturn intersection;\n\n}\n\nexport { Mesh };\n","export default /* glsl */`\n#ifdef USE_ALPHAMAP\n\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_ALPHAMAP\n\n\tuniform sampler2D alphaMap;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_ALPHATEST\n\n\tif ( diffuseColor.a < alphaTest ) discard;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_ALPHATEST\n\tuniform float alphaTest;\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_AOMAP\n\n\t// reads channel R, compatible with a combined OcclusionRoughnessMetallic (RGB) texture\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\n\t#if defined( USE_ENVMAP ) && defined( STANDARD )\n\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness );\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_AOMAP\n\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n\n#endif\n`;\n","export default /* glsl */`\nvec3 transformed = vec3( position );\n`;\n","export default /* glsl */`\nvec3 objectNormal = vec3( normal );\n\n#ifdef USE_TANGENT\n\n\tvec3 objectTangent = vec3( tangent.xyz );\n\n#endif\n`;\n","export default /* glsl */`\n\nvec3 BRDF_Lambert( const in vec3 diffuseColor ) {\n\n\treturn RECIPROCAL_PI * diffuseColor;\n\n} // validated\n\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\n\n\t// Original approximation by Christophe Schlick '94\n\t// float fresnel = pow( 1.0 - dotVH, 5.0 );\n\n\t// Optimized variant (presented by Epic at SIGGRAPH '13)\n\t// https://cdn2.unrealengine.com/Resources/files/2013SiggraphPresentationsNotes-26915738.pdf\n\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n\n\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n\n} // validated\n\n// Moving Frostbite to Physically Based Rendering 3.0 - page 12, listing 2\n// https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf\nfloat V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\n\tfloat a2 = pow2( alpha );\n\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\n\treturn 0.5 / max( gv + gl, EPSILON );\n\n}\n\n// Microfacet Models for Refraction through Rough Surfaces - equation (33)\n// http://graphicrants.blogspot.com/2013/08/specular-brdf-reference.html\n// alpha is \"roughness squared\" in Disney’s reparameterization\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\n\tfloat a2 = pow2( alpha );\n\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0; // avoid alpha = 0 with dotNH = 1\n\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n\n}\n\n// GGX Distribution, Schlick Fresnel, GGX_SmithCorrelated Visibility\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 f0, const in float f90, const in float roughness ) {\n\n\tfloat alpha = pow2( roughness ); // UE4's roughness\n\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\n\tvec3 F = F_Schlick( f0, f90, dotVH );\n\n\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\n\tfloat D = D_GGX( alpha, dotNH );\n\n\treturn F * ( V * D );\n\n}\n\n// Rect Area Light\n\n// Real-Time Polygonal-Light Shading with Linearly Transformed Cosines\n// by Eric Heitz, Jonathan Dupuy, Stephen Hill and David Neubelt\n// code: https://github.com/selfshadow/ltc_code/\n\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\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\n\tfloat dotNV = saturate( dot( N, V ) );\n\n\t// texture parameterized by sqrt( GGX alpha ) and sqrt( 1 - cos( theta ) )\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\n\treturn uv;\n\n}\n\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\n\t// Real-Time Area Lighting: a Journey from Research to Production (p.102)\n\t// An approximation of the form factor of a horizon-clipped rectangle.\n\n\tfloat l = length( f );\n\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n\n}\n\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\n\tfloat x = dot( v1, v2 );\n\n\tfloat y = abs( x );\n\n\t// rational polynomial approximation to theta / sin( theta ) / 2PI\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\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\n\treturn cross( v1, v2 ) * theta_sintheta;\n\n}\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\n\t// bail if point is on back side of plane of light\n\t// assumes ccw winding order of light vertices\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\n\t// construct orthonormal basis around N\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 ); // negated from paper; possibly due to a different handedness of world coordinate system\n\n\t// compute transform\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\n\t// transform rect\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\n\t// project rect onto sphere\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\n\t// calculate vector form factor\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\n\t// adjust for horizon clipping\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\n/*\n\t// alternate method of adjusting for horizon clipping (see referece)\n\t// refactoring required\n\tfloat len = length( vectorFormFactor );\n\tfloat z = vectorFormFactor.z / len;\n\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\n\t// tabulated horizon-clipped sphere, apparently...\n\tvec2 uv = vec2( z * 0.5 + 0.5, len );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\n\tfloat scale = texture2D( ltc_2, uv ).w;\n\n\tfloat result = len * scale;\n*/\n\n\treturn vec3( result );\n\n}\n\n// End Rect Area Light\n\n\nfloat G_BlinnPhong_Implicit( /* const in float dotNL, const in float dotNV */ ) {\n\n\t// geometry term is (n dot l)(n dot v) / 4(n dot l)(n dot v)\n\treturn 0.25;\n\n}\n\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n\n}\n\nvec3 BRDF_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float shininess ) {\n\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\n\tvec3 F = F_Schlick( specularColor, 1.0, dotVH );\n\n\tfloat G = G_BlinnPhong_Implicit( /* dotNL, dotNV */ );\n\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\n\treturn F * ( G * D );\n\n} // validated\n\n#if defined( USE_SHEEN )\n\n// https://github.com/google/filament/blob/master/shaders/src/brdf.fs\nfloat D_Charlie( float roughness, float dotNH ) {\n\n\tfloat alpha = pow2( roughness );\n\n\t// Estevez and Kulla 2017, \"Production Friendly Microfacet Sheen BRDF\"\n\tfloat invAlpha = 1.0 / alpha;\n\tfloat cos2h = dotNH * dotNH;\n\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 ); // 2^(-14/2), so sin2h^2 > 0 in fp16\n\n\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\n\n}\n\n// https://github.com/google/filament/blob/master/shaders/src/brdf.fs\nfloat V_Neubelt( float dotNV, float dotNL ) {\n\n\t// Neubelt and Pettineo 2013, \"Crafting a Next-gen Material Pipeline for The Order: 1886\"\n\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\n\n}\n\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\n\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\n\tfloat D = D_Charlie( sheenRoughness, dotNH );\n\tfloat V = V_Neubelt( dotNV, dotNL );\n\n\treturn sheenColor * ( D * V );\n\n}\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_BUMPMAP\n\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\n\t// Bump Mapping Unparametrized Surfaces on the GPU by Morten S. Mikkelsen\n\t// https://mmikk.github.io/papers3d/mm_sfgrad_bump.pdf\n\n\t// Evaluate the derivative of the height w.r.t. screen-space using forward differencing (listing 2)\n\n\tvec2 dHdxy_fwd() {\n\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\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\n\t\treturn vec2( dBx, dBy );\n\n\t}\n\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy, float faceDirection ) {\n\n\t\t// Workaround for Adreno 3XX dFd*( vec3 ) bug. See #9988\n\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;\t\t// normalized\n\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\n\t\tfloat fDet = dot( vSigmaX, R1 ) * faceDirection;\n\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\n\t}\n\n#endif\n`;\n","export default /* glsl */`\n#if NUM_CLIPPING_PLANES > 0\n\n\tvec4 plane;\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\n\t}\n\t#pragma unroll_loop_end\n\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\n\t\tbool clipped = true;\n\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\n\t\t}\n\t\t#pragma unroll_loop_end\n\n\t\tif ( clipped ) discard;\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#if NUM_CLIPPING_PLANES > 0\n\n\tvarying vec3 vClipPosition;\n\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n\n#endif\n`;\n","export default /* glsl */`\n#if NUM_CLIPPING_PLANES > 0\n\n\tvarying vec3 vClipPosition;\n\n#endif\n`;\n","export default /* glsl */`\n#if NUM_CLIPPING_PLANES > 0\n\n\tvClipPosition = - mvPosition.xyz;\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( USE_COLOR_ALPHA )\n\n\tdiffuseColor *= vColor;\n\n#elif defined( USE_COLOR )\n\n\tdiffuseColor.rgb *= vColor;\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( USE_COLOR_ALPHA )\n\n\tvarying vec4 vColor;\n\n#elif defined( USE_COLOR )\n\n\tvarying vec3 vColor;\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( USE_COLOR_ALPHA )\n\n\tvarying vec4 vColor;\n\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\n\tvarying vec3 vColor;\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( USE_COLOR_ALPHA )\n\n\tvColor = vec4( 1.0 );\n\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\n\tvColor = vec3( 1.0 );\n\n#endif\n\n#ifdef USE_COLOR\n\n\tvColor *= color;\n\n#endif\n\n#ifdef USE_INSTANCING_COLOR\n\n\tvColor.xyz *= instanceColor.xyz;\n\n#endif\n`;\n","export default /* glsl */`\n#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n\n#ifndef saturate\n// may have defined saturate() already\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\n\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 max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\n\n// expects values in the range of [0,1]x[0,1], returns values in the [0,1] range.\n// do not collapse into a single function per: http://byteblacksmith.com/improvements-to-the-canonical-one-liner-glsl-rand-for-opengl-es-2-0/\nhighp float rand( const in vec2 uv ) {\n\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\n\treturn fract( sin( sn ) * c );\n\n}\n\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\n\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\n\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\n\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal;\n#endif\n};\n\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n}\n\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t// dir can be either a direction vector or a normal vector\n\t// upper-left 3x3 of matrix is assumed to be orthogonal\n\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n\n}\n\nmat3 transposeMat3( const in mat3 m ) {\n\n\tmat3 tmp;\n\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\n\treturn tmp;\n\n}\n\n// https://en.wikipedia.org/wiki/Relative_luminance\nfloat linearToRelativeLuminance( const in vec3 color ) {\n\n\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\n\n\treturn dot( weights, color.rgb );\n\n}\n\nbool isPerspectiveMatrix( mat4 m ) {\n\n\treturn m[ 2 ][ 3 ] == - 1.0;\n\n}\n\nvec2 equirectUv( in vec3 dir ) {\n\n\t// dir is assumed to be unit length\n\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\n\treturn vec2( u, v );\n\n}\n`;\n","export default /* glsl */`\n#ifdef ENVMAP_TYPE_CUBE_UV\n\n\t#define cubeUV_maxMipLevel 8.0\n\t#define cubeUV_minMipLevel 4.0\n\t#define cubeUV_maxTileSize 256.0\n\t#define cubeUV_minTileSize 16.0\n\n\t// These shader functions convert between the UV coordinates of a single face of\n\t// a cubemap, the 0-5 integer index of a cube face, and the direction vector for\n\t// sampling a textureCube (not generally normalized ).\n\n\tfloat getFace( vec3 direction ) {\n\n\t\tvec3 absDirection = abs( direction );\n\n\t\tfloat face = - 1.0;\n\n\t\tif ( absDirection.x > absDirection.z ) {\n\n\t\t\tif ( absDirection.x > absDirection.y )\n\n\t\t\t\tface = direction.x > 0.0 ? 0.0 : 3.0;\n\n\t\t\telse\n\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\n\t\t} else {\n\n\t\t\tif ( absDirection.z > absDirection.y )\n\n\t\t\t\tface = direction.z > 0.0 ? 2.0 : 5.0;\n\n\t\t\telse\n\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\n\t\t}\n\n\t\treturn face;\n\n\t}\n\n\t// RH coordinate system; PMREM face-indexing convention\n\tvec2 getUV( vec3 direction, float face ) {\n\n\t\tvec2 uv;\n\n\t\tif ( face == 0.0 ) {\n\n\t\t\tuv = vec2( direction.z, direction.y ) / abs( direction.x ); // pos x\n\n\t\t} else if ( face == 1.0 ) {\n\n\t\t\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y ); // pos y\n\n\t\t} else if ( face == 2.0 ) {\n\n\t\t\tuv = vec2( - direction.x, direction.y ) / abs( direction.z ); // pos z\n\n\t\t} else if ( face == 3.0 ) {\n\n\t\t\tuv = vec2( - direction.z, direction.y ) / abs( direction.x ); // neg x\n\n\t\t} else if ( face == 4.0 ) {\n\n\t\t\tuv = vec2( - direction.x, direction.z ) / abs( direction.y ); // neg y\n\n\t\t} else {\n\n\t\t\tuv = vec2( direction.x, direction.y ) / abs( direction.z ); // neg z\n\n\t\t}\n\n\t\treturn 0.5 * ( uv + 1.0 );\n\n\t}\n\n\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\n\n\t\tfloat face = getFace( direction );\n\n\t\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\n\n\t\tmipInt = max( mipInt, cubeUV_minMipLevel );\n\n\t\tfloat faceSize = exp2( mipInt );\n\n\t\tfloat texelSize = 1.0 / ( 3.0 * cubeUV_maxTileSize );\n\n\t\tvec2 uv = getUV( direction, face ) * ( faceSize - 1.0 ) + 0.5;\n\n\t\tif ( face > 2.0 ) {\n\n\t\t\tuv.y += faceSize;\n\n\t\t\tface -= 3.0;\n\n\t\t}\n\n\t\tuv.x += face * faceSize;\n\n\t\tif ( mipInt < cubeUV_maxMipLevel ) {\n\n\t\t\tuv.y += 2.0 * cubeUV_maxTileSize;\n\n\t\t}\n\n\t\tuv.y += filterInt * 2.0 * cubeUV_minTileSize;\n\n\t\tuv.x += 3.0 * max( 0.0, cubeUV_maxTileSize - 2.0 * faceSize );\n\n\t\tuv *= texelSize;\n\n\t\treturn texture2D( envMap, uv ).rgb;\n\n\t}\n\n\t// These defines must match with PMREMGenerator\n\n\t#define r0 1.0\n\t#define v0 0.339\n\t#define m0 - 2.0\n\t#define r1 0.8\n\t#define v1 0.276\n\t#define m1 - 1.0\n\t#define r4 0.4\n\t#define v4 0.046\n\t#define m4 2.0\n\t#define r5 0.305\n\t#define v5 0.016\n\t#define m5 3.0\n\t#define r6 0.21\n\t#define v6 0.0038\n\t#define m6 4.0\n\n\tfloat roughnessToMip( float roughness ) {\n\n\t\tfloat mip = 0.0;\n\n\t\tif ( roughness >= r1 ) {\n\n\t\t\tmip = ( r0 - roughness ) * ( m1 - m0 ) / ( r0 - r1 ) + m0;\n\n\t\t} else if ( roughness >= r4 ) {\n\n\t\t\tmip = ( r1 - roughness ) * ( m4 - m1 ) / ( r1 - r4 ) + m1;\n\n\t\t} else if ( roughness >= r5 ) {\n\n\t\t\tmip = ( r4 - roughness ) * ( m5 - m4 ) / ( r4 - r5 ) + m4;\n\n\t\t} else if ( roughness >= r6 ) {\n\n\t\t\tmip = ( r5 - roughness ) * ( m6 - m5 ) / ( r5 - r6 ) + m5;\n\n\t\t} else {\n\n\t\t\tmip = - 2.0 * log2( 1.16 * roughness ); // 1.16 = 1.79^0.25\n\t\t}\n\n\t\treturn mip;\n\n\t}\n\n\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\n\n\t\tfloat mip = clamp( roughnessToMip( roughness ), m0, cubeUV_maxMipLevel );\n\n\t\tfloat mipF = fract( mip );\n\n\t\tfloat mipInt = floor( mip );\n\n\t\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\n\n\t\tif ( mipF == 0.0 ) {\n\n\t\t\treturn vec4( color0, 1.0 );\n\n\t\t} else {\n\n\t\t\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\n\n\t\t\treturn vec4( mix( color0, color1, mipF ), 1.0 );\n\n\t\t}\n\n\t}\n\n#endif\n`;\n","export default /* glsl */`\nvec3 transformedNormal = objectNormal;\n\n#ifdef USE_INSTANCING\n\n\t// this is in lieu of a per-instance normal-matrix\n\t// shear transforms in the instance matrix are not supported\n\n\tmat3 m = mat3( instanceMatrix );\n\n\ttransformedNormal /= vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) );\n\n\ttransformedNormal = m * transformedNormal;\n\n#endif\n\ntransformedNormal = normalMatrix * transformedNormal;\n\n#ifdef FLIP_SIDED\n\n\ttransformedNormal = - transformedNormal;\n\n#endif\n\n#ifdef USE_TANGENT\n\n\tvec3 transformedTangent = ( modelViewMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\n\t#ifdef FLIP_SIDED\n\n\t\ttransformedTangent = - transformedTangent;\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_DISPLACEMENTMAP\n\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_DISPLACEMENTMAP\n\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vUv ).x * displacementScale + displacementBias );\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_EMISSIVEMAP\n\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_EMISSIVEMAP\n\n\tuniform sampler2D emissiveMap;\n\n#endif\n`;\n","export default /* glsl */`\ngl_FragColor = linearToOutputTexel( gl_FragColor );\n`;\n","export default /* glsl */`\n\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\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.a );\n}\n\n`;\n","export default /* glsl */`\n#ifdef USE_ENVMAP\n\n\t#ifdef ENV_WORLDPOS\n\n\t\tvec3 cameraToFrag;\n\n\t\tif ( isOrthographic ) {\n\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\n\t\t} else {\n\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\n\t\t}\n\n\t\t// Transforming Normal Vectors with the Inverse Transformation\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\n\t\t#else\n\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\n\t\t#endif\n\n\t#else\n\n\t\tvec3 reflectVec = vReflect;\n\n\t#endif\n\n\t#ifdef ENVMAP_TYPE_CUBE\n\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\n\t\tvec4 envColor = textureCubeUV( envMap, reflectVec, 0.0 );\n\n\t#else\n\n\t\tvec4 envColor = vec4( 0.0 );\n\n\t#endif\n\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_ENVMAP\n\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\t\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_ENVMAP\n\n\tuniform float reflectivity;\n\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\n\t\t#define ENV_WORLDPOS\n\n\t#endif\n\n\t#ifdef ENV_WORLDPOS\n\n\t\tvarying vec3 vWorldPosition;\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_ENVMAP\n\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) ||defined( PHONG )\n\n\t\t#define ENV_WORLDPOS\n\n\t#endif\n\n\t#ifdef ENV_WORLDPOS\n\t\t\n\t\tvarying vec3 vWorldPosition;\n\n\t#else\n\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_ENVMAP\n\n\t#ifdef ENV_WORLDPOS\n\n\t\tvWorldPosition = worldPosition.xyz;\n\n\t#else\n\n\t\tvec3 cameraToVertex;\n\n\t\tif ( isOrthographic ) {\n\n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\n\t\t} else {\n\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\n\t\t}\n\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\n\t\t#else\n\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\n\t\t#endif\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_FOG\n\n\tvFogDepth = - mvPosition.z;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_FOG\n\n\tvarying float vFogDepth;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_FOG\n\n\t#ifdef FOG_EXP2\n\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\n\n\t#else\n\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\n\n\t#endif\n\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_FOG\n\n\tuniform vec3 fogColor;\n\tvarying float vFogDepth;\n\n\t#ifdef FOG_EXP2\n\n\t\tuniform float fogDensity;\n\n\t#else\n\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n\n#ifdef USE_GRADIENTMAP\n\n\tuniform sampler2D gradientMap;\n\n#endif\n\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\n\t// dotNL will be from -1.0 to 1.0\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\n\t#ifdef USE_GRADIENTMAP\n\n\t\treturn vec3( texture2D( gradientMap, coord ).r );\n\n\t#else\n\n\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\n\t#endif\n\n}\n`;\n","export default /* glsl */`\n#ifdef USE_LIGHTMAP\n\n\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\n\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\n\t\tlightMapIrradiance *= PI;\n\n\t#endif\n\n\treflectedLight.indirectDiffuse += lightMapIrradiance;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_LIGHTMAP\n\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n\n#endif\n`;\n","export default /* glsl */`\nvec3 diffuse = vec3( 1.0 );\n\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( -mvPosition.xyz );\n\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\n\nvLightFront = vec3( 0.0 );\nvIndirectFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n\tvIndirectBack = vec3( 0.0 );\n#endif\n\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\n\nvIndirectFront += getAmbientLightIrradiance( ambientLightColor );\n\nvIndirectFront += getLightProbeIrradiance( lightProbe, geometry.normal );\n\n#ifdef DOUBLE_SIDED\n\n\tvIndirectBack += getAmbientLightIrradiance( ambientLightColor );\n\n\tvIndirectBack += getLightProbeIrradiance( lightProbe, backGeometry.normal );\n\n#endif\n\n#if NUM_POINT_LIGHTS > 0\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\n\t\tgetPointLightInfo( pointLights[ i ], geometry, directLight );\n\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = directLight.color;\n\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\n\t\t#ifdef DOUBLE_SIDED\n\n\t\t\tvLightBack += saturate( - dotNL ) * directLightColor_Diffuse;\n\n\t\t#endif\n\n\t}\n\t#pragma unroll_loop_end\n\n#endif\n\n#if NUM_SPOT_LIGHTS > 0\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\n\t\tgetSpotLightInfo( spotLights[ i ], geometry, directLight );\n\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = directLight.color;\n\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\n\t\t#ifdef DOUBLE_SIDED\n\n\t\t\tvLightBack += saturate( - dotNL ) * directLightColor_Diffuse;\n\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n\n#endif\n\n#if NUM_DIR_LIGHTS > 0\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\n\t\tgetDirectionalLightInfo( directionalLights[ i ], geometry, directLight );\n\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = directLight.color;\n\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\n\t\t#ifdef DOUBLE_SIDED\n\n\t\t\tvLightBack += saturate( - dotNL ) * directLightColor_Diffuse;\n\n\t\t#endif\n\n\t}\n\t#pragma unroll_loop_end\n\n#endif\n\n#if NUM_HEMI_LIGHTS > 0\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\n\t\tvIndirectFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry.normal );\n\n\t\t#ifdef DOUBLE_SIDED\n\n\t\t\tvIndirectBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry.normal );\n\n\t\t#endif\n\n\t}\n\t#pragma unroll_loop_end\n\n#endif\n`;\n","export default /* glsl */`\nuniform bool receiveShadow;\nuniform vec3 ambientLightColor;\nuniform vec3 lightProbe[ 9 ];\n\n// get the irradiance (radiance convolved with cosine lobe) at the point 'normal' on the unit sphere\n// source: https://graphics.stanford.edu/papers/envmap/envmap.pdf\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\n\t// normal is assumed to have unit length\n\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\n\t// band 0\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\n\t// band 1\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\n\t// band 2\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\n\treturn result;\n\n}\n\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\n\n\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\n\treturn irradiance;\n\n}\n\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\n\tvec3 irradiance = ambientLightColor;\n\n\treturn irradiance;\n\n}\n\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\n\t#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\n\t\t// based upon Frostbite 3 Moving to Physically-based Rendering\n\t\t// page 32, equation 26: E[window1]\n\t\t// https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\n\t\tif ( cutoffDistance > 0.0 ) {\n\n\t\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\n\t\t}\n\n\t\treturn distanceFalloff;\n\n\t#else\n\n\t\tif ( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\n\n\t\t\treturn pow( saturate( - lightDistance / cutoffDistance + 1.0 ), decayExponent );\n\n\t\t}\n\n\t\treturn 1.0;\n\n\t#endif\n\n}\n\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\n\n\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\n\n}\n\n#if NUM_DIR_LIGHTS > 0\n\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t};\n\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\n\tvoid getDirectionalLightInfo( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight light ) {\n\n\t\tlight.color = directionalLight.color;\n\t\tlight.direction = directionalLight.direction;\n\t\tlight.visible = true;\n\n\t}\n\n#endif\n\n\n#if NUM_POINT_LIGHTS > 0\n\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t};\n\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\n\t// light is an out parameter as having it as a return value caused compiler errors on some devices\n\tvoid getPointLightInfo( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight light ) {\n\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\n\t\tlight.direction = normalize( lVector );\n\n\t\tfloat lightDistance = length( lVector );\n\n\t\tlight.color = pointLight.color;\n\t\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\n\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\n\t}\n\n#endif\n\n\n#if NUM_SPOT_LIGHTS > 0\n\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};\n\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\n\t// light is an out parameter as having it as a return value caused compiler errors on some devices\n\tvoid getSpotLightInfo( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight light ) {\n\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\n\t\tlight.direction = normalize( lVector );\n\n\t\tfloat angleCos = dot( light.direction, spotLight.direction );\n\n\t\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\n\t\tif ( spotAttenuation > 0.0 ) {\n\n\t\t\tfloat lightDistance = length( lVector );\n\n\t\t\tlight.color = spotLight.color * spotAttenuation;\n\t\t\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\n\t\t} else {\n\n\t\t\tlight.color = vec3( 0.0 );\n\t\t\tlight.visible = false;\n\n\t\t}\n\n\t}\n\n#endif\n\n\n#if NUM_RECT_AREA_LIGHTS > 0\n\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\n\t// Pre-computed values of LinearTransformedCosine approximation of BRDF\n\t// BRDF approximation Texture is 64x64\n\tuniform sampler2D ltc_1; // RGBA Float\n\tuniform sampler2D ltc_2; // RGBA Float\n\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n\n#endif\n\n\n#if NUM_HEMI_LIGHTS > 0\n\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {\n\n\t\tfloat dotNL = dot( normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\n\t\treturn irradiance;\n\n\t}\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( USE_ENVMAP )\n\n\t#ifdef ENVMAP_MODE_REFRACTION\n\n\t\tuniform float refractionRatio;\n\n\t#endif\n\n\tvec3 getIBLIrradiance( const in vec3 normal ) {\n\n\t\t#if defined( ENVMAP_TYPE_CUBE_UV )\n\n\t\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, worldNormal, 1.0 );\n\n\t\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\n\t\t#else\n\n\t\t\treturn vec3( 0.0 );\n\n\t\t#endif\n\n\t}\n\n\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\n\n\t\t#if defined( ENVMAP_TYPE_CUBE_UV )\n\n\t\t\tvec3 reflectVec;\n\n\t\t\t#ifdef ENVMAP_MODE_REFLECTION\n\n\t\t\t\treflectVec = reflect( - viewDir, normal );\n\n\t\t\t\t// Mixing the reflection with the normal is more accurate and keeps rough objects from gathering light from behind their tangent plane.\n\t\t\t\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\n\t\t\t#else\n\n\t\t\t\treflectVec = refract( - viewDir, normal, refractionRatio );\n\n\t\t\t#endif\n\n\t\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness );\n\n\t\t\treturn envMapColor.rgb * envMapIntensity;\n\n\t\t#else\n\n\t\t\treturn vec3( 0.0 );\n\n\t\t#endif\n\n\t}\n\n#endif\n`;\n","export default /* glsl */`\nToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\n`;\n","export default /* glsl */`\nvarying vec3 vViewPosition;\n\nstruct ToonMaterial {\n\n\tvec3 diffuseColor;\n\n};\n\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\n\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\n}\n\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\n}\n\n#define RE_Direct\t\t\t\tRE_Direct_Toon\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Toon\n\n#define Material_LightProbeLOD( material )\t(0)\n`;\n","export default /* glsl */`\nBlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;\n`;\n","export default /* glsl */`\nvarying vec3 vViewPosition;\n\nstruct BlinnPhongMaterial {\n\n\tvec3 diffuseColor;\n\tvec3 specularColor;\n\tfloat specularShininess;\n\tfloat specularStrength;\n\n};\n\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\n\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularShininess ) * material.specularStrength;\n\n}\n\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\n}\n\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n\n#define Material_LightProbeLOD( material )\t(0)\n`;\n","export default /* glsl */`\nPhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\n\nvec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\n\nmaterial.roughness = max( roughnessFactor, 0.0525 );// 0.0525 corresponds to the base mip of a 256 cubemap.\nmaterial.roughness += geometryRoughness;\nmaterial.roughness = min( material.roughness, 1.0 );\n\n#ifdef IOR\n\n\t#ifdef SPECULAR\n\n\t\tfloat specularIntensityFactor = specularIntensity;\n\t\tvec3 specularColorFactor = specularColor;\n\n\t\t#ifdef USE_SPECULARINTENSITYMAP\n\n\t\t\tspecularIntensityFactor *= texture2D( specularIntensityMap, vUv ).a;\n\n\t\t#endif\n\n\t\t#ifdef USE_SPECULARCOLORMAP\n\n\t\t\tspecularColorFactor *= texture2D( specularColorMap, vUv ).rgb;\n\n\t\t#endif\n\n\t\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\n\n\t#else\n\n\t\tfloat specularIntensityFactor = 1.0;\n\t\tvec3 specularColorFactor = vec3( 1.0 );\n\t\tmaterial.specularF90 = 1.0;\n\n\t#endif\n\n\tmaterial.specularColor = mix( min( pow2( ( ior - 1.0 ) / ( ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\n\n#else\n\n\tmaterial.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.specularF90 = 1.0;\n\n#endif\n\n#ifdef USE_CLEARCOAT\n\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\tmaterial.clearcoatF0 = vec3( 0.04 );\n\tmaterial.clearcoatF90 = 1.0;\n\n\t#ifdef USE_CLEARCOATMAP\n\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vUv ).x;\n\n\t#endif\n\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vUv ).y;\n\n\t#endif\n\n\tmaterial.clearcoat = saturate( material.clearcoat ); // Burley clearcoat model\n\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n\n#endif\n\n#ifdef USE_SHEEN\n\n\tmaterial.sheenColor = sheenColor;\n\n\t#ifdef USE_SHEENCOLORMAP\n\n\t\tmaterial.sheenColor *= texture2D( sheenColorMap, vUv ).rgb;\n\n\t#endif\n\n\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );\n\n\t#ifdef USE_SHEENROUGHNESSMAP\n\n\t\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vUv ).a;\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\nstruct PhysicalMaterial {\n\n\tvec3 diffuseColor;\n\tfloat roughness;\n\tvec3 specularColor;\n\tfloat specularF90;\n\n\t#ifdef USE_CLEARCOAT\n\t\tfloat clearcoat;\n\t\tfloat clearcoatRoughness;\n\t\tvec3 clearcoatF0;\n\t\tfloat clearcoatF90;\n\t#endif\n\n\t#ifdef USE_SHEEN\n\t\tvec3 sheenColor;\n\t\tfloat sheenRoughness;\n\t#endif\n\n};\n\n// temporary\nvec3 clearcoatSpecular = vec3( 0.0 );\nvec3 sheenSpecular = vec3( 0.0 );\n\n// This is a curve-fit approxmation to the \"Charlie sheen\" BRDF integrated over the hemisphere from \n// Estevez and Kulla 2017, \"Production Friendly Microfacet Sheen BRDF\". The analysis can be found\n// in the Sheen section of https://drive.google.com/file/d/1T0D1VSyR4AllqIJTQAraEIzjlb5h4FKH/view?usp=sharing\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness) {\n\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\n\tfloat r2 = roughness * roughness;\n\n\tfloat a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;\n\n\tfloat b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;\n\n\tfloat DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );\n\n\treturn saturate( DG * RECIPROCAL_PI );\n\n}\n\n// Analytical approximation of the DFG LUT, one half of the\n// split-sum approximation used in indirect specular lighting.\n// via 'environmentBRDF' from \"Physically Based Shading on Mobile\"\n// https://www.unrealengine.com/blog/physically-based-shading-on-mobile\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\n\tvec4 r = roughness * c0 + c1;\n\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\n\tvec2 fab = vec2( - 1.04, 1.04 ) * a004 + r.zw;\n\n\treturn fab;\n\n}\n\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\n\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\n\treturn specularColor * fab.x + specularF90 * fab.y;\n\n}\n\n// Fdez-Agüera's \"Multiple-Scattering Microfacet Model for Real-Time Image Based Lighting\"\n// Approximates multiscattering in order to preserve energy.\n// http://www.jcgt.org/published/0008/01/03/\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\n\tvec3 FssEss = specularColor * fab.x + specularF90 * fab.y;\n\n\tfloat Ess = fab.x + fab.y;\n\tfloat Ems = 1.0 - Ess;\n\n\tvec3 Favg = specularColor + ( 1.0 - specularColor ) * 0.047619; // 1/21\n\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n\n}\n\n#if NUM_RECT_AREA_LIGHTS > 0\n\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\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.roughness;\n\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight; // counterclockwise; light shines in local neg z direction\n\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\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\n\t\t// LTC Fresnel Approximation by Stephen Hill\n\t\t// http://blog.selfshadow.com/publications/s2016-advances/s2016_ltc_fresnel.pdf\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\n\t}\n\n#endif\n\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\n\tvec3 irradiance = dotNL * directLight.color;\n\n\t#ifdef USE_CLEARCOAT\n\n\t\tfloat dotNLcc = saturate( dot( geometry.clearcoatNormal, directLight.direction ) );\n\n\t\tvec3 ccIrradiance = dotNLcc * directLight.color;\n\n\t\tclearcoatSpecular += ccIrradiance * BRDF_GGX( directLight.direction, geometry.viewDir, geometry.clearcoatNormal, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\n\t#endif\n\n\t#ifdef USE_SHEEN\n\n\t\tsheenSpecular += irradiance * BRDF_Sheen( directLight.direction, geometry.viewDir, geometry.normal, material.sheenColor, material.sheenRoughness );\n\n\t#endif\n\n\treflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularF90, material.roughness );\n\n\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\n}\n\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\n\t#ifdef USE_CLEARCOAT\n\n\t\tclearcoatSpecular += clearcoatRadiance * EnvironmentBRDF( geometry.clearcoatNormal, geometry.viewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\n\t#endif\n\n\t#ifdef USE_SHEEN\n\n\t\tsheenSpecular += irradiance * material.sheenColor * IBLSheenBRDF( geometry.normal, geometry.viewDir, material.sheenRoughness );\n\n\t#endif\n\n\t// Both indirect specular and indirect diffuse light accumulate here\n\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\n\tcomputeMultiscattering( geometry.normal, geometry.viewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\n\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - ( singleScattering + multiScattering ) );\n\n\treflectedLight.indirectSpecular += radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n\n}\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\n// ref: https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n\n}\n`;\n","export default /* glsl */`\n/**\n * This is a template that can be used to light a material, it uses pluggable\n * RenderEquations (RE)for specific lighting scenarios.\n *\n * Instructions for use:\n * - Ensure that both RE_Direct, RE_IndirectDiffuse and RE_IndirectSpecular are defined\n * - If you have defined an RE_IndirectSpecular, you need to also provide a Material_LightProbeLOD. <---- ???\n * - Create a material parameter that is to be passed as the third parameter to your lighting functions.\n *\n * TODO:\n * - Add area light support.\n * - Add sphere light support.\n * - Add diffuse light probe (irradiance cubemap) support.\n */\n\nGeometricContext geometry;\n\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\n\n#ifdef USE_CLEARCOAT\n\n\tgeometry.clearcoatNormal = clearcoatNormal;\n\n#endif\n\nIncidentLight directLight;\n\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\n\t\tpointLight = pointLights[ i ];\n\n\t\tgetPointLightInfo( pointLight, geometry, directLight );\n\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\n\t}\n\t#pragma unroll_loop_end\n\n#endif\n\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\n\tSpotLight spotLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\n\t\tspotLight = spotLights[ i ];\n\n\t\tgetSpotLightInfo( spotLight, geometry, directLight );\n\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\n\t}\n\t#pragma unroll_loop_end\n\n#endif\n\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\n\t\tdirectionalLight = directionalLights[ i ];\n\n\t\tgetDirectionalLightInfo( directionalLight, geometry, directLight );\n\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\n\t}\n\t#pragma unroll_loop_end\n\n#endif\n\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\n\tRectAreaLight rectAreaLight;\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\n\t}\n\t#pragma unroll_loop_end\n\n#endif\n\n#if defined( RE_IndirectDiffuse )\n\n\tvec3 iblIrradiance = vec3( 0.0 );\n\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\n\tirradiance += getLightProbeIrradiance( lightProbe, geometry.normal );\n\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry.normal );\n\n\t\t}\n\t\t#pragma unroll_loop_end\n\n\t#endif\n\n#endif\n\n#if defined( RE_IndirectSpecular )\n\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( RE_IndirectDiffuse )\n\n\t#ifdef USE_LIGHTMAP\n\n\t\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\n\t\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\n\t\t\tlightMapIrradiance *= PI;\n\n\t\t#endif\n\n\t\tirradiance += lightMapIrradiance;\n\n\t#endif\n\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\n\t\tiblIrradiance += getIBLIrradiance( geometry.normal );\n\n\t#endif\n\n#endif\n\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\n\tradiance += getIBLRadiance( geometry.viewDir, geometry.normal, material.roughness );\n\n\t#ifdef USE_CLEARCOAT\n\n\t\tclearcoatRadiance += getIBLRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness );\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( RE_IndirectDiffuse )\n\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n\n#endif\n\n#if defined( RE_IndirectSpecular )\n\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometry, material, reflectedLight );\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\n\t// Doing a strict comparison with == 1.0 can cause noise artifacts\n\t// on some platforms. See issue #17623.\n\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_LOGDEPTHBUF\n\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\n\t\tvarying float vFragDepth;\n\t\tvarying float vIsPerspective;\n\n\t#else\n\n\t\tuniform float logDepthBufFC;\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_LOGDEPTHBUF\n\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n\n\t#else\n\n\t\tif ( isPerspectiveMatrix( projectionMatrix ) ) {\n\n\t\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\n\t\t\tgl_Position.z *= gl_Position.w;\n\n\t\t}\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_MAP\n\n\tvec4 sampledDiffuseColor = texture2D( map, vUv );\n\n\t#ifdef DECODE_VIDEO_TEXTURE\n\n\t\t// inline sRGB decode (TODO: Remove this code when https://crbug.com/1256340 is solved)\n\n\t\tsampledDiffuseColor = vec4( mix( pow( sampledDiffuseColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), sampledDiffuseColor.rgb * 0.0773993808, vec3( lessThanEqual( sampledDiffuseColor.rgb, vec3( 0.04045 ) ) ) ), sampledDiffuseColor.w );\n\n\t#endif\n\n\tdiffuseColor *= sampledDiffuseColor;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_MAP\n\n\tuniform sampler2D map;\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n\n#endif\n\n#ifdef USE_MAP\n\n\tdiffuseColor *= texture2D( map, uv );\n\n#endif\n\n#ifdef USE_ALPHAMAP\n\n\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\n\tuniform mat3 uvTransform;\n\n#endif\n\n#ifdef USE_MAP\n\n\tuniform sampler2D map;\n\n#endif\n\n#ifdef USE_ALPHAMAP\n\n\tuniform sampler2D alphaMap;\n\n#endif\n`;\n","export default /* glsl */`\nfloat metalnessFactor = metalness;\n\n#ifdef USE_METALNESSMAP\n\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\n\t// reads channel B, compatible with a combined OcclusionRoughnessMetallic (RGB) texture\n\tmetalnessFactor *= texelMetalness.b;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_METALNESSMAP\n\n\tuniform sampler2D metalnessMap;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_MORPHNORMALS\n\n\t// morphTargetBaseInfluence is set based on BufferGeometry.morphTargetsRelative value:\n\t// When morphTargetsRelative is false, this is set to 1 - sum(influences); this results in normal = sum((target - base) * influence)\n\t// When morphTargetsRelative is true, this is set to 1; as a result, all morph targets are simply added to the base after weighting\n\tobjectNormal *= morphTargetBaseInfluence;\n\n\t#ifdef MORPHTARGETS_TEXTURE\n\n\t\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1, 2 ) * morphTargetInfluences[ i ];\n\n\t\t}\n\n\t#else\n\n\t\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\n\t\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\n\t\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\n\t\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_MORPHTARGETS\n\n\tuniform float morphTargetBaseInfluence;\n\n\t#ifdef MORPHTARGETS_TEXTURE\n\n\t\tuniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\n\t\tuniform sampler2DArray morphTargetsTexture;\n\t\tuniform vec2 morphTargetsTextureSize;\n\n\t\tvec3 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset, const in int stride ) {\n\n\t\t\tfloat texelIndex = float( vertexIndex * stride + offset );\n\t\t\tfloat y = floor( texelIndex / morphTargetsTextureSize.x );\n\t\t\tfloat x = texelIndex - y * morphTargetsTextureSize.x;\n\n\t\t\tvec3 morphUV = vec3( ( x + 0.5 ) / morphTargetsTextureSize.x, y / morphTargetsTextureSize.y, morphTargetIndex );\n\t\t\treturn texture( morphTargetsTexture, morphUV ).xyz;\n\n\t\t}\n\n\t#else\n\n\t\t#ifndef USE_MORPHNORMALS\n\n\t\t\tuniform float morphTargetInfluences[ 8 ];\n\n\t\t#else\n\n\t\t\tuniform float morphTargetInfluences[ 4 ];\n\n\t\t#endif\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_MORPHTARGETS\n\n\t// morphTargetBaseInfluence is set based on BufferGeometry.morphTargetsRelative value:\n\t// When morphTargetsRelative is false, this is set to 1 - sum(influences); this results in position = sum((target - base) * influence)\n\t// When morphTargetsRelative is true, this is set to 1; as a result, all morph targets are simply added to the base after weighting\n\ttransformed *= morphTargetBaseInfluence;\n\n\t#ifdef MORPHTARGETS_TEXTURE\n\n\t\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\n\t\t\t#ifndef USE_MORPHNORMALS\n\n\t\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0, 1 ) * morphTargetInfluences[ i ];\n\n\t\t\t#else\n\n\t\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0, 2 ) * morphTargetInfluences[ i ];\n\n\t\t\t#endif\n\n\t\t}\n\n\t#else\n\n\t\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\n\t\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\n\t\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\n\t\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\n\n\t\t#ifndef USE_MORPHNORMALS\n\n\t\t\ttransformed += morphTarget4 * morphTargetInfluences[ 4 ];\n\t\t\ttransformed += morphTarget5 * morphTargetInfluences[ 5 ];\n\t\t\ttransformed += morphTarget6 * morphTargetInfluences[ 6 ];\n\t\t\ttransformed += morphTarget7 * morphTargetInfluences[ 7 ];\n\n\t\t#endif\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\nfloat faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\n\n#ifdef FLAT_SHADED\n\n\t// Workaround for Adreno GPUs not able to do dFdx( vViewPosition )\n\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\n#else\n\n\tvec3 normal = normalize( vNormal );\n\n\t#ifdef DOUBLE_SIDED\n\n\t\tnormal = normal * faceDirection;\n\n\t#endif\n\n\t#ifdef USE_TANGENT\n\n\t\tvec3 tangent = normalize( vTangent );\n\t\tvec3 bitangent = normalize( vBitangent );\n\n\t\t#ifdef DOUBLE_SIDED\n\n\t\t\ttangent = tangent * faceDirection;\n\t\t\tbitangent = bitangent * faceDirection;\n\n\t\t#endif\n\n\t\t#if defined( TANGENTSPACE_NORMALMAP ) || defined( USE_CLEARCOAT_NORMALMAP )\n\n\t\t\tmat3 vTBN = mat3( tangent, bitangent, normal );\n\n\t\t#endif\n\n\t#endif\n\n#endif\n\n// non perturbed normal for clearcoat among others\n\nvec3 geometryNormal = normal;\n\n`;\n","export default /* glsl */`\n\n#ifdef OBJECTSPACE_NORMALMAP\n\n\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0; // overrides both flatShading and attribute normals\n\n\t#ifdef FLIP_SIDED\n\n\t\tnormal = - normal;\n\n\t#endif\n\n\t#ifdef DOUBLE_SIDED\n\n\t\tnormal = normal * faceDirection;\n\n\t#endif\n\n\tnormal = normalize( normalMatrix * normal );\n\n#elif defined( TANGENTSPACE_NORMALMAP )\n\n\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\n\t#ifdef USE_TANGENT\n\n\t\tnormal = normalize( vTBN * mapN );\n\n\t#else\n\n\t\tnormal = perturbNormal2Arb( - vViewPosition, normal, mapN, faceDirection );\n\n\t#endif\n\n#elif defined( USE_BUMPMAP )\n\n\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\n\n#endif\n`;\n","export default /* glsl */`\n#ifndef FLAT_SHADED\n\n\tvarying vec3 vNormal;\n\n\t#ifdef USE_TANGENT\n\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#ifndef FLAT_SHADED\n\n\tvarying vec3 vNormal;\n\n\t#ifdef USE_TANGENT\n\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#ifndef FLAT_SHADED // normal is computed with derivatives when FLAT_SHADED\n\n\tvNormal = normalize( transformedNormal );\n\n\t#ifdef USE_TANGENT\n\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_NORMALMAP\n\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n\n#endif\n\n#ifdef OBJECTSPACE_NORMALMAP\n\n\tuniform mat3 normalMatrix;\n\n#endif\n\n#if ! defined ( USE_TANGENT ) && ( defined ( TANGENTSPACE_NORMALMAP ) || defined ( USE_CLEARCOAT_NORMALMAP ) )\n\n\t// Normal Mapping Without Precomputed Tangents\n\t// http://www.thetenthplanet.de/archives/1180\n\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm, vec3 mapN, float faceDirection ) {\n\n\t\t// Workaround for Adreno 3XX dFd*( vec3 ) bug. See #9988\n\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\n\t\tvec3 N = surf_norm; // normalized\n\n\t\tvec3 q1perp = cross( q1, N );\n\t\tvec3 q0perp = cross( N, q0 );\n\n\t\tvec3 T = q1perp * st0.x + q0perp * st1.x;\n\t\tvec3 B = q1perp * st0.y + q0perp * st1.y;\n\n\t\tfloat det = max( dot( T, T ), dot( B, B ) );\n\t\tfloat scale = ( det == 0.0 ) ? 0.0 : faceDirection * inversesqrt( det );\n\n\t\treturn normalize( T * ( mapN.x * scale ) + B * ( mapN.y * scale ) + N * mapN.z );\n\n\t}\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_CLEARCOAT\n\n\tvec3 clearcoatNormal = geometryNormal;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_CLEARCOAT_NORMALMAP\n\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\n\t#ifdef USE_TANGENT\n\n\t\tclearcoatNormal = normalize( vTBN * clearcoatMapN );\n\n\t#else\n\n\t\tclearcoatNormal = perturbNormal2Arb( - vViewPosition, clearcoatNormal, clearcoatMapN, faceDirection );\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n\n#ifdef USE_CLEARCOATMAP\n\n\tuniform sampler2D clearcoatMap;\n\n#endif\n\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\n\tuniform sampler2D clearcoatRoughnessMap;\n\n#endif\n\n#ifdef USE_CLEARCOAT_NORMALMAP\n\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef OPAQUE\ndiffuseColor.a = 1.0;\n#endif\n\n// https://github.com/mrdoob/three.js/pull/22425\n#ifdef USE_TRANSMISSION\ndiffuseColor.a *= transmissionAlpha + 0.1;\n#endif\n\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );\n`;\n","export default /* glsl */`\nvec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\n\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\n\nconst float PackUpscale = 256. / 255.; // fraction -> 0..1 (including 1)\nconst float UnpackDownscale = 255. / 256.; // 0..1 -> fraction (excluding 1)\n\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\n\nconst float ShiftRight8 = 1. / 256.;\n\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8; // tidy overflow\n\treturn r * PackUpscale;\n}\n\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\n\nvec4 pack2HalfToRGBA( vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\n}\n\nvec2 unpackRGBATo2Half( vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\n\n// NOTE: viewZ/eyeZ is < 0 when in front of the camera per OpenGL conventions\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}\n\n// NOTE: https://twitter.com/gonnavis/status/1377183786949959682\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`;\n","export default /* glsl */`\n#ifdef PREMULTIPLIED_ALPHA\n\n\t// Get get normal blending with premultipled, use with CustomBlending, OneFactor, OneMinusSrcAlphaFactor, AddEquation.\n\tgl_FragColor.rgb *= gl_FragColor.a;\n\n#endif\n`;\n","export default /* glsl */`\nvec4 mvPosition = vec4( transformed, 1.0 );\n\n#ifdef USE_INSTANCING\n\n\tmvPosition = instanceMatrix * mvPosition;\n\n#endif\n\nmvPosition = modelViewMatrix * mvPosition;\n\ngl_Position = projectionMatrix * mvPosition;\n`;\n","export default /* glsl */`\n#ifdef DITHERING\n\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef DITHERING\n\n\t// based on https://www.shadertoy.com/view/MslGR8\n\tvec3 dithering( vec3 color ) {\n\t\t//Calculate grid position\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\n\t\t//Shift the individual colors differently, thus making it even harder to see the dithering pattern\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\n\t\t//modify shift acording to grid position.\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\n\t\t//shift the color by dither_shift\n\t\treturn color + dither_shift_RGB;\n\t}\n\n#endif\n`;\n","export default /* glsl */`\nfloat roughnessFactor = roughness;\n\n#ifdef USE_ROUGHNESSMAP\n\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\n\t// reads channel G, compatible with a combined OcclusionRoughnessMetallic (RGB) texture\n\troughnessFactor *= texelRoughness.g;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_ROUGHNESSMAP\n\n\tuniform sampler2D roughnessMap;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_SHADOWMAP\n\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\n\t#endif\n\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\n\t#endif\n\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\n\t#endif\n\n\t/*\n\t#if NUM_RECT_AREA_LIGHTS > 0\n\n\t\t// TODO (abelnation): create uniforms for area light shadows\n\n\t#endif\n\t*/\n\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\n\t}\n\n\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\n\n\t\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\n\n\t}\n\n\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\n\n\t\tfloat occlusion = 1.0;\n\n\t\tvec2 distribution = texture2DDistribution( shadow, uv );\n\n\t\tfloat hard_shadow = step( compare , distribution.x ); // Hard Shadow\n\n\t\tif (hard_shadow != 1.0 ) {\n\n\t\t\tfloat distance = compare - distribution.x ;\n\t\t\tfloat variance = max( 0.00000, distribution.y * distribution.y );\n\t\t\tfloat softness_probability = variance / (variance + distance * distance ); // Chebeyshevs inequality\n\t\t\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 ); // 0.3 reduces light bleed\n\t\t\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\n\n\t\t}\n\t\treturn occlusion;\n\n\t}\n\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\n\t\tfloat shadow = 1.0;\n\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\n\t\t// if ( something && something ) breaks ATI OpenGL shader compiler\n\t\t// if ( all( something, something ) ) using this instead\n\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\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\n\t\tbool frustumTest = all( frustumTestVec );\n\n\t\tif ( frustumTest ) {\n\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\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\tfloat dx2 = dx0 / 2.0;\n\t\t\tfloat dy2 = dy0 / 2.0;\n\t\t\tfloat dx3 = dx1 / 2.0;\n\t\t\tfloat dy3 = dy1 / 2.0;\n\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( dx2, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), 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( dx2, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), 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 / 17.0 );\n\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx = texelSize.x;\n\t\t\tfloat dy = texelSize.y;\n\n\t\t\tvec2 uv = shadowCoord.xy;\n\t\t\tvec2 f = fract( uv * shadowMapSize + 0.5 );\n\t\t\tuv -= f * texelSize;\n\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ), \n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t f.y )\n\t\t\t) * ( 1.0 / 9.0 );\n\n\t\t#elif defined( SHADOWMAP_TYPE_VSM )\n\n\t\t\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n\n\t\t#else // no percentage-closer filtering:\n\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\n\t\t#endif\n\n\t\t}\n\n\t\treturn shadow;\n\n\t}\n\n\t// cubeToUV() maps a 3D direction vector suitable for cube texture mapping to a 2D\n\t// vector suitable for 2D texture mapping. This code uses the following layout for the\n\t// 2D texture:\n\t//\n\t// xzXZ\n\t// y Y\n\t//\n\t// Y - Positive y direction\n\t// y - Negative y direction\n\t// X - Positive x direction\n\t// x - Negative x direction\n\t// Z - Positive z direction\n\t// z - Negative z direction\n\t//\n\t// Source and test bed:\n\t// https://gist.github.com/tschw/da10c43c467ce8afd0c4\n\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\n\t\t// Number of texels to avoid at the edge of each square\n\n\t\tvec3 absV = abs( v );\n\n\t\t// Intersect unit cube\n\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\n\t\t// Apply scale to avoid seams\n\n\t\t// two texels less per square (one texel will do for NEAREST)\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\n\t\t// Unwrap\n\n\t\t// space: -1 ... 1 range for each square\n\t\t//\n\t\t// #X##\t\tdim := ( 4 , 2 )\n\t\t// # #\t\tcenter := ( 1 , 1 )\n\n\t\tvec2 planar = v.xy;\n\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\n\t\tif ( absV.z >= almostOne ) {\n\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\n\t\t} else if ( absV.x >= almostOne ) {\n\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\n\t\t} else if ( absV.y >= almostOne ) {\n\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\n\t\t}\n\n\t\t// Transform to UV space\n\n\t\t// scale := 0.5 / dim\n\t\t// translate := ( center + 0.5 ) / dim\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\n\t}\n\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\n\t\t// for point lights, the uniform @vShadowCoord is re-purposed to hold\n\t\t// the vector from the light to the world-space position of the fragment.\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\n\t\t// dp = normalized distance from light to fragment position\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear ); // need to clamp?\n\t\tdp += shadowBias;\n\n\t\t// bd3D = base direction 3D\n\t\tvec3 bd3D = normalize( lightToPosition );\n\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\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\n\t\t#else // no percentage-closer filtering\n\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\n\t\t#endif\n\n\t}\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_SHADOWMAP\n\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\n\t#endif\n\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\n\t#endif\n\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\n\t#endif\n\n\t/*\n\t#if NUM_RECT_AREA_LIGHTS > 0\n\n\t\t// TODO (abelnation): uniforms for area light shadows\n\n\t#endif\n\t*/\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_SHADOWMAP\n\n\t#if NUM_DIR_LIGHT_SHADOWS > 0 || NUM_SPOT_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0\n\n\t\t// Offsetting the position used for querying occlusion along the world normal can be used to reduce shadow acne.\n\t\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\tvec4 shadowWorldPosition;\n\n\t#endif\n\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n\n\t}\n\t#pragma unroll_loop_end\n\n\t#endif\n\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * shadowWorldPosition;\n\n\t}\n\t#pragma unroll_loop_end\n\n\t#endif\n\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n\n\t}\n\t#pragma unroll_loop_end\n\n\t#endif\n\n\t/*\n\t#if NUM_RECT_AREA_LIGHTS > 0\n\n\t\t// TODO (abelnation): update vAreaShadowCoord with area light info\n\n\t#endif\n\t*/\n\n#endif\n`;\n","export default /* glsl */`\nfloat getShadowMask() {\n\n\tfloat shadow = 1.0;\n\n\t#ifdef USE_SHADOWMAP\n\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\n\tDirectionalLightShadow directionalLight;\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\n\t\tdirectionalLight = directionalLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\n\t}\n\t#pragma unroll_loop_end\n\n\t#endif\n\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\n\tSpotLightShadow spotLight;\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\n\t\tspotLight = spotLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\n\t}\n\t#pragma unroll_loop_end\n\n\t#endif\n\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\n\tPointLightShadow pointLight;\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\n\t\tpointLight = pointLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\n\t}\n\t#pragma unroll_loop_end\n\n\t#endif\n\n\t/*\n\t#if NUM_RECT_AREA_LIGHTS > 0\n\n\t\t// TODO (abelnation): update shadow for Area light\n\n\t#endif\n\t*/\n\n\t#endif\n\n\treturn shadow;\n\n}\n`;\n","export default /* glsl */`\n#ifdef USE_SKINNING\n\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\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_SKINNING\n\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\n\t#ifdef BONE_TEXTURE\n\n\t\tuniform highp sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\n\t\tmat4 getBoneMatrix( const in float i ) {\n\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\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\n\t\t\ty = dy * ( y + 0.5 );\n\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\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\n\t\t\treturn bone;\n\n\t\t}\n\n\t#else\n\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\n\t\tmat4 getBoneMatrix( const in float i ) {\n\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\n\t\t}\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_SKINNING\n\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\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\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_SKINNING\n\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\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\n\t#ifdef USE_TANGENT\n\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\nfloat specularStrength;\n\n#ifdef USE_SPECULARMAP\n\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n\n#else\n\n\tspecularStrength = 1.0;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_SPECULARMAP\n\n\tuniform sampler2D specularMap;\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( TONE_MAPPING )\n\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n\n#endif\n`;\n","export default /* glsl */`\n#ifndef saturate\n// may have defined saturate() already\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\n\nuniform float toneMappingExposure;\n\n// exposure only\nvec3 LinearToneMapping( vec3 color ) {\n\n\treturn toneMappingExposure * color;\n\n}\n\n// source: https://www.cs.utah.edu/docs/techreports/2002/pdf/UUCS-02-001.pdf\nvec3 ReinhardToneMapping( vec3 color ) {\n\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n\n}\n\n// source: http://filmicworlds.com/blog/filmic-tonemapping-operators/\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\n\t// optimized filmic operator by Jim Hejl and Richard Burgess-Dawson\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}\n\n// source: https://github.com/selfshadow/ltc_code/blob/master/webgl/shaders/ltc/ltc_blit.fs\nvec3 RRTAndODTFit( vec3 v ) {\n\n\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\n\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\n\treturn a / b;\n\n}\n\n// this implementation of ACES is modified to accommodate a brighter viewing environment.\n// the scale factor of 1/0.6 is subjective. see discussion in #19621.\n\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\n\t// sRGB => XYZ => D65_2_D60 => AP1 => RRT_SAT\n\tconst mat3 ACESInputMat = mat3(\n\t\tvec3( 0.59719, 0.07600, 0.02840 ), // transposed from source\n\t\tvec3( 0.35458, 0.90834, 0.13383 ),\n\t\tvec3( 0.04823, 0.01566, 0.83777 )\n\t);\n\n\t// ODT_SAT => XYZ => D60_2_D65 => sRGB\n\tconst mat3 ACESOutputMat = mat3(\n\t\tvec3( 1.60475, -0.10208, -0.00327 ), // transposed from source\n\t\tvec3( -0.53108, 1.10813, -0.07276 ),\n\t\tvec3( -0.07367, -0.00605, 1.07602 )\n\t);\n\n\tcolor *= toneMappingExposure / 0.6;\n\n\tcolor = ACESInputMat * color;\n\n\t// Apply RRT and ODT\n\tcolor = RRTAndODTFit( color );\n\n\tcolor = ACESOutputMat * color;\n\n\t// Clamp to [0, 1]\n\treturn saturate( color );\n\n}\n\nvec3 CustomToneMapping( vec3 color ) { return color; }\n`;\n","export default /* glsl */`\n#ifdef USE_TRANSMISSION\n\n\tfloat transmissionAlpha = 1.0;\n\tfloat transmissionFactor = transmission;\n\tfloat thicknessFactor = thickness;\n\n\t#ifdef USE_TRANSMISSIONMAP\n\n\t\ttransmissionFactor *= texture2D( transmissionMap, vUv ).r;\n\n\t#endif\n\n\t#ifdef USE_THICKNESSMAP\n\n\t\tthicknessFactor *= texture2D( thicknessMap, vUv ).g;\n\n\t#endif\n\n\tvec3 pos = vWorldPosition;\n\tvec3 v = normalize( cameraPosition - pos );\n\tvec3 n = inverseTransformDirection( normal, viewMatrix );\n\n\tvec4 transmission = getIBLVolumeRefraction(\n\t\tn, v, roughnessFactor, material.diffuseColor, material.specularColor, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, ior, thicknessFactor,\n\t\tattenuationColor, attenuationDistance );\n\n\ttotalDiffuse = mix( totalDiffuse, transmission.rgb, transmissionFactor );\n\ttransmissionAlpha = mix( transmissionAlpha, transmission.a, transmissionFactor );\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_TRANSMISSION\n\n\t// Transmission code is based on glTF-Sampler-Viewer\n\t// https://github.com/KhronosGroup/glTF-Sample-Viewer\n\n\tuniform float transmission;\n\tuniform float thickness;\n\tuniform float attenuationDistance;\n\tuniform vec3 attenuationColor;\n\n\t#ifdef USE_TRANSMISSIONMAP\n\n\t\tuniform sampler2D transmissionMap;\n\n\t#endif\n\n\t#ifdef USE_THICKNESSMAP\n\n\t\tuniform sampler2D thicknessMap;\n\n\t#endif\n\n\tuniform vec2 transmissionSamplerSize;\n\tuniform sampler2D transmissionSamplerMap;\n\n\tuniform mat4 modelMatrix;\n\tuniform mat4 projectionMatrix;\n\n\tvarying vec3 vWorldPosition;\n\n\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\n\n\t\t// Direction of refracted light.\n\t\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\n\n\t\t// Compute rotation-independant scaling of the model matrix.\n\t\tvec3 modelScale;\n\t\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\n\t\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\n\t\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\n\n\t\t// The thickness is specified in local space.\n\t\treturn normalize( refractionVector ) * thickness * modelScale;\n\n\t}\n\n\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\n\n\t\t// Scale roughness with IOR so that an IOR of 1.0 results in no microfacet refraction and\n\t\t// an IOR of 1.5 results in the default amount of microfacet refraction.\n\t\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\n\n\t}\n\n\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\n\n\t\tfloat framebufferLod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n\n\t\t#ifdef TEXTURE_LOD_EXT\n\n\t\t\treturn texture2DLodEXT( transmissionSamplerMap, fragCoord.xy, framebufferLod );\n\n\t\t#else\n\n\t\t\treturn texture2D( transmissionSamplerMap, fragCoord.xy, framebufferLod );\n\n\t\t#endif\n\n\t}\n\n\tvec3 applyVolumeAttenuation( const in vec3 radiance, const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\n\n\t\tif ( attenuationDistance == 0.0 ) {\n\n\t\t\t// Attenuation distance is +∞ (which we indicate by zero), i.e. the transmitted color is not attenuated at all.\n\t\t\treturn radiance;\n\n\t\t} else {\n\n\t\t\t// Compute light attenuation using Beer's law.\n\t\t\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n\t\t\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance ); // Beer's law\n\t\t\treturn transmittance * radiance;\n\n\t\t}\n\n\t}\n\n\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\n\t\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\n\t\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float ior, const in float thickness,\n\t\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\n\n\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\tvec3 refractedRayExit = position + transmissionRay;\n\n\t\t// Project refracted vector on the framebuffer, while mapping to normalized device coordinates.\n\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\trefractionCoords += 1.0;\n\t\trefractionCoords /= 2.0;\n\n\t\t// Sample framebuffer to get pixel the refracted ray hits.\n\t\tvec4 transmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n\n\t\tvec3 attenuatedColor = applyVolumeAttenuation( transmittedLight.rgb, length( transmissionRay ), attenuationColor, attenuationDistance );\n\n\t\t// Get the specular component.\n\t\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n\n\t\treturn vec4( ( 1.0 - F ) * attenuatedColor * diffuseColor, transmittedLight.a );\n\n\t}\n#endif\n`;\n","export default /* glsl */`\n#if ( defined( USE_UV ) && ! defined( UVS_VERTEX_ONLY ) )\n\n\tvarying vec2 vUv;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_UV\n\n\t#ifdef UVS_VERTEX_ONLY\n\n\t\tvec2 vUv;\n\n\t#else\n\n\t\tvarying vec2 vUv;\n\n\t#endif\n\n\tuniform mat3 uvTransform;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_UV\n\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\n\tvarying vec2 vUv2;\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n\n\tuniform mat3 uv2Transform;\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\n\tvUv2 = ( uv2Transform * vec3( uv2, 1 ) ).xy;\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION )\n\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\n\t#ifdef USE_INSTANCING\n\n\t\tworldPosition = instanceMatrix * worldPosition;\n\n\t#endif\n\n\tworldPosition = modelMatrix * worldPosition;\n\n#endif\n`;\n","export const vertex = /* glsl */`\nvarying vec2 vUv;\nuniform mat3 uvTransform;\n\nvoid main() {\n\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n\n}\n`;\n\nexport const fragment = /* glsl */`\nuniform sampler2D t2D;\n\nvarying vec2 vUv;\n\nvoid main() {\n\n\tgl_FragColor = texture2D( t2D, vUv );\n\n\t#include \n\t#include \n\n}\n`;\n","export const vertex = /* glsl */`\nvarying vec3 vWorldDirection;\n\n#include \n\nvoid main() {\n\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t#include \n\t#include \n\n\tgl_Position.z = gl_Position.w; // set z to camera.far\n\n}\n`;\n\nexport const fragment = /* glsl */`\n#include \nuniform float opacity;\n\nvarying vec3 vWorldDirection;\n\n#include \n\nvoid main() {\n\n\tvec3 vReflect = vWorldDirection;\n\t#include \n\n\tgl_FragColor = envColor;\n\tgl_FragColor.a *= opacity;\n\n\t#include \n\t#include \n\n}\n`;\n","export const vertex = /* glsl */`\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n\n// This is used for computing an equivalent of gl_FragCoord.z that is as high precision as possible.\n// Some platforms compute gl_FragCoord at a lower precision which makes the manually computed value better for\n// depth-based postprocessing effects. Reproduced on iPad with A10 processor / iPadOS 13.3.1.\nvarying vec2 vHighPrecisionZW;\n\nvoid main() {\n\n\t#include \n\n\t#include \n\n\t#ifdef USE_DISPLACEMENTMAP\n\n\t\t#include \n\t\t#include \n\t\t#include \n\n\t#endif\n\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\n\tvHighPrecisionZW = gl_Position.zw;\n\n}\n`;\n\nexport const fragment = /* glsl */`\n#if DEPTH_PACKING == 3200\n\n\tuniform float opacity;\n\n#endif\n\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n\nvarying vec2 vHighPrecisionZW;\n\nvoid main() {\n\n\t#include \n\n\tvec4 diffuseColor = vec4( 1.0 );\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tdiffuseColor.a = opacity;\n\n\t#endif\n\n\t#include \n\t#include \n\t#include \n\n\t#include \n\n\t// Higher precision equivalent of gl_FragCoord.z. This assumes depthRange has been left to its default values.\n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\n\n\t#elif DEPTH_PACKING == 3201\n\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\n\t#endif\n\n}\n`;\n","export const vertex = /* glsl */`\n#define DISTANCE\n\nvarying vec3 vWorldPosition;\n\n#include \n#include \n#include \n#include \n#include \n#include \n\nvoid main() {\n\n\t#include \n\n\t#include \n\n\t#ifdef USE_DISPLACEMENTMAP\n\n\t\t#include \n\t\t#include \n\t\t#include \n\n\t#endif\n\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\n\tvWorldPosition = worldPosition.xyz;\n\n}\n`;\n\nexport const fragment = /* glsl */`\n#define DISTANCE\n\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n\nvoid main () {\n\n\t#include \n\n\tvec4 diffuseColor = vec4( 1.0 );\n\n\t#include \n\t#include \n\t#include \n\n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist ); // clamp to [ 0, 1 ]\n\n\tgl_FragColor = packDepthToRGBA( dist );\n\n}\n`;\n","export const vertex = /* glsl */`\nvarying vec3 vWorldDirection;\n\n#include \n\nvoid main() {\n\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t#include \n\t#include \n\n}\n`;\n\nexport const fragment = /* glsl */`\nuniform sampler2D tEquirect;\n\nvarying vec3 vWorldDirection;\n\n#include \n\nvoid main() {\n\n\tvec3 direction = normalize( vWorldDirection );\n\n\tvec2 sampleUV = equirectUv( direction );\n\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t#include \n\t#include \n\n}\n`;\n","export const vertex = /* glsl */`\nuniform float scale;\nattribute float lineDistance;\n\nvarying float vLineDistance;\n\n#include \n#include \n#include \n#include \n#include \n#include \n\nvoid main() {\n\n\tvLineDistance = scale * lineDistance;\n\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\n}\n`;\n\nexport const fragment = /* glsl */`\nuniform vec3 diffuse;\nuniform float opacity;\n\nuniform float dashSize;\nuniform float totalSize;\n\nvarying float vLineDistance;\n\n#include \n#include \n#include \n#include \n#include \n\nvoid main() {\n\n\t#include \n\n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\n\t\tdiscard;\n\n\t}\n\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\n\t#include \n\t#include \n\n\toutgoingLight = diffuseColor.rgb; // simple shader\n\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\n}\n`;\n","export const vertex = /* glsl */`\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n\nvoid main() {\n\n\t#include \n\t#include \n\t#include \n\n\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\n\n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\n\t#endif\n\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\n\t#include \n\t#include \n\t#include \n\n}\n`;\n\nexport const fragment = /* glsl */`\nuniform vec3 diffuse;\nuniform float opacity;\n\n#ifndef FLAT_SHADED\n\n\tvarying vec3 vNormal;\n\n#endif\n\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n\nvoid main() {\n\n\t#include \n\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\n\t// accumulation (baked indirect lighting only)\n\t#ifdef USE_LIGHTMAP\n\n\t\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\t\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity;\n\n\t#else\n\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\n\t#endif\n\n\t// modulation\n\t#include \n\n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\n\t#include \n\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\n}\n`;\n","export const vertex = /* glsl */`\n#define LAMBERT\n\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n\nvoid main() {\n\n\t#include \n\t#include \n\t#include \n\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n`;\n\nexport const fragment = /* glsl */`\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n\n\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n\nvoid main() {\n\n\t#include \n\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\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\n\t// accumulation\n\n\t#ifdef DOUBLE_SIDED\n\n\t\treflectedLight.indirectDiffuse += ( gl_FrontFacing ) ? vIndirectFront : vIndirectBack;\n\n\t#else\n\n\t\treflectedLight.indirectDiffuse += vIndirectFront;\n\n\t#endif\n\n\t#include \n\n\treflectedLight.indirectDiffuse *= BRDF_Lambert( diffuseColor.rgb );\n\n\t#ifdef DOUBLE_SIDED\n\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\n\t#else\n\n\t\treflectedLight.directDiffuse = vLightFront;\n\n\t#endif\n\n\treflectedLight.directDiffuse *= BRDF_Lambert( diffuseColor.rgb ) * getShadowMask();\n\n\t// modulation\n\n\t#include \n\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\n\t#include \n\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n`;\n","export const vertex = /* glsl */`\n#define MATCAP\n\nvarying vec3 vViewPosition;\n\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n\n#include \n#include \n\nvoid main() {\n\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\n\t#include \n\t#include \n\t#include \n\n\tvViewPosition = - mvPosition.xyz;\n\n}\n`;\n\nexport const fragment = /* glsl */`\n#define MATCAP\n\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\n\nvarying vec3 vViewPosition;\n\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n\nvoid main() {\n\n\t#include \n\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\n\tvec3 viewDir = normalize( vViewPosition );\n\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n\tvec3 y = cross( viewDir, x );\n\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5; // 0.495 to remove artifacts caused by undersized matcap disks\n\n\t#ifdef USE_MATCAP\n\n\t\tvec4 matcapColor = texture2D( matcap, uv );\n\n\t#else\n\n\t\tvec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 ); // default if matcap is missing\n\n\t#endif\n\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\n}\n`;\n","export const vertex = /* glsl */`\n#define NORMAL\n\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\n\tvarying vec3 vViewPosition;\n\n#endif\n\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n\nvoid main() {\n\n\t#include \n\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\n\tvViewPosition = - mvPosition.xyz;\n\n#endif\n\n}\n`;\n\nexport const fragment = /* glsl */`\n#define NORMAL\n\nuniform float opacity;\n\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\n\tvarying vec3 vViewPosition;\n\n#endif\n\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n\nvoid main() {\n\n\t#include \n\t#include \n\t#include \n\t#include \n\n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n\n\t#ifdef OPAQUE\n\n\t\tgl_FragColor.a = 1.0;\n\n\t#endif\n\n}\n`;\n","export const vertex = /* glsl */`\n#define PHONG\n\nvarying vec3 vViewPosition;\n\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n\nvoid main() {\n\n\t#include \n\t#include \n\t#include \n\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\n\tvViewPosition = - mvPosition.xyz;\n\n\t#include \n\t#include \n\t#include \n\t#include \n\n}\n`;\n\nexport const fragment = /* glsl */`\n#define PHONG\n\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n\nvoid main() {\n\n\t#include \n\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\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\n\t// accumulation\n\t#include \n\t#include \n\t#include \n\t#include \n\n\t// modulation\n\t#include \n\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\n}\n`;\n","export const vertex = /* glsl */`\n#define STANDARD\n\nvarying vec3 vViewPosition;\n\n#ifdef USE_TRANSMISSION\n\n\tvarying vec3 vWorldPosition;\n\n#endif\n\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n\nvoid main() {\n\n\t#include \n\t#include \n\t#include \n\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\n\tvViewPosition = - mvPosition.xyz;\n\n\t#include \n\t#include \n\t#include \n\n#ifdef USE_TRANSMISSION\n\n\tvWorldPosition = worldPosition.xyz;\n\n#endif\n}\n`;\n\nexport const fragment = /* glsl */`\n#define STANDARD\n\n#ifdef PHYSICAL\n\t#define IOR\n\t#define SPECULAR\n#endif\n\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n\n#ifdef IOR\n\tuniform float ior;\n#endif\n\n#ifdef SPECULAR\n\tuniform float specularIntensity;\n\tuniform vec3 specularColor;\n\n\t#ifdef USE_SPECULARINTENSITYMAP\n\t\tuniform sampler2D specularIntensityMap;\n\t#endif\n\n\t#ifdef USE_SPECULARCOLORMAP\n\t\tuniform sampler2D specularColorMap;\n\t#endif\n#endif\n\n#ifdef USE_CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n\n#ifdef USE_SHEEN\n\tuniform vec3 sheenColor;\n\tuniform float sheenRoughness;\n\n\t#ifdef USE_SHEENCOLORMAP\n\t\tuniform sampler2D sheenColorMap;\n\t#endif\n\n\t#ifdef USE_SHEENROUGHNESSMAP\n\t\tuniform sampler2D sheenRoughnessMap;\n\t#endif\n#endif\n\nvarying vec3 vViewPosition;\n\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n\nvoid main() {\n\n\t#include \n\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\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\n\t// accumulation\n\t#include \n\t#include \n\t#include \n\t#include \n\n\t// modulation\n\t#include \n\n\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\n\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n\n\t#include \n\n\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\n\n\t#ifdef USE_SHEEN\n\n\t\t// Sheen energy compensation approximation calculation can be found at the end of\n\t\t// https://drive.google.com/file/d/1T0D1VSyR4AllqIJTQAraEIzjlb5h4FKH/view?usp=sharing\n\t\tfloat sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );\n\n\t\toutgoingLight = outgoingLight * sheenEnergyComp + sheenSpecular;\n\n\t#endif\n\n\t#ifdef USE_CLEARCOAT\n\n\t\tfloat dotNVcc = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\n\n\t\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\n\n\t\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + clearcoatSpecular * material.clearcoat;\n\n\t#endif\n\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\n}\n`;\n","export const vertex = /* glsl */`\n#define TOON\n\nvarying vec3 vViewPosition;\n\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n\nvoid main() {\n\n\t#include \n\t#include \n\t#include \n\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\n\tvViewPosition = - mvPosition.xyz;\n\n\t#include \n\t#include \n\t#include \n\n}\n`;\n\nexport const fragment = /* glsl */`\n#define TOON\n\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n\nvoid main() {\n\n\t#include \n\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\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\n\t// accumulation\n\t#include \n\t#include \n\t#include \n\t#include \n\n\t// modulation\n\t#include \n\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\n}\n`;\n","export const vertex = /* glsl */`\nuniform float size;\nuniform float scale;\n\n#include \n#include \n#include \n#include \n#include \n#include \n\nvoid main() {\n\n\t#include \n\t#include \n\t#include \n\t#include \n\n\tgl_PointSize = size;\n\n\t#ifdef USE_SIZEATTENUATION\n\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\n\t#endif\n\n\t#include \n\t#include \n\t#include \n\t#include \n\n}\n`;\n\nexport const fragment = /* glsl */`\nuniform vec3 diffuse;\nuniform float opacity;\n\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n\nvoid main() {\n\n\t#include \n\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\n\t#include \n\t#include \n\t#include \n\t#include \n\n\toutgoingLight = diffuseColor.rgb;\n\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\n}\n`;\n","export const vertex = /* glsl */`\n#include \n#include \n#include \n#include \n#include \n\nvoid main() {\n\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\n\t#include \n\t#include \n\t#include \n\t#include \n\n\t#include \n\t#include \n\t#include \n\n}\n`;\n\nexport const fragment = /* glsl */`\nuniform vec3 color;\nuniform float opacity;\n\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n\nvoid main() {\n\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\n\t#include \n\t#include \n\t#include \n\n}\n`;\n","export const vertex = /* glsl */`\nuniform float rotation;\nuniform vec2 center;\n\n#include \n#include \n#include \n#include \n#include \n\nvoid main() {\n\n\t#include \n\n\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n\n\tvec2 scale;\n\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\n\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\n\n\t#ifndef USE_SIZEATTENUATION\n\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\n\t#endif\n\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\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\n\tmvPosition.xy += rotatedPosition;\n\n\tgl_Position = projectionMatrix * mvPosition;\n\n\t#include \n\t#include \n\t#include \n\n}\n`;\n\nexport const fragment = /* glsl */`\nuniform vec3 diffuse;\nuniform float opacity;\n\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n\nvoid main() {\n\n\t#include \n\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\n\t#include \n\t#include \n\t#include \n\t#include \n\n\toutgoingLight = diffuseColor.rgb;\n\n\t#include \n\t#include \n\t#include \n\t#include \n\n}\n`;\n","import alphamap_fragment from './ShaderChunk/alphamap_fragment.glsl.js';\nimport alphamap_pars_fragment from './ShaderChunk/alphamap_pars_fragment.glsl.js';\nimport alphatest_fragment from './ShaderChunk/alphatest_fragment.glsl.js';\nimport alphatest_pars_fragment from './ShaderChunk/alphatest_pars_fragment.glsl.js';\nimport aomap_fragment from './ShaderChunk/aomap_fragment.glsl.js';\nimport aomap_pars_fragment from './ShaderChunk/aomap_pars_fragment.glsl.js';\nimport begin_vertex from './ShaderChunk/begin_vertex.glsl.js';\nimport beginnormal_vertex from './ShaderChunk/beginnormal_vertex.glsl.js';\nimport bsdfs from './ShaderChunk/bsdfs.glsl.js';\nimport bumpmap_pars_fragment from './ShaderChunk/bumpmap_pars_fragment.glsl.js';\nimport clipping_planes_fragment from './ShaderChunk/clipping_planes_fragment.glsl.js';\nimport clipping_planes_pars_fragment from './ShaderChunk/clipping_planes_pars_fragment.glsl.js';\nimport clipping_planes_pars_vertex from './ShaderChunk/clipping_planes_pars_vertex.glsl.js';\nimport clipping_planes_vertex from './ShaderChunk/clipping_planes_vertex.glsl.js';\nimport color_fragment from './ShaderChunk/color_fragment.glsl.js';\nimport color_pars_fragment from './ShaderChunk/color_pars_fragment.glsl.js';\nimport color_pars_vertex from './ShaderChunk/color_pars_vertex.glsl.js';\nimport color_vertex from './ShaderChunk/color_vertex.glsl.js';\nimport common from './ShaderChunk/common.glsl.js';\nimport cube_uv_reflection_fragment from './ShaderChunk/cube_uv_reflection_fragment.glsl.js';\nimport defaultnormal_vertex from './ShaderChunk/defaultnormal_vertex.glsl.js';\nimport displacementmap_pars_vertex from './ShaderChunk/displacementmap_pars_vertex.glsl.js';\nimport displacementmap_vertex from './ShaderChunk/displacementmap_vertex.glsl.js';\nimport emissivemap_fragment from './ShaderChunk/emissivemap_fragment.glsl.js';\nimport emissivemap_pars_fragment from './ShaderChunk/emissivemap_pars_fragment.glsl.js';\nimport encodings_fragment from './ShaderChunk/encodings_fragment.glsl.js';\nimport encodings_pars_fragment from './ShaderChunk/encodings_pars_fragment.glsl.js';\nimport envmap_fragment from './ShaderChunk/envmap_fragment.glsl.js';\nimport envmap_common_pars_fragment from './ShaderChunk/envmap_common_pars_fragment.glsl.js';\nimport envmap_pars_fragment from './ShaderChunk/envmap_pars_fragment.glsl.js';\nimport envmap_pars_vertex from './ShaderChunk/envmap_pars_vertex.glsl.js';\nimport envmap_vertex from './ShaderChunk/envmap_vertex.glsl.js';\nimport fog_vertex from './ShaderChunk/fog_vertex.glsl.js';\nimport fog_pars_vertex from './ShaderChunk/fog_pars_vertex.glsl.js';\nimport fog_fragment from './ShaderChunk/fog_fragment.glsl.js';\nimport fog_pars_fragment from './ShaderChunk/fog_pars_fragment.glsl.js';\nimport gradientmap_pars_fragment from './ShaderChunk/gradientmap_pars_fragment.glsl.js';\nimport lightmap_fragment from './ShaderChunk/lightmap_fragment.glsl.js';\nimport lightmap_pars_fragment from './ShaderChunk/lightmap_pars_fragment.glsl.js';\nimport lights_lambert_vertex from './ShaderChunk/lights_lambert_vertex.glsl.js';\nimport lights_pars_begin from './ShaderChunk/lights_pars_begin.glsl.js';\nimport envmap_physical_pars_fragment from './ShaderChunk/envmap_physical_pars_fragment.glsl.js';\nimport lights_toon_fragment from './ShaderChunk/lights_toon_fragment.glsl.js';\nimport lights_toon_pars_fragment from './ShaderChunk/lights_toon_pars_fragment.glsl.js';\nimport lights_phong_fragment from './ShaderChunk/lights_phong_fragment.glsl.js';\nimport lights_phong_pars_fragment from './ShaderChunk/lights_phong_pars_fragment.glsl.js';\nimport lights_physical_fragment from './ShaderChunk/lights_physical_fragment.glsl.js';\nimport lights_physical_pars_fragment from './ShaderChunk/lights_physical_pars_fragment.glsl.js';\nimport lights_fragment_begin from './ShaderChunk/lights_fragment_begin.glsl.js';\nimport lights_fragment_maps from './ShaderChunk/lights_fragment_maps.glsl.js';\nimport lights_fragment_end from './ShaderChunk/lights_fragment_end.glsl.js';\nimport logdepthbuf_fragment from './ShaderChunk/logdepthbuf_fragment.glsl.js';\nimport logdepthbuf_pars_fragment from './ShaderChunk/logdepthbuf_pars_fragment.glsl.js';\nimport logdepthbuf_pars_vertex from './ShaderChunk/logdepthbuf_pars_vertex.glsl.js';\nimport logdepthbuf_vertex from './ShaderChunk/logdepthbuf_vertex.glsl.js';\nimport map_fragment from './ShaderChunk/map_fragment.glsl.js';\nimport map_pars_fragment from './ShaderChunk/map_pars_fragment.glsl.js';\nimport map_particle_fragment from './ShaderChunk/map_particle_fragment.glsl.js';\nimport map_particle_pars_fragment from './ShaderChunk/map_particle_pars_fragment.glsl.js';\nimport metalnessmap_fragment from './ShaderChunk/metalnessmap_fragment.glsl.js';\nimport metalnessmap_pars_fragment from './ShaderChunk/metalnessmap_pars_fragment.glsl.js';\nimport morphnormal_vertex from './ShaderChunk/morphnormal_vertex.glsl.js';\nimport morphtarget_pars_vertex from './ShaderChunk/morphtarget_pars_vertex.glsl.js';\nimport morphtarget_vertex from './ShaderChunk/morphtarget_vertex.glsl.js';\nimport normal_fragment_begin from './ShaderChunk/normal_fragment_begin.glsl.js';\nimport normal_fragment_maps from './ShaderChunk/normal_fragment_maps.glsl.js';\nimport normal_pars_fragment from './ShaderChunk/normal_pars_fragment.glsl.js';\nimport normal_pars_vertex from './ShaderChunk/normal_pars_vertex.glsl.js';\nimport normal_vertex from './ShaderChunk/normal_vertex.glsl.js';\nimport normalmap_pars_fragment from './ShaderChunk/normalmap_pars_fragment.glsl.js';\nimport clearcoat_normal_fragment_begin from './ShaderChunk/clearcoat_normal_fragment_begin.glsl.js';\nimport clearcoat_normal_fragment_maps from './ShaderChunk/clearcoat_normal_fragment_maps.glsl.js';\nimport clearcoat_pars_fragment from './ShaderChunk/clearcoat_pars_fragment.glsl.js';\nimport output_fragment from './ShaderChunk/output_fragment.glsl.js';\nimport packing from './ShaderChunk/packing.glsl.js';\nimport premultiplied_alpha_fragment from './ShaderChunk/premultiplied_alpha_fragment.glsl.js';\nimport project_vertex from './ShaderChunk/project_vertex.glsl.js';\nimport dithering_fragment from './ShaderChunk/dithering_fragment.glsl.js';\nimport dithering_pars_fragment from './ShaderChunk/dithering_pars_fragment.glsl.js';\nimport roughnessmap_fragment from './ShaderChunk/roughnessmap_fragment.glsl.js';\nimport roughnessmap_pars_fragment from './ShaderChunk/roughnessmap_pars_fragment.glsl.js';\nimport shadowmap_pars_fragment from './ShaderChunk/shadowmap_pars_fragment.glsl.js';\nimport shadowmap_pars_vertex from './ShaderChunk/shadowmap_pars_vertex.glsl.js';\nimport shadowmap_vertex from './ShaderChunk/shadowmap_vertex.glsl.js';\nimport shadowmask_pars_fragment from './ShaderChunk/shadowmask_pars_fragment.glsl.js';\nimport skinbase_vertex from './ShaderChunk/skinbase_vertex.glsl.js';\nimport skinning_pars_vertex from './ShaderChunk/skinning_pars_vertex.glsl.js';\nimport skinning_vertex from './ShaderChunk/skinning_vertex.glsl.js';\nimport skinnormal_vertex from './ShaderChunk/skinnormal_vertex.glsl.js';\nimport specularmap_fragment from './ShaderChunk/specularmap_fragment.glsl.js';\nimport specularmap_pars_fragment from './ShaderChunk/specularmap_pars_fragment.glsl.js';\nimport tonemapping_fragment from './ShaderChunk/tonemapping_fragment.glsl.js';\nimport tonemapping_pars_fragment from './ShaderChunk/tonemapping_pars_fragment.glsl.js';\nimport transmission_fragment from './ShaderChunk/transmission_fragment.glsl.js';\nimport transmission_pars_fragment from './ShaderChunk/transmission_pars_fragment.glsl.js';\nimport uv_pars_fragment from './ShaderChunk/uv_pars_fragment.glsl.js';\nimport uv_pars_vertex from './ShaderChunk/uv_pars_vertex.glsl.js';\nimport uv_vertex from './ShaderChunk/uv_vertex.glsl.js';\nimport uv2_pars_fragment from './ShaderChunk/uv2_pars_fragment.glsl.js';\nimport uv2_pars_vertex from './ShaderChunk/uv2_pars_vertex.glsl.js';\nimport uv2_vertex from './ShaderChunk/uv2_vertex.glsl.js';\nimport worldpos_vertex from './ShaderChunk/worldpos_vertex.glsl.js';\n\nimport * as background from './ShaderLib/background.glsl.js';\nimport * as cube from './ShaderLib/cube.glsl.js';\nimport * as depth from './ShaderLib/depth.glsl.js';\nimport * as distanceRGBA from './ShaderLib/distanceRGBA.glsl.js';\nimport * as equirect from './ShaderLib/equirect.glsl.js';\nimport * as linedashed from './ShaderLib/linedashed.glsl.js';\nimport * as meshbasic from './ShaderLib/meshbasic.glsl.js';\nimport * as meshlambert from './ShaderLib/meshlambert.glsl.js';\nimport * as meshmatcap from './ShaderLib/meshmatcap.glsl.js';\nimport * as meshnormal from './ShaderLib/meshnormal.glsl.js';\nimport * as meshphong from './ShaderLib/meshphong.glsl.js';\nimport * as meshphysical from './ShaderLib/meshphysical.glsl.js';\nimport * as meshtoon from './ShaderLib/meshtoon.glsl.js';\nimport * as points from './ShaderLib/points.glsl.js';\nimport * as shadow from './ShaderLib/shadow.glsl.js';\nimport * as sprite from './ShaderLib/sprite.glsl.js';\n\nexport const ShaderChunk = {\n\talphamap_fragment: alphamap_fragment,\n\talphamap_pars_fragment: alphamap_pars_fragment,\n\talphatest_fragment: alphatest_fragment,\n\talphatest_pars_fragment: alphatest_pars_fragment,\n\taomap_fragment: aomap_fragment,\n\taomap_pars_fragment: aomap_pars_fragment,\n\tbegin_vertex: begin_vertex,\n\tbeginnormal_vertex: beginnormal_vertex,\n\tbsdfs: bsdfs,\n\tbumpmap_pars_fragment: bumpmap_pars_fragment,\n\tclipping_planes_fragment: clipping_planes_fragment,\n\tclipping_planes_pars_fragment: clipping_planes_pars_fragment,\n\tclipping_planes_pars_vertex: clipping_planes_pars_vertex,\n\tclipping_planes_vertex: clipping_planes_vertex,\n\tcolor_fragment: color_fragment,\n\tcolor_pars_fragment: color_pars_fragment,\n\tcolor_pars_vertex: color_pars_vertex,\n\tcolor_vertex: color_vertex,\n\tcommon: common,\n\tcube_uv_reflection_fragment: cube_uv_reflection_fragment,\n\tdefaultnormal_vertex: defaultnormal_vertex,\n\tdisplacementmap_pars_vertex: displacementmap_pars_vertex,\n\tdisplacementmap_vertex: displacementmap_vertex,\n\temissivemap_fragment: emissivemap_fragment,\n\temissivemap_pars_fragment: emissivemap_pars_fragment,\n\tencodings_fragment: encodings_fragment,\n\tencodings_pars_fragment: encodings_pars_fragment,\n\tenvmap_fragment: envmap_fragment,\n\tenvmap_common_pars_fragment: envmap_common_pars_fragment,\n\tenvmap_pars_fragment: envmap_pars_fragment,\n\tenvmap_pars_vertex: envmap_pars_vertex,\n\tenvmap_physical_pars_fragment: envmap_physical_pars_fragment,\n\tenvmap_vertex: envmap_vertex,\n\tfog_vertex: fog_vertex,\n\tfog_pars_vertex: fog_pars_vertex,\n\tfog_fragment: fog_fragment,\n\tfog_pars_fragment: fog_pars_fragment,\n\tgradientmap_pars_fragment: gradientmap_pars_fragment,\n\tlightmap_fragment: lightmap_fragment,\n\tlightmap_pars_fragment: lightmap_pars_fragment,\n\tlights_lambert_vertex: lights_lambert_vertex,\n\tlights_pars_begin: lights_pars_begin,\n\tlights_toon_fragment: lights_toon_fragment,\n\tlights_toon_pars_fragment: lights_toon_pars_fragment,\n\tlights_phong_fragment: lights_phong_fragment,\n\tlights_phong_pars_fragment: lights_phong_pars_fragment,\n\tlights_physical_fragment: lights_physical_fragment,\n\tlights_physical_pars_fragment: lights_physical_pars_fragment,\n\tlights_fragment_begin: lights_fragment_begin,\n\tlights_fragment_maps: lights_fragment_maps,\n\tlights_fragment_end: lights_fragment_end,\n\tlogdepthbuf_fragment: logdepthbuf_fragment,\n\tlogdepthbuf_pars_fragment: logdepthbuf_pars_fragment,\n\tlogdepthbuf_pars_vertex: logdepthbuf_pars_vertex,\n\tlogdepthbuf_vertex: logdepthbuf_vertex,\n\tmap_fragment: map_fragment,\n\tmap_pars_fragment: map_pars_fragment,\n\tmap_particle_fragment: map_particle_fragment,\n\tmap_particle_pars_fragment: map_particle_pars_fragment,\n\tmetalnessmap_fragment: metalnessmap_fragment,\n\tmetalnessmap_pars_fragment: metalnessmap_pars_fragment,\n\tmorphnormal_vertex: morphnormal_vertex,\n\tmorphtarget_pars_vertex: morphtarget_pars_vertex,\n\tmorphtarget_vertex: morphtarget_vertex,\n\tnormal_fragment_begin: normal_fragment_begin,\n\tnormal_fragment_maps: normal_fragment_maps,\n\tnormal_pars_fragment: normal_pars_fragment,\n\tnormal_pars_vertex: normal_pars_vertex,\n\tnormal_vertex: normal_vertex,\n\tnormalmap_pars_fragment: normalmap_pars_fragment,\n\tclearcoat_normal_fragment_begin: clearcoat_normal_fragment_begin,\n\tclearcoat_normal_fragment_maps: clearcoat_normal_fragment_maps,\n\tclearcoat_pars_fragment: clearcoat_pars_fragment,\n\toutput_fragment: output_fragment,\n\tpacking: packing,\n\tpremultiplied_alpha_fragment: premultiplied_alpha_fragment,\n\tproject_vertex: project_vertex,\n\tdithering_fragment: dithering_fragment,\n\tdithering_pars_fragment: dithering_pars_fragment,\n\troughnessmap_fragment: roughnessmap_fragment,\n\troughnessmap_pars_fragment: roughnessmap_pars_fragment,\n\tshadowmap_pars_fragment: shadowmap_pars_fragment,\n\tshadowmap_pars_vertex: shadowmap_pars_vertex,\n\tshadowmap_vertex: shadowmap_vertex,\n\tshadowmask_pars_fragment: shadowmask_pars_fragment,\n\tskinbase_vertex: skinbase_vertex,\n\tskinning_pars_vertex: skinning_pars_vertex,\n\tskinning_vertex: skinning_vertex,\n\tskinnormal_vertex: skinnormal_vertex,\n\tspecularmap_fragment: specularmap_fragment,\n\tspecularmap_pars_fragment: specularmap_pars_fragment,\n\ttonemapping_fragment: tonemapping_fragment,\n\ttonemapping_pars_fragment: tonemapping_pars_fragment,\n\ttransmission_fragment: transmission_fragment,\n\ttransmission_pars_fragment: transmission_pars_fragment,\n\tuv_pars_fragment: uv_pars_fragment,\n\tuv_pars_vertex: uv_pars_vertex,\n\tuv_vertex: uv_vertex,\n\tuv2_pars_fragment: uv2_pars_fragment,\n\tuv2_pars_vertex: uv2_pars_vertex,\n\tuv2_vertex: uv2_vertex,\n\tworldpos_vertex: worldpos_vertex,\n\n\tbackground_vert: background.vertex,\n\tbackground_frag: background.fragment,\n\tcube_vert: cube.vertex,\n\tcube_frag: cube.fragment,\n\tdepth_vert: depth.vertex,\n\tdepth_frag: depth.fragment,\n\tdistanceRGBA_vert: distanceRGBA.vertex,\n\tdistanceRGBA_frag: distanceRGBA.fragment,\n\tequirect_vert: equirect.vertex,\n\tequirect_frag: equirect.fragment,\n\tlinedashed_vert: linedashed.vertex,\n\tlinedashed_frag: linedashed.fragment,\n\tmeshbasic_vert: meshbasic.vertex,\n\tmeshbasic_frag: meshbasic.fragment,\n\tmeshlambert_vert: meshlambert.vertex,\n\tmeshlambert_frag: meshlambert.fragment,\n\tmeshmatcap_vert: meshmatcap.vertex,\n\tmeshmatcap_frag: meshmatcap.fragment,\n\tmeshnormal_vert: meshnormal.vertex,\n\tmeshnormal_frag: meshnormal.fragment,\n\tmeshphong_vert: meshphong.vertex,\n\tmeshphong_frag: meshphong.fragment,\n\tmeshphysical_vert: meshphysical.vertex,\n\tmeshphysical_frag: meshphysical.fragment,\n\tmeshtoon_vert: meshtoon.vertex,\n\tmeshtoon_frag: meshtoon.fragment,\n\tpoints_vert: points.vertex,\n\tpoints_frag: points.fragment,\n\tshadow_vert: shadow.vertex,\n\tshadow_frag: shadow.fragment,\n\tsprite_vert: sprite.vertex,\n\tsprite_frag: sprite.fragment\n};\n","import { Color } from '../../math/Color.js';\nimport { Vector2 } from '../../math/Vector2.js';\nimport { Matrix3 } from '../../math/Matrix3.js';\n\n/**\n * Uniforms library for shared webgl shaders\n */\n\nconst UniformsLib = {\n\n\tcommon: {\n\n\t\tdiffuse: { value: new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\n\t\tmap: { value: null },\n\t\tuvTransform: { value: new Matrix3() },\n\t\tuv2Transform: { value: new Matrix3() },\n\n\t\talphaMap: { value: null },\n\t\talphaTest: { value: 0 }\n\n\t},\n\n\tspecularmap: {\n\n\t\tspecularMap: { value: null },\n\n\t},\n\n\tenvmap: {\n\n\t\tenvMap: { value: null },\n\t\tflipEnvMap: { value: - 1 },\n\t\treflectivity: { value: 1.0 }, // basic, lambert, phong\n\t\tior: { value: 1.5 }, // standard, physical\n\t\trefractionRatio: { value: 0.98 }\n\n\t},\n\n\taomap: {\n\n\t\taoMap: { value: null },\n\t\taoMapIntensity: { value: 1 }\n\n\t},\n\n\tlightmap: {\n\n\t\tlightMap: { value: null },\n\t\tlightMapIntensity: { value: 1 }\n\n\t},\n\n\temissivemap: {\n\n\t\temissiveMap: { value: null }\n\n\t},\n\n\tbumpmap: {\n\n\t\tbumpMap: { value: null },\n\t\tbumpScale: { value: 1 }\n\n\t},\n\n\tnormalmap: {\n\n\t\tnormalMap: { value: null },\n\t\tnormalScale: { value: new Vector2( 1, 1 ) }\n\n\t},\n\n\tdisplacementmap: {\n\n\t\tdisplacementMap: { value: null },\n\t\tdisplacementScale: { value: 1 },\n\t\tdisplacementBias: { value: 0 }\n\n\t},\n\n\troughnessmap: {\n\n\t\troughnessMap: { value: null }\n\n\t},\n\n\tmetalnessmap: {\n\n\t\tmetalnessMap: { value: null }\n\n\t},\n\n\tgradientmap: {\n\n\t\tgradientMap: { value: null }\n\n\t},\n\n\tfog: {\n\n\t\tfogDensity: { value: 0.00025 },\n\t\tfogNear: { value: 1 },\n\t\tfogFar: { value: 2000 },\n\t\tfogColor: { value: new Color( 0xffffff ) }\n\n\t},\n\n\tlights: {\n\n\t\tambientLightColor: { value: [] },\n\n\t\tlightProbe: { value: [] },\n\n\t\tdirectionalLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tcolor: {}\n\t\t} },\n\n\t\tdirectionalLightShadows: { value: [], properties: {\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tdirectionalShadowMap: { value: [] },\n\t\tdirectionalShadowMatrix: { value: [] },\n\n\t\tspotLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdirection: {},\n\t\t\tdistance: {},\n\t\t\tconeCos: {},\n\t\t\tpenumbraCos: {},\n\t\t\tdecay: {}\n\t\t} },\n\n\t\tspotLightShadows: { value: [], properties: {\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tspotShadowMap: { value: [] },\n\t\tspotShadowMatrix: { value: [] },\n\n\t\tpointLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdecay: {},\n\t\t\tdistance: {}\n\t\t} },\n\n\t\tpointLightShadows: { value: [], properties: {\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {},\n\t\t\tshadowCameraNear: {},\n\t\t\tshadowCameraFar: {}\n\t\t} },\n\n\t\tpointShadowMap: { value: [] },\n\t\tpointShadowMatrix: { value: [] },\n\n\t\themisphereLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tskyColor: {},\n\t\t\tgroundColor: {}\n\t\t} },\n\n\t\t// TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src\n\t\trectAreaLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\twidth: {},\n\t\t\theight: {}\n\t\t} },\n\n\t\tltc_1: { value: null },\n\t\tltc_2: { value: null }\n\n\t},\n\n\tpoints: {\n\n\t\tdiffuse: { value: new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\t\tsize: { value: 1.0 },\n\t\tscale: { value: 1.0 },\n\t\tmap: { value: null },\n\t\talphaMap: { value: null },\n\t\talphaTest: { value: 0 },\n\t\tuvTransform: { value: new Matrix3() }\n\n\t},\n\n\tsprite: {\n\n\t\tdiffuse: { value: new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\t\tcenter: { value: new Vector2( 0.5, 0.5 ) },\n\t\trotation: { value: 0.0 },\n\t\tmap: { value: null },\n\t\talphaMap: { value: null },\n\t\talphaTest: { value: 0 },\n\t\tuvTransform: { value: new Matrix3() }\n\n\t}\n\n};\n\nexport { UniformsLib };\n","import { ShaderChunk } from './ShaderChunk.js';\nimport { mergeUniforms } from './UniformsUtils.js';\nimport { Vector2 } from '../../math/Vector2.js';\nimport { Vector3 } from '../../math/Vector3.js';\nimport { UniformsLib } from './UniformsLib.js';\nimport { Color } from '../../math/Color.js';\nimport { Matrix3 } from '../../math/Matrix3.js';\n\nconst ShaderLib = {\n\n\tbasic: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshbasic_vert,\n\t\tfragmentShader: ShaderChunk.meshbasic_frag\n\n\t},\n\n\tlambert: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: new Color( 0x000000 ) }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshlambert_vert,\n\t\tfragmentShader: ShaderChunk.meshlambert_frag\n\n\t},\n\n\tphong: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: new Color( 0x000000 ) },\n\t\t\t\tspecular: { value: new Color( 0x111111 ) },\n\t\t\t\tshininess: { value: 30 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphong_vert,\n\t\tfragmentShader: ShaderChunk.meshphong_frag\n\n\t},\n\n\tstandard: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.roughnessmap,\n\t\t\tUniformsLib.metalnessmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: new Color( 0x000000 ) },\n\t\t\t\troughness: { value: 1.0 },\n\t\t\t\tmetalness: { value: 0.0 },\n\t\t\t\tenvMapIntensity: { value: 1 } // temporary\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t},\n\n\ttoon: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.gradientmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: new Color( 0x000000 ) }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshtoon_vert,\n\t\tfragmentShader: ShaderChunk.meshtoon_frag\n\n\t},\n\n\tmatcap: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tmatcap: { value: null }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshmatcap_vert,\n\t\tfragmentShader: ShaderChunk.meshmatcap_frag\n\n\t},\n\n\tpoints: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.points,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.points_vert,\n\t\tfragmentShader: ShaderChunk.points_frag\n\n\t},\n\n\tdashed: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tscale: { value: 1 },\n\t\t\t\tdashSize: { value: 1 },\n\t\t\t\ttotalSize: { value: 2 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.linedashed_vert,\n\t\tfragmentShader: ShaderChunk.linedashed_frag\n\n\t},\n\n\tdepth: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.depth_vert,\n\t\tfragmentShader: ShaderChunk.depth_frag\n\n\t},\n\n\tnormal: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshnormal_vert,\n\t\tfragmentShader: ShaderChunk.meshnormal_frag\n\n\t},\n\n\tsprite: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.sprite,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.sprite_vert,\n\t\tfragmentShader: ShaderChunk.sprite_frag\n\n\t},\n\n\tbackground: {\n\n\t\tuniforms: {\n\t\t\tuvTransform: { value: new Matrix3() },\n\t\t\tt2D: { value: null },\n\t\t},\n\n\t\tvertexShader: ShaderChunk.background_vert,\n\t\tfragmentShader: ShaderChunk.background_frag\n\n\t},\n\t/* -------------------------------------------------------------------------\n\t//\tCube map shader\n\t ------------------------------------------------------------------------- */\n\n\tcube: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.envmap,\n\t\t\t{\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.cube_vert,\n\t\tfragmentShader: ShaderChunk.cube_frag\n\n\t},\n\n\tequirect: {\n\n\t\tuniforms: {\n\t\t\ttEquirect: { value: null },\n\t\t},\n\n\t\tvertexShader: ShaderChunk.equirect_vert,\n\t\tfragmentShader: ShaderChunk.equirect_frag\n\n\t},\n\n\tdistanceRGBA: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\treferencePosition: { value: new Vector3() },\n\t\t\t\tnearDistance: { value: 1 },\n\t\t\t\tfarDistance: { value: 1000 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.distanceRGBA_vert,\n\t\tfragmentShader: ShaderChunk.distanceRGBA_frag\n\n\t},\n\n\tshadow: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.lights,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tcolor: { value: new Color( 0x00000 ) },\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t},\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.shadow_vert,\n\t\tfragmentShader: ShaderChunk.shadow_frag\n\n\t}\n\n};\n\nShaderLib.physical = {\n\n\tuniforms: mergeUniforms( [\n\t\tShaderLib.standard.uniforms,\n\t\t{\n\t\t\tclearcoat: { value: 0 },\n\t\t\tclearcoatMap: { value: null },\n\t\t\tclearcoatRoughness: { value: 0 },\n\t\t\tclearcoatRoughnessMap: { value: null },\n\t\t\tclearcoatNormalScale: { value: new Vector2( 1, 1 ) },\n\t\t\tclearcoatNormalMap: { value: null },\n\t\t\tsheen: { value: 0 },\n\t\t\tsheenColor: { value: new Color( 0x000000 ) },\n\t\t\tsheenColorMap: { value: null },\n\t\t\tsheenRoughness: { value: 1 },\n\t\t\tsheenRoughnessMap: { value: null },\n\t\t\ttransmission: { value: 0 },\n\t\t\ttransmissionMap: { value: null },\n\t\t\ttransmissionSamplerSize: { value: new Vector2() },\n\t\t\ttransmissionSamplerMap: { value: null },\n\t\t\tthickness: { value: 0 },\n\t\t\tthicknessMap: { value: null },\n\t\t\tattenuationDistance: { value: 0 },\n\t\t\tattenuationColor: { value: new Color( 0x000000 ) },\n\t\t\tspecularIntensity: { value: 1 },\n\t\t\tspecularIntensityMap: { value: null },\n\t\t\tspecularColor: { value: new Color( 1, 1, 1 ) },\n\t\t\tspecularColorMap: { value: null },\n\t\t}\n\t] ),\n\n\tvertexShader: ShaderChunk.meshphysical_vert,\n\tfragmentShader: ShaderChunk.meshphysical_frag\n\n};\n\n\nexport { ShaderLib };\n","import { BackSide, FrontSide, CubeUVReflectionMapping } from '../../constants.js';\nimport { BoxGeometry } from '../../geometries/BoxGeometry.js';\nimport { PlaneGeometry } from '../../geometries/PlaneGeometry.js';\nimport { ShaderMaterial } from '../../materials/ShaderMaterial.js';\nimport { Color } from '../../math/Color.js';\nimport { Mesh } from '../../objects/Mesh.js';\nimport { ShaderLib } from '../shaders/ShaderLib.js';\nimport { cloneUniforms } from '../shaders/UniformsUtils.js';\n\nfunction WebGLBackground( renderer, cubemaps, state, objects, alpha, premultipliedAlpha ) {\n\n\tconst clearColor = new Color( 0x000000 );\n\tlet clearAlpha = alpha === true ? 0 : 1;\n\n\tlet planeMesh;\n\tlet boxMesh;\n\n\tlet currentBackground = null;\n\tlet currentBackgroundVersion = 0;\n\tlet currentTonemapping = null;\n\n\tfunction render( renderList, scene ) {\n\n\t\tlet forceClear = false;\n\t\tlet background = scene.isScene === true ? scene.background : null;\n\n\t\tif ( background && background.isTexture ) {\n\n\t\t\tbackground = cubemaps.get( background );\n\n\t\t}\n\n\t\t// Ignore background in AR\n\t\t// TODO: Reconsider this.\n\n\t\tconst xr = renderer.xr;\n\t\tconst session = xr.getSession && xr.getSession();\n\n\t\tif ( session && session.environmentBlendMode === 'additive' ) {\n\n\t\t\tbackground = null;\n\n\t\t}\n\n\t\tif ( background === null ) {\n\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t} else if ( background && background.isColor ) {\n\n\t\t\tsetClear( background, 1 );\n\t\t\tforceClear = true;\n\n\t\t}\n\n\t\tif ( renderer.autoClear || forceClear ) {\n\n\t\t\trenderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );\n\n\t\t}\n\n\t\tif ( background && ( background.isCubeTexture || background.mapping === CubeUVReflectionMapping ) ) {\n\n\t\t\tif ( boxMesh === undefined ) {\n\n\t\t\t\tboxMesh = new Mesh(\n\t\t\t\t\tnew BoxGeometry( 1, 1, 1 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\tname: 'BackgroundCubeMaterial',\n\t\t\t\t\t\tuniforms: cloneUniforms( ShaderLib.cube.uniforms ),\n\t\t\t\t\t\tvertexShader: ShaderLib.cube.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.cube.fragmentShader,\n\t\t\t\t\t\tside: BackSide,\n\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\tfog: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\n\t\t\t\tboxMesh.geometry.deleteAttribute( 'normal' );\n\t\t\t\tboxMesh.geometry.deleteAttribute( 'uv' );\n\n\t\t\t\tboxMesh.onBeforeRender = function ( renderer, scene, camera ) {\n\n\t\t\t\t\tthis.matrixWorld.copyPosition( camera.matrixWorld );\n\n\t\t\t\t};\n\n\t\t\t\t// enable code injection for non-built-in material\n\t\t\t\tObject.defineProperty( boxMesh.material, 'envMap', {\n\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn this.uniforms.envMap.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tobjects.update( boxMesh );\n\n\t\t\t}\n\n\t\t\tboxMesh.material.uniforms.envMap.value = background;\n\t\t\tboxMesh.material.uniforms.flipEnvMap.value = ( background.isCubeTexture && background.isRenderTargetTexture === false ) ? - 1 : 1;\n\n\t\t\tif ( currentBackground !== background ||\n\t\t\t\tcurrentBackgroundVersion !== background.version ||\n\t\t\t\tcurrentTonemapping !== renderer.toneMapping ) {\n\n\t\t\t\tboxMesh.material.needsUpdate = true;\n\n\t\t\t\tcurrentBackground = background;\n\t\t\t\tcurrentBackgroundVersion = background.version;\n\t\t\t\tcurrentTonemapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t\t// push to the pre-sorted opaque render list\n\t\t\trenderList.unshift( boxMesh, boxMesh.geometry, boxMesh.material, 0, 0, null );\n\n\t\t} else if ( background && background.isTexture ) {\n\n\t\t\tif ( planeMesh === undefined ) {\n\n\t\t\t\tplaneMesh = new Mesh(\n\t\t\t\t\tnew PlaneGeometry( 2, 2 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\tname: 'BackgroundMaterial',\n\t\t\t\t\t\tuniforms: cloneUniforms( ShaderLib.background.uniforms ),\n\t\t\t\t\t\tvertexShader: ShaderLib.background.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.background.fragmentShader,\n\t\t\t\t\t\tside: FrontSide,\n\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\tfog: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\n\t\t\t\tplaneMesh.geometry.deleteAttribute( 'normal' );\n\n\t\t\t\t// enable code injection for non-built-in material\n\t\t\t\tObject.defineProperty( planeMesh.material, 'map', {\n\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn this.uniforms.t2D.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tobjects.update( planeMesh );\n\n\t\t\t}\n\n\t\t\tplaneMesh.material.uniforms.t2D.value = background;\n\n\t\t\tif ( background.matrixAutoUpdate === true ) {\n\n\t\t\t\tbackground.updateMatrix();\n\n\t\t\t}\n\n\t\t\tplaneMesh.material.uniforms.uvTransform.value.copy( background.matrix );\n\n\t\t\tif ( currentBackground !== background ||\n\t\t\t\tcurrentBackgroundVersion !== background.version ||\n\t\t\t\tcurrentTonemapping !== renderer.toneMapping ) {\n\n\t\t\t\tplaneMesh.material.needsUpdate = true;\n\n\t\t\t\tcurrentBackground = background;\n\t\t\t\tcurrentBackgroundVersion = background.version;\n\t\t\t\tcurrentTonemapping = renderer.toneMapping;\n\n\t\t\t}\n\n\n\t\t\t// push to the pre-sorted opaque render list\n\t\t\trenderList.unshift( planeMesh, planeMesh.geometry, planeMesh.material, 0, 0, null );\n\n\t\t}\n\n\t}\n\n\tfunction setClear( color, alpha ) {\n\n\t\tstate.buffers.color.setClear( color.r, color.g, color.b, alpha, premultipliedAlpha );\n\n\t}\n\n\treturn {\n\n\t\tgetClearColor: function () {\n\n\t\t\treturn clearColor;\n\n\t\t},\n\t\tsetClearColor: function ( color, alpha = 1 ) {\n\n\t\t\tclearColor.set( color );\n\t\t\tclearAlpha = alpha;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\tgetClearAlpha: function () {\n\n\t\t\treturn clearAlpha;\n\n\t\t},\n\t\tsetClearAlpha: function ( alpha ) {\n\n\t\t\tclearAlpha = alpha;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\trender: render\n\n\t};\n\n}\n\n\nexport { WebGLBackground };\n","function WebGLBindingStates( gl, extensions, attributes, capabilities ) {\n\n\tconst maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\n\tconst extension = capabilities.isWebGL2 ? null : extensions.get( 'OES_vertex_array_object' );\n\tconst vaoAvailable = capabilities.isWebGL2 || extension !== null;\n\n\tconst bindingStates = {};\n\n\tconst defaultState = createBindingState( null );\n\tlet currentState = defaultState;\n\n\tfunction setup( object, material, program, geometry, index ) {\n\n\t\tlet updateBuffers = false;\n\n\t\tif ( vaoAvailable ) {\n\n\t\t\tconst state = getBindingState( geometry, program, material );\n\n\t\t\tif ( currentState !== state ) {\n\n\t\t\t\tcurrentState = state;\n\t\t\t\tbindVertexArrayObject( currentState.object );\n\n\t\t\t}\n\n\t\t\tupdateBuffers = needsUpdate( geometry, index );\n\n\t\t\tif ( updateBuffers ) saveCache( geometry, index );\n\n\t\t} else {\n\n\t\t\tconst wireframe = ( material.wireframe === true );\n\n\t\t\tif ( currentState.geometry !== geometry.id ||\n\t\t\t\tcurrentState.program !== program.id ||\n\t\t\t\tcurrentState.wireframe !== wireframe ) {\n\n\t\t\t\tcurrentState.geometry = geometry.id;\n\t\t\t\tcurrentState.program = program.id;\n\t\t\t\tcurrentState.wireframe = wireframe;\n\n\t\t\t\tupdateBuffers = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( object.isInstancedMesh === true ) {\n\n\t\t\tupdateBuffers = true;\n\n\t\t}\n\n\t\tif ( index !== null ) {\n\n\t\t\tattributes.update( index, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\t}\n\n\t\tif ( updateBuffers ) {\n\n\t\t\tsetupVertexAttributes( object, material, program, geometry );\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, attributes.get( index ).buffer );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction createVertexArrayObject() {\n\n\t\tif ( capabilities.isWebGL2 ) return gl.createVertexArray();\n\n\t\treturn extension.createVertexArrayOES();\n\n\t}\n\n\tfunction bindVertexArrayObject( vao ) {\n\n\t\tif ( capabilities.isWebGL2 ) return gl.bindVertexArray( vao );\n\n\t\treturn extension.bindVertexArrayOES( vao );\n\n\t}\n\n\tfunction deleteVertexArrayObject( vao ) {\n\n\t\tif ( capabilities.isWebGL2 ) return gl.deleteVertexArray( vao );\n\n\t\treturn extension.deleteVertexArrayOES( vao );\n\n\t}\n\n\tfunction getBindingState( geometry, program, material ) {\n\n\t\tconst wireframe = ( material.wireframe === true );\n\n\t\tlet programMap = bindingStates[ geometry.id ];\n\n\t\tif ( programMap === undefined ) {\n\n\t\t\tprogramMap = {};\n\t\t\tbindingStates[ geometry.id ] = programMap;\n\n\t\t}\n\n\t\tlet stateMap = programMap[ program.id ];\n\n\t\tif ( stateMap === undefined ) {\n\n\t\t\tstateMap = {};\n\t\t\tprogramMap[ program.id ] = stateMap;\n\n\t\t}\n\n\t\tlet state = stateMap[ wireframe ];\n\n\t\tif ( state === undefined ) {\n\n\t\t\tstate = createBindingState( createVertexArrayObject() );\n\t\t\tstateMap[ wireframe ] = state;\n\n\t\t}\n\n\t\treturn state;\n\n\t}\n\n\tfunction createBindingState( vao ) {\n\n\t\tconst newAttributes = [];\n\t\tconst enabledAttributes = [];\n\t\tconst attributeDivisors = [];\n\n\t\tfor ( let i = 0; i < maxVertexAttributes; i ++ ) {\n\n\t\t\tnewAttributes[ i ] = 0;\n\t\t\tenabledAttributes[ i ] = 0;\n\t\t\tattributeDivisors[ i ] = 0;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\t// for backward compatibility on non-VAO support browser\n\t\t\tgeometry: null,\n\t\t\tprogram: null,\n\t\t\twireframe: false,\n\n\t\t\tnewAttributes: newAttributes,\n\t\t\tenabledAttributes: enabledAttributes,\n\t\t\tattributeDivisors: attributeDivisors,\n\t\t\tobject: vao,\n\t\t\tattributes: {},\n\t\t\tindex: null\n\n\t\t};\n\n\t}\n\n\tfunction needsUpdate( geometry, index ) {\n\n\t\tconst cachedAttributes = currentState.attributes;\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\tlet attributesNum = 0;\n\n\t\tfor ( const key in geometryAttributes ) {\n\n\t\t\tconst cachedAttribute = cachedAttributes[ key ];\n\t\t\tconst geometryAttribute = geometryAttributes[ key ];\n\n\t\t\tif ( cachedAttribute === undefined ) return true;\n\n\t\t\tif ( cachedAttribute.attribute !== geometryAttribute ) return true;\n\n\t\t\tif ( cachedAttribute.data !== geometryAttribute.data ) return true;\n\n\t\t\tattributesNum ++;\n\n\t\t}\n\n\t\tif ( currentState.attributesNum !== attributesNum ) return true;\n\n\t\tif ( currentState.index !== index ) return true;\n\n\t\treturn false;\n\n\t}\n\n\tfunction saveCache( geometry, index ) {\n\n\t\tconst cache = {};\n\t\tconst attributes = geometry.attributes;\n\t\tlet attributesNum = 0;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attribute = attributes[ key ];\n\n\t\t\tconst data = {};\n\t\t\tdata.attribute = attribute;\n\n\t\t\tif ( attribute.data ) {\n\n\t\t\t\tdata.data = attribute.data;\n\n\t\t\t}\n\n\t\t\tcache[ key ] = data;\n\n\t\t\tattributesNum ++;\n\n\t\t}\n\n\t\tcurrentState.attributes = cache;\n\t\tcurrentState.attributesNum = attributesNum;\n\n\t\tcurrentState.index = index;\n\n\t}\n\n\tfunction initAttributes() {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\n\t\tfor ( let i = 0, il = newAttributes.length; i < il; i ++ ) {\n\n\t\t\tnewAttributes[ i ] = 0;\n\n\t\t}\n\n\t}\n\n\tfunction enableAttribute( attribute ) {\n\n\t\tenableAttributeAndDivisor( attribute, 0 );\n\n\t}\n\n\tfunction enableAttributeAndDivisor( attribute, meshPerAttribute ) {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\t\tconst enabledAttributes = currentState.enabledAttributes;\n\t\tconst attributeDivisors = currentState.attributeDivisors;\n\n\t\tnewAttributes[ attribute ] = 1;\n\n\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t}\n\n\t\tif ( attributeDivisors[ attribute ] !== meshPerAttribute ) {\n\n\t\t\tconst extension = capabilities.isWebGL2 ? gl : extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\textension[ capabilities.isWebGL2 ? 'vertexAttribDivisor' : 'vertexAttribDivisorANGLE' ]( attribute, meshPerAttribute );\n\t\t\tattributeDivisors[ attribute ] = meshPerAttribute;\n\n\t\t}\n\n\t}\n\n\tfunction disableUnusedAttributes() {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\t\tconst enabledAttributes = currentState.enabledAttributes;\n\n\t\tfor ( let i = 0, il = enabledAttributes.length; i < il; i ++ ) {\n\n\t\t\tif ( enabledAttributes[ i ] !== newAttributes[ i ] ) {\n\n\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction vertexAttribPointer( index, size, type, normalized, stride, offset ) {\n\n\t\tif ( capabilities.isWebGL2 === true && ( type === gl.INT || type === gl.UNSIGNED_INT ) ) {\n\n\t\t\tgl.vertexAttribIPointer( index, size, type, stride, offset );\n\n\t\t} else {\n\n\t\t\tgl.vertexAttribPointer( index, size, type, normalized, stride, offset );\n\n\t\t}\n\n\t}\n\n\tfunction setupVertexAttributes( object, material, program, geometry ) {\n\n\t\tif ( capabilities.isWebGL2 === false && ( object.isInstancedMesh || geometry.isInstancedBufferGeometry ) ) {\n\n\t\t\tif ( extensions.get( 'ANGLE_instanced_arrays' ) === null ) return;\n\n\t\t}\n\n\t\tinitAttributes();\n\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tconst materialDefaultAttributeValues = material.defaultAttributeValues;\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tlet geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\tif ( geometryAttribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) geometryAttribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) geometryAttribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometryAttribute !== undefined ) {\n\n\t\t\t\t\tconst normalized = geometryAttribute.normalized;\n\t\t\t\t\tconst size = geometryAttribute.itemSize;\n\n\t\t\t\t\tconst attribute = attributes.get( geometryAttribute );\n\n\t\t\t\t\t// TODO Attribute may not be available on context restore\n\n\t\t\t\t\tif ( attribute === undefined ) continue;\n\n\t\t\t\t\tconst buffer = attribute.buffer;\n\t\t\t\t\tconst type = attribute.type;\n\t\t\t\t\tconst bytesPerElement = attribute.bytesPerElement;\n\n\t\t\t\t\tif ( geometryAttribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\tconst data = geometryAttribute.data;\n\t\t\t\t\t\tconst stride = data.stride;\n\t\t\t\t\t\tconst offset = geometryAttribute.offset;\n\n\t\t\t\t\t\tif ( data && data.isInstancedInterleavedBuffer ) {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttributeAndDivisor( programAttribute.location + i, data.meshPerAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry._maxInstanceCount = data.meshPerAttribute * data.count;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttribute( programAttribute.location + i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, buffer );\n\n\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\tvertexAttribPointer(\n\t\t\t\t\t\t\t\tprogramAttribute.location + i,\n\t\t\t\t\t\t\t\tsize / programAttribute.locationSize,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\tnormalized,\n\t\t\t\t\t\t\t\tstride * bytesPerElement,\n\t\t\t\t\t\t\t\t( offset + ( size / programAttribute.locationSize ) * i ) * bytesPerElement\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( geometryAttribute.isInstancedBufferAttribute ) {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttributeAndDivisor( programAttribute.location + i, geometryAttribute.meshPerAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry._maxInstanceCount = geometryAttribute.meshPerAttribute * geometryAttribute.count;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttribute( programAttribute.location + i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, buffer );\n\n\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\tvertexAttribPointer(\n\t\t\t\t\t\t\t\tprogramAttribute.location + i,\n\t\t\t\t\t\t\t\tsize / programAttribute.locationSize,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\tnormalized,\n\t\t\t\t\t\t\t\tsize * bytesPerElement,\n\t\t\t\t\t\t\t\t( size / programAttribute.locationSize ) * i * bytesPerElement\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( materialDefaultAttributeValues !== undefined ) {\n\n\t\t\t\t\tconst value = materialDefaultAttributeValues[ name ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\tswitch ( value.length ) {\n\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\tgl.vertexAttrib2fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\tgl.vertexAttrib3fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\tgl.vertexAttrib4fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tgl.vertexAttrib1fv( programAttribute.location, value );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tdisableUnusedAttributes();\n\n\t}\n\n\tfunction dispose() {\n\n\t\treset();\n\n\t\tfor ( const geometryId in bindingStates ) {\n\n\t\t\tconst programMap = bindingStates[ geometryId ];\n\n\t\t\tfor ( const programId in programMap ) {\n\n\t\t\t\tconst stateMap = programMap[ programId ];\n\n\t\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t\t}\n\n\t\t\t\tdelete programMap[ programId ];\n\n\t\t\t}\n\n\t\t\tdelete bindingStates[ geometryId ];\n\n\t\t}\n\n\t}\n\n\tfunction releaseStatesOfGeometry( geometry ) {\n\n\t\tif ( bindingStates[ geometry.id ] === undefined ) return;\n\n\t\tconst programMap = bindingStates[ geometry.id ];\n\n\t\tfor ( const programId in programMap ) {\n\n\t\t\tconst stateMap = programMap[ programId ];\n\n\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t}\n\n\t\t\tdelete programMap[ programId ];\n\n\t\t}\n\n\t\tdelete bindingStates[ geometry.id ];\n\n\t}\n\n\tfunction releaseStatesOfProgram( program ) {\n\n\t\tfor ( const geometryId in bindingStates ) {\n\n\t\t\tconst programMap = bindingStates[ geometryId ];\n\n\t\t\tif ( programMap[ program.id ] === undefined ) continue;\n\n\t\t\tconst stateMap = programMap[ program.id ];\n\n\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t}\n\n\t\t\tdelete programMap[ program.id ];\n\n\t\t}\n\n\t}\n\n\tfunction reset() {\n\n\t\tresetDefaultState();\n\n\t\tif ( currentState === defaultState ) return;\n\n\t\tcurrentState = defaultState;\n\t\tbindVertexArrayObject( currentState.object );\n\n\t}\n\n\t// for backward-compatilibity\n\n\tfunction resetDefaultState() {\n\n\t\tdefaultState.geometry = null;\n\t\tdefaultState.program = null;\n\t\tdefaultState.wireframe = false;\n\n\t}\n\n\treturn {\n\n\t\tsetup: setup,\n\t\treset: reset,\n\t\tresetDefaultState: resetDefaultState,\n\t\tdispose: dispose,\n\t\treleaseStatesOfGeometry: releaseStatesOfGeometry,\n\t\treleaseStatesOfProgram: releaseStatesOfProgram,\n\n\t\tinitAttributes: initAttributes,\n\t\tenableAttribute: enableAttribute,\n\t\tdisableUnusedAttributes: disableUnusedAttributes\n\n\t};\n\n}\n\n\nexport { WebGLBindingStates };\n","function WebGLBufferRenderer( gl, extensions, info, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tlet mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawArrays( mode, start, count );\n\n\t\tinfo.update( count, mode, 1 );\n\n\t}\n\n\tfunction renderInstances( start, count, primcount ) {\n\n\t\tif ( primcount === 0 ) return;\n\n\t\tlet extension, methodName;\n\n\t\tif ( isWebGL2 ) {\n\n\t\t\textension = gl;\n\t\t\tmethodName = 'drawArraysInstanced';\n\n\t\t} else {\n\n\t\t\textension = extensions.get( 'ANGLE_instanced_arrays' );\n\t\t\tmethodName = 'drawArraysInstancedANGLE';\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\textension[ methodName ]( mode, start, count, primcount );\n\n\t\tinfo.update( count, mode, primcount );\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\n}\n\n\nexport { WebGLBufferRenderer };\n","function WebGLCapabilities( gl, extensions, parameters ) {\n\n\tlet maxAnisotropy;\n\n\tfunction getMaxAnisotropy() {\n\n\t\tif ( maxAnisotropy !== undefined ) return maxAnisotropy;\n\n\t\tif ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) {\n\n\t\t\tconst extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tmaxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );\n\n\t\t} else {\n\n\t\t\tmaxAnisotropy = 0;\n\n\t\t}\n\n\t\treturn maxAnisotropy;\n\n\t}\n\n\tfunction getMaxPrecision( precision ) {\n\n\t\tif ( precision === 'highp' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 &&\n\t\t\t\tgl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) {\n\n\t\t\t\treturn 'highp';\n\n\t\t\t}\n\n\t\t\tprecision = 'mediump';\n\n\t\t}\n\n\t\tif ( precision === 'mediump' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 &&\n\t\t\t\tgl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) {\n\n\t\t\t\treturn 'mediump';\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn 'lowp';\n\n\t}\n\n\tconst isWebGL2 = ( typeof WebGL2RenderingContext !== 'undefined' && gl instanceof WebGL2RenderingContext ) ||\n\t\t( typeof WebGL2ComputeRenderingContext !== 'undefined' && gl instanceof WebGL2ComputeRenderingContext );\n\n\tlet precision = parameters.precision !== undefined ? parameters.precision : 'highp';\n\tconst maxPrecision = getMaxPrecision( precision );\n\n\tif ( maxPrecision !== precision ) {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );\n\t\tprecision = maxPrecision;\n\n\t}\n\n\tconst drawBuffers = isWebGL2 || extensions.has( 'WEBGL_draw_buffers' );\n\n\tconst logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true;\n\n\tconst maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\n\tconst maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );\n\tconst maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE );\n\tconst maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE );\n\n\tconst maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\tconst maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS );\n\tconst maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS );\n\tconst maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS );\n\n\tconst vertexTextures = maxVertexTextures > 0;\n\tconst floatFragmentTextures = isWebGL2 || extensions.has( 'OES_texture_float' );\n\tconst floatVertexTextures = vertexTextures && floatFragmentTextures;\n\n\tconst maxSamples = isWebGL2 ? gl.getParameter( gl.MAX_SAMPLES ) : 0;\n\n\treturn {\n\n\t\tisWebGL2: isWebGL2,\n\n\t\tdrawBuffers: drawBuffers,\n\n\t\tgetMaxAnisotropy: getMaxAnisotropy,\n\t\tgetMaxPrecision: getMaxPrecision,\n\n\t\tprecision: precision,\n\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\n\t\tmaxTextures: maxTextures,\n\t\tmaxVertexTextures: maxVertexTextures,\n\t\tmaxTextureSize: maxTextureSize,\n\t\tmaxCubemapSize: maxCubemapSize,\n\n\t\tmaxAttributes: maxAttributes,\n\t\tmaxVertexUniforms: maxVertexUniforms,\n\t\tmaxVaryings: maxVaryings,\n\t\tmaxFragmentUniforms: maxFragmentUniforms,\n\n\t\tvertexTextures: vertexTextures,\n\t\tfloatFragmentTextures: floatFragmentTextures,\n\t\tfloatVertexTextures: floatVertexTextures,\n\n\t\tmaxSamples: maxSamples\n\n\t};\n\n}\n\n\nexport { WebGLCapabilities };\n","import { Matrix3 } from '../../math/Matrix3.js';\nimport { Plane } from '../../math/Plane.js';\n\nfunction WebGLClipping( properties ) {\n\n\tconst scope = this;\n\n\tlet globalState = null,\n\t\tnumGlobalPlanes = 0,\n\t\tlocalClippingEnabled = false,\n\t\trenderingShadows = false;\n\n\tconst plane = new Plane(),\n\t\tviewNormalMatrix = new Matrix3(),\n\n\t\tuniform = { value: null, needsUpdate: false };\n\n\tthis.uniform = uniform;\n\tthis.numPlanes = 0;\n\tthis.numIntersection = 0;\n\n\tthis.init = function ( planes, enableLocalClipping, camera ) {\n\n\t\tconst enabled =\n\t\t\tplanes.length !== 0 ||\n\t\t\tenableLocalClipping ||\n\t\t\t// enable state of previous frame - the clipping code has to\n\t\t\t// run another frame in order to reset the state:\n\t\t\tnumGlobalPlanes !== 0 ||\n\t\t\tlocalClippingEnabled;\n\n\t\tlocalClippingEnabled = enableLocalClipping;\n\n\t\tglobalState = projectPlanes( planes, camera, 0 );\n\t\tnumGlobalPlanes = planes.length;\n\n\t\treturn enabled;\n\n\t};\n\n\tthis.beginShadows = function () {\n\n\t\trenderingShadows = true;\n\t\tprojectPlanes( null );\n\n\t};\n\n\tthis.endShadows = function () {\n\n\t\trenderingShadows = false;\n\t\tresetGlobalState();\n\n\t};\n\n\tthis.setState = function ( material, camera, useCache ) {\n\n\t\tconst planes = material.clippingPlanes,\n\t\t\tclipIntersection = material.clipIntersection,\n\t\t\tclipShadows = material.clipShadows;\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tif ( ! localClippingEnabled || planes === null || planes.length === 0 || renderingShadows && ! clipShadows ) {\n\n\t\t\t// there's no local clipping\n\n\t\t\tif ( renderingShadows ) {\n\n\t\t\t\t// there's no global clipping\n\n\t\t\t\tprojectPlanes( null );\n\n\t\t\t} else {\n\n\t\t\t\tresetGlobalState();\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst nGlobal = renderingShadows ? 0 : numGlobalPlanes,\n\t\t\t\tlGlobal = nGlobal * 4;\n\n\t\t\tlet dstArray = materialProperties.clippingState || null;\n\n\t\t\tuniform.value = dstArray; // ensure unique state\n\n\t\t\tdstArray = projectPlanes( planes, camera, lGlobal, useCache );\n\n\t\t\tfor ( let i = 0; i !== lGlobal; ++ i ) {\n\n\t\t\t\tdstArray[ i ] = globalState[ i ];\n\n\t\t\t}\n\n\t\t\tmaterialProperties.clippingState = dstArray;\n\t\t\tthis.numIntersection = clipIntersection ? this.numPlanes : 0;\n\t\t\tthis.numPlanes += nGlobal;\n\n\t\t}\n\n\n\t};\n\n\tfunction resetGlobalState() {\n\n\t\tif ( uniform.value !== globalState ) {\n\n\t\t\tuniform.value = globalState;\n\t\t\tuniform.needsUpdate = numGlobalPlanes > 0;\n\n\t\t}\n\n\t\tscope.numPlanes = numGlobalPlanes;\n\t\tscope.numIntersection = 0;\n\n\t}\n\n\tfunction projectPlanes( planes, camera, dstOffset, skipTransform ) {\n\n\t\tconst nPlanes = planes !== null ? planes.length : 0;\n\t\tlet dstArray = null;\n\n\t\tif ( nPlanes !== 0 ) {\n\n\t\t\tdstArray = uniform.value;\n\n\t\t\tif ( skipTransform !== true || dstArray === null ) {\n\n\t\t\t\tconst flatSize = dstOffset + nPlanes * 4,\n\t\t\t\t\tviewMatrix = camera.matrixWorldInverse;\n\n\t\t\t\tviewNormalMatrix.getNormalMatrix( viewMatrix );\n\n\t\t\t\tif ( dstArray === null || dstArray.length < flatSize ) {\n\n\t\t\t\t\tdstArray = new Float32Array( flatSize );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0, i4 = dstOffset; i !== nPlanes; ++ i, i4 += 4 ) {\n\n\t\t\t\t\tplane.copy( planes[ i ] ).applyMatrix4( viewMatrix, viewNormalMatrix );\n\n\t\t\t\t\tplane.normal.toArray( dstArray, i4 );\n\t\t\t\t\tdstArray[ i4 + 3 ] = plane.constant;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tuniform.value = dstArray;\n\t\t\tuniform.needsUpdate = true;\n\n\t\t}\n\n\t\tscope.numPlanes = nPlanes;\n\t\tscope.numIntersection = 0;\n\n\t\treturn dstArray;\n\n\t}\n\n}\n\n\nexport { WebGLClipping };\n","import { createElementNS } from '../utils.js';\nimport { SRGBToLinear } from '../math/Color.js';\n\nlet _canvas;\n\nclass ImageUtils {\n\n\tstatic getDataURL( image ) {\n\n\t\tif ( /^data:/i.test( image.src ) ) {\n\n\t\t\treturn image.src;\n\n\t\t}\n\n\t\tif ( typeof HTMLCanvasElement == 'undefined' ) {\n\n\t\t\treturn image.src;\n\n\t\t}\n\n\t\tlet canvas;\n\n\t\tif ( image instanceof HTMLCanvasElement ) {\n\n\t\t\tcanvas = image;\n\n\t\t} else {\n\n\t\t\tif ( _canvas === undefined ) _canvas = createElementNS( 'canvas' );\n\n\t\t\t_canvas.width = image.width;\n\t\t\t_canvas.height = image.height;\n\n\t\t\tconst context = _canvas.getContext( '2d' );\n\n\t\t\tif ( image instanceof ImageData ) {\n\n\t\t\t\tcontext.putImageData( image, 0, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\t}\n\n\t\t\tcanvas = _canvas;\n\n\t\t}\n\n\t\tif ( canvas.width > 2048 || canvas.height > 2048 ) {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons', image );\n\n\t\t\treturn canvas.toDataURL( 'image/jpeg', 0.6 );\n\n\t\t} else {\n\n\t\t\treturn canvas.toDataURL( 'image/png' );\n\n\t\t}\n\n\t}\n\n\tstatic sRGBToLinear( image ) {\n\n\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t\tconst canvas = createElementNS( 'canvas' );\n\n\t\t\tcanvas.width = image.width;\n\t\t\tcanvas.height = image.height;\n\n\t\t\tconst context = canvas.getContext( '2d' );\n\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\tconst imageData = context.getImageData( 0, 0, image.width, image.height );\n\t\t\tconst data = imageData.data;\n\n\t\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tdata[ i ] = SRGBToLinear( data[ i ] / 255 ) * 255;\n\n\t\t\t}\n\n\t\t\tcontext.putImageData( imageData, 0, 0 );\n\n\t\t\treturn canvas;\n\n\t\t} else if ( image.data ) {\n\n\t\t\tconst data = image.data.slice( 0 );\n\n\t\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tif ( data instanceof Uint8Array || data instanceof Uint8ClampedArray ) {\n\n\t\t\t\t\tdata[ i ] = Math.floor( SRGBToLinear( data[ i ] / 255 ) * 255 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// assuming float\n\n\t\t\t\t\tdata[ i ] = SRGBToLinear( data[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tdata: data,\n\t\t\t\twidth: image.width,\n\t\t\t\theight: image.height\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.sRGBToLinear(): Unsupported image type. No color space conversion applied.' );\n\t\t\treturn image;\n\n\t\t}\n\n\t}\n\n}\n\nexport { ImageUtils };\n","import { EventDispatcher } from '../core/EventDispatcher.js';\nimport {\n\tMirroredRepeatWrapping,\n\tClampToEdgeWrapping,\n\tRepeatWrapping,\n\tLinearEncoding,\n\tUnsignedByteType,\n\tRGBAFormat,\n\tLinearMipmapLinearFilter,\n\tLinearFilter,\n\tUVMapping\n} from '../constants.js';\nimport * as MathUtils from '../math/MathUtils.js';\nimport { Vector2 } from '../math/Vector2.js';\nimport { Matrix3 } from '../math/Matrix3.js';\nimport { ImageUtils } from '../extras/ImageUtils.js';\n\nlet textureId = 0;\n\nclass Texture extends EventDispatcher {\n\n\tconstructor( image = Texture.DEFAULT_IMAGE, mapping = Texture.DEFAULT_MAPPING, wrapS = ClampToEdgeWrapping, wrapT = ClampToEdgeWrapping, magFilter = LinearFilter, minFilter = LinearMipmapLinearFilter, format = RGBAFormat, type = UnsignedByteType, anisotropy = 1, encoding = LinearEncoding ) {\n\n\t\tsuper();\n\n\t\tObject.defineProperty( this, 'id', { value: textureId ++ } );\n\n\t\tthis.uuid = MathUtils.generateUUID();\n\n\t\tthis.name = '';\n\n\t\tthis.image = image;\n\t\tthis.mipmaps = [];\n\n\t\tthis.mapping = mapping;\n\n\t\tthis.wrapS = wrapS;\n\t\tthis.wrapT = wrapT;\n\n\t\tthis.magFilter = magFilter;\n\t\tthis.minFilter = minFilter;\n\n\t\tthis.anisotropy = anisotropy;\n\n\t\tthis.format = format;\n\t\tthis.internalFormat = null;\n\t\tthis.type = type;\n\n\t\tthis.offset = new Vector2( 0, 0 );\n\t\tthis.repeat = new Vector2( 1, 1 );\n\t\tthis.center = new Vector2( 0, 0 );\n\t\tthis.rotation = 0;\n\n\t\tthis.matrixAutoUpdate = true;\n\t\tthis.matrix = new Matrix3();\n\n\t\tthis.generateMipmaps = true;\n\t\tthis.premultiplyAlpha = false;\n\t\tthis.flipY = true;\n\t\tthis.unpackAlignment = 4;\t// valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml)\n\n\t\t// Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap.\n\t\t//\n\t\t// Also changing the encoding after already used by a Material will not automatically make the Material\n\t\t// update. You need to explicitly call Material.needsUpdate to trigger it to recompile.\n\t\tthis.encoding = encoding;\n\n\t\tthis.userData = {};\n\n\t\tthis.version = 0;\n\t\tthis.onUpdate = null;\n\n\t\tthis.isRenderTargetTexture = false; // indicates whether a texture belongs to a render target or not\n\t\tthis.needsPMREMUpdate = false; // indicates whether this texture should be processed by PMREMGenerator or not (only relevant for render target textures)\n\n\t}\n\n\tupdateMatrix() {\n\n\t\tthis.matrix.setUvTransform( this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.image = source.image;\n\t\tthis.mipmaps = source.mipmaps.slice( 0 );\n\n\t\tthis.mapping = source.mapping;\n\n\t\tthis.wrapS = source.wrapS;\n\t\tthis.wrapT = source.wrapT;\n\n\t\tthis.magFilter = source.magFilter;\n\t\tthis.minFilter = source.minFilter;\n\n\t\tthis.anisotropy = source.anisotropy;\n\n\t\tthis.format = source.format;\n\t\tthis.internalFormat = source.internalFormat;\n\t\tthis.type = source.type;\n\n\t\tthis.offset.copy( source.offset );\n\t\tthis.repeat.copy( source.repeat );\n\t\tthis.center.copy( source.center );\n\t\tthis.rotation = source.rotation;\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\tthis.matrix.copy( source.matrix );\n\n\t\tthis.generateMipmaps = source.generateMipmaps;\n\t\tthis.premultiplyAlpha = source.premultiplyAlpha;\n\t\tthis.flipY = source.flipY;\n\t\tthis.unpackAlignment = source.unpackAlignment;\n\t\tthis.encoding = source.encoding;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( ! isRootObject && meta.textures[ this.uuid ] !== undefined ) {\n\n\t\t\treturn meta.textures[ this.uuid ];\n\n\t\t}\n\n\t\tconst output = {\n\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Texture',\n\t\t\t\tgenerator: 'Texture.toJSON'\n\t\t\t},\n\n\t\t\tuuid: this.uuid,\n\t\t\tname: this.name,\n\n\t\t\tmapping: this.mapping,\n\n\t\t\trepeat: [ this.repeat.x, this.repeat.y ],\n\t\t\toffset: [ this.offset.x, this.offset.y ],\n\t\t\tcenter: [ this.center.x, this.center.y ],\n\t\t\trotation: this.rotation,\n\n\t\t\twrap: [ this.wrapS, this.wrapT ],\n\n\t\t\tformat: this.format,\n\t\t\ttype: this.type,\n\t\t\tencoding: this.encoding,\n\n\t\t\tminFilter: this.minFilter,\n\t\t\tmagFilter: this.magFilter,\n\t\t\tanisotropy: this.anisotropy,\n\n\t\t\tflipY: this.flipY,\n\n\t\t\tpremultiplyAlpha: this.premultiplyAlpha,\n\t\t\tunpackAlignment: this.unpackAlignment\n\n\t\t};\n\n\t\tif ( this.image !== undefined ) {\n\n\t\t\t// TODO: Move to THREE.Image\n\n\t\t\tconst image = this.image;\n\n\t\t\tif ( image.uuid === undefined ) {\n\n\t\t\t\timage.uuid = MathUtils.generateUUID(); // UGH\n\n\t\t\t}\n\n\t\t\tif ( ! isRootObject && meta.images[ image.uuid ] === undefined ) {\n\n\t\t\t\tlet url;\n\n\t\t\t\tif ( Array.isArray( image ) ) {\n\n\t\t\t\t\t// process array of images e.g. CubeTexture\n\n\t\t\t\t\turl = [];\n\n\t\t\t\t\tfor ( let i = 0, l = image.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t// check cube texture with data textures\n\n\t\t\t\t\t\tif ( image[ i ].isDataTexture ) {\n\n\t\t\t\t\t\t\turl.push( serializeImage( image[ i ].image ) );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\turl.push( serializeImage( image[ i ] ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// process single image\n\n\t\t\t\t\turl = serializeImage( image );\n\n\t\t\t\t}\n\n\t\t\t\tmeta.images[ image.uuid ] = {\n\t\t\t\t\tuuid: image.uuid,\n\t\t\t\t\turl: url\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\toutput.image = image.uuid;\n\n\t\t}\n\n\t\tif ( JSON.stringify( this.userData ) !== '{}' ) output.userData = this.userData;\n\n\t\tif ( ! isRootObject ) {\n\n\t\t\tmeta.textures[ this.uuid ] = output;\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\ttransformUv( uv ) {\n\n\t\tif ( this.mapping !== UVMapping ) return uv;\n\n\t\tuv.applyMatrix3( this.matrix );\n\n\t\tif ( uv.x < 0 || uv.x > 1 ) {\n\n\t\t\tswitch ( this.wrapS ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.x = uv.x < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.x = Math.ceil( uv.x ) - uv.x;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( uv.y < 0 || uv.y > 1 ) {\n\n\t\t\tswitch ( this.wrapT ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.y = uv.y < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.y = Math.ceil( uv.y ) - uv.y;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.flipY ) {\n\n\t\t\tuv.y = 1 - uv.y;\n\n\t\t}\n\n\t\treturn uv;\n\n\t}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n}\n\nTexture.DEFAULT_IMAGE = undefined;\nTexture.DEFAULT_MAPPING = UVMapping;\n\nTexture.prototype.isTexture = true;\n\nfunction serializeImage( image ) {\n\n\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t// default images\n\n\t\treturn ImageUtils.getDataURL( image );\n\n\t} else {\n\n\t\tif ( image.data ) {\n\n\t\t\t// images of DataTexture\n\n\t\t\treturn {\n\t\t\t\tdata: Array.prototype.slice.call( image.data ),\n\t\t\t\twidth: image.width,\n\t\t\t\theight: image.height,\n\t\t\t\ttype: image.data.constructor.name\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.Texture: Unable to serialize Texture.' );\n\t\t\treturn {};\n\n\t\t}\n\n\t}\n\n}\n\nexport { Texture };\n","import { EventDispatcher } from '../core/EventDispatcher.js';\nimport { Texture } from '../textures/Texture.js';\nimport { LinearFilter } from '../constants.js';\nimport { Vector4 } from '../math/Vector4.js';\n\n/*\n In options, we can specify:\n * Texture parameters for an auto-generated target texture\n * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers\n*/\nclass WebGLRenderTarget extends EventDispatcher {\n\n\tconstructor( width, height, options = {} ) {\n\n\t\tsuper();\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t\tthis.depth = 1;\n\n\t\tthis.scissor = new Vector4( 0, 0, width, height );\n\t\tthis.scissorTest = false;\n\n\t\tthis.viewport = new Vector4( 0, 0, width, height );\n\n\t\tthis.texture = new Texture( undefined, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding );\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t\tthis.texture.image = { width: width, height: height, depth: 1 };\n\n\t\tthis.texture.generateMipmaps = options.generateMipmaps !== undefined ? options.generateMipmaps : false;\n\t\tthis.texture.internalFormat = options.internalFormat !== undefined ? options.internalFormat : null;\n\t\tthis.texture.minFilter = options.minFilter !== undefined ? options.minFilter : LinearFilter;\n\n\t\tthis.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true;\n\t\tthis.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : false;\n\t\tthis.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null;\n\n\t}\n\n\tsetTexture( texture ) {\n\n\t\ttexture.image = {\n\t\t\twidth: this.width,\n\t\t\theight: this.height,\n\t\t\tdepth: this.depth\n\t\t};\n\n\t\tthis.texture = texture;\n\n\t}\n\n\tsetSize( width, height, depth = 1 ) {\n\n\t\tif ( this.width !== width || this.height !== height || this.depth !== depth ) {\n\n\t\t\tthis.width = width;\n\t\t\tthis.height = height;\n\t\t\tthis.depth = depth;\n\n\t\t\tthis.texture.image.width = width;\n\t\t\tthis.texture.image.height = height;\n\t\t\tthis.texture.image.depth = depth;\n\n\t\t\tthis.dispose();\n\n\t\t}\n\n\t\tthis.viewport.set( 0, 0, width, height );\n\t\tthis.scissor.set( 0, 0, width, height );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\t\tthis.depth = source.depth;\n\n\t\tthis.viewport.copy( source.viewport );\n\n\t\tthis.texture = source.texture.clone();\n\n\t\t// ensure image object is not shared, see #20328\n\n\t\tthis.texture.image = Object.assign( {}, source.texture.image );\n\n\t\tthis.depthBuffer = source.depthBuffer;\n\t\tthis.stencilBuffer = source.stencilBuffer;\n\t\tthis.depthTexture = source.depthTexture;\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n}\n\nWebGLRenderTarget.prototype.isWebGLRenderTarget = true;\n\nexport { WebGLRenderTarget };\n","import { Camera } from './Camera.js';\nimport * as MathUtils from '../math/MathUtils.js';\n\nclass PerspectiveCamera extends Camera {\n\n\tconstructor( fov = 50, aspect = 1, near = 0.1, far = 2000 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'PerspectiveCamera';\n\n\t\tthis.fov = fov;\n\t\tthis.zoom = 1;\n\n\t\tthis.near = near;\n\t\tthis.far = far;\n\t\tthis.focus = 10;\n\n\t\tthis.aspect = aspect;\n\t\tthis.view = null;\n\n\t\tthis.filmGauge = 35;\t// width of the film (default in millimeters)\n\t\tthis.filmOffset = 0;\t// horizontal film offset (same unit as gauge)\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.fov = source.fov;\n\t\tthis.zoom = source.zoom;\n\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\t\tthis.focus = source.focus;\n\n\t\tthis.aspect = source.aspect;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\tthis.filmGauge = source.filmGauge;\n\t\tthis.filmOffset = source.filmOffset;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the FOV by focal length in respect to the current .filmGauge.\n\t *\n\t * The default film gauge is 35, so that the focal length can be specified for\n\t * a 35mm (full frame) camera.\n\t *\n\t * Values for focal length and film gauge must have the same unit.\n\t */\n\tsetFocalLength( focalLength ) {\n\n\t\t/** see {@link http://www.bobatkins.com/photography/technical/field_of_view.html} */\n\t\tconst vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;\n\n\t\tthis.fov = MathUtils.RAD2DEG * 2 * Math.atan( vExtentSlope );\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Calculates the focal length from the current .fov and .filmGauge.\n\t */\n\tgetFocalLength() {\n\n\t\tconst vExtentSlope = Math.tan( MathUtils.DEG2RAD * 0.5 * this.fov );\n\n\t\treturn 0.5 * this.getFilmHeight() / vExtentSlope;\n\n\t}\n\n\tgetEffectiveFOV() {\n\n\t\treturn MathUtils.RAD2DEG * 2 * Math.atan(\n\t\t\tMath.tan( MathUtils.DEG2RAD * 0.5 * this.fov ) / this.zoom );\n\n\t}\n\n\tgetFilmWidth() {\n\n\t\t// film not completely covered in portrait format (aspect < 1)\n\t\treturn this.filmGauge * Math.min( this.aspect, 1 );\n\n\t}\n\n\tgetFilmHeight() {\n\n\t\t// film not completely covered in landscape format (aspect > 1)\n\t\treturn this.filmGauge / Math.max( this.aspect, 1 );\n\n\t}\n\n\t/**\n\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t * multi-monitor/multi-machine setups.\n\t *\n\t * For example, if you have 3x2 monitors and each monitor is 1920x1080 and\n\t * the monitors are in grid like this\n\t *\n\t * +---+---+---+\n\t * | A | B | C |\n\t * +---+---+---+\n\t * | D | E | F |\n\t * +---+---+---+\n\t *\n\t * then for each monitor you would call it like this\n\t *\n\t * const w = 1920;\n\t * const h = 1080;\n\t * const fullWidth = w * 3;\n\t * const fullHeight = h * 2;\n\t *\n\t * --A--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );\n\t * --B--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );\n\t * --C--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );\n\t * --D--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );\n\t * --E--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );\n\t * --F--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );\n\t *\n\t * Note there is no reason monitors have to be the same size or in a grid.\n\t */\n\tsetViewOffset( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tthis.aspect = fullWidth / fullHeight;\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tclearViewOffset() {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tupdateProjectionMatrix() {\n\n\t\tconst near = this.near;\n\t\tlet top = near * Math.tan( MathUtils.DEG2RAD * 0.5 * this.fov ) / this.zoom;\n\t\tlet height = 2 * top;\n\t\tlet width = this.aspect * height;\n\t\tlet left = - 0.5 * width;\n\t\tconst view = this.view;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tconst fullWidth = view.fullWidth,\n\t\t\t\tfullHeight = view.fullHeight;\n\n\t\t\tleft += view.offsetX * width / fullWidth;\n\t\t\ttop -= view.offsetY * height / fullHeight;\n\t\t\twidth *= view.width / fullWidth;\n\t\t\theight *= view.height / fullHeight;\n\n\t\t}\n\n\t\tconst skew = this.filmOffset;\n\t\tif ( skew !== 0 ) left += near * skew / this.getFilmWidth();\n\n\t\tthis.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far );\n\n\t\tthis.projectionMatrixInverse.copy( this.projectionMatrix ).invert();\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.fov = this.fov;\n\t\tdata.object.zoom = this.zoom;\n\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\t\tdata.object.focus = this.focus;\n\n\t\tdata.object.aspect = this.aspect;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\tdata.object.filmGauge = this.filmGauge;\n\t\tdata.object.filmOffset = this.filmOffset;\n\n\t\treturn data;\n\n\t}\n\n}\n\nPerspectiveCamera.prototype.isPerspectiveCamera = true;\n\nexport { PerspectiveCamera };\n","import { Object3D } from '../core/Object3D.js';\nimport { Vector3 } from '../math/Vector3.js';\nimport { PerspectiveCamera } from './PerspectiveCamera.js';\n\nconst fov = 90, aspect = 1;\n\nclass CubeCamera extends Object3D {\n\n\tconstructor( near, far, renderTarget ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CubeCamera';\n\n\t\tif ( renderTarget.isWebGLCubeRenderTarget !== true ) {\n\n\t\t\tconsole.error( 'THREE.CubeCamera: The constructor now expects an instance of WebGLCubeRenderTarget as third parameter.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.renderTarget = renderTarget;\n\n\t\tconst cameraPX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPX.layers = this.layers;\n\t\tcameraPX.up.set( 0, - 1, 0 );\n\t\tcameraPX.lookAt( new Vector3( 1, 0, 0 ) );\n\t\tthis.add( cameraPX );\n\n\t\tconst cameraNX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNX.layers = this.layers;\n\t\tcameraNX.up.set( 0, - 1, 0 );\n\t\tcameraNX.lookAt( new Vector3( - 1, 0, 0 ) );\n\t\tthis.add( cameraNX );\n\n\t\tconst cameraPY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPY.layers = this.layers;\n\t\tcameraPY.up.set( 0, 0, 1 );\n\t\tcameraPY.lookAt( new Vector3( 0, 1, 0 ) );\n\t\tthis.add( cameraPY );\n\n\t\tconst cameraNY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNY.layers = this.layers;\n\t\tcameraNY.up.set( 0, 0, - 1 );\n\t\tcameraNY.lookAt( new Vector3( 0, - 1, 0 ) );\n\t\tthis.add( cameraNY );\n\n\t\tconst cameraPZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPZ.layers = this.layers;\n\t\tcameraPZ.up.set( 0, - 1, 0 );\n\t\tcameraPZ.lookAt( new Vector3( 0, 0, 1 ) );\n\t\tthis.add( cameraPZ );\n\n\t\tconst cameraNZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNZ.layers = this.layers;\n\t\tcameraNZ.up.set( 0, - 1, 0 );\n\t\tcameraNZ.lookAt( new Vector3( 0, 0, - 1 ) );\n\t\tthis.add( cameraNZ );\n\n\t}\n\n\tupdate( renderer, scene ) {\n\n\t\tif ( this.parent === null ) this.updateMatrixWorld();\n\n\t\tconst renderTarget = this.renderTarget;\n\n\t\tconst [ cameraPX, cameraNX, cameraPY, cameraNY, cameraPZ, cameraNZ ] = this.children;\n\n\t\tconst currentXrEnabled = renderer.xr.enabled;\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\trenderer.xr.enabled = false;\n\n\t\tconst generateMipmaps = renderTarget.texture.generateMipmaps;\n\n\t\trenderTarget.texture.generateMipmaps = false;\n\n\t\trenderer.setRenderTarget( renderTarget, 0 );\n\t\trenderer.render( scene, cameraPX );\n\n\t\trenderer.setRenderTarget( renderTarget, 1 );\n\t\trenderer.render( scene, cameraNX );\n\n\t\trenderer.setRenderTarget( renderTarget, 2 );\n\t\trenderer.render( scene, cameraPY );\n\n\t\trenderer.setRenderTarget( renderTarget, 3 );\n\t\trenderer.render( scene, cameraNY );\n\n\t\trenderer.setRenderTarget( renderTarget, 4 );\n\t\trenderer.render( scene, cameraPZ );\n\n\t\trenderTarget.texture.generateMipmaps = generateMipmaps;\n\n\t\trenderer.setRenderTarget( renderTarget, 5 );\n\t\trenderer.render( scene, cameraNZ );\n\n\t\trenderer.setRenderTarget( currentRenderTarget );\n\n\t\trenderer.xr.enabled = currentXrEnabled;\n\n\t\trenderTarget.texture.needsPMREMUpdate = true;\n\n\t}\n\n}\n\nexport { CubeCamera };\n","import { Texture } from './Texture.js';\nimport { CubeReflectionMapping } from '../constants.js';\n\nclass CubeTexture extends Texture {\n\n\tconstructor( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {\n\n\t\timages = images !== undefined ? images : [];\n\t\tmapping = mapping !== undefined ? mapping : CubeReflectionMapping;\n\n\t\tsuper( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.flipY = false;\n\n\t}\n\n\tget images() {\n\n\t\treturn this.image;\n\n\t}\n\n\tset images( value ) {\n\n\t\tthis.image = value;\n\n\t}\n\n}\n\nCubeTexture.prototype.isCubeTexture = true;\n\nexport { CubeTexture };\n","import { BackSide, LinearFilter, LinearMipmapLinearFilter, NoBlending, RGBAFormat } from '../constants.js';\nimport { Mesh } from '../objects/Mesh.js';\nimport { BoxGeometry } from '../geometries/BoxGeometry.js';\nimport { ShaderMaterial } from '../materials/ShaderMaterial.js';\nimport { cloneUniforms } from './shaders/UniformsUtils.js';\nimport { WebGLRenderTarget } from './WebGLRenderTarget.js';\nimport { CubeCamera } from '../cameras/CubeCamera.js';\nimport { CubeTexture } from '../textures/CubeTexture.js';\n\nclass WebGLCubeRenderTarget extends WebGLRenderTarget {\n\n\tconstructor( size, options, dummy ) {\n\n\t\tif ( Number.isInteger( options ) ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLCubeRenderTarget: constructor signature is now WebGLCubeRenderTarget( size, options )' );\n\n\t\t\toptions = dummy;\n\n\t\t}\n\n\t\tsuper( size, size, options );\n\n\t\toptions = options || {};\n\n\t\t// By convention -- likely based on the RenderMan spec from the 1990's -- cube maps are specified by WebGL (and three.js)\n\t\t// in a coordinate system in which positive-x is to the right when looking up the positive-z axis -- in other words,\n\t\t// in a left-handed coordinate system. By continuing this convention, preexisting cube maps continued to render correctly.\n\n\t\t// three.js uses a right-handed coordinate system. So environment maps used in three.js appear to have px and nx swapped\n\t\t// and the flag isRenderTargetTexture controls this conversion. The flip is not required when using WebGLCubeRenderTarget.texture\n\t\t// as a cube texture (this is detected when isRenderTargetTexture is set to true for cube textures).\n\n\t\tthis.texture = new CubeTexture( undefined, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding );\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t\tthis.texture.generateMipmaps = options.generateMipmaps !== undefined ? options.generateMipmaps : false;\n\t\tthis.texture.minFilter = options.minFilter !== undefined ? options.minFilter : LinearFilter;\n\n\t}\n\n\tfromEquirectangularTexture( renderer, texture ) {\n\n\t\tthis.texture.type = texture.type;\n\t\tthis.texture.format = RGBAFormat; // see #18859\n\t\tthis.texture.encoding = texture.encoding;\n\n\t\tthis.texture.generateMipmaps = texture.generateMipmaps;\n\t\tthis.texture.minFilter = texture.minFilter;\n\t\tthis.texture.magFilter = texture.magFilter;\n\n\t\tconst shader = {\n\n\t\t\tuniforms: {\n\t\t\t\ttEquirect: { value: null },\n\t\t\t},\n\n\t\t\tvertexShader: /* glsl */`\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include \n\t\t\t\t\t#include \n\n\t\t\t\t}\n\t\t\t`,\n\n\t\t\tfragmentShader: /* glsl */`\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include \n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t`\n\t\t};\n\n\t\tconst geometry = new BoxGeometry( 5, 5, 5 );\n\n\t\tconst material = new ShaderMaterial( {\n\n\t\t\tname: 'CubemapFromEquirect',\n\n\t\t\tuniforms: cloneUniforms( shader.uniforms ),\n\t\t\tvertexShader: shader.vertexShader,\n\t\t\tfragmentShader: shader.fragmentShader,\n\t\t\tside: BackSide,\n\t\t\tblending: NoBlending\n\n\t\t} );\n\n\t\tmaterial.uniforms.tEquirect.value = texture;\n\n\t\tconst mesh = new Mesh( geometry, material );\n\n\t\tconst currentMinFilter = texture.minFilter;\n\n\t\t// Avoid blurred poles\n\t\tif ( texture.minFilter === LinearMipmapLinearFilter ) texture.minFilter = LinearFilter;\n\n\t\tconst camera = new CubeCamera( 1, 10, this );\n\t\tcamera.update( renderer, mesh );\n\n\t\ttexture.minFilter = currentMinFilter;\n\n\t\tmesh.geometry.dispose();\n\t\tmesh.material.dispose();\n\n\t\treturn this;\n\n\t}\n\n\tclear( renderer, color, depth, stencil ) {\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\trenderer.setRenderTarget( this, i );\n\n\t\t\trenderer.clear( color, depth, stencil );\n\n\t\t}\n\n\t\trenderer.setRenderTarget( currentRenderTarget );\n\n\t}\n\n}\n\nWebGLCubeRenderTarget.prototype.isWebGLCubeRenderTarget = true;\n\nexport { WebGLCubeRenderTarget };\n","import { CubeReflectionMapping, CubeRefractionMapping, EquirectangularReflectionMapping, EquirectangularRefractionMapping } from '../../constants.js';\nimport { WebGLCubeRenderTarget } from '../WebGLCubeRenderTarget.js';\n\nfunction WebGLCubeMaps( renderer ) {\n\n\tlet cubemaps = new WeakMap();\n\n\tfunction mapTextureMapping( texture, mapping ) {\n\n\t\tif ( mapping === EquirectangularReflectionMapping ) {\n\n\t\t\ttexture.mapping = CubeReflectionMapping;\n\n\t\t} else if ( mapping === EquirectangularRefractionMapping ) {\n\n\t\t\ttexture.mapping = CubeRefractionMapping;\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction get( texture ) {\n\n\t\tif ( texture && texture.isTexture && texture.isRenderTargetTexture === false ) {\n\n\t\t\tconst mapping = texture.mapping;\n\n\t\t\tif ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping ) {\n\n\t\t\t\tif ( cubemaps.has( texture ) ) {\n\n\t\t\t\t\tconst cubemap = cubemaps.get( texture ).texture;\n\t\t\t\t\treturn mapTextureMapping( cubemap, texture.mapping );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst image = texture.image;\n\n\t\t\t\t\tif ( image && image.height > 0 ) {\n\n\t\t\t\t\t\tconst renderTarget = new WebGLCubeRenderTarget( image.height / 2 );\n\t\t\t\t\t\trenderTarget.fromEquirectangularTexture( renderer, texture );\n\t\t\t\t\t\tcubemaps.set( texture, renderTarget );\n\n\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\treturn mapTextureMapping( renderTarget.texture, texture.mapping );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// image not yet ready. try the conversion next frame\n\n\t\t\t\t\t\treturn null;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tconst cubemap = cubemaps.get( texture );\n\n\t\tif ( cubemap !== undefined ) {\n\n\t\t\tcubemaps.delete( texture );\n\t\t\tcubemap.dispose();\n\n\t\t}\n\n\t}\n\n\tfunction dispose() {\n\n\t\tcubemaps = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nexport { WebGLCubeMaps };\n","import { ShaderMaterial } from './ShaderMaterial.js';\n\nclass RawShaderMaterial extends ShaderMaterial {\n\n\tconstructor( parameters ) {\n\n\t\tsuper( parameters );\n\n\t\tthis.type = 'RawShaderMaterial';\n\n\t}\n\n}\n\nRawShaderMaterial.prototype.isRawShaderMaterial = true;\n\nexport { RawShaderMaterial };\n","import {\n\tCubeReflectionMapping,\n\tCubeRefractionMapping,\n\tCubeUVReflectionMapping,\n\tLinearEncoding,\n\tLinearFilter,\n\tNoToneMapping,\n\tNoBlending,\n\tRGBAFormat,\n\tHalfFloatType\n} from '../constants.js';\n\nimport { BufferAttribute } from '../core/BufferAttribute.js';\nimport { BufferGeometry } from '../core/BufferGeometry.js';\nimport { Mesh } from '../objects/Mesh.js';\nimport { OrthographicCamera } from '../cameras/OrthographicCamera.js';\nimport { PerspectiveCamera } from '../cameras/PerspectiveCamera.js';\nimport { RawShaderMaterial } from '../materials/RawShaderMaterial.js';\nimport { Vector2 } from '../math/Vector2.js';\nimport { Vector3 } from '../math/Vector3.js';\nimport { Color } from '../math/Color.js';\nimport { WebGLRenderTarget } from '../renderers/WebGLRenderTarget.js';\nimport { MeshBasicMaterial } from '../materials/MeshBasicMaterial.js';\nimport { BoxGeometry } from '../geometries/BoxGeometry.js';\nimport { BackSide } from '../constants.js';\n\nconst LOD_MIN = 4;\nconst LOD_MAX = 8;\nconst SIZE_MAX = Math.pow( 2, LOD_MAX );\n\n// The standard deviations (radians) associated with the extra mips. These are\n// chosen to approximate a Trowbridge-Reitz distribution function times the\n// geometric shadowing function. These sigma values squared must match the\n// variance #defines in cube_uv_reflection_fragment.glsl.js.\nconst EXTRA_LOD_SIGMA = [ 0.125, 0.215, 0.35, 0.446, 0.526, 0.582 ];\n\nconst TOTAL_LODS = LOD_MAX - LOD_MIN + 1 + EXTRA_LOD_SIGMA.length;\n\n// The maximum length of the blur for loop. Smaller sigmas will use fewer\n// samples and exit early, but not recompile the shader.\nconst MAX_SAMPLES = 20;\n\nconst _flatCamera = /*@__PURE__*/ new OrthographicCamera();\nconst { _lodPlanes, _sizeLods, _sigmas } = /*@__PURE__*/ _createPlanes();\nconst _clearColor = /*@__PURE__*/ new Color();\nlet _oldTarget = null;\n\n// Golden Ratio\nconst PHI = ( 1 + Math.sqrt( 5 ) ) / 2;\nconst INV_PHI = 1 / PHI;\n\n// Vertices of a dodecahedron (except the opposites, which represent the\n// same axis), used as axis directions evenly spread on a sphere.\nconst _axisDirections = [\n\t/*@__PURE__*/ new Vector3( 1, 1, 1 ),\n\t/*@__PURE__*/ new Vector3( - 1, 1, 1 ),\n\t/*@__PURE__*/ new Vector3( 1, 1, - 1 ),\n\t/*@__PURE__*/ new Vector3( - 1, 1, - 1 ),\n\t/*@__PURE__*/ new Vector3( 0, PHI, INV_PHI ),\n\t/*@__PURE__*/ new Vector3( 0, PHI, - INV_PHI ),\n\t/*@__PURE__*/ new Vector3( INV_PHI, 0, PHI ),\n\t/*@__PURE__*/ new Vector3( - INV_PHI, 0, PHI ),\n\t/*@__PURE__*/ new Vector3( PHI, INV_PHI, 0 ),\n\t/*@__PURE__*/ new Vector3( - PHI, INV_PHI, 0 ) ];\n\n/**\n * This class generates a Prefiltered, Mipmapped Radiance Environment Map\n * (PMREM) from a cubeMap environment texture. This allows different levels of\n * blur to be quickly accessed based on material roughness. It is packed into a\n * special CubeUV format that allows us to perform custom interpolation so that\n * we can support nonlinear formats such as RGBE. Unlike a traditional mipmap\n * chain, it only goes down to the LOD_MIN level (above), and then creates extra\n * even more filtered 'mips' at the same LOD_MIN resolution, associated with\n * higher roughness levels. In this way we maintain resolution to smoothly\n * interpolate diffuse lighting while limiting sampling computation.\n *\n * Paper: Fast, Accurate Image-Based Lighting\n * https://drive.google.com/file/d/15y8r_UpKlU9SvV4ILb0C3qCPecS8pvLz/view\n*/\n\nclass PMREMGenerator {\n\n\tconstructor( renderer ) {\n\n\t\tthis._renderer = renderer;\n\t\tthis._pingPongRenderTarget = null;\n\n\t\tthis._blurMaterial = _getBlurShader( MAX_SAMPLES );\n\t\tthis._equirectShader = null;\n\t\tthis._cubemapShader = null;\n\n\t\tthis._compileMaterial( this._blurMaterial );\n\n\t}\n\n\t/**\n\t * Generates a PMREM from a supplied Scene, which can be faster than using an\n\t * image if networking bandwidth is low. Optional sigma specifies a blur radius\n\t * in radians to be applied to the scene before PMREM generation. Optional near\n\t * and far planes ensure the scene is rendered in its entirety (the cubeCamera\n\t * is placed at the origin).\n\t */\n\tfromScene( scene, sigma = 0, near = 0.1, far = 100 ) {\n\n\t\t_oldTarget = this._renderer.getRenderTarget();\n\t\tconst cubeUVRenderTarget = this._allocateTargets();\n\n\t\tthis._sceneToCubeUV( scene, near, far, cubeUVRenderTarget );\n\t\tif ( sigma > 0 ) {\n\n\t\t\tthis._blur( cubeUVRenderTarget, 0, 0, sigma );\n\n\t\t}\n\n\t\tthis._applyPMREM( cubeUVRenderTarget );\n\t\tthis._cleanup( cubeUVRenderTarget );\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t/**\n\t * Generates a PMREM from an equirectangular texture, which can be either LDR\n\t * or HDR. The ideal input image size is 1k (1024 x 512),\n\t * as this matches best with the 256 x 256 cubemap output.\n\t */\n\tfromEquirectangular( equirectangular, renderTarget = null ) {\n\n\t\treturn this._fromTexture( equirectangular, renderTarget );\n\n\t}\n\n\t/**\n\t * Generates a PMREM from an cubemap texture, which can be either LDR\n\t * or HDR. The ideal input cube size is 256 x 256,\n\t * as this matches best with the 256 x 256 cubemap output.\n\t */\n\tfromCubemap( cubemap, renderTarget = null ) {\n\n\t\treturn this._fromTexture( cubemap, renderTarget );\n\n\t}\n\n\t/**\n\t * Pre-compiles the cubemap shader. You can get faster start-up by invoking this method during\n\t * your texture's network fetch for increased concurrency.\n\t */\n\tcompileCubemapShader() {\n\n\t\tif ( this._cubemapShader === null ) {\n\n\t\t\tthis._cubemapShader = _getCubemapShader();\n\t\t\tthis._compileMaterial( this._cubemapShader );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Pre-compiles the equirectangular shader. You can get faster start-up by invoking this method during\n\t * your texture's network fetch for increased concurrency.\n\t */\n\tcompileEquirectangularShader() {\n\n\t\tif ( this._equirectShader === null ) {\n\n\t\t\tthis._equirectShader = _getEquirectShader();\n\t\t\tthis._compileMaterial( this._equirectShader );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Disposes of the PMREMGenerator's internal memory. Note that PMREMGenerator is a static class,\n\t * so you should not need more than one PMREMGenerator object. If you do, calling dispose() on\n\t * one of them will cause any others to also become unusable.\n\t */\n\tdispose() {\n\n\t\tthis._blurMaterial.dispose();\n\n\t\tif ( this._pingPongRenderTarget !== null ) this._pingPongRenderTarget.dispose();\n\n\t\tif ( this._cubemapShader !== null ) this._cubemapShader.dispose();\n\t\tif ( this._equirectShader !== null ) this._equirectShader.dispose();\n\n\t\tfor ( let i = 0; i < _lodPlanes.length; i ++ ) {\n\n\t\t\t_lodPlanes[ i ].dispose();\n\n\t\t}\n\n\t}\n\n\t// private interface\n\n\t_cleanup( outputTarget ) {\n\n\t\tthis._renderer.setRenderTarget( _oldTarget );\n\t\toutputTarget.scissorTest = false;\n\t\t_setViewport( outputTarget, 0, 0, outputTarget.width, outputTarget.height );\n\n\t}\n\n\t_fromTexture( texture, renderTarget ) {\n\n\t\t_oldTarget = this._renderer.getRenderTarget();\n\t\tconst cubeUVRenderTarget = renderTarget || this._allocateTargets( texture );\n\t\tthis._textureToCubeUV( texture, cubeUVRenderTarget );\n\t\tthis._applyPMREM( cubeUVRenderTarget );\n\t\tthis._cleanup( cubeUVRenderTarget );\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t_allocateTargets( texture ) { // warning: null texture is valid\n\n\t\tconst params = {\n\t\t\tmagFilter: LinearFilter,\n\t\t\tminFilter: LinearFilter,\n\t\t\tgenerateMipmaps: false,\n\t\t\ttype: HalfFloatType,\n\t\t\tformat: RGBAFormat,\n\t\t\tencoding: LinearEncoding,\n\t\t\tdepthBuffer: false\n\t\t};\n\n\t\tconst cubeUVRenderTarget = _createRenderTarget( params );\n\t\tcubeUVRenderTarget.depthBuffer = texture ? false : true;\n\n\t\tif ( this._pingPongRenderTarget === null ) {\n\n\t\t\tthis._pingPongRenderTarget = _createRenderTarget( params );\n\n\t\t}\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t_compileMaterial( material ) {\n\n\t\tconst tmpMesh = new Mesh( _lodPlanes[ 0 ], material );\n\t\tthis._renderer.compile( tmpMesh, _flatCamera );\n\n\t}\n\n\t_sceneToCubeUV( scene, near, far, cubeUVRenderTarget ) {\n\n\t\tconst fov = 90;\n\t\tconst aspect = 1;\n\t\tconst cubeCamera = new PerspectiveCamera( fov, aspect, near, far );\n\t\tconst upSign = [ 1, - 1, 1, 1, 1, 1 ];\n\t\tconst forwardSign = [ 1, 1, 1, - 1, - 1, - 1 ];\n\t\tconst renderer = this._renderer;\n\n\t\tconst originalAutoClear = renderer.autoClear;\n\t\tconst toneMapping = renderer.toneMapping;\n\t\trenderer.getClearColor( _clearColor );\n\n\t\trenderer.toneMapping = NoToneMapping;\n\t\trenderer.autoClear = false;\n\n\t\tconst backgroundMaterial = new MeshBasicMaterial( {\n\t\t\tname: 'PMREM.Background',\n\t\t\tside: BackSide,\n\t\t\tdepthWrite: false,\n\t\t\tdepthTest: false,\n\t\t} );\n\n\t\tconst backgroundBox = new Mesh( new BoxGeometry(), backgroundMaterial );\n\n\t\tlet useSolidColor = false;\n\t\tconst background = scene.background;\n\n\t\tif ( background ) {\n\n\t\t\tif ( background.isColor ) {\n\n\t\t\t\tbackgroundMaterial.color.copy( background );\n\t\t\t\tscene.background = null;\n\t\t\t\tuseSolidColor = true;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tbackgroundMaterial.color.copy( _clearColor );\n\t\t\tuseSolidColor = true;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst col = i % 3;\n\t\t\tif ( col === 0 ) {\n\n\t\t\t\tcubeCamera.up.set( 0, upSign[ i ], 0 );\n\t\t\t\tcubeCamera.lookAt( forwardSign[ i ], 0, 0 );\n\n\t\t\t} else if ( col === 1 ) {\n\n\t\t\t\tcubeCamera.up.set( 0, 0, upSign[ i ] );\n\t\t\t\tcubeCamera.lookAt( 0, forwardSign[ i ], 0 );\n\n\t\t\t} else {\n\n\t\t\t\tcubeCamera.up.set( 0, upSign[ i ], 0 );\n\t\t\t\tcubeCamera.lookAt( 0, 0, forwardSign[ i ] );\n\n\t\t\t}\n\n\t\t\t_setViewport( cubeUVRenderTarget,\n\t\t\t\tcol * SIZE_MAX, i > 2 ? SIZE_MAX : 0, SIZE_MAX, SIZE_MAX );\n\t\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\n\t\t\tif ( useSolidColor ) {\n\n\t\t\t\trenderer.render( backgroundBox, cubeCamera );\n\n\t\t\t}\n\n\t\t\trenderer.render( scene, cubeCamera );\n\n\t\t}\n\n\t\tbackgroundBox.geometry.dispose();\n\t\tbackgroundBox.material.dispose();\n\n\t\trenderer.toneMapping = toneMapping;\n\t\trenderer.autoClear = originalAutoClear;\n\t\tscene.background = background;\n\n\t}\n\n\t_textureToCubeUV( texture, cubeUVRenderTarget ) {\n\n\t\tconst renderer = this._renderer;\n\n\t\tconst isCubeTexture = ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping );\n\n\t\tif ( isCubeTexture ) {\n\n\t\t\tif ( this._cubemapShader === null ) {\n\n\t\t\t\tthis._cubemapShader = _getCubemapShader();\n\n\t\t\t}\n\n\t\t\tthis._cubemapShader.uniforms.flipEnvMap.value = ( texture.isRenderTargetTexture === false ) ? - 1 : 1;\n\n\t\t} else {\n\n\t\t\tif ( this._equirectShader === null ) {\n\n\t\t\t\tthis._equirectShader = _getEquirectShader();\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst material = isCubeTexture ? this._cubemapShader : this._equirectShader;\n\t\tconst mesh = new Mesh( _lodPlanes[ 0 ], material );\n\n\t\tconst uniforms = material.uniforms;\n\n\t\tuniforms[ 'envMap' ].value = texture;\n\n\t\tif ( ! isCubeTexture ) {\n\n\t\t\tuniforms[ 'texelSize' ].value.set( 1.0 / texture.image.width, 1.0 / texture.image.height );\n\n\t\t}\n\n\t\t_setViewport( cubeUVRenderTarget, 0, 0, 3 * SIZE_MAX, 2 * SIZE_MAX );\n\n\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\t\trenderer.render( mesh, _flatCamera );\n\n\t}\n\n\t_applyPMREM( cubeUVRenderTarget ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst autoClear = renderer.autoClear;\n\t\trenderer.autoClear = false;\n\n\t\tfor ( let i = 1; i < TOTAL_LODS; i ++ ) {\n\n\t\t\tconst sigma = Math.sqrt( _sigmas[ i ] * _sigmas[ i ] - _sigmas[ i - 1 ] * _sigmas[ i - 1 ] );\n\n\t\t\tconst poleAxis = _axisDirections[ ( i - 1 ) % _axisDirections.length ];\n\n\t\t\tthis._blur( cubeUVRenderTarget, i - 1, i, sigma, poleAxis );\n\n\t\t}\n\n\t\trenderer.autoClear = autoClear;\n\n\t}\n\n\t/**\n\t * This is a two-pass Gaussian blur for a cubemap. Normally this is done\n\t * vertically and horizontally, but this breaks down on a cube. Here we apply\n\t * the blur latitudinally (around the poles), and then longitudinally (towards\n\t * the poles) to approximate the orthogonally-separable blur. It is least\n\t * accurate at the poles, but still does a decent job.\n\t */\n\t_blur( cubeUVRenderTarget, lodIn, lodOut, sigma, poleAxis ) {\n\n\t\tconst pingPongRenderTarget = this._pingPongRenderTarget;\n\n\t\tthis._halfBlur(\n\t\t\tcubeUVRenderTarget,\n\t\t\tpingPongRenderTarget,\n\t\t\tlodIn,\n\t\t\tlodOut,\n\t\t\tsigma,\n\t\t\t'latitudinal',\n\t\t\tpoleAxis );\n\n\t\tthis._halfBlur(\n\t\t\tpingPongRenderTarget,\n\t\t\tcubeUVRenderTarget,\n\t\t\tlodOut,\n\t\t\tlodOut,\n\t\t\tsigma,\n\t\t\t'longitudinal',\n\t\t\tpoleAxis );\n\n\t}\n\n\t_halfBlur( targetIn, targetOut, lodIn, lodOut, sigmaRadians, direction, poleAxis ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst blurMaterial = this._blurMaterial;\n\n\t\tif ( direction !== 'latitudinal' && direction !== 'longitudinal' ) {\n\n\t\t\tconsole.error(\n\t\t\t\t'blur direction must be either latitudinal or longitudinal!' );\n\n\t\t}\n\n\t\t// Number of standard deviations at which to cut off the discrete approximation.\n\t\tconst STANDARD_DEVIATIONS = 3;\n\n\t\tconst blurMesh = new Mesh( _lodPlanes[ lodOut ], blurMaterial );\n\t\tconst blurUniforms = blurMaterial.uniforms;\n\n\t\tconst pixels = _sizeLods[ lodIn ] - 1;\n\t\tconst radiansPerPixel = isFinite( sigmaRadians ) ? Math.PI / ( 2 * pixels ) : 2 * Math.PI / ( 2 * MAX_SAMPLES - 1 );\n\t\tconst sigmaPixels = sigmaRadians / radiansPerPixel;\n\t\tconst samples = isFinite( sigmaRadians ) ? 1 + Math.floor( STANDARD_DEVIATIONS * sigmaPixels ) : MAX_SAMPLES;\n\n\t\tif ( samples > MAX_SAMPLES ) {\n\n\t\t\tconsole.warn( `sigmaRadians, ${\n\t\t\t\tsigmaRadians}, is too large and will clip, as it requested ${\n\t\t\t\tsamples} samples when the maximum is set to ${MAX_SAMPLES}` );\n\n\t\t}\n\n\t\tconst weights = [];\n\t\tlet sum = 0;\n\n\t\tfor ( let i = 0; i < MAX_SAMPLES; ++ i ) {\n\n\t\t\tconst x = i / sigmaPixels;\n\t\t\tconst weight = Math.exp( - x * x / 2 );\n\t\t\tweights.push( weight );\n\n\t\t\tif ( i === 0 ) {\n\n\t\t\t\tsum += weight;\n\n\t\t\t} else if ( i < samples ) {\n\n\t\t\t\tsum += 2 * weight;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let i = 0; i < weights.length; i ++ ) {\n\n\t\t\tweights[ i ] = weights[ i ] / sum;\n\n\t\t}\n\n\t\tblurUniforms[ 'envMap' ].value = targetIn.texture;\n\t\tblurUniforms[ 'samples' ].value = samples;\n\t\tblurUniforms[ 'weights' ].value = weights;\n\t\tblurUniforms[ 'latitudinal' ].value = direction === 'latitudinal';\n\n\t\tif ( poleAxis ) {\n\n\t\t\tblurUniforms[ 'poleAxis' ].value = poleAxis;\n\n\t\t}\n\n\t\tblurUniforms[ 'dTheta' ].value = radiansPerPixel;\n\t\tblurUniforms[ 'mipInt' ].value = LOD_MAX - lodIn;\n\n\t\tconst outputSize = _sizeLods[ lodOut ];\n\t\tconst x = 3 * Math.max( 0, SIZE_MAX - 2 * outputSize );\n\t\tconst y = ( lodOut === 0 ? 0 : 2 * SIZE_MAX ) + 2 * outputSize * ( lodOut > LOD_MAX - LOD_MIN ? lodOut - LOD_MAX + LOD_MIN : 0 );\n\n\t\t_setViewport( targetOut, x, y, 3 * outputSize, 2 * outputSize );\n\t\trenderer.setRenderTarget( targetOut );\n\t\trenderer.render( blurMesh, _flatCamera );\n\n\t}\n\n}\n\nfunction _createPlanes() {\n\n\tconst _lodPlanes = [];\n\tconst _sizeLods = [];\n\tconst _sigmas = [];\n\n\tlet lod = LOD_MAX;\n\n\tfor ( let i = 0; i < TOTAL_LODS; i ++ ) {\n\n\t\tconst sizeLod = Math.pow( 2, lod );\n\t\t_sizeLods.push( sizeLod );\n\t\tlet sigma = 1.0 / sizeLod;\n\n\t\tif ( i > LOD_MAX - LOD_MIN ) {\n\n\t\t\tsigma = EXTRA_LOD_SIGMA[ i - LOD_MAX + LOD_MIN - 1 ];\n\n\t\t} else if ( i === 0 ) {\n\n\t\t\tsigma = 0;\n\n\t\t}\n\n\t\t_sigmas.push( sigma );\n\n\t\tconst texelSize = 1.0 / ( sizeLod - 1 );\n\t\tconst min = - texelSize / 2;\n\t\tconst max = 1 + texelSize / 2;\n\t\tconst uv1 = [ min, min, max, min, max, max, min, min, max, max, min, max ];\n\n\t\tconst cubeFaces = 6;\n\t\tconst vertices = 6;\n\t\tconst positionSize = 3;\n\t\tconst uvSize = 2;\n\t\tconst faceIndexSize = 1;\n\n\t\tconst position = new Float32Array( positionSize * vertices * cubeFaces );\n\t\tconst uv = new Float32Array( uvSize * vertices * cubeFaces );\n\t\tconst faceIndex = new Float32Array( faceIndexSize * vertices * cubeFaces );\n\n\t\tfor ( let face = 0; face < cubeFaces; face ++ ) {\n\n\t\t\tconst x = ( face % 3 ) * 2 / 3 - 1;\n\t\t\tconst y = face > 2 ? 0 : - 1;\n\t\t\tconst coordinates = [\n\t\t\t\tx, y, 0,\n\t\t\t\tx + 2 / 3, y, 0,\n\t\t\t\tx + 2 / 3, y + 1, 0,\n\t\t\t\tx, y, 0,\n\t\t\t\tx + 2 / 3, y + 1, 0,\n\t\t\t\tx, y + 1, 0\n\t\t\t];\n\t\t\tposition.set( coordinates, positionSize * vertices * face );\n\t\t\tuv.set( uv1, uvSize * vertices * face );\n\t\t\tconst fill = [ face, face, face, face, face, face ];\n\t\t\tfaceIndex.set( fill, faceIndexSize * vertices * face );\n\n\t\t}\n\n\t\tconst planes = new BufferGeometry();\n\t\tplanes.setAttribute( 'position', new BufferAttribute( position, positionSize ) );\n\t\tplanes.setAttribute( 'uv', new BufferAttribute( uv, uvSize ) );\n\t\tplanes.setAttribute( 'faceIndex', new BufferAttribute( faceIndex, faceIndexSize ) );\n\t\t_lodPlanes.push( planes );\n\n\t\tif ( lod > LOD_MIN ) {\n\n\t\t\tlod --;\n\n\t\t}\n\n\t}\n\n\treturn { _lodPlanes, _sizeLods, _sigmas };\n\n}\n\nfunction _createRenderTarget( params ) {\n\n\tconst cubeUVRenderTarget = new WebGLRenderTarget( 3 * SIZE_MAX, 3 * SIZE_MAX, params );\n\tcubeUVRenderTarget.texture.mapping = CubeUVReflectionMapping;\n\tcubeUVRenderTarget.texture.name = 'PMREM.cubeUv';\n\tcubeUVRenderTarget.scissorTest = true;\n\treturn cubeUVRenderTarget;\n\n}\n\nfunction _setViewport( target, x, y, width, height ) {\n\n\ttarget.viewport.set( x, y, width, height );\n\ttarget.scissor.set( x, y, width, height );\n\n}\n\nfunction _getBlurShader( maxSamples ) {\n\n\tconst weights = new Float32Array( maxSamples );\n\tconst poleAxis = new Vector3( 0, 1, 0 );\n\tconst shaderMaterial = new RawShaderMaterial( {\n\n\t\tname: 'SphericalGaussianBlur',\n\n\t\tdefines: { 'n': maxSamples },\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'samples': { value: 1 },\n\t\t\t'weights': { value: weights },\n\t\t\t'latitudinal': { value: false },\n\t\t\t'dTheta': { value: 0 },\n\t\t\t'mipInt': { value: 0 },\n\t\t\t'poleAxis': { value: poleAxis }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform int samples;\n\t\t\tuniform float weights[ n ];\n\t\t\tuniform bool latitudinal;\n\t\t\tuniform float dTheta;\n\t\t\tuniform float mipInt;\n\t\t\tuniform vec3 poleAxis;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include \n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n\treturn shaderMaterial;\n\n}\n\nfunction _getEquirectShader() {\n\n\tconst texelSize = new Vector2( 1, 1 );\n\tconst shaderMaterial = new RawShaderMaterial( {\n\n\t\tname: 'EquirectangularToCubeUV',\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'texelSize': { value: texelSize }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform vec2 texelSize;\n\n\t\t\t#include \n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tvec2 f = fract( uv / texelSize - 0.5 );\n\t\t\t\tuv -= f * texelSize;\n\t\t\t\tvec3 tl = texture2D ( envMap, uv ).rgb;\n\t\t\t\tuv.x += texelSize.x;\n\t\t\t\tvec3 tr = texture2D ( envMap, uv ).rgb;\n\t\t\t\tuv.y += texelSize.y;\n\t\t\t\tvec3 br = texture2D ( envMap, uv ).rgb;\n\t\t\t\tuv.x -= texelSize.x;\n\t\t\t\tvec3 bl = texture2D ( envMap, uv ).rgb;\n\n\t\t\t\tvec3 tm = mix( tl, tr, f.x );\n\t\t\t\tvec3 bm = mix( bl, br, f.x );\n\t\t\t\tgl_FragColor.rgb = mix( tm, bm, f.y );\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n\treturn shaderMaterial;\n\n}\n\nfunction _getCubemapShader() {\n\n\tconst shaderMaterial = new RawShaderMaterial( {\n\n\t\tname: 'CubemapToCubeUV',\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'flipEnvMap': { value: - 1 }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tuniform float flipEnvMap;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) );\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n\treturn shaderMaterial;\n\n}\n\nfunction _getCommonVertexShader() {\n\n\treturn /* glsl */`\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute vec3 position;\n\t\tattribute vec2 uv;\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t`;\n\n}\n\nexport { PMREMGenerator };\n","import { CubeReflectionMapping, CubeRefractionMapping, EquirectangularReflectionMapping, EquirectangularRefractionMapping } from '../../constants.js';\nimport { PMREMGenerator } from '../../extras/PMREMGenerator.js';\n\nfunction WebGLCubeUVMaps( renderer ) {\n\n\tlet cubeUVmaps = new WeakMap();\n\n\tlet pmremGenerator = null;\n\n\tfunction get( texture ) {\n\n\t\tif ( texture && texture.isTexture ) {\n\n\t\t\tconst mapping = texture.mapping;\n\n\t\t\tconst isEquirectMap = ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping );\n\t\t\tconst isCubeMap = ( mapping === CubeReflectionMapping || mapping === CubeRefractionMapping );\n\n\t\t\t// equirect/cube map to cubeUV conversion\n\n\t\t\tif ( isEquirectMap || isCubeMap ) {\n\n\t\t\t\tif ( texture.isRenderTargetTexture && texture.needsPMREMUpdate === true ) {\n\n\t\t\t\t\ttexture.needsPMREMUpdate = false;\n\n\t\t\t\t\tlet renderTarget = cubeUVmaps.get( texture );\n\n\t\t\t\t\tif ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );\n\n\t\t\t\t\trenderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture, renderTarget ) : pmremGenerator.fromCubemap( texture, renderTarget );\n\t\t\t\t\tcubeUVmaps.set( texture, renderTarget );\n\n\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( cubeUVmaps.has( texture ) ) {\n\n\t\t\t\t\t\treturn cubeUVmaps.get( texture ).texture;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst image = texture.image;\n\n\t\t\t\t\t\tif ( ( isEquirectMap && image && image.height > 0 ) || ( isCubeMap && image && isCubeTextureComplete( image ) ) ) {\n\n\t\t\t\t\t\t\tif ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );\n\n\t\t\t\t\t\t\tconst renderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture ) : pmremGenerator.fromCubemap( texture );\n\t\t\t\t\t\t\tcubeUVmaps.set( texture, renderTarget );\n\n\t\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// image not yet ready. try the conversion next frame\n\n\t\t\t\t\t\t\treturn null;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction isCubeTextureComplete( image ) {\n\n\t\tlet count = 0;\n\t\tconst length = 6;\n\n\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\tif ( image[ i ] !== undefined ) count ++;\n\n\t\t}\n\n\t\treturn count === length;\n\n\n\t}\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tconst cubemapUV = cubeUVmaps.get( texture );\n\n\t\tif ( cubemapUV !== undefined ) {\n\n\t\t\tcubeUVmaps.delete( texture );\n\t\t\tcubemapUV.dispose();\n\n\t\t}\n\n\t}\n\n\tfunction dispose() {\n\n\t\tcubeUVmaps = new WeakMap();\n\n\t\tif ( pmremGenerator !== null ) {\n\n\t\t\tpmremGenerator.dispose();\n\t\t\tpmremGenerator = null;\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nexport { WebGLCubeUVMaps };\n","function WebGLExtensions( gl ) {\n\n\tconst extensions = {};\n\n\tfunction getExtension( name ) {\n\n\t\tif ( extensions[ name ] !== undefined ) {\n\n\t\t\treturn extensions[ name ];\n\n\t\t}\n\n\t\tlet extension;\n\n\t\tswitch ( name ) {\n\n\t\t\tcase 'WEBGL_depth_texture':\n\t\t\t\textension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' );\n\t\t\t\tbreak;\n\n\t\t\tcase 'EXT_texture_filter_anisotropic':\n\t\t\t\textension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' );\n\t\t\t\tbreak;\n\n\t\t\tcase 'WEBGL_compressed_texture_s3tc':\n\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' );\n\t\t\t\tbreak;\n\n\t\t\tcase 'WEBGL_compressed_texture_pvrtc':\n\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\textension = gl.getExtension( name );\n\n\t\t}\n\n\t\textensions[ name ] = extension;\n\n\t\treturn extension;\n\n\t}\n\n\treturn {\n\n\t\thas: function ( name ) {\n\n\t\t\treturn getExtension( name ) !== null;\n\n\t\t},\n\n\t\tinit: function ( capabilities ) {\n\n\t\t\tif ( capabilities.isWebGL2 ) {\n\n\t\t\t\tgetExtension( 'EXT_color_buffer_float' );\n\n\t\t\t} else {\n\n\t\t\t\tgetExtension( 'WEBGL_depth_texture' );\n\t\t\t\tgetExtension( 'OES_texture_float' );\n\t\t\t\tgetExtension( 'OES_texture_half_float' );\n\t\t\t\tgetExtension( 'OES_texture_half_float_linear' );\n\t\t\t\tgetExtension( 'OES_standard_derivatives' );\n\t\t\t\tgetExtension( 'OES_element_index_uint' );\n\t\t\t\tgetExtension( 'OES_vertex_array_object' );\n\t\t\t\tgetExtension( 'ANGLE_instanced_arrays' );\n\n\t\t\t}\n\n\t\t\tgetExtension( 'OES_texture_float_linear' );\n\t\t\tgetExtension( 'EXT_color_buffer_half_float' );\n\t\t\tgetExtension( 'WEBGL_multisampled_render_to_texture' );\n\n\t\t},\n\n\t\tget: function ( name ) {\n\n\t\t\tconst extension = getExtension( name );\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' );\n\n\t\t\t}\n\n\t\t\treturn extension;\n\n\t\t}\n\n\t};\n\n}\n\n\nexport { WebGLExtensions };\n","import { Uint16BufferAttribute, Uint32BufferAttribute } from '../../core/BufferAttribute.js';\nimport { arrayNeedsUint32 } from '../../utils.js';\n\nfunction WebGLGeometries( gl, attributes, info, bindingStates ) {\n\n\tconst geometries = {};\n\tconst wireframeAttributes = new WeakMap();\n\n\tfunction onGeometryDispose( event ) {\n\n\t\tconst geometry = event.target;\n\n\t\tif ( geometry.index !== null ) {\n\n\t\t\tattributes.remove( geometry.index );\n\n\t\t}\n\n\t\tfor ( const name in geometry.attributes ) {\n\n\t\t\tattributes.remove( geometry.attributes[ name ] );\n\n\t\t}\n\n\t\tgeometry.removeEventListener( 'dispose', onGeometryDispose );\n\n\t\tdelete geometries[ geometry.id ];\n\n\t\tconst attribute = wireframeAttributes.get( geometry );\n\n\t\tif ( attribute ) {\n\n\t\t\tattributes.remove( attribute );\n\t\t\twireframeAttributes.delete( geometry );\n\n\t\t}\n\n\t\tbindingStates.releaseStatesOfGeometry( geometry );\n\n\t\tif ( geometry.isInstancedBufferGeometry === true ) {\n\n\t\t\tdelete geometry._maxInstanceCount;\n\n\t\t}\n\n\t\t//\n\n\t\tinfo.memory.geometries --;\n\n\t}\n\n\tfunction get( object, geometry ) {\n\n\t\tif ( geometries[ geometry.id ] === true ) return geometry;\n\n\t\tgeometry.addEventListener( 'dispose', onGeometryDispose );\n\n\t\tgeometries[ geometry.id ] = true;\n\n\t\tinfo.memory.geometries ++;\n\n\t\treturn geometry;\n\n\t}\n\n\tfunction update( geometry ) {\n\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\t// Updating index buffer in VAO now. See WebGLBindingStates.\n\n\t\tfor ( const name in geometryAttributes ) {\n\n\t\t\tattributes.update( geometryAttributes[ name ], gl.ARRAY_BUFFER );\n\n\t\t}\n\n\t\t// morph targets\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst array = morphAttributes[ name ];\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\tattributes.update( array[ i ], gl.ARRAY_BUFFER );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction updateWireframeAttribute( geometry ) {\n\n\t\tconst indices = [];\n\n\t\tconst geometryIndex = geometry.index;\n\t\tconst geometryPosition = geometry.attributes.position;\n\t\tlet version = 0;\n\n\t\tif ( geometryIndex !== null ) {\n\n\t\t\tconst array = geometryIndex.array;\n\t\t\tversion = geometryIndex.version;\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\tconst a = array[ i + 0 ];\n\t\t\t\tconst b = array[ i + 1 ];\n\t\t\t\tconst c = array[ i + 2 ];\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst array = geometryPosition.array;\n\t\t\tversion = geometryPosition.version;\n\n\t\t\tfor ( let i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {\n\n\t\t\t\tconst a = i + 0;\n\t\t\t\tconst b = i + 1;\n\t\t\t\tconst c = i + 2;\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst attribute = new ( arrayNeedsUint32( indices ) ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );\n\t\tattribute.version = version;\n\n\t\t// Updating index buffer in VAO now. See WebGLBindingStates\n\n\t\t//\n\n\t\tconst previousAttribute = wireframeAttributes.get( geometry );\n\n\t\tif ( previousAttribute ) attributes.remove( previousAttribute );\n\n\t\t//\n\n\t\twireframeAttributes.set( geometry, attribute );\n\n\t}\n\n\tfunction getWireframeAttribute( geometry ) {\n\n\t\tconst currentAttribute = wireframeAttributes.get( geometry );\n\n\t\tif ( currentAttribute ) {\n\n\t\t\tconst geometryIndex = geometry.index;\n\n\t\t\tif ( geometryIndex !== null ) {\n\n\t\t\t\t// if the attribute is obsolete, create a new one\n\n\t\t\t\tif ( currentAttribute.version < geometryIndex.version ) {\n\n\t\t\t\t\tupdateWireframeAttribute( geometry );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tupdateWireframeAttribute( geometry );\n\n\t\t}\n\n\t\treturn wireframeAttributes.get( geometry );\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tupdate: update,\n\n\t\tgetWireframeAttribute: getWireframeAttribute\n\n\t};\n\n}\n\n\nexport { WebGLGeometries };\n","function WebGLIndexedBufferRenderer( gl, extensions, info, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tlet mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tlet type, bytesPerElement;\n\n\tfunction setIndex( value ) {\n\n\t\ttype = value.type;\n\t\tbytesPerElement = value.bytesPerElement;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawElements( mode, count, type, start * bytesPerElement );\n\n\t\tinfo.update( count, mode, 1 );\n\n\t}\n\n\tfunction renderInstances( start, count, primcount ) {\n\n\t\tif ( primcount === 0 ) return;\n\n\t\tlet extension, methodName;\n\n\t\tif ( isWebGL2 ) {\n\n\t\t\textension = gl;\n\t\t\tmethodName = 'drawElementsInstanced';\n\n\t\t} else {\n\n\t\t\textension = extensions.get( 'ANGLE_instanced_arrays' );\n\t\t\tmethodName = 'drawElementsInstancedANGLE';\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\textension[ methodName ]( mode, count, type, start * bytesPerElement, primcount );\n\n\t\tinfo.update( count, mode, primcount );\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.setIndex = setIndex;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\n}\n\n\nexport { WebGLIndexedBufferRenderer };\n","function WebGLInfo( gl ) {\n\n\tconst memory = {\n\t\tgeometries: 0,\n\t\ttextures: 0\n\t};\n\n\tconst render = {\n\t\tframe: 0,\n\t\tcalls: 0,\n\t\ttriangles: 0,\n\t\tpoints: 0,\n\t\tlines: 0\n\t};\n\n\tfunction update( count, mode, instanceCount ) {\n\n\t\trender.calls ++;\n\n\t\tswitch ( mode ) {\n\n\t\t\tcase gl.TRIANGLES:\n\t\t\t\trender.triangles += instanceCount * ( count / 3 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINES:\n\t\t\t\trender.lines += instanceCount * ( count / 2 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINE_STRIP:\n\t\t\t\trender.lines += instanceCount * ( count - 1 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINE_LOOP:\n\t\t\t\trender.lines += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tcase gl.POINTS:\n\t\t\t\trender.points += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tconsole.error( 'THREE.WebGLInfo: Unknown draw mode:', mode );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\tfunction reset() {\n\n\t\trender.frame ++;\n\t\trender.calls = 0;\n\t\trender.triangles = 0;\n\t\trender.points = 0;\n\t\trender.lines = 0;\n\n\t}\n\n\treturn {\n\t\tmemory: memory,\n\t\trender: render,\n\t\tprograms: null,\n\t\tautoReset: true,\n\t\treset: reset,\n\t\tupdate: update\n\t};\n\n}\n\n\nexport { WebGLInfo };\n","import { Texture } from './Texture.js';\nimport { ClampToEdgeWrapping, NearestFilter } from '../constants.js';\n\nclass DataTexture2DArray extends Texture {\n\n\tconstructor( data = null, width = 1, height = 1, depth = 1 ) {\n\n\t\tsuper( null );\n\n\t\tthis.image = { data, width, height, depth };\n\n\t\tthis.magFilter = NearestFilter;\n\t\tthis.minFilter = NearestFilter;\n\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n}\n\nDataTexture2DArray.prototype.isDataTexture2DArray = true;\n\nexport { DataTexture2DArray };\n","import { FloatType, RGBAFormat } from '../../constants.js';\nimport { DataTexture2DArray } from '../../textures/DataTexture2DArray.js';\nimport { Vector3 } from '../../math/Vector3.js';\nimport { Vector2 } from '../../math/Vector2.js';\n\nfunction numericalSort( a, b ) {\n\n\treturn a[ 0 ] - b[ 0 ];\n\n}\n\nfunction absNumericalSort( a, b ) {\n\n\treturn Math.abs( b[ 1 ] ) - Math.abs( a[ 1 ] );\n\n}\n\nfunction denormalize( morph, attribute ) {\n\n\tlet denominator = 1;\n\tconst array = attribute.isInterleavedBufferAttribute ? attribute.data.array : attribute.array;\n\n\tif ( array instanceof Int8Array ) denominator = 127;\n\telse if ( array instanceof Int16Array ) denominator = 32767;\n\telse if ( array instanceof Int32Array ) denominator = 2147483647;\n\telse console.error( 'THREE.WebGLMorphtargets: Unsupported morph attribute data type: ', array );\n\n\tmorph.divideScalar( denominator );\n\n}\n\nfunction WebGLMorphtargets( gl, capabilities, textures ) {\n\n\tconst influencesList = {};\n\tconst morphInfluences = new Float32Array( 8 );\n\tconst morphTextures = new WeakMap();\n\tconst morph = new Vector3();\n\n\tconst workInfluences = [];\n\n\tfor ( let i = 0; i < 8; i ++ ) {\n\n\t\tworkInfluences[ i ] = [ i, 0 ];\n\n\t}\n\n\tfunction update( object, geometry, material, program ) {\n\n\t\tconst objectInfluences = object.morphTargetInfluences;\n\n\t\tif ( capabilities.isWebGL2 === true ) {\n\n\t\t\t// instead of using attributes, the WebGL 2 code path encodes morph targets\n\t\t\t// into an array of data textures. Each layer represents a single morph target.\n\n\t\t\tconst numberOfMorphTargets = geometry.morphAttributes.position.length;\n\n\t\t\tlet entry = morphTextures.get( geometry );\n\n\t\t\tif ( entry === undefined || entry.count !== numberOfMorphTargets ) {\n\n\t\t\t\tif ( entry !== undefined ) entry.texture.dispose();\n\n\t\t\t\tconst hasMorphNormals = geometry.morphAttributes.normal !== undefined;\n\n\t\t\t\tconst morphTargets = geometry.morphAttributes.position;\n\t\t\t\tconst morphNormals = geometry.morphAttributes.normal || [];\n\n\t\t\t\tconst numberOfVertices = geometry.attributes.position.count;\n\t\t\t\tconst numberOfVertexData = ( hasMorphNormals === true ) ? 2 : 1; // (v,n) vs. (v)\n\n\t\t\t\tlet width = numberOfVertices * numberOfVertexData;\n\t\t\t\tlet height = 1;\n\n\t\t\t\tif ( width > capabilities.maxTextureSize ) {\n\n\t\t\t\t\theight = Math.ceil( width / capabilities.maxTextureSize );\n\t\t\t\t\twidth = capabilities.maxTextureSize;\n\n\t\t\t\t}\n\n\t\t\t\tconst buffer = new Float32Array( width * height * 4 * numberOfMorphTargets );\n\n\t\t\t\tconst texture = new DataTexture2DArray( buffer, width, height, numberOfMorphTargets );\n\t\t\t\ttexture.format = RGBAFormat; // using RGBA since RGB might be emulated (and is thus slower)\n\t\t\t\ttexture.type = FloatType;\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t// fill buffer\n\n\t\t\t\tconst vertexDataStride = numberOfVertexData * 4;\n\n\t\t\t\tfor ( let i = 0; i < numberOfMorphTargets; i ++ ) {\n\n\t\t\t\t\tconst morphTarget = morphTargets[ i ];\n\t\t\t\t\tconst morphNormal = morphNormals[ i ];\n\n\t\t\t\t\tconst offset = width * height * 4 * i;\n\n\t\t\t\t\tfor ( let j = 0; j < morphTarget.count; j ++ ) {\n\n\t\t\t\t\t\tmorph.fromBufferAttribute( morphTarget, j );\n\n\t\t\t\t\t\tif ( morphTarget.normalized === true ) denormalize( morph, morphTarget );\n\n\t\t\t\t\t\tconst stride = j * vertexDataStride;\n\n\t\t\t\t\t\tbuffer[ offset + stride + 0 ] = morph.x;\n\t\t\t\t\t\tbuffer[ offset + stride + 1 ] = morph.y;\n\t\t\t\t\t\tbuffer[ offset + stride + 2 ] = morph.z;\n\t\t\t\t\t\tbuffer[ offset + stride + 3 ] = 0;\n\n\t\t\t\t\t\tif ( hasMorphNormals === true ) {\n\n\t\t\t\t\t\t\tmorph.fromBufferAttribute( morphNormal, j );\n\n\t\t\t\t\t\t\tif ( morphNormal.normalized === true ) denormalize( morph, morphNormal );\n\n\t\t\t\t\t\t\tbuffer[ offset + stride + 4 ] = morph.x;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 5 ] = morph.y;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 6 ] = morph.z;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 7 ] = 0;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tentry = {\n\t\t\t\t\tcount: numberOfMorphTargets,\n\t\t\t\t\ttexture: texture,\n\t\t\t\t\tsize: new Vector2( width, height )\n\t\t\t\t};\n\n\t\t\t\tmorphTextures.set( geometry, entry );\n\n\t\t\t\tfunction disposeTexture() {\n\n\t\t\t\t\ttexture.dispose();\n\n\t\t\t\t\tmorphTextures.delete( geometry );\n\n\t\t\t\t\tgeometry.removeEventListener( 'dispose', disposeTexture );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.addEventListener( 'dispose', disposeTexture );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tlet morphInfluencesSum = 0;\n\n\t\t\tfor ( let i = 0; i < objectInfluences.length; i ++ ) {\n\n\t\t\t\tmorphInfluencesSum += objectInfluences[ i ];\n\n\t\t\t}\n\n\t\t\tconst morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetBaseInfluence', morphBaseInfluence );\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetInfluences', objectInfluences );\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetsTexture', entry.texture, textures );\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetsTextureSize', entry.size );\n\n\n\t\t} else {\n\n\t\t\t// When object doesn't have morph target influences defined, we treat it as a 0-length array\n\t\t\t// This is important to make sure we set up morphTargetBaseInfluence / morphTargetInfluences\n\n\t\t\tconst length = objectInfluences === undefined ? 0 : objectInfluences.length;\n\n\t\t\tlet influences = influencesList[ geometry.id ];\n\n\t\t\tif ( influences === undefined || influences.length !== length ) {\n\n\t\t\t\t// initialise list\n\n\t\t\t\tinfluences = [];\n\n\t\t\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\t\t\tinfluences[ i ] = [ i, 0 ];\n\n\t\t\t\t}\n\n\t\t\t\tinfluencesList[ geometry.id ] = influences;\n\n\t\t\t}\n\n\t\t\t// Collect influences\n\n\t\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\t\tconst influence = influences[ i ];\n\n\t\t\t\tinfluence[ 0 ] = i;\n\t\t\t\tinfluence[ 1 ] = objectInfluences[ i ];\n\n\t\t\t}\n\n\t\t\tinfluences.sort( absNumericalSort );\n\n\t\t\tfor ( let i = 0; i < 8; i ++ ) {\n\n\t\t\t\tif ( i < length && influences[ i ][ 1 ] ) {\n\n\t\t\t\t\tworkInfluences[ i ][ 0 ] = influences[ i ][ 0 ];\n\t\t\t\t\tworkInfluences[ i ][ 1 ] = influences[ i ][ 1 ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tworkInfluences[ i ][ 0 ] = Number.MAX_SAFE_INTEGER;\n\t\t\t\t\tworkInfluences[ i ][ 1 ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tworkInfluences.sort( numericalSort );\n\n\t\t\tconst morphTargets = geometry.morphAttributes.position;\n\t\t\tconst morphNormals = geometry.morphAttributes.normal;\n\n\t\t\tlet morphInfluencesSum = 0;\n\n\t\t\tfor ( let i = 0; i < 8; i ++ ) {\n\n\t\t\t\tconst influence = workInfluences[ i ];\n\t\t\t\tconst index = influence[ 0 ];\n\t\t\t\tconst value = influence[ 1 ];\n\n\t\t\t\tif ( index !== Number.MAX_SAFE_INTEGER && value ) {\n\n\t\t\t\t\tif ( morphTargets && geometry.getAttribute( 'morphTarget' + i ) !== morphTargets[ index ] ) {\n\n\t\t\t\t\t\tgeometry.setAttribute( 'morphTarget' + i, morphTargets[ index ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( morphNormals && geometry.getAttribute( 'morphNormal' + i ) !== morphNormals[ index ] ) {\n\n\t\t\t\t\t\tgeometry.setAttribute( 'morphNormal' + i, morphNormals[ index ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tmorphInfluences[ i ] = value;\n\t\t\t\t\tmorphInfluencesSum += value;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( morphTargets && geometry.hasAttribute( 'morphTarget' + i ) === true ) {\n\n\t\t\t\t\t\tgeometry.deleteAttribute( 'morphTarget' + i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( morphNormals && geometry.hasAttribute( 'morphNormal' + i ) === true ) {\n\n\t\t\t\t\t\tgeometry.deleteAttribute( 'morphNormal' + i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tmorphInfluences[ i ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// GLSL shader uses formula baseinfluence * base + sum(target * influence)\n\t\t\t// This allows us to switch between absolute morphs and relative morphs without changing shader code\n\t\t\t// When baseinfluence = 1 - sum(influence), the above is equivalent to sum((target - base) * influence)\n\t\t\tconst morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetBaseInfluence', morphBaseInfluence );\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetInfluences', morphInfluences );\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\tupdate: update\n\n\t};\n\n}\n\n\nexport { WebGLMorphtargets };\n","import { WebGLRenderTarget } from './WebGLRenderTarget.js';\n\nclass WebGLMultisampleRenderTarget extends WebGLRenderTarget {\n\n\tconstructor( width, height, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\tthis.samples = 4;\n\n\t\tthis.ignoreDepthForMultisampleCopy = options.ignoreDepth !== undefined ? options.ignoreDepth : true;\n\t\tthis.useRenderToTexture = ( options.useRenderToTexture !== undefined ) ? options.useRenderToTexture : false;\n\t\tthis.useRenderbuffer = this.useRenderToTexture === false;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy.call( this, source );\n\n\t\tthis.samples = source.samples;\n\t\tthis.useRenderToTexture = source.useRenderToTexture;\n\t\tthis.useRenderbuffer = source.useRenderbuffer;\n\n\t\treturn this;\n\n\t}\n\n}\n\nWebGLMultisampleRenderTarget.prototype.isWebGLMultisampleRenderTarget = true;\n\nexport { WebGLMultisampleRenderTarget };\n","function WebGLObjects( gl, geometries, attributes, info ) {\n\n\tlet updateMap = new WeakMap();\n\n\tfunction update( object ) {\n\n\t\tconst frame = info.render.frame;\n\n\t\tconst geometry = object.geometry;\n\t\tconst buffergeometry = geometries.get( object, geometry );\n\n\t\t// Update once per frame\n\n\t\tif ( updateMap.get( buffergeometry ) !== frame ) {\n\n\t\t\tgeometries.update( buffergeometry );\n\n\t\t\tupdateMap.set( buffergeometry, frame );\n\n\t\t}\n\n\t\tif ( object.isInstancedMesh ) {\n\n\t\t\tif ( object.hasEventListener( 'dispose', onInstancedMeshDispose ) === false ) {\n\n\t\t\t\tobject.addEventListener( 'dispose', onInstancedMeshDispose );\n\n\t\t\t}\n\n\t\t\tattributes.update( object.instanceMatrix, gl.ARRAY_BUFFER );\n\n\t\t\tif ( object.instanceColor !== null ) {\n\n\t\t\t\tattributes.update( object.instanceColor, gl.ARRAY_BUFFER );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn buffergeometry;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tupdateMap = new WeakMap();\n\n\t}\n\n\tfunction onInstancedMeshDispose( event ) {\n\n\t\tconst instancedMesh = event.target;\n\n\t\tinstancedMesh.removeEventListener( 'dispose', onInstancedMeshDispose );\n\n\t\tattributes.remove( instancedMesh.instanceMatrix );\n\n\t\tif ( instancedMesh.instanceColor !== null ) attributes.remove( instancedMesh.instanceColor );\n\n\t}\n\n\treturn {\n\n\t\tupdate: update,\n\t\tdispose: dispose\n\n\t};\n\n}\n\n\nexport { WebGLObjects };\n","import { Texture } from './Texture.js';\nimport { ClampToEdgeWrapping, NearestFilter } from '../constants.js';\n\nclass DataTexture3D extends Texture {\n\n\tconstructor( data = null, width = 1, height = 1, depth = 1 ) {\n\n\t\t// We're going to add .setXXX() methods for setting properties later.\n\t\t// Users can still set in DataTexture3D directly.\n\t\t//\n\t\t//\tconst texture = new THREE.DataTexture3D( data, width, height, depth );\n\t\t// \ttexture.anisotropy = 16;\n\t\t//\n\t\t// See #14839\n\n\t\tsuper( null );\n\n\t\tthis.image = { data, width, height, depth };\n\n\t\tthis.magFilter = NearestFilter;\n\t\tthis.minFilter = NearestFilter;\n\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n}\n\nDataTexture3D.prototype.isDataTexture3D = true;\n\nexport { DataTexture3D };\n","/**\n * Uniforms of a program.\n * Those form a tree structure with a special top-level container for the root,\n * which you get by calling 'new WebGLUniforms( gl, program )'.\n *\n *\n * Properties of inner nodes including the top-level container:\n *\n * .seq - array of nested uniforms\n * .map - nested uniforms by name\n *\n *\n * Methods of all nodes except the top-level container:\n *\n * .setValue( gl, value, [textures] )\n *\n * \t\tuploads a uniform value(s)\n * \tthe 'textures' parameter is needed for sampler uniforms\n *\n *\n * Static methods of the top-level container (textures factorizations):\n *\n * .upload( gl, seq, values, textures )\n *\n * \t\tsets uniforms in 'seq' to 'values[id].value'\n *\n * .seqWithValue( seq, values ) : filteredSeq\n *\n * \t\tfilters 'seq' entries with corresponding entry in values\n *\n *\n * Methods of the top-level container (textures factorizations):\n *\n * .setValue( gl, name, value, textures )\n *\n * \t\tsets uniform with name 'name' to 'value'\n *\n * .setOptional( gl, obj, prop )\n *\n * \t\tlike .set for an optional property of the object\n *\n */\n\nimport { CubeTexture } from '../../textures/CubeTexture.js';\nimport { Texture } from '../../textures/Texture.js';\nimport { DataTexture2DArray } from '../../textures/DataTexture2DArray.js';\nimport { DataTexture3D } from '../../textures/DataTexture3D.js';\n\nconst emptyTexture = new Texture();\nconst emptyTexture2dArray = new DataTexture2DArray();\nconst emptyTexture3d = new DataTexture3D();\nconst emptyCubeTexture = new CubeTexture();\n\n// --- Utilities ---\n\n// Array Caches (provide typed arrays for temporary by size)\n\nconst arrayCacheF32 = [];\nconst arrayCacheI32 = [];\n\n// Float32Array caches used for uploading Matrix uniforms\n\nconst mat4array = new Float32Array( 16 );\nconst mat3array = new Float32Array( 9 );\nconst mat2array = new Float32Array( 4 );\n\n// Flattening for arrays of vectors and matrices\n\nfunction flatten( array, nBlocks, blockSize ) {\n\n\tconst firstElem = array[ 0 ];\n\n\tif ( firstElem <= 0 || firstElem > 0 ) return array;\n\t// unoptimized: ! isNaN( firstElem )\n\t// see http://jacksondunstan.com/articles/983\n\n\tconst n = nBlocks * blockSize;\n\tlet r = arrayCacheF32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Float32Array( n );\n\t\tarrayCacheF32[ n ] = r;\n\n\t}\n\n\tif ( nBlocks !== 0 ) {\n\n\t\tfirstElem.toArray( r, 0 );\n\n\t\tfor ( let i = 1, offset = 0; i !== nBlocks; ++ i ) {\n\n\t\t\toffset += blockSize;\n\t\t\tarray[ i ].toArray( r, offset );\n\n\t\t}\n\n\t}\n\n\treturn r;\n\n}\n\nfunction arraysEqual( a, b ) {\n\n\tif ( a.length !== b.length ) return false;\n\n\tfor ( let i = 0, l = a.length; i < l; i ++ ) {\n\n\t\tif ( a[ i ] !== b[ i ] ) return false;\n\n\t}\n\n\treturn true;\n\n}\n\nfunction copyArray( a, b ) {\n\n\tfor ( let i = 0, l = b.length; i < l; i ++ ) {\n\n\t\ta[ i ] = b[ i ];\n\n\t}\n\n}\n\n// Texture unit allocation\n\nfunction allocTexUnits( textures, n ) {\n\n\tlet r = arrayCacheI32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Int32Array( n );\n\t\tarrayCacheI32[ n ] = r;\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\tr[ i ] = textures.allocateTextureUnit();\n\n\t}\n\n\treturn r;\n\n}\n\n// --- Setters ---\n\n// Note: Defining these methods externally, because they come in a bunch\n// and this way their names minify.\n\n// Single scalar\n\nfunction setValueV1f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1f( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single float vector (from flat array or THREE.VectorN)\n\nfunction setValueV2f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2f( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3f( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else if ( v.r !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.r || cache[ 1 ] !== v.g || cache[ 2 ] !== v.b ) {\n\n\t\t\tgl.uniform3f( this.addr, v.r, v.g, v.b );\n\n\t\t\tcache[ 0 ] = v.r;\n\t\t\tcache[ 1 ] = v.g;\n\t\t\tcache[ 2 ] = v.b;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4f( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n// Single matrix (from flat array or THREE.MatrixN)\n\nfunction setValueM2( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix2fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat2array.set( elements );\n\n\t\tgl.uniformMatrix2fv( this.addr, false, mat2array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValueM3( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix3fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat3array.set( elements );\n\n\t\tgl.uniformMatrix3fv( this.addr, false, mat3array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValueM4( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix4fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat4array.set( elements );\n\n\t\tgl.uniformMatrix4fv( this.addr, false, mat4array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\n// Single integer / boolean\n\nfunction setValueV1i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1i( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single integer / boolean vector (from flat array)\n\nfunction setValueV2i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform2iv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\nfunction setValueV3i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform3iv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\nfunction setValueV4i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform4iv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\n// Single unsigned integer\n\nfunction setValueV1ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1ui( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single unsigned integer vector (from flat array)\n\nfunction setValueV2ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform2uiv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\nfunction setValueV3ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform3uiv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\nfunction setValueV4ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform4uiv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\n\n// Single texture (2D / Cube)\n\nfunction setValueT1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.safeSetTexture2D( v || emptyTexture, unit );\n\n}\n\nfunction setValueT3D1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture3D( v || emptyTexture3d, unit );\n\n}\n\nfunction setValueT6( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.safeSetTextureCube( v || emptyCubeTexture, unit );\n\n}\n\nfunction setValueT2DArray1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture2DArray( v || emptyTexture2dArray, unit );\n\n}\n\n// Helper to pick the right setter for the singular case\n\nfunction getSingularSetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValueV1f; // FLOAT\n\t\tcase 0x8b50: return setValueV2f; // _VEC2\n\t\tcase 0x8b51: return setValueV3f; // _VEC3\n\t\tcase 0x8b52: return setValueV4f; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2; // _MAT2\n\t\tcase 0x8b5b: return setValueM3; // _MAT3\n\t\tcase 0x8b5c: return setValueM4; // _MAT4\n\n\t\tcase 0x1404: case 0x8b56: return setValueV1i; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValueV2i; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValueV3i; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValueV4i; // _VEC4\n\n\t\tcase 0x1405: return setValueV1ui; // UINT\n\t\tcase 0x8dc6: return setValueV2ui; // _VEC2\n\t\tcase 0x8dc7: return setValueV3ui; // _VEC3\n\t\tcase 0x8dc8: return setValueV4ui; // _VEC4\n\n\t\tcase 0x8b5e: // SAMPLER_2D\n\t\tcase 0x8d66: // SAMPLER_EXTERNAL_OES\n\t\tcase 0x8dca: // INT_SAMPLER_2D\n\t\tcase 0x8dd2: // UNSIGNED_INT_SAMPLER_2D\n\t\tcase 0x8b62: // SAMPLER_2D_SHADOW\n\t\t\treturn setValueT1;\n\n\t\tcase 0x8b5f: // SAMPLER_3D\n\t\tcase 0x8dcb: // INT_SAMPLER_3D\n\t\tcase 0x8dd3: // UNSIGNED_INT_SAMPLER_3D\n\t\t\treturn setValueT3D1;\n\n\t\tcase 0x8b60: // SAMPLER_CUBE\n\t\tcase 0x8dcc: // INT_SAMPLER_CUBE\n\t\tcase 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE\n\t\tcase 0x8dc5: // SAMPLER_CUBE_SHADOW\n\t\t\treturn setValueT6;\n\n\t\tcase 0x8dc1: // SAMPLER_2D_ARRAY\n\t\tcase 0x8dcf: // INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW\n\t\t\treturn setValueT2DArray1;\n\n\t}\n\n}\n\n\n// Array of scalars\n\nfunction setValueV1fArray( gl, v ) {\n\n\tgl.uniform1fv( this.addr, v );\n\n}\n\n// Array of vectors (from flat array or array of THREE.VectorN)\n\nfunction setValueV2fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 2 );\n\n\tgl.uniform2fv( this.addr, data );\n\n}\n\nfunction setValueV3fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 3 );\n\n\tgl.uniform3fv( this.addr, data );\n\n}\n\nfunction setValueV4fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 4 );\n\n\tgl.uniform4fv( this.addr, data );\n\n}\n\n// Array of matrices (from flat array or array of THREE.MatrixN)\n\nfunction setValueM2Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 4 );\n\n\tgl.uniformMatrix2fv( this.addr, false, data );\n\n}\n\nfunction setValueM3Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 9 );\n\n\tgl.uniformMatrix3fv( this.addr, false, data );\n\n}\n\nfunction setValueM4Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 16 );\n\n\tgl.uniformMatrix4fv( this.addr, false, data );\n\n}\n\n// Array of integer / boolean\n\nfunction setValueV1iArray( gl, v ) {\n\n\tgl.uniform1iv( this.addr, v );\n\n}\n\n// Array of integer / boolean vectors (from flat array)\n\nfunction setValueV2iArray( gl, v ) {\n\n\tgl.uniform2iv( this.addr, v );\n\n}\n\nfunction setValueV3iArray( gl, v ) {\n\n\tgl.uniform3iv( this.addr, v );\n\n}\n\nfunction setValueV4iArray( gl, v ) {\n\n\tgl.uniform4iv( this.addr, v );\n\n}\n\n// Array of unsigned integer\n\nfunction setValueV1uiArray( gl, v ) {\n\n\tgl.uniform1uiv( this.addr, v );\n\n}\n\n// Array of unsigned integer vectors (from flat array)\n\nfunction setValueV2uiArray( gl, v ) {\n\n\tgl.uniform2uiv( this.addr, v );\n\n}\n\nfunction setValueV3uiArray( gl, v ) {\n\n\tgl.uniform3uiv( this.addr, v );\n\n}\n\nfunction setValueV4uiArray( gl, v ) {\n\n\tgl.uniform4uiv( this.addr, v );\n\n}\n\n\n// Array of textures (2D / 3D / Cube / 2DArray)\n\nfunction setValueT1Array( gl, v, textures ) {\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tgl.uniform1iv( this.addr, units );\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.safeSetTexture2D( v[ i ] || emptyTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT3DArray( gl, v, textures ) {\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tgl.uniform1iv( this.addr, units );\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture3D( v[ i ] || emptyTexture3d, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT6Array( gl, v, textures ) {\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tgl.uniform1iv( this.addr, units );\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.safeSetTextureCube( v[ i ] || emptyCubeTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT2DArrayArray( gl, v, textures ) {\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tgl.uniform1iv( this.addr, units );\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture2DArray( v[ i ] || emptyTexture2dArray, units[ i ] );\n\n\t}\n\n}\n\n\n// Helper to pick the right setter for a pure (bottom-level) array\n\nfunction getPureArraySetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValueV1fArray; // FLOAT\n\t\tcase 0x8b50: return setValueV2fArray; // _VEC2\n\t\tcase 0x8b51: return setValueV3fArray; // _VEC3\n\t\tcase 0x8b52: return setValueV4fArray; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2Array; // _MAT2\n\t\tcase 0x8b5b: return setValueM3Array; // _MAT3\n\t\tcase 0x8b5c: return setValueM4Array; // _MAT4\n\n\t\tcase 0x1404: case 0x8b56: return setValueV1iArray; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValueV2iArray; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValueV3iArray; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValueV4iArray; // _VEC4\n\n\t\tcase 0x1405: return setValueV1uiArray; // UINT\n\t\tcase 0x8dc6: return setValueV2uiArray; // _VEC2\n\t\tcase 0x8dc7: return setValueV3uiArray; // _VEC3\n\t\tcase 0x8dc8: return setValueV4uiArray; // _VEC4\n\n\t\tcase 0x8b5e: // SAMPLER_2D\n\t\tcase 0x8d66: // SAMPLER_EXTERNAL_OES\n\t\tcase 0x8dca: // INT_SAMPLER_2D\n\t\tcase 0x8dd2: // UNSIGNED_INT_SAMPLER_2D\n\t\tcase 0x8b62: // SAMPLER_2D_SHADOW\n\t\t\treturn setValueT1Array;\n\n\t\tcase 0x8b5f: // SAMPLER_3D\n\t\tcase 0x8dcb: // INT_SAMPLER_3D\n\t\tcase 0x8dd3: // UNSIGNED_INT_SAMPLER_3D\n\t\t\treturn setValueT3DArray;\n\n\t\tcase 0x8b60: // SAMPLER_CUBE\n\t\tcase 0x8dcc: // INT_SAMPLER_CUBE\n\t\tcase 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE\n\t\tcase 0x8dc5: // SAMPLER_CUBE_SHADOW\n\t\t\treturn setValueT6Array;\n\n\t\tcase 0x8dc1: // SAMPLER_2D_ARRAY\n\t\tcase 0x8dcf: // INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW\n\t\t\treturn setValueT2DArrayArray;\n\n\t}\n\n}\n\n// --- Uniform Classes ---\n\nfunction SingleUniform( id, activeInfo, addr ) {\n\n\tthis.id = id;\n\tthis.addr = addr;\n\tthis.cache = [];\n\tthis.setValue = getSingularSetter( activeInfo.type );\n\n\t// this.path = activeInfo.name; // DEBUG\n\n}\n\nfunction PureArrayUniform( id, activeInfo, addr ) {\n\n\tthis.id = id;\n\tthis.addr = addr;\n\tthis.cache = [];\n\tthis.size = activeInfo.size;\n\tthis.setValue = getPureArraySetter( activeInfo.type );\n\n\t// this.path = activeInfo.name; // DEBUG\n\n}\n\nPureArrayUniform.prototype.updateCache = function ( data ) {\n\n\tconst cache = this.cache;\n\n\tif ( data instanceof Float32Array && cache.length !== data.length ) {\n\n\t\tthis.cache = new Float32Array( data.length );\n\n\t}\n\n\tcopyArray( cache, data );\n\n};\n\nfunction StructuredUniform( id ) {\n\n\tthis.id = id;\n\n\tthis.seq = [];\n\tthis.map = {};\n\n}\n\nStructuredUniform.prototype.setValue = function ( gl, value, textures ) {\n\n\tconst seq = this.seq;\n\n\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\tconst u = seq[ i ];\n\t\tu.setValue( gl, value[ u.id ], textures );\n\n\t}\n\n};\n\n// --- Top-level ---\n\n// Parser - builds up the property tree from the path strings\n\nconst RePathPart = /(\\w+)(\\])?(\\[|\\.)?/g;\n\n// extracts\n// \t- the identifier (member name or array index)\n// - followed by an optional right bracket (found when array index)\n// - followed by an optional left bracket or dot (type of subscript)\n//\n// Note: These portions can be read in a non-overlapping fashion and\n// allow straightforward parsing of the hierarchy that WebGL encodes\n// in the uniform names.\n\nfunction addUniform( container, uniformObject ) {\n\n\tcontainer.seq.push( uniformObject );\n\tcontainer.map[ uniformObject.id ] = uniformObject;\n\n}\n\nfunction parseUniform( activeInfo, addr, container ) {\n\n\tconst path = activeInfo.name,\n\t\tpathLength = path.length;\n\n\t// reset RegExp object, because of the early exit of a previous run\n\tRePathPart.lastIndex = 0;\n\n\twhile ( true ) {\n\n\t\tconst match = RePathPart.exec( path ),\n\t\t\tmatchEnd = RePathPart.lastIndex;\n\n\t\tlet id = match[ 1 ];\n\t\tconst idIsIndex = match[ 2 ] === ']',\n\t\t\tsubscript = match[ 3 ];\n\n\t\tif ( idIsIndex ) id = id | 0; // convert to integer\n\n\t\tif ( subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength ) {\n\n\t\t\t// bare name or \"pure\" bottom-level array \"[0]\" suffix\n\n\t\t\taddUniform( container, subscript === undefined ?\n\t\t\t\tnew SingleUniform( id, activeInfo, addr ) :\n\t\t\t\tnew PureArrayUniform( id, activeInfo, addr ) );\n\n\t\t\tbreak;\n\n\t\t} else {\n\n\t\t\t// step into inner node / create it in case it doesn't exist\n\n\t\t\tconst map = container.map;\n\t\t\tlet next = map[ id ];\n\n\t\t\tif ( next === undefined ) {\n\n\t\t\t\tnext = new StructuredUniform( id );\n\t\t\t\taddUniform( container, next );\n\n\t\t\t}\n\n\t\t\tcontainer = next;\n\n\t\t}\n\n\t}\n\n}\n\n// Root Container\n\nfunction WebGLUniforms( gl, program ) {\n\n\tthis.seq = [];\n\tthis.map = {};\n\n\tconst n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS );\n\n\tfor ( let i = 0; i < n; ++ i ) {\n\n\t\tconst info = gl.getActiveUniform( program, i ),\n\t\t\taddr = gl.getUniformLocation( program, info.name );\n\n\t\tparseUniform( info, addr, this );\n\n\t}\n\n}\n\nWebGLUniforms.prototype.setValue = function ( gl, name, value, textures ) {\n\n\tconst u = this.map[ name ];\n\n\tif ( u !== undefined ) u.setValue( gl, value, textures );\n\n};\n\nWebGLUniforms.prototype.setOptional = function ( gl, object, name ) {\n\n\tconst v = object[ name ];\n\n\tif ( v !== undefined ) this.setValue( gl, name, v );\n\n};\n\n\n// Static interface\n\nWebGLUniforms.upload = function ( gl, seq, values, textures ) {\n\n\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\tconst u = seq[ i ],\n\t\t\tv = values[ u.id ];\n\n\t\tif ( v.needsUpdate !== false ) {\n\n\t\t\t// note: always updating when .needsUpdate is undefined\n\t\t\tu.setValue( gl, v.value, textures );\n\n\t\t}\n\n\t}\n\n};\n\nWebGLUniforms.seqWithValue = function ( seq, values ) {\n\n\tconst r = [];\n\n\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\tconst u = seq[ i ];\n\t\tif ( u.id in values ) r.push( u );\n\n\t}\n\n\treturn r;\n\n};\n\nexport { WebGLUniforms };\n","function WebGLShader( gl, type, string ) {\n\n\tconst shader = gl.createShader( type );\n\n\tgl.shaderSource( shader, string );\n\tgl.compileShader( shader );\n\n\treturn shader;\n\n}\n\nexport { WebGLShader };\n","import { WebGLUniforms } from './WebGLUniforms.js';\nimport { WebGLShader } from './WebGLShader.js';\nimport { ShaderChunk } from '../shaders/ShaderChunk.js';\nimport { NoToneMapping, AddOperation, MixOperation, MultiplyOperation, CubeRefractionMapping, CubeUVRefractionMapping, CubeUVReflectionMapping, CubeReflectionMapping, PCFSoftShadowMap, PCFShadowMap, VSMShadowMap, ACESFilmicToneMapping, CineonToneMapping, CustomToneMapping, ReinhardToneMapping, LinearToneMapping, sRGBEncoding, LinearEncoding, GLSL3 } from '../../constants.js';\n\nlet programIdCount = 0;\n\nfunction addLineNumbers( string ) {\n\n\tconst lines = string.split( '\\n' );\n\n\tfor ( let i = 0; i < lines.length; i ++ ) {\n\n\t\tlines[ i ] = ( i + 1 ) + ': ' + lines[ i ];\n\n\t}\n\n\treturn lines.join( '\\n' );\n\n}\n\nfunction getEncodingComponents( encoding ) {\n\n\tswitch ( encoding ) {\n\n\t\tcase LinearEncoding:\n\t\t\treturn [ 'Linear', '( value )' ];\n\t\tcase sRGBEncoding:\n\t\t\treturn [ 'sRGB', '( value )' ];\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.WebGLProgram: Unsupported encoding:', encoding );\n\t\t\treturn [ 'Linear', '( value )' ];\n\n\t}\n\n}\n\nfunction getShaderErrors( gl, shader, type ) {\n\n\tconst status = gl.getShaderParameter( shader, gl.COMPILE_STATUS );\n\tconst errors = gl.getShaderInfoLog( shader ).trim();\n\n\tif ( status && errors === '' ) return '';\n\n\t// --enable-privileged-webgl-extension\n\t// console.log( '**' + type + '**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );\n\n\treturn type.toUpperCase() + '\\n\\n' + errors + '\\n\\n' + addLineNumbers( gl.getShaderSource( shader ) );\n\n}\n\nfunction getTexelEncodingFunction( functionName, encoding ) {\n\n\tconst components = getEncodingComponents( encoding );\n\treturn 'vec4 ' + functionName + '( vec4 value ) { return LinearTo' + components[ 0 ] + components[ 1 ] + '; }';\n\n}\n\nfunction getToneMappingFunction( functionName, toneMapping ) {\n\n\tlet toneMappingName;\n\n\tswitch ( toneMapping ) {\n\n\t\tcase LinearToneMapping:\n\t\t\ttoneMappingName = 'Linear';\n\t\t\tbreak;\n\n\t\tcase ReinhardToneMapping:\n\t\t\ttoneMappingName = 'Reinhard';\n\t\t\tbreak;\n\n\t\tcase CineonToneMapping:\n\t\t\ttoneMappingName = 'OptimizedCineon';\n\t\t\tbreak;\n\n\t\tcase ACESFilmicToneMapping:\n\t\t\ttoneMappingName = 'ACESFilmic';\n\t\t\tbreak;\n\n\t\tcase CustomToneMapping:\n\t\t\ttoneMappingName = 'Custom';\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.WebGLProgram: Unsupported toneMapping:', toneMapping );\n\t\t\ttoneMappingName = 'Linear';\n\n\t}\n\n\treturn 'vec3 ' + functionName + '( vec3 color ) { return ' + toneMappingName + 'ToneMapping( color ); }';\n\n}\n\nfunction generateExtensions( parameters ) {\n\n\tconst chunks = [\n\t\t( parameters.extensionDerivatives || parameters.envMapCubeUV || parameters.bumpMap || parameters.tangentSpaceNormalMap || parameters.clearcoatNormalMap || parameters.flatShading || parameters.shaderID === 'physical' ) ? '#extension GL_OES_standard_derivatives : enable' : '',\n\t\t( parameters.extensionFragDepth || parameters.logarithmicDepthBuffer ) && parameters.rendererExtensionFragDepth ? '#extension GL_EXT_frag_depth : enable' : '',\n\t\t( parameters.extensionDrawBuffers && parameters.rendererExtensionDrawBuffers ) ? '#extension GL_EXT_draw_buffers : require' : '',\n\t\t( parameters.extensionShaderTextureLOD || parameters.envMap || parameters.transmission ) && parameters.rendererExtensionShaderTextureLod ? '#extension GL_EXT_shader_texture_lod : enable' : ''\n\t];\n\n\treturn chunks.filter( filterEmptyLine ).join( '\\n' );\n\n}\n\nfunction generateDefines( defines ) {\n\n\tconst chunks = [];\n\n\tfor ( const name in defines ) {\n\n\t\tconst value = defines[ name ];\n\n\t\tif ( value === false ) continue;\n\n\t\tchunks.push( '#define ' + name + ' ' + value );\n\n\t}\n\n\treturn chunks.join( '\\n' );\n\n}\n\nfunction fetchAttributeLocations( gl, program ) {\n\n\tconst attributes = {};\n\n\tconst n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES );\n\n\tfor ( let i = 0; i < n; i ++ ) {\n\n\t\tconst info = gl.getActiveAttrib( program, i );\n\t\tconst name = info.name;\n\n\t\tlet locationSize = 1;\n\t\tif ( info.type === gl.FLOAT_MAT2 ) locationSize = 2;\n\t\tif ( info.type === gl.FLOAT_MAT3 ) locationSize = 3;\n\t\tif ( info.type === gl.FLOAT_MAT4 ) locationSize = 4;\n\n\t\t// console.log( 'THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:', name, i );\n\n\t\tattributes[ name ] = {\n\t\t\ttype: info.type,\n\t\t\tlocation: gl.getAttribLocation( program, name ),\n\t\t\tlocationSize: locationSize\n\t\t};\n\n\t}\n\n\treturn attributes;\n\n}\n\nfunction filterEmptyLine( string ) {\n\n\treturn string !== '';\n\n}\n\nfunction replaceLightNums( string, parameters ) {\n\n\treturn string\n\t\t.replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights )\n\t\t.replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights )\n\t\t.replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights )\n\t\t.replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights )\n\t\t.replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights )\n\t\t.replace( /NUM_DIR_LIGHT_SHADOWS/g, parameters.numDirLightShadows )\n\t\t.replace( /NUM_SPOT_LIGHT_SHADOWS/g, parameters.numSpotLightShadows )\n\t\t.replace( /NUM_POINT_LIGHT_SHADOWS/g, parameters.numPointLightShadows );\n\n}\n\nfunction replaceClippingPlaneNums( string, parameters ) {\n\n\treturn string\n\t\t.replace( /NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes )\n\t\t.replace( /UNION_CLIPPING_PLANES/g, ( parameters.numClippingPlanes - parameters.numClipIntersection ) );\n\n}\n\n// Resolve Includes\n\nconst includePattern = /^[ \\t]*#include +<([\\w\\d./]+)>/gm;\n\nfunction resolveIncludes( string ) {\n\n\treturn string.replace( includePattern, includeReplacer );\n\n}\n\nfunction includeReplacer( match, include ) {\n\n\tconst string = ShaderChunk[ include ];\n\n\tif ( string === undefined ) {\n\n\t\tthrow new Error( 'Can not resolve #include <' + include + '>' );\n\n\t}\n\n\treturn resolveIncludes( string );\n\n}\n\n// Unroll Loops\n\nconst deprecatedUnrollLoopPattern = /#pragma unroll_loop[\\s]+?for \\( int i \\= (\\d+)\\; i < (\\d+)\\; i \\+\\+ \\) \\{([\\s\\S]+?)(?=\\})\\}/g;\nconst unrollLoopPattern = /#pragma unroll_loop_start\\s+for\\s*\\(\\s*int\\s+i\\s*=\\s*(\\d+)\\s*;\\s*i\\s*<\\s*(\\d+)\\s*;\\s*i\\s*\\+\\+\\s*\\)\\s*{([\\s\\S]+?)}\\s+#pragma unroll_loop_end/g;\n\nfunction unrollLoops( string ) {\n\n\treturn string\n\t\t.replace( unrollLoopPattern, loopReplacer )\n\t\t.replace( deprecatedUnrollLoopPattern, deprecatedLoopReplacer );\n\n}\n\nfunction deprecatedLoopReplacer( match, start, end, snippet ) {\n\n\tconsole.warn( 'WebGLProgram: #pragma unroll_loop shader syntax is deprecated. Please use #pragma unroll_loop_start syntax instead.' );\n\treturn loopReplacer( match, start, end, snippet );\n\n}\n\nfunction loopReplacer( match, start, end, snippet ) {\n\n\tlet string = '';\n\n\tfor ( let i = parseInt( start ); i < parseInt( end ); i ++ ) {\n\n\t\tstring += snippet\n\t\t\t.replace( /\\[\\s*i\\s*\\]/g, '[ ' + i + ' ]' )\n\t\t\t.replace( /UNROLLED_LOOP_INDEX/g, i );\n\n\t}\n\n\treturn string;\n\n}\n\n//\n\nfunction generatePrecision( parameters ) {\n\n\tlet precisionstring = 'precision ' + parameters.precision + ' float;\\nprecision ' + parameters.precision + ' int;';\n\n\tif ( parameters.precision === 'highp' ) {\n\n\t\tprecisionstring += '\\n#define HIGH_PRECISION';\n\n\t} else if ( parameters.precision === 'mediump' ) {\n\n\t\tprecisionstring += '\\n#define MEDIUM_PRECISION';\n\n\t} else if ( parameters.precision === 'lowp' ) {\n\n\t\tprecisionstring += '\\n#define LOW_PRECISION';\n\n\t}\n\n\treturn precisionstring;\n\n}\n\nfunction generateShadowMapTypeDefine( parameters ) {\n\n\tlet shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC';\n\n\tif ( parameters.shadowMapType === PCFShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF';\n\n\t} else if ( parameters.shadowMapType === PCFSoftShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT';\n\n\t} else if ( parameters.shadowMapType === VSMShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_VSM';\n\n\t}\n\n\treturn shadowMapTypeDefine;\n\n}\n\nfunction generateEnvMapTypeDefine( parameters ) {\n\n\tlet envMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.envMapMode ) {\n\n\t\t\tcase CubeReflectionMapping:\n\t\t\tcase CubeRefractionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\t\t\tbreak;\n\n\t\t\tcase CubeUVReflectionMapping:\n\t\t\tcase CubeUVRefractionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapTypeDefine;\n\n}\n\nfunction generateEnvMapModeDefine( parameters ) {\n\n\tlet envMapModeDefine = 'ENVMAP_MODE_REFLECTION';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.envMapMode ) {\n\n\t\t\tcase CubeRefractionMapping:\n\t\t\tcase CubeUVRefractionMapping:\n\n\t\t\t\tenvMapModeDefine = 'ENVMAP_MODE_REFRACTION';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapModeDefine;\n\n}\n\nfunction generateEnvMapBlendingDefine( parameters ) {\n\n\tlet envMapBlendingDefine = 'ENVMAP_BLENDING_NONE';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.combine ) {\n\n\t\t\tcase MultiplyOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\t\t\t\tbreak;\n\n\t\t\tcase MixOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MIX';\n\t\t\t\tbreak;\n\n\t\t\tcase AddOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_ADD';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapBlendingDefine;\n\n}\n\nfunction WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {\n\n\t// TODO Send this event to Three.js DevTools\n\t// console.log( 'WebGLProgram', cacheKey );\n\n\tconst gl = renderer.getContext();\n\n\tconst defines = parameters.defines;\n\n\tlet vertexShader = parameters.vertexShader;\n\tlet fragmentShader = parameters.fragmentShader;\n\n\tconst shadowMapTypeDefine = generateShadowMapTypeDefine( parameters );\n\tconst envMapTypeDefine = generateEnvMapTypeDefine( parameters );\n\tconst envMapModeDefine = generateEnvMapModeDefine( parameters );\n\tconst envMapBlendingDefine = generateEnvMapBlendingDefine( parameters );\n\n\tconst customExtensions = parameters.isWebGL2 ? '' : generateExtensions( parameters );\n\n\tconst customDefines = generateDefines( defines );\n\n\tconst program = gl.createProgram();\n\n\tlet prefixVertex, prefixFragment;\n\tlet versionString = parameters.glslVersion ? '#version ' + parameters.glslVersion + '\\n' : '';\n\n\tif ( parameters.isRawShaderMaterial ) {\n\n\t\tprefixVertex = [\n\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixVertex.length > 0 ) {\n\n\t\t\tprefixVertex += '\\n';\n\n\t\t}\n\n\t\tprefixFragment = [\n\n\t\t\tcustomExtensions,\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixFragment.length > 0 ) {\n\n\t\t\tprefixFragment += '\\n';\n\n\t\t}\n\n\t} else {\n\n\t\tprefixVertex = [\n\n\t\t\tgeneratePrecision( parameters ),\n\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines,\n\n\t\t\tparameters.instancing ? '#define USE_INSTANCING' : '',\n\t\t\tparameters.instancingColor ? '#define USE_INSTANCING_COLOR' : '',\n\n\t\t\tparameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '',\n\n\t\t\t'#define MAX_BONES ' + parameters.maxBones,\n\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t( parameters.useFog && parameters.fogExp2 ) ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t( parameters.normalMap && parameters.objectSpaceNormalMap ) ? '#define OBJECTSPACE_NORMALMAP' : '',\n\t\t\t( parameters.normalMap && parameters.tangentSpaceNormalMap ) ? '#define TANGENTSPACE_NORMALMAP' : '',\n\n\t\t\tparameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',\n\t\t\tparameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',\n\t\t\tparameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',\n\n\t\t\tparameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '',\n\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.specularIntensityMap ? '#define USE_SPECULARINTENSITYMAP' : '',\n\t\t\tparameters.specularColorMap ? '#define USE_SPECULARCOLORMAP' : '',\n\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\n\t\t\tparameters.transmission ? '#define USE_TRANSMISSION' : '',\n\t\t\tparameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',\n\t\t\tparameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',\n\n\t\t\tparameters.sheenColorMap ? '#define USE_SHEENCOLORMAP' : '',\n\t\t\tparameters.sheenRoughnessMap ? '#define USE_SHEENROUGHNESSMAP' : '',\n\n\t\t\tparameters.vertexTangents ? '#define USE_TANGENT' : '',\n\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\t\t\tparameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '',\n\t\t\tparameters.vertexUvs ? '#define USE_UV' : '',\n\t\t\tparameters.uvsVertexOnly ? '#define UVS_VERTEX_ONLY' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.skinning ? '#define USE_SKINNING' : '',\n\t\t\tparameters.useVertexTexture ? '#define BONE_TEXTURE' : '',\n\n\t\t\tparameters.morphTargets ? '#define USE_MORPHTARGETS' : '',\n\t\t\tparameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',\n\t\t\t( parameters.morphTargets && parameters.isWebGL2 ) ? '#define MORPHTARGETS_TEXTURE' : '',\n\t\t\t( parameters.morphTargets && parameters.isWebGL2 ) ? '#define MORPHTARGETS_COUNT ' + parameters.morphTargetsCount : '',\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t( parameters.logarithmicDepthBuffer && parameters.rendererExtensionFragDepth ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t'uniform mat4 modelMatrix;',\n\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform mat3 normalMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\t\t\t'uniform bool isOrthographic;',\n\n\t\t\t'#ifdef USE_INSTANCING',\n\n\t\t\t'\tattribute mat4 instanceMatrix;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_INSTANCING_COLOR',\n\n\t\t\t'\tattribute vec3 instanceColor;',\n\n\t\t\t'#endif',\n\n\t\t\t'attribute vec3 position;',\n\t\t\t'attribute vec3 normal;',\n\t\t\t'attribute vec2 uv;',\n\n\t\t\t'#ifdef USE_TANGENT',\n\n\t\t\t'\tattribute vec4 tangent;',\n\n\t\t\t'#endif',\n\n\t\t\t'#if defined( USE_COLOR_ALPHA )',\n\n\t\t\t'\tattribute vec4 color;',\n\n\t\t\t'#elif defined( USE_COLOR )',\n\n\t\t\t'\tattribute vec3 color;',\n\n\t\t\t'#endif',\n\n\t\t\t'#if ( defined( USE_MORPHTARGETS ) && ! defined( MORPHTARGETS_TEXTURE ) )',\n\n\t\t\t'\tattribute vec3 morphTarget0;',\n\t\t\t'\tattribute vec3 morphTarget1;',\n\t\t\t'\tattribute vec3 morphTarget2;',\n\t\t\t'\tattribute vec3 morphTarget3;',\n\n\t\t\t'\t#ifdef USE_MORPHNORMALS',\n\n\t\t\t'\t\tattribute vec3 morphNormal0;',\n\t\t\t'\t\tattribute vec3 morphNormal1;',\n\t\t\t'\t\tattribute vec3 morphNormal2;',\n\t\t\t'\t\tattribute vec3 morphNormal3;',\n\n\t\t\t'\t#else',\n\n\t\t\t'\t\tattribute vec3 morphTarget4;',\n\t\t\t'\t\tattribute vec3 morphTarget5;',\n\t\t\t'\t\tattribute vec3 morphTarget6;',\n\t\t\t'\t\tattribute vec3 morphTarget7;',\n\n\t\t\t'\t#endif',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_SKINNING',\n\n\t\t\t'\tattribute vec4 skinIndex;',\n\t\t\t'\tattribute vec4 skinWeight;',\n\n\t\t\t'#endif',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tprefixFragment = [\n\n\t\t\tcustomExtensions,\n\n\t\t\tgeneratePrecision( parameters ),\n\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines,\n\n\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t( parameters.useFog && parameters.fogExp2 ) ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.matcap ? '#define USE_MATCAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapTypeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapBlendingDefine : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t( parameters.normalMap && parameters.objectSpaceNormalMap ) ? '#define OBJECTSPACE_NORMALMAP' : '',\n\t\t\t( parameters.normalMap && parameters.tangentSpaceNormalMap ) ? '#define TANGENTSPACE_NORMALMAP' : '',\n\n\t\t\tparameters.clearcoat ? '#define USE_CLEARCOAT' : '',\n\t\t\tparameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',\n\t\t\tparameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',\n\t\t\tparameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',\n\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.specularIntensityMap ? '#define USE_SPECULARINTENSITYMAP' : '',\n\t\t\tparameters.specularColorMap ? '#define USE_SPECULARCOLORMAP' : '',\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\tparameters.alphaTest ? '#define USE_ALPHATEST' : '',\n\n\t\t\tparameters.sheen ? '#define USE_SHEEN' : '',\n\t\t\tparameters.sheenColorMap ? '#define USE_SHEENCOLORMAP' : '',\n\t\t\tparameters.sheenRoughnessMap ? '#define USE_SHEENROUGHNESSMAP' : '',\n\n\t\t\tparameters.transmission ? '#define USE_TRANSMISSION' : '',\n\t\t\tparameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',\n\t\t\tparameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',\n\n\t\t\tparameters.decodeVideoTexture ? '#define DECODE_VIDEO_TEXTURE' : '',\n\n\t\t\tparameters.vertexTangents ? '#define USE_TANGENT' : '',\n\t\t\tparameters.vertexColors || parameters.instancingColor ? '#define USE_COLOR' : '',\n\t\t\tparameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '',\n\t\t\tparameters.vertexUvs ? '#define USE_UV' : '',\n\t\t\tparameters.uvsVertexOnly ? '#define UVS_VERTEX_ONLY' : '',\n\n\t\t\tparameters.gradientMap ? '#define USE_GRADIENTMAP' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.premultipliedAlpha ? '#define PREMULTIPLIED_ALPHA' : '',\n\n\t\t\tparameters.physicallyCorrectLights ? '#define PHYSICALLY_CORRECT_LIGHTS' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t( parameters.logarithmicDepthBuffer && parameters.rendererExtensionFragDepth ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t( ( parameters.extensionShaderTextureLOD || parameters.envMap ) && parameters.rendererExtensionShaderTextureLod ) ? '#define TEXTURE_LOD_EXT' : '',\n\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\t\t\t'uniform bool isOrthographic;',\n\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? '#define TONE_MAPPING' : '',\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( 'toneMapping', parameters.toneMapping ) : '',\n\n\t\t\tparameters.dithering ? '#define DITHERING' : '',\n\t\t\tparameters.transparent ? '' : '#define OPAQUE',\n\n\t\t\tShaderChunk[ 'encodings_pars_fragment' ], // this code is required here because it is used by the various encoding/decoding function defined below\n\t\t\tgetTexelEncodingFunction( 'linearToOutputTexel', parameters.outputEncoding ),\n\n\t\t\tparameters.depthPacking ? '#define DEPTH_PACKING ' + parameters.depthPacking : '',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t}\n\n\tvertexShader = resolveIncludes( vertexShader );\n\tvertexShader = replaceLightNums( vertexShader, parameters );\n\tvertexShader = replaceClippingPlaneNums( vertexShader, parameters );\n\n\tfragmentShader = resolveIncludes( fragmentShader );\n\tfragmentShader = replaceLightNums( fragmentShader, parameters );\n\tfragmentShader = replaceClippingPlaneNums( fragmentShader, parameters );\n\n\tvertexShader = unrollLoops( vertexShader );\n\tfragmentShader = unrollLoops( fragmentShader );\n\n\tif ( parameters.isWebGL2 && parameters.isRawShaderMaterial !== true ) {\n\n\t\t// GLSL 3.0 conversion for built-in materials and ShaderMaterial\n\n\t\tversionString = '#version 300 es\\n';\n\n\t\tprefixVertex = [\n\t\t\t'precision mediump sampler2DArray;',\n\t\t\t'#define attribute in',\n\t\t\t'#define varying out',\n\t\t\t'#define texture2D texture'\n\t\t].join( '\\n' ) + '\\n' + prefixVertex;\n\n\t\tprefixFragment = [\n\t\t\t'#define varying in',\n\t\t\t( parameters.glslVersion === GLSL3 ) ? '' : 'layout(location = 0) out highp vec4 pc_fragColor;',\n\t\t\t( parameters.glslVersion === GLSL3 ) ? '' : '#define gl_FragColor pc_fragColor',\n\t\t\t'#define gl_FragDepthEXT gl_FragDepth',\n\t\t\t'#define texture2D texture',\n\t\t\t'#define textureCube texture',\n\t\t\t'#define texture2DProj textureProj',\n\t\t\t'#define texture2DLodEXT textureLod',\n\t\t\t'#define texture2DProjLodEXT textureProjLod',\n\t\t\t'#define textureCubeLodEXT textureLod',\n\t\t\t'#define texture2DGradEXT textureGrad',\n\t\t\t'#define texture2DProjGradEXT textureProjGrad',\n\t\t\t'#define textureCubeGradEXT textureGrad'\n\t\t].join( '\\n' ) + '\\n' + prefixFragment;\n\n\t}\n\n\tconst vertexGlsl = versionString + prefixVertex + vertexShader;\n\tconst fragmentGlsl = versionString + prefixFragment + fragmentShader;\n\n\t// console.log( '*VERTEX*', vertexGlsl );\n\t// console.log( '*FRAGMENT*', fragmentGlsl );\n\n\tconst glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl );\n\tconst glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl );\n\n\tgl.attachShader( program, glVertexShader );\n\tgl.attachShader( program, glFragmentShader );\n\n\t// Force a particular attribute to index 0.\n\n\tif ( parameters.index0AttributeName !== undefined ) {\n\n\t\tgl.bindAttribLocation( program, 0, parameters.index0AttributeName );\n\n\t} else if ( parameters.morphTargets === true ) {\n\n\t\t// programs with morphTargets displace position out of attribute 0\n\t\tgl.bindAttribLocation( program, 0, 'position' );\n\n\t}\n\n\tgl.linkProgram( program );\n\n\t// check for link errors\n\tif ( renderer.debug.checkShaderErrors ) {\n\n\t\tconst programLog = gl.getProgramInfoLog( program ).trim();\n\t\tconst vertexLog = gl.getShaderInfoLog( glVertexShader ).trim();\n\t\tconst fragmentLog = gl.getShaderInfoLog( glFragmentShader ).trim();\n\n\t\tlet runnable = true;\n\t\tlet haveDiagnostics = true;\n\n\t\tif ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) {\n\n\t\t\trunnable = false;\n\n\t\t\tconst vertexErrors = getShaderErrors( gl, glVertexShader, 'vertex' );\n\t\t\tconst fragmentErrors = getShaderErrors( gl, glFragmentShader, 'fragment' );\n\n\t\t\tconsole.error(\n\t\t\t\t'THREE.WebGLProgram: Shader Error ' + gl.getError() + ' - ' +\n\t\t\t\t'VALIDATE_STATUS ' + gl.getProgramParameter( program, gl.VALIDATE_STATUS ) + '\\n\\n' +\n\t\t\t\t'Program Info Log: ' + programLog + '\\n' +\n\t\t\t\tvertexErrors + '\\n' +\n\t\t\t\tfragmentErrors\n\t\t\t);\n\n\t\t} else if ( programLog !== '' ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLProgram: Program Info Log:', programLog );\n\n\t\t} else if ( vertexLog === '' || fragmentLog === '' ) {\n\n\t\t\thaveDiagnostics = false;\n\n\t\t}\n\n\t\tif ( haveDiagnostics ) {\n\n\t\t\tthis.diagnostics = {\n\n\t\t\t\trunnable: runnable,\n\n\t\t\t\tprogramLog: programLog,\n\n\t\t\t\tvertexShader: {\n\n\t\t\t\t\tlog: vertexLog,\n\t\t\t\t\tprefix: prefixVertex\n\n\t\t\t\t},\n\n\t\t\t\tfragmentShader: {\n\n\t\t\t\t\tlog: fragmentLog,\n\t\t\t\t\tprefix: prefixFragment\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t}\n\n\t// Clean up\n\n\t// Crashes in iOS9 and iOS10. #18402\n\t// gl.detachShader( program, glVertexShader );\n\t// gl.detachShader( program, glFragmentShader );\n\n\tgl.deleteShader( glVertexShader );\n\tgl.deleteShader( glFragmentShader );\n\n\t// set up caching for uniform locations\n\n\tlet cachedUniforms;\n\n\tthis.getUniforms = function () {\n\n\t\tif ( cachedUniforms === undefined ) {\n\n\t\t\tcachedUniforms = new WebGLUniforms( gl, program );\n\n\t\t}\n\n\t\treturn cachedUniforms;\n\n\t};\n\n\t// set up caching for attribute locations\n\n\tlet cachedAttributes;\n\n\tthis.getAttributes = function () {\n\n\t\tif ( cachedAttributes === undefined ) {\n\n\t\t\tcachedAttributes = fetchAttributeLocations( gl, program );\n\n\t\t}\n\n\t\treturn cachedAttributes;\n\n\t};\n\n\t// free resource\n\n\tthis.destroy = function () {\n\n\t\tbindingStates.releaseStatesOfProgram( this );\n\n\t\tgl.deleteProgram( program );\n\t\tthis.program = undefined;\n\n\t};\n\n\t//\n\n\tthis.name = parameters.shaderName;\n\tthis.id = programIdCount ++;\n\tthis.cacheKey = cacheKey;\n\tthis.usedTimes = 1;\n\tthis.program = program;\n\tthis.vertexShader = glVertexShader;\n\tthis.fragmentShader = glFragmentShader;\n\n\treturn this;\n\n}\n\nexport { WebGLProgram };\n","let _id = 0;\n\nclass WebGLShaderCache {\n\n\tconstructor() {\n\n\t\tthis.shaderCache = new Map();\n\t\tthis.materialCache = new Map();\n\n\t}\n\n\tupdate( material ) {\n\n\t\tconst vertexShader = material.vertexShader;\n\t\tconst fragmentShader = material.fragmentShader;\n\n\t\tconst vertexShaderStage = this._getShaderStage( vertexShader );\n\t\tconst fragmentShaderStage = this._getShaderStage( fragmentShader );\n\n\t\tconst materialShaders = this._getShaderCacheForMaterial( material );\n\n\t\tif ( materialShaders.has( vertexShaderStage ) === false ) {\n\n\t\t\tmaterialShaders.add( vertexShaderStage );\n\t\t\tvertexShaderStage.usedTimes ++;\n\n\t\t}\n\n\t\tif ( materialShaders.has( fragmentShaderStage ) === false ) {\n\n\t\t\tmaterialShaders.add( fragmentShaderStage );\n\t\t\tfragmentShaderStage.usedTimes ++;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tremove( material ) {\n\n\t\tconst materialShaders = this.materialCache.get( material );\n\n\t\tfor ( const shaderStage of materialShaders ) {\n\n\t\t\tshaderStage.usedTimes --;\n\n\t\t\tif ( shaderStage.usedTimes === 0 ) this.shaderCache.delete( shaderStage );\n\n\t\t}\n\n\t\tthis.materialCache.delete( material );\n\n\t\treturn this;\n\n\t}\n\n\tgetVertexShaderID( material ) {\n\n\t\treturn this._getShaderStage( material.vertexShader ).id;\n\n\t}\n\n\tgetFragmentShaderID( material ) {\n\n\t\treturn this._getShaderStage( material.fragmentShader ).id;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shaderCache.clear();\n\t\tthis.materialCache.clear();\n\n\t}\n\n\t_getShaderCacheForMaterial( material ) {\n\n\t\tconst cache = this.materialCache;\n\n\t\tif ( cache.has( material ) === false ) {\n\n\t\t\tcache.set( material, new Set() );\n\n\t\t}\n\n\t\treturn cache.get( material );\n\n\t}\n\n\t_getShaderStage( code ) {\n\n\t\tconst cache = this.shaderCache;\n\n\t\tif ( cache.has( code ) === false ) {\n\n\t\t\tconst stage = new WebGLShaderStage();\n\t\t\tcache.set( code, stage );\n\n\t\t}\n\n\t\treturn cache.get( code );\n\n\t}\n\n}\n\nclass WebGLShaderStage {\n\n\tconstructor() {\n\n\t\tthis.id = _id ++;\n\n\t\tthis.usedTimes = 0;\n\n\t}\n\n}\n\nexport { WebGLShaderCache };\n","import { BackSide, DoubleSide, CubeUVRefractionMapping, CubeUVReflectionMapping, ObjectSpaceNormalMap, TangentSpaceNormalMap, NoToneMapping, LinearEncoding, sRGBEncoding } from '../../constants.js';\nimport { Layers } from '../../core/Layers.js';\nimport { WebGLProgram } from './WebGLProgram.js';\nimport { WebGLShaderCache } from './WebGLShaderCache.js';\nimport { ShaderLib } from '../shaders/ShaderLib.js';\nimport { UniformsUtils } from '../shaders/UniformsUtils.js';\n\nfunction WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping ) {\n\n\tconst _programLayers = new Layers();\n\tconst _customShaders = new WebGLShaderCache();\n\tconst programs = [];\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\tconst logarithmicDepthBuffer = capabilities.logarithmicDepthBuffer;\n\tconst floatVertexTextures = capabilities.floatVertexTextures;\n\tconst maxVertexUniforms = capabilities.maxVertexUniforms;\n\tconst vertexTextures = capabilities.vertexTextures;\n\tlet precision = capabilities.precision;\n\n\tconst shaderIDs = {\n\t\tMeshDepthMaterial: 'depth',\n\t\tMeshDistanceMaterial: 'distanceRGBA',\n\t\tMeshNormalMaterial: 'normal',\n\t\tMeshBasicMaterial: 'basic',\n\t\tMeshLambertMaterial: 'lambert',\n\t\tMeshPhongMaterial: 'phong',\n\t\tMeshToonMaterial: 'toon',\n\t\tMeshStandardMaterial: 'physical',\n\t\tMeshPhysicalMaterial: 'physical',\n\t\tMeshMatcapMaterial: 'matcap',\n\t\tLineBasicMaterial: 'basic',\n\t\tLineDashedMaterial: 'dashed',\n\t\tPointsMaterial: 'points',\n\t\tShadowMaterial: 'shadow',\n\t\tSpriteMaterial: 'sprite'\n\t};\n\n\tfunction getMaxBones( object ) {\n\n\t\tconst skeleton = object.skeleton;\n\t\tconst bones = skeleton.bones;\n\n\t\tif ( floatVertexTextures ) {\n\n\t\t\treturn 1024;\n\n\t\t} else {\n\n\t\t\t// default for when object is not specified\n\t\t\t// ( for example when prebuilding shader to be used with multiple objects )\n\t\t\t//\n\t\t\t// - leave some extra space for other uniforms\n\t\t\t// - limit here is ANGLE's 254 max uniform vectors\n\t\t\t// (up to 54 should be safe)\n\n\t\t\tconst nVertexUniforms = maxVertexUniforms;\n\t\t\tconst nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 );\n\n\t\t\tconst maxBones = Math.min( nVertexMatrices, bones.length );\n\n\t\t\tif ( maxBones < bones.length ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Skeleton has ' + bones.length + ' bones. This GPU supports ' + maxBones + '.' );\n\t\t\t\treturn 0;\n\n\t\t\t}\n\n\t\t\treturn maxBones;\n\n\t\t}\n\n\t}\n\n\tfunction getParameters( material, lights, shadows, scene, object ) {\n\n\t\tconst fog = scene.fog;\n\t\tconst environment = material.isMeshStandardMaterial ? scene.environment : null;\n\n\t\tconst envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment );\n\n\t\tconst shaderID = shaderIDs[ material.type ];\n\n\t\t// heuristics to create shader parameters according to lights in the scene\n\t\t// (not to blow over maxLights budget)\n\n\t\tconst maxBones = object.isSkinnedMesh ? getMaxBones( object ) : 0;\n\n\t\tif ( material.precision !== null ) {\n\n\t\t\tprecision = capabilities.getMaxPrecision( material.precision );\n\n\t\t\tif ( precision !== material.precision ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet vertexShader, fragmentShader;\n\t\tlet customVertexShaderID, customFragmentShaderID;\n\n\t\tif ( shaderID ) {\n\n\t\t\tconst shader = ShaderLib[ shaderID ];\n\n\t\t\tvertexShader = shader.vertexShader;\n\t\t\tfragmentShader = shader.fragmentShader;\n\n\t\t} else {\n\n\t\t\tvertexShader = material.vertexShader;\n\t\t\tfragmentShader = material.fragmentShader;\n\n\t\t\t_customShaders.update( material );\n\n\t\t\tcustomVertexShaderID = _customShaders.getVertexShaderID( material );\n\t\t\tcustomFragmentShaderID = _customShaders.getFragmentShaderID( material );\n\n\t\t}\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\tconst useAlphaTest = material.alphaTest > 0;\n\t\tconst useClearcoat = material.clearcoat > 0;\n\n\t\tconst parameters = {\n\n\t\t\tisWebGL2: isWebGL2,\n\n\t\t\tshaderID: shaderID,\n\t\t\tshaderName: material.type,\n\n\t\t\tvertexShader: vertexShader,\n\t\t\tfragmentShader: fragmentShader,\n\t\t\tdefines: material.defines,\n\n\t\t\tcustomVertexShaderID: customVertexShaderID,\n\t\t\tcustomFragmentShaderID: customFragmentShaderID,\n\n\t\t\tisRawShaderMaterial: material.isRawShaderMaterial === true,\n\t\t\tglslVersion: material.glslVersion,\n\n\t\t\tprecision: precision,\n\n\t\t\tinstancing: object.isInstancedMesh === true,\n\t\t\tinstancingColor: object.isInstancedMesh === true && object.instanceColor !== null,\n\n\t\t\tsupportsVertexTextures: vertexTextures,\n\t\t\toutputEncoding: ( currentRenderTarget === null ) ? renderer.outputEncoding : ( currentRenderTarget.isXRRenderTarget === true ? currentRenderTarget.texture.encoding : LinearEncoding ),\n\t\t\tmap: !! material.map,\n\t\t\tmatcap: !! material.matcap,\n\t\t\tenvMap: !! envMap,\n\t\t\tenvMapMode: envMap && envMap.mapping,\n\t\t\tenvMapCubeUV: ( !! envMap ) && ( ( envMap.mapping === CubeUVReflectionMapping ) || ( envMap.mapping === CubeUVRefractionMapping ) ),\n\t\t\tlightMap: !! material.lightMap,\n\t\t\taoMap: !! material.aoMap,\n\t\t\temissiveMap: !! material.emissiveMap,\n\t\t\tbumpMap: !! material.bumpMap,\n\t\t\tnormalMap: !! material.normalMap,\n\t\t\tobjectSpaceNormalMap: material.normalMapType === ObjectSpaceNormalMap,\n\t\t\ttangentSpaceNormalMap: material.normalMapType === TangentSpaceNormalMap,\n\n\t\t\tdecodeVideoTexture: !! material.map && ( material.map.isVideoTexture === true ) && ( material.map.encoding === sRGBEncoding ),\n\n\t\t\tclearcoat: useClearcoat,\n\t\t\tclearcoatMap: useClearcoat && !! material.clearcoatMap,\n\t\t\tclearcoatRoughnessMap: useClearcoat && !! material.clearcoatRoughnessMap,\n\t\t\tclearcoatNormalMap: useClearcoat && !! material.clearcoatNormalMap,\n\n\t\t\tdisplacementMap: !! material.displacementMap,\n\t\t\troughnessMap: !! material.roughnessMap,\n\t\t\tmetalnessMap: !! material.metalnessMap,\n\t\t\tspecularMap: !! material.specularMap,\n\t\t\tspecularIntensityMap: !! material.specularIntensityMap,\n\t\t\tspecularColorMap: !! material.specularColorMap,\n\n\t\t\ttransparent: material.transparent,\n\n\t\t\talphaMap: !! material.alphaMap,\n\t\t\talphaTest: useAlphaTest,\n\n\t\t\tgradientMap: !! material.gradientMap,\n\n\t\t\tsheen: material.sheen > 0,\n\t\t\tsheenColorMap: !! material.sheenColorMap,\n\t\t\tsheenRoughnessMap: !! material.sheenRoughnessMap,\n\n\t\t\ttransmission: material.transmission > 0,\n\t\t\ttransmissionMap: !! material.transmissionMap,\n\t\t\tthicknessMap: !! material.thicknessMap,\n\n\t\t\tcombine: material.combine,\n\n\t\t\tvertexTangents: ( !! material.normalMap && !! object.geometry && !! object.geometry.attributes.tangent ),\n\t\t\tvertexColors: material.vertexColors,\n\t\t\tvertexAlphas: material.vertexColors === true && !! object.geometry && !! object.geometry.attributes.color && object.geometry.attributes.color.itemSize === 4,\n\t\t\tvertexUvs: !! material.map || !! material.bumpMap || !! material.normalMap || !! material.specularMap || !! material.alphaMap || !! material.emissiveMap || !! material.roughnessMap || !! material.metalnessMap || !! material.clearcoatMap || !! material.clearcoatRoughnessMap || !! material.clearcoatNormalMap || !! material.displacementMap || !! material.transmissionMap || !! material.thicknessMap || !! material.specularIntensityMap || !! material.specularColorMap || !! material.sheenColorMap || !! material.sheenRoughnessMap,\n\t\t\tuvsVertexOnly: ! ( !! material.map || !! material.bumpMap || !! material.normalMap || !! material.specularMap || !! material.alphaMap || !! material.emissiveMap || !! material.roughnessMap || !! material.metalnessMap || !! material.clearcoatNormalMap || material.transmission > 0 || !! material.transmissionMap || !! material.thicknessMap || !! material.specularIntensityMap || !! material.specularColorMap || material.sheen > 0 || !! material.sheenColorMap || !! material.sheenRoughnessMap ) && !! material.displacementMap,\n\n\t\t\tfog: !! fog,\n\t\t\tuseFog: material.fog,\n\t\t\tfogExp2: ( fog && fog.isFogExp2 ),\n\n\t\t\tflatShading: !! material.flatShading,\n\n\t\t\tsizeAttenuation: material.sizeAttenuation,\n\t\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\n\t\t\tskinning: object.isSkinnedMesh === true && maxBones > 0,\n\t\t\tmaxBones: maxBones,\n\t\t\tuseVertexTexture: floatVertexTextures,\n\n\t\t\tmorphTargets: !! object.geometry && !! object.geometry.morphAttributes.position,\n\t\t\tmorphNormals: !! object.geometry && !! object.geometry.morphAttributes.normal,\n\t\t\tmorphTargetsCount: ( !! object.geometry && !! object.geometry.morphAttributes.position ) ? object.geometry.morphAttributes.position.length : 0,\n\n\t\t\tnumDirLights: lights.directional.length,\n\t\t\tnumPointLights: lights.point.length,\n\t\t\tnumSpotLights: lights.spot.length,\n\t\t\tnumRectAreaLights: lights.rectArea.length,\n\t\t\tnumHemiLights: lights.hemi.length,\n\n\t\t\tnumDirLightShadows: lights.directionalShadowMap.length,\n\t\t\tnumPointLightShadows: lights.pointShadowMap.length,\n\t\t\tnumSpotLightShadows: lights.spotShadowMap.length,\n\n\t\t\tnumClippingPlanes: clipping.numPlanes,\n\t\t\tnumClipIntersection: clipping.numIntersection,\n\n\t\t\tdithering: material.dithering,\n\n\t\t\tshadowMapEnabled: renderer.shadowMap.enabled && shadows.length > 0,\n\t\t\tshadowMapType: renderer.shadowMap.type,\n\n\t\t\ttoneMapping: material.toneMapped ? renderer.toneMapping : NoToneMapping,\n\t\t\tphysicallyCorrectLights: renderer.physicallyCorrectLights,\n\n\t\t\tpremultipliedAlpha: material.premultipliedAlpha,\n\n\t\t\tdoubleSided: material.side === DoubleSide,\n\t\t\tflipSided: material.side === BackSide,\n\n\t\t\tdepthPacking: ( material.depthPacking !== undefined ) ? material.depthPacking : false,\n\n\t\t\tindex0AttributeName: material.index0AttributeName,\n\n\t\t\textensionDerivatives: material.extensions && material.extensions.derivatives,\n\t\t\textensionFragDepth: material.extensions && material.extensions.fragDepth,\n\t\t\textensionDrawBuffers: material.extensions && material.extensions.drawBuffers,\n\t\t\textensionShaderTextureLOD: material.extensions && material.extensions.shaderTextureLOD,\n\n\t\t\trendererExtensionFragDepth: isWebGL2 || extensions.has( 'EXT_frag_depth' ),\n\t\t\trendererExtensionDrawBuffers: isWebGL2 || extensions.has( 'WEBGL_draw_buffers' ),\n\t\t\trendererExtensionShaderTextureLod: isWebGL2 || extensions.has( 'EXT_shader_texture_lod' ),\n\n\t\t\tcustomProgramCacheKey: material.customProgramCacheKey()\n\n\t\t};\n\n\t\treturn parameters;\n\n\t}\n\n\tfunction getProgramCacheKey( parameters ) {\n\n\t\tconst array = [];\n\n\t\tif ( parameters.shaderID ) {\n\n\t\t\tarray.push( parameters.shaderID );\n\n\t\t} else {\n\n\t\t\tarray.push( parameters.customVertexShaderID );\n\t\t\tarray.push( parameters.customFragmentShaderID );\n\n\t\t}\n\n\t\tif ( parameters.defines !== undefined ) {\n\n\t\t\tfor ( const name in parameters.defines ) {\n\n\t\t\t\tarray.push( name );\n\t\t\t\tarray.push( parameters.defines[ name ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( parameters.isRawShaderMaterial === false ) {\n\n\t\t\tgetProgramCacheKeyParameters( array, parameters );\n\t\t\tgetProgramCacheKeyBooleans( array, parameters );\n\t\t\tarray.push( renderer.outputEncoding );\n\n\t\t}\n\n\t\tarray.push( parameters.customProgramCacheKey );\n\n\t\treturn array.join();\n\n\t}\n\n\tfunction getProgramCacheKeyParameters( array, parameters ) {\n\n\t\tarray.push( parameters.precision );\n\t\tarray.push( parameters.outputEncoding );\n\t\tarray.push( parameters.envMapMode );\n\t\tarray.push( parameters.combine );\n\t\tarray.push( parameters.vertexUvs );\n\t\tarray.push( parameters.fogExp2 );\n\t\tarray.push( parameters.sizeAttenuation );\n\t\tarray.push( parameters.maxBones );\n\t\tarray.push( parameters.morphTargetsCount );\n\t\tarray.push( parameters.numDirLights );\n\t\tarray.push( parameters.numPointLights );\n\t\tarray.push( parameters.numSpotLights );\n\t\tarray.push( parameters.numHemiLights );\n\t\tarray.push( parameters.numRectAreaLights );\n\t\tarray.push( parameters.numDirLightShadows );\n\t\tarray.push( parameters.numPointLightShadows );\n\t\tarray.push( parameters.numSpotLightShadows );\n\t\tarray.push( parameters.shadowMapType );\n\t\tarray.push( parameters.toneMapping );\n\t\tarray.push( parameters.numClippingPlanes );\n\t\tarray.push( parameters.numClipIntersection );\n\n\t}\n\n\tfunction getProgramCacheKeyBooleans( array, parameters ) {\n\n\t\t_programLayers.disableAll();\n\n\t\tif ( parameters.isWebGL2 )\n\t\t\t_programLayers.enable( 0 );\n\t\tif ( parameters.supportsVertexTextures )\n\t\t\t_programLayers.enable( 1 );\n\t\tif ( parameters.instancing )\n\t\t\t_programLayers.enable( 2 );\n\t\tif ( parameters.instancingColor )\n\t\t\t_programLayers.enable( 3 );\n\t\tif ( parameters.map )\n\t\t\t_programLayers.enable( 4 );\n\t\tif ( parameters.matcap )\n\t\t\t_programLayers.enable( 5 );\n\t\tif ( parameters.envMap )\n\t\t\t_programLayers.enable( 6 );\n\t\tif ( parameters.envMapCubeUV )\n\t\t\t_programLayers.enable( 7 );\n\t\tif ( parameters.lightMap )\n\t\t\t_programLayers.enable( 8 );\n\t\tif ( parameters.aoMap )\n\t\t\t_programLayers.enable( 9 );\n\t\tif ( parameters.emissiveMap )\n\t\t\t_programLayers.enable( 10 );\n\t\tif ( parameters.bumpMap )\n\t\t\t_programLayers.enable( 11 );\n\t\tif ( parameters.normalMap )\n\t\t\t_programLayers.enable( 12 );\n\t\tif ( parameters.objectSpaceNormalMap )\n\t\t\t_programLayers.enable( 13 );\n\t\tif ( parameters.tangentSpaceNormalMap )\n\t\t\t_programLayers.enable( 14 );\n\t\tif ( parameters.clearcoat )\n\t\t\t_programLayers.enable( 15 );\n\t\tif ( parameters.clearcoatMap )\n\t\t\t_programLayers.enable( 16 );\n\t\tif ( parameters.clearcoatRoughnessMap )\n\t\t\t_programLayers.enable( 17 );\n\t\tif ( parameters.clearcoatNormalMap )\n\t\t\t_programLayers.enable( 18 );\n\t\tif ( parameters.displacementMap )\n\t\t\t_programLayers.enable( 19 );\n\t\tif ( parameters.specularMap )\n\t\t\t_programLayers.enable( 20 );\n\t\tif ( parameters.roughnessMap )\n\t\t\t_programLayers.enable( 21 );\n\t\tif ( parameters.metalnessMap )\n\t\t\t_programLayers.enable( 22 );\n\t\tif ( parameters.gradientMap )\n\t\t\t_programLayers.enable( 23 );\n\t\tif ( parameters.alphaMap )\n\t\t\t_programLayers.enable( 24 );\n\t\tif ( parameters.alphaTest )\n\t\t\t_programLayers.enable( 25 );\n\t\tif ( parameters.vertexColors )\n\t\t\t_programLayers.enable( 26 );\n\t\tif ( parameters.vertexAlphas )\n\t\t\t_programLayers.enable( 27 );\n\t\tif ( parameters.vertexUvs )\n\t\t\t_programLayers.enable( 28 );\n\t\tif ( parameters.vertexTangents )\n\t\t\t_programLayers.enable( 29 );\n\t\tif ( parameters.uvsVertexOnly )\n\t\t\t_programLayers.enable( 30 );\n\t\tif ( parameters.fog )\n\t\t\t_programLayers.enable( 31 );\n\n\t\tarray.push( _programLayers.mask );\n\t\t_programLayers.disableAll();\n\n\t\tif ( parameters.useFog )\n\t\t\t_programLayers.enable( 0 );\n\t\tif ( parameters.flatShading )\n\t\t\t_programLayers.enable( 1 );\n\t\tif ( parameters.logarithmicDepthBuffer )\n\t\t\t_programLayers.enable( 2 );\n\t\tif ( parameters.skinning )\n\t\t\t_programLayers.enable( 3 );\n\t\tif ( parameters.useVertexTexture )\n\t\t\t_programLayers.enable( 4 );\n\t\tif ( parameters.morphTargets )\n\t\t\t_programLayers.enable( 5 );\n\t\tif ( parameters.morphNormals )\n\t\t\t_programLayers.enable( 6 );\n\t\tif ( parameters.premultipliedAlpha )\n\t\t\t_programLayers.enable( 7 );\n\t\tif ( parameters.shadowMapEnabled )\n\t\t\t_programLayers.enable( 8 );\n\t\tif ( parameters.physicallyCorrectLights )\n\t\t\t_programLayers.enable( 9 );\n\t\tif ( parameters.doubleSided )\n\t\t\t_programLayers.enable( 10 );\n\t\tif ( parameters.flipSided )\n\t\t\t_programLayers.enable( 11 );\n\t\tif ( parameters.depthPacking )\n\t\t\t_programLayers.enable( 12 );\n\t\tif ( parameters.dithering )\n\t\t\t_programLayers.enable( 13 );\n\t\tif ( parameters.specularIntensityMap )\n\t\t\t_programLayers.enable( 14 );\n\t\tif ( parameters.specularColorMap )\n\t\t\t_programLayers.enable( 15 );\n\t\tif ( parameters.transmission )\n\t\t\t_programLayers.enable( 16 );\n\t\tif ( parameters.transmissionMap )\n\t\t\t_programLayers.enable( 17 );\n\t\tif ( parameters.thicknessMap )\n\t\t\t_programLayers.enable( 18 );\n\t\tif ( parameters.sheen )\n\t\t\t_programLayers.enable( 19 );\n\t\tif ( parameters.sheenColorMap )\n\t\t\t_programLayers.enable( 20 );\n\t\tif ( parameters.sheenRoughnessMap )\n\t\t\t_programLayers.enable( 21 );\n\t\tif ( parameters.decodeVideoTexture )\n\t\t\t_programLayers.enable( 22 );\n\t\tif ( parameters.transparent )\n\t\t\t_programLayers.enable( 23 );\n\n\t\tarray.push( _programLayers.mask );\n\n\t}\n\n\tfunction getUniforms( material ) {\n\n\t\tconst shaderID = shaderIDs[ material.type ];\n\t\tlet uniforms;\n\n\t\tif ( shaderID ) {\n\n\t\t\tconst shader = ShaderLib[ shaderID ];\n\t\t\tuniforms = UniformsUtils.clone( shader.uniforms );\n\n\t\t} else {\n\n\t\t\tuniforms = material.uniforms;\n\n\t\t}\n\n\t\treturn uniforms;\n\n\t}\n\n\tfunction acquireProgram( parameters, cacheKey ) {\n\n\t\tlet program;\n\n\t\t// Check if code has been already compiled\n\t\tfor ( let p = 0, pl = programs.length; p < pl; p ++ ) {\n\n\t\t\tconst preexistingProgram = programs[ p ];\n\n\t\t\tif ( preexistingProgram.cacheKey === cacheKey ) {\n\n\t\t\t\tprogram = preexistingProgram;\n\t\t\t\t++ program.usedTimes;\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( program === undefined ) {\n\n\t\t\tprogram = new WebGLProgram( renderer, cacheKey, parameters, bindingStates );\n\t\t\tprograms.push( program );\n\n\t\t}\n\n\t\treturn program;\n\n\t}\n\n\tfunction releaseProgram( program ) {\n\n\t\tif ( -- program.usedTimes === 0 ) {\n\n\t\t\t// Remove from unordered set\n\t\t\tconst i = programs.indexOf( program );\n\t\t\tprograms[ i ] = programs[ programs.length - 1 ];\n\t\t\tprograms.pop();\n\n\t\t\t// Free WebGL resources\n\t\t\tprogram.destroy();\n\n\t\t}\n\n\t}\n\n\tfunction releaseShaderCache( material ) {\n\n\t\t_customShaders.remove( material );\n\n\t}\n\n\tfunction dispose() {\n\n\t\t_customShaders.dispose();\n\n\t}\n\n\treturn {\n\t\tgetParameters: getParameters,\n\t\tgetProgramCacheKey: getProgramCacheKey,\n\t\tgetUniforms: getUniforms,\n\t\tacquireProgram: acquireProgram,\n\t\treleaseProgram: releaseProgram,\n\t\treleaseShaderCache: releaseShaderCache,\n\t\t// Exposed for resource monitoring & error feedback via renderer.info:\n\t\tprograms: programs,\n\t\tdispose: dispose\n\t};\n\n}\n\n\nexport { WebGLPrograms };\n","function WebGLProperties() {\n\n\tlet properties = new WeakMap();\n\n\tfunction get( object ) {\n\n\t\tlet map = properties.get( object );\n\n\t\tif ( map === undefined ) {\n\n\t\t\tmap = {};\n\t\t\tproperties.set( object, map );\n\n\t\t}\n\n\t\treturn map;\n\n\t}\n\n\tfunction remove( object ) {\n\n\t\tproperties.delete( object );\n\n\t}\n\n\tfunction update( object, key, value ) {\n\n\t\tproperties.get( object )[ key ] = value;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tproperties = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update,\n\t\tdispose: dispose\n\t};\n\n}\n\n\nexport { WebGLProperties };\n","function painterSortStable( a, b ) {\n\n\tif ( a.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.material.id !== b.material.id ) {\n\n\t\treturn a.material.id - b.material.id;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn a.z - b.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\nfunction reversePainterSortStable( a, b ) {\n\n\tif ( a.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn b.z - a.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\n\nfunction WebGLRenderList() {\n\n\tconst renderItems = [];\n\tlet renderItemsIndex = 0;\n\n\tconst opaque = [];\n\tconst transmissive = [];\n\tconst transparent = [];\n\n\tfunction init() {\n\n\t\trenderItemsIndex = 0;\n\n\t\topaque.length = 0;\n\t\ttransmissive.length = 0;\n\t\ttransparent.length = 0;\n\n\t}\n\n\tfunction getNextRenderItem( object, geometry, material, groupOrder, z, group ) {\n\n\t\tlet renderItem = renderItems[ renderItemsIndex ];\n\n\t\tif ( renderItem === undefined ) {\n\n\t\t\trenderItem = {\n\t\t\t\tid: object.id,\n\t\t\t\tobject: object,\n\t\t\t\tgeometry: geometry,\n\t\t\t\tmaterial: material,\n\t\t\t\tgroupOrder: groupOrder,\n\t\t\t\trenderOrder: object.renderOrder,\n\t\t\t\tz: z,\n\t\t\t\tgroup: group\n\t\t\t};\n\n\t\t\trenderItems[ renderItemsIndex ] = renderItem;\n\n\t\t} else {\n\n\t\t\trenderItem.id = object.id;\n\t\t\trenderItem.object = object;\n\t\t\trenderItem.geometry = geometry;\n\t\t\trenderItem.material = material;\n\t\t\trenderItem.groupOrder = groupOrder;\n\t\t\trenderItem.renderOrder = object.renderOrder;\n\t\t\trenderItem.z = z;\n\t\t\trenderItem.group = group;\n\n\t\t}\n\n\t\trenderItemsIndex ++;\n\n\t\treturn renderItem;\n\n\t}\n\n\tfunction push( object, geometry, material, groupOrder, z, group ) {\n\n\t\tconst renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );\n\n\t\tif ( material.transmission > 0.0 ) {\n\n\t\t\ttransmissive.push( renderItem );\n\n\t\t} else if ( material.transparent === true ) {\n\n\t\t\ttransparent.push( renderItem );\n\n\t\t} else {\n\n\t\t\topaque.push( renderItem );\n\n\t\t}\n\n\t}\n\n\tfunction unshift( object, geometry, material, groupOrder, z, group ) {\n\n\t\tconst renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );\n\n\t\tif ( material.transmission > 0.0 ) {\n\n\t\t\ttransmissive.unshift( renderItem );\n\n\t\t} else if ( material.transparent === true ) {\n\n\t\t\ttransparent.unshift( renderItem );\n\n\t\t} else {\n\n\t\t\topaque.unshift( renderItem );\n\n\t\t}\n\n\t}\n\n\tfunction sort( customOpaqueSort, customTransparentSort ) {\n\n\t\tif ( opaque.length > 1 ) opaque.sort( customOpaqueSort || painterSortStable );\n\t\tif ( transmissive.length > 1 ) transmissive.sort( customTransparentSort || reversePainterSortStable );\n\t\tif ( transparent.length > 1 ) transparent.sort( customTransparentSort || reversePainterSortStable );\n\n\t}\n\n\tfunction finish() {\n\n\t\t// Clear references from inactive renderItems in the list\n\n\t\tfor ( let i = renderItemsIndex, il = renderItems.length; i < il; i ++ ) {\n\n\t\t\tconst renderItem = renderItems[ i ];\n\n\t\t\tif ( renderItem.id === null ) break;\n\n\t\t\trenderItem.id = null;\n\t\t\trenderItem.object = null;\n\t\t\trenderItem.geometry = null;\n\t\t\trenderItem.material = null;\n\t\t\trenderItem.group = null;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\topaque: opaque,\n\t\ttransmissive: transmissive,\n\t\ttransparent: transparent,\n\n\t\tinit: init,\n\t\tpush: push,\n\t\tunshift: unshift,\n\t\tfinish: finish,\n\n\t\tsort: sort\n\t};\n\n}\n\nfunction WebGLRenderLists() {\n\n\tlet lists = new WeakMap();\n\n\tfunction get( scene, renderCallDepth ) {\n\n\t\tlet list;\n\n\t\tif ( lists.has( scene ) === false ) {\n\n\t\t\tlist = new WebGLRenderList();\n\t\t\tlists.set( scene, [ list ] );\n\n\t\t} else {\n\n\t\t\tif ( renderCallDepth >= lists.get( scene ).length ) {\n\n\t\t\t\tlist = new WebGLRenderList();\n\t\t\t\tlists.get( scene ).push( list );\n\n\t\t\t} else {\n\n\t\t\t\tlist = lists.get( scene )[ renderCallDepth ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn list;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tlists = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\n\nexport { WebGLRenderLists, WebGLRenderList };\n","import { Color } from '../../math/Color.js';\nimport { Matrix4 } from '../../math/Matrix4.js';\nimport { Vector2 } from '../../math/Vector2.js';\nimport { Vector3 } from '../../math/Vector3.js';\nimport { UniformsLib } from '../shaders/UniformsLib.js';\n\nfunction UniformsCache() {\n\n\tconst lights = {};\n\n\treturn {\n\n\t\tget: function ( light ) {\n\n\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\treturn lights[ light.id ];\n\n\t\t\t}\n\n\t\t\tlet uniforms;\n\n\t\t\tswitch ( light.type ) {\n\n\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpotLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tconeCos: 0,\n\t\t\t\t\t\tpenumbraCos: 0,\n\t\t\t\t\t\tdecay: 0\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PointLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tdecay: 0\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'HemisphereLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tskyColor: new Color(),\n\t\t\t\t\t\tgroundColor: new Color()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'RectAreaLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\thalfWidth: new Vector3(),\n\t\t\t\t\t\thalfHeight: new Vector3()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\treturn uniforms;\n\n\t\t}\n\n\t};\n\n}\n\nfunction ShadowUniformsCache() {\n\n\tconst lights = {};\n\n\treturn {\n\n\t\tget: function ( light ) {\n\n\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\treturn lights[ light.id ];\n\n\t\t\t}\n\n\t\t\tlet uniforms;\n\n\t\t\tswitch ( light.type ) {\n\n\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpotLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PointLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2(),\n\t\t\t\t\t\tshadowCameraNear: 1,\n\t\t\t\t\t\tshadowCameraFar: 1000\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\t// TODO (abelnation): set RectAreaLight shadow uniforms\n\n\t\t\t}\n\n\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\treturn uniforms;\n\n\t\t}\n\n\t};\n\n}\n\n\n\nlet nextVersion = 0;\n\nfunction shadowCastingLightsFirst( lightA, lightB ) {\n\n\treturn ( lightB.castShadow ? 1 : 0 ) - ( lightA.castShadow ? 1 : 0 );\n\n}\n\nfunction WebGLLights( extensions, capabilities ) {\n\n\tconst cache = new UniformsCache();\n\n\tconst shadowCache = ShadowUniformsCache();\n\n\tconst state = {\n\n\t\tversion: 0,\n\n\t\thash: {\n\t\t\tdirectionalLength: - 1,\n\t\t\tpointLength: - 1,\n\t\t\tspotLength: - 1,\n\t\t\trectAreaLength: - 1,\n\t\t\themiLength: - 1,\n\n\t\t\tnumDirectionalShadows: - 1,\n\t\t\tnumPointShadows: - 1,\n\t\t\tnumSpotShadows: - 1\n\t\t},\n\n\t\tambient: [ 0, 0, 0 ],\n\t\tprobe: [],\n\t\tdirectional: [],\n\t\tdirectionalShadow: [],\n\t\tdirectionalShadowMap: [],\n\t\tdirectionalShadowMatrix: [],\n\t\tspot: [],\n\t\tspotShadow: [],\n\t\tspotShadowMap: [],\n\t\tspotShadowMatrix: [],\n\t\trectArea: [],\n\t\trectAreaLTC1: null,\n\t\trectAreaLTC2: null,\n\t\tpoint: [],\n\t\tpointShadow: [],\n\t\tpointShadowMap: [],\n\t\tpointShadowMatrix: [],\n\t\themi: []\n\n\t};\n\n\tfor ( let i = 0; i < 9; i ++ ) state.probe.push( new Vector3() );\n\n\tconst vector3 = new Vector3();\n\tconst matrix4 = new Matrix4();\n\tconst matrix42 = new Matrix4();\n\n\tfunction setup( lights, physicallyCorrectLights ) {\n\n\t\tlet r = 0, g = 0, b = 0;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) state.probe[ i ].set( 0, 0, 0 );\n\n\t\tlet directionalLength = 0;\n\t\tlet pointLength = 0;\n\t\tlet spotLength = 0;\n\t\tlet rectAreaLength = 0;\n\t\tlet hemiLength = 0;\n\n\t\tlet numDirectionalShadows = 0;\n\t\tlet numPointShadows = 0;\n\t\tlet numSpotShadows = 0;\n\n\t\tlights.sort( shadowCastingLightsFirst );\n\n\t\t// artist-friendly light intensity scaling factor\n\t\tconst scaleFactor = ( physicallyCorrectLights !== true ) ? Math.PI : 1;\n\n\t\tfor ( let i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\n\t\t\tconst color = light.color;\n\t\t\tconst intensity = light.intensity;\n\t\t\tconst distance = light.distance;\n\n\t\t\tconst shadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null;\n\n\t\t\tif ( light.isAmbientLight ) {\n\n\t\t\t\tr += color.r * intensity * scaleFactor;\n\t\t\t\tg += color.g * intensity * scaleFactor;\n\t\t\t\tb += color.b * intensity * scaleFactor;\n\n\t\t\t} else if ( light.isLightProbe ) {\n\n\t\t\t\tfor ( let j = 0; j < 9; j ++ ) {\n\n\t\t\t\t\tstate.probe[ j ].addScaledVector( light.sh.coefficients[ j ], intensity );\n\n\t\t\t\t}\n\n\t\t\t} else if ( light.isDirectionalLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity * scaleFactor );\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t\tstate.directionalShadow[ directionalLength ] = shadowUniforms;\n\t\t\t\t\tstate.directionalShadowMap[ directionalLength ] = shadowMap;\n\t\t\t\t\tstate.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumDirectionalShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.directional[ directionalLength ] = uniforms;\n\n\t\t\t\tdirectionalLength ++;\n\n\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity * scaleFactor );\n\t\t\t\tuniforms.distance = distance;\n\n\t\t\t\tuniforms.coneCos = Math.cos( light.angle );\n\t\t\t\tuniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) );\n\t\t\t\tuniforms.decay = light.decay;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t\tstate.spotShadow[ spotLength ] = shadowUniforms;\n\t\t\t\t\tstate.spotShadowMap[ spotLength ] = shadowMap;\n\t\t\t\t\tstate.spotShadowMatrix[ spotLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumSpotShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.spot[ spotLength ] = uniforms;\n\n\t\t\t\tspotLength ++;\n\n\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\t// (a) intensity is the total visible light emitted\n\t\t\t\t//uniforms.color.copy( color ).multiplyScalar( intensity / ( light.width * light.height * Math.PI ) );\n\n\t\t\t\t// (b) intensity is the brightness of the light\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\n\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\tstate.rectArea[ rectAreaLength ] = uniforms;\n\n\t\t\t\trectAreaLength ++;\n\n\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity * scaleFactor );\n\t\t\t\tuniforms.distance = light.distance;\n\t\t\t\tuniforms.decay = light.decay;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\t\t\t\t\tshadowUniforms.shadowCameraNear = shadow.camera.near;\n\t\t\t\t\tshadowUniforms.shadowCameraFar = shadow.camera.far;\n\n\t\t\t\t\tstate.pointShadow[ pointLength ] = shadowUniforms;\n\t\t\t\t\tstate.pointShadowMap[ pointLength ] = shadowMap;\n\t\t\t\t\tstate.pointShadowMatrix[ pointLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumPointShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.point[ pointLength ] = uniforms;\n\n\t\t\t\tpointLength ++;\n\n\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.skyColor.copy( light.color ).multiplyScalar( intensity * scaleFactor );\n\t\t\t\tuniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity * scaleFactor );\n\n\t\t\t\tstate.hemi[ hemiLength ] = uniforms;\n\n\t\t\t\themiLength ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( rectAreaLength > 0 ) {\n\n\t\t\tif ( capabilities.isWebGL2 ) {\n\n\t\t\t\t// WebGL 2\n\n\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1;\n\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2;\n\n\t\t\t} else {\n\n\t\t\t\t// WebGL 1\n\n\t\t\t\tif ( extensions.has( 'OES_texture_float_linear' ) === true ) {\n\n\t\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1;\n\t\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2;\n\n\t\t\t\t} else if ( extensions.has( 'OES_texture_half_float_linear' ) === true ) {\n\n\t\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_HALF_1;\n\t\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_HALF_2;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer: Unable to use RectAreaLight. Missing WebGL extensions.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.ambient[ 0 ] = r;\n\t\tstate.ambient[ 1 ] = g;\n\t\tstate.ambient[ 2 ] = b;\n\n\t\tconst hash = state.hash;\n\n\t\tif ( hash.directionalLength !== directionalLength ||\n\t\t\thash.pointLength !== pointLength ||\n\t\t\thash.spotLength !== spotLength ||\n\t\t\thash.rectAreaLength !== rectAreaLength ||\n\t\t\thash.hemiLength !== hemiLength ||\n\t\t\thash.numDirectionalShadows !== numDirectionalShadows ||\n\t\t\thash.numPointShadows !== numPointShadows ||\n\t\t\thash.numSpotShadows !== numSpotShadows ) {\n\n\t\t\tstate.directional.length = directionalLength;\n\t\t\tstate.spot.length = spotLength;\n\t\t\tstate.rectArea.length = rectAreaLength;\n\t\t\tstate.point.length = pointLength;\n\t\t\tstate.hemi.length = hemiLength;\n\n\t\t\tstate.directionalShadow.length = numDirectionalShadows;\n\t\t\tstate.directionalShadowMap.length = numDirectionalShadows;\n\t\t\tstate.pointShadow.length = numPointShadows;\n\t\t\tstate.pointShadowMap.length = numPointShadows;\n\t\t\tstate.spotShadow.length = numSpotShadows;\n\t\t\tstate.spotShadowMap.length = numSpotShadows;\n\t\t\tstate.directionalShadowMatrix.length = numDirectionalShadows;\n\t\t\tstate.pointShadowMatrix.length = numPointShadows;\n\t\t\tstate.spotShadowMatrix.length = numSpotShadows;\n\n\t\t\thash.directionalLength = directionalLength;\n\t\t\thash.pointLength = pointLength;\n\t\t\thash.spotLength = spotLength;\n\t\t\thash.rectAreaLength = rectAreaLength;\n\t\t\thash.hemiLength = hemiLength;\n\n\t\t\thash.numDirectionalShadows = numDirectionalShadows;\n\t\t\thash.numPointShadows = numPointShadows;\n\t\t\thash.numSpotShadows = numSpotShadows;\n\n\t\t\tstate.version = nextVersion ++;\n\n\t\t}\n\n\t}\n\n\tfunction setupView( lights, camera ) {\n\n\t\tlet directionalLength = 0;\n\t\tlet pointLength = 0;\n\t\tlet spotLength = 0;\n\t\tlet rectAreaLength = 0;\n\t\tlet hemiLength = 0;\n\n\t\tconst viewMatrix = camera.matrixWorldInverse;\n\n\t\tfor ( let i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\n\t\t\tif ( light.isDirectionalLight ) {\n\n\t\t\t\tconst uniforms = state.directional[ directionalLength ];\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tdirectionalLength ++;\n\n\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\tconst uniforms = state.spot[ spotLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tspotLength ++;\n\n\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\tconst uniforms = state.rectArea[ rectAreaLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t// extract local rotation of light to derive width/height half vectors\n\t\t\t\tmatrix42.identity();\n\t\t\t\tmatrix4.copy( light.matrixWorld );\n\t\t\t\tmatrix4.premultiply( viewMatrix );\n\t\t\t\tmatrix42.extractRotation( matrix4 );\n\n\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\tuniforms.halfWidth.applyMatrix4( matrix42 );\n\t\t\t\tuniforms.halfHeight.applyMatrix4( matrix42 );\n\n\t\t\t\trectAreaLength ++;\n\n\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\tconst uniforms = state.point[ pointLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tpointLength ++;\n\n\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\tconst uniforms = state.hemi[ hemiLength ];\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\t\t\t\tuniforms.direction.normalize();\n\n\t\t\t\themiLength ++;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tsetup: setup,\n\t\tsetupView: setupView,\n\t\tstate: state\n\t};\n\n}\n\n\nexport { WebGLLights };\n","import { WebGLLights } from './WebGLLights.js';\n\nfunction WebGLRenderState( extensions, capabilities ) {\n\n\tconst lights = new WebGLLights( extensions, capabilities );\n\n\tconst lightsArray = [];\n\tconst shadowsArray = [];\n\n\tfunction init() {\n\n\t\tlightsArray.length = 0;\n\t\tshadowsArray.length = 0;\n\n\t}\n\n\tfunction pushLight( light ) {\n\n\t\tlightsArray.push( light );\n\n\t}\n\n\tfunction pushShadow( shadowLight ) {\n\n\t\tshadowsArray.push( shadowLight );\n\n\t}\n\n\tfunction setupLights( physicallyCorrectLights ) {\n\n\t\tlights.setup( lightsArray, physicallyCorrectLights );\n\n\t}\n\n\tfunction setupLightsView( camera ) {\n\n\t\tlights.setupView( lightsArray, camera );\n\n\t}\n\n\tconst state = {\n\t\tlightsArray: lightsArray,\n\t\tshadowsArray: shadowsArray,\n\n\t\tlights: lights\n\t};\n\n\treturn {\n\t\tinit: init,\n\t\tstate: state,\n\t\tsetupLights: setupLights,\n\t\tsetupLightsView: setupLightsView,\n\n\t\tpushLight: pushLight,\n\t\tpushShadow: pushShadow\n\t};\n\n}\n\nfunction WebGLRenderStates( extensions, capabilities ) {\n\n\tlet renderStates = new WeakMap();\n\n\tfunction get( scene, renderCallDepth = 0 ) {\n\n\t\tlet renderState;\n\n\t\tif ( renderStates.has( scene ) === false ) {\n\n\t\t\trenderState = new WebGLRenderState( extensions, capabilities );\n\t\t\trenderStates.set( scene, [ renderState ] );\n\n\t\t} else {\n\n\t\t\tif ( renderCallDepth >= renderStates.get( scene ).length ) {\n\n\t\t\t\trenderState = new WebGLRenderState( extensions, capabilities );\n\t\t\t\trenderStates.get( scene ).push( renderState );\n\n\t\t\t} else {\n\n\t\t\t\trenderState = renderStates.get( scene )[ renderCallDepth ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn renderState;\n\n\t}\n\n\tfunction dispose() {\n\n\t\trenderStates = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\n\nexport { WebGLRenderStates };\n","import { Material } from './Material.js';\nimport { BasicDepthPacking } from '../constants.js';\n\n/**\n * parameters = {\n *\n * opacity: ,\n *\n * map: new THREE.Texture( ),\n *\n * alphaMap: new THREE.Texture( ),\n *\n * displacementMap: new THREE.Texture( ),\n * displacementScale: ,\n * displacementBias: ,\n *\n * wireframe: ,\n * wireframeLinewidth: \n * }\n */\n\nclass MeshDepthMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'MeshDepthMaterial';\n\n\t\tthis.depthPacking = BasicDepthPacking;\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.fog = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.depthPacking = source.depthPacking;\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\treturn this;\n\n\t}\n\n}\n\nMeshDepthMaterial.prototype.isMeshDepthMaterial = true;\n\nexport { MeshDepthMaterial };\n","import { Material } from './Material.js';\nimport { Vector3 } from '../math/Vector3.js';\n\n/**\n * parameters = {\n *\n * referencePosition: ,\n * nearDistance: ,\n * farDistance: ,\n *\n * map: new THREE.Texture( ),\n *\n * alphaMap: new THREE.Texture( ),\n *\n * displacementMap: new THREE.Texture( ),\n * displacementScale: ,\n * displacementBias: \n *\n * }\n */\n\nclass MeshDistanceMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'MeshDistanceMaterial';\n\n\t\tthis.referencePosition = new Vector3();\n\t\tthis.nearDistance = 1;\n\t\tthis.farDistance = 1000;\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.fog = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.referencePosition.copy( source.referencePosition );\n\t\tthis.nearDistance = source.nearDistance;\n\t\tthis.farDistance = source.farDistance;\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\treturn this;\n\n\t}\n\n}\n\nMeshDistanceMaterial.prototype.isMeshDistanceMaterial = true;\n\nexport { MeshDistanceMaterial };\n","export const vertex = /* glsl */`\nvoid main() {\n\n\tgl_Position = vec4( position, 1.0 );\n\n}\n`;\n\nexport const fragment = /* glsl */`\nuniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\n\n#include \n\nvoid main() {\n\n\tconst float samples = float( VSM_SAMPLES );\n\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\n\t// This seems totally useless but it's a crazy work around for a Adreno compiler bug\n\t// float depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy ) / resolution ) );\n\n\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\n\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\n\tfor ( float i = 0.0; i < samples; i ++ ) {\n\n\t\tfloat uvOffset = uvStart + i * uvStride;\n\n\t\t#ifdef HORIZONTAL_PASS\n\n\t\t\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) );\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\n\t\t#else\n\n\t\t\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) );\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\n\t\t#endif\n\n\t}\n\n\tmean = mean / samples;\n\tsquared_mean = squared_mean / samples;\n\n\tfloat std_dev = sqrt( squared_mean - mean * mean );\n\n\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\n\n}\n`;\n","import { FrontSide, BackSide, DoubleSide, RGBAFormat, NearestFilter, LinearFilter, PCFShadowMap, VSMShadowMap, RGBADepthPacking, NoBlending } from '../../constants.js';\nimport { WebGLRenderTarget } from '../WebGLRenderTarget.js';\nimport { MeshDepthMaterial } from '../../materials/MeshDepthMaterial.js';\nimport { MeshDistanceMaterial } from '../../materials/MeshDistanceMaterial.js';\nimport { ShaderMaterial } from '../../materials/ShaderMaterial.js';\nimport { BufferAttribute } from '../../core/BufferAttribute.js';\nimport { BufferGeometry } from '../../core/BufferGeometry.js';\nimport { Mesh } from '../../objects/Mesh.js';\nimport { Vector4 } from '../../math/Vector4.js';\nimport { Vector2 } from '../../math/Vector2.js';\nimport { Frustum } from '../../math/Frustum.js';\n\nimport * as vsm from '../shaders/ShaderLib/vsm.glsl.js';\n\nfunction WebGLShadowMap( _renderer, _objects, _capabilities ) {\n\n\tlet _frustum = new Frustum();\n\n\tconst _shadowMapSize = new Vector2(),\n\t\t_viewportSize = new Vector2(),\n\n\t\t_viewport = new Vector4(),\n\n\t\t_depthMaterial = new MeshDepthMaterial( { depthPacking: RGBADepthPacking } ),\n\t\t_distanceMaterial = new MeshDistanceMaterial(),\n\n\t\t_materialCache = {},\n\n\t\t_maxTextureSize = _capabilities.maxTextureSize;\n\n\tconst shadowSide = { 0: BackSide, 1: FrontSide, 2: DoubleSide };\n\n\tconst shadowMaterialVertical = new ShaderMaterial( {\n\t\tdefines: {\n\t\t\tVSM_SAMPLES: 8\n\t\t},\n\t\tuniforms: {\n\t\t\tshadow_pass: { value: null },\n\t\t\tresolution: { value: new Vector2() },\n\t\t\tradius: { value: 4.0 }\n\t\t},\n\n\t\tvertexShader: vsm.vertex,\n\t\tfragmentShader: vsm.fragment\n\n\t} );\n\n\tconst shadowMaterialHorizontal = shadowMaterialVertical.clone();\n\tshadowMaterialHorizontal.defines.HORIZONTAL_PASS = 1;\n\n\tconst fullScreenTri = new BufferGeometry();\n\tfullScreenTri.setAttribute(\n\t\t'position',\n\t\tnew BufferAttribute(\n\t\t\tnew Float32Array( [ - 1, - 1, 0.5, 3, - 1, 0.5, - 1, 3, 0.5 ] ),\n\t\t\t3\n\t\t)\n\t);\n\n\tconst fullScreenMesh = new Mesh( fullScreenTri, shadowMaterialVertical );\n\n\tconst scope = this;\n\n\tthis.enabled = false;\n\n\tthis.autoUpdate = true;\n\tthis.needsUpdate = false;\n\n\tthis.type = PCFShadowMap;\n\n\tthis.render = function ( lights, scene, camera ) {\n\n\t\tif ( scope.enabled === false ) return;\n\t\tif ( scope.autoUpdate === false && scope.needsUpdate === false ) return;\n\n\t\tif ( lights.length === 0 ) return;\n\n\t\tconst currentRenderTarget = _renderer.getRenderTarget();\n\t\tconst activeCubeFace = _renderer.getActiveCubeFace();\n\t\tconst activeMipmapLevel = _renderer.getActiveMipmapLevel();\n\n\t\tconst _state = _renderer.state;\n\n\t\t// Set GL state for depth map.\n\t\t_state.setBlending( NoBlending );\n\t\t_state.buffers.color.setClear( 1, 1, 1, 1 );\n\t\t_state.buffers.depth.setTest( true );\n\t\t_state.setScissorTest( false );\n\n\t\t// render depth map\n\n\t\tfor ( let i = 0, il = lights.length; i < il; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\t\t\tconst shadow = light.shadow;\n\n\t\t\tif ( shadow === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( shadow.autoUpdate === false && shadow.needsUpdate === false ) continue;\n\n\t\t\t_shadowMapSize.copy( shadow.mapSize );\n\n\t\t\tconst shadowFrameExtents = shadow.getFrameExtents();\n\n\t\t\t_shadowMapSize.multiply( shadowFrameExtents );\n\n\t\t\t_viewportSize.copy( shadow.mapSize );\n\n\t\t\tif ( _shadowMapSize.x > _maxTextureSize || _shadowMapSize.y > _maxTextureSize ) {\n\n\t\t\t\tif ( _shadowMapSize.x > _maxTextureSize ) {\n\n\t\t\t\t\t_viewportSize.x = Math.floor( _maxTextureSize / shadowFrameExtents.x );\n\t\t\t\t\t_shadowMapSize.x = _viewportSize.x * shadowFrameExtents.x;\n\t\t\t\t\tshadow.mapSize.x = _viewportSize.x;\n\n\t\t\t\t}\n\n\t\t\t\tif ( _shadowMapSize.y > _maxTextureSize ) {\n\n\t\t\t\t\t_viewportSize.y = Math.floor( _maxTextureSize / shadowFrameExtents.y );\n\t\t\t\t\t_shadowMapSize.y = _viewportSize.y * shadowFrameExtents.y;\n\t\t\t\t\tshadow.mapSize.y = _viewportSize.y;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( shadow.map === null && ! shadow.isPointLightShadow && this.type === VSMShadowMap ) {\n\n\t\t\t\tconst pars = { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat };\n\n\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\n\t\t\t\tshadow.map.texture.name = light.name + '.shadowMap';\n\n\t\t\t\tshadow.mapPass = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\n\n\t\t\t\tshadow.camera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t\tif ( shadow.map === null ) {\n\n\t\t\t\tconst pars = { minFilter: NearestFilter, magFilter: NearestFilter, format: RGBAFormat };\n\n\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\n\t\t\t\tshadow.map.texture.name = light.name + '.shadowMap';\n\n\t\t\t\tshadow.camera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t\t_renderer.setRenderTarget( shadow.map );\n\t\t\t_renderer.clear();\n\n\t\t\tconst viewportCount = shadow.getViewportCount();\n\n\t\t\tfor ( let vp = 0; vp < viewportCount; vp ++ ) {\n\n\t\t\t\tconst viewport = shadow.getViewport( vp );\n\n\t\t\t\t_viewport.set(\n\t\t\t\t\t_viewportSize.x * viewport.x,\n\t\t\t\t\t_viewportSize.y * viewport.y,\n\t\t\t\t\t_viewportSize.x * viewport.z,\n\t\t\t\t\t_viewportSize.y * viewport.w\n\t\t\t\t);\n\n\t\t\t\t_state.viewport( _viewport );\n\n\t\t\t\tshadow.updateMatrices( light, vp );\n\n\t\t\t\t_frustum = shadow.getFrustum();\n\n\t\t\t\trenderObject( scene, camera, shadow.camera, light, this.type );\n\n\t\t\t}\n\n\t\t\t// do blur pass for VSM\n\n\t\t\tif ( ! shadow.isPointLightShadow && this.type === VSMShadowMap ) {\n\n\t\t\t\tVSMPass( shadow, camera );\n\n\t\t\t}\n\n\t\t\tshadow.needsUpdate = false;\n\n\t\t}\n\n\t\tscope.needsUpdate = false;\n\n\t\t_renderer.setRenderTarget( currentRenderTarget, activeCubeFace, activeMipmapLevel );\n\n\t};\n\n\tfunction VSMPass( shadow, camera ) {\n\n\t\tconst geometry = _objects.update( fullScreenMesh );\n\n\t\tif ( shadowMaterialVertical.defines.VSM_SAMPLES !== shadow.blurSamples ) {\n\n\t\t\tshadowMaterialVertical.defines.VSM_SAMPLES = shadow.blurSamples;\n\t\t\tshadowMaterialHorizontal.defines.VSM_SAMPLES = shadow.blurSamples;\n\n\t\t\tshadowMaterialVertical.needsUpdate = true;\n\t\t\tshadowMaterialHorizontal.needsUpdate = true;\n\n\t\t}\n\n\t\t// vertical pass\n\n\t\tshadowMaterialVertical.uniforms.shadow_pass.value = shadow.map.texture;\n\t\tshadowMaterialVertical.uniforms.resolution.value = shadow.mapSize;\n\t\tshadowMaterialVertical.uniforms.radius.value = shadow.radius;\n\t\t_renderer.setRenderTarget( shadow.mapPass );\n\t\t_renderer.clear();\n\t\t_renderer.renderBufferDirect( camera, null, geometry, shadowMaterialVertical, fullScreenMesh, null );\n\n\t\t// horizontal pass\n\n\t\tshadowMaterialHorizontal.uniforms.shadow_pass.value = shadow.mapPass.texture;\n\t\tshadowMaterialHorizontal.uniforms.resolution.value = shadow.mapSize;\n\t\tshadowMaterialHorizontal.uniforms.radius.value = shadow.radius;\n\t\t_renderer.setRenderTarget( shadow.map );\n\t\t_renderer.clear();\n\t\t_renderer.renderBufferDirect( camera, null, geometry, shadowMaterialHorizontal, fullScreenMesh, null );\n\n\t}\n\n\tfunction getDepthMaterial( object, geometry, material, light, shadowCameraNear, shadowCameraFar, type ) {\n\n\t\tlet result = null;\n\n\t\tconst customMaterial = ( light.isPointLight === true ) ? object.customDistanceMaterial : object.customDepthMaterial;\n\n\t\tif ( customMaterial !== undefined ) {\n\n\t\t\tresult = customMaterial;\n\n\t\t} else {\n\n\t\t\tresult = ( light.isPointLight === true ) ? _distanceMaterial : _depthMaterial;\n\n\t\t}\n\n\t\tif ( ( _renderer.localClippingEnabled && material.clipShadows === true && material.clippingPlanes.length !== 0 ) ||\n\t\t\t( material.displacementMap && material.displacementScale !== 0 ) ||\n\t\t\t( material.alphaMap && material.alphaTest > 0 ) ) {\n\n\t\t\t// in this case we need a unique material instance reflecting the\n\t\t\t// appropriate state\n\n\t\t\tconst keyA = result.uuid, keyB = material.uuid;\n\n\t\t\tlet materialsForVariant = _materialCache[ keyA ];\n\n\t\t\tif ( materialsForVariant === undefined ) {\n\n\t\t\t\tmaterialsForVariant = {};\n\t\t\t\t_materialCache[ keyA ] = materialsForVariant;\n\n\t\t\t}\n\n\t\t\tlet cachedMaterial = materialsForVariant[ keyB ];\n\n\t\t\tif ( cachedMaterial === undefined ) {\n\n\t\t\t\tcachedMaterial = result.clone();\n\t\t\t\tmaterialsForVariant[ keyB ] = cachedMaterial;\n\n\t\t\t}\n\n\t\t\tresult = cachedMaterial;\n\n\t\t}\n\n\t\tresult.visible = material.visible;\n\t\tresult.wireframe = material.wireframe;\n\n\t\tif ( type === VSMShadowMap ) {\n\n\t\t\tresult.side = ( material.shadowSide !== null ) ? material.shadowSide : material.side;\n\n\t\t} else {\n\n\t\t\tresult.side = ( material.shadowSide !== null ) ? material.shadowSide : shadowSide[ material.side ];\n\n\t\t}\n\n\t\tresult.alphaMap = material.alphaMap;\n\t\tresult.alphaTest = material.alphaTest;\n\n\t\tresult.clipShadows = material.clipShadows;\n\t\tresult.clippingPlanes = material.clippingPlanes;\n\t\tresult.clipIntersection = material.clipIntersection;\n\n\t\tresult.displacementMap = material.displacementMap;\n\t\tresult.displacementScale = material.displacementScale;\n\t\tresult.displacementBias = material.displacementBias;\n\n\t\tresult.wireframeLinewidth = material.wireframeLinewidth;\n\t\tresult.linewidth = material.linewidth;\n\n\t\tif ( light.isPointLight === true && result.isMeshDistanceMaterial === true ) {\n\n\t\t\tresult.referencePosition.setFromMatrixPosition( light.matrixWorld );\n\t\t\tresult.nearDistance = shadowCameraNear;\n\t\t\tresult.farDistance = shadowCameraFar;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tfunction renderObject( object, camera, shadowCamera, light, type ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tconst visible = object.layers.test( camera.layers );\n\n\t\tif ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) {\n\n\t\t\tif ( ( object.castShadow || ( object.receiveShadow && type === VSMShadowMap ) ) && ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) ) {\n\n\t\t\t\tobject.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );\n\n\t\t\t\tconst geometry = _objects.update( object );\n\t\t\t\tconst material = object.material;\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tconst groups = geometry.groups;\n\n\t\t\t\t\tfor ( let k = 0, kl = groups.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\tconst group = groups[ k ];\n\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\tconst depthMaterial = getDepthMaterial( object, geometry, groupMaterial, light, shadowCamera.near, shadowCamera.far, type );\n\n\t\t\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\tconst depthMaterial = getDepthMaterial( object, geometry, material, light, shadowCamera.near, shadowCamera.far, type );\n\n\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\trenderObject( children[ i ], camera, shadowCamera, light, type );\n\n\t\t}\n\n\t}\n\n}\n\n\nexport { WebGLShadowMap };\n","import { NotEqualDepth, GreaterDepth, GreaterEqualDepth, EqualDepth, LessEqualDepth, LessDepth, AlwaysDepth, NeverDepth, CullFaceFront, CullFaceBack, CullFaceNone, DoubleSide, BackSide, CustomBlending, MultiplyBlending, SubtractiveBlending, AdditiveBlending, NoBlending, NormalBlending, AddEquation, SubtractEquation, ReverseSubtractEquation, MinEquation, MaxEquation, ZeroFactor, OneFactor, SrcColorFactor, SrcAlphaFactor, SrcAlphaSaturateFactor, DstColorFactor, DstAlphaFactor, OneMinusSrcColorFactor, OneMinusSrcAlphaFactor, OneMinusDstColorFactor, OneMinusDstAlphaFactor } from '../../constants.js';\nimport { Vector4 } from '../../math/Vector4.js';\n\nfunction WebGLState( gl, extensions, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tfunction ColorBuffer() {\n\n\t\tlet locked = false;\n\n\t\tconst color = new Vector4();\n\t\tlet currentColorMask = null;\n\t\tconst currentColorClear = new Vector4( 0, 0, 0, 0 );\n\n\t\treturn {\n\n\t\t\tsetMask: function ( colorMask ) {\n\n\t\t\t\tif ( currentColorMask !== colorMask && ! locked ) {\n\n\t\t\t\t\tgl.colorMask( colorMask, colorMask, colorMask, colorMask );\n\t\t\t\t\tcurrentColorMask = colorMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( r, g, b, a, premultipliedAlpha ) {\n\n\t\t\t\tif ( premultipliedAlpha === true ) {\n\n\t\t\t\t\tr *= a; g *= a; b *= a;\n\n\t\t\t\t}\n\n\t\t\t\tcolor.set( r, g, b, a );\n\n\t\t\t\tif ( currentColorClear.equals( color ) === false ) {\n\n\t\t\t\t\tgl.clearColor( r, g, b, a );\n\t\t\t\t\tcurrentColorClear.copy( color );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentColorMask = null;\n\t\t\t\tcurrentColorClear.set( - 1, 0, 0, 0 ); // set to invalid state\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction DepthBuffer() {\n\n\t\tlet locked = false;\n\n\t\tlet currentDepthMask = null;\n\t\tlet currentDepthFunc = null;\n\t\tlet currentDepthClear = null;\n\n\t\treturn {\n\n\t\t\tsetTest: function ( depthTest ) {\n\n\t\t\t\tif ( depthTest ) {\n\n\t\t\t\t\tenable( gl.DEPTH_TEST );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdisable( gl.DEPTH_TEST );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( depthMask ) {\n\n\t\t\t\tif ( currentDepthMask !== depthMask && ! locked ) {\n\n\t\t\t\t\tgl.depthMask( depthMask );\n\t\t\t\t\tcurrentDepthMask = depthMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( depthFunc ) {\n\n\t\t\t\tif ( currentDepthFunc !== depthFunc ) {\n\n\t\t\t\t\tif ( depthFunc ) {\n\n\t\t\t\t\t\tswitch ( depthFunc ) {\n\n\t\t\t\t\t\t\tcase NeverDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( gl.NEVER );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase AlwaysDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( gl.ALWAYS );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase LessDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( gl.LESS );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase LessEqualDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase EqualDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( gl.EQUAL );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase GreaterEqualDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( gl.GEQUAL );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase GreaterDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( gl.GREATER );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase NotEqualDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( gl.NOTEQUAL );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcurrentDepthFunc = depthFunc;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( depth ) {\n\n\t\t\t\tif ( currentDepthClear !== depth ) {\n\n\t\t\t\t\tgl.clearDepth( depth );\n\t\t\t\t\tcurrentDepthClear = depth;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentDepthMask = null;\n\t\t\t\tcurrentDepthFunc = null;\n\t\t\t\tcurrentDepthClear = null;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction StencilBuffer() {\n\n\t\tlet locked = false;\n\n\t\tlet currentStencilMask = null;\n\t\tlet currentStencilFunc = null;\n\t\tlet currentStencilRef = null;\n\t\tlet currentStencilFuncMask = null;\n\t\tlet currentStencilFail = null;\n\t\tlet currentStencilZFail = null;\n\t\tlet currentStencilZPass = null;\n\t\tlet currentStencilClear = null;\n\n\t\treturn {\n\n\t\t\tsetTest: function ( stencilTest ) {\n\n\t\t\t\tif ( ! locked ) {\n\n\t\t\t\t\tif ( stencilTest ) {\n\n\t\t\t\t\t\tenable( gl.STENCIL_TEST );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdisable( gl.STENCIL_TEST );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( stencilMask ) {\n\n\t\t\t\tif ( currentStencilMask !== stencilMask && ! locked ) {\n\n\t\t\t\t\tgl.stencilMask( stencilMask );\n\t\t\t\t\tcurrentStencilMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\t\tif ( currentStencilFunc !== stencilFunc ||\n\t\t\t\t currentStencilRef !== stencilRef ||\n\t\t\t\t currentStencilFuncMask !== stencilMask ) {\n\n\t\t\t\t\tgl.stencilFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t\t\t\tcurrentStencilFunc = stencilFunc;\n\t\t\t\t\tcurrentStencilRef = stencilRef;\n\t\t\t\t\tcurrentStencilFuncMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetOp: function ( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\t\tif ( currentStencilFail !== stencilFail ||\n\t\t\t\t currentStencilZFail !== stencilZFail ||\n\t\t\t\t currentStencilZPass !== stencilZPass ) {\n\n\t\t\t\t\tgl.stencilOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t\t\t\tcurrentStencilFail = stencilFail;\n\t\t\t\t\tcurrentStencilZFail = stencilZFail;\n\t\t\t\t\tcurrentStencilZPass = stencilZPass;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( stencil ) {\n\n\t\t\t\tif ( currentStencilClear !== stencil ) {\n\n\t\t\t\t\tgl.clearStencil( stencil );\n\t\t\t\t\tcurrentStencilClear = stencil;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentStencilMask = null;\n\t\t\t\tcurrentStencilFunc = null;\n\t\t\t\tcurrentStencilRef = null;\n\t\t\t\tcurrentStencilFuncMask = null;\n\t\t\t\tcurrentStencilFail = null;\n\t\t\t\tcurrentStencilZFail = null;\n\t\t\t\tcurrentStencilZPass = null;\n\t\t\t\tcurrentStencilClear = null;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t//\n\n\tconst colorBuffer = new ColorBuffer();\n\tconst depthBuffer = new DepthBuffer();\n\tconst stencilBuffer = new StencilBuffer();\n\n\tlet enabledCapabilities = {};\n\n\tlet currentBoundFramebuffers = {};\n\tlet currentDrawbuffers = new WeakMap();\n\tlet defaultDrawbuffers = [];\n\n\tlet currentProgram = null;\n\n\tlet currentBlendingEnabled = false;\n\tlet currentBlending = null;\n\tlet currentBlendEquation = null;\n\tlet currentBlendSrc = null;\n\tlet currentBlendDst = null;\n\tlet currentBlendEquationAlpha = null;\n\tlet currentBlendSrcAlpha = null;\n\tlet currentBlendDstAlpha = null;\n\tlet currentPremultipledAlpha = false;\n\n\tlet currentFlipSided = null;\n\tlet currentCullFace = null;\n\n\tlet currentLineWidth = null;\n\n\tlet currentPolygonOffsetFactor = null;\n\tlet currentPolygonOffsetUnits = null;\n\n\tconst maxTextures = gl.getParameter( gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS );\n\n\tlet lineWidthAvailable = false;\n\tlet version = 0;\n\tconst glVersion = gl.getParameter( gl.VERSION );\n\n\tif ( glVersion.indexOf( 'WebGL' ) !== - 1 ) {\n\n\t\tversion = parseFloat( /^WebGL (\\d)/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 1.0 );\n\n\t} else if ( glVersion.indexOf( 'OpenGL ES' ) !== - 1 ) {\n\n\t\tversion = parseFloat( /^OpenGL ES (\\d)/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 2.0 );\n\n\t}\n\n\tlet currentTextureSlot = null;\n\tlet currentBoundTextures = {};\n\n\tconst scissorParam = gl.getParameter( gl.SCISSOR_BOX );\n\tconst viewportParam = gl.getParameter( gl.VIEWPORT );\n\n\tconst currentScissor = new Vector4().fromArray( scissorParam );\n\tconst currentViewport = new Vector4().fromArray( viewportParam );\n\n\tfunction createTexture( type, target, count ) {\n\n\t\tconst data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4.\n\t\tconst texture = gl.createTexture();\n\n\t\tgl.bindTexture( type, texture );\n\t\tgl.texParameteri( type, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\t\tgl.texParameteri( type, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tgl.texImage2D( target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tconst emptyTextures = {};\n\temptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 );\n\temptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 );\n\n\t// init\n\n\tcolorBuffer.setClear( 0, 0, 0, 1 );\n\tdepthBuffer.setClear( 1 );\n\tstencilBuffer.setClear( 0 );\n\n\tenable( gl.DEPTH_TEST );\n\tdepthBuffer.setFunc( LessEqualDepth );\n\n\tsetFlipSided( false );\n\tsetCullFace( CullFaceBack );\n\tenable( gl.CULL_FACE );\n\n\tsetBlending( NoBlending );\n\n\t//\n\n\tfunction enable( id ) {\n\n\t\tif ( enabledCapabilities[ id ] !== true ) {\n\n\t\t\tgl.enable( id );\n\t\t\tenabledCapabilities[ id ] = true;\n\n\t\t}\n\n\t}\n\n\tfunction disable( id ) {\n\n\t\tif ( enabledCapabilities[ id ] !== false ) {\n\n\t\t\tgl.disable( id );\n\t\t\tenabledCapabilities[ id ] = false;\n\n\t\t}\n\n\t}\n\n\tfunction bindFramebuffer( target, framebuffer ) {\n\n\t\tif ( currentBoundFramebuffers[ target ] !== framebuffer ) {\n\n\t\t\tgl.bindFramebuffer( target, framebuffer );\n\n\t\t\tcurrentBoundFramebuffers[ target ] = framebuffer;\n\n\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\t// gl.DRAW_FRAMEBUFFER is equivalent to gl.FRAMEBUFFER\n\n\t\t\t\tif ( target === gl.DRAW_FRAMEBUFFER ) {\n\n\t\t\t\t\tcurrentBoundFramebuffers[ gl.FRAMEBUFFER ] = framebuffer;\n\n\t\t\t\t}\n\n\t\t\t\tif ( target === gl.FRAMEBUFFER ) {\n\n\t\t\t\t\tcurrentBoundFramebuffers[ gl.DRAW_FRAMEBUFFER ] = framebuffer;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tfunction drawBuffers( renderTarget, framebuffer ) {\n\n\t\tlet drawBuffers = defaultDrawbuffers;\n\n\t\tlet needsUpdate = false;\n\n\t\tif ( renderTarget ) {\n\n\t\t\tdrawBuffers = currentDrawbuffers.get( framebuffer );\n\n\t\t\tif ( drawBuffers === undefined ) {\n\n\t\t\t\tdrawBuffers = [];\n\t\t\t\tcurrentDrawbuffers.set( framebuffer, drawBuffers );\n\n\t\t\t}\n\n\t\t\tif ( renderTarget.isWebGLMultipleRenderTargets ) {\n\n\t\t\t\tconst textures = renderTarget.texture;\n\n\t\t\t\tif ( drawBuffers.length !== textures.length || drawBuffers[ 0 ] !== gl.COLOR_ATTACHMENT0 ) {\n\n\t\t\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tdrawBuffers[ i ] = gl.COLOR_ATTACHMENT0 + i;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tdrawBuffers.length = textures.length;\n\n\t\t\t\t\tneedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( drawBuffers[ 0 ] !== gl.COLOR_ATTACHMENT0 ) {\n\n\t\t\t\t\tdrawBuffers[ 0 ] = gl.COLOR_ATTACHMENT0;\n\n\t\t\t\t\tneedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( drawBuffers[ 0 ] !== gl.BACK ) {\n\n\t\t\t\tdrawBuffers[ 0 ] = gl.BACK;\n\n\t\t\t\tneedsUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( needsUpdate ) {\n\n\t\t\tif ( capabilities.isWebGL2 ) {\n\n\t\t\t\tgl.drawBuffers( drawBuffers );\n\n\t\t\t} else {\n\n\t\t\t\textensions.get( 'WEBGL_draw_buffers' ).drawBuffersWEBGL( drawBuffers );\n\n\t\t\t}\n\n\t\t}\n\n\n\t}\n\n\tfunction useProgram( program ) {\n\n\t\tif ( currentProgram !== program ) {\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tcurrentProgram = program;\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tconst equationToGL = {\n\t\t[ AddEquation ]: gl.FUNC_ADD,\n\t\t[ SubtractEquation ]: gl.FUNC_SUBTRACT,\n\t\t[ ReverseSubtractEquation ]: gl.FUNC_REVERSE_SUBTRACT\n\t};\n\n\tif ( isWebGL2 ) {\n\n\t\tequationToGL[ MinEquation ] = gl.MIN;\n\t\tequationToGL[ MaxEquation ] = gl.MAX;\n\n\t} else {\n\n\t\tconst extension = extensions.get( 'EXT_blend_minmax' );\n\n\t\tif ( extension !== null ) {\n\n\t\t\tequationToGL[ MinEquation ] = extension.MIN_EXT;\n\t\t\tequationToGL[ MaxEquation ] = extension.MAX_EXT;\n\n\t\t}\n\n\t}\n\n\tconst factorToGL = {\n\t\t[ ZeroFactor ]: gl.ZERO,\n\t\t[ OneFactor ]: gl.ONE,\n\t\t[ SrcColorFactor ]: gl.SRC_COLOR,\n\t\t[ SrcAlphaFactor ]: gl.SRC_ALPHA,\n\t\t[ SrcAlphaSaturateFactor ]: gl.SRC_ALPHA_SATURATE,\n\t\t[ DstColorFactor ]: gl.DST_COLOR,\n\t\t[ DstAlphaFactor ]: gl.DST_ALPHA,\n\t\t[ OneMinusSrcColorFactor ]: gl.ONE_MINUS_SRC_COLOR,\n\t\t[ OneMinusSrcAlphaFactor ]: gl.ONE_MINUS_SRC_ALPHA,\n\t\t[ OneMinusDstColorFactor ]: gl.ONE_MINUS_DST_COLOR,\n\t\t[ OneMinusDstAlphaFactor ]: gl.ONE_MINUS_DST_ALPHA\n\t};\n\n\tfunction setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) {\n\n\t\tif ( blending === NoBlending ) {\n\n\t\t\tif ( currentBlendingEnabled === true ) {\n\n\t\t\t\tdisable( gl.BLEND );\n\t\t\t\tcurrentBlendingEnabled = false;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( currentBlendingEnabled === false ) {\n\n\t\t\tenable( gl.BLEND );\n\t\t\tcurrentBlendingEnabled = true;\n\n\t\t}\n\n\t\tif ( blending !== CustomBlending ) {\n\n\t\t\tif ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) {\n\n\t\t\t\tif ( currentBlendEquation !== AddEquation || currentBlendEquationAlpha !== AddEquation ) {\n\n\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\n\t\t\t\t\tcurrentBlendEquation = AddEquation;\n\t\t\t\t\tcurrentBlendEquationAlpha = AddEquation;\n\n\t\t\t\t}\n\n\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFunc( gl.ONE, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ZERO, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFunc( gl.SRC_ALPHA, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ZERO, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\tgl.blendFunc( gl.ZERO, gl.SRC_COLOR );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tcurrentBlendSrc = null;\n\t\t\t\tcurrentBlendDst = null;\n\t\t\t\tcurrentBlendSrcAlpha = null;\n\t\t\t\tcurrentBlendDstAlpha = null;\n\n\t\t\t\tcurrentBlending = blending;\n\t\t\t\tcurrentPremultipledAlpha = premultipliedAlpha;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// custom blending\n\n\t\tblendEquationAlpha = blendEquationAlpha || blendEquation;\n\t\tblendSrcAlpha = blendSrcAlpha || blendSrc;\n\t\tblendDstAlpha = blendDstAlpha || blendDst;\n\n\t\tif ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) {\n\n\t\t\tgl.blendEquationSeparate( equationToGL[ blendEquation ], equationToGL[ blendEquationAlpha ] );\n\n\t\t\tcurrentBlendEquation = blendEquation;\n\t\t\tcurrentBlendEquationAlpha = blendEquationAlpha;\n\n\t\t}\n\n\t\tif ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) {\n\n\t\t\tgl.blendFuncSeparate( factorToGL[ blendSrc ], factorToGL[ blendDst ], factorToGL[ blendSrcAlpha ], factorToGL[ blendDstAlpha ] );\n\n\t\t\tcurrentBlendSrc = blendSrc;\n\t\t\tcurrentBlendDst = blendDst;\n\t\t\tcurrentBlendSrcAlpha = blendSrcAlpha;\n\t\t\tcurrentBlendDstAlpha = blendDstAlpha;\n\n\t\t}\n\n\t\tcurrentBlending = blending;\n\t\tcurrentPremultipledAlpha = null;\n\n\t}\n\n\tfunction setMaterial( material, frontFaceCW ) {\n\n\t\tmaterial.side === DoubleSide\n\t\t\t? disable( gl.CULL_FACE )\n\t\t\t: enable( gl.CULL_FACE );\n\n\t\tlet flipSided = ( material.side === BackSide );\n\t\tif ( frontFaceCW ) flipSided = ! flipSided;\n\n\t\tsetFlipSided( flipSided );\n\n\t\t( material.blending === NormalBlending && material.transparent === false )\n\t\t\t? setBlending( NoBlending )\n\t\t\t: setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha );\n\n\t\tdepthBuffer.setFunc( material.depthFunc );\n\t\tdepthBuffer.setTest( material.depthTest );\n\t\tdepthBuffer.setMask( material.depthWrite );\n\t\tcolorBuffer.setMask( material.colorWrite );\n\n\t\tconst stencilWrite = material.stencilWrite;\n\t\tstencilBuffer.setTest( stencilWrite );\n\t\tif ( stencilWrite ) {\n\n\t\t\tstencilBuffer.setMask( material.stencilWriteMask );\n\t\t\tstencilBuffer.setFunc( material.stencilFunc, material.stencilRef, material.stencilFuncMask );\n\t\t\tstencilBuffer.setOp( material.stencilFail, material.stencilZFail, material.stencilZPass );\n\n\t\t}\n\n\t\tsetPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );\n\n\t\tmaterial.alphaToCoverage === true\n\t\t\t? enable( gl.SAMPLE_ALPHA_TO_COVERAGE )\n\t\t\t: disable( gl.SAMPLE_ALPHA_TO_COVERAGE );\n\n\t}\n\n\t//\n\n\tfunction setFlipSided( flipSided ) {\n\n\t\tif ( currentFlipSided !== flipSided ) {\n\n\t\t\tif ( flipSided ) {\n\n\t\t\t\tgl.frontFace( gl.CW );\n\n\t\t\t} else {\n\n\t\t\t\tgl.frontFace( gl.CCW );\n\n\t\t\t}\n\n\t\t\tcurrentFlipSided = flipSided;\n\n\t\t}\n\n\t}\n\n\tfunction setCullFace( cullFace ) {\n\n\t\tif ( cullFace !== CullFaceNone ) {\n\n\t\t\tenable( gl.CULL_FACE );\n\n\t\t\tif ( cullFace !== currentCullFace ) {\n\n\t\t\t\tif ( cullFace === CullFaceBack ) {\n\n\t\t\t\t\tgl.cullFace( gl.BACK );\n\n\t\t\t\t} else if ( cullFace === CullFaceFront ) {\n\n\t\t\t\t\tgl.cullFace( gl.FRONT );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.cullFace( gl.FRONT_AND_BACK );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( gl.CULL_FACE );\n\n\t\t}\n\n\t\tcurrentCullFace = cullFace;\n\n\t}\n\n\tfunction setLineWidth( width ) {\n\n\t\tif ( width !== currentLineWidth ) {\n\n\t\t\tif ( lineWidthAvailable ) gl.lineWidth( width );\n\n\t\t\tcurrentLineWidth = width;\n\n\t\t}\n\n\t}\n\n\tfunction setPolygonOffset( polygonOffset, factor, units ) {\n\n\t\tif ( polygonOffset ) {\n\n\t\t\tenable( gl.POLYGON_OFFSET_FILL );\n\n\t\t\tif ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) {\n\n\t\t\t\tgl.polygonOffset( factor, units );\n\n\t\t\t\tcurrentPolygonOffsetFactor = factor;\n\t\t\t\tcurrentPolygonOffsetUnits = units;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( gl.POLYGON_OFFSET_FILL );\n\n\t\t}\n\n\t}\n\n\tfunction setScissorTest( scissorTest ) {\n\n\t\tif ( scissorTest ) {\n\n\t\t\tenable( gl.SCISSOR_TEST );\n\n\t\t} else {\n\n\t\t\tdisable( gl.SCISSOR_TEST );\n\n\t\t}\n\n\t}\n\n\t// texture\n\n\tfunction activeTexture( webglSlot ) {\n\n\t\tif ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1;\n\n\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\tgl.activeTexture( webglSlot );\n\t\t\tcurrentTextureSlot = webglSlot;\n\n\t\t}\n\n\t}\n\n\tfunction bindTexture( webglType, webglTexture ) {\n\n\t\tif ( currentTextureSlot === null ) {\n\n\t\t\tactiveTexture();\n\n\t\t}\n\n\t\tlet boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\tif ( boundTexture === undefined ) {\n\n\t\t\tboundTexture = { type: undefined, texture: undefined };\n\t\t\tcurrentBoundTextures[ currentTextureSlot ] = boundTexture;\n\n\t\t}\n\n\t\tif ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) {\n\n\t\t\tgl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] );\n\n\t\t\tboundTexture.type = webglType;\n\t\t\tboundTexture.texture = webglTexture;\n\n\t\t}\n\n\t}\n\n\tfunction unbindTexture() {\n\n\t\tconst boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\tif ( boundTexture !== undefined && boundTexture.type !== undefined ) {\n\n\t\t\tgl.bindTexture( boundTexture.type, null );\n\n\t\t\tboundTexture.type = undefined;\n\t\t\tboundTexture.texture = undefined;\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texSubImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texSubImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texSubImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texSubImage3D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexSubImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexSubImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texStorage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texStorage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texStorage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texStorage3D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texImage3D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction scissor( scissor ) {\n\n\t\tif ( currentScissor.equals( scissor ) === false ) {\n\n\t\t\tgl.scissor( scissor.x, scissor.y, scissor.z, scissor.w );\n\t\t\tcurrentScissor.copy( scissor );\n\n\t\t}\n\n\t}\n\n\tfunction viewport( viewport ) {\n\n\t\tif ( currentViewport.equals( viewport ) === false ) {\n\n\t\t\tgl.viewport( viewport.x, viewport.y, viewport.z, viewport.w );\n\t\t\tcurrentViewport.copy( viewport );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction reset() {\n\n\t\t// reset state\n\n\t\tgl.disable( gl.BLEND );\n\t\tgl.disable( gl.CULL_FACE );\n\t\tgl.disable( gl.DEPTH_TEST );\n\t\tgl.disable( gl.POLYGON_OFFSET_FILL );\n\t\tgl.disable( gl.SCISSOR_TEST );\n\t\tgl.disable( gl.STENCIL_TEST );\n\t\tgl.disable( gl.SAMPLE_ALPHA_TO_COVERAGE );\n\n\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\tgl.blendFunc( gl.ONE, gl.ZERO );\n\t\tgl.blendFuncSeparate( gl.ONE, gl.ZERO, gl.ONE, gl.ZERO );\n\n\t\tgl.colorMask( true, true, true, true );\n\t\tgl.clearColor( 0, 0, 0, 0 );\n\n\t\tgl.depthMask( true );\n\t\tgl.depthFunc( gl.LESS );\n\t\tgl.clearDepth( 1 );\n\n\t\tgl.stencilMask( 0xffffffff );\n\t\tgl.stencilFunc( gl.ALWAYS, 0, 0xffffffff );\n\t\tgl.stencilOp( gl.KEEP, gl.KEEP, gl.KEEP );\n\t\tgl.clearStencil( 0 );\n\n\t\tgl.cullFace( gl.BACK );\n\t\tgl.frontFace( gl.CCW );\n\n\t\tgl.polygonOffset( 0, 0 );\n\n\t\tgl.activeTexture( gl.TEXTURE0 );\n\n\t\tgl.bindFramebuffer( gl.FRAMEBUFFER, null );\n\n\t\tif ( isWebGL2 === true ) {\n\n\t\t\tgl.bindFramebuffer( gl.DRAW_FRAMEBUFFER, null );\n\t\t\tgl.bindFramebuffer( gl.READ_FRAMEBUFFER, null );\n\n\t\t}\n\n\t\tgl.useProgram( null );\n\n\t\tgl.lineWidth( 1 );\n\n\t\tgl.scissor( 0, 0, gl.canvas.width, gl.canvas.height );\n\t\tgl.viewport( 0, 0, gl.canvas.width, gl.canvas.height );\n\n\t\t// reset internals\n\n\t\tenabledCapabilities = {};\n\n\t\tcurrentTextureSlot = null;\n\t\tcurrentBoundTextures = {};\n\n\t\tcurrentBoundFramebuffers = {};\n\t\tcurrentDrawbuffers = new WeakMap();\n\t\tdefaultDrawbuffers = [];\n\n\t\tcurrentProgram = null;\n\n\t\tcurrentBlendingEnabled = false;\n\t\tcurrentBlending = null;\n\t\tcurrentBlendEquation = null;\n\t\tcurrentBlendSrc = null;\n\t\tcurrentBlendDst = null;\n\t\tcurrentBlendEquationAlpha = null;\n\t\tcurrentBlendSrcAlpha = null;\n\t\tcurrentBlendDstAlpha = null;\n\t\tcurrentPremultipledAlpha = false;\n\n\t\tcurrentFlipSided = null;\n\t\tcurrentCullFace = null;\n\n\t\tcurrentLineWidth = null;\n\n\t\tcurrentPolygonOffsetFactor = null;\n\t\tcurrentPolygonOffsetUnits = null;\n\n\t\tcurrentScissor.set( 0, 0, gl.canvas.width, gl.canvas.height );\n\t\tcurrentViewport.set( 0, 0, gl.canvas.width, gl.canvas.height );\n\n\t\tcolorBuffer.reset();\n\t\tdepthBuffer.reset();\n\t\tstencilBuffer.reset();\n\n\t}\n\n\treturn {\n\n\t\tbuffers: {\n\t\t\tcolor: colorBuffer,\n\t\t\tdepth: depthBuffer,\n\t\t\tstencil: stencilBuffer\n\t\t},\n\n\t\tenable: enable,\n\t\tdisable: disable,\n\n\t\tbindFramebuffer: bindFramebuffer,\n\t\tdrawBuffers: drawBuffers,\n\n\t\tuseProgram: useProgram,\n\n\t\tsetBlending: setBlending,\n\t\tsetMaterial: setMaterial,\n\n\t\tsetFlipSided: setFlipSided,\n\t\tsetCullFace: setCullFace,\n\n\t\tsetLineWidth: setLineWidth,\n\t\tsetPolygonOffset: setPolygonOffset,\n\n\t\tsetScissorTest: setScissorTest,\n\n\t\tactiveTexture: activeTexture,\n\t\tbindTexture: bindTexture,\n\t\tunbindTexture: unbindTexture,\n\t\tcompressedTexImage2D: compressedTexImage2D,\n\t\ttexImage2D: texImage2D,\n\t\ttexImage3D: texImage3D,\n\n\t\ttexStorage2D: texStorage2D,\n\t\ttexStorage3D: texStorage3D,\n\t\ttexSubImage2D: texSubImage2D,\n\t\ttexSubImage3D: texSubImage3D,\n\t\tcompressedTexSubImage2D: compressedTexSubImage2D,\n\n\t\tscissor: scissor,\n\t\tviewport: viewport,\n\n\t\treset: reset\n\n\t};\n\n}\n\nexport { WebGLState };\n","import { LinearFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, NearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, RGBAFormat, DepthFormat, DepthStencilFormat, UnsignedShortType, UnsignedIntType, UnsignedInt248Type, FloatType, HalfFloatType, MirroredRepeatWrapping, ClampToEdgeWrapping, RepeatWrapping, sRGBEncoding, LinearEncoding, UnsignedByteType, _SRGBAFormat } from '../../constants.js';\nimport * as MathUtils from '../../math/MathUtils.js';\nimport { ImageUtils } from '../../extras/ImageUtils.js';\nimport { createElementNS } from '../../utils.js';\n\nfunction WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\tconst maxTextures = capabilities.maxTextures;\n\tconst maxCubemapSize = capabilities.maxCubemapSize;\n\tconst maxTextureSize = capabilities.maxTextureSize;\n\tconst maxSamples = capabilities.maxSamples;\n\tconst hasMultisampledRenderToTexture = extensions.has( 'WEBGL_multisampled_render_to_texture' );\n\tconst MultisampledRenderToTextureExtension = hasMultisampledRenderToTexture ? extensions.get( 'WEBGL_multisampled_render_to_texture' ) : undefined;\n\n\tconst _videoTextures = new WeakMap();\n\tlet _canvas;\n\n\t// cordova iOS (as of 5.0) still uses UIWebView, which provides OffscreenCanvas,\n\t// also OffscreenCanvas.getContext(\"webgl\"), but not OffscreenCanvas.getContext(\"2d\")!\n\t// Some implementations may only implement OffscreenCanvas partially (e.g. lacking 2d).\n\n\tlet useOffscreenCanvas = false;\n\n\ttry {\n\n\t\tuseOffscreenCanvas = typeof OffscreenCanvas !== 'undefined'\n\t\t\t&& ( new OffscreenCanvas( 1, 1 ).getContext( '2d' ) ) !== null;\n\n\t} catch ( err ) {\n\n\t\t// Ignore any errors\n\n\t}\n\n\tfunction createCanvas( width, height ) {\n\n\t\t// Use OffscreenCanvas when available. Specially needed in web workers\n\n\t\treturn useOffscreenCanvas ?\n\t\t\tnew OffscreenCanvas( width, height ) : createElementNS( 'canvas' );\n\n\t}\n\n\tfunction resizeImage( image, needsPowerOfTwo, needsNewCanvas, maxSize ) {\n\n\t\tlet scale = 1;\n\n\t\t// handle case if texture exceeds max size\n\n\t\tif ( image.width > maxSize || image.height > maxSize ) {\n\n\t\t\tscale = maxSize / Math.max( image.width, image.height );\n\n\t\t}\n\n\t\t// only perform resize if necessary\n\n\t\tif ( scale < 1 || needsPowerOfTwo === true ) {\n\n\t\t\t// only perform resize for certain image types\n\n\t\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t\t\tconst floor = needsPowerOfTwo ? MathUtils.floorPowerOfTwo : Math.floor;\n\n\t\t\t\tconst width = floor( scale * image.width );\n\t\t\t\tconst height = floor( scale * image.height );\n\n\t\t\t\tif ( _canvas === undefined ) _canvas = createCanvas( width, height );\n\n\t\t\t\t// cube textures can't reuse the same canvas\n\n\t\t\t\tconst canvas = needsNewCanvas ? createCanvas( width, height ) : _canvas;\n\n\t\t\t\tcanvas.width = width;\n\t\t\t\tcanvas.height = height;\n\n\t\t\t\tconst context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, width, height );\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture has been resized from (' + image.width + 'x' + image.height + ') to (' + width + 'x' + height + ').' );\n\n\t\t\t\treturn canvas;\n\n\t\t\t} else {\n\n\t\t\t\tif ( 'data' in image ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Image in DataTexture is too big (' + image.width + 'x' + image.height + ').' );\n\n\t\t\t\t}\n\n\t\t\t\treturn image;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn image;\n\n\t}\n\n\tfunction isPowerOfTwo( image ) {\n\n\t\treturn MathUtils.isPowerOfTwo( image.width ) && MathUtils.isPowerOfTwo( image.height );\n\n\t}\n\n\tfunction textureNeedsPowerOfTwo( texture ) {\n\n\t\tif ( isWebGL2 ) return false;\n\n\t\treturn ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) ||\n\t\t\t( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter );\n\n\t}\n\n\tfunction textureNeedsGenerateMipmaps( texture, supportsMips ) {\n\n\t\treturn texture.generateMipmaps && supportsMips &&\n\t\t\ttexture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter;\n\n\t}\n\n\tfunction generateMipmap( target ) {\n\n\t\t_gl.generateMipmap( target );\n\n\t}\n\n\tfunction getInternalFormat( internalFormatName, glFormat, glType, encoding, isVideoTexture = false ) {\n\n\t\tif ( isWebGL2 === false ) return glFormat;\n\n\t\tif ( internalFormatName !== null ) {\n\n\t\t\tif ( _gl[ internalFormatName ] !== undefined ) return _gl[ internalFormatName ];\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format \\'' + internalFormatName + '\\'' );\n\n\t\t}\n\n\t\tlet internalFormat = glFormat;\n\n\t\tif ( glFormat === _gl.RED ) {\n\n\t\t\tif ( glType === _gl.FLOAT ) internalFormat = _gl.R32F;\n\t\t\tif ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.R16F;\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.R8;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RG ) {\n\n\t\t\tif ( glType === _gl.FLOAT ) internalFormat = _gl.RG32F;\n\t\t\tif ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.RG16F;\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RG8;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RGBA ) {\n\n\t\t\tif ( glType === _gl.FLOAT ) internalFormat = _gl.RGBA32F;\n\t\t\tif ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.RGBA16F;\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = ( encoding === sRGBEncoding && isVideoTexture === false ) ? _gl.SRGB8_ALPHA8 : _gl.RGBA8;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT_4_4_4_4 ) internalFormat = _gl.RGBA4;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT_5_5_5_1 ) internalFormat = _gl.RGB5_A1;\n\n\t\t}\n\n\t\tif ( internalFormat === _gl.R16F || internalFormat === _gl.R32F ||\n\t\t\tinternalFormat === _gl.RG16F || internalFormat === _gl.RG32F ||\n\t\t\tinternalFormat === _gl.RGBA16F || internalFormat === _gl.RGBA32F ) {\n\n\t\t\textensions.get( 'EXT_color_buffer_float' );\n\n\t\t}\n\n\t\treturn internalFormat;\n\n\t}\n\n\tfunction getMipLevels( texture, image, supportsMips ) {\n\n\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) === true || ( texture.isFramebufferTexture && texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) ) {\n\n\t\t\treturn Math.log2( Math.max( image.width, image.height ) ) + 1;\n\n\t\t} else if ( texture.mipmaps !== undefined && texture.mipmaps.length > 0 ) {\n\n\t\t\t// user-defined mipmaps\n\n\t\t\treturn texture.mipmaps.length;\n\n\t\t} else if ( texture.isCompressedTexture && Array.isArray( texture.image ) ) {\n\n\t\t\treturn image.mipmaps.length;\n\n\t\t} else {\n\n\t\t\t// texture without mipmaps (only base level)\n\n\t\t\treturn 1;\n\n\t\t}\n\n\t}\n\n\t// Fallback filters for non-power-of-2 textures\n\n\tfunction filterFallback( f ) {\n\n\t\tif ( f === NearestFilter || f === NearestMipmapNearestFilter || f === NearestMipmapLinearFilter ) {\n\n\t\t\treturn _gl.NEAREST;\n\n\t\t}\n\n\t\treturn _gl.LINEAR;\n\n\t}\n\n\t//\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tdeallocateTexture( texture );\n\n\t\tif ( texture.isVideoTexture ) {\n\n\t\t\t_videoTextures.delete( texture );\n\n\t\t}\n\n\t\tinfo.memory.textures --;\n\n\t}\n\n\tfunction onRenderTargetDispose( event ) {\n\n\t\tconst renderTarget = event.target;\n\n\t\trenderTarget.removeEventListener( 'dispose', onRenderTargetDispose );\n\n\t\tdeallocateRenderTarget( renderTarget );\n\n\t}\n\n\t//\n\n\tfunction deallocateTexture( texture ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( textureProperties.__webglInit === undefined ) return;\n\n\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\tproperties.remove( texture );\n\n\t}\n\n\tfunction deallocateRenderTarget( renderTarget ) {\n\n\t\tconst texture = renderTarget.texture;\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( ! renderTarget ) return;\n\n\t\tif ( textureProperties.__webglTexture !== undefined ) {\n\n\t\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\t\tinfo.memory.textures --;\n\n\t\t}\n\n\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\trenderTarget.depthTexture.dispose();\n\n\t\t}\n\n\t\tif ( renderTarget.isWebGLCubeRenderTarget ) {\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );\n\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );\n\t\t\tif ( renderTargetProperties.__webglMultisampledFramebuffer ) _gl.deleteFramebuffer( renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\tif ( renderTargetProperties.__webglColorRenderbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglColorRenderbuffer );\n\t\t\tif ( renderTargetProperties.__webglDepthRenderbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthRenderbuffer );\n\n\t\t}\n\n\t\tif ( renderTarget.isWebGLMultipleRenderTargets ) {\n\n\t\t\tfor ( let i = 0, il = texture.length; i < il; i ++ ) {\n\n\t\t\t\tconst attachmentProperties = properties.get( texture[ i ] );\n\n\t\t\t\tif ( attachmentProperties.__webglTexture ) {\n\n\t\t\t\t\t_gl.deleteTexture( attachmentProperties.__webglTexture );\n\n\t\t\t\t\tinfo.memory.textures --;\n\n\t\t\t\t}\n\n\t\t\t\tproperties.remove( texture[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tproperties.remove( texture );\n\t\tproperties.remove( renderTarget );\n\n\t}\n\n\t//\n\n\tlet textureUnits = 0;\n\n\tfunction resetTextureUnits() {\n\n\t\ttextureUnits = 0;\n\n\t}\n\n\tfunction allocateTextureUnit() {\n\n\t\tconst textureUnit = textureUnits;\n\n\t\tif ( textureUnit >= maxTextures ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLTextures: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + maxTextures );\n\n\t\t}\n\n\t\ttextureUnits += 1;\n\n\t\treturn textureUnit;\n\n\t}\n\n\t//\n\n\tfunction setTexture2D( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.isVideoTexture ) updateVideoTexture( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tconst image = texture.image;\n\n\t\t\tif ( image === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined' );\n\n\t\t\t} else if ( image.complete === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete' );\n\n\t\t\t} else {\n\n\t\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\n\t}\n\n\tfunction setTexture2DArray( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\tstate.bindTexture( _gl.TEXTURE_2D_ARRAY, textureProperties.__webglTexture );\n\n\t}\n\n\tfunction setTexture3D( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\tstate.bindTexture( _gl.TEXTURE_3D, textureProperties.__webglTexture );\n\n\t}\n\n\tfunction setTextureCube( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadCubeTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );\n\n\t}\n\n\tconst wrappingToGL = {\n\t\t[ RepeatWrapping ]: _gl.REPEAT,\n\t\t[ ClampToEdgeWrapping ]: _gl.CLAMP_TO_EDGE,\n\t\t[ MirroredRepeatWrapping ]: _gl.MIRRORED_REPEAT\n\t};\n\n\tconst filterToGL = {\n\t\t[ NearestFilter ]: _gl.NEAREST,\n\t\t[ NearestMipmapNearestFilter ]: _gl.NEAREST_MIPMAP_NEAREST,\n\t\t[ NearestMipmapLinearFilter ]: _gl.NEAREST_MIPMAP_LINEAR,\n\n\t\t[ LinearFilter ]: _gl.LINEAR,\n\t\t[ LinearMipmapNearestFilter ]: _gl.LINEAR_MIPMAP_NEAREST,\n\t\t[ LinearMipmapLinearFilter ]: _gl.LINEAR_MIPMAP_LINEAR\n\t};\n\n\tfunction setTextureParameters( textureType, texture, supportsMips ) {\n\n\t\tif ( supportsMips ) {\n\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, wrappingToGL[ texture.wrapS ] );\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, wrappingToGL[ texture.wrapT ] );\n\n\t\t\tif ( textureType === _gl.TEXTURE_3D || textureType === _gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_R, wrappingToGL[ texture.wrapR ] );\n\n\t\t\t}\n\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterToGL[ texture.magFilter ] );\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterToGL[ texture.minFilter ] );\n\n\t\t} else {\n\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE );\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE );\n\n\t\t\tif ( textureType === _gl.TEXTURE_3D || textureType === _gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_R, _gl.CLAMP_TO_EDGE );\n\n\t\t\t}\n\n\t\t\tif ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.' );\n\n\t\t\t}\n\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterFallback( texture.magFilter ) );\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterFallback( texture.minFilter ) );\n\n\t\t\tif ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) {\n\n\t\t\tconst extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tif ( texture.type === FloatType && extensions.has( 'OES_texture_float_linear' ) === false ) return; // verify extension for WebGL 1 and WebGL 2\n\t\t\tif ( isWebGL2 === false && ( texture.type === HalfFloatType && extensions.has( 'OES_texture_half_float_linear' ) === false ) ) return; // verify extension for WebGL 1 only\n\n\t\t\tif ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) {\n\n\t\t\t\t_gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) );\n\t\t\t\tproperties.get( texture ).__currentAnisotropy = texture.anisotropy;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction initTexture( textureProperties, texture ) {\n\n\t\tif ( textureProperties.__webglInit === undefined ) {\n\n\t\t\ttextureProperties.__webglInit = true;\n\n\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\tinfo.memory.textures ++;\n\n\t\t}\n\n\t}\n\n\tfunction uploadTexture( textureProperties, texture, slot ) {\n\n\t\tlet textureType = _gl.TEXTURE_2D;\n\n\t\tif ( texture.isDataTexture2DArray ) textureType = _gl.TEXTURE_2D_ARRAY;\n\t\tif ( texture.isDataTexture3D ) textureType = _gl.TEXTURE_3D;\n\n\t\tinitTexture( textureProperties, texture );\n\n\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\tstate.bindTexture( textureType, textureProperties.__webglTexture );\n\n\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );\n\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );\n\t\t_gl.pixelStorei( _gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, _gl.NONE );\n\n\t\tconst needsPowerOfTwo = textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( texture.image ) === false;\n\t\tlet image = resizeImage( texture.image, needsPowerOfTwo, false, maxTextureSize );\n\t\timage = verifyColorSpace( texture, image );\n\n\t\tconst supportsMips = isPowerOfTwo( image ) || isWebGL2,\n\t\t\tglFormat = utils.convert( texture.format, texture.encoding );\n\n\t\tlet glType = utils.convert( texture.type ),\n\t\t\tglInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding, texture.isVideoTexture );\n\n\t\tsetTextureParameters( textureType, texture, supportsMips );\n\n\t\tlet mipmap;\n\t\tconst mipmaps = texture.mipmaps;\n\n\t\tconst useTexStorage = ( isWebGL2 && texture.isVideoTexture !== true );\n\t\tconst allocateMemory = ( textureProperties.__version === undefined );\n\t\tconst levels = getMipLevels( texture, image, supportsMips );\n\n\t\tif ( texture.isDepthTexture ) {\n\n\t\t\t// populate depth texture with dummy data\n\n\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT;\n\n\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\tif ( texture.type === FloatType ) {\n\n\t\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT32F;\n\n\t\t\t\t} else if ( texture.type === UnsignedIntType ) {\n\n\t\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT24;\n\n\t\t\t\t} else if ( texture.type === UnsignedInt248Type ) {\n\n\t\t\t\t\tglInternalFormat = _gl.DEPTH24_STENCIL8;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT16; // WebGL2 requires sized internalformat for glTexImage2D\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( texture.type === FloatType ) {\n\n\t\t\t\t\tconsole.error( 'WebGLRenderer: Floating point depth texture requires WebGL2.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// validation checks for WebGL 1\n\n\t\t\tif ( texture.format === DepthFormat && glInternalFormat === _gl.DEPTH_COMPONENT ) {\n\n\t\t\t\t// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are\n\t\t\t\t// DEPTH_COMPONENT and type is not UNSIGNED_SHORT or UNSIGNED_INT\n\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\tif ( texture.type !== UnsignedShortType && texture.type !== UnsignedIntType ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.' );\n\n\t\t\t\t\ttexture.type = UnsignedShortType;\n\t\t\t\t\tglType = utils.convert( texture.type );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( texture.format === DepthStencilFormat && glInternalFormat === _gl.DEPTH_COMPONENT ) {\n\n\t\t\t\t// Depth stencil textures need the DEPTH_STENCIL internal format\n\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\tglInternalFormat = _gl.DEPTH_STENCIL;\n\n\t\t\t\t// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are\n\t\t\t\t// DEPTH_STENCIL and type is not UNSIGNED_INT_24_8_WEBGL.\n\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\tif ( texture.type !== UnsignedInt248Type ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.' );\n\n\t\t\t\t\ttexture.type = UnsignedInt248Type;\n\t\t\t\t\tglType = utils.convert( texture.type );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, 1, glInternalFormat, image.width, image.height );\n\n\t\t\t} else {\n\n\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null );\n\n\t\t\t}\n\n\t\t} else if ( texture.isDataTexture ) {\n\n\t\t\t// use manually created mipmaps if available\n\t\t\t// if there are no manual mipmaps\n\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\tif ( mipmaps.length > 0 && supportsMips ) {\n\n\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t} else {\n\n\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, image.width, image.height, glFormat, glType, image.data );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( texture.isCompressedTexture ) {\n\n\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tstate.compressedTexSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( texture.isDataTexture2DArray ) {\n\n\t\t\tif ( useTexStorage ) {\n\n\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\tstate.texStorage3D( _gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, image.width, image.height, image.depth );\n\n\t\t\t\t}\n\n\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_2D_ARRAY, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );\n\n\t\t\t} else {\n\n\t\t\t\tstate.texImage3D( _gl.TEXTURE_2D_ARRAY, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );\n\n\t\t\t}\n\n\t\t} else if ( texture.isDataTexture3D ) {\n\n\t\t\tif ( useTexStorage ) {\n\n\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\tstate.texStorage3D( _gl.TEXTURE_3D, levels, glInternalFormat, image.width, image.height, image.depth );\n\n\t\t\t\t}\n\n\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_3D, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );\n\n\t\t\t} else {\n\n\t\t\t\tstate.texImage3D( _gl.TEXTURE_3D, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );\n\n\t\t\t}\n\n\t\t} else if ( texture.isFramebufferTexture ) {\n\n\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t} else {\n\n\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// regular Texture (image, video, canvas)\n\n\t\t\t// use manually created mipmaps if available\n\t\t\t// if there are no manual mipmaps\n\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\tif ( mipmaps.length > 0 && supportsMips ) {\n\n\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, glFormat, glType, mipmap );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, glFormat, glType, mipmap );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t} else {\n\n\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, glFormat, glType, image );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, glFormat, glType, image );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\tgenerateMipmap( textureType );\n\n\t\t}\n\n\t\ttextureProperties.__version = texture.version;\n\n\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t}\n\n\tfunction uploadCubeTexture( textureProperties, texture, slot ) {\n\n\t\tif ( texture.image.length !== 6 ) return;\n\n\t\tinitTexture( textureProperties, texture );\n\n\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );\n\n\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );\n\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );\n\t\t_gl.pixelStorei( _gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, _gl.NONE );\n\n\t\tconst isCompressed = ( texture && ( texture.isCompressedTexture || texture.image[ 0 ].isCompressedTexture ) );\n\t\tconst isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture );\n\n\t\tconst cubeImage = [];\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tif ( ! isCompressed && ! isDataTexture ) {\n\n\t\t\t\tcubeImage[ i ] = resizeImage( texture.image[ i ], false, true, maxCubemapSize );\n\n\t\t\t} else {\n\n\t\t\t\tcubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];\n\n\t\t\t}\n\n\t\t\tcubeImage[ i ] = verifyColorSpace( texture, cubeImage[ i ] );\n\n\t\t}\n\n\t\tconst image = cubeImage[ 0 ],\n\t\t\tsupportsMips = isPowerOfTwo( image ) || isWebGL2,\n\t\t\tglFormat = utils.convert( texture.format, texture.encoding ),\n\t\t\tglType = utils.convert( texture.type ),\n\t\t\tglInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );\n\n\t\tconst useTexStorage = ( isWebGL2 && texture.isVideoTexture !== true );\n\t\tconst allocateMemory = ( textureProperties.__version === undefined );\n\t\tlet levels = getMipLevels( texture, image, supportsMips );\n\n\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, supportsMips );\n\n\t\tlet mipmaps;\n\n\t\tif ( isCompressed ) {\n\n\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\tstate.texStorage2D( _gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tmipmaps = cubeImage[ i ].mipmaps;\n\n\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\n\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tstate.compressedTexSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tmipmaps = texture.mipmaps;\n\n\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t// TODO: Uniformly handle mipmap definitions\n\t\t\t\t// Normal textures and compressed cube textures define base level + mips with their mipmap array\n\t\t\t\t// Uncompressed cube textures use their mipmap array only for mips (no base level)\n\n\t\t\t\tif ( mipmaps.length > 0 ) levels ++;\n\n\t\t\t\tstate.texStorage2D( _gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, cubeImage[ 0 ].width, cubeImage[ 0 ].height );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( isDataTexture ) {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, cubeImage[ i ].width, cubeImage[ i ].height, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\t\t\t\t\t\tconst mipmapImage = mipmap.image[ i ].image;\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, mipmapImage.width, mipmapImage.height, glFormat, glType, mipmapImage.data );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, mipmapImage.width, mipmapImage.height, 0, glFormat, glType, mipmapImage.data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, glFormat, glType, mipmap.image[ i ] );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, glFormat, glType, mipmap.image[ i ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\t// We assume images for cube map have the same size.\n\t\t\tgenerateMipmap( _gl.TEXTURE_CUBE_MAP );\n\n\t\t}\n\n\t\ttextureProperties.__version = texture.version;\n\n\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t}\n\n\t// Render targets\n\n\t// Setup storage for target texture and bind it to correct framebuffer\n\tfunction setupFrameBufferTexture( framebuffer, renderTarget, texture, attachment, textureTarget ) {\n\n\t\tconst glFormat = utils.convert( texture.format, texture.encoding );\n\t\tconst glType = utils.convert( texture.type );\n\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\tif ( ! renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\tif ( textureTarget === _gl.TEXTURE_3D || textureTarget === _gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t\tstate.texImage3D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, renderTarget.depth, 0, glFormat, glType, null );\n\n\t\t\t} else {\n\n\t\t\t\tstate.texImage2D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\t\tif ( renderTarget.useRenderToTexture ) {\n\n\t\t\tMultisampledRenderToTextureExtension.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( texture ).__webglTexture, 0, getRenderTargetSamples( renderTarget ) );\n\n\t\t} else {\n\n\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( texture ).__webglTexture, 0 );\n\n\t\t}\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t}\n\n\n\t// Setup storage for internal depth/stencil buffers and bind to correct framebuffer\n\tfunction setupRenderBufferStorage( renderbuffer, renderTarget, isMultisample ) {\n\n\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\n\t\tif ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) {\n\n\t\t\tlet glInternalFormat = _gl.DEPTH_COMPONENT16;\n\n\t\t\tif ( isMultisample || renderTarget.useRenderToTexture ) {\n\n\t\t\t\tconst depthTexture = renderTarget.depthTexture;\n\n\t\t\t\tif ( depthTexture && depthTexture.isDepthTexture ) {\n\n\t\t\t\t\tif ( depthTexture.type === FloatType ) {\n\n\t\t\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT32F;\n\n\t\t\t\t\t} else if ( depthTexture.type === UnsignedIntType ) {\n\n\t\t\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT24;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\t\t\tif ( renderTarget.useRenderToTexture ) {\n\n\t\t\t\t\tMultisampledRenderToTextureExtension.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t} else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {\n\n\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\t\tif ( isMultisample && renderTarget.useRenderbuffer ) {\n\n\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, _gl.DEPTH24_STENCIL8, renderTarget.width, renderTarget.height );\n\n\t\t\t} else if ( renderTarget.useRenderToTexture ) {\n\n\t\t\t\tMultisampledRenderToTextureExtension.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, _gl.DEPTH24_STENCIL8, renderTarget.width, renderTarget.height );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\n\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t} else {\n\n\t\t\t// Use the first texture for MRT so far\n\t\t\tconst texture = renderTarget.isWebGLMultipleRenderTargets === true ? renderTarget.texture[ 0 ] : renderTarget.texture;\n\n\t\t\tconst glFormat = utils.convert( texture.format, texture.encoding );\n\t\t\tconst glType = utils.convert( texture.type );\n\t\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );\n\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\t\tif ( isMultisample && renderTarget.useRenderbuffer ) {\n\n\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t} else if ( renderTarget.useRenderToTexture ) {\n\n\t\t\t\tMultisampledRenderToTextureExtension.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t}\n\n\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\n\n\t}\n\n\t// Setup resources for a Depth Texture for a FBO (needs an extension)\n\tfunction setupDepthTexture( framebuffer, renderTarget ) {\n\n\t\tconst isCube = ( renderTarget && renderTarget.isWebGLCubeRenderTarget );\n\t\tif ( isCube ) throw new Error( 'Depth Texture with cube render targets is not supported' );\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\tif ( ! ( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) {\n\n\t\t\tthrow new Error( 'renderTarget.depthTexture must be an instance of THREE.DepthTexture' );\n\n\t\t}\n\n\t\t// upload an empty depth texture with framebuffer size\n\t\tif ( ! properties.get( renderTarget.depthTexture ).__webglTexture ||\n\t\t\t\trenderTarget.depthTexture.image.width !== renderTarget.width ||\n\t\t\t\trenderTarget.depthTexture.image.height !== renderTarget.height ) {\n\n\t\t\trenderTarget.depthTexture.image.width = renderTarget.width;\n\t\t\trenderTarget.depthTexture.image.height = renderTarget.height;\n\t\t\trenderTarget.depthTexture.needsUpdate = true;\n\n\t\t}\n\n\t\tsetTexture2D( renderTarget.depthTexture, 0 );\n\n\t\tconst webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture;\n\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\tif ( renderTarget.depthTexture.format === DepthFormat ) {\n\n\t\t\tif ( renderTarget.useRenderToTexture ) {\n\n\t\t\t\tMultisampledRenderToTextureExtension.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t}\n\n\t\t} else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {\n\n\t\t\tif ( renderTarget.useRenderToTexture ) {\n\n\t\t\t\tMultisampledRenderToTextureExtension.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'Unknown depthTexture format' );\n\n\t\t}\n\n\t}\n\n\t// Setup GL resources for a non-texture depth buffer\n\tfunction setupDepthRenderbuffer( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst isCube = ( renderTarget.isWebGLCubeRenderTarget === true );\n\n\t\tif ( renderTarget.depthTexture && ! renderTargetProperties.__autoAllocateDepthBuffer ) {\n\n\t\t\tif ( isCube ) throw new Error( 'target.depthTexture not supported in Cube render targets' );\n\n\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget );\n\n\t\t} else {\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\trenderTargetProperties.__webglDepthbuffer = [];\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget, false );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\trenderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();\n\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget, false );\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t}\n\n\t// rebind framebuffer with external textures\n\tfunction rebindTextures( renderTarget, colorTexture, depthTexture ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\tif ( colorTexture !== undefined ) {\n\n\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, renderTarget.texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D );\n\n\t\t}\n\n\t\tif ( depthTexture !== undefined ) {\n\n\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t}\n\n\t}\n\n\t// Set up GL resources for the render target\n\tfunction setupRenderTarget( renderTarget ) {\n\n\t\tconst texture = renderTarget.texture;\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst textureProperties = properties.get( texture );\n\n\t\trenderTarget.addEventListener( 'dispose', onRenderTargetDispose );\n\n\t\tif ( renderTarget.isWebGLMultipleRenderTargets !== true ) {\n\n\t\t\tif ( textureProperties.__webglTexture === undefined ) {\n\n\t\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t}\n\n\t\t\ttextureProperties.__version = texture.version;\n\t\t\tinfo.memory.textures ++;\n\n\t\t}\n\n\t\tconst isCube = ( renderTarget.isWebGLCubeRenderTarget === true );\n\t\tconst isMultipleRenderTargets = ( renderTarget.isWebGLMultipleRenderTargets === true );\n\t\tconst isRenderTarget3D = texture.isDataTexture3D || texture.isDataTexture2DArray;\n\t\tconst supportsMips = isPowerOfTwo( renderTarget ) || isWebGL2;\n\n\t\t// Setup framebuffer\n\n\t\tif ( isCube ) {\n\n\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\trenderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();\n\n\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\tif ( capabilities.drawBuffers ) {\n\n\t\t\t\t\tconst textures = renderTarget.texture;\n\n\t\t\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst attachmentProperties = properties.get( textures[ i ] );\n\n\t\t\t\t\t\tif ( attachmentProperties.__webglTexture === undefined ) {\n\n\t\t\t\t\t\t\tattachmentProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t\t\t\t\tinfo.memory.textures ++;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: WebGLMultipleRenderTargets can only be used with WebGL2 or WEBGL_draw_buffers extension.' );\n\n\t\t\t\t}\n\n\t\t\t} else if ( renderTarget.useRenderbuffer ) {\n\n\t\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\t\trenderTargetProperties.__webglMultisampledFramebuffer = _gl.createFramebuffer();\n\t\t\t\t\trenderTargetProperties.__webglColorRenderbuffer = _gl.createRenderbuffer();\n\n\t\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer );\n\n\t\t\t\t\tconst glFormat = utils.convert( texture.format, texture.encoding );\n\t\t\t\t\tconst glType = utils.convert( texture.type );\n\t\t\t\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );\n\t\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\t\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer );\n\t\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\n\n\t\t\t\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t\t\t\trenderTargetProperties.__webglDepthRenderbuffer = _gl.createRenderbuffer();\n\t\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthRenderbuffer, renderTarget, true );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Setup color buffer\n\n\t\tif ( isCube ) {\n\n\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, supportsMips );\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i );\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\t\tgenerateMipmap( _gl.TEXTURE_CUBE_MAP );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t} else if ( isMultipleRenderTargets ) {\n\n\t\t\tconst textures = renderTarget.texture;\n\n\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\tconst attachment = textures[ i ];\n\t\t\t\tconst attachmentProperties = properties.get( attachment );\n\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_2D, attachmentProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( _gl.TEXTURE_2D, attachment, supportsMips );\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, attachment, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D );\n\n\t\t\t\tif ( textureNeedsGenerateMipmaps( attachment, supportsMips ) ) {\n\n\t\t\t\t\tgenerateMipmap( _gl.TEXTURE_2D );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t} else {\n\n\t\t\tlet glTextureType = _gl.TEXTURE_2D;\n\n\t\t\tif ( isRenderTarget3D ) {\n\n\t\t\t\t// Render targets containing layers, i.e: Texture 3D and 2d arrays\n\n\t\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\t\tconst isTexture3D = texture.isDataTexture3D;\n\t\t\t\t\tglTextureType = isTexture3D ? _gl.TEXTURE_3D : _gl.TEXTURE_2D_ARRAY;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.DataTexture3D and THREE.DataTexture2DArray only supported with WebGL2.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.bindTexture( glTextureType, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( glTextureType, texture, supportsMips );\n\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType );\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\t\tgenerateMipmap( glTextureType );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t}\n\n\t\t// Setup depth and stencil buffers\n\n\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t}\n\n\t}\n\n\tfunction updateRenderTargetMipmap( renderTarget ) {\n\n\t\tconst supportsMips = isPowerOfTwo( renderTarget ) || isWebGL2;\n\n\t\tconst textures = renderTarget.isWebGLMultipleRenderTargets === true ? renderTarget.texture : [ renderTarget.texture ];\n\n\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\tconst texture = textures[ i ];\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\t\tconst target = renderTarget.isWebGLCubeRenderTarget ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D;\n\t\t\t\tconst webglTexture = properties.get( texture ).__webglTexture;\n\n\t\t\t\tstate.bindTexture( target, webglTexture );\n\t\t\t\tgenerateMipmap( target );\n\t\t\t\tstate.unbindTexture();\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction updateMultisampleRenderTarget( renderTarget ) {\n\n\t\tif ( renderTarget.useRenderbuffer ) {\n\n\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\tconst width = renderTarget.width;\n\t\t\t\tconst height = renderTarget.height;\n\t\t\t\tlet mask = _gl.COLOR_BUFFER_BIT;\n\t\t\t\tconst invalidationArray = [ _gl.COLOR_ATTACHMENT0 ];\n\t\t\t\tconst depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\n\t\t\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t\t\tinvalidationArray.push( depthStyle );\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! renderTarget.ignoreDepthForMultisampleCopy ) {\n\n\t\t\t\t\tif ( renderTarget.depthBuffer ) mask |= _gl.DEPTH_BUFFER_BIT;\n\t\t\t\t\tif ( renderTarget.stencilBuffer ) mask |= _gl.STENCIL_BUFFER_BIT;\n\n\t\t\t\t}\n\n\t\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\n\t\t\t\tif ( renderTarget.ignoreDepthForMultisampleCopy ) {\n\n\t\t\t\t\t_gl.invalidateFramebuffer( _gl.READ_FRAMEBUFFER, [ depthStyle ] );\n\t\t\t\t\t_gl.invalidateFramebuffer( _gl.DRAW_FRAMEBUFFER, [ depthStyle ] );\n\n\t\t\t\t}\n\n\t\t\t\t_gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, mask, _gl.NEAREST );\n\t\t\t\t_gl.invalidateFramebuffer( _gl.READ_FRAMEBUFFER, invalidationArray );\n\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.' );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction getRenderTargetSamples( renderTarget ) {\n\n\t\treturn ( isWebGL2 && ( renderTarget.useRenderbuffer || renderTarget.useRenderToTexture ) ) ?\n\t\t\tMath.min( maxSamples, renderTarget.samples ) : 0;\n\n\t}\n\n\tfunction updateVideoTexture( texture ) {\n\n\t\tconst frame = info.render.frame;\n\n\t\t// Check the last frame we updated the VideoTexture\n\n\t\tif ( _videoTextures.get( texture ) !== frame ) {\n\n\t\t\t_videoTextures.set( texture, frame );\n\t\t\ttexture.update();\n\n\t\t}\n\n\t}\n\n\tfunction verifyColorSpace( texture, image ) {\n\n\t\tconst encoding = texture.encoding;\n\t\tconst format = texture.format;\n\t\tconst type = texture.type;\n\n\t\tif ( texture.isCompressedTexture === true || texture.isVideoTexture === true || texture.format === _SRGBAFormat ) return image;\n\n\t\tif ( encoding !== LinearEncoding ) {\n\n\t\t\t// sRGB\n\n\t\t\tif ( encoding === sRGBEncoding ) {\n\n\t\t\t\tif ( isWebGL2 === false ) {\n\n\t\t\t\t\t// in WebGL 1, try to use EXT_sRGB extension and unsized formats\n\n\t\t\t\t\tif ( extensions.has( 'EXT_sRGB' ) === true && format === RGBAFormat ) {\n\n\t\t\t\t\t\ttexture.format = _SRGBAFormat;\n\n\t\t\t\t\t\t// it's not possible to generate mips in WebGL 1 with this extension\n\n\t\t\t\t\t\ttexture.minFilter = LinearFilter;\n\t\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// slow fallback (CPU decode)\n\n\t\t\t\t\t\timage = ImageUtils.sRGBToLinear( image );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// in WebGL 2 uncompressed textures can only be sRGB encoded if they have the RGBA8 format\n\n\t\t\t\t\tif ( format !== RGBAFormat || type !== UnsignedByteType ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.WebGLTextures: Unsupported texture encoding:', encoding );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn image;\n\n\t}\n\n\t// backwards compatibility\n\n\tlet warnedTexture2D = false;\n\tlet warnedTextureCube = false;\n\n\tfunction safeSetTexture2D( texture, slot ) {\n\n\t\tif ( texture && texture.isWebGLRenderTarget ) {\n\n\t\t\tif ( warnedTexture2D === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLTextures.safeSetTexture2D: don\\'t use render targets as textures. Use their .texture property instead.' );\n\t\t\t\twarnedTexture2D = true;\n\n\t\t\t}\n\n\t\t\ttexture = texture.texture;\n\n\t\t}\n\n\t\tsetTexture2D( texture, slot );\n\n\t}\n\n\tfunction safeSetTextureCube( texture, slot ) {\n\n\t\tif ( texture && texture.isWebGLCubeRenderTarget ) {\n\n\t\t\tif ( warnedTextureCube === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLTextures.safeSetTextureCube: don\\'t use cube render targets as textures. Use their .texture property instead.' );\n\t\t\t\twarnedTextureCube = true;\n\n\t\t\t}\n\n\t\t\ttexture = texture.texture;\n\n\t\t}\n\n\n\t\tsetTextureCube( texture, slot );\n\n\t}\n\n\t//\n\n\tthis.allocateTextureUnit = allocateTextureUnit;\n\tthis.resetTextureUnits = resetTextureUnits;\n\n\tthis.setTexture2D = setTexture2D;\n\tthis.setTexture2DArray = setTexture2DArray;\n\tthis.setTexture3D = setTexture3D;\n\tthis.setTextureCube = setTextureCube;\n\tthis.rebindTextures = rebindTextures;\n\tthis.setupRenderTarget = setupRenderTarget;\n\tthis.updateRenderTargetMipmap = updateRenderTargetMipmap;\n\tthis.updateMultisampleRenderTarget = updateMultisampleRenderTarget;\n\tthis.setupDepthRenderbuffer = setupDepthRenderbuffer;\n\tthis.setupFrameBufferTexture = setupFrameBufferTexture;\n\n\tthis.safeSetTexture2D = safeSetTexture2D;\n\tthis.safeSetTextureCube = safeSetTextureCube;\n\n}\n\nexport { WebGLTextures };\n","import { RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_10x10_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT5_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT1_Format, RGB_S3TC_DXT1_Format, DepthFormat, DepthStencilFormat, LuminanceAlphaFormat, LuminanceFormat, RedFormat, RGBFormat, RGBAFormat, AlphaFormat, RedIntegerFormat, RGFormat, RGIntegerFormat, RGBAIntegerFormat, HalfFloatType, FloatType, UnsignedIntType, IntType, UnsignedShortType, ShortType, ByteType, UnsignedInt248Type, UnsignedShort5551Type, UnsignedShort4444Type, UnsignedByteType, RGBA_BPTC_Format, sRGBEncoding, _SRGBAFormat } from '../../constants.js';\n\nfunction WebGLUtils( gl, extensions, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tfunction convert( p, encoding = null ) {\n\n\t\tlet extension;\n\n\t\tif ( p === UnsignedByteType ) return gl.UNSIGNED_BYTE;\n\t\tif ( p === UnsignedShort4444Type ) return gl.UNSIGNED_SHORT_4_4_4_4;\n\t\tif ( p === UnsignedShort5551Type ) return gl.UNSIGNED_SHORT_5_5_5_1;\n\n\t\tif ( p === ByteType ) return gl.BYTE;\n\t\tif ( p === ShortType ) return gl.SHORT;\n\t\tif ( p === UnsignedShortType ) return gl.UNSIGNED_SHORT;\n\t\tif ( p === IntType ) return gl.INT;\n\t\tif ( p === UnsignedIntType ) return gl.UNSIGNED_INT;\n\t\tif ( p === FloatType ) return gl.FLOAT;\n\n\t\tif ( p === HalfFloatType ) {\n\n\t\t\tif ( isWebGL2 ) return gl.HALF_FLOAT;\n\n\t\t\textension = extensions.get( 'OES_texture_half_float' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\treturn extension.HALF_FLOAT_OES;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( p === AlphaFormat ) return gl.ALPHA;\n\t\tif ( p === RGBAFormat ) return gl.RGBA;\n\t\tif ( p === LuminanceFormat ) return gl.LUMINANCE;\n\t\tif ( p === LuminanceAlphaFormat ) return gl.LUMINANCE_ALPHA;\n\t\tif ( p === DepthFormat ) return gl.DEPTH_COMPONENT;\n\t\tif ( p === DepthStencilFormat ) return gl.DEPTH_STENCIL;\n\t\tif ( p === RedFormat ) return gl.RED;\n\n\t\tif ( p === RGBFormat ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: THREE.RGBFormat has been removed. Use THREE.RGBAFormat instead. https://github.com/mrdoob/three.js/pull/23228' );\n\t\t\treturn gl.RGBA;\n\n\t\t}\n\n\t\t// WebGL 1 sRGB fallback\n\n\t\tif ( p === _SRGBAFormat ) {\n\n\t\t\textension = extensions.get( 'EXT_sRGB' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\treturn extension.SRGB_ALPHA_EXT;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// WebGL2 formats.\n\n\t\tif ( p === RedIntegerFormat ) return gl.RED_INTEGER;\n\t\tif ( p === RGFormat ) return gl.RG;\n\t\tif ( p === RGIntegerFormat ) return gl.RG_INTEGER;\n\t\tif ( p === RGBAIntegerFormat ) return gl.RGBA_INTEGER;\n\n\t\t// S3TC\n\n\t\tif ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format || p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {\n\n\t\t\tif ( encoding === sRGBEncoding ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc_srgb' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// PVRTC\n\n\t\tif ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format || p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ETC1\n\n\t\tif ( p === RGB_ETC1_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc1' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\treturn extension.COMPRESSED_RGB_ETC1_WEBGL;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ETC2\n\n\t\tif ( p === RGB_ETC2_Format || p === RGBA_ETC2_EAC_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_ETC2_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ETC2 : extension.COMPRESSED_RGB8_ETC2;\n\t\t\t\tif ( p === RGBA_ETC2_EAC_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC : extension.COMPRESSED_RGBA8_ETC2_EAC;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ASTC\n\n\t\tif ( p === RGBA_ASTC_4x4_Format || p === RGBA_ASTC_5x4_Format || p === RGBA_ASTC_5x5_Format ||\n\t\t\tp === RGBA_ASTC_6x5_Format || p === RGBA_ASTC_6x6_Format || p === RGBA_ASTC_8x5_Format ||\n\t\t\tp === RGBA_ASTC_8x6_Format || p === RGBA_ASTC_8x8_Format || p === RGBA_ASTC_10x5_Format ||\n\t\t\tp === RGBA_ASTC_10x6_Format || p === RGBA_ASTC_10x8_Format || p === RGBA_ASTC_10x10_Format ||\n\t\t\tp === RGBA_ASTC_12x10_Format || p === RGBA_ASTC_12x12_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_astc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGBA_ASTC_4x4_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR : extension.COMPRESSED_RGBA_ASTC_4x4_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_5x4_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR : extension.COMPRESSED_RGBA_ASTC_5x4_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_5x5_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR : extension.COMPRESSED_RGBA_ASTC_5x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_6x5_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR : extension.COMPRESSED_RGBA_ASTC_6x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_6x6_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR : extension.COMPRESSED_RGBA_ASTC_6x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x5_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR : extension.COMPRESSED_RGBA_ASTC_8x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x6_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR : extension.COMPRESSED_RGBA_ASTC_8x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x8_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR : extension.COMPRESSED_RGBA_ASTC_8x8_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x5_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR : extension.COMPRESSED_RGBA_ASTC_10x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x6_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR : extension.COMPRESSED_RGBA_ASTC_10x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x8_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR : extension.COMPRESSED_RGBA_ASTC_10x8_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x10_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR : extension.COMPRESSED_RGBA_ASTC_10x10_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_12x10_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR : extension.COMPRESSED_RGBA_ASTC_12x10_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_12x12_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR : extension.COMPRESSED_RGBA_ASTC_12x12_KHR;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// BPTC\n\n\t\tif ( p === RGBA_BPTC_Format ) {\n\n\t\t\textension = extensions.get( 'EXT_texture_compression_bptc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGBA_BPTC_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT : extension.COMPRESSED_RGBA_BPTC_UNORM_EXT;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( p === UnsignedInt248Type ) {\n\n\t\t\tif ( isWebGL2 ) return gl.UNSIGNED_INT_24_8;\n\n\t\t\textension = extensions.get( 'WEBGL_depth_texture' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\treturn extension.UNSIGNED_INT_24_8_WEBGL;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn { convert: convert };\n\n}\n\n\nexport { WebGLUtils };\n","import { PerspectiveCamera } from './PerspectiveCamera.js';\n\nclass ArrayCamera extends PerspectiveCamera {\n\n\tconstructor( array = [] ) {\n\n\t\tsuper();\n\n\t\tthis.cameras = array;\n\n\t}\n\n}\n\nArrayCamera.prototype.isArrayCamera = true;\n\n\nexport { ArrayCamera };\n","import { Object3D } from '../core/Object3D.js';\n\nclass Group extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'Group';\n\n\t}\n\n}\n\nGroup.prototype.isGroup = true;\n\nexport { Group };\n","import { Vector3 } from '../../math/Vector3.js';\nimport { Group } from '../../objects/Group.js';\n\nconst _moveEvent = { type: 'move' };\n\nclass WebXRController {\n\n\tconstructor() {\n\n\t\tthis._targetRay = null;\n\t\tthis._grip = null;\n\t\tthis._hand = null;\n\n\t}\n\n\tgetHandSpace() {\n\n\t\tif ( this._hand === null ) {\n\n\t\t\tthis._hand = new Group();\n\t\t\tthis._hand.matrixAutoUpdate = false;\n\t\t\tthis._hand.visible = false;\n\n\t\t\tthis._hand.joints = {};\n\t\t\tthis._hand.inputState = { pinching: false };\n\n\t\t}\n\n\t\treturn this._hand;\n\n\t}\n\n\tgetTargetRaySpace() {\n\n\t\tif ( this._targetRay === null ) {\n\n\t\t\tthis._targetRay = new Group();\n\t\t\tthis._targetRay.matrixAutoUpdate = false;\n\t\t\tthis._targetRay.visible = false;\n\t\t\tthis._targetRay.hasLinearVelocity = false;\n\t\t\tthis._targetRay.linearVelocity = new Vector3();\n\t\t\tthis._targetRay.hasAngularVelocity = false;\n\t\t\tthis._targetRay.angularVelocity = new Vector3();\n\n\t\t}\n\n\t\treturn this._targetRay;\n\n\t}\n\n\tgetGripSpace() {\n\n\t\tif ( this._grip === null ) {\n\n\t\t\tthis._grip = new Group();\n\t\t\tthis._grip.matrixAutoUpdate = false;\n\t\t\tthis._grip.visible = false;\n\t\t\tthis._grip.hasLinearVelocity = false;\n\t\t\tthis._grip.linearVelocity = new Vector3();\n\t\t\tthis._grip.hasAngularVelocity = false;\n\t\t\tthis._grip.angularVelocity = new Vector3();\n\n\t\t}\n\n\t\treturn this._grip;\n\n\t}\n\n\tdispatchEvent( event ) {\n\n\t\tif ( this._targetRay !== null ) {\n\n\t\t\tthis._targetRay.dispatchEvent( event );\n\n\t\t}\n\n\t\tif ( this._grip !== null ) {\n\n\t\t\tthis._grip.dispatchEvent( event );\n\n\t\t}\n\n\t\tif ( this._hand !== null ) {\n\n\t\t\tthis._hand.dispatchEvent( event );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tdisconnect( inputSource ) {\n\n\t\tthis.dispatchEvent( { type: 'disconnected', data: inputSource } );\n\n\t\tif ( this._targetRay !== null ) {\n\n\t\t\tthis._targetRay.visible = false;\n\n\t\t}\n\n\t\tif ( this._grip !== null ) {\n\n\t\t\tthis._grip.visible = false;\n\n\t\t}\n\n\t\tif ( this._hand !== null ) {\n\n\t\t\tthis._hand.visible = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tupdate( inputSource, frame, referenceSpace ) {\n\n\t\tlet inputPose = null;\n\t\tlet gripPose = null;\n\t\tlet handPose = null;\n\n\t\tconst targetRay = this._targetRay;\n\t\tconst grip = this._grip;\n\t\tconst hand = this._hand;\n\n\t\tif ( inputSource && frame.session.visibilityState !== 'visible-blurred' ) {\n\n\t\t\tif ( targetRay !== null ) {\n\n\t\t\t\tinputPose = frame.getPose( inputSource.targetRaySpace, referenceSpace );\n\n\t\t\t\tif ( inputPose !== null ) {\n\n\t\t\t\t\ttargetRay.matrix.fromArray( inputPose.transform.matrix );\n\t\t\t\t\ttargetRay.matrix.decompose( targetRay.position, targetRay.rotation, targetRay.scale );\n\n\t\t\t\t\tif ( inputPose.linearVelocity ) {\n\n\t\t\t\t\t\ttargetRay.hasLinearVelocity = true;\n\t\t\t\t\t\ttargetRay.linearVelocity.copy( inputPose.linearVelocity );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttargetRay.hasLinearVelocity = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( inputPose.angularVelocity ) {\n\n\t\t\t\t\t\ttargetRay.hasAngularVelocity = true;\n\t\t\t\t\t\ttargetRay.angularVelocity.copy( inputPose.angularVelocity );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttargetRay.hasAngularVelocity = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.dispatchEvent( _moveEvent );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( hand && inputSource.hand ) {\n\n\t\t\t\thandPose = true;\n\n\t\t\t\tfor ( const inputjoint of inputSource.hand.values() ) {\n\n\t\t\t\t\t// Update the joints groups with the XRJoint poses\n\t\t\t\t\tconst jointPose = frame.getJointPose( inputjoint, referenceSpace );\n\n\t\t\t\t\tif ( hand.joints[ inputjoint.jointName ] === undefined ) {\n\n\t\t\t\t\t\t// The transform of this joint will be updated with the joint pose on each frame\n\t\t\t\t\t\tconst joint = new Group();\n\t\t\t\t\t\tjoint.matrixAutoUpdate = false;\n\t\t\t\t\t\tjoint.visible = false;\n\t\t\t\t\t\thand.joints[ inputjoint.jointName ] = joint;\n\t\t\t\t\t\t// ??\n\t\t\t\t\t\thand.add( joint );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst joint = hand.joints[ inputjoint.jointName ];\n\n\t\t\t\t\tif ( jointPose !== null ) {\n\n\t\t\t\t\t\tjoint.matrix.fromArray( jointPose.transform.matrix );\n\t\t\t\t\t\tjoint.matrix.decompose( joint.position, joint.rotation, joint.scale );\n\t\t\t\t\t\tjoint.jointRadius = jointPose.radius;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tjoint.visible = jointPose !== null;\n\n\t\t\t\t}\n\n\t\t\t\t// Custom events\n\n\t\t\t\t// Check pinchz\n\t\t\t\tconst indexTip = hand.joints[ 'index-finger-tip' ];\n\t\t\t\tconst thumbTip = hand.joints[ 'thumb-tip' ];\n\t\t\t\tconst distance = indexTip.position.distanceTo( thumbTip.position );\n\n\t\t\t\tconst distanceToPinch = 0.02;\n\t\t\t\tconst threshold = 0.005;\n\n\t\t\t\tif ( hand.inputState.pinching && distance > distanceToPinch + threshold ) {\n\n\t\t\t\t\thand.inputState.pinching = false;\n\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\ttype: 'pinchend',\n\t\t\t\t\t\thandedness: inputSource.handedness,\n\t\t\t\t\t\ttarget: this\n\t\t\t\t\t} );\n\n\t\t\t\t} else if ( ! hand.inputState.pinching && distance <= distanceToPinch - threshold ) {\n\n\t\t\t\t\thand.inputState.pinching = true;\n\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\ttype: 'pinchstart',\n\t\t\t\t\t\thandedness: inputSource.handedness,\n\t\t\t\t\t\ttarget: this\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( grip !== null && inputSource.gripSpace ) {\n\n\t\t\t\t\tgripPose = frame.getPose( inputSource.gripSpace, referenceSpace );\n\n\t\t\t\t\tif ( gripPose !== null ) {\n\n\t\t\t\t\t\tgrip.matrix.fromArray( gripPose.transform.matrix );\n\t\t\t\t\t\tgrip.matrix.decompose( grip.position, grip.rotation, grip.scale );\n\n\t\t\t\t\t\tif ( gripPose.linearVelocity ) {\n\n\t\t\t\t\t\t\tgrip.hasLinearVelocity = true;\n\t\t\t\t\t\t\tgrip.linearVelocity.copy( gripPose.linearVelocity );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgrip.hasLinearVelocity = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( gripPose.angularVelocity ) {\n\n\t\t\t\t\t\t\tgrip.hasAngularVelocity = true;\n\t\t\t\t\t\t\tgrip.angularVelocity.copy( gripPose.angularVelocity );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgrip.hasAngularVelocity = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( targetRay !== null ) {\n\n\t\t\ttargetRay.visible = ( inputPose !== null );\n\n\t\t}\n\n\t\tif ( grip !== null ) {\n\n\t\t\tgrip.visible = ( gripPose !== null );\n\n\t\t}\n\n\t\tif ( hand !== null ) {\n\n\t\t\thand.visible = ( handPose !== null );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n\nexport { WebXRController };\n","import { Texture } from './Texture.js';\nimport { NearestFilter, UnsignedShortType, UnsignedInt248Type, DepthFormat, DepthStencilFormat } from '../constants.js';\n\nclass DepthTexture extends Texture {\n\n\tconstructor( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format ) {\n\n\t\tformat = format !== undefined ? format : DepthFormat;\n\n\t\tif ( format !== DepthFormat && format !== DepthStencilFormat ) {\n\n\t\t\tthrow new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' );\n\n\t\t}\n\n\t\tif ( type === undefined && format === DepthFormat ) type = UnsignedShortType;\n\t\tif ( type === undefined && format === DepthStencilFormat ) type = UnsignedInt248Type;\n\n\t\tsuper( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.image = { width: width, height: height };\n\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : NearestFilter;\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : NearestFilter;\n\n\t\tthis.flipY = false;\n\t\tthis.generateMipmaps\t= false;\n\n\t}\n\n\n}\n\nDepthTexture.prototype.isDepthTexture = true;\n\nexport { DepthTexture };\n","import { ArrayCamera } from '../../cameras/ArrayCamera.js';\nimport { EventDispatcher } from '../../core/EventDispatcher.js';\nimport { PerspectiveCamera } from '../../cameras/PerspectiveCamera.js';\nimport { Vector3 } from '../../math/Vector3.js';\nimport { Vector4 } from '../../math/Vector4.js';\nimport { WebGLAnimation } from '../webgl/WebGLAnimation.js';\nimport { WebGLRenderTarget } from '../WebGLRenderTarget.js';\nimport { WebXRController } from './WebXRController.js';\nimport { DepthTexture } from '../../textures/DepthTexture.js';\nimport { WebGLMultisampleRenderTarget } from '../WebGLMultisampleRenderTarget.js';\nimport {\n\tDepthFormat,\n\tDepthStencilFormat,\n\tRGBAFormat,\n\tsRGBEncoding,\n\tUnsignedByteType,\n\tUnsignedShortType,\n\tUnsignedInt248Type,\n} from '../../constants.js';\n\nclass WebXRManager extends EventDispatcher {\n\n\tconstructor( renderer, gl ) {\n\n\t\tsuper();\n\n\t\tconst scope = this;\n\n\t\tlet session = null;\n\t\tlet framebufferScaleFactor = 1.0;\n\n\t\tlet referenceSpace = null;\n\t\tlet referenceSpaceType = 'local-floor';\n\t\tconst hasMultisampledRenderToTexture = renderer.extensions.has( 'WEBGL_multisampled_render_to_texture' );\n\n\t\tlet pose = null;\n\t\tlet glBinding = null;\n\t\tlet glProjLayer = null;\n\t\tlet glBaseLayer = null;\n\t\tlet isMultisample = false;\n\t\tlet xrFrame = null;\n\t\tconst attributes = gl.getContextAttributes();\n\t\tlet initialRenderTarget = null;\n\t\tlet newRenderTarget = null;\n\n\t\tconst controllers = [];\n\t\tconst inputSourcesMap = new Map();\n\n\t\t//\n\n\t\tconst cameraL = new PerspectiveCamera();\n\t\tcameraL.layers.enable( 1 );\n\t\tcameraL.viewport = new Vector4();\n\n\t\tconst cameraR = new PerspectiveCamera();\n\t\tcameraR.layers.enable( 2 );\n\t\tcameraR.viewport = new Vector4();\n\n\t\tconst cameras = [ cameraL, cameraR ];\n\n\t\tconst cameraVR = new ArrayCamera();\n\t\tcameraVR.layers.enable( 1 );\n\t\tcameraVR.layers.enable( 2 );\n\n\t\tlet _currentDepthNear = null;\n\t\tlet _currentDepthFar = null;\n\n\t\t//\n\n\t\tthis.cameraAutoUpdate = true;\n\t\tthis.enabled = false;\n\n\t\tthis.isPresenting = false;\n\n\t\tthis.getController = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getTargetRaySpace();\n\n\t\t};\n\n\t\tthis.getControllerGrip = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getGripSpace();\n\n\t\t};\n\n\t\tthis.getHand = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getHandSpace();\n\n\t\t};\n\n\t\t//\n\n\t\tfunction onSessionEvent( event ) {\n\n\t\t\tconst controller = inputSourcesMap.get( event.inputSource );\n\n\t\t\tif ( controller ) {\n\n\t\t\t\tcontroller.dispatchEvent( { type: event.type, data: event.inputSource } );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onSessionEnd() {\n\n\t\t\tinputSourcesMap.forEach( function ( controller, inputSource ) {\n\n\t\t\t\tcontroller.disconnect( inputSource );\n\n\t\t\t} );\n\n\t\t\tinputSourcesMap.clear();\n\n\t\t\t_currentDepthNear = null;\n\t\t\t_currentDepthFar = null;\n\n\t\t\t// restore framebuffer/rendering state\n\n\t\t\trenderer.setRenderTarget( initialRenderTarget );\n\n\t\t\tglBaseLayer = null;\n\t\t\tglProjLayer = null;\n\t\t\tglBinding = null;\n\t\t\tsession = null;\n\t\t\tnewRenderTarget = null;\n\n\t\t\t//\n\n\t\t\tanimation.stop();\n\n\t\t\tscope.isPresenting = false;\n\n\t\t\tscope.dispatchEvent( { type: 'sessionend' } );\n\n\t\t}\n\n\t\tthis.setFramebufferScaleFactor = function ( value ) {\n\n\t\t\tframebufferScaleFactor = value;\n\n\t\t\tif ( scope.isPresenting === true ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebXRManager: Cannot change framebuffer scale while presenting.' );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.setReferenceSpaceType = function ( value ) {\n\n\t\t\treferenceSpaceType = value;\n\n\t\t\tif ( scope.isPresenting === true ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebXRManager: Cannot change reference space type while presenting.' );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.getReferenceSpace = function () {\n\n\t\t\treturn referenceSpace;\n\n\t\t};\n\n\t\tthis.getBaseLayer = function () {\n\n\t\t\treturn glProjLayer !== null ? glProjLayer : glBaseLayer;\n\n\t\t};\n\n\t\tthis.getBinding = function () {\n\n\t\t\treturn glBinding;\n\n\t\t};\n\n\t\tthis.getFrame = function () {\n\n\t\t\treturn xrFrame;\n\n\t\t};\n\n\t\tthis.getSession = function () {\n\n\t\t\treturn session;\n\n\t\t};\n\n\t\tthis.setSession = async function ( value ) {\n\n\t\t\tsession = value;\n\n\t\t\tif ( session !== null ) {\n\n\t\t\t\tinitialRenderTarget = renderer.getRenderTarget();\n\n\t\t\t\tsession.addEventListener( 'select', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'selectstart', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'selectend', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeeze', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeezestart', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeezeend', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'end', onSessionEnd );\n\t\t\t\tsession.addEventListener( 'inputsourceschange', onInputSourcesChange );\n\n\t\t\t\tif ( attributes.xrCompatible !== true ) {\n\n\t\t\t\t\tawait gl.makeXRCompatible();\n\n\t\t\t\t}\n\n\t\t\t\tif ( ( session.renderState.layers === undefined ) || ( renderer.capabilities.isWebGL2 === false ) ) {\n\n\t\t\t\t\tconst layerInit = {\n\t\t\t\t\t\tantialias: ( session.renderState.layers === undefined ) ? attributes.antialias : true,\n\t\t\t\t\t\talpha: attributes.alpha,\n\t\t\t\t\t\tdepth: attributes.depth,\n\t\t\t\t\t\tstencil: attributes.stencil,\n\t\t\t\t\t\tframebufferScaleFactor: framebufferScaleFactor\n\t\t\t\t\t};\n\n\t\t\t\t\tglBaseLayer = new XRWebGLLayer( session, gl, layerInit );\n\n\t\t\t\t\tsession.updateRenderState( { baseLayer: glBaseLayer } );\n\n\t\t\t\t\tnewRenderTarget = new WebGLRenderTarget(\n\t\t\t\t\t\tglBaseLayer.framebufferWidth,\n\t\t\t\t\t\tglBaseLayer.framebufferHeight,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tformat: RGBAFormat,\n\t\t\t\t\t\t\ttype: UnsignedByteType,\n\t\t\t\t\t\t\tencoding: renderer.outputEncoding\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tisMultisample = attributes.antialias;\n\t\t\t\t\tlet depthFormat = null;\n\t\t\t\t\tlet depthType = null;\n\t\t\t\t\tlet glDepthFormat = null;\n\n\t\t\t\t\tif ( attributes.depth ) {\n\n\t\t\t\t\t\tglDepthFormat = attributes.stencil ? gl.DEPTH24_STENCIL8 : gl.DEPTH_COMPONENT24;\n\t\t\t\t\t\tdepthFormat = attributes.stencil ? DepthStencilFormat : DepthFormat;\n\t\t\t\t\t\tdepthType = attributes.stencil ? UnsignedInt248Type : UnsignedShortType;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst projectionlayerInit = {\n\t\t\t\t\t\tcolorFormat: ( renderer.outputEncoding === sRGBEncoding ) ? gl.SRGB8_ALPHA8 : gl.RGBA8,\n\t\t\t\t\t\tdepthFormat: glDepthFormat,\n\t\t\t\t\t\tscaleFactor: framebufferScaleFactor\n\t\t\t\t\t};\n\n\t\t\t\t\tglBinding = new XRWebGLBinding( session, gl );\n\n\t\t\t\t\tglProjLayer = glBinding.createProjectionLayer( projectionlayerInit );\n\n\t\t\t\t\tsession.updateRenderState( { layers: [ glProjLayer ] } );\n\n\t\t\t\t\tif ( isMultisample ) {\n\n\t\t\t\t\t\tnewRenderTarget = new WebGLMultisampleRenderTarget(\n\t\t\t\t\t\t\tglProjLayer.textureWidth,\n\t\t\t\t\t\t\tglProjLayer.textureHeight,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tformat: RGBAFormat,\n\t\t\t\t\t\t\t\ttype: UnsignedByteType,\n\t\t\t\t\t\t\t\tdepthTexture: new DepthTexture( glProjLayer.textureWidth, glProjLayer.textureHeight, depthType, undefined, undefined, undefined, undefined, undefined, undefined, depthFormat ),\n\t\t\t\t\t\t\t\tstencilBuffer: attributes.stencil,\n\t\t\t\t\t\t\t\tignoreDepth: glProjLayer.ignoreDepthValues,\n\t\t\t\t\t\t\t\tuseRenderToTexture: hasMultisampledRenderToTexture,\n\t\t\t\t\t\t\t\tencoding: renderer.outputEncoding\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tnewRenderTarget = new WebGLRenderTarget(\n\t\t\t\t\t\t\tglProjLayer.textureWidth,\n\t\t\t\t\t\t\tglProjLayer.textureHeight,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tformat: RGBAFormat,\n\t\t\t\t\t\t\t\ttype: UnsignedByteType,\n\t\t\t\t\t\t\t\tdepthTexture: new DepthTexture( glProjLayer.textureWidth, glProjLayer.textureHeight, depthType, undefined, undefined, undefined, undefined, undefined, undefined, depthFormat ),\n\t\t\t\t\t\t\t\tstencilBuffer: attributes.stencil,\n\t\t\t\t\t\t\t\tignoreDepth: glProjLayer.ignoreDepthValues,\n\t\t\t\t\t\t\t\tencoding: renderer.outputEncoding\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tnewRenderTarget.isXRRenderTarget = true; // TODO Remove this when possible, see #23278\n\n\t\t\t\t// Set foveation to maximum.\n\t\t\t\tthis.setFoveation( 1.0 );\n\n\t\t\t\treferenceSpace = await session.requestReferenceSpace( referenceSpaceType );\n\n\t\t\t\tanimation.setContext( session );\n\t\t\t\tanimation.start();\n\n\t\t\t\tscope.isPresenting = true;\n\n\t\t\t\tscope.dispatchEvent( { type: 'sessionstart' } );\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction onInputSourcesChange( event ) {\n\n\t\t\tconst inputSources = session.inputSources;\n\n\t\t\t// Assign inputSources to available controllers\n\n\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\tinputSourcesMap.set( inputSources[ i ], controllers[ i ] );\n\n\t\t\t}\n\n\t\t\t// Notify disconnected\n\n\t\t\tfor ( let i = 0; i < event.removed.length; i ++ ) {\n\n\t\t\t\tconst inputSource = event.removed[ i ];\n\t\t\t\tconst controller = inputSourcesMap.get( inputSource );\n\n\t\t\t\tif ( controller ) {\n\n\t\t\t\t\tcontroller.dispatchEvent( { type: 'disconnected', data: inputSource } );\n\t\t\t\t\tinputSourcesMap.delete( inputSource );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Notify connected\n\n\t\t\tfor ( let i = 0; i < event.added.length; i ++ ) {\n\n\t\t\t\tconst inputSource = event.added[ i ];\n\t\t\t\tconst controller = inputSourcesMap.get( inputSource );\n\n\t\t\t\tif ( controller ) {\n\n\t\t\t\t\tcontroller.dispatchEvent( { type: 'connected', data: inputSource } );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst cameraLPos = new Vector3();\n\t\tconst cameraRPos = new Vector3();\n\n\t\t/**\n\t\t * Assumes 2 cameras that are parallel and share an X-axis, and that\n\t\t * the cameras' projection and world matrices have already been set.\n\t\t * And that near and far planes are identical for both cameras.\n\t\t * Visualization of this technique: https://computergraphics.stackexchange.com/a/4765\n\t\t */\n\t\tfunction setProjectionFromUnion( camera, cameraL, cameraR ) {\n\n\t\t\tcameraLPos.setFromMatrixPosition( cameraL.matrixWorld );\n\t\t\tcameraRPos.setFromMatrixPosition( cameraR.matrixWorld );\n\n\t\t\tconst ipd = cameraLPos.distanceTo( cameraRPos );\n\n\t\t\tconst projL = cameraL.projectionMatrix.elements;\n\t\t\tconst projR = cameraR.projectionMatrix.elements;\n\n\t\t\t// VR systems will have identical far and near planes, and\n\t\t\t// most likely identical top and bottom frustum extents.\n\t\t\t// Use the left camera for these values.\n\t\t\tconst near = projL[ 14 ] / ( projL[ 10 ] - 1 );\n\t\t\tconst far = projL[ 14 ] / ( projL[ 10 ] + 1 );\n\t\t\tconst topFov = ( projL[ 9 ] + 1 ) / projL[ 5 ];\n\t\t\tconst bottomFov = ( projL[ 9 ] - 1 ) / projL[ 5 ];\n\n\t\t\tconst leftFov = ( projL[ 8 ] - 1 ) / projL[ 0 ];\n\t\t\tconst rightFov = ( projR[ 8 ] + 1 ) / projR[ 0 ];\n\t\t\tconst left = near * leftFov;\n\t\t\tconst right = near * rightFov;\n\n\t\t\t// Calculate the new camera's position offset from the\n\t\t\t// left camera. xOffset should be roughly half `ipd`.\n\t\t\tconst zOffset = ipd / ( - leftFov + rightFov );\n\t\t\tconst xOffset = zOffset * - leftFov;\n\n\t\t\t// TODO: Better way to apply this offset?\n\t\t\tcameraL.matrixWorld.decompose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.translateX( xOffset );\n\t\t\tcamera.translateZ( zOffset );\n\t\t\tcamera.matrixWorld.compose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.matrixWorldInverse.copy( camera.matrixWorld ).invert();\n\n\t\t\t// Find the union of the frustum values of the cameras and scale\n\t\t\t// the values so that the near plane's position does not change in world space,\n\t\t\t// although must now be relative to the new union camera.\n\t\t\tconst near2 = near + zOffset;\n\t\t\tconst far2 = far + zOffset;\n\t\t\tconst left2 = left - xOffset;\n\t\t\tconst right2 = right + ( ipd - xOffset );\n\t\t\tconst top2 = topFov * far / far2 * near2;\n\t\t\tconst bottom2 = bottomFov * far / far2 * near2;\n\n\t\t\tcamera.projectionMatrix.makePerspective( left2, right2, top2, bottom2, near2, far2 );\n\n\t\t}\n\n\t\tfunction updateCamera( camera, parent ) {\n\n\t\t\tif ( parent === null ) {\n\n\t\t\t\tcamera.matrixWorld.copy( camera.matrix );\n\n\t\t\t} else {\n\n\t\t\t\tcamera.matrixWorld.multiplyMatrices( parent.matrixWorld, camera.matrix );\n\n\t\t\t}\n\n\t\t\tcamera.matrixWorldInverse.copy( camera.matrixWorld ).invert();\n\n\t\t}\n\n\t\tthis.updateCamera = function ( camera ) {\n\n\t\t\tif ( session === null ) return;\n\n\t\t\tcameraVR.near = cameraR.near = cameraL.near = camera.near;\n\t\t\tcameraVR.far = cameraR.far = cameraL.far = camera.far;\n\n\t\t\tif ( _currentDepthNear !== cameraVR.near || _currentDepthFar !== cameraVR.far ) {\n\n\t\t\t\t// Note that the new renderState won't apply until the next frame. See #18320\n\n\t\t\t\tsession.updateRenderState( {\n\t\t\t\t\tdepthNear: cameraVR.near,\n\t\t\t\t\tdepthFar: cameraVR.far\n\t\t\t\t} );\n\n\t\t\t\t_currentDepthNear = cameraVR.near;\n\t\t\t\t_currentDepthFar = cameraVR.far;\n\n\t\t\t}\n\n\t\t\tconst parent = camera.parent;\n\t\t\tconst cameras = cameraVR.cameras;\n\n\t\t\tupdateCamera( cameraVR, parent );\n\n\t\t\tfor ( let i = 0; i < cameras.length; i ++ ) {\n\n\t\t\t\tupdateCamera( cameras[ i ], parent );\n\n\t\t\t}\n\n\t\t\tcameraVR.matrixWorld.decompose( cameraVR.position, cameraVR.quaternion, cameraVR.scale );\n\n\t\t\t// update user camera and its children\n\n\t\t\tcamera.position.copy( cameraVR.position );\n\t\t\tcamera.quaternion.copy( cameraVR.quaternion );\n\t\t\tcamera.scale.copy( cameraVR.scale );\n\t\t\tcamera.matrix.copy( cameraVR.matrix );\n\t\t\tcamera.matrixWorld.copy( cameraVR.matrixWorld );\n\n\t\t\tconst children = camera.children;\n\n\t\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].updateMatrixWorld( true );\n\n\t\t\t}\n\n\t\t\t// update projection matrix for proper view frustum culling\n\n\t\t\tif ( cameras.length === 2 ) {\n\n\t\t\t\tsetProjectionFromUnion( cameraVR, cameraL, cameraR );\n\n\t\t\t} else {\n\n\t\t\t\t// assume single camera setup (AR)\n\n\t\t\t\tcameraVR.projectionMatrix.copy( cameraL.projectionMatrix );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.getCamera = function () {\n\n\t\t\treturn cameraVR;\n\n\t\t};\n\n\t\tthis.getFoveation = function () {\n\n\t\t\tif ( glProjLayer !== null ) {\n\n\t\t\t\treturn glProjLayer.fixedFoveation;\n\n\t\t\t}\n\n\t\t\tif ( glBaseLayer !== null ) {\n\n\t\t\t\treturn glBaseLayer.fixedFoveation;\n\n\t\t\t}\n\n\t\t\treturn undefined;\n\n\t\t};\n\n\t\tthis.setFoveation = function ( foveation ) {\n\n\t\t\t// 0 = no foveation = full resolution\n\t\t\t// 1 = maximum foveation = the edges render at lower resolution\n\n\t\t\tif ( glProjLayer !== null ) {\n\n\t\t\t\tglProjLayer.fixedFoveation = foveation;\n\n\t\t\t}\n\n\t\t\tif ( glBaseLayer !== null && glBaseLayer.fixedFoveation !== undefined ) {\n\n\t\t\t\tglBaseLayer.fixedFoveation = foveation;\n\n\t\t\t}\n\n\t\t};\n\n\t\t// Animation Loop\n\n\t\tlet onAnimationFrameCallback = null;\n\n\t\tfunction onAnimationFrame( time, frame ) {\n\n\t\t\tpose = frame.getViewerPose( referenceSpace );\n\t\t\txrFrame = frame;\n\n\t\t\tif ( pose !== null ) {\n\n\t\t\t\tconst views = pose.views;\n\n\t\t\t\tif ( glBaseLayer !== null ) {\n\n\t\t\t\t\trenderer.setRenderTargetFramebuffer( newRenderTarget, glBaseLayer.framebuffer );\n\t\t\t\t\trenderer.setRenderTarget( newRenderTarget );\n\n\t\t\t\t}\n\n\t\t\t\tlet cameraVRNeedsUpdate = false;\n\n\t\t\t\t// check if it's necessary to rebuild cameraVR's camera list\n\n\t\t\t\tif ( views.length !== cameraVR.cameras.length ) {\n\n\t\t\t\t\tcameraVR.cameras.length = 0;\n\t\t\t\t\tcameraVRNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < views.length; i ++ ) {\n\n\t\t\t\t\tconst view = views[ i ];\n\n\t\t\t\t\tlet viewport = null;\n\n\t\t\t\t\tif ( glBaseLayer !== null ) {\n\n\t\t\t\t\t\tviewport = glBaseLayer.getViewport( view );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst glSubImage = glBinding.getViewSubImage( glProjLayer, view );\n\t\t\t\t\t\tviewport = glSubImage.viewport;\n\n\t\t\t\t\t\t// For side-by-side projection, we only produce a single texture for both eyes.\n\t\t\t\t\t\tif ( i === 0 ) {\n\n\t\t\t\t\t\t\trenderer.setRenderTargetTextures(\n\t\t\t\t\t\t\t\tnewRenderTarget,\n\t\t\t\t\t\t\t\tglSubImage.colorTexture,\n\t\t\t\t\t\t\t\tglProjLayer.ignoreDepthValues ? undefined : glSubImage.depthStencilTexture );\n\n\t\t\t\t\t\t\trenderer.setRenderTarget( newRenderTarget );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst camera = cameras[ i ];\n\n\t\t\t\t\tcamera.matrix.fromArray( view.transform.matrix );\n\t\t\t\t\tcamera.projectionMatrix.fromArray( view.projectionMatrix );\n\t\t\t\t\tcamera.viewport.set( viewport.x, viewport.y, viewport.width, viewport.height );\n\n\t\t\t\t\tif ( i === 0 ) {\n\n\t\t\t\t\t\tcameraVR.matrix.copy( camera.matrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( cameraVRNeedsUpdate === true ) {\n\n\t\t\t\t\t\tcameraVR.cameras.push( camera );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tconst inputSources = session.inputSources;\n\n\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\tconst controller = controllers[ i ];\n\t\t\t\tconst inputSource = inputSources[ i ];\n\n\t\t\t\tcontroller.update( inputSource, frame, referenceSpace );\n\n\t\t\t}\n\n\t\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback( time, frame );\n\n\t\t\txrFrame = null;\n\n\t\t}\n\n\t\tconst animation = new WebGLAnimation();\n\n\t\tanimation.setAnimationLoop( onAnimationFrame );\n\n\t\tthis.setAnimationLoop = function ( callback ) {\n\n\t\t\tonAnimationFrameCallback = callback;\n\n\t\t};\n\n\t\tthis.dispose = function () {};\n\n\t}\n\n}\n\nexport { WebXRManager };\n","import { BackSide } from '../../constants.js';\n\nfunction WebGLMaterials( properties ) {\n\n\tfunction refreshFogUniforms( uniforms, fog ) {\n\n\t\tuniforms.fogColor.value.copy( fog.color );\n\n\t\tif ( fog.isFog ) {\n\n\t\t\tuniforms.fogNear.value = fog.near;\n\t\t\tuniforms.fogFar.value = fog.far;\n\n\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\tuniforms.fogDensity.value = fog.density;\n\n\t\t}\n\n\t}\n\n\tfunction refreshMaterialUniforms( uniforms, material, pixelRatio, height, transmissionRenderTarget ) {\n\n\t\tif ( material.isMeshBasicMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshLambertMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsLambert( uniforms, material );\n\n\t\t} else if ( material.isMeshToonMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsToon( uniforms, material );\n\n\t\t} else if ( material.isMeshPhongMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsPhong( uniforms, material );\n\n\t\t} else if ( material.isMeshStandardMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t\tif ( material.isMeshPhysicalMaterial ) {\n\n\t\t\t\trefreshUniformsPhysical( uniforms, material, transmissionRenderTarget );\n\n\t\t\t} else {\n\n\t\t\t\trefreshUniformsStandard( uniforms, material );\n\n\t\t\t}\n\n\t\t} else if ( material.isMeshMatcapMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsMatcap( uniforms, material );\n\n\t\t} else if ( material.isMeshDepthMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsDepth( uniforms, material );\n\n\t\t} else if ( material.isMeshDistanceMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsDistance( uniforms, material );\n\n\t\t} else if ( material.isMeshNormalMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsNormal( uniforms, material );\n\n\t\t} else if ( material.isLineBasicMaterial ) {\n\n\t\t\trefreshUniformsLine( uniforms, material );\n\n\t\t\tif ( material.isLineDashedMaterial ) {\n\n\t\t\t\trefreshUniformsDash( uniforms, material );\n\n\t\t\t}\n\n\t\t} else if ( material.isPointsMaterial ) {\n\n\t\t\trefreshUniformsPoints( uniforms, material, pixelRatio, height );\n\n\t\t} else if ( material.isSpriteMaterial ) {\n\n\t\t\trefreshUniformsSprites( uniforms, material );\n\n\t\t} else if ( material.isShadowMaterial ) {\n\n\t\t\tuniforms.color.value.copy( material.color );\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t} else if ( material.isShaderMaterial ) {\n\n\t\t\tmaterial.uniformsNeedUpdate = false; // #15581\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsCommon( uniforms, material ) {\n\n\t\tuniforms.opacity.value = material.opacity;\n\n\t\tif ( material.color ) {\n\n\t\t\tuniforms.diffuse.value.copy( material.color );\n\n\t\t}\n\n\t\tif ( material.emissive ) {\n\n\t\t\tuniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );\n\n\t\t}\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t}\n\n\t\tif ( material.specularMap ) {\n\n\t\t\tuniforms.specularMap.value = material.specularMap;\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t\tconst envMap = properties.get( material ).envMap;\n\n\t\tif ( envMap ) {\n\n\t\t\tuniforms.envMap.value = envMap;\n\n\t\t\tuniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? - 1 : 1;\n\n\t\t\tuniforms.reflectivity.value = material.reflectivity;\n\t\t\tuniforms.ior.value = material.ior;\n\t\t\tuniforms.refractionRatio.value = material.refractionRatio;\n\n\t\t}\n\n\t\tif ( material.lightMap ) {\n\n\t\t\tuniforms.lightMap.value = material.lightMap;\n\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\n\n\t\t}\n\n\t\tif ( material.aoMap ) {\n\n\t\t\tuniforms.aoMap.value = material.aoMap;\n\t\t\tuniforms.aoMapIntensity.value = material.aoMapIntensity;\n\n\t\t}\n\n\t\t// uv repeat and offset setting priorities\n\t\t// 1. color map\n\t\t// 2. specular map\n\t\t// 3. displacementMap map\n\t\t// 4. normal map\n\t\t// 5. bump map\n\t\t// 6. roughnessMap map\n\t\t// 7. metalnessMap map\n\t\t// 8. alphaMap map\n\t\t// 9. emissiveMap map\n\t\t// 10. clearcoat map\n\t\t// 11. clearcoat normal map\n\t\t// 12. clearcoat roughnessMap map\n\t\t// 13. specular intensity map\n\t\t// 14. specular tint map\n\t\t// 15. transmission map\n\t\t// 16. thickness map\n\n\t\tlet uvScaleMap;\n\n\t\tif ( material.map ) {\n\n\t\t\tuvScaleMap = material.map;\n\n\t\t} else if ( material.specularMap ) {\n\n\t\t\tuvScaleMap = material.specularMap;\n\n\t\t} else if ( material.displacementMap ) {\n\n\t\t\tuvScaleMap = material.displacementMap;\n\n\t\t} else if ( material.normalMap ) {\n\n\t\t\tuvScaleMap = material.normalMap;\n\n\t\t} else if ( material.bumpMap ) {\n\n\t\t\tuvScaleMap = material.bumpMap;\n\n\t\t} else if ( material.roughnessMap ) {\n\n\t\t\tuvScaleMap = material.roughnessMap;\n\n\t\t} else if ( material.metalnessMap ) {\n\n\t\t\tuvScaleMap = material.metalnessMap;\n\n\t\t} else if ( material.alphaMap ) {\n\n\t\t\tuvScaleMap = material.alphaMap;\n\n\t\t} else if ( material.emissiveMap ) {\n\n\t\t\tuvScaleMap = material.emissiveMap;\n\n\t\t} else if ( material.clearcoatMap ) {\n\n\t\t\tuvScaleMap = material.clearcoatMap;\n\n\t\t} else if ( material.clearcoatNormalMap ) {\n\n\t\t\tuvScaleMap = material.clearcoatNormalMap;\n\n\t\t} else if ( material.clearcoatRoughnessMap ) {\n\n\t\t\tuvScaleMap = material.clearcoatRoughnessMap;\n\n\t\t} else if ( material.specularIntensityMap ) {\n\n\t\t\tuvScaleMap = material.specularIntensityMap;\n\n\t\t} else if ( material.specularColorMap ) {\n\n\t\t\tuvScaleMap = material.specularColorMap;\n\n\t\t} else if ( material.transmissionMap ) {\n\n\t\t\tuvScaleMap = material.transmissionMap;\n\n\t\t} else if ( material.thicknessMap ) {\n\n\t\t\tuvScaleMap = material.thicknessMap;\n\n\t\t} else if ( material.sheenColorMap ) {\n\n\t\t\tuvScaleMap = material.sheenColorMap;\n\n\t\t} else if ( material.sheenRoughnessMap ) {\n\n\t\t\tuvScaleMap = material.sheenRoughnessMap;\n\n\t\t}\n\n\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\t// backwards compatibility\n\t\t\tif ( uvScaleMap.isWebGLRenderTarget ) {\n\n\t\t\t\tuvScaleMap = uvScaleMap.texture;\n\n\t\t\t}\n\n\t\t\tif ( uvScaleMap.matrixAutoUpdate === true ) {\n\n\t\t\t\tuvScaleMap.updateMatrix();\n\n\t\t\t}\n\n\t\t\tuniforms.uvTransform.value.copy( uvScaleMap.matrix );\n\n\t\t}\n\n\t\t// uv repeat and offset setting priorities for uv2\n\t\t// 1. ao map\n\t\t// 2. light map\n\n\t\tlet uv2ScaleMap;\n\n\t\tif ( material.aoMap ) {\n\n\t\t\tuv2ScaleMap = material.aoMap;\n\n\t\t} else if ( material.lightMap ) {\n\n\t\t\tuv2ScaleMap = material.lightMap;\n\n\t\t}\n\n\t\tif ( uv2ScaleMap !== undefined ) {\n\n\t\t\t// backwards compatibility\n\t\t\tif ( uv2ScaleMap.isWebGLRenderTarget ) {\n\n\t\t\t\tuv2ScaleMap = uv2ScaleMap.texture;\n\n\t\t\t}\n\n\t\t\tif ( uv2ScaleMap.matrixAutoUpdate === true ) {\n\n\t\t\t\tuv2ScaleMap.updateMatrix();\n\n\t\t\t}\n\n\t\t\tuniforms.uv2Transform.value.copy( uv2ScaleMap.matrix );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsLine( uniforms, material ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\n\t}\n\n\tfunction refreshUniformsDash( uniforms, material ) {\n\n\t\tuniforms.dashSize.value = material.dashSize;\n\t\tuniforms.totalSize.value = material.dashSize + material.gapSize;\n\t\tuniforms.scale.value = material.scale;\n\n\t}\n\n\tfunction refreshUniformsPoints( uniforms, material, pixelRatio, height ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\t\tuniforms.size.value = material.size * pixelRatio;\n\t\tuniforms.scale.value = height * 0.5;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t\t// uv repeat and offset setting priorities\n\t\t// 1. color map\n\t\t// 2. alpha map\n\n\t\tlet uvScaleMap;\n\n\t\tif ( material.map ) {\n\n\t\t\tuvScaleMap = material.map;\n\n\t\t} else if ( material.alphaMap ) {\n\n\t\t\tuvScaleMap = material.alphaMap;\n\n\t\t}\n\n\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\tif ( uvScaleMap.matrixAutoUpdate === true ) {\n\n\t\t\t\tuvScaleMap.updateMatrix();\n\n\t\t\t}\n\n\t\t\tuniforms.uvTransform.value.copy( uvScaleMap.matrix );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsSprites( uniforms, material ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\t\tuniforms.rotation.value = material.rotation;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t\t// uv repeat and offset setting priorities\n\t\t// 1. color map\n\t\t// 2. alpha map\n\n\t\tlet uvScaleMap;\n\n\t\tif ( material.map ) {\n\n\t\t\tuvScaleMap = material.map;\n\n\t\t} else if ( material.alphaMap ) {\n\n\t\t\tuvScaleMap = material.alphaMap;\n\n\t\t}\n\n\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\tif ( uvScaleMap.matrixAutoUpdate === true ) {\n\n\t\t\t\tuvScaleMap.updateMatrix();\n\n\t\t\t}\n\n\t\t\tuniforms.uvTransform.value.copy( uvScaleMap.matrix );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsLambert( uniforms, material ) {\n\n\t\tif ( material.emissiveMap ) {\n\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhong( uniforms, material ) {\n\n\t\tuniforms.specular.value.copy( material.specular );\n\t\tuniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )\n\n\t\tif ( material.emissiveMap ) {\n\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t}\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\t\t\tif ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\t\t\tif ( material.side === BackSide ) uniforms.normalScale.value.negate();\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsToon( uniforms, material ) {\n\n\t\tif ( material.gradientMap ) {\n\n\t\t\tuniforms.gradientMap.value = material.gradientMap;\n\n\t\t}\n\n\t\tif ( material.emissiveMap ) {\n\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t}\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\t\t\tif ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\t\t\tif ( material.side === BackSide ) uniforms.normalScale.value.negate();\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsStandard( uniforms, material ) {\n\n\t\tuniforms.roughness.value = material.roughness;\n\t\tuniforms.metalness.value = material.metalness;\n\n\t\tif ( material.roughnessMap ) {\n\n\t\t\tuniforms.roughnessMap.value = material.roughnessMap;\n\n\t\t}\n\n\t\tif ( material.metalnessMap ) {\n\n\t\t\tuniforms.metalnessMap.value = material.metalnessMap;\n\n\t\t}\n\n\t\tif ( material.emissiveMap ) {\n\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t}\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\t\t\tif ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\t\t\tif ( material.side === BackSide ) uniforms.normalScale.value.negate();\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t\tconst envMap = properties.get( material ).envMap;\n\n\t\tif ( envMap ) {\n\n\t\t\t//uniforms.envMap.value = material.envMap; // part of uniforms common\n\t\t\tuniforms.envMapIntensity.value = material.envMapIntensity;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhysical( uniforms, material, transmissionRenderTarget ) {\n\n\t\trefreshUniformsStandard( uniforms, material );\n\n\t\tuniforms.ior.value = material.ior; // also part of uniforms common\n\n\t\tif ( material.sheen > 0 ) {\n\n\t\t\tuniforms.sheenColor.value.copy( material.sheenColor ).multiplyScalar( material.sheen );\n\n\t\t\tuniforms.sheenRoughness.value = material.sheenRoughness;\n\n\t\t\tif ( material.sheenColorMap ) {\n\n\t\t\t\tuniforms.sheenColorMap.value = material.sheenColorMap;\n\n\t\t\t}\n\n\t\t\tif ( material.sheenRoughnessMap ) {\n\n\t\t\t\tuniforms.sheenRoughnessMap.value = material.sheenRoughnessMap;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.clearcoat > 0 ) {\n\n\t\t\tuniforms.clearcoat.value = material.clearcoat;\n\t\t\tuniforms.clearcoatRoughness.value = material.clearcoatRoughness;\n\n\t\t\tif ( material.clearcoatMap ) {\n\n\t\t\t\tuniforms.clearcoatMap.value = material.clearcoatMap;\n\n\t\t\t}\n\n\t\t\tif ( material.clearcoatRoughnessMap ) {\n\n\t\t\t\tuniforms.clearcoatRoughnessMap.value = material.clearcoatRoughnessMap;\n\n\t\t\t}\n\n\t\t\tif ( material.clearcoatNormalMap ) {\n\n\t\t\t\tuniforms.clearcoatNormalScale.value.copy( material.clearcoatNormalScale );\n\t\t\t\tuniforms.clearcoatNormalMap.value = material.clearcoatNormalMap;\n\n\t\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\t\tuniforms.clearcoatNormalScale.value.negate();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.transmission > 0 ) {\n\n\t\t\tuniforms.transmission.value = material.transmission;\n\t\t\tuniforms.transmissionSamplerMap.value = transmissionRenderTarget.texture;\n\t\t\tuniforms.transmissionSamplerSize.value.set( transmissionRenderTarget.width, transmissionRenderTarget.height );\n\n\t\t\tif ( material.transmissionMap ) {\n\n\t\t\t\tuniforms.transmissionMap.value = material.transmissionMap;\n\n\t\t\t}\n\n\t\t\tuniforms.thickness.value = material.thickness;\n\n\t\t\tif ( material.thicknessMap ) {\n\n\t\t\t\tuniforms.thicknessMap.value = material.thicknessMap;\n\n\t\t\t}\n\n\t\t\tuniforms.attenuationDistance.value = material.attenuationDistance;\n\t\t\tuniforms.attenuationColor.value.copy( material.attenuationColor );\n\n\t\t}\n\n\t\tuniforms.specularIntensity.value = material.specularIntensity;\n\t\tuniforms.specularColor.value.copy( material.specularColor );\n\n\t\tif ( material.specularIntensityMap ) {\n\n\t\t\tuniforms.specularIntensityMap.value = material.specularIntensityMap;\n\n\t\t}\n\n\t\tif ( material.specularColorMap ) {\n\n\t\t\tuniforms.specularColorMap.value = material.specularColorMap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsMatcap( uniforms, material ) {\n\n\t\tif ( material.matcap ) {\n\n\t\t\tuniforms.matcap.value = material.matcap;\n\n\t\t}\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\t\t\tif ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\t\t\tif ( material.side === BackSide ) uniforms.normalScale.value.negate();\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsDepth( uniforms, material ) {\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsDistance( uniforms, material ) {\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t\tuniforms.referencePosition.value.copy( material.referencePosition );\n\t\tuniforms.nearDistance.value = material.nearDistance;\n\t\tuniforms.farDistance.value = material.farDistance;\n\n\t}\n\n\tfunction refreshUniformsNormal( uniforms, material ) {\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\t\t\tif ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\t\t\tif ( material.side === BackSide ) uniforms.normalScale.value.negate();\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\trefreshFogUniforms: refreshFogUniforms,\n\t\trefreshMaterialUniforms: refreshMaterialUniforms\n\t};\n\n}\n\nexport { WebGLMaterials };\n","import {\n\tREVISION,\n\tBackSide,\n\tDoubleSide,\n\tFrontSide,\n\tRGBAFormat,\n\tHalfFloatType,\n\tFloatType,\n\tUnsignedByteType,\n\tLinearEncoding,\n\tNoToneMapping,\n\tLinearMipmapLinearFilter,\n\tNearestFilter,\n\tClampToEdgeWrapping\n} from '../constants.js';\nimport { Frustum } from '../math/Frustum.js';\nimport { Matrix4 } from '../math/Matrix4.js';\nimport { Vector3 } from '../math/Vector3.js';\nimport { Vector4 } from '../math/Vector4.js';\nimport { WebGLAnimation } from './webgl/WebGLAnimation.js';\nimport { WebGLAttributes } from './webgl/WebGLAttributes.js';\nimport { WebGLBackground } from './webgl/WebGLBackground.js';\nimport { WebGLBindingStates } from './webgl/WebGLBindingStates.js';\nimport { WebGLBufferRenderer } from './webgl/WebGLBufferRenderer.js';\nimport { WebGLCapabilities } from './webgl/WebGLCapabilities.js';\nimport { WebGLClipping } from './webgl/WebGLClipping.js';\nimport { WebGLCubeMaps } from './webgl/WebGLCubeMaps.js';\nimport { WebGLCubeUVMaps } from './webgl/WebGLCubeUVMaps.js';\nimport { WebGLExtensions } from './webgl/WebGLExtensions.js';\nimport { WebGLGeometries } from './webgl/WebGLGeometries.js';\nimport { WebGLIndexedBufferRenderer } from './webgl/WebGLIndexedBufferRenderer.js';\nimport { WebGLInfo } from './webgl/WebGLInfo.js';\nimport { WebGLMorphtargets } from './webgl/WebGLMorphtargets.js';\nimport { WebGLMultisampleRenderTarget } from './WebGLMultisampleRenderTarget.js';\nimport { WebGLObjects } from './webgl/WebGLObjects.js';\nimport { WebGLPrograms } from './webgl/WebGLPrograms.js';\nimport { WebGLProperties } from './webgl/WebGLProperties.js';\nimport { WebGLRenderLists } from './webgl/WebGLRenderLists.js';\nimport { WebGLRenderStates } from './webgl/WebGLRenderStates.js';\nimport { WebGLRenderTarget } from './WebGLRenderTarget.js';\nimport { WebGLShadowMap } from './webgl/WebGLShadowMap.js';\nimport { WebGLState } from './webgl/WebGLState.js';\nimport { WebGLTextures } from './webgl/WebGLTextures.js';\nimport { WebGLUniforms } from './webgl/WebGLUniforms.js';\nimport { WebGLUtils } from './webgl/WebGLUtils.js';\nimport { WebXRManager } from './webxr/WebXRManager.js';\nimport { WebGLMaterials } from './webgl/WebGLMaterials.js';\nimport { createElementNS } from '../utils.js';\n\nfunction createCanvasElement() {\n\n\tconst canvas = createElementNS( 'canvas' );\n\tcanvas.style.display = 'block';\n\treturn canvas;\n\n}\n\nfunction WebGLRenderer( parameters = {} ) {\n\n\tconst _canvas = parameters.canvas !== undefined ? parameters.canvas : createCanvasElement(),\n\t\t_context = parameters.context !== undefined ? parameters.context : null,\n\n\t\t_alpha = parameters.alpha !== undefined ? parameters.alpha : false,\n\t\t_depth = parameters.depth !== undefined ? parameters.depth : true,\n\t\t_stencil = parameters.stencil !== undefined ? parameters.stencil : true,\n\t\t_antialias = parameters.antialias !== undefined ? parameters.antialias : false,\n\t\t_premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,\n\t\t_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false,\n\t\t_powerPreference = parameters.powerPreference !== undefined ? parameters.powerPreference : 'default',\n\t\t_failIfMajorPerformanceCaveat = parameters.failIfMajorPerformanceCaveat !== undefined ? parameters.failIfMajorPerformanceCaveat : false;\n\n\tlet currentRenderList = null;\n\tlet currentRenderState = null;\n\n\t// render() can be called from within a callback triggered by another render.\n\t// We track this so that the nested render call gets its list and state isolated from the parent render call.\n\n\tconst renderListStack = [];\n\tconst renderStateStack = [];\n\n\t// public properties\n\n\tthis.domElement = _canvas;\n\n\t// Debug configuration container\n\tthis.debug = {\n\n\t\t/**\n\t\t * Enables error checking and reporting when shader programs are being compiled\n\t\t * @type {boolean}\n\t\t */\n\t\tcheckShaderErrors: true\n\t};\n\n\t// clearing\n\n\tthis.autoClear = true;\n\tthis.autoClearColor = true;\n\tthis.autoClearDepth = true;\n\tthis.autoClearStencil = true;\n\n\t// scene graph\n\n\tthis.sortObjects = true;\n\n\t// user-defined clipping\n\n\tthis.clippingPlanes = [];\n\tthis.localClippingEnabled = false;\n\n\t// physically based shading\n\n\tthis.outputEncoding = LinearEncoding;\n\n\t// physical lights\n\n\tthis.physicallyCorrectLights = false;\n\n\t// tone mapping\n\n\tthis.toneMapping = NoToneMapping;\n\tthis.toneMappingExposure = 1.0;\n\n\t// internal properties\n\n\tconst _this = this;\n\n\tlet _isContextLost = false;\n\n\t// internal state cache\n\n\tlet _currentActiveCubeFace = 0;\n\tlet _currentActiveMipmapLevel = 0;\n\tlet _currentRenderTarget = null;\n\tlet _currentMaterialId = - 1;\n\n\tlet _currentCamera = null;\n\n\tconst _currentViewport = new Vector4();\n\tconst _currentScissor = new Vector4();\n\tlet _currentScissorTest = null;\n\n\t//\n\n\tlet _width = _canvas.width;\n\tlet _height = _canvas.height;\n\n\tlet _pixelRatio = 1;\n\tlet _opaqueSort = null;\n\tlet _transparentSort = null;\n\n\tconst _viewport = new Vector4( 0, 0, _width, _height );\n\tconst _scissor = new Vector4( 0, 0, _width, _height );\n\tlet _scissorTest = false;\n\n\t// frustum\n\n\tconst _frustum = new Frustum();\n\n\t// clipping\n\n\tlet _clippingEnabled = false;\n\tlet _localClippingEnabled = false;\n\n\t// transmission\n\n\tlet _transmissionRenderTarget = null;\n\n\t// camera matrices cache\n\n\tconst _projScreenMatrix = new Matrix4();\n\n\tconst _vector3 = new Vector3();\n\n\tconst _emptyScene = { background: null, fog: null, environment: null, overrideMaterial: null, isScene: true };\n\n\tfunction getTargetPixelRatio() {\n\n\t\treturn _currentRenderTarget === null ? _pixelRatio : 1;\n\n\t}\n\n\t// initialize\n\n\tlet _gl = _context;\n\n\tfunction getContext( contextNames, contextAttributes ) {\n\n\t\tfor ( let i = 0; i < contextNames.length; i ++ ) {\n\n\t\t\tconst contextName = contextNames[ i ];\n\t\t\tconst context = _canvas.getContext( contextName, contextAttributes );\n\t\t\tif ( context !== null ) return context;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\ttry {\n\n\t\tconst contextAttributes = {\n\t\t\talpha: true,\n\t\t\tdepth: _depth,\n\t\t\tstencil: _stencil,\n\t\t\tantialias: _antialias,\n\t\t\tpremultipliedAlpha: _premultipliedAlpha,\n\t\t\tpreserveDrawingBuffer: _preserveDrawingBuffer,\n\t\t\tpowerPreference: _powerPreference,\n\t\t\tfailIfMajorPerformanceCaveat: _failIfMajorPerformanceCaveat\n\t\t};\n\n\t\t// OffscreenCanvas does not have setAttribute, see #22811\n\t\tif ( 'setAttribute' in _canvas ) _canvas.setAttribute( 'data-engine', `three.js r${REVISION}` );\n\n\t\t// event listeners must be registered before WebGL context is created, see #12753\n\t\t_canvas.addEventListener( 'webglcontextlost', onContextLost, false );\n\t\t_canvas.addEventListener( 'webglcontextrestored', onContextRestore, false );\n\n\t\tif ( _gl === null ) {\n\n\t\t\tconst contextNames = [ 'webgl2', 'webgl', 'experimental-webgl' ];\n\n\t\t\tif ( _this.isWebGL1Renderer === true ) {\n\n\t\t\t\tcontextNames.shift();\n\n\t\t\t}\n\n\t\t\t_gl = getContext( contextNames, contextAttributes );\n\n\t\t\tif ( _gl === null ) {\n\n\t\t\t\tif ( getContext( contextNames ) ) {\n\n\t\t\t\t\tthrow new Error( 'Error creating WebGL context with your selected attributes.' );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'Error creating WebGL context.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Some experimental-webgl implementations do not have getShaderPrecisionFormat\n\n\t\tif ( _gl.getShaderPrecisionFormat === undefined ) {\n\n\t\t\t_gl.getShaderPrecisionFormat = function () {\n\n\t\t\t\treturn { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 };\n\n\t\t\t};\n\n\t\t}\n\n\t} catch ( error ) {\n\n\t\tconsole.error( 'THREE.WebGLRenderer: ' + error.message );\n\t\tthrow error;\n\n\t}\n\n\tlet extensions, capabilities, state, info;\n\tlet properties, textures, cubemaps, cubeuvmaps, attributes, geometries, objects;\n\tlet programCache, materials, renderLists, renderStates, clipping, shadowMap;\n\n\tlet background, morphtargets, bufferRenderer, indexedBufferRenderer;\n\n\tlet utils, bindingStates;\n\n\tfunction initGLContext() {\n\n\t\textensions = new WebGLExtensions( _gl );\n\n\t\tcapabilities = new WebGLCapabilities( _gl, extensions, parameters );\n\n\t\textensions.init( capabilities );\n\n\t\tutils = new WebGLUtils( _gl, extensions, capabilities );\n\n\t\tstate = new WebGLState( _gl, extensions, capabilities );\n\n\t\tinfo = new WebGLInfo( _gl );\n\t\tproperties = new WebGLProperties();\n\t\ttextures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info );\n\t\tcubemaps = new WebGLCubeMaps( _this );\n\t\tcubeuvmaps = new WebGLCubeUVMaps( _this );\n\t\tattributes = new WebGLAttributes( _gl, capabilities );\n\t\tbindingStates = new WebGLBindingStates( _gl, extensions, attributes, capabilities );\n\t\tgeometries = new WebGLGeometries( _gl, attributes, info, bindingStates );\n\t\tobjects = new WebGLObjects( _gl, geometries, attributes, info );\n\t\tmorphtargets = new WebGLMorphtargets( _gl, capabilities, textures );\n\t\tclipping = new WebGLClipping( properties );\n\t\tprogramCache = new WebGLPrograms( _this, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping );\n\t\tmaterials = new WebGLMaterials( properties );\n\t\trenderLists = new WebGLRenderLists();\n\t\trenderStates = new WebGLRenderStates( extensions, capabilities );\n\t\tbackground = new WebGLBackground( _this, cubemaps, state, objects, _alpha, _premultipliedAlpha );\n\t\tshadowMap = new WebGLShadowMap( _this, objects, capabilities );\n\n\t\tbufferRenderer = new WebGLBufferRenderer( _gl, extensions, info, capabilities );\n\t\tindexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, info, capabilities );\n\n\t\tinfo.programs = programCache.programs;\n\n\t\t_this.capabilities = capabilities;\n\t\t_this.extensions = extensions;\n\t\t_this.properties = properties;\n\t\t_this.renderLists = renderLists;\n\t\t_this.shadowMap = shadowMap;\n\t\t_this.state = state;\n\t\t_this.info = info;\n\n\t}\n\n\tinitGLContext();\n\n\t// xr\n\n\tconst xr = new WebXRManager( _this, _gl );\n\n\tthis.xr = xr;\n\n\t// API\n\n\tthis.getContext = function () {\n\n\t\treturn _gl;\n\n\t};\n\n\tthis.getContextAttributes = function () {\n\n\t\treturn _gl.getContextAttributes();\n\n\t};\n\n\tthis.forceContextLoss = function () {\n\n\t\tconst extension = extensions.get( 'WEBGL_lose_context' );\n\t\tif ( extension ) extension.loseContext();\n\n\t};\n\n\tthis.forceContextRestore = function () {\n\n\t\tconst extension = extensions.get( 'WEBGL_lose_context' );\n\t\tif ( extension ) extension.restoreContext();\n\n\t};\n\n\tthis.getPixelRatio = function () {\n\n\t\treturn _pixelRatio;\n\n\t};\n\n\tthis.setPixelRatio = function ( value ) {\n\n\t\tif ( value === undefined ) return;\n\n\t\t_pixelRatio = value;\n\n\t\tthis.setSize( _width, _height, false );\n\n\t};\n\n\tthis.getSize = function ( target ) {\n\n\t\treturn target.set( _width, _height );\n\n\t};\n\n\tthis.setSize = function ( width, height, updateStyle ) {\n\n\t\tif ( xr.isPresenting ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Can\\'t change size while VR device is presenting.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\t_width = width;\n\t\t_height = height;\n\n\t\t_canvas.width = Math.floor( width * _pixelRatio );\n\t\t_canvas.height = Math.floor( height * _pixelRatio );\n\n\t\tif ( updateStyle !== false ) {\n\n\t\t\t_canvas.style.width = width + 'px';\n\t\t\t_canvas.style.height = height + 'px';\n\n\t\t}\n\n\t\tthis.setViewport( 0, 0, width, height );\n\n\t};\n\n\tthis.getDrawingBufferSize = function ( target ) {\n\n\t\treturn target.set( _width * _pixelRatio, _height * _pixelRatio ).floor();\n\n\t};\n\n\tthis.setDrawingBufferSize = function ( width, height, pixelRatio ) {\n\n\t\t_width = width;\n\t\t_height = height;\n\n\t\t_pixelRatio = pixelRatio;\n\n\t\t_canvas.width = Math.floor( width * pixelRatio );\n\t\t_canvas.height = Math.floor( height * pixelRatio );\n\n\t\tthis.setViewport( 0, 0, width, height );\n\n\t};\n\n\tthis.getCurrentViewport = function ( target ) {\n\n\t\treturn target.copy( _currentViewport );\n\n\t};\n\n\tthis.getViewport = function ( target ) {\n\n\t\treturn target.copy( _viewport );\n\n\t};\n\n\tthis.setViewport = function ( x, y, width, height ) {\n\n\t\tif ( x.isVector4 ) {\n\n\t\t\t_viewport.set( x.x, x.y, x.z, x.w );\n\n\t\t} else {\n\n\t\t\t_viewport.set( x, y, width, height );\n\n\t\t}\n\n\t\tstate.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor() );\n\n\t};\n\n\tthis.getScissor = function ( target ) {\n\n\t\treturn target.copy( _scissor );\n\n\t};\n\n\tthis.setScissor = function ( x, y, width, height ) {\n\n\t\tif ( x.isVector4 ) {\n\n\t\t\t_scissor.set( x.x, x.y, x.z, x.w );\n\n\t\t} else {\n\n\t\t\t_scissor.set( x, y, width, height );\n\n\t\t}\n\n\t\tstate.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor() );\n\n\t};\n\n\tthis.getScissorTest = function () {\n\n\t\treturn _scissorTest;\n\n\t};\n\n\tthis.setScissorTest = function ( boolean ) {\n\n\t\tstate.setScissorTest( _scissorTest = boolean );\n\n\t};\n\n\tthis.setOpaqueSort = function ( method ) {\n\n\t\t_opaqueSort = method;\n\n\t};\n\n\tthis.setTransparentSort = function ( method ) {\n\n\t\t_transparentSort = method;\n\n\t};\n\n\t// Clearing\n\n\tthis.getClearColor = function ( target ) {\n\n\t\treturn target.copy( background.getClearColor() );\n\n\t};\n\n\tthis.setClearColor = function () {\n\n\t\tbackground.setClearColor.apply( background, arguments );\n\n\t};\n\n\tthis.getClearAlpha = function () {\n\n\t\treturn background.getClearAlpha();\n\n\t};\n\n\tthis.setClearAlpha = function () {\n\n\t\tbackground.setClearAlpha.apply( background, arguments );\n\n\t};\n\n\tthis.clear = function ( color, depth, stencil ) {\n\n\t\tlet bits = 0;\n\n\t\tif ( color === undefined || color ) bits |= _gl.COLOR_BUFFER_BIT;\n\t\tif ( depth === undefined || depth ) bits |= _gl.DEPTH_BUFFER_BIT;\n\t\tif ( stencil === undefined || stencil ) bits |= _gl.STENCIL_BUFFER_BIT;\n\n\t\t_gl.clear( bits );\n\n\t};\n\n\tthis.clearColor = function () {\n\n\t\tthis.clear( true, false, false );\n\n\t};\n\n\tthis.clearDepth = function () {\n\n\t\tthis.clear( false, true, false );\n\n\t};\n\n\tthis.clearStencil = function () {\n\n\t\tthis.clear( false, false, true );\n\n\t};\n\n\t//\n\n\tthis.dispose = function () {\n\n\t\t_canvas.removeEventListener( 'webglcontextlost', onContextLost, false );\n\t\t_canvas.removeEventListener( 'webglcontextrestored', onContextRestore, false );\n\n\t\trenderLists.dispose();\n\t\trenderStates.dispose();\n\t\tproperties.dispose();\n\t\tcubemaps.dispose();\n\t\tcubeuvmaps.dispose();\n\t\tobjects.dispose();\n\t\tbindingStates.dispose();\n\t\tprogramCache.dispose();\n\n\t\txr.dispose();\n\n\t\txr.removeEventListener( 'sessionstart', onXRSessionStart );\n\t\txr.removeEventListener( 'sessionend', onXRSessionEnd );\n\n\t\tif ( _transmissionRenderTarget ) {\n\n\t\t\t_transmissionRenderTarget.dispose();\n\t\t\t_transmissionRenderTarget = null;\n\n\t\t}\n\n\t\tanimation.stop();\n\n\t};\n\n\t// Events\n\n\tfunction onContextLost( event ) {\n\n\t\tevent.preventDefault();\n\n\t\tconsole.log( 'THREE.WebGLRenderer: Context Lost.' );\n\n\t\t_isContextLost = true;\n\n\t}\n\n\tfunction onContextRestore( /* event */ ) {\n\n\t\tconsole.log( 'THREE.WebGLRenderer: Context Restored.' );\n\n\t\t_isContextLost = false;\n\n\t\tconst infoAutoReset = info.autoReset;\n\t\tconst shadowMapEnabled = shadowMap.enabled;\n\t\tconst shadowMapAutoUpdate = shadowMap.autoUpdate;\n\t\tconst shadowMapNeedsUpdate = shadowMap.needsUpdate;\n\t\tconst shadowMapType = shadowMap.type;\n\n\t\tinitGLContext();\n\n\t\tinfo.autoReset = infoAutoReset;\n\t\tshadowMap.enabled = shadowMapEnabled;\n\t\tshadowMap.autoUpdate = shadowMapAutoUpdate;\n\t\tshadowMap.needsUpdate = shadowMapNeedsUpdate;\n\t\tshadowMap.type = shadowMapType;\n\n\t}\n\n\tfunction onMaterialDispose( event ) {\n\n\t\tconst material = event.target;\n\n\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\n\n\t\tdeallocateMaterial( material );\n\n\t}\n\n\t// Buffer deallocation\n\n\tfunction deallocateMaterial( material ) {\n\n\t\treleaseMaterialProgramReferences( material );\n\n\t\tproperties.remove( material );\n\n\t}\n\n\n\tfunction releaseMaterialProgramReferences( material ) {\n\n\t\tconst programs = properties.get( material ).programs;\n\n\t\tif ( programs !== undefined ) {\n\n\t\t\tprograms.forEach( function ( program ) {\n\n\t\t\t\tprogramCache.releaseProgram( program );\n\n\t\t\t} );\n\n\t\t\tif ( material.isShaderMaterial ) {\n\n\t\t\t\tprogramCache.releaseShaderCache( material );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// Buffer rendering\n\n\tthis.renderBufferDirect = function ( camera, scene, geometry, material, object, group ) {\n\n\t\tif ( scene === null ) scene = _emptyScene; // renderBufferDirect second parameter used to be fog (could be null)\n\n\t\tconst frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );\n\n\t\tconst program = setProgram( camera, scene, geometry, material, object );\n\n\t\tstate.setMaterial( material, frontFaceCW );\n\n\t\t//\n\n\t\tlet index = geometry.index;\n\t\tconst position = geometry.attributes.position;\n\n\t\t//\n\n\t\tif ( index === null ) {\n\n\t\t\tif ( position === undefined || position.count === 0 ) return;\n\n\t\t} else if ( index.count === 0 ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t//\n\n\t\tlet rangeFactor = 1;\n\n\t\tif ( material.wireframe === true ) {\n\n\t\t\tindex = geometries.getWireframeAttribute( geometry );\n\t\t\trangeFactor = 2;\n\n\t\t}\n\n\t\tbindingStates.setup( object, material, program, geometry, index );\n\n\t\tlet attribute;\n\t\tlet renderer = bufferRenderer;\n\n\t\tif ( index !== null ) {\n\n\t\t\tattribute = attributes.get( index );\n\n\t\t\trenderer = indexedBufferRenderer;\n\t\t\trenderer.setIndex( attribute );\n\n\t\t}\n\n\t\t//\n\n\t\tconst dataCount = ( index !== null ) ? index.count : position.count;\n\n\t\tconst rangeStart = geometry.drawRange.start * rangeFactor;\n\t\tconst rangeCount = geometry.drawRange.count * rangeFactor;\n\n\t\tconst groupStart = group !== null ? group.start * rangeFactor : 0;\n\t\tconst groupCount = group !== null ? group.count * rangeFactor : Infinity;\n\n\t\tconst drawStart = Math.max( rangeStart, groupStart );\n\t\tconst drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1;\n\n\t\tconst drawCount = Math.max( 0, drawEnd - drawStart + 1 );\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\t//\n\n\t\tif ( object.isMesh ) {\n\n\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\tstate.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() );\n\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t} else {\n\n\t\t\t\trenderer.setMode( _gl.TRIANGLES );\n\n\t\t\t}\n\n\t\t} else if ( object.isLine ) {\n\n\t\t\tlet lineWidth = material.linewidth;\n\n\t\t\tif ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material\n\n\t\t\tstate.setLineWidth( lineWidth * getTargetPixelRatio() );\n\n\t\t\tif ( object.isLineSegments ) {\n\n\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t} else if ( object.isLineLoop ) {\n\n\t\t\t\trenderer.setMode( _gl.LINE_LOOP );\n\n\t\t\t} else {\n\n\t\t\t\trenderer.setMode( _gl.LINE_STRIP );\n\n\t\t\t}\n\n\t\t} else if ( object.isPoints ) {\n\n\t\t\trenderer.setMode( _gl.POINTS );\n\n\t\t} else if ( object.isSprite ) {\n\n\t\t\trenderer.setMode( _gl.TRIANGLES );\n\n\t\t}\n\n\t\tif ( object.isInstancedMesh ) {\n\n\t\t\trenderer.renderInstances( drawStart, drawCount, object.count );\n\n\t\t} else if ( geometry.isInstancedBufferGeometry ) {\n\n\t\t\tconst instanceCount = Math.min( geometry.instanceCount, geometry._maxInstanceCount );\n\n\t\t\trenderer.renderInstances( drawStart, drawCount, instanceCount );\n\n\t\t} else {\n\n\t\t\trenderer.render( drawStart, drawCount );\n\n\t\t}\n\n\t};\n\n\t// Compile\n\n\tthis.compile = function ( scene, camera ) {\n\n\t\tcurrentRenderState = renderStates.get( scene );\n\t\tcurrentRenderState.init();\n\n\t\trenderStateStack.push( currentRenderState );\n\n\t\tscene.traverseVisible( function ( object ) {\n\n\t\t\tif ( object.isLight && object.layers.test( camera.layers ) ) {\n\n\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t\tcurrentRenderState.setupLights( _this.physicallyCorrectLights );\n\n\t\tscene.traverse( function ( object ) {\n\n\t\t\tconst material = object.material;\n\n\t\t\tif ( material ) {\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tfor ( let i = 0; i < material.length; i ++ ) {\n\n\t\t\t\t\t\tconst material2 = material[ i ];\n\n\t\t\t\t\t\tgetProgram( material2, scene, object );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgetProgram( material, scene, object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t\trenderStateStack.pop();\n\t\tcurrentRenderState = null;\n\n\t};\n\n\t// Animation Loop\n\n\tlet onAnimationFrameCallback = null;\n\n\tfunction onAnimationFrame( time ) {\n\n\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback( time );\n\n\t}\n\n\tfunction onXRSessionStart() {\n\n\t\tanimation.stop();\n\n\t}\n\n\tfunction onXRSessionEnd() {\n\n\t\tanimation.start();\n\n\t}\n\n\tconst animation = new WebGLAnimation();\n\tanimation.setAnimationLoop( onAnimationFrame );\n\n\tif ( typeof window !== 'undefined' ) animation.setContext( window );\n\n\tthis.setAnimationLoop = function ( callback ) {\n\n\t\tonAnimationFrameCallback = callback;\n\t\txr.setAnimationLoop( callback );\n\n\t\t( callback === null ) ? animation.stop() : animation.start();\n\n\t};\n\n\txr.addEventListener( 'sessionstart', onXRSessionStart );\n\txr.addEventListener( 'sessionend', onXRSessionEnd );\n\n\t// Rendering\n\n\tthis.render = function ( scene, camera ) {\n\n\t\tif ( camera !== undefined && camera.isCamera !== true ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( _isContextLost === true ) return;\n\n\t\t// update scene graph\n\n\t\tif ( scene.autoUpdate === true ) scene.updateMatrixWorld();\n\n\t\t// update camera matrices and frustum\n\n\t\tif ( camera.parent === null ) camera.updateMatrixWorld();\n\n\t\tif ( xr.enabled === true && xr.isPresenting === true ) {\n\n\t\t\tif ( xr.cameraAutoUpdate === true ) xr.updateCamera( camera );\n\n\t\t\tcamera = xr.getCamera(); // use XR camera for rendering\n\n\t\t}\n\n\t\t//\n\t\tif ( scene.isScene === true ) scene.onBeforeRender( _this, scene, camera, _currentRenderTarget );\n\n\t\tcurrentRenderState = renderStates.get( scene, renderStateStack.length );\n\t\tcurrentRenderState.init();\n\n\t\trenderStateStack.push( currentRenderState );\n\n\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\t_frustum.setFromProjectionMatrix( _projScreenMatrix );\n\n\t\t_localClippingEnabled = this.localClippingEnabled;\n\t\t_clippingEnabled = clipping.init( this.clippingPlanes, _localClippingEnabled, camera );\n\n\t\tcurrentRenderList = renderLists.get( scene, renderListStack.length );\n\t\tcurrentRenderList.init();\n\n\t\trenderListStack.push( currentRenderList );\n\n\t\tprojectObject( scene, camera, 0, _this.sortObjects );\n\n\t\tcurrentRenderList.finish();\n\n\t\tif ( _this.sortObjects === true ) {\n\n\t\t\tcurrentRenderList.sort( _opaqueSort, _transparentSort );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( _clippingEnabled === true ) clipping.beginShadows();\n\n\t\tconst shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\tshadowMap.render( shadowsArray, scene, camera );\n\n\t\tif ( _clippingEnabled === true ) clipping.endShadows();\n\n\t\t//\n\n\t\tif ( this.info.autoReset === true ) this.info.reset();\n\n\t\t//\n\n\t\tbackground.render( currentRenderList, scene );\n\n\t\t// render scene\n\n\t\tcurrentRenderState.setupLights( _this.physicallyCorrectLights );\n\n\t\tif ( camera.isArrayCamera ) {\n\n\t\t\tconst cameras = camera.cameras;\n\n\t\t\tfor ( let i = 0, l = cameras.length; i < l; i ++ ) {\n\n\t\t\t\tconst camera2 = cameras[ i ];\n\n\t\t\t\trenderScene( currentRenderList, scene, camera2, camera2.viewport );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\trenderScene( currentRenderList, scene, camera );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( _currentRenderTarget !== null ) {\n\n\t\t\t// resolve multisample renderbuffers to a single-sample texture if necessary\n\n\t\t\ttextures.updateMultisampleRenderTarget( _currentRenderTarget );\n\n\t\t\t// Generate mipmap if we're using any kind of mipmap filtering\n\n\t\t\ttextures.updateRenderTargetMipmap( _currentRenderTarget );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( scene.isScene === true ) scene.onAfterRender( _this, scene, camera );\n\n\t\t// Ensure depth buffer writing is enabled so it can be cleared on next render\n\n\t\tstate.buffers.depth.setTest( true );\n\t\tstate.buffers.depth.setMask( true );\n\t\tstate.buffers.color.setMask( true );\n\n\t\tstate.setPolygonOffset( false );\n\n\t\t// _gl.finish();\n\n\t\tbindingStates.resetDefaultState();\n\t\t_currentMaterialId = - 1;\n\t\t_currentCamera = null;\n\n\t\trenderStateStack.pop();\n\n\t\tif ( renderStateStack.length > 0 ) {\n\n\t\t\tcurrentRenderState = renderStateStack[ renderStateStack.length - 1 ];\n\n\t\t} else {\n\n\t\t\tcurrentRenderState = null;\n\n\t\t}\n\n\t\trenderListStack.pop();\n\n\t\tif ( renderListStack.length > 0 ) {\n\n\t\t\tcurrentRenderList = renderListStack[ renderListStack.length - 1 ];\n\n\t\t} else {\n\n\t\t\tcurrentRenderList = null;\n\n\t\t}\n\n\t};\n\n\tfunction projectObject( object, camera, groupOrder, sortObjects ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tconst visible = object.layers.test( camera.layers );\n\n\t\tif ( visible ) {\n\n\t\t\tif ( object.isGroup ) {\n\n\t\t\t\tgroupOrder = object.renderOrder;\n\n\t\t\t} else if ( object.isLOD ) {\n\n\t\t\t\tif ( object.autoUpdate === true ) object.update( camera );\n\n\t\t\t} else if ( object.isLight ) {\n\n\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) {\n\n\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld )\n\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\t\tconst material = object.material;\n\n\t\t\t\t\tif ( material.visible ) {\n\n\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, groupOrder, _vector3.z, null );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\t\t\t// update skeleton only once in a frame\n\n\t\t\t\t\tif ( object.skeleton.frame !== info.render.frame ) {\n\n\t\t\t\t\t\tobject.skeleton.update();\n\t\t\t\t\t\tobject.skeleton.frame = info.render.frame;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) {\n\n\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld )\n\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\t\tconst material = object.material;\n\n\t\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\t\tconst groups = geometry.groups;\n\n\t\t\t\t\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, groupMaterial, groupOrder, _vector3.z, group );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, groupOrder, _vector3.z, null );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tprojectObject( children[ i ], camera, groupOrder, sortObjects );\n\n\t\t}\n\n\t}\n\n\tfunction renderScene( currentRenderList, scene, camera, viewport ) {\n\n\t\tconst opaqueObjects = currentRenderList.opaque;\n\t\tconst transmissiveObjects = currentRenderList.transmissive;\n\t\tconst transparentObjects = currentRenderList.transparent;\n\n\t\tcurrentRenderState.setupLightsView( camera );\n\n\t\tif ( transmissiveObjects.length > 0 ) renderTransmissionPass( opaqueObjects, scene, camera );\n\n\t\tif ( viewport ) state.viewport( _currentViewport.copy( viewport ) );\n\n\t\tif ( opaqueObjects.length > 0 ) renderObjects( opaqueObjects, scene, camera );\n\t\tif ( transmissiveObjects.length > 0 ) renderObjects( transmissiveObjects, scene, camera );\n\t\tif ( transparentObjects.length > 0 ) renderObjects( transparentObjects, scene, camera );\n\n\t}\n\n\tfunction renderTransmissionPass( opaqueObjects, scene, camera ) {\n\n\t\tif ( _transmissionRenderTarget === null ) {\n\n\t\t\tconst needsAntialias = _antialias === true && capabilities.isWebGL2 === true;\n\t\t\tconst renderTargetType = needsAntialias ? WebGLMultisampleRenderTarget : WebGLRenderTarget;\n\n\t\t\t_transmissionRenderTarget = new renderTargetType( 1024, 1024, {\n\t\t\t\tgenerateMipmaps: true,\n\t\t\t\ttype: utils.convert( HalfFloatType ) !== null ? HalfFloatType : UnsignedByteType,\n\t\t\t\tminFilter: LinearMipmapLinearFilter,\n\t\t\t\tmagFilter: NearestFilter,\n\t\t\t\twrapS: ClampToEdgeWrapping,\n\t\t\t\twrapT: ClampToEdgeWrapping,\n\t\t\t\tuseRenderToTexture: extensions.has( 'WEBGL_multisampled_render_to_texture' )\n\t\t\t} );\n\n\t\t}\n\n\t\tconst currentRenderTarget = _this.getRenderTarget();\n\t\t_this.setRenderTarget( _transmissionRenderTarget );\n\t\t_this.clear();\n\n\t\t// Turn off the features which can affect the frag color for opaque objects pass.\n\t\t// Otherwise they are applied twice in opaque objects pass and transmission objects pass.\n\t\tconst currentToneMapping = _this.toneMapping;\n\t\t_this.toneMapping = NoToneMapping;\n\n\t\trenderObjects( opaqueObjects, scene, camera );\n\n\t\t_this.toneMapping = currentToneMapping;\n\n\t\ttextures.updateMultisampleRenderTarget( _transmissionRenderTarget );\n\t\ttextures.updateRenderTargetMipmap( _transmissionRenderTarget );\n\n\t\t_this.setRenderTarget( currentRenderTarget );\n\n\t}\n\n\tfunction renderObjects( renderList, scene, camera ) {\n\n\t\tconst overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null;\n\n\t\tfor ( let i = 0, l = renderList.length; i < l; i ++ ) {\n\n\t\t\tconst renderItem = renderList[ i ];\n\n\t\t\tconst object = renderItem.object;\n\t\t\tconst geometry = renderItem.geometry;\n\t\t\tconst material = overrideMaterial === null ? renderItem.material : overrideMaterial;\n\t\t\tconst group = renderItem.group;\n\n\t\t\tif ( object.layers.test( camera.layers ) ) {\n\n\t\t\t\trenderObject( object, scene, camera, geometry, material, group );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction renderObject( object, scene, camera, geometry, material, group ) {\n\n\t\tobject.onBeforeRender( _this, scene, camera, geometry, material, group );\n\n\t\tobject.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\n\t\tobject.normalMatrix.getNormalMatrix( object.modelViewMatrix );\n\n\t\tmaterial.onBeforeRender( _this, scene, camera, geometry, object, group );\n\n\t\tif ( material.transparent === true && material.side === DoubleSide ) {\n\n\t\t\tmaterial.side = BackSide;\n\t\t\tmaterial.needsUpdate = true;\n\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\tmaterial.side = FrontSide;\n\t\t\tmaterial.needsUpdate = true;\n\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\tmaterial.side = DoubleSide;\n\n\t\t} else {\n\n\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t}\n\n\t\tobject.onAfterRender( _this, scene, camera, geometry, material, group );\n\n\t}\n\n\tfunction getProgram( material, scene, object ) {\n\n\t\tif ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tconst lights = currentRenderState.state.lights;\n\t\tconst shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\tconst lightsStateVersion = lights.state.version;\n\n\t\tconst parameters = programCache.getParameters( material, lights.state, shadowsArray, scene, object );\n\t\tconst programCacheKey = programCache.getProgramCacheKey( parameters );\n\n\t\tlet programs = materialProperties.programs;\n\n\t\t// always update environment and fog - changing these trigger an getProgram call, but it's possible that the program doesn't change\n\n\t\tmaterialProperties.environment = material.isMeshStandardMaterial ? scene.environment : null;\n\t\tmaterialProperties.fog = scene.fog;\n\t\tmaterialProperties.envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || materialProperties.environment );\n\n\t\tif ( programs === undefined ) {\n\n\t\t\t// new material\n\n\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t\tprograms = new Map();\n\t\t\tmaterialProperties.programs = programs;\n\n\t\t}\n\n\t\tlet program = programs.get( programCacheKey );\n\n\t\tif ( program !== undefined ) {\n\n\t\t\t// early out if program and light state is identical\n\n\t\t\tif ( materialProperties.currentProgram === program && materialProperties.lightsStateVersion === lightsStateVersion ) {\n\n\t\t\t\tupdateCommonMaterialProperties( material, parameters );\n\n\t\t\t\treturn program;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tparameters.uniforms = programCache.getUniforms( material );\n\n\t\t\tmaterial.onBuild( object, parameters, _this );\n\n\t\t\tmaterial.onBeforeCompile( parameters, _this );\n\n\t\t\tprogram = programCache.acquireProgram( parameters, programCacheKey );\n\t\t\tprograms.set( programCacheKey, program );\n\n\t\t\tmaterialProperties.uniforms = parameters.uniforms;\n\n\t\t}\n\n\t\tconst uniforms = materialProperties.uniforms;\n\n\t\tif ( ( ! material.isShaderMaterial && ! material.isRawShaderMaterial ) || material.clipping === true ) {\n\n\t\t\tuniforms.clippingPlanes = clipping.uniform;\n\n\t\t}\n\n\t\tupdateCommonMaterialProperties( material, parameters );\n\n\t\t// store the light setup it was created for\n\n\t\tmaterialProperties.needsLights = materialNeedsLights( material );\n\t\tmaterialProperties.lightsStateVersion = lightsStateVersion;\n\n\t\tif ( materialProperties.needsLights ) {\n\n\t\t\t// wire up the material to this renderer's lighting state\n\n\t\t\tuniforms.ambientLightColor.value = lights.state.ambient;\n\t\t\tuniforms.lightProbe.value = lights.state.probe;\n\t\t\tuniforms.directionalLights.value = lights.state.directional;\n\t\t\tuniforms.directionalLightShadows.value = lights.state.directionalShadow;\n\t\t\tuniforms.spotLights.value = lights.state.spot;\n\t\t\tuniforms.spotLightShadows.value = lights.state.spotShadow;\n\t\t\tuniforms.rectAreaLights.value = lights.state.rectArea;\n\t\t\tuniforms.ltc_1.value = lights.state.rectAreaLTC1;\n\t\t\tuniforms.ltc_2.value = lights.state.rectAreaLTC2;\n\t\t\tuniforms.pointLights.value = lights.state.point;\n\t\t\tuniforms.pointLightShadows.value = lights.state.pointShadow;\n\t\t\tuniforms.hemisphereLights.value = lights.state.hemi;\n\n\t\t\tuniforms.directionalShadowMap.value = lights.state.directionalShadowMap;\n\t\t\tuniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix;\n\t\t\tuniforms.spotShadowMap.value = lights.state.spotShadowMap;\n\t\t\tuniforms.spotShadowMatrix.value = lights.state.spotShadowMatrix;\n\t\t\tuniforms.pointShadowMap.value = lights.state.pointShadowMap;\n\t\t\tuniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix;\n\t\t\t// TODO (abelnation): add area lights shadow info to uniforms\n\n\t\t}\n\n\t\tconst progUniforms = program.getUniforms();\n\t\tconst uniformsList = WebGLUniforms.seqWithValue( progUniforms.seq, uniforms );\n\n\t\tmaterialProperties.currentProgram = program;\n\t\tmaterialProperties.uniformsList = uniformsList;\n\n\t\treturn program;\n\n\t}\n\n\tfunction updateCommonMaterialProperties( material, parameters ) {\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tmaterialProperties.outputEncoding = parameters.outputEncoding;\n\t\tmaterialProperties.instancing = parameters.instancing;\n\t\tmaterialProperties.skinning = parameters.skinning;\n\t\tmaterialProperties.morphTargets = parameters.morphTargets;\n\t\tmaterialProperties.morphNormals = parameters.morphNormals;\n\t\tmaterialProperties.morphTargetsCount = parameters.morphTargetsCount;\n\t\tmaterialProperties.numClippingPlanes = parameters.numClippingPlanes;\n\t\tmaterialProperties.numIntersection = parameters.numClipIntersection;\n\t\tmaterialProperties.vertexAlphas = parameters.vertexAlphas;\n\t\tmaterialProperties.vertexTangents = parameters.vertexTangents;\n\t\tmaterialProperties.toneMapping = parameters.toneMapping;\n\n\t}\n\n\tfunction setProgram( camera, scene, geometry, material, object ) {\n\n\t\tif ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...\n\n\t\ttextures.resetTextureUnits();\n\n\t\tconst fog = scene.fog;\n\t\tconst environment = material.isMeshStandardMaterial ? scene.environment : null;\n\t\tconst encoding = ( _currentRenderTarget === null ) ? _this.outputEncoding : ( _currentRenderTarget.isXRRenderTarget === true ? _currentRenderTarget.texture.encoding : LinearEncoding );\n\t\tconst envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment );\n\t\tconst vertexAlphas = material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4;\n\t\tconst vertexTangents = !! material.normalMap && !! geometry.attributes.tangent;\n\t\tconst morphTargets = !! geometry.morphAttributes.position;\n\t\tconst morphNormals = !! geometry.morphAttributes.normal;\n\t\tconst morphTargetsCount = !! geometry.morphAttributes.position ? geometry.morphAttributes.position.length : 0;\n\t\tconst toneMapping = material.toneMapped ? _this.toneMapping : NoToneMapping;\n\n\t\tconst materialProperties = properties.get( material );\n\t\tconst lights = currentRenderState.state.lights;\n\n\t\tif ( _clippingEnabled === true ) {\n\n\t\t\tif ( _localClippingEnabled === true || camera !== _currentCamera ) {\n\n\t\t\t\tconst useCache =\n\t\t\t\t\tcamera === _currentCamera &&\n\t\t\t\t\tmaterial.id === _currentMaterialId;\n\n\t\t\t\t// we might want to call this function with some ClippingGroup\n\t\t\t\t// object instead of the material, once it becomes feasible\n\t\t\t\t// (#8465, #8379)\n\t\t\t\tclipping.setState( material, camera, useCache );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tlet needsProgramChange = false;\n\n\t\tif ( material.version === materialProperties.__version ) {\n\n\t\t\tif ( materialProperties.needsLights && ( materialProperties.lightsStateVersion !== lights.state.version ) ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.outputEncoding !== encoding ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancing === false ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( ! object.isInstancedMesh && materialProperties.instancing === true ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( object.isSkinnedMesh && materialProperties.skinning === false ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( ! object.isSkinnedMesh && materialProperties.skinning === true ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.envMap !== envMap ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( material.fog && materialProperties.fog !== fog ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.numClippingPlanes !== undefined &&\n\t\t\t\t( materialProperties.numClippingPlanes !== clipping.numPlanes ||\n\t\t\t\tmaterialProperties.numIntersection !== clipping.numIntersection ) ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.vertexAlphas !== vertexAlphas ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.vertexTangents !== vertexTangents ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.morphTargets !== morphTargets ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.morphNormals !== morphNormals ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.toneMapping !== toneMapping ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( capabilities.isWebGL2 === true && materialProperties.morphTargetsCount !== morphTargetsCount ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tneedsProgramChange = true;\n\t\t\tmaterialProperties.__version = material.version;\n\n\t\t}\n\n\t\t//\n\n\t\tlet program = materialProperties.currentProgram;\n\n\t\tif ( needsProgramChange === true ) {\n\n\t\t\tprogram = getProgram( material, scene, object );\n\n\t\t}\n\n\t\tlet refreshProgram = false;\n\t\tlet refreshMaterial = false;\n\t\tlet refreshLights = false;\n\n\t\tconst p_uniforms = program.getUniforms(),\n\t\t\tm_uniforms = materialProperties.uniforms;\n\n\t\tif ( state.useProgram( program.program ) ) {\n\n\t\t\trefreshProgram = true;\n\t\t\trefreshMaterial = true;\n\t\t\trefreshLights = true;\n\n\t\t}\n\n\t\tif ( material.id !== _currentMaterialId ) {\n\n\t\t\t_currentMaterialId = material.id;\n\n\t\t\trefreshMaterial = true;\n\n\t\t}\n\n\t\tif ( refreshProgram || _currentCamera !== camera ) {\n\n\t\t\tp_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix );\n\n\t\t\tif ( capabilities.logarithmicDepthBuffer ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'logDepthBufFC',\n\t\t\t\t\t2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );\n\n\t\t\t}\n\n\t\t\tif ( _currentCamera !== camera ) {\n\n\t\t\t\t_currentCamera = camera;\n\n\t\t\t\t// lighting uniforms depend on the camera so enforce an update\n\t\t\t\t// now, in case this material supports lights - or later, when\n\t\t\t\t// the next material that does gets activated:\n\n\t\t\t\trefreshMaterial = true;\t\t// set to true on material change\n\t\t\t\trefreshLights = true;\t\t// remains set until update done\n\n\t\t\t}\n\n\t\t\t// load material specific uniforms\n\t\t\t// (shader material also gets them for the sake of genericity)\n\n\t\t\tif ( material.isShaderMaterial ||\n\t\t\t\tmaterial.isMeshPhongMaterial ||\n\t\t\t\tmaterial.isMeshToonMaterial ||\n\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\tmaterial.envMap ) {\n\n\t\t\t\tconst uCamPos = p_uniforms.map.cameraPosition;\n\n\t\t\t\tif ( uCamPos !== undefined ) {\n\n\t\t\t\t\tuCamPos.setValue( _gl,\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( camera.matrixWorld ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\tmaterial.isMeshToonMaterial ||\n\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\tmaterial.isMeshBasicMaterial ||\n\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\tmaterial.isShaderMaterial ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'isOrthographic', camera.isOrthographicCamera === true );\n\n\t\t\t}\n\n\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\tmaterial.isMeshToonMaterial ||\n\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\tmaterial.isMeshBasicMaterial ||\n\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\tmaterial.isShaderMaterial ||\n\t\t\t\tmaterial.isShadowMaterial ||\n\t\t\t\tobject.isSkinnedMesh ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// skinning and morph target uniforms must be set even if material didn't change\n\t\t// auto-setting of texture unit for bone and morph texture must go before other textures\n\t\t// otherwise textures used for skinning and morphing can take over texture units reserved for other material textures\n\n\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrix' );\n\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrixInverse' );\n\n\t\t\tconst skeleton = object.skeleton;\n\n\t\t\tif ( skeleton ) {\n\n\t\t\t\tif ( capabilities.floatVertexTextures ) {\n\n\t\t\t\t\tif ( skeleton.boneTexture === null ) skeleton.computeBoneTexture();\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture, textures );\n\t\t\t\t\tp_uniforms.setValue( _gl, 'boneTextureSize', skeleton.boneTextureSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tp_uniforms.setOptional( _gl, skeleton, 'boneMatrices' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( !! geometry && ( geometry.morphAttributes.position !== undefined || geometry.morphAttributes.normal !== undefined ) ) {\n\n\t\t\tmorphtargets.update( object, geometry, material, program );\n\n\t\t}\n\n\n\t\tif ( refreshMaterial || materialProperties.receiveShadow !== object.receiveShadow ) {\n\n\t\t\tmaterialProperties.receiveShadow = object.receiveShadow;\n\t\t\tp_uniforms.setValue( _gl, 'receiveShadow', object.receiveShadow );\n\n\t\t}\n\n\t\tif ( refreshMaterial ) {\n\n\t\t\tp_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure );\n\n\t\t\tif ( materialProperties.needsLights ) {\n\n\t\t\t\t// the current material requires lighting info\n\n\t\t\t\t// note: all lighting uniforms are always set correctly\n\t\t\t\t// they simply reference the renderer's state for their\n\t\t\t\t// values\n\t\t\t\t//\n\t\t\t\t// use the current material's .needsUpdate flags to set\n\t\t\t\t// the GL state when required\n\n\t\t\t\tmarkUniformsLightsNeedsUpdate( m_uniforms, refreshLights );\n\n\t\t\t}\n\n\t\t\t// refresh uniforms common to several materials\n\n\t\t\tif ( fog && material.fog ) {\n\n\t\t\t\tmaterials.refreshFogUniforms( m_uniforms, fog );\n\n\t\t\t}\n\n\t\t\tmaterials.refreshMaterialUniforms( m_uniforms, material, _pixelRatio, _height, _transmissionRenderTarget );\n\n\t\t\tWebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, textures );\n\n\t\t}\n\n\t\tif ( material.isShaderMaterial && material.uniformsNeedUpdate === true ) {\n\n\t\t\tWebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, textures );\n\t\t\tmaterial.uniformsNeedUpdate = false;\n\n\t\t}\n\n\t\tif ( material.isSpriteMaterial ) {\n\n\t\t\tp_uniforms.setValue( _gl, 'center', object.center );\n\n\t\t}\n\n\t\t// common matrices\n\n\t\tp_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix );\n\t\tp_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix );\n\t\tp_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );\n\n\t\treturn program;\n\n\t}\n\n\t// If uniforms are marked as clean, they don't need to be loaded to the GPU.\n\n\tfunction markUniformsLightsNeedsUpdate( uniforms, value ) {\n\n\t\tuniforms.ambientLightColor.needsUpdate = value;\n\t\tuniforms.lightProbe.needsUpdate = value;\n\n\t\tuniforms.directionalLights.needsUpdate = value;\n\t\tuniforms.directionalLightShadows.needsUpdate = value;\n\t\tuniforms.pointLights.needsUpdate = value;\n\t\tuniforms.pointLightShadows.needsUpdate = value;\n\t\tuniforms.spotLights.needsUpdate = value;\n\t\tuniforms.spotLightShadows.needsUpdate = value;\n\t\tuniforms.rectAreaLights.needsUpdate = value;\n\t\tuniforms.hemisphereLights.needsUpdate = value;\n\n\t}\n\n\tfunction materialNeedsLights( material ) {\n\n\t\treturn material.isMeshLambertMaterial || material.isMeshToonMaterial || material.isMeshPhongMaterial ||\n\t\t\tmaterial.isMeshStandardMaterial || material.isShadowMaterial ||\n\t\t\t( material.isShaderMaterial && material.lights === true );\n\n\t}\n\n\tthis.getActiveCubeFace = function () {\n\n\t\treturn _currentActiveCubeFace;\n\n\t};\n\n\tthis.getActiveMipmapLevel = function () {\n\n\t\treturn _currentActiveMipmapLevel;\n\n\t};\n\n\tthis.getRenderTarget = function () {\n\n\t\treturn _currentRenderTarget;\n\n\t};\n\n\tthis.setRenderTargetTextures = function ( renderTarget, colorTexture, depthTexture ) {\n\n\t\tproperties.get( renderTarget.texture ).__webglTexture = colorTexture;\n\t\tproperties.get( renderTarget.depthTexture ).__webglTexture = depthTexture;\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\trenderTargetProperties.__hasExternalTextures = true;\n\n\t\tif ( renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\trenderTargetProperties.__autoAllocateDepthBuffer = depthTexture === undefined;\n\n\t\t\tif ( ! renderTargetProperties.__autoAllocateDepthBuffer ) {\n\n\t\t\t\t// The multisample_render_to_texture extension doesn't work properly if there\n\t\t\t\t// are midframe flushes and an external depth buffer. Disable use of the extension.\n\t\t\t\tif ( renderTarget.useRenderToTexture ) {\n\n\t\t\t\t\tconsole.warn( 'render-to-texture extension was disabled because an external texture was provided' );\n\t\t\t\t\trenderTarget.useRenderToTexture = false;\n\t\t\t\t\trenderTarget.useRenderbuffer = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tthis.setRenderTargetFramebuffer = function ( renderTarget, defaultFramebuffer ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\trenderTargetProperties.__webglFramebuffer = defaultFramebuffer;\n\t\trenderTargetProperties.__useDefaultFramebuffer = defaultFramebuffer === undefined;\n\n\t};\n\n\tthis.setRenderTarget = function ( renderTarget, activeCubeFace = 0, activeMipmapLevel = 0 ) {\n\n\t\t_currentRenderTarget = renderTarget;\n\t\t_currentActiveCubeFace = activeCubeFace;\n\t\t_currentActiveMipmapLevel = activeMipmapLevel;\n\t\tlet useDefaultFramebuffer = true;\n\n\t\tif ( renderTarget ) {\n\n\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\t\tif ( renderTargetProperties.__useDefaultFramebuffer !== undefined ) {\n\n\t\t\t\t// We need to make sure to rebind the framebuffer.\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\t\t\t\tuseDefaultFramebuffer = false;\n\n\t\t\t} else if ( renderTargetProperties.__webglFramebuffer === undefined ) {\n\n\t\t\t\ttextures.setupRenderTarget( renderTarget );\n\n\t\t\t} else if ( renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\t\t// Color and depth texture must be rebound in order for the swapchain to update.\n\t\t\t\ttextures.rebindTextures( renderTarget, properties.get( renderTarget.texture ).__webglTexture, properties.get( renderTarget.depthTexture ).__webglTexture );\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet framebuffer = null;\n\t\tlet isCube = false;\n\t\tlet isRenderTarget3D = false;\n\n\t\tif ( renderTarget ) {\n\n\t\t\tconst texture = renderTarget.texture;\n\n\t\t\tif ( texture.isDataTexture3D || texture.isDataTexture2DArray ) {\n\n\t\t\t\tisRenderTarget3D = true;\n\n\t\t\t}\n\n\t\t\tconst __webglFramebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\tif ( renderTarget.isWebGLCubeRenderTarget ) {\n\n\t\t\t\tframebuffer = __webglFramebuffer[ activeCubeFace ];\n\t\t\t\tisCube = true;\n\n\t\t\t} else if ( renderTarget.useRenderbuffer ) {\n\n\t\t\t\tframebuffer = properties.get( renderTarget ).__webglMultisampledFramebuffer;\n\n\t\t\t} else {\n\n\t\t\t\tframebuffer = __webglFramebuffer;\n\n\t\t\t}\n\n\t\t\t_currentViewport.copy( renderTarget.viewport );\n\t\t\t_currentScissor.copy( renderTarget.scissor );\n\t\t\t_currentScissorTest = renderTarget.scissorTest;\n\n\t\t} else {\n\n\t\t\t_currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor();\n\t\t\t_currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor();\n\t\t\t_currentScissorTest = _scissorTest;\n\n\t\t}\n\n\t\tconst framebufferBound = state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\tif ( framebufferBound && capabilities.drawBuffers && useDefaultFramebuffer ) {\n\n\t\t\tstate.drawBuffers( renderTarget, framebuffer );\n\n\t\t}\n\n\t\tstate.viewport( _currentViewport );\n\t\tstate.scissor( _currentScissor );\n\t\tstate.setScissorTest( _currentScissorTest );\n\n\t\tif ( isCube ) {\n\n\t\t\tconst textureProperties = properties.get( renderTarget.texture );\n\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + activeCubeFace, textureProperties.__webglTexture, activeMipmapLevel );\n\n\t\t} else if ( isRenderTarget3D ) {\n\n\t\t\tconst textureProperties = properties.get( renderTarget.texture );\n\t\t\tconst layer = activeCubeFace || 0;\n\t\t\t_gl.framebufferTextureLayer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, textureProperties.__webglTexture, activeMipmapLevel || 0, layer );\n\n\t\t}\n\n\t\t_currentMaterialId = - 1; // reset current material to ensure correct uniform bindings\n\n\t};\n\n\tthis.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer, activeCubeFaceIndex ) {\n\n\t\tif ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tlet framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\tif ( renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== undefined ) {\n\n\t\t\tframebuffer = framebuffer[ activeCubeFaceIndex ];\n\n\t\t}\n\n\t\tif ( framebuffer ) {\n\n\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\ttry {\n\n\t\t\t\tconst texture = renderTarget.texture;\n\t\t\t\tconst textureFormat = texture.format;\n\t\t\t\tconst textureType = texture.type;\n\n\t\t\t\tif ( textureFormat !== RGBAFormat && utils.convert( textureFormat ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tconst halfFloatSupportedByExt = ( textureType === HalfFloatType ) && ( extensions.has( 'EXT_color_buffer_half_float' ) || ( capabilities.isWebGL2 && extensions.has( 'EXT_color_buffer_float' ) ) );\n\n\t\t\t\tif ( textureType !== UnsignedByteType && utils.convert( textureType ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // Edge and Chrome Mac < 52 (#9513)\n\t\t\t\t\t! ( textureType === FloatType && ( capabilities.isWebGL2 || extensions.has( 'OES_texture_float' ) || extensions.has( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox\n\t\t\t\t\t! halfFloatSupportedByExt ) {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( _gl.checkFramebufferStatus( _gl.FRAMEBUFFER ) === _gl.FRAMEBUFFER_COMPLETE ) {\n\n\t\t\t\t\t// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)\n\n\t\t\t\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t\t_gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), buffer );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' );\n\n\t\t\t\t}\n\n\t\t\t} finally {\n\n\t\t\t\t// restore framebuffer of current render target if necessary\n\n\t\t\t\tconst framebuffer = ( _currentRenderTarget !== null ) ? properties.get( _currentRenderTarget ).__webglFramebuffer : null;\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tthis.copyFramebufferToTexture = function ( position, texture, level = 0 ) {\n\n\t\tif ( texture.isFramebufferTexture !== true ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer: copyFramebufferToTexture() can only be used with FramebufferTexture.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst levelScale = Math.pow( 2, - level );\n\t\tconst width = Math.floor( texture.image.width * levelScale );\n\t\tconst height = Math.floor( texture.image.height * levelScale );\n\n\t\ttextures.setTexture2D( texture, 0 );\n\n\t\t_gl.copyTexSubImage2D( _gl.TEXTURE_2D, level, 0, 0, position.x, position.y, width, height );\n\n\t\tstate.unbindTexture();\n\n\t};\n\n\tthis.copyTextureToTexture = function ( position, srcTexture, dstTexture, level = 0 ) {\n\n\t\tconst width = srcTexture.image.width;\n\t\tconst height = srcTexture.image.height;\n\t\tconst glFormat = utils.convert( dstTexture.format );\n\t\tconst glType = utils.convert( dstTexture.type );\n\n\t\ttextures.setTexture2D( dstTexture, 0 );\n\n\t\t// As another texture upload may have changed pixelStorei\n\t\t// parameters, make sure they are correct for the dstTexture\n\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, dstTexture.flipY );\n\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha );\n\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment );\n\n\t\tif ( srcTexture.isDataTexture ) {\n\n\t\t\t_gl.texSubImage2D( _gl.TEXTURE_2D, level, position.x, position.y, width, height, glFormat, glType, srcTexture.image.data );\n\n\t\t} else {\n\n\t\t\tif ( srcTexture.isCompressedTexture ) {\n\n\t\t\t\t_gl.compressedTexSubImage2D( _gl.TEXTURE_2D, level, position.x, position.y, srcTexture.mipmaps[ 0 ].width, srcTexture.mipmaps[ 0 ].height, glFormat, srcTexture.mipmaps[ 0 ].data );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.texSubImage2D( _gl.TEXTURE_2D, level, position.x, position.y, glFormat, glType, srcTexture.image );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Generate mipmaps only when copying level 0\n\t\tif ( level === 0 && dstTexture.generateMipmaps ) _gl.generateMipmap( _gl.TEXTURE_2D );\n\n\t\tstate.unbindTexture();\n\n\t};\n\n\tthis.copyTextureToTexture3D = function ( sourceBox, position, srcTexture, dstTexture, level = 0 ) {\n\n\t\tif ( _this.isWebGL1Renderer ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer.copyTextureToTexture3D: can only be used with WebGL2.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst width = sourceBox.max.x - sourceBox.min.x + 1;\n\t\tconst height = sourceBox.max.y - sourceBox.min.y + 1;\n\t\tconst depth = sourceBox.max.z - sourceBox.min.z + 1;\n\t\tconst glFormat = utils.convert( dstTexture.format );\n\t\tconst glType = utils.convert( dstTexture.type );\n\t\tlet glTarget;\n\n\t\tif ( dstTexture.isDataTexture3D ) {\n\n\t\t\ttextures.setTexture3D( dstTexture, 0 );\n\t\t\tglTarget = _gl.TEXTURE_3D;\n\n\t\t} else if ( dstTexture.isDataTexture2DArray ) {\n\n\t\t\ttextures.setTexture2DArray( dstTexture, 0 );\n\t\t\tglTarget = _gl.TEXTURE_2D_ARRAY;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer.copyTextureToTexture3D: only supports THREE.DataTexture3D and THREE.DataTexture2DArray.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, dstTexture.flipY );\n\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha );\n\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment );\n\n\t\tconst unpackRowLen = _gl.getParameter( _gl.UNPACK_ROW_LENGTH );\n\t\tconst unpackImageHeight = _gl.getParameter( _gl.UNPACK_IMAGE_HEIGHT );\n\t\tconst unpackSkipPixels = _gl.getParameter( _gl.UNPACK_SKIP_PIXELS );\n\t\tconst unpackSkipRows = _gl.getParameter( _gl.UNPACK_SKIP_ROWS );\n\t\tconst unpackSkipImages = _gl.getParameter( _gl.UNPACK_SKIP_IMAGES );\n\n\t\tconst image = srcTexture.isCompressedTexture ? srcTexture.mipmaps[ 0 ] : srcTexture.image;\n\n\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, image.width );\n\t\t_gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, image.height );\n\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, sourceBox.min.x );\n\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, sourceBox.min.y );\n\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, sourceBox.min.z );\n\n\t\tif ( srcTexture.isDataTexture || srcTexture.isDataTexture3D ) {\n\n\t\t\t_gl.texSubImage3D( glTarget, level, position.x, position.y, position.z, width, height, depth, glFormat, glType, image.data );\n\n\t\t} else {\n\n\t\t\tif ( srcTexture.isCompressedTexture ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer.copyTextureToTexture3D: untested support for compressed srcTexture.' );\n\t\t\t\t_gl.compressedTexSubImage3D( glTarget, level, position.x, position.y, position.z, width, height, depth, glFormat, image.data );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.texSubImage3D( glTarget, level, position.x, position.y, position.z, width, height, depth, glFormat, glType, image );\n\n\t\t\t}\n\n\t\t}\n\n\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, unpackRowLen );\n\t\t_gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, unpackImageHeight );\n\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, unpackSkipPixels );\n\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, unpackSkipRows );\n\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, unpackSkipImages );\n\n\t\t// Generate mipmaps only when copying level 0\n\t\tif ( level === 0 && dstTexture.generateMipmaps ) _gl.generateMipmap( glTarget );\n\n\t\tstate.unbindTexture();\n\n\t};\n\n\tthis.initTexture = function ( texture ) {\n\n\t\ttextures.setTexture2D( texture, 0 );\n\n\t\tstate.unbindTexture();\n\n\t};\n\n\tthis.resetState = function () {\n\n\t\t_currentActiveCubeFace = 0;\n\t\t_currentActiveMipmapLevel = 0;\n\t\t_currentRenderTarget = null;\n\n\t\tstate.reset();\n\t\tbindingStates.reset();\n\n\t};\n\n\tif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) );\n\n\t}\n\n}\n\nWebGLRenderer.prototype.isWebGLRenderer = true;\n\nexport { WebGLRenderer };\n","import { WebGLRenderer } from './WebGLRenderer.js';\n\nclass WebGL1Renderer extends WebGLRenderer {}\n\nWebGL1Renderer.prototype.isWebGL1Renderer = true;\n\nexport { WebGL1Renderer };\n","import { WebGL1Renderer } from \"three/src/renderers/WebGL1Renderer.js\";\nimport { Bootstrap } from \"../bootstrap\";\n\nBootstrap.registerPlugin(\"renderer\", {\n defaults: {\n klass: WebGL1Renderer,\n parameters: {\n depth: true,\n stencil: true,\n preserveDrawingBuffer: true,\n antialias: true,\n },\n },\n\n listen: [\"resize\"],\n\n install: function (three) {\n // Instantiate Three renderer\n var renderer = (three.renderer = new this.options.klass(\n this.options.parameters\n ));\n three.canvas = renderer.domElement;\n\n // Add to DOM\n three.element.appendChild(renderer.domElement);\n },\n\n uninstall: function (three) {\n // Remove from DOM\n three.element.removeChild(three.renderer.domElement);\n\n delete three.renderer;\n delete three.canvas;\n },\n\n resize: function (event, three) {\n var renderer = three.renderer;\n var el = renderer.domElement;\n\n // Resize renderer to render size if it's a canvas\n if (el && el.tagName == \"CANVAS\") {\n renderer.setSize(event.renderWidth, event.renderHeight, false);\n }\n // Or view size if it's just a DOM element or multi-renderer\n else {\n if (renderer.setRenderSize) {\n renderer.setRenderSize(event.renderWidth, event.renderHeight);\n }\n renderer.setSize(event.viewWidth, event.viewHeight, false);\n }\n },\n});\n","import { Scene } from \"three/src/scenes/Scene.js\";\nimport { Bootstrap } from \"../bootstrap\";\n\nBootstrap.registerPlugin(\"scene\", {\n install: function (three) {\n three.scene = new Scene();\n },\n\n uninstall: function (three) {\n delete three.scene;\n },\n});\n","import { Bootstrap } from \"../bootstrap\";\n\nBootstrap.registerPlugin(\"size\", {\n defaults: {\n width: null,\n height: null,\n aspect: null,\n scale: 1,\n maxRenderWidth: Infinity,\n maxRenderHeight: Infinity,\n devicePixelRatio: true,\n },\n\n listen: [\n \"window.resize:queue\",\n \"element.resize:queue\",\n \"this.change:queue\",\n \"ready:resize\",\n \"pre:pre\",\n ],\n\n install: function (three) {\n three.Size = this.api({\n renderWidth: 0,\n renderHeight: 0,\n viewWidth: 0,\n viewHeight: 0,\n });\n\n this.resized = false;\n },\n\n uninstall: function (three) {\n delete three.Size;\n },\n\n queue: function (_event, _three) {\n this.resized = true;\n },\n\n pre: function (event, three) {\n if (!this.resized) return;\n this.resized = false;\n this.resize(event, three);\n },\n\n resize: function (event, three) {\n var options = this.options;\n var element = three.element;\n var renderer = three.renderer;\n\n var w,\n h,\n ew,\n eh,\n rw,\n rh,\n aspect,\n style,\n ratio,\n ml = 0,\n mt = 0;\n\n // Measure element\n w = ew =\n options.width === undefined || options.width == null\n ? element.offsetWidth || element.innerWidth || 0\n : options.width;\n\n h = eh =\n options.height === undefined || options.height == null\n ? element.offsetHeight || element.innerHeight || 0\n : options.height;\n\n // Force aspect ratio\n aspect = w / h;\n if (options.aspect) {\n if (options.aspect > aspect) {\n h = Math.round(w / options.aspect);\n mt = Math.floor((eh - h) / 2);\n } else {\n w = Math.round(h * options.aspect);\n ml = Math.floor((ew - w) / 2);\n }\n aspect = w / h;\n }\n\n // Get device pixel ratio\n ratio = 1;\n if (options.devicePixelRatio && typeof window != \"undefined\") {\n ratio = window.devicePixelRatio || 1;\n }\n\n // Apply scale and resolution max\n rw = Math.round(\n Math.min(w * ratio * options.scale, options.maxRenderWidth)\n );\n rh = Math.round(\n Math.min(h * ratio * options.scale, options.maxRenderHeight)\n );\n\n // Retain aspect ratio\n const raspect = rw / rh;\n if (raspect > aspect) {\n rw = Math.round(rh * aspect);\n } else {\n rh = Math.round(rw / aspect);\n }\n\n // Measure final pixel ratio\n ratio = rh / h;\n\n // Resize and position renderer element\n style = renderer.domElement.style;\n style.width = w + \"px\";\n style.height = h + \"px\";\n style.marginLeft = ml + \"px\";\n style.marginTop = mt + \"px\";\n\n // Notify\n Object.assign(three.Size, {\n renderWidth: rw,\n renderHeight: rh,\n viewWidth: w,\n viewHeight: h,\n aspect: aspect,\n pixelRatio: ratio,\n });\n\n three.trigger({\n type: \"resize\",\n renderWidth: rw,\n renderHeight: rh,\n viewWidth: w,\n viewHeight: h,\n aspect: aspect,\n pixelRatio: ratio,\n });\n },\n});\n","import { Bootstrap } from \"../bootstrap\";\n\nBootstrap.registerPlugin(\"time\", {\n defaults: {\n speed: 1, // Clock speed\n warmup: 0, // Wait N frames before starting clock\n timeout: 1, // Timeout in seconds. Pause if no tick happens in this time.\n },\n\n listen: [\"pre:tick\", \"this.change\"],\n\n now: function () {\n return +new Date() / 1000;\n },\n\n install: function (three) {\n three.Time = this.api({\n now: this.now(), // Time since 1970 in seconds\n\n clock: 0, // Adjustable clock that counts up from 0 seconds\n step: 1 / 60, // Clock step in seconds\n\n frames: 0, // Framenumber\n time: 0, // Real time in seconds\n delta: 1 / 60, // Frame step in seconds\n\n average: 0, // Average frame time in seconds\n fps: 0, // Average frames per second\n });\n\n this.last = 0;\n this.time = 0;\n this.clock = 0;\n this.wait = this.options.warmup;\n\n this.clockStart = 0;\n this.timeStart = 0;\n },\n\n tick: function (event, three) {\n var speed = this.options.speed;\n var timeout = this.options.timeout;\n\n var api = three.Time;\n var now = (api.now = this.now());\n var last = this.last;\n var time = this.time;\n var clock = this.clock;\n\n if (last) {\n var delta = (api.delta = now - last);\n var average = api.average || delta;\n\n if (delta > timeout) {\n delta = 0;\n }\n\n var step = delta * speed;\n\n time += delta;\n clock += step;\n\n if (api.frames > 0) {\n api.average = average + (delta - average) * 0.1;\n api.fps = 1 / average;\n }\n\n api.step = step;\n api.clock = clock - this.clockStart;\n api.time = time - this.timeStart;\n\n api.frames++;\n\n if (this.wait-- > 0) {\n this.clockStart = clock;\n this.timeStart = time;\n api.clock = 0;\n api.step = 1e-100;\n }\n }\n\n this.last = now;\n this.clock = clock;\n this.time = time;\n },\n\n uninstall: function (three) {\n delete three.Time;\n },\n});\n","import { Bootstrap } from \"../bootstrap\";\n\nBootstrap.registerPlugin(\"warmup\", {\n defaults: {\n delay: 2,\n },\n\n listen: [\"ready\", \"post\"],\n\n ready: function (event, three) {\n three.renderer.domElement.style.visibility = \"hidden\";\n this.frame = 0;\n this.hidden = true;\n },\n\n post: function (event, three) {\n if (this.hidden && this.frame >= this.options.delay) {\n three.renderer.domElement.style.visibility = \"visible\";\n this.hidden = false;\n }\n this.frame++;\n },\n});\n","import \"./bind\";\nimport \"./camera\";\nimport \"./fallback\";\nimport \"./fill\";\nimport \"./loop\";\nimport \"./render\";\nimport \"./renderer\";\nimport \"./scene\";\nimport \"./size\";\nimport \"./time\";\nimport \"./warmup\";\n","import { PerspectiveCamera } from \"three/src/cameras/PerspectiveCamera.js\";\nimport { Bootstrap } from \"../bootstrap\";\n\nBootstrap.registerPlugin(\"controls\", {\n listen: [\"update\", \"resize\", \"camera\", \"this.change\"],\n\n defaults: {\n klass: null,\n parameters: {},\n },\n\n install: function (three) {\n if (!this.options.klass) throw \"Must provide class for `controls.klass`\";\n\n three.controls = null;\n\n this._camera = three.camera || new PerspectiveCamera();\n this.change(null, three);\n },\n\n uninstall: function (three) {\n delete three.controls;\n },\n\n change: function (event, three) {\n if (this.options.klass) {\n if (!event || event.changes.klass) {\n three.controls = new this.options.klass(\n this._camera,\n three.renderer.domElement\n );\n }\n\n Object.assign(three.controls, this.options.parameters);\n } else {\n three.controls = null;\n }\n },\n\n update: function (event, three) {\n var delta = (three.Time && three.Time.delta) || 1 / 60;\n var vr = three.VR && three.VR.state;\n\n if (three.controls.vr) three.controls.vr(vr);\n three.controls.update(delta);\n },\n\n camera: function (event, three) {\n three.controls.object = this._camera = event.camera;\n },\n\n resize: function (event, three) {\n three.controls.handleResize && three.controls.handleResize();\n },\n});\n","import { Bootstrap } from \"../bootstrap\";\n\nBootstrap.registerPlugin(\"cursor\", {\n listen: [\n \"update\",\n \"this.change\",\n \"install:change\",\n \"uninstall:change\",\n \"element.mousemove\",\n \"vr\",\n ],\n\n defaults: {\n cursor: null,\n hide: false,\n timeout: 3,\n },\n\n install: function (three) {\n this.timeout = this.options.timeout;\n this.element = three.element;\n this.change(null, three);\n },\n\n uninstall: function (three) {\n delete three.controls;\n },\n\n change: function (event, three) {\n this.applyCursor(three);\n },\n\n mousemove: function (event, three) {\n if (this.options.hide) {\n this.applyCursor(three);\n this.timeout = +this.options.timeout || 0;\n }\n },\n\n update: function (event, three) {\n var delta = (three.Time && three.Time.delta) || 1 / 60;\n\n if (this.options.hide) {\n this.timeout -= delta;\n if (this.timeout < 0) {\n this.applyCursor(three, \"none\");\n }\n }\n },\n\n vr: function (event, three) {\n this.hide = event.active && !event.hmd.fake;\n this.applyCursor(three);\n },\n\n applyCursor: function (three, cursor) {\n var auto = three.controls ? \"move\" : \"\";\n cursor = cursor || this.options.cursor || auto;\n if (this.hide) cursor = \"none\";\n if (this.cursor != cursor) {\n this.element.style.cursor = cursor;\n }\n },\n});\n","import { Bootstrap } from \"../bootstrap\";\n\nBootstrap.registerPlugin(\"fullscreen\", {\n defaults: {\n key: \"f\",\n },\n\n listen: [\"ready\", \"update\"],\n\n install: function (three) {\n three.Fullscreen = this.api(\n {\n active: false,\n toggle: this.toggle.bind(this),\n },\n three\n );\n },\n\n uninstall: function (three) {\n delete three.Fullscreen;\n },\n\n ready: function (event, three) {\n document.body.addEventListener(\n \"keypress\",\n function (event) {\n if (\n this.options.key &&\n event.charCode == this.options.key.charCodeAt(0)\n ) {\n this.toggle(three);\n }\n }.bind(this)\n );\n\n var changeHandler = function () {\n var active =\n !!document.fullscreenElement ||\n !!document.mozFullScreenElement ||\n !!document.webkitFullscreenElement ||\n !!document.msFullscreenElement;\n three.Fullscreen.active = this.active = active;\n three.trigger({\n type: \"fullscreen\",\n active: active,\n });\n }.bind(this);\n document.addEventListener(\"fullscreenchange\", changeHandler, false);\n document.addEventListener(\"webkitfullscreenchange\", changeHandler, false);\n document.addEventListener(\"mozfullscreenchange\", changeHandler, false);\n },\n\n toggle: function (three) {\n var canvas = three.canvas;\n var options =\n three.VR && three.VR.active ? { vrDisplay: three.VR.hmd } : {};\n\n if (!this.active) {\n if (canvas.requestFullScreen) {\n canvas.requestFullScreen(options);\n } else if (canvas.msRequestFullScreen) {\n canvas.msRequestFullscreen(options);\n } else if (canvas.webkitRequestFullscreen) {\n canvas.webkitRequestFullscreen(options);\n } else if (canvas.mozRequestFullScreen) {\n canvas.mozRequestFullScreen(options); // s vs S\n }\n } else {\n if (document.exitFullscreen) {\n document.exitFullscreen();\n } else if (document.msExitFullscreen) {\n document.msExitFullscreen();\n } else if (document.webkitExitFullscreen) {\n document.webkitExitFullscreen();\n } else if (document.mozCancelFullScreen) {\n document.mozCancelFullScreen(); // s vs S\n }\n }\n },\n});\n","import { default as Stats } from \"stats.js\";\nimport { Bootstrap } from \"../bootstrap\";\n\nBootstrap.registerPlugin(\"stats\", {\n listen: [\"pre\", \"post\"],\n\n install: function (three) {\n var stats = (this.stats = new Stats());\n var style = stats.domElement.style;\n\n style.position = \"absolute\";\n style.top = style.left = 0;\n three.element.appendChild(stats.domElement);\n\n three.stats = stats;\n },\n\n uninstall: function (three) {\n document.body.removeChild(this.stats.domElement);\n\n delete three.stats;\n },\n\n pre: function (_event, _three) {\n this.stats.begin();\n },\n\n post: function (_event, _three) {\n this.stats.end();\n },\n});\n","import { Bootstrap } from \"../bootstrap\";\n\nBootstrap.registerPlugin(\"ui\", {\n defaults: {\n theme: \"white\",\n style:\n \".threestrap-ui { position: absolute; bottom: 5px; right: 5px; float: left; }\" +\n \".threestrap-ui button { border: 0; background: none;\" +\n \" vertical-align: middle; font-weight: bold; } \" +\n \".threestrap-ui .glyphicon { top: 2px; font-weight: bold; } \" +\n \"@media (max-width: 640px) { .threestrap-ui button { font-size: 120% } }\" +\n \".threestrap-white button { color: #fff; text-shadow: 0 1px 1px rgba(0, 0, 0, 1), \" +\n \"0 1px 3px rgba(0, 0, 0, 1); }\" +\n \".threestrap-black button { color: #000; text-shadow: 0 0px 1px rgba(255, 255, 255, 1), \" +\n \"0 0px 2px rgba(255, 255, 255, 1), \" +\n \"0 0px 2px rgba(255, 255, 255, 1) }\",\n },\n\n listen: [\"fullscreen\"],\n\n markup: function (three, theme, style) {\n var url =\n \"//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap-glyphicons.css\";\n if (location.href.match(/^file:\\/\\//)) url = \"http://\" + url;\n\n var buttons = [];\n\n if (three.Fullscreen) {\n buttons.push(\n '\"\n );\n }\n if (three.VR) {\n buttons.push('');\n }\n\n return (\n '\" +\n '
' +\n buttons.join(\"\\n\") +\n \"
\"\n );\n },\n\n install: function (three) {\n var ui = (this.ui = document.createElement(\"div\"));\n ui.innerHTML = this.markup(three, this.options.theme, this.options.style);\n document.body.appendChild(ui);\n\n var fullscreen = (this.ui.fullscreen =\n ui.querySelector(\"button.fullscreen\"));\n if (fullscreen) {\n three.bind([fullscreen, \"click:goFullscreen\"], this);\n }\n\n var vr = (this.ui.vr = ui.querySelector(\"button.vr\"));\n if (vr && three.VR) {\n three.VR.set({ mode: \"2d\" });\n three.bind([vr, \"click:goVR\"], this);\n }\n },\n\n fullscreen: function (event, three) {\n this.ui.style.display = event.active ? \"none\" : \"block\";\n if (!event.active) three.VR && three.VR.set({ mode: \"2d\" });\n },\n\n goFullscreen: function (event, three) {\n if (three.Fullscreen) {\n three.Fullscreen.toggle();\n }\n },\n\n goVR: function (event, three) {\n if (three.VR) {\n three.VR.set({ mode: \"auto\" });\n three.Fullscreen.toggle();\n }\n },\n\n uninstall: function (_three) {\n document.body.removeChild(this.ui);\n },\n});\n","/**\n * VRRenderer\n *\n * @author wwwtyro https://github.com/wwwtyro\n * @author unconed https://github.com/unconed\n */\nimport { PerspectiveCamera } from \"three/src/cameras/PerspectiveCamera.js\";\nimport { Vector3 } from \"three/src/math/Vector3.js\";\n\nexport class VRRenderer {\n constructor(renderer, hmd) {\n this.renderer = renderer;\n\n this.right = new Vector3();\n this.cameraLeft = new PerspectiveCamera();\n this.cameraRight = new PerspectiveCamera();\n\n var et = hmd.getEyeTranslation(\"left\");\n this.halfIPD = new Vector3(et.x, et.y, et.z).length();\n this.fovLeft = hmd.getRecommendedEyeFieldOfView(\"left\");\n this.fovRight = hmd.getRecommendedEyeFieldOfView(\"right\");\n }\n\n FovToNDCScaleOffset(fov) {\n var pxscale = 2.0 / (fov.leftTan + fov.rightTan);\n var pxoffset = (fov.leftTan - fov.rightTan) * pxscale * 0.5;\n var pyscale = 2.0 / (fov.upTan + fov.downTan);\n var pyoffset = (fov.upTan - fov.downTan) * pyscale * 0.5;\n return {\n scale: [pxscale, pyscale],\n offset: [pxoffset, pyoffset],\n };\n }\n\n FovPortToProjection(\n matrix,\n fov,\n rightHanded /* = true */,\n zNear /* = 0.01 */,\n zFar /* = 10000.0 */\n ) {\n rightHanded = rightHanded === undefined ? true : rightHanded;\n zNear = zNear === undefined ? 0.01 : zNear;\n zFar = zFar === undefined ? 10000.0 : zFar;\n var handednessScale = rightHanded ? -1.0 : 1.0;\n var m = matrix.elements;\n var scaleAndOffset = this.FovToNDCScaleOffset(fov);\n m[0 * 4 + 0] = scaleAndOffset.scale[0];\n m[0 * 4 + 1] = 0.0;\n m[0 * 4 + 2] = scaleAndOffset.offset[0] * handednessScale;\n m[0 * 4 + 3] = 0.0;\n m[1 * 4 + 0] = 0.0;\n m[1 * 4 + 1] = scaleAndOffset.scale[1];\n m[1 * 4 + 2] = -scaleAndOffset.offset[1] * handednessScale;\n m[1 * 4 + 3] = 0.0;\n m[2 * 4 + 0] = 0.0;\n m[2 * 4 + 1] = 0.0;\n m[2 * 4 + 2] = (zFar / (zNear - zFar)) * -handednessScale;\n m[2 * 4 + 3] = (zFar * zNear) / (zNear - zFar);\n m[3 * 4 + 0] = 0.0;\n m[3 * 4 + 1] = 0.0;\n m[3 * 4 + 2] = handednessScale;\n m[3 * 4 + 3] = 0.0;\n matrix.transpose();\n }\n\n FovToProjection(\n matrix,\n fov,\n rightHanded /* = true */,\n zNear /* = 0.01 */,\n zFar /* = 10000.0 */\n ) {\n var fovPort = {\n upTan: Math.tan((fov.upDegrees * Math.PI) / 180.0),\n downTan: Math.tan((fov.downDegrees * Math.PI) / 180.0),\n leftTan: Math.tan((fov.leftDegrees * Math.PI) / 180.0),\n rightTan: Math.tan((fov.rightDegrees * Math.PI) / 180.0),\n };\n return this.FovPortToProjection(matrix, fovPort, rightHanded, zNear, zFar);\n }\n\n render(scene, camera) {\n this.FovToProjection(\n this.cameraLeft.projectionMatrix,\n this.fovLeft,\n true,\n camera.near,\n camera.far\n );\n this.FovToProjection(\n this.cameraRight.projectionMatrix,\n this.fovRight,\n true,\n camera.near,\n camera.far\n );\n\n this.right.set(this.halfIPD, 0, 0);\n this.right.applyQuaternion(camera.quaternion);\n\n this.cameraLeft.position.copy(camera.position).sub(this.right);\n this.cameraRight.position.copy(camera.position).add(this.right);\n\n this.cameraLeft.quaternion.copy(camera.quaternion);\n this.cameraRight.quaternion.copy(camera.quaternion);\n\n var dpr = this.renderer.devicePixelRatio || 1;\n var width = this.renderer.domElement.width / 2 / dpr;\n var height = this.renderer.domElement.height / dpr;\n\n this.renderer.enableScissorTest(true);\n\n this.renderer.setViewport(0, 0, width, height);\n this.renderer.setScissor(0, 0, width, height);\n this.renderer.render(scene, this.cameraLeft);\n\n this.renderer.setViewport(width, 0, width, height);\n this.renderer.setScissor(width, 0, width, height);\n this.renderer.render(scene, this.cameraRight);\n }\n}\n","import { Bootstrap } from \"../bootstrap.js\";\nimport { VRRenderer } from \"../renderers/VRRenderer.js\";\n\n/*\nVR sensor / HMD hookup.\n*/\nBootstrap.registerPlugin(\"vr\", {\n defaults: {\n mode: \"auto\", // 'auto', '2d'\n device: null,\n fov: 80, // emulated FOV for fallback\n },\n\n listen: [\"window.load\", \"pre\", \"render\", \"resize\", \"this.change\"],\n\n install: function (three) {\n three.VR = this.api(\n {\n active: false,\n devices: [],\n hmd: null,\n sensor: null,\n renderer: null,\n state: null,\n },\n three\n );\n },\n\n uninstall: function (three) {\n delete three.VR;\n },\n\n mocks: function (three, fov, def) {\n // Fake VR device for cardboard / desktop\n\n // Interpuppilary distance\n var ipd = 0.03;\n\n // Symmetric eye FOVs (Cardboard style)\n var getEyeTranslation = function (key) {\n return { left: { x: -ipd, y: 0, z: 0 }, right: { x: ipd, y: 0, z: 0 } }[\n key\n ];\n };\n var getRecommendedEyeFieldOfView = function (key) {\n var camera = three.camera;\n var aspect = (camera && camera.aspect) || 16 / 9;\n var fov2 = (fov || (camera && camera.fov) || def) / 2;\n var fovX =\n (Math.atan((Math.tan((fov2 * Math.PI) / 180) * aspect) / 2) * 180) /\n Math.PI;\n var fovY = fov2;\n\n return {\n left: {\n rightDegrees: fovX,\n leftDegrees: fovX,\n downDegrees: fovY,\n upDegrees: fovY,\n },\n right: {\n rightDegrees: fovX,\n leftDegrees: fovX,\n downDegrees: fovY,\n upDegrees: fovY,\n },\n }[key];\n };\n // Will be replaced with orbit controls or device orientation controls by VRControls\n var getState = function () {\n return {};\n };\n\n return [\n {\n fake: true,\n force: 1,\n deviceId: \"emu\",\n deviceName: \"Emulated\",\n getEyeTranslation: getEyeTranslation,\n getRecommendedEyeFieldOfView: getRecommendedEyeFieldOfView,\n },\n {\n force: 2,\n getState: getState,\n },\n ];\n },\n\n load: function (event, three) {\n var callback = function (devs) {\n this.callback(devs, three);\n }.bind(this);\n\n if (navigator.getVRDevices) {\n navigator.getVRDevices().then(callback);\n } else if (navigator.mozGetVRDevices) {\n navigator.mozGetVRDevices(callback);\n } else {\n console.warn(\"No native VR support detected.\");\n callback(this.mocks(three, this.options.fov, this.defaults.fov), three);\n }\n },\n\n callback: function (vrdevs, three) {\n var hmd, sensor;\n\n var HMD = window.HMDVRDevice || function () {};\n var SENSOR = window.PositionSensorVRDevice || function () {};\n\n // Export list of devices\n vrdevs = three.VR.devices = vrdevs || three.VR.devices;\n\n // Get HMD device\n var deviceId = this.options.device;\n let dev;\n\n for (let i = 0; i < vrdevs.length; ++i) {\n dev = vrdevs[i];\n if (dev.force == 1 || dev instanceof HMD) {\n if (deviceId && deviceId != dev.deviceId) continue;\n hmd = dev;\n break;\n }\n }\n\n if (hmd) {\n // Get sensor device\n let dev;\n for (let i = 0; i < vrdevs.length; ++i) {\n dev = vrdevs[i];\n if (\n dev.force == 2 ||\n (dev instanceof SENSOR && dev.hardwareUnitId == hmd.hardwareUnitId)\n ) {\n sensor = dev;\n break;\n }\n }\n\n this.hookup(hmd, sensor, three);\n }\n },\n\n hookup: function (hmd, sensor, three) {\n if (!VRRenderer) console.log(\"VRRenderer not found\");\n var klass = VRRenderer || function () {};\n\n this.renderer = new klass(three.renderer, hmd);\n this.hmd = hmd;\n this.sensor = sensor;\n\n three.VR.renderer = this.renderer;\n three.VR.hmd = hmd;\n three.VR.sensor = sensor;\n\n console.log(\"VRRenderer\", hmd.deviceName);\n },\n\n change: function (event, three) {\n if (event.changes.device) {\n this.callback(null, three);\n }\n this.pre(event, three);\n },\n\n pre: function (event, three) {\n var last = this.active;\n\n // Global active flag\n var active = (this.active = this.renderer && this.options.mode != \"2d\");\n three.VR.active = active;\n\n // Load sensor state\n if (active && this.sensor) {\n var state = this.sensor.getState();\n three.VR.state = state;\n } else {\n three.VR.state = null;\n }\n\n // Notify if VR state changed\n if (last != this.active) {\n three.trigger({\n type: \"vr\",\n active: active,\n hmd: this.hmd,\n sensor: this.sensor,\n });\n }\n },\n\n resize: function (_event, _three) {\n if (this.active) {\n // Reinit HMD projection\n this.renderer.initialize();\n }\n },\n\n render: function (event, three) {\n if (three.scene && three.camera) {\n var renderer = this.active ? this.renderer : three.renderer;\n\n if (this.last != renderer) {\n if (renderer == three.renderer) {\n // Cleanup leftover renderer state when swapping back to normal\n var dpr = renderer.getPixelRatio();\n var width = renderer.domElement.width / dpr;\n var height = renderer.domElement.height / dpr;\n renderer.setScissorTest(false);\n renderer.setViewport(0, 0, width, height);\n }\n }\n\n this.last = renderer;\n\n renderer.render(three.scene, three.camera);\n }\n },\n});\n","import \"./controls\";\nimport \"./cursor\";\nimport \"./fullscreen\";\nimport \"./stats\";\nimport \"./ui\";\nimport \"./vr\";\n","/**\n * @author dmarcos / https://github.com/dmarcos\n * @author mrdoob / http://mrdoob.com\n *\n * VRControls from\n * https://cdn.jsdelivr.net/npm/three@0.93.0/examples/js/controls/VRControls.js.\n * Added here so that the existing VR examples still work... this will stay\n * until we get everything upgraded to the modern three.js approach to VR. See\n * https://threejs.org/docs/index.html#manual/en/introduction/How-to-create-VR-content\n * for more info.\n */\n\nimport { Matrix4 } from \"three/src/math/Matrix4.js\";\n\nexport class VRControls {\n constructor(object, onError) {\n this.object = object;\n this.standingMatrix = new Matrix4();\n this.frameData = null;\n\n if (\"VRFrameData\" in window) {\n // eslint-disable-next-line no-undef\n this.frameData = new VRFrameData();\n }\n\n function gotVRDisplays(displays) {\n this.vrDisplays = displays;\n\n if (displays.length > 0) {\n this.vrDisplay = displays[0];\n } else {\n if (onError) onError(\"VR input not available.\");\n }\n }\n\n if (navigator.getVRDisplays) {\n navigator\n .getVRDisplays()\n .then(gotVRDisplays)\n .catch(function () {\n console.warn(\"VRControls: Unable to get VR Displays\");\n });\n }\n\n // the Rift SDK returns the position in meters\n // this scale factor allows the user to define how meters\n // are converted to scene units.\n\n this.scale = 1;\n\n // If true will use \"standing space\" coordinate system where y=0 is the\n // floor and x=0, z=0 is the center of the room.\n this.standing = false;\n\n // Distance from the users eyes to the floor in meters. Used when\n // standing=true but the VRDisplay doesn't provide stageParameters.\n this.userHeight = 1.6;\n }\n\n getVRDisplay() {\n return this.vrDisplay;\n }\n\n setVRDisplay(value) {\n this.vrDisplay = value;\n }\n\n getVRDisplays() {\n console.warn(\"VRControls: getVRDisplays() is being deprecated.\");\n return this.vrDisplays;\n }\n\n getStandingMatrix() {\n return this.standingMatrix;\n }\n\n update() {\n if (this.vrDisplay) {\n var pose;\n\n if (this.vrDisplay.getFrameData) {\n this.vrDisplay.getFrameData(this.frameData);\n pose = this.frameData.pose;\n } else if (this.vrDisplay.getPose) {\n pose = this.vrDisplay.getPose();\n }\n\n if (pose.orientation !== null) {\n this.object.quaternion.fromArray(pose.orientation);\n }\n\n if (pose.position !== null) {\n this.object.position.fromArray(pose.position);\n } else {\n this.object.position.set(0, 0, 0);\n }\n\n if (this.standing) {\n if (this.vrDisplay.stageParameters) {\n this.object.updateMatrix();\n\n this.standingMatrix.fromArray(\n this.vrDisplay.stageParameters.sittingToStandingTransform\n );\n this.object.applyMatrix(this.standingMatrix);\n } else {\n this.object.position.setY(this.object.position.y + this.userHeight);\n }\n }\n\n this.object.position.multiplyScalar(this.scale);\n }\n }\n\n dispose() {\n this.vrDisplay = null;\n }\n}\n","import \"./VRControls.js\";\n","/**\n * Allows a stack of renderers to be treated as a single renderer.\n * @author Gheric Speiginer\n */\nimport { REVISION } from \"three\";\n\nexport class MultiRenderer {\n constructor(parameters) {\n console.log(\"MultiRenderer\", REVISION);\n\n this.domElement = document.createElement(\"div\");\n this.domElement.style.position = \"relative\";\n\n this.renderers = [];\n this._renderSizeSet = false;\n\n var rendererClasses = parameters.renderers || [];\n var rendererParameters = parameters.parameters || [];\n\n // elements are stacked back-to-front\n for (var i = 0; i < rendererClasses.length; i++) {\n var renderer = new rendererClasses[i](rendererParameters[i]);\n renderer.domElement.style.position = \"absolute\";\n renderer.domElement.style.top = \"0px\";\n renderer.domElement.style.left = \"0px\";\n this.domElement.appendChild(renderer.domElement);\n this.renderers.push(renderer);\n }\n }\n\n setSize(w, h) {\n this.domElement.style.width = w + \"px\";\n this.domElement.style.height = h + \"px\";\n\n for (var i = 0; i < this.renderers.length; i++) {\n var renderer = this.renderers[i];\n var el = renderer.domElement;\n\n if (!this._renderSizeSet || (el && el.tagName !== \"CANVAS\")) {\n renderer.setSize(w, h);\n }\n\n el.style.width = w + \"px\";\n el.style.height = h + \"px\";\n }\n }\n\n setRenderSize(rw, rh) {\n this._renderSizeSet = true;\n\n for (var i = 0; i < this.renderers.length; i++) {\n var renderer = this.renderers[i];\n var el = renderer.domElement;\n\n if (el && el.tagName === \"CANVAS\") {\n renderer.setSize(rw, rh, false);\n }\n }\n }\n\n render(scene, camera) {\n for (var i = 0; i < this.renderers.length; i++) {\n this.renderers[i].render(scene, camera);\n }\n }\n}\n","import \"./MultiRenderer\";\nimport \"./VRRenderer\";\n","import \"./aliases\";\nimport \"./binder\";\nimport \"./bootstrap\";\nimport \"./core\";\nimport \"./extra\";\n\n// These should probably be in their own build!\nimport \"./controls\";\nimport \"./renderers\";\n\nexport { Bootstrap } from \"./bootstrap.js\";\nexport { VRControls } from \"./controls/VRControls.js\";\nexport { MultiRenderer } from \"./renderers/MultiRenderer.js\";\nexport { VRRenderer } from \"./renderers/VRRenderer.js\";\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining\n * DS104: Avoid inline assignments\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n/*\n Custom attribute model\n - Organizes attributes by trait in .attributes\n - Provides constant-time .props / .get() access to flat dictionary\n - Provides .get(key) with or without trait namespaces\n - Change attributes with .set(key) or .set(dictionary)\n - Validation is double-buffered and in-place to detect changes and nops\n - Change notifications are coalesced per object and per trait, digested later\n - Values are stored in three.js uniform-style objects so they can be bound as GL uniforms\n - Originally passed (unnormalized) values are preserved and can be fetched via .orig()\n - Attributes can be defined as final/const\n - Attributes can be computed from both public or private expressions with .bind(key, false/true)\n - Expressions are time-dependent, can be time-travelled with .evaluate()\n - This enables continous simulation and data logging despite choppy animation updates\n\n Actual type and trait definitions are injected from Primitives\n*/\n\nexport class Attributes {\n constructor(definitions, context) {\n this.context = context;\n this.traits = definitions.Traits;\n this.types = definitions.Types;\n this.pending = [];\n this.bound = [];\n this.last = null;\n }\n\n make(type) {\n return {\n enum: typeof type.enum === \"function\" ? type.enum() : undefined,\n type: typeof type.uniform === \"function\" ? type.uniform() : undefined, // for three.js\n value: type.make(),\n };\n }\n\n apply(object, config) {\n return new Data(object, config, this);\n }\n\n bind(callback) {\n return this.bound.push(callback);\n }\n unbind(callback) {\n return (this.bound = Array.from(this.bound).filter(\n (cb) => cb !== callback\n ));\n }\n\n queue(callback, object, key, value) {\n this.lastObject = object;\n this.lastKey = key;\n this.lastValue = value;\n return this.pending.push(callback);\n }\n\n invoke(callback) {\n return callback(this.context.time.clock, this.context.time.step);\n }\n\n compute() {\n if (this.bound.length) {\n for (let cb of Array.from(this.bound)) {\n this.invoke(cb);\n }\n }\n }\n\n digest() {\n let calls;\n if (!this.pending.length) {\n return false;\n }\n\n [calls, this.pending] = Array.from([this.pending, []]);\n for (let callback of Array.from(calls)) {\n callback();\n }\n\n return true;\n }\n\n getTrait(name) {\n return this.traits[name];\n }\n\n getLastTrigger() {\n return `${this.lastObject.toString()} - ${this.lastKey}=\\`${\n this.lastValue\n }\\``;\n }\n}\n\nconst shallowCopy = function (x) {\n const out = {};\n for (let k in x) {\n const v = x[k];\n out[k] = v;\n }\n return out;\n};\n\nclass Data {\n constructor(object, config, _attributes) {\n let key, ns, oldComputed, oldExpr, oldOrig, oldProps, spec;\n let { traits, props, finals, freeform } = config;\n const data = this;\n\n // Save existing (original) values if re-applying\n if (\n object.props != null &&\n object.expr != null &&\n object.orig != null &&\n object.computed != null &&\n object.attributes != null\n ) {\n oldProps = shallowCopy(object.props);\n oldExpr = shallowCopy(object.expr);\n oldOrig = object.orig();\n oldComputed = object.computed();\n\n // Dispose of old attributes/bindings\n if (object.attributes != null) {\n object.attributes.dispose();\n }\n }\n\n // Flattened and original values\n const flattened = {};\n const originals = {};\n\n // Aliases\n const mapTo = {};\n const to = (name) => (mapTo[name] != null ? mapTo[name] : name);\n const define = function (name, alias) {\n if (mapTo[alias]) {\n throw new Error(\n `${object.toString()} - Duplicate property \\`${alias}\\``\n );\n }\n return (mapTo[alias] = name);\n };\n\n // Get/set\n const get = (key) =>\n (data[key] != null ? data[key].value : undefined) != null\n ? data[key] != null\n ? data[key].value\n : undefined\n : __guard__(data[to(key)], (x) => x.value);\n const set = function (key, value, ignore, initial) {\n let attr;\n key = to(key);\n\n // Look for defined attribute\n if ((attr = data[key]) == null) {\n if (!freeform) {\n throw new Error(\n `${object.toString()} - Setting unknown property \\`${key}={${value}}\\``\n );\n }\n\n // Define attribute on the fly (placeholder)\n attr = data[key] = {\n short: key,\n type: null,\n last: null,\n value: null,\n };\n validators[key] = (v) => v;\n }\n\n if (!ignore) {\n // See if prop isn't bound\n if (_expr[key]) {\n throw new Error(\n `${object.toString()} - Can't set bound property \\`${key}={${value}}\\``\n );\n }\n\n // See if prop isn't computed\n if (_computed[key]) {\n throw new Error(\n `${object.toString()} - Can't set computed property \\`${key}={${value}}\\``\n );\n }\n\n // See if prop isn't final\n if (_finals[key]) {\n throw new Error(\n `${object.toString()} - Can't set final property \\`${key}={${value}}\\``\n );\n }\n }\n\n // Validate new value\n let valid = true;\n const validated = validate(key, value, attr.last, function () {\n valid = false;\n return null;\n });\n\n // Accept and insert into flattened/original list\n if (valid) {\n [attr.value, attr.last] = Array.from([validated, attr.value]);\n\n // Remember in flattened dict\n const { short } = attr;\n flattened[short] = validated;\n if (!ignore) {\n originals[short] = value;\n } // Remember original unvalidated value\n\n // Compare to last value unless setting initial value\n if (!initial && !equals(key, attr.value, attr.last)) {\n change(key, value);\n }\n }\n\n return valid;\n };\n\n const constant = function (key, value, initial) {\n key = to(key);\n\n set(key, value, true, initial);\n return (_finals[key] = true);\n };\n\n // Prop/expression binding\n const expr = {};\n\n const _bound = {};\n const _eval = {};\n var _expr = {};\n var _computed = {};\n var _finals = {};\n\n const bind = function (key, expression, computed) {\n if (computed == null) {\n computed = false;\n }\n key = to(key);\n\n if (typeof expression !== \"function\") {\n throw new Error(\n `${object.toString()} - Expression \\`${key}=>{${expr}}\\` is not a function`\n );\n }\n if (_expr[key]) {\n throw new Error(\n `${object.toString()} - Property \\`${key}=>{${expr}}\\` is already bound`\n );\n }\n if (_computed[key]) {\n throw new Error(\n `${object.toString()} - Property \\`${key}\\` is computed`\n );\n }\n if (_finals[key]) {\n throw new Error(`${object.toString()} - Property \\`${key}\\` is final`);\n }\n\n const list = computed ? _computed : _expr;\n list[key] = expression;\n\n const short = data[key] != null ? data[key].short : key;\n if (!computed) {\n expr[short] = expression;\n } // flattened\n _eval[key] = expression;\n\n expression = expression.bind(object);\n _bound[key] = function (t, d) {\n let clock;\n if (\n (clock = object.clock != null ? object.clock.getTime() : undefined)\n ) {\n t = clock.clock;\n d = clock.step;\n }\n\n return object.set(key, expression(t, d), true);\n };\n return _attributes.bind(_bound[key]);\n };\n\n const unbind = function (key, computed) {\n if (computed == null) {\n computed = false;\n }\n key = to(key);\n\n const list = computed ? _computed : _expr;\n if (!list[key]) {\n return;\n }\n _attributes.unbind(_bound[key]);\n delete _bound[key];\n delete list[key];\n\n if (data[key] != null) {\n key = data[key].short;\n }\n return delete expr[key];\n };\n\n const evaluate = function (key, time) {\n let left;\n key = to(key);\n return (left =\n typeof _eval[key] === \"function\" ? _eval[key](time, 0) : undefined) !=\n null\n ? left\n : data[key].value;\n };\n\n // Public interface\n object.expr = expr;\n object.props = flattened;\n\n object.evaluate = function (key, time) {\n if (key != null) {\n return evaluate(key, time);\n } else {\n const out = {};\n for (key in props) {\n out[key] = evaluate(key, time);\n }\n return out;\n }\n };\n\n object.get = function (key) {\n if (key != null) {\n return get(key);\n } else {\n return flattened;\n }\n };\n\n object.set = function (key, value, ignore, initial) {\n if (typeof key === \"string\") {\n set(key, value, ignore, initial);\n } else {\n initial = ignore;\n ignore = value;\n const options = key;\n for (key in options) {\n value = options[key];\n set(key, value, ignore, initial);\n }\n }\n };\n\n object.bind = function (key, expr, computed) {\n if (typeof key === \"string\") {\n bind(key, expr, computed);\n } else {\n computed = expr;\n const binds = key;\n for (key in binds) {\n expr = binds[key];\n bind(key, expr, computed);\n }\n }\n };\n\n object.unbind = function (key, computed) {\n if (typeof key === \"string\") {\n unbind(key, computed);\n } else {\n computed = expr;\n const binds = key;\n for (key in binds) {\n unbind(key, computed);\n }\n }\n };\n\n object.attribute = function (key) {\n if (key != null) {\n return data[to(key)];\n } else {\n return data;\n }\n };\n object.orig = function (key) {\n if (key != null) {\n return originals[to(key)];\n } else {\n return shallowCopy(originals);\n }\n };\n object.computed = function (key) {\n if (key != null) {\n return _computed[to(key)];\n } else {\n return shallowCopy(_computed);\n }\n };\n\n // Validate value for key\n const makers = {};\n var validators = {};\n const equalors = {};\n\n var equals = (key, value, target) => equalors[key](value, target);\n var validate = (key, value, target, invalid) =>\n validators[key](value, target, invalid);\n\n object.validate = function (key, value) {\n let target;\n key = to(key);\n const make = makers[key];\n if (make != null) {\n target = make();\n }\n return (target = validate(key, value, target, function () {\n throw new Error(\n `${object.toString()} - Invalid value \\`${key}={${value}}\\``\n );\n }));\n };\n\n // Accumulate changes\n let dirty = false;\n let changes = {};\n let touches = {};\n let changed = {};\n let touched = {};\n const getNS = (key) => key.split(\".\")[0];\n var change = function (key, value) {\n if (!dirty) {\n dirty = true;\n _attributes.queue(digest, object, key, value);\n }\n\n const trait = getNS(key);\n\n // Log change\n changes[key] = true;\n\n // Mark trait/namespace as dirty\n return (touches[trait] = true);\n };\n\n const event = {\n type: \"change\",\n changed: null,\n touched: null,\n };\n\n // Notify listeners of accumulated changes\n var digest = function () {\n // Swap double buffered changes objects\n let k;\n event.changed = changes;\n event.touched = touches;\n changes = changed;\n touches = touched;\n ({ changed } = event);\n ({ touched } = event);\n\n // Reset all dirty flags\n dirty = false;\n for (k in changes) {\n changes[k] = false;\n }\n for (k in touches) {\n touches[k] = false;\n }\n\n event.type = \"change\";\n object.trigger(event);\n\n return (() => {\n const result = [];\n for (let trait in event.touched) {\n event.type = `change:${trait}`;\n result.push(object.trigger(event));\n }\n return result;\n })();\n };\n\n // Convert name.trait.key into keyName\n const shorthand = function (name) {\n const parts = name.split(/\\./g);\n const suffix = parts.pop();\n parts.pop(); // Discard\n parts.unshift(suffix);\n return parts.reduce(\n (a, b) => a + b.charAt(0).toUpperCase() + b.substring(1)\n );\n };\n\n // Define attributes for given trait spec by namespace\n const addSpec = (name, spec) =>\n (() => {\n const result = [];\n for (let key in spec) {\n var value;\n const type = spec[key];\n key = [name, key].join(\".\");\n const short = shorthand(key);\n\n // Make attribute object\n data[key] = {\n T: type,\n ns: name,\n short,\n enum: typeof type.enum === \"function\" ? type.enum() : undefined,\n type:\n typeof type.uniform === \"function\" ? type.uniform() : undefined,\n last: type.make(),\n value: (value = type.make()),\n };\n\n // Define flat namespace alias\n define(key, short);\n flattened[short] = value;\n\n // Collect makers, validators and comparators\n makers[key] = type.make;\n validators[key] = type.validate != null ? type.validate : (a) => a;\n result.push(\n (equalors[key] =\n type.equals != null ? type.equals : (a, b) => a === b)\n );\n }\n return result;\n })();\n\n // Add in traits\n const list = [];\n for (let trait of Array.from(traits)) {\n [trait, ns] = Array.from(trait.split(\":\"));\n const name = ns ? [ns, trait].join(\".\") : trait;\n spec = _attributes.getTrait(trait);\n list.push(trait);\n\n if (spec != null) {\n addSpec(name, spec);\n }\n }\n\n // Add custom props by namespace\n if (props != null) {\n for (ns in props) {\n spec = props[ns];\n addSpec(ns, spec);\n }\n }\n\n // Store array of traits\n const unique = list.filter((object, i) => list.indexOf(object) === i);\n object.traits = unique;\n\n // Set previous internal values\n if (oldProps != null) {\n object.set(oldProps, true, true);\n }\n\n // Set final props\n if (finals != null) {\n for (key in finals) {\n const value = finals[key];\n constant(key, value, true);\n }\n }\n\n // Set previous external values\n if (oldOrig != null) {\n object.set(oldOrig, false, true);\n }\n\n // Bind previous computed props/expressions\n if (oldComputed != null) {\n object.bind(oldComputed, true);\n }\n if (oldExpr != null) {\n object.bind(oldExpr, false);\n }\n\n // Destructor\n this.dispose = function () {\n for (key in _computed) {\n unbind(key, true);\n }\n for (key in _expr) {\n unbind(key, false);\n }\n props = {};\n delete object.attributes;\n delete object.get;\n return delete object.set;\n };\n\n null;\n }\n}\n\nfunction __guard__(value, transform) {\n return typeof value !== \"undefined\" && value !== null\n ? transform(value)\n : undefined;\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nconst NUMBER_PRECISION = 5;\nconst NUMBER_THRESHOLD = 0.0001;\n\nconst checkFactor = (v, f) =>\n Math.abs(v / f - Math.round(v / f)) < NUMBER_THRESHOLD;\nconst checkUnit = (v) => checkFactor(v, 1);\n\nconst formatMultiple = function (v, f, k, compact) {\n const d = Math.round(v / f);\n if (d === 1) {\n return `${k}`;\n }\n if (d === -1) {\n return `-${k}`;\n }\n if (k === \"1\") {\n return `${d}`;\n }\n if (compact) {\n return `${d}${k}`;\n } else {\n return `${d}*${k}`;\n }\n};\n\nconst formatFraction = function (v, f, k, compact) {\n let d = Math.round(v * f);\n if (Math.abs(d) === 1) {\n d = d < 0 ? \"-\" : \"\";\n d += k;\n } else if (k !== \"1\") {\n d += compact ? `${k}` : `*${k}`;\n }\n\n return `${d}/${f}`;\n};\n\nconst formatFactors = [\n { 1: 1 },\n { 1: 1, τ: Math.PI * 2 },\n { 1: 1, π: Math.PI },\n { 1: 1, τ: Math.PI * 2, π: Math.PI },\n { 1: 1, e: Math.E },\n { 1: 1, τ: Math.PI * 2, e: Math.E },\n { 1: 1, π: Math.PI, e: Math.E },\n { 1: 1, τ: Math.PI * 2, π: Math.PI, e: Math.E },\n];\nconst formatPrimes = [\n // denominators 1-30 + interesting multiples\n [2 * 2 * 3 * 5 * 7, [2, 3, 5, 7]], // 1-7\n [2 * 2 * 2 * 3 * 3 * 5 * 5 * 7 * 7, [2, 3, 5, 7]], // 8-11\n [2 * 2 * 3 * 5 * 7 * 11 * 13, [2, 3, 5, 7, 11, 13]], // 12-16\n [2 * 2 * 17 * 19 * 23 * 29, [2, 17, 19, 23, 29]], // 17-30\n [256 * 256, [2]], // Powers of 2\n [1000000, [2, 5]], // Powers of 10\n];\n\nconst prettyNumber = function (options) {\n let cache, compact, e, pi, precision, tau, threshold;\n if (options) {\n ({ cache, compact, tau, pi, e, threshold, precision } = options);\n }\n\n compact = +!!(compact != null ? compact : true);\n tau = +!!(tau != null ? tau : true);\n pi = +!!(pi != null ? pi : true);\n e = +!!(e != null ? e : true);\n cache = +!!(cache != null ? cache : true);\n\n const formatIndex = tau + pi * 2 + e * 4;\n\n const numberCache = cache ? {} : null;\n\n return function (v) {\n if (numberCache != null) {\n let cached;\n if ((cached = numberCache[v]) != null) {\n return cached;\n }\n if (v === Math.round(v)) {\n return (numberCache[v] = `${v}`);\n }\n }\n\n let out = `${v}`;\n let best = out.length + out.indexOf(\".\") + 2;\n const match = function (x) {\n const d = x.length;\n if (d <= best) {\n out = `${x}`;\n return (best = d);\n }\n };\n\n for (let k in formatFactors[formatIndex]) {\n const f = formatFactors[formatIndex][k];\n if (checkUnit(v / f)) {\n match(`${formatMultiple(v / f, 1, k, compact)}`);\n } else {\n for (let [denom, list] of Array.from(formatPrimes)) {\n let numer = (v / f) * denom;\n if (checkUnit(numer)) {\n for (let p of Array.from(list)) {\n var d, n;\n while (checkUnit((n = numer / p)) && checkUnit((d = denom / p))) {\n numer = n;\n denom = d;\n }\n }\n\n match(`${formatFraction(v / f, denom, k, compact)}`);\n break;\n }\n }\n }\n }\n\n if (`${v}`.length > NUMBER_PRECISION) {\n match(`${v.toPrecision(NUMBER_PRECISION)}`);\n }\n\n if (numberCache != null) {\n numberCache[v] = out;\n }\n\n return out;\n };\n};\n\nconst prettyPrint = function (markup, level) {\n if (level == null) {\n level = \"info\";\n }\n markup = prettyMarkup(markup);\n return console[level].apply(console, markup);\n};\n\nvar prettyMarkup = function (markup) {\n // quick n dirty\n\n const tag = \"color:rgb(128,0,128)\";\n const attr = \"color:rgb(144,64,0)\";\n const str = \"color:rgb(0,0,192)\";\n const obj = \"color:rgb(0,70,156)\";\n const txt = \"color:inherit\";\n\n let quoted = false;\n let nested = 0;\n\n const args = [];\n markup = markup.replace(\n /(\\\\[<={}> \"'])|(=>|[<={}> \"'])/g,\n function (_, escape, char) {\n if (escape != null ? escape.length : undefined) {\n return escape;\n }\n if (quoted && !['\"', \"'\"].includes(char)) {\n return char;\n }\n if (nested && !['\"', \"'\", \"{\", \"}\"].includes(char)) {\n return char;\n }\n\n return (() => {\n switch (char) {\n case \"<\":\n args.push(tag);\n return \"%c<\";\n case \">\":\n args.push(tag);\n args.push(txt);\n return \"%c>%c\";\n case \" \":\n args.push(attr);\n return \" %c\";\n case \"=\":\n case \"=>\":\n args.push(tag);\n return `%c${char}`;\n case '\"':\n case \"'\":\n quoted = !quoted;\n if (quoted) {\n args.push(nested ? attr : str);\n return `${char}%c`;\n } else {\n args.push(nested ? obj : tag);\n return `%c${char}`;\n }\n case \"{\":\n if (nested++ === 0) {\n args.push(obj);\n return `%c${char}`;\n } else {\n return char;\n }\n case \"}\":\n if (--nested === 0) {\n args.push(tag);\n return `${char}%c`;\n } else {\n return char;\n }\n default:\n return char;\n }\n })();\n }\n );\n\n return [markup].concat(args);\n};\n\nconst prettyJSXProp = (k, v) => prettyJSXPair(k, v, \"=\");\nconst prettyJSXBind = (k, v) => prettyJSXPair(k, v, \"=>\");\n\nvar prettyJSXPair = (function () {\n const formatNumber = prettyNumber({ compact: false });\n\n return function (k, v, op) {\n const key = function (k) {\n if (k === \"\" + +k || k.match(/^[A-Za-z_][A-Za-z0-9]*$/)) {\n return k;\n } else {\n return JSON.stringify(k);\n }\n };\n const wrap = function (v) {\n if (v.match('\\n*\"')) {\n return v;\n } else {\n return `{${v}}`;\n }\n };\n var value = function (v) {\n if (v instanceof Array) {\n return `[${v.map(value).join(\", \")}]`;\n }\n\n switch (typeof v) {\n case \"string\":\n if (v.match(\"\\n\")) {\n return `\"\\n${v}\"\\n`;\n } else {\n return `\"${v}\"`;\n }\n case \"function\":\n v = `${v}`;\n if (v.match(\"\\n\")) {\n `\\n${v}\\n`;\n } else {\n `${v}`;\n }\n v = v.replace(/^function (\\([^)]+\\))/, \"$1 =>\");\n return (v = v.replace(\n /^(\\([^)]+\\)) =>\\s*{\\s*return\\s*([^}]+)\\s*;\\s*}/,\n \"$1 => $2\"\n ));\n case \"number\":\n return formatNumber(v);\n default:\n if (v != null && v !== !!v) {\n if (v._up != null) {\n return value(v.map((v) => v));\n }\n if (v.toMarkup) {\n return v.toString();\n } else {\n return (\n \"{\" +\n (() => {\n const result = [];\n for (let kk in v) {\n const vv = v[kk];\n if (Object.prototype.hasOwnProperty.call(v, kk)) {\n result.push(`${key(kk)}: ${value(vv)}`);\n }\n }\n return result;\n })().join(\", \") +\n \"}\"\n );\n }\n } else {\n return `${JSON.stringify(v)}`;\n }\n }\n };\n\n return [k, op, wrap(value(v))].join(\"\");\n };\n})();\n\nconst escapeHTML = function (str) {\n str = str.replace(/&/g, \"&\");\n str = str.replace(/\";\n\n str = escapeHTML(str);\n\n for (let arg of Array.from(args)) {\n str = str.replace(/%([a-z])/, function (_, f) {\n const v = args.shift();\n switch (f) {\n case \"c\":\n return ``;\n default:\n return escapeHTML(v);\n }\n });\n }\n\n out += str;\n return (out += \"\");\n};\n\nexport const JSX = { prop: prettyJSXProp, bind: prettyJSXBind };\n\nexport {\n prettyMarkup as markup,\n prettyNumber as number,\n prettyPrint as print,\n prettyFormat as format,\n};\n\n/*\nfor x in [1, 2, 1/2, 3, 1/3, Math.PI, Math.PI / 2, Math.PI * 2, Math.PI * 3, Math.PI * 4, Math.PI * 3 / 4, Math.E * 100, Math.E / 100]\n console.log prettyNumber({})(x)\n*/\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as Pretty from \"../util/pretty.js\";\nimport { Binder } from \"@sicmutils/threestrap/src/binder.js\";\n\nlet nodeIndex = 0;\n\nexport class Node {\n constructor(type, defaults, options, binds, config, attributes) {\n this.type = type;\n this._id = (++nodeIndex).toString();\n\n this.configure(config, attributes);\n this.parent = this.root = this.path = this.index = null;\n\n this.set(defaults, true, true);\n this.set(options, false, true);\n this.bind(binds, false);\n }\n\n configure(config, attributes) {\n let { traits, props, finals, freeform } = config;\n if (traits == null) {\n traits =\n (this._config != null ? this._config.traits : undefined) != null\n ? this._config != null\n ? this._config.traits\n : undefined\n : [];\n }\n if (props == null) {\n props =\n (this._config != null ? this._config.props : undefined) != null\n ? this._config != null\n ? this._config.props\n : undefined\n : {};\n }\n if (finals == null) {\n finals =\n (this._config != null ? this._config.finals : undefined) != null\n ? this._config != null\n ? this._config.finals\n : undefined\n : {};\n }\n if (freeform == null) {\n freeform =\n (this._config != null ? this._config.freeform : undefined) != null\n ? this._config != null\n ? this._config.freeform\n : undefined\n : false;\n }\n\n this._config = { traits, props, finals, freeform };\n return (this.attributes = attributes.apply(this, this._config));\n }\n\n dispose() {\n this.attributes.dispose();\n return (this.attributes = null);\n }\n\n // Add/removal callback\n _added(parent) {\n this.parent = parent;\n this.root = parent.root;\n\n // Notify root listeners of child addition\n const event = {\n type: \"add\",\n node: this,\n parent: this.parent,\n };\n if (this.root) {\n this.root.trigger(event);\n }\n\n // Notify self listeners of own addition\n event.type = \"added\";\n return this.trigger(event);\n }\n\n _removed() {\n // Notify root listeners of child removal\n const event = {\n type: \"remove\",\n node: this,\n };\n if (this.root) {\n this.root.trigger(event);\n }\n\n // Notify self listeners of own removal\n event.type = \"removed\";\n this.trigger(event);\n\n return (this.root = this.parent = null);\n }\n\n // Assign unique indices to nodes to make paths\n _index(index, parent) {\n let path;\n if (parent == null) {\n ({ parent } = this);\n }\n this.index = index;\n this.path = path =\n index != null\n ? ((parent != null ? parent.path : undefined) != null\n ? parent != null\n ? parent.path\n : undefined\n : []\n ).concat([index])\n : null;\n this.order = path != null ? this._encode(path) : Infinity;\n if (this.root != null) {\n return this.trigger({ type: \"reindex\" });\n }\n }\n\n // Asymptotic arithmetic encoding\n // Computes invariant node order from path of indices\n // Goes from 1 at the root [0] of the tree, to 0 at [∞] (best for FP precision).\n // Divides the interval into countably infinite many intervals, nested recursively.\n //\n // (loses precision eventually, it's used cos three.js needs a single numerical order)\n _encode(path) {\n // Tune precision between deep and narrow (1) vs shallow and wide (n)\n const k = 3;\n\n const map = (x) => k / (x + k);\n const lerp = (t) => b + (a - b) * t;\n\n var a = 1 + 1 / k;\n var b = 0;\n for (let index of Array.from(path)) {\n const f = map(index + 1);\n const g = map(index + 2);\n [a, b] = Array.from([lerp(f), lerp(g)]);\n }\n return a;\n }\n\n toString() {\n const _id = this.id != null ? this.id : this._id;\n\n const tag = this.type != null ? this.type : \"node\";\n let id = tag;\n id += `#${_id}`;\n if (this.classes != null ? this.classes.length : undefined) {\n id += `.${this.classes.join(\".\")}`;\n }\n\n if (this.children != null) {\n let count;\n if ((count = this.children.length)) {\n return `<${id}>…(${count})…`;\n } else {\n return `<${id}>`;\n }\n } else {\n return `<${id} />`;\n }\n }\n\n toMarkup(selector = null, indent) {\n let k, v;\n if (indent == null) {\n indent = \"\";\n }\n if (selector && typeof selector !== \"function\") {\n let left;\n selector =\n (left =\n this.root != null ? this.root.model._matcher(selector) : undefined) !=\n null\n ? left\n : () => true;\n }\n\n const tag = this.type != null ? this.type : \"node\";\n let { expr } = this;\n\n // Ensure generated ID goes first\n const orig = { id: this._id };\n const object = typeof this.orig === \"function\" ? this.orig() : undefined;\n for (k in object) {\n v = object[k];\n orig[k] = v;\n }\n\n const props = (() => {\n const result = [];\n for (k in orig) {\n v = orig[k];\n if (!this.expr[k]) {\n result.push(Pretty.JSX.prop(k, v));\n }\n }\n return result;\n })();\n expr = (() => {\n const result1 = [];\n for (k in expr) {\n v = expr[k];\n result1.push(Pretty.JSX.bind(k, v));\n }\n return result1;\n })();\n\n let attr = [\"\"];\n if (props.length) {\n attr = attr.concat(props);\n }\n if (expr.length) {\n attr = attr.concat(expr);\n }\n attr = attr.join(\" \");\n\n let child = indent;\n const recurse = () => {\n if (!(this.children != null ? this.children.length : undefined)) {\n return \"\";\n }\n return this.children\n .map((x) => x.toMarkup(selector, child))\n .filter((x) => x != null && x.length)\n .join(\"\\n\");\n };\n\n if (selector && !selector(this)) {\n return recurse();\n }\n\n if (this.children != null) {\n const open = `<${tag}${attr}>`;\n const close = ``;\n\n child = indent + \" \";\n let children = recurse();\n if (children.length) {\n children = \"\\n\" + children + \"\\n\" + indent;\n }\n if (children == null) {\n children = \"\";\n }\n\n return indent + open + children + close;\n } else {\n return `${indent}<${tag}${attr} />`;\n }\n }\n\n print(selector, level) {\n return Pretty.print(this.toMarkup(selector), level);\n }\n}\n\nBinder.apply(Node.prototype);\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Node } from \"./node.js\";\n\nexport class Group extends Node {\n constructor(type, defaults, options, binds, config, attributes) {\n super(type, defaults, options, binds, config, attributes);\n\n this.children = [];\n this.on(\"reindex\", (event) =>\n Array.from(this.children).map((child) => child.trigger(event))\n );\n }\n\n add(node) {\n if (node.parent != null) {\n node.parent.remove(node);\n }\n\n node._index(this.children.length, this);\n this.children.push(node);\n return node._added(this);\n }\n\n remove(node) {\n if (node.children != null ? node.children.length : undefined) {\n node.empty();\n }\n\n const index = this.children.indexOf(node);\n if (index === -1) {\n return;\n }\n\n this.children.splice(index, 1);\n node._index(null);\n node._removed(this);\n\n for (let i = 0; i < this.children.length; i++) {\n node = this.children[i];\n if (i >= index) {\n node._index(i);\n }\n }\n }\n\n empty() {\n const children = this.children.slice().reverse();\n for (let node of Array.from(children)) {\n this.remove(node);\n }\n }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nexport class Guard {\n constructor(limit) {\n if (limit == null) {\n limit = 10;\n }\n this.limit = limit;\n }\n iterate(options) {\n const { step, last } = options;\n\n let { limit } = this;\n while (step()) {\n if (!--limit) {\n console.warn(\n \"Last iteration\",\n typeof last === \"function\" ? last() : undefined\n );\n throw new Error(\"Exceeded iteration limit.\");\n }\n }\n return null;\n }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining\n * DS104: Avoid inline assignments\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nconst cssauron = require(\"cssauron\");\n\nconst ALL = \"*\";\nconst ID = /^#([A-Za-z0-9_])$/;\nconst CLASS = /^\\.([A-Za-z0-9_]+)$/;\nconst TRAIT = /^\\[([A-Za-z0-9_]+)\\]$/;\nconst TYPE = /^[A-Za-z0-9_]+$/;\nconst AUTO = /^<([0-9]+|<*)$/;\n\n// Lazy load CSSauron\nlet language = null;\n\n/*\n Model that wraps a root node and its children.\n\n Monitors adds, removals and ID/class changes.\n Enables CSS selectors, both querying and watching.\n\n Watchers are primed differentially as changes come in,\n and fired with digest().\n*/\nexport class Model {\n constructor(root) {\n this.root = root;\n this.root.model = this;\n this.root.root = this.root;\n\n this.ids = {};\n this.classes = {};\n this.traits = {};\n this.types = {};\n this.nodes = [];\n this.watchers = [];\n this.fire = false;\n\n this.lastNode = null;\n\n this.event = { type: \"update\" };\n\n // Init CSSauron\n if (language == null) {\n language = cssauron({\n tag: \"type\",\n id: \"id\",\n class: \"classes.join(' ')\",\n parent: \"parent\",\n children: \"children\",\n attr: \"traits.hash[attr]\",\n });\n }\n\n // Triggered by child addition/removal\n const add = (event) => adopt(event.node);\n const remove = (event) => dispose(event.node);\n\n this.root.on(\"add\", add);\n this.root.on(\"remove\", remove);\n\n // Track node lifecycle\n var adopt = (node) => {\n addNode(node);\n addType(node);\n addTraits(node);\n\n node.on(\"change:node\", update);\n update(null, node, true);\n return force(node);\n };\n\n var dispose = (node) => {\n removeNode(node);\n removeType(node);\n removeTraits(node);\n removeID(node.id, node);\n removeClasses(node.classes, node);\n\n node.off(\"change:node\", update);\n return force(node);\n };\n\n // Watcher cycle for catching changes in id/classes\n const prime = (node) => {\n for (let watcher of Array.from(this.watchers)) {\n watcher.match = watcher.matcher(node);\n }\n return null;\n };\n\n const check = (node) => {\n for (let watcher of Array.from(this.watchers)) {\n const fire =\n watcher.fire ||\n (watcher.fire = watcher.match !== watcher.matcher(node));\n if (fire) {\n this.lastNode = node;\n }\n if (!this.fire) {\n this.fire = fire;\n }\n }\n return null;\n };\n\n var force = (node) => {\n for (let watcher of Array.from(this.watchers)) {\n const fire = watcher.fire || (watcher.fire = watcher.matcher(node));\n if (fire) {\n this.lastNode = node;\n }\n if (!this.fire) {\n this.fire = fire;\n }\n }\n return null;\n };\n\n this.digest = () => {\n if (!this.fire) {\n return false;\n }\n for (let watcher of Array.from(this.watchers.slice())) {\n if (watcher.fire) {\n watcher.fire = false;\n watcher.handler();\n }\n }\n this.fire = false;\n return true;\n };\n\n // Track id/class changes\n var update = (event, node, init) => {\n const _id = init || event.changed[\"node.id\"];\n const _klass = init || event.changed[\"node.classes\"];\n let primed = false;\n\n if (_id) {\n const id = node.get(\"node.id\");\n if (id !== node.id) {\n if (!init) {\n prime(node);\n }\n primed = true;\n\n if (node.id != null) {\n removeID(node.id, node);\n }\n addID(id, node);\n }\n }\n\n if (_klass) {\n let left;\n let classes = (left = node.get(\"node.classes\")) != null ? left : [];\n const klass = classes.join(\",\");\n if (klass !== (node.classes != null ? node.classes.klass : undefined)) {\n classes = classes.slice();\n\n if (!init && !primed) {\n prime(node);\n }\n primed = true;\n\n if (node.classes != null) {\n removeClasses(node.classes, node);\n }\n addClasses(classes, node);\n\n node.classes = classes;\n node.classes.klass = klass;\n }\n }\n\n if (!init && primed) {\n check(node);\n }\n return null;\n };\n\n // Manage lookup tables for types/classes/traits\n const addTags = function (sets, tags, node) {\n if (tags == null) {\n return;\n }\n for (let k of Array.from(tags)) {\n const list = sets[k] != null ? sets[k] : [];\n list.push(node);\n sets[k] = list;\n }\n return null;\n };\n\n const removeTags = function (sets, tags, node) {\n if (tags == null) {\n return;\n }\n for (let k of Array.from(tags)) {\n const list = sets[k];\n const index = list.indexOf(node);\n if (index >= 0) {\n list.splice(index, 1);\n }\n if (list.length === 0) {\n delete sets[k];\n }\n }\n return null;\n };\n\n // Build a hash for an array of tags for quick lookups\n const hashTags = function (array) {\n if (!(array.length > 0)) {\n return;\n }\n const hash = (array.hash = {});\n return Array.from(array).map((klass) => (hash[klass] = true));\n };\n\n const unhashTags = (array) => delete array.hash;\n\n // Track IDs (live)\n var addID = (id, node) => {\n if (this.ids[id]) {\n throw new Error(`Duplicate node id \\`${id}\\``);\n }\n\n if (id != null) {\n this.ids[id] = [node];\n }\n return (node.id = id != null ? id : node._id);\n };\n\n var removeID = (id, node) => {\n if (id != null) {\n delete this.ids[id];\n }\n return (node.id = node._id);\n };\n\n // Track classes (live)\n var addClasses = (classes, node) => {\n addTags(this.classes, classes, node);\n if (classes != null) {\n return hashTags(classes);\n }\n };\n\n var removeClasses = (classes, node) => {\n removeTags(this.classes, classes, node);\n if (classes != null) {\n return unhashTags(classes);\n }\n };\n\n // Track nodes\n var addNode = (node) => this.nodes.push(node);\n var removeNode = (node) => this.nodes.splice(this.nodes.indexOf(node), 1);\n\n // Track nodes by type\n var addType = (node) => addTags(this.types, [node.type], node);\n var removeType = (node) => removeTags(this.types, [node.type], node);\n\n // Track nodes by trait\n var addTraits = (node) => {\n addTags(this.traits, node.traits, node);\n return hashTags(node.traits);\n };\n\n var removeTraits = (node) => {\n removeTags(this.traits, node.traits, node);\n return unhashTags(node.traits);\n };\n\n adopt(this.root);\n this.root.trigger({ type: \"added\" });\n }\n\n // Filter array by selector\n filter(nodes, selector) {\n const matcher = this._matcher(selector);\n return (() => {\n const result = [];\n for (let node of Array.from(nodes)) {\n if (matcher(node)) {\n result.push(node);\n }\n }\n return result;\n })();\n }\n\n // Filter array by ancestry\n ancestry(nodes, parents) {\n const out = [];\n for (let node of Array.from(nodes)) {\n let { parent } = node;\n while (parent != null) {\n if (Array.from(parents).includes(parent)) {\n out.push(node);\n break;\n }\n ({ parent } = parent);\n }\n }\n return out;\n }\n\n // Query model by (scoped) selector\n select(selector, parents) {\n let matches = this._select(selector);\n if (parents != null) {\n matches = this.ancestry(matches, parents);\n }\n matches.sort((a, b) => b.order - a.order);\n return matches;\n }\n\n // Watch selector with handler\n watch(selector, handler) {\n let watcher;\n handler.unwatch = () => this.unwatch(handler);\n handler.watcher = watcher = {\n selector,\n handler,\n matcher: this._matcher(selector),\n match: false,\n fire: false,\n };\n this.watchers.push(watcher);\n return this.select(selector);\n }\n\n // Unwatch a handler\n unwatch(handler) {\n const { watcher } = handler;\n if (watcher == null) {\n return;\n }\n\n this.watchers.splice(this.watchers.indexOf(watcher), 1);\n delete handler.unwatch;\n return delete handler.watcher;\n }\n\n // Check for simplified selector\n _simplify(s) {\n // Trim whitespace\n let all, auto, id, klass, trait, type;\n s = s.replace(/^\\s+/, \"\");\n s = s.replace(/\\s+$/, \"\");\n\n // Look for *, #id, .class, type, auto\n let found = (all = s === ALL);\n if (!found) {\n found = id = __guard__(s.match(ID), (x) => x[1]);\n }\n if (!found) {\n found = klass = __guard__(s.match(CLASS), (x1) => x1[1]);\n }\n if (!found) {\n found = trait = __guard__(s.match(TRAIT), (x2) => x2[1]);\n }\n if (!found) {\n found = type = __guard__(s.match(TYPE), (x3) => x3[0]);\n }\n if (!found) {\n found = auto = __guard__(s.match(AUTO), (x4) => x4[0]);\n }\n return [all, id, klass, trait, type, auto];\n }\n\n // Make a matcher for a single selector\n _matcher(s) {\n // Check for simple *, #id, .class or type selector\n const [all, id, klass, trait, type, auto] = Array.from(this._simplify(s));\n if (all) {\n return (_node) => true;\n }\n if (id) {\n return (node) => node.id === id;\n }\n if (klass) {\n return (node) =>\n __guard__(\n node.classes != null ? node.classes.hash : undefined,\n (x) => x[klass]\n );\n }\n if (trait) {\n return (node) =>\n __guard__(\n node.traits != null ? node.traits.hash : undefined,\n (x) => x[trait]\n );\n }\n if (type) {\n return (node) => node.type === type;\n }\n if (auto) {\n throw \"Auto-link matcher unsupported\";\n }\n\n // Otherwise apply CSSauron filter\n return language(s);\n }\n\n // Query single selector\n _select(s) {\n // Check for simple *, #id, .class or type selector\n const [all, id, klass, trait, type] = Array.from(this._simplify(s));\n if (all) {\n return this.nodes;\n }\n if (id) {\n return this.ids[id] != null ? this.ids[id] : [];\n }\n if (klass) {\n return this.classes[klass] != null ? this.classes[klass] : [];\n }\n if (trait) {\n return this.traits[trait] != null ? this.traits[trait] : [];\n }\n if (type) {\n return this.types[type] != null ? this.types[type] : [];\n }\n\n // Otherwise apply CSSauron to everything\n return this.filter(this.nodes, s);\n }\n\n getRoot() {\n return this.root;\n }\n\n getLastTrigger() {\n return this.lastNode.toString();\n }\n}\n\nfunction __guard__(value, transform) {\n return typeof value !== \"undefined\" && value !== null\n ? transform(value)\n : undefined;\n}\n","export * from \"./attributes.js\";\nexport * from \"./group.js\";\nexport * from \"./guard.js\";\nexport * from \"./model.js\";\nexport * from \"./node.js\";\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nexport class OverlayFactory {\n constructor(classes, canvas) {\n this.classes = classes;\n this.canvas = canvas;\n const div = document.createElement(\"div\");\n div.classList.add(\"mathbox-overlays\");\n this.div = div;\n }\n\n inject() {\n const element = this.canvas.parentNode;\n if (!element) {\n throw new Error(\"Canvas not inserted into document.\");\n }\n return element.insertBefore(this.div, this.canvas);\n }\n\n unject() {\n const element = this.div.parentNode;\n return element.removeChild(this.div);\n }\n\n getTypes() {\n return Object.keys(this.classes);\n }\n\n make(type, options) {\n return new this.classes[type](this.div, options);\n }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n// Quick'n'dirty Virtual DOM diffing\n// with a poor man's React for components\n//\n// This is for rendering HTML with data from a GL readback. See DOM examples.\nconst HEAP = [];\nlet id = 0;\n\n// Static render components\nexport const Types = {\n /*\n * el('example', props, children);\n example: MathBox.DOM.createClass({\n render: (el, props, children) ->\n * VDOM node\n return el('span', { className: \"foo\" }, \"Hello World\")\n })\n */\n};\n\nconst descriptor = () => ({\n id: id++,\n type: null,\n props: null,\n children: null,\n rendered: null,\n instance: null,\n});\n\nexport const hint = function (n) {\n n *= 2;\n n = Math.max(0, HEAP.length - n);\n return __range__(0, n, false).map((_i) => HEAP.push(descriptor()));\n};\n\nexport const element = function (type, props, children) {\n const el = HEAP.length ? HEAP.pop() : descriptor();\n\n el.type = type != null ? type : \"div\";\n el.props = props != null ? props : null;\n el.children = children != null ? children : null;\n // Can't use `arguments` here to pass children as direct args, it de-optimizes label emitters\n\n return el;\n};\n\nexport const recycle = function (el) {\n if (!el.type) {\n return;\n }\n\n const { children } = el;\n el.type = el.props = el.children = el.instance = null;\n\n HEAP.push(el);\n\n if (children != null) {\n for (let child of Array.from(children)) {\n recycle(child);\n }\n }\n};\n\nexport const apply = function (el, last, node, parent, index) {\n if (el != null) {\n if (last == null) {\n // New node\n return mount(el, parent, index);\n } else {\n // Literal DOM node\n let same;\n if (el instanceof Node) {\n same = el === last;\n if (same) {\n return;\n }\n } else {\n // Check compatibility\n same =\n typeof el === typeof last &&\n last !== null &&\n el !== null &&\n el.type === last.type;\n }\n\n if (!same) {\n // Not compatible: unmount and remount\n unmount(last.instance, node);\n node.remove();\n return mount(el, parent, index);\n } else {\n // Maintain component ref\n let key, ref, value;\n el.instance = last.instance;\n\n // Check if it's a component\n const type = (el.type != null ? el.type.isComponentClass : undefined)\n ? el.type\n : Types[el.type];\n\n // Prepare to diff props and children\n const props = last != null ? last.props : undefined;\n const nextProps = el.props;\n const children =\n (last != null ? last.children : undefined) != null\n ? last != null\n ? last.children\n : undefined\n : null;\n const nextChildren = el.children;\n\n if (nextProps != null) {\n nextProps.children = nextChildren;\n }\n\n // Component\n if (type != null) {\n // See if it changed\n let dirty = node._COMPONENT_DIRTY;\n\n if ((props != null) !== (nextProps != null)) {\n dirty = true;\n }\n if (children !== nextChildren) {\n dirty = true;\n }\n\n if (props != null && nextProps != null) {\n if (!dirty) {\n for (key in props) {\n if (!Object.prototype.hasOwnProperty.call(nextProps, key)) {\n dirty = true;\n }\n }\n }\n if (!dirty) {\n for (key in nextProps) {\n value = nextProps[key];\n if ((ref = props[key]) !== value) {\n dirty = true;\n }\n }\n }\n }\n\n if (dirty) {\n let left;\n const comp = last.instance;\n if (el.props == null) {\n el.props = {};\n }\n for (let k in comp.defaultProps) {\n const v = comp.defaultProps[k];\n if (el.props[k] == null) {\n el.props[k] = v;\n }\n }\n el.props.children = el.children;\n\n if (typeof comp.willReceiveProps === \"function\") {\n comp.willReceiveProps(el.props);\n }\n const should =\n node._COMPONENT_FORCE ||\n ((left =\n typeof comp.shouldUpdate === \"function\"\n ? comp.shouldUpdate(el.props)\n : undefined) != null\n ? left\n : true);\n\n if (should) {\n const nextState = comp.getNextState();\n if (typeof comp.willUpdate === \"function\") {\n comp.willUpdate(el.props, nextState);\n }\n }\n\n const prevProps = comp.props;\n const prevState = comp.applyNextState();\n\n comp.props = el.props;\n comp.children = el.children;\n\n if (should) {\n el = el.rendered =\n typeof comp.render === \"function\"\n ? comp.render(element, el.props, el.children)\n : undefined;\n apply(el, last.rendered, node, parent, index);\n\n if (typeof comp.didUpdate === \"function\") {\n comp.didUpdate(prevProps, prevState);\n }\n }\n }\n\n return;\n } else {\n // VDOM node\n if (props != null) {\n for (key in props) {\n if (!Object.prototype.hasOwnProperty.call(nextProps, key)) {\n unset(node, key, props[key]);\n }\n }\n }\n if (nextProps != null) {\n for (key in nextProps) {\n value = nextProps[key];\n if ((ref = props[key]) !== value && key !== \"children\") {\n set(node, key, value, ref);\n }\n }\n }\n\n // Diff children\n if (nextChildren != null) {\n if ([\"string\", \"number\"].includes(typeof nextChildren)) {\n // Insert text directly\n if (nextChildren !== children) {\n node.textContent = nextChildren;\n }\n } else {\n if (nextChildren.type != null) {\n // Single child\n apply(nextChildren, children, node.childNodes[0], node, 0);\n } else {\n // Diff children\n let child, i;\n const { childNodes } = node;\n if (children != null) {\n for (i = 0; i < nextChildren.length; i++) {\n child = nextChildren[i];\n apply(child, children[i], childNodes[i], node, i);\n }\n } else {\n for (i = 0; i < nextChildren.length; i++) {\n child = nextChildren[i];\n apply(child, null, childNodes[i], node, i);\n }\n }\n }\n }\n } else if (children != null) {\n // Unmount all child components\n unmount(null, node);\n\n // Remove all children\n node.innerHTML = \"\";\n }\n }\n\n return;\n }\n }\n }\n\n if (last != null) {\n // Removed node\n unmount(last.instance, node);\n return last.node.remove();\n }\n};\n\nvar mount = function (el, parent, index) {\n let node;\n if (index == null) {\n index = 0;\n }\n const type = (el.type != null ? el.type.isComponentClass : undefined)\n ? el.type\n : Types[el.type];\n\n // Literal DOM node\n if (el instanceof Node) {\n node = el;\n } else {\n if (type != null) {\n // Component\n let comp;\n const ctor = (el.type != null ? el.type.isComponentClass : undefined)\n ? el.type\n : Types[el.type];\n\n // No component class found\n if (!ctor) {\n el = el.rendered = element(\"noscript\");\n node = mount(el, parent, index);\n return node;\n }\n\n // Construct component class\n el.instance = comp = new ctor(parent);\n if (el.props == null) {\n el.props = {};\n }\n for (let k in comp.defaultProps) {\n const v = comp.defaultProps[k];\n if (el.props[k] == null) {\n el.props[k] = v;\n }\n }\n el.props.children = el.children;\n\n // Do initial state transition\n comp.props = el.props;\n comp.children = el.children;\n comp.setState(\n typeof comp.getInitialState === \"function\"\n ? comp.getInitialState()\n : undefined\n );\n if (typeof comp.willMount === \"function\") {\n comp.willMount();\n }\n\n // Render\n el = el.rendered =\n typeof comp.render === \"function\"\n ? comp.render(element, el.props, el.children)\n : undefined;\n node = mount(el, parent, index);\n\n // Finish mounting and remember component/node association\n if (typeof comp.didMount === \"function\") {\n comp.didMount(el);\n }\n node._COMPONENT = comp;\n\n return node;\n } else if ([\"string\", \"number\"].includes(typeof el)) {\n // Text\n node = document.createTextNode(el);\n } else {\n // VDOM Node\n node = document.createElement(el.type);\n for (let key in el.props) {\n const value = el.props[key];\n set(node, key, value);\n }\n }\n\n const { children } = el;\n if (children != null) {\n if ([\"string\", \"number\"].includes(typeof children)) {\n // Insert text directly\n node.textContent = children;\n } else {\n if (children.type != null) {\n // Single child\n mount(children, node, 0);\n } else {\n // Insert children\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n mount(child, node, i);\n }\n }\n }\n }\n }\n\n parent.insertBefore(node, parent.childNodes[index]);\n return node;\n};\n\nvar unmount = function (comp, node) {\n if (comp) {\n if (typeof comp.willUnmount === \"function\") {\n comp.willUnmount();\n }\n for (let k in comp) {\n delete comp[k];\n }\n }\n\n return (() => {\n const result = [];\n for (let child of Array.from(node.childNodes)) {\n unmount(child._COMPONENT, child);\n result.push(delete child._COMPONENT);\n }\n return result;\n })();\n};\n\nconst prop = function (key) {\n if (typeof document === \"undefined\") {\n return true;\n }\n if (document.documentElement.style[key] != null) {\n return key;\n }\n\n key = key[0].toUpperCase() + key.slice(1);\n const prefixes = [\"webkit\", \"moz\", \"ms\", \"o\"];\n for (let prefix of Array.from(prefixes)) {\n if (document.documentElement.style[prefix + key] != null) {\n return prefix + key;\n }\n }\n};\n\nconst map = {};\nfor (let key of [\"transform\"]) {\n map[key] = prop(key);\n}\n\nvar set = function (node, key, value, orig) {\n if (key === \"style\") {\n for (let k in value) {\n const v = value[k];\n if ((orig != null ? orig[k] : undefined) !== v) {\n node.style[map[k] != null ? map[k] : k] = v;\n }\n }\n return;\n }\n\n if (node[key] != null) {\n try {\n node[key] = value;\n } catch (e1) {\n console.log(\"failed setting \" + key);\n }\n return;\n }\n\n if (node instanceof Node) {\n node.setAttribute(key, value);\n return;\n }\n};\n\nvar unset = function (node, key, orig) {\n if (key === \"style\") {\n for (let k in orig) {\n node.style[map[k] != null ? map[k] : k] = \"\";\n }\n return;\n }\n\n if (node[key] != null) {\n node[key] = undefined;\n }\n\n if (node instanceof Node) {\n node.removeAttribute(key);\n return;\n }\n};\n\nexport const createClass = function (prototype) {\n let left;\n const aliases = {\n willMount: \"componentWillMount\",\n didMount: \"componentDidMount\",\n willReceiveProps: \"componentWillReceiveProps\",\n shouldUpdate: \"shouldComponentUpdate\",\n willUpdate: \"componentWillUpdate\",\n didUpdate: \"componentDidUpdate\",\n willUnmount: \"componentWillUnmount\",\n };\n for (let a in aliases) {\n const b = aliases[a];\n if (prototype[a] == null) {\n prototype[a] = prototype[b];\n }\n }\n\n class Component {\n constructor(node, props, state = null, children = null) {\n let k, v;\n if (props == null) {\n props = {};\n }\n this.props = props;\n this.state = state;\n this.children = children;\n const bind = function (f, self) {\n if (typeof f === \"function\") {\n return f.bind(self);\n } else {\n return f;\n }\n };\n for (k in prototype) {\n v = prototype[k];\n this[k] = bind(v, this);\n }\n\n let nextState = null;\n\n this.setState = function (state) {\n if (nextState == null) {\n nextState = state ? (nextState != null ? nextState : {}) : null;\n }\n for (k in state) {\n v = state[k];\n nextState[k] = v;\n }\n node._COMPONENT_DIRTY = true;\n };\n\n this.forceUpdate = function () {\n node._COMPONENT_FORCE = node._COMPONENT_DIRTY = true;\n\n let el = node;\n return (() => {\n const result = [];\n while ((el = el.parentNode)) {\n if (el._COMPONENT) {\n result.push((el._COMPONENT_FORCE = true));\n } else {\n result.push(undefined);\n }\n }\n return result;\n })();\n };\n\n this.getNextState = () => nextState;\n\n this.applyNextState = function () {\n node._COMPONENT_FORCE = node._COMPONENT_DIRTY = false;\n const prevState = this.state;\n [nextState, this.state] = Array.from([null, nextState]);\n return prevState;\n };\n }\n }\n\n Component.isComponentClass = true;\n Component.prototype.defaultProps =\n (left =\n typeof prototype.getDefaultProps === \"function\"\n ? prototype.getDefaultProps()\n : undefined) != null\n ? left\n : {};\n return Component;\n};\n\nfunction __range__(left, right, inclusive) {\n let range = [];\n let ascending = left < right;\n let end = !inclusive ? right : ascending ? right + 1 : right - 1;\n for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {\n range.push(i);\n }\n return range;\n}\n","export class Overlay {\n constructor(element, options) {\n this.element = element;\n if (typeof this.init === \"function\") {\n this.init(options);\n }\n }\n\n dispose() {}\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as VDOM from \"../util/vdom.js\";\nimport { Overlay } from \"./overlay.js\";\n\nexport class DOM extends Overlay {\n static initClass() {\n this.prototype.el = VDOM.element;\n this.prototype.hint = VDOM.hint;\n this.prototype.apply = VDOM.apply;\n this.prototype.recycle = VDOM.recycle;\n }\n\n init(_options) {\n return (this.last = null);\n }\n\n dispose() {\n this.unmount();\n return super.dispose();\n }\n\n mount() {\n const overlay = document.createElement(\"div\");\n overlay.classList.add(\"mathbox-overlay\");\n this.element.appendChild(overlay);\n return (this.overlay = overlay);\n }\n\n unmount(_overlay) {\n if (this.overlay.parentNode) {\n this.element.removeChild(this.overlay);\n }\n return (this.overlay = null);\n }\n\n render(el) {\n // Lazy mounting\n if (!this.overlay) {\n this.mount();\n }\n\n // Wrap naked string or array in a div\n if ([\"string\", \"number\"].includes(typeof el)) {\n el = this.el(\"div\", null, el);\n }\n if (el instanceof Array) {\n el = this.el(\"div\", null, el);\n }\n\n // See if it can be mounted directly\n const naked = el.type === \"div\";\n\n // Fetch last DOM state\n let { last } = this;\n\n // Start with root node\n const { overlay } = this;\n const node = naked ? overlay : overlay.childNodes[0];\n const parent = naked ? overlay.parentNode : overlay;\n\n // Create phantom DOM state if mounting into existing element\n if (!last && node) {\n last = this.el(\"div\");\n }\n\n // Update DOM\n this.apply(el, last, node, parent, 0);\n this.last = el;\n\n // Recycle old descriptors\n if (last != null) {\n this.recycle(last);\n }\n }\n}\nDOM.initClass();\n","import { DOM } from \"./dom.js\";\n\nexport const Classes = { dom: DOM };\n","export { OverlayFactory as Factory } from \"./factory.js\";\nexport * from \"./classes.js\";\nexport * from \"./overlay.js\";\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as Model from \"../model\";\nimport { Binder } from \"@sicmutils/threestrap/src/binder.js\";\n\nexport class Primitive {\n static initClass() {\n this.Node = Model.Node;\n this.Group = Model.Group;\n\n // Class default\n this.model = this.Node;\n this.defaults = null;\n this.traits = null;\n this.props = null;\n this.finals = null;\n this.freeform = false;\n }\n\n constructor(node, _context, helpers) {\n this.node = node;\n this._context = _context;\n this._renderables = this._context.renderables;\n this._attributes = this._context.attributes;\n this._shaders = this._context.shaders;\n this._overlays = this._context.overlays;\n this._animator = this._context.animator;\n this._types = this._attributes.types;\n\n // Link up node 1-to-1\n this.node.controller = this;\n\n // This node has been inserted/removed\n this.node.on(\"added\", (_event) => this._added());\n this.node.on(\"removed\", (_event) => this._removed());\n\n // Property change (if mounted)\n this.node.on(\"change\", (event) => {\n if (this._root) {\n return this.change(event.changed, event.touched);\n }\n });\n\n // Store local refs\n this.reconfigure();\n\n // Attribute getter / helpers\n this._get = this.node.get.bind(this.node);\n this._helpers = helpers(this, this.node.traits);\n\n // Keep track of various handlers to do auto-cleanup on unmake()\n this._handlers = { inherit: {}, listen: [], watch: [], compute: [] };\n\n // Detached initially\n this._root = this._parent = null;\n\n // Friendly constructor\n this.init();\n }\n\n is(trait) {\n return this.traits.hash[trait];\n }\n\n // Primitive lifecycle\n init() {}\n make() {}\n made() {}\n unmake(_rebuild) {}\n unmade() {}\n change(_changed, _touched, _init) {}\n\n // Force property reinit\n refresh() {\n return this.change({}, {}, true);\n }\n\n // Destroy and create cycle\n rebuild() {\n if (this._root) {\n this._removed(true);\n return this._added();\n }\n }\n\n // Reconfigure traits/props\n reconfigure(config) {\n if (config != null) {\n this.node.configure(config, this._attributes);\n }\n\n this.traits = this.node.traits;\n return (this.props = this.node.props);\n }\n\n // This node has been inserted\n _added() {\n let e, left;\n this._parent =\n this.node.parent != null ? this.node.parent.controller : undefined;\n this._root = this.node.root != null ? this.node.root.controller : undefined;\n\n this.node.clock =\n (left = this._inherit(\"clock\")) != null ? left : this._root;\n\n try {\n try {\n this.make();\n this.refresh();\n return this.made();\n } catch (error) {\n e = error;\n this.node.print(\"warn\");\n console.error(e);\n throw e;\n }\n } catch (error1) {\n e = error1;\n try {\n return this._removed();\n // eslint-disable-next-line no-empty\n } catch (error2) {}\n }\n }\n\n _removed(rebuild) {\n if (rebuild == null) {\n rebuild = false;\n }\n this.unmake(rebuild);\n\n this._unlisten();\n this._unattach();\n this._uncompute();\n\n this._root = null;\n this._parent = null;\n\n return this.unmade(rebuild);\n }\n\n // Bind event listeners to methods\n _listen(object, type, method, self) {\n if (self == null) {\n self = this;\n }\n if (object instanceof Array) {\n for (let o of Array.from(object)) {\n return this.__listen(o, type, method, self);\n }\n }\n return this.__listen(object, type, method, self);\n }\n\n __listen(object, type, method, self) {\n if (self == null) {\n self = this;\n }\n if (typeof object === \"string\") {\n object = this._inherit(object);\n }\n\n if (object != null) {\n const handler = method.bind(self);\n handler.node = this.node;\n object.on(type, handler);\n\n this._handlers.listen.push([object, type, handler]);\n }\n return object;\n }\n\n _unlisten() {\n if (!this._handlers.listen.length) {\n return;\n }\n\n for (let [object, type, handler] of Array.from(this._handlers.listen)) {\n object.off(type, handler);\n }\n return (this._handlers.listen = []);\n }\n\n // Find parent with certain trait\n _inherit(trait) {\n const cached = this._handlers.inherit[trait];\n if (cached !== undefined) {\n return cached;\n }\n\n return (this._handlers.inherit[trait] =\n this._parent != null\n ? this._parent._find(trait != null ? trait : null)\n : undefined);\n }\n\n _find(trait) {\n if (this.is(trait)) {\n return this;\n }\n return this._parent != null ? this._parent._find(trait) : undefined;\n }\n\n _uninherit() {\n return (this._handlers.inherit = {});\n }\n\n // Attach to controller by trait and watch the selector\n _attach(selector, trait, method, self, start, optional, multiple) {\n if (self == null) {\n self = this;\n }\n if (start == null) {\n start = this;\n }\n if (optional == null) {\n optional = false;\n }\n if (multiple == null) {\n multiple = false;\n }\n const filter = function (node) {\n if (node != null && Array.from(node.traits).includes(trait)) {\n return node;\n }\n };\n const map = (node) => (node != null ? node.controller : undefined);\n const flatten = function (list) {\n if (list == null) {\n return list;\n }\n let out = [];\n for (let sub of Array.from(list)) {\n if (sub instanceof Array) {\n out = out.concat(sub);\n } else {\n out.push(sub);\n }\n }\n return out;\n };\n\n var resolve = (selector) => {\n // Direct JS binding, no watcher.\n let node, nodes;\n if (typeof selector === \"object\") {\n node = selector;\n\n // API object\n if (node != null ? node._up : undefined) {\n selector = multiple ? node._targets : [node[0]];\n return selector;\n }\n\n // Array of things\n if (node instanceof Array) {\n selector = multiple ? flatten(node.map(resolve)) : resolve(node[0]);\n return selector;\n }\n\n // Node\n if (node instanceof Model.Node) {\n return [node];\n }\n\n // Auto-link selector '<'\n } else if (typeof selector === \"string\" && selector[0] === \"<\") {\n let match;\n let discard = 0;\n if ((match = selector.match(/^<([0-9])+$/))) {\n discard = +match[1] - 1;\n }\n if (selector.match(/^<+$/)) {\n discard = +selector.length - 1;\n }\n\n nodes = [];\n\n // Implicitly associated node (scan backwards until we find one)\n let previous = start.node;\n while (previous) {\n // Find previous node\n const { parent } = previous;\n if (!parent) {\n break;\n }\n previous = parent.children[previous.index - 1];\n\n // If we reached the first child, ascend if nothing found yet\n if (!previous && !nodes.length) {\n previous = parent;\n }\n\n // Include if matched\n node = null;\n if (filter(previous)) {\n node = previous;\n }\n if (node != null && discard-- <= 0) {\n nodes.push(node);\n }\n\n // Return solo match\n if (!multiple && nodes.length) {\n return nodes;\n }\n }\n\n // Return list match\n if (multiple && nodes.length) {\n return nodes;\n }\n\n // Selector binding\n } else if (typeof selector === \"string\") {\n const watcher = method.bind(self);\n this._handlers.watch.push(watcher);\n\n const selection = this._root.watch(selector, watcher);\n if (!multiple) {\n if (filter(selection[0])) {\n node = selection[0];\n }\n if (node != null) {\n return [node];\n }\n } else {\n nodes = selection.filter(filter);\n if (nodes.length) {\n return nodes;\n }\n }\n }\n\n // Nothing found\n if (!optional) {\n console.warn(this.node.toMarkup());\n throw new Error(\n `${this.node.toString()} - Could not find ${trait} \\`${selector}\\``\n );\n }\n if (multiple) {\n return [];\n } else {\n return null;\n }\n };\n\n // Resolve selection recursively\n const nodes = flatten(resolve(selector));\n\n // Return node's controllers if found\n if (multiple) {\n if (nodes != null) {\n return nodes.map(map);\n } else {\n return null;\n }\n } else {\n if (nodes != null) {\n return map(nodes[0]);\n } else {\n return null;\n }\n }\n }\n\n // Remove watcher attachments\n _unattach() {\n if (!this._handlers.watch.length) {\n return;\n }\n\n for (let watcher of Array.from(this._handlers.watch)) {\n if (watcher != null) {\n watcher.unwatch();\n }\n }\n return (this._handlers.watch = []);\n }\n\n // Bind a computed value to a prop\n _compute(key, expr) {\n this._handlers.compute.push(key);\n return this.node.bind(key, expr, true);\n }\n\n // Remove prop bindings\n _uncompute() {\n if (!this._handlers.compute.length) {\n return;\n }\n for (let key of Array.from(this._handlers.compute)) {\n this.node.unbind(key, true);\n }\n return (this._handlers.compute = []);\n }\n}\nPrimitive.initClass();\n\nBinder.apply(Primitive.prototype);\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Primitive } from \"../../primitive.js\";\n\nexport class Parent extends Primitive {\n static initClass() {\n this.model = Primitive.Group;\n this.traits = [\"node\"];\n }\n}\nParent.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Parent } from \"./parent.js\";\n\nexport class Group extends Parent {\n static initClass() {\n this.traits = [\"node\", \"object\", \"entity\", \"visible\", \"active\"];\n }\n\n make() {\n this._helpers.visible.make();\n return this._helpers.active.make();\n }\n\n unmake() {\n this._helpers.visible.unmake();\n return this._helpers.active.unmake();\n }\n}\nGroup.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Parent } from \"./parent.js\";\n\nexport class Inherit extends Parent {\n static initClass() {\n this.traits = [\"node\", \"bind\"];\n }\n\n make() {\n // Bind to attached trait source\n return this._helpers.bind.make([{ to: \"inherit.source\", trait: \"node\" }]);\n }\n\n unmake() {\n return this._helpers.bind.unmake();\n }\n\n _find(trait) {\n if (this.bind.source && Array.from(this.props.traits).includes(trait)) {\n return this.bind.source._inherit(trait);\n }\n return super._find();\n }\n}\nInherit.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining\n * DS104: Avoid inline assignments\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Parent } from \"./parent.js\";\n\nexport class Root extends Parent {\n static initClass() {\n this.traits = [\"node\", \"root\", \"clock\", \"scene\", \"vertex\", \"unit\"];\n }\n\n init() {\n this.size = null;\n\n this.cameraEvent = { type: \"root.camera\" };\n this.preEvent = { type: \"root.pre\" };\n this.updateEvent = { type: \"root.update\" };\n this.renderEvent = { type: \"root.render\" };\n this.postEvent = { type: \"root.post\" };\n\n this.clockEvent = { type: \"clock.tick\" };\n\n return (this.camera = null);\n }\n\n make() {\n return this._helpers.unit.make();\n }\n unmake() {\n return this._helpers.unit.unmake();\n }\n\n change(changed, touched, init) {\n if (changed[\"root.camera\"] || init) {\n this._unattach();\n this._attach(\n this.props.camera,\n \"camera\",\n this.setCamera,\n this,\n this,\n true\n );\n return this.setCamera();\n }\n }\n\n adopt(renderable) {\n return Array.from(renderable.renders).map((object) =>\n this._context.scene.add(object)\n );\n }\n unadopt(renderable) {\n return Array.from(renderable.renders).map((object) =>\n this._context.scene.remove(object)\n );\n }\n\n select(selector) {\n return this.node.model.select(selector);\n }\n\n watch(selector, handler) {\n return this.node.model.watch(selector, handler);\n }\n\n unwatch(handler) {\n return this.node.model.unwatch(handler);\n }\n\n resize(size) {\n this.size = size;\n return this.trigger({\n type: \"root.resize\",\n size,\n });\n }\n\n getSize() {\n return this.size;\n }\n getSpeed() {\n return this.props.speed;\n }\n\n getUnit() {\n return this._helpers.unit.get();\n }\n getUnitUniforms() {\n return this._helpers.unit.uniforms();\n }\n\n pre() {\n this.getCamera().updateProjectionMatrix();\n this.trigger(this.clockEvent);\n return this.trigger(this.preEvent);\n }\n\n update() {\n return this.trigger(this.updateEvent);\n }\n render() {\n return this.trigger(this.renderEvent);\n }\n post() {\n return this.trigger(this.postEvent);\n }\n\n setCamera() {\n const camera = __guard__(\n this.select(this.props.camera)[0],\n (x) => x.controller\n );\n if (this.camera !== camera) {\n this.camera = camera;\n return this.trigger({ type: \"root.camera\" });\n }\n }\n\n getCamera() {\n let left;\n return (left = this.camera != null ? this.camera.getCamera() : undefined) !=\n null\n ? left\n : this._context.defaultCamera;\n }\n\n getTime() {\n return this._context.time;\n }\n\n // End transform chain here\n vertex(shader, pass) {\n if (pass === 2) {\n return shader.pipe(\"view.position\");\n }\n if (pass === 3) {\n return shader.pipe(\"root.position\");\n }\n return shader;\n }\n}\nRoot.initClass();\n\nfunction __guard__(value, transform) {\n return typeof value !== \"undefined\" && value !== null\n ? transform(value)\n : undefined;\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Parent } from \"./parent.js\";\n\nexport class Unit extends Parent {\n static initClass() {\n this.traits = [\"node\", \"unit\"];\n }\n\n make() {\n return this._helpers.unit.make();\n }\n unmake() {\n return this._helpers.unit.unmake();\n }\n\n getUnit() {\n return this._helpers.unit.get();\n }\n getUnitUniforms() {\n return this._helpers.unit.uniforms();\n }\n}\nUnit.initClass();\n","export * from \"./group.js\";\nexport * from \"./inherit.js\";\nexport * from \"./root.js\";\nexport * from \"./unit.js\";\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport * as CONST from \"three/src/constants.js\";\n\nimport { Euler } from \"three/src/math/Euler.js\";\nimport { Matrix4 } from \"three/src/math/Matrix4.js\";\nimport { Quaternion } from \"three/src/math/Quaternion.js\";\nimport { Vector3 } from \"three/src/math/Vector3.js\";\n\nexport const paramToGL = function (gl, p) {\n if (p === CONST.RepeatWrapping) {\n return gl.REPEAT;\n }\n if (p === CONST.ClampToEdgeWrapping) {\n return gl.CLAMP_TO_EDGE;\n }\n if (p === CONST.MirroredRepeatWrapping) {\n return gl.MIRRORED_REPEAT;\n }\n\n if (p === CONST.NearestFilter) {\n return gl.NEAREST;\n }\n if (p === CONST.NearestMipMapNearestFilter) {\n return gl.NEAREST_MIPMAP_NEAREST;\n }\n if (p === CONST.NearestMipMapLinearFilter) {\n return gl.NEAREST_MIPMAP_LINEAR;\n }\n\n if (p === CONST.LinearFilter) {\n return gl.LINEAR;\n }\n if (p === CONST.LinearMipMapNearestFilter) {\n return gl.LINEAR_MIPMAP_NEAREST;\n }\n if (p === CONST.LinearMipMapLinearFilter) {\n return gl.LINEAR_MIPMAP_LINEAR;\n }\n\n if (p === CONST.UnsignedByteType) {\n return gl.UNSIGNED_BYTE;\n }\n if (p === CONST.UnsignedShort4444Type) {\n return gl.UNSIGNED_SHORT_4_4_4_4;\n }\n if (p === CONST.UnsignedShort5551Type) {\n return gl.UNSIGNED_SHORT_5_5_5_1;\n }\n if (p === CONST.ByteType) {\n return gl.BYTE;\n }\n if (p === CONST.ShortType) {\n return gl.SHORT;\n }\n if (p === CONST.UnsignedShortType) {\n return gl.UNSIGNED_SHORT;\n }\n if (p === CONST.IntType) {\n return gl.INT;\n }\n if (p === CONST.UnsignedIntType) {\n return gl.UNSIGNED_INT;\n }\n if (p === CONST.FloatType) {\n return gl.FLOAT;\n }\n\n if (p === CONST.AlphaFormat) {\n return gl.ALPHA;\n }\n if (p === CONST.RGBFormat) {\n return gl.RGB;\n }\n if (p === CONST.RGBAFormat) {\n return gl.RGBA;\n }\n if (p === CONST.LuminanceFormat) {\n return gl.LUMINANCE;\n }\n if (p === CONST.LuminanceAlphaFormat) {\n return gl.LUMINANCE_ALPHA;\n }\n\n if (p === CONST.AddEquation) {\n return gl.FUNC_ADD;\n }\n if (p === CONST.SubtractEquation) {\n return gl.FUNC_SUBTRACT;\n }\n if (p === CONST.ReverseSubtractEquation) {\n return gl.FUNC_REVERSE_SUBTRACT;\n }\n\n if (p === CONST.ZeroFactor) {\n return gl.ZERO;\n }\n if (p === CONST.OneFactor) {\n return gl.ONE;\n }\n if (p === CONST.SrcColorFactor) {\n return gl.SRC_COLOR;\n }\n if (p === CONST.OneMinusSrcColorFactor) {\n return gl.ONE_MINUS_SRC_COLOR;\n }\n if (p === CONST.SrcAlphaFactor) {\n return gl.SRC_ALPHA;\n }\n if (p === CONST.OneMinusSrcAlphaFactor) {\n return gl.ONE_MINUS_SRC_ALPHA;\n }\n if (p === CONST.DstAlphaFactor) {\n return gl.DST_ALPHA;\n }\n if (p === CONST.OneMinusDstAlphaFactor) {\n return gl.ONE_MINUS_DST_ALPHA;\n }\n\n if (p === CONST.DstColorFactor) {\n return gl.DST_COLOR;\n }\n if (p === CONST.OneMinusDstColorFactor) {\n return gl.ONE_MINUS_DST_COLOR;\n }\n if (p === CONST.SrcAlphaSaturateFactor) {\n return gl.SRC_ALPHA_SATURATE;\n }\n\n return 0;\n};\n\nexport const paramToArrayStorage = function (type) {\n switch (type) {\n case CONST.UnsignedByteType:\n return Uint8Array;\n case CONST.ByteType:\n return Int8Array;\n case CONST.ShortType:\n return Int16Array;\n case CONST.UnsignedShortType:\n return Uint16Array;\n case CONST.IntType:\n return Int32Array;\n case CONST.UnsignedIntType:\n return Uint32Array;\n case CONST.FloatType:\n return Float32Array;\n }\n};\n\nexport const swizzleToEulerOrder = (swizzle) =>\n swizzle.map((i) => [\"\", \"X\", \"Y\", \"Z\"][i]).join(\"\");\n\nexport const transformComposer = function () {\n const euler = new Euler();\n const quat = new Quaternion();\n const pos = new Vector3();\n const scl = new Vector3();\n const transform = new Matrix4();\n\n return function (position, rotation, quaternion, scale, matrix, eulerOrder) {\n if (eulerOrder == null) {\n eulerOrder = \"XYZ\";\n }\n if (rotation != null) {\n if (eulerOrder instanceof Array) {\n eulerOrder = swizzleToEulerOrder(eulerOrder);\n }\n euler.setFromVector3(rotation, eulerOrder);\n quat.setFromEuler(euler);\n } else {\n quat.set(0, 0, 0, 1);\n }\n\n if (quaternion != null) {\n quat.multiply(quaternion);\n }\n\n if (position != null) {\n pos.copy(position);\n } else {\n pos.set(0, 0, 0);\n }\n\n if (scale != null) {\n scl.copy(scale);\n } else {\n scl.set(1, 1, 1);\n }\n\n transform.compose(pos, quat, scl);\n if (matrix != null) {\n transform.multiplyMatrices(transform, matrix);\n }\n\n return transform;\n };\n};\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UThree from \"../../../util/three.js\";\nimport { Euler } from \"three/src/math/Euler.js\";\nimport { Primitive } from \"../../primitive.js\";\nimport { Quaternion } from \"three/src/math/Quaternion.js\";\n\nexport class Camera extends Primitive {\n static initClass() {\n this.traits = [\"node\", \"camera\"];\n }\n\n init() {}\n\n make() {\n const camera = this._context.defaultCamera;\n this.camera = this.props.proxy ? camera : camera.clone();\n\n this.euler = new Euler();\n return (this.quat = new Quaternion());\n }\n\n unmake() {}\n\n getCamera() {\n return this.camera;\n }\n\n change(changed, touched, init) {\n if (\n changed[\"camera.position\"] ||\n changed[\"camera.quaternion\"] ||\n changed[\"camera.rotation\"] ||\n changed[\"camera.lookAt\"] ||\n changed[\"camera.up\"] ||\n changed[\"camera.fov\"] ||\n init\n ) {\n const { position, quaternion, rotation, lookAt, up, fov } = this.props;\n\n // Apply transform conservatively to avoid conflicts with controls / proxy\n if (position != null) {\n this.camera.position.copy(position);\n }\n\n if (quaternion != null || rotation != null || lookAt != null) {\n if (lookAt != null) {\n this.camera.lookAt(lookAt);\n } else {\n this.camera.quaternion.set(0, 0, 0, 1);\n }\n\n if (rotation != null) {\n this.euler.setFromVector3(\n rotation,\n UThree.swizzleToEulerOrder(this.props.eulerOrder)\n );\n this.quat.setFromEuler(this.euler);\n this.camera.quaternion.multiply(this.quat);\n }\n\n if (quaternion != null) {\n this.camera.quaternion.multiply(quaternion);\n }\n }\n\n if (fov != null && this.camera.fov != null) {\n this.camera.fov = fov;\n }\n\n if (up != null) {\n this.camera.up.copy(up);\n }\n\n return this.camera.updateMatrix();\n }\n }\n}\nCamera.initClass();\n","export * from \"./camera.js\";\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS202: Simplify dynamic range loops\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nexport const getSizes = function (data) {\n const sizes = [];\n let array = data;\n while (\n typeof array !== \"string\" &&\n (array != null ? array.length : undefined) != null\n ) {\n sizes.push(array.length);\n array = array[0];\n }\n return sizes;\n};\n\nexport const getDimensions = function (data, spec) {\n let left;\n if (spec == null) {\n spec = {};\n }\n const { items, channels, width, height, depth } = spec;\n\n const dims = {};\n\n if (!data || !data.length) {\n return {\n items,\n channels,\n width: width != null ? width : 0,\n height: height != null ? height : 0,\n depth: depth != null ? depth : 0,\n };\n }\n\n const sizes = getSizes(data);\n const nesting = sizes.length;\n\n dims.channels = channels !== 1 && sizes.length > 1 ? sizes.pop() : channels;\n dims.items = items !== 1 && sizes.length > 1 ? sizes.pop() : items;\n dims.width = width !== 1 && sizes.length > 1 ? sizes.pop() : width;\n dims.height = height !== 1 && sizes.length > 1 ? sizes.pop() : height;\n dims.depth = depth !== 1 && sizes.length > 1 ? sizes.pop() : depth;\n\n let levels = nesting;\n if (channels === 1) {\n levels++;\n }\n if (items === 1 && levels > 1) {\n levels++;\n }\n if (width === 1 && levels > 2) {\n levels++;\n }\n if (height === 1 && levels > 3) {\n levels++;\n }\n\n let n = (left = sizes.pop()) != null ? left : 1;\n if (levels <= 1) {\n n /= dims.channels != null ? dims.channels : 1;\n }\n if (levels <= 2) {\n n /= dims.items != null ? dims.items : 1;\n }\n if (levels <= 3) {\n n /= dims.width != null ? dims.width : 1;\n }\n if (levels <= 4) {\n n /= dims.height != null ? dims.height : 1;\n }\n n = Math.floor(n);\n\n if (dims.width == null) {\n dims.width = n;\n n = 1;\n }\n if (dims.height == null) {\n dims.height = n;\n n = 1;\n }\n if (dims.depth == null) {\n dims.depth = n;\n n = 1;\n }\n\n return dims;\n};\n\nexport const repeatCall = function (call, times) {\n switch (times) {\n case 0:\n return () => true;\n case 1:\n return () => call();\n case 2:\n return function () {\n call();\n return call();\n };\n case 3:\n return function () {\n call();\n call();\n call();\n return call();\n };\n case 4:\n return function () {\n call();\n call();\n call();\n return call();\n };\n case 6:\n return function () {\n call();\n call();\n call();\n call();\n call();\n return call();\n };\n case 8:\n return function () {\n call();\n call();\n call();\n call();\n call();\n return call();\n };\n }\n};\n\nexport const makeEmitter = function (thunk, items, channels) {\n let outer;\n const inner = (() => {\n switch (channels) {\n case 0:\n return () => true;\n case 1:\n return (emit) => emit(thunk());\n case 2:\n return (emit) => emit(thunk(), thunk());\n case 3:\n return (emit) => emit(thunk(), thunk(), thunk());\n case 4:\n return (emit) => emit(thunk(), thunk(), thunk(), thunk());\n case 6:\n return (emit) =>\n emit(thunk(), thunk(), thunk(), thunk(), thunk(), thunk());\n case 8:\n return (emit) =>\n emit(\n thunk(),\n thunk(),\n thunk(),\n thunk(),\n thunk(),\n thunk(),\n thunk(),\n thunk()\n );\n }\n })();\n\n let next = null;\n while (items > 0) {\n var n = Math.min(items, 8);\n outer = (() => {\n switch (n) {\n case 1:\n return (emit) => inner(emit);\n case 2:\n return function (emit) {\n inner(emit);\n return inner(emit);\n };\n case 3:\n return function (emit) {\n inner(emit);\n inner(emit);\n return inner(emit);\n };\n case 4:\n return function (emit) {\n inner(emit);\n inner(emit);\n inner(emit);\n return inner(emit);\n };\n case 5:\n return function (emit) {\n inner(emit);\n inner(emit);\n inner(emit);\n inner(emit);\n return inner(emit);\n };\n case 6:\n return function (emit) {\n inner(emit);\n inner(emit);\n inner(emit);\n inner(emit);\n inner(emit);\n return inner(emit);\n };\n case 7:\n return function (emit) {\n inner(emit);\n inner(emit);\n inner(emit);\n inner(emit);\n inner(emit);\n inner(emit);\n return inner(emit);\n };\n case 8:\n return function (emit) {\n inner(emit);\n inner(emit);\n inner(emit);\n inner(emit);\n inner(emit);\n inner(emit);\n inner(emit);\n return inner(emit);\n };\n }\n })();\n if (next != null) {\n next = ((outer, next) =>\n function (emit) {\n outer(emit);\n return next(emit);\n })(outer, next);\n } else {\n next = outer;\n }\n items -= n;\n }\n\n outer = next != null ? next : () => true;\n outer.reset = thunk.reset;\n outer.rebind = thunk.rebind;\n return outer;\n};\n\nexport const getThunk = function (data) {\n let thunk;\n let j, k, l, m;\n let sizes = getSizes(data);\n const nesting = sizes.length;\n\n let a = sizes.pop();\n let b = sizes.pop();\n let c = sizes.pop();\n const d = sizes.pop();\n\n switch (nesting) {\n case 0:\n thunk = () => 0;\n thunk.reset = function () {};\n break;\n\n case 1:\n var i = 0;\n thunk = () => data[i++];\n thunk.reset = () => (i = 0);\n break;\n\n case 2:\n i = j = 0;\n var first = data[j] != null ? data[j] : [];\n\n thunk = function () {\n const x = first[i++];\n if (i === a) {\n i = 0;\n j++;\n first = data[j] != null ? data[j] : [];\n }\n return x;\n };\n\n thunk.reset = function () {\n i = j = 0;\n first = data[j] != null ? data[j] : [];\n };\n break;\n\n case 3:\n i = j = k = 0;\n var second = data[k] != null ? data[k] : [];\n first = second[j] != null ? second[j] : [];\n\n thunk = function () {\n const x = first[i++];\n if (i === a) {\n i = 0;\n j++;\n if (j === b) {\n j = 0;\n k++;\n second = data[k] != null ? data[k] : [];\n }\n first = second[j] != null ? second[j] : [];\n }\n return x;\n };\n\n thunk.reset = function () {\n i = j = k = 0;\n second = data[k] != null ? data[k] : [];\n first = second[j] != null ? second[j] : [];\n };\n break;\n\n case 4:\n i = j = k = l = 0;\n var third = data[l] != null ? data[l] : [];\n second = third[k] != null ? third[k] : [];\n first = second[j] != null ? second[j] : [];\n\n thunk = function () {\n const x = first[i++];\n if (i === a) {\n i = 0;\n j++;\n if (j === b) {\n j = 0;\n k++;\n if (k === c) {\n k = 0;\n l++;\n third = data[l] != null ? data[l] : [];\n }\n second = third[k] != null ? third[k] : [];\n }\n first = second[j] != null ? second[j] : [];\n }\n return x;\n };\n\n thunk.reset = function () {\n i = j = k = l = 0;\n third = data[l] != null ? data[l] : [];\n second = third[k] != null ? third[k] : [];\n first = second[j] != null ? second[j] : [];\n };\n break;\n\n case 5:\n i = j = k = l = m = 0;\n var fourth = data[m] != null ? data[m] : [];\n third = fourth[l] != null ? fourth[l] : [];\n second = third[k] != null ? third[k] : [];\n first = second[j] != null ? second[j] : [];\n\n thunk = function () {\n const x = first[i++];\n if (i === a) {\n i = 0;\n j++;\n if (j === b) {\n j = 0;\n k++;\n if (k === c) {\n k = 0;\n l++;\n if (l === d) {\n l = 0;\n m++;\n fourth = data[m] != null ? data[m] : [];\n }\n third = fourth[l] != null ? fourth[l] : [];\n }\n second = third[k] != null ? third[k] : [];\n }\n first = second[j] != null ? second[j] : [];\n }\n return x;\n };\n\n thunk.reset = function () {\n i = j = k = l = m = 0;\n fourth = data[m] != null ? data[m] : [];\n third = fourth[l] != null ? fourth[l] : [];\n second = third[k] != null ? third[k] : [];\n first = second[j] != null ? second[j] : [];\n };\n break;\n }\n\n thunk.rebind = function (d) {\n data = d;\n\n sizes = getSizes(data);\n if (sizes.length) {\n a = sizes.pop();\n }\n if (sizes.length) {\n b = sizes.pop();\n }\n if (sizes.length) {\n c = sizes.pop();\n }\n if (sizes.length) {\n return (d = sizes.pop());\n }\n };\n\n return thunk;\n};\n\nexport const getStreamer = function (array, samples, channels, items) {\n let i, j;\n let emit;\n let limit = (i = j = 0);\n\n const reset = function () {\n limit = samples * channels * items;\n return (i = j = 0);\n };\n\n const count = () => j;\n const done = () => limit - i <= 0;\n\n const skip = (() => {\n switch (channels) {\n case 1:\n return function (n) {\n i += n;\n j += n;\n };\n\n case 2:\n return function (n) {\n i += n * 2;\n j += n;\n };\n\n case 3:\n return function (n) {\n i += n * 3;\n j += n;\n };\n\n case 4:\n return function (n) {\n i += n * 4;\n j += n;\n };\n }\n })();\n\n const consume = (() => {\n switch (channels) {\n case 1:\n return function (emit) {\n emit(array[i++]);\n ++j;\n };\n\n case 2:\n return function (emit) {\n emit(array[i++], array[i++]);\n ++j;\n };\n\n case 3:\n return function (emit) {\n emit(array[i++], array[i++], array[i++]);\n ++j;\n };\n\n case 4:\n return function (emit) {\n emit(array[i++], array[i++], array[i++], array[i++]);\n ++j;\n };\n }\n })();\n\n emit = (() => {\n switch (channels) {\n case 1:\n return function (x) {\n array[i++] = x;\n ++j;\n };\n\n case 2:\n return function (x, y) {\n array[i++] = x;\n array[i++] = y;\n ++j;\n };\n\n case 3:\n return function (x, y, z) {\n array[i++] = x;\n array[i++] = y;\n array[i++] = z;\n ++j;\n };\n\n case 4:\n return function (x, y, z, w) {\n array[i++] = x;\n array[i++] = y;\n array[i++] = z;\n array[i++] = w;\n ++j;\n };\n }\n })();\n\n consume.reset = reset;\n emit.reset = reset;\n\n reset();\n return { emit, consume, skip, count, done, reset };\n};\n\nexport const getLerpEmitter = function (expr1, expr2) {\n let emitter, lerp2, q, r, s;\n const scratch = new Float32Array(4096);\n let lerp1 = (lerp2 = 0.5);\n let p = (q = r = s = 0);\n\n const emit1 = function (x, y, z, w) {\n r++;\n scratch[p++] = x * lerp1;\n scratch[p++] = y * lerp1;\n scratch[p++] = z * lerp1;\n return (scratch[p++] = w * lerp1);\n };\n\n const emit2 = function (x, y, z, w) {\n s++;\n scratch[q++] += x * lerp2;\n scratch[q++] += y * lerp2;\n scratch[q++] += z * lerp2;\n return (scratch[q++] += w * lerp2);\n };\n\n const args = Math.max(expr1.length, expr2.length);\n\n if (args <= 3) {\n emitter = function (emit, x, i) {\n p = q = r = s = 0;\n expr1(emit1, x, i);\n expr2(emit2, x, i);\n const n = Math.min(r, s);\n let l = 0;\n return __range__(0, n, false).map((_k) =>\n emit(scratch[l++], scratch[l++], scratch[l++], scratch[l++])\n );\n };\n } else if (args <= 5) {\n emitter = function (emit, x, y, i, j) {\n p = q = r = s = 0;\n expr1(emit1, x, y, i, j);\n expr2(emit2, x, y, i, j);\n const n = Math.min(r, s);\n let l = 0;\n return __range__(0, n, false).map((_k) =>\n emit(scratch[l++], scratch[l++], scratch[l++], scratch[l++])\n );\n };\n } else if (args <= 7) {\n emitter = function (emit, x, y, z, i, j, k) {\n p = q = r = s = 0;\n expr1(emit1, x, y, z, i, j, k);\n expr2(emit2, x, y, z, i, j, k);\n const n = Math.min(r, s);\n let l = 0;\n return (() => {\n let asc, end;\n const result = [];\n for (\n k = 0, end = n, asc = 0 <= end;\n asc ? k < end : k > end;\n asc ? k++ : k--\n ) {\n result.push(\n emit(scratch[l++], scratch[l++], scratch[l++], scratch[l++])\n );\n }\n return result;\n })();\n };\n } else if (args <= 9) {\n emitter = function (emit, x, y, z, w, i, j, k, l) {\n p = q = r = s = 0;\n expr1(emit1, x, y, z, w, i, j, k, l);\n expr2(emit2, x, y, z, w, i, j, k, l);\n const n = Math.min(r, s);\n l = 0;\n return (() => {\n let asc, end;\n const result = [];\n for (\n k = 0, end = n, asc = 0 <= end;\n asc ? k < end : k > end;\n asc ? k++ : k--\n ) {\n result.push(\n emit(scratch[l++], scratch[l++], scratch[l++], scratch[l++])\n );\n }\n return result;\n })();\n };\n } else {\n emitter = function (emit, x, y, z, w, i, j, k, l, d, t) {\n p = q = 0;\n expr1(emit1, x, y, z, w, i, j, k, l, d, t);\n expr2(emit2, x, y, z, w, i, j, k, l, d, t);\n const n = Math.min(r, s);\n l = 0;\n return (() => {\n let asc, end;\n const result = [];\n for (\n k = 0, end = n, asc = 0 <= end;\n asc ? k < end : k > end;\n asc ? k++ : k--\n ) {\n result.push(\n emit(scratch[l++], scratch[l++], scratch[l++], scratch[l++])\n );\n }\n return result;\n })();\n };\n }\n\n emitter.lerp = function (f) {\n let ref;\n return ([lerp1, lerp2] = Array.from((ref = [1 - f, f]))), ref;\n };\n\n return emitter;\n};\n\nexport const getLerpThunk = function (data1, data2) {\n // Get sizes\n const n1 = getSizes(data1).reduce((a, b) => a * b);\n const n2 = getSizes(data2).reduce((a, b) => a * b);\n const n = Math.min(n1, n2);\n\n // Create data thunks to copy (multi-)array\n const thunk1 = getThunk(data1);\n const thunk2 = getThunk(data2);\n\n // Create scratch array\n const scratch = new Float32Array(n);\n\n scratch.lerp = function (f) {\n thunk1.reset();\n thunk2.reset();\n\n let i = 0;\n return (() => {\n const result = [];\n while (i < n) {\n const a = thunk1();\n const b = thunk2();\n result.push((scratch[i++] = a + (b - a) * f));\n }\n return result;\n })();\n };\n\n return scratch;\n};\n\nfunction __range__(left, right, inclusive) {\n let range = [];\n let ascending = left < right;\n let end = !inclusive ? right : ascending ? right + 1 : right - 1;\n for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {\n range.push(i);\n }\n return range;\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nconst letters = \"xyzw\".split(\"\");\n\nconst index = {\n 0: -1,\n x: 0,\n y: 1,\n z: 2,\n w: 3,\n};\n\nconst parseOrder = function (order) {\n if (order === \"\" + order) {\n order = order.split(\"\");\n }\n if (order === +order) {\n order = [order];\n }\n return order;\n};\n\nexport const toType = function (type) {\n if (type === +type) {\n type = \"vec\" + type;\n }\n if (type === \"vec1\") {\n type = \"float\";\n }\n return type;\n};\n\nconst toFloatString = function (value) {\n value = \"\" + value;\n if (value.indexOf(\".\") < 0) {\n return (value += \".0\");\n }\n};\n\n// Helper for float to byte conversion on the w axis, for readback\nexport const mapByte2FloatOffset = function (stretch) {\n if (stretch == null) {\n stretch = 4;\n }\n const factor = toFloatString(stretch);\n return `\\\nvec4 float2ByteIndex(vec4 xyzw, out float channelIndex) {\n float relative = xyzw.w / ${factor};\n float w = floor(relative);\n channelIndex = (relative - w) * ${factor};\n return vec4(xyzw.xyz, w);\n}\\\n`;\n};\n\n// Sample data texture array\nexport const sample2DArray = function (textures) {\n var divide = function (a, b) {\n let out;\n if (a === b) {\n out = `\\\nreturn texture2D(dataTextures[${a}], uv);\\\n`;\n } else {\n const mid = Math.ceil(a + (b - a) / 2);\n out = `\\\nif (z < ${mid - 0.5}) {\n ${divide(a, mid - 1)}\n}\nelse {\n ${divide(mid, b)}\n}\\\n`;\n }\n return (out = out.replace(/\\n/g, \"\\n \"));\n };\n\n const body = divide(0, textures - 1);\n\n return `\\\nuniform sampler2D dataTextures[${textures}];\n\nvec4 sample2DArray(vec2 uv, float z) {\n ${body}\n}\\\n`;\n};\n\n// Binary operator\nexport const binaryOperator = function (type, op, curry) {\n type = toType(type);\n if (curry != null) {\n return `\\\n${type} binaryOperator(${type} a) {\n return a ${op} ${curry};\n}\\\n`;\n } else {\n return `\\\n${type} binaryOperator(${type} a, ${type} b) {\n return a ${op} b;\n}\\\n`;\n }\n};\n\n// Extend to n-vector with zeroes\nexport const extendVec = function (from, to, value) {\n if (value == null) {\n value = 0;\n }\n if (from > to) {\n return truncateVec(from, to);\n }\n\n const diff = to - from;\n\n from = toType(from);\n to = toType(to);\n\n value = toFloatString(value);\n\n const parts = __range__(0, diff, true).map(function (x) {\n if (x) {\n return value;\n } else {\n return \"v\";\n }\n });\n const ctor = parts.join(\",\");\n\n return `\\\n${to} extendVec(${from} v) { return ${to}(${ctor}); }\\\n`;\n};\n\n// Truncate n-vector\nexport const truncateVec = function (from, to) {\n if (from < to) {\n return extendVec(from, to);\n }\n\n const swizzle = \".\" + \"xyzw\".substr(0, to);\n\n from = toType(from);\n to = toType(to);\n\n return `\\\n${to} truncateVec(${from} v) { return v${swizzle}; }\\\n`;\n};\n\n// Inject float into 4-component vector\nexport const injectVec4 = function (order) {\n const swizzler = [\"0.0\", \"0.0\", \"0.0\", \"0.0\"];\n\n order = parseOrder(order);\n order = order.map(function (v) {\n if (v === \"\" + v) {\n return index[v];\n } else {\n return v;\n }\n });\n\n for (let i = 0; i < order.length; i++) {\n const channel = order[i];\n swizzler[channel] = [\"a\", \"b\", \"c\", \"d\"][i];\n }\n\n const mask = swizzler.slice(0, 4).join(\", \");\n\n const args = [\"float a\", \"float b\", \"float c\", \"float d\"].slice(\n 0,\n order.length\n );\n\n return `\\\nvec4 inject(${args}) {\n return vec4(${mask});\n}\\\n`;\n};\n\n// Apply 4-component vector swizzle\nexport const swizzleVec4 = function (order, size = null) {\n const lookup = [\"0.0\", \"xyzw.x\", \"xyzw.y\", \"xyzw.z\", \"xyzw.w\"];\n\n if (size == null) {\n size = order.length;\n }\n\n order = parseOrder(order);\n order = order.map(function (v) {\n if (Array.from([0, 1, 2, 3, 4]).includes(+v)) {\n v = +v;\n }\n if (v === \"\" + v) {\n v = index[v] + 1;\n }\n return lookup[v];\n });\n\n while (order.length < size) {\n order.push(\"0.0\");\n }\n const mask = order.join(\", \");\n\n return `\\\nvec${size} swizzle(vec4 xyzw) {\n return vec${size}(${mask});\n}\\\n`.replace(/vec1/g, \"float\");\n};\n\n// Invert full or truncated swizzles for pointer lookups\nexport const invertSwizzleVec4 = function (order) {\n const swizzler = [\"0.0\", \"0.0\", \"0.0\", \"0.0\"];\n\n order = parseOrder(order);\n order = order.map(function (v) {\n if (v === +v) {\n return letters[v - 1];\n } else {\n return v;\n }\n });\n\n for (let i = 0; i < order.length; i++) {\n const letter = order[i];\n const src = letters[i];\n const j = index[letter];\n\n swizzler[j] = `xyzw.${src}`;\n }\n\n const mask = swizzler.join(\", \");\n\n return `\\\nvec4 invertSwizzle(vec4 xyzw) {\n return vec4(${mask});\n}\\\n`;\n};\n\nexport const identity = function (type) {\n let args = [].slice.call(arguments);\n if (args.length > 1) {\n args = args.map((t, i) =>\n [\"inout\", t, String.fromCharCode(97 + i)].join(\" \")\n );\n args = args.join(\", \");\n return `\\\nvoid identity(${args}) { }\\\n`;\n } else {\n return `\\\n${type} identity(${type} x) {\n return x;\n}\\\n`;\n }\n};\n\nexport const constant = (type, value) => `\\\n${type} constant() {\nreturn ${value};\n}\\\n`;\n\nfunction __range__(left, right, inclusive) {\n let range = [];\n let ascending = left < right;\n let end = !inclusive ? right : ascending ? right + 1 : right - 1;\n for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {\n range.push(i);\n }\n return range;\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as GLSL from \"../../../util/glsl.js\";\nimport { Primitive } from \"../../primitive.js\";\n\nexport class Source extends Primitive {\n static initClass() {\n this.traits = [\"node\", \"source\", \"index\"];\n }\n\n made() {\n // Notify of buffer reallocation\n return this.trigger({\n type: \"source.rebuild\",\n });\n }\n\n indexShader(shader) {\n return shader.pipe(GLSL.identity(\"vec4\"));\n }\n sourceShader(shader) {\n return shader.pipe(GLSL.identity(\"vec4\"));\n }\n\n getDimensions() {\n return {\n items: 1,\n width: 1,\n height: 1,\n depth: 1,\n };\n }\n\n getActiveDimensions() {\n return this.getDimensions();\n }\n\n getIndexDimensions() {\n return this.getActiveDimensions();\n }\n getFutureDimensions() {\n return this.getActiveDimensions();\n }\n}\nSource.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UData from \"../../../util/data.js\";\nimport { Source } from \"../base/source.js\";\n\nexport class Data extends Source {\n static initClass() {\n this.traits = [\"node\", \"data\", \"source\", \"index\", \"entity\", \"active\"];\n }\n\n init() {\n this.dataEmitter = null;\n return (this.dataSizes = null);\n }\n\n emitter(channels, items) {\n let emitter;\n const { data } = this.props;\n const { bind } = this.props;\n const { expr } = this.props;\n\n if (data != null) {\n // Make new emitter if data geometry doesn't match\n const last = this.dataSizes;\n const sizes = UData.getSizes(data);\n\n if (!last || last.length !== sizes.length) {\n // Create data thunk to copy (multi-)array\n const thunk = UData.getThunk(data);\n this.dataEmitter = this.callback(\n UData.makeEmitter(thunk, items, channels)\n );\n this.dataSizes = sizes;\n }\n\n emitter = this.dataEmitter;\n } else if (resolve != null) {\n // Hook up data-bound expression to its source\n var resolve = this._inherit(\"resolve\");\n emitter = this.callback(resolve.callback(bind));\n } else if (expr != null) {\n // Convert given free expression to appropriate callback\n emitter = this.callback(expr);\n } else {\n // Passthrough\n emitter = this.callback(this.passthrough);\n }\n\n return emitter;\n }\n\n callback(callback) {\n return callback != null ? callback : function () {};\n }\n\n update() {}\n\n make() {\n this._helpers.active.make();\n\n // Always run update at least once to prime JS VM optimization for entering elements\n this.first = true;\n return this._listen(\"root\", \"root.update\", () => {\n if (this.isActive || this.first) {\n this.update();\n }\n return (this.first = false);\n });\n }\n\n unmake() {\n this._helpers.active.unmake();\n\n this.dataEmitter = null;\n return (this.dataSizes = null);\n }\n}\nData.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS202: Simplify dynamic range loops\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Data } from \"./data.js\";\n\nexport class Buffer extends Data {\n static initClass() {\n this.traits = [\n \"node\",\n \"buffer\",\n \"active\",\n \"data\",\n \"source\",\n \"index\",\n \"texture\",\n ];\n }\n\n init() {\n this.bufferSlack = 0;\n this.bufferFrames = 0;\n\n this.bufferTime = 0;\n this.bufferDelta = 0;\n\n this.bufferClock = 0;\n this.bufferStep = 0;\n super.init();\n }\n\n make() {\n super.make();\n\n return (this.clockParent = this._inherit(\"clock\"));\n }\n\n unmake() {\n return super.unmake();\n }\n\n rawBuffer() {\n return this.buffer;\n }\n\n emitter() {\n const { channels, items } = this.props;\n\n return super.emitter(channels, items);\n }\n\n change(changed, touched, init) {\n if (changed[\"buffer.fps\"] || init) {\n const { fps } = this.props;\n return (this.bufferSlack = fps ? 0.5 / fps : 0);\n }\n }\n\n syncBuffer(callback) {\n let delta, step;\n if (!this.buffer) {\n return;\n }\n const { live, fps, hurry, limit, realtime, observe } = this.props;\n\n const filled = this.buffer.getFilled();\n if (!!filled && !live) {\n return;\n }\n\n const time = this.clockParent.getTime();\n\n if (fps != null) {\n const slack = this.bufferSlack;\n const speed = time.step / time.delta;\n delta = realtime ? time.delta : time.step;\n const frame = 1 / fps;\n step = realtime && observe ? speed * frame : frame;\n\n this.bufferSlack = Math.min(limit / fps, slack + delta);\n this.bufferDelta = delta;\n this.bufferStep = step;\n\n let frames = Math.min(hurry, Math.floor(slack * fps));\n if (!filled) {\n frames = Math.max(1, frames);\n }\n\n let stop = false;\n const abort = () => (stop = true);\n return (() => {\n const result = [];\n for (\n let i = 0, end = frames, asc = 0 <= end;\n asc ? i < end : i > end;\n asc ? i++ : i--\n ) {\n this.bufferTime += delta;\n this.bufferClock += step;\n\n if (stop) {\n break;\n }\n callback(abort, this.bufferFrames++, i, frames);\n\n result.push((this.bufferSlack -= frame));\n }\n return result;\n })();\n } else {\n this.bufferTime = time.time;\n this.bufferDelta = time.delta;\n this.bufferClock = time.clock;\n this.bufferStep = time.step;\n return callback(function () {}, this.bufferFrames++, 0, 1);\n }\n }\n\n alignShader(dims, shader) {\n const { minFilter, magFilter, aligned } = this.props;\n const mixed =\n (dims.items > 1 && dims.width > 1) || (dims.height > 1 && dims.depth > 1);\n\n if (aligned || !mixed) {\n return;\n }\n\n const nearest =\n minFilter === this.node.attributes[\"texture.minFilter\"].enum.nearest &&\n magFilter === this.node.attributes[\"texture.magFilter\"].enum.nearest;\n\n if (!nearest) {\n console.warn(\n `${this.node.toString()} - Cannot use linear min/magFilter with 3D/4D sampling`\n );\n }\n\n return shader.pipe(\"map.xyzw.align\");\n }\n}\nBuffer.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UData from \"../../../util/data.js\";\nimport { Buffer } from \"./buffer.js\";\n\nexport class Array_ extends Buffer {\n static initClass() {\n this.traits = [\n \"node\",\n \"buffer\",\n \"active\",\n \"data\",\n \"source\",\n \"index\",\n \"array\",\n \"texture\",\n \"raw\",\n ];\n }\n\n init() {\n this.buffer = this.spec = null;\n\n this.space = {\n width: 0,\n history: 0,\n };\n\n this.used = { width: 0 };\n\n this.storage = \"arrayBuffer\";\n this.passthrough = (emit, x) => emit(x, 0, 0, 0);\n\n return super.init();\n }\n\n sourceShader(shader) {\n const dims = this.getDimensions();\n this.alignShader(dims, shader);\n return this.buffer.shader(shader);\n }\n\n getDimensions() {\n return {\n items: this.items,\n width: this.space.width,\n height: this.space.history,\n depth: 1,\n };\n }\n\n getActiveDimensions() {\n return {\n items: this.items,\n width: this.used.width,\n height: this.buffer.getFilled(),\n depth: 1,\n };\n }\n\n getFutureDimensions() {\n return {\n items: this.items,\n width: this.used.width,\n height: this.space.history,\n depth: 1,\n };\n }\n\n getRawDimensions() {\n return {\n items: this.items,\n width: this.space.width,\n height: 1,\n depth: 1,\n };\n }\n\n make() {\n super.make();\n\n // Read sampling parameters\n const minFilter =\n this.minFilter != null ? this.minFilter : this.props.minFilter;\n const magFilter =\n this.magFilter != null ? this.magFilter : this.props.magFilter;\n const type = this.type != null ? this.type : this.props.type;\n\n // Read given dimensions\n const { width } = this.props;\n const { history } = this.props;\n const reserve = this.props.bufferWidth;\n const { channels } = this.props;\n const { items } = this.props;\n\n let dims = (this.spec = { channels, items, width });\n\n this.items = dims.items;\n this.channels = dims.channels;\n\n // Init to right size if data supplied\n const { data } = this.props;\n dims = UData.getDimensions(data, dims);\n\n const { space } = this;\n space.width = Math.max(reserve, dims.width || 1);\n space.history = history;\n\n // Create array buffer\n return (this.buffer = this._renderables.make(this.storage, {\n width: space.width,\n history: space.history,\n channels,\n items,\n minFilter,\n magFilter,\n type,\n }));\n }\n\n unmake() {\n super.unmake();\n if (this.buffer) {\n this.buffer.dispose();\n return (this.buffer = this.spec = null);\n }\n }\n\n change(changed, touched, init) {\n if (\n touched[\"texture\"] ||\n changed[\"history.history\"] ||\n changed[\"buffer.channels\"] ||\n changed[\"buffer.items\"] ||\n changed[\"array.bufferWidth\"]\n ) {\n return this.rebuild();\n }\n\n if (!this.buffer) {\n return;\n }\n\n if (changed[\"array.width\"]) {\n const { width } = this.props;\n if (width > this.space.width) {\n return this.rebuild();\n }\n }\n\n if (\n changed[\"data.map\"] ||\n changed[\"data.data\"] ||\n changed[\"data.resolve\"] ||\n changed[\"data.expr\"] ||\n init\n ) {\n return this.buffer.setCallback(this.emitter());\n }\n }\n\n callback(callback) {\n if (callback.length <= 2) {\n return callback;\n } else {\n return (emit, i) => {\n return callback(emit, i, this.bufferClock, this.bufferStep);\n };\n }\n }\n\n update() {\n if (!this.buffer) {\n return;\n }\n\n const { data } = this.props;\n const { space, used } = this;\n const l = used.width;\n\n const filled = this.buffer.getFilled();\n\n this.syncBuffer((abort) => {\n if (data != null) {\n const dims = UData.getDimensions(data, this.spec);\n\n // Grow width if needed\n if (dims.width > space.width) {\n abort();\n return this.rebuild();\n }\n\n used.width = dims.width;\n\n this.buffer.setActive(used.width);\n if (typeof this.buffer.callback.rebind === \"function\") {\n this.buffer.callback.rebind(data);\n }\n return this.buffer.update();\n } else {\n let width = this.spec.width || 1;\n\n this.buffer.setActive(width);\n\n width = this.buffer.update();\n return (used.width = width);\n }\n });\n\n if (used.width !== l || filled !== this.buffer.getFilled()) {\n return this.trigger({\n type: \"source.resize\",\n });\n }\n }\n}\nArray_.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Array_ } from \"./array.js\";\n\nexport class Interval extends Array_ {\n static initClass() {\n this.traits = [\n \"node\",\n \"buffer\",\n \"active\",\n \"data\",\n \"source\",\n \"index\",\n \"texture\",\n \"array\",\n \"span\",\n \"interval\",\n \"sampler\",\n \"raw\",\n ];\n }\n\n updateSpan() {\n let inverse;\n const dimension = this.props.axis;\n let { width } = this.props;\n const { centered } = this.props;\n const pad = this.props.padding;\n\n const range = this._helpers.span.get(\"\", dimension);\n\n width += pad * 2;\n\n this.a = range.x;\n const span = range.y - range.x;\n\n if (centered) {\n inverse = 1 / Math.max(1, width);\n this.a += (span * inverse) / 2;\n } else {\n inverse = 1 / Math.max(1, width - 1);\n }\n\n this.b = span * inverse;\n\n return (this.a += pad * this.b);\n }\n\n callback(callback) {\n this.updateSpan();\n\n if (this.last === callback) {\n return this._callback;\n }\n this.last = callback;\n\n if (callback.length <= 3) {\n return (this._callback = (emit, i) => {\n const x = this.a + this.b * i;\n return callback(emit, x, i);\n });\n } else {\n return (this._callback = (emit, i) => {\n const x = this.a + this.b * i;\n return callback(emit, x, i, this.bufferClock, this.bufferStep);\n });\n }\n }\n\n make() {\n super.make();\n this._helpers.span.make();\n return this._listen(this, \"span.range\", this.updateSpan);\n }\n\n unmake() {\n super.unmake();\n return this._helpers.span.unmake();\n }\n}\nInterval.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UData from \"../../../util/data.js\";\nimport { Buffer } from \"./buffer.js\";\n\nexport class Matrix extends Buffer {\n static initClass() {\n this.traits = [\n \"node\",\n \"buffer\",\n \"active\",\n \"data\",\n \"source\",\n \"index\",\n \"texture\",\n \"matrix\",\n \"raw\",\n ];\n }\n\n init() {\n this.buffer = this.spec = null;\n\n this.space = {\n width: 0,\n height: 0,\n history: 0,\n };\n\n this.used = {\n width: 0,\n height: 0,\n };\n\n this.storage = \"matrixBuffer\";\n this.passthrough = (emit, x, y) => emit(x, y, 0, 0);\n\n return super.init();\n }\n\n sourceShader(shader) {\n const dims = this.getDimensions();\n this.alignShader(dims, shader);\n return this.buffer.shader(shader);\n }\n\n getDimensions() {\n return {\n items: this.items,\n width: this.space.width,\n height: this.space.height,\n depth: this.space.history,\n };\n }\n\n getActiveDimensions() {\n return {\n items: this.items,\n width: this.used.width,\n height: this.used.height,\n depth: this.buffer.getFilled(),\n };\n }\n\n getFutureDimensions() {\n return {\n items: this.items,\n width: this.used.width,\n height: this.used.height,\n depth: this.space.history,\n };\n }\n\n getRawDimensions() {\n return {\n items: this.items,\n width: this.space.width,\n height: this.space.height,\n depth: 1,\n };\n }\n\n make() {\n super.make();\n\n // Read sampling parameters\n const minFilter =\n this.minFilter != null ? this.minFilter : this.props.minFilter;\n const magFilter =\n this.magFilter != null ? this.magFilter : this.props.magFilter;\n const type = this.type != null ? this.type : this.props.type;\n\n // Read given dimensions\n const { width } = this.props;\n const { height } = this.props;\n const { history } = this.props;\n const reserveX = this.props.bufferWidth;\n const reserveY = this.props.bufferHeight;\n const { channels } = this.props;\n const { items } = this.props;\n\n let dims = (this.spec = { channels, items, width, height });\n\n this.items = dims.items;\n this.channels = dims.channels;\n\n // Init to right size if data supplied\n const { data } = this.props;\n dims = UData.getDimensions(data, dims);\n\n const { space } = this;\n space.width = Math.max(reserveX, dims.width || 1);\n space.height = Math.max(reserveY, dims.height || 1);\n space.history = history;\n\n // Create matrix buffer\n return (this.buffer = this._renderables.make(this.storage, {\n width: space.width,\n height: space.height,\n history: space.history,\n channels,\n items,\n minFilter,\n magFilter,\n type,\n }));\n }\n\n unmake() {\n super.unmake();\n if (this.buffer) {\n this.buffer.dispose();\n return (this.buffer = this.spec = null);\n }\n }\n\n change(changed, touched, init) {\n if (\n touched[\"texture\"] ||\n changed[\"matrix.history\"] ||\n changed[\"buffer.channels\"] ||\n changed[\"buffer.items\"] ||\n changed[\"matrix.bufferWidth\"] ||\n changed[\"matrix.bufferHeight\"]\n ) {\n return this.rebuild();\n }\n\n if (!this.buffer) {\n return;\n }\n\n if (changed[\"matrix.width\"]) {\n const { width } = this.props;\n if (width > this.space.width) {\n return this.rebuild();\n }\n }\n\n if (changed[\"matrix.height\"]) {\n const { height } = this.props;\n if (height > this.space.height) {\n return this.rebuild();\n }\n }\n\n if (\n changed[\"data.map\"] ||\n changed[\"data.data\"] ||\n changed[\"data.resolve\"] ||\n changed[\"data.expr\"] ||\n init\n ) {\n return this.buffer.setCallback(this.emitter());\n }\n }\n\n callback(callback) {\n if (callback.length <= 3) {\n return callback;\n } else {\n return (emit, i, j) => {\n return callback(emit, i, j, this.bufferClock, this.bufferStep);\n };\n }\n }\n\n update() {\n if (!this.buffer) {\n return;\n }\n\n const { data } = this.props;\n const { space, used } = this;\n const w = used.width;\n const h = used.height;\n\n const filled = this.buffer.getFilled();\n\n this.syncBuffer((abort) => {\n if (data != null) {\n const dims = UData.getDimensions(data, this.spec);\n\n // Grow if needed\n if (dims.width > space.width || dims.height > space.height) {\n abort();\n return this.rebuild();\n }\n\n used.width = dims.width;\n used.height = dims.height;\n\n this.buffer.setActive(used.width, used.height);\n if (typeof this.buffer.callback.rebind === \"function\") {\n this.buffer.callback.rebind(data);\n }\n return this.buffer.update();\n } else {\n let _w;\n const width = this.spec.width || 1;\n const height = this.spec.height || 1;\n\n this.buffer.setActive(width, height);\n\n const length = this.buffer.update();\n\n used.width = _w = width;\n used.height = Math.ceil(length / _w);\n if (used.height === 1) {\n return (used.width = length);\n }\n }\n });\n\n if (\n used.width !== w ||\n used.height !== h ||\n filled !== this.buffer.getFilled()\n ) {\n return this.trigger({\n type: \"source.resize\",\n });\n }\n }\n}\nMatrix.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { Matrix } from \"./matrix.js\";\n\nexport class Area extends Matrix {\n static initClass() {\n this.traits = [\n \"node\",\n \"buffer\",\n \"active\",\n \"data\",\n \"source\",\n \"index\",\n \"matrix\",\n \"texture\",\n \"raw\",\n \"span:x\",\n \"span:y\",\n \"area\",\n \"sampler:x\",\n \"sampler:y\",\n ];\n }\n\n updateSpan() {\n let inverseX, inverseY;\n const dimensions = this.props.axes;\n let { width } = this.props;\n let { height } = this.props;\n\n const { centeredX } = this.props;\n const { centeredY } = this.props;\n\n const padX = this.props.paddingX;\n const padY = this.props.paddingY;\n\n const rangeX = this._helpers.span.get(\"x.\", dimensions[0]);\n const rangeY = this._helpers.span.get(\"y.\", dimensions[1]);\n\n this.aX = rangeX.x;\n this.aY = rangeY.x;\n\n const spanX = rangeX.y - rangeX.x;\n const spanY = rangeY.y - rangeY.x;\n\n width += padX * 2;\n height += padY * 2;\n\n if (centeredX) {\n inverseX = 1 / Math.max(1, width);\n this.aX += (spanX * inverseX) / 2;\n } else {\n inverseX = 1 / Math.max(1, width - 1);\n }\n\n if (centeredY) {\n inverseY = 1 / Math.max(1, height);\n this.aY += (spanY * inverseY) / 2;\n } else {\n inverseY = 1 / Math.max(1, height - 1);\n }\n\n this.bX = spanX * inverseX;\n this.bY = spanY * inverseY;\n\n this.aX += padX * this.bX;\n return (this.aY += padY * this.bY);\n }\n\n callback(callback) {\n this.updateSpan();\n\n if (this.last === callback) {\n return this._callback;\n }\n this.last = callback;\n\n if (callback.length <= 5) {\n return (this._callback = (emit, i, j) => {\n const x = this.aX + this.bX * i;\n const y = this.aY + this.bY * j;\n return callback(emit, x, y, i, j);\n });\n } else {\n return (this._callback = (emit, i, j) => {\n const x = this.aX + this.bX * i;\n const y = this.aY + this.bY * j;\n return callback(emit, x, y, i, j, this.bufferClock, this.bufferStep);\n });\n }\n }\n\n make() {\n super.make();\n this._helpers.span.make();\n return this._listen(this, \"span.range\", this.updateSpan);\n }\n\n unmake() {\n super.unmake();\n return this._helpers.span.unmake();\n }\n}\nArea.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS002: Fix invalid constructor\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UData from \"../../../util/data.js\";\nimport { Buffer } from \"./buffer.js\";\n\nexport class Voxel extends Buffer {\n constructor(...args) {\n super(...args);\n this.update = this.update.bind(this);\n }\n\n static initClass() {\n this.traits = [\n \"node\",\n \"buffer\",\n \"active\",\n \"data\",\n \"source\",\n \"index\",\n \"texture\",\n \"voxel\",\n \"raw\",\n ];\n }\n\n init() {\n this.buffer = this.spec = null;\n\n this.space = {\n width: 0,\n height: 0,\n depth: 0,\n };\n\n this.used = {\n width: 0,\n height: 0,\n depth: 0,\n };\n\n this.storage = \"voxelBuffer\";\n this.passthrough = (emit, x, y, z) => emit(x, y, z, 0);\n super.init();\n }\n\n sourceShader(shader) {\n const dims = this.getDimensions();\n this.alignShader(dims, shader);\n return this.buffer.shader(shader);\n }\n\n getDimensions() {\n return {\n items: this.items,\n width: this.space.width,\n height: this.space.height,\n depth: this.space.depth,\n };\n }\n\n getActiveDimensions() {\n return {\n items: this.items,\n width: this.used.width,\n height: this.used.height,\n depth: this.used.depth * this.buffer.getFilled(),\n };\n }\n\n getRawDimensions() {\n return this.getDimensions();\n }\n\n make() {\n super.make();\n\n // Read sampling parameters\n const minFilter =\n this.minFilter != null ? this.minFilter : this.props.minFilter;\n const magFilter =\n this.magFilter != null ? this.magFilter : this.props.magFilter;\n const type = this.type != null ? this.type : this.props.type;\n\n // Read given dimensions\n const { width } = this.props;\n const { height } = this.props;\n const { depth } = this.props;\n const reserveX = this.props.bufferWidth;\n const reserveY = this.props.bufferHeight;\n const reserveZ = this.props.bufferDepth;\n const { channels } = this.props;\n const { items } = this.props;\n\n let dims = (this.spec = { channels, items, width, height, depth });\n\n this.items = dims.items;\n this.channels = dims.channels;\n\n // Init to right size if data supplied\n const { data } = this.props;\n dims = UData.getDimensions(data, dims);\n\n const { space } = this;\n space.width = Math.max(reserveX, dims.width || 1);\n space.height = Math.max(reserveY, dims.height || 1);\n space.depth = Math.max(reserveZ, dims.depth || 1);\n\n // Create voxel buffer\n return (this.buffer = this._renderables.make(this.storage, {\n width: space.width,\n height: space.height,\n depth: space.depth,\n channels,\n items,\n minFilter,\n magFilter,\n type,\n }));\n }\n\n unmake() {\n super.unmake();\n if (this.buffer) {\n this.buffer.dispose();\n return (this.buffer = this.spec = null);\n }\n }\n\n change(changed, touched, init) {\n if (\n touched[\"texture\"] ||\n changed[\"buffer.channels\"] ||\n changed[\"buffer.items\"] ||\n changed[\"voxel.bufferWidth\"] ||\n changed[\"voxel.bufferHeight\"] ||\n changed[\"voxel.bufferDepth\"]\n ) {\n return this.rebuild();\n }\n\n if (!this.buffer) {\n return;\n }\n\n if (changed[\"voxel.width\"]) {\n const { width } = this.props;\n if (width > this.space.width) {\n return this.rebuild();\n }\n }\n\n if (changed[\"voxel.height\"]) {\n const { height } = this.props;\n if (height > this.space.height) {\n return this.rebuild();\n }\n }\n\n if (changed[\"voxel.depth\"]) {\n const { depth } = this.props;\n if (depth > this.space.depth) {\n return this.rebuild();\n }\n }\n\n if (\n changed[\"data.map\"] ||\n changed[\"data.data\"] ||\n changed[\"data.resolve\"] ||\n changed[\"data.expr\"] ||\n init\n ) {\n return this.buffer.setCallback(this.emitter());\n }\n }\n\n callback(callback) {\n if (callback.length <= 4) {\n return callback;\n } else {\n return (emit, i, j, k) => {\n return callback(emit, i, j, k, this.bufferClock, this.bufferStep);\n };\n }\n }\n\n update() {\n if (!this.buffer) {\n return;\n }\n\n const { data } = this.props;\n const { space, used } = this;\n const w = used.width;\n const h = used.height;\n const d = used.depth;\n\n const filled = this.buffer.getFilled();\n\n this.syncBuffer((abort) => {\n if (data != null) {\n const dims = UData.getDimensions(data, this.spec);\n\n // Grow dimensions if needed\n if (\n dims.width > space.width ||\n dims.height > space.height ||\n dims.depth > space.depth\n ) {\n abort();\n return this.rebuild();\n }\n\n used.width = dims.width;\n used.height = dims.height;\n used.depth = dims.depth;\n\n this.buffer.setActive(used.width, used.height, used.depth);\n if (typeof this.buffer.callback.rebind === \"function\") {\n this.buffer.callback.rebind(data);\n }\n return this.buffer.update();\n } else {\n let _h, _w;\n const width = this.spec.width || 1;\n const height = this.spec.height || 1;\n const depth = this.spec.depth || 1;\n\n this.buffer.setActive(width, height, depth);\n\n const length = this.buffer.update();\n\n used.width = _w = width;\n used.height = _h = height;\n used.depth = Math.ceil(length / _w / _h);\n\n if (used.depth === 1) {\n used.height = Math.ceil(length / _w);\n if (used.height === 1) {\n return (used.width = length);\n }\n }\n }\n });\n\n if (\n used.width !== w ||\n used.height !== h ||\n used.depth !== d ||\n filled !== this.buffer.getFilled()\n ) {\n return this.trigger({\n type: \"source.resize\",\n });\n }\n }\n}\nVoxel.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Voxel } from \"./voxel.js\";\n\nexport class Volume extends Voxel {\n static initClass() {\n this.traits = [\n \"node\",\n \"buffer\",\n \"active\",\n \"data\",\n \"source\",\n \"index\",\n \"texture\",\n \"voxel\",\n \"span:x\",\n \"span:y\",\n \"span:z\",\n \"volume\",\n \"sampler:x\",\n \"sampler:y\",\n \"sampler:z\",\n \"raw\",\n ];\n }\n\n updateSpan() {\n let inverseX, inverseY, inverseZ;\n const dimensions = this.props.axes;\n let { width } = this.props;\n let { height } = this.props;\n let { depth } = this.props;\n\n const { centeredX } = this.props;\n const { centeredY } = this.props;\n const { centeredZ } = this.props;\n\n const padX = this.props.paddingX;\n const padY = this.props.paddingY;\n const padZ = this.props.paddingZ;\n\n const rangeX = this._helpers.span.get(\"x.\", dimensions[0]);\n const rangeY = this._helpers.span.get(\"y.\", dimensions[1]);\n const rangeZ = this._helpers.span.get(\"z.\", dimensions[2]);\n\n this.aX = rangeX.x;\n this.aY = rangeY.x;\n this.aZ = rangeZ.x;\n\n const spanX = rangeX.y - rangeX.x;\n const spanY = rangeY.y - rangeY.x;\n const spanZ = rangeZ.y - rangeZ.x;\n\n width += padX * 2;\n height += padY * 2;\n depth += padZ * 2;\n\n if (centeredX) {\n inverseX = 1 / Math.max(1, width);\n this.aX += (spanX * inverseX) / 2;\n } else {\n inverseX = 1 / Math.max(1, width - 1);\n }\n\n if (centeredY) {\n inverseY = 1 / Math.max(1, height);\n this.aY += (spanY * inverseY) / 2;\n } else {\n inverseY = 1 / Math.max(1, height - 1);\n }\n\n if (centeredZ) {\n inverseZ = 1 / Math.max(1, depth);\n this.aZ += (spanZ * inverseZ) / 2;\n } else {\n inverseZ = 1 / Math.max(1, depth - 1);\n }\n\n this.bX = spanX * inverseX;\n this.bY = spanY * inverseY;\n this.bZ = spanZ * inverseZ;\n\n this.aX += this.bX * padX;\n this.aY += this.bY * padY;\n return (this.aZ += this.bZ * padY);\n }\n\n callback(callback) {\n this.updateSpan();\n\n if (this.last === callback) {\n return this._callback;\n }\n this.last = callback;\n\n if (callback.length <= 7) {\n return (this._callback = (emit, i, j, k) => {\n const x = this.aX + this.bX * i;\n const y = this.aY + this.bY * j;\n const z = this.aZ + this.bZ * k;\n return callback(emit, x, y, z, i, j, k);\n });\n } else {\n return (this._callback = (emit, i, j, k) => {\n const x = this.aX + this.bX * i;\n const y = this.aY + this.bY * j;\n const z = this.aZ + this.bZ * k;\n return callback(\n emit,\n x,\n y,\n z,\n i,\n j,\n k,\n this.bufferClock,\n this.bufferStep\n );\n });\n }\n }\n\n make() {\n super.make();\n this._helpers.span.make();\n return this._listen(this, \"span.range\", this.updateSpan);\n }\n\n unmake() {\n super.unmake();\n return this._helpers.span.unmake();\n }\n}\nVolume.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Vector4 } from \"three/src/math/Vector4.js\";\n\nexport const setOrigin = function (vec, dimensions, origin) {\n if (+dimensions === dimensions) {\n dimensions = [dimensions];\n }\n const x = Array.from(dimensions).includes(1) ? 0 : origin.x;\n const y = Array.from(dimensions).includes(2) ? 0 : origin.y;\n const z = Array.from(dimensions).includes(3) ? 0 : origin.z;\n const w = Array.from(dimensions).includes(4) ? 0 : origin.w;\n return vec.set(x, y, z, w);\n};\n\nexport const addOrigin = (function () {\n const v = new Vector4();\n return function (vec, dimension, origin) {\n setOrigin(v, dimension, origin);\n return vec.add(v);\n };\n})();\n\nexport const setDimension = function (vec, dimension) {\n const x = dimension === 1 ? 1 : 0;\n const y = dimension === 2 ? 1 : 0;\n const z = dimension === 3 ? 1 : 0;\n const w = dimension === 4 ? 1 : 0;\n return vec.set(x, y, z, w);\n};\n\nexport const setDimensionNormal = function (vec, dimension) {\n const x = dimension === 1 ? 1 : 0;\n const y = dimension === 2 ? 1 : 0;\n const z = dimension === 3 ? 1 : 0;\n const w = dimension === 4 ? 1 : 0;\n return vec.set(y, z + x, w, 0);\n};\n\nexport const recenterAxis = (function () {\n const axis = [0, 0];\n\n return function (x, dx, bend, f) {\n if (f == null) {\n f = 0;\n }\n if (bend > 0) {\n const x1 = x;\n const x2 = x + dx;\n\n const abs = Math.max(Math.abs(x1), Math.abs(x2));\n const fabs = abs * f;\n\n const min = Math.min(x1, x2);\n const max = Math.max(x1, x2);\n\n x = min + (-abs + fabs - min) * bend;\n dx = max + (abs + fabs - max) * bend - x;\n }\n\n axis[0] = x;\n axis[1] = dx;\n return axis;\n };\n})();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UAxis from \"../../../util/axis.js\";\nimport { Source } from \"../base/source.js\";\n\nexport class Scale extends Source {\n static initClass() {\n this.traits = [\n \"node\",\n \"source\",\n \"index\",\n \"interval\",\n \"span\",\n \"scale\",\n \"raw\",\n \"origin\",\n ];\n }\n\n init() {\n return (this.used = this.space = this.scaleAxis = this.sampler = null);\n }\n\n rawBuffer() {\n return this.buffer;\n }\n\n sourceShader(shader) {\n return shader.pipe(this.sampler);\n }\n\n getDimensions() {\n return {\n items: 1,\n width: this.space,\n height: 1,\n depth: 1,\n };\n }\n\n getActiveDimensions() {\n return {\n items: 1,\n width: this.used,\n height: this.buffer.getFilled(),\n depth: 1,\n };\n }\n\n getRawDimensions() {\n return this.getDimensions();\n }\n\n make() {\n // Prepare data buffer of tick positions\n let samples;\n this.space = samples = this._helpers.scale.divide(\"\");\n\n this.buffer = this._renderables.make(\"dataBuffer\", {\n width: samples,\n channels: 1,\n items: 1,\n });\n\n // Prepare position shader\n const positionUniforms = {\n scaleAxis: this._attributes.make(this._types.vec4()),\n scaleOffset: this._attributes.make(this._types.vec4()),\n };\n\n this.scaleAxis = positionUniforms.scaleAxis.value;\n this.scaleOffset = positionUniforms.scaleOffset.value;\n\n // Build sampler\n const p = (this.sampler = this._shaders.shader());\n // Require buffer sampler as callback\n p.require(this.buffer.shader(this._shaders.shader(), 1));\n // Shader to expand scalars to 4D vector on an axis.\n p.pipe(\"scale.position\", positionUniforms);\n\n this._helpers.span.make();\n\n // Monitor view range\n return this._listen(this, \"span.range\", this.updateRanges);\n }\n\n unmake() {\n this.scaleAxis = null;\n\n return this._helpers.span.unmake();\n }\n\n change(changed, touched, init) {\n if (changed[\"scale.divide\"]) {\n return this.rebuild();\n }\n\n if (\n touched[\"view\"] ||\n touched[\"interval\"] ||\n touched[\"span\"] ||\n touched[\"scale\"] ||\n init\n ) {\n return this.updateRanges();\n }\n }\n\n updateRanges() {\n const { used } = this;\n\n // Fetch range along axis\n const { axis, origin } = this.props;\n const range = this._helpers.span.get(\"\", axis);\n\n // Calculate scale along axis\n const min = range.x;\n const max = range.y;\n const ticks = this._helpers.scale.generate(\"\", this.buffer, min, max);\n\n UAxis.setDimension(this.scaleAxis, axis);\n UAxis.setOrigin(this.scaleOffset, axis, origin);\n\n // Clip to number of ticks\n this.used = ticks.length;\n\n // Notify of resize\n if (this.used !== used) {\n return this.trigger({\n type: \"source.resize\",\n });\n }\n }\n}\nScale.initClass();\n","export * from \"./array.js\";\nexport * from \"./interval.js\";\nexport * from \"./matrix.js\";\nexport * from \"./area.js\";\nexport * from \"./voxel.js\";\nexport * from \"./volume.js\";\nexport * from \"./scale.js\";\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n// Merge multiple objects\nexport const merge = function () {\n const x = {};\n for (let obj of Array.from(arguments)) {\n for (let k in obj) {\n const v = obj[k];\n x[k] = v;\n }\n }\n return x;\n};\n\nexport const clone = (o) => JSON.parse(JSON.serialize(o));\n\nexport const parseQuoted = function (str) {\n let accum = \"\";\n\n const unescape = (str) => (str = str.replace(/\\\\/g, \"\"));\n const munch = function (next) {\n if (accum.length) {\n list.push(unescape(accum));\n }\n return (accum = next != null ? next : \"\");\n };\n\n str = str.split(/(?=(?:\\\\.|[\"' ,]))/g);\n let quote = false;\n var list = [];\n\n for (let chunk of Array.from(str)) {\n const char = chunk[0];\n const token = chunk.slice(1);\n switch (char) {\n case '\"':\n case \"'\":\n if (quote) {\n if (quote === char) {\n quote = false;\n munch(token);\n } else {\n accum += chunk;\n }\n } else {\n if (accum !== \"\") {\n throw new Error(\n `ParseError: String \\`${str}\\` does not contain comma-separated quoted tokens.`\n );\n }\n\n quote = char;\n accum += token;\n }\n break;\n case \" \":\n case \",\":\n if (!quote) {\n munch(token);\n } else {\n accum += chunk;\n }\n break;\n default:\n accum += chunk;\n }\n }\n munch();\n return list;\n};\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UAxis from \"../../../util/axis.js\";\nimport * as UJS from \"../../../util/js.js\";\nimport { Primitive } from \"../../primitive.js\";\n\nexport class Axis extends Primitive {\n static initClass() {\n this.traits = [\n \"node\",\n \"object\",\n \"visible\",\n \"style\",\n \"line\",\n \"axis\",\n \"span\",\n \"interval\",\n \"arrow\",\n \"position\",\n \"origin\",\n \"shade\",\n ];\n this.defaults = {\n end: true,\n zBias: -1,\n };\n }\n\n constructor(node, context, helpers) {\n super(node, context, helpers);\n\n this.axisPosition =\n this.axisStep =\n this.resolution =\n this.line =\n this.arrows =\n null;\n }\n\n make() {\n // Prepare position shader\n const positionUniforms = {\n axisPosition: this._attributes.make(this._types.vec4()),\n axisStep: this._attributes.make(this._types.vec4()),\n };\n\n this.axisPosition = positionUniforms.axisPosition.value;\n this.axisStep = positionUniforms.axisStep.value;\n\n // Build transform chain\n let position = this._shaders.shader();\n position.pipe(\"axis.position\", positionUniforms);\n position = this._helpers.position.pipeline(position);\n\n // Prepare bound uniforms\n const styleUniforms = this._helpers.style.uniforms();\n const lineUniforms = this._helpers.line.uniforms();\n const arrowUniforms = this._helpers.arrow.uniforms();\n const unitUniforms = this._inherit(\"unit\").getUnitUniforms();\n\n // Line geometry\n const { detail } = this.props;\n const samples = detail + 1;\n this.resolution = 1 / detail;\n\n // Clip start/end for terminating arrow\n const { start, end } = this.props;\n\n // Stroke style\n const { stroke, join } = this.props;\n\n // Build transition mask lookup\n let mask = this._helpers.object.mask();\n\n // Build fragment material lookup\n const material = this._helpers.shade.pipeline() || false;\n\n // Indexing by fixed or by given axis\n const { crossed, axis } = this.props;\n if (!crossed && mask != null && axis > 1) {\n const swizzle = [\"x000\", \"y000\", \"z000\", \"w000\"][axis];\n mask = this._helpers.position.swizzle(mask, swizzle);\n }\n\n // Make line renderable\n const uniforms = UJS.merge(\n arrowUniforms,\n lineUniforms,\n styleUniforms,\n unitUniforms\n );\n this.line = this._renderables.make(\"line\", {\n uniforms,\n samples,\n position,\n clip: start || end,\n stroke,\n join,\n mask,\n material,\n });\n\n // Make arrow renderables\n this.arrows = [];\n if (start) {\n this.arrows.push(\n this._renderables.make(\"arrow\", {\n uniforms,\n flip: true,\n samples,\n position,\n mask,\n material,\n })\n );\n }\n\n if (end) {\n this.arrows.push(\n this._renderables.make(\"arrow\", {\n uniforms,\n samples,\n position,\n mask,\n material,\n })\n );\n }\n\n // Visible, object and span traits\n this._helpers.visible.make();\n this._helpers.object.make(this.arrows.concat([this.line]));\n this._helpers.span.make();\n\n // Monitor view range\n return this._listen(this, \"span.range\", this.updateRanges);\n }\n\n unmake() {\n this._helpers.visible.unmake();\n this._helpers.object.unmake();\n return this._helpers.span.unmake();\n }\n\n change(changed, touched, init) {\n if (\n changed[\"axis.detail\"] ||\n changed[\"line.stroke\"] ||\n changed[\"line.join\"] ||\n changed[\"axis.crossed\"] ||\n (changed[\"interval.axis\"] && this.props.crossed)\n ) {\n return this.rebuild();\n }\n\n if (touched[\"interval\"] || touched[\"span\"] || touched[\"view\"] || init) {\n return this.updateRanges();\n }\n }\n\n updateRanges() {\n const { axis, origin } = this.props;\n\n const range = this._helpers.span.get(\"\", axis);\n\n const min = range.x;\n const max = range.y;\n\n UAxis.setDimension(this.axisPosition, axis).multiplyScalar(min);\n UAxis.setDimension(this.axisStep, axis).multiplyScalar(\n (max - min) * this.resolution\n );\n\n return UAxis.addOrigin(this.axisPosition, axis, origin);\n }\n}\nAxis.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UGLSL from \"../../../util/glsl.js\";\nimport * as UJS from \"../../../util/js.js\";\nimport { Primitive } from \"../../primitive.js\";\n\nexport class Face extends Primitive {\n static initClass() {\n this.traits = [\n \"node\",\n \"object\",\n \"visible\",\n \"style\",\n \"line\",\n \"mesh\",\n \"face\",\n \"geometry\",\n \"position\",\n \"bind\",\n \"shade\",\n ];\n }\n\n constructor(node, context, helpers) {\n super(node, context, helpers);\n\n this.face = null;\n }\n\n resize() {\n if (this.bind.points == null) {\n return;\n }\n\n const dims = this.bind.points.getActiveDimensions();\n const { items, width, height, depth } = dims;\n\n if (this.face) {\n this.face.geometry.clip(width, height, depth, items);\n }\n if (this.line) {\n this.line.geometry.clip(items, width, height, depth);\n }\n\n if (this.bind.map != null) {\n const map = this.bind.map.getActiveDimensions();\n if (this.face) {\n return this.face.geometry.map(\n map.width,\n map.height,\n map.depth,\n map.items\n );\n }\n }\n }\n\n make() {\n // Bind to attached data sources\n let color, uniforms;\n this._helpers.bind.make([\n { to: \"geometry.points\", trait: \"source\" },\n { to: \"geometry.colors\", trait: \"source\" },\n { to: \"mesh.map\", trait: \"source\" },\n ]);\n\n if (this.bind.points == null) {\n return;\n }\n\n // Fetch position and transform to view\n let position = this.bind.points.sourceShader(this._shaders.shader());\n position = this._helpers.position.pipeline(position);\n\n // Prepare bound uniforms\n const styleUniforms = this._helpers.style.uniforms();\n const lineUniforms = this._helpers.line.uniforms();\n const unitUniforms = this._inherit(\"unit\").getUnitUniforms();\n\n // Auto z-bias wireframe over surface\n const wireUniforms = {};\n wireUniforms.styleZBias = this._attributes.make(this._types.number());\n this.wireZBias = wireUniforms.styleZBias;\n\n // Fetch geometry dimensions\n const dims = this.bind.points.getDimensions();\n const { items, width, height, depth } = dims;\n\n // Get display properties\n const { line, shaded, fill, stroke, join } = this.props;\n\n // Build color lookup\n if (this.bind.colors) {\n color = this._shaders.shader();\n this.bind.colors.sourceShader(color);\n }\n\n // Build transition mask lookup\n const mask = this._helpers.object.mask();\n\n // Build texture map lookup\n const map = this._helpers.shade.map(\n this.bind.map != null\n ? this.bind.map.sourceShader(this._shaders.shader())\n : undefined\n );\n\n // Build fragment material lookup\n const material = this._helpers.shade.pipeline();\n const faceMaterial = material || shaded;\n const lineMaterial = material || false;\n\n const objects = [];\n\n // Make line renderable\n if (line) {\n // Swizzle face edges into segments\n const swizzle = this._shaders.shader();\n swizzle.pipe(UGLSL.swizzleVec4(\"yzwx\"));\n swizzle.pipe(position);\n\n uniforms = UJS.merge(\n unitUniforms,\n lineUniforms,\n styleUniforms,\n wireUniforms\n );\n this.line = this._renderables.make(\"line\", {\n uniforms,\n samples: items,\n strips: width,\n ribbons: height,\n layers: depth,\n position: swizzle,\n color,\n stroke,\n join,\n material: lineMaterial,\n mask,\n closed: true,\n });\n objects.push(this.line);\n }\n\n // Make face renderable\n if (fill) {\n uniforms = UJS.merge(unitUniforms, styleUniforms, {});\n this.face = this._renderables.make(\"face\", {\n uniforms,\n width,\n height,\n depth,\n items,\n position,\n color,\n material: faceMaterial,\n mask,\n map,\n });\n objects.push(this.face);\n }\n\n this._helpers.visible.make();\n return this._helpers.object.make(objects);\n }\n\n made() {\n return this.resize();\n }\n\n unmake() {\n this._helpers.bind.unmake();\n this._helpers.visible.unmake();\n this._helpers.object.unmake();\n\n return (this.face = this.line = null);\n }\n\n change(changed, touched, init) {\n if (changed[\"geometry.points\"] || touched[\"mesh\"]) {\n return this.rebuild();\n }\n\n if (changed[\"style.zBias\"] || changed[\"mesh.lineBias\"] || init) {\n const { fill, zBias, lineBias } = this.props;\n return (this.wireZBias.value = zBias + (fill ? lineBias : 0));\n }\n }\n}\nFace.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UAxis from \"../../../util/axis.js\";\nimport * as UJS from \"../../../util/js.js\";\nimport { Primitive } from \"../../primitive.js\";\n\nexport class Grid extends Primitive {\n static initClass() {\n this.traits = [\n \"node\",\n \"object\",\n \"visible\",\n \"style\",\n \"line\",\n \"grid\",\n \"area\",\n \"position\",\n \"origin\",\n \"shade\",\n \"axis:x\",\n \"axis:y\",\n \"scale:x\",\n \"scale:y\",\n \"span:x\",\n \"span:y\",\n ];\n this.defaults = {\n width: 1,\n zBias: -2,\n };\n }\n\n constructor(node, context, helpers) {\n super(node, context, helpers);\n\n this.axes = null;\n }\n\n make() {\n // Build transition mask lookup\n let axis;\n let mask = this._helpers.object.mask();\n\n // Build fragment material lookup\n const material = this._helpers.shade.pipeline() || false;\n\n axis = (first, second, transpose) => {\n // Prepare data buffer of tick positions\n let position;\n const detail = this._get(first + \"axis.detail\");\n const samples = detail + 1;\n const resolution = 1 / detail;\n\n const strips = this._helpers.scale.divide(second);\n const buffer = this._renderables.make(\"dataBuffer\", {\n width: strips,\n channels: 1,\n });\n\n // Prepare position shader\n const positionUniforms = {\n gridPosition: this._attributes.make(this._types.vec4()),\n gridStep: this._attributes.make(this._types.vec4()),\n gridAxis: this._attributes.make(this._types.vec4()),\n };\n\n const values = {\n gridPosition: positionUniforms.gridPosition.value,\n gridStep: positionUniforms.gridStep.value,\n gridAxis: positionUniforms.gridAxis.value,\n };\n\n // Build transform chain\n const p = (position = this._shaders.shader());\n\n // Align second grid with first in mask space if requested\n if (transpose != null && mask != null) {\n mask = this._helpers.position.swizzle(mask, transpose);\n }\n\n // Require buffer sampler as callback\n p.require(buffer.shader(this._shaders.shader(), 2));\n\n // Calculate grid position\n p.pipe(\"grid.position\", positionUniforms);\n\n // Apply view transform\n position = this._helpers.position.pipeline(p);\n\n // Prepare bound uniforms\n const styleUniforms = this._helpers.style.uniforms();\n const lineUniforms = this._helpers.line.uniforms();\n const unitUniforms = this._inherit(\"unit\").getUnitUniforms();\n const uniforms = UJS.merge(lineUniforms, styleUniforms, unitUniforms);\n\n // Make line renderable\n const line = this._renderables.make(\"line\", {\n uniforms,\n samples,\n strips,\n position,\n stroke,\n join,\n mask,\n material,\n });\n\n // Store axis object for manipulation later\n return { first, second, resolution, samples, line, buffer, values };\n };\n\n // Generate both line sets\n const { lineX, lineY, crossed, axes } = this.props;\n const transpose = [\"0000\", \"x000\", \"y000\", \"z000\", \"w000\"][axes[1]];\n\n // Stroke style\n var { stroke, join } = this.props;\n\n this.axes = [];\n lineX && this.axes.push(axis(\"x.\", \"y.\", null));\n lineY && this.axes.push(axis(\"y.\", \"x.\", crossed ? null : transpose));\n\n // Register lines\n const lines = (() => {\n const result = [];\n for (axis of this.axes) {\n result.push(axis.line);\n }\n return result;\n })();\n this._helpers.visible.make();\n this._helpers.object.make(lines);\n this._helpers.span.make();\n\n // Monitor view range\n return this._listen(this, \"span.range\", this.updateRanges);\n }\n\n unmake() {\n this._helpers.visible.unmake();\n this._helpers.object.unmake();\n this._helpers.span.unmake();\n\n for (let axis of this.axes) {\n axis.buffer.dispose();\n }\n\n this.axes = null;\n }\n\n change(changed, touched, init) {\n if (\n changed[\"x.axis.detail\"] ||\n changed[\"y.axis.detail\"] ||\n changed[\"x.axis.factor\"] ||\n changed[\"y.axis.factor\"] ||\n changed[\"grid.lineX\"] ||\n changed[\"grid.lineY\"] ||\n changed[\"line.stroke\"] ||\n changed[\"line.join\"] ||\n changed[\"grid.crossed\"] ||\n (changed[\"grid.axes\"] && this.props.crossed)\n ) {\n return this.rebuild();\n }\n\n if (\n touched[\"x\"] ||\n touched[\"y\"] ||\n touched[\"area\"] ||\n touched[\"grid\"] ||\n touched[\"view\"] ||\n init\n ) {\n return this.updateRanges();\n }\n }\n\n updateRanges() {\n const axis = (x, y, range1, range2, axis) => {\n const { second, resolution, samples, line, buffer, values } = axis;\n\n // Set line steps along first axis\n let min = range1.x;\n let max = range1.y;\n UAxis.setDimension(values.gridPosition, x).multiplyScalar(min);\n UAxis.setDimension(values.gridStep, x).multiplyScalar(\n (max - min) * resolution\n );\n\n // Add origin on remaining two axes\n UAxis.addOrigin(values.gridPosition, axes, origin);\n\n // Calculate scale along second axis\n min = range2.x;\n max = range2.y;\n const ticks = this._helpers.scale.generate(second, buffer, min, max);\n UAxis.setDimension(values.gridAxis, y);\n\n // Clip to number of ticks\n const n = ticks.length;\n return line.geometry.clip(samples, n, 1, 1);\n };\n\n // Fetch grid range in both dimensions\n var { axes, origin } = this.props;\n const range1 = this._helpers.span.get(\"x.\", axes[0]);\n const range2 = this._helpers.span.get(\"y.\", axes[1]);\n\n // Update both line sets\n const { lineX, lineY } = this.props;\n\n if (lineX) {\n axis(axes[0], axes[1], range1, range2, this.axes[0]);\n }\n if (lineY) {\n axis(axes[1], axes[0], range2, range1, this.axes[+lineX]);\n }\n window.cake1 = this.axes[0].buffer;\n window.cake2 = this.axes[1].buffer;\n window.cake3 = this.axes[0];\n }\n}\nGrid.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UJS from \"../../../util/js.js\";\nimport { Primitive } from \"../../primitive.js\";\n\nexport class Line extends Primitive {\n static initClass() {\n this.traits = [\n \"node\",\n \"object\",\n \"visible\",\n \"style\",\n \"line\",\n \"arrow\",\n \"geometry\",\n \"position\",\n \"bind\",\n \"shade\",\n ];\n }\n\n constructor(node, context, helpers) {\n super(node, context, helpers);\n\n this.line = this.arrows = null;\n }\n\n resize() {\n if (this.bind.points == null) {\n return;\n }\n const dims = this.bind.points.getActiveDimensions();\n\n const samples = dims.width;\n const strips = dims.height;\n const ribbons = dims.depth;\n const layers = dims.items;\n\n this.line.geometry.clip(samples, strips, ribbons, layers);\n return Array.from(this.arrows).map((arrow) =>\n arrow.geometry.clip(samples, strips, ribbons, layers)\n );\n }\n\n make() {\n // Bind to attached data sources\n let color;\n this._helpers.bind.make([\n { to: \"geometry.points\", trait: \"source\" },\n { to: \"geometry.colors\", trait: \"source\" },\n ]);\n\n if (this.bind.points == null) {\n return;\n }\n\n // Build transform chain\n let position = this._shaders.shader();\n\n // Fetch position\n position = this.bind.points.sourceShader(position);\n\n // Transform position to view\n position = this._helpers.position.pipeline(position);\n\n // Prepare bound uniforms\n const styleUniforms = this._helpers.style.uniforms();\n const lineUniforms = this._helpers.line.uniforms();\n const arrowUniforms = this._helpers.arrow.uniforms();\n const unitUniforms = this._inherit(\"unit\").getUnitUniforms();\n\n // Clip start/end for terminating arrow\n const { start, end } = this.props;\n\n // Stroke style\n const { stroke, join, proximity } = this.props;\n this.proximity = proximity;\n\n // Fetch geometry dimensions\n const dims = this.bind.points.getDimensions();\n const samples = dims.width;\n const strips = dims.height;\n const ribbons = dims.depth;\n const layers = dims.items;\n\n // Build color lookup\n if (this.bind.colors) {\n color = this._shaders.shader();\n this.bind.colors.sourceShader(color);\n }\n\n // Build transition mask lookup\n const mask = this._helpers.object.mask();\n\n // Build fragment material lookup\n const material = this._helpers.shade.pipeline() || false;\n\n // Make line renderable\n const uniforms = UJS.merge(\n arrowUniforms,\n lineUniforms,\n styleUniforms,\n unitUniforms\n );\n this.line = this._renderables.make(\"line\", {\n uniforms,\n samples,\n strips,\n ribbons,\n layers,\n position,\n color,\n clip: start || end,\n stroke,\n join,\n proximity,\n mask,\n material,\n });\n\n // Make arrow renderables\n this.arrows = [];\n if (start) {\n this.arrows.push(\n this._renderables.make(\"arrow\", {\n uniforms,\n flip: true,\n samples,\n strips,\n ribbons,\n layers,\n position,\n color,\n mask,\n material,\n })\n );\n }\n\n if (end) {\n this.arrows.push(\n this._renderables.make(\"arrow\", {\n uniforms,\n samples,\n strips,\n ribbons,\n layers,\n position,\n color,\n mask,\n material,\n })\n );\n }\n\n this._helpers.visible.make();\n return this._helpers.object.make(this.arrows.concat([this.line]));\n }\n\n made() {\n return this.resize();\n }\n\n unmake() {\n this._helpers.bind.unmake();\n this._helpers.visible.unmake();\n this._helpers.object.unmake();\n\n return (this.line = this.arrows = null);\n }\n\n change(changed, _touched, _init) {\n if (\n changed[\"geometry.points\"] ||\n changed[\"line.stroke\"] ||\n changed[\"line.join\"] ||\n changed[\"arrow.start\"] ||\n changed[\"arrow.end\"]\n ) {\n return this.rebuild();\n }\n\n if (changed[\"line.proximity\"]) {\n if ((this.proximity != null) !== (this.props.proximity != null)) {\n return this.rebuild();\n }\n }\n }\n}\nLine.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UJS from \"../../../util/js.js\";\nimport { Primitive } from \"../../primitive.js\";\n\nexport class Point extends Primitive {\n static initClass() {\n this.traits = [\n \"node\",\n \"object\",\n \"visible\",\n \"style\",\n \"point\",\n \"geometry\",\n \"position\",\n \"bind\",\n \"shade\",\n ];\n }\n\n constructor(node, context, helpers) {\n super(node, context, helpers);\n\n this.point = null;\n }\n\n resize() {\n if (this.bind.points == null) {\n return;\n }\n\n const dims = this.bind.points.getActiveDimensions();\n const { items, width, height, depth } = dims;\n\n return this.point.geometry.clip(width, height, depth, items);\n }\n\n make() {\n // Bind to attached data sources\n let color, size;\n this._helpers.bind.make([\n { to: \"geometry.points\", trait: \"source\" },\n { to: \"geometry.colors\", trait: \"source\" },\n { to: \"point.sizes\", trait: \"source\" },\n ]);\n\n if (this.bind.points == null) {\n return;\n }\n\n // Build transform chain\n let position = this._shaders.shader();\n\n // Fetch position and transform to view\n position = this.bind.points.sourceShader(position);\n position = this._helpers.position.pipeline(position);\n\n // Fetch geometry dimensions\n const dims = this.bind.points.getDimensions();\n const { items, width, height, depth } = dims;\n\n // Prepare bound uniforms\n const styleUniforms = this._helpers.style.uniforms();\n const pointUniforms = this._helpers.point.uniforms();\n const unitUniforms = this._inherit(\"unit\").getUnitUniforms();\n\n // Build color lookup\n if (this.bind.colors) {\n color = this._shaders.shader();\n this.bind.colors.sourceShader(color);\n }\n\n // Build size lookup\n if (this.bind.sizes) {\n size = this._shaders.shader();\n this.bind.sizes.sourceShader(size);\n }\n\n // Build transition mask lookup\n const mask = this._helpers.object.mask();\n\n // Build fragment material lookup\n const material = this._helpers.shade.pipeline() || false;\n\n // Point style\n const { shape } = this.props;\n const { fill } = this.props;\n const { optical } = this.props;\n\n // Make point renderable\n const uniforms = UJS.merge(unitUniforms, pointUniforms, styleUniforms);\n this.point = this._renderables.make(\"point\", {\n uniforms,\n width,\n height,\n depth,\n items,\n position,\n color,\n size,\n shape,\n optical,\n fill,\n mask,\n material,\n });\n\n this._helpers.visible.make();\n this._helpers.object.make([this.point]);\n }\n\n made() {\n return this.resize();\n }\n\n unmake() {\n this._helpers.bind.unmake();\n this._helpers.visible.unmake();\n this._helpers.object.unmake();\n\n this.point = null;\n }\n\n change(changed, _touched, _init) {\n if (\n changed[\"geometry.points\"] ||\n changed[\"point.shape\"] ||\n changed[\"point.fill\"]\n ) {\n return this.rebuild();\n }\n }\n}\nPoint.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UGLSL from \"../../../util/glsl.js\";\nimport * as UJS from \"../../../util/js.js\";\nimport { Primitive } from \"../../primitive.js\";\n\nexport class Strip extends Primitive {\n static initClass() {\n this.traits = [\n \"node\",\n \"object\",\n \"visible\",\n \"style\",\n \"line\",\n \"mesh\",\n \"strip\",\n \"geometry\",\n \"position\",\n \"bind\",\n \"shade\",\n ];\n }\n\n constructor(node, context, helpers) {\n super(node, context, helpers);\n\n this.strip = null;\n }\n\n resize() {\n if (this.bind.points == null) {\n return;\n }\n\n const dims = this.bind.points.getActiveDimensions();\n const { items, width, height, depth } = dims;\n\n if (this.strip) {\n this.strip.geometry.clip(width, height, depth, items);\n }\n if (this.line) {\n this.line.geometry.clip(items, width, height, depth);\n }\n\n if (this.bind.map != null) {\n const map = this.bind.map.getActiveDimensions();\n if (this.strip) {\n return this.strip.geometry.map(\n map.width,\n map.height,\n map.depth,\n map.items\n );\n }\n }\n }\n\n make() {\n // Bind to attached data sources\n let color, join, stroke, uniforms;\n this._helpers.bind.make([\n { to: \"geometry.points\", trait: \"source\" },\n { to: \"geometry.colors\", trait: \"source\" },\n { to: \"mesh.map\", trait: \"source\" },\n ]);\n\n if (this.bind.points == null) {\n return;\n }\n\n // Build transform chain\n let position = this._shaders.shader();\n\n // Fetch position\n position = this.bind.points.sourceShader(position);\n\n // Transform position to view\n position = this._helpers.position.pipeline(position);\n\n // Prepare bound uniforms\n const styleUniforms = this._helpers.style.uniforms();\n const lineUniforms = this._helpers.line.uniforms();\n const unitUniforms = this._inherit(\"unit\").getUnitUniforms();\n\n // Get display properties\n let { line } = this.props;\n let { shaded } = this.props;\n let { fill } = this.props;\n\n // Auto z-bias wireframe over surface\n const wireUniforms = {};\n wireUniforms.styleZBias = this._attributes.make(this._types.number());\n this.wireZBias = wireUniforms.styleZBias;\n\n // Fetch geometry dimensions\n const dims = this.bind.points.getDimensions();\n const { items, width, height, depth } = dims;\n\n // Get display properties\n ({ line, shaded, fill, stroke, join } = this.props);\n\n // Build color lookup\n if (this.bind.colors) {\n color = this._shaders.shader();\n color = this.bind.colors.sourceShader(color);\n }\n\n // Build transition mask lookup\n const mask = this._helpers.object.mask();\n\n // Build texture map lookup\n this._helpers.shade.map(\n this.bind.map != null\n ? this.bind.map.sourceShader(this._shaders.shader())\n : undefined\n );\n\n // Build fragment material lookup\n const material = this._helpers.shade.pipeline();\n const faceMaterial = material || shaded;\n const lineMaterial = material || false;\n\n const objects = [];\n\n // Make line renderable\n if (line) {\n // Swizzle strip edges into segments\n const swizzle = this._shaders.shader();\n swizzle.pipe(UGLSL.swizzleVec4(\"yzwx\"));\n swizzle.pipe(position);\n\n uniforms = UJS.merge(\n unitUniforms,\n lineUniforms,\n styleUniforms,\n wireUniforms\n );\n\n this.line = this._renderables.make(\"line\", {\n uniforms,\n samples: items,\n strips: width,\n ribbons: height,\n layers: depth,\n position: swizzle,\n color,\n stroke,\n join,\n mask,\n material: lineMaterial,\n });\n\n objects.push(this.line);\n }\n\n // Make strip renderable\n if (fill) {\n uniforms = UJS.merge(styleUniforms, {});\n\n this.strip = this._renderables.make(\"strip\", {\n uniforms,\n width,\n height,\n depth,\n items,\n position,\n color,\n material: faceMaterial,\n });\n objects.push(this.strip);\n }\n\n this._helpers.visible.make();\n return this._helpers.object.make(objects);\n }\n\n made() {\n return this.resize();\n }\n\n unmake() {\n this._helpers.bind.unmake();\n this._helpers.visible.unmake();\n this._helpers.object.unmake();\n\n return (this.strip = null);\n }\n\n change(changed, touched, init) {\n if (changed[\"geometry.points\"] || touched[\"mesh\"]) {\n return this.rebuild();\n }\n\n if (changed[\"style.zBias\"] || changed[\"mesh.lineBias\"] || init) {\n const { fill, zBias, lineBias } = this.props;\n return (this.wireZBias.value = zBias + (fill ? lineBias : 0));\n }\n }\n}\nStrip.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UJS from \"../../../util/js.js\";\nimport { Color } from \"three/src/math/Color.js\";\nimport { Primitive } from \"../../primitive.js\";\n\nexport class Surface extends Primitive {\n static initClass() {\n this.traits = [\n \"node\",\n \"object\",\n \"visible\",\n \"style\",\n \"line\",\n \"mesh\",\n \"geometry\",\n \"surface\",\n \"position\",\n \"grid\",\n \"bind\",\n \"shade\",\n ];\n this.defaults = {\n lineX: false,\n lineY: false,\n };\n }\n\n constructor(node, context, helpers) {\n super(node, context, helpers);\n\n this.lineX = this.lineY = this.surface = null;\n }\n\n resize() {\n if (this.bind.points == null) {\n return;\n }\n\n const dims = this.bind.points.getActiveDimensions();\n const { width, height, depth, items } = dims;\n\n if (this.surface) {\n this.surface.geometry.clip(width, height, depth, items);\n }\n if (this.lineX) {\n this.lineX.geometry.clip(width, height, depth, items);\n }\n if (this.lineY) {\n this.lineY.geometry.clip(height, width, depth, items);\n }\n\n if (this.bind.map != null) {\n const map = this.bind.map.getActiveDimensions();\n if (this.surface) {\n return this.surface.geometry.map(\n map.width,\n map.height,\n map.depth,\n map.items\n );\n }\n }\n }\n\n make() {\n // Bind to attached data sources\n let color;\n this._helpers.bind.make([\n { to: \"geometry.points\", trait: \"source\" },\n { to: \"geometry.colors\", trait: \"source\" },\n { to: \"mesh.map\", trait: \"source\" },\n ]);\n\n if (this.bind.points == null) {\n return;\n }\n\n // Build transform chain\n let position = this._shaders.shader();\n\n // Fetch position and transform to view\n position = this.bind.points.sourceShader(position);\n position = this._helpers.position.pipeline(position);\n\n // Prepare bound uniforms\n const styleUniforms = this._helpers.style.uniforms();\n const wireUniforms = this._helpers.style.uniforms();\n const lineUniforms = this._helpers.line.uniforms();\n const surfaceUniforms = this._helpers.surface.uniforms();\n const unitUniforms = this._inherit(\"unit\").getUnitUniforms();\n\n // Darken wireframe if needed for contrast\n // Auto z-bias wireframe over surface\n wireUniforms.styleColor = this._attributes.make(this._types.color());\n wireUniforms.styleZBias = this._attributes.make(this._types.number());\n this.wireColor = wireUniforms.styleColor.value;\n this.wireZBias = wireUniforms.styleZBias;\n this.wireScratch = new Color();\n\n // Fetch geometry dimensions\n const dims = this.bind.points.getDimensions();\n const { width, height, depth, items } = dims;\n\n // Get display properties\n const {\n shaded,\n fill,\n lineX,\n lineY,\n closedX,\n closedY,\n stroke,\n join,\n proximity,\n crossed,\n } = this.props;\n const objects = [];\n this.proximity = proximity;\n\n // Build color lookup\n if (this.bind.colors) {\n color = this._shaders.shader();\n this.bind.colors.sourceShader(color);\n }\n\n // Build transition mask lookup\n const mask = this._helpers.object.mask();\n\n // Build texture map lookup\n const map = this._helpers.shade.map(\n this.bind.map != null\n ? this.bind.map.sourceShader(this._shaders.shader())\n : undefined\n );\n\n // Build fragment material lookup\n const material = this._helpers.shade.pipeline();\n const faceMaterial = material || shaded;\n const lineMaterial = material || false;\n\n // Make line and surface renderables\n const { swizzle, swizzle2 } = this._helpers.position;\n let uniforms = UJS.merge(\n unitUniforms,\n lineUniforms,\n styleUniforms,\n wireUniforms\n );\n const zUnits = lineX || lineY ? -50 : 0;\n if (lineX) {\n this.lineX = this._renderables.make(\"line\", {\n uniforms,\n samples: width,\n strips: height,\n ribbons: depth,\n layers: items,\n position,\n color,\n zUnits: -zUnits,\n stroke,\n join,\n mask,\n material: lineMaterial,\n proximity,\n closed: closedX || closed,\n });\n objects.push(this.lineX);\n }\n\n if (lineY) {\n this.lineY = this._renderables.make(\"line\", {\n uniforms,\n samples: height,\n strips: width,\n ribbons: depth,\n layers: items,\n position: swizzle2(position, \"yxzw\", \"yxzw\"),\n color: swizzle(color, \"yxzw\"),\n zUnits: -zUnits,\n stroke,\n join,\n mask: swizzle(mask, crossed ? \"xyzw\" : \"yxzw\"),\n material: lineMaterial,\n proximity,\n closed: closedY || closed,\n });\n objects.push(this.lineY);\n }\n\n if (fill) {\n uniforms = UJS.merge(unitUniforms, surfaceUniforms, styleUniforms);\n this.surface = this._renderables.make(\"surface\", {\n uniforms,\n width,\n height,\n surfaces: depth,\n layers: items,\n position,\n color,\n zUnits,\n stroke,\n material: faceMaterial,\n mask,\n map,\n intUV: true,\n closedX: closedX || closed,\n closedY: closedY || closed,\n });\n objects.push(this.surface);\n }\n\n this._helpers.visible.make();\n return this._helpers.object.make(objects);\n }\n\n made() {\n return this.resize();\n }\n\n unmake() {\n this._helpers.bind.unmake();\n this._helpers.visible.unmake();\n this._helpers.object.unmake();\n\n return (this.lineX = this.lineY = this.surface = null);\n }\n\n _convertGammaToLinear(color, gammaFactor = 2.0) {\n color.r = Math.pow(color.r, gammaFactor);\n color.g = Math.pow(color.g, gammaFactor);\n color.b = Math.pow(color.b, gammaFactor);\n\n return color;\n }\n\n _convertLinearToGamma(color, gammaFactor = 2.0) {\n const safeInverse = gammaFactor > 0 ? 1.0 / gammaFactor : 1.0;\n\n color.r = Math.pow(color.r, safeInverse);\n color.g = Math.pow(color.g, safeInverse);\n color.b = Math.pow(color.b, safeInverse);\n\n return color;\n }\n\n change(changed, touched, init) {\n if (\n changed[\"geometry.points\"] ||\n changed[\"mesh.shaded\"] ||\n changed[\"mesh.fill\"] ||\n changed[\"line.stroke\"] ||\n changed[\"line.join\"] ||\n touched[\"grid\"]\n ) {\n return this.rebuild();\n }\n\n if (\n changed[\"style.color\"] ||\n changed[\"style.zBias\"] ||\n changed[\"mesh.fill\"] ||\n changed[\"mesh.lineBias\"] ||\n init\n ) {\n const { fill, color, zBias, lineBias } = this.props;\n\n this.wireZBias.value = zBias + (fill ? lineBias : 0);\n this.wireColor.copy(color);\n if (fill) {\n const c = this.wireScratch;\n c.setRGB(color.x, color.y, color.z);\n this._convertLinearToGamma(\n this._convertGammaToLinear(c).multiplyScalar(0.75)\n );\n this.wireColor.x = c.r;\n this.wireColor.y = c.g;\n this.wireColor.z = c.b;\n }\n }\n\n if (changed[\"line.proximity\"]) {\n if ((this.proximity != null) !== (this.props.proximity != null)) {\n return this.rebuild();\n }\n }\n }\n}\nSurface.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UJS from \"../../../util/js.js\";\nimport { Primitive } from \"../../primitive.js\";\n\nexport class Ticks extends Primitive {\n static initClass() {\n this.traits = [\n \"node\",\n \"object\",\n \"visible\",\n \"style\",\n \"line\",\n \"ticks\",\n \"geometry\",\n \"position\",\n \"bind\",\n \"shade\",\n ];\n }\n\n init() {\n return (this.tickStrip = this.line = null);\n }\n\n resize() {\n if (this.bind.points == null) {\n return;\n }\n const dims = this.bind.points.getActiveDimensions();\n\n const active = +(dims.items > 0);\n const strips = dims.width * active;\n const ribbons = dims.height * active;\n const layers = dims.depth * active;\n\n this.line.geometry.clip(2, strips, ribbons, layers);\n return this.tickStrip.set(0, strips - 1);\n }\n\n make() {\n // Bind to attached data sources\n let color, position;\n this._helpers.bind.make([\n { to: \"geometry.points\", trait: \"source\" },\n { to: \"geometry.colors\", trait: \"source\" },\n ]);\n\n if (this.bind.points == null) {\n return;\n }\n\n // Prepare bound uniforms\n const styleUniforms = this._helpers.style.uniforms();\n const lineUniforms = this._helpers.line.uniforms();\n const unitUniforms = this._inherit(\"unit\").getUnitUniforms();\n const uniforms = UJS.merge(lineUniforms, styleUniforms, unitUniforms);\n\n // Prepare position shader\n const positionUniforms = {\n tickEpsilon: this.node.attributes[\"ticks.epsilon\"],\n tickSize: this.node.attributes[\"ticks.size\"],\n tickNormal: this.node.attributes[\"ticks.normal\"],\n tickStrip: this._attributes.make(this._types.vec2(0, 0)),\n worldUnit: uniforms.worldUnit,\n focusDepth: uniforms.focusDepth,\n };\n\n this.tickStrip = positionUniforms.tickStrip.value;\n\n // Build transform chain\n const p = (position = this._shaders.shader());\n\n // Require buffer sampler as callback\n p.require(this.bind.points.sourceShader(this._shaders.shader()));\n\n // Require view transform as callback\n p.require(this._helpers.position.pipeline(this._shaders.shader()));\n\n // Link to tick shader\n p.pipe(\"ticks.position\", positionUniforms);\n\n // Stroke style\n const { stroke, join } = this.props;\n\n // Fetch geometry dimensions\n const dims = this.bind.points.getDimensions();\n const strips = dims.width;\n const ribbons = dims.height;\n const layers = dims.depth;\n\n // Build color lookup\n if (this.bind.colors) {\n color = this._shaders.shader();\n this.bind.colors.sourceShader(color);\n }\n\n // Build transition mask lookup\n const mask = this._helpers.object.mask();\n\n // Build fragment material lookup\n const material = this._helpers.shade.pipeline() || false;\n\n // Make line renderable\n const { swizzle } = this._helpers.position;\n this.line = this._renderables.make(\"line\", {\n uniforms,\n samples: 2,\n strips,\n ribbons,\n layers,\n position,\n color,\n stroke,\n join,\n mask: swizzle(mask, \"yzwx\"),\n material,\n });\n\n this._helpers.visible.make();\n return this._helpers.object.make([this.line]);\n }\n\n made() {\n return this.resize();\n }\n\n unmake() {\n this.line = null;\n\n this._helpers.visible.unmake();\n return this._helpers.object.unmake();\n }\n\n change(changed, _touched, _init) {\n if (\n changed[\"geometry.points\"] ||\n changed[\"line.stroke\"] ||\n changed[\"line.join\"]\n ) {\n return this.rebuild();\n }\n }\n}\nTicks.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UJS from \"../../../util/js.js\";\nimport { Primitive } from \"../../primitive.js\";\n\nexport class Vector extends Primitive {\n static initClass() {\n this.traits = [\n \"node\",\n \"object\",\n \"visible\",\n \"style\",\n \"line\",\n \"arrow\",\n \"geometry\",\n \"position\",\n \"bind\",\n \"shade\",\n ];\n }\n\n constructor(node, context, helpers) {\n super(node, context, helpers);\n\n this.line = this.arrows = null;\n }\n\n resize() {\n if (this.bind.points == null) {\n return;\n }\n const dims = this.bind.points.getActiveDimensions();\n\n const samples = dims.items;\n const strips = dims.width;\n const ribbons = dims.height;\n const layers = dims.depth;\n\n this.line.geometry.clip(samples, strips, ribbons, layers);\n return Array.from(this.arrows).map((arrow) =>\n arrow.geometry.clip(samples, strips, ribbons, layers)\n );\n }\n\n make() {\n // Bind to attached data sources\n let color;\n this._helpers.bind.make([\n { to: \"geometry.points\", trait: \"source\" },\n { to: \"geometry.colors\", trait: \"source\" },\n ]);\n\n if (this.bind.points == null) {\n return;\n }\n\n // Build transform chain\n let position = this._shaders.shader();\n\n // Fetch position\n this.bind.points.sourceShader(position);\n\n // Transform position to view\n this._helpers.position.pipeline(position);\n\n // Prepare bound uniforms\n const styleUniforms = this._helpers.style.uniforms();\n const lineUniforms = this._helpers.line.uniforms();\n const arrowUniforms = this._helpers.arrow.uniforms();\n const unitUniforms = this._inherit(\"unit\").getUnitUniforms();\n\n // Clip start/end for terminating arrow\n const { start, end } = this.props;\n\n // Stroke style\n const { stroke, join, proximity } = this.props;\n this.proximity = proximity;\n\n // Fetch geometry dimensions\n const dims = this.bind.points.getDimensions();\n const samples = dims.items;\n const strips = dims.width;\n const ribbons = dims.height;\n const layers = dims.depth;\n\n // Build color lookup\n if (this.bind.colors) {\n color = this._shaders.shader();\n this.bind.colors.sourceShader(color);\n }\n\n // Build transition mask lookup\n let mask = this._helpers.object.mask();\n\n // Build fragment material lookup\n let material = this._helpers.shade.pipeline() || false;\n\n // Swizzle vector to line\n const { swizzle, swizzle2 } = this._helpers.position;\n position = swizzle2(position, \"yzwx\", \"yzwx\");\n color = swizzle(color, \"yzwx\");\n mask = swizzle(mask, \"yzwx\");\n material = swizzle(material, \"yzwx\");\n\n // Make line renderable\n const uniforms = UJS.merge(\n arrowUniforms,\n lineUniforms,\n styleUniforms,\n unitUniforms\n );\n this.line = this._renderables.make(\"line\", {\n uniforms,\n samples,\n ribbons,\n strips,\n layers,\n position,\n color,\n clip: start || end,\n stroke,\n join,\n proximity,\n mask,\n material,\n });\n\n // Make arrow renderables\n this.arrows = [];\n if (start) {\n this.arrows.push(\n this._renderables.make(\"arrow\", {\n uniforms,\n flip: true,\n samples,\n ribbons,\n strips,\n layers,\n position,\n color,\n mask,\n material,\n })\n );\n }\n\n if (end) {\n this.arrows.push(\n this._renderables.make(\"arrow\", {\n uniforms,\n samples,\n ribbons,\n strips,\n layers,\n position,\n color,\n mask,\n material,\n })\n );\n }\n\n this._helpers.visible.make();\n return this._helpers.object.make(this.arrows.concat([this.line]));\n }\n\n made() {\n return this.resize();\n }\n\n unmake() {\n this._helpers.bind.unmake();\n this._helpers.visible.unmake();\n this._helpers.object.unmake();\n\n return (this.line = this.arrows = null);\n }\n\n change(changed, _touched, _init) {\n if (\n changed[\"geometry.points\"] ||\n changed[\"line.stroke\"] ||\n changed[\"line.join\"] ||\n changed[\"arrow.start\"] ||\n changed[\"arrow.end\"]\n ) {\n return this.rebuild();\n }\n\n if (changed[\"line.proximity\"]) {\n if ((this.proximity != null) !== (this.props.proximity != null)) {\n return this.rebuild();\n }\n }\n }\n}\nVector.initClass();\n","export * from \"./axis.js\";\nexport * from \"./face.js\";\nexport * from \"./grid.js\";\nexport * from \"./line.js\";\nexport * from \"./point.js\";\nexport * from \"./strip.js\";\nexport * from \"./surface.js\";\nexport * from \"./ticks.js\";\nexport * from \"./vector.js\";\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Voxel } from \"../data/voxel.js\";\n\nexport class HTML extends Voxel {\n static initClass() {\n this.traits = [\"node\", \"buffer\", \"active\", \"data\", \"voxel\", \"html\"];\n this.finals = { channels: 1 };\n }\n\n init() {\n super.init();\n this.storage = \"pushBuffer\";\n }\n\n make() {\n super.make();\n\n // Get our own size\n const { items, width, height, depth } = this.getDimensions();\n\n // Prepare DOM element factory\n this.dom = this._overlays.make(\"dom\");\n return this.dom.hint(items * width * height * depth);\n }\n\n unmake() {\n super.unmake();\n if (this.dom != null) {\n this.dom.dispose();\n return (this.dom = null);\n }\n }\n\n update() {\n return super.update();\n }\n\n change(changed, touched, init) {\n if (touched[\"html\"]) {\n return this.rebuild();\n }\n return super.change(changed, touched, init);\n }\n\n nodes() {\n return this.buffer.read();\n }\n\n callback(callback) {\n const { el } = this.dom;\n\n if (callback.length <= 6) {\n return (emit, i, j, k, l) => callback(emit, el, i, j, k, l);\n } else {\n return (emit, i, j, k, l) => {\n return callback(\n emit,\n el,\n i,\n j,\n k,\n l,\n this.bufferClock,\n this.bufferStep\n );\n };\n }\n }\n}\nHTML.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Primitive } from \"../../primitive.js\";\n\nexport class DOM extends Primitive {\n static initClass() {\n this.traits = [\n \"node\",\n \"bind\",\n \"object\",\n \"visible\",\n \"overlay\",\n \"dom\",\n \"attach\",\n \"position\",\n ];\n }\n\n init() {\n this.emitter = this.root = null;\n this.active = {};\n }\n\n make() {\n super.make();\n\n // Bind to attached objects\n this._helpers.bind.make([\n { to: \"dom.html\", trait: \"html\" },\n { to: \"dom.points\", trait: \"source\" },\n ]);\n\n if (this.bind.points == null || this.bind.html == null) {\n return;\n }\n\n // Listen for updates\n this.root = this._inherit(\"root\");\n this._listen(\"root\", \"root.update\", this.update);\n this._listen(\"root\", \"root.post\", this.post);\n\n // Fetch geometry dimensions\n const pointDims = this.bind.points.getDimensions();\n const htmlDims = this.bind.html.getDimensions();\n\n const items = Math.min(pointDims.items, htmlDims.items);\n const width = Math.min(pointDims.width, htmlDims.width);\n const height = Math.min(pointDims.height, htmlDims.height);\n const depth = Math.min(pointDims.depth, htmlDims.depth);\n\n // Build shader to sample position data\n let position = this.bind.points.sourceShader(this._shaders.shader());\n\n // Transform data into screen space\n position = this._helpers.position.pipeline(position);\n\n // Apply global projection\n const projection = this._shaders.shader({ globals: [\"projectionMatrix\"] });\n projection.pipe(\"project.readback\");\n position.pipe(projection);\n\n // Build nop index shader\n const indexer = this._shaders.shader();\n\n // Prepare readback/memo RTT\n this.readback = this._renderables.make(\"readback\", {\n map: position,\n indexer,\n items,\n width,\n height,\n depth,\n channels: 4,\n stpq: true,\n });\n\n // Prepare overlay container VDOM\n this.dom = this._overlays.make(\"dom\");\n this.dom.hint(items * width * height * depth * 2);\n // Make sure we have enough for wrapping each given element once\n\n // Prepare readback consumer\n this.emitter = this.callback(this.bind.html.nodes());\n this.readback.setCallback(this.emitter);\n\n this._helpers.visible.make();\n }\n\n unmake() {\n if (this.readback != null) {\n this.readback.dispose();\n this.dom.dispose();\n this.readback = this.dom = null;\n\n this.root = null;\n this.emitter = null;\n this.active = {};\n }\n\n this._helpers.bind.unmake();\n this._helpers.visible.unmake();\n }\n\n update() {\n if (this.readback == null) {\n return;\n }\n if (this.props.visible) {\n this.readback.update(\n this.root != null ? this.root.getCamera() : undefined\n );\n this.readback.post();\n this.readback.iterate();\n }\n }\n\n post() {\n if (this.readback == null) {\n return;\n }\n this.dom.render(this.isVisible ? this.emitter.nodes() : []);\n }\n\n callback(data) {\n // Create static consumer for the readback\n let strideJ, strideK;\n const uniforms = this._inherit(\"unit\").getUnitUniforms();\n const width = uniforms.viewWidth;\n const height = uniforms.viewHeight;\n\n const attr = this.node.attributes[\"dom.attributes\"];\n const size = this.node.attributes[\"dom.size\"];\n const zoom = this.node.attributes[\"dom.zoom\"];\n const color = this.node.attributes[\"dom.color\"];\n const outline = this.node.attributes[\"dom.outline\"];\n const pointer = this.node.attributes[\"dom.pointerEvents\"];\n const opacity = this.node.attributes[\"overlay.opacity\"];\n const zIndex = this.node.attributes[\"overlay.zIndex\"];\n const offset = this.node.attributes[\"attach.offset\"];\n const depth = this.node.attributes[\"attach.depth\"];\n const snap = this.node.attributes[\"attach.snap\"];\n const { el } = this.dom;\n\n let nodes = [];\n let styles = null;\n let className = null;\n\n let strideI = (strideJ = strideK = 0);\n let colorString = \"\";\n\n const f = function (x, y, z, w, i, j, k, l) {\n // Get HTML item by offset\n let v;\n const index = l + strideI * i + strideJ * j + strideK * k;\n const children = data[index];\n\n // Clip behind camera or when invisible\n const clip = w < 0;\n\n // Depth blending\n const iw = 1 / w;\n const flatZ = 1 + (iw - 1) * depth.value;\n const scale = clip ? 0 : flatZ;\n\n // GL to CSS coordinate transform\n const ox = +offset.value.x * scale;\n const oy = +offset.value.y * scale;\n let xx = (x + 1) * width.value * 0.5 + ox;\n let yy = (y - 1) * height.value * 0.5 + oy;\n\n // Handle zoom/scale\n xx /= zoom.value;\n yy /= zoom.value;\n\n // Snap to pixel\n if (snap.value) {\n xx = Math.round(xx);\n yy = Math.round(yy);\n }\n\n // Clip and apply opacity\n const alpha = Math.min(0.999, clip ? 0 : opacity.value);\n\n // Generate div\n const props = {\n className,\n style: {\n transform: `translate3d(${xx}px, ${-yy}px, ${\n 1 - w\n }px) translate(-50%, -50%) scale(${scale},${scale})`,\n opacity: alpha,\n },\n };\n for (k in styles) {\n v = styles[k];\n props.style[k] = v;\n }\n\n // Merge in external attributes\n const a = attr.value;\n if (a != null) {\n const s = a.style;\n for (k in a) {\n v = a[k];\n if (![\"style\", \"className\"].includes(k)) {\n props[k] = v;\n }\n }\n if (s != null) {\n for (k in s) {\n v = s[k];\n props.style[k] = v;\n }\n }\n }\n props.className +=\n \" \" +\n ((a != null ? a.className : undefined) != null\n ? a != null\n ? a.className\n : undefined\n : \"mathbox-label\");\n\n // Push node onto list\n return nodes.push(el(\"div\", props, children));\n };\n\n f.reset = () => {\n nodes = [];\n [strideI, strideJ, strideK] = Array.from([\n this.strideI,\n this.strideJ,\n this.strideK,\n ]);\n\n const c = color.value;\n const m = (x) => Math.floor(x * 255);\n colorString = c ? `rgb(${[m(c.x), m(c.y), m(c.z)]})` : \"\";\n\n className = `mathbox-outline-${Math.round(outline.value)}`;\n styles = {};\n if (c) {\n styles.color = colorString;\n }\n styles.fontSize = `${size.value}px`;\n if (zoom.value !== 1) {\n styles.zoom = zoom.value;\n }\n if (zIndex.value > 0) {\n styles.zIndex = zIndex.value;\n }\n if (pointer.value) {\n return (styles.pointerEvents = \"auto\");\n }\n };\n\n f.nodes = () => nodes;\n return f;\n }\n\n resize() {\n let sI, sJ;\n if (this.readback == null) {\n return;\n }\n\n // Fetch geometry/html dimensions\n const pointDims = this.bind.points.getActiveDimensions();\n const htmlDims = this.bind.html.getActiveDimensions();\n\n const items = Math.min(pointDims.items, htmlDims.items);\n const width = Math.min(pointDims.width, htmlDims.width);\n const height = Math.min(pointDims.height, htmlDims.height);\n const depth = Math.min(pointDims.depth, htmlDims.depth);\n\n // Limit readback to active area\n this.readback.setActive(items, width, height, depth);\n\n // Recalculate iteration strides\n this.strideI = sI = htmlDims.items;\n this.strideJ = sJ = sI * htmlDims.width;\n this.strideK = sJ * htmlDims.height;\n }\n\n change(changed, _touched, _init) {\n if (changed[\"dom.html\"] || changed[\"dom.points\"]) {\n return this.rebuild();\n }\n }\n}\nDOM.initClass();\n","export * from \"./html.js\";\nexport * from \"./dom.js\";\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UData from \"../../../util/data.js\";\n\nimport { FloatType, NearestFilter } from \"three/src/constants.js\";\nimport { Buffer } from \"../data/buffer.js\";\nimport { Voxel } from \"../data/voxel.js\";\n\nexport class Text extends Voxel {\n static initClass() {\n this.traits = [\n \"node\",\n \"buffer\",\n \"active\",\n \"data\",\n \"texture\",\n \"voxel\",\n \"text\",\n \"font\",\n ];\n this.defaults = {\n minFilter: \"linear\",\n magFilter: \"linear\",\n };\n this.finals = { channels: 1 };\n }\n\n init() {\n super.init();\n return (this.atlas = null);\n }\n\n textShader(shader) {\n return this.atlas.shader(shader);\n }\n\n textIsSDF() {\n return this.props.sdf > 0;\n }\n textHeight() {\n return this.props.detail;\n }\n\n make() {\n // Read sampling parameters\n let { minFilter, magFilter, type } = this.props;\n\n // Read font parameters\n const { font, style, variant, weight, detail, sdf } = this.props;\n\n // Prepare text atlas\n this.atlas = this._renderables.make(\"textAtlas\", {\n font,\n size: detail,\n style,\n variant,\n weight,\n outline: sdf,\n minFilter,\n magFilter,\n type,\n });\n\n // Underlying data buffer needs no filtering\n this.minFilter = NearestFilter;\n this.magFilter = NearestFilter;\n this.type = FloatType;\n\n // Skip voxel::make(), as we need 4 channels internally in our buffer to store sprite x/y/w/h per string\n Buffer.prototype.make.call(this);\n\n // Read sampling parameters\n minFilter = this.minFilter != null ? this.minFilter : this.props.minFilter;\n magFilter = this.magFilter != null ? this.magFilter : this.props.magFilter;\n type = this.type != null ? this.type : this.props.type;\n\n // Read given dimensions\n const { width } = this.props;\n const { height } = this.props;\n const { depth } = this.props;\n const reserveX = this.props.bufferWidth;\n const reserveY = this.props.bufferHeight;\n const reserveZ = this.props.bufferDepth;\n const { channels } = this.props;\n const { items } = this.props;\n\n let dims = (this.spec = { channels, items, width, height, depth });\n\n this.items = dims.items;\n this.channels = dims.channels;\n\n // Init to right size if data supplied\n const { data } = this.props;\n dims = UData.getDimensions(data, dims);\n\n const { space } = this;\n space.width = Math.max(reserveX, dims.width || 1);\n space.height = Math.max(reserveY, dims.height || 1);\n space.depth = Math.max(reserveZ, dims.depth || 1);\n\n // Create text voxel buffer\n this.buffer = this._renderables.make(this.storage, {\n width: space.width,\n height: space.height,\n depth: space.depth,\n channels: 4,\n items,\n minFilter,\n magFilter,\n type,\n });\n\n // Hook buffer emitter to map atlas text\n const { atlas } = this;\n const { emit } = this.buffer.streamer;\n return (this.buffer.streamer.emit = (text) => atlas.map(text, emit));\n }\n\n unmake() {\n super.unmake();\n if (this.atlas) {\n this.atlas.dispose();\n return (this.atlas = null);\n }\n }\n\n update() {\n this.atlas.begin();\n super.update();\n return this.atlas.end();\n }\n\n change(changed, touched, init) {\n if (touched[\"font\"]) {\n return this.rebuild();\n }\n return super.change(changed, touched, init);\n }\n}\nText.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Source } from \"../base/source\";\n\nexport class Operator extends Source {\n static initClass() {\n this.traits = [\"node\", \"bind\", \"operator\", \"source\", \"index\"];\n }\n\n indexShader(shader) {\n return __guardMethod__(this.bind.source, \"indexShader\", (o) =>\n o.indexShader(shader)\n );\n }\n sourceShader(shader) {\n return __guardMethod__(this.bind.source, \"sourceShader\", (o) =>\n o.sourceShader(shader)\n );\n }\n\n getDimensions() {\n return this.bind.source.getDimensions();\n }\n getFutureDimensions() {\n return this.bind.source.getFutureDimensions();\n }\n getActiveDimensions() {\n return this.bind.source.getActiveDimensions();\n }\n getIndexDimensions() {\n return this.bind.source.getIndexDimensions();\n }\n\n init() {\n return (this.sourceSpec = [{ to: \"operator.source\", trait: \"source\" }]);\n }\n\n make() {\n super.make();\n\n // Bind to attached data sources\n return this._helpers.bind.make(this.sourceSpec);\n }\n\n made() {\n this.resize();\n return super.made();\n }\n\n unmake() {\n return this._helpers.bind.unmake();\n }\n\n resize(_rebuild) {\n return this.trigger({\n type: \"source.resize\",\n });\n }\n}\nOperator.initClass();\n\nfunction __guardMethod__(obj, methodName, transform) {\n if (\n typeof obj !== \"undefined\" &&\n obj !== null &&\n typeof obj[methodName] === \"function\"\n ) {\n return transform(obj, methodName);\n } else {\n return undefined;\n }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { FloatType, NearestFilter } from \"three/src/constants.js\";\nimport { Operator } from \"../operator/operator.js\";\n\nexport class Format extends Operator {\n static initClass() {\n this.traits = [\n \"node\",\n \"bind\",\n \"operator\",\n \"texture\",\n \"text\",\n \"format\",\n \"font\",\n ];\n this.defaults = {\n minFilter: \"linear\",\n magFilter: \"linear\",\n };\n }\n\n init() {\n super.init();\n this.atlas = this.buffer = this.used = this.time = null;\n return (this.filled = false);\n }\n\n sourceShader(shader) {\n return this.buffer.shader(shader);\n }\n\n textShader(shader) {\n return this.atlas.shader(shader);\n }\n\n textIsSDF() {\n return this.props.sdf > 0;\n }\n textHeight() {\n return this.props.detail;\n }\n\n make() {\n // Bind to attached data sources # super()\n this._helpers.bind.make([{ to: \"operator.source\", trait: \"raw\" }]);\n\n // Read sampling parameters\n let { minFilter, magFilter, type } = this.props;\n\n // Read font parameters\n const { font, style, variant, weight, detail, sdf } = this.props;\n\n // Prepare text atlas\n this.atlas = this._renderables.make(\"textAtlas\", {\n font,\n size: detail,\n style,\n variant,\n weight,\n outline: sdf,\n minFilter,\n magFilter,\n type,\n });\n\n // Underlying data buffer needs no filtering\n minFilter = NearestFilter;\n magFilter = NearestFilter;\n type = FloatType;\n\n // Fetch geometry dimensions\n const dims = this.bind.source.getDimensions();\n const { items, width, height, depth } = dims;\n\n // Create voxel buffer for text atlas coords\n this.buffer = this._renderables.make(\"voxelBuffer\", {\n width,\n height,\n depth,\n channels: 4,\n items,\n minFilter,\n magFilter,\n type,\n });\n\n // Hook buffer emitter to map atlas text\n const { atlas } = this;\n const { emit } = this.buffer.streamer;\n this.buffer.streamer.emit = (t) => atlas.map(t, emit);\n\n // Grab parent clock\n this.clockParent = this._inherit(\"clock\");\n return this._listen(\"root\", \"root.update\", this.update);\n }\n\n made() {\n super.made();\n return this.resize();\n }\n\n unmake() {\n super.unmake();\n if (this.buffer) {\n this.buffer.dispose();\n this.buffer = null;\n }\n\n if (this.atlas) {\n this.atlas.dispose();\n return (this.atlas = null);\n }\n }\n\n update() {\n if ((this.filled && !this.props.live) || !this.through) {\n return;\n }\n\n this.time = this.clockParent.getTime();\n\n const { used } = this;\n\n this.atlas.begin();\n this.used = this.through();\n this.buffer.write(this.used);\n this.atlas.end();\n\n this.filled = true;\n\n if (used !== this.used) {\n return this.trigger({\n type: \"source.resize\",\n });\n }\n }\n\n change(changed, touched, init) {\n if (touched[\"font\"]) {\n return this.rebuild();\n }\n\n if (\n changed[\"format.expr\"] ||\n changed[\"format.digits\"] ||\n changed[\"format.data\"] ||\n init\n ) {\n let map;\n let { digits, expr, data } = this.props;\n\n if (expr == null) {\n if (data != null) {\n expr = (x, y, z, w, i) => data[i];\n } else {\n expr = (x) => x;\n }\n }\n\n const { length } = expr;\n\n if (digits != null) {\n expr = (\n (expr) => (x, y, z, w, i, j, k, l, t, d) =>\n +expr(x, y, z, w, i, j, k, l, t, d).toPrecision(digits)\n )(expr);\n }\n\n // Stream raw source data and format it with expression\n if (length > 8) {\n map = (emit, x, y, z, w, i, j, k, l, _t, _d) => {\n return emit(\n expr(x, y, z, w, i, j, k, l, this.time.clock, this.time.step)\n );\n };\n } else {\n map = (emit, x, y, z, w, i, j, k, l) => {\n return emit(expr(x, y, z, w, i, j, k, l));\n };\n }\n\n return (this.through = this.bind.source\n .rawBuffer()\n .through(map, this.buffer));\n }\n }\n}\nFormat.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UJS from \"../../../util/js.js\";\n\nimport { Primitive } from \"../../primitive.js\";\n\nexport class Label extends Primitive {\n static initClass() {\n this.traits = [\n \"node\",\n \"bind\",\n \"object\",\n \"visible\",\n \"style\",\n \"label\",\n \"attach\",\n \"geometry\",\n \"position\",\n ];\n }\n\n make() {\n let color;\n super.make();\n\n // Bind to attached objects\n this._helpers.bind.make([\n { to: \"label.text\", trait: \"text\" },\n { to: \"geometry.points\", trait: \"source\" },\n { to: \"geometry.colors\", trait: \"source\" },\n ]);\n\n if (this.bind.points == null) {\n return;\n }\n if (this.bind.text == null) {\n return;\n }\n\n // Fetch geometry/text dimensions\n const pointDims = this.bind.points.getDimensions();\n const textDims = this.bind.text.getDimensions();\n const textIsSDF = this.bind.text.textIsSDF();\n\n const items = Math.min(pointDims.items, textDims.items);\n const width = Math.min(pointDims.width, textDims.width);\n const height = Math.min(pointDims.height, textDims.height);\n const depth = Math.min(pointDims.depth, textDims.depth);\n\n // Build shader to sample position data\n // and transform into screen space\n let position = this.bind.points.sourceShader(this._shaders.shader());\n position = this._helpers.position.pipeline(position);\n\n // Build shader to sample text geometry data\n const sprite = this.bind.text.sourceShader(this._shaders.shader());\n\n // Build shader to sample text image data\n const map = this._shaders.shader().pipe(\"label.map\");\n map.pipe(this.bind.text.textShader(this._shaders.shader()));\n\n // Build shader to resolve text data\n const labelUniforms = {\n spriteDepth: this.node.attributes[\"attach.depth\"],\n spriteOffset: this.node.attributes[\"attach.offset\"],\n spriteSnap: this.node.attributes[\"attach.snap\"],\n spriteScale: this._attributes.make(this._types.number()),\n outlineStep: this._attributes.make(this._types.number()),\n outlineExpand: this._attributes.make(this._types.number()),\n outlineColor: this.node.attributes[\"label.background\"],\n };\n\n this.spriteScale = labelUniforms.spriteScale;\n this.outlineStep = labelUniforms.outlineStep;\n this.outlineExpand = labelUniforms.outlineExpand;\n\n const snippet = textIsSDF ? \"label.outline\" : \"label.alpha\";\n const combine = this._shaders.shader().pipe(snippet, labelUniforms);\n\n // Build color lookup\n if (this.bind.colors) {\n color = this._shaders.shader();\n this.bind.colors.sourceShader(color);\n }\n\n // Build transition mask lookup\n const mask = this._helpers.object.mask();\n\n // Prepare bound uniforms\n const styleUniforms = this._helpers.style.uniforms();\n const unitUniforms = this._inherit(\"unit\").getUnitUniforms();\n\n // Make sprite renderable\n const uniforms = UJS.merge(unitUniforms, styleUniforms, labelUniforms);\n this.sprite = this._renderables.make(\"sprite\", {\n uniforms,\n width,\n height,\n depth,\n items,\n position,\n sprite,\n map,\n combine,\n color,\n mask,\n linear: true,\n });\n\n this._helpers.visible.make();\n return this._helpers.object.make([this.sprite]);\n }\n\n unmake() {\n this._helpers.bind.unmake();\n this._helpers.visible.unmake();\n this._helpers.object.unmake();\n\n return (this.sprite = null);\n }\n\n resize() {\n // Fetch geometry/text dimensions\n const pointDims = this.bind.points.getActiveDimensions();\n const textDims = this.bind.text.getActiveDimensions();\n\n const items = Math.min(pointDims.items, textDims.items);\n const width = Math.min(pointDims.width, textDims.width);\n const height = Math.min(pointDims.height, textDims.height);\n const depth = Math.min(pointDims.depth, textDims.depth);\n\n return this.sprite.geometry.clip(width, height, depth, items);\n }\n\n change(changed, touched, _init) {\n if (touched[\"geometry\"] || changed[\"label.text\"]) {\n return this.rebuild();\n }\n if (this.bind.points == null) {\n return;\n }\n\n const { size } = this.props;\n const { outline } = this.props;\n const { expand } = this.props;\n const height = this.bind.text.textHeight();\n const scale = size / height;\n\n this.outlineExpand.value = ((expand / scale) * 16) / 255;\n this.outlineStep.value = ((outline / scale) * 16) / 255;\n return (this.spriteScale.value = scale);\n }\n}\nLabel.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UGLSL from \"../../../util/glsl.js\";\nimport { Operator } from \"./operator.js\";\n\nexport class Resample extends Operator {\n static initClass() {\n this.traits = [\n \"node\",\n \"bind\",\n \"operator\",\n \"source\",\n \"index\",\n \"resample\",\n \"sampler:x\",\n \"sampler:y\",\n \"sampler:z\",\n \"sampler:w\",\n \"include\",\n ];\n }\n\n indexShader(shader) {\n shader.pipe(this.indexer);\n return super.indexShader(shader);\n }\n\n sourceShader(shader) {\n return shader.pipe(this.operator);\n }\n\n getDimensions() {\n return this._resample(this.bind.source.getDimensions());\n }\n getActiveDimensions() {\n return this._resample(this.bind.source.getActiveDimensions());\n }\n getFutureDimensions() {\n return this._resample(this.bind.source.getFutureDimensions());\n }\n getIndexDimensions() {\n return this._resample(this.bind.source.getIndexDimensions());\n }\n\n _resample(dims) {\n const r = this.resampled;\n const c = this.centered;\n const p = this.padding;\n\n if (this.relativeSize) {\n if (!c.items) {\n dims.items--;\n }\n if (!c.width) {\n dims.width--;\n }\n if (!c.height) {\n dims.height--;\n }\n if (!c.depth) {\n dims.depth--;\n }\n\n if (r.items != null) {\n dims.items *= r.items;\n }\n if (r.width != null) {\n dims.width *= r.width;\n }\n if (r.height != null) {\n dims.height *= r.height;\n }\n if (r.depth != null) {\n dims.depth *= r.depth;\n }\n\n if (!c.items) {\n dims.items++;\n }\n if (!c.width) {\n dims.width++;\n }\n if (!c.height) {\n dims.height++;\n }\n if (!c.depth) {\n dims.depth++;\n }\n\n dims.items -= p.items * 2;\n dims.width -= p.width * 2;\n dims.height -= p.height * 2;\n dims.depth -= p.depth * 2;\n } else {\n if (r.items != null) {\n dims.items = r.items;\n }\n if (r.width != null) {\n dims.width = r.width;\n }\n if (r.height != null) {\n dims.height = r.height;\n }\n if (r.depth != null) {\n dims.depth = r.depth;\n }\n }\n\n dims.items = Math.max(0, Math.floor(dims.items));\n dims.width = Math.max(0, Math.floor(dims.width));\n dims.height = Math.max(0, Math.floor(dims.height));\n dims.depth = Math.max(0, Math.floor(dims.depth));\n\n return dims;\n }\n\n make() {\n super.make();\n if (this.bind.source == null) {\n return;\n }\n\n // Bind to attached shader\n this._helpers.bind.make([\n { to: \"include.shader\", trait: \"shader\", optional: true },\n ]);\n\n // Get custom shader\n const { indices, channels } = this.props;\n const { shader } = this.bind;\n\n // Get resampled dimensions (if any)\n const { sample, size, items, width, height, depth } = this.props;\n\n // Sampler behavior\n const relativeSample =\n sample === this.node.attributes[\"resample.sample\"].enum.relative;\n const relativeSize =\n size === this.node.attributes[\"resample.size\"].enum.relative;\n\n this.resampled = {};\n if (items != null) {\n this.resampled.items = items;\n }\n if (width != null) {\n this.resampled.width = width;\n }\n if (height != null) {\n this.resampled.height = height;\n }\n if (depth != null) {\n this.resampled.depth = depth;\n }\n\n this.centered = {};\n this.centered.items = this.props.centeredW;\n this.centered.width = this.props.centeredX;\n this.centered.height = this.props.centeredY;\n this.centered.depth = this.props.centeredZ;\n\n this.padding = {};\n this.padding.items = this.props.paddingW;\n this.padding.width = this.props.paddingX;\n this.padding.height = this.props.paddingY;\n this.padding.depth = this.props.paddingZ;\n\n // Build shader to resample data\n const operator = this._shaders.shader();\n const indexer = this._shaders.shader();\n\n // Uniforms\n const type = [\n null,\n this._types.number,\n this._types.vec2,\n this._types.vec3,\n this._types.vec4,\n ][indices];\n const uniforms = {\n dataSize: this._attributes.make(type(0, 0, 0, 0)),\n dataResolution: this._attributes.make(type(0, 0, 0, 0)),\n\n targetSize: this._attributes.make(type(0, 0, 0, 0)),\n targetResolution: this._attributes.make(type(0, 0, 0, 0)),\n\n resampleFactor: this._attributes.make(this._types.vec4(0, 0, 0, 0)),\n resampleBias: this._attributes.make(this._types.vec4(0, 0, 0, 0)),\n };\n\n this.dataResolution = uniforms.dataResolution;\n this.dataSize = uniforms.dataSize;\n this.targetResolution = uniforms.targetResolution;\n this.targetSize = uniforms.targetSize;\n this.resampleFactor = uniforms.resampleFactor;\n this.resampleBias = uniforms.resampleBias;\n\n // Has resize props?\n const resize =\n items != null || width != null || height != null || depth != null;\n\n // Add padding\n operator.pipe(\"resample.padding\", uniforms);\n\n // Add centered sampling offset\n let vec = [];\n let any = false;\n const iterable = [\"width\", \"height\", \"depth\", \"items\"];\n for (let i = 0; i < iterable.length; i++) {\n const key = iterable[i];\n const centered = this.centered[key];\n if (!any) {\n any = centered;\n }\n vec[i] = centered ? \"0.5\" : \"0.0\";\n }\n\n if (any) {\n vec = `vec4(${vec})`;\n // TODO is this right? seems like copy paste.\n operator.pipe(UGLSL.binaryOperator(4, \"+\", vec));\n if (resize) {\n indexer.pipe(UGLSL.binaryOperator(4, \"+\", vec));\n }\n }\n\n if (relativeSample) {\n // Addressing relative to target\n if (resize) {\n operator.pipe(\"resample.relative\", uniforms);\n indexer.pipe(\"resample.relative\", uniforms);\n } else {\n indexer.pipe(UGLSL.identity(\"vec4\"));\n }\n }\n\n if (shader != null) {\n if (indices !== 4) {\n operator.pipe(UGLSL.truncateVec(4, indices));\n }\n\n operator.callback();\n if (indices !== 4) {\n operator.pipe(UGLSL.extendVec(indices, 4));\n }\n if (any) {\n operator.pipe(UGLSL.binaryOperator(4, \"-\", vec));\n }\n operator.pipe(this.bind.source.sourceShader(this._shaders.shader()));\n if (channels !== 4) {\n operator.pipe(UGLSL.truncateVec(4, channels));\n }\n operator.join();\n\n if (this.bind.shader != null) {\n operator.pipe(this.bind.shader.shaderBind(uniforms));\n }\n\n if (channels !== 4) {\n operator.pipe(UGLSL.extendVec(channels, 4));\n }\n } else {\n if (any) {\n operator.pipe(UGLSL.binaryOperator(4, \"-\", vec));\n }\n operator.pipe(this.bind.source.sourceShader(this._shaders.shader()));\n }\n\n if (any && resize) {\n indexer.pipe(UGLSL.binaryOperator(4, \"-\", vec));\n }\n\n this.operator = operator;\n this.indexer = indexer;\n this.indices = indices;\n\n this.relativeSample = relativeSample;\n return (this.relativeSize = relativeSize);\n }\n\n unmake() {\n super.unmake();\n return (this.operator = null);\n }\n\n resize() {\n if (this.bind.source == null) {\n return;\n }\n\n const dims = this.bind.source.getActiveDimensions();\n const target = this.getActiveDimensions();\n\n const axis = (key) => {\n const centered = this.centered[key];\n const pad = this.padding[key];\n\n target[key] += pad * 2;\n\n const res = centered\n ? dims[key] / Math.max(1, target[key])\n : Math.max(1, dims[key] - 1) / Math.max(1, target[key] - 1);\n return [res, pad];\n };\n\n const [rw, bw] = Array.from(axis(\"width\"));\n const [rh, bh] = Array.from(axis(\"height\"));\n const [rd, bd] = Array.from(axis(\"depth\"));\n const [ri, bi] = Array.from(axis(\"items\"));\n\n if (this.indices === 1) {\n this.dataResolution.value = 1 / dims.width;\n this.targetResolution.value = 1 / target.width;\n\n this.dataSize.value = dims.width;\n this.targetSize.value = target.width;\n } else {\n this.dataResolution.value.set(\n 1 / dims.width,\n 1 / dims.height,\n 1 / dims.depth,\n 1 / dims.items\n );\n this.targetResolution.value.set(\n 1 / target.width,\n 1 / target.height,\n 1 / target.depth,\n 1 / target.items\n );\n\n this.dataSize.value.set(dims.width, dims.height, dims.depth, dims.items);\n this.targetSize.value.set(\n target.width,\n target.height,\n target.depth,\n target.items\n );\n }\n\n this.resampleFactor.value.set(rw, rh, rd, ri);\n this.resampleBias.value.set(bw, bh, bd, bi);\n\n return super.resize();\n }\n\n change(changed, touched, _init) {\n if (\n touched[\"operator\"] ||\n touched[\"resample\"] ||\n touched[\"sampler\"] ||\n touched[\"include\"]\n ) {\n return this.rebuild();\n }\n }\n}\nResample.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Resample } from \"../operator/resample.js\";\n\nexport class Retext extends Resample {\n static initClass() {\n this.traits = [\n \"node\",\n \"bind\",\n \"operator\",\n \"resample\",\n \"sampler:x\",\n \"sampler:y\",\n \"sampler:z\",\n \"sampler:w\",\n \"include\",\n \"text\",\n ];\n }\n\n init() {\n return (this.sourceSpec = [{ to: \"operator.source\", trait: \"text\" }]);\n }\n\n textShader(shader) {\n return this.bind.source.textShader(shader);\n }\n\n textIsSDF() {\n return (\n (this.bind.source != null ? this.bind.source.props.sdf : undefined) > 0\n );\n }\n textHeight() {\n return this.bind.source != null ? this.bind.source.props.detail : undefined;\n }\n}\nRetext.initClass();\n","export * from \"./text.js\";\nexport * from \"./format.js\";\nexport * from \"./label.js\";\nexport * from \"./retext.js\";\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Parent } from \"../base/parent.js\";\n\nexport class Clock extends Parent {\n static initClass() {\n this.traits = [\"node\", \"clock\", \"seek\", \"play\"];\n }\n\n init() {\n this.skew = 0;\n this.last = 0;\n return (this.time = {\n now: +new Date() / 1000,\n time: 0,\n delta: 0,\n clock: 0,\n step: 0,\n });\n }\n\n make() {\n // Listen to parent clock\n return this._listen(\"clock\", \"clock.tick\", this.tick);\n }\n\n reset() {\n return (this.skew = 0);\n }\n\n tick(e) {\n const { from, to, speed, seek, pace, delay, realtime } = this.props;\n\n const parent = this._inherit(\"clock\").getTime();\n\n const time = realtime ? parent.time : parent.clock;\n const delta = realtime ? parent.delta : parent.step;\n const ratio = speed / pace;\n\n this.skew += delta * (ratio - 1);\n if (this.last > time) {\n this.skew = 0;\n }\n\n this.time.now = parent.now + this.skew;\n\n this.time.time = parent.time;\n this.time.delta = parent.delta;\n\n const clock = seek != null ? seek : parent.clock + this.skew;\n this.time.clock = Math.min(to, from + Math.max(0, clock - delay * ratio));\n this.time.step = delta * ratio;\n\n this.last = time;\n\n return this.trigger(e);\n }\n\n getTime() {\n return this.time;\n }\n}\nClock.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Parent } from \"../base/parent.js\";\n\nexport class Now extends Parent {\n static initClass() {\n this.traits = [\"node\", \"clock\", \"now\"];\n }\n\n init() {\n let now;\n this.now = now = +new Date() / 1000;\n this.skew = 0;\n return (this.time = {\n now,\n time: 0,\n delta: 0,\n clock: 0,\n step: 0,\n });\n }\n\n make() {\n // Listen to parent clock\n this.clockParent = this._inherit(\"clock\");\n return this._listen(\"clock\", \"clock.tick\", this.tick);\n }\n\n unmake() {\n return (this.clockParent = null);\n }\n\n change(changed, _touched, _init) {\n if (changed[\"date.now\"]) {\n return (this.skew = 0);\n }\n }\n\n tick(e) {\n const { seek, pace, speed } = this.props;\n\n const parent = this.clockParent.getTime();\n\n this.skew += (parent.step * pace) / speed;\n if (seek != null) {\n this.skew = seek;\n }\n\n this.time.now =\n this.time.time =\n this.time.clock =\n (this.props.now != null ? this.props.now : this.now) + this.skew;\n this.time.delta = this.time.step = parent.delta;\n\n return this.trigger(e);\n }\n\n getTime() {\n return this.time;\n }\n}\nNow.initClass();\n","export * from \"./clock.js\";\nexport * from \"./now.js\";\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining\n * DS104: Avoid inline assignments\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Parent } from \"../base/parent.js\";\n\nexport class Transform extends Parent {\n static initClass() {\n this.traits = [\"node\", \"vertex\", \"fragment\"];\n }\n\n vertex(shader, pass) {\n let left;\n return (left = __guard__(this._inherit(\"vertex\"), (x) =>\n x.vertex(shader, pass)\n )) != null\n ? left\n : shader;\n }\n\n fragment(shader, pass) {\n let left;\n return (left = __guard__(this._inherit(\"fragment\"), (x) =>\n x.fragment(shader, pass)\n )) != null\n ? left\n : shader;\n }\n}\nTransform.initClass();\n\nfunction __guard__(value, xform) {\n return typeof value !== \"undefined\" && value !== null\n ? xform(value)\n : undefined;\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UThree from \"../../../util/three.js\";\nimport { Transform } from \"./transform.js\";\n\nexport class Transform3 extends Transform {\n static initClass() {\n this.traits = [\"node\", \"vertex\", \"transform3\"];\n }\n\n make() {\n this.uniforms = {\n transformMatrix: this._attributes.make(this._types.mat4()),\n };\n\n return (this.composer = UThree.transformComposer());\n }\n\n unmake() {\n return delete this.uniforms;\n }\n\n change(changed, touched, init) {\n if (changed[\"transform3.pass\"]) {\n return this.rebuild();\n }\n if (!touched[\"transform3\"] && !init) {\n return;\n }\n\n const p = this.props.position;\n const q = this.props.quaternion;\n const r = this.props.rotation;\n const s = this.props.scale;\n const m = this.props.matrix;\n const e = this.props.eulerOrder;\n\n return (this.uniforms.transformMatrix.value = this.composer(\n p,\n r,\n q,\n s,\n m,\n e\n ));\n }\n\n vertex(shader, pass) {\n if (pass === this.props.pass) {\n shader.pipe(\"transform3.position\", this.uniforms);\n }\n return super.vertex(shader, pass);\n }\n}\nTransform3.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Transform } from \"./transform.js\";\n\nexport class Transform4 extends Transform {\n static initClass() {\n this.traits = [\"node\", \"vertex\", \"transform4\"];\n }\n\n make() {\n this.uniforms = {\n transformMatrix: this._attributes.make(this._types.mat4()),\n transformOffset: this.node.attributes[\"transform4.position\"],\n };\n\n return (this.transformMatrix = this.uniforms.transformMatrix.value);\n }\n\n unmake() {\n return delete this.uniforms;\n }\n\n change(changed, touched, init) {\n if (changed[\"transform4.pass\"]) {\n return this.rebuild();\n }\n if (!touched[\"transform4\"] && !init) {\n return;\n }\n\n const s = this.props.scale;\n const m = this.props.matrix;\n\n const t = this.transformMatrix;\n t.copy(m);\n return t.scale(s);\n }\n\n vertex(shader, pass) {\n if (pass === this.props.pass) {\n shader.pipe(\"transform4.position\", this.uniforms);\n }\n return super.vertex(shader, pass);\n }\n}\nTransform4.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Transform } from \"./transform.js\";\n\nexport class Vertex extends Transform {\n static initClass() {\n this.traits = [\"node\", \"include\", \"vertex\", \"bind\"];\n }\n\n make() {\n // Bind to attached shader\n return this._helpers.bind.make([\n { to: \"include.shader\", trait: \"shader\", optional: true },\n ]);\n }\n\n unmake() {\n return this._helpers.bind.unmake();\n }\n\n change(changed, touched, _init) {\n if (touched[\"include\"]) {\n return this.rebuild();\n }\n }\n\n vertex(shader, pass) {\n if (this.bind.shader != null) {\n if (pass === this.props.pass) {\n shader.pipe(this.bind.shader.shaderBind());\n }\n }\n return super.vertex(shader, pass);\n }\n}\nVertex.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Transform } from \"./transform.js\";\n\nexport class Fragment extends Transform {\n static initClass() {\n this.traits = [\"node\", \"include\", \"fragment\", \"bind\"];\n }\n\n make() {\n // Bind to attached shader\n return this._helpers.bind.make([\n { to: \"include.shader\", trait: \"shader\", optional: true },\n ]);\n }\n\n unmake() {\n return this._helpers.bind.unmake();\n }\n\n change(changed, touched, _init) {\n if (touched[\"include\"] || changed[\"fragment.gamma\"]) {\n return this.rebuild();\n }\n }\n\n fragment(shader, pass) {\n if (this.bind.shader != null) {\n if (pass === this.props.pass) {\n if (this.props.gamma) {\n shader.pipe(\"mesh.gamma.out\");\n }\n shader.pipe(this.bind.shader.shaderBind());\n shader.split();\n if (this.props.gamma) {\n shader.pipe(\"mesh.gamma.in\");\n }\n shader.pass();\n }\n }\n return super.fragment(shader, pass);\n }\n}\nFragment.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Transform } from \"./transform.js\";\n\nexport class Layer extends Transform {\n static initClass() {\n this.traits = [\"node\", \"vertex\", \"layer\"];\n }\n\n make() {\n this._listen(\"root\", \"root.resize\", this.update);\n\n return (this.uniforms = {\n layerScale: this._attributes.make(this._types.vec4()),\n layerBias: this._attributes.make(this._types.vec4()),\n });\n }\n\n update() {\n const camera = this._inherit(\"root\").getCamera();\n\n const aspect = camera.aspect != null ? camera.aspect : 1;\n const fov = camera.fov != null ? camera.fov : 1;\n\n const pitch = Math.tan((fov * Math.PI) / 360);\n\n const _enum = this.node.attributes[\"layer.fit\"].enum;\n\n let { fit, depth } = this.props;\n\n // Convert contain/cover into x/y\n switch (fit) {\n case _enum.contain:\n fit = aspect > 1 ? _enum.y : _enum.x;\n break;\n case _enum.cover:\n fit = aspect > 1 ? _enum.x : _enum.y;\n break;\n }\n\n // Fit x/y\n switch (fit) {\n case _enum.x:\n this.uniforms.layerScale.value.set(pitch * aspect, pitch * aspect);\n break;\n case _enum.y:\n this.uniforms.layerScale.value.set(pitch, pitch);\n break;\n }\n\n return this.uniforms.layerBias.value.set(0, 0, -depth, 0);\n }\n\n change(changed, touched, init) {\n if (changed[\"layer.fit\"] || changed[\"layer.depth\"] || init) {\n return this.update();\n }\n }\n\n // End transform chain here without applying camera view\n vertex(shader, pass) {\n if (pass === 2) {\n return shader.pipe(\"layer.position\", this.uniforms);\n }\n if (pass === 3) {\n return shader.pipe(\"root.position\");\n }\n return shader;\n }\n}\nLayer.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining\n * DS104: Avoid inline assignments\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UGLSL from \"../../../util/glsl.js\";\nimport { Parent } from \"../base/parent.js\";\n\nexport class Mask extends Parent {\n static initClass() {\n this.traits = [\"node\", \"include\", \"mask\", \"bind\"];\n }\n\n make() {\n // Bind to attached shader\n return this._helpers.bind.make([\n { to: \"include.shader\", trait: \"shader\", optional: true },\n ]);\n }\n\n unmake() {\n return this._helpers.bind.unmake();\n }\n\n change(changed, touched, _init) {\n if (touched[\"include\"]) {\n return this.rebuild();\n }\n }\n\n mask(shader) {\n let left, s;\n if (this.bind.shader != null) {\n if (shader) {\n s = this._shaders.shader();\n s.pipe(UGLSL.identity(\"vec4\"));\n s.fan();\n s.pipe(shader);\n s.next();\n s.pipe(this.bind.shader.shaderBind());\n s.end();\n s.pipe(\"float combine(float a, float b) { return min(a, b); }\");\n } else {\n s = this._shaders.shader();\n s.pipe(this.bind.shader.shaderBind());\n }\n } else {\n s = shader;\n }\n\n return (left = __guard__(this._inherit(\"mask\"), (x) => x.mask(s))) != null\n ? left\n : s;\n }\n}\nMask.initClass();\n\nfunction __guard__(value, transform) {\n return typeof value !== \"undefined\" && value !== null\n ? transform(value)\n : undefined;\n}\n","export * from \"./transform.js\";\nexport * from \"./transform3.js\";\nexport * from \"./transform4.js\";\nexport * from \"./vertex.js\";\nexport * from \"./fragment.js\";\nexport * from \"./layer.js\";\nexport * from \"./mask.js\";\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Operator } from \"./operator.js\";\n\nexport class Clamp extends Operator {\n static initClass() {\n this.traits = [\"node\", \"bind\", \"operator\", \"source\", \"index\", \"clamp\"];\n }\n\n indexShader(shader) {\n shader.pipe(this.operator);\n return super.indexShader(shader);\n }\n\n sourceShader(shader) {\n shader.pipe(this.operator);\n return super.sourceShader(shader);\n }\n\n make() {\n super.make();\n if (this.bind.source == null) {\n return;\n }\n\n // Max index on all 4 dimensions\n const uniforms = { clampLimit: this._attributes.make(this._types.vec4()) };\n this.clampLimit = uniforms.clampLimit;\n\n // Build shader to clamp along all dimensions\n const transform = this._shaders.shader();\n transform.pipe(\"clamp.position\", uniforms);\n return (this.operator = transform);\n }\n\n unmake() {\n return super.unmake();\n }\n\n resize() {\n if (this.bind.source != null) {\n const dims = this.bind.source.getActiveDimensions();\n this.clampLimit.value.set(\n dims.width - 1,\n dims.height - 1,\n dims.depth - 1,\n dims.items - 1\n );\n }\n\n return super.resize();\n }\n\n change(changed, touched, _init) {\n if (touched[\"operator\"] || touched[\"clamp\"]) {\n return this.rebuild();\n }\n }\n}\nClamp.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Operator } from \"./operator.js\";\n\nexport class Grow extends Operator {\n static initClass() {\n this.traits = [\"node\", \"bind\", \"operator\", \"source\", \"index\", \"grow\"];\n }\n\n sourceShader(shader) {\n return shader.pipe(this.operator);\n }\n\n make() {\n super.make();\n if (this.bind.source == null) {\n return;\n }\n\n // Uniforms\n const uniforms = {\n growScale: this.node.attributes[\"grow.scale\"],\n growMask: this._attributes.make(this._types.vec4()),\n growAnchor: this._attributes.make(this._types.vec4()),\n };\n\n this.growMask = uniforms.growMask.value;\n this.growAnchor = uniforms.growAnchor.value;\n\n // Build shader to spread data on one dimension\n const transform = this._shaders.shader();\n transform.require(this.bind.source.sourceShader(this._shaders.shader()));\n transform.pipe(\"grow.position\", uniforms);\n\n return (this.operator = transform);\n }\n\n unmake() {\n return super.unmake();\n }\n\n resize() {\n this.update();\n return super.resize();\n }\n\n update() {\n // Size to fit to include future history\n const dims = this.bind.source.getFutureDimensions();\n\n const order = [\"width\", \"height\", \"depth\", \"items\"];\n\n const m = (d, anchor) => ((d || 1) - 1) * (0.5 - anchor * 0.5);\n\n return (() => {\n const result = [];\n for (let i = 0; i < order.length; i++) {\n const key = order[i];\n const anchor = this.props[key];\n\n this.growMask.setComponent(i, +(anchor == null));\n result.push(\n this.growAnchor.setComponent(\n i,\n anchor != null ? m(dims[key], anchor) : 0\n )\n );\n }\n return result;\n })();\n }\n\n change(changed, touched, _init) {\n if (touched[\"operator\"]) {\n return this.rebuild();\n }\n\n if (touched[\"grow\"]) {\n return this.update();\n }\n }\n}\nGrow.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UGLSL from \"../../../util/glsl.js\";\nimport { Operator } from \"./operator.js\";\n\n/*\nsplit:\n order: Types.transpose('wxyz')\n axis: Types.axis()\n overlap: Types.int(0)\n*/\n\nexport class Join extends Operator {\n static initClass() {\n this.traits = [\"node\", \"bind\", \"operator\", \"source\", \"index\", \"join\"];\n }\n\n indexShader(shader) {\n shader.pipe(this.operator);\n return super.indexShader(shader);\n }\n\n sourceShader(shader) {\n shader.pipe(this.operator);\n return super.sourceShader(shader);\n }\n\n getDimensions() {\n return this._resample(this.bind.source.getDimensions());\n }\n getActiveDimensions() {\n return this._resample(this.bind.source.getActiveDimensions());\n }\n getFutureDimensions() {\n return this._resample(this.bind.source.getFutureDimensions());\n }\n getIndexDimensions() {\n return this._resample(this.bind.source.getIndexDimensions());\n }\n\n _resample(dims) {\n let left;\n let dim;\n const { order, axis, stride } = this;\n\n const labels = [\"width\", \"height\", \"depth\", \"items\"];\n const mapped = order.map((x) => labels[x - 1]);\n const index = order.indexOf(axis);\n let set = (() => {\n const result = [];\n for (dim of Array.from(mapped)) {\n result.push(dims[dim]);\n }\n return result;\n })();\n const product = ((left = set[index + 1]) != null ? left : 1) * stride;\n\n set.splice(index, 2, product);\n set = set.slice(0, 3);\n set.push(1);\n\n const out = {};\n for (let i = 0; i < mapped.length; i++) {\n dim = mapped[i];\n out[dim] = set[i];\n }\n\n //console.log 'join', order, axis, length, stride\n //console.log dims, out\n\n return out;\n }\n\n make() {\n super.make();\n if (this.bind.source == null) {\n return;\n }\n\n const { order } = this.props;\n let { axis } = this.props;\n let { overlap } = this.props;\n\n /*\n Calculate index transform\n\n order: wxyz\n length: 3\n overlap: 1\n\n axis: w\n index: 0\n rest: 00xy\n\n axis: x\n index: 1\n rest: w00y\n\n axis: y\n index: 2\n rest: wx00\n\n axis: z\n index: 3\n rest: wxy0\n\n */\n\n const permute = order.join(\"\");\n if (axis == null) {\n axis = order[0];\n }\n const index = permute.indexOf(axis);\n const rest = permute.replace(axis, \"00\").substring(0, 4);\n\n const labels = [null, \"width\", \"height\", \"depth\", \"items\"];\n const major = labels[axis];\n\n // Prepare uniforms\n const dims = this.bind.source.getDimensions();\n const length = dims[major];\n\n overlap = Math.min(length - 1, overlap);\n const stride = length - overlap;\n\n const uniforms = {\n joinStride: this._attributes.make(this._types.number(stride)),\n joinStrideInv: this._attributes.make(this._types.number(1 / stride)),\n };\n\n // Build shader to split a dimension into two\n const transform = this._shaders.shader();\n transform.require(UGLSL.swizzleVec4(axis, 1));\n transform.require(UGLSL.swizzleVec4(rest, 4));\n transform.require(UGLSL.injectVec4([index, index + 1]));\n transform.pipe(\"join.position\", uniforms);\n transform.pipe(UGLSL.invertSwizzleVec4(order));\n\n this.operator = transform;\n\n this.order = order;\n this.axis = axis;\n this.overlap = overlap;\n this.length = length;\n return (this.stride = stride);\n }\n\n unmake() {\n return super.unmake();\n }\n\n change(changed, touched, _init) {\n if (touched[\"join\"] || touched[\"operator\"]) {\n return this.rebuild();\n }\n }\n}\nJoin.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UGLSL from \"../../../util/glsl.js\";\nimport { Operator } from \"./operator.js\";\n\nexport class Lerp extends Operator {\n static initClass() {\n this.traits = [\n \"node\",\n \"bind\",\n \"operator\",\n \"source\",\n \"index\",\n \"lerp\",\n \"sampler:x\",\n \"sampler:y\",\n \"sampler:z\",\n \"sampler:w\",\n ];\n }\n\n indexShader(shader) {\n shader.pipe(this.indexer);\n return super.indexShader(shader);\n }\n\n sourceShader(shader) {\n return shader.pipe(this.operator);\n }\n\n getDimensions() {\n return this._resample(this.bind.source.getDimensions());\n }\n getActiveDimensions() {\n return this._resample(this.bind.source.getActiveDimensions());\n }\n getFutureDimensions() {\n return this._resample(this.bind.source.getFutureDimensions());\n }\n getIndexDimensions() {\n return this._resample(this.bind.source.getIndexDimensions());\n }\n\n _resample(dims) {\n const r = this.resampled;\n const c = this.centered;\n const p = this.padding;\n\n if (this.relativeSize) {\n if (!c.items) {\n dims.items--;\n }\n if (!c.width) {\n dims.width--;\n }\n if (!c.height) {\n dims.height--;\n }\n if (!c.depth) {\n dims.depth--;\n }\n\n if (r.items != null) {\n dims.items *= r.items;\n }\n if (r.width != null) {\n dims.width *= r.width;\n }\n if (r.height != null) {\n dims.height *= r.height;\n }\n if (r.depth != null) {\n dims.depth *= r.depth;\n }\n\n if (!c.items) {\n dims.items++;\n }\n if (!c.width) {\n dims.width++;\n }\n if (!c.height) {\n dims.height++;\n }\n if (!c.depth) {\n dims.depth++;\n }\n\n dims.items -= p.items * 2;\n dims.width -= p.width * 2;\n dims.height -= p.height * 2;\n dims.depth -= p.depth * 2;\n } else {\n if (r.items != null) {\n dims.items = r.items;\n }\n if (r.width != null) {\n dims.width = r.width;\n }\n if (r.height != null) {\n dims.height = r.height;\n }\n if (r.depth != null) {\n dims.depth = r.depth;\n }\n }\n\n dims.items = Math.max(0, Math.floor(dims.items));\n dims.width = Math.max(0, Math.floor(dims.width));\n dims.height = Math.max(0, Math.floor(dims.height));\n dims.depth = Math.max(0, Math.floor(dims.depth));\n\n return dims;\n }\n\n make() {\n let i, key;\n super.make();\n if (this.bind.source == null) {\n return;\n }\n\n // Get resampled dimensions\n const { size, items, width, height, depth } = this.props;\n\n // Sampler behavior\n const relativeSize =\n size === this.node.attributes[\"lerp.size\"].enum.relative;\n\n this.resampled = {};\n if (items != null) {\n this.resampled.items = items;\n }\n if (width != null) {\n this.resampled.width = width;\n }\n if (height != null) {\n this.resampled.height = height;\n }\n if (depth != null) {\n this.resampled.depth = depth;\n }\n\n this.centered = {};\n this.centered.items = this.props.centeredW;\n this.centered.width = this.props.centeredX;\n this.centered.height = this.props.centeredY;\n this.centered.depth = this.props.centeredZ;\n\n this.padding = {};\n this.padding.items = this.props.paddingW;\n this.padding.width = this.props.paddingX;\n this.padding.height = this.props.paddingY;\n this.padding.depth = this.props.paddingZ;\n\n // Build shader to resample data\n const operator = this._shaders.shader();\n const indexer = this._shaders.shader();\n\n // Uniforms\n const uniforms = {\n resampleFactor: this._attributes.make(this._types.vec4(0, 0, 0, 0)),\n resampleBias: this._attributes.make(this._types.vec4(0, 0, 0, 0)),\n };\n\n this.resampleFactor = uniforms.resampleFactor;\n this.resampleBias = uniforms.resampleBias;\n\n // Has resize props?\n const resize =\n items != null || width != null || height != null || depth != null;\n\n // Add padding\n operator.pipe(\"resample.padding\", uniforms);\n\n // Prepare centered sampling offset\n let vec = [];\n let any = false;\n const iterable = [\"width\", \"height\", \"depth\", \"items\"];\n for (i = 0; i < iterable.length; i++) {\n key = iterable[i];\n const centered = this.centered[key];\n if (!any) {\n any = centered;\n }\n vec[i] = centered ? \"0.5\" : \"0.0\";\n }\n\n // Add centered sampling offset (from source)\n if (any && resize) {\n vec = `vec4(${vec})`;\n // TODO is this right? it was vec4 before.\n operator.pipe(UGLSL.binaryOperator(4, \"+\", vec));\n indexer.pipe(UGLSL.binaryOperator(4, \"+\", vec));\n }\n\n // Addressing relative to target\n if (resize) {\n operator.pipe(\"resample.relative\", uniforms);\n indexer.pipe(\"resample.relative\", uniforms);\n } else {\n operator.pipe(UGLSL.identity(\"vec4\"));\n indexer.pipe(UGLSL.identity(\"vec4\"));\n }\n\n // Remove centered sampling offset (to target)\n if (any && resize) {\n operator.pipe(UGLSL.binaryOperator(4, \"-\", vec));\n indexer.pipe(UGLSL.binaryOperator(4, \"-\", vec));\n }\n\n // Make sampler\n let sampler = this.bind.source.sourceShader(this._shaders.shader());\n\n // Iterate over dimensions (items, width, height, depth)\n const iterable1 = [\"width\", \"height\", \"depth\", \"items\"];\n for (i = 0; i < iterable1.length; i++) {\n key = iterable1[i];\n const id = `lerp.${key}`;\n\n if (this.props[key] != null) {\n sampler = this._shaders.shader().require(sampler);\n sampler.pipe(id, uniforms);\n }\n }\n\n // Combine operator and composite lerp sampler\n operator.pipe(sampler);\n\n this.operator = operator;\n this.indexer = indexer;\n\n return (this.relativeSize = relativeSize);\n }\n\n unmake() {\n super.unmake();\n return (this.operator = null);\n }\n\n resize() {\n if (this.bind.source == null) {\n return;\n }\n\n const dims = this.bind.source.getActiveDimensions();\n const target = this.getActiveDimensions();\n\n const axis = (key) => {\n const centered = this.centered[key];\n const pad = this.padding[key];\n\n target[key] += pad * 2;\n\n const res = centered\n ? dims[key] / Math.max(1, target[key])\n : Math.max(1, dims[key] - 1) / Math.max(1, target[key] - 1);\n return [res, pad];\n };\n\n const [rw, bw] = Array.from(axis(\"width\"));\n const [rh, bh] = Array.from(axis(\"height\"));\n const [rd, bd] = Array.from(axis(\"depth\"));\n const [ri, bi] = Array.from(axis(\"items\"));\n\n this.resampleFactor.value.set(rw, rh, rd, ri);\n this.resampleBias.value.set(bw, bh, bd, bi);\n\n return super.resize();\n }\n\n change(changed, touched, _init) {\n if (touched[\"operator\"] || touched[\"lerp\"] || touched[\"sampler\"]) {\n return this.rebuild();\n }\n }\n}\nLerp.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Operator } from \"./operator\";\n\nexport class Memo extends Operator {\n static initClass() {\n this.traits = [\n \"node\",\n \"bind\",\n \"active\",\n \"operator\",\n \"source\",\n \"index\",\n \"texture\",\n \"memo\",\n ];\n }\n\n sourceShader(shader) {\n return this.memo.shaderAbsolute(shader, 1);\n }\n\n make() {\n super.make();\n if (this.bind.source == null) {\n return;\n }\n\n // Listen for updates\n this._helpers.active.make();\n this._listen(\"root\", \"root.update\", () => {\n if (this.isActive) {\n return this.update();\n }\n });\n\n // Read sampling parameters\n const { minFilter, magFilter, type } = this.props;\n\n // Fetch geometry dimensions\n const dims = this.bind.source.getDimensions();\n const { items, width, height, depth } = dims;\n\n // Prepare memoization RTT\n this.memo = this._renderables.make(\"memo\", {\n items,\n width,\n height,\n depth,\n minFilter,\n magFilter,\n type,\n });\n\n // Build shader to remap data (do it after RTT creation to allow feedback)\n const operator = this._shaders.shader();\n this.bind.source.sourceShader(operator);\n\n // Make screen renderable inside RTT scene\n this.compose = this._renderables.make(\"memoScreen\", {\n map: operator,\n items,\n width,\n height,\n depth,\n });\n this.memo.adopt(this.compose);\n\n this.objects = [this.compose];\n return (this.renders = this.compose.renders);\n }\n\n unmake() {\n super.unmake();\n\n if (this.bind.source != null) {\n this._helpers.active.unmake();\n\n this.memo.unadopt(this.compose);\n this.memo.dispose();\n\n return (this.memo = this.compose = null);\n }\n }\n\n update() {\n return this.memo != null ? this.memo.render() : undefined;\n }\n\n resize() {\n if (this.bind.source == null) {\n return;\n }\n\n // Fetch geometry dimensions\n const dims = this.bind.source.getActiveDimensions();\n const { width, height, depth } = dims;\n\n // Cover only part of the RTT viewport\n this.compose.cover(width, height, depth);\n\n return super.resize();\n }\n\n change(changed, touched, _init) {\n if (touched[\"texture\"] || touched[\"operator\"]) {\n return this.rebuild();\n }\n }\n}\nMemo.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Primitive } from \"../../primitive.js\";\n\nexport class Readback extends Primitive {\n static initClass() {\n this.traits = [\"node\", \"bind\", \"operator\", \"readback\", \"entity\", \"active\"];\n this.finals = { channels: 4 };\n }\n\n init() {\n this.emitter = this.root = null;\n return (this.active = {});\n }\n\n make() {\n super.make();\n\n this._compute(\"readback.data\", () =>\n this.readback != null ? this.readback.data : undefined\n );\n this._compute(\"readback.items\", () =>\n this.readback != null ? this.readback.items : undefined\n );\n this._compute(\"readback.width\", () =>\n this.readback != null ? this.readback.width : undefined\n );\n this._compute(\"readback.height\", () =>\n this.readback != null ? this.readback.height : undefined\n );\n this._compute(\"readback.depth\", () =>\n this.readback != null ? this.readback.depth : undefined\n );\n\n // Bind to attached objects\n this._helpers.bind.make([{ to: \"operator.source\", trait: \"source\" }]);\n\n if (this.bind.source == null) {\n return;\n }\n\n // Sampler props\n const { type, channels, expr } = this.props;\n\n // Listen for updates\n this.root = this._inherit(\"root\");\n this._listen(\"root\", \"root.update\", this.update);\n\n // Fetch source dimensions\n const { items, width, height, depth } = this.bind.source.getDimensions();\n\n // Build shader to sample source data\n const sampler = this.bind.source.sourceShader(this._shaders.shader());\n\n // Prepare readback/memo RTT\n this.readback = this._renderables.make(\"readback\", {\n map: sampler,\n items,\n width,\n height,\n depth,\n channels,\n type,\n });\n\n // Prepare readback consumer\n if (expr != null) {\n this.readback.setCallback(expr);\n }\n\n this._helpers.active.make();\n }\n\n unmake() {\n if (this.readback != null) {\n this.readback.dispose();\n this.readback = null;\n\n this.root = null;\n this.emitter = null;\n this.active = {};\n }\n\n this._helpers.active.unmake();\n return this._helpers.bind.unmake();\n }\n\n update() {\n if (this.readback == null) {\n return;\n }\n if (this.isActive) {\n this.readback.update(\n this.root != null ? this.root.getCamera() : undefined\n );\n this.readback.post();\n if (this.props.expr != null) {\n this.readback.iterate();\n }\n }\n }\n\n resize() {\n let sI, sJ;\n if (this.readback == null) {\n return;\n }\n\n // Fetch geometry/html dimensions\n const { items, width, height, depth } =\n this.bind.source.getActiveDimensions();\n\n // Limit readback to active area\n this.readback.setActive(items, width, height, depth);\n\n // Recalculate iteration strides\n this.strideI = sI = items;\n this.strideJ = sJ = sI * width;\n return (this.strideK = sJ * height);\n }\n\n change(changed, _touched, _init) {\n if (changed[\"readback.type\"]) {\n return this.rebuild();\n }\n\n if (changed[\"readback.expr\"] && this.readback) {\n return this.readback.setCallback(this.props.expr);\n }\n }\n}\nReadback.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Operator } from \"./operator.js\";\n\nexport class Repeat extends Operator {\n static initClass() {\n this.traits = [\"node\", \"bind\", \"operator\", \"source\", \"index\", \"repeat\"];\n }\n\n indexShader(shader) {\n shader.pipe(this.operator);\n return super.indexShader(shader);\n }\n\n sourceShader(shader) {\n shader.pipe(this.operator);\n return super.sourceShader(shader);\n }\n\n getDimensions() {\n return this._resample(this.bind.source.getDimensions());\n }\n getActiveDimensions() {\n return this._resample(this.bind.source.getActiveDimensions());\n }\n getFutureDimensions() {\n return this._resample(this.bind.source.getFutureDimensions());\n }\n getIndexDimensions() {\n return this._resample(this.bind.source.getIndexDimensions());\n }\n\n _resample(dims) {\n const r = this.resample;\n return {\n items: r.items * dims.items,\n width: r.width * dims.width,\n height: r.height * dims.height,\n depth: r.depth * dims.depth,\n };\n }\n\n make() {\n super.make();\n if (this.bind.source == null) {\n return;\n }\n\n // Repeat multipliers\n this.resample = {};\n\n // Modulus on all 4 dimensions\n const uniforms = {\n repeatModulus: this._attributes.make(this._types.vec4()),\n };\n this.repeatModulus = uniforms.repeatModulus;\n\n // Build shader to repeat along all dimensions\n const transform = this._shaders.shader();\n transform.pipe(\"repeat.position\", uniforms);\n return (this.operator = transform);\n }\n\n unmake() {\n return super.unmake();\n }\n\n resize() {\n if (this.bind.source != null) {\n const dims = this.bind.source.getActiveDimensions();\n this.repeatModulus.value.set(\n dims.width,\n dims.height,\n dims.depth,\n dims.items\n );\n }\n\n return super.resize();\n }\n\n change(changed, touched, init) {\n if (touched[\"operator\"] || touched[\"repeat\"]) {\n return this.rebuild();\n }\n\n if (init) {\n return [\"items\", \"width\", \"height\", \"depth\"].map(\n (key) => (this.resample[key] = this.props[key])\n );\n }\n }\n}\nRepeat.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UGLSL from \"../../../util/glsl.js\";\nimport { Operator } from \"./operator.js\";\n\nexport class Swizzle extends Operator {\n static initClass() {\n this.traits = [\"node\", \"bind\", \"operator\", \"source\", \"index\", \"swizzle\"];\n }\n\n sourceShader(shader) {\n shader = super.sourceShader(shader);\n if (this.swizzler) {\n shader.pipe(this.swizzler);\n }\n return shader;\n }\n\n make() {\n super.make();\n if (this.bind.source == null) {\n return;\n }\n\n // Swizzling order\n const { order } = this.props;\n if (order.join() !== \"1234\") {\n return (this.swizzler = UGLSL.swizzleVec4(order, 4));\n }\n }\n\n unmake() {\n super.unmake();\n return (this.swizzler = null);\n }\n\n change(changed, touched, _init) {\n if (touched[\"swizzle\"] || touched[\"operator\"]) {\n return this.rebuild();\n }\n }\n}\nSwizzle.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Operator } from \"./operator.js\";\n\nexport class Spread extends Operator {\n static initClass() {\n this.traits = [\"node\", \"bind\", \"operator\", \"source\", \"index\", \"spread\"];\n }\n\n sourceShader(shader) {\n return shader.pipe(this.operator);\n }\n\n make() {\n super.make();\n if (this.bind.source == null) {\n return;\n }\n\n // Uniforms\n const uniforms = {\n spreadMatrix: this._attributes.make(this._types.mat4()),\n spreadOffset: this._attributes.make(this._types.vec4()),\n };\n\n this.spreadMatrix = uniforms.spreadMatrix;\n this.spreadOffset = uniforms.spreadOffset;\n\n // Build shader to spread data on one dimension\n const transform = this._shaders.shader();\n transform.require(this.bind.source.sourceShader(this._shaders.shader()));\n transform.pipe(\"spread.position\", uniforms);\n\n return (this.operator = transform);\n }\n\n unmake() {\n return super.unmake();\n }\n\n resize() {\n this.update();\n return super.resize();\n }\n\n update() {\n // Size to fit to include future history\n let key, i, k, v;\n const dims = this.bind.source.getFutureDimensions();\n\n const matrix = this.spreadMatrix.value;\n const els = matrix.elements;\n\n const order = [\"width\", \"height\", \"depth\", \"items\"];\n const align = [\"alignWidth\", \"alignHeight\", \"alignDepth\", \"alignItems\"];\n\n const { unit } = this.props;\n const unitEnum = this.node.attributes[\"spread.unit\"].enum;\n\n const map = (() => {\n switch (unit) {\n case unitEnum.relative:\n return (key, i, k, v) =>\n (els[i * 4 + k] = v / Math.max(1, dims[key] - 1));\n case unitEnum.absolute:\n return (key, i, k, v) => (els[i * 4 + k] = v);\n }\n })();\n\n return (() => {\n const result = [];\n for (i = 0; i < order.length; i++) {\n var offset;\n key = order[i];\n var spread = this.props[key];\n const anchor = this.props[align[i]];\n\n if (spread != null) {\n const d = dims[key] != null ? dims[key] : 1;\n offset = -(d - 1) * (0.5 - anchor * 0.5);\n } else {\n offset = 0;\n }\n this.spreadOffset.value.setComponent(i, offset);\n\n result.push(\n (() => {\n const result1 = [];\n for (k = 0; k <= 3; k++) {\n var left;\n v =\n (left = spread != null ? spread.getComponent(k) : undefined) !=\n null\n ? left\n : 0;\n result1.push((els[i * 4 + k] = map(key, i, k, v)));\n }\n return result1;\n })()\n );\n }\n return result;\n })();\n }\n\n change(changed, touched, _init) {\n if (touched[\"operator\"]) {\n return this.rebuild();\n }\n\n if (touched[\"spread\"]) {\n return this.update();\n }\n }\n}\nSpread.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UGLSL from \"../../../util/glsl.js\";\nimport { Operator } from \"./operator.js\";\n\n/*\nsplit:\n order: Types.transpose('wxyz')\n axis: Types.axis()\n length: Types.int(1)\n overlap: Types.int(0)\n*/\n\nexport class Split extends Operator {\n static initClass() {\n this.traits = [\"node\", \"bind\", \"operator\", \"source\", \"index\", \"split\"];\n }\n\n indexShader(shader) {\n shader.pipe(this.operator);\n return super.indexShader(shader);\n }\n\n sourceShader(shader) {\n shader.pipe(this.operator);\n return super.sourceShader(shader);\n }\n\n getDimensions() {\n return this._resample(this.bind.source.getDimensions());\n }\n getActiveDimensions() {\n return this._resample(this.bind.source.getActiveDimensions());\n }\n getFutureDimensions() {\n return this._resample(this.bind.source.getFutureDimensions());\n }\n getIndexDimensions() {\n return this._resample(this.bind.source.getIndexDimensions());\n }\n\n _resample(dims) {\n let dim;\n const { order } = this;\n const { axis } = this;\n const { overlap } = this;\n const { length } = this;\n const { stride } = this;\n\n const labels = [\"width\", \"height\", \"depth\", \"items\"];\n const mapped = order.map((x) => labels[x - 1]);\n const index = order.indexOf(axis);\n let set = (() => {\n const result = [];\n for (dim of Array.from(mapped)) {\n result.push(dims[dim]);\n }\n return result;\n })();\n const remain = Math.floor((set[index] - overlap) / stride);\n\n set.splice(index, 1, length, remain);\n set = set.slice(0, 4);\n\n const out = {};\n for (let i = 0; i < mapped.length; i++) {\n dim = mapped[i];\n out[dim] = set[i];\n }\n\n //console.log 'split', order, axis, length, stride\n //console.log dims, out\n\n return out;\n }\n\n make() {\n let left;\n super.make();\n if (this.bind.source == null) {\n return;\n }\n\n const { order } = this.props;\n let { axis } = this.props;\n let { overlap } = this.props;\n const { length } = this.props;\n\n /*\n Calculate index transform\n\n order: wxyz\n length: 3\n overlap: 1\n\n axis: w\n index: 0\n split: wx\n rest: 0yz0\n s\n\n axis: x\n index: 1\n split: xy\n rest: w0z0\n s\n\n axis: y\n index: 2\n split: yz\n rest: wx00\n s\n\n axis: z\n index: 3\n split: z0\n rest: wxy0\n s\n\n */\n\n const permute = order.join(\"\");\n if (axis == null) {\n axis = order[0];\n }\n\n const index = permute.indexOf(axis);\n const split =\n permute[index] + ((left = permute[index + 1]) != null ? left : 0);\n const rest = permute.replace(split[1], \"\").replace(split[0], \"0\") + \"0\";\n\n // Prepare uniforms\n overlap = Math.min(length - 1, overlap);\n const stride = length - overlap;\n\n const uniforms = {\n splitStride: this._attributes.make(this._types.number(stride)),\n };\n\n // Build shader to split a dimension into two\n const transform = this._shaders.shader();\n transform.require(UGLSL.swizzleVec4(split, 2));\n transform.require(UGLSL.swizzleVec4(rest, 4));\n transform.require(UGLSL.injectVec4(index));\n transform.pipe(\"split.position\", uniforms);\n transform.pipe(UGLSL.invertSwizzleVec4(order));\n\n this.operator = transform;\n\n this.order = order;\n this.axis = axis;\n this.overlap = overlap;\n this.length = length;\n return (this.stride = stride);\n }\n\n unmake() {\n return super.unmake();\n }\n\n change(changed, touched, _init) {\n if (\n changed[\"split.axis\"] ||\n changed[\"split.order\"] ||\n touched[\"operator\"]\n ) {\n return this.rebuild();\n }\n }\n}\nSplit.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Operator } from \"./operator.js\";\n\nexport class Slice extends Operator {\n static initClass() {\n this.traits = [\"node\", \"bind\", \"operator\", \"source\", \"index\", \"slice\"];\n }\n\n getDimensions() {\n return this._resample(this.bind.source.getDimensions());\n }\n getActiveDimensions() {\n return this._resample(this.bind.source.getActiveDimensions());\n }\n getFutureDimensions() {\n return this._resample(this.bind.source.getFutureDimensions());\n }\n getIndexDimensions() {\n return this._resample(this.bind.source.getIndexDimensions());\n }\n\n sourceShader(shader) {\n shader.pipe(\"slice.position\", this.uniforms);\n return this.bind.source.sourceShader(shader);\n }\n\n _resolve(key, dims) {\n const range = this.props[key];\n const dim = dims[key];\n if (range == null) {\n return [0, dim];\n }\n\n const index = function (i, dim) {\n if (i < 0) {\n return dim + i;\n } else {\n return i;\n }\n };\n\n const start = index(Math.round(range.x), dim);\n let end = index(Math.round(range.y), dim);\n\n end = Math.max(start, end);\n return [start, end - start];\n }\n\n _resample(dims) {\n dims.width = this._resolve(\"width\", dims)[1];\n dims.height = this._resolve(\"height\", dims)[1];\n dims.depth = this._resolve(\"depth\", dims)[1];\n dims.items = this._resolve(\"items\", dims)[1];\n return dims;\n }\n\n make() {\n super.make();\n if (this.bind.source == null) {\n return;\n }\n\n return (this.uniforms = {\n sliceOffset: this._attributes.make(this._types.vec4()),\n });\n }\n\n unmake() {\n return super.unmake();\n }\n\n resize() {\n if (this.bind.source == null) {\n return;\n }\n\n const dims = this.bind.source.getActiveDimensions();\n\n this.uniforms.sliceOffset.value.set(\n this._resolve(\"width\", dims)[0],\n this._resolve(\"height\", dims)[0],\n this._resolve(\"depth\", dims)[0],\n this._resolve(\"items\", dims)[0]\n );\n\n return super.resize();\n }\n\n change(changed, touched, _init) {\n if (touched[\"operator\"]) {\n return this.rebuild();\n }\n\n if (touched[\"slice\"]) {\n return this.resize();\n }\n }\n}\nSlice.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UGLSL from \"../../../util/glsl.js\";\nimport { Operator } from \"./operator.js\";\n\nexport class Subdivide extends Operator {\n static initClass() {\n this.traits = [\"node\", \"bind\", \"operator\", \"source\", \"index\", \"subdivide\"];\n }\n\n indexShader(shader) {\n shader.pipe(this.indexer);\n return super.indexShader(shader);\n }\n\n sourceShader(shader) {\n return shader.pipe(this.operator);\n }\n\n getDimensions() {\n return this._resample(this.bind.source.getDimensions());\n }\n getActiveDimensions() {\n return this._resample(this.bind.source.getActiveDimensions());\n }\n getFutureDimensions() {\n return this._resample(this.bind.source.getFutureDimensions());\n }\n getIndexDimensions() {\n return this._resample(this.bind.source.getIndexDimensions());\n }\n\n _resample(dims) {\n const r = this.resampled;\n\n dims.items--;\n dims.width--;\n dims.height--;\n dims.depth--;\n\n if (r.items != null) {\n dims.items *= r.items;\n }\n if (r.width != null) {\n dims.width *= r.width;\n }\n if (r.height != null) {\n dims.height *= r.height;\n }\n if (r.depth != null) {\n dims.depth *= r.depth;\n }\n\n dims.items++;\n dims.width++;\n dims.height++;\n dims.depth++;\n\n return dims;\n }\n\n make() {\n super.make();\n if (this.bind.source == null) {\n return;\n }\n\n // Get resampled dimensions\n let { items, width, height, depth, lerp } = this.props;\n\n this.resampled = {};\n if (items != null) {\n this.resampled.items = items;\n }\n if (width != null) {\n this.resampled.width = width;\n }\n if (height != null) {\n this.resampled.height = height;\n }\n if (depth != null) {\n this.resampled.depth = depth;\n }\n\n // Build shader to resample data\n const operator = this._shaders.shader();\n const indexer = this._shaders.shader();\n\n // Uniforms\n const uniforms = {\n resampleFactor: this._attributes.make(this._types.vec4(0, 0, 0, 0)),\n subdivideBevel: this.node.attributes[\"subdivide.bevel\"],\n };\n\n this.resampleFactor = uniforms.resampleFactor;\n this.resampleBias = uniforms.resampleBias;\n\n // Has resize props?\n const resize =\n items != null || width != null || height != null || depth != null;\n\n // Addressing relative to target\n if (resize) {\n operator.pipe(\"resample.relative\", uniforms);\n indexer.pipe(\"resample.relative\", uniforms);\n } else {\n operator.pipe(UGLSL.identity(\"vec4\"));\n indexer.pipe(UGLSL.identity(\"vec4\"));\n }\n\n // Make sampler\n let sampler = this.bind.source.sourceShader(this._shaders.shader());\n lerp = lerp ? \".lerp\" : \"\";\n\n // Iterate over dimensions (items, width, height, depth)\n const iterable = [\"width\", \"height\", \"depth\", \"items\"];\n for (let i = 0; i < iterable.length; i++) {\n const key = iterable[i];\n const id = `subdivide.${key}${lerp}`;\n\n if (this.props[key] != null) {\n sampler = this._shaders.shader().require(sampler);\n sampler.pipe(id, uniforms);\n }\n }\n\n // Combine operator and composite lerp sampler\n operator.pipe(sampler);\n\n this.operator = operator;\n return (this.indexer = indexer);\n }\n\n unmake() {\n super.unmake();\n return (this.operator = null);\n }\n\n resize() {\n if (this.bind.source == null) {\n return;\n }\n\n const dims = this.bind.source.getActiveDimensions();\n const target = this.getActiveDimensions();\n\n const axis = (key) =>\n Math.max(1, dims[key] - 1) / Math.max(1, target[key] - 1);\n\n const rw = axis(\"width\");\n const rh = axis(\"height\");\n const rd = axis(\"depth\");\n const ri = axis(\"items\");\n\n this.resampleFactor.value.set(rw, rh, rd, ri);\n\n return super.resize();\n }\n\n change(changed, touched, _init) {\n if (touched[\"operator\"] || touched[\"subdivide\"]) {\n return this.rebuild();\n }\n }\n}\nSubdivide.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UGLSL from \"../../../util/glsl.js\";\nimport { Operator } from \"./operator.js\";\n\nconst labels = {\n 1: \"width\",\n 2: \"height\",\n 3: \"depth\",\n 4: \"items\",\n};\n\nexport class Transpose extends Operator {\n static initClass() {\n this.traits = [\"node\", \"bind\", \"operator\", \"source\", \"index\", \"transpose\"];\n }\n\n indexShader(shader) {\n if (this.swizzler) {\n shader.pipe(this.swizzler);\n }\n return super.indexShader(shader);\n }\n\n sourceShader(shader) {\n if (this.swizzler) {\n shader.pipe(this.swizzler);\n }\n return super.sourceShader(shader);\n }\n\n getDimensions() {\n return this._remap(this.transpose, this.bind.source.getDimensions());\n }\n getActiveDimensions() {\n return this._remap(this.transpose, this.bind.source.getActiveDimensions());\n }\n getFutureDimensions() {\n return this._remap(this.transpose, this.bind.source.getFutureDimensions());\n }\n getIndexDimensions() {\n return this._remap(this.transpose, this.bind.source.getIndexDimensions());\n }\n\n _remap(transpose, dims) {\n // Map dimensions onto their new axis\n const out = {};\n\n for (let i = 0; i <= 3; i++) {\n const dst = labels[i + 1];\n const src = labels[transpose[i]];\n out[dst] = dims[src] != null ? dims[src] : 1;\n }\n\n return out;\n }\n\n make() {\n super.make();\n if (this.bind.source == null) {\n return;\n }\n\n // Transposition order\n const { order } = this.props;\n if (order.join() !== \"1234\") {\n this.swizzler = UGLSL.invertSwizzleVec4(order);\n }\n this.transpose = order;\n\n // Notify of reallocation\n return this.trigger({\n type: \"source.rebuild\",\n });\n }\n\n unmake() {\n super.unmake();\n return (this.swizzler = null);\n }\n\n change(changed, touched, _init) {\n if (touched[\"transpose\"] || touched[\"operator\"]) {\n return this.rebuild();\n }\n }\n}\nTranspose.initClass();\n","export * from \"./clamp.js\";\nexport * from \"./grow.js\";\nexport * from \"./join.js\";\nexport * from \"./lerp.js\";\nexport * from \"./memo.js\";\nexport * from \"./readback.js\";\nexport * from \"./resample.js\";\nexport * from \"./repeat.js\";\nexport * from \"./swizzle.js\";\nexport * from \"./spread.js\";\nexport * from \"./split.js\";\nexport * from \"./slice.js\";\nexport * from \"./subdivide.js\";\nexport * from \"./transpose.js\";\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Parent } from \"../base/parent.js\";\n\nexport class Transition extends Parent {\n static initClass() {\n this.traits = [\n \"node\",\n \"transition\",\n \"transform\",\n \"mask\",\n \"visible\",\n \"active\",\n ];\n }\n\n init() {\n this.animate = null;\n this.uniforms = null;\n\n this.state = {\n isVisible: true,\n isActive: true,\n enter: 1,\n exit: 1,\n };\n\n this.latched = null;\n return (this.locked = null);\n }\n\n make() {\n this.uniforms = {\n transitionFrom: this._attributes.make(this._types.vec4()),\n transitionTo: this._attributes.make(this._types.vec4()),\n\n transitionActive: this._attributes.make(this._types.bool()),\n transitionScale: this._attributes.make(this._types.vec4()),\n transitionBias: this._attributes.make(this._types.vec4()),\n transitionEnter: this._attributes.make(this._types.number()),\n transitionExit: this._attributes.make(this._types.number()),\n transitionSkew: this._attributes.make(this._types.number()),\n };\n\n const slideParent = this._inherit(\"slide\");\n const visibleParent = this._inherit(\"visible\");\n const activeParent = this._inherit(\"active\");\n\n this._listen(slideParent, \"transition.latch\", (e) => this.latch(e.step));\n this._listen(slideParent, \"transition.release\", () => this.release());\n\n this._listen(visibleParent, \"visible.change\", () => {\n //console.log @node.toString(), 'visible.change ^', visibleParent.isVisible\n return this.update((this.state.isVisible = visibleParent.isVisible));\n });\n\n this._listen(activeParent, \"active.change\", () => {\n //console.log @node.toString(), 'active.change ^', activeParent.isActive\n return this.update((this.state.isActive = activeParent.isActive));\n });\n\n this.animate = this._animator.make(this._types.vec2(1, 1), {\n step: (value) => {\n this.state.enter = value.x;\n this.state.exit = value.y;\n return this.update();\n },\n complete: (done) => this.complete(done),\n });\n\n return (this.move = this.props.from != null || this.props.to != null);\n }\n\n //@_helpers.visible.make()\n //@_helpers.active.make()\n\n unmake() {\n return this.animate.dispose();\n }\n\n //@_helpers.visible.unmake()\n //@_helpers.active.unmake()\n\n latch(step) {\n let latched;\n this.locked = null;\n this.latched = latched = {\n isVisible: this.state.isVisible,\n isActive: this.state.isActive,\n step,\n };\n\n // Reset enter/exit animation if invisible\n const visible = this.isVisible;\n if (!visible) {\n const forward = latched.step >= 0;\n const [enter, exit] = Array.from(forward ? [0, 1] : [1, 0]);\n return this.animate.set(enter, exit);\n }\n }\n\n //console.log @node.toString(), 'transition::latch', @latched, enter, exit\n\n release() {\n // Get before/after and unlatch state\n const { latched } = this;\n const { state } = this;\n this.latched = null;\n\n //console.log @node.toString(), 'transition::release', JSON.parse JSON.stringify {latched, state}\n\n //p = @; console.log '-> ', p.node.toString(), p.isVisible while p = p._inherit 'visible'\n\n // Transition if visibility state change\n if (latched.isVisible !== state.isVisible) {\n // Maintain step direction\n const forward = latched.step >= 0;\n const visible = state.isVisible;\n const [enter, exit] = Array.from(\n visible ? [1, 1] : forward ? [1, 0] : [0, 1]\n );\n\n // Get duration\n let { duration, durationEnter, durationExit } = this.props;\n if (durationEnter == null) {\n durationEnter = duration;\n }\n if (durationExit == null) {\n durationExit = duration;\n }\n duration = visible * durationEnter + !visible * durationExit;\n\n // Get delay\n let { delay, delayEnter, delayExit } = this.props;\n if (delayEnter == null) {\n delayEnter = delay;\n }\n if (delayExit == null) {\n delayExit = delay;\n }\n delay = visible * delayEnter + !visible * delayExit;\n\n // Animate enter/exit\n //console.log @node.toString(), '@animate.immediate', {x: enter, y: exit}, {duration, delay, ease: 'linear'}\n this.animate.immediate(\n { x: enter, y: exit },\n { duration, delay, ease: \"linear\" }\n );\n\n // Lock visibility and active open during transition\n this.locked = {\n isVisible: true,\n isActive: latched.isActive || state.isActive,\n };\n }\n\n return this.update();\n }\n\n complete(done) {\n if (!done) {\n return;\n }\n this.locked = null;\n return this.update();\n }\n\n update() {\n if (this.latched != null) {\n return;\n } // latched\n\n let { enter, exit } = this.props;\n\n // Resolve transition state\n if (enter == null) {\n ({ enter } = this.state);\n }\n if (exit == null) {\n ({ exit } = this.state);\n }\n\n const level = enter * exit;\n let visible = level > 0;\n const partial = level < 1;\n\n this.uniforms.transitionEnter.value = enter;\n this.uniforms.transitionExit.value = exit;\n this.uniforms.transitionActive.value = partial;\n\n // Resolve visibility state\n if (visible) {\n visible = !!this.state.isVisible;\n }\n if (this.locked != null) {\n visible = this.locked.isVisible;\n }\n\n if (this.isVisible !== visible) {\n this.isVisible = visible;\n this.trigger({ type: \"visible.change\" });\n }\n\n // Resolve active state\n const active = !!(\n this.state.isActive ||\n (this.locked != null ? this.locked.isActive : undefined)\n );\n\n if (this.isActive !== active) {\n this.isActive = active;\n return this.trigger({ type: \"active.change\" });\n }\n }\n\n //console.log 'transition update', 'enter', enter, 'exit', exit, 'visible', visible, 'active', active\n\n change(changed, touched, init) {\n if (changed[\"transition.enter\"] || changed[\"transition.exit\"] || init) {\n this.update();\n }\n\n if (changed[\"transition.stagger\"] || init) {\n const { stagger } = this.props;\n\n // Precompute shader constants\n\n const flipX = stagger.x < 0;\n const flipY = stagger.y < 0;\n const flipZ = stagger.z < 0;\n const flipW = stagger.w < 0;\n\n const staggerX = Math.abs(stagger.x);\n const staggerY = Math.abs(stagger.y);\n const staggerZ = Math.abs(stagger.z);\n const staggerW = Math.abs(stagger.w);\n\n this.uniforms.transitionSkew.value =\n staggerX + staggerY + staggerZ + staggerW;\n\n this.uniforms.transitionScale.value.set(\n (1 - flipX * 2) * staggerX,\n (1 - flipY * 2) * staggerY,\n (1 - flipZ * 2) * staggerZ,\n (1 - flipW * 2) * staggerW\n );\n\n return this.uniforms.transitionBias.value.set(\n flipX * staggerX,\n flipY * staggerY,\n flipZ * staggerZ,\n flipW * staggerW\n );\n }\n }\n}\nTransition.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining\n * DS104: Avoid inline assignments\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Transition } from \"./transition.js\";\n\nexport class Move extends Transition {\n static initClass() {\n this.traits = [\"node\", \"transition\", \"vertex\", \"move\", \"visible\", \"active\"];\n }\n\n make() {\n super.make();\n\n const object = {\n moveFrom: this.node.attributes[\"move.from\"],\n moveTo: this.node.attributes[\"move.to\"],\n };\n for (let k in object) {\n const v = object[k];\n this.uniforms[k] = v;\n }\n }\n\n vertex(shader, pass) {\n let left;\n if (pass === this.props.pass) {\n shader.pipe(\"move.position\", this.uniforms);\n }\n return (left = __guard__(this._inherit(\"vertex\"), (x) =>\n x.vertex(shader, pass)\n )) != null\n ? left\n : shader;\n }\n}\nMove.initClass();\n\nfunction __guard__(value, transform) {\n return typeof value !== \"undefined\" && value !== null\n ? transform(value)\n : undefined;\n}\n","export function clamp(x, a, b) {\n return Math.max(a, Math.min(b, x));\n}\n\nexport function cosine(x) {\n return 0.5 - 0.5 * Math.cos(clamp(x, 0, 1) * Math.PI);\n}\n\nexport function binary(x) {\n return +(x >= 0.5);\n}\n\nexport function hold(x) {\n return +(x >= 1);\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as Ease from \"../../../util/ease.js\";\nimport { Primitive } from \"../../primitive.js\";\n\nconst deepCopy = function (x) {\n const out = {};\n for (let k in x) {\n const v = x[k];\n if (v instanceof Array) {\n out[k] = v.slice();\n } else if (v != null && typeof v === \"object\") {\n out[k] = deepCopy(v);\n } else {\n out[k] = v;\n }\n }\n\n return out;\n};\n\nexport class Track extends Primitive {\n static initClass() {\n this.traits = [\"node\", \"track\", \"seek\", \"bind\"];\n }\n\n init() {\n this.handlers = {};\n this.script = null;\n this.values = null;\n this.playhead = 0;\n this.velocity = null;\n this.section = null;\n return (this.expr = null);\n }\n\n make() {\n // Bind to attached data sources\n let ref;\n this._helpers.bind.make([\n { to: \"track.target\", trait: \"node\", callback: null },\n ]);\n\n const { script } = this.props;\n const { node } = this.bind.target;\n\n this.targetNode = node;\n return (\n ([this.script, this.values, this.start, this.end] = Array.from(\n (ref = this._process(node, script))\n )),\n ref\n );\n }\n\n unmake() {\n this.unbindExpr();\n this._helpers.bind.unmake();\n this.script =\n this.values =\n this.start =\n this.end =\n this.section =\n this.expr =\n null;\n return (this.playhead = 0);\n }\n\n // Bind animated expressions\n bindExpr(expr) {\n this.unbindExpr();\n this.expr = expr;\n this.targetNode.bind(expr, true);\n\n // Measure playhead velocity on attribute computation\n const { clock } = this.targetNode;\n const self = this;\n return this._attributes.bind(\n (this.measure = (function () {\n let playhead = null;\n return () => {\n const { step } = clock.getTime();\n if (playhead != null) {\n self.velocity = (self.playhead - playhead) / step;\n }\n return (playhead = self.playhead);\n };\n })())\n );\n }\n\n unbindExpr() {\n if (this.expr != null) {\n this.targetNode.unbind(this.expr, true);\n }\n if (this.measure != null) {\n this._attributes.unbind(this.measure);\n }\n return (this.expr = this.measure = null);\n }\n\n // Process script steps by filling out missing props\n _process(object, script) {\n let k, key, last, message, s, step, v;\n if (script instanceof Array) {\n // Normalize array to numbered dict\n s = {};\n for (let i = 0; i < script.length; i++) {\n step = script[i];\n s[i] = step;\n }\n script = s;\n }\n\n // Normalize keyed steps to array of step objects\n s = [];\n for (key in script) {\n step = script[key];\n if (step == null) {\n step = [];\n }\n\n if (step instanceof Array) {\n // [props, expr] array\n step = {\n key: +key,\n props: step[0] != null ? deepCopy(step[0]) : {},\n expr: step[1] != null ? deepCopy(step[1]) : {},\n };\n } else {\n if (step.key == null && !step.props && !step.expr) {\n // Direct props object (iffy, but people will do this anyhow)\n step = { props: deepCopy(step) };\n } else {\n // Proper step\n step = deepCopy(step);\n }\n\n // Prepare step object\n step.key = step.key != null ? +step.key : +key;\n if (step.props == null) {\n step.props = {};\n }\n if (step.expr == null) {\n step.expr = {};\n }\n }\n\n s.push(step);\n }\n script = s;\n\n if (!script.length) {\n return [[], {}, 0, 0];\n }\n\n // Sort by keys\n script.sort((a, b) => a.key - b.key);\n const start = script[0].key;\n const end = script[script.length - 1].key;\n\n // Connect steps\n for (key in script) {\n step = script[key];\n if (last != null) {\n last.next = step;\n }\n last = step;\n }\n\n // Last step leads to itself\n last.next = last;\n script = s;\n\n // Determine starting props\n const props = {};\n const values = {};\n for (key in script) {\n step = script[key];\n for (k in step.props) {\n v = step.props[k];\n props[k] = true;\n }\n }\n for (key in script) {\n step = script[key];\n for (k in step.expr) {\n v = step.expr[k];\n props[k] = true;\n }\n }\n for (k in props) {\n props[k] = object.get(k);\n }\n try {\n // Need two sources and one destination value for correct mixing of live expressions\n for (k in props) {\n values[k] = [\n object.attribute(k).T.make(),\n object.attribute(k).T.make(),\n object.attribute(k).T.make(),\n ];\n }\n } catch (error) {\n console.warn(this.node.toMarkup());\n message = `${this.node.toString()} - Target ${object} has no \\`${k}\\` property`;\n throw new Error(message);\n }\n\n const result = [];\n\n // Normalize script props, insert held values\n for (step of Array.from(script)) {\n for (k in props) {\n v = props[k];\n v = object.validate(k, step.props[k] != null ? step.props[k] : v);\n props[k] = step.props[k] = v;\n\n if (step.expr[k] != null && typeof step.expr[k] !== \"function\") {\n console.warn(this.node.toMarkup());\n message = `${this.node.toString()} - Expression \\`${\n step.expr[k]\n }\\` on property \\`${k}\\` is not a function`;\n throw new Error(message);\n }\n }\n result.push(step);\n }\n\n return [result, values, start, end];\n }\n\n update() {\n let { playhead, script } = this;\n const { ease, seek } = this.props;\n const node = this.targetNode;\n\n if (seek != null) {\n playhead = seek;\n }\n\n if (script.length) {\n let k;\n const find = function () {\n let last = script[0];\n for (let i = 0; i < script.length; i++) {\n const step = script[i];\n if (step.key > playhead) {\n break;\n }\n last = step;\n }\n return last;\n };\n\n let { section } = this;\n if (!section || playhead < section.key || playhead > section.next.key) {\n section = find(script, playhead);\n }\n\n if (section === this.section) {\n return;\n }\n this.section = section;\n\n const from = section;\n const to = section.next;\n const start = from.key;\n const end = to.key;\n\n // Easing of playhead along track\n const easeMethod = (() => {\n switch (ease) {\n case \"linear\":\n case 0:\n return Ease.clamp;\n case \"cosine\":\n case 1:\n return Ease.cosine;\n case \"binary\":\n case 2:\n return Ease.binary;\n case \"hold\":\n case 3:\n return Ease.hold;\n default:\n return Ease.cosine;\n }\n })();\n\n // Callback for live playhead interpolator (linear approx time travel)\n const { clock } = node;\n const getPlayhead = (time) => {\n if (this.velocity == null) {\n return this.playhead;\n }\n const now = clock.getTime();\n return this.playhead + this.velocity * (time - now.time);\n };\n\n const getLerpFactor = (function () {\n const scale = 1 / Math.max(0.0001, end - start);\n return (time) => easeMethod((getPlayhead(time) - start) * scale, 0, 1);\n })();\n\n // Create prop expression interpolator\n const live = (key) => {\n const fromE = from.expr[key];\n const toE = to.expr[key];\n const fromP = from.props[key];\n const toP = to.props[key];\n\n const invalid = function () {\n console.warn(node.toMarkup());\n throw new Error(\n `${this.node.toString()} - Invalid expression result on track \\`${key}\\``\n );\n };\n\n const attr = node.attribute(key);\n const values = this.values[key];\n const animator = this._animator;\n\n // Lerp between two expressions\n if (fromE && toE) {\n return ((values, _from, _to) =>\n function (time, delta) {\n let _from, _to;\n values[0] = _from = attr.T.validate(\n fromE(time, delta),\n values[0],\n invalid\n );\n values[1] = _to = attr.T.validate(\n toE(time, delta),\n values[1],\n invalid\n );\n return (values[2] = animator.lerp(\n attr.T,\n _from,\n _to,\n getLerpFactor(time),\n values[2]\n ));\n })(values, from, to);\n\n // Lerp between an expression and a constant\n } else if (fromE) {\n return ((values, _from, _to) =>\n function (time, delta) {\n let _from;\n values[0] = _from = attr.T.validate(\n fromE(time, delta),\n values[0],\n invalid\n );\n return (values[1] = animator.lerp(\n attr.T,\n _from,\n toP,\n getLerpFactor(time),\n values[1]\n ));\n })(values, from, to);\n\n // Lerp between a constant and an expression\n } else if (toE) {\n return ((values, _from, _to) =>\n function (time, delta) {\n let _to;\n values[0] = _to = attr.T.validate(\n toE(time, delta),\n values[0],\n invalid\n );\n return (values[1] = animator.lerp(\n attr.T,\n fromP,\n _to,\n getLerpFactor(time),\n values[1]\n ));\n })(values, from, to);\n\n // Lerp between two constants\n } else {\n return (\n (values, _from, _to) => (time, _delta) =>\n (values[0] = animator.lerp(\n attr.T,\n fromP,\n toP,\n getLerpFactor(time),\n values[0]\n ))\n )(values, from, to);\n }\n };\n\n // Handle expr / props on both ends\n const expr = {};\n for (k in from.expr) {\n if (expr[k] == null) {\n expr[k] = live(k);\n }\n }\n for (k in to.expr) {\n if (expr[k] == null) {\n expr[k] = live(k);\n }\n }\n for (k in from.props) {\n if (expr[k] == null) {\n expr[k] = live(k);\n }\n }\n for (k in to.props) {\n if (expr[k] == null) {\n expr[k] = live(k);\n }\n }\n\n // Bind node props\n return this.bindExpr(expr);\n }\n }\n\n change(changed, touched, init) {\n if (\n changed[\"track.target\"] ||\n changed[\"track.script\"] ||\n changed[\"track.mode\"]\n ) {\n return this.rebuild();\n }\n\n if (changed[\"seek.seek\"] || init) {\n return this.update();\n }\n }\n}\nTrack.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Track } from \"./track.js\";\n\nexport class Play extends Track {\n static initClass() {\n this.traits = [\"node\", \"track\", \"trigger\", \"play\", \"bind\"];\n }\n\n init() {\n super.init();\n this.skew = null;\n return (this.start = null);\n }\n\n reset(go) {\n if (go == null) {\n go = true;\n }\n this.skew = go ? 0 : null;\n return (this.start = null);\n }\n\n make() {\n super.make();\n\n // Start on slide, or immediately if not inside slide\n this._listen(\"slide\", \"slide.step\", (e) => {\n const { trigger } = this.props;\n if (trigger != null && e.index === trigger) {\n return this.reset();\n }\n if (trigger != null && e.index === 0) {\n return this.reset(false);\n }\n });\n if (!this.props.trigger || this._inherit(\"slide\") == null) {\n this.reset();\n }\n\n // Find parent clock\n const parentClock = this._inherit(\"clock\");\n\n // Update clock\n return this._listen(parentClock, \"clock.tick\", () => {\n const { from, to, speed, pace, delay, realtime } = this.props;\n\n const time = parentClock.getTime();\n if (this.skew != null) {\n const now = realtime ? time.time : time.clock;\n const delta = realtime ? time.delta : time.step;\n const ratio = speed / pace;\n\n if (this.start == null) {\n this.start = now;\n }\n this.skew += delta * (ratio - 1);\n\n let offset = Math.max(0, now - this.start + this.skew - delay * ratio);\n if (this.props.loop) {\n offset = offset % (to - from);\n }\n\n this.playhead = Math.min(to, from + offset);\n } else {\n this.playhead = 0;\n }\n\n return this.update();\n });\n }\n\n update() {\n return super.update();\n }\n\n change(changed, touched, init) {\n if (changed[\"trigger.trigger\"] || changed[\"play.realtime\"]) {\n return this.rebuild();\n }\n return super.change(changed, touched, init);\n }\n}\nPlay.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS202: Simplify dynamic range loops\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Parent } from \"../base/parent.js\";\n\nexport class Present extends Parent {\n static initClass() {\n this.traits = [\"node\", \"present\"];\n }\n\n init() {}\n\n make() {\n this.nodes = [];\n this.steps = [];\n this.length = 0;\n this.last = [];\n this.index = 0;\n this.dirty = [];\n\n this._listen(\"root\", \"root.update\", this.update);\n return this._compute(\"present.length\", () => this.length);\n }\n\n adopt(controller) {\n const { node } = controller;\n if (this.nodes.indexOf(controller) < 0) {\n this.nodes.push(node);\n }\n return this.dirty.push(controller);\n }\n\n unadopt(controller) {\n this.nodes = this.nodes.filter((x) => x !== controller);\n return this.dirty.push(controller);\n }\n\n update() {\n if (!this.dirty.length) {\n return;\n }\n\n for (let controller of Array.from(this.dirty)) {\n this.slideReset(controller);\n }\n\n [this.steps, this.indices] = Array.from(this.process(this.nodes));\n\n this.length = this.steps.length;\n this.index = null;\n this.go(this.props.index);\n\n return (this.dirty = []);\n }\n\n slideLatch(controller, enabled, step) {\n return controller.slideLatch(enabled, step);\n }\n slideStep(controller, index, step) {\n return controller.slideStep(this.mapIndex(controller, index), step);\n }\n slideRelease(controller, _step) {\n return controller.slideRelease();\n }\n slideReset(controller) {\n return controller.slideReset();\n }\n\n mapIndex(controller, index) {\n return index - this.indices[controller.node._id];\n }\n\n process(nodes) {\n // Grab nodes' path of slide parents\n const slides = (nodes) =>\n Array.from(nodes).map((el) => parents(el).filter(isSlide));\n const traverse = (map) => (el) =>\n (() => {\n let ref, ref1;\n const result = [];\n while (el && (([el, ref] = Array.from((ref1 = [map(el), el]))), ref1)) {\n result.push(ref);\n }\n return result;\n })();\n var parents = traverse(function (el) {\n if (el.parent.traits.hash.present) {\n return null;\n } else {\n return el.parent;\n }\n });\n\n // Helpers\n var isSlide = (el) => nodes.indexOf(el) >= 0;\n\n // Order paths (leaf -> parent slide -> ...)\n const order = (paths) =>\n paths.sort(function (a, b) {\n // Path lengths\n const c = a.length;\n const d = b.length;\n\n // Compare from outside in\n let e = Math.min(c, d);\n for (\n let i = 1, end = e, asc = 1 <= end;\n asc ? i <= end : i >= end;\n asc ? i++ : i--\n ) {\n // inclusive end\n const nodeA = a[c - i];\n const nodeB = b[d - i];\n\n // Explicit sibling order (natural)\n const f = nodeA.props.order;\n const g = nodeB.props.order;\n if (f != null || g != null) {\n if (f != null && g != null && (e = f - g) !== 0) {\n return e;\n }\n if (f != null) {\n return -1;\n }\n if (g != null) {\n return 1;\n }\n }\n\n // Document sibling order (inverted)\n if (nodeB.order !== nodeA.order) {\n return nodeB.order - nodeA.order;\n }\n }\n\n // Different tree level\n e = c - d;\n if (e !== 0) {\n return e;\n }\n\n // Equal\n return 0;\n });\n\n const split = function (steps) {\n const relative = [];\n const absolute = [];\n for (let step of Array.from(steps)) {\n (step[0].props.steps != null ? relative : absolute).push(step);\n }\n return [relative, absolute];\n };\n\n const expand = function (lists) {\n let step;\n const [relative, absolute] = Array.from(lists);\n\n const limit = 100;\n\n const indices = {};\n let steps = [];\n const slide = function (step, index) {\n let node;\n const { props } = (node = step[0]);\n const parent = step[1];\n\n const parentIndex = parent != null ? indices[parent._id] : 0;\n //throw \"parent index missing\" if !parentIndex?\n const childIndex = index;\n\n let from =\n props.from != null\n ? parentIndex + props.from\n : childIndex - props.early;\n let to =\n props.to != null\n ? parentIndex + props.to\n : childIndex + props.steps + props.late;\n\n from = Math.max(0, from);\n to = Math.min(limit, to);\n\n if (indices[node._id] == null) {\n indices[node._id] = from;\n }\n for (\n let i = from, end = to, asc = from <= end;\n asc ? i < end : i > end;\n asc ? i++ : i--\n ) {\n steps[i] = (steps[i] != null ? steps[i] : (steps[i] = [])).concat(\n step\n );\n }\n\n return props.steps;\n };\n\n let i = 0;\n for (step of Array.from(relative)) {\n i += slide(step, i);\n }\n for (step of Array.from(absolute)) {\n slide(step, 0);\n }\n\n // Dedupe and order\n steps = (() => {\n const result = [];\n for (step of Array.from(steps)) {\n result.push(finalize(dedupe(step)));\n }\n return result;\n })();\n\n return [steps, indices];\n };\n\n // Remove duplicates\n var dedupe = function (step) {\n if (step) {\n return (() => {\n const result = [];\n for (let i = 0; i < step.length; i++) {\n const node = step[i];\n if (step.indexOf(node) === i) {\n result.push(node);\n }\n }\n return result;\n })();\n } else {\n return [];\n }\n };\n\n // Finalize individual step by document order\n var finalize = (step) => step.sort((a, b) => a.order - b.order);\n\n const paths = slides(nodes);\n const steps = order(paths);\n return expand(split(steps));\n }\n\n go(index) {\n // Pad with an empty slide before and after for initial enter/final exit\n let left;\n let node;\n index = Math.max(0, Math.min(this.length + 1, +index || 0));\n\n const active = (left = this.steps[index - 1]) != null ? left : [];\n const step = this.props.directed ? index - this.index : 1;\n this.index = index;\n\n const enter = (() => {\n const result = [];\n for (node of Array.from(active)) {\n if (this.last.indexOf(node) < 0) {\n result.push(node);\n }\n }\n return result;\n })();\n const exit = (() => {\n const result1 = [];\n for (node of Array.from(this.last)) {\n if (active.indexOf(node) < 0) {\n result1.push(node);\n }\n }\n return result1;\n })();\n const stay = (() => {\n const result2 = [];\n for (node of Array.from(active)) {\n if (enter.indexOf(node) < 0 && exit.indexOf(node) < 0) {\n result2.push(node);\n }\n }\n return result2;\n })();\n\n const ascend = (nodes) => nodes.sort((a, b) => a.order - b.order);\n const descend = (nodes) => nodes.sort((a, b) => b.order - a.order);\n\n //const toStr = (x) => x.toString();\n //console.log '============================================================'\n //console.log 'go', index, {enter: enter.map(toStr), stay: stay.map(toStr), exit: exit.map(toStr)}\n\n for (node of Array.from(ascend(enter))) {\n this.slideLatch(node.controller, true, step);\n }\n for (node of Array.from(ascend(stay))) {\n this.slideLatch(node.controller, null, step);\n }\n for (node of Array.from(ascend(exit))) {\n this.slideLatch(node.controller, false, step);\n }\n\n for (node of Array.from(enter)) {\n this.slideStep(node.controller, index, step);\n }\n for (node of Array.from(stay)) {\n this.slideStep(node.controller, index, step);\n }\n for (node of Array.from(exit)) {\n this.slideStep(node.controller, index, step);\n }\n\n for (node of Array.from(descend(enter))) {\n this.slideRelease(node.controller);\n }\n for (node of Array.from(descend(stay))) {\n this.slideRelease(node.controller);\n }\n for (node of Array.from(descend(exit))) {\n this.slideRelease(node.controller);\n }\n\n this.last = active;\n }\n\n change(changed, touched, init) {\n if (changed[\"present.index\"] || init) {\n return this.go(this.props.index);\n }\n }\n}\nPresent.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining\n * DS104: Avoid inline assignments\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UGLSL from \"../../../util/glsl.js\";\nimport { Transition } from \"./transition.js\";\n\nexport class Reveal extends Transition {\n static initClass() {\n this.traits = [\"node\", \"transition\", \"mask\", \"visible\", \"active\"];\n }\n\n mask(shader) {\n let left, s;\n if (shader) {\n s = this._shaders.shader();\n s.pipe(UGLSL.identity(\"vec4\"));\n s.fan();\n s.pipe(shader, this.uniforms);\n s.next();\n s.pipe(\"reveal.mask\", this.uniforms);\n s.end();\n s.pipe(\"float combine(float a, float b) { return min(a, b); }\");\n } else {\n s = this._shaders.shader();\n s.pipe(\"reveal.mask\", this.uniforms);\n }\n\n return (left = __guard__(this._inherit(\"mask\"), (x) => x.mask(s))) != null\n ? left\n : s;\n }\n}\nReveal.initClass();\n\nfunction __guard__(value, transform) {\n return typeof value !== \"undefined\" && value !== null\n ? transform(value)\n : undefined;\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Parent } from \"../base/parent.js\";\n\nexport class Slide extends Parent {\n static initClass() {\n this.traits = [\"node\", \"slide\", \"visible\", \"active\"];\n }\n\n make() {\n this._helpers.visible.make();\n this._helpers.active.make();\n\n if (!this._inherit(\"present\")) {\n throw new Error(\n `${this.node.toString()} must be placed inside `\n );\n }\n\n return this._inherit(\"present\").adopt(this);\n }\n\n unmake() {\n this._helpers.visible.unmake();\n this._helpers.active.unmake();\n\n return this._inherit(\"present\").unadopt(this);\n }\n\n change(changed, _touched, _init) {\n if (\n changed[\"slide.early\"] ||\n changed[\"slide.late\"] ||\n changed[\"slide.steps\"] ||\n changed[\"slide.from\"] ||\n changed[\"slide.to\"]\n ) {\n return this.rebuild();\n }\n }\n\n slideLatch(enabled, step) {\n //console.log 'slide:latch', @node.toString(), enabled, step\n this.trigger({\n type: \"transition.latch\",\n step: step,\n });\n\n if (enabled != null) {\n return this._instant(enabled);\n }\n }\n\n slideStep(index, step) {\n //console.log 'slide:step', @node.toString(), index, step\n return this.trigger({\n type: \"slide.step\",\n index: index,\n step: step,\n });\n }\n\n slideRelease() {\n //console.log 'slide:release', @node.toString()\n return this.trigger({\n type: \"transition.release\",\n });\n }\n\n slideReset() {\n this._instant(false);\n return this.trigger({\n type: \"slide.reset\",\n });\n }\n\n _instant(enabled) {\n //console.log 'slide:instant', @node.toString(), enabled\n this.setVisible(enabled);\n return this.setActive(enabled);\n }\n}\nSlide.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Track } from \"./track.js\";\n\nexport class Step extends Track {\n static initClass() {\n this.traits = [\"node\", \"track\", \"step\", \"trigger\", \"bind\"];\n }\n\n make() {\n super.make();\n\n const clock = this._inherit(\"clock\");\n\n if (this.actualIndex == null) {\n this.actualIndex = null;\n }\n this.animateIndex = this._animator.make(this._types.number(0), {\n clock,\n realtime: this.props.realtime,\n step: (value) => {\n return (this.actualIndex = value);\n },\n });\n\n if (this.lastIndex == null) {\n this.lastIndex = null;\n }\n this.animateStep = this._animator.make(this._types.number(0), {\n clock,\n realtime: this.props.realtime,\n step: (value) => {\n this.playhead = value;\n return this.update();\n },\n });\n\n this.stops =\n this.props.stops != null\n ? this.props.stops\n : __range__(0, this.script.length, false);\n\n // Seek instantly after reset\n this._listen(\"slide\", \"slide.reset\", (_e) => {\n return (this.lastIndex = null);\n });\n\n // Update playhead in response to slide change\n return this._listen(\"slide\", \"slide.step\", (e) => {\n let left;\n let { delay, duration, pace, speed, playback, rewind, skip, trigger } =\n this.props;\n\n // Note: enter phase is from index 0 to 1\n const i = Math.max(0, Math.min(this.stops.length - 1, e.index - trigger));\n\n // Animation range\n const from = this.playhead;\n const to = this.stops[i];\n\n // Seek if first step after reset\n if (this.lastIndex == null && trigger) {\n this.lastIndex = i;\n this.animateStep.set(to);\n this.animateIndex.set(i);\n return;\n }\n\n // Calculate actual step from current offset (may be still animating)\n let last =\n (left = this.actualIndex != null ? this.actualIndex : this.lastIndex) !=\n null\n ? left\n : 0;\n const step = i - last;\n\n // Don't count duped stops\n const skips = this.stops.slice(Math.min(last, i), Math.max(last, i));\n let free = 0;\n last = skips.shift();\n for (let stop of Array.from(skips)) {\n if (last === stop) {\n free++;\n }\n last = stop;\n }\n\n // Remember last intended stop\n this.lastIndex = i;\n\n // Apply rewind factor\n let factor = speed * (e.step >= 0 ? 1 : rewind);\n\n // Pass through multiple steps at faster rate if skip is enabled\n factor *= skip ? Math.max(1, Math.abs(step) - free) : 1;\n\n // Apply pace\n duration += (Math.abs(to - from) * pace) / factor;\n\n if (from !== to) {\n this.animateIndex.immediate(i, { delay, duration, ease: playback });\n return this.animateStep.immediate(to, {\n delay,\n duration,\n ease: playback,\n });\n }\n });\n }\n\n made() {\n return this.update();\n }\n\n unmake() {\n this.animateIndex.dispose();\n this.animateStep.dispose();\n this.animateIndex = this.animateStep = null;\n\n return super.unmake();\n }\n\n change(changed, touched, init) {\n if (changed[\"step.stops\"] || changed[\"step.realtime\"]) {\n return this.rebuild();\n }\n return super.change(changed, touched, init);\n }\n}\nStep.initClass();\n\nfunction __range__(left, right, inclusive) {\n let range = [];\n let ascending = left < right;\n let end = !inclusive ? right : ascending ? right + 1 : right - 1;\n for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {\n range.push(i);\n }\n return range;\n}\n","export * from \"./move.js\";\nexport * from \"./play.js\";\nexport * from \"./present.js\";\nexport * from \"./reveal.js\";\nexport * from \"./slide.js\";\nexport * from \"./step.js\";\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining\n * DS104: Avoid inline assignments\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Parent } from \"../base/parent.js\";\n\nexport class RTT extends Parent {\n static initClass() {\n this.traits = [\n \"node\",\n \"root\",\n \"scene\",\n \"vertex\",\n \"texture\",\n \"rtt\",\n \"source\",\n \"index\",\n \"image\",\n ];\n this.defaults = {\n minFilter: \"linear\",\n magFilter: \"linear\",\n type: \"unsignedByte\",\n };\n }\n\n init() {\n return (this.rtt =\n this.scene =\n this.camera =\n this.width =\n this.height =\n this.history =\n this.rootSize =\n this.size =\n null);\n }\n\n indexShader(shader) {\n return shader;\n }\n imageShader(shader) {\n return this.rtt.shaderRelative(shader);\n }\n sourceShader(shader) {\n return this.rtt.shaderAbsolute(shader, this.history);\n }\n\n getDimensions() {\n return {\n items: 1,\n width: this.width,\n height: this.height,\n depth: this.history,\n };\n }\n\n getActiveDimensions() {\n return this.getDimensions();\n }\n\n make() {\n let aspect;\n this.parentRoot = this._inherit(\"root\");\n this.rootSize = this.parentRoot.getSize();\n\n this._listen(this.parentRoot, \"root.pre\", this.pre);\n this._listen(this.parentRoot, \"root.update\", this.update);\n this._listen(this.parentRoot, \"root.render\", this.render);\n this._listen(this.parentRoot, \"root.post\", this.post);\n this._listen(this.parentRoot, \"root.camera\", this.setCamera);\n this._listen(this.parentRoot, \"root.resize\", function (event) {\n return this.resize(event.size);\n });\n\n if (this.rootSize == null) {\n return;\n }\n\n const { minFilter, magFilter, type } = this.props;\n\n const { width, height, history, size } = this.props;\n\n const relativeSize =\n size === this.node.attributes[\"rtt.size\"].enum.relative;\n const widthFactor = relativeSize ? this.rootSize.renderWidth : 1;\n const heightFactor = relativeSize ? this.rootSize.renderHeight : 1;\n\n this.width = Math.round(\n width != null ? width * widthFactor : this.rootSize.renderWidth\n );\n this.height = Math.round(\n height != null ? height * heightFactor : this.rootSize.renderHeight\n );\n this.history = history;\n this.aspect = aspect = this.width / this.height;\n\n if (this.scene == null) {\n this.scene = this._renderables.make(\"scene\");\n }\n this.rtt = this._renderables.make(\"renderToTexture\", {\n scene: this.scene,\n camera: this._context.defaultCamera,\n width: this.width,\n height: this.height,\n frames: this.history,\n minFilter,\n magFilter,\n type,\n });\n\n aspect = width || height ? aspect : this.rootSize.aspect;\n const viewWidth = width != null ? width : this.rootSize.viewWidth;\n const viewHeight = height != null ? height : this.rootSize.viewHeight;\n\n return (this.size = {\n renderWidth: this.width,\n renderHeight: this.height,\n aspect,\n viewWidth,\n viewHeight,\n pixelRatio: this.height / viewHeight,\n });\n }\n\n made() {\n // Notify of buffer reallocation\n this.trigger({\n type: \"source.rebuild\",\n });\n\n if (this.size) {\n return this.trigger({\n type: \"root.resize\",\n size: this.size,\n });\n }\n }\n\n unmake(rebuild) {\n if (this.rtt == null) {\n return;\n }\n\n this.rtt.dispose();\n if (!rebuild) {\n this.scene.dispose();\n }\n\n return (this.rtt = this.width = this.height = this.history = null);\n }\n\n change(changed, touched, init) {\n if (touched[\"texture\"] || changed[\"rtt.width\"] || changed[\"rtt.height\"]) {\n return this.rebuild();\n }\n\n if (changed[\"root.camera\"] || init) {\n this._unattach();\n this._attach(\n this.props.camera,\n \"camera\",\n this.setCamera,\n this,\n this,\n true\n );\n return this.setCamera();\n }\n }\n\n adopt(renderable) {\n return Array.from(renderable.renders).map((object) =>\n this.scene.add(object)\n );\n }\n unadopt(renderable) {\n return Array.from(renderable.renders).map((object) =>\n this.scene.remove(object)\n );\n }\n\n resize(size) {\n let height, width;\n this.rootSize = size;\n\n ({ width, height, size } = this.props);\n const relativeSize =\n size === this.node.attributes[\"rtt.size\"].enum.relative;\n\n if (!this.rtt || width == null || height == null || relativeSize) {\n return this.rebuild();\n }\n }\n\n select(selector) {\n return this._root.node.model.select(selector, [this.node]);\n }\n\n watch(selector, handler) {\n return this._root.node.model.watch(selector, handler);\n }\n\n unwatch(handler) {\n return this._root.node.model.unwatch(handler);\n }\n\n pre(e) {\n return this.trigger(e);\n }\n update(e) {\n let camera;\n if ((camera = this.getOwnCamera()) != null) {\n camera.aspect = this.aspect || 1;\n camera.updateProjectionMatrix();\n }\n return this.trigger(e);\n }\n render(e) {\n this.trigger(e);\n return this.rtt != null ? this.rtt.render(this.getCamera()) : undefined;\n }\n post(e) {\n return this.trigger(e);\n }\n\n setCamera() {\n const camera = __guard__(\n this.select(this.props.camera)[0],\n (x) => x.controller\n );\n if (this.camera !== camera) {\n this.camera = camera;\n this.rtt.camera = this.getCamera();\n return this.trigger({ type: \"root.camera\" });\n } else if (!this.camera) {\n return this.trigger({ type: \"root.camera\" });\n }\n }\n\n getOwnCamera() {\n return this.camera != null ? this.camera.getCamera() : undefined;\n }\n getCamera() {\n let left;\n return (left = this.getOwnCamera()) != null\n ? left\n : this._inherit(\"root\").getCamera();\n }\n\n // End transform chain here\n vertex(shader, pass) {\n if (pass === 2) {\n return shader.pipe(\"view.position\");\n }\n if (pass === 3) {\n return shader.pipe(\"root.position\");\n }\n return shader;\n }\n}\nRTT.initClass();\n\nfunction __guard__(value, transform) {\n return typeof value !== \"undefined\" && value !== null\n ? transform(value)\n : undefined;\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Primitive } from \"../../primitive.js\";\n\nexport class Compose extends Primitive {\n static initClass() {\n this.traits = [\n \"node\",\n \"bind\",\n \"object\",\n \"visible\",\n \"operator\",\n \"style\",\n \"compose\",\n ];\n this.defaults = {\n zWrite: false,\n zTest: false,\n color: \"#ffffff\",\n };\n }\n\n init() {\n return (this.compose = null);\n }\n\n //rebuild: () ->\n // console.log 'compose.rebuild', @node.get(null, true), @bind.source?\n // super()\n\n resize() {\n if (!this.compose || !this.bind.source) {\n return;\n }\n\n const dims = this.bind.source.getActiveDimensions();\n const { width } = dims;\n const { height } = dims;\n\n return this.remapUVScale.set(width, height);\n }\n\n make() {\n // Bind to attached data sources\n this._helpers.bind.make([{ to: \"operator.source\", trait: \"source\" }]);\n\n if (this.bind.source == null) {\n return;\n }\n\n // Prepare uniforms for remapping to absolute coords on the fly\n const resampleUniforms = {\n remapUVScale: this._attributes.make(this._types.vec2()),\n };\n this.remapUVScale = resampleUniforms.remapUVScale.value;\n\n // Build fragment shader\n let fragment = this._shaders.shader();\n const { alpha } = this.props;\n\n if (this.bind.source.is(\"image\")) {\n // Sample image directly in 2D UV\n fragment.pipe(\"screen.pass.uv\", resampleUniforms);\n fragment = this.bind.source.imageShader(fragment);\n } else {\n // Sample data source in 4D\n fragment.pipe(\"screen.map.xy\", resampleUniforms);\n fragment = this.bind.source.sourceShader(fragment);\n }\n\n // Force pixels to solid if requested\n if (!alpha) {\n fragment.pipe(\"color.opaque\");\n }\n\n // Make screen renderable\n const composeUniforms = this._helpers.style.uniforms();\n this.compose = this._renderables.make(\"screen\", {\n map: fragment,\n uniforms: composeUniforms,\n linear: true,\n });\n\n this._helpers.visible.make();\n return this._helpers.object.make([this.compose]);\n }\n\n made() {\n return this.resize();\n }\n\n unmake() {\n this._helpers.bind.unmake();\n this._helpers.visible.unmake();\n return this._helpers.object.unmake();\n }\n\n change(changed, _touched, _init) {\n if (changed[\"operator.source\"] || changed[\"compose.alpha\"]) {\n return this.rebuild();\n }\n }\n}\nCompose.initClass();\n","export * from \"./rtt.js\";\nexport * from \"./compose.js\";\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { Transform } from \"../transform/transform.js\";\n\nexport class View extends Transform {\n static initClass() {\n this.traits = [\"node\", \"object\", \"visible\", \"view\", \"vertex\"];\n }\n\n make() {\n return this._helpers.visible.make();\n }\n\n unmake() {\n return this._helpers.visible.unmake();\n }\n\n axis(dimension) {\n return this.props.range[dimension - 1];\n }\n}\nView.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UThree from \"../../../util/three.js\";\nimport { View } from \"./view.js\";\n\nexport class Cartesian extends View {\n static initClass() {\n this.traits = [\"node\", \"object\", \"visible\", \"view\", \"view3\", \"vertex\"];\n }\n\n make() {\n super.make();\n\n this.uniforms = { viewMatrix: this._attributes.make(this._types.mat4()) };\n\n this.viewMatrix = this.uniforms.viewMatrix.value;\n this.composer = UThree.transformComposer();\n }\n\n unmake() {\n super.unmake();\n\n delete this.viewMatrix;\n delete this.objectMatrix;\n delete this.uniforms;\n }\n\n change(changed, touched, init) {\n if (!touched[\"view\"] && !touched[\"view3\"] && !init) {\n return;\n }\n\n const p = this.props.position;\n const s = this.props.scale;\n const q = this.props.quaternion;\n const r = this.props.rotation;\n const g = this.props.range;\n const e = this.props.eulerOrder;\n\n const { x } = g[0];\n const y = g[1].x;\n const z = g[2].x;\n const dx = g[0].y - x || 1;\n const dy = g[1].y - y || 1;\n const dz = g[2].y - z || 1;\n\n // Forward transform\n this.viewMatrix.set(\n 2 / dx,\n 0,\n 0,\n -(2 * x + dx) / dx,\n 0,\n 2 / dy,\n 0,\n -(2 * y + dy) / dy,\n 0,\n 0,\n 2 / dz,\n -(2 * z + dz) / dz,\n 0,\n 0,\n 0,\n 1\n );\n\n const transformMatrix = this.composer(p, r, q, s, null, e);\n this.viewMatrix.multiplyMatrices(transformMatrix, this.viewMatrix);\n\n if (changed[\"view.range\"]) {\n this.trigger({\n type: \"view.range\",\n });\n }\n }\n\n vertex(shader, pass) {\n if (pass === 1) {\n shader.pipe(\"cartesian.position\", this.uniforms);\n }\n return super.vertex(shader, pass);\n }\n}\nCartesian.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { View } from \"./view.js\";\n\nexport class Cartesian4 extends View {\n static initClass() {\n this.traits = [\"node\", \"object\", \"visible\", \"view\", \"view4\", \"vertex\"];\n }\n\n make() {\n super.make();\n\n this.uniforms = {\n basisOffset: this._attributes.make(this._types.vec4()),\n basisScale: this._attributes.make(this._types.vec4()),\n };\n\n this.basisScale = this.uniforms.basisScale.value;\n return (this.basisOffset = this.uniforms.basisOffset.value);\n }\n\n unmake() {\n super.unmake();\n delete this.basisScale;\n delete this.basisOffset;\n return delete this.uniforms;\n }\n\n change(changed, touched, init) {\n if (!touched[\"view\"] && !touched[\"view4\"] && !init) {\n return;\n }\n\n const p = this.props.position;\n const s = this.props.scale;\n const g = this.props.range;\n\n const { x } = g[0];\n const y = g[1].x;\n const z = g[2].x;\n const w = g[3].x;\n const dx = g[0].y - x || 1;\n const dy = g[1].y - y || 1;\n const dz = g[2].y - z || 1;\n const dw = g[3].y - w || 1;\n\n const mult = function (a, b) {\n a.x *= b.x;\n a.y *= b.y;\n a.z *= b.z;\n return (a.w *= b.w);\n };\n\n // 4D axis adjustment\n this.basisScale.set(2 / dx, 2 / dy, 2 / dz, 2 / dw);\n this.basisOffset.set(\n -(2 * x + dx) / dx,\n -(2 * y + dy) / dy,\n -(2 * z + dz) / dz,\n -(2 * w + dw) / dw\n );\n\n // 4D scale\n mult(this.basisScale, s);\n mult(this.basisOffset, s);\n\n // 4D position\n this.basisOffset.add(p);\n\n if (changed[\"view.range\"]) {\n return this.trigger({\n type: \"view.range\",\n });\n }\n }\n\n vertex(shader, pass) {\n if (pass === 1) {\n shader.pipe(\"cartesian4.position\", this.uniforms);\n }\n return super.vertex(shader, pass);\n }\n}\nCartesian4.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UAxis from \"../../../util/axis.js\";\nimport * as UThree from \"../../../util/three.js\";\n\nimport { Vector2 } from \"three/src/math/Vector2.js\";\nimport { View } from \"./view.js\";\n\nexport class Polar extends View {\n static initClass() {\n this.traits = [\n \"node\",\n \"object\",\n \"visible\",\n \"view\",\n \"view3\",\n \"polar\",\n \"vertex\",\n ];\n }\n\n make() {\n super.make();\n\n const { types } = this._attributes;\n this.uniforms = {\n polarBend: this.node.attributes[\"polar.bend\"],\n polarHelix: this.node.attributes[\"polar.helix\"],\n polarFocus: this._attributes.make(types.number()),\n polarAspect: this._attributes.make(types.number()),\n viewMatrix: this._attributes.make(types.mat4()),\n };\n\n this.viewMatrix = this.uniforms.viewMatrix.value;\n this.composer = UThree.transformComposer();\n\n return (this.aspect = 1);\n }\n\n unmake() {\n super.unmake();\n\n delete this.viewMatrix;\n delete this.objectMatrix;\n delete this.aspect;\n return delete this.uniforms;\n }\n\n change(changed, touched, init) {\n let aspect, bend, focus;\n if (!touched[\"view\"] && !touched[\"view3\"] && !touched[\"polar\"] && !init) {\n return;\n }\n\n this.helix = this.props.helix;\n this.bend = bend = this.props.bend;\n\n this.focus = focus = bend > 0 ? 1 / bend - 1 : 0;\n\n const p = this.props.position;\n const s = this.props.scale;\n const q = this.props.quaternion;\n const r = this.props.rotation;\n const g = this.props.range;\n const e = this.props.eulerOrder;\n\n const { x } = g[0];\n let y = g[1].x;\n const z = g[2].x;\n const dx = g[0].y - x || 1;\n let dy = g[1].y - y || 1;\n const dz = g[2].y - z || 1;\n const sx = s.x;\n const sy = s.y;\n\n // Watch for negative scales.\n const idx = dx > 0 ? 1 : -1;\n\n // Recenter viewport on origin the more it's bent\n [y, dy] = Array.from(UAxis.recenterAxis(y, dy, bend));\n\n // Adjust viewport range for polar transform.\n // As the viewport goes polar, the X-range is interpolated to the Y-range instead,\n // creating a square/circular viewport.\n const ady = Math.abs(dy);\n const fdx = dx + (ady * idx - dx) * bend;\n const sdx = fdx / sx;\n const sdy = dy / sy;\n this.aspect = aspect = Math.abs(sdx / sdy);\n\n this.uniforms.polarFocus.value = focus;\n this.uniforms.polarAspect.value = aspect;\n\n // Forward transform\n this.viewMatrix.set(\n 2 / fdx,\n 0,\n 0,\n -(2 * x + dx) / dx,\n 0,\n 2 / dy,\n 0,\n -(2 * y + dy) / dy,\n 0,\n 0,\n 2 / dz,\n -(2 * z + dz) / dz,\n 0,\n 0,\n 0,\n 1 //,\n );\n\n const transformMatrix = this.composer(p, r, q, s, null, e);\n this.viewMatrix.multiplyMatrices(transformMatrix, this.viewMatrix);\n\n if (changed[\"view.range\"] || touched[\"polar\"]) {\n this.trigger({\n type: \"view.range\",\n });\n }\n }\n\n vertex(shader, pass) {\n if (pass === 1) {\n shader.pipe(\"polar.position\", this.uniforms);\n }\n return super.vertex(shader, pass);\n }\n\n axis(dimension) {\n const range = this.props.range[dimension - 1];\n let min = range.x;\n let max = range.y;\n\n // Correct Y extents during polar warp.\n if (dimension === 2 && this.bend > 0) {\n max = Math.max(Math.abs(max), Math.abs(min));\n min = Math.max(-this.focus / this.aspect, min);\n }\n\n return new Vector2(min, max);\n }\n}\nPolar.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UAxis from \"../../../util/axis.js\";\nimport * as UThree from \"../../../util/three.js\";\n\nimport { Vector2 } from \"three/src/math/Vector2.js\";\nimport { View } from \"./view.js\";\n\nexport class Spherical extends View {\n static initClass() {\n this.traits = [\n \"node\",\n \"object\",\n \"visible\",\n \"view\",\n \"view3\",\n \"spherical\",\n \"vertex\",\n ];\n }\n\n make() {\n super.make();\n\n this.uniforms = {\n sphericalBend: this.node.attributes[\"spherical.bend\"],\n sphericalFocus: this._attributes.make(this._types.number()),\n sphericalAspectX: this._attributes.make(this._types.number()),\n sphericalAspectY: this._attributes.make(this._types.number()),\n sphericalScaleY: this._attributes.make(this._types.number()),\n viewMatrix: this._attributes.make(this._types.mat4()),\n };\n\n this.viewMatrix = this.uniforms.viewMatrix.value;\n this.composer = UThree.transformComposer();\n\n this.aspectX = 1;\n return (this.aspectY = 1);\n }\n\n unmake() {\n super.unmake();\n\n delete this.viewMatrix;\n delete this.objectMatrix;\n delete this.aspectX;\n delete this.aspectY;\n return delete this.uniforms;\n }\n\n change(changed, touched, init) {\n let aspectX, aspectY, bend, focus, scaleY;\n if (\n !touched[\"view\"] &&\n !touched[\"view3\"] &&\n !touched[\"spherical\"] &&\n !init\n ) {\n return;\n }\n\n this.bend = bend = this.props.bend;\n this.focus = focus = bend > 0 ? 1 / bend - 1 : 0;\n\n const p = this.props.position;\n const s = this.props.scale;\n const q = this.props.quaternion;\n const r = this.props.rotation;\n const g = this.props.range;\n const e = this.props.eulerOrder;\n\n const { x } = g[0];\n let y = g[1].x;\n let z = g[2].x;\n const dx = g[0].y - x || 1;\n let dy = g[1].y - y || 1;\n let dz = g[2].y - z || 1;\n const sx = s.x;\n const sy = s.y;\n const sz = s.z;\n\n // Recenter viewport on origin the more it's bent\n [y, dy] = Array.from(UAxis.recenterAxis(y, dy, bend));\n [z, dz] = Array.from(UAxis.recenterAxis(z, dz, bend));\n\n // Watch for negative scales.\n const idx = dx > 0 ? 1 : -1;\n const idy = dy > 0 ? 1 : -1;\n\n // Adjust viewport range for spherical transform.\n // As the viewport goes spherical, the X/Y-ranges are interpolated to the Z-range,\n // creating a perfectly spherical viewport.\n const adz = Math.abs(dz);\n const fdx = dx + (adz * idx - dx) * bend;\n const fdy = dy + (adz * idy - dy) * bend;\n const sdx = fdx / sx;\n const sdy = fdy / sy;\n const sdz = dz / sz;\n this.aspectX = aspectX = Math.abs(sdx / sdz);\n this.aspectY = aspectY = Math.abs(sdy / sdz / aspectX);\n\n // Scale Y coordinates before transforming, but cap at aspectY/alpha to prevent from poking through the poles mid-transform.\n // See shaders/glsl/spherical.position.glsl\n const aspectZ = (((dy / dx) * sx) / sy) * 2; // Factor of 2 due to the fact that in the Y direction we only go 180º from pole to pole.\n this.scaleY = scaleY = Math.min(aspectY / bend, 1 + (aspectZ - 1) * bend);\n\n this.uniforms.sphericalBend.value = bend;\n this.uniforms.sphericalFocus.value = focus;\n this.uniforms.sphericalAspectX.value = aspectX;\n this.uniforms.sphericalAspectY.value = aspectY;\n this.uniforms.sphericalScaleY.value = scaleY;\n\n // Forward transform\n this.viewMatrix.set(\n 2 / fdx,\n 0,\n 0,\n -(2 * x + dx) / dx,\n 0,\n 2 / fdy,\n 0,\n -(2 * y + dy) / dy,\n 0,\n 0,\n 2 / dz,\n -(2 * z + dz) / dz,\n 0,\n 0,\n 0,\n 1 //,\n );\n\n const transformMatrix = this.composer(p, r, q, s, null, e);\n this.viewMatrix.multiplyMatrices(transformMatrix, this.viewMatrix);\n\n if (changed[\"view.range\"] || touched[\"spherical\"]) {\n return this.trigger({\n type: \"view.range\",\n });\n }\n }\n\n vertex(shader, pass) {\n if (pass === 1) {\n shader.pipe(\"spherical.position\", this.uniforms);\n }\n return super.vertex(shader, pass);\n }\n\n axis(dimension) {\n const range = this.props.range[dimension - 1];\n let min = range.x;\n let max = range.y;\n\n // Correct Z extents during polar warp.\n if (dimension === 3 && this.bend > 0) {\n max = Math.max(Math.abs(max), Math.abs(min));\n min = Math.max(-this.focus / this.aspectX + 0.001, min);\n }\n\n return new Vector2(min, max);\n }\n}\nSpherical.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UAxis from \"../../../util/axis.js\";\nimport * as UThree from \"../../../util/three.js\";\n\nimport { View } from \"./view.js\";\n\nexport class Stereographic extends View {\n static initClass() {\n this.traits = [\n \"node\",\n \"object\",\n \"visible\",\n \"view\",\n \"view3\",\n \"stereographic\",\n \"vertex\",\n ];\n }\n\n make() {\n super.make();\n\n this.uniforms = {\n stereoBend: this.node.attributes[\"stereographic.bend\"],\n viewMatrix: this._attributes.make(this._types.mat4()),\n };\n\n this.viewMatrix = this.uniforms.viewMatrix.value;\n return (this.composer = UThree.transformComposer());\n }\n\n unmake() {\n super.unmake();\n\n delete this.viewMatrix;\n delete this.rotationMatrix;\n return delete this.uniforms;\n }\n\n change(changed, touched, init) {\n let bend;\n if (\n !touched[\"view\"] &&\n !touched[\"view3\"] &&\n !touched[\"stereographic\"] &&\n !init\n ) {\n return;\n }\n\n this.bend = bend = this.props.bend;\n\n const p = this.props.position;\n const s = this.props.scale;\n const q = this.props.quaternion;\n const r = this.props.rotation;\n const g = this.props.range;\n const e = this.props.eulerOrder;\n\n const { x } = g[0];\n const y = g[1].x;\n let z = g[2].x;\n const dx = g[0].y - x || 1;\n const dy = g[1].y - y || 1;\n let dz = g[2].y - z || 1;\n\n // Recenter viewport on projection point the more it's bent\n [z, dz] = Array.from(UAxis.recenterAxis(z, dz, bend, 1));\n\n this.uniforms.stereoBend.value = bend;\n\n // Forward transform\n this.viewMatrix.set(\n 2 / dx,\n 0,\n 0,\n -(2 * x + dx) / dx,\n 0,\n 2 / dy,\n 0,\n -(2 * y + dy) / dy,\n 0,\n 0,\n 2 / dz,\n -(2 * z + dz) / dz,\n 0,\n 0,\n 0,\n 1 //,\n );\n\n const transformMatrix = this.composer(p, r, q, s, null, e);\n this.viewMatrix.multiplyMatrices(transformMatrix, this.viewMatrix);\n\n if (changed[\"view.range\"] || touched[\"stereographic\"]) {\n return this.trigger({\n type: \"view.range\",\n });\n }\n }\n\n vertex(shader, pass) {\n if (pass === 1) {\n shader.pipe(\"stereographic.position\", this.uniforms);\n }\n return super.vertex(shader, pass);\n }\n}\nStereographic.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UAxis from \"../../../util/axis.js\";\n\nimport { View } from \"./view.js\";\n\nexport class Stereographic4 extends View {\n static initClass() {\n this.traits = [\n \"node\",\n \"object\",\n \"visible\",\n \"view\",\n \"view4\",\n \"stereographic\",\n \"vertex\",\n ];\n }\n\n make() {\n super.make();\n\n this.uniforms = {\n basisOffset: this._attributes.make(this._types.vec4()),\n basisScale: this._attributes.make(this._types.vec4()),\n stereoBend: this.node.attributes[\"stereographic.bend\"],\n };\n\n this.basisScale = this.uniforms.basisScale.value;\n this.basisOffset = this.uniforms.basisOffset.value;\n }\n\n unmake() {\n super.unmake();\n\n delete this.basisScale;\n delete this.basisOffset;\n delete this.uniforms;\n }\n\n change(changed, touched, init) {\n let bend;\n if (\n !touched[\"view\"] &&\n !touched[\"view4\"] &&\n !touched[\"stereographic\"] &&\n !init\n ) {\n return;\n }\n\n this.bend = bend = this.props.bend;\n\n const p = this.props.position;\n const s = this.props.scale;\n const g = this.props.range;\n\n const { x } = g[0];\n const y = g[1].x;\n const z = g[2].x;\n let w = g[3].x;\n const dx = g[0].y - x || 1;\n const dy = g[1].y - y || 1;\n const dz = g[2].y - z || 1;\n let dw = g[3].y - w || 1;\n\n const mult = function (a, b) {\n a.x *= b.x;\n a.y *= b.y;\n a.z *= b.z;\n a.w *= b.w;\n };\n\n // Recenter viewport on projection point the more it's bent\n [w, dw] = Array.from(UAxis.recenterAxis(w, dw, bend, 1));\n\n // 4D axis adjustment\n this.basisScale.set(2 / dx, 2 / dy, 2 / dz, 2 / dw);\n this.basisOffset.set(\n -(2 * x + dx) / dx,\n -(2 * y + dy) / dy,\n -(2 * z + dz) / dz,\n -(2 * w + dw) / dw\n );\n\n // 4D scale\n mult(this.basisScale, s);\n mult(this.basisOffset, s);\n\n // 4D position\n this.basisOffset.add(p);\n\n if (changed[\"view.range\"] || touched[\"stereographic\"]) {\n this.trigger({\n type: \"view.range\",\n });\n }\n }\n\n vertex(shader, pass) {\n if (pass === 1) {\n shader.pipe(\"stereographic4.position\", this.uniforms);\n }\n return super.vertex(shader, pass);\n }\n}\nStereographic4.initClass();\n","export * from \"./view.js\";\nexport * from \"./cartesian.js\";\nexport * from \"./cartesian4.js\";\nexport * from \"./polar.js\";\nexport * from \"./spherical.js\";\nexport * from \"./stereographic.js\";\nexport * from \"./stereographic4.js\";\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Primitive } from \"../../primitive.js\";\n\nexport class Shader extends Primitive {\n static initClass() {\n this.traits = [\"node\", \"bind\", \"shader\"];\n this.freeform = true;\n }\n\n init() {\n return (this.shader = null);\n }\n\n make() {\n const { language, code } = this.props;\n if (language !== \"glsl\") {\n throw new Error(\"GLSL required\");\n }\n\n // Bind to attached data sources\n this._helpers.bind.make([\n { to: \"shader.sources\", trait: \"source\", multiple: true },\n ]);\n\n // Parse snippet w/ shadergraph (will do implicit DOM script tag by ID\n // lookup if simple selector or ID given)\n const snippet = this._shaders.fetch(code);\n\n // Convert uniforms to attributes\n const types = this._types;\n const uniforms = {};\n var make = (type) => {\n switch (type) {\n case \"i\":\n return types.int();\n case \"f\":\n return types.number();\n case \"v2\":\n return types.vec2();\n case \"v3\":\n return types.vec3();\n case \"v4\":\n return types.vec4();\n case \"m3\":\n return types.mat3();\n case \"m4\":\n return types.mat4();\n case \"t\":\n return types.object();\n default:\n var t = type.split(\"\");\n if (t.pop() === \"v\") {\n return types.array(make(t.join(\"\")));\n } else {\n return null;\n }\n }\n };\n\n for (let def of Array.from(snippet._signatures.uniform)) {\n var type;\n if ((type = make(def.type))) {\n uniforms[def.name] = type;\n }\n }\n\n // Reconfigure node model\n return this.reconfigure({ props: { uniform: uniforms } });\n }\n\n made() {\n // Notify of shader reallocation\n return this.trigger({\n type: \"source.rebuild\",\n });\n }\n\n unmake() {\n return (this.shader = null);\n }\n\n change(changed, _touched, _init) {\n if (\n changed[\"shader.uniforms\"] ||\n changed[\"shader.code\"] ||\n changed[\"shader.language\"]\n ) {\n return this.rebuild();\n }\n }\n\n shaderBind(uniforms) {\n let k, u, v;\n if (uniforms == null) {\n uniforms = {};\n }\n const { code } = this.props;\n\n // Merge in prop attributes as uniforms\n for (k in this.node.attributes) {\n v = this.node.attributes[k];\n if (v.type != null && v.short != null && v.ns === \"uniform\") {\n if (uniforms[v.short] == null) {\n uniforms[v.short] = v;\n }\n }\n }\n\n // Merge in explicit uniform object if set\n if ((u = this.props.uniforms) != null) {\n for (k in u) {\n v = u[k];\n uniforms[k] = v;\n }\n }\n\n // New shader\n const s = this._shaders.shader();\n\n // Require sources\n if (this.bind.sources != null) {\n for (let source of Array.from(this.bind.sources)) {\n s.require(source.sourceShader(this._shaders.shader()));\n }\n }\n\n // Build bound shader\n return s.pipe(code, uniforms);\n }\n}\nShader.initClass();\n","export * from \"./shader.js\";\n","/* eslint-disable sort-imports */\nimport { Group, Inherit, Root, Unit } from \"./base\";\nimport { Camera } from \"./camera\";\nimport { Area, Array_, Interval, Matrix, Scale, Volume, Voxel } from \"./data\";\nimport {\n Axis,\n Face,\n Grid,\n Line,\n Point,\n Strip,\n Surface,\n Ticks,\n Vector,\n} from \"./draw\";\nimport { DOM, HTML } from \"./overlay\";\nimport { Format, Label, Retext, Text } from \"./text\";\nimport { Clock, Now } from \"./time\";\nimport {\n Fragment,\n Layer,\n Mask,\n Transform3,\n Transform4,\n Vertex,\n} from \"./transform\";\nimport {\n Clamp,\n Grow,\n Join,\n Lerp,\n Memo,\n Readback,\n Repeat,\n Resample,\n Slice,\n Split,\n Spread,\n Subdivide,\n Swizzle,\n Transpose,\n} from \"./operator\";\nimport { Move, Play, Present, Reveal, Slide, Step } from \"./present\";\nimport { Compose, RTT } from \"./rtt\";\nimport {\n Cartesian,\n Cartesian4,\n Polar,\n Spherical,\n Stereographic,\n Stereographic4,\n View,\n} from \"./view\";\n\nimport { Shader } from \"./shader\";\n\nexport const Classes = {\n axis: Axis,\n face: Face,\n grid: Grid,\n line: Line,\n point: Point,\n strip: Strip,\n surface: Surface,\n ticks: Ticks,\n vector: Vector,\n\n view: View,\n cartesian: Cartesian,\n cartesian4: Cartesian4,\n polar: Polar,\n spherical: Spherical,\n stereographic: Stereographic,\n stereographic4: Stereographic4,\n\n transform: Transform3,\n transform4: Transform4,\n vertex: Vertex,\n fragment: Fragment,\n layer: Layer,\n mask: Mask,\n\n array: Array_,\n interval: Interval,\n matrix: Matrix,\n area: Area,\n voxel: Voxel,\n volume: Volume,\n scale: Scale,\n\n html: HTML,\n dom: DOM,\n\n text: Text,\n format: Format,\n label: Label,\n retext: Retext,\n\n clamp: Clamp,\n grow: Grow,\n join: Join,\n lerp: Lerp,\n memo: Memo,\n readback: Readback,\n resample: Resample,\n repeat: Repeat,\n swizzle: Swizzle,\n spread: Spread,\n split: Split,\n slice: Slice,\n subdivide: Subdivide,\n transpose: Transpose,\n\n group: Group,\n inherit: Inherit,\n root: Root,\n unit: Unit,\n\n shader: Shader,\n\n camera: Camera,\n\n rtt: RTT,\n compose: Compose,\n\n clock: Clock,\n now: Now,\n\n move: Move,\n play: Play,\n present: Present,\n reveal: Reveal,\n slide: Slide,\n step: Step,\n};\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining\n * DS104: Avoid inline assignments\n * DS202: Simplify dynamic range loops\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UData from \"../../util/data.js\";\nimport * as UJS from \"../../util/js.js\";\n\nimport {\n ByteType,\n FloatType,\n IntType,\n LinearFilter,\n LinearMipMapLinearFilter,\n LinearMipMapNearestFilter,\n NearestFilter,\n NearestMipMapLinearFilter,\n NearestMipMapNearestFilter,\n ShortType,\n UnsignedByteType,\n UnsignedIntType,\n UnsignedShortType,\n} from \"three/src/constants.js\";\nimport { Color } from \"three/src/math/Color.js\";\nimport { Matrix3 } from \"three/src/math/Matrix3.js\";\nimport { Matrix4 } from \"three/src/math/Matrix4.js\";\nimport { Quaternion } from \"three/src/math/Quaternion.js\";\nimport { Vector2 } from \"three/src/math/Vector2.js\";\nimport { Vector3 } from \"three/src/math/Vector3.js\";\nimport { Vector4 } from \"three/src/math/Vector4.js\";\n\n// Property types\n//\n// The weird calling convention is for double-buffering the values\n// while validating compound types like arrays and nullables.\n//\n// validate: (value, target, invalid) ->\n//\n// # Option 1: Call invalid() to reject\n// return invalid() if value < 0\n//\n// # Option 2: Change target in-place\n// target.set(value)\n// return target\n//\n// # Option 3: Return new value\n// return +value\n//\nvar _Types = {\n array(type, size, value = null) {\n const lerp = type.lerp\n ? function (a, b, target, f) {\n const l = Math.min(a.length, b.length);\n for (\n let i = 0, end = l, asc = 0 <= end;\n asc ? i < end : i > end;\n asc ? i++ : i--\n ) {\n target[i] = type.lerp(a[i], b[i], target[i], f);\n }\n return target;\n }\n : undefined;\n\n const op = type.op\n ? function (a, b, target, op) {\n const l = Math.min(a.length, b.length);\n for (\n let i = 0, end = l, asc = 0 <= end;\n asc ? i < end : i > end;\n asc ? i++ : i--\n ) {\n target[i] = type.op(a[i], b[i], target[i], op);\n }\n return target;\n }\n : undefined;\n\n if (value != null && !(value instanceof Array)) {\n value = [value];\n }\n\n return {\n uniform() {\n if (type.uniform) {\n return type.uniform() + \"v\";\n } else {\n return undefined;\n }\n },\n make() {\n if (value != null) {\n return value.slice();\n }\n if (!size) {\n return [];\n }\n return __range__(0, size, false).map((_i) => type.make());\n },\n validate(value, target, invalid) {\n if (!(value instanceof Array)) {\n value = [value];\n }\n\n const l = (target.length = size ? size : value.length);\n for (\n let i = 0, end = l, asc = 0 <= end;\n asc ? i < end : i > end;\n asc ? i++ : i--\n ) {\n const input = value[i] != null ? value[i] : type.make();\n target[i] = type.validate(input, target[i], invalid);\n }\n\n return target;\n },\n equals(a, b) {\n const al = a.length;\n const bl = b.length;\n if (al !== bl) {\n return false;\n }\n\n const l = Math.min(al, bl);\n for (\n let i = 0, end = l, asc = 0 <= end;\n asc ? i < end : i > end;\n asc ? i++ : i--\n ) {\n if (\n !(typeof type.equals === \"function\"\n ? type.equals(a[i], b[i])\n : undefined)\n ) {\n return false;\n }\n }\n return true;\n },\n lerp,\n op,\n clone(v) {\n return Array.from(v).map((x) => type.clone(x));\n },\n };\n },\n\n letters(type, size, value = null) {\n if (value != null) {\n if (value === \"\" + value) {\n value = value.split(\"\");\n }\n for (let i = 0; i < value.length; i++) {\n const v = value[i];\n value[i] = type.validate(v, v);\n }\n }\n\n const array = Types.array(type, size, value);\n\n return {\n uniform() {\n return array.uniform();\n },\n make() {\n return array.make();\n },\n validate(value, target, invalid) {\n if (value === \"\" + value) {\n value = value.split(\"\");\n }\n return array.validate(value, target, invalid);\n },\n equals(a, b) {\n return array.equals(a, b);\n },\n clone: array.clone,\n };\n },\n\n nullable(type, make) {\n if (make == null) {\n make = false;\n }\n let value = make ? type.make() : null;\n\n const emitter = type.emitter\n ? function (expr1, expr2) {\n if (expr2 == null) {\n return expr1;\n }\n if (expr1 == null) {\n return expr2;\n }\n return type.emitter(expr1, expr2);\n }\n : undefined;\n\n const lerp = type.lerp\n ? function (a, b, target, f) {\n if (a === null || b === null) {\n if (f < 0.5) {\n return a;\n } else {\n return b;\n }\n }\n if (target == null) {\n target = type.make();\n }\n value = type.lerp(a, b, target, f);\n return target;\n }\n : undefined;\n\n const op = type.op\n ? function (a, b, target, op) {\n if (a === null || b === null) {\n return null;\n }\n if (target == null) {\n target = type.make();\n }\n value = type.op(a, b, target, op);\n return value;\n }\n : undefined;\n\n return {\n make() {\n return value;\n },\n validate(value, target, invalid) {\n if (value === null) {\n return value;\n }\n if (target === null) {\n target = type.make();\n }\n return type.validate(value, target, invalid);\n },\n uniform() {\n return typeof type.uniform === \"function\" ? type.uniform() : undefined;\n },\n equals(a, b) {\n let left;\n const an = a === null;\n const bn = b === null;\n if (an && bn) {\n return true;\n }\n if (an ^ bn) {\n return false;\n }\n return (left =\n typeof type.equals === \"function\" ? type.equals(a, b) : undefined) !=\n null\n ? left\n : a === b;\n },\n lerp,\n op,\n emitter,\n };\n },\n\n enum(value, keys, map) {\n let key;\n if (keys == null) {\n keys = [];\n }\n if (map == null) {\n map = {};\n }\n let i = 0;\n const values = {};\n for (key of Array.from(keys)) {\n if (key !== +key) {\n if (map[key] == null) {\n map[key] = i++;\n }\n }\n }\n for (key of Array.from(keys)) {\n if (key === +key) {\n values[key] = key;\n }\n }\n for (key in map) {\n i = map[key];\n values[i] = true;\n }\n\n if (values[value] == null) {\n value = map[value];\n }\n\n return {\n enum() {\n return map;\n },\n make() {\n return value;\n },\n validate(value, target, invalid) {\n const v = values[value] ? value : map[value];\n if (v != null) {\n return v;\n }\n return invalid();\n },\n };\n },\n\n enumber(value, keys, map) {\n if (map == null) {\n map = {};\n }\n const _enum = Types.enum(value, keys, map);\n\n return {\n enum: _enum.enum,\n uniform() {\n return \"f\";\n },\n make() {\n let left;\n return (left = _enum.make()) != null ? left : +value;\n },\n validate(value, target, invalid) {\n if (value === +value) {\n return value;\n }\n return _enum.validate(value, target, invalid);\n },\n op(a, b, target, op) {\n return op(a, b);\n },\n };\n },\n\n select(value) {\n if (value == null) {\n value = \"<\";\n }\n value;\n return {\n make() {\n return value;\n },\n validate(value, target, invalid) {\n if (typeof value === \"string\") {\n return value;\n }\n if (typeof value === \"object\") {\n return value;\n }\n return invalid();\n },\n };\n },\n\n bool(value) {\n value = !!value;\n return {\n uniform() {\n return \"f\";\n },\n make() {\n return value;\n },\n validate(value, _target, _invalid) {\n return !!value;\n },\n };\n },\n\n int(value) {\n if (value == null) {\n value = 0;\n }\n value = +Math.round(value);\n return {\n uniform() {\n return \"i\";\n },\n make() {\n return value;\n },\n validate(value, target, invalid) {\n let x;\n if (value !== (x = +value)) {\n return invalid();\n }\n return Math.round(x) || 0;\n },\n op(a, b, target, op) {\n return op(a, b);\n },\n };\n },\n\n round(value) {\n if (value == null) {\n value = 0;\n }\n value = +Math.round(value);\n return {\n uniform() {\n return \"f\";\n },\n make() {\n return value;\n },\n validate(value, target, invalid) {\n let x;\n if (value !== (x = +value)) {\n return invalid();\n }\n return Math.round(x) || 0;\n },\n op(a, b, target, op) {\n return op(a, b);\n },\n };\n },\n\n number(value) {\n if (value == null) {\n value = 0;\n }\n return {\n uniform() {\n return \"f\";\n },\n make() {\n return +value;\n },\n validate(value, target, invalid) {\n let x;\n if (value !== (x = +value)) {\n return invalid();\n }\n return x || 0;\n },\n op(a, b, target, op) {\n return op(a, b);\n },\n };\n },\n\n positive(type, strict) {\n if (strict == null) {\n strict = false;\n }\n return {\n uniform: type.uniform,\n make: type.make,\n validate(value, target, invalid) {\n value = type.validate(value, target, invalid);\n if (value < 0 || (strict && value <= 0)) {\n return invalid();\n }\n return value;\n },\n op(a, b, target, op) {\n return op(a, b);\n },\n };\n },\n\n string(value) {\n if (value == null) {\n value = \"\";\n }\n return {\n make() {\n return \"\" + value;\n },\n validate(value, target, invalid) {\n let x;\n if (value !== (x = \"\" + value)) {\n return invalid();\n }\n return x;\n },\n };\n },\n\n func() {\n return {\n make() {\n return function () {};\n },\n validate(value, target, invalid) {\n if (typeof value === \"function\") {\n return value;\n }\n return invalid();\n },\n };\n },\n\n emitter() {\n return {\n make() {\n return (emit) => emit(1, 1, 1, 1);\n },\n validate(value, target, invalid) {\n if (typeof value === \"function\") {\n return value;\n }\n return invalid();\n },\n emitter(a, b) {\n return UData.getLerpEmitter(a, b);\n },\n };\n },\n\n object(value) {\n return {\n make() {\n return value != null ? value : {};\n },\n validate(value, target, invalid) {\n if (typeof value === \"object\") {\n return value;\n }\n return invalid();\n },\n clone(v) {\n return JSON.parse(JSON.stringify(v));\n },\n };\n },\n\n timestamp(value = null) {\n if (typeof value === \"string\") {\n value = Date.parse(value);\n }\n\n return {\n uniform() {\n return \"f\";\n },\n make() {\n return value != null ? value : +new Date();\n },\n validate(value, target, invalid) {\n value = Date.parse(value);\n if (value !== +value) {\n return invalid();\n }\n return value;\n },\n op(a, b, target, op) {\n return op(a, b);\n },\n };\n },\n\n vec2(x, y) {\n if (x == null) {\n x = 0;\n }\n if (y == null) {\n y = 0;\n }\n const defaults = [x, y];\n return {\n uniform() {\n return \"v2\";\n },\n make() {\n return new Vector2(x, y);\n },\n validate(value, target, invalid) {\n if (value === +value) {\n value = [value];\n }\n\n if (value instanceof Vector2) {\n target.copy(value);\n } else if (value instanceof Array) {\n value = value.concat(defaults.slice(value.length));\n target.set.apply(target, value);\n } else if (value != null) {\n const xx = value.x != null ? value.x : x;\n const yy = value.y != null ? value.y : y;\n target.set(xx, yy);\n } else {\n return invalid();\n }\n return target;\n },\n\n equals(a, b) {\n return a.x === b.x && a.y === b.y;\n },\n op(a, b, target, op) {\n target.x = op(a.x, b.x);\n target.y = op(a.y, b.y);\n return target;\n },\n };\n },\n\n ivec2(x, y) {\n if (x == null) {\n x = 0;\n }\n if (y == null) {\n y = 0;\n }\n const vec2 = Types.vec2(x, y);\n const { validate } = vec2;\n vec2.validate = function (value, target, invalid) {\n validate(value, target, invalid);\n target.x = Math.round(target.x);\n target.y = Math.round(target.y);\n return target;\n };\n return vec2;\n },\n\n vec3(x, y, z) {\n if (x == null) {\n x = 0;\n }\n if (y == null) {\n y = 0;\n }\n if (z == null) {\n z = 0;\n }\n const defaults = [x, y, z];\n return {\n uniform() {\n return \"v3\";\n },\n make() {\n return new Vector3(x, y, z);\n },\n validate(value, target, invalid) {\n if (value === +value) {\n value = [value];\n }\n\n if (value instanceof Vector3) {\n target.copy(value);\n } else if (value instanceof Array) {\n value = value.concat(defaults.slice(value.length));\n target.set.apply(target, value);\n } else if (value != null) {\n const xx = value.x != null ? value.x : x;\n const yy = value.y != null ? value.y : y;\n const zz = value.z != null ? value.z : z;\n target.set(xx, yy, zz);\n } else {\n return invalid();\n }\n return target;\n },\n\n equals(a, b) {\n return a.x === b.x && a.y === b.y && a.z === b.z;\n },\n op(a, b, target, op) {\n target.x = op(a.x, b.x);\n target.y = op(a.y, b.y);\n target.z = op(a.z, b.z);\n return target;\n },\n };\n },\n\n ivec3(x, y, z) {\n if (x == null) {\n x = 0;\n }\n if (y == null) {\n y = 0;\n }\n if (z == null) {\n z = 0;\n }\n const vec3 = Types.vec3(x, y, z);\n const { validate } = vec3;\n vec3.validate = function (value, target, invalid) {\n validate(value, target, invalid);\n target.x = Math.round(target.x);\n target.y = Math.round(target.y);\n target.z = Math.round(target.z);\n return target;\n };\n return vec3;\n },\n\n vec4(x, y, z, w) {\n if (x == null) {\n x = 0;\n }\n if (y == null) {\n y = 0;\n }\n if (z == null) {\n z = 0;\n }\n if (w == null) {\n w = 0;\n }\n const defaults = [x, y, z, w];\n return {\n uniform() {\n return \"v4\";\n },\n make() {\n return new Vector4(x, y, z, w);\n },\n validate(value, target, invalid) {\n if (value === +value) {\n value = [value];\n }\n\n if (value instanceof Vector4) {\n target.copy(value);\n } else if (value instanceof Array) {\n value = value.concat(defaults.slice(value.length));\n target.set.apply(target, value);\n } else if (value != null) {\n const xx = value.x != null ? value.x : x;\n const yy = value.y != null ? value.y : y;\n const zz = value.z != null ? value.z : z;\n const ww = value.w != null ? value.w : w;\n target.set(xx, yy, zz, ww);\n } else {\n return invalid();\n }\n return target;\n },\n equals(a, b) {\n return a.x === b.x && a.y === b.y && a.z === b.z && a.w === b.w;\n },\n op(a, b, target, op) {\n target.x = op(a.x, b.x);\n target.y = op(a.y, b.y);\n target.z = op(a.z, b.z);\n target.w = op(a.w, b.w);\n return target;\n },\n };\n },\n\n ivec4(x, y, z, w) {\n if (x == null) {\n x = 0;\n }\n if (y == null) {\n y = 0;\n }\n if (z == null) {\n z = 0;\n }\n if (w == null) {\n w = 0;\n }\n const vec4 = Types.vec4(x, y, z, w);\n const { validate } = vec4;\n vec4.validate = function (value, target, invalid) {\n validate(value, target, invalid);\n target.x = Math.round(target.x);\n target.y = Math.round(target.y);\n target.z = Math.round(target.z);\n target.w = Math.round(target.w);\n return target;\n };\n return vec4;\n },\n\n mat3(n11, n12, n13, n21, n22, n23, n31, n32, n33) {\n if (n11 == null) {\n n11 = 1;\n }\n if (n12 == null) {\n n12 = 0;\n }\n if (n13 == null) {\n n13 = 0;\n }\n if (n21 == null) {\n n21 = 0;\n }\n if (n22 == null) {\n n22 = 1;\n }\n if (n23 == null) {\n n23 = 0;\n }\n if (n31 == null) {\n n31 = 0;\n }\n if (n32 == null) {\n n32 = 0;\n }\n if (n33 == null) {\n n33 = 1;\n }\n const defaults = [n11, n12, n13, n21, n22, n23, n31, n32, n33];\n\n return {\n uniform() {\n return \"m4\";\n },\n make() {\n const m = new Matrix3();\n m.set(n11, n12, n13, n21, n22, n23, n31, n32, n33);\n return m;\n },\n validate(value, target, invalid) {\n if (value instanceof Matrix3) {\n target.copy(value);\n } else if (value instanceof Array) {\n value = value.concat(defaults.slice(value.length));\n target.set.apply(target, value);\n } else {\n return invalid();\n }\n return target;\n },\n };\n },\n\n mat4(\n n11,\n n12,\n n13,\n n14,\n n21,\n n22,\n n23,\n n24,\n n31,\n n32,\n n33,\n n34,\n n41,\n n42,\n n43,\n n44\n ) {\n if (n11 == null) {\n n11 = 1;\n }\n if (n12 == null) {\n n12 = 0;\n }\n if (n13 == null) {\n n13 = 0;\n }\n if (n14 == null) {\n n14 = 0;\n }\n if (n21 == null) {\n n21 = 0;\n }\n if (n22 == null) {\n n22 = 1;\n }\n if (n23 == null) {\n n23 = 0;\n }\n if (n24 == null) {\n n24 = 0;\n }\n if (n31 == null) {\n n31 = 0;\n }\n if (n32 == null) {\n n32 = 0;\n }\n if (n33 == null) {\n n33 = 1;\n }\n if (n34 == null) {\n n34 = 0;\n }\n if (n41 == null) {\n n41 = 0;\n }\n if (n42 == null) {\n n42 = 0;\n }\n if (n43 == null) {\n n43 = 0;\n }\n if (n44 == null) {\n n44 = 1;\n }\n const defaults = [\n n11,\n n12,\n n13,\n n14,\n n21,\n n22,\n n23,\n n24,\n n31,\n n32,\n n33,\n n34,\n n41,\n n42,\n n43,\n n44,\n ];\n\n return {\n uniform() {\n return \"m4\";\n },\n make() {\n const m = new Matrix4();\n m.set(\n n11,\n n12,\n n13,\n n14,\n n21,\n n22,\n n23,\n n24,\n n31,\n n32,\n n33,\n n34,\n n41,\n n42,\n n43,\n n44\n );\n return m;\n },\n validate(value, target, invalid) {\n if (value instanceof Matrix4) {\n target.copy(value);\n } else if (value instanceof Array) {\n value = value.concat(defaults.slice(value.length));\n target.set.apply(target, value);\n } else {\n return invalid();\n }\n return target;\n },\n };\n },\n\n quat(x, y, z, w) {\n if (x == null) {\n x = 0;\n }\n if (y == null) {\n y = 0;\n }\n if (z == null) {\n z = 0;\n }\n if (w == null) {\n w = 1;\n }\n const vec4 = Types.vec4(x, y, z, w);\n\n return {\n uniform() {\n return \"v4\";\n },\n make() {\n return new Quaternion();\n },\n validate(value, target, invalid) {\n if (value instanceof Quaternion) {\n target.copy(value);\n } else {\n target = vec4.validate(value, target, invalid);\n }\n target.normalize();\n return target;\n },\n equals(a, b) {\n return a.x === b.x && a.y === b.y && a.z === b.z && a.w === b.w;\n },\n op(a, b, target, op) {\n target.x = op(a.x, b.x);\n target.y = op(a.y, b.y);\n target.z = op(a.z, b.z);\n target.w = op(a.w, b.w);\n target.normalize();\n return target;\n },\n lerp(a, b, target, f) {\n if (target.slerpQuaternions) {\n // NOTE: slerpQuaternions replaced the static slerp method in three.js\n // r127. This switch removes the deprecation warning and keeps the\n // project three.js compatible across this version.\n target.slerpQuaternions(a, b, f);\n } else {\n Quaternion.slerp(a, b, target, f);\n }\n return target;\n },\n };\n },\n\n color(r, g, b) {\n if (r == null) {\n r = 0.5;\n }\n if (g == null) {\n g = 0.5;\n }\n if (b == null) {\n b = 0.5;\n }\n const defaults = [r, g, b];\n\n return {\n uniform() {\n return \"c\";\n },\n make() {\n return new Color(r, g, b);\n },\n validate(value, target, invalid) {\n if (value === \"\" + value) {\n value = new Color().setStyle(value);\n } else if (value === +value) {\n value = new Color(value);\n }\n\n if (value instanceof Color) {\n target.copy(value);\n } else if (value instanceof Array) {\n value = value.concat(defaults.slice(value.length));\n target.setRGB.apply(target, value);\n } else if (value != null) {\n const rr = value.r != null ? value.r : r;\n const gg = value.g != null ? value.g : g;\n const bb = value.b != null ? value.b : b;\n target.set(rr, gg, bb);\n } else {\n return invalid();\n }\n return target;\n },\n\n equals(a, b) {\n return a.r === b.r && a.g === b.g && a.b === b.b;\n },\n op(a, b, target, op) {\n target.r = op(a.r, b.r);\n target.g = op(a.g, b.g);\n target.b = op(a.b, b.b);\n return target;\n },\n };\n },\n\n axis(value, allowZero) {\n let v;\n if (value == null) {\n value = 1;\n }\n if (allowZero == null) {\n allowZero = false;\n }\n const map = {\n x: 1,\n y: 2,\n z: 3,\n w: 4,\n W: 1,\n H: 2,\n D: 3,\n I: 4,\n zero: 0,\n null: 0,\n width: 1,\n height: 2,\n depth: 3,\n items: 4,\n };\n\n const range = allowZero ? [0, 1, 2, 3, 4] : [1, 2, 3, 4];\n if ((v = map[value]) != null) {\n value = v;\n }\n\n return {\n make() {\n return value;\n },\n validate(value, target, invalid) {\n let left;\n if ((v = map[value]) != null) {\n value = v;\n }\n value = (left = Math.round(value)) != null ? left : 0;\n if (Array.from(range).includes(value)) {\n return value;\n }\n return invalid();\n },\n };\n },\n\n transpose(order) {\n if (order == null) {\n order = [1, 2, 3, 4];\n }\n const looseArray = Types.letters(Types.axis(null, false), 0, order);\n const axesArray = Types.letters(Types.axis(null, false), 4, order);\n\n return {\n make() {\n return axesArray.make();\n },\n validate(value, target, invalid) {\n let temp = [1, 2, 3, 4];\n looseArray.validate(value, temp, invalid);\n\n if (temp.length < 4) {\n const missing = [1, 2, 3, 4].filter((x) => temp.indexOf(x) === -1);\n temp = temp.concat(missing);\n }\n\n const unique = Array.from(temp).map(\n (letter, i) => temp.indexOf(letter) === i\n );\n if (unique.indexOf(false) < 0) {\n return axesArray.validate(temp, target, invalid);\n }\n return invalid();\n },\n equals: axesArray.equals,\n clone: axesArray.clone,\n };\n },\n\n swizzle(order, size = null) {\n if (order == null) {\n order = [1, 2, 3, 4];\n }\n if (size == null) {\n size = order.length;\n }\n order = order.slice(0, size);\n const looseArray = Types.letters(Types.axis(null, false), 0, order);\n const axesArray = Types.letters(Types.axis(null, true), size, order);\n\n return {\n make() {\n return axesArray.make();\n },\n validate(value, target, invalid) {\n let temp = order.slice();\n looseArray.validate(value, temp, invalid);\n\n if (temp.length < size) {\n temp = temp.concat([0, 0, 0, 0]).slice(0, size);\n }\n\n return axesArray.validate(temp, target, invalid);\n },\n equals: axesArray.equals,\n clone: axesArray.clone,\n };\n },\n\n classes() {\n const stringArray = Types.array(Types.string());\n\n return {\n make() {\n return stringArray.make();\n },\n validate(value, target, invalid) {\n if (value === \"\" + value) {\n value = value.split(\" \");\n }\n value = value.filter((x) => !!x.length);\n return stringArray.validate(value, target, invalid);\n },\n equals: stringArray.equals,\n clone: stringArray.clone,\n };\n },\n\n blending(value) {\n if (value == null) {\n value = \"normal\";\n }\n const keys = [\"no\", \"normal\", \"add\", \"subtract\", \"multiply\", \"custom\"];\n return Types.enum(value, keys);\n },\n\n filter(value) {\n if (value == null) {\n value = \"nearest\";\n }\n const map = {\n nearest: NearestFilter,\n nearestMipMapNearest: NearestMipMapNearestFilter,\n nearestMipMapLinear: NearestMipMapLinearFilter,\n linear: LinearFilter,\n linearMipMapNearest: LinearMipMapNearestFilter,\n linearMipmapLinear: LinearMipMapLinearFilter,\n };\n\n return Types.enum(value, [], map);\n },\n\n type(value) {\n if (value == null) {\n value = \"unsignedByte\";\n }\n const map = {\n unsignedByte: UnsignedByteType,\n byte: ByteType,\n short: ShortType,\n unsignedShort: UnsignedShortType,\n int: IntType,\n unsignedInt: UnsignedIntType,\n float: FloatType,\n };\n\n return Types.enum(value, [], map);\n },\n\n scale(value) {\n if (value == null) {\n value = \"linear\";\n }\n const keys = [\"linear\", \"log\"];\n return Types.enum(value, keys);\n },\n\n mapping(value) {\n if (value == null) {\n value = \"relative\";\n }\n const keys = [\"relative\", \"absolute\"];\n return Types.enum(value, keys);\n },\n\n indexing(value) {\n if (value == null) {\n value = \"original\";\n }\n const keys = [\"original\", \"final\"];\n return Types.enum(value, keys);\n },\n\n shape(value) {\n if (value == null) {\n value = \"circle\";\n }\n const keys = [\"circle\", \"square\", \"diamond\", \"up\", \"down\", \"left\", \"right\"];\n return Types.enum(value, keys);\n },\n\n join(value) {\n if (value == null) {\n value = \"miter\";\n }\n const keys = [\"miter\", \"round\", \"bevel\"];\n return Types.enum(value, keys);\n },\n\n stroke(value) {\n if (value == null) {\n value = \"solid\";\n }\n const keys = [\"solid\", \"dotted\", \"dashed\"];\n return Types.enum(value, keys);\n },\n\n vertexPass(value) {\n if (value == null) {\n value = \"view\";\n }\n const keys = [\"data\", \"view\", \"world\", \"eye\"];\n return Types.enum(value, keys);\n },\n\n fragmentPass(value) {\n if (value == null) {\n value = \"light\";\n }\n const keys = [\"color\", \"light\", \"rgba\"];\n return Types.enum(value, keys);\n },\n\n ease(value) {\n if (value == null) {\n value = \"linear\";\n }\n const keys = [\"linear\", \"cosine\", \"binary\", \"hold\"];\n return Types.enum(value, keys);\n },\n\n fit(value) {\n if (value == null) {\n value = \"contain\";\n }\n const keys = [\"x\", \"y\", \"contain\", \"cover\"];\n return Types.enum(value, keys);\n },\n\n anchor(value) {\n if (value == null) {\n value = \"middle\";\n }\n const map = {\n first: 1,\n middle: 0,\n last: -1,\n };\n\n return Types.enumber(value, [], map);\n },\n\n transitionState(value) {\n if (value == null) {\n value = \"enter\";\n }\n const map = {\n enter: -1,\n visible: 0,\n exit: 1,\n };\n\n return Types.enumber(value, [], map);\n },\n\n font(value) {\n if (value == null) {\n value = \"sans-serif\";\n }\n const parse = UJS.parseQuoted;\n if (!(value instanceof Array)) {\n value = parse(value);\n }\n const stringArray = Types.array(Types.string(), 0, value);\n\n return {\n make() {\n return stringArray.make();\n },\n validate(value, target, invalid) {\n try {\n if (!(value instanceof Array)) {\n value = parse(value);\n }\n } catch (error) {\n return invalid();\n }\n\n value = value.filter((x) => !!x.length);\n return stringArray.validate(value, target, invalid);\n },\n equals: stringArray.equals,\n clone: stringArray.clone,\n };\n },\n\n data(value) {\n if (value == null) {\n value = [];\n }\n return {\n make() {\n return [];\n },\n validate(value, target, invalid) {\n if (value instanceof Array) {\n return value;\n } else if ((value != null ? value.length : undefined) != null) {\n return value;\n } else {\n return invalid();\n }\n },\n\n emitter(a, b) {\n return UData.getLerpThunk(a, b);\n },\n };\n },\n};\n\nconst decorate = function (types) {\n for (let k in types) {\n const type = types[k];\n types[k] = ((type) =>\n function () {\n const t = type.apply(type, arguments);\n if (t.validate == null) {\n t.validate = (v) => v != null;\n }\n if (t.equals == null) {\n t.equals = (a, b) => a === b;\n }\n if (t.clone == null) {\n t.clone = function (v) {\n let left;\n return (left = __guardMethod__(v, \"clone\", (o) => o.clone())) !=\n null\n ? left\n : v;\n };\n }\n return t;\n })(type);\n }\n return types;\n};\n\nexport const Types = decorate(_Types);\n\nfunction __range__(left, right, inclusive) {\n let range = [];\n let ascending = left < right;\n let end = !inclusive ? right : ascending ? right + 1 : right - 1;\n for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {\n range.push(i);\n }\n return range;\n}\nfunction __guardMethod__(obj, methodName, transform) {\n if (\n typeof obj !== \"undefined\" &&\n obj !== null &&\n typeof obj[methodName] === \"function\"\n ) {\n return transform(obj, methodName);\n } else {\n return undefined;\n }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\nimport { Types } from \"./types.js\";\n\nexport const Traits = {\n node: {\n id: Types.nullable(Types.string()),\n classes: Types.classes(),\n },\n\n entity: {\n active: Types.bool(true),\n },\n\n object: {\n visible: Types.bool(true),\n },\n\n unit: {\n scale: Types.nullable(Types.number()),\n fov: Types.nullable(Types.number()),\n focus: Types.nullable(Types.number(1), true),\n },\n\n span: {\n range: Types.nullable(Types.vec2(-1, 1)),\n },\n view: {\n range: Types.array(Types.vec2(-1, 1), 4),\n },\n view3: {\n position: Types.vec3(),\n quaternion: Types.quat(),\n rotation: Types.vec3(),\n scale: Types.vec3(1, 1, 1),\n eulerOrder: Types.swizzle(\"xyz\"),\n },\n view4: {\n position: Types.vec4(),\n scale: Types.vec4(1, 1, 1, 1),\n },\n\n layer: {\n depth: Types.number(1),\n fit: Types.fit(\"y\"),\n },\n\n vertex: {\n pass: Types.vertexPass(),\n },\n fragment: {\n pass: Types.fragmentPass(),\n gamma: Types.bool(false),\n },\n\n transform3: {\n position: Types.vec3(),\n quaternion: Types.quat(),\n rotation: Types.vec3(),\n eulerOrder: Types.swizzle(\"xyz\"),\n scale: Types.vec3(1, 1, 1),\n matrix: Types.mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1),\n },\n transform4: {\n position: Types.vec4(),\n scale: Types.vec4(1, 1, 1, 1),\n matrix: Types.mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1),\n },\n\n camera: {\n proxy: Types.bool(false),\n position: Types.nullable(Types.vec3()),\n quaternion: Types.nullable(Types.quat()),\n rotation: Types.nullable(Types.vec3()),\n lookAt: Types.nullable(Types.vec3()),\n up: Types.nullable(Types.vec3()),\n eulerOrder: Types.swizzle(\"xyz\"),\n fov: Types.nullable(Types.number(1)),\n },\n //ortho: Types.nullable(Types.number(0))\n\n polar: {\n bend: Types.number(1),\n helix: Types.number(0),\n },\n spherical: {\n bend: Types.number(1),\n },\n stereographic: {\n bend: Types.number(1),\n },\n\n interval: {\n axis: Types.axis(),\n },\n area: {\n axes: Types.swizzle([1, 2], 2),\n },\n volume: {\n axes: Types.swizzle([1, 2, 3], 3),\n },\n\n origin: {\n origin: Types.vec4(),\n },\n scale: {\n divide: Types.number(10),\n unit: Types.number(1),\n base: Types.number(10),\n mode: Types.scale(),\n start: Types.bool(true),\n end: Types.bool(true),\n zero: Types.bool(true),\n factor: Types.positive(Types.number(1)),\n nice: Types.bool(true),\n },\n grid: {\n lineX: Types.bool(true),\n lineY: Types.bool(true),\n crossed: Types.bool(false),\n closedX: Types.bool(false),\n closedY: Types.bool(false),\n },\n axis: {\n detail: Types.int(1),\n crossed: Types.bool(false),\n },\n\n data: {\n data: Types.nullable(Types.data()),\n expr: Types.nullable(Types.emitter()),\n bind: Types.nullable(Types.func()),\n live: Types.bool(true),\n },\n buffer: {\n channels: Types.enum(4, [1, 2, 3, 4]),\n items: Types.int(1),\n fps: Types.nullable(Types.int(60)),\n hurry: Types.int(5),\n limit: Types.int(60),\n realtime: Types.bool(false),\n observe: Types.bool(false),\n aligned: Types.bool(false),\n },\n sampler: {\n centered: Types.bool(false),\n padding: Types.number(0),\n },\n array: {\n width: Types.nullable(Types.positive(Types.int(1), true)),\n bufferWidth: Types.int(1),\n history: Types.int(1),\n },\n matrix: {\n width: Types.nullable(Types.positive(Types.int(1), true)),\n height: Types.nullable(Types.positive(Types.int(1), true)),\n history: Types.int(1),\n bufferWidth: Types.int(1),\n bufferHeight: Types.int(1),\n },\n voxel: {\n width: Types.nullable(Types.positive(Types.int(1), true)),\n height: Types.nullable(Types.positive(Types.int(1), true)),\n depth: Types.nullable(Types.positive(Types.int(1), true)),\n bufferWidth: Types.int(1),\n bufferHeight: Types.int(1),\n bufferDepth: Types.int(1),\n },\n\n resolve: {\n expr: Types.nullable(Types.func()),\n items: Types.int(1),\n },\n\n style: {\n opacity: Types.positive(Types.number(1)),\n color: Types.color(),\n blending: Types.blending(),\n zWrite: Types.bool(true),\n zTest: Types.bool(true),\n zIndex: Types.positive(Types.round()),\n zBias: Types.number(0),\n zOrder: Types.nullable(Types.int()),\n },\n\n geometry: {\n points: Types.select(),\n colors: Types.nullable(Types.select()),\n },\n\n point: {\n size: Types.positive(Types.number(4)),\n sizes: Types.nullable(Types.select()),\n\n shape: Types.shape(),\n optical: Types.bool(true),\n fill: Types.bool(true),\n depth: Types.number(1),\n },\n\n line: {\n width: Types.positive(Types.number(2)),\n depth: Types.positive(Types.number(1)),\n join: Types.join(),\n stroke: Types.stroke(),\n proximity: Types.nullable(Types.number(Infinity)),\n closed: Types.bool(false),\n },\n mesh: {\n fill: Types.bool(true),\n shaded: Types.bool(false),\n map: Types.nullable(Types.select()),\n lineBias: Types.number(5),\n },\n strip: {\n line: Types.bool(false),\n },\n face: {\n line: Types.bool(false),\n },\n arrow: {\n size: Types.number(3),\n start: Types.bool(false),\n end: Types.bool(false),\n },\n ticks: {\n normal: Types.vec3(0, 0, 1),\n size: Types.positive(Types.number(10)),\n epsilon: Types.positive(Types.number(0.001)),\n },\n attach: {\n offset: Types.vec2(0, -20),\n snap: Types.bool(false),\n depth: Types.number(0),\n },\n\n format: {\n digits: Types.nullable(Types.positive(Types.number(3))),\n data: Types.nullable(Types.data()),\n expr: Types.nullable(Types.func()),\n live: Types.bool(true),\n },\n font: {\n font: Types.font(\"sans-serif\"),\n style: Types.string(),\n variant: Types.string(),\n weight: Types.string(),\n detail: Types.number(24),\n sdf: Types.number(5),\n },\n label: {\n text: Types.select(),\n size: Types.number(16),\n outline: Types.number(2),\n expand: Types.number(0),\n background: Types.color(1, 1, 1),\n },\n\n overlay: {\n opacity: Types.number(1),\n zIndex: Types.positive(Types.round(0)),\n },\n dom: {\n points: Types.select(),\n html: Types.select(),\n size: Types.number(16),\n outline: Types.number(2),\n zoom: Types.number(1),\n color: Types.nullable(Types.color()),\n attributes: Types.nullable(Types.object()),\n pointerEvents: Types.bool(false),\n },\n\n texture: {\n minFilter: Types.filter(\"nearest\"),\n magFilter: Types.filter(\"nearest\"),\n type: Types.type(\"float\"),\n },\n\n shader: {\n sources: Types.nullable(Types.select()),\n language: Types.string(\"glsl\"),\n code: Types.string(),\n uniforms: Types.nullable(Types.object()),\n },\n include: {\n shader: Types.select(),\n },\n\n operator: {\n source: Types.select(),\n },\n spread: {\n unit: Types.mapping(),\n items: Types.nullable(Types.vec4()),\n width: Types.nullable(Types.vec4()),\n height: Types.nullable(Types.vec4()),\n depth: Types.nullable(Types.vec4()),\n alignItems: Types.anchor(),\n alignWidth: Types.anchor(),\n alignHeight: Types.anchor(),\n alignDepth: Types.anchor(),\n },\n grow: {\n scale: Types.number(1),\n items: Types.nullable(Types.anchor()),\n width: Types.nullable(Types.anchor()),\n height: Types.nullable(Types.anchor()),\n depth: Types.nullable(Types.anchor()),\n },\n split: {\n order: Types.transpose(\"wxyz\"),\n axis: Types.nullable(Types.axis()),\n length: Types.int(1),\n overlap: Types.int(0),\n },\n join: {\n order: Types.transpose(\"wxyz\"),\n axis: Types.nullable(Types.axis()),\n overlap: Types.int(0),\n },\n swizzle: {\n order: Types.swizzle(),\n },\n transpose: {\n order: Types.transpose(),\n },\n repeat: {\n items: Types.number(1),\n width: Types.number(1),\n height: Types.number(1),\n depth: Types.number(1),\n },\n slice: {\n items: Types.nullable(Types.vec2()),\n width: Types.nullable(Types.vec2()),\n height: Types.nullable(Types.vec2()),\n depth: Types.nullable(Types.vec2()),\n },\n lerp: {\n size: Types.mapping(\"absolute\"),\n items: Types.nullable(Types.number()),\n width: Types.nullable(Types.number()),\n height: Types.nullable(Types.number()),\n depth: Types.nullable(Types.number()),\n },\n subdivide: {\n items: Types.nullable(Types.positive(Types.int(), true)),\n width: Types.nullable(Types.positive(Types.int(), true)),\n height: Types.nullable(Types.positive(Types.int(), true)),\n depth: Types.nullable(Types.positive(Types.int(), true)),\n bevel: Types.number(1),\n lerp: Types.bool(true),\n },\n resample: {\n indices: Types.number(4),\n channels: Types.number(4),\n sample: Types.mapping(),\n size: Types.mapping(\"absolute\"),\n items: Types.nullable(Types.number()),\n width: Types.nullable(Types.number()),\n height: Types.nullable(Types.number()),\n depth: Types.nullable(Types.number()),\n },\n readback: {\n type: Types.type(\"float\"),\n expr: Types.nullable(Types.func()),\n data: Types.data(),\n channels: Types.enum(4, [1, 2, 3, 4]),\n items: Types.nullable(Types.int()),\n width: Types.nullable(Types.int()),\n height: Types.nullable(Types.int()),\n depth: Types.nullable(Types.int()),\n },\n root: {\n speed: Types.number(1),\n camera: Types.select(\"[camera]\"),\n },\n inherit: {\n source: Types.select(),\n traits: Types.array(Types.string()),\n },\n\n rtt: {\n size: Types.mapping(\"absolute\"),\n width: Types.nullable(Types.number()),\n height: Types.nullable(Types.number()),\n history: Types.int(1),\n },\n compose: {\n alpha: Types.bool(false),\n },\n\n present: {\n index: Types.int(1),\n directed: Types.bool(true),\n length: Types.number(0),\n },\n slide: {\n order: Types.nullable(Types.int(0)),\n steps: Types.number(1),\n early: Types.int(0),\n late: Types.int(0),\n from: Types.nullable(Types.int(0)),\n to: Types.nullable(Types.int(1)),\n },\n\n transition: {\n stagger: Types.vec4(),\n enter: Types.nullable(Types.number(1)),\n exit: Types.nullable(Types.number(1)),\n delay: Types.number(0),\n delayEnter: Types.nullable(Types.number(0)),\n delayExit: Types.nullable(Types.number(0)),\n duration: Types.number(0.3),\n durationEnter: Types.nullable(Types.number(0)),\n durationExit: Types.nullable(Types.number(0)),\n },\n move: {\n from: Types.vec4(),\n to: Types.vec4(),\n },\n\n seek: {\n seek: Types.nullable(Types.number(0)),\n },\n track: {\n target: Types.select(),\n script: Types.object({}),\n ease: Types.ease(\"cosine\"),\n },\n trigger: {\n trigger: Types.nullable(Types.int(1), true),\n },\n step: {\n playback: Types.ease(\"linear\"),\n stops: Types.nullable(Types.array(Types.number())),\n delay: Types.number(0),\n duration: Types.number(0.3),\n pace: Types.number(0),\n speed: Types.number(1),\n rewind: Types.number(2),\n skip: Types.bool(true),\n realtime: Types.bool(false),\n },\n play: {\n delay: Types.number(0),\n pace: Types.number(1),\n speed: Types.number(1),\n from: Types.number(0),\n to: Types.number(Infinity),\n realtime: Types.bool(false),\n loop: Types.bool(false),\n },\n now: {\n now: Types.nullable(Types.timestamp()),\n seek: Types.nullable(Types.number(0)),\n pace: Types.number(1),\n speed: Types.number(1),\n },\n};\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS202: Simplify dynamic range loops\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n/*\n Generate equally spaced ticks in a range at sensible positions.\n\n @param min/max - Minimum and maximum of range\n @param n - Desired number of ticks in range\n @param unit - Base unit of scale (e.g. 1 or π).\n @param scale - Division scale (e.g. 2 = binary division, or 10 = decimal division).\n @param bias - Integer to bias divisions one or more levels up or down (to create nested scales)\n @param start - Whether to include a tick at the start\n @param end - Whether to include a tick at the end\n @param zero - Whether to include zero as a tick\n @param nice - Whether to round to a more reasonable interval\n*/\n\nexport const linear = function (\n min,\n max,\n n,\n unit,\n base,\n factor,\n start,\n end,\n zero,\n nice\n) {\n let ticks;\n let i, f;\n if (nice == null) {\n nice = true;\n }\n if (!n) {\n n = 10;\n }\n if (!unit) {\n unit = 1;\n }\n if (!base) {\n base = 10;\n }\n if (!factor) {\n factor = 1;\n }\n\n // Calculate naive tick size.\n const span = max - min;\n const ideal = span / n;\n\n // Unsnapped division\n if (!nice) {\n ticks = (() => {\n let asc, end1;\n const result = [];\n for (\n i = 0, end1 = n, asc = 0 <= end1;\n asc ? i <= end1 : i >= end1;\n asc ? i++ : i--\n ) {\n result.push(min + i * ideal);\n }\n return result;\n })();\n if (!start) {\n ticks.shift();\n }\n if (!end) {\n ticks.pop();\n }\n if (!zero) {\n ticks = ticks.filter((x) => x !== 0);\n }\n return ticks;\n }\n\n // Round to the floor'd power of 'scale'\n if (!unit) {\n unit = 1;\n }\n if (!base) {\n base = 10;\n }\n const ref =\n unit * Math.pow(base, Math.floor(Math.log(ideal / unit) / Math.log(base)));\n\n // Make derived steps at sensible factors.\n const factors =\n base % 2 === 0\n ? [base / 2, 1, 1 / 2]\n : base % 3 === 0\n ? [base / 3, 1, 1 / 3]\n : [1];\n const steps = (() => {\n const result1 = [];\n for (f of Array.from(factors)) {\n result1.push(ref * f);\n }\n return result1;\n })();\n\n // Find step size closest to ideal.\n let distance = Infinity;\n let step = steps.reduce(function (ref, step) {\n f = step / ideal;\n const d = Math.max(f, 1 / f);\n\n if (d < distance) {\n distance = d;\n return step;\n } else {\n return ref;\n }\n }, ref);\n\n // Scale final step\n step *= factor;\n\n // Renormalize min/max onto aligned steps.\n min = Math.ceil(min / step + +!start) * step;\n max = (Math.floor(max / step) - +!end) * step;\n n = Math.ceil((max - min) / step);\n\n // Generate equally spaced ticks\n ticks = (() => {\n let asc1, end2;\n const result2 = [];\n for (\n i = 0, end2 = n, asc1 = 0 <= end2;\n asc1 ? i <= end2 : i >= end2;\n asc1 ? i++ : i--\n ) {\n result2.push(min + i * step);\n }\n return result2;\n })();\n if (!zero) {\n ticks = ticks.filter((x) => x !== 0);\n }\n return ticks;\n};\n\n/*\n Generate logarithmically spaced ticks in a range at sensible positions.\n*/\n\nexport const log = function (\n _min,\n _max,\n _n,\n _unit,\n _base,\n _bias,\n _start,\n _end,\n _zero,\n _nice\n) {\n throw new Error(\"Log ticks not yet implemented.\");\n};\n\nconst LINEAR = 0;\nconst LOG = 1;\n\nexport const make = function (\n type,\n min,\n max,\n n,\n unit,\n base,\n bias,\n start,\n end,\n zero,\n nice\n) {\n switch (type) {\n case LINEAR:\n return linear(min, max, n, unit, base, bias, start, end, zero, nice);\n case LOG:\n return log(min, max, n, unit, base, bias, start, end, zero, nice);\n }\n};\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining\n * DS104: Avoid inline assignments\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UGLSL from \"../../util/glsl.js\";\nimport * as UTicks from \"../../util/ticks.js\";\n\nimport { NormalBlending } from \"three/src/constants.js\";\nimport { Vector2 } from \"three/src/math/Vector2.js\";\nimport { Vector3 } from \"three/src/math/Vector3.js\";\n/*\n\nThis is the general dumping ground for trait behavior.\n\nHelpers are auto-attached to primitives that have the matching trait\n\n*/\n\nconst helpers = {\n bind: {\n make(slots) {\n if (this.bind == null) {\n this.bind = {};\n }\n if (this.bound == null) {\n this.bound = [];\n }\n\n // Fetch attached objects and bind to them\n // Attach rebuild watcher for DOM changes to bound nodes\n for (let slot of Array.from(slots)) {\n let { to, trait, optional, unique, multiple, callback } = slot;\n\n if (callback == null) {\n callback = this.rebuild;\n }\n const name = to.split(/\\./g).pop();\n const selector = this._get(to);\n\n // Find by selector\n let source = null;\n if (selector != null) {\n let start = this;\n let done = false;\n while (!done) {\n // Keep scanning back until a new node is found\n start = source = this._attach(\n selector,\n trait,\n callback,\n this,\n start,\n optional,\n multiple\n );\n const isUnique =\n unique && (source == null || this.bound.indexOf(source) < 0);\n done = multiple || optional || !unique || isUnique;\n }\n }\n\n // Monitor source for reallocation / resize\n if (source != null) {\n if (this.resize != null) {\n this._listen(source, \"source.resize\", this.resize);\n }\n if (callback) {\n this._listen(source, \"source.rebuild\", callback);\n }\n\n if (multiple) {\n for (let s of Array.from(source)) {\n this.bound.push(s);\n }\n } else {\n this.bound.push(source);\n }\n }\n\n this.bind[name] = source;\n }\n\n return null;\n },\n\n unmake() {\n if (!this.bind) {\n return;\n }\n delete this.bind;\n return delete this.bound;\n },\n },\n\n span: {\n make() {\n // Look up nearest view to inherit from\n // Monitor size changes\n this.spanView = this._inherit(\"view\");\n return this._listen(\"view\", \"view.range\", () =>\n this.trigger({ type: \"span.range\" })\n );\n },\n\n unmake() {\n return delete this.spanView;\n },\n\n get: (function () {\n const def = new Vector2(-1, 1);\n\n return function (prefix, dimension) {\n // Return literal range\n let left;\n const range = this._get(prefix + \"span.range\");\n if (range != null) {\n return range;\n }\n\n // Inherit from view\n return (left =\n this.spanView != null ? this.spanView.axis(dimension) : undefined) !=\n null\n ? left\n : def;\n };\n })(),\n },\n\n scale: {\n // Divisions to allocate on scale\n divide(prefix) {\n const divide = this._get(prefix + \"scale.divide\");\n const factor = this._get(prefix + \"scale.factor\");\n return Math.round((divide * 2.5) / factor);\n },\n\n // Generate ticks on scale\n generate(prefix, buffer, min, max) {\n const mode = this._get(prefix + \"scale.mode\");\n const divide = this._get(prefix + \"scale.divide\");\n const unit = this._get(prefix + \"scale.unit\");\n const base = this._get(prefix + \"scale.base\");\n const factor = this._get(prefix + \"scale.factor\");\n const start = this._get(prefix + \"scale.start\");\n const end = this._get(prefix + \"scale.end\");\n const zero = this._get(prefix + \"scale.zero\");\n const nice = this._get(prefix + \"scale.nice\");\n\n const ticks = UTicks.make(\n mode,\n min,\n max,\n divide,\n unit,\n base,\n factor,\n start,\n end,\n zero,\n nice\n );\n buffer.copy(ticks);\n return ticks;\n },\n },\n\n style: {\n // Return bound style uniforms\n uniforms() {\n return {\n styleColor: this.node.attributes[\"style.color\"],\n styleOpacity: this.node.attributes[\"style.opacity\"],\n styleZBias: this.node.attributes[\"style.zBias\"],\n styleZIndex: this.node.attributes[\"style.zIndex\"],\n };\n },\n },\n\n arrow: {\n // Return bound arrow style uniforms\n uniforms() {\n const { start } = this.props;\n const { end } = this.props;\n\n const space = this._attributes.make(\n this._types.number(1.25 / (start + end))\n );\n const style = this._attributes.make(this._types.vec2(+start, +end));\n const size = this.node.attributes[\"arrow.size\"];\n\n return {\n clipStyle: style,\n clipRange: size,\n clipSpace: space,\n\n arrowSpace: space,\n arrowSize: size,\n };\n },\n },\n\n point: {\n // Return bound point style uniforms\n uniforms() {\n return {\n pointSize: this.node.attributes[\"point.size\"],\n pointDepth: this.node.attributes[\"point.depth\"],\n };\n },\n },\n\n line: {\n // Return bound line style uniforms\n uniforms() {\n return {\n lineWidth: this.node.attributes[\"line.width\"],\n lineDepth: this.node.attributes[\"line.depth\"],\n lineProximity: this.node.attributes[\"line.proximity\"],\n };\n },\n },\n\n surface: {\n // Return bound surface style uniforms\n uniforms() {\n return {};\n },\n },\n\n shade: {\n pipeline(shader) {\n if (!this._inherit(\"fragment\")) {\n return shader;\n }\n if (shader == null) {\n shader = this._shaders.shader();\n }\n for (var pass = 0; pass <= 2; pass++) {\n shader = __guard__(this._inherit(\"fragment\"), (x) =>\n x.fragment(shader, pass)\n );\n }\n shader.pipe(\"fragment.map.rgba\");\n return shader;\n },\n\n map(shader) {\n if (!shader) {\n return shader;\n }\n return (shader = this._shaders\n .shader()\n .pipe(\"mesh.map.uvwo\")\n .pipe(shader));\n },\n },\n\n position: {\n pipeline(shader) {\n if (!this._inherit(\"vertex\")) {\n return shader;\n }\n if (shader == null) {\n shader = this._shaders.shader();\n }\n for (var pass = 0; pass <= 3; pass++) {\n shader = __guard__(this._inherit(\"vertex\"), (x) =>\n x.vertex(shader, pass)\n );\n }\n return shader;\n },\n\n swizzle(shader, order) {\n if (shader) {\n return this._shaders\n .shader()\n .pipe(UGLSL.swizzleVec4(order))\n .pipe(shader);\n }\n },\n\n swizzle2(shader, order1, order2) {\n if (shader) {\n return this._shaders\n .shader()\n .split()\n .pipe(UGLSL.swizzleVec4(order1))\n .next()\n .pipe(UGLSL.swizzleVec4(order2))\n .join()\n .pipe(shader);\n }\n },\n },\n\n visible: {\n make() {\n const e = { type: \"visible.change\" };\n\n let visible = null;\n this.setVisible = function (vis) {\n if (vis != null) {\n visible = vis;\n }\n return onVisible();\n };\n\n var onVisible = () => {\n let left;\n const last = this.isVisible;\n let self =\n (left = visible != null ? visible : this._get(\"object.visible\")) !=\n null\n ? left\n : true;\n if (visibleParent != null) {\n if (self) {\n self = visibleParent.isVisible;\n }\n }\n this.isVisible = self;\n if (last !== this.isVisible) {\n return this.trigger(e);\n }\n };\n\n var visibleParent = this._inherit(\"visible\");\n if (visibleParent) {\n this._listen(visibleParent, \"visible.change\", onVisible);\n }\n if (this.is(\"object\")) {\n this._listen(this.node, \"change:object\", onVisible);\n }\n\n return onVisible();\n },\n\n unmake() {\n return delete this.isVisible;\n },\n },\n\n active: {\n make() {\n const e = { type: \"active.change\" };\n\n let active = null;\n this.setActive = function (act) {\n if (act != null) {\n active = act;\n }\n return onActive();\n };\n\n var onActive = () => {\n let left;\n const last = this.isActive;\n let self =\n (left = active != null ? active : this._get(\"entity.active\")) != null\n ? left\n : true;\n if (activeParent != null) {\n if (self) {\n self = activeParent.isActive;\n }\n }\n this.isActive = self;\n if (last !== this.isActive) {\n return this.trigger(e);\n }\n };\n\n var activeParent = this._inherit(\"active\");\n if (activeParent) {\n this._listen(activeParent, \"active.change\", onActive);\n }\n if (this.is(\"entity\")) {\n this._listen(this.node, \"change:entity\", onActive);\n }\n\n return onActive();\n },\n\n unmake() {\n return delete this.isActive;\n },\n },\n\n object: {\n // Generic 3D renderable wrapper, handles the fiddly Three.js bits that require a 'style recalculation'.\n //\n // Pass renderables to nearest root for rendering\n // Track visibility from parent and notify children\n // Track blends / transparency for three.js materials\n make(objects) {\n // Aggregate rendered three objects for reference\n let blending, zOrder;\n if (objects == null) {\n objects = [];\n }\n this.objects = objects;\n this.renders = this.objects.reduce((a, b) => a.concat(b.renders), []);\n\n const objectScene = this._inherit(\"scene\");\n\n let opacity = (blending = zOrder = null);\n\n const hasStyle = Array.from(this.traits).includes(\"style\");\n opacity = 1;\n blending = NormalBlending;\n let zWrite = true;\n let zTest = true;\n\n if (hasStyle) {\n ({ opacity } = this.props);\n ({ blending } = this.props);\n ({ zOrder } = this.props);\n ({ zWrite } = this.props);\n ({ zTest } = this.props);\n }\n\n const onChange = (event) => {\n const { changed } = event;\n let refresh = null;\n if (changed[\"style.opacity\"]) {\n refresh = opacity = this.props.opacity;\n }\n if (changed[\"style.blending\"]) {\n refresh = blending = this.props.blending;\n }\n if (changed[\"style.zOrder\"]) {\n refresh = zOrder = this.props.zOrder;\n }\n if (changed[\"style.zWrite\"]) {\n refresh = zWrite = this.props.zWrite;\n }\n if (changed[\"style.zTest\"]) {\n refresh = zTest = this.props.zTest;\n }\n if (refresh != null) {\n return onVisible();\n }\n };\n\n var onVisible = () => {\n const order = zOrder != null ? -zOrder : this.node.order;\n\n const visible =\n (this.isVisible != null ? this.isVisible : true) && opacity > 0;\n\n if (visible) {\n if (hasStyle) {\n return (() => {\n const result = [];\n for (let o of Array.from(this.objects)) {\n o.show(opacity < 1, blending, order);\n result.push(o.depth(zWrite, zTest));\n }\n return result;\n })();\n } else {\n return (() => {\n const result1 = [];\n for (let o of Array.from(this.objects)) {\n result1.push(o.show(true, blending, order));\n }\n return result1;\n })();\n }\n } else {\n return (() => {\n const result2 = [];\n for (let o of Array.from(this.objects)) {\n result2.push(o.hide());\n }\n return result2;\n })();\n }\n };\n\n this._listen(this.node, \"change:style\", onChange);\n this._listen(this.node, \"reindex\", onVisible);\n this._listen(this, \"visible.change\", onVisible);\n\n for (let object of Array.from(this.objects)) {\n objectScene.adopt(object);\n }\n return onVisible();\n },\n\n unmake(dispose) {\n let object;\n if (dispose == null) {\n dispose = true;\n }\n if (!this.objects) {\n return;\n }\n\n const objectScene = this._inherit(\"scene\");\n for (object of Array.from(this.objects)) {\n objectScene.unadopt(object);\n }\n if (dispose) {\n return (() => {\n const result = [];\n for (object of Array.from(this.objects)) {\n result.push(object.dispose());\n }\n return result;\n })();\n }\n },\n\n mask() {\n let mask, shader;\n if (!(mask = this._inherit(\"mask\"))) {\n return;\n }\n return (shader = mask.mask(shader));\n },\n },\n\n unit: {\n make() {\n let focusDepth,\n pixelRatio,\n pixelUnit,\n renderAspect,\n renderHeight,\n renderOdd,\n renderScale,\n renderScaleInv,\n renderWidth,\n viewHeight,\n viewWidth,\n worldUnit;\n let π = Math.PI;\n\n this.unitUniforms = {\n renderScaleInv: (renderScaleInv = this._attributes.make(\n this._types.number(1)\n )),\n renderScale: (renderScale = this._attributes.make(\n this._types.number(1)\n )),\n renderAspect: (renderAspect = this._attributes.make(\n this._types.number(1)\n )),\n renderWidth: (renderWidth = this._attributes.make(\n this._types.number(0)\n )),\n renderHeight: (renderHeight = this._attributes.make(\n this._types.number(0)\n )),\n viewWidth: (viewWidth = this._attributes.make(this._types.number(0))),\n viewHeight: (viewHeight = this._attributes.make(this._types.number(0))),\n pixelRatio: (pixelRatio = this._attributes.make(this._types.number(1))),\n pixelUnit: (pixelUnit = this._attributes.make(this._types.number(1))),\n worldUnit: (worldUnit = this._attributes.make(this._types.number(1))),\n focusDepth: (focusDepth = this._attributes.make(this._types.number(1))),\n renderOdd: (renderOdd = this._attributes.make(this._types.vec2())),\n };\n\n const top = new Vector3();\n const bottom = new Vector3();\n\n const handler = () => {\n let camera, size;\n if ((size = root != null ? root.getSize() : undefined) == null) {\n return;\n }\n\n π = Math.PI;\n\n const { scale } = this.props;\n const { fov } = this.props;\n const focus =\n this.props.focus != null\n ? this.props.focus\n : this.inherit(\"unit\").props.focus;\n\n const isAbsolute = scale === null;\n\n // Measure live FOV to be able to accurately predict anti-aliasing in\n // perspective\n let measure = 1;\n if ((camera = root != null ? root.getCamera() : undefined)) {\n const m = camera.projectionMatrix;\n\n // Measure top to bottom\n top.set(0, -0.5, 1).applyMatrix4(m);\n bottom.set(0, 0.5, 1).applyMatrix4(m);\n top.sub(bottom);\n measure = top.y;\n }\n\n // Calculate device pixel ratio\n const dpr = size.renderHeight / size.viewHeight;\n\n // Calculate correction for fixed on-screen size regardless of FOV\n const fovtan = fov != null ? measure * Math.tan((fov * π) / 360) : 1;\n\n // Calculate device pixels per virtual pixel\n const pixel = isAbsolute ? dpr : (size.renderHeight / scale) * fovtan;\n\n // Calculate device pixels per world unit\n const rscale = (size.renderHeight * measure) / 2;\n\n // Calculate world units per virtual pixel\n const world = pixel / rscale;\n\n viewWidth.value = size.viewWidth;\n viewHeight.value = size.viewHeight;\n renderWidth.value = size.renderWidth;\n renderHeight.value = size.renderHeight;\n renderAspect.value = size.aspect;\n renderScale.value = rscale;\n renderScaleInv.value = 1 / rscale;\n pixelRatio.value = dpr;\n pixelUnit.value = pixel;\n worldUnit.value = world;\n focusDepth.value = focus;\n\n return renderOdd.value\n .set(size.renderWidth % 2, size.renderHeight % 2)\n .multiplyScalar(0.5);\n };\n\n //console.log 'worldUnit', world, pixel, rscale, isAbsolute\n\n var root = this.is(\"root\") ? this : this._inherit(\"root\");\n //@_listen root, 'root.resize', handler\n //@_listen root, 'root.camera', handler\n //@_listen @node, 'change:unit', handler\n this._listen(root, \"root.update\", handler);\n\n return handler();\n },\n\n unmake() {\n return delete this.unitUniforms;\n },\n\n get() {\n const u = {};\n for (let k in this.unitUniforms) {\n const v = this.unitUniforms[k];\n u[k] = v.value;\n }\n return u;\n },\n\n uniforms() {\n return this.unitUniforms;\n },\n },\n};\n\nexport const Helpers = function (object, traits) {\n const h = {};\n for (let trait of Array.from(traits)) {\n var methods;\n if (!(methods = helpers[trait])) {\n continue;\n }\n\n h[trait] = {};\n for (let key in methods) {\n const method = methods[key];\n h[trait][key] = method.bind(object);\n }\n }\n return h;\n};\n\nfunction __guard__(value, transform) {\n return typeof value !== \"undefined\" && value !== null\n ? transform(value)\n : undefined;\n}\n","export * from \"./classes.js\";\nexport * from \"./types.js\";\nexport * from \"./traits.js\";\nexport * from \"./helpers.js\";\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nexport class PrimitiveFactory {\n constructor(definitions, context) {\n this.context = context;\n this.classes = definitions.Classes;\n this.helpers = definitions.Helpers;\n }\n\n getTypes() {\n return Object.keys(this.classes);\n }\n\n make(type, options, binds = null) {\n if (options == null) {\n options = {};\n }\n\n const klass = this.classes[type];\n\n if (klass == null) {\n throw new Error(`Unknown primitive class \\`${type}\\``);\n }\n\n const node = new klass.model(\n type,\n klass.defaults,\n options,\n binds,\n klass,\n this.context.attributes\n );\n\n // NOTE: keep for side effects.\n new klass(node, this.context, this.helpers);\n return node;\n }\n}\n","import * as types from \"./types\";\n\nexport { PrimitiveFactory as Factory } from \"./factory.js\";\nexport * from \"./primitive.js\";\nexport const Types = types;\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nexport class Renderable {\n constructor(renderer, shaders) {\n this.renderer = renderer;\n this.shaders = shaders;\n this.gl = this.renderer.getContext();\n if (this.uniforms == null) {\n this.uniforms = {};\n }\n }\n\n dispose() {\n this.uniforms = null;\n }\n\n _adopt(uniforms) {\n for (let key in uniforms) {\n const value = uniforms[key];\n this.uniforms[key] = value;\n }\n }\n\n _set(uniforms) {\n for (let key in uniforms) {\n const value = uniforms[key];\n if (this.uniforms[key] != null) {\n this.uniforms[key].value = value;\n }\n }\n }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS202: Simplify dynamic range loops\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { Object3D } from \"three/src/core/Object3D.js\";\nimport { PerspectiveCamera } from \"three/src/cameras/PerspectiveCamera.js\";\nimport { Renderable } from \"./renderable.js\";\nimport { Scene as ThreeScene } from \"three/src/scenes/Scene.js\";\nimport { WebGLRenderTarget } from \"three/src/renderers/WebGLRenderTarget.js\";\n\n/*\n All MathBox renderables sit inside this root, to keep things tidy.\n*/\nclass MathBox extends Object3D {\n constructor() {\n super();\n this.rotationAutoUpdate = false;\n this.frustumCulled = false;\n this.matrixAutoUpdate = false;\n }\n}\n\n/*\n Holds the root and binds to a THREE.Scene\n\n Will hold objects and inject them a few at a time\n to avoid long UI blocks.\n\n Will render injected objects to a 1x1 scratch buffer to ensure availability\n*/\nexport class Scene extends Renderable {\n constructor(renderer, shaders, options) {\n super(renderer, shaders, options);\n this.root = new MathBox();\n\n if ((options != null ? options.scene : undefined) != null) {\n this.scene = options.scene;\n }\n if (this.scene == null) {\n this.scene = new ThreeScene();\n }\n\n this.pending = [];\n this.async = 0;\n\n this.scratch = new WebGLRenderTarget(1, 1);\n this.camera = new PerspectiveCamera();\n }\n\n inject(scene) {\n if (scene != null) {\n this.scene = scene;\n }\n return this.scene.add(this.root);\n }\n\n unject() {\n return this.scene != null ? this.scene.remove(this.root) : undefined;\n }\n\n add(object) {\n if (this.async) {\n return this.pending.push(object);\n } else {\n return this._add(object);\n }\n }\n\n remove(object) {\n this.pending = this.pending.filter((o) => o !== object);\n if (object.parent != null) {\n return this._remove(object);\n }\n }\n\n _add(object) {\n return this.root.add(object);\n }\n\n _remove(object) {\n return this.root.remove(object);\n }\n\n dispose() {\n if (this.root.parent != null) {\n return this.unject();\n }\n }\n\n warmup(n) {\n return (this.async = +n || 0);\n }\n\n render() {\n if (!this.pending.length) {\n return;\n }\n const { children } = this.root;\n\n // Insert up to @async children\n const added = [];\n for (\n let i = 0, end = this.async, asc = 0 <= end;\n asc ? i < end : i > end;\n asc ? i++ : i--\n ) {\n const pending = this.pending.shift();\n if (!pending) {\n break;\n }\n\n // Insert new child\n this._add(pending);\n added.push(added);\n }\n\n // Remember current visibility\n const visible = children.map(function (o) {\n return o.visible;\n });\n\n // Force only this child visible\n children.map((o) => (o.visible = !Array.from(added).includes(o)));\n\n // Render and throw away\n const currentTarget = this.renderer.getRenderTarget();\n this.renderer.setRenderTarget(this.scratch);\n this.renderer.render(this.scene, this.camera);\n this.renderer.setRenderTarget(currentTarget);\n\n // Restore visibility\n return children.map((o, i) => (o.visible = visible[i]));\n }\n\n toJSON() {\n return this.root.toJSON();\n }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nexport class RenderFactory {\n constructor(classes, renderer, shaders) {\n this.classes = classes;\n this.renderer = renderer;\n this.shaders = shaders;\n }\n\n getTypes() {\n return Object.keys(this.classes);\n }\n\n make(type, options) {\n return new this.classes[type](this.renderer, this.shaders, options);\n }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UData from \"../../util/data.js\";\nimport { Renderable } from \"../renderable.js\";\n\n/*\n * Base class for sample buffers\n */\nexport class Buffer extends Renderable {\n constructor(renderer, shaders, options) {\n super(renderer, shaders);\n\n if (this.items == null) {\n this.items = options.items || 1;\n }\n if (this.samples == null) {\n this.samples = options.samples || 1;\n }\n if (this.channels == null) {\n this.channels = options.channels || 4;\n }\n if (this.callback == null) {\n this.callback = options.callback || function () {};\n }\n }\n\n dispose() {\n return super.dispose();\n }\n\n update() {\n const n = this.fill();\n this.write(n);\n return n;\n }\n\n setActive(_i, _j, _k, _l) {}\n\n setCallback(callback) {\n this.callback = callback;\n }\n\n write() {}\n fill() {}\n generate(data) {\n return UData.getStreamer(data, this.samples, this.channels, this.items);\n }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as CONST from \"three/src/constants.js\";\nimport * as UThree from \"../../../util/three.js\";\n\nimport { Texture } from \"three/src/textures/Texture.js\";\nimport { Vector2 } from \"three/src/math/Vector2.js\";\n\n/*\nManually allocated GL texture for data streaming.\n\nAllows partial updates via subImage.\n*/\nexport class DataTexture {\n constructor(renderer, width, height, channels, options) {\n this.renderer = renderer;\n this.width = width;\n this.height = height;\n this.channels = channels;\n this.n = this.width * this.height * this.channels;\n\n const gl = this.renderer.getContext();\n this.gl = gl;\n const minFilter =\n (options != null ? options.minFilter : undefined) != null\n ? options != null\n ? options.minFilter\n : undefined\n : CONST.NearestFilter;\n const magFilter =\n (options != null ? options.magFilter : undefined) != null\n ? options != null\n ? options.magFilter\n : undefined\n : CONST.NearestFilter;\n const type =\n (options != null ? options.type : undefined) != null\n ? options != null\n ? options.type\n : undefined\n : CONST.FloatType;\n\n this.minFilter = UThree.paramToGL(gl, minFilter);\n this.magFilter = UThree.paramToGL(gl, magFilter);\n this.type = UThree.paramToGL(gl, type);\n this.ctor = UThree.paramToArrayStorage(type);\n\n this.build(options);\n }\n\n build(options) {\n const { gl } = this;\n const state = this.renderer.state;\n\n // Make GL texture\n this.texture = gl.createTexture();\n this.format = [null, gl.LUMINANCE, gl.LUMINANCE_ALPHA, gl.RGB, gl.RGBA][\n this.channels\n ];\n this.format3 = [\n null,\n CONST.LuminanceFormat,\n CONST.LuminanceAlphaFormat,\n CONST.RGBFormat,\n CONST.RGBAFormat,\n ][this.channels];\n\n state.bindTexture(gl.TEXTURE_2D, this.texture);\n\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, this.minFilter);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, this.magFilter);\n\n // Attach empty data\n this.data = new this.ctor(this.n);\n gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n this.format,\n this.width,\n this.height,\n 0,\n this.format,\n this.type,\n this.data\n );\n\n // Make wrapper texture object.\n this.textureObject = new Texture(\n new Image(),\n CONST.UVMapping,\n CONST.ClampToEdgeWrapping,\n CONST.ClampToEdgeWrapping,\n options != null ? options.minFilter : undefined,\n options != null ? options.magFilter : undefined\n );\n\n // Pre-init texture to trick WebGLRenderer\n this.textureProperties = this.renderer.properties.get(this.textureObject);\n this.textureProperties.__webglInit = true;\n this.textureProperties.__webglTexture = this.texture;\n\n this.textureObject.format = this.format3;\n this.textureObject.type = CONST.FloatType;\n this.textureObject.unpackAlignment = 1;\n this.textureObject.flipY = false;\n this.textureObject.generateMipmaps = false;\n\n // Create uniforms\n this.uniforms = {\n dataResolution: {\n type: \"v2\",\n value: new Vector2(1 / this.width, 1 / this.height),\n },\n dataTexture: {\n type: \"t\",\n value: this.textureObject,\n },\n };\n }\n\n write(data, x, y, w, h) {\n const { gl } = this;\n const state = this.renderer.state;\n\n // Write to rectangle\n state.bindTexture(gl.TEXTURE_2D, this.texture);\n gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);\n return gl.texSubImage2D(\n gl.TEXTURE_2D,\n 0,\n x,\n y,\n w,\n h,\n this.format,\n this.type,\n data\n );\n }\n\n dispose() {\n this.gl.deleteTexture(this.texture);\n\n this.textureProperties.__webglInit = false;\n this.textureProperties.__webglTexture = null;\n this.textureProperties = null;\n return (this.textureObject = this.texture = null);\n }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS202: Simplify dynamic range loops\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UData from \"../../util/data.js\";\nimport * as UGLSL from \"../../util/glsl.js\";\n\nimport { Buffer } from \"./buffer.js\";\nimport { DataTexture } from \"./texture/datatexture.js\";\nimport { Vector2 } from \"three/src/math/Vector2.js\";\n\n/*\n * Data buffer on the GPU\n * - Stores samples (1-n) x items (1-n) x channels (1-4)\n * - Provides generic sampler shader\n * - Provides generic copy/write handler\n * => specialized into Array/Matrix/VoxelBuffer\n */\nexport class DataBuffer extends Buffer {\n constructor(renderer, shaders, options, build) {\n if (build == null) {\n build = true;\n }\n const width = options.width || 1;\n const height = options.height || 1;\n const depth = options.depth || 1;\n const samples = width * height * depth;\n\n if (!options.samples) {\n options.samples = samples;\n }\n\n super(renderer, shaders, options);\n\n this.width = width;\n this.height = height;\n this.depth = depth;\n if (this.samples == null) {\n this.samples = samples;\n }\n\n if (build) {\n this.build(options);\n }\n }\n\n shader(shader, indices) {\n if (indices == null) {\n indices = 4;\n }\n if (this.items > 1 || this.depth > 1) {\n if (indices !== 4) {\n shader.pipe(UGLSL.extendVec(indices, 4));\n }\n shader.pipe(\"map.xyzw.texture\", this.uniforms);\n } else {\n if (indices !== 2) {\n shader.pipe(UGLSL.truncateVec(indices, 2));\n }\n }\n\n const wrap = this.wrap ? \".wrap\" : \"\";\n shader.pipe(`map.2d.data${wrap}`, this.uniforms);\n shader.pipe(\"sample.2d\", this.uniforms);\n if (this.channels < 4) {\n shader.pipe(\n UGLSL.swizzleVec4([\"0000\", \"x000\", \"xw00\", \"xyz0\"][this.channels])\n );\n }\n return shader;\n }\n\n build(options) {\n this.data = new Float32Array(this.samples * this.channels * this.items);\n this.texture = new DataTexture(\n this.renderer,\n this.items * this.width,\n this.height * this.depth,\n this.channels,\n options\n );\n this.filled = 0;\n this.used = 0;\n\n this._adopt(this.texture.uniforms);\n this._adopt({\n dataPointer: { type: \"v2\", value: new Vector2() },\n textureItems: { type: \"f\", value: this.items },\n textureHeight: { type: \"f\", value: this.height },\n });\n\n this.dataPointer = this.uniforms.dataPointer.value;\n this.streamer = this.generate(this.data);\n }\n\n dispose() {\n this.data = null;\n this.texture.dispose();\n return super.dispose();\n }\n\n getFilled() {\n return this.filled;\n }\n setCallback(callback) {\n this.callback = callback;\n return (this.filled = 0);\n }\n\n copy(data) {\n const n = Math.min(data.length, this.samples * this.channels * this.items);\n const d = this.data;\n for (\n let i = 0, end = n, asc = 0 <= end;\n asc ? i < end : i > end;\n asc ? i++ : i--\n ) {\n d[i] = data[i];\n }\n this.write(Math.ceil(n / this.channels / this.items));\n }\n\n write(n) {\n if (n == null) {\n n = this.samples;\n }\n let height = n / this.width;\n n *= this.items;\n const width = height < 1 ? n : this.items * this.width;\n height = Math.ceil(height);\n\n this.texture.write(this.data, 0, 0, width, height);\n this.dataPointer.set(0.5, 0.5);\n\n this.filled = 1;\n this.used = n;\n }\n\n through(callback, target) {\n let dst, src;\n const { consume, done } = (src = this.streamer);\n const { emit } = (dst = target.streamer);\n\n let i = 0;\n\n let pipe = () => consume((x, y, z, w) => callback(emit, x, y, z, w, i));\n pipe = UData.repeatCall(pipe, this.items);\n\n return () => {\n src.reset();\n dst.reset();\n const limit = this.used;\n i = 0;\n while (!done() && i < limit) {\n pipe();\n i++;\n }\n\n return src.count();\n };\n }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UData from \"../../util/data.js\";\nimport { DataBuffer } from \"./databuffer.js\";\n\n/*\n * 1D + history array\n */\nexport class ArrayBuffer_ extends DataBuffer {\n constructor(renderer, shaders, options) {\n const width = options.width || 1;\n const history = options.history || 1;\n\n options.width = width;\n options.height = history;\n options.depth = 1;\n\n super(renderer, shaders, options, false);\n\n this.width = width;\n this.history = history;\n this.samples = width;\n this.wrap = history > 1;\n\n this.build(options);\n }\n\n build(_options) {\n super.build();\n\n this.index = 0;\n this.pad = 0;\n return (this.streamer = this.generate(this.data));\n }\n\n setActive(i) {\n return (this.pad = Math.max(0, this.width - i));\n }\n\n fill() {\n const { callback } = this;\n if (typeof callback.reset === \"function\") {\n callback.reset();\n }\n\n const { emit, count, done, reset } = this.streamer;\n reset();\n\n const limit = this.samples - this.pad;\n\n let i = 0;\n while (!done() && i < limit && callback(emit, i++) !== false) {\n true;\n }\n\n return Math.floor(count() / this.items);\n }\n\n write(n) {\n if (n == null) {\n n = this.samples;\n }\n n *= this.items;\n this.texture.write(this.data, 0, this.index, n, 1);\n this.dataPointer.set(0.5, this.index + 0.5);\n this.index = (this.index + this.history - 1) % this.history;\n return (this.filled = Math.min(this.history, this.filled + 1));\n }\n\n through(callback, target) {\n let dst, src;\n const { consume, done } = (src = this.streamer);\n const { emit } = (dst = target.streamer);\n\n let i = 0;\n\n let pipe = () => consume((x, y, z, w) => callback(emit, x, y, z, w, i));\n pipe = UData.repeatCall(pipe, this.items);\n\n return () => {\n src.reset();\n dst.reset();\n const limit = this.samples - this.pad;\n i = 0;\n while (!done() && i < limit) {\n pipe();\n i++;\n }\n\n return src.count();\n };\n }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS202: Simplify dynamic range loops\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { BufferGeometry } from \"three/src/core/BufferGeometry.js\";\n\nexport class Geometry extends BufferGeometry {\n constructor() {\n super();\n new BufferGeometry(this);\n if (this.uniforms == null) {\n this.uniforms = {};\n }\n if (this.groups == null) {\n this.groups = [];\n }\n }\n\n _reduce(dims, maxs) {\n let multiple = false;\n for (let i = 0; i < dims.length; i++) {\n const dim = dims[i];\n const max = maxs[i];\n if (multiple) {\n dims[i] = max;\n }\n if (dim > 1) {\n multiple = true;\n }\n }\n\n return dims.reduce((a, b) => a * b);\n }\n\n _emitter(name) {\n const attribute =\n name == \"index\" ? this.getIndex() : this.getAttribute(name);\n const dimensions = attribute.itemSize;\n const { array } = attribute;\n\n let offset = 0;\n const one = function (a) {\n array[offset++] = a;\n };\n const two = function (a, b) {\n array[offset++] = a;\n array[offset++] = b;\n };\n const three = function (a, b, c) {\n array[offset++] = a;\n array[offset++] = b;\n array[offset++] = c;\n };\n const four = function (a, b, c, d) {\n array[offset++] = a;\n array[offset++] = b;\n array[offset++] = c;\n array[offset++] = d;\n };\n\n return [null, one, two, three, four][dimensions];\n }\n\n _finalize() {\n return;\n }\n\n _offsets(offsets) {\n this.groups = offsets;\n }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { Geometry } from \"./geometry.js\";\nimport { Vector4 } from \"three/src/math/Vector4.js\";\n\n// Instanced geometry that is clippable along 4 dimensions\nexport class ClipGeometry extends Geometry {\n _clipUniforms() {\n this.geometryClip = new Vector4(1e10, 1e10, 1e10, 1e10);\n this.geometryResolution = new Vector4();\n this.mapSize = new Vector4();\n\n if (this.uniforms == null) {\n this.uniforms = {};\n }\n this.uniforms.geometryClip = {\n type: \"v4\",\n value: this.geometryClip,\n };\n this.uniforms.geometryResolution = {\n type: \"v4\",\n value: this.geometryResolution,\n };\n return (this.uniforms.mapSize = {\n type: \"v4\",\n value: this.mapSize,\n });\n }\n\n _clipGeometry(width, height, depth, items) {\n const c = (x) => Math.max(0, x - 1);\n const r = (x) => 1 / Math.max(1, x - 1);\n\n this.geometryClip.set(c(width), c(height), c(depth), c(items));\n return this.geometryResolution.set(r(width), r(height), r(depth), r(items));\n }\n\n _clipMap(mapWidth, mapHeight, mapDepth, mapItems) {\n return this.mapSize.set(mapWidth, mapHeight, mapDepth, mapItems);\n }\n\n _clipOffsets(\n factor,\n width,\n height,\n depth,\n items,\n _width,\n _height,\n _depth,\n _items\n ) {\n const dims = [depth, height, width, items];\n const maxs = [_depth, _height, _width, _items];\n const elements = this._reduce(dims, maxs);\n\n return this._offsets([\n {\n start: 0,\n count: elements * factor,\n materialIndex: 0,\n },\n ]);\n }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS202: Simplify dynamic range loops\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { BufferAttribute } from \"three/src/core/BufferAttribute.js\";\nimport { ClipGeometry } from \"./clipgeometry.js\";\n\n/*\nCones to attach as arrowheads on line strips\n\n.....> .....> .....> .....>\n\n.....> .....> .....> .....>\n\n.....> .....> .....> .....>\n*/\n\nexport class ArrowGeometry extends ClipGeometry {\n constructor(options) {\n let anchor, flip, k, layers, ribbons, samples, sides, strips;\n let asc, end;\n super(options);\n\n this._clipUniforms();\n\n this.sides = sides = +options.sides || 12;\n this.samples = samples = +options.samples || 2;\n this.strips = strips = +options.strips || 1;\n this.ribbons = ribbons = +options.ribbons || 1;\n this.layers = layers = +options.layers || 1;\n this.flip = flip = options.flip != null ? options.flip : false;\n this.anchor = anchor =\n options.anchor != null ? options.anchor : flip ? 0 : samples - 1;\n\n const arrows = strips * ribbons * layers;\n const points = (sides + 2) * arrows;\n const triangles = sides * 2 * arrows;\n\n this.setIndex(new BufferAttribute(new Uint32Array(triangles * 3), 1));\n\n this.setAttribute(\n \"position4\",\n new BufferAttribute(new Float32Array(points * 4), 4)\n );\n this.setAttribute(\n \"arrow\",\n new BufferAttribute(new Float32Array(points * 3), 3)\n );\n this.setAttribute(\n \"attach\",\n new BufferAttribute(new Float32Array(points * 2), 2)\n );\n\n const index = this._emitter(\"index\");\n const position = this._emitter(\"position4\");\n const arrow = this._emitter(\"arrow\");\n const attach = this._emitter(\"attach\");\n\n const circle = [];\n for (\n k = 0, end = sides, asc = 0 <= end;\n asc ? k < end : k > end;\n asc ? k++ : k--\n ) {\n const angle = (k / sides) * 2 * Math.PI;\n circle.push([Math.cos(angle), Math.sin(angle), 1]);\n }\n\n let base = 0;\n for (\n let i = 0, end1 = arrows, asc1 = 0 <= end1;\n asc1 ? i < end1 : i > end1;\n asc1 ? i++ : i--\n ) {\n var asc2, end2;\n const tip = base++;\n const back = tip + sides + 1;\n\n for (\n k = 0, end2 = sides, asc2 = 0 <= end2;\n asc2 ? k < end2 : k > end2;\n asc2 ? k++ : k--\n ) {\n const a = base + (k % sides);\n const b = base + ((k + 1) % sides);\n\n index(tip);\n index(a);\n index(b);\n\n index(b);\n index(a);\n index(back);\n }\n\n base += sides + 1;\n }\n\n const step = flip ? 1 : -1;\n const far = flip ? samples - 1 : 0;\n const near = anchor + step;\n const x = anchor;\n\n for (\n let l = 0, end3 = layers, asc3 = 0 <= end3;\n asc3 ? l < end3 : l > end3;\n asc3 ? l++ : l--\n ) {\n for (\n let z = 0, end4 = ribbons, asc4 = 0 <= end4;\n asc4 ? z < end4 : z > end4;\n asc4 ? z++ : z--\n ) {\n for (\n let y = 0, end5 = strips, asc5 = 0 <= end5;\n asc5 ? y < end5 : y > end5;\n asc5 ? y++ : y--\n ) {\n var asc6, end6;\n position(x, y, z, l);\n arrow(0, 0, 0);\n attach(near, far);\n\n for (\n k = 0, end6 = sides, asc6 = 0 <= end6;\n asc6 ? k < end6 : k > end6;\n asc6 ? k++ : k--\n ) {\n position(x, y, z, l);\n\n const c = circle[k];\n arrow(c[0], c[1], c[2]);\n attach(near, far);\n }\n\n position(x, y, z, l);\n arrow(0, 0, 1);\n attach(near, far);\n }\n }\n }\n\n this._finalize();\n this.clip();\n }\n\n clip(samples, strips, ribbons, layers) {\n let quads;\n if (samples == null) {\n ({ samples } = this);\n }\n if (strips == null) {\n ({ strips } = this);\n }\n if (ribbons == null) {\n ({ ribbons } = this);\n }\n if (layers == null) {\n ({ layers } = this);\n }\n\n this._clipGeometry(samples, strips, ribbons, layers);\n\n if (samples > this.anchor) {\n const dims = [layers, ribbons, strips];\n const maxs = [this.layers, this.ribbons, this.strips];\n quads = this.sides * this._reduce(dims, maxs);\n } else {\n quads = 0;\n }\n\n return this._offsets([\n {\n start: 0,\n count: quads * 6,\n materialIndex: 0,\n },\n ]);\n }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UGLSL from \"../../util/glsl.js\";\n\nimport { RawShaderMaterial } from \"three/src/materials/RawShaderMaterial.js\";\nimport { Renderable } from \"../renderable.js\";\n\nexport class Base extends Renderable {\n constructor(renderer, shaders, options) {\n super(renderer, shaders, options);\n this.zUnits = options.zUnits != null ? options.zUnits : 0;\n }\n\n raw() {\n for (let object of Array.from(this.renders)) {\n this._raw(object);\n }\n return null;\n }\n\n depth(write, test) {\n for (let object of Array.from(this.renders)) {\n this._depth(object, write, test);\n }\n return null;\n }\n\n polygonOffset(factor, units) {\n for (let object of Array.from(this.renders)) {\n this._polygonOffset(object, factor, units);\n }\n return null;\n }\n\n show(transparent, blending, order) {\n return Array.from(this.renders).map((object) =>\n this._show(object, transparent, blending, order)\n );\n }\n\n hide() {\n for (let object of Array.from(this.renders)) {\n this._hide(object);\n }\n return null;\n }\n\n _material(options) {\n const precision = this.renderer.capabilities.precision;\n\n const vertexPrefix = `\\\n precision ${precision} float;\n precision ${precision} int;\nuniform mat4 modelMatrix;\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat4 viewMatrix;\nuniform mat3 normalMatrix;\nuniform vec3 cameraPosition;\\\n`;\n\n const fragmentPrefix = `\\\n precision ${precision} float;\n precision ${precision} int;\nuniform mat4 viewMatrix;\nuniform vec3 cameraPosition;\\\n`;\n\n const shaderOptions = {};\n Object.assign(shaderOptions, options);\n delete shaderOptions.attributes;\n delete shaderOptions.varyings;\n delete shaderOptions.inspect;\n delete shaderOptions.vertexGraph;\n delete shaderOptions.fragmentGraph;\n\n const material = new RawShaderMaterial(shaderOptions);\n\n [\"vertexGraph\", \"fragmentGraph\", \"inspect\"].forEach(\n (key) => (material[key] = options[key])\n );\n\n material.vertexShader = [vertexPrefix, material.vertexShader].join(\"\\n\");\n material.fragmentShader = [fragmentPrefix, material.fragmentShader].join(\n \"\\n\"\n );\n return material;\n }\n\n _raw(object) {\n object.rotationAutoUpdate = false;\n object.frustumCulled = false;\n object.matrixAutoUpdate = false;\n object.material.defaultAttributeValues = undefined;\n }\n\n _depth(object, write, test) {\n const m = object.material;\n m.depthWrite = write;\n return (m.depthTest = test);\n }\n\n _polygonOffset(object, factor, units) {\n units -= this.zUnits;\n const enabled = units !== 0;\n\n const m = object.material;\n\n m.polygonOffset = enabled;\n if (enabled) {\n m.polygonOffsetFactor = factor;\n return (m.polygonOffsetUnits = units);\n }\n }\n\n _show(object, transparent, blending, order) {\n // Force transparent to true to ensure all renderables drawn in order\n transparent = true;\n\n const m = object.material;\n\n object.renderOrder = -order;\n object.visible = true;\n m.transparent = transparent;\n m.blending = blending;\n\n return null;\n }\n\n _hide(object) {\n return (object.visible = false);\n }\n\n _vertexColor(color, mask) {\n if (!color && !mask) {\n return;\n }\n\n const v = this.shaders.shader();\n\n if (color) {\n v.require(color);\n v.pipe(\"mesh.vertex.color\", this.uniforms);\n }\n\n if (mask) {\n v.require(mask);\n v.pipe(\"mesh.vertex.mask\", this.uniforms);\n }\n\n return v;\n }\n\n _vertexPosition(position, material, map, channels, stpq) {\n let defs;\n const v = this.shaders.shader();\n\n if (map || (material && material !== true)) {\n defs = {};\n if (channels > 0 || stpq) {\n defs.POSITION_MAP = \"\";\n }\n if (channels > 0) {\n defs[\n [\"POSITION_U\", \"POSITION_UV\", \"POSITION_UVW\", \"POSITION_UVWO\"][\n channels - 1\n ]\n ] = \"\";\n }\n if (stpq) {\n defs.POSITION_STPQ = \"\";\n }\n }\n\n v.require(position);\n return v.pipe(\"mesh.vertex.position\", this.uniforms, defs);\n }\n\n _fragmentColor(\n hasStyle,\n material,\n color,\n mask,\n map,\n channels,\n stpq,\n combine,\n linear\n ) {\n const f = this.shaders.shader();\n\n // metacode is terrible\n let join = false;\n let gamma = false;\n\n const defs = {};\n if (channels > 0) {\n defs[\n [\"POSITION_U\", \"POSITION_UV\", \"POSITION_UVW\", \"POSITION_UVWO\"][\n channels - 1\n ]\n ] = \"\";\n }\n if (stpq) {\n defs.POSITION_STPQ = \"\";\n }\n\n if (hasStyle) {\n f.pipe(\"style.color\", this.uniforms);\n join = true;\n\n if (color || map || material) {\n if (!linear || color) {\n f.pipe(\"mesh.gamma.in\");\n }\n gamma = true;\n }\n }\n\n if (color) {\n f.isolate();\n f.pipe(\"mesh.fragment.color\", this.uniforms);\n if (!linear || join) {\n f.pipe(\"mesh.gamma.in\");\n }\n f.end();\n if (join) {\n f.pipe(UGLSL.binaryOperator(\"vec4\", \"*\"));\n }\n\n if (linear && join) {\n f.pipe(\"mesh.gamma.out\");\n }\n\n join = true;\n gamma = true;\n }\n\n if (map) {\n if (!join && combine) {\n f.pipe(UGLSL.constant(\"vec4\", \"vec4(1.0)\"));\n }\n\n f.isolate();\n f.require(map);\n f.pipe(\"mesh.fragment.map\", this.uniforms, defs);\n if (!linear) {\n f.pipe(\"mesh.gamma.in\");\n }\n f.end();\n\n if (combine) {\n f.pipe(combine);\n } else {\n if (join) {\n f.pipe(UGLSL.binaryOperator(\"vec4\", \"*\"));\n }\n }\n\n join = true;\n gamma = true;\n }\n\n if (material) {\n if (!join) {\n f.pipe(UGLSL.constant(\"vec4\", \"vec4(1.0)\"));\n }\n if (material === true) {\n f.pipe(\"mesh.fragment.shaded\", this.uniforms);\n } else {\n f.require(material);\n f.pipe(\"mesh.fragment.material\", this.uniforms, defs);\n }\n\n gamma = true;\n }\n\n if (gamma && !linear) {\n f.pipe(\"mesh.gamma.out\");\n }\n\n if (mask) {\n f.pipe(\"mesh.fragment.mask\", this.uniforms);\n if (join) {\n f.pipe(UGLSL.binaryOperator(\"vec4\", \"*\"));\n }\n }\n\n return f;\n }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { ArrowGeometry } from \"../geometry/arrowgeometry.js\";\nimport { Base } from \"./base.js\";\nimport { DoubleSide } from \"three/src/constants.js\";\nimport { Mesh } from \"three/src/objects/Mesh.js\";\n\nexport class Arrow extends Base {\n constructor(renderer, shaders, options) {\n let f;\n super(renderer, shaders, options);\n\n let {\n uniforms,\n material,\n position,\n color,\n mask,\n map,\n combine,\n stpq,\n linear,\n } = options;\n if (uniforms == null) {\n uniforms = {};\n }\n\n const hasStyle = uniforms.styleColor != null;\n\n this.geometry = new ArrowGeometry({\n sides: options.sides,\n samples: options.samples,\n strips: options.strips,\n ribbons: options.ribbons,\n layers: options.layers,\n anchor: options.anchor,\n flip: options.flip,\n });\n\n this._adopt(uniforms);\n this._adopt(this.geometry.uniforms);\n\n const factory = shaders.material();\n\n const v = factory.vertex;\n\n v.pipe(this._vertexColor(color, mask));\n\n v.require(this._vertexPosition(position, material, map, 1, stpq));\n v.pipe(\"arrow.position\", this.uniforms);\n v.pipe(\"project.position\", this.uniforms);\n\n factory.fragment = f = this._fragmentColor(\n hasStyle,\n material,\n color,\n mask,\n map,\n 1,\n stpq,\n combine,\n linear\n );\n\n f.pipe(\"fragment.color\", this.uniforms);\n\n const opts = factory.link({\n side: DoubleSide,\n });\n this.material = this._material(opts);\n\n const object = new Mesh(this.geometry, this.material);\n object.frustumCulled = false;\n object.matrixAutoUpdate = false;\n object.userData = opts;\n\n this._raw(object);\n this.renders = [object];\n }\n\n dispose() {\n this.geometry.dispose();\n this.material.dispose();\n this.renders = this.geometry = this.material = null;\n return super.dispose();\n }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { DataTexture } from \"./datatexture.js\";\n\n/*\nManually allocated GL texture for data streaming, locally backed.\n\nAllows partial updates via subImage.\nContains local copy of its data to allow quick resizing without gl.copyTexImage2d\n(which requires render-to-framebuffer)\n*/\nexport class BackedTexture extends DataTexture {\n constructor(renderer, width, height, channels, options) {\n super(renderer, width, height, channels, options);\n this.data = new this.ctor(this.n);\n }\n\n resize(width, height) {\n const old = this.data;\n const oldWidth = this.width;\n const oldHeight = this.height;\n\n this.width = width;\n this.height = height;\n this.n = width * height * this.channels;\n this.data = new this.ctor(this.n);\n\n const { gl } = this;\n const state = this.renderer.state;\n state.bindTexture(gl.TEXTURE_2D, this.texture);\n gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n this.format,\n width,\n height,\n 0,\n this.format,\n this.type,\n this.data\n );\n\n this.uniforms.dataResolution.value.set(1 / width, 1 / height);\n\n return this.write(old, 0, 0, oldWidth, oldHeight);\n }\n\n write(src, x, y, w, h) {\n let j;\n const { width } = this;\n const dst = this.data;\n const { channels } = this;\n\n let i = 0;\n if (width === w && x === 0) {\n j = y * w * channels;\n const n = w * h * channels;\n while (i < n) {\n dst[j++] = src[i++];\n }\n } else {\n const stride = width * channels;\n const ww = w * channels;\n const xx = x * channels;\n let yy = y;\n const yh = y + h;\n while (yy < yh) {\n let k = 0;\n j = xx + yy * stride;\n while (k++ < ww) {\n dst[j++] = src[i++];\n }\n yy++;\n }\n }\n\n return super.write(src, x, y, w, h);\n }\n\n dispose() {\n this.data = null;\n return super.dispose();\n }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining\n * DS104: Avoid inline assignments\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UGLSL from \"../../util/glsl.js\";\n\nimport { BackedTexture } from \"./texture/backedtexture.js\";\nimport { DataTexture } from \"./texture/datatexture.js\";\nimport { Renderable } from \"../renderable.js\";\nimport { Vector2 } from \"three/src/math/Vector2.js\";\n\n/*\n * Dynamic sprite atlas\n *\n * - Allocates variable-sized sprites in rows\n * - Will grow itself when full\n */\nexport class Atlas extends Renderable {\n constructor(renderer, shaders, options, build) {\n if (build == null) {\n build = true;\n }\n super(renderer, shaders);\n\n if (this.width == null) {\n this.width = options.width || 512;\n }\n if (this.height == null) {\n this.height = options.height || 512;\n }\n if (this.channels == null) {\n this.channels = options.channels || 4;\n }\n if (this.backed == null) {\n this.backed = options.backed || false;\n }\n this.samples = this.width * this.height;\n\n if (build) {\n this.build(options);\n }\n }\n\n shader(shader) {\n shader.pipe(\"map.2d.data\", this.uniforms);\n shader.pipe(\"sample.2d\", this.uniforms);\n if (this.channels < 4) {\n shader.pipe(\n UGLSL.swizzleVec4([\"0000\", \"x000\", \"xw00\", \"xyz0\"][this.channels])\n );\n }\n return shader;\n }\n\n build(options) {\n let klass;\n this.klass = klass = this.backed ? BackedTexture : DataTexture;\n this.texture = new klass(\n this.renderer,\n this.width,\n this.height,\n this.channels,\n options\n );\n\n this.uniforms = {\n dataPointer: {\n type: \"v2\",\n value: new Vector2(0, 0),\n },\n };\n this._adopt(this.texture.uniforms);\n\n return this.reset();\n }\n\n reset() {\n this.rows = [];\n return (this.bottom = 0);\n }\n\n resize(width, height) {\n if (!this.backed) {\n throw new Error(\"Cannot resize unbacked texture atlas\");\n }\n if (width > 2048 && height > 2048) {\n console.warn(`Giant text atlas ${width}x${height}.`);\n } else {\n console.info(`Resizing text atlas ${width}x${height}.`);\n }\n\n this.texture.resize(width, height);\n\n this.width = width;\n this.height = height;\n return (this.samples = width * height);\n }\n\n collapse(row) {\n let left;\n const { rows } = this;\n rows.splice(rows.indexOf(row), 1);\n this.bottom =\n (left = __guard__(rows[rows.length - 1], (x) => x.bottom)) != null\n ? left\n : 0;\n if (this.last === row) {\n return (this.last = null);\n }\n }\n\n allocate(key, width, height, emit) {\n const w = this.width;\n const h = this.height;\n\n const max = height * 2;\n\n if (width > w) {\n this.resize(w * 2, h * 2);\n this.last = null;\n // Try again\n return this.allocate(key, width, height, emit);\n }\n\n // See if we can append to the last used row (fast code path)\n let row = this.last;\n if (row != null) {\n if (row.height >= height && row.height < max && row.width + width <= w) {\n row.append(key, width, height, emit);\n return;\n }\n }\n\n // Scan all rows and append to the first suitable one (slower code path)\n let bottom = 0;\n let index = -1;\n let top = 0;\n for (let i = 0; i < this.rows.length; i++) {\n // Measure gap between rows\n // Note suitable holes for later\n row = this.rows[i];\n const gap = row.top - bottom;\n if (gap >= height && index < 0) {\n index = i;\n top = bottom;\n }\n ({ bottom } = row);\n\n if (row.height >= height && row.height < max && row.width + width <= w) {\n row.append(key, width, height, emit);\n this.last = row;\n return;\n }\n }\n\n // New row (slowest path)\n if (index >= 0) {\n // Fill a gap\n row = new Row(top, height);\n this.rows.splice(index, 0, row);\n //console.log 'fill gap', row\n } else {\n // Append to bottom\n top = bottom;\n bottom += height;\n\n // Resize if atlas is full\n if (bottom >= h) {\n this.resize(w * 2, h * 2);\n this.last = null;\n // Try again\n return this.allocate(key, width, height, emit);\n }\n\n // Add new row to the end\n row = new Row(top, height);\n this.rows.push(row);\n this.bottom = bottom;\n }\n\n row.append(key, width, height, emit);\n this.last = row;\n }\n\n read() {\n return this.texture.textureObject;\n }\n\n write(data, x, y, w, h) {\n return this.texture.write(data, x, y, w, h);\n }\n\n dispose() {\n this.texture.dispose();\n this.data = null;\n return super.dispose();\n }\n}\n\nclass Row {\n constructor(top, height) {\n this.top = top;\n this.bottom = top + height;\n this.width = 0;\n this.height = height;\n this.alive = 0;\n this.keys = [];\n }\n\n append(key, width, height, emit) {\n const x = this.width;\n const y = this.top;\n this.alive++;\n this.width += width;\n this.keys.push(key);\n return emit(this, x, y);\n }\n}\n\nfunction __guard__(value, transform) {\n return typeof value !== \"undefined\" && value !== null\n ? transform(value)\n : undefined;\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { Base } from \"./base.js\";\nimport { DoubleSide } from \"three/src/constants.js\";\nimport { Mesh } from \"three/src/objects/Mesh.js\";\nimport { MeshBasicMaterial } from \"three/src/materials/MeshBasicMaterial.js\";\nimport { PlaneGeometry } from \"three/src/geometries/PlaneGeometry.js\";\n\nexport class Debug extends Base {\n constructor(renderer, shaders, options) {\n super(renderer, shaders, options);\n\n this.geometry = new PlaneGeometry(1, 1);\n this.material = new MeshBasicMaterial({ map: options.map });\n this.material.side = DoubleSide;\n\n const object = new Mesh(this.geometry, this.material);\n object.position.x += options.x || 0;\n object.position.y += options.y || 0;\n object.frustumCulled = false;\n object.scale.set(2, 2, 2);\n object.__debug = true;\n\n this.objects = [object];\n }\n\n dispose() {\n this.geometry.dispose();\n this.material.dispose();\n this.objects = this.geometry = this.material = null;\n return super.dispose();\n }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS202: Simplify dynamic range loops\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { BufferAttribute } from \"three/src/core/BufferAttribute.js\";\nimport { ClipGeometry } from \"./clipgeometry.js\";\n\n/*\n(flat) Triangle fans arranged in items, columns and rows\n\n+-+ +-+ +-+ +-+\n|\\\\\\ |\\\\\\ |\\\\\\ |\\\\\\\n+-+-+ +-+-+ +-+-+ +-+-+\n\n+-+ +-+ +-+ +-+\n|\\\\\\ |\\\\\\ |\\\\\\ |\\\\\\\n+-+-+ +-+-+ +-+-+ +-+-+\n\n+-+ +-+ +-+ +-+\n|\\\\\\ |\\\\\\ |\\\\\\ |\\\\\\\n+-+-+ +-+-+ +-+-+ +-+-+\n*/\n\nexport class FaceGeometry extends ClipGeometry {\n constructor(options) {\n let depth, height, items, sides, width;\n super(options);\n\n this._clipUniforms();\n\n this.items = items = +options.items || 2;\n this.width = width = +options.width || 1;\n this.height = height = +options.height || 1;\n this.depth = depth = +options.depth || 1;\n this.sides = sides = Math.max(0, items - 2);\n\n const samples = width * height * depth;\n const points = items * samples;\n const triangles = sides * samples;\n\n this.setIndex(new BufferAttribute(new Uint32Array(triangles * 3), 1));\n\n this.setAttribute(\n \"position4\",\n new BufferAttribute(new Float32Array(points * 4), 4)\n );\n\n const index = this._emitter(\"index\");\n const position = this._emitter(\"position4\");\n\n let base = 0;\n for (\n let i = 0, end = samples, asc = 0 <= end;\n asc ? i < end : i > end;\n asc ? i++ : i--\n ) {\n for (\n let j = 0, end1 = sides, asc1 = 0 <= end1;\n asc1 ? j < end1 : j > end1;\n asc1 ? j++ : j--\n ) {\n index(base);\n index(base + j + 1);\n index(base + j + 2);\n }\n\n base += items;\n }\n\n for (\n let z = 0, end2 = depth, asc2 = 0 <= end2;\n asc2 ? z < end2 : z > end2;\n asc2 ? z++ : z--\n ) {\n for (\n let y = 0, end3 = height, asc3 = 0 <= end3;\n asc3 ? y < end3 : y > end3;\n asc3 ? y++ : y--\n ) {\n for (\n let x = 0, end4 = width, asc4 = 0 <= end4;\n asc4 ? x < end4 : x > end4;\n asc4 ? x++ : x--\n ) {\n for (\n let l = 0, end5 = items, asc5 = 0 <= end5;\n asc5 ? l < end5 : l > end5;\n asc5 ? l++ : l--\n ) {\n position(x, y, z, l);\n }\n }\n }\n }\n\n this._finalize();\n this.clip();\n }\n\n clip(width, height, depth, items) {\n if (width == null) {\n ({ width } = this);\n }\n if (height == null) {\n ({ height } = this);\n }\n if (depth == null) {\n ({ depth } = this);\n }\n if (items == null) {\n ({ items } = this);\n }\n const sides = Math.max(0, items - 2);\n\n this._clipGeometry(width, height, depth, items);\n return this._clipOffsets(\n 3,\n width,\n height,\n depth,\n sides,\n this.width,\n this.height,\n this.depth,\n this.sides\n );\n }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { Base } from \"./base.js\";\nimport { DoubleSide } from \"three/src/constants.js\";\nimport { FaceGeometry } from \"../geometry/facegeometry.js\";\nimport { Mesh } from \"three/src/objects/Mesh.js\";\n\nexport class Face extends Base {\n constructor(renderer, shaders, options) {\n let f;\n super(renderer, shaders, options);\n\n let {\n uniforms,\n material,\n position,\n color,\n mask,\n map,\n combine,\n stpq,\n linear,\n } = options;\n\n if (uniforms == null) {\n uniforms = {};\n }\n if (material == null) {\n material = true;\n }\n\n const hasStyle = uniforms.styleColor != null;\n\n this.geometry = new FaceGeometry({\n items: options.items,\n width: options.width,\n height: options.height,\n depth: options.depth,\n });\n\n this._adopt(uniforms);\n this._adopt(this.geometry.uniforms);\n\n const factory = shaders.material();\n\n const v = factory.vertex;\n\n v.pipe(this._vertexColor(color, mask));\n\n v.require(this._vertexPosition(position, material, map, 2, stpq));\n if (!material) {\n v.pipe(\"face.position\", this.uniforms);\n }\n if (material) {\n v.pipe(\"face.position.normal\", this.uniforms);\n }\n v.pipe(\"project.position\", this.uniforms);\n\n factory.fragment = f = this._fragmentColor(\n hasStyle,\n material,\n color,\n mask,\n map,\n 2,\n stpq,\n combine,\n linear\n );\n\n f.pipe(\"fragment.color\", this.uniforms);\n\n const opts = factory.link({\n side: DoubleSide,\n });\n this.material = this._material(opts);\n\n const object = new Mesh(this.geometry, this.material);\n object.userData = opts;\n\n this._raw(object);\n this.renders = [object];\n }\n\n dispose() {\n this.geometry.dispose();\n this.material.dispose();\n this.renders = this.geometry = this.material = null;\n return super.dispose();\n }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS202: Simplify dynamic range loops\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { BufferAttribute } from \"three/src/core/BufferAttribute.js\";\nimport { ClipGeometry } from \"./clipgeometry.js\";\n\n/*\nLine strips arranged in columns and rows\n\n+----+ +----+ +----+ +----+\n\n+----+ +----+ +----+ +----+\n\n+----+ +----+ +----+ +----+\n*/\n\nexport class LineGeometry extends ClipGeometry {\n constructor(options) {\n let closed,\n detail,\n edge,\n joint,\n joints,\n l,\n layers,\n ribbons,\n samples,\n segments,\n strips,\n vertices,\n x,\n y,\n z;\n super(options);\n\n this._clipUniforms();\n\n this.closed = closed = options.closed || false;\n this.samples = samples = (+options.samples || 2) + (closed ? 1 : 0);\n this.strips = strips = +options.strips || 1;\n this.ribbons = ribbons = +options.ribbons || 1;\n this.layers = layers = +options.layers || 1;\n this.detail = detail = +options.detail || 1;\n\n const lines = samples - 1;\n this.joints = joints = detail - 1;\n\n this.vertices = vertices = (lines - 1) * joints + samples;\n this.segments = segments = (lines - 1) * joints + lines;\n\n const wrap = samples - (closed ? 1 : 0);\n const points = vertices * strips * ribbons * layers * 2;\n const quads = segments * strips * ribbons * layers;\n const triangles = quads * 2;\n\n this.setIndex(new BufferAttribute(new Uint32Array(triangles * 3), 1));\n\n this.setAttribute(\n \"position4\",\n new BufferAttribute(new Float32Array(points * 4), 4)\n );\n this.setAttribute(\n \"line\",\n new BufferAttribute(new Float32Array(points * 2), 2)\n );\n this.setAttribute(\n \"strip\",\n new BufferAttribute(new Float32Array(points * 2), 2)\n );\n if (detail > 1) {\n this.setAttribute(\n \"joint\",\n new BufferAttribute(new Float32Array(points), 1)\n );\n }\n\n const index = this._emitter(\"index\");\n const position = this._emitter(\"position4\");\n const line = this._emitter(\"line\");\n const strip = this._emitter(\"strip\");\n if (detail > 1) {\n joint = this._emitter(\"joint\");\n }\n\n let base = 0;\n for (\n let i = 0, end = ribbons * layers, asc = 0 <= end;\n asc ? i < end : i > end;\n asc ? i++ : i--\n ) {\n for (\n let j = 0, end1 = strips, asc1 = 0 <= end1;\n asc1 ? j < end1 : j > end1;\n asc1 ? j++ : j--\n ) {\n for (\n let k = 0, end2 = segments, asc2 = 0 <= end2;\n asc2 ? k < end2 : k > end2;\n asc2 ? k++ : k--\n ) {\n // note implied - 1\n index(base);\n index(base + 1);\n index(base + 2);\n\n index(base + 2);\n index(base + 1);\n index(base + 3);\n\n base += 2;\n }\n base += 2;\n }\n }\n\n const edger = closed\n ? () => 0\n : function (x) {\n if (x === 0) {\n return -1;\n } else if (x === samples - 1) {\n return 1;\n } else {\n return 0;\n }\n };\n\n if (detail > 1) {\n let asc3, end3;\n for (\n l = 0, end3 = layers, asc3 = 0 <= end3;\n asc3 ? l < end3 : l > end3;\n asc3 ? l++ : l--\n ) {\n var asc4, end4;\n for (\n z = 0, end4 = ribbons, asc4 = 0 <= end4;\n asc4 ? z < end4 : z > end4;\n asc4 ? z++ : z--\n ) {\n var asc5, end5;\n for (\n y = 0, end5 = strips, asc5 = 0 <= end5;\n asc5 ? y < end5 : y > end5;\n asc5 ? y++ : y--\n ) {\n var asc6, end6, i1;\n for (\n i1 = 0, x = i1, end6 = samples, asc6 = 0 <= end6;\n asc6 ? i1 < end6 : i1 > end6;\n asc6 ? i1++ : i1--, x = i1\n ) {\n if (closed) {\n x = x % wrap;\n }\n edge = edger(x);\n\n if (edge !== 0) {\n position(x, y, z, l);\n position(x, y, z, l);\n\n line(edge, 1);\n line(edge, -1);\n\n strip(0, segments);\n strip(0, segments);\n\n joint(0.5);\n joint(0.5);\n } else {\n for (\n let m = 0, end7 = detail, asc7 = 0 <= end7;\n asc7 ? m < end7 : m > end7;\n asc7 ? m++ : m--\n ) {\n position(x, y, z, l);\n position(x, y, z, l);\n\n line(edge, 1);\n line(edge, -1);\n\n strip(0, segments);\n strip(0, segments);\n\n joint(m / joints);\n joint(m / joints);\n }\n }\n }\n }\n }\n }\n } else {\n let asc8, end8;\n for (\n l = 0, end8 = layers, asc8 = 0 <= end8;\n asc8 ? l < end8 : l > end8;\n asc8 ? l++ : l--\n ) {\n var asc9, end9;\n for (\n z = 0, end9 = ribbons, asc9 = 0 <= end9;\n asc9 ? z < end9 : z > end9;\n asc9 ? z++ : z--\n ) {\n var asc10, end10;\n for (\n y = 0, end10 = strips, asc10 = 0 <= end10;\n asc10 ? y < end10 : y > end10;\n asc10 ? y++ : y--\n ) {\n var asc11, end11, j1;\n for (\n j1 = 0, x = j1, end11 = samples, asc11 = 0 <= end11;\n asc11 ? j1 < end11 : j1 > end11;\n asc11 ? j1++ : j1--, x = j1\n ) {\n if (closed) {\n x = x % wrap;\n }\n edge = edger(x);\n\n position(x, y, z, l);\n position(x, y, z, l);\n\n line(edge, 1);\n line(edge, -1);\n\n strip(0, segments);\n strip(0, segments);\n }\n }\n }\n }\n }\n\n this._finalize();\n this.clip();\n }\n\n clip(samples, strips, ribbons, layers) {\n if (samples == null) {\n samples = this.samples - this.closed;\n }\n if (strips == null) {\n ({ strips } = this);\n }\n if (ribbons == null) {\n ({ ribbons } = this);\n }\n if (layers == null) {\n ({ layers } = this);\n }\n let segments = Math.max(0, samples - (this.closed ? 0 : 1));\n\n const vertices = samples + (samples - 2) * this.joints;\n segments = vertices - 1;\n\n this._clipGeometry(vertices, strips, ribbons, layers);\n return this._clipOffsets(\n 6,\n segments,\n strips,\n ribbons,\n layers,\n this.segments,\n this.strips,\n this.ribbons,\n this.layers\n );\n }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { Base } from \"./base.js\";\nimport { DoubleSide } from \"three/src/constants.js\";\nimport { LineGeometry } from \"../geometry/linegeometry.js\";\nimport { Mesh } from \"three/src/objects/Mesh.js\";\n\nexport class Line extends Base {\n constructor(renderer, shaders, options) {\n let left;\n super(renderer, shaders, options);\n\n let {\n uniforms,\n material,\n position,\n color,\n mask,\n map,\n combine,\n stpq,\n linear,\n clip,\n stroke,\n join,\n proximity,\n } = options;\n\n if (uniforms == null) {\n uniforms = {};\n }\n stroke = [null, \"dotted\", \"dashed\"][stroke];\n\n const hasStyle = uniforms.styleColor != null;\n\n // Line join\n join = (left = [\"miter\", \"round\", \"bevel\"][join]) != null ? left : \"miter\";\n const detail = { miter: 1, round: 4, bevel: 2 }[join];\n\n this.geometry = new LineGeometry({\n samples: options.samples,\n strips: options.strips,\n ribbons: options.ribbons,\n layers: options.layers,\n anchor: options.anchor,\n closed: options.closed,\n detail,\n });\n\n this._adopt(uniforms);\n this._adopt(this.geometry.uniforms);\n\n const factory = shaders.material();\n\n const defs = {};\n if (stroke) {\n defs.LINE_STROKE = \"\";\n }\n if (clip) {\n defs.LINE_CLIP = \"\";\n }\n if (proximity != null) {\n defs.LINE_PROXIMITY = \"\";\n }\n\n defs[\"LINE_JOIN_\" + join.toUpperCase()] = \"\";\n if (detail > 1) {\n defs[\"LINE_JOIN_DETAIL\"] = detail;\n }\n\n const v = factory.vertex;\n\n v.pipe(this._vertexColor(color, mask));\n\n v.require(this._vertexPosition(position, material, map, 2, stpq));\n v.pipe(\"line.position\", this.uniforms, defs);\n v.pipe(\"project.position\", this.uniforms);\n\n const f = factory.fragment;\n if (stroke) {\n f.pipe(`fragment.clip.${stroke}`, this.uniforms);\n }\n if (clip) {\n f.pipe(\"fragment.clip.ends\", this.uniforms);\n }\n if (proximity != null) {\n f.pipe(\"fragment.clip.proximity\", this.uniforms);\n }\n\n f.pipe(\n this._fragmentColor(\n hasStyle,\n material,\n color,\n mask,\n map,\n 2,\n stpq,\n combine,\n linear\n )\n );\n\n f.pipe(\"fragment.color\", this.uniforms);\n\n const opts = factory.link({\n side: DoubleSide,\n });\n this.material = this._material(opts);\n\n const object = new Mesh(this.geometry, this.material);\n object.userData = opts;\n\n this._raw(object);\n this.renders = [object];\n }\n\n dispose() {\n this.geometry.dispose();\n this.material.dispose();\n this.renders = this.geometry = this.material = null;\n return super.dispose();\n }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UData from \"../../util/data.js\";\nimport { DataBuffer } from \"./databuffer.js\";\n\n/*\n * 2D + history array\n */\nexport class MatrixBuffer extends DataBuffer {\n constructor(renderer, shaders, options) {\n const width = options.width || 1;\n const height = options.height || 1;\n const history = options.history || 1;\n\n options.depth = history;\n\n super(renderer, shaders, options, false);\n\n this.width = width;\n this.height = height;\n this.history = history;\n this.samples = width * height;\n this.wrap = history > 1;\n\n this.build(options);\n }\n\n build(_options) {\n super.build();\n\n this.index = 0;\n this.pad = { x: 0, y: 0 };\n return (this.streamer = this.generate(this.data));\n }\n\n getFilled() {\n return this.filled;\n }\n\n setActive(i, j) {\n let ref;\n return (\n ([this.pad.x, this.pad.y] = Array.from(\n (ref = [Math.max(0, this.width - i), Math.max(0, this.height - j)])\n )),\n ref\n );\n }\n\n fill() {\n let j, k, repeat;\n const { callback } = this;\n if (typeof callback.reset === \"function\") {\n callback.reset();\n }\n\n const { emit, skip, count, done, reset } = this.streamer;\n reset();\n\n const n = this.width;\n const pad = this.pad.x;\n const limit = this.samples - this.pad.y * n;\n\n let i = (j = k = 0);\n if (pad) {\n while (!done() && k < limit) {\n k++;\n repeat = callback(emit, i, j);\n if (++i === n - pad) {\n skip(pad);\n i = 0;\n j++;\n }\n if (repeat === false) {\n break;\n }\n }\n } else {\n while (!done() && k < limit) {\n k++;\n repeat = callback(emit, i, j);\n if (++i === n) {\n i = 0;\n j++;\n }\n if (repeat === false) {\n break;\n }\n }\n }\n\n return Math.floor(count() / this.items);\n }\n\n write(n) {\n if (n == null) {\n n = this.samples;\n }\n n *= this.items;\n const width = this.width * this.items;\n const height = Math.ceil(n / width);\n\n this.texture.write(this.data, 0, this.index * this.height, width, height);\n this.dataPointer.set(0.5, this.index * this.height + 0.5);\n this.index = (this.index + this.history - 1) % this.history;\n return (this.filled = Math.min(this.history, this.filled + 1));\n }\n\n through(callback, target) {\n let dst, j, src;\n const { consume, skip, done } = (src = this.streamer);\n const { emit } = (dst = target.streamer);\n\n let i = (j = 0);\n\n let pipe = () => consume((x, y, z, w) => callback(emit, x, y, z, w, i, j));\n pipe = UData.repeatCall(pipe, this.items);\n\n return () => {\n let k;\n src.reset();\n dst.reset();\n\n const n = this.width;\n const pad = this.pad.x;\n const limit = this.samples - this.pad.y * n;\n\n i = j = k = 0;\n if (pad) {\n while (!done() && k < limit) {\n k++;\n pipe();\n if (++i === n - pad) {\n skip(pad);\n i = 0;\n j++;\n }\n }\n } else {\n while (!done() && k < limit) {\n k++;\n pipe();\n if (++i === n) {\n i = 0;\n j++;\n }\n }\n }\n\n return src.count();\n };\n }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS202: Simplify dynamic range loops\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n/*\nVirtual RenderTarget that cycles through multiple frames\nProvides easy access to past rendered frames\n@reads[] and @write contain WebGLRenderTargets whose internal pointers are rotated automatically\n*/\n\nimport {\n NearestFilter,\n RGBAFormat,\n UnsignedByteType,\n} from \"three/src/constants.js\";\nimport { Vector2 } from \"three/src/math/Vector2.js\";\nimport { WebGLRenderTarget } from \"three/src/renderers/WebGLRenderTarget.js\";\n\nexport class RenderTarget {\n constructor(gl, width, height, frames, options) {\n this.gl = gl;\n if (options == null) {\n options = {};\n }\n if (options.minFilter == null) {\n options.minFilter = NearestFilter;\n }\n if (options.magFilter == null) {\n options.magFilter = NearestFilter;\n }\n if (options.format == null) {\n options.format = RGBAFormat;\n }\n if (options.type == null) {\n options.type = UnsignedByteType;\n }\n\n this.options = options;\n\n this.width = width || 1;\n this.height = height || 1;\n this.frames = frames || 1;\n this.buffers = this.frames + 1;\n\n this.build();\n }\n\n build() {\n let i;\n const make = () =>\n new WebGLRenderTarget(this.width, this.height, this.options);\n\n this.targets = (() => {\n let asc, end;\n const result = [];\n for (\n i = 0, end = this.buffers, asc = 0 <= end;\n asc ? i < end : i > end;\n asc ? i++ : i--\n ) {\n result.push(make());\n }\n return result;\n })();\n\n const acc = [];\n this.targets.forEach((target) => acc.push(target.texture));\n this.reads = acc;\n\n this.write = this.targets[this.buffers - 1];\n\n // Texture access uniforms\n this.uniforms = {\n dataResolution: {\n type: \"v2\",\n value: new Vector2(1 / this.width, 1 / this.height),\n },\n dataTexture: {\n type: \"t\",\n value: this.reads[0],\n },\n dataTextures: {\n type: \"tv\",\n value: this.reads,\n },\n };\n }\n\n cycle() {\n this.targets.unshift(this.targets.pop());\n this.write = this.targets[this.buffers - 1];\n this.reads.unshift(this.reads.pop());\n this.uniforms.dataTexture.value = this.reads[0];\n }\n\n warmup(callback) {\n return (() => {\n const result = [];\n for (\n let i = 0, end = this.buffers, asc = 0 <= end;\n asc ? i < end : i > end;\n asc ? i++ : i--\n ) {\n callback(this.write);\n result.push(this.cycle());\n }\n return result;\n })();\n }\n\n dispose() {\n for (let target of Array.from(this.targets)) {\n target.dispose();\n }\n return (this.targets = this.reads = this.write = null);\n }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UGLSL from \"../../util/glsl.js\";\n\nimport { PerspectiveCamera } from \"three/src/cameras/PerspectiveCamera.js\";\nimport { RenderTarget } from \"./texture/rendertarget.js\";\nimport { Renderable } from \"../renderable.js\";\nimport { Scene } from \"three/src/scenes/Scene.js\";\nimport { Vector2 } from \"three/src/math/Vector2.js\";\nimport { Vector3 } from \"three/src/math/Vector3.js\";\n\n/*\n * Render-To-Texture with history\n */\nexport class RenderToTexture extends Renderable {\n constructor(renderer, shaders, options) {\n super(renderer, shaders);\n\n this.scene = options.scene != null ? options.scene : new Scene();\n this.camera = options.camera;\n\n this.build(options);\n }\n\n shaderRelative(shader) {\n if (shader == null) {\n shader = this.shaders.shader();\n }\n return shader.pipe(\"sample.2d\", this.uniforms);\n }\n\n shaderAbsolute(shader, frames, indices) {\n if (frames == null) {\n frames = 1;\n }\n if (indices == null) {\n indices = 4;\n }\n if (shader == null) {\n shader = this.shaders.shader();\n }\n if (frames <= 1) {\n if (indices > 2) {\n shader.pipe(UGLSL.truncateVec(indices, 2));\n }\n shader.pipe(\"map.2d.data\", this.uniforms);\n return shader.pipe(\"sample.2d\", this.uniforms);\n } else {\n const sample2DArray = UGLSL.sample2DArray(\n Math.min(frames, this.target.frames)\n );\n if (indices < 4) {\n shader.pipe(UGLSL.extendVec(indices, 4));\n }\n shader.pipe(\"map.xyzw.2dv\");\n shader.split();\n shader.pipe(\"map.2d.data\", this.uniforms);\n shader.pass();\n return shader.pipe(sample2DArray, this.uniforms);\n }\n }\n\n build(options) {\n if (!this.camera) {\n this.camera = new PerspectiveCamera();\n this.camera.position.set(0, 0, 3);\n this.camera.lookAt(new Vector3());\n }\n if (typeof this.scene.inject === \"function\") {\n this.scene.inject();\n }\n\n this.target = new RenderTarget(\n this.gl,\n options.width,\n options.height,\n options.frames,\n options\n );\n this.target.warmup((target) => this.renderer.setRenderTarget(target));\n this.renderer.setRenderTarget(null);\n\n this._adopt(this.target.uniforms);\n this._adopt({\n dataPointer: {\n type: \"v2\",\n value: new Vector2(0.5, 0.5),\n },\n });\n\n return (this.filled = 0);\n }\n\n adopt(renderable) {\n return Array.from(renderable.renders).map((object) =>\n this.scene.add(object)\n );\n }\n unadopt(renderable) {\n return Array.from(renderable.renders).map((object) =>\n this.scene.remove(object)\n );\n }\n\n render(camera) {\n if (camera == null) {\n ({ camera } = this);\n }\n const currentTarget = this.renderer.getRenderTarget();\n this.renderer.setRenderTarget(this.target.write);\n this.renderer.render(\n this.scene.scene != null ? this.scene.scene : this.scene,\n camera\n );\n this.renderer.setRenderTarget(currentTarget);\n\n this.target.cycle();\n if (this.filled < this.target.frames) {\n return this.filled++;\n }\n }\n\n read(frame) {\n if (frame == null) {\n frame = 0;\n }\n return this.target.reads[Math.abs(frame)];\n }\n\n getFrames() {\n return this.target.frames;\n }\n\n getFilled() {\n return this.filled;\n }\n\n dispose() {\n if (typeof this.scene.unject === \"function\") {\n this.scene.unject();\n }\n this.scene = this.camera = null;\n\n this.target.dispose();\n\n return super.dispose();\n }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { RGBAFormat } from \"three/src/constants.js\";\nimport { RenderToTexture } from \"./rendertotexture.js\";\n\n/*\n * Wrapped RTT for memoizing 4D arrays back to a 2D texture\n */\nexport class Memo extends RenderToTexture {\n constructor(renderer, shaders, options) {\n let _height, _width;\n const items = options.items || 1;\n const channels = options.channels || 4;\n const width = options.width || 1;\n const height = options.height || 1;\n const depth = options.depth || 1;\n\n //options.format = [null, THREE.LuminanceFormat, THREE.LuminanceAlphaFormat, THREE.RGBFormat, THREE.RGBAFormat][@channels]\n options.format = RGBAFormat;\n options.width = _width = items * width;\n options.height = _height = height * depth;\n options.frames = 1;\n\n delete options.items;\n delete options.depth;\n delete options.channels;\n\n super(renderer, shaders, options);\n\n if (this.items == null) {\n this.items = items;\n }\n if (this.channels == null) {\n this.channels = channels;\n }\n if (this.width == null) {\n this.width = width;\n }\n this._width = _width;\n if (this.height == null) {\n this.height = height;\n }\n this._height = _height;\n if (this.depth == null) {\n this.depth = depth;\n }\n\n this._adopt({\n textureItems: { type: \"f\", value: this.items },\n textureHeight: { type: \"f\", value: this.height },\n });\n }\n\n shaderAbsolute(shader) {\n if (shader == null) {\n shader = this.shaders.shader();\n }\n shader.pipe(\"map.xyzw.texture\", this.uniforms);\n return super.shaderAbsolute(shader, 1, 2);\n }\n}\n//shader.pipe Util.GLSL.swizzleVec4 ['0000', 'x000', 'xw00', 'xyz0'][@channels] if @channels < 4\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS202: Simplify dynamic range loops\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { BufferAttribute } from \"three/src/core/BufferAttribute.js\";\nimport { ClipGeometry } from \"./clipgeometry.js\";\n\n/*\nGrid Surface\n\n+----+----+----+----+\n| | | | |\n+----+----+----+----+\n| | | | |\n+----+----+----+----+\n\n+----+----+----+----+\n| | | | |\n+----+----+----+----+\n| | | | |\n+----+----+----+----+\n*/\n\nexport class SurfaceGeometry extends ClipGeometry {\n constructor(options, build) {\n if (build == null) {\n build = true;\n }\n super();\n // TODO not great... but use this pattern, maybe, to defer construction if\n // options are missing, NOT the boolean.\n if (build) {\n this.construct(options);\n }\n }\n\n construct(options) {\n let closedX, closedY, height, layers, segmentsX, segmentsY, surfaces, width;\n this._clipUniforms();\n\n this.closedX = closedX = options.closedX || false;\n this.closedY = closedY = options.closedY || false;\n this.width = width = (+options.width || 2) + (closedX ? 1 : 0);\n this.height = height = (+options.height || 2) + (closedY ? 1 : 0);\n this.surfaces = surfaces = +options.surfaces || 1;\n this.layers = layers = +options.layers || 1;\n\n const wrapX = width - (closedX ? 1 : 0);\n const wrapY = height - (closedY ? 1 : 0);\n\n this.segmentsX = segmentsX = Math.max(0, width - 1);\n this.segmentsY = segmentsY = Math.max(0, height - 1);\n\n const points = width * height * surfaces * layers;\n const quads = segmentsX * segmentsY * surfaces * layers;\n const triangles = quads * 2;\n\n this.setIndex(new BufferAttribute(new Uint32Array(triangles * 3), 1));\n\n this.setAttribute(\n \"position4\",\n new BufferAttribute(new Float32Array(points * 4), 4)\n );\n this.setAttribute(\n \"surface\",\n new BufferAttribute(new Float32Array(points * 2), 2)\n );\n\n const index = this._emitter(\"index\");\n const position = this._emitter(\"position4\");\n const surface = this._emitter(\"surface\");\n\n let base = 0;\n for (\n let i = 0, end = surfaces * layers, asc = 0 <= end;\n asc ? i < end : i > end;\n asc ? i++ : i--\n ) {\n for (\n let j = 0, end1 = segmentsY, asc1 = 0 <= end1;\n asc1 ? j < end1 : j > end1;\n asc1 ? j++ : j--\n ) {\n for (\n let k = 0, end2 = segmentsX, asc2 = 0 <= end2;\n asc2 ? k < end2 : k > end2;\n asc2 ? k++ : k--\n ) {\n index(base);\n index(base + 1);\n index(base + width);\n\n index(base + width);\n index(base + 1);\n index(base + width + 1);\n\n base++;\n }\n base++;\n }\n base += width;\n }\n\n const edgerX = closedX\n ? () => 0\n : function (x) {\n if (x === 0) {\n return -1;\n } else if (x === segmentsX) {\n return 1;\n } else {\n return 0;\n }\n };\n\n const edgerY = closedY\n ? () => 0\n : function (y) {\n if (y === 0) {\n return -1;\n } else if (y === segmentsY) {\n return 1;\n } else {\n return 0;\n }\n };\n\n for (\n let l = 0, end3 = layers, asc3 = 0 <= end3;\n asc3 ? l < end3 : l > end3;\n asc3 ? l++ : l--\n ) {\n for (\n let z = 0, end4 = surfaces, asc4 = 0 <= end4;\n asc4 ? z < end4 : z > end4;\n asc4 ? z++ : z--\n ) {\n for (\n let i1 = 0, y = i1, end5 = height, asc5 = 0 <= end5;\n asc5 ? i1 < end5 : i1 > end5;\n asc5 ? i1++ : i1--, y = i1\n ) {\n if (closedY) {\n y = y % wrapY;\n }\n const edgeY = edgerY(y);\n\n for (\n let j1 = 0, x = j1, end6 = width, asc6 = 0 <= end6;\n asc6 ? j1 < end6 : j1 > end6;\n asc6 ? j1++ : j1--, x = j1\n ) {\n if (closedX) {\n x = x % wrapX;\n }\n const edgeX = edgerX(x);\n\n position(x, y, z, l);\n\n surface(edgeX, edgeY);\n }\n }\n }\n }\n\n this._finalize();\n this.clip();\n }\n\n clip(width, height, surfaces, layers) {\n if (width == null) {\n ({ width } = this);\n }\n if (height == null) {\n ({ height } = this);\n }\n if (surfaces == null) {\n ({ surfaces } = this);\n }\n if (layers == null) {\n ({ layers } = this);\n }\n const segmentsX = Math.max(0, width - 1);\n const segmentsY = Math.max(0, height - 1);\n\n this._clipGeometry(width, height, surfaces, layers);\n return this._clipOffsets(\n 6,\n segmentsX,\n segmentsY,\n surfaces,\n layers,\n this.segmentsX,\n this.segmentsY,\n this.surfaces,\n this.layers\n );\n }\n\n map(width, height, surfaces, layers) {\n if (width == null) {\n ({ width } = this);\n }\n if (height == null) {\n ({ height } = this);\n }\n if (surfaces == null) {\n ({ surfaces } = this);\n }\n if (layers == null) {\n ({ layers } = this);\n }\n return this._clipMap(width, height, surfaces, layers);\n }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { SurfaceGeometry } from \"./surfacegeometry.js\";\nimport { Vector4 } from \"three/src/math/Vector4.js\";\n\n/*\nGrid Surface in normalized screen space\n\n+----+----+----+----+\n| | | | |\n+----+----+----+----+\n| | | | |\n+----+----+----+----+\n\n+----+----+----+----+\n| | | | |\n+----+----+----+----+\n| | | | |\n+----+----+----+----+\n*/\n\nexport class ScreenGeometry extends SurfaceGeometry {\n constructor(options) {\n options.width = Math.max(2, +options.width != null ? +options.width : 2);\n options.height = Math.max(2, +options.height != null ? +options.height : 2);\n\n super(options, false);\n\n if (this.uniforms == null) {\n this.uniforms = {};\n }\n this.uniforms.geometryScale = {\n type: \"v4\",\n value: new Vector4(),\n };\n\n this.cover();\n this.construct(options);\n }\n\n cover(scaleX, scaleY, scaleZ, scaleW) {\n if (scaleX == null) {\n scaleX = 1;\n }\n this.scaleX = scaleX;\n if (scaleY == null) {\n scaleY = 1;\n }\n this.scaleY = scaleY;\n if (scaleZ == null) {\n scaleZ = 1;\n }\n this.scaleZ = scaleZ;\n if (scaleW == null) {\n scaleW = 1;\n }\n this.scaleW = scaleW;\n }\n\n clip(width, height, surfaces, layers) {\n if (width == null) {\n ({ width } = this);\n }\n if (height == null) {\n ({ height } = this);\n }\n if (surfaces == null) {\n ({ surfaces } = this);\n }\n if (layers == null) {\n ({ layers } = this);\n }\n super.clip(width, height, surfaces, layers);\n\n const invert = (x) => 1 / Math.max(1, x - 1);\n return this.uniforms.geometryScale.value.set(\n invert(width) * this.scaleX,\n invert(height) * this.scaleY,\n invert(surfaces) * this.scaleZ,\n invert(layers) * this.scaleW\n );\n }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { Base } from \"./base.js\";\nimport { DoubleSide } from \"three/src/constants.js\";\nimport { Mesh } from \"three/src/objects/Mesh.js\";\nimport { ScreenGeometry } from \"../geometry/screengeometry.js\";\n\nexport class Screen extends Base {\n constructor(renderer, shaders, options) {\n let f;\n super(renderer, shaders, options);\n\n let { uniforms, map, combine, stpq, linear } = options;\n if (uniforms == null) {\n uniforms = {};\n }\n\n const hasStyle = uniforms.styleColor != null;\n\n this.geometry = new ScreenGeometry({\n width: options.width,\n height: options.height,\n });\n\n this._adopt(uniforms);\n this._adopt(this.geometry.uniforms);\n\n const factory = shaders.material();\n\n const v = factory.vertex;\n v.pipe(\"raw.position.scale\", this.uniforms);\n v.fan();\n v.pipe(\"stpq.xyzw.2d\", this.uniforms);\n v.next();\n v.pipe(\"screen.position\", this.uniforms);\n v.join();\n\n factory.fragment = f = this._fragmentColor(\n hasStyle,\n false,\n null,\n null,\n map,\n 2,\n stpq,\n combine,\n linear\n );\n\n f.pipe(\"fragment.color\", this.uniforms);\n\n const opts = factory.link({\n side: DoubleSide,\n });\n this.material = this._material(opts);\n\n const object = new Mesh(this.geometry, this.material);\n object.frustumCulled = false;\n object.userData = opts;\n\n this._raw(object);\n this.renders = [object];\n }\n\n dispose() {\n this.geometry.dispose();\n this.material.dispose();\n this.renders = this.geometry = this.material = null;\n return super.dispose();\n }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { Screen } from \"./screen.js\";\nimport { Vector2 } from \"three/src/math/Vector2.js\";\nimport { Vector4 } from \"three/src/math/Vector4.js\";\n\nexport class MemoScreen extends Screen {\n constructor(renderer, shaders, options) {\n const { items, width, height, depth, stpq } = options;\n\n const inv = (x) => 1 / Math.max(1, x);\n const inv1 = (x) => 1 / Math.max(1, x - 1);\n\n const uniforms = {\n remapUVScale: {\n type: \"v2\",\n value: new Vector2(items * width, height * depth),\n },\n remapModulus: {\n type: \"v2\",\n value: new Vector2(items, height),\n },\n remapModulusInv: {\n type: \"v2\",\n value: new Vector2(inv(items), inv(height)),\n },\n remapSTPQScale: {\n type: \"v4\",\n value: new Vector4(inv1(width), inv1(height), inv1(depth), inv1(items)),\n },\n };\n\n const map = shaders.shader();\n map.pipe(\"screen.map.xyzw\", uniforms);\n if (options.map != null) {\n // Need artifical STPQs because the screen is not the real geometry\n if (stpq) {\n map.pipe(\"screen.map.stpq\", uniforms);\n }\n map.pipe(options.map);\n }\n\n super(renderer, shaders, { map, linear: true });\n this.memo = options;\n this.uniforms = uniforms;\n\n for (let object of Array.from(this.renders)) {\n object.transparent = false;\n }\n }\n\n cover(width, height, depth, items) {\n if (width == null) {\n ({ width } = this.memo);\n }\n if (height == null) {\n ({ height } = this.memo);\n }\n if (depth == null) {\n ({ depth } = this.memo);\n }\n if (items == null) {\n ({ items } = this.memo);\n }\n const inv1 = (x) => 1 / Math.max(1, x - 1);\n this.uniforms.remapSTPQScale.value.set(\n inv1(width),\n inv1(height),\n inv1(depth),\n inv1(items)\n );\n\n const x = width / this.memo.width;\n let y = depth / this.memo.depth;\n if (this.memo.depth === 1) {\n y = height / this.memo.height;\n }\n\n return this.geometry.cover(x, y);\n }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS202: Simplify dynamic range loops\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { BufferAttribute } from \"three/src/core/BufferAttribute.js\";\nimport { ClipGeometry } from \"./clipgeometry.js\";\n\n/*\nRender points as quads\n\n+----+ +----+ +----+ +----+\n| | | | | | | |\n+----+ +----+ +----+ +----+\n\n+----+ +----+ +----+ +----+\n| | | | | | | |\n+----+ +----+ +----+ +----+\n\n+----+ +----+ +----+ +----+\n| | | | | | | |\n+----+ +----+ +----+ +----+\n\n*/\n\nexport class SpriteGeometry extends ClipGeometry {\n constructor(options) {\n let depth, height, items, width;\n super(options);\n\n this._clipUniforms();\n\n this.items = items = +options.items || 2;\n this.width = width = +options.width || 1;\n this.height = height = +options.height || 1;\n this.depth = depth = +options.depth || 1;\n\n const samples = items * width * height * depth;\n const points = samples * 4;\n const triangles = samples * 2;\n\n this.setIndex(new BufferAttribute(new Uint32Array(triangles * 3), 1));\n\n this.setAttribute(\n \"position4\",\n new BufferAttribute(new Float32Array(points * 4), 4)\n );\n this.setAttribute(\n \"sprite\",\n new BufferAttribute(new Float32Array(points * 2), 2)\n );\n\n const index = this._emitter(\"index\");\n const position = this._emitter(\"position4\");\n const sprite = this._emitter(\"sprite\");\n\n const quad = [\n [-1, -1],\n [-1, 1],\n [1, -1],\n [1, 1],\n ];\n\n let base = 0;\n for (\n let i = 0, end = samples, asc = 0 <= end;\n asc ? i < end : i > end;\n asc ? i++ : i--\n ) {\n index(base);\n index(base + 1);\n index(base + 2);\n\n index(base + 1);\n index(base + 2);\n index(base + 3);\n\n base += 4;\n }\n\n for (\n let z = 0, end1 = depth, asc1 = 0 <= end1;\n asc1 ? z < end1 : z > end1;\n asc1 ? z++ : z--\n ) {\n for (\n let y = 0, end2 = height, asc2 = 0 <= end2;\n asc2 ? y < end2 : y > end2;\n asc2 ? y++ : y--\n ) {\n for (\n let x = 0, end3 = width, asc3 = 0 <= end3;\n asc3 ? x < end3 : x > end3;\n asc3 ? x++ : x--\n ) {\n for (\n let l = 0, end4 = items, asc4 = 0 <= end4;\n asc4 ? l < end4 : l > end4;\n asc4 ? l++ : l--\n ) {\n for (let v of Array.from(quad)) {\n position(x, y, z, l);\n sprite(v[0], v[1]);\n }\n }\n }\n }\n }\n\n this._finalize();\n this.clip();\n }\n\n clip(width, height, depth, items) {\n if (width == null) {\n ({ width } = this);\n }\n if (height == null) {\n ({ height } = this);\n }\n if (depth == null) {\n ({ depth } = this);\n }\n if (items == null) {\n ({ items } = this);\n }\n this._clipGeometry(width, height, depth, items);\n return this._clipOffsets(\n 6,\n width,\n height,\n depth,\n items,\n this.width,\n this.height,\n this.depth,\n this.items\n );\n }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { Base } from \"./base.js\";\nimport { DoubleSide } from \"three/src/constants.js\";\nimport { Mesh } from \"three/src/objects/Mesh.js\";\nimport { SpriteGeometry } from \"../geometry/spritegeometry.js\";\n\nexport class Point extends Base {\n constructor(renderer, shaders, options) {\n let f, left;\n super(renderer, shaders, options);\n\n let {\n uniforms,\n material,\n position,\n color,\n size,\n mask,\n map,\n combine,\n linear,\n shape,\n optical,\n fill,\n stpq,\n } = options;\n\n if (uniforms == null) {\n uniforms = {};\n }\n shape = +shape != null ? +shape : 0;\n if (fill == null) {\n fill = true;\n }\n\n const hasStyle = uniforms.styleColor != null;\n\n const shapes = [\n \"circle\",\n \"square\",\n \"diamond\",\n \"up\",\n \"down\",\n \"left\",\n \"right\",\n ];\n const passes = [\n \"circle\",\n \"generic\",\n \"generic\",\n \"generic\",\n \"generic\",\n \"generic\",\n \"generic\",\n ];\n const scales = [1.2, 1, 1.414, 1.16, 1.16, 1.16, 1.16];\n const pass = passes[shape] != null ? passes[shape] : passes[0];\n const _shape = shapes[shape] != null ? shapes[shape] : shapes[0];\n const _scale = (left = optical && scales[shape]) != null ? left : 1;\n const alpha = fill ? pass : `${pass}.hollow`;\n\n this.geometry = new SpriteGeometry({\n items: options.items,\n width: options.width,\n height: options.height,\n depth: options.depth,\n });\n\n this._adopt(uniforms);\n this._adopt(this.geometry.uniforms);\n\n const defines = { POINT_SHAPE_SCALE: +(_scale + 0.00001) };\n\n // Shared vertex shader\n const factory = shaders.material();\n const v = factory.vertex;\n\n v.pipe(this._vertexColor(color, mask));\n\n // Point sizing\n if (size) {\n v.isolate();\n v.require(size);\n v.require(\"point.size.varying\", this.uniforms);\n v.end();\n } else {\n v.require(\"point.size.uniform\", this.uniforms);\n }\n\n v.require(this._vertexPosition(position, material, map, 2, stpq));\n\n v.pipe(\"point.position\", this.uniforms, defines);\n v.pipe(\"project.position\", this.uniforms);\n\n // Shared fragment shader\n factory.fragment = f = this._fragmentColor(\n hasStyle,\n material,\n color,\n mask,\n map,\n 2,\n stpq,\n combine,\n linear\n );\n\n // Split fragment into edge and fill pass for better z layering\n const edgeFactory = shaders.material();\n edgeFactory.vertex.pipe(v);\n f = edgeFactory.fragment.pipe(factory.fragment);\n f.require(`point.mask.${_shape}`, this.uniforms);\n f.require(`point.alpha.${alpha}`, this.uniforms);\n f.pipe(\"point.edge\", this.uniforms);\n\n const fillFactory = shaders.material();\n fillFactory.vertex.pipe(v);\n f = fillFactory.fragment.pipe(factory.fragment);\n f.require(`point.mask.${_shape}`, this.uniforms);\n f.require(`point.alpha.${alpha}`, this.uniforms);\n f.pipe(\"point.fill\", this.uniforms);\n\n const fillOpts = fillFactory.link({\n side: DoubleSide,\n });\n this.fillMaterial = this._material(fillOpts);\n\n const edgeOpts = edgeFactory.link({\n side: DoubleSide,\n });\n this.edgeMaterial = this._material(edgeOpts);\n\n this.fillObject = new Mesh(this.geometry, this.fillMaterial);\n this.edgeObject = new Mesh(this.geometry, this.edgeMaterial);\n\n this._raw(this.fillObject);\n this.fillObject.userData = fillOpts;\n\n this._raw(this.edgeObject);\n this.edgeObject.userData = edgeOpts;\n\n this.renders = [this.fillObject, this.edgeObject];\n }\n\n show(transparent, blending, order, depth) {\n this._show(this.edgeObject, true, blending, order, depth);\n return this._show(this.fillObject, transparent, blending, order, depth);\n }\n\n dispose() {\n this.geometry.dispose();\n this.edgeMaterial.dispose();\n this.fillMaterial.dispose();\n this.renders =\n this.edgeObject =\n this.fillObject =\n this.geometry =\n this.edgeMaterial =\n this.fillMaterial =\n null;\n return super.dispose();\n }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Buffer } from \"./buffer.js\";\n\n/*\n * Buffer for CPU-side use\n */\nexport class PushBuffer extends Buffer {\n constructor(renderer, shaders, options) {\n const width = options.width || 1;\n const height = options.height || 1;\n const depth = options.depth || 1;\n const samples = width * height * depth;\n\n if (!options.samples) {\n options.samples = samples;\n }\n\n super(renderer, shaders, options);\n\n this.width = width;\n this.height = height;\n this.depth = depth;\n if (this.samples == null) {\n this.samples = samples;\n }\n\n this.build(options);\n }\n\n build(_options) {\n this.data = [];\n this.data.length = this.samples;\n\n this.filled = 0;\n this.pad = { x: 0, y: 0, z: 0 };\n return (this.streamer = this.generate(this.data));\n }\n\n dispose() {\n this.data = null;\n return super.dispose();\n }\n\n getFilled() {\n return this.filled;\n }\n\n setActive(i, j, k) {\n let ref;\n return (\n ([this.pad.x, this.pad.y, this.pad.z] = Array.from(\n (ref = [this.width - i, this.height - j, this.depth - k])\n )),\n ref\n );\n }\n\n read() {\n return this.data;\n }\n\n copy(data) {\n const n = Math.min(data.length, this.samples);\n const d = this.data;\n return __range__(0, n, false).map((i) => (d[i] = data[i]));\n }\n\n fill() {\n let j, k, l, repeat;\n const { callback } = this;\n if (typeof callback.reset === \"function\") {\n callback.reset();\n }\n\n const { emit, skip, count, done, reset } = this.streamer;\n reset();\n\n const n = this.width;\n const m = this.height;\n const padX = this.pad.x;\n const padY = this.pad.y;\n const limit = this.samples - this.pad.z * n * m;\n\n let i = (j = k = l = 0);\n if (padX > 0 || padY > 0) {\n while (!done() && l < limit) {\n l++;\n repeat = callback(emit, i, j, k);\n if (++i === n - padX) {\n skip(padX);\n i = 0;\n if (++j === m - padY) {\n skip(n * padY);\n j = 0;\n k++;\n }\n }\n if (repeat === false) {\n break;\n }\n }\n } else {\n while (!done() && l < limit) {\n l++;\n repeat = callback(emit, i, j, k);\n if (++i === n) {\n i = 0;\n if (++j === m) {\n j = 0;\n k++;\n }\n }\n if (repeat === false) {\n break;\n }\n }\n }\n\n this.filled = 1;\n return count();\n }\n}\n\nfunction __range__(left, right, inclusive) {\n let range = [];\n let ascending = left < right;\n let end = !inclusive ? right : ascending ? right + 1 : right - 1;\n for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {\n range.push(i);\n }\n return range;\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UData from \"../../util/data.js\";\nimport * as UGLSL from \"../../util/glsl.js\";\n\nimport { FloatType, UnsignedByteType } from \"three/src/constants.js\";\nimport { Memo } from \"./memo.js\";\nimport { MemoScreen } from \"../meshes/memoscreen.js\";\nimport { Renderable } from \"../renderable.js\";\nimport { Vector4 } from \"three/src/math/Vector4.js\";\n\n/*\n * Readback up to 4D array of up to 4D data from GL\n */\nexport class Readback extends Renderable {\n constructor(renderer, shaders, options) {\n super(renderer, shaders);\n\n if (this.items == null) {\n this.items = options.items || 1;\n }\n if (this.channels == null) {\n this.channels = options.channels || 4;\n }\n if (this.width == null) {\n this.width = options.width || 1;\n }\n if (this.height == null) {\n this.height = options.height || 1;\n }\n if (this.depth == null) {\n this.depth = options.depth || 1;\n }\n if (this.type == null) {\n this.type = options.type || FloatType;\n }\n if (this.stpq == null) {\n this.stpq = options.stpq || false;\n }\n this.isFloat = this.type === FloatType;\n\n this.active = this.sampled = this.rect = this.pad = null;\n\n this.build(options);\n\n /*\n * log precision\n gl = @gl\n for name, pass of {Vertex: gl.VERTEX_SHADER, Fragment: gl.FRAGMENT_SHADER}\n bits = for prec in [gl.LOW_FLOAT, gl.MEDIUM_FLOAT, gl.HIGH_FLOAT]\n gl.getShaderPrecisionFormat(pass, prec).precision\n console.log name, 'shader precision', bits\n */\n }\n\n build(options) {\n let channels, encoder, stretch;\n const { map } = options;\n const { indexer } = options;\n const isIndexed = indexer != null && !indexer.empty();\n\n let { items, width, height, depth, stpq } = this;\n\n let sampler = map;\n if (isIndexed) {\n // Preserve original xyzw offset of datapoint to tie it back to the source\n\n // Modulus to pack xyzw into a single integer index\n this._adopt({\n indexModulus: {\n type: \"v4\",\n value: new Vector4(items, items * width, items * width * height, 1),\n },\n });\n\n // Build shader to pack XYZ + index into a single RGBA\n sampler = this.shaders.shader();\n sampler.require(map);\n sampler.require(indexer);\n //sampler.require UGLSL.identity 'vec4'\n sampler.pipe(\"float.index.pack\", this.uniforms);\n }\n\n if (this.isFloat && this.channels > 1) {\n // Memoize multi-channel float data into float buffer first\n this.floatMemo = new Memo(this.renderer, this.shaders, {\n items,\n channels: 4, // non-RGBA render target not supported\n width,\n height,\n depth,\n history: 0,\n type: FloatType,\n });\n\n this.floatCompose = new MemoScreen(this.renderer, this.shaders, {\n map: sampler,\n items,\n width,\n height,\n depth,\n stpq,\n });\n\n this.floatMemo.adopt(this.floatCompose);\n\n // Second pass won't need texture coordinates\n stpq = false;\n\n // Replace sampler with memoized sampler\n sampler = this.shaders.shader();\n this.floatMemo.shaderAbsolute(sampler);\n }\n\n if (this.isFloat) {\n // Encode float data into byte buffer\n stretch = this.channels;\n channels = 4; // one 32-bit float per pixel\n } else {\n // Render byte data directly\n stretch = 1;\n channels = this.channels;\n }\n\n if (stretch > 1) {\n // Stretch horizontally, sampling once per channel\n encoder = this.shaders.shader();\n encoder.pipe(UGLSL.mapByte2FloatOffset(stretch));\n encoder.require(sampler);\n encoder.pipe(\"float.stretch\");\n encoder.pipe(\"float.encode\");\n sampler = encoder;\n } else if (this.isFloat) {\n // Direct sampling\n encoder = this.shaders.shader();\n encoder.pipe(sampler);\n encoder.pipe(UGLSL.truncateVec(4, 1));\n encoder.pipe(\"float.encode\");\n sampler = encoder;\n }\n\n // Memoize byte data\n this.byteMemo = new Memo(this.renderer, this.shaders, {\n items: items * stretch,\n channels: channels, // non-RGBA render target not supported\n width,\n height,\n depth,\n history: 0,\n type: UnsignedByteType,\n });\n\n this.byteCompose = new MemoScreen(this.renderer, this.shaders, {\n map: sampler,\n items: items * stretch,\n width,\n height,\n depth,\n stpq,\n });\n\n this.byteMemo.adopt(this.byteCompose);\n\n // CPU-side buffers\n const w = items * width * stretch;\n const h = height * depth;\n\n this.samples = this.width * this.height * this.depth;\n\n this.bytes = new Uint8Array(w * h * 4); // non-RGBA render target not supported\n if (this.isFloat) {\n this.floats = new Float32Array(this.bytes.buffer);\n }\n this.data = this.isFloat ? this.floats : this.bytes;\n this.streamer = this.generate(this.data);\n\n this.active = { items: 0, width: 0, height: 0, depth: 0 };\n this.sampled = { items: 0, width: 0, height: 0, depth: 0 };\n this.rect = { w: 0, h: 0 };\n this.pad = { x: 0, y: 0, z: 0, w: 0 };\n\n this.stretch = stretch;\n this.isIndexed = isIndexed;\n\n return this.setActive(items, width, height, depth);\n }\n\n generate(data) {\n return UData.getStreamer(data, this.samples, 4, this.items);\n } // non-RGBA render target not supported\n\n setActive(items, width, height, depth) {\n let ref;\n if (\n items === this.active.items &&\n width === this.active.width &&\n height === this.active.height &&\n depth === this.active.depth\n ) {\n return;\n }\n\n // Actively sampled area\n [\n this.active.items,\n this.active.width,\n this.active.height,\n this.active.depth,\n ] = Array.from([items, width, height, depth]);\n\n // Render only necessary samples in RTTs\n if (this.floatCompose != null) {\n this.floatCompose.cover(width, height, depth);\n }\n if (this.byteCompose != null) {\n this.byteCompose.cover(width * this.stretch, height, depth);\n }\n\n // Calculate readback buffer geometry\n ({ items } = this);\n ({ width } = this.active);\n height = this.depth === 1 ? this.active.height : this.height;\n ({ depth } = this.active);\n const w = items * width * this.stretch;\n const h = height * depth;\n\n // Calculate array paddings on readback\n [\n this.sampled.items,\n this.sampled.width,\n this.sampled.height,\n this.sampled.depth,\n ] = Array.from([items, width, height, depth]);\n [this.rect.w, this.rect.h] = Array.from([w, h]);\n return (\n ([this.pad.x, this.pad.y, this.pad.z, this.pad.w] = Array.from(\n (ref = [\n this.sampled.width - this.active.width,\n this.sampled.height - this.active.height,\n this.sampled.depth - this.active.depth,\n this.sampled.items - this.active.items,\n ])\n )),\n ref\n );\n }\n\n update(camera) {\n if (this.floatMemo != null) {\n this.floatMemo.render(camera);\n }\n return this.byteMemo != null ? this.byteMemo.render(camera) : undefined;\n }\n\n post() {\n const currentTarget = this.renderer.getRenderTarget();\n this.renderer.setRenderTarget(this.byteMemo.target.write);\n this.gl.readPixels(\n 0,\n 0,\n this.rect.w,\n this.rect.h,\n this.gl.RGBA,\n this.gl.UNSIGNED_BYTE,\n this.bytes\n );\n this.renderer.setRenderTarget(currentTarget);\n }\n\n readFloat(n) {\n return this.floatMemo != null ? this.floatMemo.read(n) : undefined;\n }\n readByte(n) {\n return this.byteMemo != null ? this.byteMemo.read(n) : undefined;\n }\n\n setCallback(callback) {\n this.emitter = this.callback(callback);\n }\n\n callback(callback) {\n if (!this.isIndexed) {\n return callback;\n }\n\n const n = this.width;\n const m = this.height;\n const p = this.items;\n\n // Decode packed index\n const f = function (x, y, z, w) {\n let idx = w;\n const ll = idx % p;\n idx = (idx - ll) / p;\n const ii = idx % n;\n idx = (idx - ii) / n;\n const jj = idx % m;\n idx = (idx - jj) / m;\n const kk = idx;\n\n return callback(x, y, z, w, ii, jj, kk, ll);\n };\n\n f.reset = () =>\n typeof callback.reset === \"function\" ? callback.reset() : undefined;\n return f;\n }\n\n iterate() {\n let j, k, l;\n let emit = this.emitter;\n if (typeof emit.reset === \"function\") {\n emit.reset();\n }\n\n const { consume, skip, count, done, reset } = this.streamer;\n reset();\n\n const n = this.sampled.width | 0;\n let m = this.sampled.height | 0;\n const o = this.sampled.depth | 0;\n const p = this.sampled.items | 0;\n const padX = this.pad.x | 0;\n const padY = this.pad.y | 0;\n const padZ = this.pad.z | 0;\n const padW = this.pad.w | 0;\n const limit = n * m * p * (o - padZ);\n\n if (!this.isIndexed) {\n const callback = emit;\n emit = (x, y, z, w) => callback(x, y, z, w, i, j, k, l);\n }\n\n var i = (j = k = l = m = 0);\n while (!done() && m < limit) {\n m++;\n const repeat = consume(emit);\n if (++l === p - padW) {\n skip(padX);\n l = 0;\n if (++i === n - padX) {\n skip(p * padX);\n i = 0;\n if (++j === m - padY) {\n skip(p * n * padY);\n j = 0;\n k++;\n }\n }\n }\n if (repeat === false) {\n break;\n }\n }\n\n return Math.floor(count() / p);\n }\n\n dispose() {\n if (this.floatMemo != null) {\n this.floatMemo.unadopt(this.floatCompose);\n }\n if (this.floatMemo != null) {\n this.floatMemo.dispose();\n }\n if (this.floatCompose != null) {\n this.floatCompose.dispose();\n }\n\n if (this.byteMemo != null) {\n this.byteMemo.unadopt(this.byteCompose);\n }\n if (this.byteMemo != null) {\n this.byteMemo.dispose();\n }\n if (this.byteCompose != null) {\n this.byteCompose.dispose();\n }\n\n return (this.floatMemo =\n this.byteMemo =\n this.floatCompose =\n this.byteCompose =\n null);\n }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { Base } from \"./base.js\";\nimport { DoubleSide } from \"three/src/constants.js\";\nimport { Mesh } from \"three/src/objects/Mesh.js\";\nimport { SpriteGeometry } from \"../geometry/spritegeometry.js\";\n\nexport class Sprite extends Base {\n constructor(renderer, shaders, options) {\n let f;\n super(renderer, shaders, options);\n\n let {\n uniforms,\n material,\n position,\n sprite,\n map,\n combine,\n linear,\n color,\n mask,\n stpq,\n } = options;\n if (uniforms == null) {\n uniforms = {};\n }\n\n const hasStyle = uniforms.styleColor != null;\n\n this.geometry = new SpriteGeometry({\n items: options.items,\n width: options.width,\n height: options.height,\n depth: options.depth,\n });\n\n this._adopt(uniforms);\n this._adopt(this.geometry.uniforms);\n\n // Shared vertex shader\n const factory = shaders.material();\n const v = factory.vertex;\n\n v.pipe(this._vertexColor(color, mask));\n\n v.require(this._vertexPosition(position, material, map, 2, stpq));\n v.require(sprite);\n v.pipe(\"sprite.position\", this.uniforms);\n v.pipe(\"project.position\", this.uniforms);\n\n // Shared fragment shader\n factory.fragment = f = this._fragmentColor(\n hasStyle,\n material,\n color,\n mask,\n map,\n 2,\n stpq,\n combine,\n linear\n );\n\n // Split fragment into edge and fill pass for better z layering\n const edgeFactory = shaders.material();\n edgeFactory.vertex.pipe(v);\n edgeFactory.fragment.pipe(f);\n edgeFactory.fragment.pipe(\"fragment.transparent\", this.uniforms);\n\n const fillFactory = shaders.material();\n fillFactory.vertex.pipe(v);\n fillFactory.fragment.pipe(f);\n fillFactory.fragment.pipe(\"fragment.solid\", this.uniforms);\n\n const fillOpts = fillFactory.link({\n side: DoubleSide,\n });\n this.fillMaterial = this._material(fillOpts);\n\n const edgeOpts = edgeFactory.link({\n side: DoubleSide,\n });\n this.edgeMaterial = this._material(edgeOpts);\n\n this.fillObject = new Mesh(this.geometry, this.fillMaterial);\n this.edgeObject = new Mesh(this.geometry, this.edgeMaterial);\n\n this._raw(this.fillObject);\n this.fillObject.userData = fillOpts;\n\n this._raw(this.edgeObject);\n this.edgeObject.userData = edgeOpts;\n\n this.renders = [this.fillObject, this.edgeObject];\n }\n\n show(transparent, blending, order, depth) {\n this._show(this.edgeObject, true, blending, order, depth);\n return this._show(this.fillObject, transparent, blending, order, depth);\n }\n\n dispose() {\n this.geometry.dispose();\n this.edgeMaterial.dispose();\n this.fillMaterial.dispose();\n this.nreders =\n this.geometry =\n this.edgeMaterial =\n this.fillMaterial =\n this.edgeObject =\n this.fillObject =\n null;\n return super.dispose();\n }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS202: Simplify dynamic range loops\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { BufferAttribute } from \"three/src/core/BufferAttribute.js\";\nimport { ClipGeometry } from \"./clipgeometry.js\";\n\n/*\nTriangle strips arranged in items, columns and rows\n\n+--+--+--+ +--+--+--+ +--+--+--+ +--+--+--+\n| /| /| / | /| /| / | /| /| / | /| /| /\n+--+--+/ +--+--+/ +--+--+/ +--+--+/\n\n+--+--+--+ +--+--+--+ +--+--+--+ +--+--+--+\n| /| /| / | /| /| / | /| /| / | /| /| /\n+--+--+/ +--+--+/ +--+--+/ +--+--+/\n\n+--+--+--+ +--+--+--+ +--+--+--+ +--+--+--+\n| /| /| / | /| /| / | /| /| / | /| /| /\n+--+--+/ +--+--+/ +--+--+/ +--+--+/\n\n*/\n\nexport class StripGeometry extends ClipGeometry {\n constructor(options) {\n let depth, height, items, sides, width;\n super(options);\n\n this._clipUniforms();\n\n this.items = items = +options.items || 2;\n this.width = width = +options.width || 1;\n this.height = height = +options.height || 1;\n this.depth = depth = +options.depth || 1;\n this.sides = sides = Math.max(0, items - 2);\n\n const samples = width * height * depth;\n const points = items * samples;\n const triangles = sides * samples;\n\n this.setIndex(new BufferAttribute(new Uint32Array(triangles * 3), 1));\n\n this.setAttribute(\n \"position4\",\n new BufferAttribute(new Float32Array(points * 4), 4)\n );\n this.setAttribute(\n \"strip\",\n new BufferAttribute(new Float32Array(points * 3), 3)\n );\n\n const index = this._emitter(\"index\");\n const position = this._emitter(\"position4\");\n const strip = this._emitter(\"strip\");\n\n let base = 0;\n for (\n let i = 0, end = samples, asc = 0 <= end;\n asc ? i < end : i > end;\n asc ? i++ : i--\n ) {\n let o = base;\n for (\n let j = 0, end1 = sides, asc1 = 0 <= end1;\n asc1 ? j < end1 : j > end1;\n asc1 ? j++ : j--\n ) {\n if (j & 1) {\n index(o + 1);\n index(o);\n index(o + 2);\n } else {\n index(o);\n index(o + 1);\n index(o + 2);\n }\n o++;\n }\n base += items;\n }\n\n const last = items - 1;\n for (\n let z = 0, end2 = depth, asc2 = 0 <= end2;\n asc2 ? z < end2 : z > end2;\n asc2 ? z++ : z--\n ) {\n for (\n let y = 0, end3 = height, asc3 = 0 <= end3;\n asc3 ? y < end3 : y > end3;\n asc3 ? y++ : y--\n ) {\n for (\n let x = 0, end4 = width, asc4 = 0 <= end4;\n asc4 ? x < end4 : x > end4;\n asc4 ? x++ : x--\n ) {\n let f = 1;\n\n position(x, y, z, 0);\n strip(1, 2, f);\n\n for (\n let l = 1, end5 = last, asc5 = 1 <= end5;\n asc5 ? l < end5 : l > end5;\n asc5 ? l++ : l--\n ) {\n position(x, y, z, l);\n strip(l - 1, l + 1, (f = -f));\n }\n\n position(x, y, z, last);\n strip(last - 2, last - 1, -f);\n }\n }\n }\n\n this._finalize();\n this.clip();\n }\n\n clip(width, height, depth, items) {\n if (width == null) {\n ({ width } = this);\n }\n if (height == null) {\n ({ height } = this);\n }\n if (depth == null) {\n ({ depth } = this);\n }\n if (items == null) {\n ({ items } = this);\n }\n const sides = Math.max(0, items - 2);\n\n this._clipGeometry(width, height, depth, items);\n return this._clipOffsets(\n 3,\n width,\n height,\n depth,\n sides,\n this.width,\n this.height,\n this.depth,\n this.sides\n );\n }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { Base } from \"./base.js\";\nimport { DoubleSide } from \"three/src/constants.js\";\nimport { Mesh } from \"three/src/objects/Mesh.js\";\nimport { StripGeometry } from \"../geometry/stripgeometry.js\";\n\nexport class Strip extends Base {\n constructor(renderer, shaders, options) {\n let f;\n super(renderer, shaders, options);\n\n let {\n uniforms,\n material,\n position,\n color,\n mask,\n map,\n combine,\n linear,\n stpq,\n } = options;\n\n if (uniforms == null) {\n uniforms = {};\n }\n if (material == null) {\n material = true;\n }\n\n const hasStyle = uniforms.styleColor != null;\n\n this.geometry = new StripGeometry({\n items: options.items,\n width: options.width,\n height: options.height,\n depth: options.depth,\n });\n\n this._adopt(uniforms);\n this._adopt(this.geometry.uniforms);\n\n const factory = shaders.material();\n\n const v = factory.vertex;\n\n v.pipe(this._vertexColor(color, mask));\n\n v.require(this._vertexPosition(position, material, map, 2, stpq));\n if (!material) {\n v.pipe(\"mesh.position\", this.uniforms);\n }\n if (material) {\n v.pipe(\"strip.position.normal\", this.uniforms);\n }\n v.pipe(\"project.position\", this.uniforms);\n\n factory.fragment = f = this._fragmentColor(\n hasStyle,\n material,\n color,\n mask,\n map,\n 2,\n stpq,\n combine,\n linear\n );\n\n f.pipe(\"fragment.color\", this.uniforms);\n\n const opts = factory.link({\n side: DoubleSide,\n });\n this.material = this._material(opts);\n\n const object = new Mesh(this.geometry, this.material);\n object.userData = opts;\n\n this._raw(object);\n this.renders = [object];\n }\n\n dispose() {\n this.geometry.dispose();\n this.material.dispose();\n this.renders = this.geometry = this.material = null;\n return super.dispose();\n }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { Base } from \"./base.js\";\nimport { DoubleSide } from \"three/src/constants.js\";\nimport { Mesh } from \"three/src/objects/Mesh.js\";\nimport { SurfaceGeometry } from \"../geometry/surfacegeometry.js\";\n\nexport class Surface extends Base {\n constructor(renderer, shaders, options) {\n let defs, f;\n super(renderer, shaders, options);\n\n let {\n uniforms,\n material,\n position,\n color,\n mask,\n map,\n combine,\n linear,\n stpq,\n intUV,\n } = options;\n\n if (uniforms == null) {\n uniforms = {};\n }\n if (material == null) {\n material = true;\n }\n\n const hasStyle = uniforms.styleColor != null;\n\n this.geometry = new SurfaceGeometry({\n width: options.width,\n height: options.height,\n surfaces: options.surfaces,\n layers: options.layers,\n closedX: options.closedX,\n closedY: options.closedY,\n });\n\n this._adopt(uniforms);\n this._adopt(this.geometry.uniforms);\n\n const factory = shaders.material();\n\n const v = factory.vertex;\n\n if (intUV) {\n defs = { POSITION_UV_INT: \"\" };\n }\n\n v.pipe(this._vertexColor(color, mask));\n\n v.require(this._vertexPosition(position, material, map, 2, stpq));\n if (!material) {\n v.pipe(\"surface.position\", this.uniforms, defs);\n }\n if (material) {\n v.pipe(\"surface.position.normal\", this.uniforms, defs);\n }\n v.pipe(\"project.position\", this.uniforms);\n\n factory.fragment = f = this._fragmentColor(\n hasStyle,\n material,\n color,\n mask,\n map,\n 2,\n stpq,\n combine,\n linear\n );\n\n f.pipe(\"fragment.color\", this.uniforms);\n\n const opts = factory.link({\n side: DoubleSide,\n });\n this.material = this._material(opts);\n\n const object = new Mesh(this.geometry, this.material);\n object.userData = opts;\n\n this._raw(object);\n this.renders = [object];\n }\n\n dispose() {\n this.geometry.dispose();\n this.material.dispose();\n this.renders = this.geometry = this.material = null;\n return super.dispose();\n }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS202: Simplify dynamic range loops\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { Atlas } from \"./atlas.js\";\nimport { UnsignedByteType } from \"three/src/constants.js\";\n\nconst SCRATCH_SIZE = 512 / 16;\n\n/*\n * Dynamic text atlas\n * - Stores entire strings as sprites\n * - Renders alpha mask (fast) or signed distance field (slow)\n * - Emits (x,y,width,height) pointers into the atlas\n */\nexport class TextAtlas extends Atlas {\n constructor(renderer, shaders, options) {\n let left;\n if (!options.width) {\n options.width = 256;\n }\n if (!options.height) {\n options.height = 256;\n }\n options.type = UnsignedByteType;\n options.channels = 1;\n options.backed = true;\n\n super(renderer, shaders, options, false);\n\n this.font = options.font != null ? options.font : [\"sans-serif\"];\n this.size = options.size || 24;\n this.style = options.style != null ? options.style : \"normal\";\n this.variant = options.variant != null ? options.variant : \"normal\";\n this.weight = options.weight != null ? options.weight : \"normal\";\n this.outline =\n (left = +(options.outline != null ? options.outline : 5)) != null\n ? left\n : 0;\n this.gamma = 1;\n\n if (typeof navigator !== \"undefined\") {\n const ua = navigator.userAgent;\n if (ua.match(/Chrome/) && ua.match(/OS X/)) {\n this.gamma = 0.5;\n }\n }\n\n this.scratchW = this.scratchH = 0;\n\n this.build(options);\n }\n\n build(options) {\n super.build(options);\n\n // Prepare line-height with room for outline\n let lineHeight = 16;\n lineHeight = this.size;\n lineHeight += 4 + 2 * Math.min(1, this.outline);\n const maxWidth = SCRATCH_SIZE * lineHeight;\n\n // Prepare scratch canvas\n const canvas = document.createElement(\"canvas\");\n canvas.width = maxWidth;\n canvas.height = lineHeight;\n\n const quote = (str) => `${str.replace(/(['\"\\\\])/g, \"\\\\$1\")}`;\n const font = this.font.map(quote).join(\", \");\n\n const context = canvas.getContext(\"2d\");\n context.font = `${this.style} ${this.variant} ${this.weight} ${this.size}px ${font}`;\n context.fillStyle = \"#FF0000\";\n context.textAlign = \"left\";\n context.textBaseline = \"bottom\";\n context.lineJoin = \"round\";\n\n // debug: show scratch canvas\n /*\n document.body.appendChild canvas\n canvas.setAttribute('style', \"position: absolute; top: 0; left: 0; z-index: 100; border: 1px solid red; background: rgba(255,0,255,.25);\")\n */\n\n // Cache hex colors for distance field rendering\n const colors = [];\n const dilate = this.outline * 3;\n for (\n let i = 0, end = dilate, asc = 0 <= end;\n asc ? i < end : i > end;\n asc ? i++ : i--\n ) {\n // 8 rgb levels = 1 step = .5 pixel increase\n const hex = (\n \"00\" + Math.max(0, -i * 8 + 128 - !i * 8).toString(16)\n ).slice(-2);\n colors.push(\"#\" + hex + hex + hex);\n }\n\n const scratch = new Uint8Array(maxWidth * lineHeight * 2);\n\n this.canvas = canvas;\n this.context = context;\n this.lineHeight = lineHeight;\n this.maxWidth = maxWidth;\n this.colors = colors;\n this.scratch = scratch;\n\n this._allocate = this.allocate.bind(this);\n return (this._write = this.write.bind(this));\n }\n\n reset() {\n super.reset();\n return (this.mapped = {});\n }\n\n begin() {\n return Array.from(this.rows).map((row) => (row.alive = 0));\n }\n\n end() {\n const { mapped } = this;\n for (let row of Array.from(this.rows.slice())) {\n if (row.alive === 0) {\n for (let key of Array.from(row.keys)) {\n delete mapped[key];\n }\n this.collapse(row);\n }\n }\n }\n\n map(text, emit) {\n // See if already mapped into atlas\n const { mapped } = this;\n const c = mapped[text];\n if (c != null) {\n c.row.alive++;\n return emit(c.x, c.y, c.w, c.h);\n }\n\n // Draw text (don't recurse stack in @draw so it can be optimized cleanly)\n this.draw(text);\n const data = this.scratch;\n const w = this.scratchW;\n const h = this.scratchH;\n\n // Allocate and write into atlas\n const allocate = this._allocate;\n const write = this._write;\n return allocate(text, w, h, function (row, x, y) {\n mapped[text] = { x, y, w, h, row };\n write(data, x, y, w, h);\n return emit(x, y, w, h);\n });\n }\n\n draw(text) {\n let data, i, imageData, j;\n let w = this.width;\n const h = this.lineHeight;\n const o = this.outline;\n const ctx = this.context;\n const dst = this.scratch;\n const max = this.maxWidth;\n const { colors } = this;\n\n // Bottom aligned\n const x = o + 1;\n const y = Math.round(h * 1.05 - 1);\n\n // Measure text\n const m = ctx.measureText(text);\n w = Math.min(max, Math.ceil(m.width + 2 * x + 1));\n\n // Clear scratch area\n ctx.clearRect(0, 0, w, h);\n\n if (this.outline === 0) {\n // Alpha sprite (fast)\n let asc, end;\n ctx.fillText(text, x, y);\n ({ data } = imageData = ctx.getImageData(0, 0, w, h));\n j = 3; // Skip to alpha channel\n for (\n i = 0, end = data.length / 4, asc = 0 <= end;\n asc ? i < end : i > end;\n asc ? i++ : i--\n ) {\n //dst[i] = 255 * (i%2); # test pattern to check pixel perfect alignment\n dst[i] = data[j];\n j += 4;\n }\n\n this.scratchW = w;\n return (this.scratchH = h);\n } else {\n // Signed distance field sprite (approximation) (slow)\n\n // Draw strokes of decreasing width to create nested outlines (absolute distance)\n let asc1, start;\n let asc2, end1;\n ctx.globalCompositeOperation = \"source-over\";\n for (\n start = o + 1, i = start, asc1 = start <= 1;\n asc1 ? i <= 1 : i >= 1;\n asc1 ? i++ : i--\n ) {\n j = i > 1 ? i * 2 - 2 : i; // Eliminate odd strokes once past > 1px, don't need the detail\n ctx.strokeStyle = colors[j - 1];\n ctx.lineWidth = j;\n ctx.strokeText(text, x, y);\n }\n //console.log 'stroke', j, j+.5, colors[j]\n\n // Fill center with multiply blend #FF0000 to mark inside/outside\n ctx.globalCompositeOperation = \"multiply\";\n ctx.fillText(text, x, y);\n\n // Pull image data\n ({ data } = imageData = ctx.getImageData(0, 0, w, h));\n j = 0;\n const { gamma } = this;\n\n for (\n i = 0, end1 = data.length / 4, asc2 = 0 <= end1;\n asc2 ? i < end1 : i > end1;\n asc2 ? i++ : i--\n ) {\n // Get value + mask\n const a = data[j];\n let mask = a ? data[j + 1] / a : 1;\n if (gamma === 0.5) {\n mask = Math.sqrt(mask);\n }\n mask = Math.min(1, Math.max(0, mask));\n\n // Blend between positive/outside and negative/inside\n const b = 256 - a;\n const c = b + (a - b) * mask;\n\n // Clamp\n // (slight expansion to hide errors around the transition)\n dst[i] = Math.max(0, Math.min(255, c + 2));\n j += 4;\n }\n\n // Debug: copy back into canvas\n //\n // TODO hide behind debug flag or delete.\n /*\n j = 0\n for i in [0...data.length / 4]\n v = dst[i]\n *data[j] = v\n *data[j+1] = v\n data[j+2] = v\n data[j+3] = 255\n j += 4\n ctx.putImageData(imageData, 0, 0);\n */\n\n this.scratchW = w;\n return (this.scratchH = h);\n }\n }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UData from \"../../util/data.js\";\nimport { DataBuffer } from \"./databuffer.js\";\n\n//\n// 3D array\n//\nexport class VoxelBuffer extends DataBuffer {\n build(_options) {\n super.build();\n this.pad = { x: 0, y: 0, z: 0 };\n return (this.streamer = this.generate(this.data));\n }\n\n setActive(i, j, k) {\n let ref;\n return (\n ([this.pad.x, this.pad.y, this.pad.z] = Array.from(\n (ref = [\n Math.max(0, this.width - i),\n Math.max(0, this.height - j),\n Math.max(0, this.depth - k),\n ])\n )),\n ref\n );\n }\n\n fill() {\n let j, k, l, repeat;\n const { callback } = this;\n if (typeof callback.reset === \"function\") {\n callback.reset();\n }\n\n const { emit, skip, count, done, reset } = this.streamer;\n reset();\n\n const n = this.width;\n const m = this.height;\n const padX = this.pad.x;\n const padY = this.pad.y;\n const limit = this.samples - this.pad.z * n * m;\n\n let i = (j = k = l = 0);\n if (padX > 0 || padY > 0) {\n while (!done() && l < limit) {\n l++;\n repeat = callback(emit, i, j, k);\n if (++i === n - padX) {\n skip(padX);\n i = 0;\n if (++j === m - padY) {\n skip(n * padY);\n j = 0;\n k++;\n }\n }\n if (repeat === false) {\n break;\n }\n }\n } else {\n while (!done() && l < limit) {\n l++;\n repeat = callback(emit, i, j, k);\n if (++i === n) {\n i = 0;\n if (++j === m) {\n j = 0;\n k++;\n }\n }\n if (repeat === false) {\n break;\n }\n }\n }\n\n return Math.floor(count() / this.items);\n }\n\n through(callback, target) {\n // must be identical sized buffers w/ identical active areas\n\n let dst, j, k, src;\n const { consume, done, skip } = (src = this.streamer);\n const { emit } = (dst = target.streamer);\n\n let i = (j = k = 0);\n\n let pipe = () =>\n consume((x, y, z, w) => callback(emit, x, y, z, w, i, j, k));\n pipe = UData.repeatCall(pipe, this.items);\n\n return () => {\n let l;\n src.reset();\n dst.reset();\n const n = this.width;\n const m = this.height;\n const padX = this.pad.x;\n const padY = this.pad.y;\n const limit = this.samples - this.pad.z * n * m;\n\n i = j = k = l = 0;\n if (padX > 0 || padY > 0) {\n while (!done() && l < limit) {\n l++;\n pipe();\n if (++i === n - padX) {\n skip(padX);\n i = 0;\n if (++j === m - padY) {\n skip(n * padY);\n j = 0;\n k++;\n }\n }\n }\n } else {\n while (!done() && l < limit) {\n l++;\n pipe();\n if (++i === n) {\n i = 0;\n if (++j === m) {\n j = 0;\n k++;\n }\n }\n }\n }\n\n return src.count();\n };\n }\n}\n","import { ArrayBuffer_ } from \"./buffer/arraybuffer.js\";\nimport { Arrow } from \"./meshes/arrow.js\";\nimport { Atlas } from \"./buffer/atlas.js\";\nimport { DataBuffer } from \"./buffer/databuffer.js\";\nimport { Debug } from \"./meshes/debug.js\";\nimport { Face } from \"./meshes/face.js\";\nimport { Line } from \"./meshes/line.js\";\nimport { MatrixBuffer } from \"./buffer/matrixbuffer.js\";\nimport { Memo } from \"./buffer/memo.js\";\nimport { MemoScreen } from \"./meshes/memoscreen.js\";\nimport { Point } from \"./meshes/point.js\";\nimport { PushBuffer } from \"./buffer/pushbuffer.js\";\nimport { Readback } from \"./buffer/readback.js\";\nimport { RenderToTexture } from \"./buffer/rendertotexture.js\";\nimport { Scene } from \"./scene.js\";\nimport { Screen } from \"./meshes/screen.js\";\nimport { Sprite } from \"./meshes/sprite.js\";\nimport { Strip } from \"./meshes/strip.js\";\nimport { Surface } from \"./meshes/surface.js\";\nimport { TextAtlas } from \"./buffer/textatlas.js\";\nimport { VoxelBuffer } from \"./buffer/voxelbuffer.js\";\n\nexport const Classes = {\n sprite: Sprite,\n point: Point,\n line: Line,\n surface: Surface,\n face: Face,\n strip: Strip,\n arrow: Arrow,\n screen: Screen,\n memoScreen: MemoScreen,\n debug: Debug,\n dataBuffer: DataBuffer,\n arrayBuffer: ArrayBuffer_,\n matrixBuffer: MatrixBuffer,\n voxelBuffer: VoxelBuffer,\n pushBuffer: PushBuffer,\n renderToTexture: RenderToTexture,\n memo: Memo,\n readback: Readback,\n atlas: Atlas,\n textAtlas: TextAtlas,\n scene: Scene,\n};\n","export * from \"./scene.js\";\nexport { RenderFactory as Factory } from \"./factory.js\";\nexport * from \"./scene.js\";\nexport * from \"./classes.js\";\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n/*\n Graph of nodes with outlets\n*/\nexport class Graph {\n static initClass() {\n this.index = 0;\n\n this.IN = 0;\n this.OUT = 1;\n }\n // eslint-disable-next-line no-unused-vars\n static id(name) {\n return ++Graph.index;\n }\n\n constructor(nodes, parent = null) {\n this.parent = parent;\n this.id = Graph.id();\n this.nodes = [];\n nodes && this.add(nodes);\n }\n\n inputs() {\n const inputs = [];\n for (let node of Array.from(this.nodes)) {\n for (let outlet of Array.from(node.inputs)) {\n if (outlet.input === null) {\n inputs.push(outlet);\n }\n }\n }\n return inputs;\n }\n\n outputs() {\n const outputs = [];\n for (let node of Array.from(this.nodes)) {\n for (let outlet of Array.from(node.outputs)) {\n if (outlet.output.length === 0) {\n outputs.push(outlet);\n }\n }\n }\n return outputs;\n }\n\n getIn(name) {\n return Array.from(this.inputs()).filter(\n (outlet) => outlet.name === name\n )[0];\n }\n getOut(name) {\n return Array.from(this.outputs()).filter(\n (outlet) => outlet.name === name\n )[0];\n }\n\n add(node, ignore) {\n if (node.length) {\n for (let _node of Array.from(node)) {\n this.add(_node);\n }\n return;\n }\n\n if (node.graph && !ignore) {\n throw new Error(\"Adding node to two graphs at once\");\n }\n\n node.graph = this;\n this.nodes.push(node);\n }\n\n remove(node, ignore) {\n if (node.length) {\n for (let _node of Array.from(node)) {\n this.remove(_node);\n }\n return;\n }\n\n if (node.graph !== this) {\n throw new Error(\"Removing node from wrong graph.\");\n }\n\n ignore || node.disconnect();\n\n this.nodes.splice(this.nodes.indexOf(node), 1);\n node.graph = null;\n }\n\n adopt(node) {\n if (node.length) {\n for (let _node of Array.from(node)) {\n this.adopt(_node);\n }\n return;\n }\n\n node.graph.remove(node, true);\n this.add(node, true);\n }\n}\nGraph.initClass();\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Graph } from \"./graph\";\n\n/*\n In/out outlet on node\n*/\nexport class Outlet {\n static initClass() {\n this.index = 0;\n }\n static make(outlet, extra) {\n if (extra == null) {\n extra = {};\n }\n const meta = extra;\n if (outlet.meta != null) {\n for (let key in outlet.meta) {\n const value = outlet.meta[key];\n meta[key] = value;\n }\n }\n return new Outlet(\n outlet.inout,\n outlet.name,\n outlet.hint,\n outlet.type,\n meta\n );\n }\n static id(name) {\n return `_io_${++Outlet.index}_${name}`;\n }\n\n static hint(name) {\n name = name.replace(/^_io_[0-9]+_/, \"\");\n name = name.replace(/_i_o$/, \"\");\n return (name = name.replace(/(In|Out|Inout|InOut)$/, \"\"));\n }\n\n constructor(inout, name, hint, type, meta, id) {\n this.inout = inout;\n this.name = name;\n this.hint = hint;\n this.type = type;\n if (meta == null) {\n meta = {};\n }\n this.meta = meta;\n this.id = id;\n if (this.hint == null) {\n this.hint = Outlet.hint(this.name);\n }\n\n this.node = null;\n this.input = null;\n this.output = [];\n if (this.id == null) {\n this.id = Outlet.id(this.hint);\n }\n }\n\n // Change into given outlet without touching connections\n morph(outlet) {\n this.inout = outlet.inout;\n this.name = outlet.name;\n this.hint = outlet.hint;\n this.type = outlet.type;\n return (this.meta = outlet.meta);\n }\n\n // Copy with unique name and cloned metadata\n dupe(name) {\n if (name == null) {\n name = this.id;\n }\n const outlet = Outlet.make(this);\n outlet.name = name;\n return outlet;\n }\n\n // Connect to given outlet\n connect(outlet) {\n // Auto-reverse in/out to out/in\n if (this.inout === Graph.IN && outlet.inout === Graph.OUT) {\n return outlet.connect(this);\n }\n\n // Disallow bad combinations\n if (this.inout !== Graph.OUT || outlet.inout !== Graph.IN) {\n throw new Error(\"Can only connect out to in.\");\n }\n\n // Check for existing connection\n if (outlet.input === this) {\n return;\n }\n\n // Disconnect existing connections\n outlet.disconnect();\n\n // Add new connection.\n outlet.input = this;\n return this.output.push(outlet);\n }\n\n // Disconnect given outlet (or all)\n disconnect(outlet) {\n // Disconnect input from the other side.\n if (this.input) {\n this.input.disconnect(this);\n }\n\n if (this.output.length) {\n if (outlet) {\n // Remove one outgoing connection.\n const index = this.output.indexOf(outlet);\n if (index >= 0) {\n this.output.splice(index, 1);\n return (outlet.input = null);\n }\n } else {\n // Remove all outgoing connections.\n for (outlet of Array.from(this.output)) {\n outlet.input = null;\n }\n return (this.output = []);\n }\n }\n }\n}\nOutlet.initClass();\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Graph } from \"./graph\";\nimport { Outlet } from \"./outlet\";\n\n/*\n Node in graph.\n*/\nexport class Node {\n static initClass() {\n this.index = 0;\n }\n static id(_name) {\n return ++Node.index;\n }\n\n constructor(owner, outlets) {\n this.owner = owner;\n this.graph = null;\n this.inputs = [];\n this.outputs = [];\n this.all = [];\n this.outlets = null;\n this.id = Node.id();\n\n this.setOutlets(outlets);\n }\n\n // Retrieve input\n getIn(name) {\n return Array.from(this.inputs).filter((outlet) => outlet.name === name)[0];\n }\n\n // Retrieve output\n getOut(name) {\n return Array.from(this.outputs).filter((outlet) => outlet.name === name)[0];\n }\n\n // Retrieve by name\n get(name) {\n return this.getIn(name) || this.getOut(name);\n }\n\n // Set new outlet definition\n setOutlets(outlets) {\n if (outlets != null) {\n // First init\n let outlet;\n if (this.outlets == null) {\n this.outlets = {};\n for (outlet of Array.from(outlets)) {\n if (!(outlet instanceof Outlet)) {\n outlet = Outlet.make(outlet);\n }\n this._add(outlet);\n }\n return;\n }\n\n // Return new/old outlet matching hash key\n const hash = (\n outlet // Match by name, direction and type.\n ) => [outlet.name, outlet.inout, outlet.type].join(\"-\");\n\n // Build hash of new outlets\n const match = {};\n for (outlet of Array.from(outlets)) {\n match[hash(outlet)] = true;\n }\n\n // Remove missing outlets, record matches\n for (let key in this.outlets) {\n outlet = this.outlets[key];\n key = hash(outlet);\n if (match[key]) {\n match[key] = outlet;\n } else {\n this._remove(outlet);\n }\n }\n\n // Insert new outlets\n for (outlet of Array.from(outlets)) {\n // Find match by hash\n const existing = match[hash(outlet)];\n if (existing instanceof Outlet) {\n // Update existing outlets in place to retain connections.\n this._morph(existing, outlet);\n } else {\n // Spawn new outlet\n if (!(outlet instanceof Outlet)) {\n outlet = Outlet.make(outlet);\n }\n this._add(outlet);\n }\n }\n\n this;\n }\n return this.outlets;\n }\n\n // Connect to the target node by matching up inputs and outputs.\n connect(node, empty, force) {\n let dest, dests, hint, source, type;\n const outlets = {};\n const hints = {};\n\n const typeHint = (outlet) => type + \"/\" + outlet.hint;\n\n // Hash the types/hints of available target outlets.\n for (dest of Array.from(node.inputs)) {\n // Only autoconnect if not already connected\n var list;\n if (!force && dest.input) {\n continue;\n }\n\n // Match outlets by type/name hint, then type/position key\n ({ type } = dest);\n hint = typeHint(dest);\n\n if (!hints[hint]) {\n hints[hint] = dest;\n }\n outlets[type] = list = outlets[type] || [];\n list.push(dest);\n }\n\n // Available source outlets\n let sources = this.outputs;\n\n // Ignore connected source if only matching empties.\n sources = sources.filter((outlet) => !(empty && outlet.output.length));\n\n // Match hints first\n for (source of Array.from(sources.slice())) {\n // Match outlets by type and name\n ({ type } = source);\n hint = typeHint(source);\n dests = outlets[type];\n\n // Connect if found\n if ((dest = hints[hint])) {\n source.connect(dest);\n\n // Remove from potential set\n delete hints[hint];\n dests.splice(dests.indexOf(dest), 1);\n sources.splice(sources.indexOf(source), 1);\n }\n }\n\n // Match what's left\n if (!sources.length) {\n return this;\n }\n for (source of Array.from(sources.slice())) {\n ({ type } = source);\n dests = outlets[type];\n\n // Match outlets by type and order\n if (dests && dests.length) {\n // Link up and remove from potential set\n source.connect(dests.shift());\n }\n }\n\n return this;\n }\n\n // Disconnect entire node\n disconnect(_node) {\n let outlet;\n for (outlet of Array.from(this.inputs)) {\n outlet.disconnect();\n }\n for (outlet of Array.from(this.outputs)) {\n outlet.disconnect();\n }\n\n return this;\n }\n\n // Return hash key for outlet\n _key(outlet) {\n return [outlet.name, outlet.inout].join(\"-\");\n }\n\n // Add outlet object to node\n _add(outlet) {\n const key = this._key(outlet);\n\n // Sanity checks\n if (outlet.node) {\n throw new Error(\"Adding outlet to two nodes at once.\");\n }\n if (this.outlets[key]) {\n throw new Error(`Adding two identical outlets to same node. (${key})`);\n }\n\n // Link back outlet\n outlet.node = this;\n\n // Add to name hash and inout list\n if (outlet.inout === Graph.IN) {\n this.inputs.push(outlet);\n }\n if (outlet.inout === Graph.OUT) {\n this.outputs.push(outlet);\n }\n this.all.push(outlet);\n return (this.outlets[key] = outlet);\n }\n\n // Morph outlet to other\n _morph(existing, outlet) {\n let key = this._key(outlet);\n delete this.outlets[key];\n\n existing.morph(outlet);\n\n key = this._key(outlet);\n return (this.outlets[key] = outlet);\n }\n\n // Remove outlet object from node.\n _remove(outlet) {\n const key = this._key(outlet);\n\n // Sanity checks\n if (outlet.node !== this) {\n throw new Error(\"Removing outlet from wrong node.\");\n }\n\n // Disconnect outlet.\n outlet.disconnect();\n\n // Unlink outlet.\n outlet.node = null;\n\n // Remove from name list and inout list.\n delete this.outlets[key];\n if (outlet.inout === Graph.IN) {\n this.inputs.splice(this.inputs.indexOf(outlet), 1);\n }\n if (outlet.inout === Graph.OUT) {\n this.outputs.splice(this.outputs.indexOf(outlet), 1);\n }\n this.all.splice(this.all.indexOf(outlet), 1);\n return this;\n }\n}\nNode.initClass();\n","import { Graph } from \"./graph\";\nexport const { IN, OUT } = Graph;\n\nexport * from \"./graph\";\nexport * from \"./node\";\nexport * from \"./outlet\";\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nexport class Snippet {\n static initClass() {\n this.index = 0;\n }\n static namespace() {\n return `_sn_${++Snippet.index}_`;\n }\n\n static load(language, name, code) {\n const program = language.parse(name, code);\n const [sigs, compiler] = Array.from(language.compile(program));\n return new Snippet(language, sigs, compiler, name, code);\n }\n\n constructor(language, _signatures, _compiler, _name, _original) {\n this.language = language;\n this._signatures = _signatures;\n this._compiler = _compiler;\n this._name = _name;\n this._original = _original;\n this.namespace = null;\n this.code = null;\n\n this.main = null;\n this.entry = null;\n\n this.uniforms = null;\n this.externals = null;\n this.symbols = null;\n this.attributes = null;\n this.varyings = null;\n\n // Tidy up object for export\n if (!this.language) {\n delete this.language;\n }\n if (!this._signatures) {\n delete this._signatures;\n }\n if (!this._compiler) {\n delete this._compiler;\n }\n if (!this._original) {\n delete this._original;\n }\n\n // Insert snippet name if not provided\n if (!this._name) {\n this._name =\n this._signatures != null ? this._signatures.main.name : undefined;\n }\n }\n\n clone() {\n return new Snippet(\n this.language,\n this._signatures,\n this._compiler,\n this._name,\n this._original\n );\n }\n\n bind(config, uniforms, namespace, defines) {\n // Alt syntax (namespace, uniforms, defines)\n let def, left;\n let v;\n if (uniforms === \"\" + uniforms) {\n [namespace, uniforms, defines] = Array.from([\n uniforms,\n namespace != null ? namespace : {},\n defines != null ? defines : {},\n ]);\n // Alt syntax (uniforms, defines)\n } else if (namespace !== \"\" + namespace) {\n [defines, namespace] = Array.from([\n namespace != null ? namespace : {},\n undefined,\n ]);\n }\n\n // Prepare data structure\n this.main = this._signatures.main;\n this.namespace =\n (left = namespace != null ? namespace : this.namespace) != null\n ? left\n : Snippet.namespace();\n this.entry = this.namespace + this.main.name;\n\n this.uniforms = {};\n this.varyings = {};\n this.attributes = {};\n this.externals = {};\n this.symbols = [];\n const exist = {};\n const exceptions = {};\n\n // Handle globals and locals for prefixing\n const global = function (name) {\n exceptions[name] = true;\n return name;\n };\n const local = (name) => {\n return this.namespace + name;\n };\n\n // Apply config\n if (config.globals) {\n for (let key of Array.from(config.globals)) {\n global(key);\n }\n }\n const _u = config.globalUniforms ? global : local;\n const _v = config.globalVaryings ? global : local;\n const _a = config.globalAttributes ? global : local;\n const _e = local;\n\n // Build finalized properties\n const x = (def) => {\n return (exist[def.name] = true);\n };\n const u = (def, name) => {\n return (this.uniforms[_u(name != null ? name : def.name)] = def);\n };\n v = (def) => {\n return (this.varyings[_v(def.name)] = def);\n };\n const a = (def) => {\n return (this.attributes[_a(def.name)] = def);\n };\n const e = (def) => {\n const name = _e(def.name);\n this.externals[name] = def;\n return this.symbols.push(name);\n };\n\n const redef = (def) => ({\n type: def.type,\n name: def.name,\n value: def.value,\n });\n\n for (def of Array.from(this._signatures.uniform)) {\n x(def);\n }\n for (def of Array.from(this._signatures.uniform)) {\n u(redef(def));\n }\n for (def of Array.from(this._signatures.varying)) {\n v(redef(def));\n }\n for (def of Array.from(this._signatures.external)) {\n e(def);\n }\n for (def of Array.from(this._signatures.attribute)) {\n a(redef(def));\n }\n for (let name in uniforms) {\n def = uniforms[name];\n if (exist[name]) {\n u(def, name);\n }\n }\n\n this.body = this.code = this._compiler(this.namespace, exceptions, defines);\n\n // Adds defs to original snippet for inspection\n if (defines) {\n const defs = (() => {\n const result = [];\n for (let k in defines) {\n v = defines[k];\n result.push(`#define ${k} ${v}`);\n }\n return result;\n })().join(\"\\n\");\n if (defs.length) {\n this._original = [\n defs,\n \"//----------------------------------------\",\n this._original,\n ].join(\"\\n\");\n }\n }\n\n return null;\n }\n}\nSnippet.initClass();\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport * as Graph from \"../graph\";\nimport * as Priority from \"./priority\";\n\n/*\n Program assembler\n\n Builds composite program that can act as new module/snippet\n Unconnected input/outputs and undefined callbacks are exposed in the new global/main scope\n If there is only one call with an identical call signature, a #define is output instead.\n*/\nexport const assemble = function (language, namespace, calls, requires) {\n const generate = language;\n\n const externals = {};\n const symbols = [];\n const uniforms = {};\n const varyings = {};\n const attributes = {};\n const library = {};\n\n const process = function () {\n let body;\n let ns;\n for (ns in requires) {\n const r = requires[ns];\n required(r.node, r.module);\n }\n\n [body, calls] = Array.from(handle(calls));\n if (namespace != null) {\n body.entry = namespace;\n }\n const main = generate.build(body, calls);\n\n const sorted = (() => {\n const result = [];\n for (ns in library) {\n const lib = library[ns];\n result.push(lib);\n }\n return result;\n })().sort((a, b) => Priority.compare(a.priority, b.priority));\n const includes = sorted.map((x) => x.code);\n includes.push(main.code);\n const code = generate.lines(includes);\n\n // Build new virtual snippet\n return {\n namespace: main.name,\n library, // Included library functions\n body: main.code, // Snippet body\n code, // Complete snippet (tests/debug)\n main, // Function signature\n entry: main.name, // Entry point name\n symbols,\n externals,\n uniforms,\n varyings,\n attributes,\n };\n };\n\n // Sort and process calls\n var handle = (calls) => {\n let c;\n calls = (() => {\n const result = [];\n for (let ns in calls) {\n c = calls[ns];\n result.push(c);\n }\n return result;\n })();\n calls.sort((a, b) => b.priority - a.priority);\n\n // Call module in DAG chain\n const call = (node, module, priority) => {\n include(node, module, priority);\n const { main } = module;\n const { entry } = module;\n\n const _lookup = (name) => lookup(node, name);\n const _dangling = (name) => isDangling(node, name);\n return generate.call(_lookup, _dangling, entry, main.signature, body);\n };\n\n var body = generate.body();\n for (c of Array.from(calls)) {\n call(c.node, c.module, c.priority);\n }\n\n return [body, calls];\n };\n\n // Adopt given code as a library at given priority\n const adopt = function (namespace, code, priority) {\n const record = library[namespace];\n if (record != null) {\n return (record.priority = Priority.max(record.priority, priority));\n } else {\n return (library[namespace] = { code, priority });\n }\n };\n\n // Include snippet for a call\n var include = function (node, module, priority) {\n let def, key;\n priority = Priority.make(priority);\n\n // Adopt snippet's libraries\n for (let ns in module.library) {\n const lib = module.library[ns];\n adopt(ns, lib.code, Priority.nest(priority, lib.priority));\n }\n\n // Adopt snippet body as library\n adopt(module.namespace, module.body, priority);\n\n // Adopt GL vars\n for (key in module.uniforms) {\n def = module.uniforms[key];\n uniforms[key] = def;\n }\n for (key in module.varyings) {\n def = module.varyings[key];\n varyings[key] = def;\n }\n for (key in module.attributes) {\n def = module.attributes[key];\n attributes[key] = def;\n }\n\n return required(node, module);\n };\n\n var required = (\n node,\n module // Adopt external symbols\n ) =>\n (() => {\n const result = [];\n for (let key of Array.from(module.symbols)) {\n const ext = module.externals[key];\n if (isDangling(node, ext.name)) {\n const copy = {};\n for (let k in ext) {\n const v = ext[k];\n copy[k] = v;\n }\n copy.name = lookup(node, ext.name);\n externals[key] = copy;\n result.push(symbols.push(key));\n } else {\n result.push(undefined);\n }\n }\n return result;\n })();\n\n // Check for dangling input/output\n var isDangling = function (node, name) {\n const outlet = node.get(name);\n\n if (outlet.inout === Graph.IN) {\n return outlet.input === null;\n } else if (outlet.inout === Graph.OUT) {\n return outlet.output.length === 0;\n }\n };\n\n // Look up unique name for outlet\n var lookup = function (node, name) {\n // Traverse graph edge\n let outlet = node.get(name);\n if (!outlet) {\n return null;\n }\n\n if (outlet.input) {\n outlet = outlet.input;\n }\n ({ name } = outlet);\n\n return outlet.id;\n };\n\n return process();\n};\n","/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Snippet } from \"./snippet\";\nimport { assemble } from \"./assemble\";\n\n/*\n Program assembly model\n\n Snippets are added to its queue, registering calls and code includes.\n Calls are de-duped and scheduled at the earliest point required for correct data flow.\n\n When assemble() is called, it builds a main() function to\n execute all calls in final order.\n\n The result is a new instance of Snippet that acts as if it\n was parsed from the combined source of the component\n nodes.\n*/\nexport class Program {\n static initClass() {\n this.index = 0;\n }\n static entry() {\n return `_pg_${++Program.index}_`;\n }\n\n // Program starts out empty, ready to compile starting from a particular block\n constructor(language, namespace, graph) {\n this.language = language;\n this.namespace = namespace;\n this.graph = graph;\n this.calls = {};\n this.requires = {};\n }\n\n // Call a given module at certain priority\n call(node, module, priority) {\n let exists;\n const ns = module.namespace;\n\n // Merge all calls down into one with the right priority\n if ((exists = this.calls[ns])) {\n exists.priority = Math.max(exists.priority, priority);\n } else {\n this.calls[ns] = { node, module, priority };\n }\n\n return this;\n }\n\n // Require a given (callback) module's externals\n require(node, module) {\n const ns = module.namespace;\n return (this.requires[ns] = { node, module });\n }\n\n // Compile queued ops into result\n assemble() {\n const data = assemble(\n this.language,\n this.namespace != null ? this.namespace : Program.entry,\n this.calls,\n this.requires\n );\n const snippet = new Snippet();\n for (let key in data) {\n snippet[key] = data[key];\n }\n snippet.graph = this.graph;\n return snippet;\n }\n}\nProgram.initClass();\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport * as Graph from \"../graph\";\nimport * as Priority from \"./priority\";\n\n/*\n Callback linker\n\n Imports given modules and generates linkages for registered callbacks.\n\n Builds composite program with single module as exported entry point\n*/\n\nexport const link = function (language, links, modules, exported) {\n const generate = language;\n let includes = [];\n\n const symbols = [];\n const externals = {};\n const uniforms = {};\n const attributes = {};\n const varyings = {};\n const library = {};\n\n const process = function () {\n const exports = generate.links(links);\n\n const header = [];\n if (exports.defs != null) {\n header.push(exports.defs);\n }\n if (exports.bodies != null) {\n header.push(exports.bodies);\n }\n\n for (let m of Array.from(modules)) {\n include(m.node, m.module, m.priority);\n }\n const sorted = (() => {\n const result = [];\n for (let ns in library) {\n const lib = library[ns];\n result.push(lib);\n }\n return result;\n })().sort((a, b) => Priority.compare(a.priority, b.priority));\n includes = sorted.map((x) => x.code);\n\n let code = generate.lines(includes);\n code = generate.defuse(code);\n if (header.length) {\n code = [generate.lines(header), code].join(\"\\n\");\n }\n code = generate.hoist(code);\n code = generate.dedupe(code);\n\n // Export module's externals\n const e = exported;\n return {\n namespace: e.main.name,\n code, // Complete snippet (tests/debug)\n main: e.main, // Function signature\n entry: e.main.name, // Entry point name\n externals,\n uniforms,\n attributes,\n varyings,\n };\n };\n\n // Adopt given code as a library at given priority\n const adopt = function (namespace, code, priority) {\n const record = library[namespace];\n if (record != null) {\n return (record.priority = Priority.max(record.priority, priority));\n } else {\n return (library[namespace] = { code, priority });\n }\n };\n\n // Include piece of code\n var include = function (node, module, priority) {\n let def, key;\n priority = Priority.make(priority);\n\n // Adopt snippet's libraries\n for (let ns in module.library) {\n const lib = module.library[ns];\n adopt(ns, lib.code, Priority.nest(priority, lib.priority));\n }\n\n // Adopt snippet body as library\n adopt(module.namespace, module.body, priority);\n\n // Adopt externals\n for (key in module.uniforms) {\n def = module.uniforms[key];\n uniforms[key] = def;\n }\n for (key in module.varyings) {\n def = module.varyings[key];\n varyings[key] = def;\n }\n for (key in module.attributes) {\n def = module.attributes[key];\n attributes[key] = def;\n }\n\n return (() => {\n const result = [];\n for (key of Array.from(module.symbols)) {\n const ext = module.externals[key];\n if (isDangling(node, ext.name)) {\n externals[key] = ext;\n result.push(symbols.push(key));\n } else {\n result.push(undefined);\n }\n }\n return result;\n })();\n };\n\n // Check for dangling input/output\n var isDangling = function (node, name) {\n const outlet = node.get(name);\n\n if (!outlet) {\n const module =\n (node.owner.snippet != null ? node.owner.snippet._name : undefined) !=\n null\n ? node.owner.snippet != null\n ? node.owner.snippet._name\n : undefined\n : node.owner.namespace;\n throw new Error(\n `Unable to link program. Unlinked callback \\`${name}\\` on \\`${module}\\``\n );\n }\n\n if (outlet.inout === Graph.IN) {\n return outlet.input === null;\n } else if (outlet.inout === Graph.OUT) {\n return outlet.output.length === 0;\n }\n };\n\n return process();\n};\n","/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Snippet } from \"./snippet\";\nimport { link } from \"./link\";\n\nconst debug = false;\n\n/*\n Program linkage layout\n\n Entry points are added to its dependency graph\n Callbacks are linked either with a go-between function\n or a #define if the signatures are identical.\n*/\nexport class Layout {\n constructor(language, graph) {\n this.language = language;\n this.graph = graph;\n this.links = [];\n this.includes = [];\n this.modules = {};\n this.visits = {};\n }\n\n // Link up a given named external to this module's entry point\n callback(node, module, priority, name, external) {\n return this.links.push({ node, module, priority, name, external });\n }\n\n // Include this module of code\n include(node, module, priority) {\n let m;\n if ((m = this.modules[module.namespace]) != null) {\n return (m.priority = Math.max(priority, m.priority));\n } else {\n this.modules[module.namespace] = true;\n return this.includes.push({ node, module, priority });\n }\n }\n\n // Visit each namespace at most once to avoid infinite recursion\n visit(namespace) {\n debug && console.log(\"Visit\", namespace, !this.visits[namespace]);\n if (this.visits[namespace]) {\n return false;\n }\n return (this.visits[namespace] = true);\n }\n\n // Compile queued ops into result\n link(module) {\n const data = link(this.language, this.links, this.includes, module);\n const snippet = new Snippet();\n for (let key in data) {\n snippet[key] = data[key];\n }\n snippet.graph = this.graph;\n return snippet;\n }\n}\n","import { Snippet } from \"./snippet\";\n\nexport const { load } = Snippet;\n\nexport * from \"./snippet\";\nexport * from \"./program\";\nexport * from \"./layout\";\nexport * from \"./assemble\";\nexport * from \"./link\";\nexport * from \"./priority\";\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining\n * DS104: Avoid inline assignments\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as Graph from \"../graph\";\nimport { Program, Layout } from \"../linker\";\n\nlet debug = false;\n\nexport class Block {\n static previous(outlet) {\n return outlet.input != null ? outlet.input.node.owner : undefined;\n }\n\n constructor(delay) {\n // Subclasses can pass `delay` to allow them to initialize before they call\n // `@construct`.\n if (delay == null) {\n delay = false;\n }\n if (!delay) {\n this.construct();\n }\n }\n\n construct() {\n let left;\n if (this.namespace == null) {\n this.namespace = Program.entry();\n }\n return (this.node = new Graph.Node(\n this,\n (left =\n typeof this.makeOutlets === \"function\"\n ? this.makeOutlets()\n : undefined) != null\n ? left\n : {}\n ));\n }\n\n refresh() {\n let left;\n return this.node.setOutlets(\n (left =\n typeof this.makeOutlets === \"function\"\n ? this.makeOutlets()\n : undefined) != null\n ? left\n : {}\n );\n }\n\n clone() {\n return new Block();\n }\n\n // Compile a new program starting from this block\n compile(language, namespace) {\n const program = new Program(\n language,\n namespace != null ? namespace : Program.entry(),\n this.node.graph\n );\n this.call(program, 0);\n return program.assemble();\n }\n\n // Link up programs into a layout, starting from this block\n link(language, namespace) {\n const module = this.compile(language, namespace);\n\n const layout = new Layout(language, this.node.graph);\n this._include(module, layout, 0);\n this.export(layout, 0);\n return layout.link(module);\n }\n\n // Subclassed methods\n call(_program, _depth) {}\n callback(_layout, _depth, _name, _external, _outlet) {}\n export(_layout, _depth) {}\n\n // Info string for debugging\n _info(suffix) {\n let string =\n (this.node.owner.snippet != null\n ? this.node.owner.snippet._name\n : undefined) != null\n ? this.node.owner.snippet != null\n ? this.node.owner.snippet._name\n : undefined\n : this.node.owner.namespace;\n if (suffix != null) {\n return (string += \".\" + suffix);\n }\n }\n\n // Create an outlet for a signature definition\n _outlet(def, props) {\n const outlet = Graph.Outlet.make(def, props);\n outlet.meta.def = def;\n return outlet;\n }\n\n // Make a call to this module in the given program\n _call(module, program, depth) {\n return program.call(this.node, module, depth);\n }\n\n // Require this module's dependencies in the given program\n _require(module, program) {\n return program.require(this.node, module);\n }\n\n // Make a call to all connected inputs\n _inputs(module, program, depth) {\n return (() => {\n const result = [];\n for (let arg of Array.from(module.main.signature)) {\n const outlet = this.node.get(arg.name);\n result.push(\n __guard__(Block.previous(outlet), (x) => x.call(program, depth + 1))\n );\n }\n return result;\n })();\n }\n\n // Insert callback to this module in the given layout\n _callback(module, layout, depth, name, external, outlet) {\n return layout.callback(this.node, module, depth, name, external, outlet);\n }\n\n // Include this module in the given layout\n _include(module, layout, depth) {\n return layout.include(this.node, module, depth);\n }\n\n // Link this module's connected callbacks\n _link(module, layout, depth) {\n debug && console.log(\"block::_link\", this.toString(), module.namespace);\n return (() => {\n const result = [];\n for (let key of Array.from(module.symbols)) {\n const ext = module.externals[key];\n let outlet = this.node.get(ext.name);\n if (!outlet) {\n throw new OutletError(\n `External not found on ${this._info(ext.name)}`\n );\n }\n\n if (outlet.meta.child != null) {\n continue;\n }\n\n let parent = outlet;\n let block;\n while (!block && parent) {\n [parent, outlet] = Array.from([outlet.meta.parent, parent]);\n }\n\n block = Block.previous(outlet);\n if (!block) {\n throw new OutletError(\n `Missing connection on ${this._info(ext.name)}`\n );\n }\n\n debug && console.log(\"callback -> \", this.toString(), ext.name, outlet);\n block.callback(layout, depth + 1, key, ext, outlet.input);\n result.push(\n block != null ? block.export(layout, depth + 1) : undefined\n );\n }\n return result;\n })();\n }\n\n // Trace backwards to discover callbacks further up\n _trace(module, layout, depth) {\n debug && console.log(\"block::_trace\", this.toString(), module.namespace);\n return (() => {\n const result = [];\n for (let arg of Array.from(module.main.signature)) {\n const outlet = this.node.get(arg.name);\n result.push(\n __guard__(Block.previous(outlet), (x) => x.export(layout, depth + 1))\n );\n }\n return result;\n })();\n }\n}\n\nvar OutletError = function (message) {\n const e = new Error(message);\n e.name = \"OutletError\";\n return e;\n};\n\nOutletError.prototype = new Error();\n\nfunction __guard__(value, transform) {\n return typeof value !== \"undefined\" && value !== null\n ? transform(value)\n : undefined;\n}\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Block } from \"./block\";\n\nexport class Call extends Block {\n constructor(snippet) {\n super(true);\n\n this.snippet = snippet;\n this.namespace = snippet.namespace;\n this.construct();\n }\n\n clone() {\n return new Call(this.snippet);\n }\n\n makeOutlets() {\n const main = this.snippet.main.signature;\n const { externals } = this.snippet;\n const { symbols } = this.snippet;\n\n const params = Array.from(main).map((outlet) =>\n this._outlet(outlet, { callback: false })\n );\n const callbacks = Array.from(symbols).map((key) =>\n this._outlet(externals[key], { callback: true })\n );\n\n return params.concat(callbacks);\n }\n\n call(program, depth) {\n this._call(this.snippet, program, depth);\n return this._inputs(this.snippet, program, depth);\n }\n\n export(layout, depth) {\n if (!layout.visit(this.namespace, depth)) {\n return;\n }\n\n this._link(this.snippet, layout, depth);\n return this._trace(this.snippet, layout, depth);\n }\n}\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Graph } from \"../graph\";\nimport { Block } from \"./block\";\n\n/*\n Re-use a subgraph as a callback\n*/\nexport class Callback extends Block {\n constructor(graph) {\n super(true);\n this.graph = graph;\n this.construct();\n }\n\n refresh() {\n super.refresh();\n return delete this.subroutine;\n }\n\n clone() {\n return new Callback(this.graph);\n }\n\n makeOutlets() {\n let outlet;\n this.make();\n\n const outlets = [];\n let ins = [];\n let outs = [];\n\n // Pass-through existing callbacks\n // Collect open inputs/outputs\n const handle = (outlet, list) => {\n if (outlet.meta.callback) {\n if (outlet.inout === Graph.IN) {\n // Dupe outlet and create two-way link between cloned outlets\n const dupe = outlet.dupe();\n if (dupe.meta.child == null) {\n dupe.meta.child = outlet;\n }\n outlet.meta.parent = dupe;\n\n return outlets.push(dupe);\n }\n } else {\n return list.push(outlet.type);\n }\n };\n\n for (outlet of Array.from(this.graph.inputs())) {\n handle(outlet, ins);\n }\n for (outlet of Array.from(this.graph.outputs())) {\n handle(outlet, outs);\n }\n\n // Merge inputs/outputs into new callback signature\n ins = ins.join(\",\");\n outs = outs.join(\",\");\n const type = `(${ins})(${outs})`;\n\n outlets.push({\n name: \"callback\",\n type,\n inout: Graph.OUT,\n meta: {\n callback: true,\n def: this.subroutine.main,\n },\n });\n\n return outlets;\n }\n\n make() {\n return (this.subroutine = this.graph.compile(this.namespace));\n }\n\n export(layout, depth) {\n if (!layout.visit(this.namespace, depth)) {\n return;\n }\n\n this._link(this.subroutine, layout, depth);\n return this.graph.export(layout, depth);\n }\n\n call(program, depth) {\n return this._require(this.subroutine, program, depth);\n }\n\n callback(layout, depth, name, external, outlet) {\n this._include(this.subroutine, layout, depth);\n return this._callback(\n this.subroutine,\n layout,\n depth,\n name,\n external,\n outlet\n );\n }\n}\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Graph } from \"../graph\";\nimport { Block } from \"./block\";\n\n/*\n Isolate a subgraph as a single node\n*/\nexport class Isolate extends Block {\n constructor(graph) {\n super(true);\n this.graph = graph;\n this.construct();\n }\n\n refresh() {\n super.refresh();\n return delete this.subroutine;\n }\n\n clone() {\n return new Isolate(this.graph);\n }\n\n makeOutlets() {\n this.make();\n\n const outlets = [];\n\n const seen = {};\n const done = {};\n for (let set of [\"inputs\", \"outputs\"]) {\n for (let outlet of Array.from(this.graph[set]())) {\n // Preserve name of 'return' and 'callback' outlets\n let name = undefined;\n if (\n [\"return\", \"callback\"].includes(outlet.hint) &&\n outlet.inout === Graph.OUT\n ) {\n name = outlet.hint;\n }\n\n // Unless it already exists\n if (seen[name] != null) {\n name = undefined;\n }\n\n // Dupe outlet and remember link to original\n const dupe = outlet.dupe(name);\n if (dupe.meta.child == null) {\n dupe.meta.child = outlet;\n }\n outlet.meta.parent = dupe;\n if (name != null) {\n seen[name] = true;\n }\n done[outlet.name] = dupe;\n\n outlets.push(dupe);\n }\n }\n\n return outlets;\n }\n\n make() {\n return (this.subroutine = this.graph.compile(this.namespace));\n }\n\n call(program, depth) {\n this._call(this.subroutine, program, depth);\n return this._inputs(this.subroutine, program, depth);\n }\n\n export(layout, depth) {\n if (!layout.visit(this.namespace, depth)) {\n return;\n }\n\n // Link up with normal inputs\n this._link(this.subroutine, layout, depth);\n this._trace(this.subroutine, layout, depth);\n\n // Export callbacks needed to call the subroutine\n return this.graph.export(layout, depth);\n }\n\n callback(layout, depth, name, external, outlet) {\n outlet = outlet.meta.child;\n return outlet.node.owner.callback(layout, depth, name, external, outlet);\n }\n}\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS205: Consider reworking code to avoid use of IIFEs\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Block } from \"./block\";\n\n/*\n Join multiple disconnected nodes\n*/\nexport class Join extends Block {\n constructor(nodes) {\n super(true);\n this.nodes = nodes;\n this.construct();\n }\n\n clone() {\n return new Join(this.nodes);\n }\n\n makeOutlets() {\n return [];\n }\n\n call(program, depth) {\n return (() => {\n const result = [];\n for (let node of Array.from(this.nodes)) {\n const block = node.owner;\n result.push(block.call(program, depth));\n }\n return result;\n })();\n }\n\n export(layout, depth) {\n return (() => {\n const result = [];\n for (let node of Array.from(this.nodes)) {\n const block = node.owner;\n result.push(block.export(layout, depth));\n }\n return result;\n })();\n }\n}\n","export * from \"./block\";\nexport * from \"./call\";\nexport * from \"./callback\";\nexport * from \"./isolate\";\nexport * from \"./join\";\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n// Dump graph for debug/visualization purposes\nimport * as Block from \"../block\";\n\nexport var serialize = function (graph) {\n const nodes = [];\n const links = [];\n\n for (let node of Array.from(graph.nodes)) {\n var outlet;\n const record = {\n // Data\n id: node.id,\n name: null,\n type: null,\n depth: null,\n graph: null,\n inputs: [],\n outputs: [],\n };\n\n nodes.push(record);\n\n const { inputs } = record;\n const { outputs } = record;\n\n const block = node.owner;\n\n if (block instanceof Block.Call) {\n record.name = block.snippet._name;\n record.type = \"call\";\n record.code = block.snippet._original;\n } else if (block instanceof Block.Callback) {\n record.name = \"Callback\";\n record.type = \"callback\";\n record.graph = serialize(block.graph);\n } else if (block instanceof Block.Isolate) {\n record.name = \"Isolate\";\n record.type = \"isolate\";\n record.graph = serialize(block.graph);\n } else if (block instanceof Block.Join) {\n record.name = \"Join\";\n record.type = \"join\";\n } else if (block != null) {\n if (record.name == null) {\n record.name = block.name != null ? block.name : block.type;\n }\n if (record.type == null) {\n record.type = block.type;\n }\n if (record.code == null) {\n record.code = block.code;\n }\n if (block.graph != null) {\n record.graph = serialize(block.graph);\n }\n }\n\n const format = function (type) {\n type = type.replace(\")(\", \")→(\");\n return (type = type.replace(\"()\", \"\"));\n };\n\n for (outlet of Array.from(node.inputs)) {\n inputs.push({\n id: outlet.id,\n name: outlet.name,\n type: format(outlet.type),\n open: outlet.input == null,\n });\n }\n\n for (outlet of Array.from(node.outputs)) {\n outputs.push({\n id: outlet.id,\n name: outlet.name,\n type: format(outlet.type),\n open: !outlet.output.length,\n });\n\n for (let other of Array.from(outlet.output)) {\n links.push({\n from: node.id,\n out: outlet.id,\n to: other.node.id,\n in: other.id,\n type: format(outlet.type),\n });\n }\n }\n }\n\n return { nodes, links };\n};\n","/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n// Hash string into a 32-bit key (murmurhash3)\nconst c1 = 0xcc9e2d51;\nconst c2 = 0x1b873593;\nconst c3 = 0xe6546b64;\nconst c4 = 0x85ebca6b;\nconst c5 = 0xc2b2ae35;\n\n// Fix imul in old/broken browsers\nlet imul = function (a, b) {\n const ah = (a >>> 16) & 0xffff;\n const al = a & 0xffff;\n const bh = (b >>> 16) & 0xffff;\n const bl = b & 0xffff;\n return (al * bl + (((ah * bl + al * bh) << 16) >>> 0)) | 0;\n};\n\nif (Math.imul != null) {\n const test = Math.imul(0xffffffff, 5);\n if (test === -5) {\n ({ imul } = Math);\n }\n}\n\nexport const hash = function (string) {\n let h;\n const n = string.length;\n let m = Math.floor(n / 2);\n let j = (h = 0);\n\n const next = () => string.charCodeAt(j++);\n const iterate = function (a, b) {\n let k = a | (b << 16); // two utf-16 words\n k ^= k << 9; // whitening for ascii-only strings\n\n k = imul(k, c1);\n k = (k << 15) | (k >>> 17);\n k = imul(k, c2);\n\n h ^= k;\n\n h = (h << 13) | (h >>> 19);\n h = imul(h, 5);\n return (h = (h + c3) | 0);\n };\n\n while (m--) {\n iterate(next(), next());\n }\n if (n & 1) {\n iterate(next(), 0);\n }\n\n h ^= n;\n h ^= h >>> 16;\n h = imul(h, c4);\n h ^= h >>> 13;\n h = imul(h, c5);\n\n return (h ^= h >>> 16);\n};\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { hash } from \"../factory/hash\";\n\nconst trim = (string) => (\"\" + string).replace(/^\\s+|\\s+$/g, \"\");\n\nconst cssColor = (r, g, b, alpha) =>\n \"rgba(\" + [r, g, b, alpha].join(\", \") + \")\";\n\nconst hashColor = function (string, alpha) {\n if (alpha == null) {\n alpha = 1;\n }\n const color = hash(string) ^ 0x123456;\n\n let r = color & 0xff;\n let g = (color >>> 8) & 0xff;\n let b = (color >>> 16) & 0xff;\n\n const max = Math.max(r, g, b);\n const norm = 140 / max;\n const min = Math.round(max / 3);\n\n r = Math.min(255, Math.round(norm * Math.max(r, min)));\n g = Math.min(255, Math.round(norm * Math.max(g, min)));\n b = Math.min(255, Math.round(norm * Math.max(b, min)));\n\n return cssColor(r, g, b, alpha);\n};\n\nconst escapeText = function (string) {\n string = string != null ? string : \"\";\n return string\n .replace(/&/g, \"&\")\n .replace(//g, \">\")\n .replace(/'/g, \"'\")\n .replace(/\"/g, \""\");\n};\n\nexport const process = function (data) {\n const links = [];\n const el = _markup(data, links);\n el.update = () => connect(el, links);\n _activate(el);\n return el;\n};\n\nvar _activate = function (el) {\n const codes = el.querySelectorAll(\".shadergraph-code\");\n return Array.from(codes).map((code) =>\n (function () {\n const popup = code;\n popup.parentNode.classList.add(\"shadergraph-has-code\");\n return popup.parentNode.addEventListener(\n \"click\",\n (_event) =>\n (popup.style.display = {\n block: \"none\",\n none: \"block\",\n }[popup.style.display || \"none\"])\n );\n })()\n );\n};\n\nconst _order = function (data) {\n let link, node;\n const nodeMap = {};\n const linkMap = {};\n for (node of Array.from(data.nodes)) {\n nodeMap[node.id] = node;\n }\n\n for (link of Array.from(data.links)) {\n if (linkMap[link.from] == null) {\n linkMap[link.from] = [];\n }\n linkMap[link.from].push(link);\n }\n\n var recurse = function (node, depth) {\n let next;\n if (depth == null) {\n depth = 0;\n }\n node.depth = Math.max(node.depth != null ? node.depth : 0, depth);\n if ((next = linkMap[node.id])) {\n for (link of Array.from(next)) {\n recurse(nodeMap[link.to], depth + 1);\n }\n }\n return null;\n };\n\n for (node of Array.from(data.nodes)) {\n if (node.depth == null) {\n recurse(node);\n }\n }\n\n return null;\n};\n\nvar _markup = function (data, links) {\n let column;\n _order(data);\n\n const wrapper = document.createElement(\"div\");\n wrapper.classList.add(\"shadergraph-graph\");\n\n const columns = [];\n const outlets = {};\n\n for (let node of Array.from(data.nodes)) {\n var outlet;\n var block = document.createElement(\"div\");\n block.classList.add(\"shadergraph-node\");\n block.classList.add(`shadergraph-node-${node.type}`);\n\n block.innerHTML = `\\\n
${escapeText(node.name)}
\\\n`;\n\n const addOutlet = function (outlet, inout) {\n const color = hashColor(outlet.type);\n\n const div = document.createElement(\"div\");\n div.classList.add(\"shadergraph-outlet\");\n div.classList.add(`shadergraph-outlet-${inout}`);\n div.innerHTML = `\\\n
\n
${escapeText(\n outlet.type\n )}
\n
${escapeText(outlet.name)}
\\\n`;\n block.appendChild(div);\n\n return (outlets[outlet.id] = div.querySelector(\".shadergraph-point\"));\n };\n\n for (outlet of Array.from(node.inputs)) {\n addOutlet(outlet, \"in\");\n }\n for (outlet of Array.from(node.outputs)) {\n addOutlet(outlet, \"out\");\n }\n\n if (node.graph != null) {\n block.appendChild(_markup(node.graph, links));\n } else {\n const clear = document.createElement(\"div\");\n clear.classList.add(\"shadergraph-clear\");\n block.appendChild(clear);\n }\n\n if (node.code != null) {\n const div = document.createElement(\"div\");\n div.classList.add(\"shadergraph-code\");\n div.innerHTML = escapeText(trim(node.code));\n block.appendChild(div);\n }\n\n column = columns[node.depth];\n if (column == null) {\n column = document.createElement(\"div\");\n column.classList.add(\"shadergraph-column\");\n columns[node.depth] = column;\n }\n column.appendChild(block);\n }\n\n for (column of Array.from(columns)) {\n if (column != null) {\n wrapper.appendChild(column);\n }\n }\n\n for (let link of Array.from(data.links)) {\n const color = hashColor(link.type);\n\n links.push({\n color,\n out: outlets[link.out],\n in: outlets[link.in],\n });\n }\n\n return wrapper;\n};\n\nconst sqr = (x) => x * x;\n\nconst path = function (x1, y1, x2, y2) {\n let h;\n const dx = x2 - x1;\n const dy = y2 - y1;\n const d = Math.sqrt(sqr(dx) + sqr(dy));\n\n const vert = Math.abs(dy) > Math.abs(dx);\n if (vert) {\n const mx = (x1 + x2) / 2;\n const my = (y1 + y2) / 2;\n\n const f = dy > 0 ? 0.3 : -0.3;\n h = Math.min(Math.abs(dx) / 2, 20 + d / 8);\n\n return [\n \"M\",\n x1,\n y1,\n \"C\",\n x1 + h,\n y1 + \",\",\n mx,\n my - d * f,\n mx,\n my,\n \"C\",\n mx,\n my + d * f,\n x2 - h,\n y2 + \",\",\n x2,\n y2,\n ].join(\" \");\n } else {\n h = Math.min(Math.abs(dx) / 2.5, 20 + d / 4);\n\n return [\"M\", x1, y1, \"C\", x1 + h, y1 + \",\", x2 - h, y2 + \",\", x2, y2].join(\n \" \"\n );\n }\n};\n\nconst makeSVG = function (tag) {\n if (tag == null) {\n tag = \"svg\";\n }\n return document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n};\n\nvar connect = function (element, links) {\n let link;\n if (element.parentNode == null) {\n return;\n }\n\n const ref = element.getBoundingClientRect();\n\n for (link of Array.from(links)) {\n const a = link.out.getBoundingClientRect();\n const b = link.in.getBoundingClientRect();\n\n link.coords = {\n x1: (a.left + a.right) / 2 - ref.left,\n y1: (a.top + a.bottom) / 2 - ref.top,\n x2: (b.left + b.right) / 2 - ref.left,\n y2: (b.top + b.bottom) / 2 - ref.top,\n };\n }\n\n let svg = element.querySelector(\"svg\");\n if (svg != null) {\n element.removeChild(svg);\n }\n\n let box = element;\n while (box.parentNode && box.offsetHeight === 0) {\n box = box.parentNode;\n }\n\n svg = makeSVG();\n svg.setAttribute(\"width\", box.offsetWidth);\n svg.setAttribute(\"height\", box.offsetHeight);\n\n for (link of Array.from(links)) {\n const c = link.coords;\n\n const line = makeSVG(\"path\");\n line.setAttribute(\"d\", path(c.x1, c.y1, c.x2, c.y2));\n line.setAttribute(\"stroke\", link.color);\n line.setAttribute(\"stroke-width\", 3);\n line.setAttribute(\"fill\", \"transparent\");\n svg.appendChild(line);\n }\n\n return element.appendChild(svg);\n};\n\nexport const overlay = function (contents) {\n const div = document.createElement(\"div\");\n div.setAttribute(\"class\", \"shadergraph-overlay\");\n\n const close = document.createElement(\"div\");\n close.setAttribute(\"class\", \"shadergraph-close\");\n close.innerHTML = \"×\";\n\n const view = document.createElement(\"div\");\n view.setAttribute(\"class\", \"shadergraph-view\");\n\n const inside = document.createElement(\"div\");\n inside.setAttribute(\"class\", \"shadergraph-inside\");\n\n inside.appendChild(contents);\n view.appendChild(inside);\n div.appendChild(view);\n div.appendChild(close);\n\n close.addEventListener(\"click\", () => div.parentNode.removeChild(div));\n\n return div;\n};\n\nconst wrap = function (markup) {\n if (markup instanceof Node) {\n return markup;\n }\n const p = document.createElement(\"span\");\n p.innerText = markup != null ? markup : \"\";\n return p;\n};\n\nexport const merge = function (markup) {\n if (markup.length !== 1) {\n let el;\n const div = document.createElement(\"div\");\n for (el of Array.from(markup)) {\n div.appendChild(wrap(el));\n }\n div.update = () =>\n (() => {\n const result = [];\n for (el of Array.from(markup)) {\n result.push(\n typeof el.update === \"function\" ? el.update() : undefined\n );\n }\n return result;\n })();\n return div;\n } else {\n return wrap(markup[0]);\n }\n};\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { serialize as _serialize } from \"./serialize\";\nimport * as _markup from \"./markup\";\n\nexport const serialize = _serialize;\nexport const markup = _markup;\n\nconst _visualize = function (graph) {\n if (!graph) {\n return;\n }\n if (!graph.nodes) {\n return graph;\n }\n\n const data = serialize(graph);\n return markup.process(data);\n};\n\nvar resolve = function (arg) {\n if (arg == null) {\n return arg;\n }\n if (arg instanceof Array) {\n return arg.map(resolve);\n }\n if (arg.vertex != null && arg.fragment != null) {\n return [resolve(arg.vertex, resolve(arg.fragment))];\n }\n if (arg._graph != null) {\n return arg._graph;\n }\n if (arg.graph != null) {\n return arg.graph;\n }\n return arg;\n};\n\nvar merge = function (args) {\n let out = [];\n for (let arg of Array.from(args)) {\n if (arg instanceof Array) {\n out = out.concat(merge(arg));\n } else if (arg != null) {\n out.push(arg);\n }\n }\n return out;\n};\n\nexport const visualize = function () {\n const list = merge(resolve([].slice.call(arguments)));\n return markup.merge(\n Array.from(list)\n .filter((graph) => graph)\n .map((graph) => _visualize(graph))\n );\n};\n\nexport const inspect = function () {\n const contents = visualize.apply(null, arguments);\n const element = markup.overlay(contents);\n\n for (let el of Array.from(\n document.querySelectorAll(\".shadergraph-overlay\")\n )) {\n el.remove();\n }\n document.body.appendChild(element);\n contents.update();\n\n return element;\n};\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Graph } from \"../graph\";\nimport * as Block from \"../block\";\nimport * as Visualize from \"../visualize\";\n\n/*\n Chainable factory\n\n Exposes methods to build a graph incrementally\n*/\nexport class Factory {\n constructor(language, fetch, config) {\n this.language = language;\n this.fetch = fetch;\n this.config = config;\n this.graph();\n }\n\n // Combined call/concat shortcut\n pipe(name, uniforms, namespace, defines) {\n if (name instanceof Factory) {\n this._concat(name);\n } else if (name != null) {\n this._call(name, uniforms, namespace, defines);\n }\n return this;\n }\n\n // Old name\n call(name, uniforms, namespace, defines) {\n return this.pipe(name, uniforms, namespace, defines);\n }\n\n // Combined callback/import shortcut\n require(name, uniforms, namespace, defines) {\n if (name instanceof Factory) {\n this._import(name);\n } else if (name != null) {\n this.callback();\n this._call(name, uniforms, namespace, defines);\n this.end();\n }\n return this;\n }\n\n // Old name\n import(name, uniforms, namespace, defines) {\n return this.require(name, uniforms, namespace, defines);\n }\n\n // Create parallel branches that connect as one block to the end\n // (one outgoing connection per outlet)\n split() {\n this._group(\"_combine\", true);\n return this;\n }\n\n // Create parallel branches that fan out from the end\n // (multiple outgoing connections per outlet)\n fan() {\n this._group(\"_combine\", false);\n return this;\n }\n\n // Create isolated subgraph\n isolate() {\n this._group(\"_isolate\");\n return this;\n }\n\n // Create callback subgraph\n callback() {\n this._group(\"_callback\");\n return this;\n }\n\n // Next branch in group\n next() {\n this._next();\n return this;\n }\n\n // Connect branches to previous tail and add pass-through from end\n pass() {\n const pass = this._stack[2].end;\n this.end();\n this._state.end = this._state.end.concat(pass);\n return this;\n }\n\n // Leave nested branches and join up with main graph,\n // applying stored op along the way\n end() {\n const [sub, main] = Array.from(this._exit());\n const { op } = sub;\n if (this[op]) {\n this[op](sub, main);\n }\n return this;\n }\n\n // Old name\n join() {\n return this.end();\n }\n\n // Return finalized graph / reset factory\n graph() {\n // Pop remaining stack\n while ((this._stack != null ? this._stack.length : undefined) > 1) {\n this.end();\n }\n\n // Remember terminating node(s) of graph\n if (this._graph) {\n this._tail(this._state, this._graph);\n }\n\n const graph = this._graph;\n\n this._graph = new Graph();\n this._state = new State();\n this._stack = [this._state];\n\n return graph;\n }\n\n // Compile shortcut (graph is thrown away)\n compile(namespace) {\n if (namespace == null) {\n namespace = \"main\";\n }\n return this.graph().compile(namespace);\n }\n\n // Link shortcut (graph is thrown away)\n link(namespace) {\n if (namespace == null) {\n namespace = \"main\";\n }\n return this.graph().link(namespace);\n }\n\n // Serialize for debug\n serialize() {\n return Visualize.serialize(this._graph);\n }\n\n // Return true if empty\n empty() {\n return this._graph.nodes.length === 0;\n }\n\n // Concatenate existing factory onto tail\n // Retains original factory\n _concat(factory) {\n // Ignore empty concat\n let block;\n if (factory._state.nodes.length === 0) {\n return this;\n }\n\n this._tail(factory._state, factory._graph);\n\n try {\n block = new Block.Isolate(factory._graph);\n } catch (error) {\n if (this.config.autoInspect) {\n Visualize.inspect(error, this._graph, factory);\n }\n throw error;\n }\n\n this._auto(block);\n return this;\n }\n\n // Add existing factory as callback\n // Retains original factory\n _import(factory) {\n // Check for empty require\n let block;\n if (factory._state.nodes.length === 0) {\n throw \"Can't import empty callback\";\n }\n\n this._tail(factory._state, factory._graph);\n\n try {\n block = new Block.Callback(factory._graph);\n } catch (error) {\n if (this.config.autoInspect) {\n Visualize.inspect(error, this._graph, factory);\n }\n throw error;\n }\n\n this._auto(block);\n return this;\n }\n\n // Connect parallel branches to tail\n _combine(sub, main) {\n for (let to of Array.from(sub.start)) {\n for (let from of Array.from(main.end)) {\n from.connect(to, sub.multi);\n }\n }\n\n main.end = sub.end;\n return (main.nodes = main.nodes.concat(sub.nodes));\n }\n\n // Make subgraph and connect to tail\n _isolate(sub, _main) {\n if (sub.nodes.length) {\n let block;\n const subgraph = this._subgraph(sub);\n this._tail(sub, subgraph);\n\n try {\n block = new Block.Isolate(subgraph);\n } catch (error) {\n if (this.config.autoInspect) {\n Visualize.inspect(error, this._graph, subgraph);\n }\n throw error;\n }\n\n return this._auto(block);\n }\n }\n\n // Convert to callback and connect to tail\n _callback(sub, _main) {\n if (sub.nodes.length) {\n let block;\n const subgraph = this._subgraph(sub);\n this._tail(sub, subgraph);\n\n try {\n block = new Block.Callback(subgraph);\n } catch (error) {\n if (this.config.autoInspect) {\n Visualize.inspect(error, this._graph, subgraph);\n }\n throw error;\n }\n\n return this._auto(block);\n }\n }\n\n // Create next call block\n _call(name, uniforms, namespace, defines) {\n const snippet = this.fetch(name);\n snippet.bind(this.config, uniforms, namespace, defines);\n const block = new Block.Call(snippet);\n return this._auto(block);\n }\n\n // Move current state into subgraph\n _subgraph(sub) {\n const subgraph = new Graph(null, this._graph);\n subgraph.adopt(sub.nodes);\n return subgraph;\n }\n\n // Finalize graph tail\n _tail(state, graph) {\n // Merge (unique) terminating ends into single tail node if needed\n let tail = state.end.concat(state.tail);\n tail = tail.filter((node, i) => tail.indexOf(node) === i);\n\n if (tail.length > 1) {\n tail = new Block.Join(tail);\n tail = [tail.node];\n this._graph.add(tail);\n }\n\n // Save single endpoint\n graph.tail = tail[0];\n state.end = tail;\n state.tail = [];\n\n if (!graph.tail) {\n throw new Error(\"Cannot finalize empty graph\");\n }\n\n // Add compile/link/export/inspect shortcut methods\n graph.compile = (namespace) => {\n if (namespace == null) {\n namespace = \"main\";\n }\n try {\n return graph.tail.owner.compile(this.language, namespace);\n } catch (error) {\n if (this.config.autoInspect) {\n graph.inspect(error);\n }\n throw error;\n }\n };\n\n graph.link = (namespace) => {\n if (namespace == null) {\n namespace = \"main\";\n }\n try {\n return graph.tail.owner.link(this.language, namespace);\n } catch (error) {\n if (this.config.autoInspect) {\n graph.inspect(error);\n }\n throw error;\n }\n };\n\n graph.export = (layout, depth) => {\n return graph.tail.owner.export(layout, depth);\n };\n\n return (graph.inspect = (message = null) =>\n Visualize.inspect(message, graph));\n }\n\n // Create group for branches or callbacks\n _group(op, multi) {\n this._push(op, multi); // Accumulator\n this._push(); // Current\n return this;\n }\n\n // Merge branch into accumulator and reset state\n _next() {\n const sub = this._pop();\n\n this._state.start = this._state.start.concat(sub.start);\n this._state.end = this._state.end.concat(sub.end);\n this._state.nodes = this._state.nodes.concat(sub.nodes);\n this._state.tail = this._state.tail.concat(sub.tail);\n\n return this._push();\n }\n\n // Exit nested branches\n _exit() {\n this._next();\n this._pop();\n return [this._pop(), this._state];\n }\n\n // State stack\n _push(op, multi) {\n this._stack.unshift(new State(op, multi));\n return (this._state = this._stack[0]);\n }\n\n _pop() {\n let left;\n this._state = this._stack[1];\n if (this._state == null) {\n this._state = new State();\n }\n return (left = this._stack.shift()) != null ? left : new State();\n }\n\n // Auto append or insert depending on whether we have inputs\n _auto(block) {\n if (block.node.inputs.length) {\n return this._append(block);\n } else {\n return this._insert(block);\n }\n }\n\n // Add block and connect to end\n _append(block) {\n let end;\n const { node } = block;\n this._graph.add(node);\n\n for (end of Array.from(this._state.end)) {\n end.connect(node);\n }\n\n if (!this._state.start.length) {\n this._state.start = [node];\n }\n this._state.end = [node];\n\n this._state.nodes.push(node);\n if (!node.outputs.length) {\n this._state.tail.push(node);\n }\n }\n\n // Add block and connect to start\n _prepend(block) {\n let start;\n const { node } = block;\n this._graph.add(node);\n\n for (start of Array.from(this._state.start)) {\n node.connect(start);\n }\n\n if (!this._state.end.length) {\n this._state.end = [node];\n }\n this._state.start = [node];\n\n this._state.nodes.push(node);\n if (!node.outputs.length) {\n this._state.tail.push(node);\n }\n }\n\n // Insert loose block\n _insert(block) {\n const { node } = block;\n this._graph.add(node);\n\n this._state.start.push(node);\n this._state.end.push(node);\n\n this._state.nodes.push(node);\n if (!node.outputs.length) {\n return this._state.tail.push(node);\n }\n }\n}\n\nclass State {\n constructor(op = null, multi, start, end, nodes, tail) {\n this.op = op;\n if (multi == null) {\n multi = false;\n }\n this.multi = multi;\n if (start == null) {\n start = [];\n }\n this.start = start;\n if (end == null) {\n end = [];\n }\n this.end = end;\n if (nodes == null) {\n nodes = [];\n }\n this.nodes = nodes;\n if (tail == null) {\n tail = [];\n }\n this.tail = tail;\n }\n}\n","/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as Visualize from \"../visualize\";\n\nlet debug = false;\n\nconst tick = function () {\n const now = +new Date();\n return function (label) {\n const delta = +new Date() - now;\n console.log(label, delta + \" ms\");\n return delta;\n };\n};\n\nexport class Material {\n constructor(vertex, fragment) {\n this.vertex = vertex;\n this.fragment = fragment;\n if (debug) {\n this.tock = tick();\n }\n }\n\n build(options) {\n return this.link(options);\n }\n\n link(options) {\n if (options == null) {\n options = {};\n }\n const uniforms = {};\n const varyings = {};\n const attributes = {};\n\n const vertex = this.vertex.link(\"main\");\n const fragment = this.fragment.link(\"main\");\n\n for (let shader of [vertex, fragment]) {\n var key, value;\n for (key in shader.uniforms) {\n value = shader.uniforms[key];\n uniforms[key] = value;\n }\n for (key in shader.varyings) {\n value = shader.varyings[key];\n varyings[key] = value;\n }\n for (key in shader.attributes) {\n value = shader.attributes[key];\n attributes[key] = value;\n }\n }\n\n options.vertexShader = vertex.code;\n options.vertexGraph = vertex.graph;\n options.fragmentShader = fragment.code;\n options.fragmentGraph = fragment.graph;\n options.attributes = attributes;\n options.uniforms = uniforms;\n options.varyings = varyings;\n options.inspect = () =>\n Visualize.inspect(\n \"Vertex Shader\",\n vertex,\n \"Fragment Shader\",\n fragment.graph\n );\n\n if (debug) {\n this.tock(\"Material build\");\n }\n\n return options;\n }\n\n inspect() {\n return Visualize.inspect(\n \"Vertex Shader\",\n this.vertex,\n \"Fragment Shader\",\n this.fragment.graph\n );\n }\n}\n","/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n/*\n Snippet library\n\n Takes:\n - Hash of snippets: named library\n - (name) -> getter: dynamic lookup\n - nothing: no library, only pass in inline source code\n\n If 'name' contains any of \"{;(#\" it is assumed to be direct GLSL code.\n*/\nexport const library = function (language, snippets, load) {\n let callback = null;\n let used = {};\n\n if (snippets != null) {\n if (typeof snippets === \"function\") {\n callback = (name) => load(language, name, snippets(name));\n } else if (typeof snippets === \"object\") {\n callback = function (name) {\n if (snippets[name] == null) {\n throw new Error(`Unknown snippet \\`${name}\\``);\n }\n return load(language, name, snippets[name]);\n };\n }\n }\n\n const inline = (code) => load(language, \"\", code);\n\n if (callback == null) {\n return inline;\n }\n\n const fetch = function (name) {\n if (name.match(/[{;]/)) {\n return inline(name);\n }\n used[name] = true;\n return callback(name);\n };\n\n fetch.used = function (_used) {\n if (_used == null) {\n _used = used;\n }\n return (used = _used);\n };\n\n return fetch;\n};\n","/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n// Least-recently-used queue for key expiry via linked list\nexport const queue = function (limit) {\n if (limit == null) {\n limit = 100;\n }\n const map = {};\n\n let head = null;\n let tail = null;\n let count = 0;\n\n // Insert at front\n const add = function (item) {\n item.prev = null;\n item.next = head;\n\n if (head != null) {\n head.prev = item;\n }\n\n head = item;\n if (tail == null) {\n return (tail = item);\n }\n };\n\n // Remove from list\n const remove = function (item) {\n const { prev } = item;\n const { next } = item;\n\n if (prev != null) {\n prev.next = next;\n }\n if (next != null) {\n next.prev = prev;\n }\n\n if (head === item) {\n head = next;\n }\n if (tail === item) {\n return (tail = prev);\n }\n };\n\n // Push key to top of list\n return function (key) {\n let dead, item;\n if ((item = map[key]) && item !== head) {\n // Already in queue\n remove(item);\n add(item);\n } else {\n // Check capacity\n if (count === limit) {\n // Pop tail\n dead = tail.key;\n remove(tail);\n\n // Expire key\n delete map[dead];\n } else {\n count++;\n }\n\n // Replace head\n item = { next: head, prev: null, key };\n add(item);\n\n // Map record for lookup\n map[key] = item;\n }\n\n // Return expired key\n return dead;\n };\n};\n","/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n/*\n Cache decorator\n Fetches snippets once, clones for reuse\n Inline code is hashed to avoid bloat\n*/\nimport { queue } from \"./queue\";\nimport { hash } from \"./hash\";\n\nexport const cache = function (fetch) {\n const cached = {};\n const push = queue(100);\n\n // Snippet factory\n return function (name) {\n const key = name.length > 32 ? \"##\" + hash(name).toString(16) : name;\n\n // Push new key onto queue, see if an old key expired\n const expire = push(key);\n if (expire != null) {\n delete cached[expire];\n }\n\n // Clone cached snippet\n if (cached[key] == null) {\n cached[key] = fetch(name);\n }\n return cached[key].clone();\n };\n};\n","export * from \"./factory\";\nexport * from \"./material\";\n\nexport * from \"./library\";\nexport * from \"./cache\";\nexport * from \"./queue\";\nexport * from \"./hash\";\n","/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n/*\n Compile snippet back into GLSL, but with certain symbols replaced by prefixes / placeholders\n*/\n\nexport const compile = function (program) {\n const { code, signatures } = program;\n\n // Prepare list of placeholders\n const placeholders = replaced(signatures);\n\n // Compile\n const assembler = string_compiler(code, placeholders);\n\n return [signatures, assembler];\n};\n\nvar replaced = function (signatures) {\n const out = {};\n const s = (sig) => (out[sig.name] = true);\n\n s(signatures.main);\n\n // Prefix all global symbols\n for (let key of [\"external\", \"internal\", \"varying\", \"uniform\", \"attribute\"]) {\n for (let sig of signatures[key]) {\n s(sig);\n }\n }\n\n return out;\n};\n\n/*\nString-replacement based compiler\n*/\nvar string_compiler = function (code, placeholders) {\n // Make regexp for finding placeholders\n // Replace on word boundaries\n let key;\n const re = new RegExp(\n \"\\\\b(\" +\n (() => {\n const result = [];\n for (key in placeholders) {\n result.push(key);\n }\n return result;\n })().join(\"|\") +\n \")\\\\b\",\n \"g\"\n );\n\n // Strip comments\n code = code.replace(/\\/\\/[^\\n]*/g, \"\");\n code = code.replace(/\\/\\*([^*]|\\*[^/])*\\*\\//g, \"\");\n\n // Strip all preprocessor commands (lazy)\n //code = code.replace /^#[^\\n]*/mg, ''\n\n // Assembler function that takes namespace prefix and exceptions\n // and returns GLSL source code\n return function (prefix, exceptions, defines) {\n let key;\n if (prefix == null) {\n prefix = \"\";\n }\n if (exceptions == null) {\n exceptions = {};\n }\n if (defines == null) {\n defines = {};\n }\n const replace = {};\n for (key in placeholders) {\n replace[key] = exceptions[key] != null ? key : prefix + key;\n }\n\n const compiled = code.replace(re, (key) => replace[key]);\n\n const defs = (() => {\n const result1 = [];\n for (key in defines) {\n const value = defines[key];\n result1.push(`#define ${key} ${value}`);\n }\n return result1;\n })();\n if (defs.length) {\n defs.push(\"\");\n }\n return defs.join(\"\\n\") + compiled;\n };\n};\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n// AST node parsers\n\nimport { Vector2 } from \"three/src/math/Vector2.js\";\nimport { Vector3 } from \"three/src/math/Vector3.js\";\nimport { Vector4 } from \"three/src/math/Vector4.js\";\nimport { Matrix3 } from \"three/src/math/Matrix3.js\";\nimport { Matrix4 } from \"three/src/math/Matrix4.js\";\n\nexport let decl = {};\n\ndecl.in = 0;\ndecl.out = 1;\ndecl.inout = 2;\n\nconst get = (n) => n.token.data;\n\ndecl.node = function (node) {\n if (\n (node.children[5] != null ? node.children[5].type : undefined) ===\n \"function\"\n ) {\n return decl.function(node);\n } else if ((node.token != null ? node.token.type : undefined) === \"keyword\") {\n return decl.external(node);\n }\n};\n\ndecl.external = function (node) {\n // console.log 'external', node\n let c = node.children;\n\n let storage = get(c[1]);\n const type = get(c[4]);\n const list = c[5];\n\n if (![\"attribute\", \"uniform\", \"varying\"].includes(storage)) {\n storage = \"global\";\n }\n\n const out = [];\n\n for (let i = 0; i < list.children.length; i++) {\n c = list.children[i];\n if (c.type === \"ident\") {\n const ident = get(c);\n const next = list.children[i + 1];\n const quant = (next != null ? next.type : undefined) === \"quantifier\";\n\n out.push({\n decl: \"external\",\n storage,\n type,\n ident,\n quant: !!quant,\n count: quant,\n });\n }\n }\n\n return out;\n};\n\ndecl.function = function (node) {\n const c = node.children;\n\n // console.log 'function', node\n\n const storage = get(c[1]);\n const type = get(c[4]);\n const func = c[5];\n const ident = get(func.children[0]);\n const args = func.children[1];\n const body = func.children[2];\n\n const decls = Array.from(args.children).map((child) => decl.argument(child));\n\n return [\n {\n decl: \"function\",\n storage,\n type,\n ident,\n body: !!body,\n args: decls,\n },\n ];\n};\n\ndecl.argument = function (node) {\n const c = node.children;\n\n // console.log 'argument', node\n\n const storage = get(c[1]);\n const inout = get(c[2]);\n const type = get(c[4]);\n const list = c[5];\n const ident = get(list.children[0]);\n const quant = list.children[1];\n\n const count = quant ? quant.children[0].token.data : undefined;\n\n return {\n decl: \"argument\",\n storage,\n inout,\n type,\n ident,\n quant: !!quant,\n count,\n };\n};\n\ndecl.param = function (dir, storage, spec, quant, count) {\n let prefix = [];\n if (storage != null) {\n prefix.push(storage);\n }\n if (spec != null) {\n prefix.push(spec);\n }\n prefix.push(\"\");\n\n prefix = prefix.join(\" \");\n const suffix = quant ? \"[\" + count + \"]\" : \"\";\n if (dir !== \"\") {\n dir += \" \";\n }\n\n const f = (name, long) => (long ? dir : \"\") + `${prefix}${name}${suffix}`;\n f.split = (dir) => decl.param(dir, storage, spec, quant, count);\n\n return f;\n};\n\n// Three.js sugar\nconst win = typeof window !== \"undefined\";\nconst threejs = win && !!window.THREE;\n\nconst defaults = {\n int: 0,\n float: 0,\n vec2: threejs ? Vector2 : null,\n vec3: threejs ? Vector3 : null,\n vec4: threejs ? Vector4 : null,\n mat2: null,\n mat3: threejs ? Matrix3 : null,\n mat4: threejs ? Matrix4 : null,\n sampler2D: 0,\n samplerCube: 0,\n};\n\nconst three = {\n int: \"i\",\n float: \"f\",\n vec2: \"v2\",\n vec3: \"v3\",\n vec4: \"v4\",\n mat2: \"m2\",\n mat3: \"m3\",\n mat4: \"m4\",\n sampler2D: \"t\",\n samplerCube: \"t\",\n};\n\ndecl.type = function (name, spec, quant, count, dir, storage) {\n const dirs = {\n in: decl.in,\n out: decl.out,\n inout: decl.inout,\n };\n\n const storages = { const: \"const\" };\n\n let type = three[spec];\n if (quant) {\n type += \"v\";\n }\n\n let value = defaults[spec];\n if (value != null ? value.call : undefined) {\n value = new value();\n }\n if (quant) {\n value = [value];\n }\n\n const inout = dirs[dir] != null ? dirs[dir] : dirs.in;\n storage = storages[storage];\n\n const param = decl.param(dir, storage, spec, quant, count);\n return new Definition(name, type, spec, param, value, inout);\n};\n\nclass Definition {\n constructor(name, type, spec, param, value, inout, meta) {\n this.name = name;\n this.type = type;\n this.spec = spec;\n this.param = param;\n this.value = value;\n this.inout = inout;\n this.meta = meta;\n }\n\n split() {\n // Split inouts\n const isIn = this.meta.shadowed != null;\n const dir = isIn ? \"in\" : \"out\";\n const inout = isIn ? decl.in : decl.out;\n const param = this.param.split(dir);\n return new Definition(\n this.name,\n this.type,\n this.spec,\n param,\n this.value,\n inout\n );\n }\n\n copy(name, meta) {\n return new Definition(\n name != null ? name : this.name,\n this.type,\n this.spec,\n this.param,\n this.value,\n this.inout,\n meta\n );\n }\n}\n","export const SHADOW_ARG = \"_i_o\";\nexport const RETURN_ARG = \"return\";\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS201: Simplify complex destructure assignments\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport tokenize from \"glsl-tokenizer/string\";\nimport parser from \"glsl-parser/direct\";\nimport { decl } from \"./decl\";\nimport { SHADOW_ARG, RETURN_ARG } from \"./constants\";\n\nlet debug = false;\n\n/*\nparse GLSL into AST\nextract all global symbols and make type signatures\n*/\n// Parse a GLSL snippet\nexport const parse = function (name, code) {\n const ast = parseGLSL(name, code);\n return processAST(ast, code);\n};\n\n// Parse GLSL language into AST\nvar parseGLSL = function (name, code) {\n let ast, tock;\n let errors = [];\n if (debug) {\n tock = tick();\n }\n\n try {\n const tokens = tokenize(code);\n ast = parser(tokens);\n } catch (e) {\n errors = [{ message: e }];\n }\n\n if (debug) {\n tock(\"GLSL Tokenize & Parse\");\n }\n\n const fmt = function (code) {\n code = code.split(\"\\n\");\n const max = (\"\" + code.length).length;\n const pad = function (v) {\n if ((v = \"\" + v).length < max) {\n return (\" \" + v).slice(-max);\n } else {\n return v;\n }\n };\n return code.map((line, i) => `${pad(i + 1)}: ${line}`).join(\"\\n\");\n };\n\n if (!ast || errors.length) {\n if (!name) {\n name = \"(inline code)\";\n }\n console.warn(fmt(code));\n for (let error of errors) {\n console.error(`${name} -`, error.message);\n }\n throw new Error(\"GLSL parse error\");\n }\n\n return ast;\n};\n\n// Process AST for compilation\nvar processAST = function (ast, code) {\n let tock;\n if (debug) {\n tock = tick();\n }\n\n // Walk AST tree and collect global declarations\n const symbols = [];\n walk(mapSymbols, collect(symbols), ast, \"\");\n\n // Sort symbols into bins\n const [main, internals, externals] = Array.from(sortSymbols(symbols));\n\n // Extract storage/type signatures of symbols\n const signatures = extractSignatures(main, internals, externals);\n\n if (debug) {\n tock(\"GLSL AST\");\n }\n\n return { ast, code, signatures };\n};\n\n// Extract functions and external symbols from AST\nvar mapSymbols = function (node, collect) {\n switch (node.type) {\n case \"decl\":\n collect(decl.node(node));\n return false;\n }\n return true;\n};\n\nconst collect = (out) =>\n function (value) {\n if (value != null) {\n Array.from(value).map((obj) => out.push(obj));\n }\n };\n\n// Identify internals, externals and main function\nvar sortSymbols = function (symbols) {\n let main = null;\n const internals = [];\n let externals = [];\n const maybe = {};\n let found = false;\n\n for (var s of Array.from(symbols)) {\n if (!s.body) {\n // Unmarked globals are definitely internal\n if (s.storage === \"global\") {\n internals.push(s);\n\n // Possible external\n } else {\n externals.push(s);\n maybe[s.ident] = true;\n }\n } else {\n // Remove earlier forward declaration\n if (maybe[s.ident]) {\n externals = Array.from(externals).filter((e) => e.ident !== s.ident);\n delete maybe[s.ident];\n }\n\n // Internal function\n internals.push(s);\n\n // Last function is main\n // unless there is a function called 'main'\n if (s.ident === \"main\") {\n main = s;\n found = true;\n } else if (!found) {\n main = s;\n }\n }\n }\n\n return [main, internals, externals];\n};\n\n// Generate type signatures and appropriate ins/outs\nvar extractSignatures = function (main, internals, externals) {\n let symbol;\n const sigs = {\n uniform: [],\n attribute: [],\n varying: [],\n external: [],\n internal: [],\n global: [],\n main: null,\n };\n\n const defn = (symbol) =>\n decl.type(\n symbol.ident,\n symbol.type,\n symbol.quant,\n symbol.count,\n symbol.inout,\n symbol.storage\n );\n\n const func = function (symbol, inout) {\n let d;\n const signature = Array.from(symbol.args).map((arg) => defn(arg));\n\n // Split inouts into in and out\n for (d of Array.from(signature)) {\n if (d.inout === decl.inout) {\n const a = d;\n const b = d.copy();\n\n a.inout = decl.in;\n b.inout = decl.out;\n b.meta = { shadow: a.name };\n b.name += SHADOW_ARG;\n a.meta = { shadowed: b.name };\n\n signature.push(b);\n }\n }\n\n // Add output for return type\n if (symbol.type !== \"void\") {\n signature.unshift(decl.type(RETURN_ARG, symbol.type, false, \"\", \"out\"));\n }\n\n // Make type string\n const inTypes = (() => {\n const result = [];\n for (d of Array.from(signature)) {\n if (d.inout === decl.in) {\n result.push(d.type);\n }\n }\n return result;\n })().join(\",\");\n const outTypes = (() => {\n const result1 = [];\n for (d of Array.from(signature)) {\n if (d.inout === decl.out) {\n result1.push(d.type);\n }\n }\n return result1;\n })().join(\",\");\n const type = `(${inTypes})(${outTypes})`;\n\n return {\n name: symbol.ident,\n type,\n signature,\n inout,\n spec: symbol.type,\n };\n };\n\n // Main\n sigs.main = func(main, decl.out);\n\n // Internals (for name replacement only)\n for (symbol of Array.from(internals)) {\n sigs.internal.push({\n name: symbol.ident,\n });\n }\n\n // Externals\n for (symbol of Array.from(externals)) {\n switch (symbol.decl) {\n // Uniforms/attributes/varyings\n case \"external\":\n var def = defn(symbol);\n sigs[symbol.storage].push(def);\n break;\n\n // Callbacks\n case \"function\":\n def = func(symbol, decl.in);\n sigs.external.push(def);\n break;\n }\n }\n\n return sigs;\n};\n\n// Walk AST, apply map and collect values\ndebug = false;\n\nexport var walk = function (map, collect, node, indent) {\n debug &&\n console.log(\n indent,\n node.type,\n node.token != null ? node.token.data : undefined,\n node.token != null ? node.token.type : undefined\n );\n\n const recurse = map(node, collect);\n\n if (recurse) {\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n walk(map, collect, child, indent + \" \", debug);\n }\n }\n\n return null;\n};\n\n// #####\n\nvar tick = function () {\n const now = +new Date();\n return function (label) {\n const delta = +new Date() - now;\n console.log(label, delta + \" ms\");\n return delta;\n };\n};\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as Graph from \"../graph\";\nimport * as $ from \"./constants\";\n\n/*\n GLSL code generator for compiler and linker stubs\n*/\n\n// Check if shadow outlet\nexport function unshadow(name) {\n const real = name.replace($.SHADOW_ARG, \"\");\n if (real !== name) {\n return real;\n } else {\n return null;\n }\n}\n\n// Line joiners\nexport function lines(lines) {\n return lines.join(\"\\n\");\n}\nexport function list(lines) {\n return lines.join(\", \");\n}\nexport function statements(lines) {\n return lines.join(\";\\n\");\n}\n\n// Function body\nexport function body(entry) {\n return {\n entry,\n type: \"void\",\n params: [],\n signature: [],\n return: \"\",\n vars: {},\n calls: [],\n post: [],\n chain: {},\n };\n}\n\n// Symbol define\nexport function define(a, b) {\n return `#define ${a} ${b}`;\n}\n\n// Function define\nexport function fn(type, entry, params, vars, calls) {\n return `${type} ${entry}(${params}) {\\n${vars}${calls}}`;\n}\n\n// Function invocation\nexport function invoke(ret, entry, args) {\n ret = ret ? `${ret} = ` : \"\";\n args = list(args);\n return ` ${ret}${entry}(${args})`;\n}\n\n// Compare two signatures\nexport function same(a, b) {\n for (let i = 0; i < a.length; i++) {\n const A = a[i];\n const B = b[i];\n if (!B) {\n return false;\n }\n if (A.type !== B.type) {\n return false;\n }\n if ((A.name === $.RETURN_ARG) !== (B.name === $.RETURN_ARG)) {\n return false;\n }\n }\n return true;\n}\n\n// Generate call signature for module invocation\nexport function call(lookup, dangling, entry, signature, body) {\n const args = [];\n let ret = \"\";\n\n for (let arg of Array.from(signature)) {\n var id, shadow;\n const { name } = arg;\n\n let copy = (id = lookup(name));\n let other = null;\n let meta = null;\n let omit = false;\n\n const isReturn = name === $.RETURN_ARG;\n\n // Shadowed inout: input side\n if ((shadow = arg.meta != null ? arg.meta.shadowed : undefined)) {\n other = lookup(shadow);\n if (other) {\n body.vars[other] = \" \" + arg.param(other);\n body.calls.push(` ${other} = ${id}`);\n\n if (!dangling(shadow)) {\n arg = arg.split();\n } else {\n meta = { shadowed: other };\n }\n }\n }\n\n // Shadowed inout: output side\n if ((shadow = arg.meta != null ? arg.meta.shadow : undefined)) {\n other = lookup(shadow);\n if (other) {\n if (!dangling(shadow)) {\n arg = arg.split();\n omit = true;\n } else {\n meta = { shadow: other };\n continue;\n }\n }\n }\n\n if (isReturn) {\n // Capture return value\n ret = id;\n } else if (!omit) {\n // Pass all non return, non shadow args in\n args.push(other != null ? other : id);\n }\n\n // Export argument if unconnected\n if (dangling(name)) {\n let op = \"push\";\n if (isReturn) {\n if (body.return === \"\") {\n op = \"unshift\";\n // Preserve 'return' arg name\n copy = name;\n body.type = arg.spec;\n body.return = ` return ${id}`;\n body.vars[id] = \" \" + arg.param(id);\n } else {\n body.vars[id] = \" \" + arg.param(id);\n body.params.push(arg.param(id, true));\n }\n } else {\n body.params.push(arg.param(id, true));\n }\n\n // Copy argument into new signature\n arg = arg.copy(copy, meta);\n body.signature[op](arg);\n } else {\n body.vars[id] = \" \" + arg.param(id);\n }\n }\n\n return body.calls.push(invoke(ret, entry, args));\n}\n\n// Assemble main() function from body and call reference\nexport function build(body, calls) {\n const { entry } = body;\n let code = null;\n\n // Check if we're only calling one snippet with identical signature\n // and not building void main();\n if (calls && calls.length === 1 && entry !== \"main\") {\n const b = calls[0].module;\n\n if (same(body.signature, b.main.signature)) {\n code = define(entry, b.entry);\n }\n }\n\n // Otherwise build function body\n if (code == null) {\n let vars = (() => {\n const result = [];\n for (let v in body.vars) {\n const decl = body.vars[v];\n result.push(decl);\n }\n return result;\n })();\n ({ calls } = body);\n const { post } = body;\n let { params } = body;\n const { type } = body;\n const ret = body.return;\n\n calls = calls.concat(post);\n if (ret !== \"\") {\n calls.push(ret);\n }\n calls.push(\"\");\n\n if (vars.length) {\n vars.push(\"\");\n vars = statements(vars) + \"\\n\";\n } else {\n vars = \"\";\n }\n\n calls = statements(calls);\n params = list(params);\n\n code = fn(type, entry, params, vars, calls);\n }\n\n return {\n signature: body.signature,\n code,\n name: entry,\n };\n}\n\n// Build links to other callbacks\nexport function links(links) {\n const out = {\n defs: [],\n bodies: [],\n };\n\n for (let l of Array.from(links)) {\n link(l, out);\n }\n\n out.defs = lines(out.defs);\n out.bodies = statements(out.bodies);\n\n if (out.defs === \"\") {\n delete out.defs;\n }\n if (out.bodies === \"\") {\n delete out.bodies;\n }\n\n return out;\n}\n\n// Link a module's entry point as a callback\nexport const link = (link, out) => {\n let arg, list;\n const { module, name, external } = link;\n const { main } = module;\n const { entry } = module;\n\n // If signatures match, #define alias for the symbol\n if (same(main.signature, external.signature)) {\n return out.defs.push(define(name, entry));\n }\n\n // Signatures differ, build one-line callback to match defined prototype\n\n // Map names to names\n const ins = [];\n const outs = [];\n let map = {};\n const returnVar = [module.namespace, $.RETURN_ARG].join(\"\");\n\n for (arg of Array.from(external.signature)) {\n list = arg.inout === Graph.IN ? ins : outs;\n list.push(arg);\n }\n\n for (arg of Array.from(main.signature)) {\n list = arg.inout === Graph.IN ? ins : outs;\n const other = list.shift();\n let _name = other.name;\n\n // Avoid 'return' keyword\n if (_name === $.RETURN_ARG) {\n _name = returnVar;\n }\n\n map[arg.name] = _name;\n }\n\n // Build function prototype to invoke the other side\n let _lookup = (name) => map[name];\n const _dangling = () => true;\n\n const inner = body();\n call(_lookup, _dangling, entry, main.signature, inner);\n inner.entry = entry;\n\n // Avoid 'return' keyword\n map = { return: returnVar };\n _lookup = (name) => (map[name] != null ? map[name] : name);\n\n // Build wrapper function for the calling side\n const outer = body();\n call(_lookup, _dangling, entry, external.signature, outer);\n\n outer.calls = inner.calls;\n outer.entry = name;\n\n out.bodies.push(build(inner).code.split(\" {\")[0]);\n return out.bodies.push(build(outer).code);\n};\n\n// Remove all function prototypes to avoid redefinition errors\nexport function defuse(code) {\n // Don't try this at home kids\n const re =\n /([A-Za-z0-9_]+\\s+)?[A-Za-z0-9_]+\\s+[A-Za-z0-9_]+\\s*\\([^)]*\\)\\s*;\\s*/gm;\n const strip = (code) => code.replace(re, (_m) => \"\");\n\n // Split into scopes by braces\n const blocks = code.split(/(?=[{}])/g);\n let level = 0;\n for (let i = 0; i < blocks.length; i++) {\n const b = blocks[i];\n switch (b[0]) {\n case \"{\":\n level++;\n break;\n case \"}\":\n level--;\n break;\n }\n\n // Only mess with top level scope\n if (level === 0) {\n // Preprocessor lines will fuck us up. Split on them.\n const hash = b.split(/^[ \\t]*#/m);\n for (let j = 0; j < hash.length; j++) {\n let line = hash[j];\n if (j > 0) {\n // Trim off preprocessor directive\n line = line.split(/\\n/);\n const head = line.shift();\n const rest = line.join(\"\\n\");\n\n // Process rest\n hash[j] = [head, strip(rest)].join(\"\\n\");\n } else {\n // Process entire line\n hash[j] = strip(line);\n }\n }\n\n // Reassemble\n blocks[i] = hash.join(\"#\");\n }\n }\n\n return (code = blocks.join(\"\"));\n}\n\n// Remove duplicate uniforms / varyings / attributes\nexport function dedupe(code) {\n const map = {};\n const re =\n /((attribute|uniform|varying)\\s+)[A-Za-z0-9_]+\\s+([A-Za-z0-9_]+)\\s*(\\[[^\\]]*\\]\\s*)?;\\s*/gm;\n return code.replace(re, function (m, qual, type, name, _struct) {\n if (map[name]) {\n return \"\";\n }\n map[name] = true;\n return m;\n });\n}\n\n// Move definitions to top so they compile properly\nexport function hoist(code) {\n const filter = function (lines, re) {\n const defs = [];\n const out = [];\n for (let line of Array.from(lines)) {\n const list = line.match(re) ? defs : out;\n list.push(line);\n }\n\n return defs.concat(out);\n };\n\n let lines = code.split(\"\\n\");\n\n // Hoist symbol defines to the top so (re)definitions use the right alias\n lines = filter(lines, /^#define ([^ ]+ _pg_[0-9]+_|_pg_[0-9]+_ [^ ]+)$/);\n\n // Hoist extensions\n lines = filter(lines, /^#extension/);\n\n return lines.join(\"\\n\");\n}\n","export * from \"./compile\";\nexport * from \"./parse\";\nexport * from \"./generate\";\nexport * from \"./constants\";\n","/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Block } from \"./block\";\nimport * as Factory from \"./factory\";\nimport * as GLSL from \"./glsl\";\nimport * as Graph from \"./graph\";\nimport * as Linker from \"./linker\";\nimport * as Visualize from \"./visualize\";\n\nconst { library, cache } = Factory;\nexport const { visualize, inspect } = Visualize;\nconst { Snippet } = Linker;\n\nconst merge = function (a, b = {}) {\n const out = {};\n for (let key in a) {\n out[key] = b[key] || a[key];\n }\n return out;\n};\n\nexport class ShaderGraph {\n constructor(snippets, config) {\n const defaults = {\n globalUniforms: false,\n globalVaryings: true,\n globalAttributes: true,\n globals: [],\n autoInspect: false,\n };\n\n this.config = merge(defaults, config);\n this.fetch = cache(library(GLSL, snippets, Snippet.load));\n }\n\n shader(config) {\n if (config == null) {\n config = {};\n }\n const _config = merge(this.config, config);\n return new Factory.Factory(GLSL, this.fetch, _config);\n }\n\n material(config) {\n return new Factory.Material(this.shader(config), this.shader(config));\n }\n\n inspect(shader) {\n return ShaderGraph.inspect(shader);\n }\n visualize(shader) {\n return ShaderGraph.visualize(shader);\n }\n\n // Static visualization method\n static inspect(shader) {\n return inspect(shader);\n }\n static visualize(shader) {\n return visualize(shader);\n }\n}\n\n// Expose class hierarchy\nShaderGraph.Block = Block;\nShaderGraph.Factory = Factory;\nShaderGraph.GLSL = GLSL;\nShaderGraph.Graph = Graph;\nShaderGraph.Linker = Linker;\nShaderGraph.Visualize = Visualize;\n\nexport function load(snippets, config = {}) {\n return new ShaderGraph(snippets, config);\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as ShaderGraph from \"shadergraph\";\n\nexport const Factory = function (snippets) {\n function fetch(name) {\n // Built-in library\n const s = snippets[name];\n if (s != null) {\n return s;\n }\n\n // Load from