/* eslint-disable */
// gif.worker.js 0.2.0 - https://github.com/jnordberg/gif.js
(function e(t, n, r) {
  function s(o, u) {
    if (!n[o]) {
      if (!t[o]) {
        var a = typeof require == 'function' && require;
        if (!u && a) return a(o, !0);
        if (i) return i(o, !0);
        var f = new Error("Cannot find module '" + o + "'");
        throw ((f.code = 'MODULE_NOT_FOUND'), f);
      }
      var l = (n[o] = {
        exports: {},
      });
      t[o][0].call(
        l.exports,
        function (e) {
          var n = t[o][1][e];
          return s(n ? n : e);
        },
        l,
        l.exports,
        e,
        t,
        n,
        r
      );
    }
    return n[o].exports;
  }
  var i = typeof require == 'function' && require;
  for (var o = 0; o < r.length; o++) s(r[o]);
  return s;
})(
  {
    1: [
      function (require, module, exports) {
        var NeuQuant = require('./TypedNeuQuant.js');
        var LZWEncoder = require('./LZWEncoder.js');

        function ByteArray() {
          this.page = -1;
          this.pages = [];
          this.newPage();
        }
        ByteArray.pageSize = 4096;
        ByteArray.charMap = {};
        for (var i = 0; i < 256; i++) ByteArray.charMap[i] = String.fromCharCode(i);
        ByteArray.prototype.newPage = function () {
          this.pages[++this.page] = new Uint8Array(ByteArray.pageSize);
          this.cursor = 0;
        };
        ByteArray.prototype.getData = function () {
          var rv = '';
          for (var p = 0; p < this.pages.length; p++) {
            for (var i = 0; i < ByteArray.pageSize; i++) {
              rv += ByteArray.charMap[this.pages[p][i]];
            }
          }
          return rv;
        };
        ByteArray.prototype.writeByte = function (val) {
          if (this.cursor >= ByteArray.pageSize) this.newPage();
          this.pages[this.page][this.cursor++] = val;
        };
        ByteArray.prototype.writeUTFBytes = function (string) {
          for (var l = string.length, i = 0; i < l; i++) this.writeByte(string.charCodeAt(i));
        };
        ByteArray.prototype.writeBytes = function (array, offset, length) {
          for (var l = length || array.length, i = offset || 0; i < l; i++)
            this.writeByte(array[i]);
        };

        function GIFEncoder(width, height) {
          this.width = ~~width;
          this.height = ~~height;
          this.transparent = null;
          this.transIndex = 0;
          this.repeat = -1;
          this.delay = 0;
          this.image = null;
          this.pixels = null;
          this.indexedPixels = null;
          this.colorDepth = null;
          this.colorTab = null;
          this.neuQuant = null;
          this.usedEntry = new Array();
          this.palSize = 7;
          this.dispose = -1;
          this.firstFrame = true;
          this.sample = 10;
          this.dither = false;
          this.globalPalette = false;
          this.out = new ByteArray();
        }
        GIFEncoder.prototype.setDelay = function (milliseconds) {
          this.delay = Math.round(milliseconds / 10);
        };
        GIFEncoder.prototype.setFrameRate = function (fps) {
          this.delay = Math.round(100 / fps);
        };
        GIFEncoder.prototype.setDispose = function (disposalCode) {
          if (disposalCode >= 0) this.dispose = disposalCode;
        };
        GIFEncoder.prototype.setRepeat = function (repeat) {
          this.repeat = repeat;
        };
        GIFEncoder.prototype.setTransparent = function (color) {
          this.transparent = color;
        };
        GIFEncoder.prototype.addFrame = function (imageData) {
          this.image = imageData;
          this.colorTab =
            this.globalPalette && this.globalPalette.slice ? this.globalPalette : null;
          this.getImagePixels();
          this.analyzePixels();
          if (this.globalPalette === true) this.globalPalette = this.colorTab;
          if (this.firstFrame) {
            this.writeLSD();
            this.writePalette();
            if (this.repeat >= 0) {
              this.writeNetscapeExt();
            }
          }
          this.writeGraphicCtrlExt();
          this.writeImageDesc();
          if (!this.firstFrame && !this.globalPalette) this.writePalette();
          this.writePixels();
          this.firstFrame = false;
        };
        GIFEncoder.prototype.finish = function () {
          this.out.writeByte(59);
        };
        GIFEncoder.prototype.setQuality = function (quality) {
          if (quality < 1) quality = 1;
          this.sample = quality;
        };
        GIFEncoder.prototype.setDither = function (dither) {
          if (dither === true) dither = 'FloydSteinberg';
          this.dither = dither;
        };
        GIFEncoder.prototype.setGlobalPalette = function (palette) {
          this.globalPalette = palette;
        };
        GIFEncoder.prototype.getGlobalPalette = function () {
          return (
            (this.globalPalette && this.globalPalette.slice && this.globalPalette.slice(0)) ||
            this.globalPalette
          );
        };
        GIFEncoder.prototype.writeHeader = function () {
          this.out.writeUTFBytes('GIF89a');
        };
        GIFEncoder.prototype.analyzePixels = function () {
          if (!this.colorTab) {
            this.neuQuant = new NeuQuant(this.pixels, this.sample);
            this.neuQuant.buildColormap();
            this.colorTab = this.neuQuant.getColormap();
          }
          if (this.dither) {
            this.ditherPixels(
              this.dither.replace('-serpentine', ''),
              this.dither.match(/-serpentine/) !== null
            );
          } else {
            this.indexPixels();
          }
          this.pixels = null;
          this.colorDepth = 8;
          this.palSize = 7;
          if (this.transparent !== null) {
            this.transIndex = this.findClosest(this.transparent, true);
          }
        };
        GIFEncoder.prototype.indexPixels = function (imgq) {
          var nPix = this.pixels.length / 3;
          this.indexedPixels = new Uint8Array(nPix);
          var k = 0;
          for (var j = 0; j < nPix; j++) {
            var index = this.findClosestRGB(
              this.pixels[k++] & 255,
              this.pixels[k++] & 255,
              this.pixels[k++] & 255
            );
            this.usedEntry[index] = true;
            this.indexedPixels[j] = index;
          }
        };
        GIFEncoder.prototype.ditherPixels = function (kernel, serpentine) {
          var kernels = {
            FalseFloydSteinberg: [
              [3 / 8, 1, 0],
              [3 / 8, 0, 1],
              [2 / 8, 1, 1],
            ],
            FloydSteinberg: [
              [7 / 16, 1, 0],
              [3 / 16, -1, 1],
              [5 / 16, 0, 1],
              [1 / 16, 1, 1],
            ],
            Stucki: [
              [8 / 42, 1, 0],
              [4 / 42, 2, 0],
              [2 / 42, -2, 1],
              [4 / 42, -1, 1],
              [8 / 42, 0, 1],
              [4 / 42, 1, 1],
              [2 / 42, 2, 1],
              [1 / 42, -2, 2],
              [2 / 42, -1, 2],
              [4 / 42, 0, 2],
              [2 / 42, 1, 2],
              [1 / 42, 2, 2],
            ],
            Atkinson: [
              [1 / 8, 1, 0],
              [1 / 8, 2, 0],
              [1 / 8, -1, 1],
              [1 / 8, 0, 1],
              [1 / 8, 1, 1],
              [1 / 8, 0, 2],
            ],
          };
          if (!kernel || !kernels[kernel]) {
            throw 'Unknown dithering kernel: ' + kernel;
          }
          var ds = kernels[kernel];
          var index = 0,
            height = this.height,
            width = this.width,
            data = this.pixels;
          var direction = serpentine ? -1 : 1;
          this.indexedPixels = new Uint8Array(this.pixels.length / 3);
          for (var y = 0; y < height; y++) {
            if (serpentine) direction = direction * -1;
            for (
              var x = direction == 1 ? 0 : width - 1, xend = direction == 1 ? width : 0;
              x !== xend;
              x += direction
            ) {
              index = y * width + x;
              var idx = index * 3;
              var r1 = data[idx];
              var g1 = data[idx + 1];
              var b1 = data[idx + 2];
              idx = this.findClosestRGB(r1, g1, b1);
              this.usedEntry[idx] = true;
              this.indexedPixels[index] = idx;
              idx *= 3;
              var r2 = this.colorTab[idx];
              var g2 = this.colorTab[idx + 1];
              var b2 = this.colorTab[idx + 2];
              var er = r1 - r2;
              var eg = g1 - g2;
              var eb = b1 - b2;
              for (
                var i = direction == 1 ? 0 : ds.length - 1, end = direction == 1 ? ds.length : 0;
                i !== end;
                i += direction
              ) {
                var x1 = ds[i][1];
                var y1 = ds[i][2];
                if (x1 + x >= 0 && x1 + x < width && y1 + y >= 0 && y1 + y < height) {
                  var d = ds[i][0];
                  idx = index + x1 + y1 * width;
                  idx *= 3;
                  data[idx] = Math.max(0, Math.min(255, data[idx] + er * d));
                  data[idx + 1] = Math.max(0, Math.min(255, data[idx + 1] + eg * d));
                  data[idx + 2] = Math.max(0, Math.min(255, data[idx + 2] + eb * d));
                }
              }
            }
          }
        };
        GIFEncoder.prototype.findClosest = function (c, used) {
          return this.findClosestRGB((c & 16711680) >> 16, (c & 65280) >> 8, c & 255, used);
        };
        GIFEncoder.prototype.findClosestRGB = function (r, g, b, used) {
          if (this.colorTab === null) return -1;
          if (this.neuQuant && !used) {
            return this.neuQuant.lookupRGB(r, g, b);
          }
          var c = b | (g << 8) | (r << 16);
          var minpos = 0;
          var dmin = 256 * 256 * 256;
          var len = this.colorTab.length;
          for (var i = 0, index = 0; i < len; index++) {
            var dr = r - (this.colorTab[i++] & 255);
            var dg = g - (this.colorTab[i++] & 255);
            var db = b - (this.colorTab[i++] & 255);
            var d = dr * dr + dg * dg + db * db;
            if ((!used || this.usedEntry[index]) && d < dmin) {
              dmin = d;
              minpos = index;
            }
          }
          return minpos;
        };
        GIFEncoder.prototype.getImagePixels = function () {
          var w = this.width;
          var h = this.height;
          this.pixels = new Uint8Array(w * h * 3);
          var data = this.image;
          var srcPos = 0;
          var count = 0;
          for (var i = 0; i < h; i++) {
            for (var j = 0; j < w; j++) {
              this.pixels[count++] = data[srcPos++];
              this.pixels[count++] = data[srcPos++];
              this.pixels[count++] = data[srcPos++];
              srcPos++;
            }
          }
        };
        GIFEncoder.prototype.writeGraphicCtrlExt = function () {
          this.out.writeByte(33);
          this.out.writeByte(249);
          this.out.writeByte(4);
          var transp, disp;
          if (this.transparent === null) {
            transp = 0;
            disp = 0;
          } else {
            transp = 1;
            disp = 2;
          }
          if (this.dispose >= 0) {
            disp = dispose & 7;
          }
          disp <<= 2;
          this.out.writeByte(0 | disp | 0 | transp);
          this.writeShort(this.delay);
          this.out.writeByte(this.transIndex);
          this.out.writeByte(0);
        };
        GIFEncoder.prototype.writeImageDesc = function () {
          this.out.writeByte(44);
          this.writeShort(0);
          this.writeShort(0);
          this.writeShort(this.width);
          this.writeShort(this.height);
          if (this.firstFrame || this.globalPalette) {
            this.out.writeByte(0);
          } else {
            this.out.writeByte(128 | 0 | 0 | 0 | this.palSize);
          }
        };
        GIFEncoder.prototype.writeLSD = function () {
          this.writeShort(this.width);
          this.writeShort(this.height);
          this.out.writeByte(128 | 112 | 0 | this.palSize);
          this.out.writeByte(0);
          this.out.writeByte(0);
        };
        GIFEncoder.prototype.writeNetscapeExt = function () {
          this.out.writeByte(33);
          this.out.writeByte(255);
          this.out.writeByte(11);
          this.out.writeUTFBytes('NETSCAPE2.0');
          this.out.writeByte(3);
          this.out.writeByte(1);
          this.writeShort(this.repeat);
          this.out.writeByte(0);
        };
        GIFEncoder.prototype.writePalette = function () {
          this.out.writeBytes(this.colorTab);
          var n = 3 * 256 - this.colorTab.length;
          for (var i = 0; i < n; i++) this.out.writeByte(0);
        };
        GIFEncoder.prototype.writeShort = function (pValue) {
          this.out.writeByte(pValue & 255);
          this.out.writeByte((pValue >> 8) & 255);
        };
        GIFEncoder.prototype.writePixels = function () {
          var enc = new LZWEncoder(this.width, this.height, this.indexedPixels, this.colorDepth);
          enc.encode(this.out);
        };
        GIFEncoder.prototype.stream = function () {
          return this.out;
        };
        module.exports = GIFEncoder;
      },
      {
        './LZWEncoder.js': 2,
        './TypedNeuQuant.js': 3,
      },
    ],
    2: [
      function (require, module, exports) {
        var EOF = -1;
        var BITS = 12;
        var HSIZE = 5003;
        var masks = [
          0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535,
        ];

        function LZWEncoder(width, height, pixels, colorDepth) {
          var initCodeSize = Math.max(2, colorDepth);
          var accum = new Uint8Array(256);
          var htab = new Int32Array(HSIZE);
          var codetab = new Int32Array(HSIZE);
          var cur_accum,
            cur_bits = 0;
          var a_count;
          var free_ent = 0;
          var maxcode;
          var clear_flg = false;
          var g_init_bits, ClearCode, EOFCode;

          function char_out(c, outs) {
            accum[a_count++] = c;
            if (a_count >= 254) flush_char(outs);
          }

          function cl_block(outs) {
            cl_hash(HSIZE);
            free_ent = ClearCode + 2;
            clear_flg = true;
            output(ClearCode, outs);
          }

          function cl_hash(hsize) {
            for (var i = 0; i < hsize; ++i) htab[i] = -1;
          }

          function compress(init_bits, outs) {
            var fcode, c, i, ent, disp, hsize_reg, hshift;
            g_init_bits = init_bits;
            clear_flg = false;
            n_bits = g_init_bits;
            maxcode = MAXCODE(n_bits);
            ClearCode = 1 << (init_bits - 1);
            EOFCode = ClearCode + 1;
            free_ent = ClearCode + 2;
            a_count = 0;
            ent = nextPixel();
            hshift = 0;
            for (fcode = HSIZE; fcode < 65536; fcode *= 2) ++hshift;
            hshift = 8 - hshift;
            hsize_reg = HSIZE;
            cl_hash(hsize_reg);
            output(ClearCode, outs);
            outer_loop: while ((c = nextPixel()) != EOF) {
              fcode = (c << BITS) + ent;
              i = (c << hshift) ^ ent;
              if (htab[i] === fcode) {
                ent = codetab[i];
                continue;
              } else if (htab[i] >= 0) {
                disp = hsize_reg - i;
                if (i === 0) disp = 1;
                do {
                  if ((i -= disp) < 0) i += hsize_reg;
                  if (htab[i] === fcode) {
                    ent = codetab[i];
                    continue outer_loop;
                  }
                } while (htab[i] >= 0);
              }
              output(ent, outs);
              ent = c;
              if (free_ent < 1 << BITS) {
                codetab[i] = free_ent++;
                htab[i] = fcode;
              } else {
                cl_block(outs);
              }
            }
            output(ent, outs);
            output(EOFCode, outs);
          }

          function encode(outs) {
            outs.writeByte(initCodeSize);
            remaining = width * height;
            curPixel = 0;
            compress(initCodeSize + 1, outs);
            outs.writeByte(0);
          }

          function flush_char(outs) {
            if (a_count > 0) {
              outs.writeByte(a_count);
              outs.writeBytes(accum, 0, a_count);
              a_count = 0;
            }
          }

          function MAXCODE(n_bits) {
            return (1 << n_bits) - 1;
          }

          function nextPixel() {
            if (remaining === 0) return EOF;
            --remaining;
            var pix = pixels[curPixel++];
            return pix & 255;
          }

          function output(code, outs) {
            cur_accum &= masks[cur_bits];
            if (cur_bits > 0) cur_accum |= code << cur_bits;
            else cur_accum = code;
            cur_bits += n_bits;
            while (cur_bits >= 8) {
              char_out(cur_accum & 255, outs);
              cur_accum >>= 8;
              cur_bits -= 8;
            }
            if (free_ent > maxcode || clear_flg) {
              if (clear_flg) {
                maxcode = MAXCODE((n_bits = g_init_bits));
                clear_flg = false;
              } else {
                ++n_bits;
                if (n_bits == BITS) maxcode = 1 << BITS;
                else maxcode = MAXCODE(n_bits);
              }
            }
            if (code == EOFCode) {
              while (cur_bits > 0) {
                char_out(cur_accum & 255, outs);
                cur_accum >>= 8;
                cur_bits -= 8;
              }
              flush_char(outs);
            }
          }
          this.encode = encode;
        }
        module.exports = LZWEncoder;
      },
      {},
    ],
    3: [
      function (require, module, exports) {
        var ncycles = 100;
        var netsize = 256;
        var maxnetpos = netsize - 1;
        var netbiasshift = 4;
        var intbiasshift = 16;
        var intbias = 1 << intbiasshift;
        var gammashift = 10;
        var gamma = 1 << gammashift;
        var betashift = 10;
        var beta = intbias >> betashift;
        var betagamma = intbias << (gammashift - betashift);
        var initrad = netsize >> 3;
        var radiusbiasshift = 6;
        var radiusbias = 1 << radiusbiasshift;
        var initradius = initrad * radiusbias;
        var radiusdec = 30;
        var alphabiasshift = 10;
        var initalpha = 1 << alphabiasshift;
        var alphadec;
        var radbiasshift = 8;
        var radbias = 1 << radbiasshift;
        var alpharadbshift = alphabiasshift + radbiasshift;
        var alpharadbias = 1 << alpharadbshift;
        var prime1 = 499;
        var prime2 = 491;
        var prime3 = 487;
        var prime4 = 503;
        var minpicturebytes = 3 * prime4;

        function NeuQuant(pixels, samplefac) {
          var network;
          var netindex;
          var bias;
          var freq;
          var radpower;

          function init() {
            network = [];
            netindex = new Int32Array(256);
            bias = new Int32Array(netsize);
            freq = new Int32Array(netsize);
            radpower = new Int32Array(netsize >> 3);
            var i, v;
            for (i = 0; i < netsize; i++) {
              v = (i << (netbiasshift + 8)) / netsize;
              network[i] = new Float64Array([v, v, v, 0]);
              freq[i] = intbias / netsize;
              bias[i] = 0;
            }
          }

          function unbiasnet() {
            for (var i = 0; i < netsize; i++) {
              network[i][0] >>= netbiasshift;
              network[i][1] >>= netbiasshift;
              network[i][2] >>= netbiasshift;
              network[i][3] = i;
            }
          }

          function altersingle(alpha, i, b, g, r) {
            network[i][0] -= (alpha * (network[i][0] - b)) / initalpha;
            network[i][1] -= (alpha * (network[i][1] - g)) / initalpha;
            network[i][2] -= (alpha * (network[i][2] - r)) / initalpha;
          }

          function alterneigh(radius, i, b, g, r) {
            var lo = Math.abs(i - radius);
            var hi = Math.min(i + radius, netsize);
            var j = i + 1;
            var k = i - 1;
            var m = 1;
            var p, a;
            while (j < hi || k > lo) {
              a = radpower[m++];
              if (j < hi) {
                p = network[j++];
                p[0] -= (a * (p[0] - b)) / alpharadbias;
                p[1] -= (a * (p[1] - g)) / alpharadbias;
                p[2] -= (a * (p[2] - r)) / alpharadbias;
              }
              if (k > lo) {
                p = network[k--];
                p[0] -= (a * (p[0] - b)) / alpharadbias;
                p[1] -= (a * (p[1] - g)) / alpharadbias;
                p[2] -= (a * (p[2] - r)) / alpharadbias;
              }
            }
          }

          function contest(b, g, r) {
            var bestd = ~(1 << 31);
            var bestbiasd = bestd;
            var bestpos = -1;
            var bestbiaspos = bestpos;
            var i, n, dist, biasdist, betafreq;
            for (i = 0; i < netsize; i++) {
              n = network[i];
              dist = Math.abs(n[0] - b) + Math.abs(n[1] - g) + Math.abs(n[2] - r);
              if (dist < bestd) {
                bestd = dist;
                bestpos = i;
              }
              biasdist = dist - (bias[i] >> (intbiasshift - netbiasshift));
              if (biasdist < bestbiasd) {
                bestbiasd = biasdist;
                bestbiaspos = i;
              }
              betafreq = freq[i] >> betashift;
              freq[i] -= betafreq;
              bias[i] += betafreq << gammashift;
            }
            freq[bestpos] += beta;
            bias[bestpos] -= betagamma;
            return bestbiaspos;
          }

          function inxbuild() {
            var i,
              j,
              p,
              q,
              smallpos,
              smallval,
              previouscol = 0,
              startpos = 0;
            for (i = 0; i < netsize; i++) {
              p = network[i];
              smallpos = i;
              smallval = p[1];
              for (j = i + 1; j < netsize; j++) {
                q = network[j];
                if (q[1] < smallval) {
                  smallpos = j;
                  smallval = q[1];
                }
              }
              q = network[smallpos];
              if (i != smallpos) {
                j = q[0];
                q[0] = p[0];
                p[0] = j;
                j = q[1];
                q[1] = p[1];
                p[1] = j;
                j = q[2];
                q[2] = p[2];
                p[2] = j;
                j = q[3];
                q[3] = p[3];
                p[3] = j;
              }
              if (smallval != previouscol) {
                netindex[previouscol] = (startpos + i) >> 1;
                for (j = previouscol + 1; j < smallval; j++) netindex[j] = i;
                previouscol = smallval;
                startpos = i;
              }
            }
            netindex[previouscol] = (startpos + maxnetpos) >> 1;
            for (j = previouscol + 1; j < 256; j++) netindex[j] = maxnetpos;
          }

          function inxsearch(b, g, r) {
            var a, p, dist;
            var bestd = 1e3;
            var best = -1;
            var i = netindex[g];
            var j = i - 1;
            while (i < netsize || j >= 0) {
              if (i < netsize) {
                p = network[i];
                dist = p[1] - g;
                if (dist >= bestd) i = netsize;
                else {
                  i++;
                  if (dist < 0) dist = -dist;
                  a = p[0] - b;
                  if (a < 0) a = -a;
                  dist += a;
                  if (dist < bestd) {
                    a = p[2] - r;
                    if (a < 0) a = -a;
                    dist += a;
                    if (dist < bestd) {
                      bestd = dist;
                      best = p[3];
                    }
                  }
                }
              }
              if (j >= 0) {
                p = network[j];
                dist = g - p[1];
                if (dist >= bestd) j = -1;
                else {
                  j--;
                  if (dist < 0) dist = -dist;
                  a = p[0] - b;
                  if (a < 0) a = -a;
                  dist += a;
                  if (dist < bestd) {
                    a = p[2] - r;
                    if (a < 0) a = -a;
                    dist += a;
                    if (dist < bestd) {
                      bestd = dist;
                      best = p[3];
                    }
                  }
                }
              }
            }
            return best;
          }

          function learn() {
            var i;
            var lengthcount = pixels.length;
            var alphadec = 30 + (samplefac - 1) / 3;
            var samplepixels = lengthcount / (3 * samplefac);
            var delta = ~~(samplepixels / ncycles);
            var alpha = initalpha;
            var radius = initradius;
            var rad = radius >> radiusbiasshift;
            if (rad <= 1) rad = 0;
            for (i = 0; i < rad; i++)
              radpower[i] = alpha * (((rad * rad - i * i) * radbias) / (rad * rad));
            var step;
            if (lengthcount < minpicturebytes) {
              samplefac = 1;
              step = 3;
            } else if (lengthcount % prime1 !== 0) {
              step = 3 * prime1;
            } else if (lengthcount % prime2 !== 0) {
              step = 3 * prime2;
            } else if (lengthcount % prime3 !== 0) {
              step = 3 * prime3;
            } else {
              step = 3 * prime4;
            }
            var b, g, r, j;
            var pix = 0;
            i = 0;
            while (i < samplepixels) {
              b = (pixels[pix] & 255) << netbiasshift;
              g = (pixels[pix + 1] & 255) << netbiasshift;
              r = (pixels[pix + 2] & 255) << netbiasshift;
              j = contest(b, g, r);
              altersingle(alpha, j, b, g, r);
              if (rad !== 0) alterneigh(rad, j, b, g, r);
              pix += step;
              if (pix >= lengthcount) pix -= lengthcount;
              i++;
              if (delta === 0) delta = 1;
              if (i % delta === 0) {
                alpha -= alpha / alphadec;
                radius -= radius / radiusdec;
                rad = radius >> radiusbiasshift;
                if (rad <= 1) rad = 0;
                for (j = 0; j < rad; j++)
                  radpower[j] = alpha * (((rad * rad - j * j) * radbias) / (rad * rad));
              }
            }
          }

          function buildColormap() {
            init();
            learn();
            unbiasnet();
            inxbuild();
          }
          this.buildColormap = buildColormap;

          function getColormap() {
            var map = [];
            var index = [];
            for (var i = 0; i < netsize; i++) index[network[i][3]] = i;
            var k = 0;
            for (var l = 0; l < netsize; l++) {
              var j = index[l];
              map[k++] = network[j][0];
              map[k++] = network[j][1];
              map[k++] = network[j][2];
            }
            return map;
          }
          this.getColormap = getColormap;
          this.lookupRGB = inxsearch;
        }
        module.exports = NeuQuant;
      },
      {},
    ],
    4: [
      function (require, module, exports) {
        var GIFEncoder, renderFrame;
        GIFEncoder = require('./GIFEncoder.js');
        renderFrame = function (frame) {
          var encoder, page, stream, transfer;
          encoder = new GIFEncoder(frame.width, frame.height);
          if (frame.index === 0) {
            encoder.writeHeader();
          } else {
            encoder.firstFrame = false;
          }
          encoder.setTransparent(frame.transparent);
          encoder.setRepeat(frame.repeat);
          encoder.setDelay(frame.delay);
          encoder.setQuality(frame.quality);
          encoder.setDither(frame.dither);
          encoder.setGlobalPalette(frame.globalPalette);
          encoder.addFrame(frame.data);
          if (frame.last) {
            encoder.finish();
          }
          if (frame.globalPalette === true) {
            frame.globalPalette = encoder.getGlobalPalette();
          }
          stream = encoder.stream();
          frame.data = stream.pages;
          frame.cursor = stream.cursor;
          frame.pageSize = stream.constructor.pageSize;
          if (frame.canTransfer) {
            transfer = (function () {
              var i, len, ref, results;
              ref = frame.data;
              results = [];
              for (i = 0, len = ref.length; i < len; i++) {
                page = ref[i];
                results.push(page.buffer);
              }
              return results;
            })();
            return self.postMessage(frame, transfer);
          } else {
            return self.postMessage(frame);
          }
        };
        self.onmessage = function (event) {
          return renderFrame(event.data);
        };
      },
      {
        './GIFEncoder.js': 1,
      },
    ],
  },
  {},
  [4]
);
//# sourceMappingURL=gif.worker.js.map
