Greasy Fork is available in English.

QQ音乐歌单一键下载到本地

QQ音乐歌单一键式本地下载、音乐下载。(注意:使用前请登录qq音乐账号,再下载音乐,若遇到下载失败,请刷新后重试,或者检查网络流畅)使用流程: 进入qq音乐官网https://y.qq.com/n/ryqq。再选择需要下载的歌单播放歌单全部音乐。进入播放界面提示是否下载。点击确认获取本地音乐(歌曲多可能需要一段时间)。等待一段时间后,即可下载歌单内全部音乐。(适用于u盘音响设备,或者车内音响设备音乐下载本地)*****请勿运用到商业用途。若用于商业用途与本人无关。

// ==UserScript==
// @name       QQ音乐歌单一键下载到本地
// @namespace  npm/vite-plugin-monkey
// @version    1.0.0
// @author     lsq_li
// @description QQ音乐歌单一键式本地下载、音乐下载。(注意:使用前请登录qq音乐账号,再下载音乐,若遇到下载失败,请刷新后重试,或者检查网络流畅)使用流程: 进入qq音乐官网https://y.qq.com/n/ryqq。再选择需要下载的歌单播放歌单全部音乐。进入播放界面提示是否下载。点击确认获取本地音乐(歌曲多可能需要一段时间)。等待一段时间后,即可下载歌单内全部音乐。(适用于u盘音响设备,或者车内音响设备音乐下载本地)*****请勿运用到商业用途。若用于商业用途与本人无关。
// @license    GPL License
// @icon       https://vitejs.dev/logo.svg
// @match      https://y.qq.com/n/ryqq/player
// @require    https://cdn.jsdelivr.net/npm/react@18.3.1/umd/react.production.min.js
// @require    https://cdn.jsdelivr.net/npm/react-dom@18.3.1/umd/react-dom.production.min.js
// ==/UserScript==

(function (require$$0, require$$0$1) {
  'use strict';

  var __defProp = Object.defineProperty;
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
  function getDefaultExportFromCjs(x) {
    return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x;
  }
  var jsxRuntime = { exports: {} };
  var reactJsxRuntime_production_min = {};
  /**
   * @license React
   * react-jsx-runtime.production.min.js
   *
   * Copyright (c) Facebook, Inc. and its affiliates.
   *
   * This source code is licensed under the MIT license found in the
   * LICENSE file in the root directory of this source tree.
   */
  var f = require$$0, k = Symbol.for("react.element"), l = Symbol.for("react.fragment"), m$1 = Object.prototype.hasOwnProperty, n = f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner, p = { key: true, ref: true, __self: true, __source: true };
  function q(c, a, g) {
    var b, d = {}, e = null, h = null;
    void 0 !== g && (e = "" + g);
    void 0 !== a.key && (e = "" + a.key);
    void 0 !== a.ref && (h = a.ref);
    for (b in a) m$1.call(a, b) && !p.hasOwnProperty(b) && (d[b] = a[b]);
    if (c && c.defaultProps) for (b in a = c.defaultProps, a) void 0 === d[b] && (d[b] = a[b]);
    return { $$typeof: k, type: c, key: e, ref: h, props: d, _owner: n.current };
  }
  reactJsxRuntime_production_min.Fragment = l;
  reactJsxRuntime_production_min.jsx = q;
  reactJsxRuntime_production_min.jsxs = q;
  {
    jsxRuntime.exports = reactJsxRuntime_production_min;
  }
  var jsxRuntimeExports = jsxRuntime.exports;
  var client = {};
  var m = require$$0$1;
  {
    client.createRoot = m.createRoot;
    client.hydrateRoot = m.hydrateRoot;
  }
  function new_byte$2(count) {
    return new Int8Array(count);
  }
  function new_short(count) {
    return new Int16Array(count);
  }
  function new_int$8(count) {
    return new Int32Array(count);
  }
  function new_float$8(count) {
    return new Float32Array(count);
  }
  function new_double$1(count) {
    return new Float64Array(count);
  }
  function new_float_n$3(args) {
    if (args.length == 1) {
      return new_float$8(args[0]);
    }
    var sz = args[0];
    args = args.slice(1);
    var A = [];
    for (var i = 0; i < sz; i++) {
      A.push(new_float_n$3(args));
    }
    return A;
  }
  function new_int_n$1(args) {
    if (args.length == 1) {
      return new_int$8(args[0]);
    }
    var sz = args[0];
    args = args.slice(1);
    var A = [];
    for (var i = 0; i < sz; i++) {
      A.push(new_int_n$1(args));
    }
    return A;
  }
  function new_short_n(args) {
    if (args.length == 1) {
      return new_short(args[0]);
    }
    var sz = args[0];
    args = args.slice(1);
    var A = [];
    for (var i = 0; i < sz; i++) {
      A.push(new_short_n(args));
    }
    return A;
  }
  function new_array_n(args) {
    if (args.length == 1) {
      return new Array(args[0]);
    }
    var sz = args[0];
    args = args.slice(1);
    var A = [];
    for (var i = 0; i < sz; i++) {
      A.push(new_array_n(args));
    }
    return A;
  }
  var Arrays$3 = {};
  Arrays$3.fill = function(a, fromIndex, toIndex, val) {
    if (arguments.length == 2) {
      for (var i = 0; i < a.length; i++) {
        a[i] = arguments[1];
      }
    } else {
      for (var i = fromIndex; i < toIndex; i++) {
        a[i] = val;
      }
    }
  };
  var System$3 = {};
  System$3.arraycopy = function(src, srcPos, dest, destPos, length) {
    var srcEnd = srcPos + length;
    while (srcPos < srcEnd)
      dest[destPos++] = src[srcPos++];
  };
  System$3.out = {};
  System$3.out.println = function(message) {
    console.log(message);
  };
  System$3.out.printf = function() {
    console.log.apply(console, arguments);
  };
  var Util$2 = {};
  Util$2.SQRT2 = 1.4142135623730951;
  Util$2.FAST_LOG10 = function(x) {
    return Math.log10(x);
  };
  Util$2.FAST_LOG10_X = function(x, y) {
    return Math.log10(x) * y;
  };
  function ShortBlock$2(ordinal) {
    this.ordinal = ordinal;
  }
  ShortBlock$2.short_block_allowed = new ShortBlock$2(0);
  ShortBlock$2.short_block_coupled = new ShortBlock$2(1);
  ShortBlock$2.short_block_dispensed = new ShortBlock$2(2);
  ShortBlock$2.short_block_forced = new ShortBlock$2(3);
  var Float$1 = {};
  Float$1.MAX_VALUE = 34028235e31;
  function VbrMode$2(ordinal) {
    this.ordinal = ordinal;
  }
  VbrMode$2.vbr_off = new VbrMode$2(0);
  VbrMode$2.vbr_mt = new VbrMode$2(1);
  VbrMode$2.vbr_rh = new VbrMode$2(2);
  VbrMode$2.vbr_abr = new VbrMode$2(3);
  VbrMode$2.vbr_mtrh = new VbrMode$2(4);
  VbrMode$2.vbr_default = VbrMode$2.vbr_mtrh;
  var assert$3 = function(x) {
  };
  var common$h = {
    "System": System$3,
    "VbrMode": VbrMode$2,
    "Float": Float$1,
    "ShortBlock": ShortBlock$2,
    "Util": Util$2,
    "Arrays": Arrays$3,
    "new_array_n": new_array_n,
    "new_byte": new_byte$2,
    "new_double": new_double$1,
    "new_float": new_float$8,
    "new_float_n": new_float_n$3,
    "new_int": new_int$8,
    "new_int_n": new_int_n$1,
    "new_short": new_short,
    "new_short_n": new_short_n,
    "assert": assert$3
  };
  function MPEGMode$2(ordinal) {
    var _ordinal = ordinal;
    this.ordinal = function() {
      return _ordinal;
    };
  }
  MPEGMode$2.STEREO = new MPEGMode$2(0);
  MPEGMode$2.JOINT_STEREO = new MPEGMode$2(1);
  MPEGMode$2.DUAL_CHANNEL = new MPEGMode$2(2);
  MPEGMode$2.MONO = new MPEGMode$2(3);
  MPEGMode$2.NOT_SET = new MPEGMode$2(4);
  var MPEGMode_1 = MPEGMode$2;
  var NewMDCT_1;
  var hasRequiredNewMDCT;
  function requireNewMDCT() {
    if (hasRequiredNewMDCT) return NewMDCT_1;
    hasRequiredNewMDCT = 1;
    var common2 = common$h;
    var System2 = common2.System;
    var Util2 = common2.Util;
    var Arrays2 = common2.Arrays;
    var new_float2 = common2.new_float;
    var Encoder2 = requireEncoder();
    function NewMDCT() {
      var enwindow = [
        -477e-9 * 0.740951125354959 / 2384e-9,
        103951e-9 * 0.740951125354959 / 2384e-9,
        953674e-9 * 0.740951125354959 / 2384e-9,
        2841473e-9 * 0.740951125354959 / 2384e-9,
        0.035758972 * 0.740951125354959 / 2384e-9,
        3401756e-9 * 0.740951125354959 / 2384e-9,
        983715e-9 * 0.740951125354959 / 2384e-9,
        99182e-9 * 0.740951125354959 / 2384e-9,
        /* 15 */
        12398e-9 * 0.740951125354959 / 2384e-9,
        191212e-9 * 0.740951125354959 / 2384e-9,
        2283096e-9 * 0.740951125354959 / 2384e-9,
        0.016994476 * 0.740951125354959 / 2384e-9,
        -0.018756866 * 0.740951125354959 / 2384e-9,
        -2630711e-9 * 0.740951125354959 / 2384e-9,
        -247478e-9 * 0.740951125354959 / 2384e-9,
        -14782e-9 * 0.740951125354959 / 2384e-9,
        0.9063471690191471,
        0.1960342806591213,
        -477e-9 * 0.773010453362737 / 2384e-9,
        105858e-9 * 0.773010453362737 / 2384e-9,
        930786e-9 * 0.773010453362737 / 2384e-9,
        2521515e-9 * 0.773010453362737 / 2384e-9,
        0.035694122 * 0.773010453362737 / 2384e-9,
        3643036e-9 * 0.773010453362737 / 2384e-9,
        991821e-9 * 0.773010453362737 / 2384e-9,
        96321e-9 * 0.773010453362737 / 2384e-9,
        /* 14 */
        11444e-9 * 0.773010453362737 / 2384e-9,
        165462e-9 * 0.773010453362737 / 2384e-9,
        2110004e-9 * 0.773010453362737 / 2384e-9,
        0.016112804 * 0.773010453362737 / 2384e-9,
        -0.019634247 * 0.773010453362737 / 2384e-9,
        -2803326e-9 * 0.773010453362737 / 2384e-9,
        -277042e-9 * 0.773010453362737 / 2384e-9,
        -16689e-9 * 0.773010453362737 / 2384e-9,
        0.8206787908286602,
        0.3901806440322567,
        -477e-9 * 0.803207531480645 / 2384e-9,
        107288e-9 * 0.803207531480645 / 2384e-9,
        902653e-9 * 0.803207531480645 / 2384e-9,
        2174854e-9 * 0.803207531480645 / 2384e-9,
        0.035586357 * 0.803207531480645 / 2384e-9,
        3858566e-9 * 0.803207531480645 / 2384e-9,
        995159e-9 * 0.803207531480645 / 2384e-9,
        9346e-8 * 0.803207531480645 / 2384e-9,
        /* 13 */
        10014e-9 * 0.803207531480645 / 2384e-9,
        14019e-8 * 0.803207531480645 / 2384e-9,
        1937389e-9 * 0.803207531480645 / 2384e-9,
        0.015233517 * 0.803207531480645 / 2384e-9,
        -0.020506859 * 0.803207531480645 / 2384e-9,
        -2974033e-9 * 0.803207531480645 / 2384e-9,
        -30756e-8 * 0.803207531480645 / 2384e-9,
        -1812e-8 * 0.803207531480645 / 2384e-9,
        0.7416505462720353,
        0.5805693545089249,
        -477e-9 * 0.831469612302545 / 2384e-9,
        108242e-9 * 0.831469612302545 / 2384e-9,
        868797e-9 * 0.831469612302545 / 2384e-9,
        1800537e-9 * 0.831469612302545 / 2384e-9,
        0.0354352 * 0.831469612302545 / 2384e-9,
        4049301e-9 * 0.831469612302545 / 2384e-9,
        994205e-9 * 0.831469612302545 / 2384e-9,
        90599e-9 * 0.831469612302545 / 2384e-9,
        /* 12 */
        906e-8 * 0.831469612302545 / 2384e-9,
        116348e-9 * 0.831469612302545 / 2384e-9,
        1766682e-9 * 0.831469612302545 / 2384e-9,
        0.014358521 * 0.831469612302545 / 2384e-9,
        -0.021372318 * 0.831469612302545 / 2384e-9,
        -314188e-8 * 0.831469612302545 / 2384e-9,
        -339031e-9 * 0.831469612302545 / 2384e-9,
        -1955e-8 * 0.831469612302545 / 2384e-9,
        0.6681786379192989,
        0.7653668647301797,
        -477e-9 * 0.857728610000272 / 2384e-9,
        108719e-9 * 0.857728610000272 / 2384e-9,
        82922e-8 * 0.857728610000272 / 2384e-9,
        1399517e-9 * 0.857728610000272 / 2384e-9,
        0.035242081 * 0.857728610000272 / 2384e-9,
        421524e-8 * 0.857728610000272 / 2384e-9,
        989437e-9 * 0.857728610000272 / 2384e-9,
        87261e-9 * 0.857728610000272 / 2384e-9,
        /* 11 */
        8106e-9 * 0.857728610000272 / 2384e-9,
        93937e-9 * 0.857728610000272 / 2384e-9,
        1597881e-9 * 0.857728610000272 / 2384e-9,
        0.013489246 * 0.857728610000272 / 2384e-9,
        -0.022228718 * 0.857728610000272 / 2384e-9,
        -3306866e-9 * 0.857728610000272 / 2384e-9,
        -371456e-9 * 0.857728610000272 / 2384e-9,
        -21458e-9 * 0.857728610000272 / 2384e-9,
        0.5993769336819237,
        0.9427934736519954,
        -477e-9 * 0.881921264348355 / 2384e-9,
        108719e-9 * 0.881921264348355 / 2384e-9,
        78392e-8 * 0.881921264348355 / 2384e-9,
        971317e-9 * 0.881921264348355 / 2384e-9,
        0.035007 * 0.881921264348355 / 2384e-9,
        4357815e-9 * 0.881921264348355 / 2384e-9,
        980854e-9 * 0.881921264348355 / 2384e-9,
        83923e-9 * 0.881921264348355 / 2384e-9,
        /* 10 */
        7629e-9 * 0.881921264348355 / 2384e-9,
        72956e-9 * 0.881921264348355 / 2384e-9,
        1432419e-9 * 0.881921264348355 / 2384e-9,
        0.012627602 * 0.881921264348355 / 2384e-9,
        -0.02307415 * 0.881921264348355 / 2384e-9,
        -3467083e-9 * 0.881921264348355 / 2384e-9,
        -404358e-9 * 0.881921264348355 / 2384e-9,
        -23365e-9 * 0.881921264348355 / 2384e-9,
        0.5345111359507916,
        1.111140466039205,
        -954e-9 * 0.903989293123443 / 2384e-9,
        108242e-9 * 0.903989293123443 / 2384e-9,
        731945e-9 * 0.903989293123443 / 2384e-9,
        515938e-9 * 0.903989293123443 / 2384e-9,
        0.034730434 * 0.903989293123443 / 2384e-9,
        4477024e-9 * 0.903989293123443 / 2384e-9,
        968933e-9 * 0.903989293123443 / 2384e-9,
        80585e-9 * 0.903989293123443 / 2384e-9,
        /* 9 */
        6676e-9 * 0.903989293123443 / 2384e-9,
        52929e-9 * 0.903989293123443 / 2384e-9,
        1269817e-9 * 0.903989293123443 / 2384e-9,
        0.011775017 * 0.903989293123443 / 2384e-9,
        -0.023907185 * 0.903989293123443 / 2384e-9,
        -3622532e-9 * 0.903989293123443 / 2384e-9,
        -438213e-9 * 0.903989293123443 / 2384e-9,
        -25272e-9 * 0.903989293123443 / 2384e-9,
        0.4729647758913199,
        1.268786568327291,
        -954e-9 * 0.9238795325112867 / 2384e-9,
        106812e-9 * 0.9238795325112867 / 2384e-9,
        674248e-9 * 0.9238795325112867 / 2384e-9,
        33379e-9 * 0.9238795325112867 / 2384e-9,
        0.034412861 * 0.9238795325112867 / 2384e-9,
        4573822e-9 * 0.9238795325112867 / 2384e-9,
        954151e-9 * 0.9238795325112867 / 2384e-9,
        76771e-9 * 0.9238795325112867 / 2384e-9,
        6199e-9 * 0.9238795325112867 / 2384e-9,
        34332e-9 * 0.9238795325112867 / 2384e-9,
        1111031e-9 * 0.9238795325112867 / 2384e-9,
        0.010933399 * 0.9238795325112867 / 2384e-9,
        -0.024725437 * 0.9238795325112867 / 2384e-9,
        -3771782e-9 * 0.9238795325112867 / 2384e-9,
        -472546e-9 * 0.9238795325112867 / 2384e-9,
        -27657e-9 * 0.9238795325112867 / 2384e-9,
        0.41421356237309503,
        /* tan(PI/8) */
        1.414213562373095,
        -954e-9 * 0.941544065183021 / 2384e-9,
        105381e-9 * 0.941544065183021 / 2384e-9,
        610352e-9 * 0.941544065183021 / 2384e-9,
        -475883e-9 * 0.941544065183021 / 2384e-9,
        0.03405571 * 0.941544065183021 / 2384e-9,
        4649162e-9 * 0.941544065183021 / 2384e-9,
        935555e-9 * 0.941544065183021 / 2384e-9,
        73433e-9 * 0.941544065183021 / 2384e-9,
        /* 7 */
        5245e-9 * 0.941544065183021 / 2384e-9,
        17166e-9 * 0.941544065183021 / 2384e-9,
        956535e-9 * 0.941544065183021 / 2384e-9,
        0.010103703 * 0.941544065183021 / 2384e-9,
        -0.025527 * 0.941544065183021 / 2384e-9,
        -3914356e-9 * 0.941544065183021 / 2384e-9,
        -507355e-9 * 0.941544065183021 / 2384e-9,
        -30041e-9 * 0.941544065183021 / 2384e-9,
        0.3578057213145241,
        1.546020906725474,
        -954e-9 * 0.956940335732209 / 2384e-9,
        10252e-8 * 0.956940335732209 / 2384e-9,
        539303e-9 * 0.956940335732209 / 2384e-9,
        -1011848e-9 * 0.956940335732209 / 2384e-9,
        0.033659935 * 0.956940335732209 / 2384e-9,
        4703045e-9 * 0.956940335732209 / 2384e-9,
        915051e-9 * 0.956940335732209 / 2384e-9,
        70095e-9 * 0.956940335732209 / 2384e-9,
        /* 6 */
        4768e-9 * 0.956940335732209 / 2384e-9,
        954e-9 * 0.956940335732209 / 2384e-9,
        806808e-9 * 0.956940335732209 / 2384e-9,
        9287834e-9 * 0.956940335732209 / 2384e-9,
        -0.026310921 * 0.956940335732209 / 2384e-9,
        -4048824e-9 * 0.956940335732209 / 2384e-9,
        -542164e-9 * 0.956940335732209 / 2384e-9,
        -32425e-9 * 0.956940335732209 / 2384e-9,
        0.3033466836073424,
        1.66293922460509,
        -1431e-9 * 0.970031253194544 / 2384e-9,
        99182e-9 * 0.970031253194544 / 2384e-9,
        462532e-9 * 0.970031253194544 / 2384e-9,
        -1573563e-9 * 0.970031253194544 / 2384e-9,
        0.033225536 * 0.970031253194544 / 2384e-9,
        4737377e-9 * 0.970031253194544 / 2384e-9,
        891685e-9 * 0.970031253194544 / 2384e-9,
        6628e-8 * 0.970031253194544 / 2384e-9,
        /* 5 */
        4292e-9 * 0.970031253194544 / 2384e-9,
        -13828e-9 * 0.970031253194544 / 2384e-9,
        66185e-8 * 0.970031253194544 / 2384e-9,
        8487225e-9 * 0.970031253194544 / 2384e-9,
        -0.02707386 * 0.970031253194544 / 2384e-9,
        -4174709e-9 * 0.970031253194544 / 2384e-9,
        -576973e-9 * 0.970031253194544 / 2384e-9,
        -34809e-9 * 0.970031253194544 / 2384e-9,
        0.2504869601913055,
        1.76384252869671,
        -1431e-9 * 0.98078528040323 / 2384e-9,
        95367e-9 * 0.98078528040323 / 2384e-9,
        378609e-9 * 0.98078528040323 / 2384e-9,
        -2161503e-9 * 0.98078528040323 / 2384e-9,
        0.032754898 * 0.98078528040323 / 2384e-9,
        4752159e-9 * 0.98078528040323 / 2384e-9,
        866413e-9 * 0.98078528040323 / 2384e-9,
        62943e-9 * 0.98078528040323 / 2384e-9,
        /* 4 */
        3815e-9 * 0.98078528040323 / 2384e-9,
        -2718e-8 * 0.98078528040323 / 2384e-9,
        522137e-9 * 0.98078528040323 / 2384e-9,
        7703304e-9 * 0.98078528040323 / 2384e-9,
        -0.027815342 * 0.98078528040323 / 2384e-9,
        -4290581e-9 * 0.98078528040323 / 2384e-9,
        -611782e-9 * 0.98078528040323 / 2384e-9,
        -3767e-8 * 0.98078528040323 / 2384e-9,
        0.198912367379658,
        1.847759065022573,
        -1907e-9 * 0.989176509964781 / 2384e-9,
        90122e-9 * 0.989176509964781 / 2384e-9,
        288486e-9 * 0.989176509964781 / 2384e-9,
        -2774239e-9 * 0.989176509964781 / 2384e-9,
        0.03224802 * 0.989176509964781 / 2384e-9,
        4748821e-9 * 0.989176509964781 / 2384e-9,
        838757e-9 * 0.989176509964781 / 2384e-9,
        59605e-9 * 0.989176509964781 / 2384e-9,
        /* 3 */
        3338e-9 * 0.989176509964781 / 2384e-9,
        -39577e-9 * 0.989176509964781 / 2384e-9,
        388145e-9 * 0.989176509964781 / 2384e-9,
        6937027e-9 * 0.989176509964781 / 2384e-9,
        -0.028532982 * 0.989176509964781 / 2384e-9,
        -4395962e-9 * 0.989176509964781 / 2384e-9,
        -646591e-9 * 0.989176509964781 / 2384e-9,
        -40531e-9 * 0.989176509964781 / 2384e-9,
        0.1483359875383474,
        1.913880671464418,
        -1907e-9 * 0.995184726672197 / 2384e-9,
        844e-7 * 0.995184726672197 / 2384e-9,
        191689e-9 * 0.995184726672197 / 2384e-9,
        -3411293e-9 * 0.995184726672197 / 2384e-9,
        0.03170681 * 0.995184726672197 / 2384e-9,
        4728317e-9 * 0.995184726672197 / 2384e-9,
        809669e-9 * 0.995184726672197 / 2384e-9,
        5579e-8 * 0.995184726672197 / 2384e-9,
        3338e-9 * 0.995184726672197 / 2384e-9,
        -50545e-9 * 0.995184726672197 / 2384e-9,
        259876e-9 * 0.995184726672197 / 2384e-9,
        6189346e-9 * 0.995184726672197 / 2384e-9,
        -0.029224873 * 0.995184726672197 / 2384e-9,
        -4489899e-9 * 0.995184726672197 / 2384e-9,
        -680923e-9 * 0.995184726672197 / 2384e-9,
        -43392e-9 * 0.995184726672197 / 2384e-9,
        0.09849140335716425,
        1.961570560806461,
        -2384e-9 * 0.998795456205172 / 2384e-9,
        77724e-9 * 0.998795456205172 / 2384e-9,
        88215e-9 * 0.998795456205172 / 2384e-9,
        -4072189e-9 * 0.998795456205172 / 2384e-9,
        0.031132698 * 0.998795456205172 / 2384e-9,
        4691124e-9 * 0.998795456205172 / 2384e-9,
        779152e-9 * 0.998795456205172 / 2384e-9,
        52929e-9 * 0.998795456205172 / 2384e-9,
        2861e-9 * 0.998795456205172 / 2384e-9,
        -60558e-9 * 0.998795456205172 / 2384e-9,
        137329e-9 * 0.998795456205172 / 2384e-9,
        546217e-8 * 0.998795456205172 / 2384e-9,
        -0.02989006 * 0.998795456205172 / 2384e-9,
        -4570484e-9 * 0.998795456205172 / 2384e-9,
        -714302e-9 * 0.998795456205172 / 2384e-9,
        -46253e-9 * 0.998795456205172 / 2384e-9,
        0.04912684976946725,
        1.990369453344394,
        0.035780907 * Util2.SQRT2 * 0.5 / 2384e-9,
        0.017876148 * Util2.SQRT2 * 0.5 / 2384e-9,
        3134727e-9 * Util2.SQRT2 * 0.5 / 2384e-9,
        2457142e-9 * Util2.SQRT2 * 0.5 / 2384e-9,
        971317e-9 * Util2.SQRT2 * 0.5 / 2384e-9,
        218868e-9 * Util2.SQRT2 * 0.5 / 2384e-9,
        101566e-9 * Util2.SQRT2 * 0.5 / 2384e-9,
        13828e-9 * Util2.SQRT2 * 0.5 / 2384e-9,
        0.030526638 / 2384e-9,
        4638195e-9 / 2384e-9,
        747204e-9 / 2384e-9,
        49591e-9 / 2384e-9,
        4756451e-9 / 2384e-9,
        21458e-9 / 2384e-9,
        -69618e-9 / 2384e-9
        /* 2.384e-06/2.384e-06 */
      ];
      var NS = 12;
      var NL = 36;
      var win = [
        [
          2382191739347913e-28,
          6423305872147834e-28,
          9400849094049688e-28,
          1122435026096556e-27,
          1183840321267481e-27,
          1122435026096556e-27,
          940084909404969e-27,
          6423305872147839e-28,
          2382191739347918e-28,
          5456116108943412e-27,
          4878985199565852e-27,
          4240448995017367e-27,
          3559909094758252e-27,
          2858043359288075e-27,
          2156177623817898e-27,
          1475637723558783e-27,
          8371015190102974e-28,
          2599706096327376e-28,
          -5456116108943412e-27,
          -4878985199565852e-27,
          -4240448995017367e-27,
          -3559909094758252e-27,
          -2858043359288076e-27,
          -2156177623817898e-27,
          -1475637723558783e-27,
          -8371015190102975e-28,
          -2599706096327376e-28,
          -2382191739347923e-28,
          -6423305872147843e-28,
          -9400849094049696e-28,
          -1122435026096556e-27,
          -1183840321267481e-27,
          -1122435026096556e-27,
          -9400849094049694e-28,
          -642330587214784e-27,
          -2382191739347918e-28
        ],
        [
          2382191739347913e-28,
          6423305872147834e-28,
          9400849094049688e-28,
          1122435026096556e-27,
          1183840321267481e-27,
          1122435026096556e-27,
          9400849094049688e-28,
          6423305872147841e-28,
          2382191739347918e-28,
          5456116108943413e-27,
          4878985199565852e-27,
          4240448995017367e-27,
          3559909094758253e-27,
          2858043359288075e-27,
          2156177623817898e-27,
          1475637723558782e-27,
          8371015190102975e-28,
          2599706096327376e-28,
          -5461314069809755e-27,
          -4921085770524055e-27,
          -4343405037091838e-27,
          -3732668368707687e-27,
          -3093523840190885e-27,
          -2430835727329465e-27,
          -1734679010007751e-27,
          -974825365660928e-27,
          -2797435120168326e-28,
          0,
          0,
          0,
          0,
          0,
          0,
          -2283748241799531e-28,
          -4037858874020686e-28,
          -2146547464825323e-28
        ],
        [
          0.1316524975873958,
          /* win[SHORT_TYPE] */
          0.414213562373095,
          0.7673269879789602,
          1.091308501069271,
          /* tantab_l */
          1.303225372841206,
          1.56968557711749,
          1.920982126971166,
          2.414213562373094,
          3.171594802363212,
          4.510708503662055,
          7.595754112725146,
          22.90376554843115,
          0.984807753012208,
          /* cx */
          0.6427876096865394,
          0.3420201433256688,
          0.9396926207859084,
          -0.1736481776669303,
          -0.7660444431189779,
          0.8660254037844387,
          0.5,
          -0.5144957554275265,
          /* ca */
          -0.4717319685649723,
          -0.3133774542039019,
          -0.1819131996109812,
          -0.09457419252642064,
          -0.04096558288530405,
          -0.01419856857247115,
          -0.003699974673760037,
          0.8574929257125442,
          /* cs */
          0.8817419973177052,
          0.9496286491027329,
          0.9833145924917901,
          0.9955178160675857,
          0.9991605581781475,
          0.999899195244447,
          0.9999931550702802
        ],
        [
          0,
          0,
          0,
          0,
          0,
          0,
          2283748241799531e-28,
          4037858874020686e-28,
          2146547464825323e-28,
          5461314069809755e-27,
          4921085770524055e-27,
          4343405037091838e-27,
          3732668368707687e-27,
          3093523840190885e-27,
          2430835727329466e-27,
          1734679010007751e-27,
          974825365660928e-27,
          2797435120168326e-28,
          -5456116108943413e-27,
          -4878985199565852e-27,
          -4240448995017367e-27,
          -3559909094758253e-27,
          -2858043359288075e-27,
          -2156177623817898e-27,
          -1475637723558782e-27,
          -8371015190102975e-28,
          -2599706096327376e-28,
          -2382191739347913e-28,
          -6423305872147834e-28,
          -9400849094049688e-28,
          -1122435026096556e-27,
          -1183840321267481e-27,
          -1122435026096556e-27,
          -9400849094049688e-28,
          -6423305872147841e-28,
          -2382191739347918e-28
        ]
      ];
      var tantab_l = win[Encoder2.SHORT_TYPE];
      var cx = win[Encoder2.SHORT_TYPE];
      var ca = win[Encoder2.SHORT_TYPE];
      var cs = win[Encoder2.SHORT_TYPE];
      var order = [
        0,
        1,
        16,
        17,
        8,
        9,
        24,
        25,
        4,
        5,
        20,
        21,
        12,
        13,
        28,
        29,
        2,
        3,
        18,
        19,
        10,
        11,
        26,
        27,
        6,
        7,
        22,
        23,
        14,
        15,
        30,
        31
      ];
      function window_subband(x1, x1Pos, a) {
        var wp = 10;
        var x2 = x1Pos + 238 - 14 - 286;
        for (var i = -15; i < 0; i++) {
          var w, s, t;
          w = enwindow[wp + -10];
          s = x1[x2 + -224] * w;
          t = x1[x1Pos + 224] * w;
          w = enwindow[wp + -9];
          s += x1[x2 + -160] * w;
          t += x1[x1Pos + 160] * w;
          w = enwindow[wp + -8];
          s += x1[x2 + -96] * w;
          t += x1[x1Pos + 96] * w;
          w = enwindow[wp + -7];
          s += x1[x2 + -32] * w;
          t += x1[x1Pos + 32] * w;
          w = enwindow[wp + -6];
          s += x1[x2 + 32] * w;
          t += x1[x1Pos + -32] * w;
          w = enwindow[wp + -5];
          s += x1[x2 + 96] * w;
          t += x1[x1Pos + -96] * w;
          w = enwindow[wp + -4];
          s += x1[x2 + 160] * w;
          t += x1[x1Pos + -160] * w;
          w = enwindow[wp + -3];
          s += x1[x2 + 224] * w;
          t += x1[x1Pos + -224] * w;
          w = enwindow[wp + -2];
          s += x1[x1Pos + -256] * w;
          t -= x1[x2 + 256] * w;
          w = enwindow[wp + -1];
          s += x1[x1Pos + -192] * w;
          t -= x1[x2 + 192] * w;
          w = enwindow[wp + 0];
          s += x1[x1Pos + -128] * w;
          t -= x1[x2 + 128] * w;
          w = enwindow[wp + 1];
          s += x1[x1Pos + -64] * w;
          t -= x1[x2 + 64] * w;
          w = enwindow[wp + 2];
          s += x1[x1Pos + 0] * w;
          t -= x1[x2 + 0] * w;
          w = enwindow[wp + 3];
          s += x1[x1Pos + 64] * w;
          t -= x1[x2 + -64] * w;
          w = enwindow[wp + 4];
          s += x1[x1Pos + 128] * w;
          t -= x1[x2 + -128] * w;
          w = enwindow[wp + 5];
          s += x1[x1Pos + 192] * w;
          t -= x1[x2 + -192] * w;
          s *= enwindow[wp + 6];
          w = t - s;
          a[30 + i * 2] = t + s;
          a[31 + i * 2] = enwindow[wp + 7] * w;
          wp += 18;
          x1Pos--;
          x2++;
        }
        {
          var s, t, u, v;
          t = x1[x1Pos + -16] * enwindow[wp + -10];
          s = x1[x1Pos + -32] * enwindow[wp + -2];
          t += (x1[x1Pos + -48] - x1[x1Pos + 16]) * enwindow[wp + -9];
          s += x1[x1Pos + -96] * enwindow[wp + -1];
          t += (x1[x1Pos + -80] + x1[x1Pos + 48]) * enwindow[wp + -8];
          s += x1[x1Pos + -160] * enwindow[wp + 0];
          t += (x1[x1Pos + -112] - x1[x1Pos + 80]) * enwindow[wp + -7];
          s += x1[x1Pos + -224] * enwindow[wp + 1];
          t += (x1[x1Pos + -144] + x1[x1Pos + 112]) * enwindow[wp + -6];
          s -= x1[x1Pos + 32] * enwindow[wp + 2];
          t += (x1[x1Pos + -176] - x1[x1Pos + 144]) * enwindow[wp + -5];
          s -= x1[x1Pos + 96] * enwindow[wp + 3];
          t += (x1[x1Pos + -208] + x1[x1Pos + 176]) * enwindow[wp + -4];
          s -= x1[x1Pos + 160] * enwindow[wp + 4];
          t += (x1[x1Pos + -240] - x1[x1Pos + 208]) * enwindow[wp + -3];
          s -= x1[x1Pos + 224];
          u = s - t;
          v = s + t;
          t = a[14];
          s = a[15] - t;
          a[31] = v + t;
          a[30] = u + s;
          a[15] = u - s;
          a[14] = v - t;
        }
        {
          var xr;
          xr = a[28] - a[0];
          a[0] += a[28];
          a[28] = xr * enwindow[wp + -2 * 18 + 7];
          xr = a[29] - a[1];
          a[1] += a[29];
          a[29] = xr * enwindow[wp + -2 * 18 + 7];
          xr = a[26] - a[2];
          a[2] += a[26];
          a[26] = xr * enwindow[wp + -4 * 18 + 7];
          xr = a[27] - a[3];
          a[3] += a[27];
          a[27] = xr * enwindow[wp + -4 * 18 + 7];
          xr = a[24] - a[4];
          a[4] += a[24];
          a[24] = xr * enwindow[wp + -6 * 18 + 7];
          xr = a[25] - a[5];
          a[5] += a[25];
          a[25] = xr * enwindow[wp + -6 * 18 + 7];
          xr = a[22] - a[6];
          a[6] += a[22];
          a[22] = xr * Util2.SQRT2;
          xr = a[23] - a[7];
          a[7] += a[23];
          a[23] = xr * Util2.SQRT2 - a[7];
          a[7] -= a[6];
          a[22] -= a[7];
          a[23] -= a[22];
          xr = a[6];
          a[6] = a[31] - xr;
          a[31] = a[31] + xr;
          xr = a[7];
          a[7] = a[30] - xr;
          a[30] = a[30] + xr;
          xr = a[22];
          a[22] = a[15] - xr;
          a[15] = a[15] + xr;
          xr = a[23];
          a[23] = a[14] - xr;
          a[14] = a[14] + xr;
          xr = a[20] - a[8];
          a[8] += a[20];
          a[20] = xr * enwindow[wp + -10 * 18 + 7];
          xr = a[21] - a[9];
          a[9] += a[21];
          a[21] = xr * enwindow[wp + -10 * 18 + 7];
          xr = a[18] - a[10];
          a[10] += a[18];
          a[18] = xr * enwindow[wp + -12 * 18 + 7];
          xr = a[19] - a[11];
          a[11] += a[19];
          a[19] = xr * enwindow[wp + -12 * 18 + 7];
          xr = a[16] - a[12];
          a[12] += a[16];
          a[16] = xr * enwindow[wp + -14 * 18 + 7];
          xr = a[17] - a[13];
          a[13] += a[17];
          a[17] = xr * enwindow[wp + -14 * 18 + 7];
          xr = -a[20] + a[24];
          a[20] += a[24];
          a[24] = xr * enwindow[wp + -12 * 18 + 7];
          xr = -a[21] + a[25];
          a[21] += a[25];
          a[25] = xr * enwindow[wp + -12 * 18 + 7];
          xr = a[4] - a[8];
          a[4] += a[8];
          a[8] = xr * enwindow[wp + -12 * 18 + 7];
          xr = a[5] - a[9];
          a[5] += a[9];
          a[9] = xr * enwindow[wp + -12 * 18 + 7];
          xr = a[0] - a[12];
          a[0] += a[12];
          a[12] = xr * enwindow[wp + -4 * 18 + 7];
          xr = a[1] - a[13];
          a[1] += a[13];
          a[13] = xr * enwindow[wp + -4 * 18 + 7];
          xr = a[16] - a[28];
          a[16] += a[28];
          a[28] = xr * enwindow[wp + -4 * 18 + 7];
          xr = -a[17] + a[29];
          a[17] += a[29];
          a[29] = xr * enwindow[wp + -4 * 18 + 7];
          xr = Util2.SQRT2 * (a[2] - a[10]);
          a[2] += a[10];
          a[10] = xr;
          xr = Util2.SQRT2 * (a[3] - a[11]);
          a[3] += a[11];
          a[11] = xr;
          xr = Util2.SQRT2 * (-a[18] + a[26]);
          a[18] += a[26];
          a[26] = xr - a[18];
          xr = Util2.SQRT2 * (-a[19] + a[27]);
          a[19] += a[27];
          a[27] = xr - a[19];
          xr = a[2];
          a[19] -= a[3];
          a[3] -= xr;
          a[2] = a[31] - xr;
          a[31] += xr;
          xr = a[3];
          a[11] -= a[19];
          a[18] -= xr;
          a[3] = a[30] - xr;
          a[30] += xr;
          xr = a[18];
          a[27] -= a[11];
          a[19] -= xr;
          a[18] = a[15] - xr;
          a[15] += xr;
          xr = a[19];
          a[10] -= xr;
          a[19] = a[14] - xr;
          a[14] += xr;
          xr = a[10];
          a[11] -= xr;
          a[10] = a[23] - xr;
          a[23] += xr;
          xr = a[11];
          a[26] -= xr;
          a[11] = a[22] - xr;
          a[22] += xr;
          xr = a[26];
          a[27] -= xr;
          a[26] = a[7] - xr;
          a[7] += xr;
          xr = a[27];
          a[27] = a[6] - xr;
          a[6] += xr;
          xr = Util2.SQRT2 * (a[0] - a[4]);
          a[0] += a[4];
          a[4] = xr;
          xr = Util2.SQRT2 * (a[1] - a[5]);
          a[1] += a[5];
          a[5] = xr;
          xr = Util2.SQRT2 * (a[16] - a[20]);
          a[16] += a[20];
          a[20] = xr;
          xr = Util2.SQRT2 * (a[17] - a[21]);
          a[17] += a[21];
          a[21] = xr;
          xr = -Util2.SQRT2 * (a[8] - a[12]);
          a[8] += a[12];
          a[12] = xr - a[8];
          xr = -Util2.SQRT2 * (a[9] - a[13]);
          a[9] += a[13];
          a[13] = xr - a[9];
          xr = -Util2.SQRT2 * (a[25] - a[29]);
          a[25] += a[29];
          a[29] = xr - a[25];
          xr = -Util2.SQRT2 * (a[24] + a[28]);
          a[24] -= a[28];
          a[28] = xr - a[24];
          xr = a[24] - a[16];
          a[24] = xr;
          xr = a[20] - xr;
          a[20] = xr;
          xr = a[28] - xr;
          a[28] = xr;
          xr = a[25] - a[17];
          a[25] = xr;
          xr = a[21] - xr;
          a[21] = xr;
          xr = a[29] - xr;
          a[29] = xr;
          xr = a[17] - a[1];
          a[17] = xr;
          xr = a[9] - xr;
          a[9] = xr;
          xr = a[25] - xr;
          a[25] = xr;
          xr = a[5] - xr;
          a[5] = xr;
          xr = a[21] - xr;
          a[21] = xr;
          xr = a[13] - xr;
          a[13] = xr;
          xr = a[29] - xr;
          a[29] = xr;
          xr = a[1] - a[0];
          a[1] = xr;
          xr = a[16] - xr;
          a[16] = xr;
          xr = a[17] - xr;
          a[17] = xr;
          xr = a[8] - xr;
          a[8] = xr;
          xr = a[9] - xr;
          a[9] = xr;
          xr = a[24] - xr;
          a[24] = xr;
          xr = a[25] - xr;
          a[25] = xr;
          xr = a[4] - xr;
          a[4] = xr;
          xr = a[5] - xr;
          a[5] = xr;
          xr = a[20] - xr;
          a[20] = xr;
          xr = a[21] - xr;
          a[21] = xr;
          xr = a[12] - xr;
          a[12] = xr;
          xr = a[13] - xr;
          a[13] = xr;
          xr = a[28] - xr;
          a[28] = xr;
          xr = a[29] - xr;
          a[29] = xr;
          xr = a[0];
          a[0] += a[31];
          a[31] -= xr;
          xr = a[1];
          a[1] += a[30];
          a[30] -= xr;
          xr = a[16];
          a[16] += a[15];
          a[15] -= xr;
          xr = a[17];
          a[17] += a[14];
          a[14] -= xr;
          xr = a[8];
          a[8] += a[23];
          a[23] -= xr;
          xr = a[9];
          a[9] += a[22];
          a[22] -= xr;
          xr = a[24];
          a[24] += a[7];
          a[7] -= xr;
          xr = a[25];
          a[25] += a[6];
          a[6] -= xr;
          xr = a[4];
          a[4] += a[27];
          a[27] -= xr;
          xr = a[5];
          a[5] += a[26];
          a[26] -= xr;
          xr = a[20];
          a[20] += a[11];
          a[11] -= xr;
          xr = a[21];
          a[21] += a[10];
          a[10] -= xr;
          xr = a[12];
          a[12] += a[19];
          a[19] -= xr;
          xr = a[13];
          a[13] += a[18];
          a[18] -= xr;
          xr = a[28];
          a[28] += a[3];
          a[3] -= xr;
          xr = a[29];
          a[29] += a[2];
          a[2] -= xr;
        }
      }
      function mdct_short(inout, inoutPos) {
        for (var l2 = 0; l2 < 3; l2++) {
          var tc0, tc1, tc2, ts0, ts1, ts2;
          ts0 = inout[inoutPos + 2 * 3] * win[Encoder2.SHORT_TYPE][0] - inout[inoutPos + 5 * 3];
          tc0 = inout[inoutPos + 0 * 3] * win[Encoder2.SHORT_TYPE][2] - inout[inoutPos + 3 * 3];
          tc1 = ts0 + tc0;
          tc2 = ts0 - tc0;
          ts0 = inout[inoutPos + 5 * 3] * win[Encoder2.SHORT_TYPE][0] + inout[inoutPos + 2 * 3];
          tc0 = inout[inoutPos + 3 * 3] * win[Encoder2.SHORT_TYPE][2] + inout[inoutPos + 0 * 3];
          ts1 = ts0 + tc0;
          ts2 = -ts0 + tc0;
          tc0 = (inout[inoutPos + 1 * 3] * win[Encoder2.SHORT_TYPE][1] - inout[inoutPos + 4 * 3]) * 2069978111953089e-26;
          ts0 = (inout[inoutPos + 4 * 3] * win[Encoder2.SHORT_TYPE][1] + inout[inoutPos + 1 * 3]) * 2069978111953089e-26;
          inout[inoutPos + 3 * 0] = tc1 * 190752519173728e-25 + tc0;
          inout[inoutPos + 3 * 5] = -ts1 * 190752519173728e-25 + ts0;
          tc2 = tc2 * 0.8660254037844387 * 1907525191737281e-26;
          ts1 = ts1 * 0.5 * 1907525191737281e-26 + ts0;
          inout[inoutPos + 3 * 1] = tc2 - ts1;
          inout[inoutPos + 3 * 2] = tc2 + ts1;
          tc1 = tc1 * 0.5 * 1907525191737281e-26 - tc0;
          ts2 = ts2 * 0.8660254037844387 * 1907525191737281e-26;
          inout[inoutPos + 3 * 3] = tc1 + ts2;
          inout[inoutPos + 3 * 4] = tc1 - ts2;
          inoutPos++;
        }
      }
      function mdct_long(out, outPos, _in) {
        var ct, st;
        {
          var tc1, tc2, tc3, tc4, ts5, ts6, ts7, ts8;
          tc1 = _in[17] - _in[9];
          tc3 = _in[15] - _in[11];
          tc4 = _in[14] - _in[12];
          ts5 = _in[0] + _in[8];
          ts6 = _in[1] + _in[7];
          ts7 = _in[2] + _in[6];
          ts8 = _in[3] + _in[5];
          out[outPos + 17] = ts5 + ts7 - ts8 - (ts6 - _in[4]);
          st = (ts5 + ts7 - ts8) * cx[12 + 7] + (ts6 - _in[4]);
          ct = (tc1 - tc3 - tc4) * cx[12 + 6];
          out[outPos + 5] = ct + st;
          out[outPos + 6] = ct - st;
          tc2 = (_in[16] - _in[10]) * cx[12 + 6];
          ts6 = ts6 * cx[12 + 7] + _in[4];
          ct = tc1 * cx[12 + 0] + tc2 + tc3 * cx[12 + 1] + tc4 * cx[12 + 2];
          st = -ts5 * cx[12 + 4] + ts6 - ts7 * cx[12 + 5] + ts8 * cx[12 + 3];
          out[outPos + 1] = ct + st;
          out[outPos + 2] = ct - st;
          ct = tc1 * cx[12 + 1] - tc2 - tc3 * cx[12 + 2] + tc4 * cx[12 + 0];
          st = -ts5 * cx[12 + 5] + ts6 - ts7 * cx[12 + 3] + ts8 * cx[12 + 4];
          out[outPos + 9] = ct + st;
          out[outPos + 10] = ct - st;
          ct = tc1 * cx[12 + 2] - tc2 + tc3 * cx[12 + 0] - tc4 * cx[12 + 1];
          st = ts5 * cx[12 + 3] - ts6 + ts7 * cx[12 + 4] - ts8 * cx[12 + 5];
          out[outPos + 13] = ct + st;
          out[outPos + 14] = ct - st;
        }
        {
          var ts1, ts2, ts3, ts4, tc5, tc6, tc7, tc8;
          ts1 = _in[8] - _in[0];
          ts3 = _in[6] - _in[2];
          ts4 = _in[5] - _in[3];
          tc5 = _in[17] + _in[9];
          tc6 = _in[16] + _in[10];
          tc7 = _in[15] + _in[11];
          tc8 = _in[14] + _in[12];
          out[outPos + 0] = tc5 + tc7 + tc8 + (tc6 + _in[13]);
          ct = (tc5 + tc7 + tc8) * cx[12 + 7] - (tc6 + _in[13]);
          st = (ts1 - ts3 + ts4) * cx[12 + 6];
          out[outPos + 11] = ct + st;
          out[outPos + 12] = ct - st;
          ts2 = (_in[7] - _in[1]) * cx[12 + 6];
          tc6 = _in[13] - tc6 * cx[12 + 7];
          ct = tc5 * cx[12 + 3] - tc6 + tc7 * cx[12 + 4] + tc8 * cx[12 + 5];
          st = ts1 * cx[12 + 2] + ts2 + ts3 * cx[12 + 0] + ts4 * cx[12 + 1];
          out[outPos + 3] = ct + st;
          out[outPos + 4] = ct - st;
          ct = -tc5 * cx[12 + 5] + tc6 - tc7 * cx[12 + 3] - tc8 * cx[12 + 4];
          st = ts1 * cx[12 + 1] + ts2 - ts3 * cx[12 + 2] - ts4 * cx[12 + 0];
          out[outPos + 7] = ct + st;
          out[outPos + 8] = ct - st;
          ct = -tc5 * cx[12 + 4] + tc6 - tc7 * cx[12 + 5] - tc8 * cx[12 + 3];
          st = ts1 * cx[12 + 0] - ts2 + ts3 * cx[12 + 1] - ts4 * cx[12 + 2];
          out[outPos + 15] = ct + st;
          out[outPos + 16] = ct - st;
        }
      }
      this.mdct_sub48 = function(gfc, w0, w1) {
        var wk = w0;
        var wkPos = 286;
        for (var ch = 0; ch < gfc.channels_out; ch++) {
          for (var gr = 0; gr < gfc.mode_gr; gr++) {
            var band;
            var gi = gfc.l3_side.tt[gr][ch];
            var mdct_enc = gi.xr;
            var mdct_encPos = 0;
            var samp = gfc.sb_sample[ch][1 - gr];
            var sampPos = 0;
            for (var k2 = 0; k2 < 18 / 2; k2++) {
              window_subband(wk, wkPos, samp[sampPos]);
              window_subband(wk, wkPos + 32, samp[sampPos + 1]);
              sampPos += 2;
              wkPos += 64;
              for (band = 1; band < 32; band += 2) {
                samp[sampPos - 1][band] *= -1;
              }
            }
            for (band = 0; band < 32; band++, mdct_encPos += 18) {
              var type = gi.block_type;
              var band0 = gfc.sb_sample[ch][gr];
              var band1 = gfc.sb_sample[ch][1 - gr];
              if (gi.mixed_block_flag != 0 && band < 2)
                type = 0;
              if (gfc.amp_filter[band] < 1e-12) {
                Arrays2.fill(
                  mdct_enc,
                  mdct_encPos + 0,
                  mdct_encPos + 18,
                  0
                );
              } else {
                if (gfc.amp_filter[band] < 1) {
                  for (var k2 = 0; k2 < 18; k2++)
                    band1[k2][order[band]] *= gfc.amp_filter[band];
                }
                if (type == Encoder2.SHORT_TYPE) {
                  for (var k2 = -NS / 4; k2 < 0; k2++) {
                    var w = win[Encoder2.SHORT_TYPE][k2 + 3];
                    mdct_enc[mdct_encPos + k2 * 3 + 9] = band0[9 + k2][order[band]] * w - band0[8 - k2][order[band]];
                    mdct_enc[mdct_encPos + k2 * 3 + 18] = band0[14 - k2][order[band]] * w + band0[15 + k2][order[band]];
                    mdct_enc[mdct_encPos + k2 * 3 + 10] = band0[15 + k2][order[band]] * w - band0[14 - k2][order[band]];
                    mdct_enc[mdct_encPos + k2 * 3 + 19] = band1[2 - k2][order[band]] * w + band1[3 + k2][order[band]];
                    mdct_enc[mdct_encPos + k2 * 3 + 11] = band1[3 + k2][order[band]] * w - band1[2 - k2][order[band]];
                    mdct_enc[mdct_encPos + k2 * 3 + 20] = band1[8 - k2][order[band]] * w + band1[9 + k2][order[band]];
                  }
                  mdct_short(mdct_enc, mdct_encPos);
                } else {
                  var work = new_float2(18);
                  for (var k2 = -NL / 4; k2 < 0; k2++) {
                    var a, b;
                    a = win[type][k2 + 27] * band1[k2 + 9][order[band]] + win[type][k2 + 36] * band1[8 - k2][order[band]];
                    b = win[type][k2 + 9] * band0[k2 + 9][order[band]] - win[type][k2 + 18] * band0[8 - k2][order[band]];
                    work[k2 + 9] = a - b * tantab_l[3 + k2 + 9];
                    work[k2 + 18] = a * tantab_l[3 + k2 + 9] + b;
                  }
                  mdct_long(mdct_enc, mdct_encPos, work);
                }
              }
              if (type != Encoder2.SHORT_TYPE && band != 0) {
                for (var k2 = 7; k2 >= 0; --k2) {
                  var bu, bd;
                  bu = mdct_enc[mdct_encPos + k2] * ca[20 + k2] + mdct_enc[mdct_encPos + -1 - k2] * cs[28 + k2];
                  bd = mdct_enc[mdct_encPos + k2] * cs[28 + k2] - mdct_enc[mdct_encPos + -1 - k2] * ca[20 + k2];
                  mdct_enc[mdct_encPos + -1 - k2] = bu;
                  mdct_enc[mdct_encPos + k2] = bd;
                }
              }
            }
          }
          wk = w1;
          wkPos = 286;
          if (gfc.mode_gr == 1) {
            for (var i = 0; i < 18; i++) {
              System2.arraycopy(
                gfc.sb_sample[ch][1][i],
                0,
                gfc.sb_sample[ch][0][i],
                0,
                32
              );
            }
          }
        }
      };
    }
    NewMDCT_1 = NewMDCT;
    return NewMDCT_1;
  }
  var III_psy_xmin_1;
  var hasRequiredIII_psy_xmin;
  function requireIII_psy_xmin() {
    if (hasRequiredIII_psy_xmin) return III_psy_xmin_1;
    hasRequiredIII_psy_xmin = 1;
    var Encoder2 = requireEncoder();
    var common2 = common$h;
    var System2 = common2.System;
    var new_float2 = common2.new_float;
    var new_float_n2 = common2.new_float_n;
    function III_psy_xmin2() {
      this.l = new_float2(Encoder2.SBMAX_l);
      this.s = new_float_n2([Encoder2.SBMAX_s, 3]);
      var self2 = this;
      this.assign = function(iii_psy_xmin) {
        System2.arraycopy(iii_psy_xmin.l, 0, self2.l, 0, Encoder2.SBMAX_l);
        for (var i = 0; i < Encoder2.SBMAX_s; i++) {
          for (var j = 0; j < 3; j++) {
            self2.s[i][j] = iii_psy_xmin.s[i][j];
          }
        }
      };
    }
    III_psy_xmin_1 = III_psy_xmin2;
    return III_psy_xmin_1;
  }
  var III_psy_ratio_1;
  var hasRequiredIII_psy_ratio;
  function requireIII_psy_ratio() {
    if (hasRequiredIII_psy_ratio) return III_psy_ratio_1;
    hasRequiredIII_psy_ratio = 1;
    var III_psy_xmin2 = requireIII_psy_xmin();
    function III_psy_ratio() {
      this.thm = new III_psy_xmin2();
      this.en = new III_psy_xmin2();
    }
    III_psy_ratio_1 = III_psy_ratio;
    return III_psy_ratio_1;
  }
  var Encoder_1;
  var hasRequiredEncoder;
  function requireEncoder() {
    if (hasRequiredEncoder) return Encoder_1;
    hasRequiredEncoder = 1;
    var common2 = common$h;
    var System2 = common2.System;
    var VbrMode2 = common2.VbrMode;
    var new_array_n2 = common2.new_array_n;
    var new_float2 = common2.new_float;
    var new_float_n2 = common2.new_float_n;
    var new_int2 = common2.new_int;
    var assert2 = common2.assert;
    var MPEGMode2 = MPEGMode_1;
    Encoder2.ENCDELAY = 576;
    Encoder2.POSTDELAY = 1152;
    Encoder2.MDCTDELAY = 48;
    Encoder2.FFTOFFSET = 224 + Encoder2.MDCTDELAY;
    Encoder2.DECDELAY = 528;
    Encoder2.SBLIMIT = 32;
    Encoder2.CBANDS = 64;
    Encoder2.SBPSY_l = 21;
    Encoder2.SBPSY_s = 12;
    Encoder2.SBMAX_l = 22;
    Encoder2.SBMAX_s = 13;
    Encoder2.PSFB21 = 6;
    Encoder2.PSFB12 = 6;
    Encoder2.BLKSIZE = 1024;
    Encoder2.HBLKSIZE = Encoder2.BLKSIZE / 2 + 1;
    Encoder2.BLKSIZE_s = 256;
    Encoder2.HBLKSIZE_s = Encoder2.BLKSIZE_s / 2 + 1;
    Encoder2.NORM_TYPE = 0;
    Encoder2.START_TYPE = 1;
    Encoder2.SHORT_TYPE = 2;
    Encoder2.STOP_TYPE = 3;
    Encoder2.MPG_MD_LR_LR = 0;
    Encoder2.MPG_MD_LR_I = 1;
    Encoder2.MPG_MD_MS_LR = 2;
    Encoder2.MPG_MD_MS_I = 3;
    Encoder2.fircoef = [
      -0.0207887 * 5,
      -0.0378413 * 5,
      -0.0432472 * 5,
      -0.031183 * 5,
      779609e-23 * 5,
      0.0467745 * 5,
      0.10091 * 5,
      0.151365 * 5,
      0.187098 * 5
    ];
    function Encoder2() {
      var NewMDCT = requireNewMDCT();
      var III_psy_ratio = requireIII_psy_ratio();
      var FFTOFFSET = Encoder2.FFTOFFSET;
      var MPG_MD_MS_LR = Encoder2.MPG_MD_MS_LR;
      var bs = null;
      this.psy = null;
      var psy = null;
      var vbr = null;
      var qupvt = null;
      this.setModules = function(_bs, _psy, _qupvt, _vbr) {
        bs = _bs;
        this.psy = _psy;
        psy = _psy;
        vbr = _vbr;
        qupvt = _qupvt;
      };
      var newMDCT = new NewMDCT();
      function adjust_ATH(gfc) {
        var gr2_max, max_pow;
        if (gfc.ATH.useAdjust == 0) {
          gfc.ATH.adjust = 1;
          return;
        }
        max_pow = gfc.loudness_sq[0][0];
        gr2_max = gfc.loudness_sq[1][0];
        if (gfc.channels_out == 2) {
          max_pow += gfc.loudness_sq[0][1];
          gr2_max += gfc.loudness_sq[1][1];
        } else {
          max_pow += max_pow;
          gr2_max += gr2_max;
        }
        if (gfc.mode_gr == 2) {
          max_pow = Math.max(max_pow, gr2_max);
        }
        max_pow *= 0.5;
        max_pow *= gfc.ATH.aaSensitivityP;
        if (max_pow > 0.03125) {
          if (gfc.ATH.adjust >= 1) {
            gfc.ATH.adjust = 1;
          } else {
            if (gfc.ATH.adjust < gfc.ATH.adjustLimit) {
              gfc.ATH.adjust = gfc.ATH.adjustLimit;
            }
          }
          gfc.ATH.adjustLimit = 1;
        } else {
          var adj_lim_new = 31.98 * max_pow + 625e-6;
          if (gfc.ATH.adjust >= adj_lim_new) {
            gfc.ATH.adjust *= adj_lim_new * 0.075 + 0.925;
            if (gfc.ATH.adjust < adj_lim_new) {
              gfc.ATH.adjust = adj_lim_new;
            }
          } else {
            if (gfc.ATH.adjustLimit >= adj_lim_new) {
              gfc.ATH.adjust = adj_lim_new;
            } else {
              if (gfc.ATH.adjust < gfc.ATH.adjustLimit) {
                gfc.ATH.adjust = gfc.ATH.adjustLimit;
              }
            }
          }
          gfc.ATH.adjustLimit = adj_lim_new;
        }
      }
      function updateStats(gfc) {
        var gr, ch;
        assert2(0 <= gfc.bitrate_index && gfc.bitrate_index < 16);
        assert2(0 <= gfc.mode_ext && gfc.mode_ext < 4);
        gfc.bitrate_stereoMode_Hist[gfc.bitrate_index][4]++;
        gfc.bitrate_stereoMode_Hist[15][4]++;
        if (gfc.channels_out == 2) {
          gfc.bitrate_stereoMode_Hist[gfc.bitrate_index][gfc.mode_ext]++;
          gfc.bitrate_stereoMode_Hist[15][gfc.mode_ext]++;
        }
        for (gr = 0; gr < gfc.mode_gr; ++gr) {
          for (ch = 0; ch < gfc.channels_out; ++ch) {
            var bt = gfc.l3_side.tt[gr][ch].block_type | 0;
            if (gfc.l3_side.tt[gr][ch].mixed_block_flag != 0)
              bt = 4;
            gfc.bitrate_blockType_Hist[gfc.bitrate_index][bt]++;
            gfc.bitrate_blockType_Hist[gfc.bitrate_index][5]++;
            gfc.bitrate_blockType_Hist[15][bt]++;
            gfc.bitrate_blockType_Hist[15][5]++;
          }
        }
      }
      function lame_encode_frame_init(gfp, inbuf) {
        var gfc = gfp.internal_flags;
        var ch, gr;
        if (gfc.lame_encode_frame_init == 0) {
          var i, j;
          var primebuff0 = new_float2(286 + 1152 + 576);
          var primebuff1 = new_float2(286 + 1152 + 576);
          gfc.lame_encode_frame_init = 1;
          for (i = 0, j = 0; i < 286 + 576 * (1 + gfc.mode_gr); ++i) {
            if (i < 576 * gfc.mode_gr) {
              primebuff0[i] = 0;
              if (gfc.channels_out == 2)
                primebuff1[i] = 0;
            } else {
              primebuff0[i] = inbuf[0][j];
              if (gfc.channels_out == 2)
                primebuff1[i] = inbuf[1][j];
              ++j;
            }
          }
          for (gr = 0; gr < gfc.mode_gr; gr++) {
            for (ch = 0; ch < gfc.channels_out; ch++) {
              gfc.l3_side.tt[gr][ch].block_type = Encoder2.SHORT_TYPE;
            }
          }
          newMDCT.mdct_sub48(gfc, primebuff0, primebuff1);
          assert2(576 >= Encoder2.FFTOFFSET);
          assert2(gfc.mf_size >= Encoder2.BLKSIZE + gfp.framesize - Encoder2.FFTOFFSET);
          assert2(gfc.mf_size >= 512 + gfp.framesize - 32);
        }
      }
      this.lame_encode_mp3_frame = function(gfp, inbuf_l, inbuf_r, mp3buf, mp3bufPos, mp3buf_size) {
        var mp3count;
        var masking_LR = new_array_n2([2, 2]);
        masking_LR[0][0] = new III_psy_ratio();
        masking_LR[0][1] = new III_psy_ratio();
        masking_LR[1][0] = new III_psy_ratio();
        masking_LR[1][1] = new III_psy_ratio();
        var masking_MS = new_array_n2([2, 2]);
        masking_MS[0][0] = new III_psy_ratio();
        masking_MS[0][1] = new III_psy_ratio();
        masking_MS[1][0] = new III_psy_ratio();
        masking_MS[1][1] = new III_psy_ratio();
        var masking;
        var inbuf = [null, null];
        var gfc = gfp.internal_flags;
        var tot_ener = new_float_n2([2, 4]);
        var ms_ener_ratio = [0.5, 0.5];
        var pe = [[0, 0], [0, 0]];
        var pe_MS = [[0, 0], [0, 0]];
        var pe_use;
        var ch, gr;
        inbuf[0] = inbuf_l;
        inbuf[1] = inbuf_r;
        if (gfc.lame_encode_frame_init == 0) {
          lame_encode_frame_init(gfp, inbuf);
        }
        gfc.padding = 0;
        if ((gfc.slot_lag -= gfc.frac_SpF) < 0) {
          gfc.slot_lag += gfp.out_samplerate;
          gfc.padding = 1;
        }
        if (gfc.psymodel != 0) {
          var ret;
          var bufp = [null, null];
          var bufpPos = 0;
          var blocktype = new_int2(2);
          for (gr = 0; gr < gfc.mode_gr; gr++) {
            for (ch = 0; ch < gfc.channels_out; ch++) {
              bufp[ch] = inbuf[ch];
              bufpPos = 576 + gr * 576 - Encoder2.FFTOFFSET;
            }
            if (gfp.VBR == VbrMode2.vbr_mtrh || gfp.VBR == VbrMode2.vbr_mt) {
              ret = psy.L3psycho_anal_vbr(
                gfp,
                bufp,
                bufpPos,
                gr,
                masking_LR,
                masking_MS,
                pe[gr],
                pe_MS[gr],
                tot_ener[gr],
                blocktype
              );
            } else {
              ret = psy.L3psycho_anal_ns(
                gfp,
                bufp,
                bufpPos,
                gr,
                masking_LR,
                masking_MS,
                pe[gr],
                pe_MS[gr],
                tot_ener[gr],
                blocktype
              );
            }
            if (ret != 0)
              return -4;
            if (gfp.mode == MPEGMode2.JOINT_STEREO) {
              ms_ener_ratio[gr] = tot_ener[gr][2] + tot_ener[gr][3];
              if (ms_ener_ratio[gr] > 0)
                ms_ener_ratio[gr] = tot_ener[gr][3] / ms_ener_ratio[gr];
            }
            for (ch = 0; ch < gfc.channels_out; ch++) {
              var cod_info = gfc.l3_side.tt[gr][ch];
              cod_info.block_type = blocktype[ch];
              cod_info.mixed_block_flag = 0;
            }
          }
        } else {
          for (gr = 0; gr < gfc.mode_gr; gr++)
            for (ch = 0; ch < gfc.channels_out; ch++) {
              gfc.l3_side.tt[gr][ch].block_type = Encoder2.NORM_TYPE;
              gfc.l3_side.tt[gr][ch].mixed_block_flag = 0;
              pe_MS[gr][ch] = pe[gr][ch] = 700;
            }
        }
        adjust_ATH(gfc);
        newMDCT.mdct_sub48(gfc, inbuf[0], inbuf[1]);
        gfc.mode_ext = Encoder2.MPG_MD_LR_LR;
        if (gfp.force_ms) {
          gfc.mode_ext = Encoder2.MPG_MD_MS_LR;
        } else if (gfp.mode == MPEGMode2.JOINT_STEREO) {
          var sum_pe_MS = 0;
          var sum_pe_LR = 0;
          for (gr = 0; gr < gfc.mode_gr; gr++) {
            for (ch = 0; ch < gfc.channels_out; ch++) {
              sum_pe_MS += pe_MS[gr][ch];
              sum_pe_LR += pe[gr][ch];
            }
          }
          if (sum_pe_MS <= 1 * sum_pe_LR) {
            var gi0 = gfc.l3_side.tt[0];
            var gi1 = gfc.l3_side.tt[gfc.mode_gr - 1];
            if (gi0[0].block_type == gi0[1].block_type && gi1[0].block_type == gi1[1].block_type) {
              gfc.mode_ext = Encoder2.MPG_MD_MS_LR;
            }
          }
        }
        if (gfc.mode_ext == MPG_MD_MS_LR) {
          masking = masking_MS;
          pe_use = pe_MS;
        } else {
          masking = masking_LR;
          pe_use = pe;
        }
        if (gfp.analysis && gfc.pinfo != null) {
          for (gr = 0; gr < gfc.mode_gr; gr++) {
            for (ch = 0; ch < gfc.channels_out; ch++) {
              gfc.pinfo.ms_ratio[gr] = gfc.ms_ratio[gr];
              gfc.pinfo.ms_ener_ratio[gr] = ms_ener_ratio[gr];
              gfc.pinfo.blocktype[gr][ch] = gfc.l3_side.tt[gr][ch].block_type;
              gfc.pinfo.pe[gr][ch] = pe_use[gr][ch];
              System2.arraycopy(
                gfc.l3_side.tt[gr][ch].xr,
                0,
                gfc.pinfo.xr[gr][ch],
                0,
                576
              );
              if (gfc.mode_ext == MPG_MD_MS_LR) {
                gfc.pinfo.ers[gr][ch] = gfc.pinfo.ers[gr][ch + 2];
                System2.arraycopy(
                  gfc.pinfo.energy[gr][ch + 2],
                  0,
                  gfc.pinfo.energy[gr][ch],
                  0,
                  gfc.pinfo.energy[gr][ch].length
                );
              }
            }
          }
        }
        if (gfp.VBR == VbrMode2.vbr_off || gfp.VBR == VbrMode2.vbr_abr) {
          var i;
          var f2;
          for (i = 0; i < 18; i++)
            gfc.nsPsy.pefirbuf[i] = gfc.nsPsy.pefirbuf[i + 1];
          f2 = 0;
          for (gr = 0; gr < gfc.mode_gr; gr++)
            for (ch = 0; ch < gfc.channels_out; ch++)
              f2 += pe_use[gr][ch];
          gfc.nsPsy.pefirbuf[18] = f2;
          f2 = gfc.nsPsy.pefirbuf[9];
          for (i = 0; i < 9; i++)
            f2 += (gfc.nsPsy.pefirbuf[i] + gfc.nsPsy.pefirbuf[18 - i]) * Encoder2.fircoef[i];
          f2 = 670 * 5 * gfc.mode_gr * gfc.channels_out / f2;
          for (gr = 0; gr < gfc.mode_gr; gr++) {
            for (ch = 0; ch < gfc.channels_out; ch++) {
              pe_use[gr][ch] *= f2;
            }
          }
        }
        gfc.iteration_loop.iteration_loop(gfp, pe_use, ms_ener_ratio, masking);
        bs.format_bitstream(gfp);
        mp3count = bs.copy_buffer(gfc, mp3buf, mp3bufPos, mp3buf_size, 1);
        if (gfp.bWriteVbrTag)
          vbr.addVbrFrame(gfp);
        if (gfp.analysis && gfc.pinfo != null) {
          for (ch = 0; ch < gfc.channels_out; ch++) {
            var j;
            for (j = 0; j < FFTOFFSET; j++)
              gfc.pinfo.pcmdata[ch][j] = gfc.pinfo.pcmdata[ch][j + gfp.framesize];
            for (j = FFTOFFSET; j < 1600; j++) {
              gfc.pinfo.pcmdata[ch][j] = inbuf[ch][j - FFTOFFSET];
            }
          }
          qupvt.set_frame_pinfo(gfp, masking);
        }
        updateStats(gfc);
        return mp3count;
      };
    }
    Encoder_1 = Encoder2;
    return Encoder_1;
  }
  var common$g = common$h;
  var Util$1 = common$g.Util;
  var new_float$7 = common$g.new_float;
  var Encoder$7 = requireEncoder();
  function FFT$1() {
    var window2 = new_float$7(Encoder$7.BLKSIZE);
    var window_s = new_float$7(Encoder$7.BLKSIZE_s / 2);
    var costab = [
      0.9238795325112867,
      0.3826834323650898,
      0.9951847266721969,
      0.0980171403295606,
      0.9996988186962042,
      0.02454122852291229,
      0.9999811752826011,
      0.006135884649154475
    ];
    function fht(fz, fzPos, n2) {
      var tri = 0;
      var k4;
      var fi;
      var gi;
      n2 <<= 1;
      var fn = fzPos + n2;
      k4 = 4;
      do {
        var s1, c1;
        var i, k1, k2, k3, kx;
        kx = k4 >> 1;
        k1 = k4;
        k2 = k4 << 1;
        k3 = k2 + k1;
        k4 = k2 << 1;
        fi = fzPos;
        gi = fi + kx;
        do {
          var f0, f1, f2, f3;
          f1 = fz[fi + 0] - fz[fi + k1];
          f0 = fz[fi + 0] + fz[fi + k1];
          f3 = fz[fi + k2] - fz[fi + k3];
          f2 = fz[fi + k2] + fz[fi + k3];
          fz[fi + k2] = f0 - f2;
          fz[fi + 0] = f0 + f2;
          fz[fi + k3] = f1 - f3;
          fz[fi + k1] = f1 + f3;
          f1 = fz[gi + 0] - fz[gi + k1];
          f0 = fz[gi + 0] + fz[gi + k1];
          f3 = Util$1.SQRT2 * fz[gi + k3];
          f2 = Util$1.SQRT2 * fz[gi + k2];
          fz[gi + k2] = f0 - f2;
          fz[gi + 0] = f0 + f2;
          fz[gi + k3] = f1 - f3;
          fz[gi + k1] = f1 + f3;
          gi += k4;
          fi += k4;
        } while (fi < fn);
        c1 = costab[tri + 0];
        s1 = costab[tri + 1];
        for (i = 1; i < kx; i++) {
          var c2, s2;
          c2 = 1 - 2 * s1 * s1;
          s2 = 2 * s1 * c1;
          fi = fzPos + i;
          gi = fzPos + k1 - i;
          do {
            var a, b, g0, f0, f1, g1, f2, g2, f3, g3;
            b = s2 * fz[fi + k1] - c2 * fz[gi + k1];
            a = c2 * fz[fi + k1] + s2 * fz[gi + k1];
            f1 = fz[fi + 0] - a;
            f0 = fz[fi + 0] + a;
            g1 = fz[gi + 0] - b;
            g0 = fz[gi + 0] + b;
            b = s2 * fz[fi + k3] - c2 * fz[gi + k3];
            a = c2 * fz[fi + k3] + s2 * fz[gi + k3];
            f3 = fz[fi + k2] - a;
            f2 = fz[fi + k2] + a;
            g3 = fz[gi + k2] - b;
            g2 = fz[gi + k2] + b;
            b = s1 * f2 - c1 * g3;
            a = c1 * f2 + s1 * g3;
            fz[fi + k2] = f0 - a;
            fz[fi + 0] = f0 + a;
            fz[gi + k3] = g1 - b;
            fz[gi + k1] = g1 + b;
            b = c1 * g2 - s1 * f3;
            a = s1 * g2 + c1 * f3;
            fz[gi + k2] = g0 - a;
            fz[gi + 0] = g0 + a;
            fz[fi + k3] = f1 - b;
            fz[fi + k1] = f1 + b;
            gi += k4;
            fi += k4;
          } while (fi < fn);
          c2 = c1;
          c1 = c2 * costab[tri + 0] - s1 * costab[tri + 1];
          s1 = c2 * costab[tri + 1] + s1 * costab[tri + 0];
        }
        tri += 2;
      } while (k4 < n2);
    }
    var rv_tbl = [
      0,
      128,
      64,
      192,
      32,
      160,
      96,
      224,
      16,
      144,
      80,
      208,
      48,
      176,
      112,
      240,
      8,
      136,
      72,
      200,
      40,
      168,
      104,
      232,
      24,
      152,
      88,
      216,
      56,
      184,
      120,
      248,
      4,
      132,
      68,
      196,
      36,
      164,
      100,
      228,
      20,
      148,
      84,
      212,
      52,
      180,
      116,
      244,
      12,
      140,
      76,
      204,
      44,
      172,
      108,
      236,
      28,
      156,
      92,
      220,
      60,
      188,
      124,
      252,
      2,
      130,
      66,
      194,
      34,
      162,
      98,
      226,
      18,
      146,
      82,
      210,
      50,
      178,
      114,
      242,
      10,
      138,
      74,
      202,
      42,
      170,
      106,
      234,
      26,
      154,
      90,
      218,
      58,
      186,
      122,
      250,
      6,
      134,
      70,
      198,
      38,
      166,
      102,
      230,
      22,
      150,
      86,
      214,
      54,
      182,
      118,
      246,
      14,
      142,
      78,
      206,
      46,
      174,
      110,
      238,
      30,
      158,
      94,
      222,
      62,
      190,
      126,
      254
    ];
    this.fft_short = function(gfc, x_real, chn, buffer, bufPos) {
      for (var b = 0; b < 3; b++) {
        var x = Encoder$7.BLKSIZE_s / 2;
        var k2 = 65535 & 576 / 3 * (b + 1);
        var j = Encoder$7.BLKSIZE_s / 8 - 1;
        do {
          var f0, f1, f2, f3, w;
          var i = rv_tbl[j << 2] & 255;
          f0 = window_s[i] * buffer[chn][bufPos + i + k2];
          w = window_s[127 - i] * buffer[chn][bufPos + i + k2 + 128];
          f1 = f0 - w;
          f0 = f0 + w;
          f2 = window_s[i + 64] * buffer[chn][bufPos + i + k2 + 64];
          w = window_s[63 - i] * buffer[chn][bufPos + i + k2 + 192];
          f3 = f2 - w;
          f2 = f2 + w;
          x -= 4;
          x_real[b][x + 0] = f0 + f2;
          x_real[b][x + 2] = f0 - f2;
          x_real[b][x + 1] = f1 + f3;
          x_real[b][x + 3] = f1 - f3;
          f0 = window_s[i + 1] * buffer[chn][bufPos + i + k2 + 1];
          w = window_s[126 - i] * buffer[chn][bufPos + i + k2 + 129];
          f1 = f0 - w;
          f0 = f0 + w;
          f2 = window_s[i + 65] * buffer[chn][bufPos + i + k2 + 65];
          w = window_s[62 - i] * buffer[chn][bufPos + i + k2 + 193];
          f3 = f2 - w;
          f2 = f2 + w;
          x_real[b][x + Encoder$7.BLKSIZE_s / 2 + 0] = f0 + f2;
          x_real[b][x + Encoder$7.BLKSIZE_s / 2 + 2] = f0 - f2;
          x_real[b][x + Encoder$7.BLKSIZE_s / 2 + 1] = f1 + f3;
          x_real[b][x + Encoder$7.BLKSIZE_s / 2 + 3] = f1 - f3;
        } while (--j >= 0);
        fht(x_real[b], x, Encoder$7.BLKSIZE_s / 2);
      }
    };
    this.fft_long = function(gfc, y, chn, buffer, bufPos) {
      var jj = Encoder$7.BLKSIZE / 8 - 1;
      var x = Encoder$7.BLKSIZE / 2;
      do {
        var f0, f1, f2, f3, w;
        var i = rv_tbl[jj] & 255;
        f0 = window2[i] * buffer[chn][bufPos + i];
        w = window2[i + 512] * buffer[chn][bufPos + i + 512];
        f1 = f0 - w;
        f0 = f0 + w;
        f2 = window2[i + 256] * buffer[chn][bufPos + i + 256];
        w = window2[i + 768] * buffer[chn][bufPos + i + 768];
        f3 = f2 - w;
        f2 = f2 + w;
        x -= 4;
        y[x + 0] = f0 + f2;
        y[x + 2] = f0 - f2;
        y[x + 1] = f1 + f3;
        y[x + 3] = f1 - f3;
        f0 = window2[i + 1] * buffer[chn][bufPos + i + 1];
        w = window2[i + 513] * buffer[chn][bufPos + i + 513];
        f1 = f0 - w;
        f0 = f0 + w;
        f2 = window2[i + 257] * buffer[chn][bufPos + i + 257];
        w = window2[i + 769] * buffer[chn][bufPos + i + 769];
        f3 = f2 - w;
        f2 = f2 + w;
        y[x + Encoder$7.BLKSIZE / 2 + 0] = f0 + f2;
        y[x + Encoder$7.BLKSIZE / 2 + 2] = f0 - f2;
        y[x + Encoder$7.BLKSIZE / 2 + 1] = f1 + f3;
        y[x + Encoder$7.BLKSIZE / 2 + 3] = f1 - f3;
      } while (--jj >= 0);
      fht(y, x, Encoder$7.BLKSIZE / 2);
    };
    this.init_fft = function(gfc) {
      for (var i = 0; i < Encoder$7.BLKSIZE; i++)
        window2[i] = 0.42 - 0.5 * Math.cos(2 * Math.PI * (i + 0.5) / Encoder$7.BLKSIZE) + 0.08 * Math.cos(4 * Math.PI * (i + 0.5) / Encoder$7.BLKSIZE);
      for (var i = 0; i < Encoder$7.BLKSIZE_s / 2; i++)
        window_s[i] = 0.5 * (1 - Math.cos(2 * Math.PI * (i + 0.5) / Encoder$7.BLKSIZE_s));
    };
  }
  var FFT_1 = FFT$1;
  var common$f = common$h;
  var VbrMode$1 = common$f.VbrMode;
  var Float = common$f.Float;
  var ShortBlock$1 = common$f.ShortBlock;
  var Util = common$f.Util;
  var Arrays$2 = common$f.Arrays;
  var new_float$6 = common$f.new_float;
  var new_float_n$2 = common$f.new_float_n;
  var new_int$7 = common$f.new_int;
  var assert$2 = common$f.assert;
  var FFT = FFT_1;
  var Encoder$6 = requireEncoder();
  var MPEGMode$1 = MPEGMode_1;
  function PsyModel() {
    var fft = new FFT();
    var LOG10 = 2.302585092994046;
    var rpelev = 2;
    var rpelev2 = 16;
    var rpelev_s = 2;
    var rpelev2_s = 16;
    var DELBARK = 0.34;
    var VO_SCALE = 1 / (14752 * 14752) / (Encoder$6.BLKSIZE / 2);
    var temporalmask_sustain_sec = 0.01;
    var NS_PREECHO_ATT0 = 0.8;
    var NS_PREECHO_ATT1 = 0.6;
    var NS_PREECHO_ATT2 = 0.3;
    var NS_MSFIX = 3.5;
    var NSFIRLEN = 21;
    var LN_TO_LOG10 = 0.2302585093;
    function NON_LINEAR_SCALE_ENERGY(x) {
      return x;
    }
    function psycho_loudness_approx(energy, gfc) {
      var loudness_power = 0;
      for (var i = 0; i < Encoder$6.BLKSIZE / 2; ++i)
        loudness_power += energy[i] * gfc.ATH.eql_w[i];
      loudness_power *= VO_SCALE;
      return loudness_power;
    }
    function compute_ffts(gfp, fftenergy, fftenergy_s, wsamp_l, wsamp_lPos, wsamp_s, wsamp_sPos, gr_out, chn, buffer, bufPos) {
      var gfc = gfp.internal_flags;
      if (chn < 2) {
        fft.fft_long(gfc, wsamp_l[wsamp_lPos], chn, buffer, bufPos);
        fft.fft_short(gfc, wsamp_s[wsamp_sPos], chn, buffer, bufPos);
      } else if (chn == 2) {
        for (var j = Encoder$6.BLKSIZE - 1; j >= 0; --j) {
          var l2 = wsamp_l[wsamp_lPos + 0][j];
          var r = wsamp_l[wsamp_lPos + 1][j];
          wsamp_l[wsamp_lPos + 0][j] = (l2 + r) * Util.SQRT2 * 0.5;
          wsamp_l[wsamp_lPos + 1][j] = (l2 - r) * Util.SQRT2 * 0.5;
        }
        for (var b = 2; b >= 0; --b) {
          for (var j = Encoder$6.BLKSIZE_s - 1; j >= 0; --j) {
            var l2 = wsamp_s[wsamp_sPos + 0][b][j];
            var r = wsamp_s[wsamp_sPos + 1][b][j];
            wsamp_s[wsamp_sPos + 0][b][j] = (l2 + r) * Util.SQRT2 * 0.5;
            wsamp_s[wsamp_sPos + 1][b][j] = (l2 - r) * Util.SQRT2 * 0.5;
          }
        }
      }
      fftenergy[0] = NON_LINEAR_SCALE_ENERGY(wsamp_l[wsamp_lPos + 0][0]);
      fftenergy[0] *= fftenergy[0];
      for (var j = Encoder$6.BLKSIZE / 2 - 1; j >= 0; --j) {
        var re = wsamp_l[wsamp_lPos + 0][Encoder$6.BLKSIZE / 2 - j];
        var im = wsamp_l[wsamp_lPos + 0][Encoder$6.BLKSIZE / 2 + j];
        fftenergy[Encoder$6.BLKSIZE / 2 - j] = NON_LINEAR_SCALE_ENERGY((re * re + im * im) * 0.5);
      }
      for (var b = 2; b >= 0; --b) {
        fftenergy_s[b][0] = wsamp_s[wsamp_sPos + 0][b][0];
        fftenergy_s[b][0] *= fftenergy_s[b][0];
        for (var j = Encoder$6.BLKSIZE_s / 2 - 1; j >= 0; --j) {
          var re = wsamp_s[wsamp_sPos + 0][b][Encoder$6.BLKSIZE_s / 2 - j];
          var im = wsamp_s[wsamp_sPos + 0][b][Encoder$6.BLKSIZE_s / 2 + j];
          fftenergy_s[b][Encoder$6.BLKSIZE_s / 2 - j] = NON_LINEAR_SCALE_ENERGY((re * re + im * im) * 0.5);
        }
      }
      {
        var totalenergy = 0;
        for (var j = 11; j < Encoder$6.HBLKSIZE; j++)
          totalenergy += fftenergy[j];
        gfc.tot_ener[chn] = totalenergy;
      }
      if (gfp.analysis) {
        for (var j = 0; j < Encoder$6.HBLKSIZE; j++) {
          gfc.pinfo.energy[gr_out][chn][j] = gfc.pinfo.energy_save[chn][j];
          gfc.pinfo.energy_save[chn][j] = fftenergy[j];
        }
        gfc.pinfo.pe[gr_out][chn] = gfc.pe[chn];
      }
      if (gfp.athaa_loudapprox == 2 && chn < 2) {
        gfc.loudness_sq[gr_out][chn] = gfc.loudness_sq_save[chn];
        gfc.loudness_sq_save[chn] = psycho_loudness_approx(fftenergy, gfc);
      }
    }
    var I1LIMIT = 8;
    var I2LIMIT = 23;
    var MLIMIT = 15;
    var ma_max_i1;
    var ma_max_i2;
    var ma_max_m;
    var tab = [
      1,
      0.79433,
      0.63096,
      0.63096,
      0.63096,
      0.63096,
      0.63096,
      0.25119,
      0.11749
    ];
    function init_mask_add_max_values() {
      ma_max_i1 = Math.pow(10, (I1LIMIT + 1) / 16);
      ma_max_i2 = Math.pow(10, (I2LIMIT + 1) / 16);
      ma_max_m = Math.pow(10, MLIMIT / 10);
    }
    var table1 = [
      3.3246 * 3.3246,
      3.23837 * 3.23837,
      3.15437 * 3.15437,
      3.00412 * 3.00412,
      2.86103 * 2.86103,
      2.65407 * 2.65407,
      2.46209 * 2.46209,
      2.284 * 2.284,
      2.11879 * 2.11879,
      1.96552 * 1.96552,
      1.82335 * 1.82335,
      1.69146 * 1.69146,
      1.56911 * 1.56911,
      1.46658 * 1.46658,
      1.37074 * 1.37074,
      1.31036 * 1.31036,
      1.25264 * 1.25264,
      1.20648 * 1.20648,
      1.16203 * 1.16203,
      1.12765 * 1.12765,
      1.09428 * 1.09428,
      1.0659 * 1.0659,
      1.03826 * 1.03826,
      1.01895 * 1.01895,
      1
    ];
    var table2 = [
      1.33352 * 1.33352,
      1.35879 * 1.35879,
      1.38454 * 1.38454,
      1.39497 * 1.39497,
      1.40548 * 1.40548,
      1.3537 * 1.3537,
      1.30382 * 1.30382,
      1.22321 * 1.22321,
      1.14758 * 1.14758,
      1
    ];
    var table3 = [
      2.35364 * 2.35364,
      2.29259 * 2.29259,
      2.23313 * 2.23313,
      2.12675 * 2.12675,
      2.02545 * 2.02545,
      1.87894 * 1.87894,
      1.74303 * 1.74303,
      1.61695 * 1.61695,
      1.49999 * 1.49999,
      1.39148 * 1.39148,
      1.29083 * 1.29083,
      1.19746 * 1.19746,
      1.11084 * 1.11084,
      1.03826 * 1.03826
    ];
    function mask_add(m1, m2, kk, b, gfc, shortblock) {
      var ratio;
      if (m2 > m1) {
        if (m2 < m1 * ma_max_i2)
          ratio = m2 / m1;
        else
          return m1 + m2;
      } else {
        if (m1 >= m2 * ma_max_i2)
          return m1 + m2;
        ratio = m1 / m2;
      }
      m1 += m2;
      if (b + 3 <= 3 + 3) {
        if (ratio >= ma_max_i1) {
          return m1;
        }
        var i = 0 | Util.FAST_LOG10_X(ratio, 16);
        return m1 * table2[i];
      }
      var i = 0 | Util.FAST_LOG10_X(ratio, 16);
      {
        m2 = gfc.ATH.cb_l[kk] * gfc.ATH.adjust;
      }
      if (m1 < ma_max_m * m2) {
        if (m1 > m2) {
          var f2, r;
          f2 = 1;
          if (i <= 13)
            f2 = table3[i];
          r = Util.FAST_LOG10_X(m1 / m2, 10 / 15);
          return m1 * ((table1[i] - f2) * r + f2);
        }
        if (i > 13)
          return m1;
        return m1 * table3[i];
      }
      return m1 * table1[i];
    }
    var table2_ = [
      1.33352 * 1.33352,
      1.35879 * 1.35879,
      1.38454 * 1.38454,
      1.39497 * 1.39497,
      1.40548 * 1.40548,
      1.3537 * 1.3537,
      1.30382 * 1.30382,
      1.22321 * 1.22321,
      1.14758 * 1.14758,
      1
    ];
    function vbrpsy_mask_add(m1, m2, b) {
      var ratio;
      if (m1 < 0) {
        m1 = 0;
      }
      if (m2 < 0) {
        m2 = 0;
      }
      if (m1 <= 0) {
        return m2;
      }
      if (m2 <= 0) {
        return m1;
      }
      if (m2 > m1) {
        ratio = m2 / m1;
      } else {
        ratio = m1 / m2;
      }
      if (-2 <= b && b <= 2) {
        if (ratio >= ma_max_i1) {
          return m1 + m2;
        } else {
          var i = 0 | Util.FAST_LOG10_X(ratio, 16);
          return (m1 + m2) * table2_[i];
        }
      }
      if (ratio < ma_max_i2) {
        return m1 + m2;
      }
      if (m1 < m2) {
        m1 = m2;
      }
      return m1;
    }
    function calc_interchannel_masking(gfp, ratio) {
      var gfc = gfp.internal_flags;
      if (gfc.channels_out > 1) {
        for (var sb = 0; sb < Encoder$6.SBMAX_l; sb++) {
          var l2 = gfc.thm[0].l[sb];
          var r = gfc.thm[1].l[sb];
          gfc.thm[0].l[sb] += r * ratio;
          gfc.thm[1].l[sb] += l2 * ratio;
        }
        for (var sb = 0; sb < Encoder$6.SBMAX_s; sb++) {
          for (var sblock = 0; sblock < 3; sblock++) {
            var l2 = gfc.thm[0].s[sb][sblock];
            var r = gfc.thm[1].s[sb][sblock];
            gfc.thm[0].s[sb][sblock] += r * ratio;
            gfc.thm[1].s[sb][sblock] += l2 * ratio;
          }
        }
      }
    }
    function msfix1(gfc) {
      for (var sb = 0; sb < Encoder$6.SBMAX_l; sb++) {
        if (gfc.thm[0].l[sb] > 1.58 * gfc.thm[1].l[sb] || gfc.thm[1].l[sb] > 1.58 * gfc.thm[0].l[sb])
          continue;
        var mld = gfc.mld_l[sb] * gfc.en[3].l[sb];
        var rmid = Math.max(
          gfc.thm[2].l[sb],
          Math.min(gfc.thm[3].l[sb], mld)
        );
        mld = gfc.mld_l[sb] * gfc.en[2].l[sb];
        var rside = Math.max(
          gfc.thm[3].l[sb],
          Math.min(gfc.thm[2].l[sb], mld)
        );
        gfc.thm[2].l[sb] = rmid;
        gfc.thm[3].l[sb] = rside;
      }
      for (var sb = 0; sb < Encoder$6.SBMAX_s; sb++) {
        for (var sblock = 0; sblock < 3; sblock++) {
          if (gfc.thm[0].s[sb][sblock] > 1.58 * gfc.thm[1].s[sb][sblock] || gfc.thm[1].s[sb][sblock] > 1.58 * gfc.thm[0].s[sb][sblock])
            continue;
          var mld = gfc.mld_s[sb] * gfc.en[3].s[sb][sblock];
          var rmid = Math.max(
            gfc.thm[2].s[sb][sblock],
            Math.min(gfc.thm[3].s[sb][sblock], mld)
          );
          mld = gfc.mld_s[sb] * gfc.en[2].s[sb][sblock];
          var rside = Math.max(
            gfc.thm[3].s[sb][sblock],
            Math.min(gfc.thm[2].s[sb][sblock], mld)
          );
          gfc.thm[2].s[sb][sblock] = rmid;
          gfc.thm[3].s[sb][sblock] = rside;
        }
      }
    }
    function ns_msfix(gfc, msfix, athadjust) {
      var msfix2 = msfix;
      var athlower = Math.pow(10, athadjust);
      msfix *= 2;
      msfix2 *= 2;
      for (var sb = 0; sb < Encoder$6.SBMAX_l; sb++) {
        var thmLR, thmM, thmS, ath;
        ath = gfc.ATH.cb_l[gfc.bm_l[sb]] * athlower;
        thmLR = Math.min(
          Math.max(gfc.thm[0].l[sb], ath),
          Math.max(gfc.thm[1].l[sb], ath)
        );
        thmM = Math.max(gfc.thm[2].l[sb], ath);
        thmS = Math.max(gfc.thm[3].l[sb], ath);
        if (thmLR * msfix < thmM + thmS) {
          var f2 = thmLR * msfix2 / (thmM + thmS);
          thmM *= f2;
          thmS *= f2;
        }
        gfc.thm[2].l[sb] = Math.min(thmM, gfc.thm[2].l[sb]);
        gfc.thm[3].l[sb] = Math.min(thmS, gfc.thm[3].l[sb]);
      }
      athlower *= Encoder$6.BLKSIZE_s / Encoder$6.BLKSIZE;
      for (var sb = 0; sb < Encoder$6.SBMAX_s; sb++) {
        for (var sblock = 0; sblock < 3; sblock++) {
          var thmLR, thmM, thmS, ath;
          ath = gfc.ATH.cb_s[gfc.bm_s[sb]] * athlower;
          thmLR = Math.min(
            Math.max(gfc.thm[0].s[sb][sblock], ath),
            Math.max(gfc.thm[1].s[sb][sblock], ath)
          );
          thmM = Math.max(gfc.thm[2].s[sb][sblock], ath);
          thmS = Math.max(gfc.thm[3].s[sb][sblock], ath);
          if (thmLR * msfix < thmM + thmS) {
            var f2 = thmLR * msfix / (thmM + thmS);
            thmM *= f2;
            thmS *= f2;
          }
          gfc.thm[2].s[sb][sblock] = Math.min(
            gfc.thm[2].s[sb][sblock],
            thmM
          );
          gfc.thm[3].s[sb][sblock] = Math.min(
            gfc.thm[3].s[sb][sblock],
            thmS
          );
        }
      }
    }
    function convert_partition2scalefac_s(gfc, eb, thr, chn, sblock) {
      var sb, b;
      var enn = 0;
      var thmm = 0;
      for (sb = b = 0; sb < Encoder$6.SBMAX_s; ++b, ++sb) {
        var bo_s_sb = gfc.bo_s[sb];
        var npart_s = gfc.npart_s;
        var b_lim = bo_s_sb < npart_s ? bo_s_sb : npart_s;
        while (b < b_lim) {
          assert$2(eb[b] >= 0);
          assert$2(thr[b] >= 0);
          enn += eb[b];
          thmm += thr[b];
          b++;
        }
        gfc.en[chn].s[sb][sblock] = enn;
        gfc.thm[chn].s[sb][sblock] = thmm;
        if (b >= npart_s) {
          ++sb;
          break;
        }
        assert$2(eb[b] >= 0);
        assert$2(thr[b] >= 0);
        {
          var w_curr = gfc.PSY.bo_s_weight[sb];
          var w_next = 1 - w_curr;
          enn = w_curr * eb[b];
          thmm = w_curr * thr[b];
          gfc.en[chn].s[sb][sblock] += enn;
          gfc.thm[chn].s[sb][sblock] += thmm;
          enn = w_next * eb[b];
          thmm = w_next * thr[b];
        }
      }
      for (; sb < Encoder$6.SBMAX_s; ++sb) {
        gfc.en[chn].s[sb][sblock] = 0;
        gfc.thm[chn].s[sb][sblock] = 0;
      }
    }
    function convert_partition2scalefac_l(gfc, eb, thr, chn) {
      var sb, b;
      var enn = 0;
      var thmm = 0;
      for (sb = b = 0; sb < Encoder$6.SBMAX_l; ++b, ++sb) {
        var bo_l_sb = gfc.bo_l[sb];
        var npart_l = gfc.npart_l;
        var b_lim = bo_l_sb < npart_l ? bo_l_sb : npart_l;
        while (b < b_lim) {
          assert$2(eb[b] >= 0);
          assert$2(thr[b] >= 0);
          enn += eb[b];
          thmm += thr[b];
          b++;
        }
        gfc.en[chn].l[sb] = enn;
        gfc.thm[chn].l[sb] = thmm;
        if (b >= npart_l) {
          ++sb;
          break;
        }
        assert$2(eb[b] >= 0);
        assert$2(thr[b] >= 0);
        {
          var w_curr = gfc.PSY.bo_l_weight[sb];
          var w_next = 1 - w_curr;
          enn = w_curr * eb[b];
          thmm = w_curr * thr[b];
          gfc.en[chn].l[sb] += enn;
          gfc.thm[chn].l[sb] += thmm;
          enn = w_next * eb[b];
          thmm = w_next * thr[b];
        }
      }
      for (; sb < Encoder$6.SBMAX_l; ++sb) {
        gfc.en[chn].l[sb] = 0;
        gfc.thm[chn].l[sb] = 0;
      }
    }
    function compute_masking_s(gfp, fftenergy_s, eb, thr, chn, sblock) {
      var gfc = gfp.internal_flags;
      var j, b;
      for (b = j = 0; b < gfc.npart_s; ++b) {
        var ebb = 0;
        var n2 = gfc.numlines_s[b];
        for (var i = 0; i < n2; ++i, ++j) {
          var el = fftenergy_s[sblock][j];
          ebb += el;
        }
        eb[b] = ebb;
      }
      assert$2(b == gfc.npart_s);
      for (j = b = 0; b < gfc.npart_s; b++) {
        var kk = gfc.s3ind_s[b][0];
        var ecb = gfc.s3_ss[j++] * eb[kk];
        ++kk;
        while (kk <= gfc.s3ind_s[b][1]) {
          ecb += gfc.s3_ss[j] * eb[kk];
          ++j;
          ++kk;
        }
        {
          var x = rpelev_s * gfc.nb_s1[chn][b];
          thr[b] = Math.min(ecb, x);
        }
        if (gfc.blocktype_old[chn & 1] == Encoder$6.SHORT_TYPE) {
          var x = rpelev2_s * gfc.nb_s2[chn][b];
          var y = thr[b];
          thr[b] = Math.min(x, y);
        }
        gfc.nb_s2[chn][b] = gfc.nb_s1[chn][b];
        gfc.nb_s1[chn][b] = ecb;
        assert$2(thr[b] >= 0);
      }
      for (; b <= Encoder$6.CBANDS; ++b) {
        eb[b] = 0;
        thr[b] = 0;
      }
    }
    function block_type_set(gfp, uselongblock, blocktype_d, blocktype) {
      var gfc = gfp.internal_flags;
      if (gfp.short_blocks == ShortBlock$1.short_block_coupled && !(uselongblock[0] != 0 && uselongblock[1] != 0))
        uselongblock[0] = uselongblock[1] = 0;
      for (var chn = 0; chn < gfc.channels_out; chn++) {
        blocktype[chn] = Encoder$6.NORM_TYPE;
        if (gfp.short_blocks == ShortBlock$1.short_block_dispensed)
          uselongblock[chn] = 1;
        if (gfp.short_blocks == ShortBlock$1.short_block_forced)
          uselongblock[chn] = 0;
        if (uselongblock[chn] != 0) {
          assert$2(gfc.blocktype_old[chn] != Encoder$6.START_TYPE);
          if (gfc.blocktype_old[chn] == Encoder$6.SHORT_TYPE)
            blocktype[chn] = Encoder$6.STOP_TYPE;
        } else {
          blocktype[chn] = Encoder$6.SHORT_TYPE;
          if (gfc.blocktype_old[chn] == Encoder$6.NORM_TYPE) {
            gfc.blocktype_old[chn] = Encoder$6.START_TYPE;
          }
          if (gfc.blocktype_old[chn] == Encoder$6.STOP_TYPE)
            gfc.blocktype_old[chn] = Encoder$6.SHORT_TYPE;
        }
        blocktype_d[chn] = gfc.blocktype_old[chn];
        gfc.blocktype_old[chn] = blocktype[chn];
      }
    }
    function NS_INTERP(x, y, r) {
      if (r >= 1) {
        return x;
      }
      if (r <= 0)
        return y;
      if (y > 0) {
        return Math.pow(x / y, r) * y;
      }
      return 0;
    }
    var regcoef_s = [
      11.8,
      13.6,
      17.2,
      32,
      46.5,
      51.3,
      57.5,
      67.1,
      71.5,
      84.6,
      97.6,
      130
      /* 255.8 */
    ];
    function pecalc_s(mr, masking_lower) {
      var pe_s = 1236.28 / 4;
      for (var sb = 0; sb < Encoder$6.SBMAX_s - 1; sb++) {
        for (var sblock = 0; sblock < 3; sblock++) {
          var thm = mr.thm.s[sb][sblock];
          if (thm > 0) {
            var x = thm * masking_lower;
            var en = mr.en.s[sb][sblock];
            if (en > x) {
              if (en > x * 1e10) {
                pe_s += regcoef_s[sb] * (10 * LOG10);
              } else {
                pe_s += regcoef_s[sb] * Util.FAST_LOG10(en / x);
              }
            }
          }
        }
      }
      return pe_s;
    }
    var regcoef_l = [
      6.8,
      5.8,
      5.8,
      6.4,
      6.5,
      9.9,
      12.1,
      14.4,
      15,
      18.9,
      21.6,
      26.9,
      34.2,
      40.2,
      46.8,
      56.5,
      60.7,
      73.9,
      85.7,
      93.4,
      126.1
      /* 241.3 */
    ];
    function pecalc_l(mr, masking_lower) {
      var pe_l = 1124.23 / 4;
      for (var sb = 0; sb < Encoder$6.SBMAX_l - 1; sb++) {
        var thm = mr.thm.l[sb];
        if (thm > 0) {
          var x = thm * masking_lower;
          var en = mr.en.l[sb];
          if (en > x) {
            if (en > x * 1e10) {
              pe_l += regcoef_l[sb] * (10 * LOG10);
            } else {
              pe_l += regcoef_l[sb] * Util.FAST_LOG10(en / x);
            }
          }
        }
      }
      return pe_l;
    }
    function calc_energy(gfc, fftenergy, eb, max, avg) {
      var b, j;
      for (b = j = 0; b < gfc.npart_l; ++b) {
        var ebb = 0, m2 = 0;
        var i;
        for (i = 0; i < gfc.numlines_l[b]; ++i, ++j) {
          var el = fftenergy[j];
          ebb += el;
          if (m2 < el)
            m2 = el;
        }
        eb[b] = ebb;
        max[b] = m2;
        avg[b] = ebb * gfc.rnumlines_l[b];
        assert$2(gfc.rnumlines_l[b] >= 0);
        assert$2(eb[b] >= 0);
        assert$2(max[b] >= 0);
        assert$2(avg[b] >= 0);
      }
    }
    function calc_mask_index_l(gfc, max, avg, mask_idx) {
      var last_tab_entry = tab.length - 1;
      var b = 0;
      var a = avg[b] + avg[b + 1];
      if (a > 0) {
        var m2 = max[b];
        if (m2 < max[b + 1])
          m2 = max[b + 1];
        assert$2(gfc.numlines_l[b] + gfc.numlines_l[b + 1] - 1 > 0);
        a = 20 * (m2 * 2 - a) / (a * (gfc.numlines_l[b] + gfc.numlines_l[b + 1] - 1));
        var k2 = 0 | a;
        if (k2 > last_tab_entry)
          k2 = last_tab_entry;
        mask_idx[b] = k2;
      } else {
        mask_idx[b] = 0;
      }
      for (b = 1; b < gfc.npart_l - 1; b++) {
        a = avg[b - 1] + avg[b] + avg[b + 1];
        if (a > 0) {
          var m2 = max[b - 1];
          if (m2 < max[b])
            m2 = max[b];
          if (m2 < max[b + 1])
            m2 = max[b + 1];
          assert$2(gfc.numlines_l[b - 1] + gfc.numlines_l[b] + gfc.numlines_l[b + 1] - 1 > 0);
          a = 20 * (m2 * 3 - a) / (a * (gfc.numlines_l[b - 1] + gfc.numlines_l[b] + gfc.numlines_l[b + 1] - 1));
          var k2 = 0 | a;
          if (k2 > last_tab_entry)
            k2 = last_tab_entry;
          mask_idx[b] = k2;
        } else {
          mask_idx[b] = 0;
        }
      }
      assert$2(b == gfc.npart_l - 1);
      a = avg[b - 1] + avg[b];
      if (a > 0) {
        var m2 = max[b - 1];
        if (m2 < max[b])
          m2 = max[b];
        assert$2(gfc.numlines_l[b - 1] + gfc.numlines_l[b] - 1 > 0);
        a = 20 * (m2 * 2 - a) / (a * (gfc.numlines_l[b - 1] + gfc.numlines_l[b] - 1));
        var k2 = 0 | a;
        if (k2 > last_tab_entry)
          k2 = last_tab_entry;
        mask_idx[b] = k2;
      } else {
        mask_idx[b] = 0;
      }
      assert$2(b == gfc.npart_l - 1);
    }
    var fircoef = [
      -865163e-23 * 2,
      -851586e-8 * 2,
      -674764e-23 * 2,
      0.0209036 * 2,
      -336639e-22 * 2,
      -0.0438162 * 2,
      -154175e-22 * 2,
      0.0931738 * 2,
      -552212e-22 * 2,
      -0.313819 * 2
    ];
    this.L3psycho_anal_ns = function(gfp, buffer, bufPos, gr_out, masking_ratio, masking_MS_ratio, percep_entropy, percep_MS_entropy, energy, blocktype_d) {
      var gfc = gfp.internal_flags;
      var wsamp_L = new_float_n$2([2, Encoder$6.BLKSIZE]);
      var wsamp_S = new_float_n$2([2, 3, Encoder$6.BLKSIZE_s]);
      var eb_l = new_float$6(Encoder$6.CBANDS + 1);
      var eb_s = new_float$6(Encoder$6.CBANDS + 1);
      var thr = new_float$6(Encoder$6.CBANDS + 2);
      var blocktype = new_int$7(2), uselongblock = new_int$7(2);
      var numchn, chn;
      var b, i, j, k2;
      var sb, sblock;
      var ns_hpfsmpl = new_float_n$2([2, 576]);
      var pcfact;
      var mask_idx_l = new_int$7(Encoder$6.CBANDS + 2), mask_idx_s = new_int$7(Encoder$6.CBANDS + 2);
      Arrays$2.fill(mask_idx_s, 0);
      numchn = gfc.channels_out;
      if (gfp.mode == MPEGMode$1.JOINT_STEREO)
        numchn = 4;
      if (gfp.VBR == VbrMode$1.vbr_off)
        pcfact = gfc.ResvMax == 0 ? 0 : gfc.ResvSize / gfc.ResvMax * 0.5;
      else if (gfp.VBR == VbrMode$1.vbr_rh || gfp.VBR == VbrMode$1.vbr_mtrh || gfp.VBR == VbrMode$1.vbr_mt) {
        pcfact = 0.6;
      } else
        pcfact = 1;
      for (chn = 0; chn < gfc.channels_out; chn++) {
        var firbuf2 = buffer[chn];
        var firbufPos = bufPos + 576 - 350 - NSFIRLEN + 192;
        for (i = 0; i < 576; i++) {
          var sum1, sum2;
          sum1 = firbuf2[firbufPos + i + 10];
          sum2 = 0;
          for (j = 0; j < (NSFIRLEN - 1) / 2 - 1; j += 2) {
            sum1 += fircoef[j] * (firbuf2[firbufPos + i + j] + firbuf2[firbufPos + i + NSFIRLEN - j]);
            sum2 += fircoef[j + 1] * (firbuf2[firbufPos + i + j + 1] + firbuf2[firbufPos + i + NSFIRLEN - j - 1]);
          }
          ns_hpfsmpl[chn][i] = sum1 + sum2;
        }
        masking_ratio[gr_out][chn].en.assign(gfc.en[chn]);
        masking_ratio[gr_out][chn].thm.assign(gfc.thm[chn]);
        if (numchn > 2) {
          masking_MS_ratio[gr_out][chn].en.assign(gfc.en[chn + 2]);
          masking_MS_ratio[gr_out][chn].thm.assign(gfc.thm[chn + 2]);
        }
      }
      for (chn = 0; chn < numchn; chn++) {
        var wsamp_l;
        var wsamp_s;
        var en_subshort = new_float$6(12);
        var en_short = [0, 0, 0, 0];
        var attack_intensity = new_float$6(12);
        var ns_uselongblock = 1;
        var attackThreshold;
        var max = new_float$6(Encoder$6.CBANDS), avg = new_float$6(Encoder$6.CBANDS);
        var ns_attacks = [0, 0, 0, 0];
        var fftenergy = new_float$6(Encoder$6.HBLKSIZE);
        var fftenergy_s = new_float_n$2([3, Encoder$6.HBLKSIZE_s]);
        assert$2(gfc.npart_s <= Encoder$6.CBANDS);
        assert$2(gfc.npart_l <= Encoder$6.CBANDS);
        for (i = 0; i < 3; i++) {
          en_subshort[i] = gfc.nsPsy.last_en_subshort[chn][i + 6];
          assert$2(gfc.nsPsy.last_en_subshort[chn][i + 4] > 0);
          attack_intensity[i] = en_subshort[i] / gfc.nsPsy.last_en_subshort[chn][i + 4];
          en_short[0] += en_subshort[i];
        }
        if (chn == 2) {
          for (i = 0; i < 576; i++) {
            var l2, r;
            l2 = ns_hpfsmpl[0][i];
            r = ns_hpfsmpl[1][i];
            ns_hpfsmpl[0][i] = l2 + r;
            ns_hpfsmpl[1][i] = l2 - r;
          }
        }
        {
          var pf = ns_hpfsmpl[chn & 1];
          var pfPos = 0;
          for (i = 0; i < 9; i++) {
            var pfe = pfPos + 576 / 9;
            var p2 = 1;
            for (; pfPos < pfe; pfPos++)
              if (p2 < Math.abs(pf[pfPos]))
                p2 = Math.abs(pf[pfPos]);
            gfc.nsPsy.last_en_subshort[chn][i] = en_subshort[i + 3] = p2;
            en_short[1 + i / 3] += p2;
            if (p2 > en_subshort[i + 3 - 2]) {
              assert$2(en_subshort[i + 3 - 2] > 0);
              p2 = p2 / en_subshort[i + 3 - 2];
            } else if (en_subshort[i + 3 - 2] > p2 * 10) {
              p2 = en_subshort[i + 3 - 2] / (p2 * 10);
            } else
              p2 = 0;
            attack_intensity[i + 3] = p2;
          }
        }
        if (gfp.analysis) {
          var x = attack_intensity[0];
          for (i = 1; i < 12; i++)
            if (x < attack_intensity[i])
              x = attack_intensity[i];
          gfc.pinfo.ers[gr_out][chn] = gfc.pinfo.ers_save[chn];
          gfc.pinfo.ers_save[chn] = x;
        }
        attackThreshold = chn == 3 ? gfc.nsPsy.attackthre_s : gfc.nsPsy.attackthre;
        for (i = 0; i < 12; i++)
          if (0 == ns_attacks[i / 3] && attack_intensity[i] > attackThreshold)
            ns_attacks[i / 3] = i % 3 + 1;
        for (i = 1; i < 4; i++) {
          var ratio;
          if (en_short[i - 1] > en_short[i]) {
            assert$2(en_short[i] > 0);
            ratio = en_short[i - 1] / en_short[i];
          } else {
            assert$2(en_short[i - 1] > 0);
            ratio = en_short[i] / en_short[i - 1];
          }
          if (ratio < 1.7) {
            ns_attacks[i] = 0;
            if (i == 1)
              ns_attacks[0] = 0;
          }
        }
        if (ns_attacks[0] != 0 && gfc.nsPsy.lastAttacks[chn] != 0)
          ns_attacks[0] = 0;
        if (gfc.nsPsy.lastAttacks[chn] == 3 || ns_attacks[0] + ns_attacks[1] + ns_attacks[2] + ns_attacks[3] != 0) {
          ns_uselongblock = 0;
          if (ns_attacks[1] != 0 && ns_attacks[0] != 0)
            ns_attacks[1] = 0;
          if (ns_attacks[2] != 0 && ns_attacks[1] != 0)
            ns_attacks[2] = 0;
          if (ns_attacks[3] != 0 && ns_attacks[2] != 0)
            ns_attacks[3] = 0;
        }
        if (chn < 2) {
          uselongblock[chn] = ns_uselongblock;
        } else {
          if (ns_uselongblock == 0) {
            uselongblock[0] = uselongblock[1] = 0;
          }
        }
        energy[chn] = gfc.tot_ener[chn];
        wsamp_s = wsamp_S;
        wsamp_l = wsamp_L;
        compute_ffts(
          gfp,
          fftenergy,
          fftenergy_s,
          wsamp_l,
          chn & 1,
          wsamp_s,
          chn & 1,
          gr_out,
          chn,
          buffer,
          bufPos
        );
        calc_energy(gfc, fftenergy, eb_l, max, avg);
        calc_mask_index_l(gfc, max, avg, mask_idx_l);
        for (sblock = 0; sblock < 3; sblock++) {
          var enn, thmm;
          compute_masking_s(gfp, fftenergy_s, eb_s, thr, chn, sblock);
          convert_partition2scalefac_s(gfc, eb_s, thr, chn, sblock);
          for (sb = 0; sb < Encoder$6.SBMAX_s; sb++) {
            thmm = gfc.thm[chn].s[sb][sblock];
            thmm *= NS_PREECHO_ATT0;
            if (ns_attacks[sblock] >= 2 || ns_attacks[sblock + 1] == 1) {
              var idx = sblock != 0 ? sblock - 1 : 2;
              var p2 = NS_INTERP(
                gfc.thm[chn].s[sb][idx],
                thmm,
                NS_PREECHO_ATT1 * pcfact
              );
              thmm = Math.min(thmm, p2);
            }
            if (ns_attacks[sblock] == 1) {
              var idx = sblock != 0 ? sblock - 1 : 2;
              var p2 = NS_INTERP(
                gfc.thm[chn].s[sb][idx],
                thmm,
                NS_PREECHO_ATT2 * pcfact
              );
              thmm = Math.min(thmm, p2);
            } else if (sblock != 0 && ns_attacks[sblock - 1] == 3 || sblock == 0 && gfc.nsPsy.lastAttacks[chn] == 3) {
              var idx = sblock != 2 ? sblock + 1 : 0;
              var p2 = NS_INTERP(
                gfc.thm[chn].s[sb][idx],
                thmm,
                NS_PREECHO_ATT2 * pcfact
              );
              thmm = Math.min(thmm, p2);
            }
            enn = en_subshort[sblock * 3 + 3] + en_subshort[sblock * 3 + 4] + en_subshort[sblock * 3 + 5];
            if (en_subshort[sblock * 3 + 5] * 6 < enn) {
              thmm *= 0.5;
              if (en_subshort[sblock * 3 + 4] * 6 < enn)
                thmm *= 0.5;
            }
            gfc.thm[chn].s[sb][sblock] = thmm;
          }
        }
        gfc.nsPsy.lastAttacks[chn] = ns_attacks[2];
        k2 = 0;
        {
          for (b = 0; b < gfc.npart_l; b++) {
            var kk = gfc.s3ind[b][0];
            var eb2 = eb_l[kk] * tab[mask_idx_l[kk]];
            var ecb = gfc.s3_ll[k2++] * eb2;
            while (++kk <= gfc.s3ind[b][1]) {
              eb2 = eb_l[kk] * tab[mask_idx_l[kk]];
              ecb = mask_add(
                ecb,
                gfc.s3_ll[k2++] * eb2,
                kk,
                kk - b,
                gfc
              );
            }
            ecb *= 0.158489319246111;
            if (gfc.blocktype_old[chn & 1] == Encoder$6.SHORT_TYPE)
              thr[b] = ecb;
            else
              thr[b] = NS_INTERP(
                Math.min(ecb, Math.min(rpelev * gfc.nb_1[chn][b], rpelev2 * gfc.nb_2[chn][b])),
                ecb,
                pcfact
              );
            gfc.nb_2[chn][b] = gfc.nb_1[chn][b];
            gfc.nb_1[chn][b] = ecb;
          }
        }
        for (; b <= Encoder$6.CBANDS; ++b) {
          eb_l[b] = 0;
          thr[b] = 0;
        }
        convert_partition2scalefac_l(gfc, eb_l, thr, chn);
      }
      if (gfp.mode == MPEGMode$1.STEREO || gfp.mode == MPEGMode$1.JOINT_STEREO) {
        if (gfp.interChRatio > 0) {
          calc_interchannel_masking(gfp, gfp.interChRatio);
        }
      }
      if (gfp.mode == MPEGMode$1.JOINT_STEREO) {
        var msfix;
        msfix1(gfc);
        msfix = gfp.msfix;
        if (Math.abs(msfix) > 0)
          ns_msfix(gfc, msfix, gfp.ATHlower * gfc.ATH.adjust);
      }
      block_type_set(gfp, uselongblock, blocktype_d, blocktype);
      for (chn = 0; chn < numchn; chn++) {
        var ppe;
        var ppePos = 0;
        var type;
        var mr;
        if (chn > 1) {
          ppe = percep_MS_entropy;
          ppePos = -2;
          type = Encoder$6.NORM_TYPE;
          if (blocktype_d[0] == Encoder$6.SHORT_TYPE || blocktype_d[1] == Encoder$6.SHORT_TYPE)
            type = Encoder$6.SHORT_TYPE;
          mr = masking_MS_ratio[gr_out][chn - 2];
        } else {
          ppe = percep_entropy;
          ppePos = 0;
          type = blocktype_d[chn];
          mr = masking_ratio[gr_out][chn];
        }
        if (type == Encoder$6.SHORT_TYPE)
          ppe[ppePos + chn] = pecalc_s(mr, gfc.masking_lower);
        else
          ppe[ppePos + chn] = pecalc_l(mr, gfc.masking_lower);
        if (gfp.analysis)
          gfc.pinfo.pe[gr_out][chn] = ppe[ppePos + chn];
      }
      return 0;
    };
    function vbrpsy_compute_fft_l(gfp, buffer, bufPos, chn, gr_out, fftenergy, wsamp_l, wsamp_lPos) {
      var gfc = gfp.internal_flags;
      if (chn < 2) {
        fft.fft_long(gfc, wsamp_l[wsamp_lPos], chn, buffer, bufPos);
      } else if (chn == 2) {
        for (var j = Encoder$6.BLKSIZE - 1; j >= 0; --j) {
          var l2 = wsamp_l[wsamp_lPos + 0][j];
          var r = wsamp_l[wsamp_lPos + 1][j];
          wsamp_l[wsamp_lPos + 0][j] = (l2 + r) * Util.SQRT2 * 0.5;
          wsamp_l[wsamp_lPos + 1][j] = (l2 - r) * Util.SQRT2 * 0.5;
        }
      }
      fftenergy[0] = NON_LINEAR_SCALE_ENERGY(wsamp_l[wsamp_lPos + 0][0]);
      fftenergy[0] *= fftenergy[0];
      for (var j = Encoder$6.BLKSIZE / 2 - 1; j >= 0; --j) {
        var re = wsamp_l[wsamp_lPos + 0][Encoder$6.BLKSIZE / 2 - j];
        var im = wsamp_l[wsamp_lPos + 0][Encoder$6.BLKSIZE / 2 + j];
        fftenergy[Encoder$6.BLKSIZE / 2 - j] = NON_LINEAR_SCALE_ENERGY((re * re + im * im) * 0.5);
      }
      {
        var totalenergy = 0;
        for (var j = 11; j < Encoder$6.HBLKSIZE; j++)
          totalenergy += fftenergy[j];
        gfc.tot_ener[chn] = totalenergy;
      }
      if (gfp.analysis) {
        for (var j = 0; j < Encoder$6.HBLKSIZE; j++) {
          gfc.pinfo.energy[gr_out][chn][j] = gfc.pinfo.energy_save[chn][j];
          gfc.pinfo.energy_save[chn][j] = fftenergy[j];
        }
        gfc.pinfo.pe[gr_out][chn] = gfc.pe[chn];
      }
    }
    function vbrpsy_compute_fft_s(gfp, buffer, bufPos, chn, sblock, fftenergy_s, wsamp_s, wsamp_sPos) {
      var gfc = gfp.internal_flags;
      if (sblock == 0 && chn < 2) {
        fft.fft_short(gfc, wsamp_s[wsamp_sPos], chn, buffer, bufPos);
      }
      if (chn == 2) {
        for (var j = Encoder$6.BLKSIZE_s - 1; j >= 0; --j) {
          var l2 = wsamp_s[wsamp_sPos + 0][sblock][j];
          var r = wsamp_s[wsamp_sPos + 1][sblock][j];
          wsamp_s[wsamp_sPos + 0][sblock][j] = (l2 + r) * Util.SQRT2 * 0.5;
          wsamp_s[wsamp_sPos + 1][sblock][j] = (l2 - r) * Util.SQRT2 * 0.5;
        }
      }
      fftenergy_s[sblock][0] = wsamp_s[wsamp_sPos + 0][sblock][0];
      fftenergy_s[sblock][0] *= fftenergy_s[sblock][0];
      for (var j = Encoder$6.BLKSIZE_s / 2 - 1; j >= 0; --j) {
        var re = wsamp_s[wsamp_sPos + 0][sblock][Encoder$6.BLKSIZE_s / 2 - j];
        var im = wsamp_s[wsamp_sPos + 0][sblock][Encoder$6.BLKSIZE_s / 2 + j];
        fftenergy_s[sblock][Encoder$6.BLKSIZE_s / 2 - j] = NON_LINEAR_SCALE_ENERGY((re * re + im * im) * 0.5);
      }
    }
    function vbrpsy_compute_loudness_approximation_l(gfp, gr_out, chn, fftenergy) {
      var gfc = gfp.internal_flags;
      if (gfp.athaa_loudapprox == 2 && chn < 2) {
        gfc.loudness_sq[gr_out][chn] = gfc.loudness_sq_save[chn];
        gfc.loudness_sq_save[chn] = psycho_loudness_approx(fftenergy, gfc);
      }
    }
    var fircoef_ = [
      -865163e-23 * 2,
      -851586e-8 * 2,
      -674764e-23 * 2,
      0.0209036 * 2,
      -336639e-22 * 2,
      -0.0438162 * 2,
      -154175e-22 * 2,
      0.0931738 * 2,
      -552212e-22 * 2,
      -0.313819 * 2
    ];
    function vbrpsy_attack_detection(gfp, buffer, bufPos, gr_out, masking_ratio, masking_MS_ratio, energy, sub_short_factor, ns_attacks, uselongblock) {
      var ns_hpfsmpl = new_float_n$2([2, 576]);
      var gfc = gfp.internal_flags;
      var n_chn_out = gfc.channels_out;
      var n_chn_psy = gfp.mode == MPEGMode$1.JOINT_STEREO ? 4 : n_chn_out;
      for (var chn = 0; chn < n_chn_out; chn++) {
        firbuf = buffer[chn];
        var firbufPos = bufPos + 576 - 350 - NSFIRLEN + 192;
        for (var i = 0; i < 576; i++) {
          var sum1, sum2;
          sum1 = firbuf[firbufPos + i + 10];
          sum2 = 0;
          for (var j = 0; j < (NSFIRLEN - 1) / 2 - 1; j += 2) {
            sum1 += fircoef_[j] * (firbuf[firbufPos + i + j] + firbuf[firbufPos + i + NSFIRLEN - j]);
            sum2 += fircoef_[j + 1] * (firbuf[firbufPos + i + j + 1] + firbuf[firbufPos + i + NSFIRLEN - j - 1]);
          }
          ns_hpfsmpl[chn][i] = sum1 + sum2;
        }
        masking_ratio[gr_out][chn].en.assign(gfc.en[chn]);
        masking_ratio[gr_out][chn].thm.assign(gfc.thm[chn]);
        if (n_chn_psy > 2) {
          masking_MS_ratio[gr_out][chn].en.assign(gfc.en[chn + 2]);
          masking_MS_ratio[gr_out][chn].thm.assign(gfc.thm[chn + 2]);
        }
      }
      for (var chn = 0; chn < n_chn_psy; chn++) {
        var attack_intensity = new_float$6(12);
        var en_subshort = new_float$6(12);
        var en_short = [0, 0, 0, 0];
        var pf = ns_hpfsmpl[chn & 1];
        var pfPos = 0;
        var attackThreshold = chn == 3 ? gfc.nsPsy.attackthre_s : gfc.nsPsy.attackthre;
        var ns_uselongblock = 1;
        if (chn == 2) {
          for (var i = 0, j = 576; j > 0; ++i, --j) {
            var l2 = ns_hpfsmpl[0][i];
            var r = ns_hpfsmpl[1][i];
            ns_hpfsmpl[0][i] = l2 + r;
            ns_hpfsmpl[1][i] = l2 - r;
          }
        }
        for (var i = 0; i < 3; i++) {
          en_subshort[i] = gfc.nsPsy.last_en_subshort[chn][i + 6];
          assert$2(gfc.nsPsy.last_en_subshort[chn][i + 4] > 0);
          attack_intensity[i] = en_subshort[i] / gfc.nsPsy.last_en_subshort[chn][i + 4];
          en_short[0] += en_subshort[i];
        }
        for (var i = 0; i < 9; i++) {
          var pfe = pfPos + 576 / 9;
          var p2 = 1;
          for (; pfPos < pfe; pfPos++)
            if (p2 < Math.abs(pf[pfPos]))
              p2 = Math.abs(pf[pfPos]);
          gfc.nsPsy.last_en_subshort[chn][i] = en_subshort[i + 3] = p2;
          en_short[1 + i / 3] += p2;
          if (p2 > en_subshort[i + 3 - 2]) {
            assert$2(en_subshort[i + 3 - 2] > 0);
            p2 = p2 / en_subshort[i + 3 - 2];
          } else if (en_subshort[i + 3 - 2] > p2 * 10) {
            p2 = en_subshort[i + 3 - 2] / (p2 * 10);
          } else {
            p2 = 0;
          }
          attack_intensity[i + 3] = p2;
        }
        for (var i = 0; i < 3; ++i) {
          var enn = en_subshort[i * 3 + 3] + en_subshort[i * 3 + 4] + en_subshort[i * 3 + 5];
          var factor = 1;
          if (en_subshort[i * 3 + 5] * 6 < enn) {
            factor *= 0.5;
            if (en_subshort[i * 3 + 4] * 6 < enn) {
              factor *= 0.5;
            }
          }
          sub_short_factor[chn][i] = factor;
        }
        if (gfp.analysis) {
          var x = attack_intensity[0];
          for (var i = 1; i < 12; i++) {
            if (x < attack_intensity[i]) {
              x = attack_intensity[i];
            }
          }
          gfc.pinfo.ers[gr_out][chn] = gfc.pinfo.ers_save[chn];
          gfc.pinfo.ers_save[chn] = x;
        }
        for (var i = 0; i < 12; i++) {
          if (0 == ns_attacks[chn][i / 3] && attack_intensity[i] > attackThreshold) {
            ns_attacks[chn][i / 3] = i % 3 + 1;
          }
        }
        for (var i = 1; i < 4; i++) {
          var u = en_short[i - 1];
          var v = en_short[i];
          var m2 = Math.max(u, v);
          if (m2 < 4e4) {
            if (u < 1.7 * v && v < 1.7 * u) {
              if (i == 1 && ns_attacks[chn][0] <= ns_attacks[chn][i]) {
                ns_attacks[chn][0] = 0;
              }
              ns_attacks[chn][i] = 0;
            }
          }
        }
        if (ns_attacks[chn][0] <= gfc.nsPsy.lastAttacks[chn]) {
          ns_attacks[chn][0] = 0;
        }
        if (gfc.nsPsy.lastAttacks[chn] == 3 || ns_attacks[chn][0] + ns_attacks[chn][1] + ns_attacks[chn][2] + ns_attacks[chn][3] != 0) {
          ns_uselongblock = 0;
          if (ns_attacks[chn][1] != 0 && ns_attacks[chn][0] != 0) {
            ns_attacks[chn][1] = 0;
          }
          if (ns_attacks[chn][2] != 0 && ns_attacks[chn][1] != 0) {
            ns_attacks[chn][2] = 0;
          }
          if (ns_attacks[chn][3] != 0 && ns_attacks[chn][2] != 0) {
            ns_attacks[chn][3] = 0;
          }
        }
        if (chn < 2) {
          uselongblock[chn] = ns_uselongblock;
        } else {
          if (ns_uselongblock == 0) {
            uselongblock[0] = uselongblock[1] = 0;
          }
        }
        energy[chn] = gfc.tot_ener[chn];
      }
    }
    function vbrpsy_skip_masking_s(gfc, chn, sblock) {
      if (sblock == 0) {
        for (var b = 0; b < gfc.npart_s; b++) {
          gfc.nb_s2[chn][b] = gfc.nb_s1[chn][b];
          gfc.nb_s1[chn][b] = 0;
        }
      }
    }
    function vbrpsy_skip_masking_l(gfc, chn) {
      for (var b = 0; b < gfc.npart_l; b++) {
        gfc.nb_2[chn][b] = gfc.nb_1[chn][b];
        gfc.nb_1[chn][b] = 0;
      }
    }
    function psyvbr_calc_mask_index_s(gfc, max, avg, mask_idx) {
      var last_tab_entry = tab.length - 1;
      var b = 0;
      var a = avg[b] + avg[b + 1];
      if (a > 0) {
        var m2 = max[b];
        if (m2 < max[b + 1])
          m2 = max[b + 1];
        assert$2(gfc.numlines_s[b] + gfc.numlines_s[b + 1] - 1 > 0);
        a = 20 * (m2 * 2 - a) / (a * (gfc.numlines_s[b] + gfc.numlines_s[b + 1] - 1));
        var k2 = 0 | a;
        if (k2 > last_tab_entry)
          k2 = last_tab_entry;
        mask_idx[b] = k2;
      } else {
        mask_idx[b] = 0;
      }
      for (b = 1; b < gfc.npart_s - 1; b++) {
        a = avg[b - 1] + avg[b] + avg[b + 1];
        assert$2(b + 1 < gfc.npart_s);
        if (a > 0) {
          var m2 = max[b - 1];
          if (m2 < max[b])
            m2 = max[b];
          if (m2 < max[b + 1])
            m2 = max[b + 1];
          assert$2(gfc.numlines_s[b - 1] + gfc.numlines_s[b] + gfc.numlines_s[b + 1] - 1 > 0);
          a = 20 * (m2 * 3 - a) / (a * (gfc.numlines_s[b - 1] + gfc.numlines_s[b] + gfc.numlines_s[b + 1] - 1));
          var k2 = 0 | a;
          if (k2 > last_tab_entry)
            k2 = last_tab_entry;
          mask_idx[b] = k2;
        } else {
          mask_idx[b] = 0;
        }
      }
      assert$2(b == gfc.npart_s - 1);
      a = avg[b - 1] + avg[b];
      if (a > 0) {
        var m2 = max[b - 1];
        if (m2 < max[b])
          m2 = max[b];
        assert$2(gfc.numlines_s[b - 1] + gfc.numlines_s[b] - 1 > 0);
        a = 20 * (m2 * 2 - a) / (a * (gfc.numlines_s[b - 1] + gfc.numlines_s[b] - 1));
        var k2 = 0 | a;
        if (k2 > last_tab_entry)
          k2 = last_tab_entry;
        mask_idx[b] = k2;
      } else {
        mask_idx[b] = 0;
      }
      assert$2(b == gfc.npart_s - 1);
    }
    function vbrpsy_compute_masking_s(gfp, fftenergy_s, eb, thr, chn, sblock) {
      var gfc = gfp.internal_flags;
      var max = new float[Encoder$6.CBANDS](), avg = new_float$6(Encoder$6.CBANDS);
      var i, j, b;
      var mask_idx_s = new int[Encoder$6.CBANDS]();
      for (b = j = 0; b < gfc.npart_s; ++b) {
        var ebb = 0, m2 = 0;
        var n2 = gfc.numlines_s[b];
        for (i = 0; i < n2; ++i, ++j) {
          var el = fftenergy_s[sblock][j];
          ebb += el;
          if (m2 < el)
            m2 = el;
        }
        eb[b] = ebb;
        max[b] = m2;
        avg[b] = ebb / n2;
        assert$2(avg[b] >= 0);
      }
      assert$2(b == gfc.npart_s);
      for (; b < Encoder$6.CBANDS; ++b) {
        max[b] = 0;
        avg[b] = 0;
      }
      psyvbr_calc_mask_index_s(gfc, max, avg, mask_idx_s);
      for (j = b = 0; b < gfc.npart_s; b++) {
        var kk = gfc.s3ind_s[b][0];
        var last = gfc.s3ind_s[b][1];
        var dd, dd_n;
        var x, ecb, avg_mask;
        dd = mask_idx_s[kk];
        dd_n = 1;
        ecb = gfc.s3_ss[j] * eb[kk] * tab[mask_idx_s[kk]];
        ++j;
        ++kk;
        while (kk <= last) {
          dd += mask_idx_s[kk];
          dd_n += 1;
          x = gfc.s3_ss[j] * eb[kk] * tab[mask_idx_s[kk]];
          ecb = vbrpsy_mask_add(ecb, x, kk - b);
          ++j;
          ++kk;
        }
        dd = (1 + 2 * dd) / (2 * dd_n);
        avg_mask = tab[dd] * 0.5;
        ecb *= avg_mask;
        thr[b] = ecb;
        gfc.nb_s2[chn][b] = gfc.nb_s1[chn][b];
        gfc.nb_s1[chn][b] = ecb;
        {
          x = max[b];
          x *= gfc.minval_s[b];
          x *= avg_mask;
          if (thr[b] > x) {
            thr[b] = x;
          }
        }
        if (gfc.masking_lower > 1) {
          thr[b] *= gfc.masking_lower;
        }
        if (thr[b] > eb[b]) {
          thr[b] = eb[b];
        }
        if (gfc.masking_lower < 1) {
          thr[b] *= gfc.masking_lower;
        }
        assert$2(thr[b] >= 0);
      }
      for (; b < Encoder$6.CBANDS; ++b) {
        eb[b] = 0;
        thr[b] = 0;
      }
    }
    function vbrpsy_compute_masking_l(gfc, fftenergy, eb_l, thr, chn) {
      var max = new_float$6(Encoder$6.CBANDS), avg = new_float$6(Encoder$6.CBANDS);
      var mask_idx_l = new_int$7(Encoder$6.CBANDS + 2);
      var b;
      calc_energy(gfc, fftenergy, eb_l, max, avg);
      calc_mask_index_l(gfc, max, avg, mask_idx_l);
      var k2 = 0;
      for (b = 0; b < gfc.npart_l; b++) {
        var x, ecb, avg_mask, t;
        var kk = gfc.s3ind[b][0];
        var last = gfc.s3ind[b][1];
        var dd = 0, dd_n = 0;
        dd = mask_idx_l[kk];
        dd_n += 1;
        ecb = gfc.s3_ll[k2] * eb_l[kk] * tab[mask_idx_l[kk]];
        ++k2;
        ++kk;
        while (kk <= last) {
          dd += mask_idx_l[kk];
          dd_n += 1;
          x = gfc.s3_ll[k2] * eb_l[kk] * tab[mask_idx_l[kk]];
          t = vbrpsy_mask_add(ecb, x, kk - b);
          ecb = t;
          ++k2;
          ++kk;
        }
        dd = (1 + 2 * dd) / (2 * dd_n);
        avg_mask = tab[dd] * 0.5;
        ecb *= avg_mask;
        if (gfc.blocktype_old[chn & 1] == Encoder$6.SHORT_TYPE) {
          var ecb_limit = rpelev * gfc.nb_1[chn][b];
          if (ecb_limit > 0) {
            thr[b] = Math.min(ecb, ecb_limit);
          } else {
            thr[b] = Math.min(ecb, eb_l[b] * NS_PREECHO_ATT2);
          }
        } else {
          var ecb_limit_2 = rpelev2 * gfc.nb_2[chn][b];
          var ecb_limit_1 = rpelev * gfc.nb_1[chn][b];
          var ecb_limit;
          if (ecb_limit_2 <= 0) {
            ecb_limit_2 = ecb;
          }
          if (ecb_limit_1 <= 0) {
            ecb_limit_1 = ecb;
          }
          if (gfc.blocktype_old[chn & 1] == Encoder$6.NORM_TYPE) {
            ecb_limit = Math.min(ecb_limit_1, ecb_limit_2);
          } else {
            ecb_limit = ecb_limit_1;
          }
          thr[b] = Math.min(ecb, ecb_limit);
        }
        gfc.nb_2[chn][b] = gfc.nb_1[chn][b];
        gfc.nb_1[chn][b] = ecb;
        {
          x = max[b];
          x *= gfc.minval_l[b];
          x *= avg_mask;
          if (thr[b] > x) {
            thr[b] = x;
          }
        }
        if (gfc.masking_lower > 1) {
          thr[b] *= gfc.masking_lower;
        }
        if (thr[b] > eb_l[b]) {
          thr[b] = eb_l[b];
        }
        if (gfc.masking_lower < 1) {
          thr[b] *= gfc.masking_lower;
        }
        assert$2(thr[b] >= 0);
      }
      for (; b < Encoder$6.CBANDS; ++b) {
        eb_l[b] = 0;
        thr[b] = 0;
      }
    }
    function vbrpsy_compute_block_type(gfp, uselongblock) {
      var gfc = gfp.internal_flags;
      if (gfp.short_blocks == ShortBlock$1.short_block_coupled && !(uselongblock[0] != 0 && uselongblock[1] != 0))
        uselongblock[0] = uselongblock[1] = 0;
      for (var chn = 0; chn < gfc.channels_out; chn++) {
        if (gfp.short_blocks == ShortBlock$1.short_block_dispensed) {
          uselongblock[chn] = 1;
        }
        if (gfp.short_blocks == ShortBlock$1.short_block_forced) {
          uselongblock[chn] = 0;
        }
      }
    }
    function vbrpsy_apply_block_type(gfp, uselongblock, blocktype_d) {
      var gfc = gfp.internal_flags;
      for (var chn = 0; chn < gfc.channels_out; chn++) {
        var blocktype = Encoder$6.NORM_TYPE;
        if (uselongblock[chn] != 0) {
          assert$2(gfc.blocktype_old[chn] != Encoder$6.START_TYPE);
          if (gfc.blocktype_old[chn] == Encoder$6.SHORT_TYPE)
            blocktype = Encoder$6.STOP_TYPE;
        } else {
          blocktype = Encoder$6.SHORT_TYPE;
          if (gfc.blocktype_old[chn] == Encoder$6.NORM_TYPE) {
            gfc.blocktype_old[chn] = Encoder$6.START_TYPE;
          }
          if (gfc.blocktype_old[chn] == Encoder$6.STOP_TYPE)
            gfc.blocktype_old[chn] = Encoder$6.SHORT_TYPE;
        }
        blocktype_d[chn] = gfc.blocktype_old[chn];
        gfc.blocktype_old[chn] = blocktype;
      }
    }
    function vbrpsy_compute_MS_thresholds(eb, thr, cb_mld, ath_cb, athadjust, msfix, n2) {
      var msfix2 = msfix * 2;
      var athlower = msfix > 0 ? Math.pow(10, athadjust) : 1;
      var rside, rmid;
      for (var b = 0; b < n2; ++b) {
        var ebM = eb[2][b];
        var ebS = eb[3][b];
        var thmL = thr[0][b];
        var thmR = thr[1][b];
        var thmM = thr[2][b];
        var thmS = thr[3][b];
        if (thmL <= 1.58 * thmR && thmR <= 1.58 * thmL) {
          var mld_m = cb_mld[b] * ebS;
          var mld_s = cb_mld[b] * ebM;
          rmid = Math.max(thmM, Math.min(thmS, mld_m));
          rside = Math.max(thmS, Math.min(thmM, mld_s));
        } else {
          rmid = thmM;
          rside = thmS;
        }
        if (msfix > 0) {
          var thmLR, thmMS;
          var ath = ath_cb[b] * athlower;
          thmLR = Math.min(Math.max(thmL, ath), Math.max(thmR, ath));
          thmM = Math.max(rmid, ath);
          thmS = Math.max(rside, ath);
          thmMS = thmM + thmS;
          if (thmMS > 0 && thmLR * msfix2 < thmMS) {
            var f2 = thmLR * msfix2 / thmMS;
            thmM *= f2;
            thmS *= f2;
          }
          rmid = Math.min(thmM, rmid);
          rside = Math.min(thmS, rside);
        }
        if (rmid > ebM) {
          rmid = ebM;
        }
        if (rside > ebS) {
          rside = ebS;
        }
        thr[2][b] = rmid;
        thr[3][b] = rside;
      }
    }
    this.L3psycho_anal_vbr = function(gfp, buffer, bufPos, gr_out, masking_ratio, masking_MS_ratio, percep_entropy, percep_MS_entropy, energy, blocktype_d) {
      var gfc = gfp.internal_flags;
      var wsamp_l;
      var wsamp_s;
      var fftenergy = new_float$6(Encoder$6.HBLKSIZE);
      var fftenergy_s = new_float_n$2([3, Encoder$6.HBLKSIZE_s]);
      var wsamp_L = new_float_n$2([2, Encoder$6.BLKSIZE]);
      var wsamp_S = new_float_n$2([2, 3, Encoder$6.BLKSIZE_s]);
      var eb = new_float_n$2([4, Encoder$6.CBANDS]), thr = new_float_n$2([4, Encoder$6.CBANDS]);
      var sub_short_factor = new_float_n$2([4, 3]);
      var pcfact = 0.6;
      var ns_attacks = [
        [0, 0, 0, 0],
        [0, 0, 0, 0],
        [0, 0, 0, 0],
        [0, 0, 0, 0]
      ];
      var uselongblock = new_int$7(2);
      var n_chn_psy = gfp.mode == MPEGMode$1.JOINT_STEREO ? 4 : gfc.channels_out;
      vbrpsy_attack_detection(
        gfp,
        buffer,
        bufPos,
        gr_out,
        masking_ratio,
        masking_MS_ratio,
        energy,
        sub_short_factor,
        ns_attacks,
        uselongblock
      );
      vbrpsy_compute_block_type(gfp, uselongblock);
      {
        for (var chn = 0; chn < n_chn_psy; chn++) {
          var ch01 = chn & 1;
          wsamp_l = wsamp_L;
          vbrpsy_compute_fft_l(
            gfp,
            buffer,
            bufPos,
            chn,
            gr_out,
            fftenergy,
            wsamp_l,
            ch01
          );
          vbrpsy_compute_loudness_approximation_l(
            gfp,
            gr_out,
            chn,
            fftenergy
          );
          if (uselongblock[ch01] != 0) {
            vbrpsy_compute_masking_l(
              gfc,
              fftenergy,
              eb[chn],
              thr[chn],
              chn
            );
          } else {
            vbrpsy_skip_masking_l(gfc, chn);
          }
        }
        if (uselongblock[0] + uselongblock[1] == 2) {
          if (gfp.mode == MPEGMode$1.JOINT_STEREO) {
            vbrpsy_compute_MS_thresholds(
              eb,
              thr,
              gfc.mld_cb_l,
              gfc.ATH.cb_l,
              gfp.ATHlower * gfc.ATH.adjust,
              gfp.msfix,
              gfc.npart_l
            );
          }
        }
        for (var chn = 0; chn < n_chn_psy; chn++) {
          var ch01 = chn & 1;
          if (uselongblock[ch01] != 0) {
            convert_partition2scalefac_l(gfc, eb[chn], thr[chn], chn);
          }
        }
      }
      {
        for (var sblock = 0; sblock < 3; sblock++) {
          for (var chn = 0; chn < n_chn_psy; ++chn) {
            var ch01 = chn & 1;
            if (uselongblock[ch01] != 0) {
              vbrpsy_skip_masking_s(gfc, chn, sblock);
            } else {
              wsamp_s = wsamp_S;
              vbrpsy_compute_fft_s(
                gfp,
                buffer,
                bufPos,
                chn,
                sblock,
                fftenergy_s,
                wsamp_s,
                ch01
              );
              vbrpsy_compute_masking_s(
                gfp,
                fftenergy_s,
                eb[chn],
                thr[chn],
                chn,
                sblock
              );
            }
          }
          if (uselongblock[0] + uselongblock[1] == 0) {
            if (gfp.mode == MPEGMode$1.JOINT_STEREO) {
              vbrpsy_compute_MS_thresholds(
                eb,
                thr,
                gfc.mld_cb_s,
                gfc.ATH.cb_s,
                gfp.ATHlower * gfc.ATH.adjust,
                gfp.msfix,
                gfc.npart_s
              );
            }
          }
          for (var chn = 0; chn < n_chn_psy; ++chn) {
            var ch01 = chn & 1;
            if (0 == uselongblock[ch01]) {
              convert_partition2scalefac_s(
                gfc,
                eb[chn],
                thr[chn],
                chn,
                sblock
              );
            }
          }
        }
        for (var chn = 0; chn < n_chn_psy; chn++) {
          var ch01 = chn & 1;
          if (uselongblock[ch01] != 0) {
            continue;
          }
          for (var sb = 0; sb < Encoder$6.SBMAX_s; sb++) {
            var new_thmm = new_float$6(3);
            for (var sblock = 0; sblock < 3; sblock++) {
              var thmm = gfc.thm[chn].s[sb][sblock];
              thmm *= NS_PREECHO_ATT0;
              if (ns_attacks[chn][sblock] >= 2 || ns_attacks[chn][sblock + 1] == 1) {
                var idx = sblock != 0 ? sblock - 1 : 2;
                var p2 = NS_INTERP(
                  gfc.thm[chn].s[sb][idx],
                  thmm,
                  NS_PREECHO_ATT1 * pcfact
                );
                thmm = Math.min(thmm, p2);
              } else if (ns_attacks[chn][sblock] == 1) {
                var idx = sblock != 0 ? sblock - 1 : 2;
                var p2 = NS_INTERP(
                  gfc.thm[chn].s[sb][idx],
                  thmm,
                  NS_PREECHO_ATT2 * pcfact
                );
                thmm = Math.min(thmm, p2);
              } else if (sblock != 0 && ns_attacks[chn][sblock - 1] == 3 || sblock == 0 && gfc.nsPsy.lastAttacks[chn] == 3) {
                var idx = sblock != 2 ? sblock + 1 : 0;
                var p2 = NS_INTERP(
                  gfc.thm[chn].s[sb][idx],
                  thmm,
                  NS_PREECHO_ATT2 * pcfact
                );
                thmm = Math.min(thmm, p2);
              }
              thmm *= sub_short_factor[chn][sblock];
              new_thmm[sblock] = thmm;
            }
            for (var sblock = 0; sblock < 3; sblock++) {
              gfc.thm[chn].s[sb][sblock] = new_thmm[sblock];
            }
          }
        }
      }
      for (var chn = 0; chn < n_chn_psy; chn++) {
        gfc.nsPsy.lastAttacks[chn] = ns_attacks[chn][2];
      }
      vbrpsy_apply_block_type(gfp, uselongblock, blocktype_d);
      for (var chn = 0; chn < n_chn_psy; chn++) {
        var ppe;
        var ppePos;
        var type;
        var mr;
        if (chn > 1) {
          ppe = percep_MS_entropy;
          ppePos = -2;
          type = Encoder$6.NORM_TYPE;
          if (blocktype_d[0] == Encoder$6.SHORT_TYPE || blocktype_d[1] == Encoder$6.SHORT_TYPE)
            type = Encoder$6.SHORT_TYPE;
          mr = masking_MS_ratio[gr_out][chn - 2];
        } else {
          ppe = percep_entropy;
          ppePos = 0;
          type = blocktype_d[chn];
          mr = masking_ratio[gr_out][chn];
        }
        if (type == Encoder$6.SHORT_TYPE) {
          ppe[ppePos + chn] = pecalc_s(mr, gfc.masking_lower);
        } else {
          ppe[ppePos + chn] = pecalc_l(mr, gfc.masking_lower);
        }
        if (gfp.analysis) {
          gfc.pinfo.pe[gr_out][chn] = ppe[ppePos + chn];
        }
      }
      return 0;
    };
    function s3_func_x(bark, hf_slope) {
      var tempx = bark, tempy;
      if (tempx >= 0) {
        tempy = -tempx * 27;
      } else {
        tempy = tempx * hf_slope;
      }
      if (tempy <= -72) {
        return 0;
      }
      return Math.exp(tempy * LN_TO_LOG10);
    }
    function norm_s3_func_x(hf_slope) {
      var lim_a = 0, lim_b = 0;
      {
        var x = 0, l2, h;
        for (x = 0; s3_func_x(x, hf_slope) > 1e-20; x -= 1)
          ;
        l2 = x;
        h = 0;
        while (Math.abs(h - l2) > 1e-12) {
          x = (h + l2) / 2;
          if (s3_func_x(x, hf_slope) > 0) {
            h = x;
          } else {
            l2 = x;
          }
        }
        lim_a = l2;
      }
      {
        var x = 0, l2, h;
        for (x = 0; s3_func_x(x, hf_slope) > 1e-20; x += 1)
          ;
        l2 = 0;
        h = x;
        while (Math.abs(h - l2) > 1e-12) {
          x = (h + l2) / 2;
          if (s3_func_x(x, hf_slope) > 0) {
            l2 = x;
          } else {
            h = x;
          }
        }
        lim_b = h;
      }
      {
        var sum = 0;
        var m2 = 1e3;
        var i;
        for (i = 0; i <= m2; ++i) {
          var x = lim_a + i * (lim_b - lim_a) / m2;
          var y = s3_func_x(x, hf_slope);
          sum += y;
        }
        {
          var norm = (m2 + 1) / (sum * (lim_b - lim_a));
          return norm;
        }
      }
    }
    function s3_func(bark) {
      var tempx, x, tempy, temp;
      tempx = bark;
      if (tempx >= 0)
        tempx *= 3;
      else
        tempx *= 1.5;
      if (tempx >= 0.5 && tempx <= 2.5) {
        temp = tempx - 0.5;
        x = 8 * (temp * temp - 2 * temp);
      } else
        x = 0;
      tempx += 0.474;
      tempy = 15.811389 + 7.5 * tempx - 17.5 * Math.sqrt(1 + tempx * tempx);
      if (tempy <= -60)
        return 0;
      tempx = Math.exp((x + tempy) * LN_TO_LOG10);
      tempx /= 0.6609193;
      return tempx;
    }
    function freq2bark(freq) {
      if (freq < 0)
        freq = 0;
      freq = freq * 1e-3;
      return 13 * Math.atan(0.76 * freq) + 3.5 * Math.atan(freq * freq / (7.5 * 7.5));
    }
    function init_numline(numlines, bo, bm, bval, bval_width, mld, bo_w, sfreq, blksize, scalepos, deltafreq, sbmax) {
      var b_frq = new_float$6(Encoder$6.CBANDS + 1);
      var sample_freq_frac = sfreq / (sbmax > 15 ? 2 * 576 : 2 * 192);
      var partition = new_int$7(Encoder$6.HBLKSIZE);
      var i;
      sfreq /= blksize;
      var j = 0;
      var ni = 0;
      for (i = 0; i < Encoder$6.CBANDS; i++) {
        var bark1;
        var j2;
        bark1 = freq2bark(sfreq * j);
        b_frq[i] = sfreq * j;
        for (j2 = j; freq2bark(sfreq * j2) - bark1 < DELBARK && j2 <= blksize / 2; j2++)
          ;
        numlines[i] = j2 - j;
        ni = i + 1;
        while (j < j2) {
          assert$2(j < Encoder$6.HBLKSIZE);
          partition[j++] = i;
        }
        if (j > blksize / 2) {
          j = blksize / 2;
          ++i;
          break;
        }
      }
      assert$2(i < Encoder$6.CBANDS);
      b_frq[i] = sfreq * j;
      for (var sfb = 0; sfb < sbmax; sfb++) {
        var i1, i2, start, end;
        var arg;
        start = scalepos[sfb];
        end = scalepos[sfb + 1];
        i1 = 0 | Math.floor(0.5 + deltafreq * (start - 0.5));
        if (i1 < 0)
          i1 = 0;
        i2 = 0 | Math.floor(0.5 + deltafreq * (end - 0.5));
        if (i2 > blksize / 2)
          i2 = blksize / 2;
        bm[sfb] = (partition[i1] + partition[i2]) / 2;
        bo[sfb] = partition[i2];
        var f_tmp = sample_freq_frac * end;
        bo_w[sfb] = (f_tmp - b_frq[bo[sfb]]) / (b_frq[bo[sfb] + 1] - b_frq[bo[sfb]]);
        if (bo_w[sfb] < 0) {
          bo_w[sfb] = 0;
        } else {
          if (bo_w[sfb] > 1) {
            bo_w[sfb] = 1;
          }
        }
        arg = freq2bark(sfreq * scalepos[sfb] * deltafreq);
        arg = Math.min(arg, 15.5) / 15.5;
        mld[sfb] = Math.pow(
          10,
          1.25 * (1 - Math.cos(Math.PI * arg)) - 2.5
        );
      }
      j = 0;
      for (var k2 = 0; k2 < ni; k2++) {
        var w = numlines[k2];
        var bark1, bark2;
        bark1 = freq2bark(sfreq * j);
        bark2 = freq2bark(sfreq * (j + w - 1));
        bval[k2] = 0.5 * (bark1 + bark2);
        bark1 = freq2bark(sfreq * (j - 0.5));
        bark2 = freq2bark(sfreq * (j + w - 0.5));
        bval_width[k2] = bark2 - bark1;
        j += w;
      }
      return ni;
    }
    function init_s3_values(s3ind, npart, bval, bval_width, norm, use_old_s3) {
      var s3 = new_float_n$2([Encoder$6.CBANDS, Encoder$6.CBANDS]);
      var j;
      var numberOfNoneZero = 0;
      if (use_old_s3) {
        for (var i = 0; i < npart; i++) {
          for (j = 0; j < npart; j++) {
            var v = s3_func(bval[i] - bval[j]) * bval_width[j];
            s3[i][j] = v * norm[i];
          }
        }
      } else {
        for (j = 0; j < npart; j++) {
          var hf_slope = 15 + Math.min(21 / bval[j], 12);
          var s3_x_norm = norm_s3_func_x(hf_slope);
          for (var i = 0; i < npart; i++) {
            var v = s3_x_norm * s3_func_x(bval[i] - bval[j], hf_slope) * bval_width[j];
            s3[i][j] = v * norm[i];
          }
        }
      }
      for (var i = 0; i < npart; i++) {
        for (j = 0; j < npart; j++) {
          if (s3[i][j] > 0)
            break;
        }
        s3ind[i][0] = j;
        for (j = npart - 1; j > 0; j--) {
          if (s3[i][j] > 0)
            break;
        }
        s3ind[i][1] = j;
        numberOfNoneZero += s3ind[i][1] - s3ind[i][0] + 1;
      }
      var p2 = new_float$6(numberOfNoneZero);
      var k2 = 0;
      for (var i = 0; i < npart; i++)
        for (j = s3ind[i][0]; j <= s3ind[i][1]; j++)
          p2[k2++] = s3[i][j];
      return p2;
    }
    function stereo_demask(f2) {
      var arg = freq2bark(f2);
      arg = Math.min(arg, 15.5) / 15.5;
      return Math.pow(
        10,
        1.25 * (1 - Math.cos(Math.PI * arg)) - 2.5
      );
    }
    this.psymodel_init = function(gfp) {
      var gfc = gfp.internal_flags;
      var i;
      var useOldS3 = true;
      var bvl_a = 13, bvl_b = 24;
      var snr_l_a = 0, snr_l_b = 0;
      var snr_s_a = -8.25, snr_s_b = -4.5;
      var bval = new_float$6(Encoder$6.CBANDS);
      var bval_width = new_float$6(Encoder$6.CBANDS);
      var norm = new_float$6(Encoder$6.CBANDS);
      var sfreq = gfp.out_samplerate;
      switch (gfp.experimentalZ) {
        default:
        case 0:
          useOldS3 = true;
          break;
        case 1:
          useOldS3 = gfp.VBR == VbrMode$1.vbr_mtrh || gfp.VBR == VbrMode$1.vbr_mt ? false : true;
          break;
        case 2:
          useOldS3 = false;
          break;
        case 3:
          bvl_a = 8;
          snr_l_a = -1.75;
          snr_l_b = -0.0125;
          snr_s_a = -8.25;
          snr_s_b = -2.25;
          break;
      }
      gfc.ms_ener_ratio_old = 0.25;
      gfc.blocktype_old[0] = gfc.blocktype_old[1] = Encoder$6.NORM_TYPE;
      for (i = 0; i < 4; ++i) {
        for (var j = 0; j < Encoder$6.CBANDS; ++j) {
          gfc.nb_1[i][j] = 1e20;
          gfc.nb_2[i][j] = 1e20;
          gfc.nb_s1[i][j] = gfc.nb_s2[i][j] = 1;
        }
        for (var sb = 0; sb < Encoder$6.SBMAX_l; sb++) {
          gfc.en[i].l[sb] = 1e20;
          gfc.thm[i].l[sb] = 1e20;
        }
        for (var j = 0; j < 3; ++j) {
          for (var sb = 0; sb < Encoder$6.SBMAX_s; sb++) {
            gfc.en[i].s[sb][j] = 1e20;
            gfc.thm[i].s[sb][j] = 1e20;
          }
          gfc.nsPsy.lastAttacks[i] = 0;
        }
        for (var j = 0; j < 9; j++)
          gfc.nsPsy.last_en_subshort[i][j] = 10;
      }
      gfc.loudness_sq_save[0] = gfc.loudness_sq_save[1] = 0;
      gfc.npart_l = init_numline(
        gfc.numlines_l,
        gfc.bo_l,
        gfc.bm_l,
        bval,
        bval_width,
        gfc.mld_l,
        gfc.PSY.bo_l_weight,
        sfreq,
        Encoder$6.BLKSIZE,
        gfc.scalefac_band.l,
        Encoder$6.BLKSIZE / (2 * 576),
        Encoder$6.SBMAX_l
      );
      assert$2(gfc.npart_l < Encoder$6.CBANDS);
      for (i = 0; i < gfc.npart_l; i++) {
        var snr = snr_l_a;
        if (bval[i] >= bvl_a) {
          snr = snr_l_b * (bval[i] - bvl_a) / (bvl_b - bvl_a) + snr_l_a * (bvl_b - bval[i]) / (bvl_b - bvl_a);
        }
        norm[i] = Math.pow(10, snr / 10);
        if (gfc.numlines_l[i] > 0) {
          gfc.rnumlines_l[i] = 1 / gfc.numlines_l[i];
        } else {
          gfc.rnumlines_l[i] = 0;
        }
      }
      gfc.s3_ll = init_s3_values(
        gfc.s3ind,
        gfc.npart_l,
        bval,
        bval_width,
        norm,
        useOldS3
      );
      var j = 0;
      for (i = 0; i < gfc.npart_l; i++) {
        var x;
        x = Float.MAX_VALUE;
        for (var k2 = 0; k2 < gfc.numlines_l[i]; k2++, j++) {
          var freq = sfreq * j / (1e3 * Encoder$6.BLKSIZE);
          var level;
          level = this.ATHformula(freq * 1e3, gfp) - 20;
          level = Math.pow(10, 0.1 * level);
          level *= gfc.numlines_l[i];
          if (x > level)
            x = level;
        }
        gfc.ATH.cb_l[i] = x;
        x = -20 + bval[i] * 20 / 10;
        if (x > 6) {
          x = 100;
        }
        if (x < -15) {
          x = -15;
        }
        x -= 8;
        gfc.minval_l[i] = Math.pow(10, x / 10) * gfc.numlines_l[i];
      }
      gfc.npart_s = init_numline(
        gfc.numlines_s,
        gfc.bo_s,
        gfc.bm_s,
        bval,
        bval_width,
        gfc.mld_s,
        gfc.PSY.bo_s_weight,
        sfreq,
        Encoder$6.BLKSIZE_s,
        gfc.scalefac_band.s,
        Encoder$6.BLKSIZE_s / (2 * 192),
        Encoder$6.SBMAX_s
      );
      assert$2(gfc.npart_s < Encoder$6.CBANDS);
      j = 0;
      for (i = 0; i < gfc.npart_s; i++) {
        var x;
        var snr = snr_s_a;
        if (bval[i] >= bvl_a) {
          snr = snr_s_b * (bval[i] - bvl_a) / (bvl_b - bvl_a) + snr_s_a * (bvl_b - bval[i]) / (bvl_b - bvl_a);
        }
        norm[i] = Math.pow(10, snr / 10);
        x = Float.MAX_VALUE;
        for (var k2 = 0; k2 < gfc.numlines_s[i]; k2++, j++) {
          var freq = sfreq * j / (1e3 * Encoder$6.BLKSIZE_s);
          var level;
          level = this.ATHformula(freq * 1e3, gfp) - 20;
          level = Math.pow(10, 0.1 * level);
          level *= gfc.numlines_s[i];
          if (x > level)
            x = level;
        }
        gfc.ATH.cb_s[i] = x;
        x = -7 + bval[i] * 7 / 12;
        if (bval[i] > 12) {
          x *= 1 + Math.log(1 + x) * 3.1;
        }
        if (bval[i] < 12) {
          x *= 1 + Math.log(1 - x) * 2.3;
        }
        if (x < -15) {
          x = -15;
        }
        x -= 8;
        gfc.minval_s[i] = Math.pow(10, x / 10) * gfc.numlines_s[i];
      }
      gfc.s3_ss = init_s3_values(
        gfc.s3ind_s,
        gfc.npart_s,
        bval,
        bval_width,
        norm,
        useOldS3
      );
      init_mask_add_max_values();
      fft.init_fft(gfc);
      gfc.decay = Math.exp(-1 * LOG10 / (temporalmask_sustain_sec * sfreq / 192));
      {
        var msfix;
        msfix = NS_MSFIX;
        if ((gfp.exp_nspsytune & 2) != 0)
          msfix = 1;
        if (Math.abs(gfp.msfix) > 0)
          msfix = gfp.msfix;
        gfp.msfix = msfix;
        for (var b = 0; b < gfc.npart_l; b++)
          if (gfc.s3ind[b][1] > gfc.npart_l - 1)
            gfc.s3ind[b][1] = gfc.npart_l - 1;
      }
      var frame_duration = 576 * gfc.mode_gr / sfreq;
      gfc.ATH.decay = Math.pow(10, -12 / 10 * frame_duration);
      gfc.ATH.adjust = 0.01;
      gfc.ATH.adjustLimit = 1;
      assert$2(gfc.bo_l[Encoder$6.SBMAX_l - 1] <= gfc.npart_l);
      assert$2(gfc.bo_s[Encoder$6.SBMAX_s - 1] <= gfc.npart_s);
      if (gfp.ATHtype != -1) {
        var freq;
        var freq_inc = gfp.out_samplerate / Encoder$6.BLKSIZE;
        var eql_balance = 0;
        freq = 0;
        for (i = 0; i < Encoder$6.BLKSIZE / 2; ++i) {
          freq += freq_inc;
          gfc.ATH.eql_w[i] = 1 / Math.pow(10, this.ATHformula(freq, gfp) / 10);
          eql_balance += gfc.ATH.eql_w[i];
        }
        eql_balance = 1 / eql_balance;
        for (i = Encoder$6.BLKSIZE / 2; --i >= 0; ) {
          gfc.ATH.eql_w[i] *= eql_balance;
        }
      }
      {
        for (var b = j = 0; b < gfc.npart_s; ++b) {
          for (i = 0; i < gfc.numlines_s[b]; ++i) {
            ++j;
          }
        }
        for (var b = j = 0; b < gfc.npart_l; ++b) {
          for (i = 0; i < gfc.numlines_l[b]; ++i) {
            ++j;
          }
        }
      }
      j = 0;
      for (i = 0; i < gfc.npart_l; i++) {
        var freq = sfreq * (j + gfc.numlines_l[i] / 2) / (1 * Encoder$6.BLKSIZE);
        gfc.mld_cb_l[i] = stereo_demask(freq);
        j += gfc.numlines_l[i];
      }
      for (; i < Encoder$6.CBANDS; ++i) {
        gfc.mld_cb_l[i] = 1;
      }
      j = 0;
      for (i = 0; i < gfc.npart_s; i++) {
        var freq = sfreq * (j + gfc.numlines_s[i] / 2) / (1 * Encoder$6.BLKSIZE_s);
        gfc.mld_cb_s[i] = stereo_demask(freq);
        j += gfc.numlines_s[i];
      }
      for (; i < Encoder$6.CBANDS; ++i) {
        gfc.mld_cb_s[i] = 1;
      }
      return 0;
    };
    function ATHformula_GB(f2, value) {
      if (f2 < -0.3)
        f2 = 3410;
      f2 /= 1e3;
      f2 = Math.max(0.1, f2);
      var ath = 3.64 * Math.pow(f2, -0.8) - 6.8 * Math.exp(-0.6 * Math.pow(f2 - 3.4, 2)) + 6 * Math.exp(-0.15 * Math.pow(f2 - 8.7, 2)) + (0.6 + 0.04 * value) * 1e-3 * Math.pow(f2, 4);
      return ath;
    }
    this.ATHformula = function(f2, gfp) {
      var ath;
      switch (gfp.ATHtype) {
        case 0:
          ath = ATHformula_GB(f2, 9);
          break;
        case 1:
          ath = ATHformula_GB(f2, -1);
          break;
        case 2:
          ath = ATHformula_GB(f2, 0);
          break;
        case 3:
          ath = ATHformula_GB(f2, 1) + 6;
          break;
        case 4:
          ath = ATHformula_GB(f2, gfp.ATHcurve);
          break;
        default:
          ath = ATHformula_GB(f2, 0);
          break;
      }
      return ath;
    };
  }
  var PsyModel_1 = PsyModel;
  var MPEGMode = MPEGMode_1;
  function LameGlobalFlags() {
    this.class_id = 0;
    this.num_samples = 0;
    this.num_channels = 0;
    this.in_samplerate = 0;
    this.out_samplerate = 0;
    this.scale = 0;
    this.scale_left = 0;
    this.scale_right = 0;
    this.analysis = false;
    this.bWriteVbrTag = false;
    this.decode_only = false;
    this.quality = 0;
    this.mode = MPEGMode.STEREO;
    this.force_ms = false;
    this.free_format = false;
    this.findReplayGain = false;
    this.decode_on_the_fly = false;
    this.write_id3tag_automatic = false;
    this.brate = 0;
    this.compression_ratio = 0;
    this.copyright = 0;
    this.original = 0;
    this.extension = 0;
    this.emphasis = 0;
    this.error_protection = 0;
    this.strict_ISO = false;
    this.disable_reservoir = false;
    this.quant_comp = 0;
    this.quant_comp_short = 0;
    this.experimentalY = false;
    this.experimentalZ = 0;
    this.exp_nspsytune = 0;
    this.preset = 0;
    this.VBR = null;
    this.VBR_q_frac = 0;
    this.VBR_q = 0;
    this.VBR_mean_bitrate_kbps = 0;
    this.VBR_min_bitrate_kbps = 0;
    this.VBR_max_bitrate_kbps = 0;
    this.VBR_hard_min = 0;
    this.lowpassfreq = 0;
    this.highpassfreq = 0;
    this.lowpasswidth = 0;
    this.highpasswidth = 0;
    this.maskingadjust = 0;
    this.maskingadjust_short = 0;
    this.ATHonly = false;
    this.ATHshort = false;
    this.noATH = false;
    this.ATHtype = 0;
    this.ATHcurve = 0;
    this.ATHlower = 0;
    this.athaa_type = 0;
    this.athaa_loudapprox = 0;
    this.athaa_sensitivity = 0;
    this.short_blocks = null;
    this.useTemporal = false;
    this.interChRatio = 0;
    this.msfix = 0;
    this.tune = false;
    this.tune_value_a = 0;
    this.version = 0;
    this.encoder_delay = 0;
    this.encoder_padding = 0;
    this.framesize = 0;
    this.frameNum = 0;
    this.lame_allocated_gfp = 0;
    this.internal_flags = null;
  }
  var LameGlobalFlags_1 = LameGlobalFlags;
  var Encoder$5 = requireEncoder();
  var L3Side$4 = {};
  L3Side$4.SFBMAX = Encoder$5.SBMAX_s * 3;
  var L3Side_1 = L3Side$4;
  var common$e = common$h;
  var new_float$5 = common$e.new_float;
  var new_int$6 = common$e.new_int;
  var L3Side$3 = L3Side_1;
  function GrInfo$1() {
    this.xr = new_float$5(576);
    this.l3_enc = new_int$6(576);
    this.scalefac = new_int$6(L3Side$3.SFBMAX);
    this.xrpow_max = 0;
    this.part2_3_length = 0;
    this.big_values = 0;
    this.count1 = 0;
    this.global_gain = 0;
    this.scalefac_compress = 0;
    this.block_type = 0;
    this.mixed_block_flag = 0;
    this.table_select = new_int$6(3);
    this.subblock_gain = new_int$6(3 + 1);
    this.region0_count = 0;
    this.region1_count = 0;
    this.preflag = 0;
    this.scalefac_scale = 0;
    this.count1table_select = 0;
    this.part2_length = 0;
    this.sfb_lmax = 0;
    this.sfb_smin = 0;
    this.psy_lmax = 0;
    this.sfbmax = 0;
    this.psymax = 0;
    this.sfbdivide = 0;
    this.width = new_int$6(L3Side$3.SFBMAX);
    this.window = new_int$6(L3Side$3.SFBMAX);
    this.count1bits = 0;
    this.sfb_partition_table = null;
    this.slen = new_int$6(4);
    this.max_nonzero_coeff = 0;
    var self2 = this;
    function clone_int(array) {
      return new Int32Array(array);
    }
    function clone_float(array) {
      return new Float32Array(array);
    }
    this.assign = function(other) {
      self2.xr = clone_float(other.xr);
      self2.l3_enc = clone_int(other.l3_enc);
      self2.scalefac = clone_int(other.scalefac);
      self2.xrpow_max = other.xrpow_max;
      self2.part2_3_length = other.part2_3_length;
      self2.big_values = other.big_values;
      self2.count1 = other.count1;
      self2.global_gain = other.global_gain;
      self2.scalefac_compress = other.scalefac_compress;
      self2.block_type = other.block_type;
      self2.mixed_block_flag = other.mixed_block_flag;
      self2.table_select = clone_int(other.table_select);
      self2.subblock_gain = clone_int(other.subblock_gain);
      self2.region0_count = other.region0_count;
      self2.region1_count = other.region1_count;
      self2.preflag = other.preflag;
      self2.scalefac_scale = other.scalefac_scale;
      self2.count1table_select = other.count1table_select;
      self2.part2_length = other.part2_length;
      self2.sfb_lmax = other.sfb_lmax;
      self2.sfb_smin = other.sfb_smin;
      self2.psy_lmax = other.psy_lmax;
      self2.sfbmax = other.sfbmax;
      self2.psymax = other.psymax;
      self2.sfbdivide = other.sfbdivide;
      self2.width = clone_int(other.width);
      self2.window = clone_int(other.window);
      self2.count1bits = other.count1bits;
      self2.sfb_partition_table = other.sfb_partition_table.slice(0);
      self2.slen = clone_int(other.slen);
      self2.max_nonzero_coeff = other.max_nonzero_coeff;
    };
  }
  var GrInfo_1 = GrInfo$1;
  var common$d = common$h;
  var new_int$5 = common$d.new_int;
  var GrInfo = GrInfo_1;
  function IIISideInfo$1() {
    this.tt = [[null, null], [null, null]];
    this.main_data_begin = 0;
    this.private_bits = 0;
    this.resvDrain_pre = 0;
    this.resvDrain_post = 0;
    this.scfsi = [new_int$5(4), new_int$5(4)];
    for (var gr = 0; gr < 2; gr++) {
      for (var ch = 0; ch < 2; ch++) {
        this.tt[gr][ch] = new GrInfo();
      }
    }
  }
  var IIISideInfo_1 = IIISideInfo$1;
  var common$c = common$h;
  var System$2 = common$c.System;
  var new_int$4 = common$c.new_int;
  var Encoder$4 = requireEncoder();
  function ScaleFac$1(arrL, arrS, arr21, arr12) {
    this.l = new_int$4(1 + Encoder$4.SBMAX_l);
    this.s = new_int$4(1 + Encoder$4.SBMAX_s);
    this.psfb21 = new_int$4(1 + Encoder$4.PSFB21);
    this.psfb12 = new_int$4(1 + Encoder$4.PSFB12);
    var l2 = this.l;
    var s = this.s;
    if (arguments.length == 4) {
      this.arrL = arguments[0];
      this.arrS = arguments[1];
      this.arr21 = arguments[2];
      this.arr12 = arguments[3];
      System$2.arraycopy(this.arrL, 0, l2, 0, Math.min(this.arrL.length, this.l.length));
      System$2.arraycopy(this.arrS, 0, s, 0, Math.min(this.arrS.length, this.s.length));
      System$2.arraycopy(this.arr21, 0, this.psfb21, 0, Math.min(this.arr21.length, this.psfb21.length));
      System$2.arraycopy(this.arr12, 0, this.psfb12, 0, Math.min(this.arr12.length, this.psfb12.length));
    }
  }
  var ScaleFac_1 = ScaleFac$1;
  var common$b = common$h;
  var new_float$4 = common$b.new_float;
  var new_float_n$1 = common$b.new_float_n;
  var new_int$3 = common$b.new_int;
  var Encoder$3 = requireEncoder();
  function NsPsy$1() {
    this.last_en_subshort = new_float_n$1([4, 9]);
    this.lastAttacks = new_int$3(4);
    this.pefirbuf = new_float$4(19);
    this.longfact = new_float$4(Encoder$3.SBMAX_l);
    this.shortfact = new_float$4(Encoder$3.SBMAX_s);
    this.attackthre = 0;
    this.attackthre_s = 0;
  }
  var NsPsy_1 = NsPsy$1;
  function VBRSeekInfo$1() {
    this.sum = 0;
    this.seen = 0;
    this.want = 0;
    this.pos = 0;
    this.size = 0;
    this.bag = null;
    this.nVbrNumFrames = 0;
    this.nBytesWritten = 0;
    this.TotalFrameSize = 0;
  }
  var VBRSeekInfo_1 = VBRSeekInfo$1;
  var common$a = common$h;
  var new_byte$1 = common$a.new_byte;
  var new_double = common$a.new_double;
  var new_float$3 = common$a.new_float;
  var new_float_n = common$a.new_float_n;
  var new_int$2 = common$a.new_int;
  var new_int_n = common$a.new_int_n;
  var IIISideInfo = IIISideInfo_1;
  var ScaleFac = ScaleFac_1;
  var NsPsy = NsPsy_1;
  var VBRSeekInfo = VBRSeekInfo_1;
  var III_psy_xmin = requireIII_psy_xmin();
  var Encoder$2 = requireEncoder();
  var L3Side$2 = L3Side_1;
  LameInternalFlags$1.MFSIZE = 3 * 1152 + Encoder$2.ENCDELAY - Encoder$2.MDCTDELAY;
  LameInternalFlags$1.MAX_HEADER_BUF = 256;
  LameInternalFlags$1.MAX_BITS_PER_CHANNEL = 4095;
  LameInternalFlags$1.MAX_BITS_PER_GRANULE = 7680;
  LameInternalFlags$1.BPC = 320;
  function LameInternalFlags$1() {
    var MAX_HEADER_LEN = 40;
    this.Class_ID = 0;
    this.lame_encode_frame_init = 0;
    this.iteration_init_init = 0;
    this.fill_buffer_resample_init = 0;
    this.mfbuf = new_float_n([2, LameInternalFlags$1.MFSIZE]);
    this.mode_gr = 0;
    this.channels_in = 0;
    this.channels_out = 0;
    this.resample_ratio = 0;
    this.mf_samples_to_encode = 0;
    this.mf_size = 0;
    this.VBR_min_bitrate = 0;
    this.VBR_max_bitrate = 0;
    this.bitrate_index = 0;
    this.samplerate_index = 0;
    this.mode_ext = 0;
    this.lowpass1 = 0;
    this.lowpass2 = 0;
    this.highpass1 = 0;
    this.highpass2 = 0;
    this.noise_shaping = 0;
    this.noise_shaping_amp = 0;
    this.substep_shaping = 0;
    this.psymodel = 0;
    this.noise_shaping_stop = 0;
    this.subblock_gain = 0;
    this.use_best_huffman = 0;
    this.full_outer_loop = 0;
    this.l3_side = new IIISideInfo();
    this.ms_ratio = new_float$3(2);
    this.padding = 0;
    this.frac_SpF = 0;
    this.slot_lag = 0;
    this.tag_spec = null;
    this.nMusicCRC = 0;
    this.OldValue = new_int$2(2);
    this.CurrentStep = new_int$2(2);
    this.masking_lower = 0;
    this.bv_scf = new_int$2(576);
    this.pseudohalf = new_int$2(L3Side$2.SFBMAX);
    this.sfb21_extra = false;
    this.inbuf_old = new Array(2);
    this.blackfilt = new Array(2 * LameInternalFlags$1.BPC + 1);
    this.itime = new_double(2);
    this.sideinfo_len = 0;
    this.sb_sample = new_float_n([2, 2, 18, Encoder$2.SBLIMIT]);
    this.amp_filter = new_float$3(32);
    function Header() {
      this.write_timing = 0;
      this.ptr = 0;
      this.buf = new_byte$1(MAX_HEADER_LEN);
    }
    this.header = new Array(LameInternalFlags$1.MAX_HEADER_BUF);
    this.h_ptr = 0;
    this.w_ptr = 0;
    this.ancillary_flag = 0;
    this.ResvSize = 0;
    this.ResvMax = 0;
    this.scalefac_band = new ScaleFac();
    this.minval_l = new_float$3(Encoder$2.CBANDS);
    this.minval_s = new_float$3(Encoder$2.CBANDS);
    this.nb_1 = new_float_n([4, Encoder$2.CBANDS]);
    this.nb_2 = new_float_n([4, Encoder$2.CBANDS]);
    this.nb_s1 = new_float_n([4, Encoder$2.CBANDS]);
    this.nb_s2 = new_float_n([4, Encoder$2.CBANDS]);
    this.s3_ss = null;
    this.s3_ll = null;
    this.decay = 0;
    this.thm = new Array(4);
    this.en = new Array(4);
    this.tot_ener = new_float$3(4);
    this.loudness_sq = new_float_n([2, 2]);
    this.loudness_sq_save = new_float$3(2);
    this.mld_l = new_float$3(Encoder$2.SBMAX_l);
    this.mld_s = new_float$3(Encoder$2.SBMAX_s);
    this.bm_l = new_int$2(Encoder$2.SBMAX_l);
    this.bo_l = new_int$2(Encoder$2.SBMAX_l);
    this.bm_s = new_int$2(Encoder$2.SBMAX_s);
    this.bo_s = new_int$2(Encoder$2.SBMAX_s);
    this.npart_l = 0;
    this.npart_s = 0;
    this.s3ind = new_int_n([Encoder$2.CBANDS, 2]);
    this.s3ind_s = new_int_n([Encoder$2.CBANDS, 2]);
    this.numlines_s = new_int$2(Encoder$2.CBANDS);
    this.numlines_l = new_int$2(Encoder$2.CBANDS);
    this.rnumlines_l = new_float$3(Encoder$2.CBANDS);
    this.mld_cb_l = new_float$3(Encoder$2.CBANDS);
    this.mld_cb_s = new_float$3(Encoder$2.CBANDS);
    this.numlines_s_num1 = 0;
    this.numlines_l_num1 = 0;
    this.pe = new_float$3(4);
    this.ms_ratio_s_old = 0;
    this.ms_ratio_l_old = 0;
    this.ms_ener_ratio_old = 0;
    this.blocktype_old = new_int$2(2);
    this.nsPsy = new NsPsy();
    this.VBR_seek_table = new VBRSeekInfo();
    this.ATH = null;
    this.PSY = null;
    this.nogap_total = 0;
    this.nogap_current = 0;
    this.decode_on_the_fly = true;
    this.findReplayGain = true;
    this.findPeakSample = true;
    this.PeakSample = 0;
    this.RadioGain = 0;
    this.AudiophileGain = 0;
    this.rgdata = null;
    this.noclipGainChange = 0;
    this.noclipScale = 0;
    this.bitrate_stereoMode_Hist = new_int_n([16, 4 + 1]);
    this.bitrate_blockType_Hist = new_int_n([16, 4 + 1 + 1]);
    this.pinfo = null;
    this.hip = null;
    this.in_buffer_nsamples = 0;
    this.in_buffer_0 = null;
    this.in_buffer_1 = null;
    this.iteration_loop = null;
    for (var i = 0; i < this.en.length; i++) {
      this.en[i] = new III_psy_xmin();
    }
    for (var i = 0; i < this.thm.length; i++) {
      this.thm[i] = new III_psy_xmin();
    }
    for (var i = 0; i < this.header.length; i++) {
      this.header[i] = new Header();
    }
  }
  var LameInternalFlags_1 = LameInternalFlags$1;
  var common$9 = common$h;
  var new_float$2 = common$9.new_float;
  var Encoder$1 = requireEncoder();
  function ATH() {
    this.useAdjust = 0;
    this.aaSensitivityP = 0;
    this.adjust = 0;
    this.adjustLimit = 0;
    this.decay = 0;
    this.floor = 0;
    this.l = new_float$2(Encoder$1.SBMAX_l);
    this.s = new_float$2(Encoder$1.SBMAX_s);
    this.psfb21 = new_float$2(Encoder$1.PSFB21);
    this.psfb12 = new_float$2(Encoder$1.PSFB12);
    this.cb_l = new_float$2(Encoder$1.CBANDS);
    this.cb_s = new_float$2(Encoder$1.CBANDS);
    this.eql_w = new_float$2(Encoder$1.BLKSIZE / 2);
  }
  var ATH_1 = ATH;
  var common$8 = common$h;
  var System$1 = common$8.System;
  var Arrays$1 = common$8.Arrays;
  GainAnalysis$2.STEPS_per_dB = 100;
  GainAnalysis$2.MAX_dB = 120;
  GainAnalysis$2.GAIN_NOT_ENOUGH_SAMPLES = -24601;
  GainAnalysis$2.GAIN_ANALYSIS_ERROR = 0;
  GainAnalysis$2.GAIN_ANALYSIS_OK = 1;
  GainAnalysis$2.INIT_GAIN_ANALYSIS_ERROR = 0;
  GainAnalysis$2.INIT_GAIN_ANALYSIS_OK = 1;
  GainAnalysis$2.YULE_ORDER = 10;
  GainAnalysis$2.MAX_ORDER = GainAnalysis$2.YULE_ORDER;
  GainAnalysis$2.MAX_SAMP_FREQ = 48e3;
  GainAnalysis$2.RMS_WINDOW_TIME_NUMERATOR = 1;
  GainAnalysis$2.RMS_WINDOW_TIME_DENOMINATOR = 20;
  GainAnalysis$2.MAX_SAMPLES_PER_WINDOW = GainAnalysis$2.MAX_SAMP_FREQ * GainAnalysis$2.RMS_WINDOW_TIME_NUMERATOR / GainAnalysis$2.RMS_WINDOW_TIME_DENOMINATOR + 1;
  function GainAnalysis$2() {
    var PINK_REF = 64.82;
    var RMS_PERCENTILE = 0.95;
    var RMS_WINDOW_TIME_NUMERATOR = GainAnalysis$2.RMS_WINDOW_TIME_NUMERATOR;
    var RMS_WINDOW_TIME_DENOMINATOR = GainAnalysis$2.RMS_WINDOW_TIME_DENOMINATOR;
    var ABYule = [
      [
        0.038575994352,
        -3.84664617118067,
        -0.02160367184185,
        7.81501653005538,
        -0.00123395316851,
        -11.34170355132042,
        -9291677959e-14,
        13.05504219327545,
        -0.01655260341619,
        -12.28759895145294,
        0.02161526843274,
        9.4829380631979,
        -0.02074045215285,
        -5.87257861775999,
        0.00594298065125,
        2.75465861874613,
        0.00306428023191,
        -0.86984376593551,
        12025322027e-14,
        0.13919314567432,
        0.00288463683916
      ],
      [
        0.0541865640643,
        -3.47845948550071,
        -0.02911007808948,
        6.36317777566148,
        -0.00848709379851,
        -8.54751527471874,
        -0.00851165645469,
        9.4769360780128,
        -0.00834990904936,
        -8.81498681370155,
        0.02245293253339,
        6.85401540936998,
        -0.02596338512915,
        -4.39470996079559,
        0.01624864962975,
        2.19611684890774,
        -0.00240879051584,
        -0.75104302451432,
        0.00674613682247,
        0.13149317958808,
        -0.00187763777362
      ],
      [
        0.15457299681924,
        -2.37898834973084,
        -0.09331049056315,
        2.84868151156327,
        -0.06247880153653,
        -2.64577170229825,
        0.02163541888798,
        2.23697657451713,
        -0.05588393329856,
        -1.67148153367602,
        0.04781476674921,
        1.00595954808547,
        0.00222312597743,
        -0.45953458054983,
        0.03174092540049,
        0.16378164858596,
        -0.01390589421898,
        -0.05032077717131,
        0.00651420667831,
        0.0234789740702,
        -0.00881362733839
      ],
      [
        0.30296907319327,
        -1.61273165137247,
        -0.22613988682123,
        1.0797749225997,
        -0.08587323730772,
        -0.2565625775407,
        0.03282930172664,
        -0.1627671912044,
        -0.00915702933434,
        -0.22638893773906,
        -0.02364141202522,
        0.39120800788284,
        -0.00584456039913,
        -0.22138138954925,
        0.06276101321749,
        0.04500235387352,
        -828086748e-14,
        0.02005851806501,
        0.00205861885564,
        0.00302439095741,
        -0.02950134983287
      ],
      [
        0.33642304856132,
        -1.49858979367799,
        -0.2557224142557,
        0.87350271418188,
        -0.11828570177555,
        0.12205022308084,
        0.11921148675203,
        -0.80774944671438,
        -0.07834489609479,
        0.47854794562326,
        -0.0046997791438,
        -0.12453458140019,
        -0.0058950022444,
        -0.04067510197014,
        0.05724228140351,
        0.08333755284107,
        0.00832043980773,
        -0.04237348025746,
        -0.0163538138454,
        0.02977207319925,
        -0.0176017656815
      ],
      [
        0.4491525660845,
        -0.62820619233671,
        -0.14351757464547,
        0.29661783706366,
        -0.22784394429749,
        -0.372563729424,
        -0.01419140100551,
        0.00213767857124,
        0.04078262797139,
        -0.42029820170918,
        -0.12398163381748,
        0.22199650564824,
        0.04097565135648,
        0.00613424350682,
        0.10478503600251,
        0.06747620744683,
        -0.01863887810927,
        0.05784820375801,
        -0.03193428438915,
        0.03222754072173,
        0.00541907748707
      ],
      [
        0.56619470757641,
        -1.04800335126349,
        -0.75464456939302,
        0.29156311971249,
        0.1624213774223,
        -0.26806001042947,
        0.16744243493672,
        0.00819999645858,
        -0.18901604199609,
        0.45054734505008,
        0.3093178284183,
        -0.33032403314006,
        -0.27562961986224,
        0.0673936833311,
        0.00647310677246,
        -0.04784254229033,
        0.08647503780351,
        0.01639907836189,
        -0.0378898455484,
        0.01807364323573,
        -0.00588215443421
      ],
      [
        0.58100494960553,
        -0.51035327095184,
        -0.53174909058578,
        -0.31863563325245,
        -0.14289799034253,
        -0.20256413484477,
        0.17520704835522,
        0.1472815413433,
        0.02377945217615,
        0.38952639978999,
        0.15558449135573,
        -0.23313271880868,
        -0.25344790059353,
        -0.05246019024463,
        0.01628462406333,
        -0.02505961724053,
        0.06920467763959,
        0.02442357316099,
        -0.03721611395801,
        0.01818801111503,
        -0.00749618797172
      ],
      [
        0.53648789255105,
        -0.2504987195602,
        -0.42163034350696,
        -0.43193942311114,
        -0.00275953611929,
        -0.03424681017675,
        0.04267842219415,
        -0.04678328784242,
        -0.10214864179676,
        0.26408300200955,
        0.14590772289388,
        0.15113130533216,
        -0.02459864859345,
        -0.17556493366449,
        -0.11202315195388,
        -0.18823009262115,
        -0.04060034127,
        0.05477720428674,
        0.0478866554818,
        0.0470440968812,
        -0.02217936801134
      ]
    ];
    var ABButter = [
      [
        0.98621192462708,
        -1.97223372919527,
        -1.97242384925416,
        0.97261396931306,
        0.98621192462708
      ],
      [
        0.98500175787242,
        -1.96977855582618,
        -1.97000351574484,
        0.9702284756635,
        0.98500175787242
      ],
      [
        0.97938932735214,
        -1.95835380975398,
        -1.95877865470428,
        0.95920349965459,
        0.97938932735214
      ],
      [
        0.97531843204928,
        -1.95002759149878,
        -1.95063686409857,
        0.95124613669835,
        0.97531843204928
      ],
      [
        0.97316523498161,
        -1.94561023566527,
        -1.94633046996323,
        0.94705070426118,
        0.97316523498161
      ],
      [
        0.96454515552826,
        -1.92783286977036,
        -1.92909031105652,
        0.93034775234268,
        0.96454515552826
      ],
      [
        0.96009142950541,
        -1.91858953033784,
        -1.92018285901082,
        0.92177618768381,
        0.96009142950541
      ],
      [
        0.95856916599601,
        -1.9154210807478,
        -1.91713833199203,
        0.91885558323625,
        0.95856916599601
      ],
      [
        0.94597685600279,
        -1.88903307939452,
        -1.89195371200558,
        0.89487434461664,
        0.94597685600279
      ]
    ];
    function filterYule(input, inputPos, output, outputPos, nSamples, kernel) {
      while (nSamples-- != 0) {
        output[outputPos] = 1e-10 + input[inputPos + 0] * kernel[0] - output[outputPos - 1] * kernel[1] + input[inputPos - 1] * kernel[2] - output[outputPos - 2] * kernel[3] + input[inputPos - 2] * kernel[4] - output[outputPos - 3] * kernel[5] + input[inputPos - 3] * kernel[6] - output[outputPos - 4] * kernel[7] + input[inputPos - 4] * kernel[8] - output[outputPos - 5] * kernel[9] + input[inputPos - 5] * kernel[10] - output[outputPos - 6] * kernel[11] + input[inputPos - 6] * kernel[12] - output[outputPos - 7] * kernel[13] + input[inputPos - 7] * kernel[14] - output[outputPos - 8] * kernel[15] + input[inputPos - 8] * kernel[16] - output[outputPos - 9] * kernel[17] + input[inputPos - 9] * kernel[18] - output[outputPos - 10] * kernel[19] + input[inputPos - 10] * kernel[20];
        ++outputPos;
        ++inputPos;
      }
    }
    function filterButter(input, inputPos, output, outputPos, nSamples, kernel) {
      while (nSamples-- != 0) {
        output[outputPos] = input[inputPos + 0] * kernel[0] - output[outputPos - 1] * kernel[1] + input[inputPos - 1] * kernel[2] - output[outputPos - 2] * kernel[3] + input[inputPos - 2] * kernel[4];
        ++outputPos;
        ++inputPos;
      }
    }
    function ResetSampleFrequency(rgData, samplefreq) {
      for (var i = 0; i < MAX_ORDER; i++)
        rgData.linprebuf[i] = rgData.lstepbuf[i] = rgData.loutbuf[i] = rgData.rinprebuf[i] = rgData.rstepbuf[i] = rgData.routbuf[i] = 0;
      switch (0 | samplefreq) {
        case 48e3:
          rgData.reqindex = 0;
          break;
        case 44100:
          rgData.reqindex = 1;
          break;
        case 32e3:
          rgData.reqindex = 2;
          break;
        case 24e3:
          rgData.reqindex = 3;
          break;
        case 22050:
          rgData.reqindex = 4;
          break;
        case 16e3:
          rgData.reqindex = 5;
          break;
        case 12e3:
          rgData.reqindex = 6;
          break;
        case 11025:
          rgData.reqindex = 7;
          break;
        case 8e3:
          rgData.reqindex = 8;
          break;
        default:
          return INIT_GAIN_ANALYSIS_ERROR;
      }
      rgData.sampleWindow = 0 | (samplefreq * RMS_WINDOW_TIME_NUMERATOR + RMS_WINDOW_TIME_DENOMINATOR - 1) / RMS_WINDOW_TIME_DENOMINATOR;
      rgData.lsum = 0;
      rgData.rsum = 0;
      rgData.totsamp = 0;
      Arrays$1.ill(rgData.A, 0);
      return INIT_GAIN_ANALYSIS_OK;
    }
    this.InitGainAnalysis = function(rgData, samplefreq) {
      if (ResetSampleFrequency(rgData, samplefreq) != INIT_GAIN_ANALYSIS_OK) {
        return INIT_GAIN_ANALYSIS_ERROR;
      }
      rgData.linpre = MAX_ORDER;
      rgData.rinpre = MAX_ORDER;
      rgData.lstep = MAX_ORDER;
      rgData.rstep = MAX_ORDER;
      rgData.lout = MAX_ORDER;
      rgData.rout = MAX_ORDER;
      Arrays$1.fill(rgData.B, 0);
      return INIT_GAIN_ANALYSIS_OK;
    };
    function fsqr(d) {
      return d * d;
    }
    this.AnalyzeSamples = function(rgData, left_samples, left_samplesPos, right_samples, right_samplesPos, num_samples, num_channels) {
      var curleft;
      var curleftBase;
      var curright;
      var currightBase;
      var batchsamples;
      var cursamples;
      var cursamplepos;
      if (num_samples == 0)
        return GAIN_ANALYSIS_OK;
      cursamplepos = 0;
      batchsamples = num_samples;
      switch (num_channels) {
        case 1:
          right_samples = left_samples;
          right_samplesPos = left_samplesPos;
          break;
        case 2:
          break;
        default:
          return GAIN_ANALYSIS_ERROR;
      }
      if (num_samples < MAX_ORDER) {
        System$1.arraycopy(
          left_samples,
          left_samplesPos,
          rgData.linprebuf,
          MAX_ORDER,
          num_samples
        );
        System$1.arraycopy(
          right_samples,
          right_samplesPos,
          rgData.rinprebuf,
          MAX_ORDER,
          num_samples
        );
      } else {
        System$1.arraycopy(
          left_samples,
          left_samplesPos,
          rgData.linprebuf,
          MAX_ORDER,
          MAX_ORDER
        );
        System$1.arraycopy(
          right_samples,
          right_samplesPos,
          rgData.rinprebuf,
          MAX_ORDER,
          MAX_ORDER
        );
      }
      while (batchsamples > 0) {
        cursamples = batchsamples > rgData.sampleWindow - rgData.totsamp ? rgData.sampleWindow - rgData.totsamp : batchsamples;
        if (cursamplepos < MAX_ORDER) {
          curleft = rgData.linpre + cursamplepos;
          curleftBase = rgData.linprebuf;
          curright = rgData.rinpre + cursamplepos;
          currightBase = rgData.rinprebuf;
          if (cursamples > MAX_ORDER - cursamplepos)
            cursamples = MAX_ORDER - cursamplepos;
        } else {
          curleft = left_samplesPos + cursamplepos;
          curleftBase = left_samples;
          curright = right_samplesPos + cursamplepos;
          currightBase = right_samples;
        }
        filterYule(curleftBase, curleft, rgData.lstepbuf, rgData.lstep + rgData.totsamp, cursamples, ABYule[rgData.reqindex]);
        filterYule(currightBase, curright, rgData.rstepbuf, rgData.rstep + rgData.totsamp, cursamples, ABYule[rgData.reqindex]);
        filterButter(
          rgData.lstepbuf,
          rgData.lstep + rgData.totsamp,
          rgData.loutbuf,
          rgData.lout + rgData.totsamp,
          cursamples,
          ABButter[rgData.reqindex]
        );
        filterButter(
          rgData.rstepbuf,
          rgData.rstep + rgData.totsamp,
          rgData.routbuf,
          rgData.rout + rgData.totsamp,
          cursamples,
          ABButter[rgData.reqindex]
        );
        curleft = rgData.lout + rgData.totsamp;
        curleftBase = rgData.loutbuf;
        curright = rgData.rout + rgData.totsamp;
        currightBase = rgData.routbuf;
        var i = cursamples % 8;
        while (i-- != 0) {
          rgData.lsum += fsqr(curleftBase[curleft++]);
          rgData.rsum += fsqr(currightBase[curright++]);
        }
        i = cursamples / 8;
        while (i-- != 0) {
          rgData.lsum += fsqr(curleftBase[curleft + 0]) + fsqr(curleftBase[curleft + 1]) + fsqr(curleftBase[curleft + 2]) + fsqr(curleftBase[curleft + 3]) + fsqr(curleftBase[curleft + 4]) + fsqr(curleftBase[curleft + 5]) + fsqr(curleftBase[curleft + 6]) + fsqr(curleftBase[curleft + 7]);
          curleft += 8;
          rgData.rsum += fsqr(currightBase[curright + 0]) + fsqr(currightBase[curright + 1]) + fsqr(currightBase[curright + 2]) + fsqr(currightBase[curright + 3]) + fsqr(currightBase[curright + 4]) + fsqr(currightBase[curright + 5]) + fsqr(currightBase[curright + 6]) + fsqr(currightBase[curright + 7]);
          curright += 8;
        }
        batchsamples -= cursamples;
        cursamplepos += cursamples;
        rgData.totsamp += cursamples;
        if (rgData.totsamp == rgData.sampleWindow) {
          var val = GainAnalysis$2.STEPS_per_dB * 10 * Math.log10((rgData.lsum + rgData.rsum) / rgData.totsamp * 0.5 + 1e-37);
          var ival = val <= 0 ? 0 : 0 | val;
          if (ival >= rgData.A.length)
            ival = rgData.A.length - 1;
          rgData.A[ival]++;
          rgData.lsum = rgData.rsum = 0;
          System$1.arraycopy(
            rgData.loutbuf,
            rgData.totsamp,
            rgData.loutbuf,
            0,
            MAX_ORDER
          );
          System$1.arraycopy(
            rgData.routbuf,
            rgData.totsamp,
            rgData.routbuf,
            0,
            MAX_ORDER
          );
          System$1.arraycopy(
            rgData.lstepbuf,
            rgData.totsamp,
            rgData.lstepbuf,
            0,
            MAX_ORDER
          );
          System$1.arraycopy(
            rgData.rstepbuf,
            rgData.totsamp,
            rgData.rstepbuf,
            0,
            MAX_ORDER
          );
          rgData.totsamp = 0;
        }
        if (rgData.totsamp > rgData.sampleWindow) {
          return GAIN_ANALYSIS_ERROR;
        }
      }
      if (num_samples < MAX_ORDER) {
        System$1.arraycopy(
          rgData.linprebuf,
          num_samples,
          rgData.linprebuf,
          0,
          MAX_ORDER - num_samples
        );
        System$1.arraycopy(
          rgData.rinprebuf,
          num_samples,
          rgData.rinprebuf,
          0,
          MAX_ORDER - num_samples
        );
        System$1.arraycopy(
          left_samples,
          left_samplesPos,
          rgData.linprebuf,
          MAX_ORDER - num_samples,
          num_samples
        );
        System$1.arraycopy(
          right_samples,
          right_samplesPos,
          rgData.rinprebuf,
          MAX_ORDER - num_samples,
          num_samples
        );
      } else {
        System$1.arraycopy(left_samples, left_samplesPos + num_samples - MAX_ORDER, rgData.linprebuf, 0, MAX_ORDER);
        System$1.arraycopy(right_samples, right_samplesPos + num_samples - MAX_ORDER, rgData.rinprebuf, 0, MAX_ORDER);
      }
      return GAIN_ANALYSIS_OK;
    };
    function analyzeResult(Array2, len) {
      var i;
      var elems = 0;
      for (i = 0; i < len; i++)
        elems += Array2[i];
      if (elems == 0)
        return GAIN_NOT_ENOUGH_SAMPLES;
      var upper = 0 | Math.ceil(elems * (1 - RMS_PERCENTILE));
      for (i = len; i-- > 0; ) {
        if ((upper -= Array2[i]) <= 0)
          break;
      }
      return PINK_REF - i / GainAnalysis$2.STEPS_per_dB;
    }
    this.GetTitleGain = function(rgData) {
      var retval = analyzeResult(rgData.A, rgData.A.length);
      for (var i = 0; i < rgData.A.length; i++) {
        rgData.B[i] += rgData.A[i];
        rgData.A[i] = 0;
      }
      for (var i = 0; i < MAX_ORDER; i++)
        rgData.linprebuf[i] = rgData.lstepbuf[i] = rgData.loutbuf[i] = rgData.rinprebuf[i] = rgData.rstepbuf[i] = rgData.routbuf[i] = 0;
      rgData.totsamp = 0;
      rgData.lsum = rgData.rsum = 0;
      return retval;
    };
  }
  var GainAnalysis_1 = GainAnalysis$2;
  var common$7 = common$h;
  var new_float$1 = common$7.new_float;
  var new_int$1 = common$7.new_int;
  var GainAnalysis$1 = GainAnalysis_1;
  function ReplayGain() {
    this.linprebuf = new_float$1(GainAnalysis$1.MAX_ORDER * 2);
    this.linpre = 0;
    this.lstepbuf = new_float$1(GainAnalysis$1.MAX_SAMPLES_PER_WINDOW + GainAnalysis$1.MAX_ORDER);
    this.lstep = 0;
    this.loutbuf = new_float$1(GainAnalysis$1.MAX_SAMPLES_PER_WINDOW + GainAnalysis$1.MAX_ORDER);
    this.lout = 0;
    this.rinprebuf = new_float$1(GainAnalysis$1.MAX_ORDER * 2);
    this.rinpre = 0;
    this.rstepbuf = new_float$1(GainAnalysis$1.MAX_SAMPLES_PER_WINDOW + GainAnalysis$1.MAX_ORDER);
    this.rstep = 0;
    this.routbuf = new_float$1(GainAnalysis$1.MAX_SAMPLES_PER_WINDOW + GainAnalysis$1.MAX_ORDER);
    this.rout = 0;
    this.sampleWindow = 0;
    this.totsamp = 0;
    this.lsum = 0;
    this.rsum = 0;
    this.freqindex = 0;
    this.first = 0;
    this.A = new_int$1(0 | GainAnalysis$1.STEPS_per_dB * GainAnalysis$1.MAX_dB);
    this.B = new_int$1(0 | GainAnalysis$1.STEPS_per_dB * GainAnalysis$1.MAX_dB);
  }
  var ReplayGain_1 = ReplayGain;
  function MeanBits$1(meanBits) {
    this.bits = meanBits;
  }
  var MeanBits_1 = MeanBits$1;
  var common$6 = common$h;
  var new_float = common$6.new_float;
  var new_int = common$6.new_int;
  var assert$1 = common$6.assert;
  var MeanBits = MeanBits_1;
  var Encoder = requireEncoder();
  var L3Side$1 = L3Side_1;
  var LameInternalFlags = LameInternalFlags_1;
  function CBRNewIterationLoop(_quantize) {
    var quantize = _quantize;
    this.quantize = quantize;
    this.iteration_loop = function(gfp, pe, ms_ener_ratio, ratio) {
      var gfc = gfp.internal_flags;
      var l3_xmin = new_float(L3Side$1.SFBMAX);
      var xrpow = new_float(576);
      var targ_bits = new_int(2);
      var mean_bits = 0, max_bits;
      var l3_side = gfc.l3_side;
      var mb = new MeanBits(mean_bits);
      this.quantize.rv.ResvFrameBegin(gfp, mb);
      mean_bits = mb.bits;
      for (var gr = 0; gr < gfc.mode_gr; gr++) {
        max_bits = this.quantize.qupvt.on_pe(
          gfp,
          pe,
          targ_bits,
          mean_bits,
          gr,
          gr
        );
        if (gfc.mode_ext == Encoder.MPG_MD_MS_LR) {
          this.quantize.ms_convert(gfc.l3_side, gr);
          this.quantize.qupvt.reduce_side(
            targ_bits,
            ms_ener_ratio[gr],
            mean_bits,
            max_bits
          );
        }
        for (var ch = 0; ch < gfc.channels_out; ch++) {
          var adjust, masking_lower_db;
          var cod_info = l3_side.tt[gr][ch];
          if (cod_info.block_type != Encoder.SHORT_TYPE) {
            adjust = 0;
            masking_lower_db = gfc.PSY.mask_adjust - adjust;
          } else {
            adjust = 0;
            masking_lower_db = gfc.PSY.mask_adjust_short - adjust;
          }
          gfc.masking_lower = Math.pow(
            10,
            masking_lower_db * 0.1
          );
          this.quantize.init_outer_loop(gfc, cod_info);
          if (this.quantize.init_xrpow(gfc, cod_info, xrpow)) {
            this.quantize.qupvt.calc_xmin(
              gfp,
              ratio[gr][ch],
              cod_info,
              l3_xmin
            );
            this.quantize.outer_loop(
              gfp,
              cod_info,
              l3_xmin,
              xrpow,
              ch,
              targ_bits[ch]
            );
          }
          this.quantize.iteration_finish_one(gfc, gr, ch);
          assert$1(cod_info.part2_3_length <= LameInternalFlags.MAX_BITS_PER_CHANNEL);
          assert$1(cod_info.part2_3_length <= targ_bits[ch]);
        }
      }
      this.quantize.rv.ResvFrameEnd(gfc, mean_bits);
    };
  }
  var CBRNewIterationLoop_1 = CBRNewIterationLoop;
  function HuffCodeTab(len, max, tab, hl) {
    this.xlen = len;
    this.linmax = max;
    this.table = tab;
    this.hlen = hl;
  }
  var Tables$1 = {};
  Tables$1.t1HB = [
    1,
    1,
    1,
    0
  ];
  Tables$1.t2HB = [
    1,
    2,
    1,
    3,
    1,
    1,
    3,
    2,
    0
  ];
  Tables$1.t3HB = [
    3,
    2,
    1,
    1,
    1,
    1,
    3,
    2,
    0
  ];
  Tables$1.t5HB = [
    1,
    2,
    6,
    5,
    3,
    1,
    4,
    4,
    7,
    5,
    7,
    1,
    6,
    1,
    1,
    0
  ];
  Tables$1.t6HB = [
    7,
    3,
    5,
    1,
    6,
    2,
    3,
    2,
    5,
    4,
    4,
    1,
    3,
    3,
    2,
    0
  ];
  Tables$1.t7HB = [
    1,
    2,
    10,
    19,
    16,
    10,
    3,
    3,
    7,
    10,
    5,
    3,
    11,
    4,
    13,
    17,
    8,
    4,
    12,
    11,
    18,
    15,
    11,
    2,
    7,
    6,
    9,
    14,
    3,
    1,
    6,
    4,
    5,
    3,
    2,
    0
  ];
  Tables$1.t8HB = [
    3,
    4,
    6,
    18,
    12,
    5,
    5,
    1,
    2,
    16,
    9,
    3,
    7,
    3,
    5,
    14,
    7,
    3,
    19,
    17,
    15,
    13,
    10,
    4,
    13,
    5,
    8,
    11,
    5,
    1,
    12,
    4,
    4,
    1,
    1,
    0
  ];
  Tables$1.t9HB = [
    7,
    5,
    9,
    14,
    15,
    7,
    6,
    4,
    5,
    5,
    6,
    7,
    7,
    6,
    8,
    8,
    8,
    5,
    15,
    6,
    9,
    10,
    5,
    1,
    11,
    7,
    9,
    6,
    4,
    1,
    14,
    4,
    6,
    2,
    6,
    0
  ];
  Tables$1.t10HB = [
    1,
    2,
    10,
    23,
    35,
    30,
    12,
    17,
    3,
    3,
    8,
    12,
    18,
    21,
    12,
    7,
    11,
    9,
    15,
    21,
    32,
    40,
    19,
    6,
    14,
    13,
    22,
    34,
    46,
    23,
    18,
    7,
    20,
    19,
    33,
    47,
    27,
    22,
    9,
    3,
    31,
    22,
    41,
    26,
    21,
    20,
    5,
    3,
    14,
    13,
    10,
    11,
    16,
    6,
    5,
    1,
    9,
    8,
    7,
    8,
    4,
    4,
    2,
    0
  ];
  Tables$1.t11HB = [
    3,
    4,
    10,
    24,
    34,
    33,
    21,
    15,
    5,
    3,
    4,
    10,
    32,
    17,
    11,
    10,
    11,
    7,
    13,
    18,
    30,
    31,
    20,
    5,
    25,
    11,
    19,
    59,
    27,
    18,
    12,
    5,
    35,
    33,
    31,
    58,
    30,
    16,
    7,
    5,
    28,
    26,
    32,
    19,
    17,
    15,
    8,
    14,
    14,
    12,
    9,
    13,
    14,
    9,
    4,
    1,
    11,
    4,
    6,
    6,
    6,
    3,
    2,
    0
  ];
  Tables$1.t12HB = [
    9,
    6,
    16,
    33,
    41,
    39,
    38,
    26,
    7,
    5,
    6,
    9,
    23,
    16,
    26,
    11,
    17,
    7,
    11,
    14,
    21,
    30,
    10,
    7,
    17,
    10,
    15,
    12,
    18,
    28,
    14,
    5,
    32,
    13,
    22,
    19,
    18,
    16,
    9,
    5,
    40,
    17,
    31,
    29,
    17,
    13,
    4,
    2,
    27,
    12,
    11,
    15,
    10,
    7,
    4,
    1,
    27,
    12,
    8,
    12,
    6,
    3,
    1,
    0
  ];
  Tables$1.t13HB = [
    1,
    5,
    14,
    21,
    34,
    51,
    46,
    71,
    42,
    52,
    68,
    52,
    67,
    44,
    43,
    19,
    3,
    4,
    12,
    19,
    31,
    26,
    44,
    33,
    31,
    24,
    32,
    24,
    31,
    35,
    22,
    14,
    15,
    13,
    23,
    36,
    59,
    49,
    77,
    65,
    29,
    40,
    30,
    40,
    27,
    33,
    42,
    16,
    22,
    20,
    37,
    61,
    56,
    79,
    73,
    64,
    43,
    76,
    56,
    37,
    26,
    31,
    25,
    14,
    35,
    16,
    60,
    57,
    97,
    75,
    114,
    91,
    54,
    73,
    55,
    41,
    48,
    53,
    23,
    24,
    58,
    27,
    50,
    96,
    76,
    70,
    93,
    84,
    77,
    58,
    79,
    29,
    74,
    49,
    41,
    17,
    47,
    45,
    78,
    74,
    115,
    94,
    90,
    79,
    69,
    83,
    71,
    50,
    59,
    38,
    36,
    15,
    72,
    34,
    56,
    95,
    92,
    85,
    91,
    90,
    86,
    73,
    77,
    65,
    51,
    44,
    43,
    42,
    43,
    20,
    30,
    44,
    55,
    78,
    72,
    87,
    78,
    61,
    46,
    54,
    37,
    30,
    20,
    16,
    53,
    25,
    41,
    37,
    44,
    59,
    54,
    81,
    66,
    76,
    57,
    54,
    37,
    18,
    39,
    11,
    35,
    33,
    31,
    57,
    42,
    82,
    72,
    80,
    47,
    58,
    55,
    21,
    22,
    26,
    38,
    22,
    53,
    25,
    23,
    38,
    70,
    60,
    51,
    36,
    55,
    26,
    34,
    23,
    27,
    14,
    9,
    7,
    34,
    32,
    28,
    39,
    49,
    75,
    30,
    52,
    48,
    40,
    52,
    28,
    18,
    17,
    9,
    5,
    45,
    21,
    34,
    64,
    56,
    50,
    49,
    45,
    31,
    19,
    12,
    15,
    10,
    7,
    6,
    3,
    48,
    23,
    20,
    39,
    36,
    35,
    53,
    21,
    16,
    23,
    13,
    10,
    6,
    1,
    4,
    2,
    16,
    15,
    17,
    27,
    25,
    20,
    29,
    11,
    17,
    12,
    16,
    8,
    1,
    1,
    0,
    1
  ];
  Tables$1.t15HB = [
    7,
    12,
    18,
    53,
    47,
    76,
    124,
    108,
    89,
    123,
    108,
    119,
    107,
    81,
    122,
    63,
    13,
    5,
    16,
    27,
    46,
    36,
    61,
    51,
    42,
    70,
    52,
    83,
    65,
    41,
    59,
    36,
    19,
    17,
    15,
    24,
    41,
    34,
    59,
    48,
    40,
    64,
    50,
    78,
    62,
    80,
    56,
    33,
    29,
    28,
    25,
    43,
    39,
    63,
    55,
    93,
    76,
    59,
    93,
    72,
    54,
    75,
    50,
    29,
    52,
    22,
    42,
    40,
    67,
    57,
    95,
    79,
    72,
    57,
    89,
    69,
    49,
    66,
    46,
    27,
    77,
    37,
    35,
    66,
    58,
    52,
    91,
    74,
    62,
    48,
    79,
    63,
    90,
    62,
    40,
    38,
    125,
    32,
    60,
    56,
    50,
    92,
    78,
    65,
    55,
    87,
    71,
    51,
    73,
    51,
    70,
    30,
    109,
    53,
    49,
    94,
    88,
    75,
    66,
    122,
    91,
    73,
    56,
    42,
    64,
    44,
    21,
    25,
    90,
    43,
    41,
    77,
    73,
    63,
    56,
    92,
    77,
    66,
    47,
    67,
    48,
    53,
    36,
    20,
    71,
    34,
    67,
    60,
    58,
    49,
    88,
    76,
    67,
    106,
    71,
    54,
    38,
    39,
    23,
    15,
    109,
    53,
    51,
    47,
    90,
    82,
    58,
    57,
    48,
    72,
    57,
    41,
    23,
    27,
    62,
    9,
    86,
    42,
    40,
    37,
    70,
    64,
    52,
    43,
    70,
    55,
    42,
    25,
    29,
    18,
    11,
    11,
    118,
    68,
    30,
    55,
    50,
    46,
    74,
    65,
    49,
    39,
    24,
    16,
    22,
    13,
    14,
    7,
    91,
    44,
    39,
    38,
    34,
    63,
    52,
    45,
    31,
    52,
    28,
    19,
    14,
    8,
    9,
    3,
    123,
    60,
    58,
    53,
    47,
    43,
    32,
    22,
    37,
    24,
    17,
    12,
    15,
    10,
    2,
    1,
    71,
    37,
    34,
    30,
    28,
    20,
    17,
    26,
    21,
    16,
    10,
    6,
    8,
    6,
    2,
    0
  ];
  Tables$1.t16HB = [
    1,
    5,
    14,
    44,
    74,
    63,
    110,
    93,
    172,
    149,
    138,
    242,
    225,
    195,
    376,
    17,
    3,
    4,
    12,
    20,
    35,
    62,
    53,
    47,
    83,
    75,
    68,
    119,
    201,
    107,
    207,
    9,
    15,
    13,
    23,
    38,
    67,
    58,
    103,
    90,
    161,
    72,
    127,
    117,
    110,
    209,
    206,
    16,
    45,
    21,
    39,
    69,
    64,
    114,
    99,
    87,
    158,
    140,
    252,
    212,
    199,
    387,
    365,
    26,
    75,
    36,
    68,
    65,
    115,
    101,
    179,
    164,
    155,
    264,
    246,
    226,
    395,
    382,
    362,
    9,
    66,
    30,
    59,
    56,
    102,
    185,
    173,
    265,
    142,
    253,
    232,
    400,
    388,
    378,
    445,
    16,
    111,
    54,
    52,
    100,
    184,
    178,
    160,
    133,
    257,
    244,
    228,
    217,
    385,
    366,
    715,
    10,
    98,
    48,
    91,
    88,
    165,
    157,
    148,
    261,
    248,
    407,
    397,
    372,
    380,
    889,
    884,
    8,
    85,
    84,
    81,
    159,
    156,
    143,
    260,
    249,
    427,
    401,
    392,
    383,
    727,
    713,
    708,
    7,
    154,
    76,
    73,
    141,
    131,
    256,
    245,
    426,
    406,
    394,
    384,
    735,
    359,
    710,
    352,
    11,
    139,
    129,
    67,
    125,
    247,
    233,
    229,
    219,
    393,
    743,
    737,
    720,
    885,
    882,
    439,
    4,
    243,
    120,
    118,
    115,
    227,
    223,
    396,
    746,
    742,
    736,
    721,
    712,
    706,
    223,
    436,
    6,
    202,
    224,
    222,
    218,
    216,
    389,
    386,
    381,
    364,
    888,
    443,
    707,
    440,
    437,
    1728,
    4,
    747,
    211,
    210,
    208,
    370,
    379,
    734,
    723,
    714,
    1735,
    883,
    877,
    876,
    3459,
    865,
    2,
    377,
    369,
    102,
    187,
    726,
    722,
    358,
    711,
    709,
    866,
    1734,
    871,
    3458,
    870,
    434,
    0,
    12,
    10,
    7,
    11,
    10,
    17,
    11,
    9,
    13,
    12,
    10,
    7,
    5,
    3,
    1,
    3
  ];
  Tables$1.t24HB = [
    15,
    13,
    46,
    80,
    146,
    262,
    248,
    434,
    426,
    669,
    653,
    649,
    621,
    517,
    1032,
    88,
    14,
    12,
    21,
    38,
    71,
    130,
    122,
    216,
    209,
    198,
    327,
    345,
    319,
    297,
    279,
    42,
    47,
    22,
    41,
    74,
    68,
    128,
    120,
    221,
    207,
    194,
    182,
    340,
    315,
    295,
    541,
    18,
    81,
    39,
    75,
    70,
    134,
    125,
    116,
    220,
    204,
    190,
    178,
    325,
    311,
    293,
    271,
    16,
    147,
    72,
    69,
    135,
    127,
    118,
    112,
    210,
    200,
    188,
    352,
    323,
    306,
    285,
    540,
    14,
    263,
    66,
    129,
    126,
    119,
    114,
    214,
    202,
    192,
    180,
    341,
    317,
    301,
    281,
    262,
    12,
    249,
    123,
    121,
    117,
    113,
    215,
    206,
    195,
    185,
    347,
    330,
    308,
    291,
    272,
    520,
    10,
    435,
    115,
    111,
    109,
    211,
    203,
    196,
    187,
    353,
    332,
    313,
    298,
    283,
    531,
    381,
    17,
    427,
    212,
    208,
    205,
    201,
    193,
    186,
    177,
    169,
    320,
    303,
    286,
    268,
    514,
    377,
    16,
    335,
    199,
    197,
    191,
    189,
    181,
    174,
    333,
    321,
    305,
    289,
    275,
    521,
    379,
    371,
    11,
    668,
    184,
    183,
    179,
    175,
    344,
    331,
    314,
    304,
    290,
    277,
    530,
    383,
    373,
    366,
    10,
    652,
    346,
    171,
    168,
    164,
    318,
    309,
    299,
    287,
    276,
    263,
    513,
    375,
    368,
    362,
    6,
    648,
    322,
    316,
    312,
    307,
    302,
    292,
    284,
    269,
    261,
    512,
    376,
    370,
    364,
    359,
    4,
    620,
    300,
    296,
    294,
    288,
    282,
    273,
    266,
    515,
    380,
    374,
    369,
    365,
    361,
    357,
    2,
    1033,
    280,
    278,
    274,
    267,
    264,
    259,
    382,
    378,
    372,
    367,
    363,
    360,
    358,
    356,
    0,
    43,
    20,
    19,
    17,
    15,
    13,
    11,
    9,
    7,
    6,
    4,
    7,
    5,
    3,
    1,
    3
  ];
  Tables$1.t32HB = [
    1 << 0,
    5 << 1,
    4 << 1,
    5 << 2,
    6 << 1,
    5 << 2,
    4 << 2,
    4 << 3,
    7 << 1,
    3 << 2,
    6 << 2,
    0 << 3,
    7 << 2,
    2 << 3,
    3 << 3,
    1 << 4
  ];
  Tables$1.t33HB = [
    15 << 0,
    14 << 1,
    13 << 1,
    12 << 2,
    11 << 1,
    10 << 2,
    9 << 2,
    8 << 3,
    7 << 1,
    6 << 2,
    5 << 2,
    4 << 3,
    3 << 2,
    2 << 3,
    1 << 3,
    0 << 4
  ];
  Tables$1.t1l = [
    1,
    4,
    3,
    5
  ];
  Tables$1.t2l = [
    1,
    4,
    7,
    4,
    5,
    7,
    6,
    7,
    8
  ];
  Tables$1.t3l = [
    2,
    3,
    7,
    4,
    4,
    7,
    6,
    7,
    8
  ];
  Tables$1.t5l = [
    1,
    4,
    7,
    8,
    4,
    5,
    8,
    9,
    7,
    8,
    9,
    10,
    8,
    8,
    9,
    10
  ];
  Tables$1.t6l = [
    3,
    4,
    6,
    8,
    4,
    4,
    6,
    7,
    5,
    6,
    7,
    8,
    7,
    7,
    8,
    9
  ];
  Tables$1.t7l = [
    1,
    4,
    7,
    9,
    9,
    10,
    4,
    6,
    8,
    9,
    9,
    10,
    7,
    7,
    9,
    10,
    10,
    11,
    8,
    9,
    10,
    11,
    11,
    11,
    8,
    9,
    10,
    11,
    11,
    12,
    9,
    10,
    11,
    12,
    12,
    12
  ];
  Tables$1.t8l = [
    2,
    4,
    7,
    9,
    9,
    10,
    4,
    4,
    6,
    10,
    10,
    10,
    7,
    6,
    8,
    10,
    10,
    11,
    9,
    10,
    10,
    11,
    11,
    12,
    9,
    9,
    10,
    11,
    12,
    12,
    10,
    10,
    11,
    11,
    13,
    13
  ];
  Tables$1.t9l = [
    3,
    4,
    6,
    7,
    9,
    10,
    4,
    5,
    6,
    7,
    8,
    10,
    5,
    6,
    7,
    8,
    9,
    10,
    7,
    7,
    8,
    9,
    9,
    10,
    8,
    8,
    9,
    9,
    10,
    11,
    9,
    9,
    10,
    10,
    11,
    11
  ];
  Tables$1.t10l = [
    1,
    4,
    7,
    9,
    10,
    10,
    10,
    11,
    4,
    6,
    8,
    9,
    10,
    11,
    10,
    10,
    7,
    8,
    9,
    10,
    11,
    12,
    11,
    11,
    8,
    9,
    10,
    11,
    12,
    12,
    11,
    12,
    9,
    10,
    11,
    12,
    12,
    12,
    12,
    12,
    10,
    11,
    12,
    12,
    13,
    13,
    12,
    13,
    9,
    10,
    11,
    12,
    12,
    12,
    13,
    13,
    10,
    10,
    11,
    12,
    12,
    13,
    13,
    13
  ];
  Tables$1.t11l = [
    2,
    4,
    6,
    8,
    9,
    10,
    9,
    10,
    4,
    5,
    6,
    8,
    10,
    10,
    9,
    10,
    6,
    7,
    8,
    9,
    10,
    11,
    10,
    10,
    8,
    8,
    9,
    11,
    10,
    12,
    10,
    11,
    9,
    10,
    10,
    11,
    11,
    12,
    11,
    12,
    9,
    10,
    11,
    12,
    12,
    13,
    12,
    13,
    9,
    9,
    9,
    10,
    11,
    12,
    12,
    12,
    9,
    9,
    10,
    11,
    12,
    12,
    12,
    12
  ];
  Tables$1.t12l = [
    4,
    4,
    6,
    8,
    9,
    10,
    10,
    10,
    4,
    5,
    6,
    7,
    9,
    9,
    10,
    10,
    6,
    6,
    7,
    8,
    9,
    10,
    9,
    10,
    7,
    7,
    8,
    8,
    9,
    10,
    10,
    10,
    8,
    8,
    9,
    9,
    10,
    10,
    10,
    11,
    9,
    9,
    10,
    10,
    10,
    11,
    10,
    11,
    9,
    9,
    9,
    10,
    10,
    11,
    11,
    12,
    10,
    10,
    10,
    11,
    11,
    11,
    11,
    12
  ];
  Tables$1.t13l = [
    1,
    5,
    7,
    8,
    9,
    10,
    10,
    11,
    10,
    11,
    12,
    12,
    13,
    13,
    14,
    14,
    4,
    6,
    8,
    9,
    10,
    10,
    11,
    11,
    11,
    11,
    12,
    12,
    13,
    14,
    14,
    14,
    7,
    8,
    9,
    10,
    11,
    11,
    12,
    12,
    11,
    12,
    12,
    13,
    13,
    14,
    15,
    15,
    8,
    9,
    10,
    11,
    11,
    12,
    12,
    12,
    12,
    13,
    13,
    13,
    13,
    14,
    15,
    15,
    9,
    9,
    11,
    11,
    12,
    12,
    13,
    13,
    12,
    13,
    13,
    14,
    14,
    15,
    15,
    16,
    10,
    10,
    11,
    12,
    12,
    12,
    13,
    13,
    13,
    13,
    14,
    13,
    15,
    15,
    16,
    16,
    10,
    11,
    12,
    12,
    13,
    13,
    13,
    13,
    13,
    14,
    14,
    14,
    15,
    15,
    16,
    16,
    11,
    11,
    12,
    13,
    13,
    13,
    14,
    14,
    14,
    14,
    15,
    15,
    15,
    16,
    18,
    18,
    10,
    10,
    11,
    12,
    12,
    13,
    13,
    14,
    14,
    14,
    14,
    15,
    15,
    16,
    17,
    17,
    11,
    11,
    12,
    12,
    13,
    13,
    13,
    15,
    14,
    15,
    15,
    16,
    16,
    16,
    18,
    17,
    11,
    12,
    12,
    13,
    13,
    14,
    14,
    15,
    14,
    15,
    16,
    15,
    16,
    17,
    18,
    19,
    12,
    12,
    12,
    13,
    14,
    14,
    14,
    14,
    15,
    15,
    15,
    16,
    17,
    17,
    17,
    18,
    12,
    13,
    13,
    14,
    14,
    15,
    14,
    15,
    16,
    16,
    17,
    17,
    17,
    18,
    18,
    18,
    13,
    13,
    14,
    15,
    15,
    15,
    16,
    16,
    16,
    16,
    16,
    17,
    18,
    17,
    18,
    18,
    14,
    14,
    14,
    15,
    15,
    15,
    17,
    16,
    16,
    19,
    17,
    17,
    17,
    19,
    18,
    18,
    13,
    14,
    15,
    16,
    16,
    16,
    17,
    16,
    17,
    17,
    18,
    18,
    21,
    20,
    21,
    18
  ];
  Tables$1.t15l = [
    3,
    5,
    6,
    8,
    8,
    9,
    10,
    10,
    10,
    11,
    11,
    12,
    12,
    12,
    13,
    14,
    5,
    5,
    7,
    8,
    9,
    9,
    10,
    10,
    10,
    11,
    11,
    12,
    12,
    12,
    13,
    13,
    6,
    7,
    7,
    8,
    9,
    9,
    10,
    10,
    10,
    11,
    11,
    12,
    12,
    13,
    13,
    13,
    7,
    8,
    8,
    9,
    9,
    10,
    10,
    11,
    11,
    11,
    12,
    12,
    12,
    13,
    13,
    13,
    8,
    8,
    9,
    9,
    10,
    10,
    11,
    11,
    11,
    11,
    12,
    12,
    12,
    13,
    13,
    13,
    9,
    9,
    9,
    10,
    10,
    10,
    11,
    11,
    11,
    11,
    12,
    12,
    13,
    13,
    13,
    14,
    10,
    9,
    10,
    10,
    10,
    11,
    11,
    11,
    11,
    12,
    12,
    12,
    13,
    13,
    14,
    14,
    10,
    10,
    10,
    11,
    11,
    11,
    11,
    12,
    12,
    12,
    12,
    12,
    13,
    13,
    13,
    14,
    10,
    10,
    10,
    11,
    11,
    11,
    11,
    12,
    12,
    12,
    12,
    13,
    13,
    14,
    14,
    14,
    10,
    10,
    11,
    11,
    11,
    11,
    12,
    12,
    12,
    13,
    13,
    13,
    13,
    14,
    14,
    14,
    11,
    11,
    11,
    11,
    12,
    12,
    12,
    12,
    12,
    13,
    13,
    13,
    13,
    14,
    15,
    14,
    11,
    11,
    11,
    11,
    12,
    12,
    12,
    12,
    13,
    13,
    13,
    13,
    14,
    14,
    14,
    15,
    12,
    12,
    11,
    12,
    12,
    12,
    13,
    13,
    13,
    13,
    13,
    13,
    14,
    14,
    15,
    15,
    12,
    12,
    12,
    12,
    12,
    13,
    13,
    13,
    13,
    14,
    14,
    14,
    14,
    14,
    15,
    15,
    13,
    13,
    13,
    13,
    13,
    13,
    13,
    13,
    14,
    14,
    14,
    14,
    15,
    15,
    14,
    15,
    13,
    13,
    13,
    13,
    13,
    13,
    13,
    14,
    14,
    14,
    14,
    14,
    15,
    15,
    15,
    15
  ];
  Tables$1.t16_5l = [
    1,
    5,
    7,
    9,
    10,
    10,
    11,
    11,
    12,
    12,
    12,
    13,
    13,
    13,
    14,
    11,
    4,
    6,
    8,
    9,
    10,
    11,
    11,
    11,
    12,
    12,
    12,
    13,
    14,
    13,
    14,
    11,
    7,
    8,
    9,
    10,
    11,
    11,
    12,
    12,
    13,
    12,
    13,
    13,
    13,
    14,
    14,
    12,
    9,
    9,
    10,
    11,
    11,
    12,
    12,
    12,
    13,
    13,
    14,
    14,
    14,
    15,
    15,
    13,
    10,
    10,
    11,
    11,
    12,
    12,
    13,
    13,
    13,
    14,
    14,
    14,
    15,
    15,
    15,
    12,
    10,
    10,
    11,
    11,
    12,
    13,
    13,
    14,
    13,
    14,
    14,
    15,
    15,
    15,
    16,
    13,
    11,
    11,
    11,
    12,
    13,
    13,
    13,
    13,
    14,
    14,
    14,
    14,
    15,
    15,
    16,
    13,
    11,
    11,
    12,
    12,
    13,
    13,
    13,
    14,
    14,
    15,
    15,
    15,
    15,
    17,
    17,
    13,
    11,
    12,
    12,
    13,
    13,
    13,
    14,
    14,
    15,
    15,
    15,
    15,
    16,
    16,
    16,
    13,
    12,
    12,
    12,
    13,
    13,
    14,
    14,
    15,
    15,
    15,
    15,
    16,
    15,
    16,
    15,
    14,
    12,
    13,
    12,
    13,
    14,
    14,
    14,
    14,
    15,
    16,
    16,
    16,
    17,
    17,
    16,
    13,
    13,
    13,
    13,
    13,
    14,
    14,
    15,
    16,
    16,
    16,
    16,
    16,
    16,
    15,
    16,
    14,
    13,
    14,
    14,
    14,
    14,
    15,
    15,
    15,
    15,
    17,
    16,
    16,
    16,
    16,
    18,
    14,
    15,
    14,
    14,
    14,
    15,
    15,
    16,
    16,
    16,
    18,
    17,
    17,
    17,
    19,
    17,
    14,
    14,
    15,
    13,
    14,
    16,
    16,
    15,
    16,
    16,
    17,
    18,
    17,
    19,
    17,
    16,
    14,
    11,
    11,
    11,
    12,
    12,
    13,
    13,
    13,
    14,
    14,
    14,
    14,
    14,
    14,
    14,
    12
  ];
  Tables$1.t16l = [
    1,
    5,
    7,
    9,
    10,
    10,
    11,
    11,
    12,
    12,
    12,
    13,
    13,
    13,
    14,
    10,
    4,
    6,
    8,
    9,
    10,
    11,
    11,
    11,
    12,
    12,
    12,
    13,
    14,
    13,
    14,
    10,
    7,
    8,
    9,
    10,
    11,
    11,
    12,
    12,
    13,
    12,
    13,
    13,
    13,
    14,
    14,
    11,
    9,
    9,
    10,
    11,
    11,
    12,
    12,
    12,
    13,
    13,
    14,
    14,
    14,
    15,
    15,
    12,
    10,
    10,
    11,
    11,
    12,
    12,
    13,
    13,
    13,
    14,
    14,
    14,
    15,
    15,
    15,
    11,
    10,
    10,
    11,
    11,
    12,
    13,
    13,
    14,
    13,
    14,
    14,
    15,
    15,
    15,
    16,
    12,
    11,
    11,
    11,
    12,
    13,
    13,
    13,
    13,
    14,
    14,
    14,
    14,
    15,
    15,
    16,
    12,
    11,
    11,
    12,
    12,
    13,
    13,
    13,
    14,
    14,
    15,
    15,
    15,
    15,
    17,
    17,
    12,
    11,
    12,
    12,
    13,
    13,
    13,
    14,
    14,
    15,
    15,
    15,
    15,
    16,
    16,
    16,
    12,
    12,
    12,
    12,
    13,
    13,
    14,
    14,
    15,
    15,
    15,
    15,
    16,
    15,
    16,
    15,
    13,
    12,
    13,
    12,
    13,
    14,
    14,
    14,
    14,
    15,
    16,
    16,
    16,
    17,
    17,
    16,
    12,
    13,
    13,
    13,
    13,
    14,
    14,
    15,
    16,
    16,
    16,
    16,
    16,
    16,
    15,
    16,
    13,
    13,
    14,
    14,
    14,
    14,
    15,
    15,
    15,
    15,
    17,
    16,
    16,
    16,
    16,
    18,
    13,
    15,
    14,
    14,
    14,
    15,
    15,
    16,
    16,
    16,
    18,
    17,
    17,
    17,
    19,
    17,
    13,
    14,
    15,
    13,
    14,
    16,
    16,
    15,
    16,
    16,
    17,
    18,
    17,
    19,
    17,
    16,
    13,
    10,
    10,
    10,
    11,
    11,
    12,
    12,
    12,
    13,
    13,
    13,
    13,
    13,
    13,
    13,
    10
  ];
  Tables$1.t24l = [
    4,
    5,
    7,
    8,
    9,
    10,
    10,
    11,
    11,
    12,
    12,
    12,
    12,
    12,
    13,
    10,
    5,
    6,
    7,
    8,
    9,
    10,
    10,
    11,
    11,
    11,
    12,
    12,
    12,
    12,
    12,
    10,
    7,
    7,
    8,
    9,
    9,
    10,
    10,
    11,
    11,
    11,
    11,
    12,
    12,
    12,
    13,
    9,
    8,
    8,
    9,
    9,
    10,
    10,
    10,
    11,
    11,
    11,
    11,
    12,
    12,
    12,
    12,
    9,
    9,
    9,
    9,
    10,
    10,
    10,
    10,
    11,
    11,
    11,
    12,
    12,
    12,
    12,
    13,
    9,
    10,
    9,
    10,
    10,
    10,
    10,
    11,
    11,
    11,
    11,
    12,
    12,
    12,
    12,
    12,
    9,
    10,
    10,
    10,
    10,
    10,
    11,
    11,
    11,
    11,
    12,
    12,
    12,
    12,
    12,
    13,
    9,
    11,
    10,
    10,
    10,
    11,
    11,
    11,
    11,
    12,
    12,
    12,
    12,
    12,
    13,
    13,
    10,
    11,
    11,
    11,
    11,
    11,
    11,
    11,
    11,
    11,
    12,
    12,
    12,
    12,
    13,
    13,
    10,
    11,
    11,
    11,
    11,
    11,
    11,
    11,
    12,
    12,
    12,
    12,
    12,
    13,
    13,
    13,
    10,
    12,
    11,
    11,
    11,
    11,
    12,
    12,
    12,
    12,
    12,
    12,
    13,
    13,
    13,
    13,
    10,
    12,
    12,
    11,
    11,
    11,
    12,
    12,
    12,
    12,
    12,
    12,
    13,
    13,
    13,
    13,
    10,
    12,
    12,
    12,
    12,
    12,
    12,
    12,
    12,
    12,
    12,
    13,
    13,
    13,
    13,
    13,
    10,
    12,
    12,
    12,
    12,
    12,
    12,
    12,
    12,
    13,
    13,
    13,
    13,
    13,
    13,
    13,
    10,
    13,
    12,
    12,
    12,
    12,
    12,
    12,
    13,
    13,
    13,
    13,
    13,
    13,
    13,
    13,
    10,
    9,
    9,
    9,
    9,
    9,
    9,
    9,
    9,
    9,
    9,
    9,
    10,
    10,
    10,
    10,
    6
  ];
  Tables$1.t32l = [
    1 + 0,
    4 + 1,
    4 + 1,
    5 + 2,
    4 + 1,
    6 + 2,
    5 + 2,
    6 + 3,
    4 + 1,
    5 + 2,
    5 + 2,
    6 + 3,
    5 + 2,
    6 + 3,
    6 + 3,
    6 + 4
  ];
  Tables$1.t33l = [
    4 + 0,
    4 + 1,
    4 + 1,
    4 + 2,
    4 + 1,
    4 + 2,
    4 + 2,
    4 + 3,
    4 + 1,
    4 + 2,
    4 + 2,
    4 + 3,
    4 + 2,
    4 + 3,
    4 + 3,
    4 + 4
  ];
  Tables$1.ht = [
    /* xlen, linmax, table, hlen */
    new HuffCodeTab(0, 0, null, null),
    new HuffCodeTab(2, 0, Tables$1.t1HB, Tables$1.t1l),
    new HuffCodeTab(3, 0, Tables$1.t2HB, Tables$1.t2l),
    new HuffCodeTab(3, 0, Tables$1.t3HB, Tables$1.t3l),
    new HuffCodeTab(0, 0, null, null),
    /* Apparently not used */
    new HuffCodeTab(4, 0, Tables$1.t5HB, Tables$1.t5l),
    new HuffCodeTab(4, 0, Tables$1.t6HB, Tables$1.t6l),
    new HuffCodeTab(6, 0, Tables$1.t7HB, Tables$1.t7l),
    new HuffCodeTab(6, 0, Tables$1.t8HB, Tables$1.t8l),
    new HuffCodeTab(6, 0, Tables$1.t9HB, Tables$1.t9l),
    new HuffCodeTab(8, 0, Tables$1.t10HB, Tables$1.t10l),
    new HuffCodeTab(8, 0, Tables$1.t11HB, Tables$1.t11l),
    new HuffCodeTab(8, 0, Tables$1.t12HB, Tables$1.t12l),
    new HuffCodeTab(16, 0, Tables$1.t13HB, Tables$1.t13l),
    new HuffCodeTab(0, 0, null, Tables$1.t16_5l),
    /* Apparently not used */
    new HuffCodeTab(16, 0, Tables$1.t15HB, Tables$1.t15l),
    new HuffCodeTab(1, 1, Tables$1.t16HB, Tables$1.t16l),
    new HuffCodeTab(2, 3, Tables$1.t16HB, Tables$1.t16l),
    new HuffCodeTab(3, 7, Tables$1.t16HB, Tables$1.t16l),
    new HuffCodeTab(4, 15, Tables$1.t16HB, Tables$1.t16l),
    new HuffCodeTab(6, 63, Tables$1.t16HB, Tables$1.t16l),
    new HuffCodeTab(8, 255, Tables$1.t16HB, Tables$1.t16l),
    new HuffCodeTab(10, 1023, Tables$1.t16HB, Tables$1.t16l),
    new HuffCodeTab(13, 8191, Tables$1.t16HB, Tables$1.t16l),
    new HuffCodeTab(4, 15, Tables$1.t24HB, Tables$1.t24l),
    new HuffCodeTab(5, 31, Tables$1.t24HB, Tables$1.t24l),
    new HuffCodeTab(6, 63, Tables$1.t24HB, Tables$1.t24l),
    new HuffCodeTab(7, 127, Tables$1.t24HB, Tables$1.t24l),
    new HuffCodeTab(8, 255, Tables$1.t24HB, Tables$1.t24l),
    new HuffCodeTab(9, 511, Tables$1.t24HB, Tables$1.t24l),
    new HuffCodeTab(11, 2047, Tables$1.t24HB, Tables$1.t24l),
    new HuffCodeTab(13, 8191, Tables$1.t24HB, Tables$1.t24l),
    new HuffCodeTab(0, 0, Tables$1.t32HB, Tables$1.t32l),
    new HuffCodeTab(0, 0, Tables$1.t33HB, Tables$1.t33l)
  ];
  Tables$1.largetbl = [
    65540,
    327685,
    458759,
    589832,
    655369,
    655370,
    720906,
    720907,
    786443,
    786444,
    786444,
    851980,
    851980,
    851980,
    917517,
    655370,
    262149,
    393222,
    524295,
    589832,
    655369,
    720906,
    720906,
    720907,
    786443,
    786443,
    786444,
    851980,
    917516,
    851980,
    917516,
    655370,
    458759,
    524295,
    589832,
    655369,
    720905,
    720906,
    786442,
    786443,
    851979,
    786443,
    851979,
    851980,
    851980,
    917516,
    917517,
    720905,
    589832,
    589832,
    655369,
    720905,
    720906,
    786442,
    786442,
    786443,
    851979,
    851979,
    917515,
    917516,
    917516,
    983052,
    983052,
    786441,
    655369,
    655369,
    720905,
    720906,
    786442,
    786442,
    851978,
    851979,
    851979,
    917515,
    917516,
    917516,
    983052,
    983052,
    983053,
    720905,
    655370,
    655369,
    720906,
    720906,
    786442,
    851978,
    851979,
    917515,
    851979,
    917515,
    917516,
    983052,
    983052,
    983052,
    1048588,
    786441,
    720906,
    720906,
    720906,
    786442,
    851978,
    851979,
    851979,
    851979,
    917515,
    917516,
    917516,
    917516,
    983052,
    983052,
    1048589,
    786441,
    720907,
    720906,
    786442,
    786442,
    851979,
    851979,
    851979,
    917515,
    917516,
    983052,
    983052,
    983052,
    983052,
    1114125,
    1114125,
    786442,
    720907,
    786443,
    786443,
    851979,
    851979,
    851979,
    917515,
    917515,
    983051,
    983052,
    983052,
    983052,
    1048588,
    1048589,
    1048589,
    786442,
    786443,
    786443,
    786443,
    851979,
    851979,
    917515,
    917515,
    983052,
    983052,
    983052,
    983052,
    1048588,
    983053,
    1048589,
    983053,
    851978,
    786444,
    851979,
    786443,
    851979,
    917515,
    917516,
    917516,
    917516,
    983052,
    1048588,
    1048588,
    1048589,
    1114125,
    1114125,
    1048589,
    786442,
    851980,
    851980,
    851979,
    851979,
    917515,
    917516,
    983052,
    1048588,
    1048588,
    1048588,
    1048588,
    1048589,
    1048589,
    983053,
    1048589,
    851978,
    851980,
    917516,
    917516,
    917516,
    917516,
    983052,
    983052,
    983052,
    983052,
    1114124,
    1048589,
    1048589,
    1048589,
    1048589,
    1179661,
    851978,
    983052,
    917516,
    917516,
    917516,
    983052,
    983052,
    1048588,
    1048588,
    1048589,
    1179661,
    1114125,
    1114125,
    1114125,
    1245197,
    1114125,
    851978,
    917517,
    983052,
    851980,
    917516,
    1048588,
    1048588,
    983052,
    1048589,
    1048589,
    1114125,
    1179661,
    1114125,
    1245197,
    1114125,
    1048589,
    851978,
    655369,
    655369,
    655369,
    720905,
    720905,
    786441,
    786441,
    786441,
    851977,
    851977,
    851977,
    851978,
    851978,
    851978,
    851978,
    655366
  ];
  Tables$1.table23 = [
    65538,
    262147,
    458759,
    262148,
    327684,
    458759,
    393222,
    458759,
    524296
  ];
  Tables$1.table56 = [
    65539,
    262148,
    458758,
    524296,
    262148,
    327684,
    524294,
    589831,
    458757,
    524294,
    589831,
    655368,
    524295,
    524295,
    589832,
    655369
  ];
  Tables$1.bitrate_table = [
    [0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, -1],
    /* MPEG 2 */
    [0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, -1],
    /* MPEG 1 */
    [0, 8, 16, 24, 32, 40, 48, 56, 64, -1, -1, -1, -1, -1, -1, -1]
    /* MPEG 2.5 */
  ];
  Tables$1.samplerate_table = [
    [22050, 24e3, 16e3, -1],
    [44100, 48e3, 32e3, -1],
    [11025, 12e3, 8e3, -1]
  ];
  Tables$1.scfsi_band = [0, 6, 11, 16, 21];
  var Tables_1 = Tables$1;
  var QuantizePVT_1;
  var hasRequiredQuantizePVT;
  function requireQuantizePVT() {
    if (hasRequiredQuantizePVT) return QuantizePVT_1;
    hasRequiredQuantizePVT = 1;
    var ScaleFac2 = ScaleFac_1;
    var common2 = common$h;
    var VbrMode2 = common2.VbrMode;
    var Float2 = common2.Float;
    var Util2 = common2.Util;
    var new_float2 = common2.new_float;
    var new_int2 = common2.new_int;
    var assert2 = common2.assert;
    var Encoder2 = requireEncoder();
    var MeanBits2 = MeanBits_1;
    var LameInternalFlags2 = LameInternalFlags_1;
    QuantizePVT.Q_MAX = 256 + 1;
    QuantizePVT.Q_MAX2 = 116;
    QuantizePVT.LARGE_BITS = 1e5;
    QuantizePVT.IXMAX_VAL = 8206;
    function QuantizePVT() {
      var BitStream = requireBitStream();
      var tak = null;
      var rv = null;
      var psy = null;
      this.setModules = function(_tk, _rv, _psy) {
        tak = _tk;
        rv = _rv;
        psy = _psy;
      };
      function POW20(x) {
        assert2(0 <= x + QuantizePVT.Q_MAX2 && x < QuantizePVT.Q_MAX);
        return pow20[x + QuantizePVT.Q_MAX2];
      }
      this.IPOW20 = function(x) {
        assert2(0 <= x && x < QuantizePVT.Q_MAX);
        return ipow20[x];
      };
      var DBL_EPSILON = 2220446049250313e-31;
      var IXMAX_VAL = QuantizePVT.IXMAX_VAL;
      var PRECALC_SIZE = IXMAX_VAL + 2;
      var Q_MAX = QuantizePVT.Q_MAX;
      var Q_MAX2 = QuantizePVT.Q_MAX2;
      QuantizePVT.LARGE_BITS;
      var NSATHSCALE = 100;
      this.nr_of_sfb_block = [
        [[6, 5, 5, 5], [9, 9, 9, 9], [6, 9, 9, 9]],
        [[6, 5, 7, 3], [9, 9, 12, 6], [6, 9, 12, 6]],
        [[11, 10, 0, 0], [18, 18, 0, 0], [15, 18, 0, 0]],
        [[7, 7, 7, 0], [12, 12, 12, 0], [6, 15, 12, 0]],
        [[6, 6, 6, 3], [12, 9, 9, 6], [6, 12, 9, 6]],
        [[8, 8, 5, 0], [15, 12, 9, 0], [6, 18, 9, 0]]
      ];
      var pretab = [
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        1,
        1,
        1,
        1,
        2,
        2,
        3,
        3,
        3,
        2,
        0
      ];
      this.pretab = pretab;
      this.sfBandIndex = [
        // Table B.2.b: 22.05 kHz
        new ScaleFac2(
          [
            0,
            6,
            12,
            18,
            24,
            30,
            36,
            44,
            54,
            66,
            80,
            96,
            116,
            140,
            168,
            200,
            238,
            284,
            336,
            396,
            464,
            522,
            576
          ],
          [0, 4, 8, 12, 18, 24, 32, 42, 56, 74, 100, 132, 174, 192],
          [0, 0, 0, 0, 0, 0, 0],
          [0, 0, 0, 0, 0, 0, 0]
          //  sfb12 pseudo sub bands
        ),
        /* Table B.2.c: 24 kHz */
        /* docs: 332. mpg123(broken): 330 */
        new ScaleFac2(
          [
            0,
            6,
            12,
            18,
            24,
            30,
            36,
            44,
            54,
            66,
            80,
            96,
            114,
            136,
            162,
            194,
            232,
            278,
            332,
            394,
            464,
            540,
            576
          ],
          [0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 136, 180, 192],
          [0, 0, 0, 0, 0, 0, 0],
          [0, 0, 0, 0, 0, 0, 0]
          /*  sfb12 pseudo sub bands */
        ),
        /* Table B.2.a: 16 kHz */
        new ScaleFac2(
          [
            0,
            6,
            12,
            18,
            24,
            30,
            36,
            44,
            54,
            66,
            80,
            96,
            116,
            140,
            168,
            200,
            238,
            284,
            336,
            396,
            464,
            522,
            576
          ],
          [0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 134, 174, 192],
          [0, 0, 0, 0, 0, 0, 0],
          [0, 0, 0, 0, 0, 0, 0]
          /*  sfb12 pseudo sub bands */
        ),
        /* Table B.8.b: 44.1 kHz */
        new ScaleFac2(
          [
            0,
            4,
            8,
            12,
            16,
            20,
            24,
            30,
            36,
            44,
            52,
            62,
            74,
            90,
            110,
            134,
            162,
            196,
            238,
            288,
            342,
            418,
            576
          ],
          [0, 4, 8, 12, 16, 22, 30, 40, 52, 66, 84, 106, 136, 192],
          [0, 0, 0, 0, 0, 0, 0],
          [0, 0, 0, 0, 0, 0, 0]
          /*  sfb12 pseudo sub bands */
        ),
        /* Table B.8.c: 48 kHz */
        new ScaleFac2(
          [
            0,
            4,
            8,
            12,
            16,
            20,
            24,
            30,
            36,
            42,
            50,
            60,
            72,
            88,
            106,
            128,
            156,
            190,
            230,
            276,
            330,
            384,
            576
          ],
          [0, 4, 8, 12, 16, 22, 28, 38, 50, 64, 80, 100, 126, 192],
          [0, 0, 0, 0, 0, 0, 0],
          [0, 0, 0, 0, 0, 0, 0]
          /*  sfb12 pseudo sub bands */
        ),
        /* Table B.8.a: 32 kHz */
        new ScaleFac2(
          [
            0,
            4,
            8,
            12,
            16,
            20,
            24,
            30,
            36,
            44,
            54,
            66,
            82,
            102,
            126,
            156,
            194,
            240,
            296,
            364,
            448,
            550,
            576
          ],
          [0, 4, 8, 12, 16, 22, 30, 42, 58, 78, 104, 138, 180, 192],
          [0, 0, 0, 0, 0, 0, 0],
          [0, 0, 0, 0, 0, 0, 0]
          /*  sfb12 pseudo sub bands */
        ),
        /* MPEG-2.5 11.025 kHz */
        new ScaleFac2(
          [
            0,
            6,
            12,
            18,
            24,
            30,
            36,
            44,
            54,
            66,
            80,
            96,
            116,
            140,
            168,
            200,
            238,
            284,
            336,
            396,
            464,
            522,
            576
          ],
          [
            0 / 3,
            12 / 3,
            24 / 3,
            36 / 3,
            54 / 3,
            78 / 3,
            108 / 3,
            144 / 3,
            186 / 3,
            240 / 3,
            312 / 3,
            402 / 3,
            522 / 3,
            576 / 3
          ],
          [0, 0, 0, 0, 0, 0, 0],
          [0, 0, 0, 0, 0, 0, 0]
          /*  sfb12 pseudo sub bands */
        ),
        /* MPEG-2.5 12 kHz */
        new ScaleFac2(
          [
            0,
            6,
            12,
            18,
            24,
            30,
            36,
            44,
            54,
            66,
            80,
            96,
            116,
            140,
            168,
            200,
            238,
            284,
            336,
            396,
            464,
            522,
            576
          ],
          [
            0 / 3,
            12 / 3,
            24 / 3,
            36 / 3,
            54 / 3,
            78 / 3,
            108 / 3,
            144 / 3,
            186 / 3,
            240 / 3,
            312 / 3,
            402 / 3,
            522 / 3,
            576 / 3
          ],
          [0, 0, 0, 0, 0, 0, 0],
          [0, 0, 0, 0, 0, 0, 0]
          /*  sfb12 pseudo sub bands */
        ),
        /* MPEG-2.5 8 kHz */
        new ScaleFac2(
          [
            0,
            12,
            24,
            36,
            48,
            60,
            72,
            88,
            108,
            132,
            160,
            192,
            232,
            280,
            336,
            400,
            476,
            566,
            568,
            570,
            572,
            574,
            576
          ],
          [
            0 / 3,
            24 / 3,
            48 / 3,
            72 / 3,
            108 / 3,
            156 / 3,
            216 / 3,
            288 / 3,
            372 / 3,
            480 / 3,
            486 / 3,
            492 / 3,
            498 / 3,
            576 / 3
          ],
          [0, 0, 0, 0, 0, 0, 0],
          [0, 0, 0, 0, 0, 0, 0]
          /*  sfb12 pseudo sub bands */
        )
      ];
      var pow20 = new_float2(Q_MAX + Q_MAX2 + 1);
      var ipow20 = new_float2(Q_MAX);
      var pow43 = new_float2(PRECALC_SIZE);
      var adj43 = new_float2(PRECALC_SIZE);
      this.adj43 = adj43;
      function ATHmdct(gfp, f2) {
        var ath = psy.ATHformula(f2, gfp);
        ath -= NSATHSCALE;
        ath = Math.pow(10, ath / 10 + gfp.ATHlower);
        return ath;
      }
      function compute_ath(gfp) {
        var ATH_l = gfp.internal_flags.ATH.l;
        var ATH_psfb21 = gfp.internal_flags.ATH.psfb21;
        var ATH_s = gfp.internal_flags.ATH.s;
        var ATH_psfb12 = gfp.internal_flags.ATH.psfb12;
        var gfc = gfp.internal_flags;
        var samp_freq = gfp.out_samplerate;
        for (var sfb = 0; sfb < Encoder2.SBMAX_l; sfb++) {
          var start = gfc.scalefac_band.l[sfb];
          var end = gfc.scalefac_band.l[sfb + 1];
          ATH_l[sfb] = Float2.MAX_VALUE;
          for (var i = start; i < end; i++) {
            var freq = i * samp_freq / (2 * 576);
            var ATH_f = ATHmdct(gfp, freq);
            ATH_l[sfb] = Math.min(ATH_l[sfb], ATH_f);
          }
        }
        for (var sfb = 0; sfb < Encoder2.PSFB21; sfb++) {
          var start = gfc.scalefac_band.psfb21[sfb];
          var end = gfc.scalefac_band.psfb21[sfb + 1];
          ATH_psfb21[sfb] = Float2.MAX_VALUE;
          for (var i = start; i < end; i++) {
            var freq = i * samp_freq / (2 * 576);
            var ATH_f = ATHmdct(gfp, freq);
            ATH_psfb21[sfb] = Math.min(ATH_psfb21[sfb], ATH_f);
          }
        }
        for (var sfb = 0; sfb < Encoder2.SBMAX_s; sfb++) {
          var start = gfc.scalefac_band.s[sfb];
          var end = gfc.scalefac_band.s[sfb + 1];
          ATH_s[sfb] = Float2.MAX_VALUE;
          for (var i = start; i < end; i++) {
            var freq = i * samp_freq / (2 * 192);
            var ATH_f = ATHmdct(gfp, freq);
            ATH_s[sfb] = Math.min(ATH_s[sfb], ATH_f);
          }
          ATH_s[sfb] *= gfc.scalefac_band.s[sfb + 1] - gfc.scalefac_band.s[sfb];
        }
        for (var sfb = 0; sfb < Encoder2.PSFB12; sfb++) {
          var start = gfc.scalefac_band.psfb12[sfb];
          var end = gfc.scalefac_band.psfb12[sfb + 1];
          ATH_psfb12[sfb] = Float2.MAX_VALUE;
          for (var i = start; i < end; i++) {
            var freq = i * samp_freq / (2 * 192);
            var ATH_f = ATHmdct(gfp, freq);
            ATH_psfb12[sfb] = Math.min(ATH_psfb12[sfb], ATH_f);
          }
          ATH_psfb12[sfb] *= gfc.scalefac_band.s[13] - gfc.scalefac_band.s[12];
        }
        if (gfp.noATH) {
          for (var sfb = 0; sfb < Encoder2.SBMAX_l; sfb++) {
            ATH_l[sfb] = 1e-20;
          }
          for (var sfb = 0; sfb < Encoder2.PSFB21; sfb++) {
            ATH_psfb21[sfb] = 1e-20;
          }
          for (var sfb = 0; sfb < Encoder2.SBMAX_s; sfb++) {
            ATH_s[sfb] = 1e-20;
          }
          for (var sfb = 0; sfb < Encoder2.PSFB12; sfb++) {
            ATH_psfb12[sfb] = 1e-20;
          }
        }
        gfc.ATH.floor = 10 * Math.log10(ATHmdct(gfp, -1));
      }
      this.iteration_init = function(gfp) {
        var gfc = gfp.internal_flags;
        var l3_side = gfc.l3_side;
        var i;
        if (gfc.iteration_init_init == 0) {
          gfc.iteration_init_init = 1;
          l3_side.main_data_begin = 0;
          compute_ath(gfp);
          pow43[0] = 0;
          for (i = 1; i < PRECALC_SIZE; i++)
            pow43[i] = Math.pow(i, 4 / 3);
          for (i = 0; i < PRECALC_SIZE - 1; i++)
            adj43[i] = i + 1 - Math.pow(
              0.5 * (pow43[i] + pow43[i + 1]),
              0.75
            );
          adj43[i] = 0.5;
          for (i = 0; i < Q_MAX; i++)
            ipow20[i] = Math.pow(2, (i - 210) * -0.1875);
          for (i = 0; i <= Q_MAX + Q_MAX2; i++)
            pow20[i] = Math.pow(2, (i - 210 - Q_MAX2) * 0.25);
          tak.huffman_init(gfc);
          {
            var bass, alto, treble, sfb21;
            i = gfp.exp_nspsytune >> 2 & 63;
            if (i >= 32)
              i -= 64;
            bass = Math.pow(10, i / 4 / 10);
            i = gfp.exp_nspsytune >> 8 & 63;
            if (i >= 32)
              i -= 64;
            alto = Math.pow(10, i / 4 / 10);
            i = gfp.exp_nspsytune >> 14 & 63;
            if (i >= 32)
              i -= 64;
            treble = Math.pow(10, i / 4 / 10);
            i = gfp.exp_nspsytune >> 20 & 63;
            if (i >= 32)
              i -= 64;
            sfb21 = treble * Math.pow(10, i / 4 / 10);
            for (i = 0; i < Encoder2.SBMAX_l; i++) {
              var f2;
              if (i <= 6)
                f2 = bass;
              else if (i <= 13)
                f2 = alto;
              else if (i <= 20)
                f2 = treble;
              else
                f2 = sfb21;
              gfc.nsPsy.longfact[i] = f2;
            }
            for (i = 0; i < Encoder2.SBMAX_s; i++) {
              var f2;
              if (i <= 5)
                f2 = bass;
              else if (i <= 10)
                f2 = alto;
              else if (i <= 11)
                f2 = treble;
              else
                f2 = sfb21;
              gfc.nsPsy.shortfact[i] = f2;
            }
          }
        }
      };
      this.on_pe = function(gfp, pe, targ_bits, mean_bits, gr, cbr) {
        var gfc = gfp.internal_flags;
        var tbits = 0, bits;
        var add_bits = new_int2(2);
        var ch;
        var mb = new MeanBits2(tbits);
        var extra_bits = rv.ResvMaxBits(gfp, mean_bits, mb, cbr);
        tbits = mb.bits;
        var max_bits = tbits + extra_bits;
        if (max_bits > LameInternalFlags2.MAX_BITS_PER_GRANULE) {
          max_bits = LameInternalFlags2.MAX_BITS_PER_GRANULE;
        }
        for (bits = 0, ch = 0; ch < gfc.channels_out; ++ch) {
          targ_bits[ch] = Math.min(
            LameInternalFlags2.MAX_BITS_PER_CHANNEL,
            tbits / gfc.channels_out
          );
          add_bits[ch] = 0 | targ_bits[ch] * pe[gr][ch] / 700 - targ_bits[ch];
          if (add_bits[ch] > mean_bits * 3 / 4)
            add_bits[ch] = mean_bits * 3 / 4;
          if (add_bits[ch] < 0)
            add_bits[ch] = 0;
          if (add_bits[ch] + targ_bits[ch] > LameInternalFlags2.MAX_BITS_PER_CHANNEL)
            add_bits[ch] = Math.max(
              0,
              LameInternalFlags2.MAX_BITS_PER_CHANNEL - targ_bits[ch]
            );
          bits += add_bits[ch];
        }
        if (bits > extra_bits) {
          for (ch = 0; ch < gfc.channels_out; ++ch) {
            add_bits[ch] = extra_bits * add_bits[ch] / bits;
          }
        }
        for (ch = 0; ch < gfc.channels_out; ++ch) {
          targ_bits[ch] += add_bits[ch];
          extra_bits -= add_bits[ch];
        }
        for (bits = 0, ch = 0; ch < gfc.channels_out; ++ch) {
          bits += targ_bits[ch];
        }
        if (bits > LameInternalFlags2.MAX_BITS_PER_GRANULE) {
          var sum = 0;
          for (ch = 0; ch < gfc.channels_out; ++ch) {
            targ_bits[ch] *= LameInternalFlags2.MAX_BITS_PER_GRANULE;
            targ_bits[ch] /= bits;
            sum += targ_bits[ch];
          }
        }
        return max_bits;
      };
      this.reduce_side = function(targ_bits, ms_ener_ratio, mean_bits, max_bits) {
        assert2(targ_bits[0] + targ_bits[1] <= LameInternalFlags2.MAX_BITS_PER_GRANULE);
        var fac = 0.33 * (0.5 - ms_ener_ratio) / 0.5;
        if (fac < 0)
          fac = 0;
        if (fac > 0.5)
          fac = 0.5;
        var move_bits = 0 | fac * 0.5 * (targ_bits[0] + targ_bits[1]);
        if (move_bits > LameInternalFlags2.MAX_BITS_PER_CHANNEL - targ_bits[0]) {
          move_bits = LameInternalFlags2.MAX_BITS_PER_CHANNEL - targ_bits[0];
        }
        if (move_bits < 0)
          move_bits = 0;
        if (targ_bits[1] >= 125) {
          if (targ_bits[1] - move_bits > 125) {
            if (targ_bits[0] < mean_bits)
              targ_bits[0] += move_bits;
            targ_bits[1] -= move_bits;
          } else {
            targ_bits[0] += targ_bits[1] - 125;
            targ_bits[1] = 125;
          }
        }
        move_bits = targ_bits[0] + targ_bits[1];
        if (move_bits > max_bits) {
          targ_bits[0] = max_bits * targ_bits[0] / move_bits;
          targ_bits[1] = max_bits * targ_bits[1] / move_bits;
        }
        assert2(targ_bits[0] <= LameInternalFlags2.MAX_BITS_PER_CHANNEL);
        assert2(targ_bits[1] <= LameInternalFlags2.MAX_BITS_PER_CHANNEL);
        assert2(targ_bits[0] + targ_bits[1] <= LameInternalFlags2.MAX_BITS_PER_GRANULE);
      };
      this.athAdjust = function(a, x, athFloor) {
        var o = 90.30873362;
        var p2 = 94.82444863;
        var u = Util2.FAST_LOG10_X(x, 10);
        var v = a * a;
        var w = 0;
        u -= athFloor;
        if (v > 1e-20)
          w = 1 + Util2.FAST_LOG10_X(v, 10 / o);
        if (w < 0)
          w = 0;
        u *= w;
        u += athFloor + o - p2;
        return Math.pow(10, 0.1 * u);
      };
      this.calc_xmin = function(gfp, ratio, cod_info, pxmin) {
        var pxminPos = 0;
        var gfc = gfp.internal_flags;
        var gsfb, j = 0, ath_over = 0;
        var ATH2 = gfc.ATH;
        var xr = cod_info.xr;
        var enable_athaa_fix = gfp.VBR == VbrMode2.vbr_mtrh ? 1 : 0;
        var masking_lower = gfc.masking_lower;
        if (gfp.VBR == VbrMode2.vbr_mtrh || gfp.VBR == VbrMode2.vbr_mt) {
          masking_lower = 1;
        }
        for (gsfb = 0; gsfb < cod_info.psy_lmax; gsfb++) {
          var en0, xmin;
          var rh1, rh2;
          var width, l2;
          if (gfp.VBR == VbrMode2.vbr_rh || gfp.VBR == VbrMode2.vbr_mtrh)
            xmin = athAdjust(ATH2.adjust, ATH2.l[gsfb], ATH2.floor);
          else
            xmin = ATH2.adjust * ATH2.l[gsfb];
          width = cod_info.width[gsfb];
          rh1 = xmin / width;
          rh2 = DBL_EPSILON;
          l2 = width >> 1;
          en0 = 0;
          do {
            var xa, xb;
            xa = xr[j] * xr[j];
            en0 += xa;
            rh2 += xa < rh1 ? xa : rh1;
            j++;
            xb = xr[j] * xr[j];
            en0 += xb;
            rh2 += xb < rh1 ? xb : rh1;
            j++;
          } while (--l2 > 0);
          if (en0 > xmin)
            ath_over++;
          if (gsfb == Encoder2.SBPSY_l) {
            var x = xmin * gfc.nsPsy.longfact[gsfb];
            if (rh2 < x) {
              rh2 = x;
            }
          }
          if (enable_athaa_fix != 0) {
            xmin = rh2;
          }
          if (!gfp.ATHonly) {
            var e = ratio.en.l[gsfb];
            if (e > 0) {
              var x;
              x = en0 * ratio.thm.l[gsfb] * masking_lower / e;
              if (enable_athaa_fix != 0)
                x *= gfc.nsPsy.longfact[gsfb];
              if (xmin < x)
                xmin = x;
            }
          }
          if (enable_athaa_fix != 0)
            pxmin[pxminPos++] = xmin;
          else
            pxmin[pxminPos++] = xmin * gfc.nsPsy.longfact[gsfb];
        }
        var max_nonzero = 575;
        if (cod_info.block_type != Encoder2.SHORT_TYPE) {
          var k2 = 576;
          while (k2-- != 0 && BitStream.EQ(xr[k2], 0)) {
            max_nonzero = k2;
          }
        }
        cod_info.max_nonzero_coeff = max_nonzero;
        for (var sfb = cod_info.sfb_smin; gsfb < cod_info.psymax; sfb++, gsfb += 3) {
          var width, b;
          var tmpATH;
          if (gfp.VBR == VbrMode2.vbr_rh || gfp.VBR == VbrMode2.vbr_mtrh)
            tmpATH = athAdjust(ATH2.adjust, ATH2.s[sfb], ATH2.floor);
          else
            tmpATH = ATH2.adjust * ATH2.s[sfb];
          width = cod_info.width[gsfb];
          for (b = 0; b < 3; b++) {
            var en0 = 0, xmin;
            var rh1, rh2;
            var l2 = width >> 1;
            rh1 = tmpATH / width;
            rh2 = DBL_EPSILON;
            do {
              var xa, xb;
              xa = xr[j] * xr[j];
              en0 += xa;
              rh2 += xa < rh1 ? xa : rh1;
              j++;
              xb = xr[j] * xr[j];
              en0 += xb;
              rh2 += xb < rh1 ? xb : rh1;
              j++;
            } while (--l2 > 0);
            if (en0 > tmpATH)
              ath_over++;
            if (sfb == Encoder2.SBPSY_s) {
              var x = tmpATH * gfc.nsPsy.shortfact[sfb];
              if (rh2 < x) {
                rh2 = x;
              }
            }
            if (enable_athaa_fix != 0)
              xmin = rh2;
            else
              xmin = tmpATH;
            if (!gfp.ATHonly && !gfp.ATHshort) {
              var e = ratio.en.s[sfb][b];
              if (e > 0) {
                var x;
                x = en0 * ratio.thm.s[sfb][b] * masking_lower / e;
                if (enable_athaa_fix != 0)
                  x *= gfc.nsPsy.shortfact[sfb];
                if (xmin < x)
                  xmin = x;
              }
            }
            if (enable_athaa_fix != 0)
              pxmin[pxminPos++] = xmin;
            else
              pxmin[pxminPos++] = xmin * gfc.nsPsy.shortfact[sfb];
          }
          if (gfp.useTemporal) {
            if (pxmin[pxminPos - 3] > pxmin[pxminPos - 3 + 1])
              pxmin[pxminPos - 3 + 1] += (pxmin[pxminPos - 3] - pxmin[pxminPos - 3 + 1]) * gfc.decay;
            if (pxmin[pxminPos - 3 + 1] > pxmin[pxminPos - 3 + 2])
              pxmin[pxminPos - 3 + 2] += (pxmin[pxminPos - 3 + 1] - pxmin[pxminPos - 3 + 2]) * gfc.decay;
          }
        }
        return ath_over;
      };
      function StartLine(j) {
        this.s = j;
      }
      this.calc_noise_core = function(cod_info, startline, l2, step) {
        var noise = 0;
        var j = startline.s;
        var ix = cod_info.l3_enc;
        if (j > cod_info.count1) {
          while (l2-- != 0) {
            var temp;
            temp = cod_info.xr[j];
            j++;
            noise += temp * temp;
            temp = cod_info.xr[j];
            j++;
            noise += temp * temp;
          }
        } else if (j > cod_info.big_values) {
          var ix01 = new_float2(2);
          ix01[0] = 0;
          ix01[1] = step;
          while (l2-- != 0) {
            var temp;
            temp = Math.abs(cod_info.xr[j]) - ix01[ix[j]];
            j++;
            noise += temp * temp;
            temp = Math.abs(cod_info.xr[j]) - ix01[ix[j]];
            j++;
            noise += temp * temp;
          }
        } else {
          while (l2-- != 0) {
            var temp;
            temp = Math.abs(cod_info.xr[j]) - pow43[ix[j]] * step;
            j++;
            noise += temp * temp;
            temp = Math.abs(cod_info.xr[j]) - pow43[ix[j]] * step;
            j++;
            noise += temp * temp;
          }
        }
        startline.s = j;
        return noise;
      };
      this.calc_noise = function(cod_info, l3_xmin, distort, res, prev_noise) {
        var distortPos = 0;
        var l3_xminPos = 0;
        var sfb, l2, over = 0;
        var over_noise_db = 0;
        var tot_noise_db = 0;
        var max_noise = -20;
        var j = 0;
        var scalefac = cod_info.scalefac;
        var scalefacPos = 0;
        res.over_SSD = 0;
        for (sfb = 0; sfb < cod_info.psymax; sfb++) {
          var s = cod_info.global_gain - (scalefac[scalefacPos++] + (cod_info.preflag != 0 ? pretab[sfb] : 0) << cod_info.scalefac_scale + 1) - cod_info.subblock_gain[cod_info.window[sfb]] * 8;
          var noise = 0;
          if (prev_noise != null && prev_noise.step[sfb] == s) {
            noise = prev_noise.noise[sfb];
            j += cod_info.width[sfb];
            distort[distortPos++] = noise / l3_xmin[l3_xminPos++];
            noise = prev_noise.noise_log[sfb];
          } else {
            var step = POW20(s);
            l2 = cod_info.width[sfb] >> 1;
            if (j + cod_info.width[sfb] > cod_info.max_nonzero_coeff) {
              var usefullsize;
              usefullsize = cod_info.max_nonzero_coeff - j + 1;
              if (usefullsize > 0)
                l2 = usefullsize >> 1;
              else
                l2 = 0;
            }
            var sl = new StartLine(j);
            noise = this.calc_noise_core(cod_info, sl, l2, step);
            j = sl.s;
            if (prev_noise != null) {
              prev_noise.step[sfb] = s;
              prev_noise.noise[sfb] = noise;
            }
            noise = distort[distortPos++] = noise / l3_xmin[l3_xminPos++];
            noise = Util2.FAST_LOG10(Math.max(noise, 1e-20));
            if (prev_noise != null) {
              prev_noise.noise_log[sfb] = noise;
            }
          }
          if (prev_noise != null) {
            prev_noise.global_gain = cod_info.global_gain;
          }
          tot_noise_db += noise;
          if (noise > 0) {
            var tmp;
            tmp = Math.max(0 | noise * 10 + 0.5, 1);
            res.over_SSD += tmp * tmp;
            over++;
            over_noise_db += noise;
          }
          max_noise = Math.max(max_noise, noise);
        }
        res.over_count = over;
        res.tot_noise = tot_noise_db;
        res.over_noise = over_noise_db;
        res.max_noise = max_noise;
        return over;
      };
      this.set_pinfo = function(gfp, cod_info, ratio, gr, ch) {
        var gfc = gfp.internal_flags;
        var sfb, sfb2;
        var l2;
        var en0, en1;
        var ifqstep = cod_info.scalefac_scale == 0 ? 0.5 : 1;
        var scalefac = cod_info.scalefac;
        var l3_xmin = new_float2(L3Side.SFBMAX);
        var xfsf = new_float2(L3Side.SFBMAX);
        var noise = new CalcNoiseResult();
        calc_xmin(gfp, ratio, cod_info, l3_xmin);
        calc_noise(cod_info, l3_xmin, xfsf, noise, null);
        var j = 0;
        sfb2 = cod_info.sfb_lmax;
        if (cod_info.block_type != Encoder2.SHORT_TYPE && 0 == cod_info.mixed_block_flag)
          sfb2 = 22;
        for (sfb = 0; sfb < sfb2; sfb++) {
          var start = gfc.scalefac_band.l[sfb];
          var end = gfc.scalefac_band.l[sfb + 1];
          var bw = end - start;
          for (en0 = 0; j < end; j++)
            en0 += cod_info.xr[j] * cod_info.xr[j];
          en0 /= bw;
          en1 = 1e15;
          gfc.pinfo.en[gr][ch][sfb] = en1 * en0;
          gfc.pinfo.xfsf[gr][ch][sfb] = en1 * l3_xmin[sfb] * xfsf[sfb] / bw;
          if (ratio.en.l[sfb] > 0 && !gfp.ATHonly)
            en0 = en0 / ratio.en.l[sfb];
          else
            en0 = 0;
          gfc.pinfo.thr[gr][ch][sfb] = en1 * Math.max(en0 * ratio.thm.l[sfb], gfc.ATH.l[sfb]);
          gfc.pinfo.LAMEsfb[gr][ch][sfb] = 0;
          if (cod_info.preflag != 0 && sfb >= 11)
            gfc.pinfo.LAMEsfb[gr][ch][sfb] = -ifqstep * pretab[sfb];
          if (sfb < Encoder2.SBPSY_l) {
            assert2(scalefac[sfb] >= 0);
            gfc.pinfo.LAMEsfb[gr][ch][sfb] -= ifqstep * scalefac[sfb];
          }
        }
        if (cod_info.block_type == Encoder2.SHORT_TYPE) {
          sfb2 = sfb;
          for (sfb = cod_info.sfb_smin; sfb < Encoder2.SBMAX_s; sfb++) {
            var start = gfc.scalefac_band.s[sfb];
            var end = gfc.scalefac_band.s[sfb + 1];
            var bw = end - start;
            for (var i = 0; i < 3; i++) {
              for (en0 = 0, l2 = start; l2 < end; l2++) {
                en0 += cod_info.xr[j] * cod_info.xr[j];
                j++;
              }
              en0 = Math.max(en0 / bw, 1e-20);
              en1 = 1e15;
              gfc.pinfo.en_s[gr][ch][3 * sfb + i] = en1 * en0;
              gfc.pinfo.xfsf_s[gr][ch][3 * sfb + i] = en1 * l3_xmin[sfb2] * xfsf[sfb2] / bw;
              if (ratio.en.s[sfb][i] > 0)
                en0 = en0 / ratio.en.s[sfb][i];
              else
                en0 = 0;
              if (gfp.ATHonly || gfp.ATHshort)
                en0 = 0;
              gfc.pinfo.thr_s[gr][ch][3 * sfb + i] = en1 * Math.max(
                en0 * ratio.thm.s[sfb][i],
                gfc.ATH.s[sfb]
              );
              gfc.pinfo.LAMEsfb_s[gr][ch][3 * sfb + i] = -2 * cod_info.subblock_gain[i];
              if (sfb < Encoder2.SBPSY_s) {
                gfc.pinfo.LAMEsfb_s[gr][ch][3 * sfb + i] -= ifqstep * scalefac[sfb2];
              }
              sfb2++;
            }
          }
        }
        gfc.pinfo.LAMEqss[gr][ch] = cod_info.global_gain;
        gfc.pinfo.LAMEmainbits[gr][ch] = cod_info.part2_3_length + cod_info.part2_length;
        gfc.pinfo.LAMEsfbits[gr][ch] = cod_info.part2_length;
        gfc.pinfo.over[gr][ch] = noise.over_count;
        gfc.pinfo.max_noise[gr][ch] = noise.max_noise * 10;
        gfc.pinfo.over_noise[gr][ch] = noise.over_noise * 10;
        gfc.pinfo.tot_noise[gr][ch] = noise.tot_noise * 10;
        gfc.pinfo.over_SSD[gr][ch] = noise.over_SSD;
      };
    }
    QuantizePVT_1 = QuantizePVT;
    return QuantizePVT_1;
  }
  var Takehiro_1;
  var hasRequiredTakehiro;
  function requireTakehiro() {
    if (hasRequiredTakehiro) return Takehiro_1;
    hasRequiredTakehiro = 1;
    var common2 = common$h;
    var System2 = common2.System;
    var Arrays2 = common2.Arrays;
    var new_int2 = common2.new_int;
    var assert2 = common2.assert;
    var Encoder2 = requireEncoder();
    var Tables2 = Tables_1;
    var GrInfo2 = GrInfo_1;
    var QuantizePVT = requireQuantizePVT();
    function Takehiro() {
      var qupvt = null;
      this.qupvt = null;
      this.setModules = function(_qupvt) {
        this.qupvt = _qupvt;
        qupvt = _qupvt;
      };
      function Bits(b) {
        this.bits = 0 | b;
      }
      var subdv_table = [
        [0, 0],
        /* 0 bands */
        [0, 0],
        /* 1 bands */
        [0, 0],
        /* 2 bands */
        [0, 0],
        /* 3 bands */
        [0, 0],
        /* 4 bands */
        [0, 1],
        /* 5 bands */
        [1, 1],
        /* 6 bands */
        [1, 1],
        /* 7 bands */
        [1, 2],
        /* 8 bands */
        [2, 2],
        /* 9 bands */
        [2, 3],
        /* 10 bands */
        [2, 3],
        /* 11 bands */
        [3, 4],
        /* 12 bands */
        [3, 4],
        /* 13 bands */
        [3, 4],
        /* 14 bands */
        [4, 5],
        /* 15 bands */
        [4, 5],
        /* 16 bands */
        [4, 6],
        /* 17 bands */
        [5, 6],
        /* 18 bands */
        [5, 6],
        /* 19 bands */
        [5, 7],
        /* 20 bands */
        [6, 7],
        /* 21 bands */
        [6, 7]
        /* 22 bands */
      ];
      function quantize_lines_xrpow_01(l2, istep, xr, xrPos, ix, ixPos) {
        var compareval0 = (1 - 0.4054) / istep;
        l2 = l2 >> 1;
        while (l2-- != 0) {
          ix[ixPos++] = compareval0 > xr[xrPos++] ? 0 : 1;
          ix[ixPos++] = compareval0 > xr[xrPos++] ? 0 : 1;
        }
      }
      function quantize_lines_xrpow(l2, istep, xr, xrPos, ix, ixPos) {
        l2 = l2 >> 1;
        var remaining = l2 % 2;
        l2 = l2 >> 1;
        while (l2-- != 0) {
          var x0, x1, x2, x3;
          var rx0, rx1, rx2, rx3;
          x0 = xr[xrPos++] * istep;
          x1 = xr[xrPos++] * istep;
          rx0 = 0 | x0;
          x2 = xr[xrPos++] * istep;
          rx1 = 0 | x1;
          x3 = xr[xrPos++] * istep;
          rx2 = 0 | x2;
          x0 += qupvt.adj43[rx0];
          rx3 = 0 | x3;
          x1 += qupvt.adj43[rx1];
          ix[ixPos++] = 0 | x0;
          x2 += qupvt.adj43[rx2];
          ix[ixPos++] = 0 | x1;
          x3 += qupvt.adj43[rx3];
          ix[ixPos++] = 0 | x2;
          ix[ixPos++] = 0 | x3;
        }
        if (remaining != 0) {
          var x0, x1;
          var rx0, rx1;
          x0 = xr[xrPos++] * istep;
          x1 = xr[xrPos++] * istep;
          rx0 = 0 | x0;
          rx1 = 0 | x1;
          x0 += qupvt.adj43[rx0];
          x1 += qupvt.adj43[rx1];
          ix[ixPos++] = 0 | x0;
          ix[ixPos++] = 0 | x1;
        }
      }
      function quantize_xrpow(xp, pi, istep, codInfo, prevNoise) {
        var sfb;
        var sfbmax;
        var j = 0;
        var prev_data_use;
        var accumulate = 0;
        var accumulate01 = 0;
        var xpPos = 0;
        var iData = pi;
        var iDataPos = 0;
        var acc_iData = iData;
        var acc_iDataPos = 0;
        var acc_xp = xp;
        var acc_xpPos = 0;
        prev_data_use = prevNoise != null && codInfo.global_gain == prevNoise.global_gain;
        if (codInfo.block_type == Encoder2.SHORT_TYPE)
          sfbmax = 38;
        else
          sfbmax = 21;
        for (sfb = 0; sfb <= sfbmax; sfb++) {
          var step = -1;
          if (prev_data_use || codInfo.block_type == Encoder2.NORM_TYPE) {
            step = codInfo.global_gain - (codInfo.scalefac[sfb] + (codInfo.preflag != 0 ? qupvt.pretab[sfb] : 0) << codInfo.scalefac_scale + 1) - codInfo.subblock_gain[codInfo.window[sfb]] * 8;
          }
          assert2(codInfo.width[sfb] >= 0);
          if (prev_data_use && prevNoise.step[sfb] == step) {
            if (accumulate != 0) {
              quantize_lines_xrpow(
                accumulate,
                istep,
                acc_xp,
                acc_xpPos,
                acc_iData,
                acc_iDataPos
              );
              accumulate = 0;
            }
            if (accumulate01 != 0) {
              quantize_lines_xrpow_01(
                accumulate01,
                istep,
                acc_xp,
                acc_xpPos,
                acc_iData,
                acc_iDataPos
              );
              accumulate01 = 0;
            }
          } else {
            var l2 = codInfo.width[sfb];
            if (j + codInfo.width[sfb] > codInfo.max_nonzero_coeff) {
              var usefullsize;
              usefullsize = codInfo.max_nonzero_coeff - j + 1;
              Arrays2.fill(pi, codInfo.max_nonzero_coeff, 576, 0);
              l2 = usefullsize;
              if (l2 < 0) {
                l2 = 0;
              }
              sfb = sfbmax + 1;
            }
            if (0 == accumulate && 0 == accumulate01) {
              acc_iData = iData;
              acc_iDataPos = iDataPos;
              acc_xp = xp;
              acc_xpPos = xpPos;
            }
            if (prevNoise != null && prevNoise.sfb_count1 > 0 && sfb >= prevNoise.sfb_count1 && prevNoise.step[sfb] > 0 && step >= prevNoise.step[sfb]) {
              if (accumulate != 0) {
                quantize_lines_xrpow(
                  accumulate,
                  istep,
                  acc_xp,
                  acc_xpPos,
                  acc_iData,
                  acc_iDataPos
                );
                accumulate = 0;
                acc_iData = iData;
                acc_iDataPos = iDataPos;
                acc_xp = xp;
                acc_xpPos = xpPos;
              }
              accumulate01 += l2;
            } else {
              if (accumulate01 != 0) {
                quantize_lines_xrpow_01(
                  accumulate01,
                  istep,
                  acc_xp,
                  acc_xpPos,
                  acc_iData,
                  acc_iDataPos
                );
                accumulate01 = 0;
                acc_iData = iData;
                acc_iDataPos = iDataPos;
                acc_xp = xp;
                acc_xpPos = xpPos;
              }
              accumulate += l2;
            }
            if (l2 <= 0) {
              if (accumulate01 != 0) {
                quantize_lines_xrpow_01(
                  accumulate01,
                  istep,
                  acc_xp,
                  acc_xpPos,
                  acc_iData,
                  acc_iDataPos
                );
                accumulate01 = 0;
              }
              if (accumulate != 0) {
                quantize_lines_xrpow(
                  accumulate,
                  istep,
                  acc_xp,
                  acc_xpPos,
                  acc_iData,
                  acc_iDataPos
                );
                accumulate = 0;
              }
              break;
            }
          }
          if (sfb <= sfbmax) {
            iDataPos += codInfo.width[sfb];
            xpPos += codInfo.width[sfb];
            j += codInfo.width[sfb];
          }
        }
        if (accumulate != 0) {
          quantize_lines_xrpow(
            accumulate,
            istep,
            acc_xp,
            acc_xpPos,
            acc_iData,
            acc_iDataPos
          );
          accumulate = 0;
        }
        if (accumulate01 != 0) {
          quantize_lines_xrpow_01(
            accumulate01,
            istep,
            acc_xp,
            acc_xpPos,
            acc_iData,
            acc_iDataPos
          );
          accumulate01 = 0;
        }
      }
      function ix_max(ix, ixPos, endPos) {
        var max1 = 0, max2 = 0;
        do {
          var x1 = ix[ixPos++];
          var x2 = ix[ixPos++];
          if (max1 < x1)
            max1 = x1;
          if (max2 < x2)
            max2 = x2;
        } while (ixPos < endPos);
        if (max1 < max2)
          max1 = max2;
        return max1;
      }
      function count_bit_ESC(ix, ixPos, end, t1, t2, s) {
        var linbits = Tables2.ht[t1].xlen * 65536 + Tables2.ht[t2].xlen;
        var sum = 0, sum2;
        do {
          var x = ix[ixPos++];
          var y = ix[ixPos++];
          if (x != 0) {
            if (x > 14) {
              x = 15;
              sum += linbits;
            }
            x *= 16;
          }
          if (y != 0) {
            if (y > 14) {
              y = 15;
              sum += linbits;
            }
            x += y;
          }
          sum += Tables2.largetbl[x];
        } while (ixPos < end);
        sum2 = sum & 65535;
        sum >>= 16;
        if (sum > sum2) {
          sum = sum2;
          t1 = t2;
        }
        s.bits += sum;
        return t1;
      }
      function count_bit_noESC(ix, ixPos, end, s) {
        var sum1 = 0;
        var hlen1 = Tables2.ht[1].hlen;
        do {
          var x = ix[ixPos + 0] * 2 + ix[ixPos + 1];
          ixPos += 2;
          sum1 += hlen1[x];
        } while (ixPos < end);
        s.bits += sum1;
        return 1;
      }
      function count_bit_noESC_from2(ix, ixPos, end, t1, s) {
        var sum = 0, sum2;
        var xlen = Tables2.ht[t1].xlen;
        var hlen;
        if (t1 == 2)
          hlen = Tables2.table23;
        else
          hlen = Tables2.table56;
        do {
          var x = ix[ixPos + 0] * xlen + ix[ixPos + 1];
          ixPos += 2;
          sum += hlen[x];
        } while (ixPos < end);
        sum2 = sum & 65535;
        sum >>= 16;
        if (sum > sum2) {
          sum = sum2;
          t1++;
        }
        s.bits += sum;
        return t1;
      }
      function count_bit_noESC_from3(ix, ixPos, end, t1, s) {
        var sum1 = 0;
        var sum2 = 0;
        var sum3 = 0;
        var xlen = Tables2.ht[t1].xlen;
        var hlen1 = Tables2.ht[t1].hlen;
        var hlen2 = Tables2.ht[t1 + 1].hlen;
        var hlen3 = Tables2.ht[t1 + 2].hlen;
        do {
          var x = ix[ixPos + 0] * xlen + ix[ixPos + 1];
          ixPos += 2;
          sum1 += hlen1[x];
          sum2 += hlen2[x];
          sum3 += hlen3[x];
        } while (ixPos < end);
        var t = t1;
        if (sum1 > sum2) {
          sum1 = sum2;
          t++;
        }
        if (sum1 > sum3) {
          sum1 = sum3;
          t = t1 + 2;
        }
        s.bits += sum1;
        return t;
      }
      var huf_tbl_noESC = [
        1,
        2,
        5,
        7,
        7,
        10,
        10,
        13,
        13,
        13,
        13,
        13,
        13,
        13,
        13
      ];
      function choose_table(ix, ixPos, endPos, s) {
        var max = ix_max(ix, ixPos, endPos);
        switch (max) {
          case 0:
            return max;
          case 1:
            return count_bit_noESC(ix, ixPos, endPos, s);
          case 2:
          case 3:
            return count_bit_noESC_from2(
              ix,
              ixPos,
              endPos,
              huf_tbl_noESC[max - 1],
              s
            );
          case 4:
          case 5:
          case 6:
          case 7:
          case 8:
          case 9:
          case 10:
          case 11:
          case 12:
          case 13:
          case 14:
          case 15:
            return count_bit_noESC_from3(
              ix,
              ixPos,
              endPos,
              huf_tbl_noESC[max - 1],
              s
            );
          default:
            if (max > QuantizePVT.IXMAX_VAL) {
              s.bits = QuantizePVT.LARGE_BITS;
              return -1;
            }
            max -= 15;
            var choice2;
            for (choice2 = 24; choice2 < 32; choice2++) {
              if (Tables2.ht[choice2].linmax >= max) {
                break;
              }
            }
            var choice;
            for (choice = choice2 - 8; choice < 24; choice++) {
              if (Tables2.ht[choice].linmax >= max) {
                break;
              }
            }
            return count_bit_ESC(ix, ixPos, endPos, choice, choice2, s);
        }
      }
      this.noquant_count_bits = function(gfc, gi, prev_noise) {
        var ix = gi.l3_enc;
        var i = Math.min(576, gi.max_nonzero_coeff + 2 >> 1 << 1);
        if (prev_noise != null)
          prev_noise.sfb_count1 = 0;
        for (; i > 1; i -= 2)
          if ((ix[i - 1] | ix[i - 2]) != 0)
            break;
        gi.count1 = i;
        var a1 = 0;
        var a2 = 0;
        for (; i > 3; i -= 4) {
          var p2;
          if (((ix[i - 1] | ix[i - 2] | ix[i - 3] | ix[i - 4]) & 2147483647) > 1) {
            break;
          }
          p2 = ((ix[i - 4] * 2 + ix[i - 3]) * 2 + ix[i - 2]) * 2 + ix[i - 1];
          a1 += Tables2.t32l[p2];
          a2 += Tables2.t33l[p2];
        }
        var bits = a1;
        gi.count1table_select = 0;
        if (a1 > a2) {
          bits = a2;
          gi.count1table_select = 1;
        }
        gi.count1bits = bits;
        gi.big_values = i;
        if (i == 0)
          return bits;
        if (gi.block_type == Encoder2.SHORT_TYPE) {
          a1 = 3 * gfc.scalefac_band.s[3];
          if (a1 > gi.big_values)
            a1 = gi.big_values;
          a2 = gi.big_values;
        } else if (gi.block_type == Encoder2.NORM_TYPE) {
          a1 = gi.region0_count = gfc.bv_scf[i - 2];
          a2 = gi.region1_count = gfc.bv_scf[i - 1];
          assert2(a1 + a2 + 2 < Encoder2.SBPSY_l);
          a2 = gfc.scalefac_band.l[a1 + a2 + 2];
          a1 = gfc.scalefac_band.l[a1 + 1];
          if (a2 < i) {
            var bi = new Bits(bits);
            gi.table_select[2] = choose_table(ix, a2, i, bi);
            bits = bi.bits;
          }
        } else {
          gi.region0_count = 7;
          gi.region1_count = Encoder2.SBMAX_l - 1 - 7 - 1;
          a1 = gfc.scalefac_band.l[7 + 1];
          a2 = i;
          if (a1 > a2) {
            a1 = a2;
          }
        }
        a1 = Math.min(a1, i);
        a2 = Math.min(a2, i);
        if (0 < a1) {
          var bi = new Bits(bits);
          gi.table_select[0] = choose_table(ix, 0, a1, bi);
          bits = bi.bits;
        }
        if (a1 < a2) {
          var bi = new Bits(bits);
          gi.table_select[1] = choose_table(ix, a1, a2, bi);
          bits = bi.bits;
        }
        if (gfc.use_best_huffman == 2) {
          gi.part2_3_length = bits;
          best_huffman_divide(gfc, gi);
          bits = gi.part2_3_length;
        }
        if (prev_noise != null) {
          if (gi.block_type == Encoder2.NORM_TYPE) {
            var sfb = 0;
            while (gfc.scalefac_band.l[sfb] < gi.big_values) {
              sfb++;
            }
            prev_noise.sfb_count1 = sfb;
          }
        }
        return bits;
      };
      this.count_bits = function(gfc, xr, gi, prev_noise) {
        var ix = gi.l3_enc;
        var w = QuantizePVT.IXMAX_VAL / qupvt.IPOW20(gi.global_gain);
        if (gi.xrpow_max > w)
          return QuantizePVT.LARGE_BITS;
        quantize_xrpow(xr, ix, qupvt.IPOW20(gi.global_gain), gi, prev_noise);
        if ((gfc.substep_shaping & 2) != 0) {
          var j = 0;
          var gain = gi.global_gain + gi.scalefac_scale;
          var roundfac = 0.634521682242439 / qupvt.IPOW20(gain);
          for (var sfb = 0; sfb < gi.sfbmax; sfb++) {
            var width = gi.width[sfb];
            if (0 == gfc.pseudohalf[sfb]) {
              j += width;
            } else {
              var k2;
              for (k2 = j, j += width; k2 < j; ++k2) {
                ix[k2] = xr[k2] >= roundfac ? ix[k2] : 0;
              }
            }
          }
        }
        return this.noquant_count_bits(gfc, gi, prev_noise);
      };
      function recalc_divide_init(gfc, cod_info, ix, r01_bits, r01_div, r0_tbl, r1_tbl) {
        var bigv = cod_info.big_values;
        for (var r0 = 0; r0 <= 7 + 15; r0++) {
          r01_bits[r0] = QuantizePVT.LARGE_BITS;
        }
        for (var r0 = 0; r0 < 16; r0++) {
          var a1 = gfc.scalefac_band.l[r0 + 1];
          if (a1 >= bigv)
            break;
          var r0bits = 0;
          var bi = new Bits(r0bits);
          var r0t = choose_table(ix, 0, a1, bi);
          r0bits = bi.bits;
          for (var r1 = 0; r1 < 8; r1++) {
            var a2 = gfc.scalefac_band.l[r0 + r1 + 2];
            if (a2 >= bigv)
              break;
            var bits = r0bits;
            bi = new Bits(bits);
            var r1t = choose_table(ix, a1, a2, bi);
            bits = bi.bits;
            if (r01_bits[r0 + r1] > bits) {
              r01_bits[r0 + r1] = bits;
              r01_div[r0 + r1] = r0;
              r0_tbl[r0 + r1] = r0t;
              r1_tbl[r0 + r1] = r1t;
            }
          }
        }
      }
      function recalc_divide_sub(gfc, cod_info2, gi, ix, r01_bits, r01_div, r0_tbl, r1_tbl) {
        var bigv = cod_info2.big_values;
        for (var r2 = 2; r2 < Encoder2.SBMAX_l + 1; r2++) {
          var a2 = gfc.scalefac_band.l[r2];
          if (a2 >= bigv)
            break;
          var bits = r01_bits[r2 - 2] + cod_info2.count1bits;
          if (gi.part2_3_length <= bits)
            break;
          var bi = new Bits(bits);
          var r2t = choose_table(ix, a2, bigv, bi);
          bits = bi.bits;
          if (gi.part2_3_length <= bits)
            continue;
          gi.assign(cod_info2);
          gi.part2_3_length = bits;
          gi.region0_count = r01_div[r2 - 2];
          gi.region1_count = r2 - 2 - r01_div[r2 - 2];
          gi.table_select[0] = r0_tbl[r2 - 2];
          gi.table_select[1] = r1_tbl[r2 - 2];
          gi.table_select[2] = r2t;
        }
      }
      this.best_huffman_divide = function(gfc, gi) {
        var cod_info2 = new GrInfo2();
        var ix = gi.l3_enc;
        var r01_bits = new_int2(7 + 15 + 1);
        var r01_div = new_int2(7 + 15 + 1);
        var r0_tbl = new_int2(7 + 15 + 1);
        var r1_tbl = new_int2(7 + 15 + 1);
        if (gi.block_type == Encoder2.SHORT_TYPE && gfc.mode_gr == 1)
          return;
        cod_info2.assign(gi);
        if (gi.block_type == Encoder2.NORM_TYPE) {
          recalc_divide_init(gfc, gi, ix, r01_bits, r01_div, r0_tbl, r1_tbl);
          recalc_divide_sub(
            gfc,
            cod_info2,
            gi,
            ix,
            r01_bits,
            r01_div,
            r0_tbl,
            r1_tbl
          );
        }
        var i = cod_info2.big_values;
        if (i == 0 || (ix[i - 2] | ix[i - 1]) > 1)
          return;
        i = gi.count1 + 2;
        if (i > 576)
          return;
        cod_info2.assign(gi);
        cod_info2.count1 = i;
        var a1 = 0;
        var a2 = 0;
        for (; i > cod_info2.big_values; i -= 4) {
          var p2 = ((ix[i - 4] * 2 + ix[i - 3]) * 2 + ix[i - 2]) * 2 + ix[i - 1];
          a1 += Tables2.t32l[p2];
          a2 += Tables2.t33l[p2];
        }
        cod_info2.big_values = i;
        cod_info2.count1table_select = 0;
        if (a1 > a2) {
          a1 = a2;
          cod_info2.count1table_select = 1;
        }
        cod_info2.count1bits = a1;
        if (cod_info2.block_type == Encoder2.NORM_TYPE)
          recalc_divide_sub(
            gfc,
            cod_info2,
            gi,
            ix,
            r01_bits,
            r01_div,
            r0_tbl,
            r1_tbl
          );
        else {
          cod_info2.part2_3_length = a1;
          a1 = gfc.scalefac_band.l[7 + 1];
          if (a1 > i) {
            a1 = i;
          }
          if (a1 > 0) {
            var bi = new Bits(cod_info2.part2_3_length);
            cod_info2.table_select[0] = choose_table(ix, 0, a1, bi);
            cod_info2.part2_3_length = bi.bits;
          }
          if (i > a1) {
            var bi = new Bits(cod_info2.part2_3_length);
            cod_info2.table_select[1] = choose_table(ix, a1, i, bi);
            cod_info2.part2_3_length = bi.bits;
          }
          if (gi.part2_3_length > cod_info2.part2_3_length)
            gi.assign(cod_info2);
        }
      };
      var slen1_n = [1, 1, 1, 1, 8, 2, 2, 2, 4, 4, 4, 8, 8, 8, 16, 16];
      var slen2_n = [1, 2, 4, 8, 1, 2, 4, 8, 2, 4, 8, 2, 4, 8, 4, 8];
      var slen1_tab = [0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4];
      var slen2_tab = [0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3];
      Takehiro.slen1_tab = slen1_tab;
      Takehiro.slen2_tab = slen2_tab;
      function scfsi_calc(ch, l3_side) {
        var sfb;
        var gi = l3_side.tt[1][ch];
        var g0 = l3_side.tt[0][ch];
        for (var i = 0; i < Tables2.scfsi_band.length - 1; i++) {
          for (sfb = Tables2.scfsi_band[i]; sfb < Tables2.scfsi_band[i + 1]; sfb++) {
            if (g0.scalefac[sfb] != gi.scalefac[sfb] && gi.scalefac[sfb] >= 0)
              break;
          }
          if (sfb == Tables2.scfsi_band[i + 1]) {
            for (sfb = Tables2.scfsi_band[i]; sfb < Tables2.scfsi_band[i + 1]; sfb++) {
              gi.scalefac[sfb] = -1;
            }
            l3_side.scfsi[ch][i] = 1;
          }
        }
        var s1 = 0;
        var c1 = 0;
        for (sfb = 0; sfb < 11; sfb++) {
          if (gi.scalefac[sfb] == -1)
            continue;
          c1++;
          if (s1 < gi.scalefac[sfb])
            s1 = gi.scalefac[sfb];
        }
        var s2 = 0;
        var c2 = 0;
        for (; sfb < Encoder2.SBPSY_l; sfb++) {
          if (gi.scalefac[sfb] == -1)
            continue;
          c2++;
          if (s2 < gi.scalefac[sfb])
            s2 = gi.scalefac[sfb];
        }
        for (var i = 0; i < 16; i++) {
          if (s1 < slen1_n[i] && s2 < slen2_n[i]) {
            var c = slen1_tab[i] * c1 + slen2_tab[i] * c2;
            if (gi.part2_length > c) {
              gi.part2_length = c;
              gi.scalefac_compress = i;
            }
          }
        }
      }
      this.best_scalefac_store = function(gfc, gr, ch, l3_side) {
        var gi = l3_side.tt[gr][ch];
        var sfb, i, j, l2;
        var recalc = 0;
        j = 0;
        for (sfb = 0; sfb < gi.sfbmax; sfb++) {
          var width = gi.width[sfb];
          j += width;
          for (l2 = -width; l2 < 0; l2++) {
            if (gi.l3_enc[l2 + j] != 0)
              break;
          }
          if (l2 == 0)
            gi.scalefac[sfb] = recalc = -2;
        }
        if (0 == gi.scalefac_scale && 0 == gi.preflag) {
          var s = 0;
          for (sfb = 0; sfb < gi.sfbmax; sfb++)
            if (gi.scalefac[sfb] > 0)
              s |= gi.scalefac[sfb];
          if (0 == (s & 1) && s != 0) {
            for (sfb = 0; sfb < gi.sfbmax; sfb++)
              if (gi.scalefac[sfb] > 0)
                gi.scalefac[sfb] >>= 1;
            gi.scalefac_scale = recalc = 1;
          }
        }
        if (0 == gi.preflag && gi.block_type != Encoder2.SHORT_TYPE && gfc.mode_gr == 2) {
          for (sfb = 11; sfb < Encoder2.SBPSY_l; sfb++)
            if (gi.scalefac[sfb] < qupvt.pretab[sfb] && gi.scalefac[sfb] != -2)
              break;
          if (sfb == Encoder2.SBPSY_l) {
            for (sfb = 11; sfb < Encoder2.SBPSY_l; sfb++)
              if (gi.scalefac[sfb] > 0)
                gi.scalefac[sfb] -= qupvt.pretab[sfb];
            gi.preflag = recalc = 1;
          }
        }
        for (i = 0; i < 4; i++)
          l3_side.scfsi[ch][i] = 0;
        if (gfc.mode_gr == 2 && gr == 1 && l3_side.tt[0][ch].block_type != Encoder2.SHORT_TYPE && l3_side.tt[1][ch].block_type != Encoder2.SHORT_TYPE) {
          scfsi_calc(ch, l3_side);
          recalc = 0;
        }
        for (sfb = 0; sfb < gi.sfbmax; sfb++) {
          if (gi.scalefac[sfb] == -2) {
            gi.scalefac[sfb] = 0;
          }
        }
        if (recalc != 0) {
          if (gfc.mode_gr == 2) {
            this.scale_bitcount(gi);
          } else {
            this.scale_bitcount_lsf(gfc, gi);
          }
        }
      };
      function all_scalefactors_not_negative(scalefac, n2) {
        for (var i = 0; i < n2; ++i) {
          if (scalefac[i] < 0)
            return false;
        }
        return true;
      }
      var scale_short = [
        0,
        18,
        36,
        54,
        54,
        36,
        54,
        72,
        54,
        72,
        90,
        72,
        90,
        108,
        108,
        126
      ];
      var scale_mixed = [
        0,
        18,
        36,
        54,
        51,
        35,
        53,
        71,
        52,
        70,
        88,
        69,
        87,
        105,
        104,
        122
      ];
      var scale_long = [
        0,
        10,
        20,
        30,
        33,
        21,
        31,
        41,
        32,
        42,
        52,
        43,
        53,
        63,
        64,
        74
      ];
      this.scale_bitcount = function(cod_info) {
        var k2, sfb, max_slen1 = 0, max_slen2 = 0;
        var tab;
        var scalefac = cod_info.scalefac;
        assert2(all_scalefactors_not_negative(scalefac, cod_info.sfbmax));
        if (cod_info.block_type == Encoder2.SHORT_TYPE) {
          tab = scale_short;
          if (cod_info.mixed_block_flag != 0)
            tab = scale_mixed;
        } else {
          tab = scale_long;
          if (0 == cod_info.preflag) {
            for (sfb = 11; sfb < Encoder2.SBPSY_l; sfb++)
              if (scalefac[sfb] < qupvt.pretab[sfb])
                break;
            if (sfb == Encoder2.SBPSY_l) {
              cod_info.preflag = 1;
              for (sfb = 11; sfb < Encoder2.SBPSY_l; sfb++)
                scalefac[sfb] -= qupvt.pretab[sfb];
            }
          }
        }
        for (sfb = 0; sfb < cod_info.sfbdivide; sfb++)
          if (max_slen1 < scalefac[sfb])
            max_slen1 = scalefac[sfb];
        for (; sfb < cod_info.sfbmax; sfb++)
          if (max_slen2 < scalefac[sfb])
            max_slen2 = scalefac[sfb];
        cod_info.part2_length = QuantizePVT.LARGE_BITS;
        for (k2 = 0; k2 < 16; k2++) {
          if (max_slen1 < slen1_n[k2] && max_slen2 < slen2_n[k2] && cod_info.part2_length > tab[k2]) {
            cod_info.part2_length = tab[k2];
            cod_info.scalefac_compress = k2;
          }
        }
        return cod_info.part2_length == QuantizePVT.LARGE_BITS;
      };
      var max_range_sfac_tab = [
        [15, 15, 7, 7],
        [15, 15, 7, 0],
        [7, 3, 0, 0],
        [15, 31, 31, 0],
        [7, 7, 7, 0],
        [3, 3, 0, 0]
      ];
      this.scale_bitcount_lsf = function(gfc, cod_info) {
        var table_number, row_in_table, partition, nr_sfb, window2;
        var over;
        var i, sfb;
        var max_sfac = new_int2(4);
        var scalefac = cod_info.scalefac;
        if (cod_info.preflag != 0)
          table_number = 2;
        else
          table_number = 0;
        for (i = 0; i < 4; i++)
          max_sfac[i] = 0;
        if (cod_info.block_type == Encoder2.SHORT_TYPE) {
          row_in_table = 1;
          var partition_table = qupvt.nr_of_sfb_block[table_number][row_in_table];
          for (sfb = 0, partition = 0; partition < 4; partition++) {
            nr_sfb = partition_table[partition] / 3;
            for (i = 0; i < nr_sfb; i++, sfb++)
              for (window2 = 0; window2 < 3; window2++)
                if (scalefac[sfb * 3 + window2] > max_sfac[partition])
                  max_sfac[partition] = scalefac[sfb * 3 + window2];
          }
        } else {
          row_in_table = 0;
          var partition_table = qupvt.nr_of_sfb_block[table_number][row_in_table];
          for (sfb = 0, partition = 0; partition < 4; partition++) {
            nr_sfb = partition_table[partition];
            for (i = 0; i < nr_sfb; i++, sfb++)
              if (scalefac[sfb] > max_sfac[partition])
                max_sfac[partition] = scalefac[sfb];
          }
        }
        for (over = false, partition = 0; partition < 4; partition++) {
          if (max_sfac[partition] > max_range_sfac_tab[table_number][partition])
            over = true;
        }
        if (!over) {
          var slen1, slen2, slen3, slen4;
          cod_info.sfb_partition_table = qupvt.nr_of_sfb_block[table_number][row_in_table];
          for (partition = 0; partition < 4; partition++)
            cod_info.slen[partition] = log2tab[max_sfac[partition]];
          slen1 = cod_info.slen[0];
          slen2 = cod_info.slen[1];
          slen3 = cod_info.slen[2];
          slen4 = cod_info.slen[3];
          switch (table_number) {
            case 0:
              cod_info.scalefac_compress = (slen1 * 5 + slen2 << 4) + (slen3 << 2) + slen4;
              break;
            case 1:
              cod_info.scalefac_compress = 400 + (slen1 * 5 + slen2 << 2) + slen3;
              break;
            case 2:
              cod_info.scalefac_compress = 500 + slen1 * 3 + slen2;
              break;
            default:
              System2.err.printf("intensity stereo not implemented yet\n");
              break;
          }
        }
        if (!over) {
          assert2(cod_info.sfb_partition_table != null);
          cod_info.part2_length = 0;
          for (partition = 0; partition < 4; partition++)
            cod_info.part2_length += cod_info.slen[partition] * cod_info.sfb_partition_table[partition];
        }
        return over;
      };
      var log2tab = [
        0,
        1,
        2,
        2,
        3,
        3,
        3,
        3,
        4,
        4,
        4,
        4,
        4,
        4,
        4,
        4
      ];
      this.huffman_init = function(gfc) {
        for (var i = 2; i <= 576; i += 2) {
          var scfb_anz = 0, bv_index;
          while (gfc.scalefac_band.l[++scfb_anz] < i)
            ;
          bv_index = subdv_table[scfb_anz][0];
          while (gfc.scalefac_band.l[bv_index + 1] > i)
            bv_index--;
          if (bv_index < 0) {
            bv_index = subdv_table[scfb_anz][0];
          }
          gfc.bv_scf[i - 2] = bv_index;
          bv_index = subdv_table[scfb_anz][1];
          while (gfc.scalefac_band.l[bv_index + gfc.bv_scf[i - 2] + 2] > i)
            bv_index--;
          if (bv_index < 0) {
            bv_index = subdv_table[scfb_anz][1];
          }
          gfc.bv_scf[i - 1] = bv_index;
        }
      };
    }
    Takehiro_1 = Takehiro;
    return Takehiro_1;
  }
  var BitStream_1;
  var hasRequiredBitStream;
  function requireBitStream() {
    if (hasRequiredBitStream) return BitStream_1;
    hasRequiredBitStream = 1;
    var common2 = common$h;
    var System2 = common2.System;
    var Arrays2 = common2.Arrays;
    var new_byte2 = common2.new_byte;
    var new_float_n2 = common2.new_float_n;
    var new_int2 = common2.new_int;
    var assert2 = common2.assert;
    var Takehiro = requireTakehiro();
    var Tables2 = Tables_1;
    var Encoder2 = requireEncoder();
    var LameInternalFlags2 = LameInternalFlags_1;
    var Lame2 = requireLame();
    BitStream.EQ = function(a, b) {
      return Math.abs(a) > Math.abs(b) ? Math.abs(a - b) <= Math.abs(a) * 1e-6 : Math.abs(a - b) <= Math.abs(b) * 1e-6;
    };
    BitStream.NEQ = function(a, b) {
      return !BitStream.EQ(a, b);
    };
    function BitStream() {
      var self2 = this;
      var CRC16_POLYNOMIAL = 32773;
      var ga = null;
      var mpg = null;
      var ver = null;
      var vbr = null;
      this.setModules = function(_ga, _mpg, _ver, _vbr) {
        ga = _ga;
        mpg = _mpg;
        ver = _ver;
        vbr = _vbr;
      };
      var buf = null;
      var totbit = 0;
      var bufByteIdx = 0;
      var bufBitIdx = 0;
      this.getframebits = function(gfp) {
        var gfc = gfp.internal_flags;
        var bit_rate;
        if (gfc.bitrate_index != 0)
          bit_rate = Tables2.bitrate_table[gfp.version][gfc.bitrate_index];
        else
          bit_rate = gfp.brate;
        var bytes = 0 | (gfp.version + 1) * 72e3 * bit_rate / gfp.out_samplerate + gfc.padding;
        return 8 * bytes;
      };
      function putheader_bits(gfc) {
        System2.arraycopy(gfc.header[gfc.w_ptr].buf, 0, buf, bufByteIdx, gfc.sideinfo_len);
        bufByteIdx += gfc.sideinfo_len;
        totbit += gfc.sideinfo_len * 8;
        gfc.w_ptr = gfc.w_ptr + 1 & LameInternalFlags2.MAX_HEADER_BUF - 1;
      }
      function putbits2(gfc, val, j) {
        while (j > 0) {
          var k2;
          if (bufBitIdx == 0) {
            bufBitIdx = 8;
            bufByteIdx++;
            assert2(bufByteIdx < Lame2.LAME_MAXMP3BUFFER);
            assert2(gfc.header[gfc.w_ptr].write_timing >= totbit);
            if (gfc.header[gfc.w_ptr].write_timing == totbit) {
              putheader_bits(gfc);
            }
            buf[bufByteIdx] = 0;
          }
          k2 = Math.min(j, bufBitIdx);
          j -= k2;
          bufBitIdx -= k2;
          buf[bufByteIdx] |= val >> j << bufBitIdx;
          totbit += k2;
        }
      }
      function putbits_noheaders(gfc, val, j) {
        while (j > 0) {
          var k2;
          if (bufBitIdx == 0) {
            bufBitIdx = 8;
            bufByteIdx++;
            assert2(bufByteIdx < Lame2.LAME_MAXMP3BUFFER);
            buf[bufByteIdx] = 0;
          }
          k2 = Math.min(j, bufBitIdx);
          j -= k2;
          bufBitIdx -= k2;
          buf[bufByteIdx] |= val >> j << bufBitIdx;
          totbit += k2;
        }
      }
      function drain_into_ancillary(gfp, remainingBits) {
        var gfc = gfp.internal_flags;
        var i;
        if (remainingBits >= 8) {
          putbits2(gfc, 76, 8);
          remainingBits -= 8;
        }
        if (remainingBits >= 8) {
          putbits2(gfc, 65, 8);
          remainingBits -= 8;
        }
        if (remainingBits >= 8) {
          putbits2(gfc, 77, 8);
          remainingBits -= 8;
        }
        if (remainingBits >= 8) {
          putbits2(gfc, 69, 8);
          remainingBits -= 8;
        }
        if (remainingBits >= 32) {
          var version = ver.getLameShortVersion();
          if (remainingBits >= 32)
            for (i = 0; i < version.length && remainingBits >= 8; ++i) {
              remainingBits -= 8;
              putbits2(gfc, version.charAt(i), 8);
            }
        }
        for (; remainingBits >= 1; remainingBits -= 1) {
          putbits2(gfc, gfc.ancillary_flag, 1);
          gfc.ancillary_flag ^= !gfp.disable_reservoir ? 1 : 0;
        }
      }
      function writeheader(gfc, val, j) {
        var ptr = gfc.header[gfc.h_ptr].ptr;
        while (j > 0) {
          var k2 = Math.min(j, 8 - (ptr & 7));
          j -= k2;
          gfc.header[gfc.h_ptr].buf[ptr >> 3] |= val >> j << 8 - (ptr & 7) - k2;
          ptr += k2;
        }
        gfc.header[gfc.h_ptr].ptr = ptr;
      }
      function CRC_update(value, crc) {
        value <<= 8;
        for (var i = 0; i < 8; i++) {
          value <<= 1;
          crc <<= 1;
          if (((crc ^ value) & 65536) != 0)
            crc ^= CRC16_POLYNOMIAL;
        }
        return crc;
      }
      this.CRC_writeheader = function(gfc, header) {
        var crc = 65535;
        crc = CRC_update(header[2] & 255, crc);
        crc = CRC_update(header[3] & 255, crc);
        for (var i = 6; i < gfc.sideinfo_len; i++) {
          crc = CRC_update(header[i] & 255, crc);
        }
        header[4] = byte(crc >> 8);
        header[5] = byte(crc & 255);
      };
      function encodeSideInfo2(gfp, bitsPerFrame) {
        var gfc = gfp.internal_flags;
        var l3_side;
        var gr, ch;
        l3_side = gfc.l3_side;
        gfc.header[gfc.h_ptr].ptr = 0;
        Arrays2.fill(gfc.header[gfc.h_ptr].buf, 0, gfc.sideinfo_len, 0);
        if (gfp.out_samplerate < 16e3)
          writeheader(gfc, 4094, 12);
        else
          writeheader(gfc, 4095, 12);
        writeheader(gfc, gfp.version, 1);
        writeheader(gfc, 4 - 3, 2);
        writeheader(gfc, !gfp.error_protection ? 1 : 0, 1);
        writeheader(gfc, gfc.bitrate_index, 4);
        writeheader(gfc, gfc.samplerate_index, 2);
        writeheader(gfc, gfc.padding, 1);
        writeheader(gfc, gfp.extension, 1);
        writeheader(gfc, gfp.mode.ordinal(), 2);
        writeheader(gfc, gfc.mode_ext, 2);
        writeheader(gfc, gfp.copyright, 1);
        writeheader(gfc, gfp.original, 1);
        writeheader(gfc, gfp.emphasis, 2);
        if (gfp.error_protection) {
          writeheader(gfc, 0, 16);
        }
        if (gfp.version == 1) {
          assert2(l3_side.main_data_begin >= 0);
          writeheader(gfc, l3_side.main_data_begin, 9);
          if (gfc.channels_out == 2)
            writeheader(gfc, l3_side.private_bits, 3);
          else
            writeheader(gfc, l3_side.private_bits, 5);
          for (ch = 0; ch < gfc.channels_out; ch++) {
            var band;
            for (band = 0; band < 4; band++) {
              writeheader(gfc, l3_side.scfsi[ch][band], 1);
            }
          }
          for (gr = 0; gr < 2; gr++) {
            for (ch = 0; ch < gfc.channels_out; ch++) {
              var gi = l3_side.tt[gr][ch];
              writeheader(gfc, gi.part2_3_length + gi.part2_length, 12);
              writeheader(gfc, gi.big_values / 2, 9);
              writeheader(gfc, gi.global_gain, 8);
              writeheader(gfc, gi.scalefac_compress, 4);
              if (gi.block_type != Encoder2.NORM_TYPE) {
                writeheader(gfc, 1, 1);
                writeheader(gfc, gi.block_type, 2);
                writeheader(gfc, gi.mixed_block_flag, 1);
                if (gi.table_select[0] == 14)
                  gi.table_select[0] = 16;
                writeheader(gfc, gi.table_select[0], 5);
                if (gi.table_select[1] == 14)
                  gi.table_select[1] = 16;
                writeheader(gfc, gi.table_select[1], 5);
                writeheader(gfc, gi.subblock_gain[0], 3);
                writeheader(gfc, gi.subblock_gain[1], 3);
                writeheader(gfc, gi.subblock_gain[2], 3);
              } else {
                writeheader(gfc, 0, 1);
                if (gi.table_select[0] == 14)
                  gi.table_select[0] = 16;
                writeheader(gfc, gi.table_select[0], 5);
                if (gi.table_select[1] == 14)
                  gi.table_select[1] = 16;
                writeheader(gfc, gi.table_select[1], 5);
                if (gi.table_select[2] == 14)
                  gi.table_select[2] = 16;
                writeheader(gfc, gi.table_select[2], 5);
                assert2(0 <= gi.region0_count && gi.region0_count < 16);
                assert2(0 <= gi.region1_count && gi.region1_count < 8);
                writeheader(gfc, gi.region0_count, 4);
                writeheader(gfc, gi.region1_count, 3);
              }
              writeheader(gfc, gi.preflag, 1);
              writeheader(gfc, gi.scalefac_scale, 1);
              writeheader(gfc, gi.count1table_select, 1);
            }
          }
        } else {
          assert2(l3_side.main_data_begin >= 0);
          writeheader(gfc, l3_side.main_data_begin, 8);
          writeheader(gfc, l3_side.private_bits, gfc.channels_out);
          gr = 0;
          for (ch = 0; ch < gfc.channels_out; ch++) {
            var gi = l3_side.tt[gr][ch];
            writeheader(gfc, gi.part2_3_length + gi.part2_length, 12);
            writeheader(gfc, gi.big_values / 2, 9);
            writeheader(gfc, gi.global_gain, 8);
            writeheader(gfc, gi.scalefac_compress, 9);
            if (gi.block_type != Encoder2.NORM_TYPE) {
              writeheader(gfc, 1, 1);
              writeheader(gfc, gi.block_type, 2);
              writeheader(gfc, gi.mixed_block_flag, 1);
              if (gi.table_select[0] == 14)
                gi.table_select[0] = 16;
              writeheader(gfc, gi.table_select[0], 5);
              if (gi.table_select[1] == 14)
                gi.table_select[1] = 16;
              writeheader(gfc, gi.table_select[1], 5);
              writeheader(gfc, gi.subblock_gain[0], 3);
              writeheader(gfc, gi.subblock_gain[1], 3);
              writeheader(gfc, gi.subblock_gain[2], 3);
            } else {
              writeheader(gfc, 0, 1);
              if (gi.table_select[0] == 14)
                gi.table_select[0] = 16;
              writeheader(gfc, gi.table_select[0], 5);
              if (gi.table_select[1] == 14)
                gi.table_select[1] = 16;
              writeheader(gfc, gi.table_select[1], 5);
              if (gi.table_select[2] == 14)
                gi.table_select[2] = 16;
              writeheader(gfc, gi.table_select[2], 5);
              assert2(0 <= gi.region0_count && gi.region0_count < 16);
              assert2(0 <= gi.region1_count && gi.region1_count < 8);
              writeheader(gfc, gi.region0_count, 4);
              writeheader(gfc, gi.region1_count, 3);
            }
            writeheader(gfc, gi.scalefac_scale, 1);
            writeheader(gfc, gi.count1table_select, 1);
          }
        }
        if (gfp.error_protection) {
          CRC_writeheader(gfc, gfc.header[gfc.h_ptr].buf);
        }
        {
          var old = gfc.h_ptr;
          assert2(gfc.header[old].ptr == gfc.sideinfo_len * 8);
          gfc.h_ptr = old + 1 & LameInternalFlags2.MAX_HEADER_BUF - 1;
          gfc.header[gfc.h_ptr].write_timing = gfc.header[old].write_timing + bitsPerFrame;
          if (gfc.h_ptr == gfc.w_ptr) {
            System2.err.println("Error: MAX_HEADER_BUF too small in bitstream.c \n");
          }
        }
      }
      function huffman_coder_count1(gfc, gi) {
        var h = Tables2.ht[gi.count1table_select + 32];
        var i, bits = 0;
        var ix = gi.big_values;
        var xr = gi.big_values;
        assert2(gi.count1table_select < 2);
        for (i = (gi.count1 - gi.big_values) / 4; i > 0; --i) {
          var huffbits = 0;
          var p2 = 0, v;
          v = gi.l3_enc[ix + 0];
          if (v != 0) {
            p2 += 8;
            if (gi.xr[xr + 0] < 0)
              huffbits++;
          }
          v = gi.l3_enc[ix + 1];
          if (v != 0) {
            p2 += 4;
            huffbits *= 2;
            if (gi.xr[xr + 1] < 0)
              huffbits++;
          }
          v = gi.l3_enc[ix + 2];
          if (v != 0) {
            p2 += 2;
            huffbits *= 2;
            if (gi.xr[xr + 2] < 0)
              huffbits++;
          }
          v = gi.l3_enc[ix + 3];
          if (v != 0) {
            p2++;
            huffbits *= 2;
            if (gi.xr[xr + 3] < 0)
              huffbits++;
          }
          ix += 4;
          xr += 4;
          putbits2(gfc, huffbits + h.table[p2], h.hlen[p2]);
          bits += h.hlen[p2];
        }
        return bits;
      }
      function Huffmancode(gfc, tableindex, start, end, gi) {
        var h = Tables2.ht[tableindex];
        var bits = 0;
        if (0 == tableindex)
          return bits;
        for (var i = start; i < end; i += 2) {
          var cbits = 0;
          var xbits = 0;
          var linbits = h.xlen;
          var xlen = h.xlen;
          var ext = 0;
          var x1 = gi.l3_enc[i];
          var x2 = gi.l3_enc[i + 1];
          if (x1 != 0) {
            if (gi.xr[i] < 0)
              ext++;
            cbits--;
          }
          if (tableindex > 15) {
            if (x1 > 14) {
              var linbits_x1 = x1 - 15;
              assert2(linbits_x1 <= h.linmax);
              ext |= linbits_x1 << 1;
              xbits = linbits;
              x1 = 15;
            }
            if (x2 > 14) {
              var linbits_x2 = x2 - 15;
              assert2(linbits_x2 <= h.linmax);
              ext <<= linbits;
              ext |= linbits_x2;
              xbits += linbits;
              x2 = 15;
            }
            xlen = 16;
          }
          if (x2 != 0) {
            ext <<= 1;
            if (gi.xr[i + 1] < 0)
              ext++;
            cbits--;
          }
          x1 = x1 * xlen + x2;
          xbits -= cbits;
          cbits += h.hlen[x1];
          putbits2(gfc, h.table[x1], cbits);
          putbits2(gfc, ext, xbits);
          bits += cbits + xbits;
        }
        return bits;
      }
      function ShortHuffmancodebits(gfc, gi) {
        var region1Start = 3 * gfc.scalefac_band.s[3];
        if (region1Start > gi.big_values)
          region1Start = gi.big_values;
        var bits = Huffmancode(gfc, gi.table_select[0], 0, region1Start, gi);
        bits += Huffmancode(
          gfc,
          gi.table_select[1],
          region1Start,
          gi.big_values,
          gi
        );
        return bits;
      }
      function LongHuffmancodebits(gfc, gi) {
        var bigvalues, bits;
        var region1Start, region2Start;
        bigvalues = gi.big_values;
        var i = gi.region0_count + 1;
        assert2(i < gfc.scalefac_band.l.length);
        region1Start = gfc.scalefac_band.l[i];
        i += gi.region1_count + 1;
        assert2(i < gfc.scalefac_band.l.length);
        region2Start = gfc.scalefac_band.l[i];
        if (region1Start > bigvalues)
          region1Start = bigvalues;
        if (region2Start > bigvalues)
          region2Start = bigvalues;
        bits = Huffmancode(gfc, gi.table_select[0], 0, region1Start, gi);
        bits += Huffmancode(
          gfc,
          gi.table_select[1],
          region1Start,
          region2Start,
          gi
        );
        bits += Huffmancode(
          gfc,
          gi.table_select[2],
          region2Start,
          bigvalues,
          gi
        );
        return bits;
      }
      function writeMainData(gfp) {
        var gr, ch, sfb, data_bits, tot_bits = 0;
        var gfc = gfp.internal_flags;
        var l3_side = gfc.l3_side;
        if (gfp.version == 1) {
          for (gr = 0; gr < 2; gr++) {
            for (ch = 0; ch < gfc.channels_out; ch++) {
              var gi = l3_side.tt[gr][ch];
              var slen1 = Takehiro.slen1_tab[gi.scalefac_compress];
              var slen2 = Takehiro.slen2_tab[gi.scalefac_compress];
              data_bits = 0;
              for (sfb = 0; sfb < gi.sfbdivide; sfb++) {
                if (gi.scalefac[sfb] == -1)
                  continue;
                putbits2(gfc, gi.scalefac[sfb], slen1);
                data_bits += slen1;
              }
              for (; sfb < gi.sfbmax; sfb++) {
                if (gi.scalefac[sfb] == -1)
                  continue;
                putbits2(gfc, gi.scalefac[sfb], slen2);
                data_bits += slen2;
              }
              assert2(data_bits == gi.part2_length);
              if (gi.block_type == Encoder2.SHORT_TYPE) {
                data_bits += ShortHuffmancodebits(gfc, gi);
              } else {
                data_bits += LongHuffmancodebits(gfc, gi);
              }
              data_bits += huffman_coder_count1(gfc, gi);
              assert2(data_bits == gi.part2_3_length + gi.part2_length);
              tot_bits += data_bits;
            }
          }
        } else {
          gr = 0;
          for (ch = 0; ch < gfc.channels_out; ch++) {
            var gi = l3_side.tt[gr][ch];
            var i, sfb_partition, scale_bits = 0;
            assert2(gi.sfb_partition_table != null);
            data_bits = 0;
            sfb = 0;
            sfb_partition = 0;
            if (gi.block_type == Encoder2.SHORT_TYPE) {
              for (; sfb_partition < 4; sfb_partition++) {
                var sfbs = gi.sfb_partition_table[sfb_partition] / 3;
                var slen = gi.slen[sfb_partition];
                for (i = 0; i < sfbs; i++, sfb++) {
                  putbits2(
                    gfc,
                    Math.max(gi.scalefac[sfb * 3 + 0], 0),
                    slen
                  );
                  putbits2(
                    gfc,
                    Math.max(gi.scalefac[sfb * 3 + 1], 0),
                    slen
                  );
                  putbits2(
                    gfc,
                    Math.max(gi.scalefac[sfb * 3 + 2], 0),
                    slen
                  );
                  scale_bits += 3 * slen;
                }
              }
              data_bits += ShortHuffmancodebits(gfc, gi);
            } else {
              for (; sfb_partition < 4; sfb_partition++) {
                var sfbs = gi.sfb_partition_table[sfb_partition];
                var slen = gi.slen[sfb_partition];
                for (i = 0; i < sfbs; i++, sfb++) {
                  putbits2(gfc, Math.max(gi.scalefac[sfb], 0), slen);
                  scale_bits += slen;
                }
              }
              data_bits += LongHuffmancodebits(gfc, gi);
            }
            data_bits += huffman_coder_count1(gfc, gi);
            assert2(data_bits == gi.part2_3_length);
            assert2(scale_bits == gi.part2_length);
            tot_bits += scale_bits + data_bits;
          }
        }
        return tot_bits;
      }
      function TotalBytes() {
        this.total = 0;
      }
      function compute_flushbits(gfp, total_bytes_output) {
        var gfc = gfp.internal_flags;
        var flushbits, remaining_headers;
        var bitsPerFrame;
        var last_ptr, first_ptr;
        first_ptr = gfc.w_ptr;
        last_ptr = gfc.h_ptr - 1;
        if (last_ptr == -1)
          last_ptr = LameInternalFlags2.MAX_HEADER_BUF - 1;
        flushbits = gfc.header[last_ptr].write_timing - totbit;
        total_bytes_output.total = flushbits;
        if (flushbits >= 0) {
          remaining_headers = 1 + last_ptr - first_ptr;
          if (last_ptr < first_ptr)
            remaining_headers = 1 + last_ptr - first_ptr + LameInternalFlags2.MAX_HEADER_BUF;
          flushbits -= remaining_headers * 8 * gfc.sideinfo_len;
        }
        bitsPerFrame = self2.getframebits(gfp);
        flushbits += bitsPerFrame;
        total_bytes_output.total += bitsPerFrame;
        if (total_bytes_output.total % 8 != 0)
          total_bytes_output.total = 1 + total_bytes_output.total / 8;
        else
          total_bytes_output.total = total_bytes_output.total / 8;
        total_bytes_output.total += bufByteIdx + 1;
        if (flushbits < 0) {
          System2.err.println("strange error flushing buffer ... \n");
        }
        return flushbits;
      }
      this.flush_bitstream = function(gfp) {
        var gfc = gfp.internal_flags;
        var l3_side;
        var flushbits;
        var last_ptr = gfc.h_ptr - 1;
        if (last_ptr == -1)
          last_ptr = LameInternalFlags2.MAX_HEADER_BUF - 1;
        l3_side = gfc.l3_side;
        if ((flushbits = compute_flushbits(gfp, new TotalBytes())) < 0)
          return;
        drain_into_ancillary(gfp, flushbits);
        assert2(gfc.header[last_ptr].write_timing + this.getframebits(gfp) == totbit);
        gfc.ResvSize = 0;
        l3_side.main_data_begin = 0;
        if (gfc.findReplayGain) {
          var RadioGain = ga.GetTitleGain(gfc.rgdata);
          assert2(NEQ(RadioGain, GainAnalysis.GAIN_NOT_ENOUGH_SAMPLES));
          gfc.RadioGain = Math.floor(RadioGain * 10 + 0.5) | 0;
        }
        if (gfc.findPeakSample) {
          gfc.noclipGainChange = Math.ceil(Math.log10(gfc.PeakSample / 32767) * 20 * 10) | 0;
          if (gfc.noclipGainChange > 0) {
            if (EQ(gfp.scale, 1) || EQ(gfp.scale, 0))
              gfc.noclipScale = Math.floor(32767 / gfc.PeakSample * 100) / 100;
            else {
              gfc.noclipScale = -1;
            }
          } else
            gfc.noclipScale = -1;
        }
      };
      this.add_dummy_byte = function(gfp, val, n2) {
        var gfc = gfp.internal_flags;
        var i;
        while (n2-- > 0) {
          putbits_noheaders(gfc, val, 8);
          for (i = 0; i < LameInternalFlags2.MAX_HEADER_BUF; ++i)
            gfc.header[i].write_timing += 8;
        }
      };
      this.format_bitstream = function(gfp) {
        var gfc = gfp.internal_flags;
        var l3_side;
        l3_side = gfc.l3_side;
        var bitsPerFrame = this.getframebits(gfp);
        drain_into_ancillary(gfp, l3_side.resvDrain_pre);
        encodeSideInfo2(gfp, bitsPerFrame);
        var bits = 8 * gfc.sideinfo_len;
        bits += writeMainData(gfp);
        drain_into_ancillary(gfp, l3_side.resvDrain_post);
        bits += l3_side.resvDrain_post;
        l3_side.main_data_begin += (bitsPerFrame - bits) / 8;
        if (compute_flushbits(gfp, new TotalBytes()) != gfc.ResvSize) {
          System2.err.println("Internal buffer inconsistency. flushbits <> ResvSize");
        }
        if (l3_side.main_data_begin * 8 != gfc.ResvSize) {
          System2.err.printf(
            "bit reservoir error: \nl3_side.main_data_begin: %d \nResvoir size:             %d \nresv drain (post)         %d \nresv drain (pre)          %d \nheader and sideinfo:      %d \ndata bits:                %d \ntotal bits:               %d (remainder: %d) \nbitsperframe:             %d \n",
            8 * l3_side.main_data_begin,
            gfc.ResvSize,
            l3_side.resvDrain_post,
            l3_side.resvDrain_pre,
            8 * gfc.sideinfo_len,
            bits - l3_side.resvDrain_post - 8 * gfc.sideinfo_len,
            bits,
            bits % 8,
            bitsPerFrame
          );
          System2.err.println("This is a fatal error.  It has several possible causes:");
          System2.err.println("90%%  LAME compiled with buggy version of gcc using advanced optimizations");
          System2.err.println(" 9%%  Your system is overclocked");
          System2.err.println(" 1%%  bug in LAME encoding library");
          gfc.ResvSize = l3_side.main_data_begin * 8;
        }
        if (totbit > 1e9) {
          var i;
          for (i = 0; i < LameInternalFlags2.MAX_HEADER_BUF; ++i)
            gfc.header[i].write_timing -= totbit;
          totbit = 0;
        }
        return 0;
      };
      this.copy_buffer = function(gfc, buffer, bufferPos, size, mp3data) {
        var minimum = bufByteIdx + 1;
        if (minimum <= 0)
          return 0;
        if (size != 0 && minimum > size) {
          return -1;
        }
        System2.arraycopy(buf, 0, buffer, bufferPos, minimum);
        bufByteIdx = -1;
        bufBitIdx = 0;
        if (mp3data != 0) {
          var crc = new_int2(1);
          crc[0] = gfc.nMusicCRC;
          vbr.updateMusicCRC(crc, buffer, bufferPos, minimum);
          gfc.nMusicCRC = crc[0];
          if (minimum > 0) {
            gfc.VBR_seek_table.nBytesWritten += minimum;
          }
          if (gfc.decode_on_the_fly) {
            var pcm_buf = new_float_n2([2, 1152]);
            var mp3_in = minimum;
            var samples_out = -1;
            var i;
            while (samples_out != 0) {
              samples_out = mpg.hip_decode1_unclipped(
                gfc.hip,
                buffer,
                bufferPos,
                mp3_in,
                pcm_buf[0],
                pcm_buf[1]
              );
              mp3_in = 0;
              if (samples_out == -1) {
                samples_out = 0;
              }
              if (samples_out > 0) {
                if (gfc.findPeakSample) {
                  for (i = 0; i < samples_out; i++) {
                    if (pcm_buf[0][i] > gfc.PeakSample)
                      gfc.PeakSample = pcm_buf[0][i];
                    else if (-pcm_buf[0][i] > gfc.PeakSample)
                      gfc.PeakSample = -pcm_buf[0][i];
                  }
                  if (gfc.channels_out > 1)
                    for (i = 0; i < samples_out; i++) {
                      if (pcm_buf[1][i] > gfc.PeakSample)
                        gfc.PeakSample = pcm_buf[1][i];
                      else if (-pcm_buf[1][i] > gfc.PeakSample)
                        gfc.PeakSample = -pcm_buf[1][i];
                    }
                }
                if (gfc.findReplayGain) {
                  if (ga.AnalyzeSamples(
                    gfc.rgdata,
                    pcm_buf[0],
                    0,
                    pcm_buf[1],
                    0,
                    samples_out,
                    gfc.channels_out
                  ) == GainAnalysis.GAIN_ANALYSIS_ERROR)
                    return -6;
                }
              }
            }
          }
        }
        return minimum;
      };
      this.init_bit_stream_w = function(gfc) {
        buf = new_byte2(Lame2.LAME_MAXMP3BUFFER);
        gfc.h_ptr = gfc.w_ptr = 0;
        gfc.header[gfc.h_ptr].write_timing = 0;
        bufByteIdx = -1;
        bufBitIdx = 0;
        totbit = 0;
      };
    }
    BitStream_1 = BitStream;
    return BitStream_1;
  }
  var Lame_1;
  var hasRequiredLame;
  function requireLame() {
    if (hasRequiredLame) return Lame_1;
    hasRequiredLame = 1;
    var common2 = common$h;
    var System2 = common2.System;
    var VbrMode2 = common2.VbrMode;
    var ShortBlock2 = common2.ShortBlock;
    var new_float2 = common2.new_float;
    var new_int_n2 = common2.new_int_n;
    var new_short_n2 = common2.new_short_n;
    var assert2 = common2.assert;
    var PsyModel2 = PsyModel_1;
    var LameGlobalFlags2 = LameGlobalFlags_1;
    var LameInternalFlags2 = LameInternalFlags_1;
    var ATH2 = ATH_1;
    var ReplayGain2 = ReplayGain_1;
    var CBRNewIterationLoop2 = CBRNewIterationLoop_1;
    var BitStream = requireBitStream();
    var Tables2 = Tables_1;
    var Encoder2 = requireEncoder();
    var MPEGMode2 = MPEGMode_1;
    function Lame2() {
      var self2 = this;
      var LAME_MAXALBUMART = 128 * 1024;
      Lame2.V9 = 410;
      Lame2.V8 = 420;
      Lame2.V7 = 430;
      Lame2.V6 = 440;
      Lame2.V5 = 450;
      Lame2.V4 = 460;
      Lame2.V3 = 470;
      Lame2.V2 = 480;
      Lame2.V1 = 490;
      Lame2.V0 = 500;
      Lame2.R3MIX = 1e3;
      Lame2.STANDARD = 1001;
      Lame2.EXTREME = 1002;
      Lame2.INSANE = 1003;
      Lame2.STANDARD_FAST = 1004;
      Lame2.EXTREME_FAST = 1005;
      Lame2.MEDIUM = 1006;
      Lame2.MEDIUM_FAST = 1007;
      var LAME_MAXMP3BUFFER = 16384 + LAME_MAXALBUMART;
      Lame2.LAME_MAXMP3BUFFER = LAME_MAXMP3BUFFER;
      var ga;
      var bs;
      var p2;
      var qupvt;
      var qu;
      var psy = new PsyModel2();
      var vbr;
      var id3;
      var mpglib;
      this.enc = new Encoder2();
      this.setModules = function(_ga, _bs, _p, _qupvt, _qu, _vbr, _ver, _id3, _mpglib) {
        ga = _ga;
        bs = _bs;
        p2 = _p;
        qupvt = _qupvt;
        qu = _qu;
        vbr = _vbr;
        id3 = _id3;
        mpglib = _mpglib;
        this.enc.setModules(bs, psy, qupvt, vbr);
      };
      function PSY() {
        this.mask_adjust = 0;
        this.mask_adjust_short = 0;
        this.bo_l_weight = new_float2(Encoder2.SBMAX_l);
        this.bo_s_weight = new_float2(Encoder2.SBMAX_s);
      }
      function LowPassHighPass() {
        this.lowerlimit = 0;
      }
      function BandPass(bitrate, lPass) {
        this.lowpass = lPass;
      }
      var LAME_ID = 4294479419;
      function lame_init_old(gfp) {
        var gfc;
        gfp.class_id = LAME_ID;
        gfc = gfp.internal_flags = new LameInternalFlags2();
        gfp.mode = MPEGMode2.NOT_SET;
        gfp.original = 1;
        gfp.in_samplerate = 44100;
        gfp.num_channels = 2;
        gfp.num_samples = -1;
        gfp.bWriteVbrTag = true;
        gfp.quality = -1;
        gfp.short_blocks = null;
        gfc.subblock_gain = -1;
        gfp.lowpassfreq = 0;
        gfp.highpassfreq = 0;
        gfp.lowpasswidth = -1;
        gfp.highpasswidth = -1;
        gfp.VBR = VbrMode2.vbr_off;
        gfp.VBR_q = 4;
        gfp.ATHcurve = -1;
        gfp.VBR_mean_bitrate_kbps = 128;
        gfp.VBR_min_bitrate_kbps = 0;
        gfp.VBR_max_bitrate_kbps = 0;
        gfp.VBR_hard_min = 0;
        gfc.VBR_min_bitrate = 1;
        gfc.VBR_max_bitrate = 13;
        gfp.quant_comp = -1;
        gfp.quant_comp_short = -1;
        gfp.msfix = -1;
        gfc.resample_ratio = 1;
        gfc.OldValue[0] = 180;
        gfc.OldValue[1] = 180;
        gfc.CurrentStep[0] = 4;
        gfc.CurrentStep[1] = 4;
        gfc.masking_lower = 1;
        gfc.nsPsy.attackthre = -1;
        gfc.nsPsy.attackthre_s = -1;
        gfp.scale = -1;
        gfp.athaa_type = -1;
        gfp.ATHtype = -1;
        gfp.athaa_loudapprox = -1;
        gfp.athaa_sensitivity = 0;
        gfp.useTemporal = null;
        gfp.interChRatio = -1;
        gfc.mf_samples_to_encode = Encoder2.ENCDELAY + Encoder2.POSTDELAY;
        gfp.encoder_padding = 0;
        gfc.mf_size = Encoder2.ENCDELAY - Encoder2.MDCTDELAY;
        gfp.findReplayGain = false;
        gfp.decode_on_the_fly = false;
        gfc.decode_on_the_fly = false;
        gfc.findReplayGain = false;
        gfc.findPeakSample = false;
        gfc.RadioGain = 0;
        gfc.AudiophileGain = 0;
        gfc.noclipGainChange = 0;
        gfc.noclipScale = -1;
        gfp.preset = 0;
        gfp.write_id3tag_automatic = true;
        return 0;
      }
      this.lame_init = function() {
        var gfp = new LameGlobalFlags2();
        lame_init_old(gfp);
        gfp.lame_allocated_gfp = 1;
        return gfp;
      };
      function filter_coef(x) {
        if (x > 1)
          return 0;
        if (x <= 0)
          return 1;
        return Math.cos(Math.PI / 2 * x);
      }
      this.nearestBitrateFullIndex = function(bitrate) {
        var full_bitrate_table = [
          8,
          16,
          24,
          32,
          40,
          48,
          56,
          64,
          80,
          96,
          112,
          128,
          160,
          192,
          224,
          256,
          320
        ];
        var lower_range = 0, lower_range_kbps = 0, upper_range = 0, upper_range_kbps = 0;
        upper_range_kbps = full_bitrate_table[16];
        upper_range = 16;
        lower_range_kbps = full_bitrate_table[16];
        lower_range = 16;
        for (var b = 0; b < 16; b++) {
          if (Math.max(bitrate, full_bitrate_table[b + 1]) != bitrate) {
            upper_range_kbps = full_bitrate_table[b + 1];
            upper_range = b + 1;
            lower_range_kbps = full_bitrate_table[b];
            lower_range = b;
            break;
          }
        }
        if (upper_range_kbps - bitrate > bitrate - lower_range_kbps) {
          return lower_range;
        }
        return upper_range;
      };
      function optimum_samplefreq(lowpassfreq, input_samplefreq) {
        var suggested_samplefreq = 44100;
        if (input_samplefreq >= 48e3)
          suggested_samplefreq = 48e3;
        else if (input_samplefreq >= 44100)
          suggested_samplefreq = 44100;
        else if (input_samplefreq >= 32e3)
          suggested_samplefreq = 32e3;
        else if (input_samplefreq >= 24e3)
          suggested_samplefreq = 24e3;
        else if (input_samplefreq >= 22050)
          suggested_samplefreq = 22050;
        else if (input_samplefreq >= 16e3)
          suggested_samplefreq = 16e3;
        else if (input_samplefreq >= 12e3)
          suggested_samplefreq = 12e3;
        else if (input_samplefreq >= 11025)
          suggested_samplefreq = 11025;
        else if (input_samplefreq >= 8e3)
          suggested_samplefreq = 8e3;
        if (lowpassfreq == -1)
          return suggested_samplefreq;
        if (lowpassfreq <= 15960)
          suggested_samplefreq = 44100;
        if (lowpassfreq <= 15250)
          suggested_samplefreq = 32e3;
        if (lowpassfreq <= 11220)
          suggested_samplefreq = 24e3;
        if (lowpassfreq <= 9970)
          suggested_samplefreq = 22050;
        if (lowpassfreq <= 7230)
          suggested_samplefreq = 16e3;
        if (lowpassfreq <= 5420)
          suggested_samplefreq = 12e3;
        if (lowpassfreq <= 4510)
          suggested_samplefreq = 11025;
        if (lowpassfreq <= 3970)
          suggested_samplefreq = 8e3;
        if (input_samplefreq < suggested_samplefreq) {
          if (input_samplefreq > 44100) {
            return 48e3;
          }
          if (input_samplefreq > 32e3) {
            return 44100;
          }
          if (input_samplefreq > 24e3) {
            return 32e3;
          }
          if (input_samplefreq > 22050) {
            return 24e3;
          }
          if (input_samplefreq > 16e3) {
            return 22050;
          }
          if (input_samplefreq > 12e3) {
            return 16e3;
          }
          if (input_samplefreq > 11025) {
            return 12e3;
          }
          if (input_samplefreq > 8e3) {
            return 11025;
          }
          return 8e3;
        }
        return suggested_samplefreq;
      }
      function SmpFrqIndex(sample_freq, gpf) {
        switch (sample_freq) {
          case 44100:
            gpf.version = 1;
            return 0;
          case 48e3:
            gpf.version = 1;
            return 1;
          case 32e3:
            gpf.version = 1;
            return 2;
          case 22050:
            gpf.version = 0;
            return 0;
          case 24e3:
            gpf.version = 0;
            return 1;
          case 16e3:
            gpf.version = 0;
            return 2;
          case 11025:
            gpf.version = 0;
            return 0;
          case 12e3:
            gpf.version = 0;
            return 1;
          case 8e3:
            gpf.version = 0;
            return 2;
          default:
            gpf.version = 0;
            return -1;
        }
      }
      function FindNearestBitrate(bRate, version, samplerate) {
        if (samplerate < 16e3)
          version = 2;
        var bitrate = Tables2.bitrate_table[version][1];
        for (var i = 2; i <= 14; i++) {
          if (Tables2.bitrate_table[version][i] > 0) {
            if (Math.abs(Tables2.bitrate_table[version][i] - bRate) < Math.abs(bitrate - bRate))
              bitrate = Tables2.bitrate_table[version][i];
          }
        }
        return bitrate;
      }
      function BitrateIndex(bRate, version, samplerate) {
        if (samplerate < 16e3)
          version = 2;
        for (var i = 0; i <= 14; i++) {
          if (Tables2.bitrate_table[version][i] > 0) {
            if (Tables2.bitrate_table[version][i] == bRate) {
              return i;
            }
          }
        }
        return -1;
      }
      function optimum_bandwidth(lh, bitrate) {
        var freq_map = [
          new BandPass(8, 2e3),
          new BandPass(16, 3700),
          new BandPass(24, 3900),
          new BandPass(32, 5500),
          new BandPass(40, 7e3),
          new BandPass(48, 7500),
          new BandPass(56, 1e4),
          new BandPass(64, 11e3),
          new BandPass(80, 13500),
          new BandPass(96, 15100),
          new BandPass(112, 15600),
          new BandPass(128, 17e3),
          new BandPass(160, 17500),
          new BandPass(192, 18600),
          new BandPass(224, 19400),
          new BandPass(256, 19700),
          new BandPass(320, 20500)
        ];
        var table_index = self2.nearestBitrateFullIndex(bitrate);
        lh.lowerlimit = freq_map[table_index].lowpass;
      }
      function lame_init_params_ppflt(gfp) {
        var gfc = gfp.internal_flags;
        var lowpass_band = 32;
        var highpass_band = -1;
        if (gfc.lowpass1 > 0) {
          var minband = 999;
          for (var band = 0; band <= 31; band++) {
            var freq = band / 31;
            if (freq >= gfc.lowpass2) {
              lowpass_band = Math.min(lowpass_band, band);
            }
            if (gfc.lowpass1 < freq && freq < gfc.lowpass2) {
              minband = Math.min(minband, band);
            }
          }
          if (minband == 999) {
            gfc.lowpass1 = (lowpass_band - 0.75) / 31;
          } else {
            gfc.lowpass1 = (minband - 0.75) / 31;
          }
          gfc.lowpass2 = lowpass_band / 31;
        }
        if (gfc.highpass2 > 0) {
          if (gfc.highpass2 < 0.9 * (0.75 / 31)) {
            gfc.highpass1 = 0;
            gfc.highpass2 = 0;
            System2.err.println("Warning: highpass filter disabled.  highpass frequency too small\n");
          }
        }
        if (gfc.highpass2 > 0) {
          var maxband = -1;
          for (var band = 0; band <= 31; band++) {
            var freq = band / 31;
            if (freq <= gfc.highpass1) {
              highpass_band = Math.max(highpass_band, band);
            }
            if (gfc.highpass1 < freq && freq < gfc.highpass2) {
              maxband = Math.max(maxband, band);
            }
          }
          gfc.highpass1 = highpass_band / 31;
          if (maxband == -1) {
            gfc.highpass2 = (highpass_band + 0.75) / 31;
          } else {
            gfc.highpass2 = (maxband + 0.75) / 31;
          }
        }
        for (var band = 0; band < 32; band++) {
          var fc1, fc2;
          var freq = band / 31;
          if (gfc.highpass2 > gfc.highpass1) {
            fc1 = filter_coef((gfc.highpass2 - freq) / (gfc.highpass2 - gfc.highpass1 + 1e-20));
          } else {
            fc1 = 1;
          }
          if (gfc.lowpass2 > gfc.lowpass1) {
            fc2 = filter_coef((freq - gfc.lowpass1) / (gfc.lowpass2 - gfc.lowpass1 + 1e-20));
          } else {
            fc2 = 1;
          }
          gfc.amp_filter[band] = fc1 * fc2;
        }
      }
      function lame_init_qval(gfp) {
        var gfc = gfp.internal_flags;
        switch (gfp.quality) {
          default:
          case 9:
            gfc.psymodel = 0;
            gfc.noise_shaping = 0;
            gfc.noise_shaping_amp = 0;
            gfc.noise_shaping_stop = 0;
            gfc.use_best_huffman = 0;
            gfc.full_outer_loop = 0;
            break;
          case 8:
            gfp.quality = 7;
          case 7:
            gfc.psymodel = 1;
            gfc.noise_shaping = 0;
            gfc.noise_shaping_amp = 0;
            gfc.noise_shaping_stop = 0;
            gfc.use_best_huffman = 0;
            gfc.full_outer_loop = 0;
            break;
          case 6:
            gfc.psymodel = 1;
            if (gfc.noise_shaping == 0)
              gfc.noise_shaping = 1;
            gfc.noise_shaping_amp = 0;
            gfc.noise_shaping_stop = 0;
            if (gfc.subblock_gain == -1)
              gfc.subblock_gain = 1;
            gfc.use_best_huffman = 0;
            gfc.full_outer_loop = 0;
            break;
          case 5:
            gfc.psymodel = 1;
            if (gfc.noise_shaping == 0)
              gfc.noise_shaping = 1;
            gfc.noise_shaping_amp = 0;
            gfc.noise_shaping_stop = 0;
            if (gfc.subblock_gain == -1)
              gfc.subblock_gain = 1;
            gfc.use_best_huffman = 0;
            gfc.full_outer_loop = 0;
            break;
          case 4:
            gfc.psymodel = 1;
            if (gfc.noise_shaping == 0)
              gfc.noise_shaping = 1;
            gfc.noise_shaping_amp = 0;
            gfc.noise_shaping_stop = 0;
            if (gfc.subblock_gain == -1)
              gfc.subblock_gain = 1;
            gfc.use_best_huffman = 1;
            gfc.full_outer_loop = 0;
            break;
          case 3:
            gfc.psymodel = 1;
            if (gfc.noise_shaping == 0)
              gfc.noise_shaping = 1;
            gfc.noise_shaping_amp = 1;
            gfc.noise_shaping_stop = 1;
            if (gfc.subblock_gain == -1)
              gfc.subblock_gain = 1;
            gfc.use_best_huffman = 1;
            gfc.full_outer_loop = 0;
            break;
          case 2:
            gfc.psymodel = 1;
            if (gfc.noise_shaping == 0)
              gfc.noise_shaping = 1;
            if (gfc.substep_shaping == 0)
              gfc.substep_shaping = 2;
            gfc.noise_shaping_amp = 1;
            gfc.noise_shaping_stop = 1;
            if (gfc.subblock_gain == -1)
              gfc.subblock_gain = 1;
            gfc.use_best_huffman = 1;
            gfc.full_outer_loop = 0;
            break;
          case 1:
            gfc.psymodel = 1;
            if (gfc.noise_shaping == 0)
              gfc.noise_shaping = 1;
            if (gfc.substep_shaping == 0)
              gfc.substep_shaping = 2;
            gfc.noise_shaping_amp = 2;
            gfc.noise_shaping_stop = 1;
            if (gfc.subblock_gain == -1)
              gfc.subblock_gain = 1;
            gfc.use_best_huffman = 1;
            gfc.full_outer_loop = 0;
            break;
          case 0:
            gfc.psymodel = 1;
            if (gfc.noise_shaping == 0)
              gfc.noise_shaping = 1;
            if (gfc.substep_shaping == 0)
              gfc.substep_shaping = 2;
            gfc.noise_shaping_amp = 2;
            gfc.noise_shaping_stop = 1;
            if (gfc.subblock_gain == -1)
              gfc.subblock_gain = 1;
            gfc.use_best_huffman = 1;
            gfc.full_outer_loop = 0;
            break;
        }
      }
      function lame_init_bitstream(gfp) {
        var gfc = gfp.internal_flags;
        gfp.frameNum = 0;
        if (gfp.write_id3tag_automatic) {
          id3.id3tag_write_v2(gfp);
        }
        gfc.bitrate_stereoMode_Hist = new_int_n2([16, 4 + 1]);
        gfc.bitrate_blockType_Hist = new_int_n2([16, 4 + 1 + 1]);
        gfc.PeakSample = 0;
        if (gfp.bWriteVbrTag)
          vbr.InitVbrTag(gfp);
      }
      this.lame_init_params = function(gfp) {
        var gfc = gfp.internal_flags;
        gfc.Class_ID = 0;
        if (gfc.ATH == null)
          gfc.ATH = new ATH2();
        if (gfc.PSY == null)
          gfc.PSY = new PSY();
        if (gfc.rgdata == null)
          gfc.rgdata = new ReplayGain2();
        gfc.channels_in = gfp.num_channels;
        if (gfc.channels_in == 1)
          gfp.mode = MPEGMode2.MONO;
        gfc.channels_out = gfp.mode == MPEGMode2.MONO ? 1 : 2;
        gfc.mode_ext = Encoder2.MPG_MD_MS_LR;
        if (gfp.mode == MPEGMode2.MONO)
          gfp.force_ms = false;
        if (gfp.VBR == VbrMode2.vbr_off && gfp.VBR_mean_bitrate_kbps != 128 && gfp.brate == 0)
          gfp.brate = gfp.VBR_mean_bitrate_kbps;
        if (gfp.VBR == VbrMode2.vbr_off || gfp.VBR == VbrMode2.vbr_mtrh || gfp.VBR == VbrMode2.vbr_mt) ;
        else {
          gfp.free_format = false;
        }
        if (gfp.VBR == VbrMode2.vbr_off && gfp.brate == 0) {
          if (BitStream.EQ(gfp.compression_ratio, 0))
            gfp.compression_ratio = 11.025;
        }
        if (gfp.VBR == VbrMode2.vbr_off && gfp.compression_ratio > 0) {
          if (gfp.out_samplerate == 0)
            gfp.out_samplerate = map2MP3Frequency(int(0.97 * gfp.in_samplerate));
          gfp.brate = 0 | gfp.out_samplerate * 16 * gfc.channels_out / (1e3 * gfp.compression_ratio);
          gfc.samplerate_index = SmpFrqIndex(gfp.out_samplerate, gfp);
          if (!gfp.free_format)
            gfp.brate = FindNearestBitrate(
              gfp.brate,
              gfp.version,
              gfp.out_samplerate
            );
        }
        if (gfp.out_samplerate != 0) {
          if (gfp.out_samplerate < 16e3) {
            gfp.VBR_mean_bitrate_kbps = Math.max(
              gfp.VBR_mean_bitrate_kbps,
              8
            );
            gfp.VBR_mean_bitrate_kbps = Math.min(
              gfp.VBR_mean_bitrate_kbps,
              64
            );
          } else if (gfp.out_samplerate < 32e3) {
            gfp.VBR_mean_bitrate_kbps = Math.max(
              gfp.VBR_mean_bitrate_kbps,
              8
            );
            gfp.VBR_mean_bitrate_kbps = Math.min(
              gfp.VBR_mean_bitrate_kbps,
              160
            );
          } else {
            gfp.VBR_mean_bitrate_kbps = Math.max(
              gfp.VBR_mean_bitrate_kbps,
              32
            );
            gfp.VBR_mean_bitrate_kbps = Math.min(
              gfp.VBR_mean_bitrate_kbps,
              320
            );
          }
        }
        if (gfp.lowpassfreq == 0) {
          var lowpass = 16e3;
          switch (gfp.VBR) {
            case VbrMode2.vbr_off: {
              var lh = new LowPassHighPass();
              optimum_bandwidth(lh, gfp.brate);
              lowpass = lh.lowerlimit;
              break;
            }
            case VbrMode2.vbr_abr: {
              var lh = new LowPassHighPass();
              optimum_bandwidth(lh, gfp.VBR_mean_bitrate_kbps);
              lowpass = lh.lowerlimit;
              break;
            }
            case VbrMode2.vbr_rh: {
              var x = [
                19500,
                19e3,
                18600,
                18e3,
                17500,
                16e3,
                15600,
                14900,
                12500,
                1e4,
                3950
              ];
              if (0 <= gfp.VBR_q && gfp.VBR_q <= 9) {
                var a = x[gfp.VBR_q], b = x[gfp.VBR_q + 1], m2 = gfp.VBR_q_frac;
                lowpass = linear_int(a, b, m2);
              } else {
                lowpass = 19500;
              }
              break;
            }
            default: {
              var x = [
                19500,
                19e3,
                18500,
                18e3,
                17500,
                16500,
                15500,
                14500,
                12500,
                9500,
                3950
              ];
              if (0 <= gfp.VBR_q && gfp.VBR_q <= 9) {
                var a = x[gfp.VBR_q], b = x[gfp.VBR_q + 1], m2 = gfp.VBR_q_frac;
                lowpass = linear_int(a, b, m2);
              } else {
                lowpass = 19500;
              }
            }
          }
          if (gfp.mode == MPEGMode2.MONO && (gfp.VBR == VbrMode2.vbr_off || gfp.VBR == VbrMode2.vbr_abr))
            lowpass *= 1.5;
          gfp.lowpassfreq = lowpass | 0;
        }
        if (gfp.out_samplerate == 0) {
          if (2 * gfp.lowpassfreq > gfp.in_samplerate) {
            gfp.lowpassfreq = gfp.in_samplerate / 2;
          }
          gfp.out_samplerate = optimum_samplefreq(
            gfp.lowpassfreq | 0,
            gfp.in_samplerate
          );
        }
        gfp.lowpassfreq = Math.min(20500, gfp.lowpassfreq);
        gfp.lowpassfreq = Math.min(gfp.out_samplerate / 2, gfp.lowpassfreq);
        if (gfp.VBR == VbrMode2.vbr_off) {
          gfp.compression_ratio = gfp.out_samplerate * 16 * gfc.channels_out / (1e3 * gfp.brate);
        }
        if (gfp.VBR == VbrMode2.vbr_abr) {
          gfp.compression_ratio = gfp.out_samplerate * 16 * gfc.channels_out / (1e3 * gfp.VBR_mean_bitrate_kbps);
        }
        if (!gfp.bWriteVbrTag) {
          gfp.findReplayGain = false;
          gfp.decode_on_the_fly = false;
          gfc.findPeakSample = false;
        }
        gfc.findReplayGain = gfp.findReplayGain;
        gfc.decode_on_the_fly = gfp.decode_on_the_fly;
        if (gfc.decode_on_the_fly)
          gfc.findPeakSample = true;
        if (gfc.findReplayGain) {
          if (ga.InitGainAnalysis(gfc.rgdata, gfp.out_samplerate) == GainAnalysis.INIT_GAIN_ANALYSIS_ERROR) {
            gfp.internal_flags = null;
            return -6;
          }
        }
        if (gfc.decode_on_the_fly && !gfp.decode_only) {
          if (gfc.hip != null) {
            mpglib.hip_decode_exit(gfc.hip);
          }
          gfc.hip = mpglib.hip_decode_init();
        }
        gfc.mode_gr = gfp.out_samplerate <= 24e3 ? 1 : 2;
        gfp.framesize = 576 * gfc.mode_gr;
        gfp.encoder_delay = Encoder2.ENCDELAY;
        gfc.resample_ratio = gfp.in_samplerate / gfp.out_samplerate;
        switch (gfp.VBR) {
          case VbrMode2.vbr_mt:
          case VbrMode2.vbr_rh:
          case VbrMode2.vbr_mtrh:
            {
              var cmp = [
                5.7,
                6.5,
                7.3,
                8.2,
                10,
                11.9,
                13,
                14,
                15,
                16.5
              ];
              gfp.compression_ratio = cmp[gfp.VBR_q];
            }
            break;
          case VbrMode2.vbr_abr:
            gfp.compression_ratio = gfp.out_samplerate * 16 * gfc.channels_out / (1e3 * gfp.VBR_mean_bitrate_kbps);
            break;
          default:
            gfp.compression_ratio = gfp.out_samplerate * 16 * gfc.channels_out / (1e3 * gfp.brate);
            break;
        }
        if (gfp.mode == MPEGMode2.NOT_SET) {
          gfp.mode = MPEGMode2.JOINT_STEREO;
        }
        if (gfp.highpassfreq > 0) {
          gfc.highpass1 = 2 * gfp.highpassfreq;
          if (gfp.highpasswidth >= 0)
            gfc.highpass2 = 2 * (gfp.highpassfreq + gfp.highpasswidth);
          else
            gfc.highpass2 = (1 + 0) * 2 * gfp.highpassfreq;
          gfc.highpass1 /= gfp.out_samplerate;
          gfc.highpass2 /= gfp.out_samplerate;
        } else {
          gfc.highpass1 = 0;
          gfc.highpass2 = 0;
        }
        if (gfp.lowpassfreq > 0) {
          gfc.lowpass2 = 2 * gfp.lowpassfreq;
          if (gfp.lowpasswidth >= 0) {
            gfc.lowpass1 = 2 * (gfp.lowpassfreq - gfp.lowpasswidth);
            if (gfc.lowpass1 < 0)
              gfc.lowpass1 = 0;
          } else {
            gfc.lowpass1 = (1 - 0) * 2 * gfp.lowpassfreq;
          }
          gfc.lowpass1 /= gfp.out_samplerate;
          gfc.lowpass2 /= gfp.out_samplerate;
        } else {
          gfc.lowpass1 = 0;
          gfc.lowpass2 = 0;
        }
        lame_init_params_ppflt(gfp);
        gfc.samplerate_index = SmpFrqIndex(gfp.out_samplerate, gfp);
        if (gfc.samplerate_index < 0) {
          gfp.internal_flags = null;
          return -1;
        }
        if (gfp.VBR == VbrMode2.vbr_off) {
          if (gfp.free_format) {
            gfc.bitrate_index = 0;
          } else {
            gfp.brate = FindNearestBitrate(
              gfp.brate,
              gfp.version,
              gfp.out_samplerate
            );
            gfc.bitrate_index = BitrateIndex(
              gfp.brate,
              gfp.version,
              gfp.out_samplerate
            );
            if (gfc.bitrate_index <= 0) {
              gfp.internal_flags = null;
              return -1;
            }
          }
        } else {
          gfc.bitrate_index = 1;
        }
        if (gfp.analysis)
          gfp.bWriteVbrTag = false;
        if (gfc.pinfo != null)
          gfp.bWriteVbrTag = false;
        bs.init_bit_stream_w(gfc);
        var j = gfc.samplerate_index + 3 * gfp.version + 6 * (gfp.out_samplerate < 16e3 ? 1 : 0);
        for (var i = 0; i < Encoder2.SBMAX_l + 1; i++)
          gfc.scalefac_band.l[i] = qupvt.sfBandIndex[j].l[i];
        for (var i = 0; i < Encoder2.PSFB21 + 1; i++) {
          var size = (gfc.scalefac_band.l[22] - gfc.scalefac_band.l[21]) / Encoder2.PSFB21;
          var start = gfc.scalefac_band.l[21] + i * size;
          gfc.scalefac_band.psfb21[i] = start;
        }
        gfc.scalefac_band.psfb21[Encoder2.PSFB21] = 576;
        for (var i = 0; i < Encoder2.SBMAX_s + 1; i++)
          gfc.scalefac_band.s[i] = qupvt.sfBandIndex[j].s[i];
        for (var i = 0; i < Encoder2.PSFB12 + 1; i++) {
          var size = (gfc.scalefac_band.s[13] - gfc.scalefac_band.s[12]) / Encoder2.PSFB12;
          var start = gfc.scalefac_band.s[12] + i * size;
          gfc.scalefac_band.psfb12[i] = start;
        }
        gfc.scalefac_band.psfb12[Encoder2.PSFB12] = 192;
        if (gfp.version == 1)
          gfc.sideinfo_len = gfc.channels_out == 1 ? 4 + 17 : 4 + 32;
        else
          gfc.sideinfo_len = gfc.channels_out == 1 ? 4 + 9 : 4 + 17;
        if (gfp.error_protection)
          gfc.sideinfo_len += 2;
        lame_init_bitstream(gfp);
        gfc.Class_ID = LAME_ID;
        {
          var k2;
          for (k2 = 0; k2 < 19; k2++)
            gfc.nsPsy.pefirbuf[k2] = 700 * gfc.mode_gr * gfc.channels_out;
          if (gfp.ATHtype == -1)
            gfp.ATHtype = 4;
        }
        assert2(gfp.VBR_q <= 9);
        assert2(gfp.VBR_q >= 0);
        switch (gfp.VBR) {
          case VbrMode2.vbr_mt:
            gfp.VBR = VbrMode2.vbr_mtrh;
          case VbrMode2.vbr_mtrh: {
            if (gfp.useTemporal == null) {
              gfp.useTemporal = false;
            }
            p2.apply_preset(gfp, 500 - gfp.VBR_q * 10, 0);
            if (gfp.quality < 0)
              gfp.quality = LAME_DEFAULT_QUALITY;
            if (gfp.quality < 5)
              gfp.quality = 0;
            if (gfp.quality > 5)
              gfp.quality = 5;
            gfc.PSY.mask_adjust = gfp.maskingadjust;
            gfc.PSY.mask_adjust_short = gfp.maskingadjust_short;
            if (gfp.experimentalY)
              gfc.sfb21_extra = false;
            else
              gfc.sfb21_extra = gfp.out_samplerate > 44e3;
            gfc.iteration_loop = new VBRNewIterationLoop(qu);
            break;
          }
          case VbrMode2.vbr_rh: {
            p2.apply_preset(gfp, 500 - gfp.VBR_q * 10, 0);
            gfc.PSY.mask_adjust = gfp.maskingadjust;
            gfc.PSY.mask_adjust_short = gfp.maskingadjust_short;
            if (gfp.experimentalY)
              gfc.sfb21_extra = false;
            else
              gfc.sfb21_extra = gfp.out_samplerate > 44e3;
            if (gfp.quality > 6)
              gfp.quality = 6;
            if (gfp.quality < 0)
              gfp.quality = LAME_DEFAULT_QUALITY;
            gfc.iteration_loop = new VBROldIterationLoop(qu);
            break;
          }
          default: {
            var vbrmode;
            gfc.sfb21_extra = false;
            if (gfp.quality < 0)
              gfp.quality = LAME_DEFAULT_QUALITY;
            vbrmode = gfp.VBR;
            if (vbrmode == VbrMode2.vbr_off)
              gfp.VBR_mean_bitrate_kbps = gfp.brate;
            p2.apply_preset(gfp, gfp.VBR_mean_bitrate_kbps, 0);
            gfp.VBR = vbrmode;
            gfc.PSY.mask_adjust = gfp.maskingadjust;
            gfc.PSY.mask_adjust_short = gfp.maskingadjust_short;
            if (vbrmode == VbrMode2.vbr_off) {
              gfc.iteration_loop = new CBRNewIterationLoop2(qu);
            } else {
              gfc.iteration_loop = new ABRIterationLoop(qu);
            }
            break;
          }
        }
        assert2(gfp.scale >= 0);
        if (gfp.VBR != VbrMode2.vbr_off) {
          gfc.VBR_min_bitrate = 1;
          gfc.VBR_max_bitrate = 14;
          if (gfp.out_samplerate < 16e3)
            gfc.VBR_max_bitrate = 8;
          if (gfp.VBR_min_bitrate_kbps != 0) {
            gfp.VBR_min_bitrate_kbps = FindNearestBitrate(
              gfp.VBR_min_bitrate_kbps,
              gfp.version,
              gfp.out_samplerate
            );
            gfc.VBR_min_bitrate = BitrateIndex(
              gfp.VBR_min_bitrate_kbps,
              gfp.version,
              gfp.out_samplerate
            );
            if (gfc.VBR_min_bitrate < 0)
              return -1;
          }
          if (gfp.VBR_max_bitrate_kbps != 0) {
            gfp.VBR_max_bitrate_kbps = FindNearestBitrate(
              gfp.VBR_max_bitrate_kbps,
              gfp.version,
              gfp.out_samplerate
            );
            gfc.VBR_max_bitrate = BitrateIndex(
              gfp.VBR_max_bitrate_kbps,
              gfp.version,
              gfp.out_samplerate
            );
            if (gfc.VBR_max_bitrate < 0)
              return -1;
          }
          gfp.VBR_min_bitrate_kbps = Tables2.bitrate_table[gfp.version][gfc.VBR_min_bitrate];
          gfp.VBR_max_bitrate_kbps = Tables2.bitrate_table[gfp.version][gfc.VBR_max_bitrate];
          gfp.VBR_mean_bitrate_kbps = Math.min(
            Tables2.bitrate_table[gfp.version][gfc.VBR_max_bitrate],
            gfp.VBR_mean_bitrate_kbps
          );
          gfp.VBR_mean_bitrate_kbps = Math.max(
            Tables2.bitrate_table[gfp.version][gfc.VBR_min_bitrate],
            gfp.VBR_mean_bitrate_kbps
          );
        }
        if (gfp.tune) {
          gfc.PSY.mask_adjust += gfp.tune_value_a;
          gfc.PSY.mask_adjust_short += gfp.tune_value_a;
        }
        lame_init_qval(gfp);
        assert2(gfp.scale >= 0);
        if (gfp.athaa_type < 0)
          gfc.ATH.useAdjust = 3;
        else
          gfc.ATH.useAdjust = gfp.athaa_type;
        gfc.ATH.aaSensitivityP = Math.pow(10, gfp.athaa_sensitivity / -10);
        if (gfp.short_blocks == null) {
          gfp.short_blocks = ShortBlock2.short_block_allowed;
        }
        if (gfp.short_blocks == ShortBlock2.short_block_allowed && (gfp.mode == MPEGMode2.JOINT_STEREO || gfp.mode == MPEGMode2.STEREO)) {
          gfp.short_blocks = ShortBlock2.short_block_coupled;
        }
        if (gfp.quant_comp < 0)
          gfp.quant_comp = 1;
        if (gfp.quant_comp_short < 0)
          gfp.quant_comp_short = 0;
        if (gfp.msfix < 0)
          gfp.msfix = 0;
        gfp.exp_nspsytune = gfp.exp_nspsytune | 1;
        if (gfp.internal_flags.nsPsy.attackthre < 0)
          gfp.internal_flags.nsPsy.attackthre = PsyModel2.NSATTACKTHRE;
        if (gfp.internal_flags.nsPsy.attackthre_s < 0)
          gfp.internal_flags.nsPsy.attackthre_s = PsyModel2.NSATTACKTHRE_S;
        assert2(gfp.scale >= 0);
        if (gfp.scale < 0)
          gfp.scale = 1;
        if (gfp.ATHtype < 0)
          gfp.ATHtype = 4;
        if (gfp.ATHcurve < 0)
          gfp.ATHcurve = 4;
        if (gfp.athaa_loudapprox < 0)
          gfp.athaa_loudapprox = 2;
        if (gfp.interChRatio < 0)
          gfp.interChRatio = 0;
        if (gfp.useTemporal == null)
          gfp.useTemporal = true;
        gfc.slot_lag = gfc.frac_SpF = 0;
        if (gfp.VBR == VbrMode2.vbr_off)
          gfc.slot_lag = gfc.frac_SpF = (gfp.version + 1) * 72e3 * gfp.brate % gfp.out_samplerate | 0;
        qupvt.iteration_init(gfp);
        psy.psymodel_init(gfp);
        assert2(gfp.scale >= 0);
        return 0;
      };
      function update_inbuffer_size(gfc, nsamples) {
        if (gfc.in_buffer_0 == null || gfc.in_buffer_nsamples < nsamples) {
          gfc.in_buffer_0 = new_float2(nsamples);
          gfc.in_buffer_1 = new_float2(nsamples);
          gfc.in_buffer_nsamples = nsamples;
        }
      }
      this.lame_encode_flush = function(gfp, mp3buffer, mp3bufferPos, mp3buffer_size) {
        var gfc = gfp.internal_flags;
        var buffer = new_short_n2([2, 1152]);
        var imp3 = 0, mp3count, mp3buffer_size_remaining;
        var end_padding;
        var frames_left;
        var samples_to_encode = gfc.mf_samples_to_encode - Encoder2.POSTDELAY;
        var mf_needed = calcNeeded(gfp);
        if (gfc.mf_samples_to_encode < 1) {
          return 0;
        }
        mp3count = 0;
        if (gfp.in_samplerate != gfp.out_samplerate) {
          samples_to_encode += 16 * gfp.out_samplerate / gfp.in_samplerate;
        }
        end_padding = gfp.framesize - samples_to_encode % gfp.framesize;
        if (end_padding < 576)
          end_padding += gfp.framesize;
        gfp.encoder_padding = end_padding;
        frames_left = (samples_to_encode + end_padding) / gfp.framesize;
        while (frames_left > 0 && imp3 >= 0) {
          var bunch = mf_needed - gfc.mf_size;
          var frame_num = gfp.frameNum;
          bunch *= gfp.in_samplerate;
          bunch /= gfp.out_samplerate;
          if (bunch > 1152)
            bunch = 1152;
          if (bunch < 1)
            bunch = 1;
          mp3buffer_size_remaining = mp3buffer_size - mp3count;
          if (mp3buffer_size == 0)
            mp3buffer_size_remaining = 0;
          imp3 = this.lame_encode_buffer(
            gfp,
            buffer[0],
            buffer[1],
            bunch,
            mp3buffer,
            mp3bufferPos,
            mp3buffer_size_remaining
          );
          mp3bufferPos += imp3;
          mp3count += imp3;
          frames_left -= frame_num != gfp.frameNum ? 1 : 0;
        }
        gfc.mf_samples_to_encode = 0;
        if (imp3 < 0) {
          return imp3;
        }
        mp3buffer_size_remaining = mp3buffer_size - mp3count;
        if (mp3buffer_size == 0)
          mp3buffer_size_remaining = 0;
        bs.flush_bitstream(gfp);
        imp3 = bs.copy_buffer(
          gfc,
          mp3buffer,
          mp3bufferPos,
          mp3buffer_size_remaining,
          1
        );
        if (imp3 < 0) {
          return imp3;
        }
        mp3bufferPos += imp3;
        mp3count += imp3;
        mp3buffer_size_remaining = mp3buffer_size - mp3count;
        if (mp3buffer_size == 0)
          mp3buffer_size_remaining = 0;
        if (gfp.write_id3tag_automatic) {
          id3.id3tag_write_v1(gfp);
          imp3 = bs.copy_buffer(
            gfc,
            mp3buffer,
            mp3bufferPos,
            mp3buffer_size_remaining,
            0
          );
          if (imp3 < 0) {
            return imp3;
          }
          mp3count += imp3;
        }
        return mp3count;
      };
      this.lame_encode_buffer = function(gfp, buffer_l, buffer_r, nsamples, mp3buf, mp3bufPos, mp3buf_size) {
        var gfc = gfp.internal_flags;
        var in_buffer = [null, null];
        if (gfc.Class_ID != LAME_ID)
          return -3;
        if (nsamples == 0)
          return 0;
        update_inbuffer_size(gfc, nsamples);
        in_buffer[0] = gfc.in_buffer_0;
        in_buffer[1] = gfc.in_buffer_1;
        for (var i = 0; i < nsamples; i++) {
          in_buffer[0][i] = buffer_l[i];
          if (gfc.channels_in > 1)
            in_buffer[1][i] = buffer_r[i];
        }
        return lame_encode_buffer_sample(
          gfp,
          in_buffer[0],
          in_buffer[1],
          nsamples,
          mp3buf,
          mp3bufPos,
          mp3buf_size
        );
      };
      function calcNeeded(gfp) {
        var mf_needed = Encoder2.BLKSIZE + gfp.framesize - Encoder2.FFTOFFSET;
        mf_needed = Math.max(mf_needed, 512 + gfp.framesize - 32);
        return mf_needed;
      }
      function lame_encode_buffer_sample(gfp, buffer_l, buffer_r, nsamples, mp3buf, mp3bufPos, mp3buf_size) {
        var gfc = gfp.internal_flags;
        var mp3size = 0, ret, i, ch, mf_needed;
        var mp3out;
        var mfbuf = [null, null];
        var in_buffer = [null, null];
        if (gfc.Class_ID != LAME_ID)
          return -3;
        if (nsamples == 0)
          return 0;
        mp3out = bs.copy_buffer(gfc, mp3buf, mp3bufPos, mp3buf_size, 0);
        if (mp3out < 0)
          return mp3out;
        mp3bufPos += mp3out;
        mp3size += mp3out;
        in_buffer[0] = buffer_l;
        in_buffer[1] = buffer_r;
        if (BitStream.NEQ(gfp.scale, 0) && BitStream.NEQ(gfp.scale, 1)) {
          for (i = 0; i < nsamples; ++i) {
            in_buffer[0][i] *= gfp.scale;
            if (gfc.channels_out == 2)
              in_buffer[1][i] *= gfp.scale;
          }
        }
        if (BitStream.NEQ(gfp.scale_left, 0) && BitStream.NEQ(gfp.scale_left, 1)) {
          for (i = 0; i < nsamples; ++i) {
            in_buffer[0][i] *= gfp.scale_left;
          }
        }
        if (BitStream.NEQ(gfp.scale_right, 0) && BitStream.NEQ(gfp.scale_right, 1)) {
          for (i = 0; i < nsamples; ++i) {
            in_buffer[1][i] *= gfp.scale_right;
          }
        }
        if (gfp.num_channels == 2 && gfc.channels_out == 1) {
          for (i = 0; i < nsamples; ++i) {
            in_buffer[0][i] = 0.5 * (in_buffer[0][i] + in_buffer[1][i]);
            in_buffer[1][i] = 0;
          }
        }
        mf_needed = calcNeeded(gfp);
        mfbuf[0] = gfc.mfbuf[0];
        mfbuf[1] = gfc.mfbuf[1];
        var in_bufferPos = 0;
        while (nsamples > 0) {
          var in_buffer_ptr = [null, null];
          var n_in = 0;
          var n_out = 0;
          in_buffer_ptr[0] = in_buffer[0];
          in_buffer_ptr[1] = in_buffer[1];
          var inOut = new InOut();
          fill_buffer(
            gfp,
            mfbuf,
            in_buffer_ptr,
            in_bufferPos,
            nsamples,
            inOut
          );
          n_in = inOut.n_in;
          n_out = inOut.n_out;
          if (gfc.findReplayGain && !gfc.decode_on_the_fly) {
            if (ga.AnalyzeSamples(
              gfc.rgdata,
              mfbuf[0],
              gfc.mf_size,
              mfbuf[1],
              gfc.mf_size,
              n_out,
              gfc.channels_out
            ) == GainAnalysis.GAIN_ANALYSIS_ERROR)
              return -6;
          }
          nsamples -= n_in;
          in_bufferPos += n_in;
          if (gfc.channels_out == 2)
            ;
          gfc.mf_size += n_out;
          assert2(gfc.mf_size <= LameInternalFlags2.MFSIZE);
          if (gfc.mf_samples_to_encode < 1) {
            gfc.mf_samples_to_encode = Encoder2.ENCDELAY + Encoder2.POSTDELAY;
          }
          gfc.mf_samples_to_encode += n_out;
          if (gfc.mf_size >= mf_needed) {
            var buf_size = mp3buf_size - mp3size;
            if (mp3buf_size == 0)
              buf_size = 0;
            ret = lame_encode_frame(
              gfp,
              mfbuf[0],
              mfbuf[1],
              mp3buf,
              mp3bufPos,
              buf_size
            );
            if (ret < 0)
              return ret;
            mp3bufPos += ret;
            mp3size += ret;
            gfc.mf_size -= gfp.framesize;
            gfc.mf_samples_to_encode -= gfp.framesize;
            for (ch = 0; ch < gfc.channels_out; ch++)
              for (i = 0; i < gfc.mf_size; i++)
                mfbuf[ch][i] = mfbuf[ch][i + gfp.framesize];
          }
        }
        return mp3size;
      }
      function lame_encode_frame(gfp, inbuf_l, inbuf_r, mp3buf, mp3bufPos, mp3buf_size) {
        var ret = self2.enc.lame_encode_mp3_frame(
          gfp,
          inbuf_l,
          inbuf_r,
          mp3buf,
          mp3bufPos,
          mp3buf_size
        );
        gfp.frameNum++;
        return ret;
      }
      function InOut() {
        this.n_in = 0;
        this.n_out = 0;
      }
      function NumUsed() {
        this.num_used = 0;
      }
      function gcd(i, j) {
        return j != 0 ? gcd(j, i % j) : i;
      }
      function blackman(x, fcn, l2) {
        var wcn = Math.PI * fcn;
        x /= l2;
        if (x < 0)
          x = 0;
        if (x > 1)
          x = 1;
        var x2 = x - 0.5;
        var bkwn = 0.42 - 0.5 * Math.cos(2 * x * Math.PI) + 0.08 * Math.cos(4 * x * Math.PI);
        if (Math.abs(x2) < 1e-9)
          return wcn / Math.PI;
        else
          return bkwn * Math.sin(l2 * wcn * x2) / (Math.PI * l2 * x2);
      }
      function fill_buffer_resample(gfp, outbuf, outbufPos, desired_len, inbuf, in_bufferPos, len, num_used, ch) {
        var gfc = gfp.internal_flags;
        var i, j = 0, k2;
        var bpc = gfp.out_samplerate / gcd(gfp.out_samplerate, gfp.in_samplerate);
        if (bpc > LameInternalFlags2.BPC)
          bpc = LameInternalFlags2.BPC;
        var intratio = Math.abs(gfc.resample_ratio - Math.floor(0.5 + gfc.resample_ratio)) < 1e-4 ? 1 : 0;
        var fcn = 1 / gfc.resample_ratio;
        if (fcn > 1)
          fcn = 1;
        var filter_l = 31;
        if (0 == filter_l % 2)
          --filter_l;
        filter_l += intratio;
        var BLACKSIZE = filter_l + 1;
        if (gfc.fill_buffer_resample_init == 0) {
          gfc.inbuf_old[0] = new_float2(BLACKSIZE);
          gfc.inbuf_old[1] = new_float2(BLACKSIZE);
          for (i = 0; i <= 2 * bpc; ++i)
            gfc.blackfilt[i] = new_float2(BLACKSIZE);
          gfc.itime[0] = 0;
          gfc.itime[1] = 0;
          for (j = 0; j <= 2 * bpc; j++) {
            var sum = 0;
            var offset = (j - bpc) / (2 * bpc);
            for (i = 0; i <= filter_l; i++)
              sum += gfc.blackfilt[j][i] = blackman(
                i - offset,
                fcn,
                filter_l
              );
            for (i = 0; i <= filter_l; i++)
              gfc.blackfilt[j][i] /= sum;
          }
          gfc.fill_buffer_resample_init = 1;
        }
        var inbuf_old = gfc.inbuf_old[ch];
        for (k2 = 0; k2 < desired_len; k2++) {
          var time0;
          var joff;
          time0 = k2 * gfc.resample_ratio;
          j = 0 | Math.floor(time0 - gfc.itime[ch]);
          if (filter_l + j - filter_l / 2 >= len)
            break;
          var offset = time0 - gfc.itime[ch] - (j + 0.5 * (filter_l % 2));
          joff = 0 | Math.floor(offset * 2 * bpc + bpc + 0.5);
          var xvalue = 0;
          for (i = 0; i <= filter_l; ++i) {
            var j2 = 0 | i + j - filter_l / 2;
            var y;
            y = j2 < 0 ? inbuf_old[BLACKSIZE + j2] : inbuf[in_bufferPos + j2];
            xvalue += y * gfc.blackfilt[joff][i];
          }
          outbuf[outbufPos + k2] = xvalue;
        }
        num_used.num_used = Math.min(len, filter_l + j - filter_l / 2);
        gfc.itime[ch] += num_used.num_used - k2 * gfc.resample_ratio;
        if (num_used.num_used >= BLACKSIZE) {
          for (i = 0; i < BLACKSIZE; i++)
            inbuf_old[i] = inbuf[in_bufferPos + num_used.num_used + i - BLACKSIZE];
        } else {
          var n_shift = BLACKSIZE - num_used.num_used;
          for (i = 0; i < n_shift; ++i)
            inbuf_old[i] = inbuf_old[i + num_used.num_used];
          for (j = 0; i < BLACKSIZE; ++i, ++j)
            inbuf_old[i] = inbuf[in_bufferPos + j];
          assert2(j == num_used.num_used);
        }
        return k2;
      }
      function fill_buffer(gfp, mfbuf, in_buffer, in_bufferPos, nsamples, io) {
        var gfc = gfp.internal_flags;
        if (gfc.resample_ratio < 0.9999 || gfc.resample_ratio > 1.0001) {
          for (var ch = 0; ch < gfc.channels_out; ch++) {
            var numUsed = new NumUsed();
            io.n_out = fill_buffer_resample(
              gfp,
              mfbuf[ch],
              gfc.mf_size,
              gfp.framesize,
              in_buffer[ch],
              in_bufferPos,
              nsamples,
              numUsed,
              ch
            );
            io.n_in = numUsed.num_used;
          }
        } else {
          io.n_out = Math.min(gfp.framesize, nsamples);
          io.n_in = io.n_out;
          for (var i = 0; i < io.n_out; ++i) {
            mfbuf[0][gfc.mf_size + i] = in_buffer[0][in_bufferPos + i];
            if (gfc.channels_out == 2)
              mfbuf[1][gfc.mf_size + i] = in_buffer[1][in_bufferPos + i];
          }
        }
      }
    }
    Lame_1 = Lame2;
    return Lame_1;
  }
  requireLame();
  requireEncoder();
  requireLame();
  requireQuantizePVT();
  requireTakehiro();
  requireBitStream();
  requireEncoder();
  function fourccToInt(fourcc) {
    return fourcc.charCodeAt(0) << 24 | fourcc.charCodeAt(1) << 16 | fourcc.charCodeAt(2) << 8 | fourcc.charCodeAt(3);
  }
  fourccToInt("RIFF");
  fourccToInt("WAVE");
  fourccToInt("fmt ");
  fourccToInt("data");
  var recorderCore = { exports: {} };
  (function(module) {
    (function(factory) {
      var browser = typeof window == "object" && !!window.document;
      var win = browser ? window : Object;
      factory(win, browser);
      if (module.exports) {
        module.exports = win.Recorder;
      }
    })(function(Export, isBrowser) {
      var NOOP = function() {
      };
      var IsNum = function(v) {
        return typeof v == "number";
      };
      var Recorder2 = function(set) {
        return new initFn(set);
      };
      var LM = Recorder2.LM = "2024-04-09 19:15";
      var GitUrl = "https://github.com/xiangyuecn/Recorder";
      var RecTxt = "Recorder";
      var getUserMediaTxt = "getUserMedia";
      var srcSampleRateTxt = "srcSampleRate";
      var sampleRateTxt = "sampleRate";
      var bitRateTxt = "bitRate";
      var CatchTxt = "catch";
      var WRec2 = Export[RecTxt];
      if (WRec2 && WRec2.LM == LM) {
        WRec2.CLog(WRec2.i18n.$T("K8zP::重复导入{1}", 0, RecTxt), 3);
        return;
      }
      Recorder2.IsOpen = function() {
        var stream = Recorder2.Stream;
        if (stream) {
          var tracks = stream.getTracks && stream.getTracks() || stream.audioTracks || [];
          var track = tracks[0];
          if (track) {
            var state = track.readyState;
            return state == "live" || state == track.LIVE;
          }
        }
        return false;
      };
      Recorder2.BufferSize = 4096;
      Recorder2.Destroy = function() {
        CLog(RecTxt + " Destroy");
        Disconnect();
        for (var k2 in DestroyList) {
          DestroyList[k2]();
        }
      };
      var DestroyList = {};
      Recorder2.BindDestroy = function(key, call) {
        DestroyList[key] = call;
      };
      Recorder2.Support = function() {
        if (!isBrowser) return false;
        var scope = navigator.mediaDevices || {};
        if (!scope[getUserMediaTxt]) {
          scope = navigator;
          scope[getUserMediaTxt] || (scope[getUserMediaTxt] = scope.webkitGetUserMedia || scope.mozGetUserMedia || scope.msGetUserMedia);
        }
        if (!scope[getUserMediaTxt]) {
          return false;
        }
        Recorder2.Scope = scope;
        if (!Recorder2.GetContext()) {
          return false;
        }
        return true;
      };
      Recorder2.GetContext = function(tryNew) {
        if (!isBrowser) return null;
        var AC = window.AudioContext;
        if (!AC) {
          AC = window.webkitAudioContext;
        }
        if (!AC) {
          return null;
        }
        var ctx = Recorder2.Ctx;
        if (!ctx || ctx.state == "closed") {
          ctx = Recorder2.Ctx = new AC();
          Recorder2.NewCtxs = Recorder2.NewCtxs || [];
          Recorder2.BindDestroy("Ctx", function() {
            var ctx2 = Recorder2.Ctx;
            if (ctx2 && ctx2.close) {
              CloseCtx(ctx2);
              Recorder2.Ctx = 0;
            }
            var arr = Recorder2.NewCtxs;
            Recorder2.NewCtxs = [];
            for (var i = 0; i < arr.length; i++) CloseCtx(arr[i]);
          });
        }
        if (tryNew && ctx.close) {
          try {
            ctx = new AC();
            Recorder2.NewCtxs.push(ctx);
          } catch (e) {
            CLog("GetContext tryNew Error", 1, e);
          }
        }
        return ctx;
      };
      Recorder2.CloseNewCtx = function(ctx) {
        if (ctx && ctx != Recorder2.Ctx) {
          CloseCtx(ctx);
          var arr = Recorder2.NewCtxs || [], L = arr.length;
          for (var i = 0; i < arr.length; i++) {
            if (arr[i] == ctx) {
              arr.splice(i, 1);
              break;
            }
          }
          CLog($T("mSxV::剩{1}个GetContext未close", 0, L + "-1=" + arr.length), arr.length ? 3 : 0);
        }
      };
      var CloseCtx = function(ctx) {
        if (ctx && ctx.close) {
          ctx._isC = 1;
          try {
            ctx.close();
          } catch (e) {
            CLog("ctx close err", 1, e);
          }
        }
      };
      var ResumeCtx = Recorder2.ResumeCtx = function(ctx, check, True, False) {
        var isEnd = 0, isBind = 0, isLsSC = 0, runC = 0, EL = "EventListener", Tag = "ResumeCtx ";
        var end = function(err, ok) {
          if (isBind) {
            bind();
          }
          if (!isEnd) {
            isEnd = 1;
            err && False(err, runC);
            ok && True(runC);
          }
          if (ok) {
            if (!ctx._LsSC && ctx["add" + EL]) ctx["add" + EL]("statechange", run);
            ctx._LsSC = 1;
            isLsSC = 1;
          }
        };
        var bind = function(add) {
          if (add && isBind) return;
          isBind = add ? 1 : 0;
          var types = ["focus", "mousedown", "mouseup", "touchstart", "touchend"];
          for (var i = 0; i < types.length; i++)
            window[(add ? "add" : "remove") + EL](types[i], run, true);
        };
        var run = function() {
          var sVal = ctx.state, spEnd = CtxSpEnd(sVal);
          if (!isEnd && !check(spEnd ? ++runC : runC)) return end();
          if (spEnd) {
            if (isLsSC) CLog(Tag + "sc " + sVal, 3);
            bind(1);
            ctx.resume().then(function() {
              if (isLsSC) CLog(Tag + "sc " + ctx.state);
              end(0, 1);
            })[CatchTxt](function(e) {
              CLog(Tag + "error", 1, e);
              if (!CtxSpEnd(ctx.state)) {
                end(e.message || "error");
              }
            });
          } else if (sVal == "closed") {
            if (isLsSC && !ctx._isC) CLog(Tag + "sc " + sVal, 1);
            end("ctx closed");
          } else {
            end(0, 1);
          }
        };
        run();
      };
      var CtxSpEnd = Recorder2.CtxSpEnd = function(v) {
        return v == "suspended" || v == "interrupted";
      };
      var CtxState = function(ctx) {
        var v = ctx.state, msg = "ctx.state=" + v;
        if (CtxSpEnd(v)) msg += $T("nMIy::(注意:ctx不是running状态,rec.open和start至少要有一个在用户操作(触摸、点击等)时进行调用,否则将在rec.start时尝试进行ctx.resume,可能会产生兼容性问题(仅iOS),请参阅文档中runningContext配置)");
        return msg;
      };
      var ConnectEnableWebM = "ConnectEnableWebM";
      Recorder2[ConnectEnableWebM] = true;
      var ConnectEnableWorklet = "ConnectEnableWorklet";
      Recorder2[ConnectEnableWorklet] = false;
      var Connect = function(streamStore, isUserMedia) {
        var bufferSize = streamStore.BufferSize || Recorder2.BufferSize;
        var stream = streamStore.Stream;
        var ctx = stream._RC || stream._c || Recorder2.GetContext(true);
        stream._c = ctx;
        var mediaConn = function(node) {
          var media = stream._m = ctx.createMediaStreamSource(stream);
          var ctxDest = ctx.destination, cmsdTxt = "createMediaStreamDestination";
          if (ctx[cmsdTxt]) {
            ctxDest = stream._d = ctx[cmsdTxt]();
          }
          media.connect(node);
          node.connect(ctxDest);
        };
        var isWebM, isWorklet, badInt, webMTips = "";
        var calls = stream._call;
        var onReceive = function(float32Arr) {
          for (var k0 in calls) {
            var size = float32Arr.length;
            var pcm = new Int16Array(size);
            var sum = 0;
            for (var j = 0; j < size; j++) {
              var s = Math.max(-1, Math.min(1, float32Arr[j]));
              s = s < 0 ? s * 32768 : s * 32767;
              pcm[j] = s;
              sum += Math.abs(s);
            }
            for (var k2 in calls) {
              calls[k2](pcm, sum);
            }
            return;
          }
        };
        var scriptProcessor = "ScriptProcessor";
        var audioWorklet = "audioWorklet";
        var recAudioWorklet = RecTxt + " " + audioWorklet;
        var RecProc = "RecProc";
        var MediaRecorderTxt = "MediaRecorder";
        var MRWebMPCM = MediaRecorderTxt + ".WebM.PCM";
        var oldFn = ctx.createScriptProcessor || ctx.createJavaScriptNode;
        var oldIsBest = $T("ZGlf::。由于{1}内部1秒375次回调,在移动端可能会有性能问题导致回调丢失录音变短,PC端无影响,暂不建议开启{1}。", 0, audioWorklet);
        var oldScript = function() {
          isWorklet = stream.isWorklet = false;
          _Disconn_n(stream);
          CLog($T("7TU0::Connect采用老的{1},", 0, scriptProcessor) + i18n.get(
            Recorder2[ConnectEnableWorklet] ? $T("JwCL::但已设置{1}尝试启用{2}", 2) : $T("VGjB::可设置{1}尝试启用{2}", 2),
            [RecTxt + "." + ConnectEnableWorklet + "=true", audioWorklet]
          ) + webMTips + oldIsBest, 3);
          var process = stream._p = oldFn.call(ctx, bufferSize, 1, 1);
          mediaConn(process);
          process.onaudioprocess = function(e) {
            var arr = e.inputBuffer.getChannelData(0);
            onReceive(arr);
          };
        };
        var connWorklet = function() {
          isWebM = stream.isWebM = false;
          _Disconn_r(stream);
          isWorklet = stream.isWorklet = !oldFn || Recorder2[ConnectEnableWorklet];
          var AwNode = window.AudioWorkletNode;
          if (!(isWorklet && ctx[audioWorklet] && AwNode)) {
            oldScript();
            return;
          }
          var clazzUrl = function() {
            var xf = function(f2) {
              return f2.toString().replace(/^function|DEL_/g, "").replace(/\$RA/g, recAudioWorklet);
            };
            var clazz = "class " + RecProc + " extends AudioWorkletProcessor{";
            clazz += "constructor " + xf(function(option) {
              DEL_super(option);
              var This = this, bufferSize2 = option.processorOptions.bufferSize;
              This.bufferSize = bufferSize2;
              This.buffer = new Float32Array(bufferSize2 * 2);
              This.pos = 0;
              This.port.onmessage = function(e) {
                if (e.data.kill) {
                  This.kill = true;
                  $C.log("$RA kill call");
                }
              };
              $C.log("$RA .ctor call", option);
            });
            clazz += "process " + xf(function(input, b, c) {
              var This = this, bufferSize2 = This.bufferSize;
              var buffer = This.buffer, pos = This.pos;
              input = (input[0] || [])[0] || [];
              if (input.length) {
                buffer.set(input, pos);
                pos += input.length;
                var len = ~~(pos / bufferSize2) * bufferSize2;
                if (len) {
                  this.port.postMessage({ val: buffer.slice(0, len) });
                  var more = buffer.subarray(len, pos);
                  buffer = new Float32Array(bufferSize2 * 2);
                  buffer.set(more);
                  pos = more.length;
                  This.buffer = buffer;
                }
                This.pos = pos;
              }
              return !This.kill;
            });
            clazz += '}try{registerProcessor("' + RecProc + '", ' + RecProc + ')}catch(e){$C.error("' + recAudioWorklet + ' Reg Error",e)}';
            clazz = clazz.replace(/\$C\./g, "console.");
            return "data:text/javascript;base64," + btoa(unescape(encodeURIComponent(clazz)));
          };
          var awNext = function() {
            return isWorklet && stream._na;
          };
          var nodeAlive = stream._na = function() {
            if (badInt !== "") {
              clearTimeout(badInt);
              badInt = setTimeout(function() {
                badInt = 0;
                if (awNext()) {
                  CLog($T("MxX1::{1}未返回任何音频,恢复使用{2}", 0, audioWorklet, scriptProcessor), 3);
                  oldFn && oldScript();
                }
              }, 500);
            }
          };
          var createNode = function() {
            if (!awNext()) return;
            var node = stream._n = new AwNode(ctx, RecProc, {
              processorOptions: { bufferSize }
            });
            mediaConn(node);
            node.port.onmessage = function(e) {
              if (badInt) {
                clearTimeout(badInt);
                badInt = "";
              }
              if (awNext()) {
                onReceive(e.data.val);
              } else if (!isWorklet) {
                CLog($T("XUap::{1}多余回调", 0, audioWorklet), 3);
              }
            };
            CLog($T("yOta::Connect采用{1},设置{2}可恢复老式{3}", 0, audioWorklet, RecTxt + "." + ConnectEnableWorklet + "=false", scriptProcessor) + webMTips + oldIsBest, 3);
          };
          var ctxOK = function() {
            if (!awNext()) return;
            if (ctx[RecProc]) {
              createNode();
              return;
            }
            var url = clazzUrl();
            ctx[audioWorklet].addModule(url).then(function(e) {
              if (!awNext()) return;
              ctx[RecProc] = 1;
              createNode();
              if (badInt) {
                nodeAlive();
              }
            })[CatchTxt](function(e) {
              CLog(audioWorklet + ".addModule Error", 1, e);
              awNext() && oldScript();
            });
          };
          ResumeCtx(ctx, function() {
            return awNext();
          }, ctxOK, ctxOK);
        };
        var connWebM = function() {
          var MR = window[MediaRecorderTxt];
          var onData = "ondataavailable";
          var webmType = "audio/webm; codecs=pcm";
          isWebM = stream.isWebM = Recorder2[ConnectEnableWebM];
          var supportMR = MR && onData in MR.prototype && MR.isTypeSupported(webmType);
          webMTips = supportMR ? "" : $T("VwPd::(此浏览器不支持{1})", 0, MRWebMPCM);
          if (!isUserMedia || !isWebM || !supportMR) {
            connWorklet();
            return;
          }
          var mrNext = function() {
            return isWebM && stream._ra;
          };
          stream._ra = function() {
            if (badInt !== "") {
              clearTimeout(badInt);
              badInt = setTimeout(function() {
                if (mrNext()) {
                  CLog($T("vHnb::{1}未返回任何音频,降级使用{2}", 0, MediaRecorderTxt, audioWorklet), 3);
                  connWorklet();
                }
              }, 500);
            }
          };
          var mrSet = Object.assign({ mimeType: webmType }, Recorder2.ConnectWebMOptions);
          var mr = stream._r = new MR(stream, mrSet);
          var webmData = stream._rd = { sampleRate: ctx[sampleRateTxt] };
          mr[onData] = function(e) {
            var reader = new FileReader();
            reader.onloadend = function() {
              if (mrNext()) {
                var f32arr = WebM_Extract(new Uint8Array(reader.result), webmData);
                if (!f32arr) return;
                if (f32arr == -1) {
                  connWorklet();
                  return;
                }
                if (badInt) {
                  clearTimeout(badInt);
                  badInt = "";
                }
                onReceive(f32arr);
              } else if (!isWebM) {
                CLog($T("O9P7::{1}多余回调", 0, MediaRecorderTxt), 3);
              }
            };
            reader.readAsArrayBuffer(e.data);
          };
          mr.start(~~(bufferSize / 48));
          CLog($T("LMEm::Connect采用{1},设置{2}可恢复使用{3}或老式{4}", 0, MRWebMPCM, RecTxt + "." + ConnectEnableWebM + "=false", audioWorklet, scriptProcessor));
        };
        connWebM();
      };
      var ConnAlive = function(stream) {
        if (stream._na) stream._na();
        if (stream._ra) stream._ra();
      };
      var _Disconn_n = function(stream) {
        stream._na = null;
        if (stream._n) {
          stream._n.port.postMessage({ kill: true });
          stream._n.disconnect();
          stream._n = null;
        }
      };
      var _Disconn_r = function(stream) {
        stream._ra = null;
        if (stream._r) {
          try {
            stream._r.stop();
          } catch (e) {
            CLog("mr stop err", 1, e);
          }
          stream._r = null;
        }
      };
      var Disconnect = function(streamStore) {
        streamStore = streamStore || Recorder2;
        var isGlobal = streamStore == Recorder2;
        var stream = streamStore.Stream;
        if (stream) {
          if (stream._m) {
            stream._m.disconnect();
            stream._m = null;
          }
          if (!stream._RC && stream._c) {
            Recorder2.CloseNewCtx(stream._c);
          }
          stream._RC = null;
          stream._c = null;
          if (stream._d) {
            StopS_(stream._d.stream);
            stream._d = null;
          }
          if (stream._p) {
            stream._p.disconnect();
            stream._p.onaudioprocess = stream._p = null;
          }
          _Disconn_n(stream);
          _Disconn_r(stream);
          if (isGlobal) {
            StopS_(stream);
          }
        }
        streamStore.Stream = 0;
      };
      var StopS_ = Recorder2.StopS_ = function(stream) {
        var tracks = stream.getTracks && stream.getTracks() || stream.audioTracks || [];
        for (var i = 0; i < tracks.length; i++) {
          var track = tracks[i];
          track.stop && track.stop();
        }
        stream.stop && stream.stop();
      };
      Recorder2.SampleData = function(pcmDatas, pcmSampleRate, newSampleRate, prevChunkInfo, option) {
        var Txt = "SampleData";
        prevChunkInfo || (prevChunkInfo = {});
        var index = prevChunkInfo.index || 0;
        var offset = prevChunkInfo.offset || 0;
        var filter = prevChunkInfo.filter;
        if (filter && filter.fn && filter.sr != pcmSampleRate) {
          filter = null;
          CLog($T("d48C::{1}的filter采样率变了,重设滤波", 0, Txt), 3);
        }
        if (!filter) {
          var freq = newSampleRate > pcmSampleRate * 3 / 4 ? 0 : newSampleRate / 2 * 3 / 4;
          filter = { fn: freq ? Recorder2.IIRFilter(true, pcmSampleRate, freq) : 0 };
        }
        filter.sr = pcmSampleRate;
        var filterFn = filter.fn;
        var frameNext = prevChunkInfo.frameNext || [];
        option || (option = {});
        var frameSize = option.frameSize || 1;
        if (option.frameType) {
          frameSize = option.frameType == "mp3" ? 1152 : 1;
        }
        var nLen = pcmDatas.length;
        if (index > nLen + 1) {
          CLog($T("tlbC::{1}似乎传入了未重置chunk {2}", 0, Txt, index + ">" + nLen), 3);
        }
        var size = 0;
        for (var i = index; i < nLen; i++) {
          size += pcmDatas[i].length;
        }
        size = Math.max(0, size - Math.floor(offset));
        var step = pcmSampleRate / newSampleRate;
        if (step > 1) {
          size = Math.floor(size / step);
        } else {
          step = 1;
          newSampleRate = pcmSampleRate;
        }
        size += frameNext.length;
        var res = new Int16Array(size);
        var idx = 0;
        for (var i = 0; i < frameNext.length; i++) {
          res[idx] = frameNext[i];
          idx++;
        }
        for (; index < nLen; index++) {
          var o = pcmDatas[index];
          var i = offset, il = o.length;
          var F = filterFn && filterFn.Embed, F1 = 0, F2 = 0, Fx = 0, Fy = 0;
          for (var i0 = 0, i2 = 0; i0 < il; i0++, i2++) {
            if (i2 < il) {
              if (F) {
                Fx = o[i2];
                Fy = F.b0 * Fx + F.b1 * F.x1 + F.b0 * F.x2 - F.a1 * F.y1 - F.a2 * F.y2;
                F.x2 = F.x1;
                F.x1 = Fx;
                F.y2 = F.y1;
                F.y1 = Fy;
              } else {
                Fy = filterFn ? filterFn(o[i2]) : o[i2];
              }
            }
            F1 = F2;
            F2 = Fy;
            if (i2 == 0) {
              i0--;
              continue;
            }
            var before = Math.floor(i);
            if (i0 != before) continue;
            var after = Math.ceil(i);
            var atPoint = i - before;
            var beforeVal = F1;
            var afterVal = after < il ? F2 : beforeVal;
            var val = beforeVal + (afterVal - beforeVal) * atPoint;
            if (val > 32767) val = 32767;
            else if (val < -32768) val = -32768;
            res[idx] = val;
            idx++;
            i += step;
          }
          offset = Math.max(0, i - il);
        }
        frameNext = null;
        var frameNextSize = res.length % frameSize;
        if (frameNextSize > 0) {
          var u8Pos = (res.length - frameNextSize) * 2;
          frameNext = new Int16Array(res.buffer.slice(u8Pos));
          res = new Int16Array(res.buffer.slice(0, u8Pos));
        }
        return {
          index,
          offset,
          filter,
          frameNext,
          sampleRate: newSampleRate,
          data: res
        };
      };
      Recorder2.IIRFilter = function(useLowPass, sampleRate, freq) {
        var ov = 2 * Math.PI * freq / sampleRate;
        var sn = Math.sin(ov);
        var cs = Math.cos(ov);
        var alpha = sn / 2;
        var a0 = 1 + alpha;
        var a1 = -2 * cs / a0;
        var a2 = (1 - alpha) / a0;
        if (useLowPass) {
          var b0 = (1 - cs) / 2 / a0;
          var b1 = (1 - cs) / a0;
        } else {
          var b0 = (1 + cs) / 2 / a0;
          var b1 = -(1 + cs) / a0;
        }
        var x1 = 0, x2 = 0, y = 0, y1 = 0, y2 = 0;
        var fn = function(x) {
          y = b0 * x + b1 * x1 + b0 * x2 - a1 * y1 - a2 * y2;
          x2 = x1;
          x1 = x;
          y2 = y1;
          y1 = y;
          return y;
        };
        fn.Embed = { x1: 0, x2: 0, y1: 0, y2: 0, b0, b1, a1, a2 };
        return fn;
      };
      Recorder2.PowerLevel = function(pcmAbsSum, pcmLength) {
        var power = pcmAbsSum / pcmLength || 0;
        var level;
        if (power < 1251) {
          level = Math.round(power / 1250 * 10);
        } else {
          level = Math.round(Math.min(100, Math.max(0, (1 + Math.log(power / 1e4) / Math.log(10)) * 100)));
        }
        return level;
      };
      Recorder2.PowerDBFS = function(maxSample) {
        var val = Math.max(0.1, maxSample || 0), Pref = 32767;
        val = Math.min(val, Pref);
        val = 20 * Math.log(val / Pref) / Math.log(10);
        return Math.max(-100, Math.round(val));
      };
      Recorder2.CLog = function(msg, err) {
        if (typeof console != "object") return;
        var now = /* @__PURE__ */ new Date();
        var t = ("0" + now.getMinutes()).substr(-2) + ":" + ("0" + now.getSeconds()).substr(-2) + "." + ("00" + now.getMilliseconds()).substr(-3);
        var recID = this && this.envIn && this.envCheck && this.id;
        var arr = ["[" + t + " " + RecTxt + (recID ? ":" + recID : "") + "]" + msg];
        var a = arguments, cwe = Recorder2.CLog;
        var i = 2, fn = cwe.log || console.log;
        if (IsNum(err)) {
          fn = err == 1 ? cwe.error || console.error : err == 3 ? cwe.warn || console.warn : fn;
        } else {
          i = 1;
        }
        for (; i < a.length; i++) {
          arr.push(a[i]);
        }
        if (IsLoser) {
          fn && fn("[IsLoser]" + arr[0], arr.length > 1 ? arr : "");
        } else {
          fn.apply(console, arr);
        }
      };
      var CLog = function() {
        Recorder2.CLog.apply(this, arguments);
      };
      var IsLoser = true;
      try {
        IsLoser = !console.log.apply;
      } catch (e) {
      }
      var ID = 0;
      function initFn(set) {
        var This = this;
        This.id = ++ID;
        Traffic();
        var o = {
          type: "mp3",
          onProcess: NOOP
          //fn(buffers,powerLevel,bufferDuration,bufferSampleRate,newBufferIdx,asyncEnd) buffers=[[Int16,...],...]:缓冲的PCM数据,为从开始录音到现在的所有pcm片段;powerLevel:当前缓冲的音量级别0-100,bufferDuration:已缓冲时长,bufferSampleRate:缓冲使用的采样率(当type支持边录边转码(Worker)时,此采样率和设置的采样率相同,否则不一定相同);newBufferIdx:本次回调新增的buffer起始索引;asyncEnd:fn() 如果onProcess是异步的(返回值为true时),处理完成时需要调用此回调,如果不是异步的请忽略此参数,此方法回调时必须是真异步(不能真异步时需用setTimeout包裹)。onProcess返回值:如果返回true代表开启异步模式,在某些大量运算的场合异步是必须的,必须在异步处理完成时调用asyncEnd(不能真异步时需用setTimeout包裹),在onProcess执行后新增的buffer会全部替换成空数组,因此本回调开头应立即将newBufferIdx到本次回调结尾位置的buffer全部保存到另外一个数组内,处理完成后写回buffers中本次回调的结尾位置。
          //*******高级设置******
          //,sourceStream:MediaStream Object
          //可选直接提供一个媒体流,从这个流中录制、实时处理音频数据(当前Recorder实例独享此流);不提供时为普通的麦克风录音,由getUserMedia提供音频流(所有Recorder实例共享同一个流)
          //比如:audio、video标签dom节点的captureStream方法(实验特性,不同浏览器支持程度不高)返回的流;WebRTC中的remote流;自己创建的流等
          //注意:流内必须至少存在一条音轨(Audio Track),比如audio标签必须等待到可以开始播放后才会有音轨,否则open会失败
          //,runningContext:AudioContext
          //可选提供一个state为running状态的AudioContext对象(ctx);默认会在rec.open时自动创建一个新的ctx,无用户操作(触摸、点击等)时调用rec.open的ctx.state可能为suspended,会在rec.start时尝试进行ctx.resume,如果也无用户操作ctx.resume可能不会恢复成running状态(目前仅iOS上有此兼容性问题),导致无法去读取媒体流,这时请提前在用户操作时调用Recorder.GetContext(true)来得到一个running状态AudioContext(用完需调用CloseNewCtx(ctx)关闭)
          //,audioTrackSet:{ deviceId:"",groupId:"", autoGainControl:true, echoCancellation:true, noiseSuppression:true }
          //普通麦克风录音时getUserMedia方法的audio配置参数,比如指定设备id,回声消除、降噪开关;注意:提供的任何配置值都不一定会生效
          //由于麦克风是全局共享的,所以新配置后需要close掉以前的再重新open
          //更多参考: https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints
          //,disableEnvInFix:false 内部参数,禁用设备卡顿时音频输入丢失补偿功能
          //,takeoffEncodeChunk:NOOP //fn(chunkBytes) chunkBytes=[Uint8,...]:实时编码环境下接管编码器输出,当编码器实时编码出一块有效的二进制音频数据时实时回调此方法;参数为二进制的Uint8Array,就是编码出来的音频数据片段,所有的chunkBytes拼接在一起即为完整音频。本实现的想法最初由QQ2543775048提出
          //当提供此回调方法时,将接管编码器的数据输出,编码器内部将放弃存储生成的音频数据;如果当前编码器或环境不支持实时编码处理,将在open时直接走fail逻辑
          //因此提供此回调后调用stop方法将无法获得有效的音频数据,因为编码器内没有音频数据,因此stop时返回的blob将是一个字节长度为0的blob
          //大部分录音格式编码器都支持实时编码(边录边转码),比如mp3格式:会实时的将编码出来的mp3片段通过此方法回调,所有的chunkBytes拼接到一起即为完整的mp3,此种拼接的结果比mock方法实时生成的音质更加,因为天然避免了首尾的静默
          //不支持实时编码的录音格式不可以提供此回调(wav格式不支持,因为wav文件头中需要提供文件最终长度),提供了将在open时直接走fail逻辑
        };
        for (var k2 in set) {
          o[k2] = set[k2];
        }
        This.set = o;
        var vB = o[bitRateTxt], vS = o[sampleRateTxt];
        if (vB && !IsNum(vB) || vS && !IsNum(vS)) {
          This.CLog($T.G("IllegalArgs-1", [$T("VtS4::{1}和{2}必须是数值", 0, sampleRateTxt, bitRateTxt)]), 1, set);
        }
        o[bitRateTxt] = +vB || 16;
        o[sampleRateTxt] = +vS || 16e3;
        This.state = 0;
        This._S = 9;
        This.Sync = { O: 9, C: 9 };
      }
      Recorder2.Sync = {
        /*open*/
        O: 9,
        /*close*/
        C: 9
      };
      Recorder2.prototype = initFn.prototype = {
        CLog,
        _streamStore: function() {
          if (this.set.sourceStream) {
            return this;
          } else {
            return Recorder2;
          }
        },
        _streamCtx: function() {
          var m2 = this._streamStore().Stream;
          return m2 && m2._c;
        },
        open: function(True, False) {
          var This = this, set = This.set, streamStore = This._streamStore(), newCtx = 0;
          True = True || NOOP;
          var failCall = function(errMsg, isUserNotAllow) {
            isUserNotAllow = !!isUserNotAllow;
            This.CLog($T("5tWi::录音open失败:") + errMsg + ",isUserNotAllow:" + isUserNotAllow, 1);
            if (newCtx) Recorder2.CloseNewCtx(newCtx);
            False && False(errMsg, isUserNotAllow);
          };
          This._streamTag = getUserMediaTxt;
          var ok = function() {
            This.CLog("open ok, id:" + This.id + " stream:" + This._streamTag);
            True();
            This._SO = 0;
          };
          var Lock = streamStore.Sync;
          var lockOpen = ++Lock.O, lockClose = Lock.C;
          This._O = This._O_ = lockOpen;
          This._SO = This._S;
          var lockFail = function() {
            if (lockClose != Lock.C || !This._O) {
              var err = $T("dFm8::open被取消");
              if (lockOpen == Lock.O) {
                This.close();
              } else {
                err = $T("VtJO::open被中断");
              }
              failCall(err);
              return true;
            }
          };
          if (!isBrowser) {
            failCall($T.G("NonBrowser-1", ["open"]) + $T("EMJq::,可尝试使用RecordApp解决方案") + "(" + GitUrl + "/tree/master/app-support-sample)");
            return;
          }
          var checkMsg = This.envCheck({ envName: "H5", canProcess: true });
          if (checkMsg) {
            failCall($T("A5bm::不能录音:") + checkMsg);
            return;
          }
          if (set.sourceStream) {
            This._streamTag = "set.sourceStream";
            if (!Recorder2.GetContext()) {
              failCall($T("1iU7::不支持此浏览器从流中获取录音"));
              return;
            }
            Disconnect(streamStore);
            var stream = This.Stream = set.sourceStream;
            stream._RC = set.runningContext;
            stream._call = {};
            try {
              Connect(streamStore);
            } catch (e) {
              Disconnect(streamStore);
              failCall($T("BTW2::从流中打开录音失败:") + e.message);
              return;
            }
            ok();
            return;
          }
          var codeFail = function(code, msg) {
            try {
              window.top.a;
            } catch (e) {
              failCall($T("Nclz::无权录音(跨域,请尝试给iframe添加麦克风访问策略,如{1})", 0, 'allow="camera;microphone"'));
              return;
            }
            if (/Permission|Allow/i.test(code)) {
              failCall($T("gyO5::用户拒绝了录音权限"), true);
            } else if (window.isSecureContext === false) {
              failCall($T("oWNo::浏览器禁止不安全页面录音,可开启https解决"));
            } else if (/Found/i.test(code)) {
              failCall(msg + $T("jBa9::,无可用麦克风"));
            } else {
              failCall(msg);
            }
          };
          if (Recorder2.IsOpen()) {
            ok();
            return;
          }
          if (!Recorder2.Support()) {
            codeFail("", $T("COxc::此浏览器不支持录音"));
            return;
          }
          var ctx = set.runningContext;
          if (!ctx) ctx = newCtx = Recorder2.GetContext(true);
          var f1 = function(stream2) {
            setTimeout(function() {
              stream2._call = {};
              var oldStream = Recorder2.Stream;
              if (oldStream) {
                Disconnect();
                stream2._call = oldStream._call;
              }
              Recorder2.Stream = stream2;
              stream2._c = ctx;
              stream2._RC = set.runningContext;
              if (lockFail()) return;
              if (Recorder2.IsOpen()) {
                if (oldStream) This.CLog($T("upb8::发现同时多次调用open"), 1);
                Connect(streamStore, 1);
                ok();
              } else {
                failCall($T("Q1GA::录音功能无效:无音频流"));
              }
            }, 100);
          };
          var f2 = function(e) {
            var code = e.name || e.message || e.code + ":" + e;
            This.CLog($T("xEQR::请求录音权限错误"), 1, e);
            codeFail(code, $T("bDOG::无法录音:") + code);
          };
          var trackSet = set.audioTrackSet || {};
          trackSet[sampleRateTxt] = ctx[sampleRateTxt];
          var mSet = { audio: trackSet };
          try {
            var pro = Recorder2.Scope[getUserMediaTxt](mSet, f1, f2);
          } catch (e) {
            This.CLog(getUserMediaTxt, 3, e);
            mSet = { audio: true };
            pro = Recorder2.Scope[getUserMediaTxt](mSet, f1, f2);
          }
          This.CLog(getUserMediaTxt + "(" + JSON.stringify(mSet) + ") " + CtxState(ctx) + $T("RiWe::,未配置noiseSuppression和echoCancellation时浏览器可能会自动打开降噪和回声消除,移动端可能会降低系统播放音量(关闭录音后可恢复),请参阅文档中audioTrackSet配置") + "(" + GitUrl + ") LM:" + LM + " UA:" + navigator.userAgent);
          if (pro && pro.then) {
            pro.then(f1)[CatchTxt](f2);
          }
        },
        close: function(call) {
          call = call || NOOP;
          var This = this, streamStore = This._streamStore();
          This._stop();
          var sTag = " stream:" + This._streamTag;
          var Lock = streamStore.Sync;
          This._O = 0;
          if (This._O_ != Lock.O) {
            This.CLog($T("hWVz::close被忽略(因为同时open了多个rec,只有最后一个会真正close)") + sTag, 3);
            call();
            return;
          }
          Lock.C++;
          Disconnect(streamStore);
          This.CLog("close," + sTag);
          call();
        },
        mock: function(pcmData, pcmSampleRate) {
          var This = this;
          This._stop();
          This.isMock = 1;
          This.mockEnvInfo = null;
          This.buffers = [pcmData];
          This.recSize = pcmData.length;
          This._setSrcSR(pcmSampleRate);
          This._streamTag = "mock";
          return This;
        },
        _setSrcSR: function(sampleRate) {
          var This = this, set = This.set;
          var setSr = set[sampleRateTxt];
          if (setSr > sampleRate) {
            set[sampleRateTxt] = sampleRate;
          } else {
            setSr = 0;
          }
          This[srcSampleRateTxt] = sampleRate;
          This.CLog(srcSampleRateTxt + ": " + sampleRate + " set." + sampleRateTxt + ": " + set[sampleRateTxt] + (setSr ? " " + $T("UHvm::忽略") + ": " + setSr : ""), setSr ? 3 : 0);
        },
        envCheck: function(envInfo) {
          var errMsg, This = this, set = This.set;
          var tag = "CPU_BE";
          if (!errMsg && !Recorder2[tag] && typeof Int8Array == "function" && !new Int8Array(new Int32Array([1]).buffer)[0]) {
            Traffic(tag);
            errMsg = $T("Essp::不支持{1}架构", 0, tag);
          }
          if (!errMsg) {
            var type = set.type, hasFn = This[type + "_envCheck"];
            if (set.takeoffEncodeChunk) {
              if (!hasFn) {
                errMsg = $T("2XBl::{1}类型不支持设置takeoffEncodeChunk", 0, type) + (This[type] ? "" : $T("LG7e::(未加载编码器)"));
              } else if (!envInfo.canProcess) {
                errMsg = $T("7uMV::{1}环境不支持实时处理", 0, envInfo.envName);
              }
            }
            if (!errMsg && hasFn) {
              errMsg = This[type + "_envCheck"](envInfo, set);
            }
          }
          return errMsg || "";
        },
        envStart: function(mockEnvInfo, sampleRate) {
          var This = this, set = This.set;
          This.isMock = mockEnvInfo ? 1 : 0;
          This.mockEnvInfo = mockEnvInfo;
          This.buffers = [];
          This.recSize = 0;
          if (mockEnvInfo) {
            This._streamTag = "env$" + mockEnvInfo.envName;
          }
          This.state = 1;
          This.envInLast = 0;
          This.envInFirst = 0;
          This.envInFix = 0;
          This.envInFixTs = [];
          This._setSrcSR(sampleRate);
          This.engineCtx = 0;
          if (This[set.type + "_start"]) {
            var engineCtx = This.engineCtx = This[set.type + "_start"](set);
            if (engineCtx) {
              engineCtx.pcmDatas = [];
              engineCtx.pcmSize = 0;
            }
          }
        },
        envResume: function() {
          this.envInFixTs = [];
        },
        envIn: function(pcm, sum) {
          var This = this, set = This.set, engineCtx = This.engineCtx;
          if (This.state != 1) {
            if (!This.state) This.CLog("envIn at state=0", 3);
            return;
          }
          var bufferSampleRate = This[srcSampleRateTxt];
          var size = pcm.length;
          var powerLevel = Recorder2.PowerLevel(sum, size);
          var buffers = This.buffers;
          var bufferFirstIdx = buffers.length;
          buffers.push(pcm);
          var buffersThis = buffers;
          var bufferFirstIdxThis = bufferFirstIdx;
          var now = Date.now();
          var pcmTime = Math.round(size / bufferSampleRate * 1e3);
          This.envInLast = now;
          if (This.buffers.length == 1) {
            This.envInFirst = now - pcmTime;
          }
          var envInFixTs = This.envInFixTs;
          envInFixTs.splice(0, 0, { t: now, d: pcmTime });
          var tsInStart = now, tsPcm = 0;
          for (var i = 0; i < envInFixTs.length; i++) {
            var o = envInFixTs[i];
            if (now - o.t > 3e3) {
              envInFixTs.length = i;
              break;
            }
            tsInStart = o.t;
            tsPcm += o.d;
          }
          var tsInPrev = envInFixTs[1];
          var tsIn = now - tsInStart;
          var lost = tsIn - tsPcm;
          if (lost > tsIn / 3 && (tsInPrev && tsIn > 1e3 || envInFixTs.length >= 6)) {
            var addTime = now - tsInPrev.t - pcmTime;
            if (addTime > pcmTime / 5) {
              var fixOpen = !set.disableEnvInFix;
              This.CLog("[" + now + "]" + i18n.get(fixOpen ? $T("4Kfd::补偿{1}ms", 1) : $T("bM5i::未补偿{1}ms", 1), [addTime]), 3);
              This.envInFix += addTime;
              if (fixOpen) {
                var addPcm = new Int16Array(addTime * bufferSampleRate / 1e3);
                size += addPcm.length;
                buffers.push(addPcm);
              }
            }
          }
          var sizeOld = This.recSize, addSize = size;
          var bufferSize = sizeOld + addSize;
          This.recSize = bufferSize;
          if (engineCtx) {
            var chunkInfo = Recorder2.SampleData(buffers, bufferSampleRate, set[sampleRateTxt], engineCtx.chunkInfo);
            engineCtx.chunkInfo = chunkInfo;
            sizeOld = engineCtx.pcmSize;
            addSize = chunkInfo.data.length;
            bufferSize = sizeOld + addSize;
            engineCtx.pcmSize = bufferSize;
            buffers = engineCtx.pcmDatas;
            bufferFirstIdx = buffers.length;
            buffers.push(chunkInfo.data);
            bufferSampleRate = chunkInfo[sampleRateTxt];
          }
          var duration = Math.round(bufferSize / bufferSampleRate * 1e3);
          var bufferNextIdx = buffers.length;
          var bufferNextIdxThis = buffersThis.length;
          var asyncEnd = function() {
            var num = asyncBegin ? 0 : -addSize;
            var hasClear2 = buffers[0] == null;
            for (var i2 = bufferFirstIdx; i2 < bufferNextIdx; i2++) {
              var buffer = buffers[i2];
              if (buffer == null) {
                hasClear2 = 1;
              } else {
                num += buffer.length;
                if (engineCtx && buffer.length) {
                  This[set.type + "_encode"](engineCtx, buffer);
                }
              }
            }
            if (hasClear2 && engineCtx) {
              var i2 = bufferFirstIdxThis;
              if (buffersThis[0]) {
                i2 = 0;
              }
              for (; i2 < bufferNextIdxThis; i2++) {
                buffersThis[i2] = null;
              }
            }
            if (hasClear2) {
              num = asyncBegin ? addSize : 0;
              buffers[0] = null;
            }
            if (engineCtx) {
              engineCtx.pcmSize += num;
            } else {
              This.recSize += num;
            }
          };
          var asyncBegin = 0, procTxt = "rec.set.onProcess";
          try {
            asyncBegin = set.onProcess(buffers, powerLevel, duration, bufferSampleRate, bufferFirstIdx, asyncEnd);
          } catch (e) {
            console.error(procTxt + $T("gFUF::回调出错是不允许的,需保证不会抛异常"), e);
          }
          var slowT = Date.now() - now;
          if (slowT > 10 && This.envInFirst - now > 1e3) {
            This.CLog(procTxt + $T("2ghS::低性能,耗时{1}ms", 0, slowT), 3);
          }
          if (asyncBegin === true) {
            var hasClear = 0;
            for (var i = bufferFirstIdx; i < bufferNextIdx; i++) {
              if (buffers[i] == null) {
                hasClear = 1;
              } else {
                buffers[i] = new Int16Array(0);
              }
            }
            if (hasClear) {
              This.CLog($T("ufqH::未进入异步前不能清除buffers"), 3);
            } else {
              if (engineCtx) {
                engineCtx.pcmSize -= addSize;
              } else {
                This.recSize -= addSize;
              }
            }
          } else {
            asyncEnd();
          }
        },
        start: function() {
          var This = this;
          var isOpen = 1;
          if (This.set.sourceStream) {
            if (!This.Stream) {
              isOpen = 0;
            }
          } else if (!Recorder2.IsOpen()) {
            isOpen = 0;
          }
          if (!isOpen) {
            This.CLog($T("6WmN::start失败:未open"), 1);
            return;
          }
          var ctx = This._streamCtx();
          This.CLog($T("kLDN::start 开始录音,") + CtxState(ctx) + " stream:" + This._streamTag);
          This._stop();
          This.envStart(null, ctx[sampleRateTxt]);
          This.state = 3;
          if (This._SO && This._SO + 1 != This._S) {
            This.CLog($T("Bp2y::start被中断"), 3);
            return;
          }
          This._SO = 0;
          var end = function() {
            if (This.state == 3) {
              This.state = 1;
              This.resume();
            }
          };
          var tag = "AudioContext resume: ";
          ResumeCtx(ctx, function(runC) {
            runC && This.CLog(tag + "wait...");
            return This.state == 3;
          }, function(runC) {
            runC && This.CLog(tag + ctx.state);
            end();
          }, function(err) {
            This.CLog(tag + ctx.state + $T("upkE::,可能无法录音:") + err, 1);
            end();
          });
        },
        pause: function() {
          var This = this, stream = This._streamStore().Stream;
          if (This.state) {
            This.state = 2;
            This.CLog("pause");
            if (stream) delete stream._call[This.id];
          }
        },
        resume: function() {
          var This = this, stream = This._streamStore().Stream;
          var tag = "resume", tag3 = tag + "(wait ctx)";
          if (This.state == 3) {
            This.CLog(tag3);
          } else if (This.state) {
            This.state = 1;
            This.CLog(tag);
            This.envResume();
            if (stream) {
              stream._call[This.id] = function(pcm, sum) {
                if (This.state == 1) {
                  This.envIn(pcm, sum);
                }
              };
              ConnAlive(stream);
            }
            var ctx = This._streamCtx();
            if (ctx) {
              ResumeCtx(ctx, function(runC) {
                runC && This.CLog(tag3 + "...");
                return This.state == 1;
              }, function(runC) {
                runC && This.CLog(tag3 + ctx.state);
                ConnAlive(stream);
              }, function(err) {
                This.CLog(tag3 + ctx.state + "[err]" + err, 1);
              });
            }
          }
        },
        _stop: function(keepEngine) {
          var This = this, set = This.set;
          if (!This.isMock) {
            This._S++;
          }
          if (This.state) {
            This.pause();
            This.state = 0;
          }
          if (!keepEngine && This[set.type + "_stop"]) {
            This[set.type + "_stop"](This.engineCtx);
            This.engineCtx = 0;
          }
        },
        stop: function(True, False, autoClose) {
          var This = this, set = This.set, t1;
          var envInMS = This.envInLast - This.envInFirst, envInLen = envInMS && This.buffers.length;
          This.CLog($T("Xq4s::stop 和start时差:") + (envInMS ? envInMS + "ms " + $T("3CQP::补偿:") + This.envInFix + "ms envIn:" + envInLen + " fps:" + (envInLen / envInMS * 1e3).toFixed(1) : "-") + " stream:" + This._streamTag + " (" + GitUrl + ") LM:" + LM);
          var end = function() {
            This._stop();
            if (autoClose) {
              This.close();
            }
          };
          var err = function(msg) {
            This.CLog($T("u8JG::结束录音失败:") + msg, 1);
            False && False(msg);
            end();
          };
          var ok = function(blob, mime, duration2) {
            var tBlob = "blob", tABuf = "arraybuffer", tDT = "dataType", tDDT = "DefaultDataType";
            var dType = This[tDT] || Recorder2[tDDT] || tBlob, dTag = tDT + "=" + dType;
            var isAB = blob instanceof ArrayBuffer, dErr = 0;
            var dLen = isAB ? blob.byteLength : blob.size;
            if (dType == tABuf) {
              if (!isAB) dErr = 1;
            } else if (dType == tBlob) {
              if (typeof Blob != "function") {
                dErr = $T.G("NonBrowser-1", [dTag]) + $T("1skY::,请设置{1}", 0, RecTxt + "." + tDDT + '="' + tABuf + '"');
              } else {
                if (isAB) blob = new Blob([blob], { type: mime });
                if (!(blob instanceof Blob)) dErr = 1;
                mime = blob.type || mime;
              }
            } else {
              dErr = $T.G("NotSupport-1", [dTag]);
            }
            This.CLog($T("Wv7l::结束录音 编码花{1}ms 音频时长{2}ms 文件大小{3}b", 0, Date.now() - t1, duration2, dLen) + " " + dTag + "," + mime);
            if (dErr) {
              err(dErr != 1 ? dErr : $T("Vkbd::{1}编码器返回的不是{2}", 0, set.type, dType) + ", " + dTag);
              return;
            }
            if (set.takeoffEncodeChunk) {
              This.CLog($T("QWnr::启用takeoffEncodeChunk后stop返回的blob长度为0不提供音频数据"), 3);
            } else if (dLen < Math.max(50, duration2 / 5)) {
              err($T("Sz2H::生成的{1}无效", 0, set.type));
              return;
            }
            True && True(blob, duration2, mime);
            end();
          };
          if (!This.isMock) {
            var isCtxWait = This.state == 3;
            if (!This.state || isCtxWait) {
              err($T("wf9t::未开始录音") + (isCtxWait ? $T("Dl2c::,开始录音前无用户交互导致AudioContext未运行") : ""));
              return;
            }
          }
          This._stop(true);
          var size = This.recSize;
          if (!size) {
            err($T("Ltz3::未采集到录音"));
            return;
          }
          if (!This[set.type]) {
            err($T("xGuI::未加载{1}编码器,请尝试到{2}的src/engine内找到{1}的编码器并加载", 0, set.type, RecTxt));
            return;
          }
          if (This.isMock) {
            var checkMsg = This.envCheck(This.mockEnvInfo || { envName: "mock", canProcess: false });
            if (checkMsg) {
              err($T("AxOH::录音错误:") + checkMsg);
              return;
            }
          }
          var engineCtx = This.engineCtx;
          if (This[set.type + "_complete"] && engineCtx) {
            var duration = Math.round(engineCtx.pcmSize / set[sampleRateTxt] * 1e3);
            t1 = Date.now();
            This[set.type + "_complete"](engineCtx, function(blob, mime) {
              ok(blob, mime, duration);
            }, err);
            return;
          }
          t1 = Date.now();
          if (!This.buffers[0]) {
            err($T("xkKd::音频buffers被释放"));
            return;
          }
          var chunk = Recorder2.SampleData(This.buffers, This[srcSampleRateTxt], set[sampleRateTxt]);
          set[sampleRateTxt] = chunk[sampleRateTxt];
          var res = chunk.data;
          var duration = Math.round(res.length / set[sampleRateTxt] * 1e3);
          This.CLog($T("CxeT::采样:{1} 花:{2}ms", 0, size + "->" + res.length, Date.now() - t1));
          setTimeout(function() {
            t1 = Date.now();
            This[set.type](res, function(blob, mime) {
              ok(blob, mime, duration);
            }, function(msg) {
              err(msg);
            });
          });
        }
      };
      var WebM_Extract = function(inBytes, scope) {
        if (!scope.pos) {
          scope.pos = [0];
          scope.tracks = {};
          scope.bytes = [];
        }
        var tracks = scope.tracks, position = [scope.pos[0]];
        var endPos = function() {
          scope.pos[0] = position[0];
        };
        var sBL = scope.bytes.length;
        var bytes = new Uint8Array(sBL + inBytes.length);
        bytes.set(scope.bytes);
        bytes.set(inBytes, sBL);
        scope.bytes = bytes;
        if (!scope._ht) {
          readMatroskaVInt(bytes, position);
          readMatroskaBlock(bytes, position);
          if (!BytesEq(readMatroskaVInt(bytes, position), [24, 83, 128, 103])) {
            return;
          }
          readMatroskaVInt(bytes, position);
          while (position[0] < bytes.length) {
            var eid0 = readMatroskaVInt(bytes, position);
            var bytes0 = readMatroskaBlock(bytes, position);
            var pos0 = [0], audioIdx = 0;
            if (!bytes0) return;
            if (BytesEq(eid0, [22, 84, 174, 107])) {
              while (pos0[0] < bytes0.length) {
                var eid1 = readMatroskaVInt(bytes0, pos0);
                var bytes1 = readMatroskaBlock(bytes0, pos0);
                var pos1 = [0], track = { channels: 0, sampleRate: 0 };
                if (BytesEq(eid1, [174])) {
                  while (pos1[0] < bytes1.length) {
                    var eid2 = readMatroskaVInt(bytes1, pos1);
                    var bytes2 = readMatroskaBlock(bytes1, pos1);
                    var pos2 = [0];
                    if (BytesEq(eid2, [215])) {
                      var val = BytesInt(bytes2);
                      track.number = val;
                      tracks[val] = track;
                    } else if (BytesEq(eid2, [131])) {
                      var val = BytesInt(bytes2);
                      if (val == 1) track.type = "video";
                      else if (val == 2) {
                        track.type = "audio";
                        if (!audioIdx) scope.track0 = track;
                        track.idx = audioIdx++;
                      } else track.type = "Type-" + val;
                    } else if (BytesEq(eid2, [134])) {
                      var str = "";
                      for (var i = 0; i < bytes2.length; i++) {
                        str += String.fromCharCode(bytes2[i]);
                      }
                      track.codec = str;
                    } else if (BytesEq(eid2, [225])) {
                      while (pos2[0] < bytes2.length) {
                        var eid3 = readMatroskaVInt(bytes2, pos2);
                        var bytes3 = readMatroskaBlock(bytes2, pos2);
                        if (BytesEq(eid3, [181])) {
                          var val = 0, arr = new Uint8Array(bytes3.reverse()).buffer;
                          if (bytes3.length == 4) val = new Float32Array(arr)[0];
                          else if (bytes3.length == 8) val = new Float64Array(arr)[0];
                          else CLog("WebM Track !Float", 1, bytes3);
                          track[sampleRateTxt] = Math.round(val);
                        } else if (BytesEq(eid3, [98, 100])) track.bitDepth = BytesInt(bytes3);
                        else if (BytesEq(eid3, [159])) track.channels = BytesInt(bytes3);
                      }
                    }
                  }
                }
              }
              scope._ht = 1;
              CLog("WebM Tracks", tracks);
              endPos();
              break;
            }
          }
        }
        var track0 = scope.track0;
        if (!track0) return;
        if (track0.bitDepth == 16 && /FLOAT/i.test(track0.codec)) {
          track0.bitDepth = 32;
          CLog("WebM 16->32 bit", 3);
        }
        if (track0[sampleRateTxt] != scope[sampleRateTxt] || track0.bitDepth != 32 || track0.channels < 1 || !/(\b|_)PCM\b/i.test(track0.codec)) {
          scope.bytes = [];
          if (!scope.bad) CLog("WebM Track Unexpected", 3, scope);
          scope.bad = 1;
          return -1;
        }
        var datas = [], dataLen = 0;
        while (position[0] < bytes.length) {
          var eid1 = readMatroskaVInt(bytes, position);
          var bytes1 = readMatroskaBlock(bytes, position);
          if (!bytes1) break;
          if (BytesEq(eid1, [163])) {
            var trackNo = bytes1[0] & 15;
            var track = tracks[trackNo];
            if (!track) {
              CLog("WebM !Track" + trackNo, 1, tracks);
            } else if (track.idx === 0) {
              var u8arr = new Uint8Array(bytes1.length - 4);
              for (var i = 4; i < bytes1.length; i++) {
                u8arr[i - 4] = bytes1[i];
              }
              datas.push(u8arr);
              dataLen += u8arr.length;
            }
          }
          endPos();
        }
        if (dataLen) {
          var more = new Uint8Array(bytes.length - scope.pos[0]);
          more.set(bytes.subarray(scope.pos[0]));
          scope.bytes = more;
          scope.pos[0] = 0;
          var u8arr = new Uint8Array(dataLen);
          for (var i = 0, i2 = 0; i < datas.length; i++) {
            u8arr.set(datas[i], i2);
            i2 += datas[i].length;
          }
          var arr = new Float32Array(u8arr.buffer);
          if (track0.channels > 1) {
            var arr2 = [];
            for (var i = 0; i < arr.length; ) {
              arr2.push(arr[i]);
              i += track0.channels;
            }
            arr = new Float32Array(arr2);
          }
          return arr;
        }
      };
      var BytesEq = function(bytes1, bytes2) {
        if (!bytes1 || bytes1.length != bytes2.length) return false;
        if (bytes1.length == 1) return bytes1[0] == bytes2[0];
        for (var i = 0; i < bytes1.length; i++) {
          if (bytes1[i] != bytes2[i]) return false;
        }
        return true;
      };
      var BytesInt = function(bytes) {
        var s = "";
        for (var i = 0; i < bytes.length; i++) {
          var n2 = bytes[i];
          s += (n2 < 16 ? "0" : "") + n2.toString(16);
        }
        return parseInt(s, 16) || 0;
      };
      var readMatroskaVInt = function(arr, pos, trim) {
        var i = pos[0];
        if (i >= arr.length) return;
        var b0 = arr[i], b2 = ("0000000" + b0.toString(2)).substr(-8);
        var m2 = /^(0*1)(\d*)$/.exec(b2);
        if (!m2) return;
        var len = m2[1].length, val = [];
        if (i + len > arr.length) return;
        for (var i2 = 0; i2 < len; i2++) {
          val[i2] = arr[i];
          i++;
        }
        if (trim) val[0] = parseInt(m2[2] || "0", 2);
        pos[0] = i;
        return val;
      };
      var readMatroskaBlock = function(arr, pos) {
        var lenVal = readMatroskaVInt(arr, pos, 1);
        if (!lenVal) return;
        var len = BytesInt(lenVal);
        var i = pos[0], val = [];
        if (len < 2147483647) {
          if (i + len > arr.length) return;
          for (var i2 = 0; i2 < len; i2++) {
            val[i2] = arr[i];
            i++;
          }
        }
        pos[0] = i;
        return val;
      };
      var i18n = Recorder2.i18n = {
        lang: "zh-CN",
        alias: { "zh-CN": "zh", "en-US": "en" },
        locales: {},
        data: {},
        put: function(set, texts) {
          var tag = RecTxt + ".i18n.put: ";
          var overwrite = set.overwrite;
          overwrite = overwrite == null || overwrite;
          var lang = set.lang;
          lang = i18n.alias[lang] || lang;
          if (!lang) throw new Error(tag + "set.lang?");
          var locale = i18n.locales[lang];
          if (!locale) {
            locale = {};
            i18n.locales[lang] = locale;
          }
          var exp = /^([\w\-]+):/, m2;
          for (var i = 0; i < texts.length; i++) {
            var v = texts[i];
            m2 = exp.exec(v);
            if (!m2) {
              CLog(tag + "'key:'? " + v, 3, set);
              continue;
            }
            var key = m2[1], v = v.substr(key.length + 1);
            if (!overwrite && locale[key]) continue;
            locale[key] = v;
          }
        },
        get: function() {
          return i18n.v_G.apply(null, arguments);
        },
        v_G: function(key, args, lang) {
          args = args || [];
          lang = lang || i18n.lang;
          lang = i18n.alias[lang] || lang;
          var locale = i18n.locales[lang];
          var val = locale && locale[key] || "";
          if (!val && lang != "zh") {
            if (lang == "en") return i18n.v_G(key, args, "zh");
            return i18n.v_G(key, args, "en");
          }
          i18n.lastLang = lang;
          if (val == "=Empty") return "";
          return val.replace(/\{(\d+)(\!?)\}/g, function(v, a, b) {
            a = +a || 0;
            v = args[a - 1];
            if (a < 1 || a > args.length) {
              v = "{?}";
              CLog("i18n[" + key + "] no {" + a + "}: " + val, 3);
            }
            return b ? "" : v;
          });
        },
        $T: function() {
          return i18n.v_T.apply(null, arguments);
        },
        v_T: function() {
          var a = arguments, key = "", args = [], isArgs = 0, tag = RecTxt + ".i18n.$T:";
          var exp = /^([\w\-]*):/, m2;
          for (var i = 0; i < a.length; i++) {
            var v = a[i];
            if (i == 0) {
              m2 = exp.exec(v);
              key = m2 && m2[1];
              if (!key) throw new Error(tag + "0 'key:'?");
              v = v.substr(key.length + 1);
            }
            if (isArgs === -1) args.push(v);
            else if (isArgs) throw new Error(tag + " bad args");
            else if (v === 0) isArgs = -1;
            else if (IsNum(v)) {
              if (v < 1) throw new Error(tag + " bad args");
              isArgs = v;
            } else {
              var lang = i == 1 ? "en" : i ? "" : "zh";
              m2 = exp.exec(v);
              if (m2) {
                lang = m2[1] || lang;
                v = v.substr(m2[1].length + 1);
              }
              if (!m2 || !lang) throw new Error(tag + i + " 'lang:'?");
              i18n.put({ lang, overwrite: false }, [key + ":" + v]);
            }
          }
          if (!key) return "";
          if (isArgs > 0) return key;
          return i18n.v_G(key, args);
        }
      };
      var $T = i18n.$T;
      $T.G = i18n.get;
      $T("NonBrowser-1::非浏览器环境,不支持{1}", 1);
      $T("IllegalArgs-1::参数错误:{1}", 1);
      $T("NeedImport-2::调用{1}需要先导入{2}", 2);
      $T("NotSupport-1::不支持:{1}", 1);
      Recorder2.TrafficImgUrl = "//ia.51.la/go1?id=20469973&pvFlag=1";
      var Traffic = Recorder2.Traffic = function(report) {
        if (!isBrowser) return;
        report = report ? "/" + RecTxt + "/Report/" + report : "";
        var imgUrl = Recorder2.TrafficImgUrl;
        if (imgUrl) {
          var data = Recorder2.Traffic;
          var m2 = /^(https?:..[^\/#]*\/?)[^#]*/i.exec(location.href) || [];
          var host = m2[1] || "http://file/";
          var idf = (m2[0] || host) + report;
          if (imgUrl.indexOf("//") == 0) {
            if (/^https:/i.test(idf)) {
              imgUrl = "https:" + imgUrl;
            } else {
              imgUrl = "http:" + imgUrl;
            }
          }
          if (report) {
            imgUrl = imgUrl + "&cu=" + encodeURIComponent(host + report);
          }
          if (!data[idf]) {
            data[idf] = 1;
            var img = new Image();
            img.src = imgUrl;
            CLog("Traffic Analysis Image: " + (report || RecTxt + ".TrafficImgUrl=" + Recorder2.TrafficImgUrl));
          }
        }
      };
      if (WRec2) {
        CLog($T("8HO5::覆盖导入{1}", 0, RecTxt), 1);
        WRec2.Destroy();
      }
      Export[RecTxt] = Recorder2;
    });
  })(recorderCore);
  var recorderCoreExports = recorderCore.exports;
  const Recorder = /* @__PURE__ */ getDefaultExportFromCjs(recorderCoreExports);
  (function(factory) {
    var browser = typeof window == "object" && !!window.document;
    var win = browser ? window : Object;
    var rec = win.Recorder, ni = rec.i18n;
    factory(rec, ni, ni.$T, browser);
  })(function(Recorder2, i18n, $T, isBrowser) {
    var SampleS = "48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000";
    var BitS = "8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 192, 224, 256, 320";
    Recorder2.prototype.enc_mp3 = {
      stable: true,
      takeEC: "full",
      getTestMsg: function() {
        return $T("Zm7L::采样率范围:{1};比特率范围:{2}(不同比特率支持的采样率范围不同,小于32kbps时采样率需小于32000)", 0, SampleS, BitS);
      }
    };
    var NormalizeSet = function(set) {
      var bS = set.bitRate, sS = set.sampleRate, s = sS;
      if ((" " + BitS + ",").indexOf(" " + bS + ",") == -1) {
        Recorder2.CLog($T("eGB9::{1}不在mp3支持的取值范围:{2}", 0, "bitRate=" + bS, BitS), 3);
      }
      if ((" " + SampleS + ",").indexOf(" " + sS + ",") == -1) {
        var arr = SampleS.split(", "), vs = [];
        for (var i = 0; i < arr.length; i++) vs.push({ v: +arr[i], s: Math.abs(arr[i] - sS) });
        vs.sort(function(a, b) {
          return a.s - b.s;
        });
        s = vs[0].v;
        set.sampleRate = s;
        Recorder2.CLog($T("zLTa::sampleRate已更新为{1},因为{2}不在mp3支持的取值范围:{3}", 0, s, sS, SampleS), 3);
      }
    };
    var ImportEngineErr = function() {
      return $T.G("NeedImport-2", ["mp3.js", "src/engine/mp3-engine.js"]);
    };
    var HasWebWorker = isBrowser && typeof Worker == "function";
    Recorder2.prototype.mp3 = function(res, True, False) {
      var This = this, set = This.set, size = res.length;
      if (!Recorder2.lamejs) {
        False(ImportEngineErr());
        return;
      }
      if (HasWebWorker) {
        var ctx = This.mp3_start(set);
        if (ctx) {
          if (ctx.isW) {
            This.mp3_encode(ctx, res);
            This.mp3_complete(ctx, True, False, 1);
            return;
          }
          This.mp3_stop(ctx);
        }
      }
      NormalizeSet(set);
      var mp3 = new Recorder2.lamejs.Mp3Encoder(1, set.sampleRate, set.bitRate);
      var blockSize = 57600;
      var memory = new Int8Array(5e5), mOffset = 0;
      var idx = 0, isFlush = 0;
      var run = function() {
        try {
          if (idx < size) {
            var buf = mp3.encodeBuffer(res.subarray(idx, idx + blockSize));
          } else {
            isFlush = 1;
            var buf = mp3.flush();
          }
          ;
        } catch (e) {
          console.error(e);
          if (!isFlush) try {
            mp3.flush();
          } catch (r) {
            console.error(r);
          }
          False("MP3 Encoder: " + e.message);
          return;
        }
        var bufLen = buf.length;
        if (bufLen > 0) {
          if (mOffset + bufLen > memory.length) {
            var tmp = new Int8Array(memory.length + Math.max(5e5, bufLen));
            tmp.set(memory.subarray(0, mOffset));
            memory = tmp;
          }
          memory.set(buf, mOffset);
          mOffset += bufLen;
        }
        if (idx < size) {
          idx += blockSize;
          setTimeout(run);
        } else {
          var data = [memory.buffer.slice(0, mOffset)];
          var meta = mp3TrimFix.fn(data, mOffset, size, set.sampleRate);
          mp3TrimFixSetMeta(meta, set);
          True(data[0] || new ArrayBuffer(0), "audio/mp3");
        }
      };
      run();
    };
    var mp3Worker;
    Recorder2.BindDestroy("mp3Worker", function() {
      if (mp3Worker) {
        Recorder2.CLog("mp3Worker Destroy");
        mp3Worker.terminate();
        mp3Worker = null;
      }
    });
    Recorder2.prototype.mp3_envCheck = function(envInfo, set) {
      var errMsg = "";
      if (set.takeoffEncodeChunk) {
        if (!newContext()) {
          errMsg = $T("yhUs::当前浏览器版本太低,无法实时处理");
        }
      }
      if (!errMsg && !Recorder2.lamejs) {
        errMsg = ImportEngineErr();
      }
      return errMsg;
    };
    Recorder2.prototype.mp3_start = function(set) {
      return newContext(set);
    };
    var openList = { id: 0 };
    var newContext = function(setOrNull, _badW) {
      var run = function(e) {
        var ed = e.data;
        var wk_ctxs = scope.wkScope.wk_ctxs;
        var wk_lame = scope.wkScope.wk_lame;
        var wk_mp3TrimFix = scope.wkScope.wk_mp3TrimFix;
        var cur = wk_ctxs[ed.id];
        if (ed.action == "init") {
          wk_ctxs[ed.id] = {
            sampleRate: ed.sampleRate,
            bitRate: ed.bitRate,
            takeoff: ed.takeoff,
            pcmSize: 0,
            memory: new Int8Array(5e5),
            mOffset: 0,
            encObj: new wk_lame.Mp3Encoder(1, ed.sampleRate, ed.bitRate)
          };
        } else if (!cur) {
          return;
        }
        var addBytes = function(buf2) {
          var bufLen = buf2.length;
          if (cur.mOffset + bufLen > cur.memory.length) {
            var tmp = new Int8Array(cur.memory.length + Math.max(5e5, bufLen));
            tmp.set(cur.memory.subarray(0, cur.mOffset));
            cur.memory = tmp;
          }
          cur.memory.set(buf2, cur.mOffset);
          cur.mOffset += bufLen;
        };
        switch (ed.action) {
          case "stop":
            if (!cur.isCp) try {
              cur.encObj.flush();
            } catch (e2) {
              console.error(e2);
            }
            cur.encObj = null;
            delete wk_ctxs[ed.id];
            break;
          case "encode":
            if (cur.isCp) break;
            cur.pcmSize += ed.pcm.length;
            try {
              var buf = cur.encObj.encodeBuffer(ed.pcm);
            } catch (e2) {
              cur.err = e2;
              console.error(e2);
            }
            if (buf && buf.length > 0) {
              if (cur.takeoff) {
                worker.onmessage({ action: "takeoff", id: ed.id, chunk: buf });
              } else {
                addBytes(buf);
              }
            }
            break;
          case "complete":
            cur.isCp = 1;
            try {
              var buf = cur.encObj.flush();
            } catch (e2) {
              cur.err = e2;
              console.error(e2);
            }
            if (buf && buf.length > 0) {
              if (cur.takeoff) {
                worker.onmessage({ action: "takeoff", id: ed.id, chunk: buf });
              } else {
                addBytes(buf);
              }
            }
            if (cur.err) {
              worker.onmessage({
                action: ed.action,
                id: ed.id,
                err: "MP3 Encoder: " + cur.err.message
              });
              break;
            }
            var data = [cur.memory.buffer.slice(0, cur.mOffset)];
            var meta = wk_mp3TrimFix.fn(data, cur.mOffset, cur.pcmSize, cur.sampleRate);
            worker.onmessage({
              action: ed.action,
              id: ed.id,
              blob: data[0] || new ArrayBuffer(0),
              meta
            });
            break;
        }
      };
      var initOnMsg = function(isW) {
        worker.onmessage = function(e) {
          var data = e;
          if (isW) data = e.data;
          var ctx2 = openList[data.id];
          if (ctx2) {
            if (data.action == "takeoff") {
              ctx2.set.takeoffEncodeChunk(new Uint8Array(data.chunk.buffer));
            } else {
              ctx2.call && ctx2.call(data);
              ctx2.call = null;
            }
          }
        };
      };
      var initCtx = function() {
        var ctx2 = { worker, set: setOrNull };
        if (setOrNull) {
          ctx2.id = ++openList.id;
          openList[ctx2.id] = ctx2;
          NormalizeSet(setOrNull);
          worker.postMessage({
            action: "init",
            id: ctx2.id,
            sampleRate: setOrNull.sampleRate,
            bitRate: setOrNull.bitRate,
            takeoff: !!setOrNull.takeoffEncodeChunk,
            x: new Int16Array(5)
            //低版本浏览器不支持序列化TypedArray
          });
        } else {
          worker.postMessage({
            x: new Int16Array(5)
            //低版本浏览器不支持序列化TypedArray
          });
        }
        return ctx2;
      };
      var scope, worker = mp3Worker;
      if (_badW || !HasWebWorker) {
        Recorder2.CLog($T("k9PT::当前环境不支持Web Worker,mp3实时编码器运行在主线程中"), 3);
        worker = { postMessage: function(ed) {
          run({ data: ed });
        } };
        scope = { wkScope: {
          wk_ctxs: {},
          wk_lame: Recorder2.lamejs,
          wk_mp3TrimFix: mp3TrimFix
        } };
        initOnMsg();
        return initCtx();
      }
      try {
        if (!worker) {
          var onmsg = (run + "").replace(/[\w\$]+\.onmessage/g, "self.postMessage");
          onmsg = onmsg.replace(/[\w\$]+\.wkScope/g, "wkScope");
          var jsCode = ");wk_lame();self.onmessage=" + onmsg;
          jsCode += ";var wkScope={ wk_ctxs:{},wk_lame:wk_lame";
          jsCode += ",wk_mp3TrimFix:{rm:" + mp3TrimFix.rm + ",fn:" + mp3TrimFix.fn + "} }";
          var lamejsCode = Recorder2.lamejs.toString();
          var url = (window.URL || webkitURL).createObjectURL(new Blob(["var wk_lame=(", lamejsCode, jsCode], { type: "text/javascript" }));
          worker = new Worker(url);
          setTimeout(function() {
            (window.URL || webkitURL).revokeObjectURL(url);
          }, 1e4);
          initOnMsg(1);
        }
        ;
        var ctx = initCtx();
        ctx.isW = 1;
        mp3Worker = worker;
        return ctx;
      } catch (e) {
        worker && worker.terminate();
        console.error(e);
        return newContext(setOrNull, 1);
      }
    };
    Recorder2.prototype.mp3_stop = function(startCtx) {
      if (startCtx && startCtx.worker) {
        startCtx.worker.postMessage({
          action: "stop",
          id: startCtx.id
        });
        startCtx.worker = null;
        delete openList[startCtx.id];
        var opens = -1;
        for (var k2 in openList) {
          opens++;
        }
        if (opens) {
          Recorder2.CLog($T("fT6M::mp3 worker剩{1}个未stop", 0, opens), 3);
        }
      }
    };
    Recorder2.prototype.mp3_encode = function(startCtx, pcm) {
      if (startCtx && startCtx.worker) {
        startCtx.worker.postMessage({
          action: "encode",
          id: startCtx.id,
          pcm
        });
      }
    };
    Recorder2.prototype.mp3_complete = function(startCtx, True, False, autoStop) {
      var This = this;
      if (startCtx && startCtx.worker) {
        startCtx.call = function(data) {
          if (autoStop) {
            This.mp3_stop(startCtx);
          }
          if (data.err) {
            False(data.err);
          } else {
            mp3TrimFixSetMeta(data.meta, startCtx.set);
            True(data.blob, "audio/mp3");
          }
        };
        startCtx.worker.postMessage({
          action: "complete",
          id: startCtx.id
        });
      } else {
        False($T("mPxH::mp3编码器未start"));
      }
    };
    Recorder2.mp3ReadMeta = function(mp3Buffers, length) {
      var parseInt_ES3 = typeof window != "undefined" && window.parseInt || typeof self != "undefined" && self.parseInt || parseInt;
      var u8arr0 = new Uint8Array(mp3Buffers[0] || []);
      if (u8arr0.length < 4) {
        return null;
      }
      var byteAt = function(idx2, u8) {
        return ("0000000" + ((u8 || u8arr0)[idx2] || 0).toString(2)).substr(-8);
      };
      var b2 = byteAt(0) + byteAt(1);
      var b4 = byteAt(2) + byteAt(3);
      if (!/^1{11}/.test(b2)) {
        return null;
      }
      var version = { "00": 2.5, "10": 2, "11": 1 }[b2.substr(11, 2)];
      var layer = { "01": 3 }[b2.substr(13, 2)];
      var sampleRate = {
        //lamejs -> Tables.samplerate_table
        "1": [44100, 48e3, 32e3],
        "2": [22050, 24e3, 16e3],
        "2.5": [11025, 12e3, 8e3]
      }[version];
      sampleRate && (sampleRate = sampleRate[parseInt_ES3(b4.substr(4, 2), 2)]);
      var bitRate = [
        //lamejs -> Tables.bitrate_table
        [0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160],
        [0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320]
        //MPEG 1
      ][version == 1 ? 1 : 0][parseInt_ES3(b4.substr(0, 4), 2)];
      if (!version || !layer || !bitRate || !sampleRate) {
        return null;
      }
      var duration = Math.round(length * 8 / bitRate);
      var frame = layer == 1 ? 384 : layer == 2 ? 1152 : version == 1 ? 1152 : 576;
      var frameDurationFloat = frame / sampleRate * 1e3;
      var frameSize = Math.floor(frame * bitRate / 8 / sampleRate * 1e3);
      var hasPadding = 0, seek = 0;
      for (var i = 0; i < mp3Buffers.length; i++) {
        var buf = mp3Buffers[i];
        seek += buf.byteLength;
        if (seek >= frameSize + 3) {
          var buf8 = new Uint8Array(buf);
          var idx = buf.byteLength - (seek - (frameSize + 3) + 1);
          var ib4 = byteAt(idx, buf8);
          hasPadding = ib4.charAt(6) == "1";
          break;
        }
      }
      if (hasPadding) {
        frameSize++;
      }
      return {
        version,
        layer,
        sampleRate,
        bitRate,
        duration,
        size: length,
        hasPadding,
        frameSize,
        frameDurationFloat
        //每帧时长,含小数 ms
      };
    };
    var mp3TrimFix = {
      //minfiy keep name
      rm: Recorder2.mp3ReadMeta,
      fn: function(mp3Buffers, length, pcmLength, pcmSampleRate) {
        var meta = this.rm(mp3Buffers, length);
        if (!meta) {
          return { err: "mp3 unknown format" };
        }
        var pcmDuration = Math.round(pcmLength / pcmSampleRate * 1e3);
        var num = Math.floor((meta.duration - pcmDuration) / meta.frameDurationFloat);
        if (num > 0) {
          var size = num * meta.frameSize - (meta.hasPadding ? 1 : 0);
          length -= size;
          var arr0 = 0, arrs = [];
          for (var i = 0; i < mp3Buffers.length; i++) {
            var arr = mp3Buffers[i];
            if (size <= 0) {
              break;
            }
            if (size >= arr.byteLength) {
              size -= arr.byteLength;
              arrs.push(arr);
              mp3Buffers.splice(i, 1);
              i--;
            } else {
              mp3Buffers[i] = arr.slice(size);
              arr0 = arr;
              size = 0;
            }
          }
          var checkMeta = this.rm(mp3Buffers, length);
          if (!checkMeta) {
            arr0 && (mp3Buffers[0] = arr0);
            for (var i = 0; i < arrs.length; i++) {
              mp3Buffers.splice(i, 0, arrs[i]);
            }
            meta.err = "mp3 fix error: 已还原,错误原因不明";
          }
          var fix = meta.trimFix = {};
          fix.remove = num;
          fix.removeDuration = Math.round(num * meta.frameDurationFloat);
          fix.duration = Math.round(length * 8 / meta.bitRate);
        }
        return meta;
      }
    };
    var mp3TrimFixSetMeta = function(meta, set) {
      var tag = "MP3 Info: ";
      if (meta.sampleRate && meta.sampleRate != set.sampleRate || meta.bitRate && meta.bitRate != set.bitRate) {
        Recorder2.CLog(tag + $T("uY9i::和设置的不匹配{1},已更新成{2}", 0, "set:" + set.bitRate + "kbps " + set.sampleRate + "hz", "set:" + meta.bitRate + "kbps " + meta.sampleRate + "hz"), 3, set);
        set.sampleRate = meta.sampleRate;
        set.bitRate = meta.bitRate;
      }
      var trimFix = meta.trimFix;
      if (trimFix) {
        tag += $T("iMSm::Fix移除{1}帧", 0, trimFix.remove) + " " + trimFix.removeDuration + "ms -> " + trimFix.duration + "ms";
        if (trimFix.remove > 2) {
          meta.err = (meta.err ? meta.err + ", " : "") + $T("b9zm::移除帧数过多");
        }
      } else {
        tag += (meta.duration || "-") + "ms";
      }
      if (meta.err) {
        Recorder2.CLog(tag, 1, meta.err, meta);
      } else {
        Recorder2.CLog(tag, meta);
      }
    };
  });
  (function(factory) {
    var browser = typeof window == "object" && !!window.document;
    var win = browser ? window : Object;
    var rec = win.Recorder;
    factory(rec);
  })(function(Recorder2) {
    function lamejs() {
      var Math_log10 = function(s) {
        return Math.log(s) / Math.log(10);
      };
      var abort = function(what) {
        throw new Error("abort(" + what + ")");
      };
      function new_byte2(count) {
        return new Int8Array(count);
      }
      function new_short2(count) {
        return new Int16Array(count);
      }
      function new_int2(count) {
        return new Int32Array(count);
      }
      function new_float2(count) {
        return new Float32Array(count);
      }
      function new_double2(count) {
        return new Float64Array(count);
      }
      function new_float_n2(args) {
        if (args.length == 1) {
          return new_float2(args[0]);
        }
        var sz = args[0];
        args = args.slice(1);
        var A = [];
        for (var i = 0; i < sz; i++) {
          A.push(new_float_n2(args));
        }
        return A;
      }
      function new_int_n2(args) {
        if (args.length == 1) {
          return new_int2(args[0]);
        }
        var sz = args[0];
        args = args.slice(1);
        var A = [];
        for (var i = 0; i < sz; i++) {
          A.push(new_int_n2(args));
        }
        return A;
      }
      function new_short_n2(args) {
        if (args.length == 1) {
          return new_short2(args[0]);
        }
        var sz = args[0];
        args = args.slice(1);
        var A = [];
        for (var i = 0; i < sz; i++) {
          A.push(new_short_n2(args));
        }
        return A;
      }
      function new_array_n2(args) {
        if (args.length == 1) {
          return new Array(args[0]);
        }
        var sz = args[0];
        args = args.slice(1);
        var A = [];
        for (var i = 0; i < sz; i++) {
          A.push(new_array_n2(args));
        }
        return A;
      }
      var Arrays2 = {};
      Arrays2.fill = function(a, fromIndex, toIndex, val) {
        if (arguments.length == 2) {
          for (var i = 0; i < a.length; i++) {
            a[i] = arguments[1];
          }
        } else {
          for (var i = fromIndex; i < toIndex; i++) {
            a[i] = val;
          }
        }
      };
      var System2 = {};
      System2.arraycopy = function(src, srcPos, dest, destPos, length) {
        var srcEnd = srcPos + length;
        while (srcPos < srcEnd)
          dest[destPos++] = src[srcPos++];
      };
      var Util2 = {};
      Util2.SQRT2 = 1.4142135623730951;
      Util2.FAST_LOG10 = function(x) {
        return Math_log10(x);
      };
      Util2.FAST_LOG10_X = function(x, y) {
        return Math_log10(x) * y;
      };
      function ShortBlock2(ordinal) {
        this.ordinal = ordinal;
      }
      ShortBlock2.short_block_allowed = new ShortBlock2(0);
      ShortBlock2.short_block_coupled = new ShortBlock2(1);
      ShortBlock2.short_block_dispensed = new ShortBlock2(2);
      ShortBlock2.short_block_forced = new ShortBlock2(3);
      var Float2 = {};
      Float2.MAX_VALUE = 34028235e31;
      function VbrMode2(ordinal) {
        this.ordinal = ordinal;
      }
      VbrMode2.vbr_off = new VbrMode2(0);
      VbrMode2.vbr_mt = new VbrMode2(1);
      VbrMode2.vbr_rh = new VbrMode2(2);
      VbrMode2.vbr_abr = new VbrMode2(3);
      VbrMode2.vbr_mtrh = new VbrMode2(4);
      VbrMode2.vbr_default = VbrMode2.vbr_mtrh;
      function MPEGMode2(ordinal) {
        var _ordinal = ordinal;
        this.ordinal = function() {
          return _ordinal;
        };
      }
      MPEGMode2.STEREO = new MPEGMode2(0);
      MPEGMode2.JOINT_STEREO = new MPEGMode2(1);
      MPEGMode2.DUAL_CHANNEL = new MPEGMode2(2);
      MPEGMode2.MONO = new MPEGMode2(3);
      MPEGMode2.NOT_SET = new MPEGMode2(4);
      function Version() {
        var LAME_MAJOR_VERSION = 3;
        var LAME_MINOR_VERSION = 98;
        var LAME_PATCH_VERSION = 4;
        this.getLameShortVersion = function() {
          return LAME_MAJOR_VERSION + "." + LAME_MINOR_VERSION + "." + LAME_PATCH_VERSION;
        };
      }
      function Takehiro() {
        var qupvt = null;
        this.qupvt = null;
        this.setModules = function(_qupvt) {
          this.qupvt = _qupvt;
          qupvt = _qupvt;
        };
        function Bits(b) {
          this.bits = 0 | b;
        }
        var subdv_table = [
          [0, 0],
          /* 0 bands */
          [0, 0],
          /* 1 bands */
          [0, 0],
          /* 2 bands */
          [0, 0],
          /* 3 bands */
          [0, 0],
          /* 4 bands */
          [0, 1],
          /* 5 bands */
          [1, 1],
          /* 6 bands */
          [1, 1],
          /* 7 bands */
          [1, 2],
          /* 8 bands */
          [2, 2],
          /* 9 bands */
          [2, 3],
          /* 10 bands */
          [2, 3],
          /* 11 bands */
          [3, 4],
          /* 12 bands */
          [3, 4],
          /* 13 bands */
          [3, 4],
          /* 14 bands */
          [4, 5],
          /* 15 bands */
          [4, 5],
          /* 16 bands */
          [4, 6],
          /* 17 bands */
          [5, 6],
          /* 18 bands */
          [5, 6],
          /* 19 bands */
          [5, 7],
          /* 20 bands */
          [6, 7],
          /* 21 bands */
          [6, 7]
          /* 22 bands */
        ];
        function quantize_lines_xrpow_01(l2, istep, xr, xrPos, ix, ixPos) {
          var compareval0 = (1 - 0.4054) / istep;
          l2 = l2 >> 1;
          while (l2-- != 0) {
            ix[ixPos++] = compareval0 > xr[xrPos++] ? 0 : 1;
            ix[ixPos++] = compareval0 > xr[xrPos++] ? 0 : 1;
          }
        }
        function quantize_lines_xrpow(l2, istep, xr, xrPos, ix, ixPos) {
          l2 = l2 >> 1;
          var remaining = l2 % 2;
          l2 = l2 >> 1;
          while (l2-- != 0) {
            var x0, x1, x2, x3;
            var rx0, rx1, rx2, rx3;
            x0 = xr[xrPos++] * istep;
            x1 = xr[xrPos++] * istep;
            rx0 = 0 | x0;
            x2 = xr[xrPos++] * istep;
            rx1 = 0 | x1;
            x3 = xr[xrPos++] * istep;
            rx2 = 0 | x2;
            x0 += qupvt.adj43[rx0];
            rx3 = 0 | x3;
            x1 += qupvt.adj43[rx1];
            ix[ixPos++] = 0 | x0;
            x2 += qupvt.adj43[rx2];
            ix[ixPos++] = 0 | x1;
            x3 += qupvt.adj43[rx3];
            ix[ixPos++] = 0 | x2;
            ix[ixPos++] = 0 | x3;
          }
          if (remaining != 0) {
            var x0, x1;
            var rx0, rx1;
            x0 = xr[xrPos++] * istep;
            x1 = xr[xrPos++] * istep;
            rx0 = 0 | x0;
            rx1 = 0 | x1;
            x0 += qupvt.adj43[rx0];
            x1 += qupvt.adj43[rx1];
            ix[ixPos++] = 0 | x0;
            ix[ixPos++] = 0 | x1;
          }
        }
        function quantize_xrpow(xp, pi, istep, codInfo, prevNoise) {
          var sfb;
          var sfbmax;
          var j = 0;
          var prev_data_use;
          var accumulate = 0;
          var accumulate01 = 0;
          var xpPos = 0;
          var iData = pi;
          var iDataPos = 0;
          var acc_iData = iData;
          var acc_iDataPos = 0;
          var acc_xp = xp;
          var acc_xpPos = 0;
          prev_data_use = prevNoise != null && codInfo.global_gain == prevNoise.global_gain;
          if (codInfo.block_type == Encoder2.SHORT_TYPE)
            sfbmax = 38;
          else
            sfbmax = 21;
          for (sfb = 0; sfb <= sfbmax; sfb++) {
            var step = -1;
            if (prev_data_use || codInfo.block_type == Encoder2.NORM_TYPE) {
              step = codInfo.global_gain - (codInfo.scalefac[sfb] + (codInfo.preflag != 0 ? qupvt.pretab[sfb] : 0) << codInfo.scalefac_scale + 1) - codInfo.subblock_gain[codInfo.window[sfb]] * 8;
            }
            if (prev_data_use && prevNoise.step[sfb] == step) {
              if (accumulate != 0) {
                quantize_lines_xrpow(
                  accumulate,
                  istep,
                  acc_xp,
                  acc_xpPos,
                  acc_iData,
                  acc_iDataPos
                );
                accumulate = 0;
              }
              if (accumulate01 != 0) {
                abort();
              }
            } else {
              var l2 = codInfo.width[sfb];
              if (j + codInfo.width[sfb] > codInfo.max_nonzero_coeff) {
                var usefullsize;
                usefullsize = codInfo.max_nonzero_coeff - j + 1;
                Arrays2.fill(pi, codInfo.max_nonzero_coeff, 576, 0);
                l2 = usefullsize;
                if (l2 < 0) {
                  l2 = 0;
                }
                sfb = sfbmax + 1;
              }
              if (0 == accumulate && 0 == accumulate01) {
                acc_iData = iData;
                acc_iDataPos = iDataPos;
                acc_xp = xp;
                acc_xpPos = xpPos;
              }
              if (prevNoise != null && prevNoise.sfb_count1 > 0 && sfb >= prevNoise.sfb_count1 && prevNoise.step[sfb] > 0 && step >= prevNoise.step[sfb]) {
                if (accumulate != 0) {
                  quantize_lines_xrpow(
                    accumulate,
                    istep,
                    acc_xp,
                    acc_xpPos,
                    acc_iData,
                    acc_iDataPos
                  );
                  accumulate = 0;
                  acc_iData = iData;
                  acc_iDataPos = iDataPos;
                  acc_xp = xp;
                  acc_xpPos = xpPos;
                }
                accumulate01 += l2;
              } else {
                if (accumulate01 != 0) {
                  quantize_lines_xrpow_01(
                    accumulate01,
                    istep,
                    acc_xp,
                    acc_xpPos,
                    acc_iData,
                    acc_iDataPos
                  );
                  accumulate01 = 0;
                  acc_iData = iData;
                  acc_iDataPos = iDataPos;
                  acc_xp = xp;
                  acc_xpPos = xpPos;
                }
                accumulate += l2;
              }
              if (l2 <= 0) {
                if (accumulate01 != 0) {
                  abort();
                }
                if (accumulate != 0) {
                  abort();
                }
                break;
              }
            }
            if (sfb <= sfbmax) {
              iDataPos += codInfo.width[sfb];
              xpPos += codInfo.width[sfb];
              j += codInfo.width[sfb];
            }
          }
          if (accumulate != 0) {
            quantize_lines_xrpow(
              accumulate,
              istep,
              acc_xp,
              acc_xpPos,
              acc_iData,
              acc_iDataPos
            );
            accumulate = 0;
          }
          if (accumulate01 != 0) {
            abort();
          }
        }
        function ix_max(ix, ixPos, endPos) {
          var max1 = 0, max2 = 0;
          do {
            var x1 = ix[ixPos++];
            var x2 = ix[ixPos++];
            if (max1 < x1)
              max1 = x1;
            if (max2 < x2)
              max2 = x2;
          } while (ixPos < endPos);
          if (max1 < max2)
            max1 = max2;
          return max1;
        }
        function count_bit_ESC(ix, ixPos, end, t1, t2, s) {
          var linbits = Tables2.ht[t1].xlen * 65536 + Tables2.ht[t2].xlen;
          var sum = 0, sum2;
          do {
            var x = ix[ixPos++];
            var y = ix[ixPos++];
            if (x != 0) {
              if (x > 14) {
                x = 15;
                sum += linbits;
              }
              x *= 16;
            }
            if (y != 0) {
              if (y > 14) {
                y = 15;
                sum += linbits;
              }
              x += y;
            }
            sum += Tables2.largetbl[x];
          } while (ixPos < end);
          sum2 = sum & 65535;
          sum >>= 16;
          if (sum > sum2) {
            sum = sum2;
            t1 = t2;
          }
          s.bits += sum;
          return t1;
        }
        function count_bit_noESC(ix, ixPos, end, s) {
          var sum1 = 0;
          var hlen1 = Tables2.ht[1].hlen;
          do {
            var x = ix[ixPos + 0] * 2 + ix[ixPos + 1];
            ixPos += 2;
            sum1 += hlen1[x];
          } while (ixPos < end);
          s.bits += sum1;
          return 1;
        }
        function count_bit_noESC_from2(ix, ixPos, end, t1, s) {
          var sum = 0, sum2;
          var xlen = Tables2.ht[t1].xlen;
          var hlen;
          if (t1 == 2)
            hlen = Tables2.table23;
          else
            hlen = Tables2.table56;
          do {
            var x = ix[ixPos + 0] * xlen + ix[ixPos + 1];
            ixPos += 2;
            sum += hlen[x];
          } while (ixPos < end);
          sum2 = sum & 65535;
          sum >>= 16;
          if (sum > sum2) {
            sum = sum2;
            t1++;
          }
          s.bits += sum;
          return t1;
        }
        function count_bit_noESC_from3(ix, ixPos, end, t1, s) {
          var sum1 = 0;
          var sum2 = 0;
          var sum3 = 0;
          var xlen = Tables2.ht[t1].xlen;
          var hlen1 = Tables2.ht[t1].hlen;
          var hlen2 = Tables2.ht[t1 + 1].hlen;
          var hlen3 = Tables2.ht[t1 + 2].hlen;
          do {
            var x = ix[ixPos + 0] * xlen + ix[ixPos + 1];
            ixPos += 2;
            sum1 += hlen1[x];
            sum2 += hlen2[x];
            sum3 += hlen3[x];
          } while (ixPos < end);
          var t = t1;
          if (sum1 > sum2) {
            sum1 = sum2;
            t++;
          }
          if (sum1 > sum3) {
            sum1 = sum3;
            t = t1 + 2;
          }
          s.bits += sum1;
          return t;
        }
        var huf_tbl_noESC = [
          1,
          2,
          5,
          7,
          7,
          10,
          10,
          13,
          13,
          13,
          13,
          13,
          13,
          13,
          13
        ];
        function choose_table(ix, ixPos, endPos, s) {
          var max = ix_max(ix, ixPos, endPos);
          switch (max) {
            case 0:
              return max;
            case 1:
              return count_bit_noESC(ix, ixPos, endPos, s);
            case 2:
            case 3:
              return count_bit_noESC_from2(
                ix,
                ixPos,
                endPos,
                huf_tbl_noESC[max - 1],
                s
              );
            case 4:
            case 5:
            case 6:
            case 7:
            case 8:
            case 9:
            case 10:
            case 11:
            case 12:
            case 13:
            case 14:
            case 15:
              return count_bit_noESC_from3(
                ix,
                ixPos,
                endPos,
                huf_tbl_noESC[max - 1],
                s
              );
            default:
              if (max > QuantizePVT.IXMAX_VAL) {
                abort();
              }
              max -= 15;
              var choice2;
              for (choice2 = 24; choice2 < 32; choice2++) {
                if (Tables2.ht[choice2].linmax >= max) {
                  break;
                }
              }
              var choice;
              for (choice = choice2 - 8; choice < 24; choice++) {
                if (Tables2.ht[choice].linmax >= max) {
                  break;
                }
              }
              return count_bit_ESC(ix, ixPos, endPos, choice, choice2, s);
          }
        }
        this.noquant_count_bits = function(gfc, gi, prev_noise) {
          var ix = gi.l3_enc;
          var i = Math.min(576, gi.max_nonzero_coeff + 2 >> 1 << 1);
          if (prev_noise != null)
            prev_noise.sfb_count1 = 0;
          for (; i > 1; i -= 2)
            if ((ix[i - 1] | ix[i - 2]) != 0)
              break;
          gi.count1 = i;
          var a1 = 0;
          var a2 = 0;
          for (; i > 3; i -= 4) {
            var p2;
            if (((ix[i - 1] | ix[i - 2] | ix[i - 3] | ix[i - 4]) & 2147483647) > 1) {
              break;
            }
            p2 = ((ix[i - 4] * 2 + ix[i - 3]) * 2 + ix[i - 2]) * 2 + ix[i - 1];
            a1 += Tables2.t32l[p2];
            a2 += Tables2.t33l[p2];
          }
          var bits = a1;
          gi.count1table_select = 0;
          if (a1 > a2) {
            bits = a2;
            gi.count1table_select = 1;
          }
          gi.count1bits = bits;
          gi.big_values = i;
          if (i == 0)
            return bits;
          if (gi.block_type == Encoder2.SHORT_TYPE) {
            a1 = 3 * gfc.scalefac_band.s[3];
            if (a1 > gi.big_values)
              a1 = gi.big_values;
            a2 = gi.big_values;
          } else if (gi.block_type == Encoder2.NORM_TYPE) {
            a1 = gi.region0_count = gfc.bv_scf[i - 2];
            a2 = gi.region1_count = gfc.bv_scf[i - 1];
            a2 = gfc.scalefac_band.l[a1 + a2 + 2];
            a1 = gfc.scalefac_band.l[a1 + 1];
            if (a2 < i) {
              var bi = new Bits(bits);
              gi.table_select[2] = choose_table(ix, a2, i, bi);
              bits = bi.bits;
            }
          } else {
            gi.region0_count = 7;
            gi.region1_count = Encoder2.SBMAX_l - 1 - 7 - 1;
            a1 = gfc.scalefac_band.l[7 + 1];
            a2 = i;
            if (a1 > a2) {
              a1 = a2;
            }
          }
          a1 = Math.min(a1, i);
          a2 = Math.min(a2, i);
          if (0 < a1) {
            var bi = new Bits(bits);
            gi.table_select[0] = choose_table(ix, 0, a1, bi);
            bits = bi.bits;
          }
          if (a1 < a2) {
            var bi = new Bits(bits);
            gi.table_select[1] = choose_table(ix, a1, a2, bi);
            bits = bi.bits;
          }
          if (gfc.use_best_huffman == 2) {
            abort();
          }
          if (prev_noise != null) {
            if (gi.block_type == Encoder2.NORM_TYPE) {
              var sfb = 0;
              while (gfc.scalefac_band.l[sfb] < gi.big_values) {
                sfb++;
              }
              prev_noise.sfb_count1 = sfb;
            }
          }
          return bits;
        };
        this.count_bits = function(gfc, xr, gi, prev_noise) {
          var ix = gi.l3_enc;
          var w = QuantizePVT.IXMAX_VAL / qupvt.IPOW20(gi.global_gain);
          if (gi.xrpow_max > w)
            return QuantizePVT.LARGE_BITS;
          quantize_xrpow(xr, ix, qupvt.IPOW20(gi.global_gain), gi, prev_noise);
          if ((gfc.substep_shaping & 2) != 0) {
            abort();
          }
          return this.noquant_count_bits(gfc, gi, prev_noise);
        };
        function recalc_divide_init(gfc, cod_info, ix, r01_bits, r01_div, r0_tbl, r1_tbl) {
          var bigv = cod_info.big_values;
          for (var r0 = 0; r0 <= 7 + 15; r0++) {
            r01_bits[r0] = QuantizePVT.LARGE_BITS;
          }
          for (var r0 = 0; r0 < 16; r0++) {
            var a1 = gfc.scalefac_band.l[r0 + 1];
            if (a1 >= bigv)
              break;
            var r0bits = 0;
            var bi = new Bits(r0bits);
            var r0t = choose_table(ix, 0, a1, bi);
            r0bits = bi.bits;
            for (var r1 = 0; r1 < 8; r1++) {
              var a2 = gfc.scalefac_band.l[r0 + r1 + 2];
              if (a2 >= bigv)
                break;
              var bits = r0bits;
              bi = new Bits(bits);
              var r1t = choose_table(ix, a1, a2, bi);
              bits = bi.bits;
              if (r01_bits[r0 + r1] > bits) {
                r01_bits[r0 + r1] = bits;
                r01_div[r0 + r1] = r0;
                r0_tbl[r0 + r1] = r0t;
                r1_tbl[r0 + r1] = r1t;
              }
            }
          }
        }
        function recalc_divide_sub(gfc, cod_info2, gi, ix, r01_bits, r01_div, r0_tbl, r1_tbl) {
          var bigv = cod_info2.big_values;
          for (var r2 = 2; r2 < Encoder2.SBMAX_l + 1; r2++) {
            var a2 = gfc.scalefac_band.l[r2];
            if (a2 >= bigv)
              break;
            var bits = r01_bits[r2 - 2] + cod_info2.count1bits;
            if (gi.part2_3_length <= bits)
              break;
            var bi = new Bits(bits);
            var r2t = choose_table(ix, a2, bigv, bi);
            bits = bi.bits;
            if (gi.part2_3_length <= bits)
              continue;
            gi.assign(cod_info2);
            gi.part2_3_length = bits;
            gi.region0_count = r01_div[r2 - 2];
            gi.region1_count = r2 - 2 - r01_div[r2 - 2];
            gi.table_select[0] = r0_tbl[r2 - 2];
            gi.table_select[1] = r1_tbl[r2 - 2];
            gi.table_select[2] = r2t;
          }
        }
        this.best_huffman_divide = function(gfc, gi) {
          var cod_info2 = new GrInfo2();
          var ix = gi.l3_enc;
          var r01_bits = new_int2(7 + 15 + 1);
          var r01_div = new_int2(7 + 15 + 1);
          var r0_tbl = new_int2(7 + 15 + 1);
          var r1_tbl = new_int2(7 + 15 + 1);
          if (gi.block_type == Encoder2.SHORT_TYPE && gfc.mode_gr == 1)
            return;
          cod_info2.assign(gi);
          if (gi.block_type == Encoder2.NORM_TYPE) {
            recalc_divide_init(gfc, gi, ix, r01_bits, r01_div, r0_tbl, r1_tbl);
            recalc_divide_sub(
              gfc,
              cod_info2,
              gi,
              ix,
              r01_bits,
              r01_div,
              r0_tbl,
              r1_tbl
            );
          }
          var i = cod_info2.big_values;
          if (i == 0 || (ix[i - 2] | ix[i - 1]) > 1)
            return;
          i = gi.count1 + 2;
          if (i > 576)
            return;
          cod_info2.assign(gi);
          cod_info2.count1 = i;
          var a1 = 0;
          var a2 = 0;
          for (; i > cod_info2.big_values; i -= 4) {
            var p2 = ((ix[i - 4] * 2 + ix[i - 3]) * 2 + ix[i - 2]) * 2 + ix[i - 1];
            a1 += Tables2.t32l[p2];
            a2 += Tables2.t33l[p2];
          }
          cod_info2.big_values = i;
          cod_info2.count1table_select = 0;
          if (a1 > a2) {
            a1 = a2;
            cod_info2.count1table_select = 1;
          }
          cod_info2.count1bits = a1;
          if (cod_info2.block_type == Encoder2.NORM_TYPE)
            recalc_divide_sub(
              gfc,
              cod_info2,
              gi,
              ix,
              r01_bits,
              r01_div,
              r0_tbl,
              r1_tbl
            );
          else {
            cod_info2.part2_3_length = a1;
            a1 = gfc.scalefac_band.l[7 + 1];
            if (a1 > i) {
              a1 = i;
            }
            if (a1 > 0) {
              var bi = new Bits(cod_info2.part2_3_length);
              cod_info2.table_select[0] = choose_table(ix, 0, a1, bi);
              cod_info2.part2_3_length = bi.bits;
            }
            if (i > a1) {
              var bi = new Bits(cod_info2.part2_3_length);
              cod_info2.table_select[1] = choose_table(ix, a1, i, bi);
              cod_info2.part2_3_length = bi.bits;
            }
            if (gi.part2_3_length > cod_info2.part2_3_length)
              gi.assign(cod_info2);
          }
        };
        var slen1_n = [1, 1, 1, 1, 8, 2, 2, 2, 4, 4, 4, 8, 8, 8, 16, 16];
        var slen2_n = [1, 2, 4, 8, 1, 2, 4, 8, 2, 4, 8, 2, 4, 8, 4, 8];
        var slen1_tab = [0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4];
        var slen2_tab = [0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3];
        Takehiro.slen1_tab = slen1_tab;
        Takehiro.slen2_tab = slen2_tab;
        function scfsi_calc(ch, l3_side) {
          var sfb;
          var gi = l3_side.tt[1][ch];
          var g0 = l3_side.tt[0][ch];
          for (var i = 0; i < Tables2.scfsi_band.length - 1; i++) {
            for (sfb = Tables2.scfsi_band[i]; sfb < Tables2.scfsi_band[i + 1]; sfb++) {
              if (g0.scalefac[sfb] != gi.scalefac[sfb] && gi.scalefac[sfb] >= 0)
                break;
            }
            if (sfb == Tables2.scfsi_band[i + 1]) {
              for (sfb = Tables2.scfsi_band[i]; sfb < Tables2.scfsi_band[i + 1]; sfb++) {
                gi.scalefac[sfb] = -1;
              }
              l3_side.scfsi[ch][i] = 1;
            }
          }
          var s1 = 0;
          var c1 = 0;
          for (sfb = 0; sfb < 11; sfb++) {
            if (gi.scalefac[sfb] == -1)
              continue;
            c1++;
            if (s1 < gi.scalefac[sfb])
              s1 = gi.scalefac[sfb];
          }
          var s2 = 0;
          var c2 = 0;
          for (; sfb < Encoder2.SBPSY_l; sfb++) {
            if (gi.scalefac[sfb] == -1)
              continue;
            c2++;
            if (s2 < gi.scalefac[sfb])
              s2 = gi.scalefac[sfb];
          }
          for (var i = 0; i < 16; i++) {
            if (s1 < slen1_n[i] && s2 < slen2_n[i]) {
              var c = slen1_tab[i] * c1 + slen2_tab[i] * c2;
              if (gi.part2_length > c) {
                gi.part2_length = c;
                gi.scalefac_compress = i;
              }
            }
          }
        }
        this.best_scalefac_store = function(gfc, gr, ch, l3_side) {
          var gi = l3_side.tt[gr][ch];
          var sfb, i, j, l2;
          var recalc = 0;
          j = 0;
          for (sfb = 0; sfb < gi.sfbmax; sfb++) {
            var width = gi.width[sfb];
            j += width;
            for (l2 = -width; l2 < 0; l2++) {
              if (gi.l3_enc[l2 + j] != 0)
                break;
            }
            if (l2 == 0)
              gi.scalefac[sfb] = recalc = -2;
          }
          if (0 == gi.scalefac_scale && 0 == gi.preflag) {
            var s = 0;
            for (sfb = 0; sfb < gi.sfbmax; sfb++)
              if (gi.scalefac[sfb] > 0)
                s |= gi.scalefac[sfb];
            if (0 == (s & 1) && s != 0) {
              for (sfb = 0; sfb < gi.sfbmax; sfb++)
                if (gi.scalefac[sfb] > 0)
                  gi.scalefac[sfb] >>= 1;
              gi.scalefac_scale = recalc = 1;
            }
          }
          if (0 == gi.preflag && gi.block_type != Encoder2.SHORT_TYPE && gfc.mode_gr == 2) {
            for (sfb = 11; sfb < Encoder2.SBPSY_l; sfb++)
              if (gi.scalefac[sfb] < qupvt.pretab[sfb] && gi.scalefac[sfb] != -2)
                break;
            if (sfb == Encoder2.SBPSY_l) {
              for (sfb = 11; sfb < Encoder2.SBPSY_l; sfb++)
                if (gi.scalefac[sfb] > 0)
                  gi.scalefac[sfb] -= qupvt.pretab[sfb];
              gi.preflag = recalc = 1;
            }
          }
          for (i = 0; i < 4; i++)
            l3_side.scfsi[ch][i] = 0;
          if (gfc.mode_gr == 2 && gr == 1 && l3_side.tt[0][ch].block_type != Encoder2.SHORT_TYPE && l3_side.tt[1][ch].block_type != Encoder2.SHORT_TYPE) {
            scfsi_calc(ch, l3_side);
            recalc = 0;
          }
          for (sfb = 0; sfb < gi.sfbmax; sfb++) {
            if (gi.scalefac[sfb] == -2) {
              gi.scalefac[sfb] = 0;
            }
          }
          if (recalc != 0) {
            if (gfc.mode_gr == 2) {
              this.scale_bitcount(gi);
            } else {
              this.scale_bitcount_lsf(gfc, gi);
            }
          }
        };
        var scale_short = [
          0,
          18,
          36,
          54,
          54,
          36,
          54,
          72,
          54,
          72,
          90,
          72,
          90,
          108,
          108,
          126
        ];
        var scale_mixed = [
          0,
          18,
          36,
          54,
          51,
          35,
          53,
          71,
          52,
          70,
          88,
          69,
          87,
          105,
          104,
          122
        ];
        var scale_long = [
          0,
          10,
          20,
          30,
          33,
          21,
          31,
          41,
          32,
          42,
          52,
          43,
          53,
          63,
          64,
          74
        ];
        this.scale_bitcount = function(cod_info) {
          var k2, sfb, max_slen1 = 0, max_slen2 = 0;
          var tab;
          var scalefac = cod_info.scalefac;
          if (cod_info.block_type == Encoder2.SHORT_TYPE) {
            tab = scale_short;
            if (cod_info.mixed_block_flag != 0)
              tab = scale_mixed;
          } else {
            tab = scale_long;
            if (0 == cod_info.preflag) {
              for (sfb = 11; sfb < Encoder2.SBPSY_l; sfb++)
                if (scalefac[sfb] < qupvt.pretab[sfb])
                  break;
              if (sfb == Encoder2.SBPSY_l) {
                cod_info.preflag = 1;
                for (sfb = 11; sfb < Encoder2.SBPSY_l; sfb++)
                  scalefac[sfb] -= qupvt.pretab[sfb];
              }
            }
          }
          for (sfb = 0; sfb < cod_info.sfbdivide; sfb++)
            if (max_slen1 < scalefac[sfb])
              max_slen1 = scalefac[sfb];
          for (; sfb < cod_info.sfbmax; sfb++)
            if (max_slen2 < scalefac[sfb])
              max_slen2 = scalefac[sfb];
          cod_info.part2_length = QuantizePVT.LARGE_BITS;
          for (k2 = 0; k2 < 16; k2++) {
            if (max_slen1 < slen1_n[k2] && max_slen2 < slen2_n[k2] && cod_info.part2_length > tab[k2]) {
              cod_info.part2_length = tab[k2];
              cod_info.scalefac_compress = k2;
            }
          }
          return cod_info.part2_length == QuantizePVT.LARGE_BITS;
        };
        var max_range_sfac_tab = [
          [15, 15, 7, 7],
          [15, 15, 7, 0],
          [7, 3, 0, 0],
          [15, 31, 31, 0],
          [7, 7, 7, 0],
          [3, 3, 0, 0]
        ];
        this.scale_bitcount_lsf = function(gfc, cod_info) {
          var table_number, row_in_table, partition, nr_sfb, window2;
          var over;
          var i, sfb;
          var max_sfac = new_int2(4);
          var scalefac = cod_info.scalefac;
          if (cod_info.preflag != 0)
            table_number = 2;
          else
            table_number = 0;
          for (i = 0; i < 4; i++)
            max_sfac[i] = 0;
          if (cod_info.block_type == Encoder2.SHORT_TYPE) {
            row_in_table = 1;
            var partition_table = qupvt.nr_of_sfb_block[table_number][row_in_table];
            for (sfb = 0, partition = 0; partition < 4; partition++) {
              nr_sfb = partition_table[partition] / 3;
              for (i = 0; i < nr_sfb; i++, sfb++)
                for (window2 = 0; window2 < 3; window2++)
                  if (scalefac[sfb * 3 + window2] > max_sfac[partition])
                    max_sfac[partition] = scalefac[sfb * 3 + window2];
            }
          } else {
            row_in_table = 0;
            var partition_table = qupvt.nr_of_sfb_block[table_number][row_in_table];
            for (sfb = 0, partition = 0; partition < 4; partition++) {
              nr_sfb = partition_table[partition];
              for (i = 0; i < nr_sfb; i++, sfb++)
                if (scalefac[sfb] > max_sfac[partition])
                  max_sfac[partition] = scalefac[sfb];
            }
          }
          for (over = false, partition = 0; partition < 4; partition++) {
            if (max_sfac[partition] > max_range_sfac_tab[table_number][partition])
              over = true;
          }
          if (!over) {
            var slen1, slen2, slen3, slen4;
            cod_info.sfb_partition_table = qupvt.nr_of_sfb_block[table_number][row_in_table];
            for (partition = 0; partition < 4; partition++)
              cod_info.slen[partition] = log2tab[max_sfac[partition]];
            slen1 = cod_info.slen[0];
            slen2 = cod_info.slen[1];
            slen3 = cod_info.slen[2];
            slen4 = cod_info.slen[3];
            switch (table_number) {
              case 0:
                cod_info.scalefac_compress = (slen1 * 5 + slen2 << 4) + (slen3 << 2) + slen4;
                break;
              case 1:
                cod_info.scalefac_compress = 400 + (slen1 * 5 + slen2 << 2) + slen3;
                break;
              case 2:
                cod_info.scalefac_compress = 500 + slen1 * 3 + slen2;
                break;
            }
          }
          if (!over) {
            cod_info.part2_length = 0;
            for (partition = 0; partition < 4; partition++)
              cod_info.part2_length += cod_info.slen[partition] * cod_info.sfb_partition_table[partition];
          }
          return over;
        };
        var log2tab = [
          0,
          1,
          2,
          2,
          3,
          3,
          3,
          3,
          4,
          4,
          4,
          4,
          4,
          4,
          4,
          4
        ];
        this.huffman_init = function(gfc) {
          for (var i = 2; i <= 576; i += 2) {
            var scfb_anz = 0, bv_index;
            while (gfc.scalefac_band.l[++scfb_anz] < i)
              ;
            bv_index = subdv_table[scfb_anz][0];
            while (gfc.scalefac_band.l[bv_index + 1] > i)
              bv_index--;
            if (bv_index < 0) {
              bv_index = subdv_table[scfb_anz][0];
            }
            gfc.bv_scf[i - 2] = bv_index;
            bv_index = subdv_table[scfb_anz][1];
            while (gfc.scalefac_band.l[bv_index + gfc.bv_scf[i - 2] + 2] > i)
              bv_index--;
            if (bv_index < 0) {
              bv_index = subdv_table[scfb_anz][1];
            }
            gfc.bv_scf[i - 1] = bv_index;
          }
        };
      }
      GainAnalysis2.STEPS_per_dB = 100;
      GainAnalysis2.MAX_dB = 120;
      GainAnalysis2.GAIN_NOT_ENOUGH_SAMPLES = -24601;
      GainAnalysis2.GAIN_ANALYSIS_ERROR = 0;
      GainAnalysis2.GAIN_ANALYSIS_OK = 1;
      GainAnalysis2.INIT_GAIN_ANALYSIS_ERROR = 0;
      GainAnalysis2.INIT_GAIN_ANALYSIS_OK = 1;
      GainAnalysis2.YULE_ORDER = 10;
      GainAnalysis2.MAX_ORDER = GainAnalysis2.YULE_ORDER;
      GainAnalysis2.MAX_SAMP_FREQ = 48e3;
      GainAnalysis2.RMS_WINDOW_TIME_NUMERATOR = 1;
      GainAnalysis2.RMS_WINDOW_TIME_DENOMINATOR = 20;
      GainAnalysis2.MAX_SAMPLES_PER_WINDOW = GainAnalysis2.MAX_SAMP_FREQ * GainAnalysis2.RMS_WINDOW_TIME_NUMERATOR / GainAnalysis2.RMS_WINDOW_TIME_DENOMINATOR + 1;
      function GainAnalysis2() {
      }
      function Presets() {
        function ABRPresets(kbps, comp, compS, joint, fix, shThreshold, shThresholdS, bass, sc, mask, lower, curve, interCh, sfScale) {
          this.quant_comp = comp;
          this.quant_comp_s = compS;
          this.safejoint = joint;
          this.nsmsfix = fix;
          this.st_lrm = shThreshold;
          this.st_s = shThresholdS;
          this.nsbass = bass;
          this.scale = sc;
          this.masking_adj = mask;
          this.ath_lower = lower;
          this.ath_curve = curve;
          this.interch = interCh;
          this.sfscale = sfScale;
        }
        var lame;
        this.setModules = function(_lame) {
          lame = _lame;
        };
        function apply_vbr_preset(gfp, a, enforce) {
          abort();
        }
        var abr_switch_map = [
          new ABRPresets(8, 9, 9, 0, 0, 6.6, 145, 0, 0.95, 0, -30, 11, 12e-4, 1),
          /*   8, impossible to use in stereo */
          new ABRPresets(16, 9, 9, 0, 0, 6.6, 145, 0, 0.95, 0, -25, 11, 1e-3, 1),
          /*  16 */
          new ABRPresets(24, 9, 9, 0, 0, 6.6, 145, 0, 0.95, 0, -20, 11, 1e-3, 1),
          /*  24 */
          new ABRPresets(32, 9, 9, 0, 0, 6.6, 145, 0, 0.95, 0, -15, 11, 1e-3, 1),
          /*  32 */
          new ABRPresets(40, 9, 9, 0, 0, 6.6, 145, 0, 0.95, 0, -10, 11, 9e-4, 1),
          /*  40 */
          new ABRPresets(48, 9, 9, 0, 0, 6.6, 145, 0, 0.95, 0, -10, 11, 9e-4, 1),
          /*  48 */
          new ABRPresets(56, 9, 9, 0, 0, 6.6, 145, 0, 0.95, 0, -6, 11, 8e-4, 1),
          /*  56 */
          new ABRPresets(64, 9, 9, 0, 0, 6.6, 145, 0, 0.95, 0, -2, 11, 8e-4, 1),
          /*  64 */
          new ABRPresets(80, 9, 9, 0, 0, 6.6, 145, 0, 0.95, 0, 0, 8, 7e-4, 1),
          /*  80 */
          new ABRPresets(96, 9, 9, 0, 2.5, 6.6, 145, 0, 0.95, 0, 1, 5.5, 6e-4, 1),
          /*  96 */
          new ABRPresets(112, 9, 9, 0, 2.25, 6.6, 145, 0, 0.95, 0, 2, 4.5, 5e-4, 1),
          /* 112 */
          new ABRPresets(128, 9, 9, 0, 1.95, 6.4, 140, 0, 0.95, 0, 3, 4, 2e-4, 1),
          /* 128 */
          new ABRPresets(160, 9, 9, 1, 1.79, 6, 135, 0, 0.95, -2, 5, 3.5, 0, 1),
          /* 160 */
          new ABRPresets(192, 9, 9, 1, 1.49, 5.6, 125, 0, 0.97, -4, 7, 3, 0, 0),
          /* 192 */
          new ABRPresets(224, 9, 9, 1, 1.25, 5.2, 125, 0, 0.98, -6, 9, 2, 0, 0),
          /* 224 */
          new ABRPresets(256, 9, 9, 1, 0.97, 5.2, 125, 0, 1, -8, 10, 1, 0, 0),
          /* 256 */
          new ABRPresets(320, 9, 9, 1, 0.9, 5.2, 125, 0, 1, -10, 12, 0, 0, 0)
          /* 320 */
        ];
        function apply_abr_preset(gfp, preset, enforce) {
          var actual_bitrate = preset;
          var r = lame.nearestBitrateFullIndex(preset);
          gfp.VBR = VbrMode2.vbr_abr;
          gfp.VBR_mean_bitrate_kbps = actual_bitrate;
          gfp.VBR_mean_bitrate_kbps = Math.min(gfp.VBR_mean_bitrate_kbps, 320);
          gfp.VBR_mean_bitrate_kbps = Math.max(gfp.VBR_mean_bitrate_kbps, 8);
          gfp.brate = gfp.VBR_mean_bitrate_kbps;
          if (gfp.VBR_mean_bitrate_kbps > 320) {
            gfp.disable_reservoir = true;
          }
          if (abr_switch_map[r].safejoint > 0)
            gfp.exp_nspsytune = gfp.exp_nspsytune | 2;
          if (abr_switch_map[r].sfscale > 0) {
            gfp.internal_flags.noise_shaping = 2;
          }
          if (Math.abs(abr_switch_map[r].nsbass) > 0) {
            var k2 = int(abr_switch_map[r].nsbass * 4);
            if (k2 < 0)
              k2 += 64;
            gfp.exp_nspsytune = gfp.exp_nspsytune | k2 << 2;
          }
          if (enforce != 0)
            gfp.quant_comp = abr_switch_map[r].quant_comp;
          else if (!(Math.abs(gfp.quant_comp - -1) > 0))
            gfp.quant_comp = abr_switch_map[r].quant_comp;
          if (enforce != 0)
            gfp.quant_comp_short = abr_switch_map[r].quant_comp_s;
          else if (!(Math.abs(gfp.quant_comp_short - -1) > 0))
            gfp.quant_comp_short = abr_switch_map[r].quant_comp_s;
          if (enforce != 0)
            gfp.msfix = abr_switch_map[r].nsmsfix;
          else if (!(Math.abs(gfp.msfix - -1) > 0))
            gfp.msfix = abr_switch_map[r].nsmsfix;
          if (enforce != 0)
            gfp.internal_flags.nsPsy.attackthre = abr_switch_map[r].st_lrm;
          else if (!(Math.abs(gfp.internal_flags.nsPsy.attackthre - -1) > 0))
            gfp.internal_flags.nsPsy.attackthre = abr_switch_map[r].st_lrm;
          if (enforce != 0)
            gfp.internal_flags.nsPsy.attackthre_s = abr_switch_map[r].st_s;
          else if (!(Math.abs(gfp.internal_flags.nsPsy.attackthre_s - -1) > 0))
            gfp.internal_flags.nsPsy.attackthre_s = abr_switch_map[r].st_s;
          if (enforce != 0)
            gfp.scale = abr_switch_map[r].scale;
          else if (!(Math.abs(gfp.scale - -1) > 0))
            gfp.scale = abr_switch_map[r].scale;
          if (enforce != 0)
            gfp.maskingadjust = abr_switch_map[r].masking_adj;
          else if (!(Math.abs(gfp.maskingadjust - 0) > 0))
            gfp.maskingadjust = abr_switch_map[r].masking_adj;
          if (abr_switch_map[r].masking_adj > 0) {
            if (enforce != 0)
              gfp.maskingadjust_short = abr_switch_map[r].masking_adj * 0.9;
            else if (!(Math.abs(gfp.maskingadjust_short - 0) > 0))
              gfp.maskingadjust_short = abr_switch_map[r].masking_adj * 0.9;
          } else {
            if (enforce != 0)
              gfp.maskingadjust_short = abr_switch_map[r].masking_adj * 1.1;
            else if (!(Math.abs(gfp.maskingadjust_short - 0) > 0))
              gfp.maskingadjust_short = abr_switch_map[r].masking_adj * 1.1;
          }
          if (enforce != 0)
            gfp.ATHlower = -abr_switch_map[r].ath_lower / 10;
          else if (!(Math.abs(-gfp.ATHlower * 10 - 0) > 0))
            gfp.ATHlower = -abr_switch_map[r].ath_lower / 10;
          if (enforce != 0)
            gfp.ATHcurve = abr_switch_map[r].ath_curve;
          else if (!(Math.abs(gfp.ATHcurve - -1) > 0))
            gfp.ATHcurve = abr_switch_map[r].ath_curve;
          if (enforce != 0)
            gfp.interChRatio = abr_switch_map[r].interch;
          else if (!(Math.abs(gfp.interChRatio - -1) > 0))
            gfp.interChRatio = abr_switch_map[r].interch;
          return preset;
        }
        this.apply_preset = function(gfp, preset, enforce) {
          switch (preset) {
            case Lame2.R3MIX: {
              preset = Lame2.V3;
              gfp.VBR = VbrMode2.vbr_mtrh;
              break;
            }
            case Lame2.MEDIUM: {
              preset = Lame2.V4;
              gfp.VBR = VbrMode2.vbr_rh;
              break;
            }
            case Lame2.MEDIUM_FAST: {
              preset = Lame2.V4;
              gfp.VBR = VbrMode2.vbr_mtrh;
              break;
            }
            case Lame2.STANDARD: {
              preset = Lame2.V2;
              gfp.VBR = VbrMode2.vbr_rh;
              break;
            }
            case Lame2.STANDARD_FAST: {
              preset = Lame2.V2;
              gfp.VBR = VbrMode2.vbr_mtrh;
              break;
            }
            case Lame2.EXTREME: {
              preset = Lame2.V0;
              gfp.VBR = VbrMode2.vbr_rh;
              break;
            }
            case Lame2.EXTREME_FAST: {
              preset = Lame2.V0;
              gfp.VBR = VbrMode2.vbr_mtrh;
              break;
            }
            case Lame2.INSANE: {
              preset = 320;
              gfp.preset = preset;
              apply_abr_preset(gfp, preset, enforce);
              gfp.VBR = VbrMode2.vbr_off;
              return preset;
            }
          }
          gfp.preset = preset;
          {
            switch (preset) {
              case Lame2.V9:
                apply_vbr_preset();
                return preset;
              case Lame2.V8:
                apply_vbr_preset();
                return preset;
              case Lame2.V7:
                apply_vbr_preset();
                return preset;
              case Lame2.V6:
                apply_vbr_preset();
                return preset;
              case Lame2.V5:
                apply_vbr_preset();
                return preset;
              case Lame2.V4:
                apply_vbr_preset();
                return preset;
              case Lame2.V3:
                apply_vbr_preset();
                return preset;
              case Lame2.V2:
                apply_vbr_preset();
                return preset;
              case Lame2.V1:
                apply_vbr_preset();
                return preset;
              case Lame2.V0:
                apply_vbr_preset();
                return preset;
            }
          }
          if (8 <= preset && preset <= 320) {
            return apply_abr_preset(gfp, preset, enforce);
          }
          gfp.preset = 0;
          return preset;
        };
      }
      function Reservoir() {
        var bs;
        this.setModules = function(_bs) {
          bs = _bs;
        };
        this.ResvFrameBegin = function(gfp, mean_bits) {
          var gfc = gfp.internal_flags;
          var maxmp3buf;
          var l3_side = gfc.l3_side;
          var frameLength = bs.getframebits(gfp);
          mean_bits.bits = (frameLength - gfc.sideinfo_len * 8) / gfc.mode_gr;
          var resvLimit = 8 * 256 * gfc.mode_gr - 8;
          if (gfp.brate > 320) {
            abort();
          } else {
            maxmp3buf = 8 * 1440;
            if (gfp.strict_ISO) {
              abort();
            }
          }
          gfc.ResvMax = maxmp3buf - frameLength;
          if (gfc.ResvMax > resvLimit)
            gfc.ResvMax = resvLimit;
          if (gfc.ResvMax < 0 || gfp.disable_reservoir)
            gfc.ResvMax = 0;
          var fullFrameBits = mean_bits.bits * gfc.mode_gr + Math.min(gfc.ResvSize, gfc.ResvMax);
          if (fullFrameBits > maxmp3buf)
            fullFrameBits = maxmp3buf;
          l3_side.resvDrain_pre = 0;
          if (gfc.pinfo != null) {
            abort();
          }
          return fullFrameBits;
        };
        this.ResvMaxBits = function(gfp, mean_bits, targ_bits, cbr) {
          var gfc = gfp.internal_flags;
          var add_bits;
          var ResvSize = gfc.ResvSize, ResvMax = gfc.ResvMax;
          if (cbr != 0)
            ResvSize += mean_bits;
          if ((gfc.substep_shaping & 1) != 0)
            ResvMax *= 0.9;
          targ_bits.bits = mean_bits;
          if (ResvSize * 10 > ResvMax * 9) {
            add_bits = ResvSize - ResvMax * 9 / 10;
            targ_bits.bits += add_bits;
            gfc.substep_shaping |= 128;
          } else {
            add_bits = 0;
            gfc.substep_shaping &= 127;
            if (!gfp.disable_reservoir && 0 == (gfc.substep_shaping & 1))
              targ_bits.bits -= 0.1 * mean_bits;
          }
          var extra_bits = ResvSize < gfc.ResvMax * 6 / 10 ? ResvSize : gfc.ResvMax * 6 / 10;
          extra_bits -= add_bits;
          if (extra_bits < 0)
            extra_bits = 0;
          return extra_bits;
        };
        this.ResvAdjust = function(gfc, gi) {
          gfc.ResvSize -= gi.part2_3_length + gi.part2_length;
        };
        this.ResvFrameEnd = function(gfc, mean_bits) {
          var over_bits;
          var l3_side = gfc.l3_side;
          gfc.ResvSize += mean_bits * gfc.mode_gr;
          var stuffingBits = 0;
          l3_side.resvDrain_post = 0;
          l3_side.resvDrain_pre = 0;
          if ((over_bits = gfc.ResvSize % 8) != 0)
            stuffingBits += over_bits;
          over_bits = gfc.ResvSize - stuffingBits - gfc.ResvMax;
          if (over_bits > 0) {
            stuffingBits += over_bits;
          }
          {
            var mdb_bytes = Math.min(l3_side.main_data_begin * 8, stuffingBits) / 8;
            l3_side.resvDrain_pre += 8 * mdb_bytes;
            stuffingBits -= 8 * mdb_bytes;
            gfc.ResvSize -= 8 * mdb_bytes;
            l3_side.main_data_begin -= mdb_bytes;
          }
          l3_side.resvDrain_post += stuffingBits;
          gfc.ResvSize -= stuffingBits;
        };
      }
      VBRTag2.NUMTOCENTRIES = 100;
      VBRTag2.MAXFRAMESIZE = 2880;
      function VBRTag2() {
        this.setModules = function(_lame, _bs, _v) {
        };
        var crc16Lookup = [
          0,
          49345,
          49537,
          320,
          49921,
          960,
          640,
          49729,
          50689,
          1728,
          1920,
          51009,
          1280,
          50625,
          50305,
          1088,
          52225,
          3264,
          3456,
          52545,
          3840,
          53185,
          52865,
          3648,
          2560,
          51905,
          52097,
          2880,
          51457,
          2496,
          2176,
          51265,
          55297,
          6336,
          6528,
          55617,
          6912,
          56257,
          55937,
          6720,
          7680,
          57025,
          57217,
          8e3,
          56577,
          7616,
          7296,
          56385,
          5120,
          54465,
          54657,
          5440,
          55041,
          6080,
          5760,
          54849,
          53761,
          4800,
          4992,
          54081,
          4352,
          53697,
          53377,
          4160,
          61441,
          12480,
          12672,
          61761,
          13056,
          62401,
          62081,
          12864,
          13824,
          63169,
          63361,
          14144,
          62721,
          13760,
          13440,
          62529,
          15360,
          64705,
          64897,
          15680,
          65281,
          16320,
          16e3,
          65089,
          64001,
          15040,
          15232,
          64321,
          14592,
          63937,
          63617,
          14400,
          10240,
          59585,
          59777,
          10560,
          60161,
          11200,
          10880,
          59969,
          60929,
          11968,
          12160,
          61249,
          11520,
          60865,
          60545,
          11328,
          58369,
          9408,
          9600,
          58689,
          9984,
          59329,
          59009,
          9792,
          8704,
          58049,
          58241,
          9024,
          57601,
          8640,
          8320,
          57409,
          40961,
          24768,
          24960,
          41281,
          25344,
          41921,
          41601,
          25152,
          26112,
          42689,
          42881,
          26432,
          42241,
          26048,
          25728,
          42049,
          27648,
          44225,
          44417,
          27968,
          44801,
          28608,
          28288,
          44609,
          43521,
          27328,
          27520,
          43841,
          26880,
          43457,
          43137,
          26688,
          30720,
          47297,
          47489,
          31040,
          47873,
          31680,
          31360,
          47681,
          48641,
          32448,
          32640,
          48961,
          32e3,
          48577,
          48257,
          31808,
          46081,
          29888,
          30080,
          46401,
          30464,
          47041,
          46721,
          30272,
          29184,
          45761,
          45953,
          29504,
          45313,
          29120,
          28800,
          45121,
          20480,
          37057,
          37249,
          20800,
          37633,
          21440,
          21120,
          37441,
          38401,
          22208,
          22400,
          38721,
          21760,
          38337,
          38017,
          21568,
          39937,
          23744,
          23936,
          40257,
          24320,
          40897,
          40577,
          24128,
          23040,
          39617,
          39809,
          23360,
          39169,
          22976,
          22656,
          38977,
          34817,
          18624,
          18816,
          35137,
          19200,
          35777,
          35457,
          19008,
          19968,
          36545,
          36737,
          20288,
          36097,
          19904,
          19584,
          35905,
          17408,
          33985,
          34177,
          17728,
          34561,
          18368,
          18048,
          34369,
          33281,
          17088,
          17280,
          33601,
          16640,
          33217,
          32897,
          16448
        ];
        function crcUpdateLookup(value, crc) {
          var tmp = crc ^ value;
          crc = crc >> 8 ^ crc16Lookup[tmp & 255];
          return crc;
        }
        this.updateMusicCRC = function(crc, buffer, bufferPos, size) {
          for (var i = 0; i < size; ++i)
            crc[0] = crcUpdateLookup(buffer[bufferPos + i], crc[0]);
        };
      }
      BitStream.EQ = function(a, b) {
        return Math.abs(a) > Math.abs(b) ? Math.abs(a - b) <= Math.abs(a) * 1e-6 : Math.abs(a - b) <= Math.abs(b) * 1e-6;
      };
      BitStream.NEQ = function(a, b) {
        return !BitStream.EQ(a, b);
      };
      function BitStream() {
        var self2 = this;
        var ver = null;
        var vbr = null;
        this.setModules = function(_ga, _mpg, _ver, _vbr) {
          ver = _ver;
          vbr = _vbr;
        };
        var buf = null;
        var totbit = 0;
        var bufByteIdx = 0;
        var bufBitIdx = 0;
        this.getframebits = function(gfp) {
          var gfc = gfp.internal_flags;
          var bit_rate;
          if (gfc.bitrate_index != 0)
            bit_rate = Tables2.bitrate_table[gfp.version][gfc.bitrate_index];
          else
            bit_rate = gfp.brate;
          var bytes = 0 | (gfp.version + 1) * 72e3 * bit_rate / gfp.out_samplerate + gfc.padding;
          return 8 * bytes;
        };
        function putheader_bits(gfc) {
          System2.arraycopy(gfc.header[gfc.w_ptr].buf, 0, buf, bufByteIdx, gfc.sideinfo_len);
          bufByteIdx += gfc.sideinfo_len;
          totbit += gfc.sideinfo_len * 8;
          gfc.w_ptr = gfc.w_ptr + 1 & LameInternalFlags2.MAX_HEADER_BUF - 1;
        }
        function putbits2(gfc, val, j) {
          while (j > 0) {
            var k2;
            if (bufBitIdx == 0) {
              bufBitIdx = 8;
              bufByteIdx++;
              if (gfc.header[gfc.w_ptr].write_timing == totbit) {
                putheader_bits(gfc);
              }
              buf[bufByteIdx] = 0;
            }
            k2 = Math.min(j, bufBitIdx);
            j -= k2;
            bufBitIdx -= k2;
            buf[bufByteIdx] |= val >> j << bufBitIdx;
            totbit += k2;
          }
        }
        function drain_into_ancillary(gfp, remainingBits) {
          var gfc = gfp.internal_flags;
          var i;
          if (remainingBits >= 8) {
            putbits2(gfc, 76, 8);
            remainingBits -= 8;
          }
          if (remainingBits >= 8) {
            putbits2(gfc, 65, 8);
            remainingBits -= 8;
          }
          if (remainingBits >= 8) {
            putbits2(gfc, 77, 8);
            remainingBits -= 8;
          }
          if (remainingBits >= 8) {
            putbits2(gfc, 69, 8);
            remainingBits -= 8;
          }
          if (remainingBits >= 32) {
            var version = ver.getLameShortVersion();
            if (remainingBits >= 32)
              for (i = 0; i < version.length && remainingBits >= 8; ++i) {
                remainingBits -= 8;
                putbits2(gfc, version.charCodeAt(i), 8);
              }
          }
          for (; remainingBits >= 1; remainingBits -= 1) {
            putbits2(gfc, gfc.ancillary_flag, 1);
            gfc.ancillary_flag ^= !gfp.disable_reservoir ? 1 : 0;
          }
        }
        function writeheader(gfc, val, j) {
          var ptr = gfc.header[gfc.h_ptr].ptr;
          while (j > 0) {
            var k2 = Math.min(j, 8 - (ptr & 7));
            j -= k2;
            gfc.header[gfc.h_ptr].buf[ptr >> 3] |= val >> j << 8 - (ptr & 7) - k2;
            ptr += k2;
          }
          gfc.header[gfc.h_ptr].ptr = ptr;
        }
        function encodeSideInfo2(gfp, bitsPerFrame) {
          var gfc = gfp.internal_flags;
          var l3_side;
          var gr, ch;
          l3_side = gfc.l3_side;
          gfc.header[gfc.h_ptr].ptr = 0;
          Arrays2.fill(gfc.header[gfc.h_ptr].buf, 0, gfc.sideinfo_len, 0);
          if (gfp.out_samplerate < 16e3)
            writeheader(gfc, 4094, 12);
          else
            writeheader(gfc, 4095, 12);
          writeheader(gfc, gfp.version, 1);
          writeheader(gfc, 4 - 3, 2);
          writeheader(gfc, !gfp.error_protection ? 1 : 0, 1);
          writeheader(gfc, gfc.bitrate_index, 4);
          writeheader(gfc, gfc.samplerate_index, 2);
          writeheader(gfc, gfc.padding, 1);
          writeheader(gfc, gfp.extension, 1);
          writeheader(gfc, gfp.mode.ordinal(), 2);
          writeheader(gfc, gfc.mode_ext, 2);
          writeheader(gfc, gfp.copyright, 1);
          writeheader(gfc, gfp.original, 1);
          writeheader(gfc, gfp.emphasis, 2);
          if (gfp.error_protection) {
            writeheader(gfc, 0, 16);
          }
          if (gfp.version == 1) {
            writeheader(gfc, l3_side.main_data_begin, 9);
            if (gfc.channels_out == 2)
              writeheader(gfc, l3_side.private_bits, 3);
            else
              writeheader(gfc, l3_side.private_bits, 5);
            for (ch = 0; ch < gfc.channels_out; ch++) {
              var band;
              for (band = 0; band < 4; band++) {
                writeheader(gfc, l3_side.scfsi[ch][band], 1);
              }
            }
            for (gr = 0; gr < 2; gr++) {
              for (ch = 0; ch < gfc.channels_out; ch++) {
                var gi = l3_side.tt[gr][ch];
                writeheader(gfc, gi.part2_3_length + gi.part2_length, 12);
                writeheader(gfc, gi.big_values / 2, 9);
                writeheader(gfc, gi.global_gain, 8);
                writeheader(gfc, gi.scalefac_compress, 4);
                if (gi.block_type != Encoder2.NORM_TYPE) {
                  writeheader(gfc, 1, 1);
                  writeheader(gfc, gi.block_type, 2);
                  writeheader(gfc, gi.mixed_block_flag, 1);
                  if (gi.table_select[0] == 14)
                    gi.table_select[0] = 16;
                  writeheader(gfc, gi.table_select[0], 5);
                  if (gi.table_select[1] == 14)
                    gi.table_select[1] = 16;
                  writeheader(gfc, gi.table_select[1], 5);
                  writeheader(gfc, gi.subblock_gain[0], 3);
                  writeheader(gfc, gi.subblock_gain[1], 3);
                  writeheader(gfc, gi.subblock_gain[2], 3);
                } else {
                  writeheader(gfc, 0, 1);
                  if (gi.table_select[0] == 14)
                    gi.table_select[0] = 16;
                  writeheader(gfc, gi.table_select[0], 5);
                  if (gi.table_select[1] == 14)
                    gi.table_select[1] = 16;
                  writeheader(gfc, gi.table_select[1], 5);
                  if (gi.table_select[2] == 14)
                    gi.table_select[2] = 16;
                  writeheader(gfc, gi.table_select[2], 5);
                  writeheader(gfc, gi.region0_count, 4);
                  writeheader(gfc, gi.region1_count, 3);
                }
                writeheader(gfc, gi.preflag, 1);
                writeheader(gfc, gi.scalefac_scale, 1);
                writeheader(gfc, gi.count1table_select, 1);
              }
            }
          } else {
            writeheader(gfc, l3_side.main_data_begin, 8);
            writeheader(gfc, l3_side.private_bits, gfc.channels_out);
            gr = 0;
            for (ch = 0; ch < gfc.channels_out; ch++) {
              var gi = l3_side.tt[gr][ch];
              writeheader(gfc, gi.part2_3_length + gi.part2_length, 12);
              writeheader(gfc, gi.big_values / 2, 9);
              writeheader(gfc, gi.global_gain, 8);
              writeheader(gfc, gi.scalefac_compress, 9);
              if (gi.block_type != Encoder2.NORM_TYPE) {
                writeheader(gfc, 1, 1);
                writeheader(gfc, gi.block_type, 2);
                writeheader(gfc, gi.mixed_block_flag, 1);
                if (gi.table_select[0] == 14)
                  gi.table_select[0] = 16;
                writeheader(gfc, gi.table_select[0], 5);
                if (gi.table_select[1] == 14)
                  gi.table_select[1] = 16;
                writeheader(gfc, gi.table_select[1], 5);
                writeheader(gfc, gi.subblock_gain[0], 3);
                writeheader(gfc, gi.subblock_gain[1], 3);
                writeheader(gfc, gi.subblock_gain[2], 3);
              } else {
                writeheader(gfc, 0, 1);
                if (gi.table_select[0] == 14)
                  gi.table_select[0] = 16;
                writeheader(gfc, gi.table_select[0], 5);
                if (gi.table_select[1] == 14)
                  gi.table_select[1] = 16;
                writeheader(gfc, gi.table_select[1], 5);
                if (gi.table_select[2] == 14)
                  gi.table_select[2] = 16;
                writeheader(gfc, gi.table_select[2], 5);
                writeheader(gfc, gi.region0_count, 4);
                writeheader(gfc, gi.region1_count, 3);
              }
              writeheader(gfc, gi.scalefac_scale, 1);
              writeheader(gfc, gi.count1table_select, 1);
            }
          }
          if (gfp.error_protection) {
            abort();
          }
          {
            var old = gfc.h_ptr;
            gfc.h_ptr = old + 1 & LameInternalFlags2.MAX_HEADER_BUF - 1;
            gfc.header[gfc.h_ptr].write_timing = gfc.header[old].write_timing + bitsPerFrame;
            if (gfc.h_ptr == gfc.w_ptr) ;
          }
        }
        function huffman_coder_count1(gfc, gi) {
          var h = Tables2.ht[gi.count1table_select + 32];
          var i, bits = 0;
          var ix = gi.big_values;
          var xr = gi.big_values;
          for (i = (gi.count1 - gi.big_values) / 4; i > 0; --i) {
            var huffbits = 0;
            var p2 = 0, v;
            v = gi.l3_enc[ix + 0];
            if (v != 0) {
              p2 += 8;
              if (gi.xr[xr + 0] < 0)
                huffbits++;
            }
            v = gi.l3_enc[ix + 1];
            if (v != 0) {
              p2 += 4;
              huffbits *= 2;
              if (gi.xr[xr + 1] < 0)
                huffbits++;
            }
            v = gi.l3_enc[ix + 2];
            if (v != 0) {
              p2 += 2;
              huffbits *= 2;
              if (gi.xr[xr + 2] < 0)
                huffbits++;
            }
            v = gi.l3_enc[ix + 3];
            if (v != 0) {
              p2++;
              huffbits *= 2;
              if (gi.xr[xr + 3] < 0)
                huffbits++;
            }
            ix += 4;
            xr += 4;
            putbits2(gfc, huffbits + h.table[p2], h.hlen[p2]);
            bits += h.hlen[p2];
          }
          return bits;
        }
        function Huffmancode(gfc, tableindex, start, end, gi) {
          var h = Tables2.ht[tableindex];
          var bits = 0;
          if (0 == tableindex)
            return bits;
          for (var i = start; i < end; i += 2) {
            var cbits = 0;
            var xbits = 0;
            var linbits = h.xlen;
            var xlen = h.xlen;
            var ext = 0;
            var x1 = gi.l3_enc[i];
            var x2 = gi.l3_enc[i + 1];
            if (x1 != 0) {
              if (gi.xr[i] < 0)
                ext++;
              cbits--;
            }
            if (tableindex > 15) {
              if (x1 > 14) {
                var linbits_x1 = x1 - 15;
                ext |= linbits_x1 << 1;
                xbits = linbits;
                x1 = 15;
              }
              if (x2 > 14) {
                var linbits_x2 = x2 - 15;
                ext <<= linbits;
                ext |= linbits_x2;
                xbits += linbits;
                x2 = 15;
              }
              xlen = 16;
            }
            if (x2 != 0) {
              ext <<= 1;
              if (gi.xr[i + 1] < 0)
                ext++;
              cbits--;
            }
            x1 = x1 * xlen + x2;
            xbits -= cbits;
            cbits += h.hlen[x1];
            putbits2(gfc, h.table[x1], cbits);
            putbits2(gfc, ext, xbits);
            bits += cbits + xbits;
          }
          return bits;
        }
        function ShortHuffmancodebits(gfc, gi) {
          var region1Start = 3 * gfc.scalefac_band.s[3];
          if (region1Start > gi.big_values)
            region1Start = gi.big_values;
          var bits = Huffmancode(gfc, gi.table_select[0], 0, region1Start, gi);
          bits += Huffmancode(
            gfc,
            gi.table_select[1],
            region1Start,
            gi.big_values,
            gi
          );
          return bits;
        }
        function LongHuffmancodebits(gfc, gi) {
          var bigvalues, bits;
          var region1Start, region2Start;
          bigvalues = gi.big_values;
          var i = gi.region0_count + 1;
          region1Start = gfc.scalefac_band.l[i];
          i += gi.region1_count + 1;
          region2Start = gfc.scalefac_band.l[i];
          if (region1Start > bigvalues)
            region1Start = bigvalues;
          if (region2Start > bigvalues)
            region2Start = bigvalues;
          bits = Huffmancode(gfc, gi.table_select[0], 0, region1Start, gi);
          bits += Huffmancode(
            gfc,
            gi.table_select[1],
            region1Start,
            region2Start,
            gi
          );
          bits += Huffmancode(
            gfc,
            gi.table_select[2],
            region2Start,
            bigvalues,
            gi
          );
          return bits;
        }
        function writeMainData(gfp) {
          var gr, ch, sfb, data_bits, tot_bits = 0;
          var gfc = gfp.internal_flags;
          var l3_side = gfc.l3_side;
          if (gfp.version == 1) {
            for (gr = 0; gr < 2; gr++) {
              for (ch = 0; ch < gfc.channels_out; ch++) {
                var gi = l3_side.tt[gr][ch];
                var slen1 = Takehiro.slen1_tab[gi.scalefac_compress];
                var slen2 = Takehiro.slen2_tab[gi.scalefac_compress];
                data_bits = 0;
                for (sfb = 0; sfb < gi.sfbdivide; sfb++) {
                  if (gi.scalefac[sfb] == -1)
                    continue;
                  putbits2(gfc, gi.scalefac[sfb], slen1);
                  data_bits += slen1;
                }
                for (; sfb < gi.sfbmax; sfb++) {
                  if (gi.scalefac[sfb] == -1)
                    continue;
                  putbits2(gfc, gi.scalefac[sfb], slen2);
                  data_bits += slen2;
                }
                if (gi.block_type == Encoder2.SHORT_TYPE) {
                  data_bits += ShortHuffmancodebits(gfc, gi);
                } else {
                  data_bits += LongHuffmancodebits(gfc, gi);
                }
                data_bits += huffman_coder_count1(gfc, gi);
                tot_bits += data_bits;
              }
            }
          } else {
            gr = 0;
            for (ch = 0; ch < gfc.channels_out; ch++) {
              var gi = l3_side.tt[gr][ch];
              var i, sfb_partition, scale_bits = 0;
              data_bits = 0;
              sfb = 0;
              sfb_partition = 0;
              if (gi.block_type == Encoder2.SHORT_TYPE) {
                for (; sfb_partition < 4; sfb_partition++) {
                  var sfbs = gi.sfb_partition_table[sfb_partition] / 3;
                  var slen = gi.slen[sfb_partition];
                  for (i = 0; i < sfbs; i++, sfb++) {
                    putbits2(
                      gfc,
                      Math.max(gi.scalefac[sfb * 3 + 0], 0),
                      slen
                    );
                    putbits2(
                      gfc,
                      Math.max(gi.scalefac[sfb * 3 + 1], 0),
                      slen
                    );
                    putbits2(
                      gfc,
                      Math.max(gi.scalefac[sfb * 3 + 2], 0),
                      slen
                    );
                    scale_bits += 3 * slen;
                  }
                }
                data_bits += ShortHuffmancodebits(gfc, gi);
              } else {
                for (; sfb_partition < 4; sfb_partition++) {
                  var sfbs = gi.sfb_partition_table[sfb_partition];
                  var slen = gi.slen[sfb_partition];
                  for (i = 0; i < sfbs; i++, sfb++) {
                    putbits2(gfc, Math.max(gi.scalefac[sfb], 0), slen);
                    scale_bits += slen;
                  }
                }
                data_bits += LongHuffmancodebits(gfc, gi);
              }
              data_bits += huffman_coder_count1(gfc, gi);
              tot_bits += scale_bits + data_bits;
            }
          }
          return tot_bits;
        }
        function TotalBytes() {
          this.total = 0;
        }
        function compute_flushbits(gfp, total_bytes_output) {
          var gfc = gfp.internal_flags;
          var flushbits;
          var bitsPerFrame;
          var last_ptr;
          gfc.w_ptr;
          last_ptr = gfc.h_ptr - 1;
          if (last_ptr == -1)
            last_ptr = LameInternalFlags2.MAX_HEADER_BUF - 1;
          flushbits = gfc.header[last_ptr].write_timing - totbit;
          total_bytes_output.total = flushbits;
          if (flushbits >= 0) {
            abort();
          }
          bitsPerFrame = self2.getframebits(gfp);
          flushbits += bitsPerFrame;
          total_bytes_output.total += bitsPerFrame;
          if (total_bytes_output.total % 8 != 0)
            total_bytes_output.total = 1 + total_bytes_output.total / 8;
          else
            total_bytes_output.total = total_bytes_output.total / 8;
          total_bytes_output.total += bufByteIdx + 1;
          return flushbits;
        }
        this.flush_bitstream = function(gfp) {
          var gfc = gfp.internal_flags;
          var l3_side;
          var flushbits;
          gfc.h_ptr - 1;
          l3_side = gfc.l3_side;
          if ((flushbits = compute_flushbits(gfp, new TotalBytes())) < 0)
            return;
          drain_into_ancillary(gfp, flushbits);
          gfc.ResvSize = 0;
          l3_side.main_data_begin = 0;
          if (gfc.findReplayGain) {
            abort();
          }
          if (gfc.findPeakSample) {
            abort();
          }
        };
        this.format_bitstream = function(gfp) {
          var gfc = gfp.internal_flags;
          var l3_side;
          l3_side = gfc.l3_side;
          var bitsPerFrame = this.getframebits(gfp);
          drain_into_ancillary(gfp, l3_side.resvDrain_pre);
          encodeSideInfo2(gfp, bitsPerFrame);
          var bits = 8 * gfc.sideinfo_len;
          bits += writeMainData(gfp);
          drain_into_ancillary(gfp, l3_side.resvDrain_post);
          bits += l3_side.resvDrain_post;
          l3_side.main_data_begin += (bitsPerFrame - bits) / 8;
          if (compute_flushbits(gfp, new TotalBytes()) != gfc.ResvSize) ;
          if (l3_side.main_data_begin * 8 != gfc.ResvSize) {
            gfc.ResvSize = l3_side.main_data_begin * 8;
          }
          if (totbit > 1e9) {
            var i;
            for (i = 0; i < LameInternalFlags2.MAX_HEADER_BUF; ++i)
              gfc.header[i].write_timing -= totbit;
            totbit = 0;
          }
          return 0;
        };
        this.copy_buffer = function(gfc, buffer, bufferPos, size, mp3data) {
          var minimum = bufByteIdx + 1;
          if (minimum <= 0)
            return 0;
          if (size != 0 && minimum > size) {
            return -1;
          }
          System2.arraycopy(buf, 0, buffer, bufferPos, minimum);
          bufByteIdx = -1;
          bufBitIdx = 0;
          if (mp3data != 0) {
            var crc = new_int2(1);
            crc[0] = gfc.nMusicCRC;
            vbr.updateMusicCRC(crc, buffer, bufferPos, minimum);
            gfc.nMusicCRC = crc[0];
            if (minimum > 0) {
              gfc.VBR_seek_table.nBytesWritten += minimum;
            }
            if (gfc.decode_on_the_fly) {
              abort();
            }
          }
          return minimum;
        };
        this.init_bit_stream_w = function(gfc) {
          buf = new_byte2(Lame2.LAME_MAXMP3BUFFER);
          gfc.h_ptr = gfc.w_ptr = 0;
          gfc.header[gfc.h_ptr].write_timing = 0;
          bufByteIdx = -1;
          bufBitIdx = 0;
          totbit = 0;
        };
      }
      function HuffCodeTab2(len, max, tab, hl) {
        this.xlen = len;
        this.linmax = max;
        this.table = tab;
        this.hlen = hl;
      }
      var Tables2 = {};
      Tables2.t1HB = [
        1,
        1,
        1,
        0
      ];
      Tables2.t2HB = [
        1,
        2,
        1,
        3,
        1,
        1,
        3,
        2,
        0
      ];
      Tables2.t3HB = [
        3,
        2,
        1,
        1,
        1,
        1,
        3,
        2,
        0
      ];
      Tables2.t5HB = [
        1,
        2,
        6,
        5,
        3,
        1,
        4,
        4,
        7,
        5,
        7,
        1,
        6,
        1,
        1,
        0
      ];
      Tables2.t6HB = [
        7,
        3,
        5,
        1,
        6,
        2,
        3,
        2,
        5,
        4,
        4,
        1,
        3,
        3,
        2,
        0
      ];
      Tables2.t7HB = [
        1,
        2,
        10,
        19,
        16,
        10,
        3,
        3,
        7,
        10,
        5,
        3,
        11,
        4,
        13,
        17,
        8,
        4,
        12,
        11,
        18,
        15,
        11,
        2,
        7,
        6,
        9,
        14,
        3,
        1,
        6,
        4,
        5,
        3,
        2,
        0
      ];
      Tables2.t8HB = [
        3,
        4,
        6,
        18,
        12,
        5,
        5,
        1,
        2,
        16,
        9,
        3,
        7,
        3,
        5,
        14,
        7,
        3,
        19,
        17,
        15,
        13,
        10,
        4,
        13,
        5,
        8,
        11,
        5,
        1,
        12,
        4,
        4,
        1,
        1,
        0
      ];
      Tables2.t9HB = [
        7,
        5,
        9,
        14,
        15,
        7,
        6,
        4,
        5,
        5,
        6,
        7,
        7,
        6,
        8,
        8,
        8,
        5,
        15,
        6,
        9,
        10,
        5,
        1,
        11,
        7,
        9,
        6,
        4,
        1,
        14,
        4,
        6,
        2,
        6,
        0
      ];
      Tables2.t10HB = [
        1,
        2,
        10,
        23,
        35,
        30,
        12,
        17,
        3,
        3,
        8,
        12,
        18,
        21,
        12,
        7,
        11,
        9,
        15,
        21,
        32,
        40,
        19,
        6,
        14,
        13,
        22,
        34,
        46,
        23,
        18,
        7,
        20,
        19,
        33,
        47,
        27,
        22,
        9,
        3,
        31,
        22,
        41,
        26,
        21,
        20,
        5,
        3,
        14,
        13,
        10,
        11,
        16,
        6,
        5,
        1,
        9,
        8,
        7,
        8,
        4,
        4,
        2,
        0
      ];
      Tables2.t11HB = [
        3,
        4,
        10,
        24,
        34,
        33,
        21,
        15,
        5,
        3,
        4,
        10,
        32,
        17,
        11,
        10,
        11,
        7,
        13,
        18,
        30,
        31,
        20,
        5,
        25,
        11,
        19,
        59,
        27,
        18,
        12,
        5,
        35,
        33,
        31,
        58,
        30,
        16,
        7,
        5,
        28,
        26,
        32,
        19,
        17,
        15,
        8,
        14,
        14,
        12,
        9,
        13,
        14,
        9,
        4,
        1,
        11,
        4,
        6,
        6,
        6,
        3,
        2,
        0
      ];
      Tables2.t12HB = [
        9,
        6,
        16,
        33,
        41,
        39,
        38,
        26,
        7,
        5,
        6,
        9,
        23,
        16,
        26,
        11,
        17,
        7,
        11,
        14,
        21,
        30,
        10,
        7,
        17,
        10,
        15,
        12,
        18,
        28,
        14,
        5,
        32,
        13,
        22,
        19,
        18,
        16,
        9,
        5,
        40,
        17,
        31,
        29,
        17,
        13,
        4,
        2,
        27,
        12,
        11,
        15,
        10,
        7,
        4,
        1,
        27,
        12,
        8,
        12,
        6,
        3,
        1,
        0
      ];
      Tables2.t13HB = [
        1,
        5,
        14,
        21,
        34,
        51,
        46,
        71,
        42,
        52,
        68,
        52,
        67,
        44,
        43,
        19,
        3,
        4,
        12,
        19,
        31,
        26,
        44,
        33,
        31,
        24,
        32,
        24,
        31,
        35,
        22,
        14,
        15,
        13,
        23,
        36,
        59,
        49,
        77,
        65,
        29,
        40,
        30,
        40,
        27,
        33,
        42,
        16,
        22,
        20,
        37,
        61,
        56,
        79,
        73,
        64,
        43,
        76,
        56,
        37,
        26,
        31,
        25,
        14,
        35,
        16,
        60,
        57,
        97,
        75,
        114,
        91,
        54,
        73,
        55,
        41,
        48,
        53,
        23,
        24,
        58,
        27,
        50,
        96,
        76,
        70,
        93,
        84,
        77,
        58,
        79,
        29,
        74,
        49,
        41,
        17,
        47,
        45,
        78,
        74,
        115,
        94,
        90,
        79,
        69,
        83,
        71,
        50,
        59,
        38,
        36,
        15,
        72,
        34,
        56,
        95,
        92,
        85,
        91,
        90,
        86,
        73,
        77,
        65,
        51,
        44,
        43,
        42,
        43,
        20,
        30,
        44,
        55,
        78,
        72,
        87,
        78,
        61,
        46,
        54,
        37,
        30,
        20,
        16,
        53,
        25,
        41,
        37,
        44,
        59,
        54,
        81,
        66,
        76,
        57,
        54,
        37,
        18,
        39,
        11,
        35,
        33,
        31,
        57,
        42,
        82,
        72,
        80,
        47,
        58,
        55,
        21,
        22,
        26,
        38,
        22,
        53,
        25,
        23,
        38,
        70,
        60,
        51,
        36,
        55,
        26,
        34,
        23,
        27,
        14,
        9,
        7,
        34,
        32,
        28,
        39,
        49,
        75,
        30,
        52,
        48,
        40,
        52,
        28,
        18,
        17,
        9,
        5,
        45,
        21,
        34,
        64,
        56,
        50,
        49,
        45,
        31,
        19,
        12,
        15,
        10,
        7,
        6,
        3,
        48,
        23,
        20,
        39,
        36,
        35,
        53,
        21,
        16,
        23,
        13,
        10,
        6,
        1,
        4,
        2,
        16,
        15,
        17,
        27,
        25,
        20,
        29,
        11,
        17,
        12,
        16,
        8,
        1,
        1,
        0,
        1
      ];
      Tables2.t15HB = [
        7,
        12,
        18,
        53,
        47,
        76,
        124,
        108,
        89,
        123,
        108,
        119,
        107,
        81,
        122,
        63,
        13,
        5,
        16,
        27,
        46,
        36,
        61,
        51,
        42,
        70,
        52,
        83,
        65,
        41,
        59,
        36,
        19,
        17,
        15,
        24,
        41,
        34,
        59,
        48,
        40,
        64,
        50,
        78,
        62,
        80,
        56,
        33,
        29,
        28,
        25,
        43,
        39,
        63,
        55,
        93,
        76,
        59,
        93,
        72,
        54,
        75,
        50,
        29,
        52,
        22,
        42,
        40,
        67,
        57,
        95,
        79,
        72,
        57,
        89,
        69,
        49,
        66,
        46,
        27,
        77,
        37,
        35,
        66,
        58,
        52,
        91,
        74,
        62,
        48,
        79,
        63,
        90,
        62,
        40,
        38,
        125,
        32,
        60,
        56,
        50,
        92,
        78,
        65,
        55,
        87,
        71,
        51,
        73,
        51,
        70,
        30,
        109,
        53,
        49,
        94,
        88,
        75,
        66,
        122,
        91,
        73,
        56,
        42,
        64,
        44,
        21,
        25,
        90,
        43,
        41,
        77,
        73,
        63,
        56,
        92,
        77,
        66,
        47,
        67,
        48,
        53,
        36,
        20,
        71,
        34,
        67,
        60,
        58,
        49,
        88,
        76,
        67,
        106,
        71,
        54,
        38,
        39,
        23,
        15,
        109,
        53,
        51,
        47,
        90,
        82,
        58,
        57,
        48,
        72,
        57,
        41,
        23,
        27,
        62,
        9,
        86,
        42,
        40,
        37,
        70,
        64,
        52,
        43,
        70,
        55,
        42,
        25,
        29,
        18,
        11,
        11,
        118,
        68,
        30,
        55,
        50,
        46,
        74,
        65,
        49,
        39,
        24,
        16,
        22,
        13,
        14,
        7,
        91,
        44,
        39,
        38,
        34,
        63,
        52,
        45,
        31,
        52,
        28,
        19,
        14,
        8,
        9,
        3,
        123,
        60,
        58,
        53,
        47,
        43,
        32,
        22,
        37,
        24,
        17,
        12,
        15,
        10,
        2,
        1,
        71,
        37,
        34,
        30,
        28,
        20,
        17,
        26,
        21,
        16,
        10,
        6,
        8,
        6,
        2,
        0
      ];
      Tables2.t16HB = [
        1,
        5,
        14,
        44,
        74,
        63,
        110,
        93,
        172,
        149,
        138,
        242,
        225,
        195,
        376,
        17,
        3,
        4,
        12,
        20,
        35,
        62,
        53,
        47,
        83,
        75,
        68,
        119,
        201,
        107,
        207,
        9,
        15,
        13,
        23,
        38,
        67,
        58,
        103,
        90,
        161,
        72,
        127,
        117,
        110,
        209,
        206,
        16,
        45,
        21,
        39,
        69,
        64,
        114,
        99,
        87,
        158,
        140,
        252,
        212,
        199,
        387,
        365,
        26,
        75,
        36,
        68,
        65,
        115,
        101,
        179,
        164,
        155,
        264,
        246,
        226,
        395,
        382,
        362,
        9,
        66,
        30,
        59,
        56,
        102,
        185,
        173,
        265,
        142,
        253,
        232,
        400,
        388,
        378,
        445,
        16,
        111,
        54,
        52,
        100,
        184,
        178,
        160,
        133,
        257,
        244,
        228,
        217,
        385,
        366,
        715,
        10,
        98,
        48,
        91,
        88,
        165,
        157,
        148,
        261,
        248,
        407,
        397,
        372,
        380,
        889,
        884,
        8,
        85,
        84,
        81,
        159,
        156,
        143,
        260,
        249,
        427,
        401,
        392,
        383,
        727,
        713,
        708,
        7,
        154,
        76,
        73,
        141,
        131,
        256,
        245,
        426,
        406,
        394,
        384,
        735,
        359,
        710,
        352,
        11,
        139,
        129,
        67,
        125,
        247,
        233,
        229,
        219,
        393,
        743,
        737,
        720,
        885,
        882,
        439,
        4,
        243,
        120,
        118,
        115,
        227,
        223,
        396,
        746,
        742,
        736,
        721,
        712,
        706,
        223,
        436,
        6,
        202,
        224,
        222,
        218,
        216,
        389,
        386,
        381,
        364,
        888,
        443,
        707,
        440,
        437,
        1728,
        4,
        747,
        211,
        210,
        208,
        370,
        379,
        734,
        723,
        714,
        1735,
        883,
        877,
        876,
        3459,
        865,
        2,
        377,
        369,
        102,
        187,
        726,
        722,
        358,
        711,
        709,
        866,
        1734,
        871,
        3458,
        870,
        434,
        0,
        12,
        10,
        7,
        11,
        10,
        17,
        11,
        9,
        13,
        12,
        10,
        7,
        5,
        3,
        1,
        3
      ];
      Tables2.t24HB = [
        15,
        13,
        46,
        80,
        146,
        262,
        248,
        434,
        426,
        669,
        653,
        649,
        621,
        517,
        1032,
        88,
        14,
        12,
        21,
        38,
        71,
        130,
        122,
        216,
        209,
        198,
        327,
        345,
        319,
        297,
        279,
        42,
        47,
        22,
        41,
        74,
        68,
        128,
        120,
        221,
        207,
        194,
        182,
        340,
        315,
        295,
        541,
        18,
        81,
        39,
        75,
        70,
        134,
        125,
        116,
        220,
        204,
        190,
        178,
        325,
        311,
        293,
        271,
        16,
        147,
        72,
        69,
        135,
        127,
        118,
        112,
        210,
        200,
        188,
        352,
        323,
        306,
        285,
        540,
        14,
        263,
        66,
        129,
        126,
        119,
        114,
        214,
        202,
        192,
        180,
        341,
        317,
        301,
        281,
        262,
        12,
        249,
        123,
        121,
        117,
        113,
        215,
        206,
        195,
        185,
        347,
        330,
        308,
        291,
        272,
        520,
        10,
        435,
        115,
        111,
        109,
        211,
        203,
        196,
        187,
        353,
        332,
        313,
        298,
        283,
        531,
        381,
        17,
        427,
        212,
        208,
        205,
        201,
        193,
        186,
        177,
        169,
        320,
        303,
        286,
        268,
        514,
        377,
        16,
        335,
        199,
        197,
        191,
        189,
        181,
        174,
        333,
        321,
        305,
        289,
        275,
        521,
        379,
        371,
        11,
        668,
        184,
        183,
        179,
        175,
        344,
        331,
        314,
        304,
        290,
        277,
        530,
        383,
        373,
        366,
        10,
        652,
        346,
        171,
        168,
        164,
        318,
        309,
        299,
        287,
        276,
        263,
        513,
        375,
        368,
        362,
        6,
        648,
        322,
        316,
        312,
        307,
        302,
        292,
        284,
        269,
        261,
        512,
        376,
        370,
        364,
        359,
        4,
        620,
        300,
        296,
        294,
        288,
        282,
        273,
        266,
        515,
        380,
        374,
        369,
        365,
        361,
        357,
        2,
        1033,
        280,
        278,
        274,
        267,
        264,
        259,
        382,
        378,
        372,
        367,
        363,
        360,
        358,
        356,
        0,
        43,
        20,
        19,
        17,
        15,
        13,
        11,
        9,
        7,
        6,
        4,
        7,
        5,
        3,
        1,
        3
      ];
      Tables2.t32HB = [
        1 << 0,
        5 << 1,
        4 << 1,
        5 << 2,
        6 << 1,
        5 << 2,
        4 << 2,
        4 << 3,
        7 << 1,
        3 << 2,
        6 << 2,
        0 << 3,
        7 << 2,
        2 << 3,
        3 << 3,
        1 << 4
      ];
      Tables2.t33HB = [
        15 << 0,
        14 << 1,
        13 << 1,
        12 << 2,
        11 << 1,
        10 << 2,
        9 << 2,
        8 << 3,
        7 << 1,
        6 << 2,
        5 << 2,
        4 << 3,
        3 << 2,
        2 << 3,
        1 << 3,
        0 << 4
      ];
      Tables2.t1l = [
        1,
        4,
        3,
        5
      ];
      Tables2.t2l = [
        1,
        4,
        7,
        4,
        5,
        7,
        6,
        7,
        8
      ];
      Tables2.t3l = [
        2,
        3,
        7,
        4,
        4,
        7,
        6,
        7,
        8
      ];
      Tables2.t5l = [
        1,
        4,
        7,
        8,
        4,
        5,
        8,
        9,
        7,
        8,
        9,
        10,
        8,
        8,
        9,
        10
      ];
      Tables2.t6l = [
        3,
        4,
        6,
        8,
        4,
        4,
        6,
        7,
        5,
        6,
        7,
        8,
        7,
        7,
        8,
        9
      ];
      Tables2.t7l = [
        1,
        4,
        7,
        9,
        9,
        10,
        4,
        6,
        8,
        9,
        9,
        10,
        7,
        7,
        9,
        10,
        10,
        11,
        8,
        9,
        10,
        11,
        11,
        11,
        8,
        9,
        10,
        11,
        11,
        12,
        9,
        10,
        11,
        12,
        12,
        12
      ];
      Tables2.t8l = [
        2,
        4,
        7,
        9,
        9,
        10,
        4,
        4,
        6,
        10,
        10,
        10,
        7,
        6,
        8,
        10,
        10,
        11,
        9,
        10,
        10,
        11,
        11,
        12,
        9,
        9,
        10,
        11,
        12,
        12,
        10,
        10,
        11,
        11,
        13,
        13
      ];
      Tables2.t9l = [
        3,
        4,
        6,
        7,
        9,
        10,
        4,
        5,
        6,
        7,
        8,
        10,
        5,
        6,
        7,
        8,
        9,
        10,
        7,
        7,
        8,
        9,
        9,
        10,
        8,
        8,
        9,
        9,
        10,
        11,
        9,
        9,
        10,
        10,
        11,
        11
      ];
      Tables2.t10l = [
        1,
        4,
        7,
        9,
        10,
        10,
        10,
        11,
        4,
        6,
        8,
        9,
        10,
        11,
        10,
        10,
        7,
        8,
        9,
        10,
        11,
        12,
        11,
        11,
        8,
        9,
        10,
        11,
        12,
        12,
        11,
        12,
        9,
        10,
        11,
        12,
        12,
        12,
        12,
        12,
        10,
        11,
        12,
        12,
        13,
        13,
        12,
        13,
        9,
        10,
        11,
        12,
        12,
        12,
        13,
        13,
        10,
        10,
        11,
        12,
        12,
        13,
        13,
        13
      ];
      Tables2.t11l = [
        2,
        4,
        6,
        8,
        9,
        10,
        9,
        10,
        4,
        5,
        6,
        8,
        10,
        10,
        9,
        10,
        6,
        7,
        8,
        9,
        10,
        11,
        10,
        10,
        8,
        8,
        9,
        11,
        10,
        12,
        10,
        11,
        9,
        10,
        10,
        11,
        11,
        12,
        11,
        12,
        9,
        10,
        11,
        12,
        12,
        13,
        12,
        13,
        9,
        9,
        9,
        10,
        11,
        12,
        12,
        12,
        9,
        9,
        10,
        11,
        12,
        12,
        12,
        12
      ];
      Tables2.t12l = [
        4,
        4,
        6,
        8,
        9,
        10,
        10,
        10,
        4,
        5,
        6,
        7,
        9,
        9,
        10,
        10,
        6,
        6,
        7,
        8,
        9,
        10,
        9,
        10,
        7,
        7,
        8,
        8,
        9,
        10,
        10,
        10,
        8,
        8,
        9,
        9,
        10,
        10,
        10,
        11,
        9,
        9,
        10,
        10,
        10,
        11,
        10,
        11,
        9,
        9,
        9,
        10,
        10,
        11,
        11,
        12,
        10,
        10,
        10,
        11,
        11,
        11,
        11,
        12
      ];
      Tables2.t13l = [
        1,
        5,
        7,
        8,
        9,
        10,
        10,
        11,
        10,
        11,
        12,
        12,
        13,
        13,
        14,
        14,
        4,
        6,
        8,
        9,
        10,
        10,
        11,
        11,
        11,
        11,
        12,
        12,
        13,
        14,
        14,
        14,
        7,
        8,
        9,
        10,
        11,
        11,
        12,
        12,
        11,
        12,
        12,
        13,
        13,
        14,
        15,
        15,
        8,
        9,
        10,
        11,
        11,
        12,
        12,
        12,
        12,
        13,
        13,
        13,
        13,
        14,
        15,
        15,
        9,
        9,
        11,
        11,
        12,
        12,
        13,
        13,
        12,
        13,
        13,
        14,
        14,
        15,
        15,
        16,
        10,
        10,
        11,
        12,
        12,
        12,
        13,
        13,
        13,
        13,
        14,
        13,
        15,
        15,
        16,
        16,
        10,
        11,
        12,
        12,
        13,
        13,
        13,
        13,
        13,
        14,
        14,
        14,
        15,
        15,
        16,
        16,
        11,
        11,
        12,
        13,
        13,
        13,
        14,
        14,
        14,
        14,
        15,
        15,
        15,
        16,
        18,
        18,
        10,
        10,
        11,
        12,
        12,
        13,
        13,
        14,
        14,
        14,
        14,
        15,
        15,
        16,
        17,
        17,
        11,
        11,
        12,
        12,
        13,
        13,
        13,
        15,
        14,
        15,
        15,
        16,
        16,
        16,
        18,
        17,
        11,
        12,
        12,
        13,
        13,
        14,
        14,
        15,
        14,
        15,
        16,
        15,
        16,
        17,
        18,
        19,
        12,
        12,
        12,
        13,
        14,
        14,
        14,
        14,
        15,
        15,
        15,
        16,
        17,
        17,
        17,
        18,
        12,
        13,
        13,
        14,
        14,
        15,
        14,
        15,
        16,
        16,
        17,
        17,
        17,
        18,
        18,
        18,
        13,
        13,
        14,
        15,
        15,
        15,
        16,
        16,
        16,
        16,
        16,
        17,
        18,
        17,
        18,
        18,
        14,
        14,
        14,
        15,
        15,
        15,
        17,
        16,
        16,
        19,
        17,
        17,
        17,
        19,
        18,
        18,
        13,
        14,
        15,
        16,
        16,
        16,
        17,
        16,
        17,
        17,
        18,
        18,
        21,
        20,
        21,
        18
      ];
      Tables2.t15l = [
        3,
        5,
        6,
        8,
        8,
        9,
        10,
        10,
        10,
        11,
        11,
        12,
        12,
        12,
        13,
        14,
        5,
        5,
        7,
        8,
        9,
        9,
        10,
        10,
        10,
        11,
        11,
        12,
        12,
        12,
        13,
        13,
        6,
        7,
        7,
        8,
        9,
        9,
        10,
        10,
        10,
        11,
        11,
        12,
        12,
        13,
        13,
        13,
        7,
        8,
        8,
        9,
        9,
        10,
        10,
        11,
        11,
        11,
        12,
        12,
        12,
        13,
        13,
        13,
        8,
        8,
        9,
        9,
        10,
        10,
        11,
        11,
        11,
        11,
        12,
        12,
        12,
        13,
        13,
        13,
        9,
        9,
        9,
        10,
        10,
        10,
        11,
        11,
        11,
        11,
        12,
        12,
        13,
        13,
        13,
        14,
        10,
        9,
        10,
        10,
        10,
        11,
        11,
        11,
        11,
        12,
        12,
        12,
        13,
        13,
        14,
        14,
        10,
        10,
        10,
        11,
        11,
        11,
        11,
        12,
        12,
        12,
        12,
        12,
        13,
        13,
        13,
        14,
        10,
        10,
        10,
        11,
        11,
        11,
        11,
        12,
        12,
        12,
        12,
        13,
        13,
        14,
        14,
        14,
        10,
        10,
        11,
        11,
        11,
        11,
        12,
        12,
        12,
        13,
        13,
        13,
        13,
        14,
        14,
        14,
        11,
        11,
        11,
        11,
        12,
        12,
        12,
        12,
        12,
        13,
        13,
        13,
        13,
        14,
        15,
        14,
        11,
        11,
        11,
        11,
        12,
        12,
        12,
        12,
        13,
        13,
        13,
        13,
        14,
        14,
        14,
        15,
        12,
        12,
        11,
        12,
        12,
        12,
        13,
        13,
        13,
        13,
        13,
        13,
        14,
        14,
        15,
        15,
        12,
        12,
        12,
        12,
        12,
        13,
        13,
        13,
        13,
        14,
        14,
        14,
        14,
        14,
        15,
        15,
        13,
        13,
        13,
        13,
        13,
        13,
        13,
        13,
        14,
        14,
        14,
        14,
        15,
        15,
        14,
        15,
        13,
        13,
        13,
        13,
        13,
        13,
        13,
        14,
        14,
        14,
        14,
        14,
        15,
        15,
        15,
        15
      ];
      Tables2.t16_5l = [
        1,
        5,
        7,
        9,
        10,
        10,
        11,
        11,
        12,
        12,
        12,
        13,
        13,
        13,
        14,
        11,
        4,
        6,
        8,
        9,
        10,
        11,
        11,
        11,
        12,
        12,
        12,
        13,
        14,
        13,
        14,
        11,
        7,
        8,
        9,
        10,
        11,
        11,
        12,
        12,
        13,
        12,
        13,
        13,
        13,
        14,
        14,
        12,
        9,
        9,
        10,
        11,
        11,
        12,
        12,
        12,
        13,
        13,
        14,
        14,
        14,
        15,
        15,
        13,
        10,
        10,
        11,
        11,
        12,
        12,
        13,
        13,
        13,
        14,
        14,
        14,
        15,
        15,
        15,
        12,
        10,
        10,
        11,
        11,
        12,
        13,
        13,
        14,
        13,
        14,
        14,
        15,
        15,
        15,
        16,
        13,
        11,
        11,
        11,
        12,
        13,
        13,
        13,
        13,
        14,
        14,
        14,
        14,
        15,
        15,
        16,
        13,
        11,
        11,
        12,
        12,
        13,
        13,
        13,
        14,
        14,
        15,
        15,
        15,
        15,
        17,
        17,
        13,
        11,
        12,
        12,
        13,
        13,
        13,
        14,
        14,
        15,
        15,
        15,
        15,
        16,
        16,
        16,
        13,
        12,
        12,
        12,
        13,
        13,
        14,
        14,
        15,
        15,
        15,
        15,
        16,
        15,
        16,
        15,
        14,
        12,
        13,
        12,
        13,
        14,
        14,
        14,
        14,
        15,
        16,
        16,
        16,
        17,
        17,
        16,
        13,
        13,
        13,
        13,
        13,
        14,
        14,
        15,
        16,
        16,
        16,
        16,
        16,
        16,
        15,
        16,
        14,
        13,
        14,
        14,
        14,
        14,
        15,
        15,
        15,
        15,
        17,
        16,
        16,
        16,
        16,
        18,
        14,
        15,
        14,
        14,
        14,
        15,
        15,
        16,
        16,
        16,
        18,
        17,
        17,
        17,
        19,
        17,
        14,
        14,
        15,
        13,
        14,
        16,
        16,
        15,
        16,
        16,
        17,
        18,
        17,
        19,
        17,
        16,
        14,
        11,
        11,
        11,
        12,
        12,
        13,
        13,
        13,
        14,
        14,
        14,
        14,
        14,
        14,
        14,
        12
      ];
      Tables2.t16l = [
        1,
        5,
        7,
        9,
        10,
        10,
        11,
        11,
        12,
        12,
        12,
        13,
        13,
        13,
        14,
        10,
        4,
        6,
        8,
        9,
        10,
        11,
        11,
        11,
        12,
        12,
        12,
        13,
        14,
        13,
        14,
        10,
        7,
        8,
        9,
        10,
        11,
        11,
        12,
        12,
        13,
        12,
        13,
        13,
        13,
        14,
        14,
        11,
        9,
        9,
        10,
        11,
        11,
        12,
        12,
        12,
        13,
        13,
        14,
        14,
        14,
        15,
        15,
        12,
        10,
        10,
        11,
        11,
        12,
        12,
        13,
        13,
        13,
        14,
        14,
        14,
        15,
        15,
        15,
        11,
        10,
        10,
        11,
        11,
        12,
        13,
        13,
        14,
        13,
        14,
        14,
        15,
        15,
        15,
        16,
        12,
        11,
        11,
        11,
        12,
        13,
        13,
        13,
        13,
        14,
        14,
        14,
        14,
        15,
        15,
        16,
        12,
        11,
        11,
        12,
        12,
        13,
        13,
        13,
        14,
        14,
        15,
        15,
        15,
        15,
        17,
        17,
        12,
        11,
        12,
        12,
        13,
        13,
        13,
        14,
        14,
        15,
        15,
        15,
        15,
        16,
        16,
        16,
        12,
        12,
        12,
        12,
        13,
        13,
        14,
        14,
        15,
        15,
        15,
        15,
        16,
        15,
        16,
        15,
        13,
        12,
        13,
        12,
        13,
        14,
        14,
        14,
        14,
        15,
        16,
        16,
        16,
        17,
        17,
        16,
        12,
        13,
        13,
        13,
        13,
        14,
        14,
        15,
        16,
        16,
        16,
        16,
        16,
        16,
        15,
        16,
        13,
        13,
        14,
        14,
        14,
        14,
        15,
        15,
        15,
        15,
        17,
        16,
        16,
        16,
        16,
        18,
        13,
        15,
        14,
        14,
        14,
        15,
        15,
        16,
        16,
        16,
        18,
        17,
        17,
        17,
        19,
        17,
        13,
        14,
        15,
        13,
        14,
        16,
        16,
        15,
        16,
        16,
        17,
        18,
        17,
        19,
        17,
        16,
        13,
        10,
        10,
        10,
        11,
        11,
        12,
        12,
        12,
        13,
        13,
        13,
        13,
        13,
        13,
        13,
        10
      ];
      Tables2.t24l = [
        4,
        5,
        7,
        8,
        9,
        10,
        10,
        11,
        11,
        12,
        12,
        12,
        12,
        12,
        13,
        10,
        5,
        6,
        7,
        8,
        9,
        10,
        10,
        11,
        11,
        11,
        12,
        12,
        12,
        12,
        12,
        10,
        7,
        7,
        8,
        9,
        9,
        10,
        10,
        11,
        11,
        11,
        11,
        12,
        12,
        12,
        13,
        9,
        8,
        8,
        9,
        9,
        10,
        10,
        10,
        11,
        11,
        11,
        11,
        12,
        12,
        12,
        12,
        9,
        9,
        9,
        9,
        10,
        10,
        10,
        10,
        11,
        11,
        11,
        12,
        12,
        12,
        12,
        13,
        9,
        10,
        9,
        10,
        10,
        10,
        10,
        11,
        11,
        11,
        11,
        12,
        12,
        12,
        12,
        12,
        9,
        10,
        10,
        10,
        10,
        10,
        11,
        11,
        11,
        11,
        12,
        12,
        12,
        12,
        12,
        13,
        9,
        11,
        10,
        10,
        10,
        11,
        11,
        11,
        11,
        12,
        12,
        12,
        12,
        12,
        13,
        13,
        10,
        11,
        11,
        11,
        11,
        11,
        11,
        11,
        11,
        11,
        12,
        12,
        12,
        12,
        13,
        13,
        10,
        11,
        11,
        11,
        11,
        11,
        11,
        11,
        12,
        12,
        12,
        12,
        12,
        13,
        13,
        13,
        10,
        12,
        11,
        11,
        11,
        11,
        12,
        12,
        12,
        12,
        12,
        12,
        13,
        13,
        13,
        13,
        10,
        12,
        12,
        11,
        11,
        11,
        12,
        12,
        12,
        12,
        12,
        12,
        13,
        13,
        13,
        13,
        10,
        12,
        12,
        12,
        12,
        12,
        12,
        12,
        12,
        12,
        12,
        13,
        13,
        13,
        13,
        13,
        10,
        12,
        12,
        12,
        12,
        12,
        12,
        12,
        12,
        13,
        13,
        13,
        13,
        13,
        13,
        13,
        10,
        13,
        12,
        12,
        12,
        12,
        12,
        12,
        13,
        13,
        13,
        13,
        13,
        13,
        13,
        13,
        10,
        9,
        9,
        9,
        9,
        9,
        9,
        9,
        9,
        9,
        9,
        9,
        10,
        10,
        10,
        10,
        6
      ];
      Tables2.t32l = [
        1 + 0,
        4 + 1,
        4 + 1,
        5 + 2,
        4 + 1,
        6 + 2,
        5 + 2,
        6 + 3,
        4 + 1,
        5 + 2,
        5 + 2,
        6 + 3,
        5 + 2,
        6 + 3,
        6 + 3,
        6 + 4
      ];
      Tables2.t33l = [
        4 + 0,
        4 + 1,
        4 + 1,
        4 + 2,
        4 + 1,
        4 + 2,
        4 + 2,
        4 + 3,
        4 + 1,
        4 + 2,
        4 + 2,
        4 + 3,
        4 + 2,
        4 + 3,
        4 + 3,
        4 + 4
      ];
      Tables2.ht = [
        /* xlen, linmax, table, hlen */
        new HuffCodeTab2(0, 0, null, null),
        new HuffCodeTab2(2, 0, Tables2.t1HB, Tables2.t1l),
        new HuffCodeTab2(3, 0, Tables2.t2HB, Tables2.t2l),
        new HuffCodeTab2(3, 0, Tables2.t3HB, Tables2.t3l),
        new HuffCodeTab2(0, 0, null, null),
        /* Apparently not used */
        new HuffCodeTab2(4, 0, Tables2.t5HB, Tables2.t5l),
        new HuffCodeTab2(4, 0, Tables2.t6HB, Tables2.t6l),
        new HuffCodeTab2(6, 0, Tables2.t7HB, Tables2.t7l),
        new HuffCodeTab2(6, 0, Tables2.t8HB, Tables2.t8l),
        new HuffCodeTab2(6, 0, Tables2.t9HB, Tables2.t9l),
        new HuffCodeTab2(8, 0, Tables2.t10HB, Tables2.t10l),
        new HuffCodeTab2(8, 0, Tables2.t11HB, Tables2.t11l),
        new HuffCodeTab2(8, 0, Tables2.t12HB, Tables2.t12l),
        new HuffCodeTab2(16, 0, Tables2.t13HB, Tables2.t13l),
        new HuffCodeTab2(0, 0, null, Tables2.t16_5l),
        /* Apparently not used */
        new HuffCodeTab2(16, 0, Tables2.t15HB, Tables2.t15l),
        new HuffCodeTab2(1, 1, Tables2.t16HB, Tables2.t16l),
        new HuffCodeTab2(2, 3, Tables2.t16HB, Tables2.t16l),
        new HuffCodeTab2(3, 7, Tables2.t16HB, Tables2.t16l),
        new HuffCodeTab2(4, 15, Tables2.t16HB, Tables2.t16l),
        new HuffCodeTab2(6, 63, Tables2.t16HB, Tables2.t16l),
        new HuffCodeTab2(8, 255, Tables2.t16HB, Tables2.t16l),
        new HuffCodeTab2(10, 1023, Tables2.t16HB, Tables2.t16l),
        new HuffCodeTab2(13, 8191, Tables2.t16HB, Tables2.t16l),
        new HuffCodeTab2(4, 15, Tables2.t24HB, Tables2.t24l),
        new HuffCodeTab2(5, 31, Tables2.t24HB, Tables2.t24l),
        new HuffCodeTab2(6, 63, Tables2.t24HB, Tables2.t24l),
        new HuffCodeTab2(7, 127, Tables2.t24HB, Tables2.t24l),
        new HuffCodeTab2(8, 255, Tables2.t24HB, Tables2.t24l),
        new HuffCodeTab2(9, 511, Tables2.t24HB, Tables2.t24l),
        new HuffCodeTab2(11, 2047, Tables2.t24HB, Tables2.t24l),
        new HuffCodeTab2(13, 8191, Tables2.t24HB, Tables2.t24l),
        new HuffCodeTab2(0, 0, Tables2.t32HB, Tables2.t32l),
        new HuffCodeTab2(0, 0, Tables2.t33HB, Tables2.t33l)
      ];
      Tables2.largetbl = [
        65540,
        327685,
        458759,
        589832,
        655369,
        655370,
        720906,
        720907,
        786443,
        786444,
        786444,
        851980,
        851980,
        851980,
        917517,
        655370,
        262149,
        393222,
        524295,
        589832,
        655369,
        720906,
        720906,
        720907,
        786443,
        786443,
        786444,
        851980,
        917516,
        851980,
        917516,
        655370,
        458759,
        524295,
        589832,
        655369,
        720905,
        720906,
        786442,
        786443,
        851979,
        786443,
        851979,
        851980,
        851980,
        917516,
        917517,
        720905,
        589832,
        589832,
        655369,
        720905,
        720906,
        786442,
        786442,
        786443,
        851979,
        851979,
        917515,
        917516,
        917516,
        983052,
        983052,
        786441,
        655369,
        655369,
        720905,
        720906,
        786442,
        786442,
        851978,
        851979,
        851979,
        917515,
        917516,
        917516,
        983052,
        983052,
        983053,
        720905,
        655370,
        655369,
        720906,
        720906,
        786442,
        851978,
        851979,
        917515,
        851979,
        917515,
        917516,
        983052,
        983052,
        983052,
        1048588,
        786441,
        720906,
        720906,
        720906,
        786442,
        851978,
        851979,
        851979,
        851979,
        917515,
        917516,
        917516,
        917516,
        983052,
        983052,
        1048589,
        786441,
        720907,
        720906,
        786442,
        786442,
        851979,
        851979,
        851979,
        917515,
        917516,
        983052,
        983052,
        983052,
        983052,
        1114125,
        1114125,
        786442,
        720907,
        786443,
        786443,
        851979,
        851979,
        851979,
        917515,
        917515,
        983051,
        983052,
        983052,
        983052,
        1048588,
        1048589,
        1048589,
        786442,
        786443,
        786443,
        786443,
        851979,
        851979,
        917515,
        917515,
        983052,
        983052,
        983052,
        983052,
        1048588,
        983053,
        1048589,
        983053,
        851978,
        786444,
        851979,
        786443,
        851979,
        917515,
        917516,
        917516,
        917516,
        983052,
        1048588,
        1048588,
        1048589,
        1114125,
        1114125,
        1048589,
        786442,
        851980,
        851980,
        851979,
        851979,
        917515,
        917516,
        983052,
        1048588,
        1048588,
        1048588,
        1048588,
        1048589,
        1048589,
        983053,
        1048589,
        851978,
        851980,
        917516,
        917516,
        917516,
        917516,
        983052,
        983052,
        983052,
        983052,
        1114124,
        1048589,
        1048589,
        1048589,
        1048589,
        1179661,
        851978,
        983052,
        917516,
        917516,
        917516,
        983052,
        983052,
        1048588,
        1048588,
        1048589,
        1179661,
        1114125,
        1114125,
        1114125,
        1245197,
        1114125,
        851978,
        917517,
        983052,
        851980,
        917516,
        1048588,
        1048588,
        983052,
        1048589,
        1048589,
        1114125,
        1179661,
        1114125,
        1245197,
        1114125,
        1048589,
        851978,
        655369,
        655369,
        655369,
        720905,
        720905,
        786441,
        786441,
        786441,
        851977,
        851977,
        851977,
        851978,
        851978,
        851978,
        851978,
        655366
      ];
      Tables2.table23 = [
        65538,
        262147,
        458759,
        262148,
        327684,
        458759,
        393222,
        458759,
        524296
      ];
      Tables2.table56 = [
        65539,
        262148,
        458758,
        524296,
        262148,
        327684,
        524294,
        589831,
        458757,
        524294,
        589831,
        655368,
        524295,
        524295,
        589832,
        655369
      ];
      Tables2.bitrate_table = [
        [0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, -1],
        /* MPEG 2 */
        [0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, -1],
        /* MPEG 1 */
        [0, 8, 16, 24, 32, 40, 48, 56, 64, -1, -1, -1, -1, -1, -1, -1]
        /* MPEG 2.5 */
      ];
      Tables2.samplerate_table = [
        [22050, 24e3, 16e3, -1],
        [44100, 48e3, 32e3, -1],
        [11025, 12e3, 8e3, -1]
      ];
      Tables2.scfsi_band = [0, 6, 11, 16, 21];
      function MeanBits2(meanBits) {
        this.bits = meanBits;
      }
      function CalcNoiseResult2() {
        this.over_noise = 0;
        this.tot_noise = 0;
        this.max_noise = 0;
        this.over_count = 0;
        this.over_SSD = 0;
        this.bits = 0;
      }
      function VBRQuantize() {
        this.setModules = function(_qupvt, _tk) {
        };
      }
      function ATH2() {
        this.useAdjust = 0;
        this.aaSensitivityP = 0;
        this.adjust = 0;
        this.adjustLimit = 0;
        this.decay = 0;
        this.floor = 0;
        this.l = new_float2(Encoder2.SBMAX_l);
        this.s = new_float2(Encoder2.SBMAX_s);
        this.psfb21 = new_float2(Encoder2.PSFB21);
        this.psfb12 = new_float2(Encoder2.PSFB12);
        this.cb_l = new_float2(Encoder2.CBANDS);
        this.cb_s = new_float2(Encoder2.CBANDS);
        this.eql_w = new_float2(Encoder2.BLKSIZE / 2);
      }
      function LameGlobalFlags2() {
        this.class_id = 0;
        this.num_samples = 0;
        this.num_channels = 0;
        this.in_samplerate = 0;
        this.out_samplerate = 0;
        this.scale = 0;
        this.scale_left = 0;
        this.scale_right = 0;
        this.analysis = false;
        this.bWriteVbrTag = false;
        this.decode_only = false;
        this.quality = 0;
        this.mode = MPEGMode2.STEREO;
        this.force_ms = false;
        this.free_format = false;
        this.findReplayGain = false;
        this.decode_on_the_fly = false;
        this.write_id3tag_automatic = false;
        this.brate = 0;
        this.compression_ratio = 0;
        this.copyright = 0;
        this.original = 0;
        this.extension = 0;
        this.emphasis = 0;
        this.error_protection = 0;
        this.strict_ISO = false;
        this.disable_reservoir = false;
        this.quant_comp = 0;
        this.quant_comp_short = 0;
        this.experimentalY = false;
        this.experimentalZ = 0;
        this.exp_nspsytune = 0;
        this.preset = 0;
        this.VBR = null;
        this.VBR_q_frac = 0;
        this.VBR_q = 0;
        this.VBR_mean_bitrate_kbps = 0;
        this.VBR_min_bitrate_kbps = 0;
        this.VBR_max_bitrate_kbps = 0;
        this.VBR_hard_min = 0;
        this.lowpassfreq = 0;
        this.highpassfreq = 0;
        this.lowpasswidth = 0;
        this.highpasswidth = 0;
        this.maskingadjust = 0;
        this.maskingadjust_short = 0;
        this.ATHonly = false;
        this.ATHshort = false;
        this.noATH = false;
        this.ATHtype = 0;
        this.ATHcurve = 0;
        this.ATHlower = 0;
        this.athaa_type = 0;
        this.athaa_loudapprox = 0;
        this.athaa_sensitivity = 0;
        this.short_blocks = null;
        this.useTemporal = false;
        this.interChRatio = 0;
        this.msfix = 0;
        this.tune = false;
        this.tune_value_a = 0;
        this.version = 0;
        this.encoder_delay = 0;
        this.encoder_padding = 0;
        this.framesize = 0;
        this.frameNum = 0;
        this.lame_allocated_gfp = 0;
        this.internal_flags = null;
      }
      function CBRNewIterationLoop2(_quantize) {
        var quantize = _quantize;
        this.quantize = quantize;
        this.iteration_loop = function(gfp, pe, ms_ener_ratio, ratio) {
          var gfc = gfp.internal_flags;
          var l3_xmin = new_float2(L3Side2.SFBMAX);
          var xrpow = new_float2(576);
          var targ_bits = new_int2(2);
          var mean_bits = 0;
          var l3_side = gfc.l3_side;
          var mb = new MeanBits2(mean_bits);
          this.quantize.rv.ResvFrameBegin(gfp, mb);
          mean_bits = mb.bits;
          for (var gr = 0; gr < gfc.mode_gr; gr++) {
            this.quantize.qupvt.on_pe(
              gfp,
              pe,
              targ_bits,
              mean_bits,
              gr,
              gr
            );
            if (gfc.mode_ext == Encoder2.MPG_MD_MS_LR) {
              abort();
            }
            for (var ch = 0; ch < gfc.channels_out; ch++) {
              var adjust, masking_lower_db;
              var cod_info = l3_side.tt[gr][ch];
              if (cod_info.block_type != Encoder2.SHORT_TYPE) {
                adjust = 0;
                masking_lower_db = gfc.PSY.mask_adjust - adjust;
              } else {
                adjust = 0;
                masking_lower_db = gfc.PSY.mask_adjust_short - adjust;
              }
              gfc.masking_lower = Math.pow(
                10,
                masking_lower_db * 0.1
              );
              this.quantize.init_outer_loop(gfc, cod_info);
              if (this.quantize.init_xrpow(gfc, cod_info, xrpow)) {
                this.quantize.qupvt.calc_xmin(
                  gfp,
                  ratio[gr][ch],
                  cod_info,
                  l3_xmin
                );
                this.quantize.outer_loop(
                  gfp,
                  cod_info,
                  l3_xmin,
                  xrpow,
                  ch,
                  targ_bits[ch]
                );
              }
              this.quantize.iteration_finish_one(gfc, gr, ch);
            }
          }
          this.quantize.rv.ResvFrameEnd(gfc, mean_bits);
        };
      }
      function ReplayGain2() {
      }
      function ScaleFac2(arrL, arrS, arr21, arr12) {
        this.l = new_int2(1 + Encoder2.SBMAX_l);
        this.s = new_int2(1 + Encoder2.SBMAX_s);
        this.psfb21 = new_int2(1 + Encoder2.PSFB21);
        this.psfb12 = new_int2(1 + Encoder2.PSFB12);
        var l2 = this.l;
        var s = this.s;
        if (arguments.length == 4) {
          this.arrL = arguments[0];
          this.arrS = arguments[1];
          this.arr21 = arguments[2];
          this.arr12 = arguments[3];
          System2.arraycopy(this.arrL, 0, l2, 0, Math.min(this.arrL.length, this.l.length));
          System2.arraycopy(this.arrS, 0, s, 0, Math.min(this.arrS.length, this.s.length));
          System2.arraycopy(this.arr21, 0, this.psfb21, 0, Math.min(this.arr21.length, this.psfb21.length));
          System2.arraycopy(this.arr12, 0, this.psfb12, 0, Math.min(this.arr12.length, this.psfb12.length));
        }
      }
      QuantizePVT.Q_MAX = 256 + 1;
      QuantizePVT.Q_MAX2 = 116;
      QuantizePVT.LARGE_BITS = 1e5;
      QuantizePVT.IXMAX_VAL = 8206;
      function QuantizePVT() {
        var tak = null;
        var rv = null;
        var psy = null;
        this.setModules = function(_tk, _rv, _psy) {
          tak = _tk;
          rv = _rv;
          psy = _psy;
        };
        function POW20(x) {
          return pow20[x + QuantizePVT.Q_MAX2];
        }
        this.IPOW20 = function(x) {
          return ipow20[x];
        };
        var DBL_EPSILON = 2220446049250313e-31;
        var IXMAX_VAL = QuantizePVT.IXMAX_VAL;
        var PRECALC_SIZE = IXMAX_VAL + 2;
        var Q_MAX = QuantizePVT.Q_MAX;
        var Q_MAX2 = QuantizePVT.Q_MAX2;
        var NSATHSCALE = 100;
        this.nr_of_sfb_block = [
          [[6, 5, 5, 5], [9, 9, 9, 9], [6, 9, 9, 9]],
          [[6, 5, 7, 3], [9, 9, 12, 6], [6, 9, 12, 6]],
          [[11, 10, 0, 0], [18, 18, 0, 0], [15, 18, 0, 0]],
          [[7, 7, 7, 0], [12, 12, 12, 0], [6, 15, 12, 0]],
          [[6, 6, 6, 3], [12, 9, 9, 6], [6, 12, 9, 6]],
          [[8, 8, 5, 0], [15, 12, 9, 0], [6, 18, 9, 0]]
        ];
        var pretab = [
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          1,
          1,
          1,
          1,
          2,
          2,
          3,
          3,
          3,
          2,
          0
        ];
        this.pretab = pretab;
        this.sfBandIndex = [
          // Table B.2.b: 22.05 kHz
          new ScaleFac2(
            [
              0,
              6,
              12,
              18,
              24,
              30,
              36,
              44,
              54,
              66,
              80,
              96,
              116,
              140,
              168,
              200,
              238,
              284,
              336,
              396,
              464,
              522,
              576
            ],
            [0, 4, 8, 12, 18, 24, 32, 42, 56, 74, 100, 132, 174, 192],
            [0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 0]
            //  sfb12 pseudo sub bands
          ),
          /* Table B.2.c: 24 kHz */
          /* docs: 332. mpg123(broken): 330 */
          new ScaleFac2(
            [
              0,
              6,
              12,
              18,
              24,
              30,
              36,
              44,
              54,
              66,
              80,
              96,
              114,
              136,
              162,
              194,
              232,
              278,
              332,
              394,
              464,
              540,
              576
            ],
            [0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 136, 180, 192],
            [0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 0]
            /*  sfb12 pseudo sub bands */
          ),
          /* Table B.2.a: 16 kHz */
          new ScaleFac2(
            [
              0,
              6,
              12,
              18,
              24,
              30,
              36,
              44,
              54,
              66,
              80,
              96,
              116,
              140,
              168,
              200,
              238,
              284,
              336,
              396,
              464,
              522,
              576
            ],
            [0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 134, 174, 192],
            [0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 0]
            /*  sfb12 pseudo sub bands */
          ),
          /* Table B.8.b: 44.1 kHz */
          new ScaleFac2(
            [
              0,
              4,
              8,
              12,
              16,
              20,
              24,
              30,
              36,
              44,
              52,
              62,
              74,
              90,
              110,
              134,
              162,
              196,
              238,
              288,
              342,
              418,
              576
            ],
            [0, 4, 8, 12, 16, 22, 30, 40, 52, 66, 84, 106, 136, 192],
            [0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 0]
            /*  sfb12 pseudo sub bands */
          ),
          /* Table B.8.c: 48 kHz */
          new ScaleFac2(
            [
              0,
              4,
              8,
              12,
              16,
              20,
              24,
              30,
              36,
              42,
              50,
              60,
              72,
              88,
              106,
              128,
              156,
              190,
              230,
              276,
              330,
              384,
              576
            ],
            [0, 4, 8, 12, 16, 22, 28, 38, 50, 64, 80, 100, 126, 192],
            [0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 0]
            /*  sfb12 pseudo sub bands */
          ),
          /* Table B.8.a: 32 kHz */
          new ScaleFac2(
            [
              0,
              4,
              8,
              12,
              16,
              20,
              24,
              30,
              36,
              44,
              54,
              66,
              82,
              102,
              126,
              156,
              194,
              240,
              296,
              364,
              448,
              550,
              576
            ],
            [0, 4, 8, 12, 16, 22, 30, 42, 58, 78, 104, 138, 180, 192],
            [0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 0]
            /*  sfb12 pseudo sub bands */
          ),
          /* MPEG-2.5 11.025 kHz */
          new ScaleFac2(
            [
              0,
              6,
              12,
              18,
              24,
              30,
              36,
              44,
              54,
              66,
              80,
              96,
              116,
              140,
              168,
              200,
              238,
              284,
              336,
              396,
              464,
              522,
              576
            ],
            [
              0 / 3,
              12 / 3,
              24 / 3,
              36 / 3,
              54 / 3,
              78 / 3,
              108 / 3,
              144 / 3,
              186 / 3,
              240 / 3,
              312 / 3,
              402 / 3,
              522 / 3,
              576 / 3
            ],
            [0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 0]
            /*  sfb12 pseudo sub bands */
          ),
          /* MPEG-2.5 12 kHz */
          new ScaleFac2(
            [
              0,
              6,
              12,
              18,
              24,
              30,
              36,
              44,
              54,
              66,
              80,
              96,
              116,
              140,
              168,
              200,
              238,
              284,
              336,
              396,
              464,
              522,
              576
            ],
            [
              0 / 3,
              12 / 3,
              24 / 3,
              36 / 3,
              54 / 3,
              78 / 3,
              108 / 3,
              144 / 3,
              186 / 3,
              240 / 3,
              312 / 3,
              402 / 3,
              522 / 3,
              576 / 3
            ],
            [0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 0]
            /*  sfb12 pseudo sub bands */
          ),
          /* MPEG-2.5 8 kHz */
          new ScaleFac2(
            [
              0,
              12,
              24,
              36,
              48,
              60,
              72,
              88,
              108,
              132,
              160,
              192,
              232,
              280,
              336,
              400,
              476,
              566,
              568,
              570,
              572,
              574,
              576
            ],
            [
              0 / 3,
              24 / 3,
              48 / 3,
              72 / 3,
              108 / 3,
              156 / 3,
              216 / 3,
              288 / 3,
              372 / 3,
              480 / 3,
              486 / 3,
              492 / 3,
              498 / 3,
              576 / 3
            ],
            [0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 0]
            /*  sfb12 pseudo sub bands */
          )
        ];
        var pow20 = new_float2(Q_MAX + Q_MAX2 + 1);
        var ipow20 = new_float2(Q_MAX);
        var pow43 = new_float2(PRECALC_SIZE);
        var adj43 = new_float2(PRECALC_SIZE);
        this.adj43 = adj43;
        function ATHmdct(gfp, f2) {
          var ath = psy.ATHformula(f2, gfp);
          ath -= NSATHSCALE;
          ath = Math.pow(10, ath / 10 + gfp.ATHlower);
          return ath;
        }
        function compute_ath(gfp) {
          var ATH_l = gfp.internal_flags.ATH.l;
          var ATH_psfb21 = gfp.internal_flags.ATH.psfb21;
          var ATH_s = gfp.internal_flags.ATH.s;
          var ATH_psfb12 = gfp.internal_flags.ATH.psfb12;
          var gfc = gfp.internal_flags;
          var samp_freq = gfp.out_samplerate;
          for (var sfb = 0; sfb < Encoder2.SBMAX_l; sfb++) {
            var start = gfc.scalefac_band.l[sfb];
            var end = gfc.scalefac_band.l[sfb + 1];
            ATH_l[sfb] = Float2.MAX_VALUE;
            for (var i = start; i < end; i++) {
              var freq = i * samp_freq / (2 * 576);
              var ATH_f = ATHmdct(gfp, freq);
              ATH_l[sfb] = Math.min(ATH_l[sfb], ATH_f);
            }
          }
          for (var sfb = 0; sfb < Encoder2.PSFB21; sfb++) {
            var start = gfc.scalefac_band.psfb21[sfb];
            var end = gfc.scalefac_band.psfb21[sfb + 1];
            ATH_psfb21[sfb] = Float2.MAX_VALUE;
            for (var i = start; i < end; i++) {
              var freq = i * samp_freq / (2 * 576);
              var ATH_f = ATHmdct(gfp, freq);
              ATH_psfb21[sfb] = Math.min(ATH_psfb21[sfb], ATH_f);
            }
          }
          for (var sfb = 0; sfb < Encoder2.SBMAX_s; sfb++) {
            var start = gfc.scalefac_band.s[sfb];
            var end = gfc.scalefac_band.s[sfb + 1];
            ATH_s[sfb] = Float2.MAX_VALUE;
            for (var i = start; i < end; i++) {
              var freq = i * samp_freq / (2 * 192);
              var ATH_f = ATHmdct(gfp, freq);
              ATH_s[sfb] = Math.min(ATH_s[sfb], ATH_f);
            }
            ATH_s[sfb] *= gfc.scalefac_band.s[sfb + 1] - gfc.scalefac_band.s[sfb];
          }
          for (var sfb = 0; sfb < Encoder2.PSFB12; sfb++) {
            var start = gfc.scalefac_band.psfb12[sfb];
            var end = gfc.scalefac_band.psfb12[sfb + 1];
            ATH_psfb12[sfb] = Float2.MAX_VALUE;
            for (var i = start; i < end; i++) {
              var freq = i * samp_freq / (2 * 192);
              var ATH_f = ATHmdct(gfp, freq);
              ATH_psfb12[sfb] = Math.min(ATH_psfb12[sfb], ATH_f);
            }
            ATH_psfb12[sfb] *= gfc.scalefac_band.s[13] - gfc.scalefac_band.s[12];
          }
          if (gfp.noATH) {
            abort();
          }
          gfc.ATH.floor = 10 * Math_log10(ATHmdct(gfp, -1));
        }
        this.iteration_init = function(gfp) {
          var gfc = gfp.internal_flags;
          var l3_side = gfc.l3_side;
          var i;
          if (gfc.iteration_init_init == 0) {
            gfc.iteration_init_init = 1;
            l3_side.main_data_begin = 0;
            compute_ath(gfp);
            pow43[0] = 0;
            for (i = 1; i < PRECALC_SIZE; i++)
              pow43[i] = Math.pow(i, 4 / 3);
            for (i = 0; i < PRECALC_SIZE - 1; i++)
              adj43[i] = i + 1 - Math.pow(
                0.5 * (pow43[i] + pow43[i + 1]),
                0.75
              );
            adj43[i] = 0.5;
            for (i = 0; i < Q_MAX; i++)
              ipow20[i] = Math.pow(2, (i - 210) * -0.1875);
            for (i = 0; i <= Q_MAX + Q_MAX2; i++)
              pow20[i] = Math.pow(2, (i - 210 - Q_MAX2) * 0.25);
            tak.huffman_init(gfc);
            {
              var bass, alto, treble, sfb21;
              i = gfp.exp_nspsytune >> 2 & 63;
              if (i >= 32)
                i -= 64;
              bass = Math.pow(10, i / 4 / 10);
              i = gfp.exp_nspsytune >> 8 & 63;
              if (i >= 32)
                i -= 64;
              alto = Math.pow(10, i / 4 / 10);
              i = gfp.exp_nspsytune >> 14 & 63;
              if (i >= 32)
                i -= 64;
              treble = Math.pow(10, i / 4 / 10);
              i = gfp.exp_nspsytune >> 20 & 63;
              if (i >= 32)
                i -= 64;
              sfb21 = treble * Math.pow(10, i / 4 / 10);
              for (i = 0; i < Encoder2.SBMAX_l; i++) {
                var f2;
                if (i <= 6)
                  f2 = bass;
                else if (i <= 13)
                  f2 = alto;
                else if (i <= 20)
                  f2 = treble;
                else
                  f2 = sfb21;
                gfc.nsPsy.longfact[i] = f2;
              }
              for (i = 0; i < Encoder2.SBMAX_s; i++) {
                var f2;
                if (i <= 5)
                  f2 = bass;
                else if (i <= 10)
                  f2 = alto;
                else if (i <= 11)
                  f2 = treble;
                else
                  f2 = sfb21;
                gfc.nsPsy.shortfact[i] = f2;
              }
            }
          }
        };
        this.on_pe = function(gfp, pe, targ_bits, mean_bits, gr, cbr) {
          var gfc = gfp.internal_flags;
          var tbits = 0, bits;
          var add_bits = new_int2(2);
          var ch;
          var mb = new MeanBits2(tbits);
          var extra_bits = rv.ResvMaxBits(gfp, mean_bits, mb, cbr);
          tbits = mb.bits;
          var max_bits = tbits + extra_bits;
          if (max_bits > LameInternalFlags2.MAX_BITS_PER_GRANULE) {
            max_bits = LameInternalFlags2.MAX_BITS_PER_GRANULE;
          }
          for (bits = 0, ch = 0; ch < gfc.channels_out; ++ch) {
            targ_bits[ch] = Math.min(
              LameInternalFlags2.MAX_BITS_PER_CHANNEL,
              tbits / gfc.channels_out
            );
            add_bits[ch] = 0 | targ_bits[ch] * pe[gr][ch] / 700 - targ_bits[ch];
            if (add_bits[ch] > mean_bits * 3 / 4)
              add_bits[ch] = mean_bits * 3 / 4;
            if (add_bits[ch] < 0)
              add_bits[ch] = 0;
            if (add_bits[ch] + targ_bits[ch] > LameInternalFlags2.MAX_BITS_PER_CHANNEL)
              add_bits[ch] = Math.max(
                0,
                LameInternalFlags2.MAX_BITS_PER_CHANNEL - targ_bits[ch]
              );
            bits += add_bits[ch];
          }
          if (bits > extra_bits) {
            for (ch = 0; ch < gfc.channels_out; ++ch) {
              add_bits[ch] = extra_bits * add_bits[ch] / bits;
            }
          }
          for (ch = 0; ch < gfc.channels_out; ++ch) {
            targ_bits[ch] += add_bits[ch];
            extra_bits -= add_bits[ch];
          }
          for (bits = 0, ch = 0; ch < gfc.channels_out; ++ch) {
            bits += targ_bits[ch];
          }
          if (bits > LameInternalFlags2.MAX_BITS_PER_GRANULE) {
            abort();
          }
          return max_bits;
        };
        this.athAdjust = function(a, x, athFloor) {
          var o = 90.30873362;
          var p2 = 94.82444863;
          var u = Util2.FAST_LOG10_X(x, 10);
          var v = a * a;
          var w = 0;
          u -= athFloor;
          if (v > 1e-20)
            w = 1 + Util2.FAST_LOG10_X(v, 10 / o);
          if (w < 0)
            w = 0;
          u *= w;
          u += athFloor + o - p2;
          return Math.pow(10, 0.1 * u);
        };
        this.calc_xmin = function(gfp, ratio, cod_info, pxmin) {
          var pxminPos = 0;
          var gfc = gfp.internal_flags;
          var gsfb, j = 0, ath_over = 0;
          var ATH3 = gfc.ATH;
          var xr = cod_info.xr;
          var enable_athaa_fix = gfp.VBR == VbrMode2.vbr_mtrh ? 1 : 0;
          var masking_lower = gfc.masking_lower;
          if (gfp.VBR == VbrMode2.vbr_mtrh || gfp.VBR == VbrMode2.vbr_mt) {
            masking_lower = 1;
          }
          for (gsfb = 0; gsfb < cod_info.psy_lmax; gsfb++) {
            var en0, xmin;
            var rh1, rh2;
            var width, l2;
            if (gfp.VBR == VbrMode2.vbr_rh || gfp.VBR == VbrMode2.vbr_mtrh)
              xmin = athAdjust(ATH3.adjust, ATH3.l[gsfb], ATH3.floor);
            else
              xmin = ATH3.adjust * ATH3.l[gsfb];
            width = cod_info.width[gsfb];
            rh1 = xmin / width;
            rh2 = DBL_EPSILON;
            l2 = width >> 1;
            en0 = 0;
            do {
              var xa, xb;
              xa = xr[j] * xr[j];
              en0 += xa;
              rh2 += xa < rh1 ? xa : rh1;
              j++;
              xb = xr[j] * xr[j];
              en0 += xb;
              rh2 += xb < rh1 ? xb : rh1;
              j++;
            } while (--l2 > 0);
            if (en0 > xmin)
              ath_over++;
            if (gsfb == Encoder2.SBPSY_l) {
              abort();
            }
            if (enable_athaa_fix != 0) {
              xmin = rh2;
            }
            if (!gfp.ATHonly) {
              var e = ratio.en.l[gsfb];
              if (e > 0) {
                var x;
                x = en0 * ratio.thm.l[gsfb] * masking_lower / e;
                if (enable_athaa_fix != 0)
                  x *= gfc.nsPsy.longfact[gsfb];
                if (xmin < x)
                  xmin = x;
              }
            }
            if (enable_athaa_fix != 0)
              pxmin[pxminPos++] = xmin;
            else
              pxmin[pxminPos++] = xmin * gfc.nsPsy.longfact[gsfb];
          }
          var max_nonzero = 575;
          if (cod_info.block_type != Encoder2.SHORT_TYPE) {
            var k2 = 576;
            while (k2-- != 0 && BitStream.EQ(xr[k2], 0)) {
              max_nonzero = k2;
            }
          }
          cod_info.max_nonzero_coeff = max_nonzero;
          for (var sfb = cod_info.sfb_smin; gsfb < cod_info.psymax; sfb++, gsfb += 3) {
            var width, b;
            var tmpATH;
            if (gfp.VBR == VbrMode2.vbr_rh || gfp.VBR == VbrMode2.vbr_mtrh)
              tmpATH = athAdjust(ATH3.adjust, ATH3.s[sfb], ATH3.floor);
            else
              tmpATH = ATH3.adjust * ATH3.s[sfb];
            width = cod_info.width[gsfb];
            for (b = 0; b < 3; b++) {
              var en0 = 0, xmin;
              var rh1, rh2;
              var l2 = width >> 1;
              rh1 = tmpATH / width;
              rh2 = DBL_EPSILON;
              do {
                var xa, xb;
                xa = xr[j] * xr[j];
                en0 += xa;
                rh2 += xa < rh1 ? xa : rh1;
                j++;
                xb = xr[j] * xr[j];
                en0 += xb;
                rh2 += xb < rh1 ? xb : rh1;
                j++;
              } while (--l2 > 0);
              if (en0 > tmpATH)
                ath_over++;
              if (sfb == Encoder2.SBPSY_s) {
                abort();
              }
              if (enable_athaa_fix != 0)
                xmin = rh2;
              else
                xmin = tmpATH;
              if (!gfp.ATHonly && !gfp.ATHshort) {
                var e = ratio.en.s[sfb][b];
                if (e > 0) {
                  var x;
                  x = en0 * ratio.thm.s[sfb][b] * masking_lower / e;
                  if (enable_athaa_fix != 0)
                    x *= gfc.nsPsy.shortfact[sfb];
                  if (xmin < x)
                    xmin = x;
                }
              }
              if (enable_athaa_fix != 0)
                pxmin[pxminPos++] = xmin;
              else
                pxmin[pxminPos++] = xmin * gfc.nsPsy.shortfact[sfb];
            }
            if (gfp.useTemporal) {
              if (pxmin[pxminPos - 3] > pxmin[pxminPos - 3 + 1])
                pxmin[pxminPos - 3 + 1] += (pxmin[pxminPos - 3] - pxmin[pxminPos - 3 + 1]) * gfc.decay;
              if (pxmin[pxminPos - 3 + 1] > pxmin[pxminPos - 3 + 2])
                pxmin[pxminPos - 3 + 2] += (pxmin[pxminPos - 3 + 1] - pxmin[pxminPos - 3 + 2]) * gfc.decay;
            }
          }
          return ath_over;
        };
        function StartLine(j) {
          this.s = j;
        }
        this.calc_noise_core = function(cod_info, startline, l2, step) {
          var noise = 0;
          var j = startline.s;
          var ix = cod_info.l3_enc;
          if (j > cod_info.count1) {
            while (l2-- != 0) {
              var temp;
              temp = cod_info.xr[j];
              j++;
              noise += temp * temp;
              temp = cod_info.xr[j];
              j++;
              noise += temp * temp;
            }
          } else if (j > cod_info.big_values) {
            var ix01 = new_float2(2);
            ix01[0] = 0;
            ix01[1] = step;
            while (l2-- != 0) {
              var temp;
              temp = Math.abs(cod_info.xr[j]) - ix01[ix[j]];
              j++;
              noise += temp * temp;
              temp = Math.abs(cod_info.xr[j]) - ix01[ix[j]];
              j++;
              noise += temp * temp;
            }
          } else {
            while (l2-- != 0) {
              var temp;
              temp = Math.abs(cod_info.xr[j]) - pow43[ix[j]] * step;
              j++;
              noise += temp * temp;
              temp = Math.abs(cod_info.xr[j]) - pow43[ix[j]] * step;
              j++;
              noise += temp * temp;
            }
          }
          startline.s = j;
          return noise;
        };
        this.calc_noise = function(cod_info, l3_xmin, distort, res, prev_noise) {
          var distortPos = 0;
          var l3_xminPos = 0;
          var sfb, l2, over = 0;
          var over_noise_db = 0;
          var tot_noise_db = 0;
          var max_noise = -20;
          var j = 0;
          var scalefac = cod_info.scalefac;
          var scalefacPos = 0;
          res.over_SSD = 0;
          for (sfb = 0; sfb < cod_info.psymax; sfb++) {
            var s = cod_info.global_gain - (scalefac[scalefacPos++] + (cod_info.preflag != 0 ? pretab[sfb] : 0) << cod_info.scalefac_scale + 1) - cod_info.subblock_gain[cod_info.window[sfb]] * 8;
            var noise = 0;
            if (prev_noise != null && prev_noise.step[sfb] == s) {
              noise = prev_noise.noise[sfb];
              j += cod_info.width[sfb];
              distort[distortPos++] = noise / l3_xmin[l3_xminPos++];
              noise = prev_noise.noise_log[sfb];
            } else {
              var step = POW20(s);
              l2 = cod_info.width[sfb] >> 1;
              if (j + cod_info.width[sfb] > cod_info.max_nonzero_coeff) {
                var usefullsize;
                usefullsize = cod_info.max_nonzero_coeff - j + 1;
                if (usefullsize > 0)
                  l2 = usefullsize >> 1;
                else
                  l2 = 0;
              }
              var sl = new StartLine(j);
              noise = this.calc_noise_core(cod_info, sl, l2, step);
              j = sl.s;
              if (prev_noise != null) {
                prev_noise.step[sfb] = s;
                prev_noise.noise[sfb] = noise;
              }
              noise = distort[distortPos++] = noise / l3_xmin[l3_xminPos++];
              noise = Util2.FAST_LOG10(Math.max(noise, 1e-20));
              if (prev_noise != null) {
                prev_noise.noise_log[sfb] = noise;
              }
            }
            if (prev_noise != null) {
              prev_noise.global_gain = cod_info.global_gain;
            }
            tot_noise_db += noise;
            if (noise > 0) {
              var tmp;
              tmp = Math.max(0 | noise * 10 + 0.5, 1);
              res.over_SSD += tmp * tmp;
              over++;
              over_noise_db += noise;
            }
            max_noise = Math.max(max_noise, noise);
          }
          res.over_count = over;
          res.tot_noise = tot_noise_db;
          res.over_noise = over_noise_db;
          res.max_noise = max_noise;
          return over;
        };
      }
      function CalcNoiseData() {
        this.global_gain = 0;
        this.sfb_count1 = 0;
        this.step = new_int2(39);
        this.noise = new_float2(39);
        this.noise_log = new_float2(39);
      }
      function GrInfo2() {
        this.xr = new_float2(576);
        this.l3_enc = new_int2(576);
        this.scalefac = new_int2(L3Side2.SFBMAX);
        this.xrpow_max = 0;
        this.part2_3_length = 0;
        this.big_values = 0;
        this.count1 = 0;
        this.global_gain = 0;
        this.scalefac_compress = 0;
        this.block_type = 0;
        this.mixed_block_flag = 0;
        this.table_select = new_int2(3);
        this.subblock_gain = new_int2(3 + 1);
        this.region0_count = 0;
        this.region1_count = 0;
        this.preflag = 0;
        this.scalefac_scale = 0;
        this.count1table_select = 0;
        this.part2_length = 0;
        this.sfb_lmax = 0;
        this.sfb_smin = 0;
        this.psy_lmax = 0;
        this.sfbmax = 0;
        this.psymax = 0;
        this.sfbdivide = 0;
        this.width = new_int2(L3Side2.SFBMAX);
        this.window = new_int2(L3Side2.SFBMAX);
        this.count1bits = 0;
        this.sfb_partition_table = null;
        this.slen = new_int2(4);
        this.max_nonzero_coeff = 0;
        var self2 = this;
        function clone_int(array) {
          return new Int32Array(array);
        }
        function clone_float(array) {
          return new Float32Array(array);
        }
        this.assign = function(other) {
          self2.xr = clone_float(other.xr);
          self2.l3_enc = clone_int(other.l3_enc);
          self2.scalefac = clone_int(other.scalefac);
          self2.xrpow_max = other.xrpow_max;
          self2.part2_3_length = other.part2_3_length;
          self2.big_values = other.big_values;
          self2.count1 = other.count1;
          self2.global_gain = other.global_gain;
          self2.scalefac_compress = other.scalefac_compress;
          self2.block_type = other.block_type;
          self2.mixed_block_flag = other.mixed_block_flag;
          self2.table_select = clone_int(other.table_select);
          self2.subblock_gain = clone_int(other.subblock_gain);
          self2.region0_count = other.region0_count;
          self2.region1_count = other.region1_count;
          self2.preflag = other.preflag;
          self2.scalefac_scale = other.scalefac_scale;
          self2.count1table_select = other.count1table_select;
          self2.part2_length = other.part2_length;
          self2.sfb_lmax = other.sfb_lmax;
          self2.sfb_smin = other.sfb_smin;
          self2.psy_lmax = other.psy_lmax;
          self2.sfbmax = other.sfbmax;
          self2.psymax = other.psymax;
          self2.sfbdivide = other.sfbdivide;
          self2.width = clone_int(other.width);
          self2.window = clone_int(other.window);
          self2.count1bits = other.count1bits;
          self2.sfb_partition_table = other.sfb_partition_table.slice(0);
          self2.slen = clone_int(other.slen);
          self2.max_nonzero_coeff = other.max_nonzero_coeff;
        };
      }
      var L3Side2 = {};
      L3Side2.SFBMAX = Encoder2.SBMAX_s * 3;
      function Quantize() {
        this.rv = null;
        var rv;
        this.qupvt = null;
        var qupvt;
        var vbr = new VBRQuantize();
        var tk;
        this.setModules = function(_bs, _rv, _qupvt, _tk) {
          rv = _rv;
          this.rv = _rv;
          qupvt = _qupvt;
          this.qupvt = _qupvt;
          tk = _tk;
          vbr.setModules(qupvt, tk);
        };
        function init_xrpow_core(cod_info, xrpow, upper, sum) {
          sum = 0;
          for (var i = 0; i <= upper; ++i) {
            var tmp = Math.abs(cod_info.xr[i]);
            sum += tmp;
            xrpow[i] = Math.sqrt(tmp * Math.sqrt(tmp));
            if (xrpow[i] > cod_info.xrpow_max)
              cod_info.xrpow_max = xrpow[i];
          }
          return sum;
        }
        this.init_xrpow = function(gfc, cod_info, xrpow) {
          var sum = 0;
          var upper = 0 | cod_info.max_nonzero_coeff;
          cod_info.xrpow_max = 0;
          Arrays2.fill(xrpow, upper, 576, 0);
          sum = init_xrpow_core(cod_info, xrpow, upper, sum);
          if (sum > 1e-20) {
            var j = 0;
            if ((gfc.substep_shaping & 2) != 0)
              j = 1;
            for (var i = 0; i < cod_info.psymax; i++)
              gfc.pseudohalf[i] = j;
            return true;
          }
          Arrays2.fill(cod_info.l3_enc, 0, 576, 0);
          return false;
        };
        function psfb21_analogsilence(gfc, cod_info) {
          var ath = gfc.ATH;
          var xr = cod_info.xr;
          if (cod_info.block_type != Encoder2.SHORT_TYPE) {
            var stop = false;
            for (var gsfb = Encoder2.PSFB21 - 1; gsfb >= 0 && !stop; gsfb--) {
              var start = gfc.scalefac_band.psfb21[gsfb];
              var end = gfc.scalefac_band.psfb21[gsfb + 1];
              var ath21 = qupvt.athAdjust(
                ath.adjust,
                ath.psfb21[gsfb],
                ath.floor
              );
              if (gfc.nsPsy.longfact[21] > 1e-12)
                ath21 *= gfc.nsPsy.longfact[21];
              for (var j = end - 1; j >= start; j--) {
                if (Math.abs(xr[j]) < ath21)
                  xr[j] = 0;
                else {
                  stop = true;
                  break;
                }
              }
            }
          } else {
            for (var block = 0; block < 3; block++) {
              var stop = false;
              for (var gsfb = Encoder2.PSFB12 - 1; gsfb >= 0 && !stop; gsfb--) {
                var start = gfc.scalefac_band.s[12] * 3 + (gfc.scalefac_band.s[13] - gfc.scalefac_band.s[12]) * block + (gfc.scalefac_band.psfb12[gsfb] - gfc.scalefac_band.psfb12[0]);
                var end = start + (gfc.scalefac_band.psfb12[gsfb + 1] - gfc.scalefac_band.psfb12[gsfb]);
                var ath12 = qupvt.athAdjust(
                  ath.adjust,
                  ath.psfb12[gsfb],
                  ath.floor
                );
                if (gfc.nsPsy.shortfact[12] > 1e-12)
                  ath12 *= gfc.nsPsy.shortfact[12];
                for (var j = end - 1; j >= start; j--) {
                  if (Math.abs(xr[j]) < ath12)
                    xr[j] = 0;
                  else {
                    stop = true;
                    break;
                  }
                }
              }
            }
          }
        }
        this.init_outer_loop = function(gfc, cod_info) {
          cod_info.part2_3_length = 0;
          cod_info.big_values = 0;
          cod_info.count1 = 0;
          cod_info.global_gain = 210;
          cod_info.scalefac_compress = 0;
          cod_info.table_select[0] = 0;
          cod_info.table_select[1] = 0;
          cod_info.table_select[2] = 0;
          cod_info.subblock_gain[0] = 0;
          cod_info.subblock_gain[1] = 0;
          cod_info.subblock_gain[2] = 0;
          cod_info.subblock_gain[3] = 0;
          cod_info.region0_count = 0;
          cod_info.region1_count = 0;
          cod_info.preflag = 0;
          cod_info.scalefac_scale = 0;
          cod_info.count1table_select = 0;
          cod_info.part2_length = 0;
          cod_info.sfb_lmax = Encoder2.SBPSY_l;
          cod_info.sfb_smin = Encoder2.SBPSY_s;
          cod_info.psy_lmax = gfc.sfb21_extra ? Encoder2.SBMAX_l : Encoder2.SBPSY_l;
          cod_info.psymax = cod_info.psy_lmax;
          cod_info.sfbmax = cod_info.sfb_lmax;
          cod_info.sfbdivide = 11;
          for (var sfb = 0; sfb < Encoder2.SBMAX_l; sfb++) {
            cod_info.width[sfb] = gfc.scalefac_band.l[sfb + 1] - gfc.scalefac_band.l[sfb];
            cod_info.window[sfb] = 3;
          }
          if (cod_info.block_type == Encoder2.SHORT_TYPE) {
            var ixwork = new_float2(576);
            cod_info.sfb_smin = 0;
            cod_info.sfb_lmax = 0;
            if (cod_info.mixed_block_flag != 0) {
              abort();
            }
            cod_info.psymax = cod_info.sfb_lmax + 3 * ((gfc.sfb21_extra ? Encoder2.SBMAX_s : Encoder2.SBPSY_s) - cod_info.sfb_smin);
            cod_info.sfbmax = cod_info.sfb_lmax + 3 * (Encoder2.SBPSY_s - cod_info.sfb_smin);
            cod_info.sfbdivide = cod_info.sfbmax - 18;
            cod_info.psy_lmax = cod_info.sfb_lmax;
            var ix = gfc.scalefac_band.l[cod_info.sfb_lmax];
            System2.arraycopy(cod_info.xr, 0, ixwork, 0, 576);
            for (var sfb = cod_info.sfb_smin; sfb < Encoder2.SBMAX_s; sfb++) {
              var start = gfc.scalefac_band.s[sfb];
              var end = gfc.scalefac_band.s[sfb + 1];
              for (var window2 = 0; window2 < 3; window2++) {
                for (var l2 = start; l2 < end; l2++) {
                  cod_info.xr[ix++] = ixwork[3 * l2 + window2];
                }
              }
            }
            var j = cod_info.sfb_lmax;
            for (var sfb = cod_info.sfb_smin; sfb < Encoder2.SBMAX_s; sfb++) {
              cod_info.width[j] = cod_info.width[j + 1] = cod_info.width[j + 2] = gfc.scalefac_band.s[sfb + 1] - gfc.scalefac_band.s[sfb];
              cod_info.window[j] = 0;
              cod_info.window[j + 1] = 1;
              cod_info.window[j + 2] = 2;
              j += 3;
            }
          }
          cod_info.count1bits = 0;
          cod_info.sfb_partition_table = qupvt.nr_of_sfb_block[0][0];
          cod_info.slen[0] = 0;
          cod_info.slen[1] = 0;
          cod_info.slen[2] = 0;
          cod_info.slen[3] = 0;
          cod_info.max_nonzero_coeff = 575;
          Arrays2.fill(cod_info.scalefac, 0);
          psfb21_analogsilence(gfc, cod_info);
        };
        function BinSearchDirection(ordinal) {
          this.ordinal = ordinal;
        }
        BinSearchDirection.BINSEARCH_NONE = new BinSearchDirection(0);
        BinSearchDirection.BINSEARCH_UP = new BinSearchDirection(1);
        BinSearchDirection.BINSEARCH_DOWN = new BinSearchDirection(2);
        function bin_search_StepSize(gfc, cod_info, desired_rate, ch, xrpow) {
          var nBits;
          var CurrentStep = gfc.CurrentStep[ch];
          var flagGoneOver = false;
          var start = gfc.OldValue[ch];
          var Direction = BinSearchDirection.BINSEARCH_NONE;
          cod_info.global_gain = start;
          desired_rate -= cod_info.part2_length;
          for (; ; ) {
            var step;
            nBits = tk.count_bits(gfc, xrpow, cod_info, null);
            if (CurrentStep == 1 || nBits == desired_rate)
              break;
            if (nBits > desired_rate) {
              if (Direction == BinSearchDirection.BINSEARCH_DOWN)
                flagGoneOver = true;
              if (flagGoneOver)
                CurrentStep /= 2;
              Direction = BinSearchDirection.BINSEARCH_UP;
              step = CurrentStep;
            } else {
              if (Direction == BinSearchDirection.BINSEARCH_UP)
                flagGoneOver = true;
              if (flagGoneOver)
                CurrentStep /= 2;
              Direction = BinSearchDirection.BINSEARCH_DOWN;
              step = -CurrentStep;
            }
            cod_info.global_gain += step;
            if (cod_info.global_gain < 0) {
              abort();
            }
            if (cod_info.global_gain > 255) {
              abort();
            }
          }
          while (nBits > desired_rate && cod_info.global_gain < 255) {
            cod_info.global_gain++;
            nBits = tk.count_bits(gfc, xrpow, cod_info, null);
          }
          gfc.CurrentStep[ch] = start - cod_info.global_gain >= 4 ? 4 : 2;
          gfc.OldValue[ch] = cod_info.global_gain;
          cod_info.part2_3_length = nBits;
          return nBits;
        }
        function loop_break(cod_info) {
          for (var sfb = 0; sfb < cod_info.sfbmax; sfb++)
            if (cod_info.scalefac[sfb] + cod_info.subblock_gain[cod_info.window[sfb]] == 0)
              return false;
          return true;
        }
        function quant_compare(quant_comp, best, calc, gi, distort) {
          var better;
          switch (quant_comp) {
            default:
            case 9: {
              if (best.over_count > 0) {
                better = calc.over_SSD <= best.over_SSD;
                if (calc.over_SSD == best.over_SSD)
                  better = calc.bits < best.bits;
              } else {
                better = calc.max_noise < 0 && calc.max_noise * 10 + calc.bits <= best.max_noise * 10 + best.bits;
              }
              break;
            }
            case 0:
              better = calc.over_count < best.over_count || calc.over_count == best.over_count && calc.over_noise < best.over_noise || calc.over_count == best.over_count && BitStream.EQ(calc.over_noise, best.over_noise) && calc.tot_noise < best.tot_noise;
              break;
            case 8:
              abort();
            case 1:
              better = calc.max_noise < best.max_noise;
              break;
            case 2:
              better = calc.tot_noise < best.tot_noise;
              break;
            case 3:
              better = calc.tot_noise < best.tot_noise && calc.max_noise < best.max_noise;
              break;
            case 4:
              better = calc.max_noise <= 0 && best.max_noise > 0.2 || calc.max_noise <= 0 && best.max_noise < 0 && best.max_noise > calc.max_noise - 0.2 && calc.tot_noise < best.tot_noise || calc.max_noise <= 0 && best.max_noise > 0 && best.max_noise > calc.max_noise - 0.2 && calc.tot_noise < best.tot_noise + best.over_noise || calc.max_noise > 0 && best.max_noise > -0.05 && best.max_noise > calc.max_noise - 0.1 && calc.tot_noise + calc.over_noise < best.tot_noise + best.over_noise || calc.max_noise > 0 && best.max_noise > -0.1 && best.max_noise > calc.max_noise - 0.15 && calc.tot_noise + calc.over_noise + calc.over_noise < best.tot_noise + best.over_noise + best.over_noise;
              break;
            case 5:
              better = calc.over_noise < best.over_noise || BitStream.EQ(calc.over_noise, best.over_noise) && calc.tot_noise < best.tot_noise;
              break;
            case 6:
              better = calc.over_noise < best.over_noise || BitStream.EQ(calc.over_noise, best.over_noise) && (calc.max_noise < best.max_noise || BitStream.EQ(calc.max_noise, best.max_noise) && calc.tot_noise <= best.tot_noise);
              break;
            case 7:
              better = calc.over_count < best.over_count || calc.over_noise < best.over_noise;
              break;
          }
          if (best.over_count == 0) {
            better = better && calc.bits < best.bits;
          }
          return better;
        }
        function amp_scalefac_bands(gfp, cod_info, distort, xrpow, bRefine) {
          var gfc = gfp.internal_flags;
          var ifqstep34;
          if (cod_info.scalefac_scale == 0) {
            ifqstep34 = 1.2968395546510096;
          } else {
            ifqstep34 = 1.6817928305074292;
          }
          var trigger = 0;
          for (var sfb = 0; sfb < cod_info.sfbmax; sfb++) {
            if (trigger < distort[sfb])
              trigger = distort[sfb];
          }
          var noise_shaping_amp = gfc.noise_shaping_amp;
          if (noise_shaping_amp == 3) {
            abort();
          }
          switch (noise_shaping_amp) {
            case 2:
              break;
            case 1:
              if (trigger > 1)
                trigger = Math.pow(trigger, 0.5);
              else
                trigger *= 0.95;
              break;
            case 0:
            default:
              if (trigger > 1)
                trigger = 1;
              else
                trigger *= 0.95;
              break;
          }
          var j = 0;
          for (var sfb = 0; sfb < cod_info.sfbmax; sfb++) {
            var width = cod_info.width[sfb];
            var l2;
            j += width;
            if (distort[sfb] < trigger)
              continue;
            if ((gfc.substep_shaping & 2) != 0) {
              abort();
            }
            cod_info.scalefac[sfb]++;
            for (l2 = -width; l2 < 0; l2++) {
              xrpow[j + l2] *= ifqstep34;
              if (xrpow[j + l2] > cod_info.xrpow_max)
                cod_info.xrpow_max = xrpow[j + l2];
            }
            if (gfc.noise_shaping_amp == 2)
              return;
          }
        }
        function inc_scalefac_scale(cod_info, xrpow) {
          var ifqstep34 = 1.2968395546510096;
          var j = 0;
          for (var sfb = 0; sfb < cod_info.sfbmax; sfb++) {
            var width = cod_info.width[sfb];
            var s = cod_info.scalefac[sfb];
            if (cod_info.preflag != 0)
              s += qupvt.pretab[sfb];
            j += width;
            if ((s & 1) != 0) {
              s++;
              for (var l2 = -width; l2 < 0; l2++) {
                xrpow[j + l2] *= ifqstep34;
                if (xrpow[j + l2] > cod_info.xrpow_max)
                  cod_info.xrpow_max = xrpow[j + l2];
              }
            }
            cod_info.scalefac[sfb] = s >> 1;
          }
          cod_info.preflag = 0;
          cod_info.scalefac_scale = 1;
        }
        function inc_subblock_gain(gfc, cod_info, xrpow) {
          var sfb;
          var scalefac = cod_info.scalefac;
          for (sfb = 0; sfb < cod_info.sfb_lmax; sfb++) {
            if (scalefac[sfb] >= 16)
              return true;
          }
          for (var window2 = 0; window2 < 3; window2++) {
            var s1 = 0;
            var s2 = 0;
            for (sfb = cod_info.sfb_lmax + window2; sfb < cod_info.sfbdivide; sfb += 3) {
              if (s1 < scalefac[sfb])
                s1 = scalefac[sfb];
            }
            for (; sfb < cod_info.sfbmax; sfb += 3) {
              if (s2 < scalefac[sfb])
                s2 = scalefac[sfb];
            }
            if (s1 < 16 && s2 < 8)
              continue;
            if (cod_info.subblock_gain[window2] >= 7)
              return true;
            cod_info.subblock_gain[window2]++;
            var j = gfc.scalefac_band.l[cod_info.sfb_lmax];
            for (sfb = cod_info.sfb_lmax + window2; sfb < cod_info.sfbmax; sfb += 3) {
              var amp;
              var width = cod_info.width[sfb];
              var s = scalefac[sfb];
              s = s - (4 >> cod_info.scalefac_scale);
              if (s >= 0) {
                scalefac[sfb] = s;
                j += width * 3;
                continue;
              }
              scalefac[sfb] = 0;
              {
                var gain = 210 + (s << cod_info.scalefac_scale + 1);
                amp = qupvt.IPOW20(gain);
              }
              j += width * (window2 + 1);
              for (var l2 = -width; l2 < 0; l2++) {
                xrpow[j + l2] *= amp;
                if (xrpow[j + l2] > cod_info.xrpow_max)
                  cod_info.xrpow_max = xrpow[j + l2];
              }
              j += width * (3 - window2 - 1);
            }
            {
              var amp = qupvt.IPOW20(202);
              j += cod_info.width[sfb] * (window2 + 1);
              for (var l2 = -cod_info.width[sfb]; l2 < 0; l2++) {
                xrpow[j + l2] *= amp;
                if (xrpow[j + l2] > cod_info.xrpow_max)
                  cod_info.xrpow_max = xrpow[j + l2];
              }
            }
          }
          return false;
        }
        function balance_noise(gfp, cod_info, distort, xrpow, bRefine) {
          var gfc = gfp.internal_flags;
          amp_scalefac_bands(gfp, cod_info, distort, xrpow);
          var status = loop_break(cod_info);
          if (status)
            return false;
          if (gfc.mode_gr == 2)
            status = tk.scale_bitcount(cod_info);
          else
            status = tk.scale_bitcount_lsf(gfc, cod_info);
          if (!status)
            return true;
          if (gfc.noise_shaping > 1) {
            Arrays2.fill(gfc.pseudohalf, 0);
            if (0 == cod_info.scalefac_scale) {
              inc_scalefac_scale(cod_info, xrpow);
              status = false;
            } else {
              if (cod_info.block_type == Encoder2.SHORT_TYPE && gfc.subblock_gain > 0) {
                status = inc_subblock_gain(gfc, cod_info, xrpow) || loop_break(cod_info);
              }
            }
          }
          if (!status) {
            if (gfc.mode_gr == 2)
              status = tk.scale_bitcount(cod_info);
            else
              status = tk.scale_bitcount_lsf(gfc, cod_info);
          }
          return !status;
        }
        this.outer_loop = function(gfp, cod_info, l3_xmin, xrpow, ch, targ_bits) {
          var gfc = gfp.internal_flags;
          var cod_info_w = new GrInfo2();
          var save_xrpow = new_float2(576);
          var distort = new_float2(L3Side2.SFBMAX);
          var best_noise_info = new CalcNoiseResult2();
          var better;
          var prev_noise = new CalcNoiseData();
          var best_part2_3_length = 9999999;
          var bEndOfSearch = false;
          var bRefine = false;
          var best_ggain_pass1 = 0;
          bin_search_StepSize(gfc, cod_info, targ_bits, ch, xrpow);
          if (0 == gfc.noise_shaping)
            return 100;
          qupvt.calc_noise(
            cod_info,
            l3_xmin,
            distort,
            best_noise_info,
            prev_noise
          );
          best_noise_info.bits = cod_info.part2_3_length;
          cod_info_w.assign(cod_info);
          var age = 0;
          System2.arraycopy(xrpow, 0, save_xrpow, 0, 576);
          while (!bEndOfSearch) {
            do {
              var noise_info = new CalcNoiseResult2();
              var search_limit;
              var maxggain = 255;
              if ((gfc.substep_shaping & 2) != 0) {
                search_limit = 20;
              } else {
                search_limit = 3;
              }
              if (gfc.sfb21_extra) {
                abort();
              }
              if (!balance_noise(gfp, cod_info_w, distort, xrpow))
                break;
              if (cod_info_w.scalefac_scale != 0)
                maxggain = 254;
              var huff_bits = targ_bits - cod_info_w.part2_length;
              if (huff_bits <= 0)
                break;
              while ((cod_info_w.part2_3_length = tk.count_bits(
                gfc,
                xrpow,
                cod_info_w,
                prev_noise
              )) > huff_bits && cod_info_w.global_gain <= maxggain)
                cod_info_w.global_gain++;
              if (cod_info_w.global_gain > maxggain)
                break;
              if (best_noise_info.over_count == 0) {
                while ((cod_info_w.part2_3_length = tk.count_bits(
                  gfc,
                  xrpow,
                  cod_info_w,
                  prev_noise
                )) > best_part2_3_length && cod_info_w.global_gain <= maxggain)
                  cod_info_w.global_gain++;
                if (cod_info_w.global_gain > maxggain)
                  break;
              }
              qupvt.calc_noise(
                cod_info_w,
                l3_xmin,
                distort,
                noise_info,
                prev_noise
              );
              noise_info.bits = cod_info_w.part2_3_length;
              if (cod_info.block_type != Encoder2.SHORT_TYPE) {
                better = gfp.quant_comp;
              } else
                better = gfp.quant_comp_short;
              better = quant_compare(better, best_noise_info, noise_info) ? 1 : 0;
              if (better != 0) {
                best_part2_3_length = cod_info.part2_3_length;
                best_noise_info = noise_info;
                cod_info.assign(cod_info_w);
                age = 0;
                System2.arraycopy(xrpow, 0, save_xrpow, 0, 576);
              } else {
                if (gfc.full_outer_loop == 0) {
                  if (++age > search_limit && best_noise_info.over_count == 0)
                    break;
                  if (gfc.noise_shaping_amp == 3 && bRefine && age > 30)
                    break;
                  if (gfc.noise_shaping_amp == 3 && bRefine && cod_info_w.global_gain - best_ggain_pass1 > 15)
                    break;
                }
              }
            } while (cod_info_w.global_gain + cod_info_w.scalefac_scale < 255);
            if (gfc.noise_shaping_amp == 3) {
              abort();
            } else {
              bEndOfSearch = true;
            }
          }
          if (gfp.VBR == VbrMode2.vbr_rh || gfp.VBR == VbrMode2.vbr_mtrh)
            System2.arraycopy(save_xrpow, 0, xrpow, 0, 576);
          else if ((gfc.substep_shaping & 1) != 0)
            abort();
          return best_noise_info.over_count;
        };
        this.iteration_finish_one = function(gfc, gr, ch) {
          var l3_side = gfc.l3_side;
          var cod_info = l3_side.tt[gr][ch];
          tk.best_scalefac_store(gfc, gr, ch, l3_side);
          if (gfc.use_best_huffman == 1)
            tk.best_huffman_divide(gfc, cod_info);
          rv.ResvAdjust(gfc, cod_info);
        };
      }
      function NewMDCT() {
        var enwindow = [
          -477e-9 * 0.740951125354959 / 2384e-9,
          103951e-9 * 0.740951125354959 / 2384e-9,
          953674e-9 * 0.740951125354959 / 2384e-9,
          2841473e-9 * 0.740951125354959 / 2384e-9,
          0.035758972 * 0.740951125354959 / 2384e-9,
          3401756e-9 * 0.740951125354959 / 2384e-9,
          983715e-9 * 0.740951125354959 / 2384e-9,
          99182e-9 * 0.740951125354959 / 2384e-9,
          /* 15 */
          12398e-9 * 0.740951125354959 / 2384e-9,
          191212e-9 * 0.740951125354959 / 2384e-9,
          2283096e-9 * 0.740951125354959 / 2384e-9,
          0.016994476 * 0.740951125354959 / 2384e-9,
          -0.018756866 * 0.740951125354959 / 2384e-9,
          -2630711e-9 * 0.740951125354959 / 2384e-9,
          -247478e-9 * 0.740951125354959 / 2384e-9,
          -14782e-9 * 0.740951125354959 / 2384e-9,
          0.9063471690191471,
          0.1960342806591213,
          -477e-9 * 0.773010453362737 / 2384e-9,
          105858e-9 * 0.773010453362737 / 2384e-9,
          930786e-9 * 0.773010453362737 / 2384e-9,
          2521515e-9 * 0.773010453362737 / 2384e-9,
          0.035694122 * 0.773010453362737 / 2384e-9,
          3643036e-9 * 0.773010453362737 / 2384e-9,
          991821e-9 * 0.773010453362737 / 2384e-9,
          96321e-9 * 0.773010453362737 / 2384e-9,
          /* 14 */
          11444e-9 * 0.773010453362737 / 2384e-9,
          165462e-9 * 0.773010453362737 / 2384e-9,
          2110004e-9 * 0.773010453362737 / 2384e-9,
          0.016112804 * 0.773010453362737 / 2384e-9,
          -0.019634247 * 0.773010453362737 / 2384e-9,
          -2803326e-9 * 0.773010453362737 / 2384e-9,
          -277042e-9 * 0.773010453362737 / 2384e-9,
          -16689e-9 * 0.773010453362737 / 2384e-9,
          0.8206787908286602,
          0.3901806440322567,
          -477e-9 * 0.803207531480645 / 2384e-9,
          107288e-9 * 0.803207531480645 / 2384e-9,
          902653e-9 * 0.803207531480645 / 2384e-9,
          2174854e-9 * 0.803207531480645 / 2384e-9,
          0.035586357 * 0.803207531480645 / 2384e-9,
          3858566e-9 * 0.803207531480645 / 2384e-9,
          995159e-9 * 0.803207531480645 / 2384e-9,
          9346e-8 * 0.803207531480645 / 2384e-9,
          /* 13 */
          10014e-9 * 0.803207531480645 / 2384e-9,
          14019e-8 * 0.803207531480645 / 2384e-9,
          1937389e-9 * 0.803207531480645 / 2384e-9,
          0.015233517 * 0.803207531480645 / 2384e-9,
          -0.020506859 * 0.803207531480645 / 2384e-9,
          -2974033e-9 * 0.803207531480645 / 2384e-9,
          -30756e-8 * 0.803207531480645 / 2384e-9,
          -1812e-8 * 0.803207531480645 / 2384e-9,
          0.7416505462720353,
          0.5805693545089249,
          -477e-9 * 0.831469612302545 / 2384e-9,
          108242e-9 * 0.831469612302545 / 2384e-9,
          868797e-9 * 0.831469612302545 / 2384e-9,
          1800537e-9 * 0.831469612302545 / 2384e-9,
          0.0354352 * 0.831469612302545 / 2384e-9,
          4049301e-9 * 0.831469612302545 / 2384e-9,
          994205e-9 * 0.831469612302545 / 2384e-9,
          90599e-9 * 0.831469612302545 / 2384e-9,
          /* 12 */
          906e-8 * 0.831469612302545 / 2384e-9,
          116348e-9 * 0.831469612302545 / 2384e-9,
          1766682e-9 * 0.831469612302545 / 2384e-9,
          0.014358521 * 0.831469612302545 / 2384e-9,
          -0.021372318 * 0.831469612302545 / 2384e-9,
          -314188e-8 * 0.831469612302545 / 2384e-9,
          -339031e-9 * 0.831469612302545 / 2384e-9,
          -1955e-8 * 0.831469612302545 / 2384e-9,
          0.6681786379192989,
          0.7653668647301797,
          -477e-9 * 0.857728610000272 / 2384e-9,
          108719e-9 * 0.857728610000272 / 2384e-9,
          82922e-8 * 0.857728610000272 / 2384e-9,
          1399517e-9 * 0.857728610000272 / 2384e-9,
          0.035242081 * 0.857728610000272 / 2384e-9,
          421524e-8 * 0.857728610000272 / 2384e-9,
          989437e-9 * 0.857728610000272 / 2384e-9,
          87261e-9 * 0.857728610000272 / 2384e-9,
          /* 11 */
          8106e-9 * 0.857728610000272 / 2384e-9,
          93937e-9 * 0.857728610000272 / 2384e-9,
          1597881e-9 * 0.857728610000272 / 2384e-9,
          0.013489246 * 0.857728610000272 / 2384e-9,
          -0.022228718 * 0.857728610000272 / 2384e-9,
          -3306866e-9 * 0.857728610000272 / 2384e-9,
          -371456e-9 * 0.857728610000272 / 2384e-9,
          -21458e-9 * 0.857728610000272 / 2384e-9,
          0.5993769336819237,
          0.9427934736519954,
          -477e-9 * 0.881921264348355 / 2384e-9,
          108719e-9 * 0.881921264348355 / 2384e-9,
          78392e-8 * 0.881921264348355 / 2384e-9,
          971317e-9 * 0.881921264348355 / 2384e-9,
          0.035007 * 0.881921264348355 / 2384e-9,
          4357815e-9 * 0.881921264348355 / 2384e-9,
          980854e-9 * 0.881921264348355 / 2384e-9,
          83923e-9 * 0.881921264348355 / 2384e-9,
          /* 10 */
          7629e-9 * 0.881921264348355 / 2384e-9,
          72956e-9 * 0.881921264348355 / 2384e-9,
          1432419e-9 * 0.881921264348355 / 2384e-9,
          0.012627602 * 0.881921264348355 / 2384e-9,
          -0.02307415 * 0.881921264348355 / 2384e-9,
          -3467083e-9 * 0.881921264348355 / 2384e-9,
          -404358e-9 * 0.881921264348355 / 2384e-9,
          -23365e-9 * 0.881921264348355 / 2384e-9,
          0.5345111359507916,
          1.111140466039205,
          -954e-9 * 0.903989293123443 / 2384e-9,
          108242e-9 * 0.903989293123443 / 2384e-9,
          731945e-9 * 0.903989293123443 / 2384e-9,
          515938e-9 * 0.903989293123443 / 2384e-9,
          0.034730434 * 0.903989293123443 / 2384e-9,
          4477024e-9 * 0.903989293123443 / 2384e-9,
          968933e-9 * 0.903989293123443 / 2384e-9,
          80585e-9 * 0.903989293123443 / 2384e-9,
          /* 9 */
          6676e-9 * 0.903989293123443 / 2384e-9,
          52929e-9 * 0.903989293123443 / 2384e-9,
          1269817e-9 * 0.903989293123443 / 2384e-9,
          0.011775017 * 0.903989293123443 / 2384e-9,
          -0.023907185 * 0.903989293123443 / 2384e-9,
          -3622532e-9 * 0.903989293123443 / 2384e-9,
          -438213e-9 * 0.903989293123443 / 2384e-9,
          -25272e-9 * 0.903989293123443 / 2384e-9,
          0.4729647758913199,
          1.268786568327291,
          -954e-9 * 0.9238795325112867 / 2384e-9,
          106812e-9 * 0.9238795325112867 / 2384e-9,
          674248e-9 * 0.9238795325112867 / 2384e-9,
          33379e-9 * 0.9238795325112867 / 2384e-9,
          0.034412861 * 0.9238795325112867 / 2384e-9,
          4573822e-9 * 0.9238795325112867 / 2384e-9,
          954151e-9 * 0.9238795325112867 / 2384e-9,
          76771e-9 * 0.9238795325112867 / 2384e-9,
          6199e-9 * 0.9238795325112867 / 2384e-9,
          34332e-9 * 0.9238795325112867 / 2384e-9,
          1111031e-9 * 0.9238795325112867 / 2384e-9,
          0.010933399 * 0.9238795325112867 / 2384e-9,
          -0.024725437 * 0.9238795325112867 / 2384e-9,
          -3771782e-9 * 0.9238795325112867 / 2384e-9,
          -472546e-9 * 0.9238795325112867 / 2384e-9,
          -27657e-9 * 0.9238795325112867 / 2384e-9,
          0.41421356237309503,
          /* tan(PI/8) */
          1.414213562373095,
          -954e-9 * 0.941544065183021 / 2384e-9,
          105381e-9 * 0.941544065183021 / 2384e-9,
          610352e-9 * 0.941544065183021 / 2384e-9,
          -475883e-9 * 0.941544065183021 / 2384e-9,
          0.03405571 * 0.941544065183021 / 2384e-9,
          4649162e-9 * 0.941544065183021 / 2384e-9,
          935555e-9 * 0.941544065183021 / 2384e-9,
          73433e-9 * 0.941544065183021 / 2384e-9,
          /* 7 */
          5245e-9 * 0.941544065183021 / 2384e-9,
          17166e-9 * 0.941544065183021 / 2384e-9,
          956535e-9 * 0.941544065183021 / 2384e-9,
          0.010103703 * 0.941544065183021 / 2384e-9,
          -0.025527 * 0.941544065183021 / 2384e-9,
          -3914356e-9 * 0.941544065183021 / 2384e-9,
          -507355e-9 * 0.941544065183021 / 2384e-9,
          -30041e-9 * 0.941544065183021 / 2384e-9,
          0.3578057213145241,
          1.546020906725474,
          -954e-9 * 0.956940335732209 / 2384e-9,
          10252e-8 * 0.956940335732209 / 2384e-9,
          539303e-9 * 0.956940335732209 / 2384e-9,
          -1011848e-9 * 0.956940335732209 / 2384e-9,
          0.033659935 * 0.956940335732209 / 2384e-9,
          4703045e-9 * 0.956940335732209 / 2384e-9,
          915051e-9 * 0.956940335732209 / 2384e-9,
          70095e-9 * 0.956940335732209 / 2384e-9,
          /* 6 */
          4768e-9 * 0.956940335732209 / 2384e-9,
          954e-9 * 0.956940335732209 / 2384e-9,
          806808e-9 * 0.956940335732209 / 2384e-9,
          9287834e-9 * 0.956940335732209 / 2384e-9,
          -0.026310921 * 0.956940335732209 / 2384e-9,
          -4048824e-9 * 0.956940335732209 / 2384e-9,
          -542164e-9 * 0.956940335732209 / 2384e-9,
          -32425e-9 * 0.956940335732209 / 2384e-9,
          0.3033466836073424,
          1.66293922460509,
          -1431e-9 * 0.970031253194544 / 2384e-9,
          99182e-9 * 0.970031253194544 / 2384e-9,
          462532e-9 * 0.970031253194544 / 2384e-9,
          -1573563e-9 * 0.970031253194544 / 2384e-9,
          0.033225536 * 0.970031253194544 / 2384e-9,
          4737377e-9 * 0.970031253194544 / 2384e-9,
          891685e-9 * 0.970031253194544 / 2384e-9,
          6628e-8 * 0.970031253194544 / 2384e-9,
          /* 5 */
          4292e-9 * 0.970031253194544 / 2384e-9,
          -13828e-9 * 0.970031253194544 / 2384e-9,
          66185e-8 * 0.970031253194544 / 2384e-9,
          8487225e-9 * 0.970031253194544 / 2384e-9,
          -0.02707386 * 0.970031253194544 / 2384e-9,
          -4174709e-9 * 0.970031253194544 / 2384e-9,
          -576973e-9 * 0.970031253194544 / 2384e-9,
          -34809e-9 * 0.970031253194544 / 2384e-9,
          0.2504869601913055,
          1.76384252869671,
          -1431e-9 * 0.98078528040323 / 2384e-9,
          95367e-9 * 0.98078528040323 / 2384e-9,
          378609e-9 * 0.98078528040323 / 2384e-9,
          -2161503e-9 * 0.98078528040323 / 2384e-9,
          0.032754898 * 0.98078528040323 / 2384e-9,
          4752159e-9 * 0.98078528040323 / 2384e-9,
          866413e-9 * 0.98078528040323 / 2384e-9,
          62943e-9 * 0.98078528040323 / 2384e-9,
          /* 4 */
          3815e-9 * 0.98078528040323 / 2384e-9,
          -2718e-8 * 0.98078528040323 / 2384e-9,
          522137e-9 * 0.98078528040323 / 2384e-9,
          7703304e-9 * 0.98078528040323 / 2384e-9,
          -0.027815342 * 0.98078528040323 / 2384e-9,
          -4290581e-9 * 0.98078528040323 / 2384e-9,
          -611782e-9 * 0.98078528040323 / 2384e-9,
          -3767e-8 * 0.98078528040323 / 2384e-9,
          0.198912367379658,
          1.847759065022573,
          -1907e-9 * 0.989176509964781 / 2384e-9,
          90122e-9 * 0.989176509964781 / 2384e-9,
          288486e-9 * 0.989176509964781 / 2384e-9,
          -2774239e-9 * 0.989176509964781 / 2384e-9,
          0.03224802 * 0.989176509964781 / 2384e-9,
          4748821e-9 * 0.989176509964781 / 2384e-9,
          838757e-9 * 0.989176509964781 / 2384e-9,
          59605e-9 * 0.989176509964781 / 2384e-9,
          /* 3 */
          3338e-9 * 0.989176509964781 / 2384e-9,
          -39577e-9 * 0.989176509964781 / 2384e-9,
          388145e-9 * 0.989176509964781 / 2384e-9,
          6937027e-9 * 0.989176509964781 / 2384e-9,
          -0.028532982 * 0.989176509964781 / 2384e-9,
          -4395962e-9 * 0.989176509964781 / 2384e-9,
          -646591e-9 * 0.989176509964781 / 2384e-9,
          -40531e-9 * 0.989176509964781 / 2384e-9,
          0.1483359875383474,
          1.913880671464418,
          -1907e-9 * 0.995184726672197 / 2384e-9,
          844e-7 * 0.995184726672197 / 2384e-9,
          191689e-9 * 0.995184726672197 / 2384e-9,
          -3411293e-9 * 0.995184726672197 / 2384e-9,
          0.03170681 * 0.995184726672197 / 2384e-9,
          4728317e-9 * 0.995184726672197 / 2384e-9,
          809669e-9 * 0.995184726672197 / 2384e-9,
          5579e-8 * 0.995184726672197 / 2384e-9,
          3338e-9 * 0.995184726672197 / 2384e-9,
          -50545e-9 * 0.995184726672197 / 2384e-9,
          259876e-9 * 0.995184726672197 / 2384e-9,
          6189346e-9 * 0.995184726672197 / 2384e-9,
          -0.029224873 * 0.995184726672197 / 2384e-9,
          -4489899e-9 * 0.995184726672197 / 2384e-9,
          -680923e-9 * 0.995184726672197 / 2384e-9,
          -43392e-9 * 0.995184726672197 / 2384e-9,
          0.09849140335716425,
          1.961570560806461,
          -2384e-9 * 0.998795456205172 / 2384e-9,
          77724e-9 * 0.998795456205172 / 2384e-9,
          88215e-9 * 0.998795456205172 / 2384e-9,
          -4072189e-9 * 0.998795456205172 / 2384e-9,
          0.031132698 * 0.998795456205172 / 2384e-9,
          4691124e-9 * 0.998795456205172 / 2384e-9,
          779152e-9 * 0.998795456205172 / 2384e-9,
          52929e-9 * 0.998795456205172 / 2384e-9,
          2861e-9 * 0.998795456205172 / 2384e-9,
          -60558e-9 * 0.998795456205172 / 2384e-9,
          137329e-9 * 0.998795456205172 / 2384e-9,
          546217e-8 * 0.998795456205172 / 2384e-9,
          -0.02989006 * 0.998795456205172 / 2384e-9,
          -4570484e-9 * 0.998795456205172 / 2384e-9,
          -714302e-9 * 0.998795456205172 / 2384e-9,
          -46253e-9 * 0.998795456205172 / 2384e-9,
          0.04912684976946725,
          1.990369453344394,
          0.035780907 * Util2.SQRT2 * 0.5 / 2384e-9,
          0.017876148 * Util2.SQRT2 * 0.5 / 2384e-9,
          3134727e-9 * Util2.SQRT2 * 0.5 / 2384e-9,
          2457142e-9 * Util2.SQRT2 * 0.5 / 2384e-9,
          971317e-9 * Util2.SQRT2 * 0.5 / 2384e-9,
          218868e-9 * Util2.SQRT2 * 0.5 / 2384e-9,
          101566e-9 * Util2.SQRT2 * 0.5 / 2384e-9,
          13828e-9 * Util2.SQRT2 * 0.5 / 2384e-9,
          0.030526638 / 2384e-9,
          4638195e-9 / 2384e-9,
          747204e-9 / 2384e-9,
          49591e-9 / 2384e-9,
          4756451e-9 / 2384e-9,
          21458e-9 / 2384e-9,
          -69618e-9 / 2384e-9
          /* 2.384e-06/2.384e-06 */
        ];
        var NS = 12;
        var NL = 36;
        var win = [
          [
            2382191739347913e-28,
            6423305872147834e-28,
            9400849094049688e-28,
            1122435026096556e-27,
            1183840321267481e-27,
            1122435026096556e-27,
            940084909404969e-27,
            6423305872147839e-28,
            2382191739347918e-28,
            5456116108943412e-27,
            4878985199565852e-27,
            4240448995017367e-27,
            3559909094758252e-27,
            2858043359288075e-27,
            2156177623817898e-27,
            1475637723558783e-27,
            8371015190102974e-28,
            2599706096327376e-28,
            -5456116108943412e-27,
            -4878985199565852e-27,
            -4240448995017367e-27,
            -3559909094758252e-27,
            -2858043359288076e-27,
            -2156177623817898e-27,
            -1475637723558783e-27,
            -8371015190102975e-28,
            -2599706096327376e-28,
            -2382191739347923e-28,
            -6423305872147843e-28,
            -9400849094049696e-28,
            -1122435026096556e-27,
            -1183840321267481e-27,
            -1122435026096556e-27,
            -9400849094049694e-28,
            -642330587214784e-27,
            -2382191739347918e-28
          ],
          [
            2382191739347913e-28,
            6423305872147834e-28,
            9400849094049688e-28,
            1122435026096556e-27,
            1183840321267481e-27,
            1122435026096556e-27,
            9400849094049688e-28,
            6423305872147841e-28,
            2382191739347918e-28,
            5456116108943413e-27,
            4878985199565852e-27,
            4240448995017367e-27,
            3559909094758253e-27,
            2858043359288075e-27,
            2156177623817898e-27,
            1475637723558782e-27,
            8371015190102975e-28,
            2599706096327376e-28,
            -5461314069809755e-27,
            -4921085770524055e-27,
            -4343405037091838e-27,
            -3732668368707687e-27,
            -3093523840190885e-27,
            -2430835727329465e-27,
            -1734679010007751e-27,
            -974825365660928e-27,
            -2797435120168326e-28,
            0,
            0,
            0,
            0,
            0,
            0,
            -2283748241799531e-28,
            -4037858874020686e-28,
            -2146547464825323e-28
          ],
          [
            0.1316524975873958,
            /* win[SHORT_TYPE] */
            0.414213562373095,
            0.7673269879789602,
            1.091308501069271,
            /* tantab_l */
            1.303225372841206,
            1.56968557711749,
            1.920982126971166,
            2.414213562373094,
            3.171594802363212,
            4.510708503662055,
            7.595754112725146,
            22.90376554843115,
            0.984807753012208,
            /* cx */
            0.6427876096865394,
            0.3420201433256688,
            0.9396926207859084,
            -0.1736481776669303,
            -0.7660444431189779,
            0.8660254037844387,
            0.5,
            -0.5144957554275265,
            /* ca */
            -0.4717319685649723,
            -0.3133774542039019,
            -0.1819131996109812,
            -0.09457419252642064,
            -0.04096558288530405,
            -0.01419856857247115,
            -0.003699974673760037,
            0.8574929257125442,
            /* cs */
            0.8817419973177052,
            0.9496286491027329,
            0.9833145924917901,
            0.9955178160675857,
            0.9991605581781475,
            0.999899195244447,
            0.9999931550702802
          ],
          [
            0,
            0,
            0,
            0,
            0,
            0,
            2283748241799531e-28,
            4037858874020686e-28,
            2146547464825323e-28,
            5461314069809755e-27,
            4921085770524055e-27,
            4343405037091838e-27,
            3732668368707687e-27,
            3093523840190885e-27,
            2430835727329466e-27,
            1734679010007751e-27,
            974825365660928e-27,
            2797435120168326e-28,
            -5456116108943413e-27,
            -4878985199565852e-27,
            -4240448995017367e-27,
            -3559909094758253e-27,
            -2858043359288075e-27,
            -2156177623817898e-27,
            -1475637723558782e-27,
            -8371015190102975e-28,
            -2599706096327376e-28,
            -2382191739347913e-28,
            -6423305872147834e-28,
            -9400849094049688e-28,
            -1122435026096556e-27,
            -1183840321267481e-27,
            -1122435026096556e-27,
            -9400849094049688e-28,
            -6423305872147841e-28,
            -2382191739347918e-28
          ]
        ];
        var tantab_l = win[Encoder2.SHORT_TYPE];
        var cx = win[Encoder2.SHORT_TYPE];
        var ca = win[Encoder2.SHORT_TYPE];
        var cs = win[Encoder2.SHORT_TYPE];
        var order = [
          0,
          1,
          16,
          17,
          8,
          9,
          24,
          25,
          4,
          5,
          20,
          21,
          12,
          13,
          28,
          29,
          2,
          3,
          18,
          19,
          10,
          11,
          26,
          27,
          6,
          7,
          22,
          23,
          14,
          15,
          30,
          31
        ];
        function window_subband(x1, x1Pos, a) {
          var wp = 10;
          var x2 = x1Pos + 238 - 14 - 286;
          for (var i = -15; i < 0; i++) {
            var w, s, t;
            w = enwindow[wp + -10];
            s = x1[x2 + -224] * w;
            t = x1[x1Pos + 224] * w;
            w = enwindow[wp + -9];
            s += x1[x2 + -160] * w;
            t += x1[x1Pos + 160] * w;
            w = enwindow[wp + -8];
            s += x1[x2 + -96] * w;
            t += x1[x1Pos + 96] * w;
            w = enwindow[wp + -7];
            s += x1[x2 + -32] * w;
            t += x1[x1Pos + 32] * w;
            w = enwindow[wp + -6];
            s += x1[x2 + 32] * w;
            t += x1[x1Pos + -32] * w;
            w = enwindow[wp + -5];
            s += x1[x2 + 96] * w;
            t += x1[x1Pos + -96] * w;
            w = enwindow[wp + -4];
            s += x1[x2 + 160] * w;
            t += x1[x1Pos + -160] * w;
            w = enwindow[wp + -3];
            s += x1[x2 + 224] * w;
            t += x1[x1Pos + -224] * w;
            w = enwindow[wp + -2];
            s += x1[x1Pos + -256] * w;
            t -= x1[x2 + 256] * w;
            w = enwindow[wp + -1];
            s += x1[x1Pos + -192] * w;
            t -= x1[x2 + 192] * w;
            w = enwindow[wp + 0];
            s += x1[x1Pos + -128] * w;
            t -= x1[x2 + 128] * w;
            w = enwindow[wp + 1];
            s += x1[x1Pos + -64] * w;
            t -= x1[x2 + 64] * w;
            w = enwindow[wp + 2];
            s += x1[x1Pos + 0] * w;
            t -= x1[x2 + 0] * w;
            w = enwindow[wp + 3];
            s += x1[x1Pos + 64] * w;
            t -= x1[x2 + -64] * w;
            w = enwindow[wp + 4];
            s += x1[x1Pos + 128] * w;
            t -= x1[x2 + -128] * w;
            w = enwindow[wp + 5];
            s += x1[x1Pos + 192] * w;
            t -= x1[x2 + -192] * w;
            s *= enwindow[wp + 6];
            w = t - s;
            a[30 + i * 2] = t + s;
            a[31 + i * 2] = enwindow[wp + 7] * w;
            wp += 18;
            x1Pos--;
            x2++;
          }
          {
            var s, t, u, v;
            t = x1[x1Pos + -16] * enwindow[wp + -10];
            s = x1[x1Pos + -32] * enwindow[wp + -2];
            t += (x1[x1Pos + -48] - x1[x1Pos + 16]) * enwindow[wp + -9];
            s += x1[x1Pos + -96] * enwindow[wp + -1];
            t += (x1[x1Pos + -80] + x1[x1Pos + 48]) * enwindow[wp + -8];
            s += x1[x1Pos + -160] * enwindow[wp + 0];
            t += (x1[x1Pos + -112] - x1[x1Pos + 80]) * enwindow[wp + -7];
            s += x1[x1Pos + -224] * enwindow[wp + 1];
            t += (x1[x1Pos + -144] + x1[x1Pos + 112]) * enwindow[wp + -6];
            s -= x1[x1Pos + 32] * enwindow[wp + 2];
            t += (x1[x1Pos + -176] - x1[x1Pos + 144]) * enwindow[wp + -5];
            s -= x1[x1Pos + 96] * enwindow[wp + 3];
            t += (x1[x1Pos + -208] + x1[x1Pos + 176]) * enwindow[wp + -4];
            s -= x1[x1Pos + 160] * enwindow[wp + 4];
            t += (x1[x1Pos + -240] - x1[x1Pos + 208]) * enwindow[wp + -3];
            s -= x1[x1Pos + 224];
            u = s - t;
            v = s + t;
            t = a[14];
            s = a[15] - t;
            a[31] = v + t;
            a[30] = u + s;
            a[15] = u - s;
            a[14] = v - t;
          }
          {
            var xr;
            xr = a[28] - a[0];
            a[0] += a[28];
            a[28] = xr * enwindow[wp + -2 * 18 + 7];
            xr = a[29] - a[1];
            a[1] += a[29];
            a[29] = xr * enwindow[wp + -2 * 18 + 7];
            xr = a[26] - a[2];
            a[2] += a[26];
            a[26] = xr * enwindow[wp + -4 * 18 + 7];
            xr = a[27] - a[3];
            a[3] += a[27];
            a[27] = xr * enwindow[wp + -4 * 18 + 7];
            xr = a[24] - a[4];
            a[4] += a[24];
            a[24] = xr * enwindow[wp + -6 * 18 + 7];
            xr = a[25] - a[5];
            a[5] += a[25];
            a[25] = xr * enwindow[wp + -6 * 18 + 7];
            xr = a[22] - a[6];
            a[6] += a[22];
            a[22] = xr * Util2.SQRT2;
            xr = a[23] - a[7];
            a[7] += a[23];
            a[23] = xr * Util2.SQRT2 - a[7];
            a[7] -= a[6];
            a[22] -= a[7];
            a[23] -= a[22];
            xr = a[6];
            a[6] = a[31] - xr;
            a[31] = a[31] + xr;
            xr = a[7];
            a[7] = a[30] - xr;
            a[30] = a[30] + xr;
            xr = a[22];
            a[22] = a[15] - xr;
            a[15] = a[15] + xr;
            xr = a[23];
            a[23] = a[14] - xr;
            a[14] = a[14] + xr;
            xr = a[20] - a[8];
            a[8] += a[20];
            a[20] = xr * enwindow[wp + -10 * 18 + 7];
            xr = a[21] - a[9];
            a[9] += a[21];
            a[21] = xr * enwindow[wp + -10 * 18 + 7];
            xr = a[18] - a[10];
            a[10] += a[18];
            a[18] = xr * enwindow[wp + -12 * 18 + 7];
            xr = a[19] - a[11];
            a[11] += a[19];
            a[19] = xr * enwindow[wp + -12 * 18 + 7];
            xr = a[16] - a[12];
            a[12] += a[16];
            a[16] = xr * enwindow[wp + -14 * 18 + 7];
            xr = a[17] - a[13];
            a[13] += a[17];
            a[17] = xr * enwindow[wp + -14 * 18 + 7];
            xr = -a[20] + a[24];
            a[20] += a[24];
            a[24] = xr * enwindow[wp + -12 * 18 + 7];
            xr = -a[21] + a[25];
            a[21] += a[25];
            a[25] = xr * enwindow[wp + -12 * 18 + 7];
            xr = a[4] - a[8];
            a[4] += a[8];
            a[8] = xr * enwindow[wp + -12 * 18 + 7];
            xr = a[5] - a[9];
            a[5] += a[9];
            a[9] = xr * enwindow[wp + -12 * 18 + 7];
            xr = a[0] - a[12];
            a[0] += a[12];
            a[12] = xr * enwindow[wp + -4 * 18 + 7];
            xr = a[1] - a[13];
            a[1] += a[13];
            a[13] = xr * enwindow[wp + -4 * 18 + 7];
            xr = a[16] - a[28];
            a[16] += a[28];
            a[28] = xr * enwindow[wp + -4 * 18 + 7];
            xr = -a[17] + a[29];
            a[17] += a[29];
            a[29] = xr * enwindow[wp + -4 * 18 + 7];
            xr = Util2.SQRT2 * (a[2] - a[10]);
            a[2] += a[10];
            a[10] = xr;
            xr = Util2.SQRT2 * (a[3] - a[11]);
            a[3] += a[11];
            a[11] = xr;
            xr = Util2.SQRT2 * (-a[18] + a[26]);
            a[18] += a[26];
            a[26] = xr - a[18];
            xr = Util2.SQRT2 * (-a[19] + a[27]);
            a[19] += a[27];
            a[27] = xr - a[19];
            xr = a[2];
            a[19] -= a[3];
            a[3] -= xr;
            a[2] = a[31] - xr;
            a[31] += xr;
            xr = a[3];
            a[11] -= a[19];
            a[18] -= xr;
            a[3] = a[30] - xr;
            a[30] += xr;
            xr = a[18];
            a[27] -= a[11];
            a[19] -= xr;
            a[18] = a[15] - xr;
            a[15] += xr;
            xr = a[19];
            a[10] -= xr;
            a[19] = a[14] - xr;
            a[14] += xr;
            xr = a[10];
            a[11] -= xr;
            a[10] = a[23] - xr;
            a[23] += xr;
            xr = a[11];
            a[26] -= xr;
            a[11] = a[22] - xr;
            a[22] += xr;
            xr = a[26];
            a[27] -= xr;
            a[26] = a[7] - xr;
            a[7] += xr;
            xr = a[27];
            a[27] = a[6] - xr;
            a[6] += xr;
            xr = Util2.SQRT2 * (a[0] - a[4]);
            a[0] += a[4];
            a[4] = xr;
            xr = Util2.SQRT2 * (a[1] - a[5]);
            a[1] += a[5];
            a[5] = xr;
            xr = Util2.SQRT2 * (a[16] - a[20]);
            a[16] += a[20];
            a[20] = xr;
            xr = Util2.SQRT2 * (a[17] - a[21]);
            a[17] += a[21];
            a[21] = xr;
            xr = -Util2.SQRT2 * (a[8] - a[12]);
            a[8] += a[12];
            a[12] = xr - a[8];
            xr = -Util2.SQRT2 * (a[9] - a[13]);
            a[9] += a[13];
            a[13] = xr - a[9];
            xr = -Util2.SQRT2 * (a[25] - a[29]);
            a[25] += a[29];
            a[29] = xr - a[25];
            xr = -Util2.SQRT2 * (a[24] + a[28]);
            a[24] -= a[28];
            a[28] = xr - a[24];
            xr = a[24] - a[16];
            a[24] = xr;
            xr = a[20] - xr;
            a[20] = xr;
            xr = a[28] - xr;
            a[28] = xr;
            xr = a[25] - a[17];
            a[25] = xr;
            xr = a[21] - xr;
            a[21] = xr;
            xr = a[29] - xr;
            a[29] = xr;
            xr = a[17] - a[1];
            a[17] = xr;
            xr = a[9] - xr;
            a[9] = xr;
            xr = a[25] - xr;
            a[25] = xr;
            xr = a[5] - xr;
            a[5] = xr;
            xr = a[21] - xr;
            a[21] = xr;
            xr = a[13] - xr;
            a[13] = xr;
            xr = a[29] - xr;
            a[29] = xr;
            xr = a[1] - a[0];
            a[1] = xr;
            xr = a[16] - xr;
            a[16] = xr;
            xr = a[17] - xr;
            a[17] = xr;
            xr = a[8] - xr;
            a[8] = xr;
            xr = a[9] - xr;
            a[9] = xr;
            xr = a[24] - xr;
            a[24] = xr;
            xr = a[25] - xr;
            a[25] = xr;
            xr = a[4] - xr;
            a[4] = xr;
            xr = a[5] - xr;
            a[5] = xr;
            xr = a[20] - xr;
            a[20] = xr;
            xr = a[21] - xr;
            a[21] = xr;
            xr = a[12] - xr;
            a[12] = xr;
            xr = a[13] - xr;
            a[13] = xr;
            xr = a[28] - xr;
            a[28] = xr;
            xr = a[29] - xr;
            a[29] = xr;
            xr = a[0];
            a[0] += a[31];
            a[31] -= xr;
            xr = a[1];
            a[1] += a[30];
            a[30] -= xr;
            xr = a[16];
            a[16] += a[15];
            a[15] -= xr;
            xr = a[17];
            a[17] += a[14];
            a[14] -= xr;
            xr = a[8];
            a[8] += a[23];
            a[23] -= xr;
            xr = a[9];
            a[9] += a[22];
            a[22] -= xr;
            xr = a[24];
            a[24] += a[7];
            a[7] -= xr;
            xr = a[25];
            a[25] += a[6];
            a[6] -= xr;
            xr = a[4];
            a[4] += a[27];
            a[27] -= xr;
            xr = a[5];
            a[5] += a[26];
            a[26] -= xr;
            xr = a[20];
            a[20] += a[11];
            a[11] -= xr;
            xr = a[21];
            a[21] += a[10];
            a[10] -= xr;
            xr = a[12];
            a[12] += a[19];
            a[19] -= xr;
            xr = a[13];
            a[13] += a[18];
            a[18] -= xr;
            xr = a[28];
            a[28] += a[3];
            a[3] -= xr;
            xr = a[29];
            a[29] += a[2];
            a[2] -= xr;
          }
        }
        function mdct_short(inout, inoutPos) {
          for (var l2 = 0; l2 < 3; l2++) {
            var tc0, tc1, tc2, ts0, ts1, ts2;
            ts0 = inout[inoutPos + 2 * 3] * win[Encoder2.SHORT_TYPE][0] - inout[inoutPos + 5 * 3];
            tc0 = inout[inoutPos + 0 * 3] * win[Encoder2.SHORT_TYPE][2] - inout[inoutPos + 3 * 3];
            tc1 = ts0 + tc0;
            tc2 = ts0 - tc0;
            ts0 = inout[inoutPos + 5 * 3] * win[Encoder2.SHORT_TYPE][0] + inout[inoutPos + 2 * 3];
            tc0 = inout[inoutPos + 3 * 3] * win[Encoder2.SHORT_TYPE][2] + inout[inoutPos + 0 * 3];
            ts1 = ts0 + tc0;
            ts2 = -ts0 + tc0;
            tc0 = (inout[inoutPos + 1 * 3] * win[Encoder2.SHORT_TYPE][1] - inout[inoutPos + 4 * 3]) * 2069978111953089e-26;
            ts0 = (inout[inoutPos + 4 * 3] * win[Encoder2.SHORT_TYPE][1] + inout[inoutPos + 1 * 3]) * 2069978111953089e-26;
            inout[inoutPos + 3 * 0] = tc1 * 190752519173728e-25 + tc0;
            inout[inoutPos + 3 * 5] = -ts1 * 190752519173728e-25 + ts0;
            tc2 = tc2 * 0.8660254037844387 * 1907525191737281e-26;
            ts1 = ts1 * 0.5 * 1907525191737281e-26 + ts0;
            inout[inoutPos + 3 * 1] = tc2 - ts1;
            inout[inoutPos + 3 * 2] = tc2 + ts1;
            tc1 = tc1 * 0.5 * 1907525191737281e-26 - tc0;
            ts2 = ts2 * 0.8660254037844387 * 1907525191737281e-26;
            inout[inoutPos + 3 * 3] = tc1 + ts2;
            inout[inoutPos + 3 * 4] = tc1 - ts2;
            inoutPos++;
          }
        }
        function mdct_long(out, outPos, _in) {
          var ct, st;
          {
            var tc1, tc2, tc3, tc4, ts5, ts6, ts7, ts8;
            tc1 = _in[17] - _in[9];
            tc3 = _in[15] - _in[11];
            tc4 = _in[14] - _in[12];
            ts5 = _in[0] + _in[8];
            ts6 = _in[1] + _in[7];
            ts7 = _in[2] + _in[6];
            ts8 = _in[3] + _in[5];
            out[outPos + 17] = ts5 + ts7 - ts8 - (ts6 - _in[4]);
            st = (ts5 + ts7 - ts8) * cx[12 + 7] + (ts6 - _in[4]);
            ct = (tc1 - tc3 - tc4) * cx[12 + 6];
            out[outPos + 5] = ct + st;
            out[outPos + 6] = ct - st;
            tc2 = (_in[16] - _in[10]) * cx[12 + 6];
            ts6 = ts6 * cx[12 + 7] + _in[4];
            ct = tc1 * cx[12 + 0] + tc2 + tc3 * cx[12 + 1] + tc4 * cx[12 + 2];
            st = -ts5 * cx[12 + 4] + ts6 - ts7 * cx[12 + 5] + ts8 * cx[12 + 3];
            out[outPos + 1] = ct + st;
            out[outPos + 2] = ct - st;
            ct = tc1 * cx[12 + 1] - tc2 - tc3 * cx[12 + 2] + tc4 * cx[12 + 0];
            st = -ts5 * cx[12 + 5] + ts6 - ts7 * cx[12 + 3] + ts8 * cx[12 + 4];
            out[outPos + 9] = ct + st;
            out[outPos + 10] = ct - st;
            ct = tc1 * cx[12 + 2] - tc2 + tc3 * cx[12 + 0] - tc4 * cx[12 + 1];
            st = ts5 * cx[12 + 3] - ts6 + ts7 * cx[12 + 4] - ts8 * cx[12 + 5];
            out[outPos + 13] = ct + st;
            out[outPos + 14] = ct - st;
          }
          {
            var ts1, ts2, ts3, ts4, tc5, tc6, tc7, tc8;
            ts1 = _in[8] - _in[0];
            ts3 = _in[6] - _in[2];
            ts4 = _in[5] - _in[3];
            tc5 = _in[17] + _in[9];
            tc6 = _in[16] + _in[10];
            tc7 = _in[15] + _in[11];
            tc8 = _in[14] + _in[12];
            out[outPos + 0] = tc5 + tc7 + tc8 + (tc6 + _in[13]);
            ct = (tc5 + tc7 + tc8) * cx[12 + 7] - (tc6 + _in[13]);
            st = (ts1 - ts3 + ts4) * cx[12 + 6];
            out[outPos + 11] = ct + st;
            out[outPos + 12] = ct - st;
            ts2 = (_in[7] - _in[1]) * cx[12 + 6];
            tc6 = _in[13] - tc6 * cx[12 + 7];
            ct = tc5 * cx[12 + 3] - tc6 + tc7 * cx[12 + 4] + tc8 * cx[12 + 5];
            st = ts1 * cx[12 + 2] + ts2 + ts3 * cx[12 + 0] + ts4 * cx[12 + 1];
            out[outPos + 3] = ct + st;
            out[outPos + 4] = ct - st;
            ct = -tc5 * cx[12 + 5] + tc6 - tc7 * cx[12 + 3] - tc8 * cx[12 + 4];
            st = ts1 * cx[12 + 1] + ts2 - ts3 * cx[12 + 2] - ts4 * cx[12 + 0];
            out[outPos + 7] = ct + st;
            out[outPos + 8] = ct - st;
            ct = -tc5 * cx[12 + 4] + tc6 - tc7 * cx[12 + 5] - tc8 * cx[12 + 3];
            st = ts1 * cx[12 + 0] - ts2 + ts3 * cx[12 + 1] - ts4 * cx[12 + 2];
            out[outPos + 15] = ct + st;
            out[outPos + 16] = ct - st;
          }
        }
        this.mdct_sub48 = function(gfc, w0, w1) {
          var wk = w0;
          var wkPos = 286;
          for (var ch = 0; ch < gfc.channels_out; ch++) {
            for (var gr = 0; gr < gfc.mode_gr; gr++) {
              var band;
              var gi = gfc.l3_side.tt[gr][ch];
              var mdct_enc = gi.xr;
              var mdct_encPos = 0;
              var samp = gfc.sb_sample[ch][1 - gr];
              var sampPos = 0;
              for (var k2 = 0; k2 < 18 / 2; k2++) {
                window_subband(wk, wkPos, samp[sampPos]);
                window_subband(wk, wkPos + 32, samp[sampPos + 1]);
                sampPos += 2;
                wkPos += 64;
                for (band = 1; band < 32; band += 2) {
                  samp[sampPos - 1][band] *= -1;
                }
              }
              for (band = 0; band < 32; band++, mdct_encPos += 18) {
                var type = gi.block_type;
                var band0 = gfc.sb_sample[ch][gr];
                var band1 = gfc.sb_sample[ch][1 - gr];
                if (gi.mixed_block_flag != 0 && band < 2)
                  type = 0;
                if (gfc.amp_filter[band] < 1e-12) {
                  Arrays2.fill(
                    mdct_enc,
                    mdct_encPos + 0,
                    mdct_encPos + 18,
                    0
                  );
                } else {
                  if (gfc.amp_filter[band] < 1) {
                    abort();
                  }
                  if (type == Encoder2.SHORT_TYPE) {
                    for (var k2 = -NS / 4; k2 < 0; k2++) {
                      var w = win[Encoder2.SHORT_TYPE][k2 + 3];
                      mdct_enc[mdct_encPos + k2 * 3 + 9] = band0[9 + k2][order[band]] * w - band0[8 - k2][order[band]];
                      mdct_enc[mdct_encPos + k2 * 3 + 18] = band0[14 - k2][order[band]] * w + band0[15 + k2][order[band]];
                      mdct_enc[mdct_encPos + k2 * 3 + 10] = band0[15 + k2][order[band]] * w - band0[14 - k2][order[band]];
                      mdct_enc[mdct_encPos + k2 * 3 + 19] = band1[2 - k2][order[band]] * w + band1[3 + k2][order[band]];
                      mdct_enc[mdct_encPos + k2 * 3 + 11] = band1[3 + k2][order[band]] * w - band1[2 - k2][order[band]];
                      mdct_enc[mdct_encPos + k2 * 3 + 20] = band1[8 - k2][order[band]] * w + band1[9 + k2][order[band]];
                    }
                    mdct_short(mdct_enc, mdct_encPos);
                  } else {
                    var work = new_float2(18);
                    for (var k2 = -NL / 4; k2 < 0; k2++) {
                      var a, b;
                      a = win[type][k2 + 27] * band1[k2 + 9][order[band]] + win[type][k2 + 36] * band1[8 - k2][order[band]];
                      b = win[type][k2 + 9] * band0[k2 + 9][order[band]] - win[type][k2 + 18] * band0[8 - k2][order[band]];
                      work[k2 + 9] = a - b * tantab_l[3 + k2 + 9];
                      work[k2 + 18] = a * tantab_l[3 + k2 + 9] + b;
                    }
                    mdct_long(mdct_enc, mdct_encPos, work);
                  }
                }
                if (type != Encoder2.SHORT_TYPE && band != 0) {
                  for (var k2 = 7; k2 >= 0; --k2) {
                    var bu, bd;
                    bu = mdct_enc[mdct_encPos + k2] * ca[20 + k2] + mdct_enc[mdct_encPos + -1 - k2] * cs[28 + k2];
                    bd = mdct_enc[mdct_encPos + k2] * cs[28 + k2] - mdct_enc[mdct_encPos + -1 - k2] * ca[20 + k2];
                    mdct_enc[mdct_encPos + -1 - k2] = bu;
                    mdct_enc[mdct_encPos + k2] = bd;
                  }
                }
              }
            }
            wk = w1;
            wkPos = 286;
            if (gfc.mode_gr == 1) {
              for (var i = 0; i < 18; i++) {
                System2.arraycopy(
                  gfc.sb_sample[ch][1][i],
                  0,
                  gfc.sb_sample[ch][0][i],
                  0,
                  32
                );
              }
            }
          }
        };
      }
      function III_psy_ratio() {
        this.thm = new III_psy_xmin2();
        this.en = new III_psy_xmin2();
      }
      Encoder2.ENCDELAY = 576;
      Encoder2.POSTDELAY = 1152;
      Encoder2.MDCTDELAY = 48;
      Encoder2.FFTOFFSET = 224 + Encoder2.MDCTDELAY;
      Encoder2.DECDELAY = 528;
      Encoder2.SBLIMIT = 32;
      Encoder2.CBANDS = 64;
      Encoder2.SBPSY_l = 21;
      Encoder2.SBPSY_s = 12;
      Encoder2.SBMAX_l = 22;
      Encoder2.SBMAX_s = 13;
      Encoder2.PSFB21 = 6;
      Encoder2.PSFB12 = 6;
      Encoder2.BLKSIZE = 1024;
      Encoder2.HBLKSIZE = Encoder2.BLKSIZE / 2 + 1;
      Encoder2.BLKSIZE_s = 256;
      Encoder2.HBLKSIZE_s = Encoder2.BLKSIZE_s / 2 + 1;
      Encoder2.NORM_TYPE = 0;
      Encoder2.START_TYPE = 1;
      Encoder2.SHORT_TYPE = 2;
      Encoder2.STOP_TYPE = 3;
      Encoder2.MPG_MD_LR_LR = 0;
      Encoder2.MPG_MD_LR_I = 1;
      Encoder2.MPG_MD_MS_LR = 2;
      Encoder2.MPG_MD_MS_I = 3;
      Encoder2.fircoef = [
        -0.0207887 * 5,
        -0.0378413 * 5,
        -0.0432472 * 5,
        -0.031183 * 5,
        779609e-23 * 5,
        0.0467745 * 5,
        0.10091 * 5,
        0.151365 * 5,
        0.187098 * 5
      ];
      function Encoder2() {
        var MPG_MD_MS_LR = Encoder2.MPG_MD_MS_LR;
        var bs = null;
        this.psy = null;
        var psy = null;
        var vbr = null;
        this.setModules = function(_bs, _psy, _qupvt, _vbr) {
          bs = _bs;
          this.psy = _psy;
          psy = _psy;
          vbr = _vbr;
        };
        var newMDCT = new NewMDCT();
        function adjust_ATH(gfc) {
          var gr2_max, max_pow;
          if (gfc.ATH.useAdjust == 0) {
            gfc.ATH.adjust = 1;
            return;
          }
          max_pow = gfc.loudness_sq[0][0];
          gr2_max = gfc.loudness_sq[1][0];
          if (gfc.channels_out == 2) {
            abort();
          } else {
            max_pow += max_pow;
            gr2_max += gr2_max;
          }
          if (gfc.mode_gr == 2) {
            max_pow = Math.max(max_pow, gr2_max);
          }
          max_pow *= 0.5;
          max_pow *= gfc.ATH.aaSensitivityP;
          if (max_pow > 0.03125) {
            if (gfc.ATH.adjust >= 1) {
              gfc.ATH.adjust = 1;
            } else {
              if (gfc.ATH.adjust < gfc.ATH.adjustLimit) {
                gfc.ATH.adjust = gfc.ATH.adjustLimit;
              }
            }
            gfc.ATH.adjustLimit = 1;
          } else {
            var adj_lim_new = 31.98 * max_pow + 625e-6;
            if (gfc.ATH.adjust >= adj_lim_new) {
              gfc.ATH.adjust *= adj_lim_new * 0.075 + 0.925;
              if (gfc.ATH.adjust < adj_lim_new) {
                gfc.ATH.adjust = adj_lim_new;
              }
            } else {
              if (gfc.ATH.adjustLimit >= adj_lim_new) {
                gfc.ATH.adjust = adj_lim_new;
              } else {
                if (gfc.ATH.adjust < gfc.ATH.adjustLimit) {
                  gfc.ATH.adjust = gfc.ATH.adjustLimit;
                }
              }
            }
            gfc.ATH.adjustLimit = adj_lim_new;
          }
        }
        function updateStats(gfc) {
          var gr, ch;
          gfc.bitrate_stereoMode_Hist[gfc.bitrate_index][4]++;
          gfc.bitrate_stereoMode_Hist[15][4]++;
          if (gfc.channels_out == 2) {
            abort();
          }
          for (gr = 0; gr < gfc.mode_gr; ++gr) {
            for (ch = 0; ch < gfc.channels_out; ++ch) {
              var bt = gfc.l3_side.tt[gr][ch].block_type | 0;
              if (gfc.l3_side.tt[gr][ch].mixed_block_flag != 0)
                bt = 4;
              gfc.bitrate_blockType_Hist[gfc.bitrate_index][bt]++;
              gfc.bitrate_blockType_Hist[gfc.bitrate_index][5]++;
              gfc.bitrate_blockType_Hist[15][bt]++;
              gfc.bitrate_blockType_Hist[15][5]++;
            }
          }
        }
        function lame_encode_frame_init(gfp, inbuf) {
          var gfc = gfp.internal_flags;
          var ch, gr;
          if (gfc.lame_encode_frame_init == 0) {
            var i, j;
            var primebuff0 = new_float2(286 + 1152 + 576);
            var primebuff1 = new_float2(286 + 1152 + 576);
            gfc.lame_encode_frame_init = 1;
            for (i = 0, j = 0; i < 286 + 576 * (1 + gfc.mode_gr); ++i) {
              if (i < 576 * gfc.mode_gr) {
                primebuff0[i] = 0;
                if (gfc.channels_out == 2)
                  primebuff1[i] = 0;
              } else {
                primebuff0[i] = inbuf[0][j];
                if (gfc.channels_out == 2)
                  primebuff1[i] = inbuf[1][j];
                ++j;
              }
            }
            for (gr = 0; gr < gfc.mode_gr; gr++) {
              for (ch = 0; ch < gfc.channels_out; ch++) {
                gfc.l3_side.tt[gr][ch].block_type = Encoder2.SHORT_TYPE;
              }
            }
            newMDCT.mdct_sub48(gfc, primebuff0, primebuff1);
          }
        }
        this.lame_encode_mp3_frame = function(gfp, inbuf_l, inbuf_r, mp3buf, mp3bufPos, mp3buf_size) {
          var mp3count;
          var masking_LR = new_array_n2([2, 2]);
          masking_LR[0][0] = new III_psy_ratio();
          masking_LR[0][1] = new III_psy_ratio();
          masking_LR[1][0] = new III_psy_ratio();
          masking_LR[1][1] = new III_psy_ratio();
          var masking_MS = new_array_n2([2, 2]);
          masking_MS[0][0] = new III_psy_ratio();
          masking_MS[0][1] = new III_psy_ratio();
          masking_MS[1][0] = new III_psy_ratio();
          masking_MS[1][1] = new III_psy_ratio();
          var masking;
          var inbuf = [null, null];
          var gfc = gfp.internal_flags;
          var tot_ener = new_float_n2([2, 4]);
          var ms_ener_ratio = [0.5, 0.5];
          var pe = [[0, 0], [0, 0]];
          var pe_MS = [[0, 0], [0, 0]];
          var pe_use;
          var ch, gr;
          inbuf[0] = inbuf_l;
          inbuf[1] = inbuf_r;
          if (gfc.lame_encode_frame_init == 0) {
            lame_encode_frame_init(gfp, inbuf);
          }
          gfc.padding = 0;
          if ((gfc.slot_lag -= gfc.frac_SpF) < 0) {
            gfc.slot_lag += gfp.out_samplerate;
            gfc.padding = 1;
          }
          if (gfc.psymodel != 0) {
            var ret;
            var bufp = [null, null];
            var bufpPos = 0;
            var blocktype = new_int2(2);
            for (gr = 0; gr < gfc.mode_gr; gr++) {
              for (ch = 0; ch < gfc.channels_out; ch++) {
                bufp[ch] = inbuf[ch];
                bufpPos = 576 + gr * 576 - Encoder2.FFTOFFSET;
              }
              if (gfp.VBR == VbrMode2.vbr_mtrh || gfp.VBR == VbrMode2.vbr_mt) {
                abort();
              } else {
                ret = psy.L3psycho_anal_ns(
                  gfp,
                  bufp,
                  bufpPos,
                  gr,
                  masking_LR,
                  masking_MS,
                  pe[gr],
                  pe_MS[gr],
                  tot_ener[gr],
                  blocktype
                );
              }
              if (ret != 0)
                return -4;
              if (gfp.mode == MPEGMode2.JOINT_STEREO) {
                abort();
              }
              for (ch = 0; ch < gfc.channels_out; ch++) {
                var cod_info = gfc.l3_side.tt[gr][ch];
                cod_info.block_type = blocktype[ch];
                cod_info.mixed_block_flag = 0;
              }
            }
          } else {
            abort();
          }
          adjust_ATH(gfc);
          newMDCT.mdct_sub48(gfc, inbuf[0], inbuf[1]);
          gfc.mode_ext = Encoder2.MPG_MD_LR_LR;
          if (gfp.force_ms) {
            gfc.mode_ext = Encoder2.MPG_MD_MS_LR;
          } else if (gfp.mode == MPEGMode2.JOINT_STEREO) {
            abort();
          }
          if (gfc.mode_ext == MPG_MD_MS_LR) {
            masking = masking_MS;
            pe_use = pe_MS;
          } else {
            masking = masking_LR;
            pe_use = pe;
          }
          if (gfp.analysis && gfc.pinfo != null) {
            abort();
          }
          if (gfp.VBR == VbrMode2.vbr_off || gfp.VBR == VbrMode2.vbr_abr) {
            var i;
            var f2;
            for (i = 0; i < 18; i++)
              gfc.nsPsy.pefirbuf[i] = gfc.nsPsy.pefirbuf[i + 1];
            f2 = 0;
            for (gr = 0; gr < gfc.mode_gr; gr++)
              for (ch = 0; ch < gfc.channels_out; ch++)
                f2 += pe_use[gr][ch];
            gfc.nsPsy.pefirbuf[18] = f2;
            f2 = gfc.nsPsy.pefirbuf[9];
            for (i = 0; i < 9; i++)
              f2 += (gfc.nsPsy.pefirbuf[i] + gfc.nsPsy.pefirbuf[18 - i]) * Encoder2.fircoef[i];
            f2 = 670 * 5 * gfc.mode_gr * gfc.channels_out / f2;
            for (gr = 0; gr < gfc.mode_gr; gr++) {
              for (ch = 0; ch < gfc.channels_out; ch++) {
                pe_use[gr][ch] *= f2;
              }
            }
          }
          gfc.iteration_loop.iteration_loop(gfp, pe_use, ms_ener_ratio, masking);
          bs.format_bitstream(gfp);
          mp3count = bs.copy_buffer(gfc, mp3buf, mp3bufPos, mp3buf_size, 1);
          if (gfp.bWriteVbrTag)
            vbr.addVbrFrame(gfp);
          if (gfp.analysis && gfc.pinfo != null) {
            abort();
          }
          updateStats(gfc);
          return mp3count;
        };
      }
      function VBRSeekInfo2() {
        this.sum = 0;
        this.seen = 0;
        this.want = 0;
        this.pos = 0;
        this.size = 0;
        this.bag = null;
        this.nVbrNumFrames = 0;
        this.nBytesWritten = 0;
        this.TotalFrameSize = 0;
      }
      function IIISideInfo2() {
        this.tt = [[null, null], [null, null]];
        this.main_data_begin = 0;
        this.private_bits = 0;
        this.resvDrain_pre = 0;
        this.resvDrain_post = 0;
        this.scfsi = [new_int2(4), new_int2(4)];
        for (var gr = 0; gr < 2; gr++) {
          for (var ch = 0; ch < 2; ch++) {
            this.tt[gr][ch] = new GrInfo2();
          }
        }
      }
      function III_psy_xmin2() {
        this.l = new_float2(Encoder2.SBMAX_l);
        this.s = new_float_n2([Encoder2.SBMAX_s, 3]);
        var self2 = this;
        this.assign = function(iii_psy_xmin) {
          System2.arraycopy(iii_psy_xmin.l, 0, self2.l, 0, Encoder2.SBMAX_l);
          for (var i = 0; i < Encoder2.SBMAX_s; i++) {
            for (var j = 0; j < 3; j++) {
              self2.s[i][j] = iii_psy_xmin.s[i][j];
            }
          }
        };
      }
      function NsPsy2() {
        this.last_en_subshort = new_float_n2([4, 9]);
        this.lastAttacks = new_int2(4);
        this.pefirbuf = new_float2(19);
        this.longfact = new_float2(Encoder2.SBMAX_l);
        this.shortfact = new_float2(Encoder2.SBMAX_s);
        this.attackthre = 0;
        this.attackthre_s = 0;
      }
      LameInternalFlags2.MFSIZE = 3 * 1152 + Encoder2.ENCDELAY - Encoder2.MDCTDELAY;
      LameInternalFlags2.MAX_HEADER_BUF = 256;
      LameInternalFlags2.MAX_BITS_PER_CHANNEL = 4095;
      LameInternalFlags2.MAX_BITS_PER_GRANULE = 7680;
      LameInternalFlags2.BPC = 320;
      function LameInternalFlags2() {
        var MAX_HEADER_LEN = 40;
        this.Class_ID = 0;
        this.lame_encode_frame_init = 0;
        this.iteration_init_init = 0;
        this.fill_buffer_resample_init = 0;
        this.mfbuf = new_float_n2([2, LameInternalFlags2.MFSIZE]);
        this.mode_gr = 0;
        this.channels_in = 0;
        this.channels_out = 0;
        this.resample_ratio = 0;
        this.mf_samples_to_encode = 0;
        this.mf_size = 0;
        this.VBR_min_bitrate = 0;
        this.VBR_max_bitrate = 0;
        this.bitrate_index = 0;
        this.samplerate_index = 0;
        this.mode_ext = 0;
        this.lowpass1 = 0;
        this.lowpass2 = 0;
        this.highpass1 = 0;
        this.highpass2 = 0;
        this.noise_shaping = 0;
        this.noise_shaping_amp = 0;
        this.substep_shaping = 0;
        this.psymodel = 0;
        this.noise_shaping_stop = 0;
        this.subblock_gain = 0;
        this.use_best_huffman = 0;
        this.full_outer_loop = 0;
        this.l3_side = new IIISideInfo2();
        this.ms_ratio = new_float2(2);
        this.padding = 0;
        this.frac_SpF = 0;
        this.slot_lag = 0;
        this.tag_spec = null;
        this.nMusicCRC = 0;
        this.OldValue = new_int2(2);
        this.CurrentStep = new_int2(2);
        this.masking_lower = 0;
        this.bv_scf = new_int2(576);
        this.pseudohalf = new_int2(L3Side2.SFBMAX);
        this.sfb21_extra = false;
        this.inbuf_old = new Array(2);
        this.blackfilt = new Array(2 * LameInternalFlags2.BPC + 1);
        this.itime = new_double2(2);
        this.sideinfo_len = 0;
        this.sb_sample = new_float_n2([2, 2, 18, Encoder2.SBLIMIT]);
        this.amp_filter = new_float2(32);
        function Header() {
          this.write_timing = 0;
          this.ptr = 0;
          this.buf = new_byte2(MAX_HEADER_LEN);
        }
        this.header = new Array(LameInternalFlags2.MAX_HEADER_BUF);
        this.h_ptr = 0;
        this.w_ptr = 0;
        this.ancillary_flag = 0;
        this.ResvSize = 0;
        this.ResvMax = 0;
        this.scalefac_band = new ScaleFac2();
        this.minval_l = new_float2(Encoder2.CBANDS);
        this.minval_s = new_float2(Encoder2.CBANDS);
        this.nb_1 = new_float_n2([4, Encoder2.CBANDS]);
        this.nb_2 = new_float_n2([4, Encoder2.CBANDS]);
        this.nb_s1 = new_float_n2([4, Encoder2.CBANDS]);
        this.nb_s2 = new_float_n2([4, Encoder2.CBANDS]);
        this.s3_ss = null;
        this.s3_ll = null;
        this.decay = 0;
        this.thm = new Array(4);
        this.en = new Array(4);
        this.tot_ener = new_float2(4);
        this.loudness_sq = new_float_n2([2, 2]);
        this.loudness_sq_save = new_float2(2);
        this.mld_l = new_float2(Encoder2.SBMAX_l);
        this.mld_s = new_float2(Encoder2.SBMAX_s);
        this.bm_l = new_int2(Encoder2.SBMAX_l);
        this.bo_l = new_int2(Encoder2.SBMAX_l);
        this.bm_s = new_int2(Encoder2.SBMAX_s);
        this.bo_s = new_int2(Encoder2.SBMAX_s);
        this.npart_l = 0;
        this.npart_s = 0;
        this.s3ind = new_int_n2([Encoder2.CBANDS, 2]);
        this.s3ind_s = new_int_n2([Encoder2.CBANDS, 2]);
        this.numlines_s = new_int2(Encoder2.CBANDS);
        this.numlines_l = new_int2(Encoder2.CBANDS);
        this.rnumlines_l = new_float2(Encoder2.CBANDS);
        this.mld_cb_l = new_float2(Encoder2.CBANDS);
        this.mld_cb_s = new_float2(Encoder2.CBANDS);
        this.numlines_s_num1 = 0;
        this.numlines_l_num1 = 0;
        this.pe = new_float2(4);
        this.ms_ratio_s_old = 0;
        this.ms_ratio_l_old = 0;
        this.ms_ener_ratio_old = 0;
        this.blocktype_old = new_int2(2);
        this.nsPsy = new NsPsy2();
        this.VBR_seek_table = new VBRSeekInfo2();
        this.ATH = null;
        this.PSY = null;
        this.nogap_total = 0;
        this.nogap_current = 0;
        this.decode_on_the_fly = true;
        this.findReplayGain = true;
        this.findPeakSample = true;
        this.PeakSample = 0;
        this.RadioGain = 0;
        this.AudiophileGain = 0;
        this.rgdata = null;
        this.noclipGainChange = 0;
        this.noclipScale = 0;
        this.bitrate_stereoMode_Hist = new_int_n2([16, 4 + 1]);
        this.bitrate_blockType_Hist = new_int_n2([16, 4 + 1 + 1]);
        this.pinfo = null;
        this.hip = null;
        this.in_buffer_nsamples = 0;
        this.in_buffer_0 = null;
        this.in_buffer_1 = null;
        this.iteration_loop = null;
        for (var i = 0; i < this.en.length; i++) {
          this.en[i] = new III_psy_xmin2();
        }
        for (var i = 0; i < this.thm.length; i++) {
          this.thm[i] = new III_psy_xmin2();
        }
        for (var i = 0; i < this.header.length; i++) {
          this.header[i] = new Header();
        }
      }
      function FFT2() {
        var window2 = new_float2(Encoder2.BLKSIZE);
        var window_s = new_float2(Encoder2.BLKSIZE_s / 2);
        var costab = [
          0.9238795325112867,
          0.3826834323650898,
          0.9951847266721969,
          0.0980171403295606,
          0.9996988186962042,
          0.02454122852291229,
          0.9999811752826011,
          0.006135884649154475
        ];
        function fht(fz, fzPos, n2) {
          var tri = 0;
          var k4;
          var fi;
          var gi;
          n2 <<= 1;
          var fn = fzPos + n2;
          k4 = 4;
          do {
            var s1, c1;
            var i, k1, k2, k3, kx;
            kx = k4 >> 1;
            k1 = k4;
            k2 = k4 << 1;
            k3 = k2 + k1;
            k4 = k2 << 1;
            fi = fzPos;
            gi = fi + kx;
            do {
              var f0, f1, f2, f3;
              f1 = fz[fi + 0] - fz[fi + k1];
              f0 = fz[fi + 0] + fz[fi + k1];
              f3 = fz[fi + k2] - fz[fi + k3];
              f2 = fz[fi + k2] + fz[fi + k3];
              fz[fi + k2] = f0 - f2;
              fz[fi + 0] = f0 + f2;
              fz[fi + k3] = f1 - f3;
              fz[fi + k1] = f1 + f3;
              f1 = fz[gi + 0] - fz[gi + k1];
              f0 = fz[gi + 0] + fz[gi + k1];
              f3 = Util2.SQRT2 * fz[gi + k3];
              f2 = Util2.SQRT2 * fz[gi + k2];
              fz[gi + k2] = f0 - f2;
              fz[gi + 0] = f0 + f2;
              fz[gi + k3] = f1 - f3;
              fz[gi + k1] = f1 + f3;
              gi += k4;
              fi += k4;
            } while (fi < fn);
            c1 = costab[tri + 0];
            s1 = costab[tri + 1];
            for (i = 1; i < kx; i++) {
              var c2, s2;
              c2 = 1 - 2 * s1 * s1;
              s2 = 2 * s1 * c1;
              fi = fzPos + i;
              gi = fzPos + k1 - i;
              do {
                var a, b, g0, f0, f1, g1, f2, g2, f3, g3;
                b = s2 * fz[fi + k1] - c2 * fz[gi + k1];
                a = c2 * fz[fi + k1] + s2 * fz[gi + k1];
                f1 = fz[fi + 0] - a;
                f0 = fz[fi + 0] + a;
                g1 = fz[gi + 0] - b;
                g0 = fz[gi + 0] + b;
                b = s2 * fz[fi + k3] - c2 * fz[gi + k3];
                a = c2 * fz[fi + k3] + s2 * fz[gi + k3];
                f3 = fz[fi + k2] - a;
                f2 = fz[fi + k2] + a;
                g3 = fz[gi + k2] - b;
                g2 = fz[gi + k2] + b;
                b = s1 * f2 - c1 * g3;
                a = c1 * f2 + s1 * g3;
                fz[fi + k2] = f0 - a;
                fz[fi + 0] = f0 + a;
                fz[gi + k3] = g1 - b;
                fz[gi + k1] = g1 + b;
                b = c1 * g2 - s1 * f3;
                a = s1 * g2 + c1 * f3;
                fz[gi + k2] = g0 - a;
                fz[gi + 0] = g0 + a;
                fz[fi + k3] = f1 - b;
                fz[fi + k1] = f1 + b;
                gi += k4;
                fi += k4;
              } while (fi < fn);
              c2 = c1;
              c1 = c2 * costab[tri + 0] - s1 * costab[tri + 1];
              s1 = c2 * costab[tri + 1] + s1 * costab[tri + 0];
            }
            tri += 2;
          } while (k4 < n2);
        }
        var rv_tbl = [
          0,
          128,
          64,
          192,
          32,
          160,
          96,
          224,
          16,
          144,
          80,
          208,
          48,
          176,
          112,
          240,
          8,
          136,
          72,
          200,
          40,
          168,
          104,
          232,
          24,
          152,
          88,
          216,
          56,
          184,
          120,
          248,
          4,
          132,
          68,
          196,
          36,
          164,
          100,
          228,
          20,
          148,
          84,
          212,
          52,
          180,
          116,
          244,
          12,
          140,
          76,
          204,
          44,
          172,
          108,
          236,
          28,
          156,
          92,
          220,
          60,
          188,
          124,
          252,
          2,
          130,
          66,
          194,
          34,
          162,
          98,
          226,
          18,
          146,
          82,
          210,
          50,
          178,
          114,
          242,
          10,
          138,
          74,
          202,
          42,
          170,
          106,
          234,
          26,
          154,
          90,
          218,
          58,
          186,
          122,
          250,
          6,
          134,
          70,
          198,
          38,
          166,
          102,
          230,
          22,
          150,
          86,
          214,
          54,
          182,
          118,
          246,
          14,
          142,
          78,
          206,
          46,
          174,
          110,
          238,
          30,
          158,
          94,
          222,
          62,
          190,
          126,
          254
        ];
        this.fft_short = function(gfc, x_real, chn, buffer, bufPos) {
          for (var b = 0; b < 3; b++) {
            var x = Encoder2.BLKSIZE_s / 2;
            var k2 = 65535 & 576 / 3 * (b + 1);
            var j = Encoder2.BLKSIZE_s / 8 - 1;
            do {
              var f0, f1, f2, f3, w;
              var i = rv_tbl[j << 2] & 255;
              f0 = window_s[i] * buffer[chn][bufPos + i + k2];
              w = window_s[127 - i] * buffer[chn][bufPos + i + k2 + 128];
              f1 = f0 - w;
              f0 = f0 + w;
              f2 = window_s[i + 64] * buffer[chn][bufPos + i + k2 + 64];
              w = window_s[63 - i] * buffer[chn][bufPos + i + k2 + 192];
              f3 = f2 - w;
              f2 = f2 + w;
              x -= 4;
              x_real[b][x + 0] = f0 + f2;
              x_real[b][x + 2] = f0 - f2;
              x_real[b][x + 1] = f1 + f3;
              x_real[b][x + 3] = f1 - f3;
              f0 = window_s[i + 1] * buffer[chn][bufPos + i + k2 + 1];
              w = window_s[126 - i] * buffer[chn][bufPos + i + k2 + 129];
              f1 = f0 - w;
              f0 = f0 + w;
              f2 = window_s[i + 65] * buffer[chn][bufPos + i + k2 + 65];
              w = window_s[62 - i] * buffer[chn][bufPos + i + k2 + 193];
              f3 = f2 - w;
              f2 = f2 + w;
              x_real[b][x + Encoder2.BLKSIZE_s / 2 + 0] = f0 + f2;
              x_real[b][x + Encoder2.BLKSIZE_s / 2 + 2] = f0 - f2;
              x_real[b][x + Encoder2.BLKSIZE_s / 2 + 1] = f1 + f3;
              x_real[b][x + Encoder2.BLKSIZE_s / 2 + 3] = f1 - f3;
            } while (--j >= 0);
            fht(x_real[b], x, Encoder2.BLKSIZE_s / 2);
          }
        };
        this.fft_long = function(gfc, y, chn, buffer, bufPos) {
          var jj = Encoder2.BLKSIZE / 8 - 1;
          var x = Encoder2.BLKSIZE / 2;
          do {
            var f0, f1, f2, f3, w;
            var i = rv_tbl[jj] & 255;
            f0 = window2[i] * buffer[chn][bufPos + i];
            w = window2[i + 512] * buffer[chn][bufPos + i + 512];
            f1 = f0 - w;
            f0 = f0 + w;
            f2 = window2[i + 256] * buffer[chn][bufPos + i + 256];
            w = window2[i + 768] * buffer[chn][bufPos + i + 768];
            f3 = f2 - w;
            f2 = f2 + w;
            x -= 4;
            y[x + 0] = f0 + f2;
            y[x + 2] = f0 - f2;
            y[x + 1] = f1 + f3;
            y[x + 3] = f1 - f3;
            f0 = window2[i + 1] * buffer[chn][bufPos + i + 1];
            w = window2[i + 513] * buffer[chn][bufPos + i + 513];
            f1 = f0 - w;
            f0 = f0 + w;
            f2 = window2[i + 257] * buffer[chn][bufPos + i + 257];
            w = window2[i + 769] * buffer[chn][bufPos + i + 769];
            f3 = f2 - w;
            f2 = f2 + w;
            y[x + Encoder2.BLKSIZE / 2 + 0] = f0 + f2;
            y[x + Encoder2.BLKSIZE / 2 + 2] = f0 - f2;
            y[x + Encoder2.BLKSIZE / 2 + 1] = f1 + f3;
            y[x + Encoder2.BLKSIZE / 2 + 3] = f1 - f3;
          } while (--jj >= 0);
          fht(y, x, Encoder2.BLKSIZE / 2);
        };
        this.init_fft = function(gfc) {
          for (var i = 0; i < Encoder2.BLKSIZE; i++)
            window2[i] = 0.42 - 0.5 * Math.cos(2 * Math.PI * (i + 0.5) / Encoder2.BLKSIZE) + 0.08 * Math.cos(4 * Math.PI * (i + 0.5) / Encoder2.BLKSIZE);
          for (var i = 0; i < Encoder2.BLKSIZE_s / 2; i++)
            window_s[i] = 0.5 * (1 - Math.cos(2 * Math.PI * (i + 0.5) / Encoder2.BLKSIZE_s));
        };
      }
      function PsyModel2() {
        var fft = new FFT2();
        var LOG10 = 2.302585092994046;
        var rpelev = 2;
        var rpelev2 = 16;
        var rpelev_s = 2;
        var rpelev2_s = 16;
        var DELBARK = 0.34;
        var VO_SCALE = 1 / (14752 * 14752) / (Encoder2.BLKSIZE / 2);
        var temporalmask_sustain_sec = 0.01;
        var NS_PREECHO_ATT0 = 0.8;
        var NS_PREECHO_ATT1 = 0.6;
        var NS_PREECHO_ATT2 = 0.3;
        var NS_MSFIX = 3.5;
        var NSFIRLEN = 21;
        var LN_TO_LOG10 = 0.2302585093;
        function psycho_loudness_approx(energy, gfc) {
          var loudness_power = 0;
          for (var i = 0; i < Encoder2.BLKSIZE / 2; ++i)
            loudness_power += energy[i] * gfc.ATH.eql_w[i];
          loudness_power *= VO_SCALE;
          return loudness_power;
        }
        function compute_ffts(gfp, fftenergy, fftenergy_s, wsamp_l, wsamp_lPos, wsamp_s, wsamp_sPos, gr_out, chn, buffer, bufPos) {
          var gfc = gfp.internal_flags;
          if (chn < 2) {
            fft.fft_long(gfc, wsamp_l[wsamp_lPos], chn, buffer, bufPos);
            fft.fft_short(gfc, wsamp_s[wsamp_sPos], chn, buffer, bufPos);
          } else if (chn == 2) {
            abort();
          }
          fftenergy[0] = /*fix NON_LINEAR_SCALE_ENERGY*/
          wsamp_l[wsamp_lPos + 0][0];
          fftenergy[0] *= fftenergy[0];
          for (var j = Encoder2.BLKSIZE / 2 - 1; j >= 0; --j) {
            var re = wsamp_l[wsamp_lPos + 0][Encoder2.BLKSIZE / 2 - j];
            var im = wsamp_l[wsamp_lPos + 0][Encoder2.BLKSIZE / 2 + j];
            fftenergy[Encoder2.BLKSIZE / 2 - j] = /*fix NON_LINEAR_SCALE_ENERGY*/
            (re * re + im * im) * 0.5;
          }
          for (var b = 2; b >= 0; --b) {
            fftenergy_s[b][0] = wsamp_s[wsamp_sPos + 0][b][0];
            fftenergy_s[b][0] *= fftenergy_s[b][0];
            for (var j = Encoder2.BLKSIZE_s / 2 - 1; j >= 0; --j) {
              var re = wsamp_s[wsamp_sPos + 0][b][Encoder2.BLKSIZE_s / 2 - j];
              var im = wsamp_s[wsamp_sPos + 0][b][Encoder2.BLKSIZE_s / 2 + j];
              fftenergy_s[b][Encoder2.BLKSIZE_s / 2 - j] = /*fix NON_LINEAR_SCALE_ENERGY*/
              (re * re + im * im) * 0.5;
            }
          }
          {
            var totalenergy = 0;
            for (var j = 11; j < Encoder2.HBLKSIZE; j++)
              totalenergy += fftenergy[j];
            gfc.tot_ener[chn] = totalenergy;
          }
          if (gfp.analysis) {
            abort();
          }
          if (gfp.athaa_loudapprox == 2 && chn < 2) {
            gfc.loudness_sq[gr_out][chn] = gfc.loudness_sq_save[chn];
            gfc.loudness_sq_save[chn] = psycho_loudness_approx(fftenergy, gfc);
          }
        }
        var I1LIMIT = 8;
        var I2LIMIT = 23;
        var MLIMIT = 15;
        var ma_max_i1;
        var ma_max_i2;
        var ma_max_m;
        var tab = [
          1,
          0.79433,
          0.63096,
          0.63096,
          0.63096,
          0.63096,
          0.63096,
          0.25119,
          0.11749
        ];
        function init_mask_add_max_values() {
          ma_max_i1 = Math.pow(10, (I1LIMIT + 1) / 16);
          ma_max_i2 = Math.pow(10, (I2LIMIT + 1) / 16);
          ma_max_m = Math.pow(10, MLIMIT / 10);
        }
        var table1 = [
          3.3246 * 3.3246,
          3.23837 * 3.23837,
          3.15437 * 3.15437,
          3.00412 * 3.00412,
          2.86103 * 2.86103,
          2.65407 * 2.65407,
          2.46209 * 2.46209,
          2.284 * 2.284,
          2.11879 * 2.11879,
          1.96552 * 1.96552,
          1.82335 * 1.82335,
          1.69146 * 1.69146,
          1.56911 * 1.56911,
          1.46658 * 1.46658,
          1.37074 * 1.37074,
          1.31036 * 1.31036,
          1.25264 * 1.25264,
          1.20648 * 1.20648,
          1.16203 * 1.16203,
          1.12765 * 1.12765,
          1.09428 * 1.09428,
          1.0659 * 1.0659,
          1.03826 * 1.03826,
          1.01895 * 1.01895,
          1
        ];
        var table2 = [
          1.33352 * 1.33352,
          1.35879 * 1.35879,
          1.38454 * 1.38454,
          1.39497 * 1.39497,
          1.40548 * 1.40548,
          1.3537 * 1.3537,
          1.30382 * 1.30382,
          1.22321 * 1.22321,
          1.14758 * 1.14758,
          1
        ];
        var table3 = [
          2.35364 * 2.35364,
          2.29259 * 2.29259,
          2.23313 * 2.23313,
          2.12675 * 2.12675,
          2.02545 * 2.02545,
          1.87894 * 1.87894,
          1.74303 * 1.74303,
          1.61695 * 1.61695,
          1.49999 * 1.49999,
          1.39148 * 1.39148,
          1.29083 * 1.29083,
          1.19746 * 1.19746,
          1.11084 * 1.11084,
          1.03826 * 1.03826
        ];
        function mask_add(m1, m2, kk, b, gfc, shortblock) {
          var ratio;
          if (m2 > m1) {
            if (m2 < m1 * ma_max_i2)
              ratio = m2 / m1;
            else
              return m1 + m2;
          } else {
            if (m1 >= m2 * ma_max_i2)
              return m1 + m2;
            ratio = m1 / m2;
          }
          m1 += m2;
          if (b + 3 <= 3 + 3) {
            if (ratio >= ma_max_i1) {
              return m1;
            }
            var i = 0 | Util2.FAST_LOG10_X(ratio, 16);
            return m1 * table2[i];
          }
          var i = 0 | Util2.FAST_LOG10_X(ratio, 16);
          {
            m2 = gfc.ATH.cb_l[kk] * gfc.ATH.adjust;
          }
          if (m1 < ma_max_m * m2) {
            if (m1 > m2) {
              var f2, r;
              f2 = 1;
              if (i <= 13)
                f2 = table3[i];
              r = Util2.FAST_LOG10_X(m1 / m2, 10 / 15);
              return m1 * ((table1[i] - f2) * r + f2);
            }
            if (i > 13)
              return m1;
            return m1 * table3[i];
          }
          return m1 * table1[i];
        }
        function convert_partition2scalefac_s(gfc, eb, thr, chn, sblock) {
          var sb, b;
          var enn = 0;
          var thmm = 0;
          for (sb = b = 0; sb < Encoder2.SBMAX_s; ++b, ++sb) {
            var bo_s_sb = gfc.bo_s[sb];
            var npart_s = gfc.npart_s;
            var b_lim = bo_s_sb < npart_s ? bo_s_sb : npart_s;
            while (b < b_lim) {
              enn += eb[b];
              thmm += thr[b];
              b++;
            }
            gfc.en[chn].s[sb][sblock] = enn;
            gfc.thm[chn].s[sb][sblock] = thmm;
            if (b >= npart_s) {
              ++sb;
              break;
            }
            {
              var w_curr = gfc.PSY.bo_s_weight[sb];
              var w_next = 1 - w_curr;
              enn = w_curr * eb[b];
              thmm = w_curr * thr[b];
              gfc.en[chn].s[sb][sblock] += enn;
              gfc.thm[chn].s[sb][sblock] += thmm;
              enn = w_next * eb[b];
              thmm = w_next * thr[b];
            }
          }
          for (; sb < Encoder2.SBMAX_s; ++sb) {
            gfc.en[chn].s[sb][sblock] = 0;
            gfc.thm[chn].s[sb][sblock] = 0;
          }
        }
        function convert_partition2scalefac_l(gfc, eb, thr, chn) {
          var sb, b;
          var enn = 0;
          var thmm = 0;
          for (sb = b = 0; sb < Encoder2.SBMAX_l; ++b, ++sb) {
            var bo_l_sb = gfc.bo_l[sb];
            var npart_l = gfc.npart_l;
            var b_lim = bo_l_sb < npart_l ? bo_l_sb : npart_l;
            while (b < b_lim) {
              enn += eb[b];
              thmm += thr[b];
              b++;
            }
            gfc.en[chn].l[sb] = enn;
            gfc.thm[chn].l[sb] = thmm;
            if (b >= npart_l) {
              ++sb;
              break;
            }
            {
              var w_curr = gfc.PSY.bo_l_weight[sb];
              var w_next = 1 - w_curr;
              enn = w_curr * eb[b];
              thmm = w_curr * thr[b];
              gfc.en[chn].l[sb] += enn;
              gfc.thm[chn].l[sb] += thmm;
              enn = w_next * eb[b];
              thmm = w_next * thr[b];
            }
          }
          for (; sb < Encoder2.SBMAX_l; ++sb) {
            gfc.en[chn].l[sb] = 0;
            gfc.thm[chn].l[sb] = 0;
          }
        }
        function compute_masking_s(gfp, fftenergy_s, eb, thr, chn, sblock) {
          var gfc = gfp.internal_flags;
          var j, b;
          for (b = j = 0; b < gfc.npart_s; ++b) {
            var ebb = 0;
            var n2 = gfc.numlines_s[b];
            for (var i = 0; i < n2; ++i, ++j) {
              var el = fftenergy_s[sblock][j];
              ebb += el;
            }
            eb[b] = ebb;
          }
          for (j = b = 0; b < gfc.npart_s; b++) {
            var kk = gfc.s3ind_s[b][0];
            var ecb = gfc.s3_ss[j++] * eb[kk];
            ++kk;
            while (kk <= gfc.s3ind_s[b][1]) {
              ecb += gfc.s3_ss[j] * eb[kk];
              ++j;
              ++kk;
            }
            {
              var x = rpelev_s * gfc.nb_s1[chn][b];
              thr[b] = Math.min(ecb, x);
            }
            if (gfc.blocktype_old[chn & 1] == Encoder2.SHORT_TYPE) {
              var x = rpelev2_s * gfc.nb_s2[chn][b];
              var y = thr[b];
              thr[b] = Math.min(x, y);
            }
            gfc.nb_s2[chn][b] = gfc.nb_s1[chn][b];
            gfc.nb_s1[chn][b] = ecb;
          }
          for (; b <= Encoder2.CBANDS; ++b) {
            eb[b] = 0;
            thr[b] = 0;
          }
        }
        function block_type_set(gfp, uselongblock, blocktype_d, blocktype) {
          var gfc = gfp.internal_flags;
          if (gfp.short_blocks == ShortBlock2.short_block_coupled && !(uselongblock[0] != 0 && uselongblock[1] != 0))
            uselongblock[0] = uselongblock[1] = 0;
          for (var chn = 0; chn < gfc.channels_out; chn++) {
            blocktype[chn] = Encoder2.NORM_TYPE;
            if (gfp.short_blocks == ShortBlock2.short_block_dispensed)
              uselongblock[chn] = 1;
            if (gfp.short_blocks == ShortBlock2.short_block_forced)
              uselongblock[chn] = 0;
            if (uselongblock[chn] != 0) {
              if (gfc.blocktype_old[chn] == Encoder2.SHORT_TYPE)
                blocktype[chn] = Encoder2.STOP_TYPE;
            } else {
              blocktype[chn] = Encoder2.SHORT_TYPE;
              if (gfc.blocktype_old[chn] == Encoder2.NORM_TYPE) {
                gfc.blocktype_old[chn] = Encoder2.START_TYPE;
              }
              if (gfc.blocktype_old[chn] == Encoder2.STOP_TYPE)
                gfc.blocktype_old[chn] = Encoder2.SHORT_TYPE;
            }
            blocktype_d[chn] = gfc.blocktype_old[chn];
            gfc.blocktype_old[chn] = blocktype[chn];
          }
        }
        function NS_INTERP(x, y, r) {
          if (r >= 1) {
            return x;
          }
          if (r <= 0)
            return y;
          if (y > 0) {
            return Math.pow(x / y, r) * y;
          }
          return 0;
        }
        var regcoef_s = [
          11.8,
          13.6,
          17.2,
          32,
          46.5,
          51.3,
          57.5,
          67.1,
          71.5,
          84.6,
          97.6,
          130
          /* 255.8 */
        ];
        function pecalc_s(mr, masking_lower) {
          var pe_s = 1236.28 / 4;
          for (var sb = 0; sb < Encoder2.SBMAX_s - 1; sb++) {
            for (var sblock = 0; sblock < 3; sblock++) {
              var thm = mr.thm.s[sb][sblock];
              if (thm > 0) {
                var x = thm * masking_lower;
                var en = mr.en.s[sb][sblock];
                if (en > x) {
                  if (en > x * 1e10) {
                    pe_s += regcoef_s[sb] * (10 * LOG10);
                  } else {
                    pe_s += regcoef_s[sb] * Util2.FAST_LOG10(en / x);
                  }
                }
              }
            }
          }
          return pe_s;
        }
        var regcoef_l = [
          6.8,
          5.8,
          5.8,
          6.4,
          6.5,
          9.9,
          12.1,
          14.4,
          15,
          18.9,
          21.6,
          26.9,
          34.2,
          40.2,
          46.8,
          56.5,
          60.7,
          73.9,
          85.7,
          93.4,
          126.1
          /* 241.3 */
        ];
        function pecalc_l(mr, masking_lower) {
          var pe_l = 1124.23 / 4;
          for (var sb = 0; sb < Encoder2.SBMAX_l - 1; sb++) {
            var thm = mr.thm.l[sb];
            if (thm > 0) {
              var x = thm * masking_lower;
              var en = mr.en.l[sb];
              if (en > x) {
                if (en > x * 1e10) {
                  pe_l += regcoef_l[sb] * (10 * LOG10);
                } else {
                  pe_l += regcoef_l[sb] * Util2.FAST_LOG10(en / x);
                }
              }
            }
          }
          return pe_l;
        }
        function calc_energy(gfc, fftenergy, eb, max, avg) {
          var b, j;
          for (b = j = 0; b < gfc.npart_l; ++b) {
            var ebb = 0, m2 = 0;
            var i;
            for (i = 0; i < gfc.numlines_l[b]; ++i, ++j) {
              var el = fftenergy[j];
              ebb += el;
              if (m2 < el)
                m2 = el;
            }
            eb[b] = ebb;
            max[b] = m2;
            avg[b] = ebb * gfc.rnumlines_l[b];
          }
        }
        function calc_mask_index_l(gfc, max, avg, mask_idx) {
          var last_tab_entry = tab.length - 1;
          var b = 0;
          var a = avg[b] + avg[b + 1];
          if (a > 0) {
            var m2 = max[b];
            if (m2 < max[b + 1])
              m2 = max[b + 1];
            a = 20 * (m2 * 2 - a) / (a * (gfc.numlines_l[b] + gfc.numlines_l[b + 1] - 1));
            var k2 = 0 | a;
            if (k2 > last_tab_entry)
              k2 = last_tab_entry;
            mask_idx[b] = k2;
          } else {
            mask_idx[b] = 0;
          }
          for (b = 1; b < gfc.npart_l - 1; b++) {
            a = avg[b - 1] + avg[b] + avg[b + 1];
            if (a > 0) {
              var m2 = max[b - 1];
              if (m2 < max[b])
                m2 = max[b];
              if (m2 < max[b + 1])
                m2 = max[b + 1];
              a = 20 * (m2 * 3 - a) / (a * (gfc.numlines_l[b - 1] + gfc.numlines_l[b] + gfc.numlines_l[b + 1] - 1));
              var k2 = 0 | a;
              if (k2 > last_tab_entry)
                k2 = last_tab_entry;
              mask_idx[b] = k2;
            } else {
              mask_idx[b] = 0;
            }
          }
          a = avg[b - 1] + avg[b];
          if (a > 0) {
            var m2 = max[b - 1];
            if (m2 < max[b])
              m2 = max[b];
            a = 20 * (m2 * 2 - a) / (a * (gfc.numlines_l[b - 1] + gfc.numlines_l[b] - 1));
            var k2 = 0 | a;
            if (k2 > last_tab_entry)
              k2 = last_tab_entry;
            mask_idx[b] = k2;
          } else {
            mask_idx[b] = 0;
          }
        }
        var fircoef = [
          -865163e-23 * 2,
          -851586e-8 * 2,
          -674764e-23 * 2,
          0.0209036 * 2,
          -336639e-22 * 2,
          -0.0438162 * 2,
          -154175e-22 * 2,
          0.0931738 * 2,
          -552212e-22 * 2,
          -0.313819 * 2
        ];
        this.L3psycho_anal_ns = function(gfp, buffer, bufPos, gr_out, masking_ratio, masking_MS_ratio, percep_entropy, percep_MS_entropy, energy, blocktype_d) {
          var gfc = gfp.internal_flags;
          var wsamp_L = new_float_n2([2, Encoder2.BLKSIZE]);
          var wsamp_S = new_float_n2([2, 3, Encoder2.BLKSIZE_s]);
          var eb_l = new_float2(Encoder2.CBANDS + 1);
          var eb_s = new_float2(Encoder2.CBANDS + 1);
          var thr = new_float2(Encoder2.CBANDS + 2);
          var blocktype = new_int2(2), uselongblock = new_int2(2);
          var numchn, chn;
          var b, i, j, k2;
          var sb, sblock;
          var ns_hpfsmpl = new_float_n2([2, 576]);
          var pcfact;
          var mask_idx_l = new_int2(Encoder2.CBANDS + 2), mask_idx_s = new_int2(Encoder2.CBANDS + 2);
          Arrays2.fill(mask_idx_s, 0);
          numchn = gfc.channels_out;
          if (gfp.mode == MPEGMode2.JOINT_STEREO)
            numchn = 4;
          if (gfp.VBR == VbrMode2.vbr_off)
            pcfact = gfc.ResvMax == 0 ? 0 : gfc.ResvSize / gfc.ResvMax * 0.5;
          else if (gfp.VBR == VbrMode2.vbr_rh || gfp.VBR == VbrMode2.vbr_mtrh || gfp.VBR == VbrMode2.vbr_mt) {
            pcfact = 0.6;
          } else
            pcfact = 1;
          for (chn = 0; chn < gfc.channels_out; chn++) {
            var firbuf2 = buffer[chn];
            var firbufPos = bufPos + 576 - 350 - NSFIRLEN + 192;
            for (i = 0; i < 576; i++) {
              var sum1, sum2;
              sum1 = firbuf2[firbufPos + i + 10];
              sum2 = 0;
              for (j = 0; j < (NSFIRLEN - 1) / 2 - 1; j += 2) {
                sum1 += fircoef[j] * (firbuf2[firbufPos + i + j] + firbuf2[firbufPos + i + NSFIRLEN - j]);
                sum2 += fircoef[j + 1] * (firbuf2[firbufPos + i + j + 1] + firbuf2[firbufPos + i + NSFIRLEN - j - 1]);
              }
              ns_hpfsmpl[chn][i] = sum1 + sum2;
            }
            masking_ratio[gr_out][chn].en.assign(gfc.en[chn]);
            masking_ratio[gr_out][chn].thm.assign(gfc.thm[chn]);
            if (numchn > 2) {
              abort();
            }
          }
          for (chn = 0; chn < numchn; chn++) {
            var wsamp_l;
            var wsamp_s;
            var en_subshort = new_float2(12);
            var en_short = [0, 0, 0, 0];
            var attack_intensity = new_float2(12);
            var ns_uselongblock = 1;
            var attackThreshold;
            var max = new_float2(Encoder2.CBANDS), avg = new_float2(Encoder2.CBANDS);
            var ns_attacks = [0, 0, 0, 0];
            var fftenergy = new_float2(Encoder2.HBLKSIZE);
            var fftenergy_s = new_float_n2([3, Encoder2.HBLKSIZE_s]);
            for (i = 0; i < 3; i++) {
              en_subshort[i] = gfc.nsPsy.last_en_subshort[chn][i + 6];
              attack_intensity[i] = en_subshort[i] / gfc.nsPsy.last_en_subshort[chn][i + 4];
              en_short[0] += en_subshort[i];
            }
            if (chn == 2) {
              abort();
            }
            {
              var pf = ns_hpfsmpl[chn & 1];
              var pfPos = 0;
              for (i = 0; i < 9; i++) {
                var pfe = pfPos + 576 / 9;
                var p2 = 1;
                for (; pfPos < pfe; pfPos++)
                  if (p2 < Math.abs(pf[pfPos]))
                    p2 = Math.abs(pf[pfPos]);
                gfc.nsPsy.last_en_subshort[chn][i] = en_subshort[i + 3] = p2;
                en_short[1 + i / 3] += p2;
                if (p2 > en_subshort[i + 3 - 2]) {
                  p2 = p2 / en_subshort[i + 3 - 2];
                } else if (en_subshort[i + 3 - 2] > p2 * 10) {
                  p2 = en_subshort[i + 3 - 2] / (p2 * 10);
                } else
                  p2 = 0;
                attack_intensity[i + 3] = p2;
              }
            }
            if (gfp.analysis) {
              abort();
            }
            attackThreshold = chn == 3 ? gfc.nsPsy.attackthre_s : gfc.nsPsy.attackthre;
            for (i = 0; i < 12; i++)
              if (0 == ns_attacks[i / 3] && attack_intensity[i] > attackThreshold)
                ns_attacks[i / 3] = i % 3 + 1;
            for (i = 1; i < 4; i++) {
              var ratio;
              if (en_short[i - 1] > en_short[i]) {
                ratio = en_short[i - 1] / en_short[i];
              } else {
                ratio = en_short[i] / en_short[i - 1];
              }
              if (ratio < 1.7) {
                ns_attacks[i] = 0;
                if (i == 1)
                  ns_attacks[0] = 0;
              }
            }
            if (ns_attacks[0] != 0 && gfc.nsPsy.lastAttacks[chn] != 0)
              ns_attacks[0] = 0;
            if (gfc.nsPsy.lastAttacks[chn] == 3 || ns_attacks[0] + ns_attacks[1] + ns_attacks[2] + ns_attacks[3] != 0) {
              ns_uselongblock = 0;
              if (ns_attacks[1] != 0 && ns_attacks[0] != 0)
                ns_attacks[1] = 0;
              if (ns_attacks[2] != 0 && ns_attacks[1] != 0)
                ns_attacks[2] = 0;
              if (ns_attacks[3] != 0 && ns_attacks[2] != 0)
                ns_attacks[3] = 0;
            }
            if (chn < 2) {
              uselongblock[chn] = ns_uselongblock;
            } else {
              abort();
            }
            energy[chn] = gfc.tot_ener[chn];
            wsamp_s = wsamp_S;
            wsamp_l = wsamp_L;
            compute_ffts(
              gfp,
              fftenergy,
              fftenergy_s,
              wsamp_l,
              chn & 1,
              wsamp_s,
              chn & 1,
              gr_out,
              chn,
              buffer,
              bufPos
            );
            calc_energy(gfc, fftenergy, eb_l, max, avg);
            calc_mask_index_l(gfc, max, avg, mask_idx_l);
            for (sblock = 0; sblock < 3; sblock++) {
              var enn, thmm;
              compute_masking_s(gfp, fftenergy_s, eb_s, thr, chn, sblock);
              convert_partition2scalefac_s(gfc, eb_s, thr, chn, sblock);
              for (sb = 0; sb < Encoder2.SBMAX_s; sb++) {
                thmm = gfc.thm[chn].s[sb][sblock];
                thmm *= NS_PREECHO_ATT0;
                if (ns_attacks[sblock] >= 2 || ns_attacks[sblock + 1] == 1) {
                  var idx = sblock != 0 ? sblock - 1 : 2;
                  var p2 = NS_INTERP(
                    gfc.thm[chn].s[sb][idx],
                    thmm,
                    NS_PREECHO_ATT1 * pcfact
                  );
                  thmm = Math.min(thmm, p2);
                }
                if (ns_attacks[sblock] == 1) {
                  var idx = sblock != 0 ? sblock - 1 : 2;
                  var p2 = NS_INTERP(
                    gfc.thm[chn].s[sb][idx],
                    thmm,
                    NS_PREECHO_ATT2 * pcfact
                  );
                  thmm = Math.min(thmm, p2);
                } else if (sblock != 0 && ns_attacks[sblock - 1] == 3 || sblock == 0 && gfc.nsPsy.lastAttacks[chn] == 3) {
                  var idx = sblock != 2 ? sblock + 1 : 0;
                  var p2 = NS_INTERP(
                    gfc.thm[chn].s[sb][idx],
                    thmm,
                    NS_PREECHO_ATT2 * pcfact
                  );
                  thmm = Math.min(thmm, p2);
                }
                enn = en_subshort[sblock * 3 + 3] + en_subshort[sblock * 3 + 4] + en_subshort[sblock * 3 + 5];
                if (en_subshort[sblock * 3 + 5] * 6 < enn) {
                  thmm *= 0.5;
                  if (en_subshort[sblock * 3 + 4] * 6 < enn)
                    thmm *= 0.5;
                }
                gfc.thm[chn].s[sb][sblock] = thmm;
              }
            }
            gfc.nsPsy.lastAttacks[chn] = ns_attacks[2];
            k2 = 0;
            {
              for (b = 0; b < gfc.npart_l; b++) {
                var kk = gfc.s3ind[b][0];
                var eb2 = eb_l[kk] * tab[mask_idx_l[kk]];
                var ecb = gfc.s3_ll[k2++] * eb2;
                while (++kk <= gfc.s3ind[b][1]) {
                  eb2 = eb_l[kk] * tab[mask_idx_l[kk]];
                  ecb = mask_add(
                    ecb,
                    gfc.s3_ll[k2++] * eb2,
                    kk,
                    kk - b,
                    gfc
                  );
                }
                ecb *= 0.158489319246111;
                if (gfc.blocktype_old[chn & 1] == Encoder2.SHORT_TYPE)
                  thr[b] = ecb;
                else
                  thr[b] = NS_INTERP(
                    Math.min(ecb, Math.min(rpelev * gfc.nb_1[chn][b], rpelev2 * gfc.nb_2[chn][b])),
                    ecb,
                    pcfact
                  );
                gfc.nb_2[chn][b] = gfc.nb_1[chn][b];
                gfc.nb_1[chn][b] = ecb;
              }
            }
            for (; b <= Encoder2.CBANDS; ++b) {
              eb_l[b] = 0;
              thr[b] = 0;
            }
            convert_partition2scalefac_l(gfc, eb_l, thr, chn);
          }
          if (gfp.mode == MPEGMode2.STEREO || gfp.mode == MPEGMode2.JOINT_STEREO) {
            abort();
          }
          if (gfp.mode == MPEGMode2.JOINT_STEREO) {
            abort();
          }
          block_type_set(gfp, uselongblock, blocktype_d, blocktype);
          for (chn = 0; chn < numchn; chn++) {
            var ppe;
            var ppePos = 0;
            var type;
            var mr;
            if (chn > 1) {
              abort();
            } else {
              ppe = percep_entropy;
              ppePos = 0;
              type = blocktype_d[chn];
              mr = masking_ratio[gr_out][chn];
            }
            if (type == Encoder2.SHORT_TYPE)
              ppe[ppePos + chn] = pecalc_s(mr, gfc.masking_lower);
            else
              ppe[ppePos + chn] = pecalc_l(mr, gfc.masking_lower);
            if (gfp.analysis)
              gfc.pinfo.pe[gr_out][chn] = ppe[ppePos + chn];
          }
          return 0;
        };
        function s3_func(bark) {
          var tempx, x, tempy, temp;
          tempx = bark;
          if (tempx >= 0)
            tempx *= 3;
          else
            tempx *= 1.5;
          if (tempx >= 0.5 && tempx <= 2.5) {
            temp = tempx - 0.5;
            x = 8 * (temp * temp - 2 * temp);
          } else
            x = 0;
          tempx += 0.474;
          tempy = 15.811389 + 7.5 * tempx - 17.5 * Math.sqrt(1 + tempx * tempx);
          if (tempy <= -60)
            return 0;
          tempx = Math.exp((x + tempy) * LN_TO_LOG10);
          tempx /= 0.6609193;
          return tempx;
        }
        function freq2bark(freq) {
          if (freq < 0)
            freq = 0;
          freq = freq * 1e-3;
          return 13 * Math.atan(0.76 * freq) + 3.5 * Math.atan(freq * freq / (7.5 * 7.5));
        }
        function init_numline(numlines, bo, bm, bval, bval_width, mld, bo_w, sfreq, blksize, scalepos, deltafreq, sbmax) {
          var b_frq = new_float2(Encoder2.CBANDS + 1);
          var sample_freq_frac = sfreq / (sbmax > 15 ? 2 * 576 : 2 * 192);
          var partition = new_int2(Encoder2.HBLKSIZE);
          var i;
          sfreq /= blksize;
          var j = 0;
          var ni = 0;
          for (i = 0; i < Encoder2.CBANDS; i++) {
            var bark1;
            var j2;
            bark1 = freq2bark(sfreq * j);
            b_frq[i] = sfreq * j;
            for (j2 = j; freq2bark(sfreq * j2) - bark1 < DELBARK && j2 <= blksize / 2; j2++)
              ;
            numlines[i] = j2 - j;
            ni = i + 1;
            while (j < j2) {
              partition[j++] = i;
            }
            if (j > blksize / 2) {
              j = blksize / 2;
              ++i;
              break;
            }
          }
          b_frq[i] = sfreq * j;
          for (var sfb = 0; sfb < sbmax; sfb++) {
            var i1, i2, start, end;
            var arg;
            start = scalepos[sfb];
            end = scalepos[sfb + 1];
            i1 = 0 | Math.floor(0.5 + deltafreq * (start - 0.5));
            if (i1 < 0)
              i1 = 0;
            i2 = 0 | Math.floor(0.5 + deltafreq * (end - 0.5));
            if (i2 > blksize / 2)
              i2 = blksize / 2;
            bm[sfb] = (partition[i1] + partition[i2]) / 2;
            bo[sfb] = partition[i2];
            var f_tmp = sample_freq_frac * end;
            bo_w[sfb] = (f_tmp - b_frq[bo[sfb]]) / (b_frq[bo[sfb] + 1] - b_frq[bo[sfb]]);
            if (bo_w[sfb] < 0) {
              bo_w[sfb] = 0;
            } else {
              if (bo_w[sfb] > 1) {
                bo_w[sfb] = 1;
              }
            }
            arg = freq2bark(sfreq * scalepos[sfb] * deltafreq);
            arg = Math.min(arg, 15.5) / 15.5;
            mld[sfb] = Math.pow(
              10,
              1.25 * (1 - Math.cos(Math.PI * arg)) - 2.5
            );
          }
          j = 0;
          for (var k2 = 0; k2 < ni; k2++) {
            var w = numlines[k2];
            var bark1, bark2;
            bark1 = freq2bark(sfreq * j);
            bark2 = freq2bark(sfreq * (j + w - 1));
            bval[k2] = 0.5 * (bark1 + bark2);
            bark1 = freq2bark(sfreq * (j - 0.5));
            bark2 = freq2bark(sfreq * (j + w - 0.5));
            bval_width[k2] = bark2 - bark1;
            j += w;
          }
          return ni;
        }
        function init_s3_values(s3ind, npart, bval, bval_width, norm, use_old_s3) {
          var s3 = new_float_n2([Encoder2.CBANDS, Encoder2.CBANDS]);
          var j;
          var numberOfNoneZero = 0;
          if (use_old_s3) {
            for (var i = 0; i < npart; i++) {
              for (j = 0; j < npart; j++) {
                var v = s3_func(bval[i] - bval[j]) * bval_width[j];
                s3[i][j] = v * norm[i];
              }
            }
          } else {
            abort();
          }
          for (var i = 0; i < npart; i++) {
            for (j = 0; j < npart; j++) {
              if (s3[i][j] > 0)
                break;
            }
            s3ind[i][0] = j;
            for (j = npart - 1; j > 0; j--) {
              if (s3[i][j] > 0)
                break;
            }
            s3ind[i][1] = j;
            numberOfNoneZero += s3ind[i][1] - s3ind[i][0] + 1;
          }
          var p2 = new_float2(numberOfNoneZero);
          var k2 = 0;
          for (var i = 0; i < npart; i++)
            for (j = s3ind[i][0]; j <= s3ind[i][1]; j++)
              p2[k2++] = s3[i][j];
          return p2;
        }
        function stereo_demask(f2) {
          var arg = freq2bark(f2);
          arg = Math.min(arg, 15.5) / 15.5;
          return Math.pow(
            10,
            1.25 * (1 - Math.cos(Math.PI * arg)) - 2.5
          );
        }
        this.psymodel_init = function(gfp) {
          var gfc = gfp.internal_flags;
          var i;
          var useOldS3 = true;
          var bvl_a = 13, bvl_b = 24;
          var snr_l_a = 0, snr_l_b = 0;
          var snr_s_a = -8.25, snr_s_b = -4.5;
          var bval = new_float2(Encoder2.CBANDS);
          var bval_width = new_float2(Encoder2.CBANDS);
          var norm = new_float2(Encoder2.CBANDS);
          var sfreq = gfp.out_samplerate;
          switch (gfp.experimentalZ) {
            default:
            case 0:
              useOldS3 = true;
              break;
            case 1:
              useOldS3 = gfp.VBR == VbrMode2.vbr_mtrh || gfp.VBR == VbrMode2.vbr_mt ? false : true;
              break;
            case 2:
              useOldS3 = false;
              break;
            case 3:
              bvl_a = 8;
              snr_l_a = -1.75;
              snr_l_b = -0.0125;
              snr_s_a = -8.25;
              snr_s_b = -2.25;
              break;
          }
          gfc.ms_ener_ratio_old = 0.25;
          gfc.blocktype_old[0] = gfc.blocktype_old[1] = Encoder2.NORM_TYPE;
          for (i = 0; i < 4; ++i) {
            for (var j = 0; j < Encoder2.CBANDS; ++j) {
              gfc.nb_1[i][j] = 1e20;
              gfc.nb_2[i][j] = 1e20;
              gfc.nb_s1[i][j] = gfc.nb_s2[i][j] = 1;
            }
            for (var sb = 0; sb < Encoder2.SBMAX_l; sb++) {
              gfc.en[i].l[sb] = 1e20;
              gfc.thm[i].l[sb] = 1e20;
            }
            for (var j = 0; j < 3; ++j) {
              for (var sb = 0; sb < Encoder2.SBMAX_s; sb++) {
                gfc.en[i].s[sb][j] = 1e20;
                gfc.thm[i].s[sb][j] = 1e20;
              }
              gfc.nsPsy.lastAttacks[i] = 0;
            }
            for (var j = 0; j < 9; j++)
              gfc.nsPsy.last_en_subshort[i][j] = 10;
          }
          gfc.loudness_sq_save[0] = gfc.loudness_sq_save[1] = 0;
          gfc.npart_l = init_numline(
            gfc.numlines_l,
            gfc.bo_l,
            gfc.bm_l,
            bval,
            bval_width,
            gfc.mld_l,
            gfc.PSY.bo_l_weight,
            sfreq,
            Encoder2.BLKSIZE,
            gfc.scalefac_band.l,
            Encoder2.BLKSIZE / (2 * 576),
            Encoder2.SBMAX_l
          );
          for (i = 0; i < gfc.npart_l; i++) {
            var snr = snr_l_a;
            if (bval[i] >= bvl_a) {
              snr = snr_l_b * (bval[i] - bvl_a) / (bvl_b - bvl_a) + snr_l_a * (bvl_b - bval[i]) / (bvl_b - bvl_a);
            }
            norm[i] = Math.pow(10, snr / 10);
            if (gfc.numlines_l[i] > 0) {
              gfc.rnumlines_l[i] = 1 / gfc.numlines_l[i];
            } else {
              gfc.rnumlines_l[i] = 0;
            }
          }
          gfc.s3_ll = init_s3_values(
            gfc.s3ind,
            gfc.npart_l,
            bval,
            bval_width,
            norm,
            useOldS3
          );
          var j = 0;
          for (i = 0; i < gfc.npart_l; i++) {
            var x;
            x = Float2.MAX_VALUE;
            for (var k2 = 0; k2 < gfc.numlines_l[i]; k2++, j++) {
              var freq = sfreq * j / (1e3 * Encoder2.BLKSIZE);
              var level;
              level = this.ATHformula(freq * 1e3, gfp) - 20;
              level = Math.pow(10, 0.1 * level);
              level *= gfc.numlines_l[i];
              if (x > level)
                x = level;
            }
            gfc.ATH.cb_l[i] = x;
            x = -20 + bval[i] * 20 / 10;
            if (x > 6) {
              x = 100;
            }
            if (x < -15) {
              x = -15;
            }
            x -= 8;
            gfc.minval_l[i] = Math.pow(10, x / 10) * gfc.numlines_l[i];
          }
          gfc.npart_s = init_numline(
            gfc.numlines_s,
            gfc.bo_s,
            gfc.bm_s,
            bval,
            bval_width,
            gfc.mld_s,
            gfc.PSY.bo_s_weight,
            sfreq,
            Encoder2.BLKSIZE_s,
            gfc.scalefac_band.s,
            Encoder2.BLKSIZE_s / (2 * 192),
            Encoder2.SBMAX_s
          );
          j = 0;
          for (i = 0; i < gfc.npart_s; i++) {
            var x;
            var snr = snr_s_a;
            if (bval[i] >= bvl_a) {
              snr = snr_s_b * (bval[i] - bvl_a) / (bvl_b - bvl_a) + snr_s_a * (bvl_b - bval[i]) / (bvl_b - bvl_a);
            }
            norm[i] = Math.pow(10, snr / 10);
            x = Float2.MAX_VALUE;
            for (var k2 = 0; k2 < gfc.numlines_s[i]; k2++, j++) {
              var freq = sfreq * j / (1e3 * Encoder2.BLKSIZE_s);
              var level;
              level = this.ATHformula(freq * 1e3, gfp) - 20;
              level = Math.pow(10, 0.1 * level);
              level *= gfc.numlines_s[i];
              if (x > level)
                x = level;
            }
            gfc.ATH.cb_s[i] = x;
            x = -7 + bval[i] * 7 / 12;
            if (bval[i] > 12) {
              x *= 1 + Math.log(1 + x) * 3.1;
            }
            if (bval[i] < 12) {
              x *= 1 + Math.log(1 - x) * 2.3;
            }
            if (x < -15) {
              x = -15;
            }
            x -= 8;
            gfc.minval_s[i] = Math.pow(10, x / 10) * gfc.numlines_s[i];
          }
          gfc.s3_ss = init_s3_values(
            gfc.s3ind_s,
            gfc.npart_s,
            bval,
            bval_width,
            norm,
            useOldS3
          );
          init_mask_add_max_values();
          fft.init_fft(gfc);
          gfc.decay = Math.exp(-1 * LOG10 / (temporalmask_sustain_sec * sfreq / 192));
          {
            var msfix;
            msfix = NS_MSFIX;
            if ((gfp.exp_nspsytune & 2) != 0)
              msfix = 1;
            if (Math.abs(gfp.msfix) > 0)
              msfix = gfp.msfix;
            gfp.msfix = msfix;
            for (var b = 0; b < gfc.npart_l; b++)
              if (gfc.s3ind[b][1] > gfc.npart_l - 1)
                gfc.s3ind[b][1] = gfc.npart_l - 1;
          }
          var frame_duration = 576 * gfc.mode_gr / sfreq;
          gfc.ATH.decay = Math.pow(10, -12 / 10 * frame_duration);
          gfc.ATH.adjust = 0.01;
          gfc.ATH.adjustLimit = 1;
          if (gfp.ATHtype != -1) {
            var freq;
            var freq_inc = gfp.out_samplerate / Encoder2.BLKSIZE;
            var eql_balance = 0;
            freq = 0;
            for (i = 0; i < Encoder2.BLKSIZE / 2; ++i) {
              freq += freq_inc;
              gfc.ATH.eql_w[i] = 1 / Math.pow(10, this.ATHformula(freq, gfp) / 10);
              eql_balance += gfc.ATH.eql_w[i];
            }
            eql_balance = 1 / eql_balance;
            for (i = Encoder2.BLKSIZE / 2; --i >= 0; ) {
              gfc.ATH.eql_w[i] *= eql_balance;
            }
          }
          {
            for (var b = j = 0; b < gfc.npart_s; ++b) {
              for (i = 0; i < gfc.numlines_s[b]; ++i) {
                ++j;
              }
            }
            for (var b = j = 0; b < gfc.npart_l; ++b) {
              for (i = 0; i < gfc.numlines_l[b]; ++i) {
                ++j;
              }
            }
          }
          j = 0;
          for (i = 0; i < gfc.npart_l; i++) {
            var freq = sfreq * (j + gfc.numlines_l[i] / 2) / (1 * Encoder2.BLKSIZE);
            gfc.mld_cb_l[i] = stereo_demask(freq);
            j += gfc.numlines_l[i];
          }
          for (; i < Encoder2.CBANDS; ++i) {
            gfc.mld_cb_l[i] = 1;
          }
          j = 0;
          for (i = 0; i < gfc.npart_s; i++) {
            var freq = sfreq * (j + gfc.numlines_s[i] / 2) / (1 * Encoder2.BLKSIZE_s);
            gfc.mld_cb_s[i] = stereo_demask(freq);
            j += gfc.numlines_s[i];
          }
          for (; i < Encoder2.CBANDS; ++i) {
            gfc.mld_cb_s[i] = 1;
          }
          return 0;
        };
        function ATHformula_GB(f2, value) {
          if (f2 < -0.3)
            f2 = 3410;
          f2 /= 1e3;
          f2 = Math.max(0.1, f2);
          var ath = 3.64 * Math.pow(f2, -0.8) - 6.8 * Math.exp(-0.6 * Math.pow(f2 - 3.4, 2)) + 6 * Math.exp(-0.15 * Math.pow(f2 - 8.7, 2)) + (0.6 + 0.04 * value) * 1e-3 * Math.pow(f2, 4);
          return ath;
        }
        this.ATHformula = function(f2, gfp) {
          var ath;
          switch (gfp.ATHtype) {
            case 0:
              ath = ATHformula_GB(f2, 9);
              break;
            case 1:
              ath = ATHformula_GB(f2, -1);
              break;
            case 2:
              ath = ATHformula_GB(f2, 0);
              break;
            case 3:
              ath = ATHformula_GB(f2, 1) + 6;
              break;
            case 4:
              ath = ATHformula_GB(f2, gfp.ATHcurve);
              break;
            default:
              ath = ATHformula_GB(f2, 0);
              break;
          }
          return ath;
        };
      }
      function Lame2() {
        var self2 = this;
        var LAME_MAXALBUMART = 128 * 1024;
        Lame2.V9 = 410;
        Lame2.V8 = 420;
        Lame2.V7 = 430;
        Lame2.V6 = 440;
        Lame2.V5 = 450;
        Lame2.V4 = 460;
        Lame2.V3 = 470;
        Lame2.V2 = 480;
        Lame2.V1 = 490;
        Lame2.V0 = 500;
        Lame2.R3MIX = 1e3;
        Lame2.STANDARD = 1001;
        Lame2.EXTREME = 1002;
        Lame2.INSANE = 1003;
        Lame2.STANDARD_FAST = 1004;
        Lame2.EXTREME_FAST = 1005;
        Lame2.MEDIUM = 1006;
        Lame2.MEDIUM_FAST = 1007;
        var LAME_MAXMP3BUFFER = 16384 + LAME_MAXALBUMART;
        Lame2.LAME_MAXMP3BUFFER = LAME_MAXMP3BUFFER;
        var ga;
        var bs;
        var p2;
        var qupvt;
        var qu;
        var psy = new PsyModel2();
        var vbr;
        var id3;
        this.enc = new Encoder2();
        this.setModules = function(_ga, _bs, _p, _qupvt, _qu, _vbr, _ver, _id3, _mpglib) {
          ga = _ga;
          bs = _bs;
          p2 = _p;
          qupvt = _qupvt;
          qu = _qu;
          vbr = _vbr;
          id3 = _id3;
          this.enc.setModules(bs, psy, qupvt, vbr);
        };
        function PSY() {
          this.mask_adjust = 0;
          this.mask_adjust_short = 0;
          this.bo_l_weight = new_float2(Encoder2.SBMAX_l);
          this.bo_s_weight = new_float2(Encoder2.SBMAX_s);
        }
        function LowPassHighPass() {
          this.lowerlimit = 0;
        }
        function BandPass(bitrate, lPass) {
          this.lowpass = lPass;
        }
        var LAME_ID = 4294479419;
        function lame_init_old(gfp) {
          var gfc;
          gfp.class_id = LAME_ID;
          gfc = gfp.internal_flags = new LameInternalFlags2();
          gfp.mode = MPEGMode2.NOT_SET;
          gfp.original = 1;
          gfp.in_samplerate = 44100;
          gfp.num_channels = 2;
          gfp.num_samples = -1;
          gfp.bWriteVbrTag = true;
          gfp.quality = -1;
          gfp.short_blocks = null;
          gfc.subblock_gain = -1;
          gfp.lowpassfreq = 0;
          gfp.highpassfreq = 0;
          gfp.lowpasswidth = -1;
          gfp.highpasswidth = -1;
          gfp.VBR = VbrMode2.vbr_off;
          gfp.VBR_q = 4;
          gfp.ATHcurve = -1;
          gfp.VBR_mean_bitrate_kbps = 128;
          gfp.VBR_min_bitrate_kbps = 0;
          gfp.VBR_max_bitrate_kbps = 0;
          gfp.VBR_hard_min = 0;
          gfc.VBR_min_bitrate = 1;
          gfc.VBR_max_bitrate = 13;
          gfp.quant_comp = -1;
          gfp.quant_comp_short = -1;
          gfp.msfix = -1;
          gfc.resample_ratio = 1;
          gfc.OldValue[0] = 180;
          gfc.OldValue[1] = 180;
          gfc.CurrentStep[0] = 4;
          gfc.CurrentStep[1] = 4;
          gfc.masking_lower = 1;
          gfc.nsPsy.attackthre = -1;
          gfc.nsPsy.attackthre_s = -1;
          gfp.scale = -1;
          gfp.athaa_type = -1;
          gfp.ATHtype = -1;
          gfp.athaa_loudapprox = -1;
          gfp.athaa_sensitivity = 0;
          gfp.useTemporal = null;
          gfp.interChRatio = -1;
          gfc.mf_samples_to_encode = Encoder2.ENCDELAY + Encoder2.POSTDELAY;
          gfp.encoder_padding = 0;
          gfc.mf_size = Encoder2.ENCDELAY - Encoder2.MDCTDELAY;
          gfp.findReplayGain = false;
          gfp.decode_on_the_fly = false;
          gfc.decode_on_the_fly = false;
          gfc.findReplayGain = false;
          gfc.findPeakSample = false;
          gfc.RadioGain = 0;
          gfc.AudiophileGain = 0;
          gfc.noclipGainChange = 0;
          gfc.noclipScale = -1;
          gfp.preset = 0;
          gfp.write_id3tag_automatic = true;
          return 0;
        }
        this.lame_init = function() {
          var gfp = new LameGlobalFlags2();
          lame_init_old(gfp);
          gfp.lame_allocated_gfp = 1;
          return gfp;
        };
        function filter_coef(x) {
          if (x > 1)
            return 0;
          if (x <= 0)
            return 1;
          return Math.cos(Math.PI / 2 * x);
        }
        this.nearestBitrateFullIndex = function(bitrate) {
          var full_bitrate_table = [
            8,
            16,
            24,
            32,
            40,
            48,
            56,
            64,
            80,
            96,
            112,
            128,
            160,
            192,
            224,
            256,
            320
          ];
          var lower_range = 0, lower_range_kbps = 0, upper_range = 0, upper_range_kbps = 0;
          upper_range_kbps = full_bitrate_table[16];
          upper_range = 16;
          lower_range_kbps = full_bitrate_table[16];
          lower_range = 16;
          for (var b = 0; b < 16; b++) {
            if (Math.max(bitrate, full_bitrate_table[b + 1]) != bitrate) {
              upper_range_kbps = full_bitrate_table[b + 1];
              upper_range = b + 1;
              lower_range_kbps = full_bitrate_table[b];
              lower_range = b;
              break;
            }
          }
          if (upper_range_kbps - bitrate > bitrate - lower_range_kbps) {
            return lower_range;
          }
          return upper_range;
        };
        function SmpFrqIndex(sample_freq, gpf) {
          switch (sample_freq) {
            case 44100:
              gpf.version = 1;
              return 0;
            case 48e3:
              gpf.version = 1;
              return 1;
            case 32e3:
              gpf.version = 1;
              return 2;
            case 22050:
              gpf.version = 0;
              return 0;
            case 24e3:
              gpf.version = 0;
              return 1;
            case 16e3:
              gpf.version = 0;
              return 2;
            case 11025:
              gpf.version = 0;
              return 0;
            case 12e3:
              gpf.version = 0;
              return 1;
            case 8e3:
              gpf.version = 0;
              return 2;
            default:
              gpf.version = 0;
              return -1;
          }
        }
        function FindNearestBitrate(bRate, version, samplerate) {
          if (samplerate < 16e3)
            version = 2;
          var bitrate = Tables2.bitrate_table[version][1];
          for (var i = 2; i <= 14; i++) {
            if (Tables2.bitrate_table[version][i] > 0) {
              if (Math.abs(Tables2.bitrate_table[version][i] - bRate) < Math.abs(bitrate - bRate))
                bitrate = Tables2.bitrate_table[version][i];
            }
          }
          return bitrate;
        }
        function BitrateIndex(bRate, version, samplerate) {
          if (samplerate < 16e3)
            version = 2;
          for (var i = 0; i <= 14; i++) {
            if (Tables2.bitrate_table[version][i] > 0) {
              if (Tables2.bitrate_table[version][i] == bRate) {
                return i;
              }
            }
          }
          return -1;
        }
        function optimum_bandwidth(lh, bitrate) {
          var freq_map = [
            new BandPass(8, 2e3),
            new BandPass(16, 3700),
            new BandPass(24, 3900),
            new BandPass(32, 5500),
            new BandPass(40, 7e3),
            new BandPass(48, 7500),
            new BandPass(56, 1e4),
            new BandPass(64, 11e3),
            new BandPass(80, 13500),
            new BandPass(96, 15100),
            new BandPass(112, 15600),
            new BandPass(128, 17e3),
            new BandPass(160, 17500),
            new BandPass(192, 18600),
            new BandPass(224, 19400),
            new BandPass(256, 19700),
            new BandPass(320, 20500)
          ];
          var table_index = self2.nearestBitrateFullIndex(bitrate);
          lh.lowerlimit = freq_map[table_index].lowpass;
        }
        function lame_init_params_ppflt(gfp) {
          var gfc = gfp.internal_flags;
          var lowpass_band = 32;
          if (gfc.lowpass1 > 0) {
            var minband = 999;
            for (var band = 0; band <= 31; band++) {
              var freq = band / 31;
              if (freq >= gfc.lowpass2) {
                lowpass_band = Math.min(lowpass_band, band);
              }
              if (gfc.lowpass1 < freq && freq < gfc.lowpass2) {
                minband = Math.min(minband, band);
              }
            }
            if (minband == 999) {
              gfc.lowpass1 = (lowpass_band - 0.75) / 31;
            } else {
              gfc.lowpass1 = (minband - 0.75) / 31;
            }
            gfc.lowpass2 = lowpass_band / 31;
          }
          if (gfc.highpass2 > 0) {
            abort();
          }
          if (gfc.highpass2 > 0) {
            abort();
          }
          for (var band = 0; band < 32; band++) {
            var fc1, fc2;
            var freq = band / 31;
            if (gfc.highpass2 > gfc.highpass1) {
              abort();
            } else {
              fc1 = 1;
            }
            if (gfc.lowpass2 > gfc.lowpass1) {
              fc2 = filter_coef((freq - gfc.lowpass1) / (gfc.lowpass2 - gfc.lowpass1 + 1e-20));
            } else {
              fc2 = 1;
            }
            gfc.amp_filter[band] = fc1 * fc2;
          }
        }
        function lame_init_qval(gfp) {
          var gfc = gfp.internal_flags;
          switch (gfp.quality) {
            default:
            case 9:
              gfc.psymodel = 0;
              gfc.noise_shaping = 0;
              gfc.noise_shaping_amp = 0;
              gfc.noise_shaping_stop = 0;
              gfc.use_best_huffman = 0;
              gfc.full_outer_loop = 0;
              break;
            case 8:
              gfp.quality = 7;
            case 7:
              gfc.psymodel = 1;
              gfc.noise_shaping = 0;
              gfc.noise_shaping_amp = 0;
              gfc.noise_shaping_stop = 0;
              gfc.use_best_huffman = 0;
              gfc.full_outer_loop = 0;
              break;
            case 6:
              gfc.psymodel = 1;
              if (gfc.noise_shaping == 0)
                gfc.noise_shaping = 1;
              gfc.noise_shaping_amp = 0;
              gfc.noise_shaping_stop = 0;
              if (gfc.subblock_gain == -1)
                gfc.subblock_gain = 1;
              gfc.use_best_huffman = 0;
              gfc.full_outer_loop = 0;
              break;
            case 5:
              gfc.psymodel = 1;
              if (gfc.noise_shaping == 0)
                gfc.noise_shaping = 1;
              gfc.noise_shaping_amp = 0;
              gfc.noise_shaping_stop = 0;
              if (gfc.subblock_gain == -1)
                gfc.subblock_gain = 1;
              gfc.use_best_huffman = 0;
              gfc.full_outer_loop = 0;
              break;
            case 4:
              gfc.psymodel = 1;
              if (gfc.noise_shaping == 0)
                gfc.noise_shaping = 1;
              gfc.noise_shaping_amp = 0;
              gfc.noise_shaping_stop = 0;
              if (gfc.subblock_gain == -1)
                gfc.subblock_gain = 1;
              gfc.use_best_huffman = 1;
              gfc.full_outer_loop = 0;
              break;
            case 3:
              gfc.psymodel = 1;
              if (gfc.noise_shaping == 0)
                gfc.noise_shaping = 1;
              gfc.noise_shaping_amp = 1;
              gfc.noise_shaping_stop = 1;
              if (gfc.subblock_gain == -1)
                gfc.subblock_gain = 1;
              gfc.use_best_huffman = 1;
              gfc.full_outer_loop = 0;
              break;
            case 2:
              gfc.psymodel = 1;
              if (gfc.noise_shaping == 0)
                gfc.noise_shaping = 1;
              if (gfc.substep_shaping == 0)
                gfc.substep_shaping = 2;
              gfc.noise_shaping_amp = 1;
              gfc.noise_shaping_stop = 1;
              if (gfc.subblock_gain == -1)
                gfc.subblock_gain = 1;
              gfc.use_best_huffman = 1;
              gfc.full_outer_loop = 0;
              break;
            case 1:
              gfc.psymodel = 1;
              if (gfc.noise_shaping == 0)
                gfc.noise_shaping = 1;
              if (gfc.substep_shaping == 0)
                gfc.substep_shaping = 2;
              gfc.noise_shaping_amp = 2;
              gfc.noise_shaping_stop = 1;
              if (gfc.subblock_gain == -1)
                gfc.subblock_gain = 1;
              gfc.use_best_huffman = 1;
              gfc.full_outer_loop = 0;
              break;
            case 0:
              gfc.psymodel = 1;
              if (gfc.noise_shaping == 0)
                gfc.noise_shaping = 1;
              if (gfc.substep_shaping == 0)
                gfc.substep_shaping = 2;
              gfc.noise_shaping_amp = 2;
              gfc.noise_shaping_stop = 1;
              if (gfc.subblock_gain == -1)
                gfc.subblock_gain = 1;
              gfc.use_best_huffman = 1;
              gfc.full_outer_loop = 0;
              break;
          }
        }
        function lame_init_bitstream(gfp) {
          var gfc = gfp.internal_flags;
          gfp.frameNum = 0;
          if (gfp.write_id3tag_automatic) {
            id3.id3tag_write_v2(gfp);
          }
          gfc.bitrate_stereoMode_Hist = new_int_n2([16, 4 + 1]);
          gfc.bitrate_blockType_Hist = new_int_n2([16, 4 + 1 + 1]);
          gfc.PeakSample = 0;
          if (gfp.bWriteVbrTag)
            vbr.InitVbrTag(gfp);
        }
        this.lame_init_params = function(gfp) {
          var gfc = gfp.internal_flags;
          gfc.Class_ID = 0;
          if (gfc.ATH == null)
            gfc.ATH = new ATH2();
          if (gfc.PSY == null)
            gfc.PSY = new PSY();
          if (gfc.rgdata == null)
            gfc.rgdata = new ReplayGain2();
          gfc.channels_in = gfp.num_channels;
          if (gfc.channels_in == 1)
            gfp.mode = MPEGMode2.MONO;
          gfc.channels_out = gfp.mode == MPEGMode2.MONO ? 1 : 2;
          gfc.mode_ext = Encoder2.MPG_MD_MS_LR;
          if (gfp.mode == MPEGMode2.MONO)
            gfp.force_ms = false;
          if (gfp.VBR == VbrMode2.vbr_off && gfp.VBR_mean_bitrate_kbps != 128 && gfp.brate == 0)
            gfp.brate = gfp.VBR_mean_bitrate_kbps;
          if (gfp.VBR == VbrMode2.vbr_off || gfp.VBR == VbrMode2.vbr_mtrh || gfp.VBR == VbrMode2.vbr_mt) ;
          else {
            gfp.free_format = false;
          }
          if (gfp.VBR == VbrMode2.vbr_off && gfp.brate == 0) {
            abort();
          }
          if (gfp.VBR == VbrMode2.vbr_off && gfp.compression_ratio > 0) {
            abort();
          }
          if (gfp.out_samplerate != 0) {
            if (gfp.out_samplerate < 16e3) {
              gfp.VBR_mean_bitrate_kbps = Math.max(
                gfp.VBR_mean_bitrate_kbps,
                8
              );
              gfp.VBR_mean_bitrate_kbps = Math.min(
                gfp.VBR_mean_bitrate_kbps,
                64
              );
            } else if (gfp.out_samplerate < 32e3) {
              gfp.VBR_mean_bitrate_kbps = Math.max(
                gfp.VBR_mean_bitrate_kbps,
                8
              );
              gfp.VBR_mean_bitrate_kbps = Math.min(
                gfp.VBR_mean_bitrate_kbps,
                160
              );
            } else {
              gfp.VBR_mean_bitrate_kbps = Math.max(
                gfp.VBR_mean_bitrate_kbps,
                32
              );
              gfp.VBR_mean_bitrate_kbps = Math.min(
                gfp.VBR_mean_bitrate_kbps,
                320
              );
            }
          }
          if (gfp.lowpassfreq == 0) {
            var lowpass = 16e3;
            switch (gfp.VBR) {
              case VbrMode2.vbr_off: {
                var lh = new LowPassHighPass();
                optimum_bandwidth(lh, gfp.brate);
                lowpass = lh.lowerlimit;
                break;
              }
              case VbrMode2.vbr_abr: {
                var lh = new LowPassHighPass();
                optimum_bandwidth(lh, gfp.VBR_mean_bitrate_kbps);
                lowpass = lh.lowerlimit;
                break;
              }
              case VbrMode2.vbr_rh: {
                abort();
              }
              default: {
                abort();
              }
            }
            if (gfp.mode == MPEGMode2.MONO && (gfp.VBR == VbrMode2.vbr_off || gfp.VBR == VbrMode2.vbr_abr))
              lowpass *= 1.5;
            gfp.lowpassfreq = lowpass | 0;
          }
          if (gfp.out_samplerate == 0) {
            abort();
          }
          gfp.lowpassfreq = Math.min(20500, gfp.lowpassfreq);
          gfp.lowpassfreq = Math.min(gfp.out_samplerate / 2, gfp.lowpassfreq);
          if (gfp.VBR == VbrMode2.vbr_off) {
            gfp.compression_ratio = gfp.out_samplerate * 16 * gfc.channels_out / (1e3 * gfp.brate);
          }
          if (gfp.VBR == VbrMode2.vbr_abr) {
            abort();
          }
          if (!gfp.bWriteVbrTag) {
            gfp.findReplayGain = false;
            gfp.decode_on_the_fly = false;
            gfc.findPeakSample = false;
          }
          gfc.findReplayGain = gfp.findReplayGain;
          gfc.decode_on_the_fly = gfp.decode_on_the_fly;
          if (gfc.decode_on_the_fly)
            gfc.findPeakSample = true;
          if (gfc.findReplayGain) {
            abort();
          }
          if (gfc.decode_on_the_fly && !gfp.decode_only) {
            abort();
          }
          gfc.mode_gr = gfp.out_samplerate <= 24e3 ? 1 : 2;
          gfp.framesize = 576 * gfc.mode_gr;
          gfp.encoder_delay = Encoder2.ENCDELAY;
          gfc.resample_ratio = gfp.in_samplerate / gfp.out_samplerate;
          switch (gfp.VBR) {
            case VbrMode2.vbr_mt:
            case VbrMode2.vbr_rh:
            case VbrMode2.vbr_mtrh:
              {
                var cmp = [
                  5.7,
                  6.5,
                  7.3,
                  8.2,
                  10,
                  11.9,
                  13,
                  14,
                  15,
                  16.5
                ];
                gfp.compression_ratio = cmp[gfp.VBR_q];
              }
              break;
            case VbrMode2.vbr_abr:
              gfp.compression_ratio = gfp.out_samplerate * 16 * gfc.channels_out / (1e3 * gfp.VBR_mean_bitrate_kbps);
              break;
            default:
              gfp.compression_ratio = gfp.out_samplerate * 16 * gfc.channels_out / (1e3 * gfp.brate);
              break;
          }
          if (gfp.mode == MPEGMode2.NOT_SET) {
            gfp.mode = MPEGMode2.JOINT_STEREO;
          }
          if (gfp.highpassfreq > 0) {
            abort();
          } else {
            gfc.highpass1 = 0;
            gfc.highpass2 = 0;
          }
          if (gfp.lowpassfreq > 0) {
            gfc.lowpass2 = 2 * gfp.lowpassfreq;
            if (gfp.lowpasswidth >= 0) {
              abort();
            } else {
              gfc.lowpass1 = (1 - 0) * 2 * gfp.lowpassfreq;
            }
            gfc.lowpass1 /= gfp.out_samplerate;
            gfc.lowpass2 /= gfp.out_samplerate;
          } else {
            abort();
          }
          lame_init_params_ppflt(gfp);
          gfc.samplerate_index = SmpFrqIndex(gfp.out_samplerate, gfp);
          if (gfc.samplerate_index < 0) {
            abort();
          }
          if (gfp.VBR == VbrMode2.vbr_off) {
            if (gfp.free_format) {
              gfc.bitrate_index = 0;
            } else {
              gfp.brate = FindNearestBitrate(
                gfp.brate,
                gfp.version,
                gfp.out_samplerate
              );
              gfc.bitrate_index = BitrateIndex(
                gfp.brate,
                gfp.version,
                gfp.out_samplerate
              );
              if (gfc.bitrate_index <= 0) {
                abort();
              }
            }
          } else {
            gfc.bitrate_index = 1;
          }
          if (gfp.analysis)
            gfp.bWriteVbrTag = false;
          if (gfc.pinfo != null)
            gfp.bWriteVbrTag = false;
          bs.init_bit_stream_w(gfc);
          var j = gfc.samplerate_index + 3 * gfp.version + 6 * (gfp.out_samplerate < 16e3 ? 1 : 0);
          for (var i = 0; i < Encoder2.SBMAX_l + 1; i++)
            gfc.scalefac_band.l[i] = qupvt.sfBandIndex[j].l[i];
          for (var i = 0; i < Encoder2.PSFB21 + 1; i++) {
            var size = (gfc.scalefac_band.l[22] - gfc.scalefac_band.l[21]) / Encoder2.PSFB21;
            var start = gfc.scalefac_band.l[21] + i * size;
            gfc.scalefac_band.psfb21[i] = start;
          }
          gfc.scalefac_band.psfb21[Encoder2.PSFB21] = 576;
          for (var i = 0; i < Encoder2.SBMAX_s + 1; i++)
            gfc.scalefac_band.s[i] = qupvt.sfBandIndex[j].s[i];
          for (var i = 0; i < Encoder2.PSFB12 + 1; i++) {
            var size = (gfc.scalefac_band.s[13] - gfc.scalefac_band.s[12]) / Encoder2.PSFB12;
            var start = gfc.scalefac_band.s[12] + i * size;
            gfc.scalefac_band.psfb12[i] = start;
          }
          gfc.scalefac_band.psfb12[Encoder2.PSFB12] = 192;
          if (gfp.version == 1)
            gfc.sideinfo_len = gfc.channels_out == 1 ? 4 + 17 : 4 + 32;
          else
            gfc.sideinfo_len = gfc.channels_out == 1 ? 4 + 9 : 4 + 17;
          if (gfp.error_protection)
            gfc.sideinfo_len += 2;
          lame_init_bitstream(gfp);
          gfc.Class_ID = LAME_ID;
          {
            var k2;
            for (k2 = 0; k2 < 19; k2++)
              gfc.nsPsy.pefirbuf[k2] = 700 * gfc.mode_gr * gfc.channels_out;
            if (gfp.ATHtype == -1)
              gfp.ATHtype = 4;
          }
          switch (gfp.VBR) {
            case VbrMode2.vbr_mt:
              gfp.VBR = VbrMode2.vbr_mtrh;
            case VbrMode2.vbr_mtrh: {
              if (gfp.useTemporal == null) {
                gfp.useTemporal = false;
              }
              p2.apply_preset(gfp, 500 - gfp.VBR_q * 10, 0);
              if (gfp.quality < 0)
                gfp.quality = LAME_DEFAULT_QUALITY;
              if (gfp.quality < 5)
                gfp.quality = 0;
              if (gfp.quality > 5)
                gfp.quality = 5;
              gfc.PSY.mask_adjust = gfp.maskingadjust;
              gfc.PSY.mask_adjust_short = gfp.maskingadjust_short;
              if (gfp.experimentalY)
                gfc.sfb21_extra = false;
              else
                gfc.sfb21_extra = gfp.out_samplerate > 44e3;
              gfc.iteration_loop = new VBRNewIterationLoop(qu);
              break;
            }
            case VbrMode2.vbr_rh: {
              p2.apply_preset(gfp, 500 - gfp.VBR_q * 10, 0);
              gfc.PSY.mask_adjust = gfp.maskingadjust;
              gfc.PSY.mask_adjust_short = gfp.maskingadjust_short;
              if (gfp.experimentalY)
                gfc.sfb21_extra = false;
              else
                gfc.sfb21_extra = gfp.out_samplerate > 44e3;
              if (gfp.quality > 6)
                gfp.quality = 6;
              if (gfp.quality < 0)
                gfp.quality = LAME_DEFAULT_QUALITY;
              gfc.iteration_loop = new VBROldIterationLoop(qu);
              break;
            }
            default: {
              var vbrmode;
              gfc.sfb21_extra = false;
              if (gfp.quality < 0)
                gfp.quality = LAME_DEFAULT_QUALITY;
              vbrmode = gfp.VBR;
              if (vbrmode == VbrMode2.vbr_off)
                gfp.VBR_mean_bitrate_kbps = gfp.brate;
              p2.apply_preset(gfp, gfp.VBR_mean_bitrate_kbps, 0);
              gfp.VBR = vbrmode;
              gfc.PSY.mask_adjust = gfp.maskingadjust;
              gfc.PSY.mask_adjust_short = gfp.maskingadjust_short;
              if (vbrmode == VbrMode2.vbr_off) {
                gfc.iteration_loop = new CBRNewIterationLoop2(qu);
              } else {
                abort();
              }
              break;
            }
          }
          if (gfp.VBR != VbrMode2.vbr_off) {
            abort();
          }
          if (gfp.tune) {
            abort();
          }
          lame_init_qval(gfp);
          if (gfp.athaa_type < 0)
            gfc.ATH.useAdjust = 3;
          else
            gfc.ATH.useAdjust = gfp.athaa_type;
          gfc.ATH.aaSensitivityP = Math.pow(10, gfp.athaa_sensitivity / -10);
          if (gfp.short_blocks == null) {
            gfp.short_blocks = ShortBlock2.short_block_allowed;
          }
          if (gfp.short_blocks == ShortBlock2.short_block_allowed && (gfp.mode == MPEGMode2.JOINT_STEREO || gfp.mode == MPEGMode2.STEREO)) {
            gfp.short_blocks = ShortBlock2.short_block_coupled;
          }
          if (gfp.quant_comp < 0)
            gfp.quant_comp = 1;
          if (gfp.quant_comp_short < 0)
            gfp.quant_comp_short = 0;
          if (gfp.msfix < 0)
            gfp.msfix = 0;
          gfp.exp_nspsytune = gfp.exp_nspsytune | 1;
          if (gfp.internal_flags.nsPsy.attackthre < 0)
            gfp.internal_flags.nsPsy.attackthre = PsyModel2.NSATTACKTHRE;
          if (gfp.internal_flags.nsPsy.attackthre_s < 0)
            gfp.internal_flags.nsPsy.attackthre_s = PsyModel2.NSATTACKTHRE_S;
          if (gfp.scale < 0)
            gfp.scale = 1;
          if (gfp.ATHtype < 0)
            gfp.ATHtype = 4;
          if (gfp.ATHcurve < 0)
            gfp.ATHcurve = 4;
          if (gfp.athaa_loudapprox < 0)
            gfp.athaa_loudapprox = 2;
          if (gfp.interChRatio < 0)
            gfp.interChRatio = 0;
          if (gfp.useTemporal == null)
            gfp.useTemporal = true;
          gfc.slot_lag = gfc.frac_SpF = 0;
          if (gfp.VBR == VbrMode2.vbr_off)
            gfc.slot_lag = gfc.frac_SpF = (gfp.version + 1) * 72e3 * gfp.brate % gfp.out_samplerate | 0;
          qupvt.iteration_init(gfp);
          psy.psymodel_init(gfp);
          return 0;
        };
        function update_inbuffer_size(gfc, nsamples) {
          if (gfc.in_buffer_0 == null || gfc.in_buffer_nsamples < nsamples) {
            gfc.in_buffer_0 = new_float2(nsamples);
            gfc.in_buffer_1 = new_float2(nsamples);
            gfc.in_buffer_nsamples = nsamples;
          }
        }
        this.lame_encode_flush = function(gfp, mp3buffer, mp3bufferPos, mp3buffer_size) {
          var gfc = gfp.internal_flags;
          var buffer = new_short_n2([2, 1152]);
          var imp3 = 0, mp3count, mp3buffer_size_remaining;
          var end_padding;
          var frames_left;
          var samples_to_encode = gfc.mf_samples_to_encode - Encoder2.POSTDELAY;
          var mf_needed = calcNeeded(gfp);
          if (gfc.mf_samples_to_encode < 1) {
            return 0;
          }
          mp3count = 0;
          if (gfp.in_samplerate != gfp.out_samplerate) {
            abort();
          }
          end_padding = gfp.framesize - samples_to_encode % gfp.framesize;
          if (end_padding < 576)
            end_padding += gfp.framesize;
          gfp.encoder_padding = end_padding;
          frames_left = (samples_to_encode + end_padding) / gfp.framesize;
          while (frames_left > 0 && imp3 >= 0) {
            var bunch = mf_needed - gfc.mf_size;
            var frame_num = gfp.frameNum;
            bunch *= gfp.in_samplerate;
            bunch /= gfp.out_samplerate;
            if (bunch > 1152)
              bunch = 1152;
            if (bunch < 1)
              bunch = 1;
            mp3buffer_size_remaining = mp3buffer_size - mp3count;
            if (mp3buffer_size == 0)
              mp3buffer_size_remaining = 0;
            imp3 = this.lame_encode_buffer(
              gfp,
              buffer[0],
              buffer[1],
              bunch,
              mp3buffer,
              mp3bufferPos,
              mp3buffer_size_remaining
            );
            mp3bufferPos += imp3;
            mp3count += imp3;
            frames_left -= frame_num != gfp.frameNum ? 1 : 0;
          }
          gfc.mf_samples_to_encode = 0;
          if (imp3 < 0) {
            return imp3;
          }
          mp3buffer_size_remaining = mp3buffer_size - mp3count;
          if (mp3buffer_size == 0)
            mp3buffer_size_remaining = 0;
          bs.flush_bitstream(gfp);
          imp3 = bs.copy_buffer(
            gfc,
            mp3buffer,
            mp3bufferPos,
            mp3buffer_size_remaining,
            1
          );
          if (imp3 < 0) {
            return imp3;
          }
          mp3bufferPos += imp3;
          mp3count += imp3;
          mp3buffer_size_remaining = mp3buffer_size - mp3count;
          if (mp3buffer_size == 0)
            mp3buffer_size_remaining = 0;
          if (gfp.write_id3tag_automatic) {
            abort();
          }
          return mp3count;
        };
        this.lame_encode_buffer = function(gfp, buffer_l, buffer_r, nsamples, mp3buf, mp3bufPos, mp3buf_size) {
          var gfc = gfp.internal_flags;
          var in_buffer = [null, null];
          if (gfc.Class_ID != LAME_ID)
            return -3;
          if (nsamples == 0)
            return 0;
          update_inbuffer_size(gfc, nsamples);
          in_buffer[0] = gfc.in_buffer_0;
          in_buffer[1] = gfc.in_buffer_1;
          for (var i = 0; i < nsamples; i++) {
            in_buffer[0][i] = buffer_l[i];
            if (gfc.channels_in > 1)
              in_buffer[1][i] = buffer_r[i];
          }
          return lame_encode_buffer_sample(
            gfp,
            in_buffer[0],
            in_buffer[1],
            nsamples,
            mp3buf,
            mp3bufPos,
            mp3buf_size
          );
        };
        function calcNeeded(gfp) {
          var mf_needed = Encoder2.BLKSIZE + gfp.framesize - Encoder2.FFTOFFSET;
          mf_needed = Math.max(mf_needed, 512 + gfp.framesize - 32);
          return mf_needed;
        }
        function lame_encode_buffer_sample(gfp, buffer_l, buffer_r, nsamples, mp3buf, mp3bufPos, mp3buf_size) {
          var gfc = gfp.internal_flags;
          var mp3size = 0, ret, i, ch, mf_needed;
          var mp3out;
          var mfbuf = [null, null];
          var in_buffer = [null, null];
          if (gfc.Class_ID != LAME_ID)
            return -3;
          if (nsamples == 0)
            return 0;
          mp3out = bs.copy_buffer(gfc, mp3buf, mp3bufPos, mp3buf_size, 0);
          if (mp3out < 0)
            return mp3out;
          mp3bufPos += mp3out;
          mp3size += mp3out;
          in_buffer[0] = buffer_l;
          in_buffer[1] = buffer_r;
          if (BitStream.NEQ(gfp.scale, 0) && BitStream.NEQ(gfp.scale, 1)) {
            for (i = 0; i < nsamples; ++i) {
              in_buffer[0][i] *= gfp.scale;
              if (gfc.channels_out == 2)
                in_buffer[1][i] *= gfp.scale;
            }
          }
          if (BitStream.NEQ(gfp.scale_left, 0) && BitStream.NEQ(gfp.scale_left, 1)) {
            for (i = 0; i < nsamples; ++i) {
              in_buffer[0][i] *= gfp.scale_left;
            }
          }
          if (BitStream.NEQ(gfp.scale_right, 0) && BitStream.NEQ(gfp.scale_right, 1)) {
            for (i = 0; i < nsamples; ++i) {
              in_buffer[1][i] *= gfp.scale_right;
            }
          }
          if (gfp.num_channels == 2 && gfc.channels_out == 1) {
            abort();
          }
          mf_needed = calcNeeded(gfp);
          mfbuf[0] = gfc.mfbuf[0];
          mfbuf[1] = gfc.mfbuf[1];
          var in_bufferPos = 0;
          while (nsamples > 0) {
            var in_buffer_ptr = [null, null];
            var n_in = 0;
            var n_out = 0;
            in_buffer_ptr[0] = in_buffer[0];
            in_buffer_ptr[1] = in_buffer[1];
            var inOut = new InOut();
            fill_buffer(
              gfp,
              mfbuf,
              in_buffer_ptr,
              in_bufferPos,
              nsamples,
              inOut
            );
            n_in = inOut.n_in;
            n_out = inOut.n_out;
            if (gfc.findReplayGain && !gfc.decode_on_the_fly) {
              if (ga.AnalyzeSamples(
                gfc.rgdata,
                mfbuf[0],
                gfc.mf_size,
                mfbuf[1],
                gfc.mf_size,
                n_out,
                gfc.channels_out
              ) == GainAnalysis2.GAIN_ANALYSIS_ERROR)
                return -6;
            }
            nsamples -= n_in;
            in_bufferPos += n_in;
            if (gfc.channels_out == 2)
              ;
            gfc.mf_size += n_out;
            if (gfc.mf_samples_to_encode < 1) {
              abort();
            }
            gfc.mf_samples_to_encode += n_out;
            if (gfc.mf_size >= mf_needed) {
              var buf_size = mp3buf_size - mp3size;
              if (mp3buf_size == 0)
                buf_size = 0;
              ret = lame_encode_frame(
                gfp,
                mfbuf[0],
                mfbuf[1],
                mp3buf,
                mp3bufPos,
                buf_size
              );
              if (ret < 0)
                return ret;
              mp3bufPos += ret;
              mp3size += ret;
              gfc.mf_size -= gfp.framesize;
              gfc.mf_samples_to_encode -= gfp.framesize;
              for (ch = 0; ch < gfc.channels_out; ch++)
                for (i = 0; i < gfc.mf_size; i++)
                  mfbuf[ch][i] = mfbuf[ch][i + gfp.framesize];
            }
          }
          return mp3size;
        }
        function lame_encode_frame(gfp, inbuf_l, inbuf_r, mp3buf, mp3bufPos, mp3buf_size) {
          var ret = self2.enc.lame_encode_mp3_frame(
            gfp,
            inbuf_l,
            inbuf_r,
            mp3buf,
            mp3bufPos,
            mp3buf_size
          );
          gfp.frameNum++;
          return ret;
        }
        function InOut() {
          this.n_in = 0;
          this.n_out = 0;
        }
        function fill_buffer(gfp, mfbuf, in_buffer, in_bufferPos, nsamples, io) {
          var gfc = gfp.internal_flags;
          if (gfc.resample_ratio < 0.9999 || gfc.resample_ratio > 1.0001) {
            abort();
          } else {
            io.n_out = Math.min(gfp.framesize, nsamples);
            io.n_in = io.n_out;
            for (var i = 0; i < io.n_out; ++i) {
              mfbuf[0][gfc.mf_size + i] = in_buffer[0][in_bufferPos + i];
              if (gfc.channels_out == 2)
                mfbuf[1][gfc.mf_size + i] = in_buffer[1][in_bufferPos + i];
            }
          }
        }
      }
      function GetAudio() {
        this.setModules = function(parse2, mpg2) {
        };
      }
      function Parse() {
        this.setModules = function(ver2, id32, pre2) {
        };
      }
      function MPGLib() {
      }
      function ID3Tag() {
        this.setModules = function(_bits, _ver) {
        };
      }
      function Mp3Encoder(channels, samplerate, kbps) {
        if (channels != 1) {
          abort("fix cc: only supports mono");
        }
        var lame = new Lame2();
        var gaud = new GetAudio();
        var ga = new GainAnalysis2();
        var bs = new BitStream();
        var p2 = new Presets();
        var qupvt = new QuantizePVT();
        var qu = new Quantize();
        var vbr = new VBRTag2();
        var ver = new Version();
        var id3 = new ID3Tag();
        var rv = new Reservoir();
        var tak = new Takehiro();
        var parse = new Parse();
        var mpg = new MPGLib();
        lame.setModules(ga, bs, p2, qupvt, qu, vbr, ver, id3, mpg);
        bs.setModules(ga, mpg, ver, vbr);
        id3.setModules(bs, ver);
        p2.setModules(lame);
        qu.setModules(bs, rv, qupvt, tak);
        qupvt.setModules(tak, rv, lame.enc.psy);
        rv.setModules(bs);
        tak.setModules(qupvt);
        vbr.setModules(lame, bs, ver);
        gaud.setModules(parse, mpg);
        parse.setModules(ver, id3, p2);
        var gfp = lame.lame_init();
        gfp.num_channels = channels;
        gfp.in_samplerate = samplerate;
        gfp.out_samplerate = samplerate;
        gfp.brate = kbps;
        gfp.mode = MPEGMode2.STEREO;
        gfp.quality = 3;
        gfp.bWriteVbrTag = false;
        gfp.disable_reservoir = true;
        gfp.write_id3tag_automatic = false;
        lame.lame_init_params(gfp);
        var maxSamples = 1152;
        var mp3buf_size = 0 | 1.25 * maxSamples + 7200;
        var mp3buf = new_byte2(mp3buf_size);
        this.encodeBuffer = function(left, right) {
          if (channels == 1) {
            right = left;
          }
          if (left.length > maxSamples) {
            maxSamples = left.length;
            mp3buf_size = 0 | 1.25 * maxSamples + 7200;
            mp3buf = new_byte2(mp3buf_size);
          }
          var _sz = lame.lame_encode_buffer(gfp, left, right, left.length, mp3buf, 0, mp3buf_size);
          return new Int8Array(mp3buf.subarray(0, _sz));
        };
        this.flush = function() {
          var _sz = lame.lame_encode_flush(gfp, mp3buf, 0, mp3buf_size);
          return new Int8Array(mp3buf.subarray(0, _sz));
        };
      }
      L3Side2.SFBMAX = Encoder2.SBMAX_s * 3;
      lamejs.Mp3Encoder = Mp3Encoder;
    }
    lamejs();
    Recorder2.lamejs = lamejs;
  });
  (function(factory) {
    var browser = typeof window == "object" && !!window.document;
    var win = browser ? window : Object;
    var rec = win.Recorder, ni = rec.i18n;
    factory(rec, ni, ni.$T, browser);
  })(function(Recorder2, i18n, $T, isBrowser) {
    Recorder2.prototype.enc_wav = {
      stable: true,
      fast: true,
      getTestMsg: function() {
        return $T("gPSE::支持位数8位、16位(填在比特率里面),采样率取值无限制;此编码器仅在pcm数据前加了一个44字节的wav头,编码出来的16位wav文件去掉开头的44字节即可得到pcm(注:其他wav编码器可能不是44字节)");
      }
    };
    var NormalizeSet = function(set) {
      var bS = set.bitRate, b = bS == 8 ? 8 : 16;
      if (bS != b) Recorder2.CLog($T("wyw9::WAV Info: 不支持{1}位,已更新成{2}位", 0, bS, b), 3);
      set.bitRate = b;
    };
    Recorder2.prototype.wav = function(res, True, False) {
      var This = this, set = This.set;
      NormalizeSet(set);
      var size = res.length, sampleRate = set.sampleRate, bitRate = set.bitRate;
      var dataLength = size * (bitRate / 8);
      var header = Recorder2.wav_header(1, 1, sampleRate, bitRate, dataLength);
      var offset = header.length;
      var bytes = new Uint8Array(offset + dataLength);
      bytes.set(header);
      if (bitRate == 8) {
        for (var i = 0; i < size; i++) {
          var val = (res[i] >> 8) + 128;
          bytes[offset++] = val;
        }
      } else {
        bytes = new Int16Array(bytes.buffer);
        bytes.set(res, offset / 2);
      }
      True(bytes.buffer, "audio/wav");
    };
    Recorder2.wav_header = function(format, numCh, sampleRate, bitRate, dataLength) {
      var extSize = format == 1 ? 0 : 2;
      var buffer = new ArrayBuffer(44 + extSize);
      var data = new DataView(buffer);
      var offset = 0;
      var writeString = function(str) {
        for (var i = 0; i < str.length; i++, offset++) {
          data.setUint8(offset, str.charCodeAt(i));
        }
      };
      var write16 = function(v) {
        data.setUint16(offset, v, true);
        offset += 2;
      };
      var write32 = function(v) {
        data.setUint32(offset, v, true);
        offset += 4;
      };
      writeString("RIFF");
      write32(36 + extSize + dataLength);
      writeString("WAVE");
      writeString("fmt ");
      write32(16 + extSize);
      write16(format);
      write16(numCh);
      write32(sampleRate);
      write32(sampleRate * (numCh * bitRate / 8));
      write16(numCh * bitRate / 8);
      write16(bitRate);
      if (format != 1) {
        write16(0);
      }
      writeString("data");
      write32(dataLength);
      return new Uint8Array(buffer);
    };
  });
  Recorder.Wav2Other = function(newSet, wavBlob, True, False) {
    const reader = new FileReader();
    reader.onloadend = function() {
      const wavView = new Uint8Array(reader.result);
      const eq = function(p2, s) {
        for (var i2 = 0; i2 < s.length; i2++) {
          if (wavView[p2 + i2] != s.charCodeAt(i2)) {
            return false;
          }
        }
        return true;
      };
      let pcm;
      if (eq(0, "RIFF") && eq(8, "WAVEfmt ")) {
        var numCh = wavView[22];
        if (wavView[20] == 1 && (numCh == 1 || numCh == 2)) {
          var sampleRate = wavView[24] + (wavView[25] << 8) + (wavView[26] << 16) + (wavView[27] << 24);
          var bitRate = wavView[34] + (wavView[35] << 8);
          var dataPos = 0;
          for (var i = 12, iL = wavView.length - 8; i < iL; ) {
            if (wavView[i] == 100 && wavView[i + 1] == 97 && wavView[i + 2] == 116 && wavView[i + 3] == 97) {
              dataPos = i + 8;
              break;
            }
            i += 4;
            i += 4 + wavView[i] + (wavView[i + 1] << 8) + (wavView[i + 2] << 16) + (wavView[i + 3] << 24);
          }
          console.log("wav info", sampleRate, bitRate, numCh, dataPos);
          if (dataPos) {
            if (bitRate == 16) {
              pcm = new Int16Array(wavView.buffer.slice(dataPos));
            } else if (bitRate == 8) {
              pcm = new Int16Array(wavView.length - dataPos);
              for (var j = dataPos, d = 0; j < wavView.length; j++, d++) {
                var b = wavView[j];
                pcm[d] = b - 128 << 8;
              }
            }
          }
          if (pcm && numCh == 2) {
            var pcm1 = new Int16Array(pcm.length / 2);
            for (var i = 0; i < pcm1.length; i++) {
              pcm1[i] = (pcm[i * 2] + pcm[i * 2 + 1]) / 2;
            }
            pcm = pcm1;
          }
        }
      }
      if (!pcm) {
        False && False("非单或双声道wav raw pcm格式音频,无法转码");
        return;
      }
      var rec = Recorder(newSet).mock(pcm, sampleRate);
      rec.stop(function(blob, duration) {
        True(blob, duration, rec);
      }, False);
    };
    reader.readAsArrayBuffer(wavBlob);
  };
  const transWavBlob = async (wavBlob, fileName, total, cd, currentIndex) => {
    if (!wavBlob) {
      return;
    }
    var set = {
      type: "mp3",
      sampleRate: 48e3,
      bitRate: 96
    };
    setTimeout(() => {
      Recorder.Wav2Other(
        set,
        wavBlob,
        function(blob, duration, rec) {
          console.log(
            blob,
            (window.URL || webkitURL).createObjectURL(blob),
            "log——audio",
            total + "process"
          );
          window.toAudioCount++;
          const url = URL.createObjectURL(blob);
          const link = document.createElement("a");
          link.href = url;
          link.setAttribute("download", fileName + ".mp3");
          document.body.appendChild(link);
          link.click();
          document.body.removeChild(link);
          URL.revokeObjectURL(url);
          if (window.toAudioCount === total - 1) {
            cd();
          }
        },
        function(msg) {
        }
      );
    }, currentIndex * 200);
  };
  const syncRecursive = (data, index, callback, asnyCallback) => {
    if (index >= data.length) {
      const audio2 = document.querySelector("audio");
      audio2.muted = false;
      callback(data);
      return;
    }
    console.log("Processing data:", data[index]);
    if (asnyCallback) asnyCallback(index);
    const audio = document.querySelector("audio");
    if (index !== 1) {
      audio.muted = true;
    }
    data[index] = { ...data[index], downUrl: audio.src };
    const btn = document.querySelector(".btn_big_next");
    btn.click();
    setTimeout(() => {
      syncRecursive(data, index + 1, callback, asnyCallback);
    }, 2e3);
  };
  const splitAndMoveElement = (arr, targetId) => {
    const targetIndex = arr.findIndex((item) => item.id === targetId);
    if (targetIndex === -1) {
      return arr;
    } else if (targetIndex === 0) {
      return arr;
    }
    const afterTargetElements = arr.slice(targetIndex);
    const beforeTargetElements = arr.slice(0, targetIndex - 1);
    return [...afterTargetElements, ...beforeTargetElements];
  };
  const blobToAwv = (buffer, fileName, total, cd, currentIndex) => {
    const audioCtx = new AudioContext();
    audioCtx.decodeAudioData(buffer, async function(audioBuffer) {
      const blob = bufferToWave(audioBuffer, audioBuffer.sampleRate * audioBuffer.duration);
      transWavBlob(blob, fileName, total, cd, currentIndex);
    });
  };
  function bufferToWave(abuffer, len) {
    var numOfChan = abuffer.numberOfChannels, length = len * numOfChan * 2 + 44, buffer = new ArrayBuffer(length), view = new DataView(buffer), channels = [], i, sample, offset = 0, pos = 0;
    setUint32(1179011410);
    setUint32(length - 8);
    setUint32(1163280727);
    setUint32(544501094);
    setUint32(16);
    setUint16(1);
    setUint16(numOfChan);
    setUint32(abuffer.sampleRate);
    setUint32(abuffer.sampleRate * 2 * numOfChan);
    setUint16(numOfChan * 2);
    setUint16(16);
    setUint32(1635017060);
    setUint32(length - pos - 4);
    for (i = 0; i < abuffer.numberOfChannels; i++)
      channels.push(abuffer.getChannelData(i));
    while (pos < length) {
      for (i = 0; i < numOfChan; i++) {
        if (channels[i][offset] !== void 0) {
          sample = Math.max(-1, Math.min(1, channels[i][offset]));
          sample = (0.5 + sample < 0 ? sample * 32768 : sample * 32767) | 0;
          view.setInt16(pos, sample, true);
          pos += 2;
        } else {
          pos += 2;
          break;
        }
      }
      offset++;
    }
    return new Blob([buffer], { type: "audio/wav" });
    function setUint16(data) {
      view.setUint16(pos, data, true);
      pos += 2;
    }
    function setUint32(data) {
      view.setUint32(pos, data, true);
      pos += 4;
    }
  }
  class FileDownloader {
    constructor(maxConcurrentDownloads = 1) {
      __publicField(this, "maxConcurrentDownloads");
      __publicField(this, "downloadQueue");
      __publicField(this, "numActiveDownloads");
      this.maxConcurrentDownloads = maxConcurrentDownloads;
      this.downloadQueue = [];
      this.numActiveDownloads = 0;
    }
    addToDownloadQueue(fileUrl, fileName, cd) {
      this.downloadQueue.push({ fileUrl, fileName });
      this.processDownloadQueue(cd);
    }
    processDownloadQueue(cd) {
      while (this.numActiveDownloads < this.maxConcurrentDownloads && this.downloadQueue.length > 0) {
        const { fileUrl, fileName } = this.downloadQueue.shift();
        this.startDownload(fileUrl, fileName, cd);
      }
    }
    startDownload(fileUrl, fileName, cd) {
      this.numActiveDownloads++;
      fetch(fileUrl).then((response) => {
        return response.arrayBuffer();
      }).then((blob) => {
        let buffer = blob;
        blobToAwv(buffer, fileName, this.maxConcurrentDownloads, cd, this.numActiveDownloads);
      }).catch((error) => {
        console.error("Error downloading file:", error);
      }).finally(() => {
        this.numActiveDownloads--;
        this.processDownloadQueue(cd);
      });
    }
    downloadFile(blob, fileName) {
      const url = URL.createObjectURL(blob);
      const link = document.createElement("a");
      link.href = url;
      link.setAttribute("download", fileName + ".mp3");
      document.body.appendChild(link);
      link.click();
      document.body.removeChild(link);
      URL.revokeObjectURL(url);
    }
    //   async downloadFileConvert(response: any, fileName: any) {
    //     const file = new File([await response.blob()], fileName, { type: response.headers.get('content-type') });
    //     const formData = new FormData();
    //     formData.append('file', file);
    //     formData.append('targetformat', 'mp3');
    //     formData.append('audiobitratetype', "0");
    //     formData.append('customaudiobitrate', "");
    //     formData.append('audiosamplingtype', "0");
    //     formData.append('customaudiosampling', "");
    //     formData.append('code', "82000");
    //     formData.append('filelocation', "local");
    //     formData.append('legal', "Our PHP programs can only be used in aconvert.com. We DO NOT allow using our PHP programs in any third-party websites, software or apps. We will report abuse to your cloud provider, Google Play and App store if illegal usage found!");
    //     const uploadResponse: any = await fetch('/postFilesToMp3/convert/convert9.php', {
    //       method: 'POST',
    //       body: formData,
    //     });
    //     if (uploadResponse.state === "SUCCESS") {
    //       console.log('SUCCESS');
    //     } else {
    //       console.error('Error uploading file:', await uploadResponse.text());
    //     }
    //   }
  }
  function App(props) {
    const [loadding, setLoading] = require$$0.useState(false);
    const [process, setProcess] = require$$0.useState(0);
    const [totalNum, setTotalNum] = require$$0.useState(0);
    const [isGetMp3, setIsGetMp3] = require$$0.useState(false);
    require$$0.useEffect(() => {
      if (!window.isExceOne) {
        window.isExceOne = true;
        const msg = confirm(
          "是否下载播放列表音乐.tip: 下载网页播放器内全部音乐,若需要挑选请点击取消,修改播放器内音乐,刷新页面点击确认等待全部下载!!!"
        );
        if (msg === true) {
          setLoading(true);
          const body = document.querySelector("#app");
          body.style.visibility = "hidden";
          const addXMLRequestCallback = (callback) => {
            let oldSend = null;
            let i = null;
            if (XMLHttpRequest.callbacks) {
              XMLHttpRequest.callbacks.push(callback);
            } else {
              XMLHttpRequest.callbacks = [callback];
              oldSend = XMLHttpRequest.prototype.send;
              XMLHttpRequest.prototype.send = function() {
                for (i = 0; i < XMLHttpRequest.callbacks.length; i++) {
                  XMLHttpRequest.callbacks[i](this);
                }
                oldSend.apply(this, arguments);
              };
            }
          };
          addXMLRequestCallback((xhr) => {
            xhr.addEventListener("loadend", function() {
              var _a, _b, _c;
              if (xhr.readyState == 4 && xhr.status == 200) {
                if (xhr.responseURL.indexOf("cgi-bin/musics.fcg") !== -1) {
                  let list = JSON.parse(xhr.response);
                  let preUrl = void 0;
                  let songList = void 0;
                  let songId = void 0;
                  let songName = void 0;
                  (_a = Object.keys(list)) == null ? void 0 : _a.forEach((item) => {
                    var _a2, _b2, _c2, _d, _e, _f, _g, _h;
                    if (preUrl === void 0) {
                      preUrl = (_d = (_c2 = (_b2 = (_a2 = list[item]) == null ? void 0 : _a2.data) == null ? void 0 : _b2.midurlinfo) == null ? void 0 : _c2[0]) == null ? void 0 : _d.purl;
                    }
                    if (songList === void 0) {
                      songList = (_f = (_e = list[item]) == null ? void 0 : _e.data) == null ? void 0 : _f.tracks;
                    }
                    if (songId === void 0) {
                      songId = (_h = (_g = list[item]) == null ? void 0 : _g.data) == null ? void 0 : _h.songID;
                    }
                  });
                  if (songId !== void 0) {
                    songName = (_c = (_b = songList == null ? void 0 : songList.filter(
                      (item) => (item == null ? void 0 : item.id) === songId
                    )) == null ? void 0 : _b[0]) == null ? void 0 : _c.name;
                    songList == null ? void 0 : songList.findIndex(
                      (item) => (item == null ? void 0 : item.id) === songId
                    );
                    songList = splitAndMoveElement(songList, songId);
                    setTotalNum(songList == null ? void 0 : songList.length);
                  }
                  if (preUrl !== void 0 && songName !== void 0) {
                    const btn = document.querySelector(".btn_big_next");
                    btn.click();
                    songList[0] = {
                      ...songList[0],
                      downUrl: "https://ws6.stream.qqmusic.qq.com/" + preUrl
                    };
                    syncRecursive(
                      songList,
                      1,
                      (data) => {
                        console.log(data, "allData");
                        const fileDownloader2 = new FileDownloader(
                          songList == null ? void 0 : songList.length
                        );
                        songList == null ? void 0 : songList.forEach((item, i) => {
                          setTimeout(() => {
                            fileDownloader2.addToDownloadQueue(
                              item == null ? void 0 : item.downUrl,
                              item == null ? void 0 : item.title,
                              () => {
                                const body2 = document.querySelector("#app");
                                body2.style.visibility = "visible";
                                setLoading(false);
                              }
                            );
                          }, 800 * i);
                        });
                      },
                      (index) => {
                        setIsGetMp3(false);
                        if (process === totalNum) {
                          setIsGetMp3(true);
                        }
                        setProcess(index);
                      }
                    );
                    console.log(preUrl, "aaaa");
                  }
                }
              }
            });
          });
        }
      }
    }, []);
    return loadding ? /* @__PURE__ */ jsxRuntimeExports.jsxs(
      "div",
      {
        style: {
          width: "100%",
          height: "100vh",
          zIndex: 999999,
          background: "#cecece",
          fontSize: 24,
          color: "white",
          position: "absolute",
          top: 0,
          left: 0
        },
        children: [
          isGetMp3 ? "转换mp3文件中...(需要一段时间请耐心等待)" : "获取下载链接中...",
          " ",
          "(" + process + "/" + totalNum + ")"
        ]
      }
    ) : /* @__PURE__ */ jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment, {});
  }
  const fileDownloader = new FileDownloader(10);
  client.createRoot(
    (() => {
      const app = document.createElement("div");
      document.body.append(app);
      window.toAudioCount = 0;
      return app;
    })()
  ).render(
    /* @__PURE__ */ jsxRuntimeExports.jsx(require$$0.StrictMode, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(
      App,
      {
        DownloadList: (url, filename) => fileDownloader.addToDownloadQueue(url, filename, () => {
        })
      }
    ) })
  );

})(React, ReactDOM);