Advertisement
NoffearrDeathProjecT

WoWHead Armory

Jan 20th, 2016
1,169
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. (function($) {
  2.     if (!$.fn.on) {
  3.         $.fn.on = function(events, selector, data, handler) {
  4.             var self = this;
  5.             var args = arguments.length;
  6.             if (args > 3) {
  7.                 return self.delegate(selector, events, data, handler)
  8.             } else if (args > 2) {
  9.                 if (typeof selector === "string") {
  10.                     return self.delegate(selector, events, data)
  11.                 } else {
  12.                     return self.bind(events, selector, data)
  13.                 }
  14.             } else {
  15.                 return self.bind(events, selector)
  16.             }
  17.         }
  18.     }
  19.     if (!$.fn.off) {
  20.         $.fn.off = function(events, selector, handler) {
  21.             var self = this;
  22.             var args = arguments.length;
  23.             if (typeof selector === "string") {
  24.                 if (args > 2) {
  25.                     return self.undelegate(selector, events, handler)
  26.                 } else if (args > 1) {
  27.                     return self.undelegate(selector, events)
  28.                 } else {
  29.                     return self.undelegate()
  30.                 }
  31.             } else {
  32.                 if (args > 1) {
  33.                     handler = selector;
  34.                     return self.unbind(events, handler)
  35.                 } else if (args > 0) {
  36.                     return self.unbind(events)
  37.                 } else {
  38.                     return self.unbind()
  39.                 }
  40.             }
  41.         }
  42.     }
  43. })(this.jQuery);
  44. (function(_global) {
  45.     "use strict";
  46.     var shim = {};
  47.     if (typeof exports === "undefined") {
  48.         if (typeof define == "function" && typeof define.amd == "object" && define.amd) {
  49.             shim.exports = {};
  50.             define(function() {
  51.                 return shim.exports
  52.             })
  53.         } else {
  54.             shim.exports = typeof window !== "undefined" ? window : _global
  55.         }
  56.     } else {
  57.         shim.exports = exports
  58.     }(function(exports) {
  59.         if (!GLMAT_EPSILON) {
  60.             var GLMAT_EPSILON = 1e-6
  61.         }
  62.         if (!GLMAT_ARRAY_TYPE) {
  63.             var GLMAT_ARRAY_TYPE = typeof Float32Array !== "undefined" ? Float32Array : Array
  64.         }
  65.         if (!GLMAT_RANDOM) {
  66.             var GLMAT_RANDOM = Math.random
  67.         }
  68.         var glMatrix = {};
  69.         glMatrix.setMatrixArrayType = function(type) {
  70.             GLMAT_ARRAY_TYPE = type
  71.         };
  72.         if (typeof exports !== "undefined") {
  73.             exports.glMatrix = glMatrix
  74.         }
  75.         var degree = Math.PI / 180;
  76.         glMatrix.toRadian = function(a) {
  77.             return a * degree
  78.         };
  79.         var vec2 = {};
  80.         vec2.create = function() {
  81.             var out = new GLMAT_ARRAY_TYPE(2);
  82.             out[0] = 0;
  83.             out[1] = 0;
  84.             return out
  85.         };
  86.         vec2.clone = function(a) {
  87.             var out = new GLMAT_ARRAY_TYPE(2);
  88.             out[0] = a[0];
  89.             out[1] = a[1];
  90.             return out
  91.         };
  92.         vec2.fromValues = function(x, y) {
  93.             var out = new GLMAT_ARRAY_TYPE(2);
  94.             out[0] = x;
  95.             out[1] = y;
  96.             return out
  97.         };
  98.         vec2.copy = function(out, a) {
  99.             out[0] = a[0];
  100.             out[1] = a[1];
  101.             return out
  102.         };
  103.         vec2.set = function(out, x, y) {
  104.             out[0] = x;
  105.             out[1] = y;
  106.             return out
  107.         };
  108.         vec2.add = function(out, a, b) {
  109.             out[0] = a[0] + b[0];
  110.             out[1] = a[1] + b[1];
  111.             return out
  112.         };
  113.         vec2.subtract = function(out, a, b) {
  114.             out[0] = a[0] - b[0];
  115.             out[1] = a[1] - b[1];
  116.             return out
  117.         };
  118.         vec2.sub = vec2.subtract;
  119.         vec2.multiply = function(out, a, b) {
  120.             out[0] = a[0] * b[0];
  121.             out[1] = a[1] * b[1];
  122.             return out
  123.         };
  124.         vec2.mul = vec2.multiply;
  125.         vec2.divide = function(out, a, b) {
  126.             out[0] = a[0] / b[0];
  127.             out[1] = a[1] / b[1];
  128.             return out
  129.         };
  130.         vec2.div = vec2.divide;
  131.         vec2.min = function(out, a, b) {
  132.             out[0] = Math.min(a[0], b[0]);
  133.             out[1] = Math.min(a[1], b[1]);
  134.             return out
  135.         };
  136.         vec2.max = function(out, a, b) {
  137.             out[0] = Math.max(a[0], b[0]);
  138.             out[1] = Math.max(a[1], b[1]);
  139.             return out
  140.         };
  141.         vec2.scale = function(out, a, b) {
  142.             out[0] = a[0] * b;
  143.             out[1] = a[1] * b;
  144.             return out
  145.         };
  146.         vec2.scaleAndAdd = function(out, a, b, scale) {
  147.             out[0] = a[0] + b[0] * scale;
  148.             out[1] = a[1] + b[1] * scale;
  149.             return out
  150.         };
  151.         vec2.distance = function(a, b) {
  152.             var x = b[0] - a[0],
  153.                 y = b[1] - a[1];
  154.             return Math.sqrt(x * x + y * y)
  155.         };
  156.         vec2.dist = vec2.distance;
  157.         vec2.squaredDistance = function(a, b) {
  158.             var x = b[0] - a[0],
  159.                 y = b[1] - a[1];
  160.             return x * x + y * y
  161.         };
  162.         vec2.sqrDist = vec2.squaredDistance;
  163.         vec2.length = function(a) {
  164.             var x = a[0],
  165.                 y = a[1];
  166.             return Math.sqrt(x * x + y * y)
  167.         };
  168.         vec2.len = vec2.length;
  169.         vec2.squaredLength = function(a) {
  170.             var x = a[0],
  171.                 y = a[1];
  172.             return x * x + y * y
  173.         };
  174.         vec2.sqrLen = vec2.squaredLength;
  175.         vec2.negate = function(out, a) {
  176.             out[0] = -a[0];
  177.             out[1] = -a[1];
  178.             return out
  179.         };
  180.         vec2.normalize = function(out, a) {
  181.             var x = a[0],
  182.                 y = a[1];
  183.             var len = x * x + y * y;
  184.             if (len > 0) {
  185.                 len = 1 / Math.sqrt(len);
  186.                 out[0] = a[0] * len;
  187.                 out[1] = a[1] * len
  188.             }
  189.             return out
  190.         };
  191.         vec2.dot = function(a, b) {
  192.             return a[0] * b[0] + a[1] * b[1]
  193.         };
  194.         vec2.cross = function(out, a, b) {
  195.             var z = a[0] * b[1] - a[1] * b[0];
  196.             out[0] = out[1] = 0;
  197.             out[2] = z;
  198.             return out
  199.         };
  200.         vec2.lerp = function(out, a, b, t) {
  201.             var ax = a[0],
  202.                 ay = a[1];
  203.             out[0] = ax + t * (b[0] - ax);
  204.             out[1] = ay + t * (b[1] - ay);
  205.             return out
  206.         };
  207.         vec2.random = function(out, scale) {
  208.             scale = scale || 1;
  209.             var r = GLMAT_RANDOM() * 2 * Math.PI;
  210.             out[0] = Math.cos(r) * scale;
  211.             out[1] = Math.sin(r) * scale;
  212.             return out
  213.         };
  214.         vec2.transformMat2 = function(out, a, m) {
  215.             var x = a[0],
  216.                 y = a[1];
  217.             out[0] = m[0] * x + m[2] * y;
  218.             out[1] = m[1] * x + m[3] * y;
  219.             return out
  220.         };
  221.         vec2.transformMat2d = function(out, a, m) {
  222.             var x = a[0],
  223.                 y = a[1];
  224.             out[0] = m[0] * x + m[2] * y + m[4];
  225.             out[1] = m[1] * x + m[3] * y + m[5];
  226.             return out
  227.         };
  228.         vec2.transformMat3 = function(out, a, m) {
  229.             var x = a[0],
  230.                 y = a[1];
  231.             out[0] = m[0] * x + m[3] * y + m[6];
  232.             out[1] = m[1] * x + m[4] * y + m[7];
  233.             return out
  234.         };
  235.         vec2.transformMat4 = function(out, a, m) {
  236.             var x = a[0],
  237.                 y = a[1];
  238.             out[0] = m[0] * x + m[4] * y + m[12];
  239.             out[1] = m[1] * x + m[5] * y + m[13];
  240.             return out
  241.         };
  242.         vec2.forEach = function() {
  243.             var vec = vec2.create();
  244.             return function(a, stride, offset, count, fn, arg) {
  245.                 var i, l;
  246.                 if (!stride) {
  247.                     stride = 2
  248.                 }
  249.                 if (!offset) {
  250.                     offset = 0
  251.                 }
  252.                 if (count) {
  253.                     l = Math.min(count * stride + offset, a.length)
  254.                 } else {
  255.                     l = a.length
  256.                 }
  257.                 for (i = offset; i < l; i += stride) {
  258.                     vec[0] = a[i];
  259.                     vec[1] = a[i + 1];
  260.                     fn(vec, vec, arg);
  261.                     a[i] = vec[0];
  262.                     a[i + 1] = vec[1]
  263.                 }
  264.                 return a
  265.             }
  266.         }();
  267.         vec2.str = function(a) {
  268.             return "vec2(" + a[0] + ", " + a[1] + ")"
  269.         };
  270.         if (typeof exports !== "undefined") {
  271.             exports.vec2 = vec2
  272.         }
  273.         var vec3 = {};
  274.         vec3.create = function() {
  275.             var out = new GLMAT_ARRAY_TYPE(3);
  276.             out[0] = 0;
  277.             out[1] = 0;
  278.             out[2] = 0;
  279.             return out
  280.         };
  281.         vec3.clone = function(a) {
  282.             var out = new GLMAT_ARRAY_TYPE(3);
  283.             out[0] = a[0];
  284.             out[1] = a[1];
  285.             out[2] = a[2];
  286.             return out
  287.         };
  288.         vec3.fromValues = function(x, y, z) {
  289.             var out = new GLMAT_ARRAY_TYPE(3);
  290.             out[0] = x;
  291.             out[1] = y;
  292.             out[2] = z;
  293.             return out
  294.         };
  295.         vec3.copy = function(out, a) {
  296.             out[0] = a[0];
  297.             out[1] = a[1];
  298.             out[2] = a[2];
  299.             return out
  300.         };
  301.         vec3.set = function(out, x, y, z) {
  302.             out[0] = x;
  303.             out[1] = y;
  304.             out[2] = z;
  305.             return out
  306.         };
  307.         vec3.add = function(out, a, b) {
  308.             out[0] = a[0] + b[0];
  309.             out[1] = a[1] + b[1];
  310.             out[2] = a[2] + b[2];
  311.             return out
  312.         };
  313.         vec3.subtract = function(out, a, b) {
  314.             out[0] = a[0] - b[0];
  315.             out[1] = a[1] - b[1];
  316.             out[2] = a[2] - b[2];
  317.             return out
  318.         };
  319.         vec3.sub = vec3.subtract;
  320.         vec3.multiply = function(out, a, b) {
  321.             out[0] = a[0] * b[0];
  322.             out[1] = a[1] * b[1];
  323.             out[2] = a[2] * b[2];
  324.             return out
  325.         };
  326.         vec3.mul = vec3.multiply;
  327.         vec3.divide = function(out, a, b) {
  328.             out[0] = a[0] / b[0];
  329.             out[1] = a[1] / b[1];
  330.             out[2] = a[2] / b[2];
  331.             return out
  332.         };
  333.         vec3.div = vec3.divide;
  334.         vec3.min = function(out, a, b) {
  335.             out[0] = Math.min(a[0], b[0]);
  336.             out[1] = Math.min(a[1], b[1]);
  337.             out[2] = Math.min(a[2], b[2]);
  338.             return out
  339.         };
  340.         vec3.max = function(out, a, b) {
  341.             out[0] = Math.max(a[0], b[0]);
  342.             out[1] = Math.max(a[1], b[1]);
  343.             out[2] = Math.max(a[2], b[2]);
  344.             return out
  345.         };
  346.         vec3.scale = function(out, a, b) {
  347.             out[0] = a[0] * b;
  348.             out[1] = a[1] * b;
  349.             out[2] = a[2] * b;
  350.             return out
  351.         };
  352.         vec3.scaleAndAdd = function(out, a, b, scale) {
  353.             out[0] = a[0] + b[0] * scale;
  354.             out[1] = a[1] + b[1] * scale;
  355.             out[2] = a[2] + b[2] * scale;
  356.             return out
  357.         };
  358.         vec3.distance = function(a, b) {
  359.             var x = b[0] - a[0],
  360.                 y = b[1] - a[1],
  361.                 z = b[2] - a[2];
  362.             return Math.sqrt(x * x + y * y + z * z)
  363.         };
  364.         vec3.dist = vec3.distance;
  365.         vec3.squaredDistance = function(a, b) {
  366.             var x = b[0] - a[0],
  367.                 y = b[1] - a[1],
  368.                 z = b[2] - a[2];
  369.             return x * x + y * y + z * z
  370.         };
  371.         vec3.sqrDist = vec3.squaredDistance;
  372.         vec3.length = function(a) {
  373.             var x = a[0],
  374.                 y = a[1],
  375.                 z = a[2];
  376.             return Math.sqrt(x * x + y * y + z * z)
  377.         };
  378.         vec3.len = vec3.length;
  379.         vec3.squaredLength = function(a) {
  380.             var x = a[0],
  381.                 y = a[1],
  382.                 z = a[2];
  383.             return x * x + y * y + z * z
  384.         };
  385.         vec3.sqrLen = vec3.squaredLength;
  386.         vec3.negate = function(out, a) {
  387.             out[0] = -a[0];
  388.             out[1] = -a[1];
  389.             out[2] = -a[2];
  390.             return out
  391.         };
  392.         vec3.normalize = function(out, a) {
  393.             var x = a[0],
  394.                 y = a[1],
  395.                 z = a[2];
  396.             var len = x * x + y * y + z * z;
  397.             if (len > 0) {
  398.                 len = 1 / Math.sqrt(len);
  399.                 out[0] = a[0] * len;
  400.                 out[1] = a[1] * len;
  401.                 out[2] = a[2] * len
  402.             }
  403.             return out
  404.         };
  405.         vec3.dot = function(a, b) {
  406.             return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]
  407.         };
  408.         vec3.cross = function(out, a, b) {
  409.             var ax = a[0],
  410.                 ay = a[1],
  411.                 az = a[2],
  412.                 bx = b[0],
  413.                 by = b[1],
  414.                 bz = b[2];
  415.             out[0] = ay * bz - az * by;
  416.             out[1] = az * bx - ax * bz;
  417.             out[2] = ax * by - ay * bx;
  418.             return out
  419.         };
  420.         vec3.lerp = function(out, a, b, t) {
  421.             var ax = a[0],
  422.                 ay = a[1],
  423.                 az = a[2];
  424.             out[0] = ax + t * (b[0] - ax);
  425.             out[1] = ay + t * (b[1] - ay);
  426.             out[2] = az + t * (b[2] - az);
  427.             return out
  428.         };
  429.         vec3.random = function(out, scale) {
  430.             scale = scale || 1;
  431.             var r = GLMAT_RANDOM() * 2 * Math.PI;
  432.             var z = GLMAT_RANDOM() * 2 - 1;
  433.             var zScale = Math.sqrt(1 - z * z) * scale;
  434.             out[0] = Math.cos(r) * zScale;
  435.             out[1] = Math.sin(r) * zScale;
  436.             out[2] = z * scale;
  437.             return out
  438.         };
  439.         vec3.transformMat4 = function(out, a, m) {
  440.             var x = a[0],
  441.                 y = a[1],
  442.                 z = a[2];
  443.             out[0] = m[0] * x + m[4] * y + m[8] * z + m[12];
  444.             out[1] = m[1] * x + m[5] * y + m[9] * z + m[13];
  445.             out[2] = m[2] * x + m[6] * y + m[10] * z + m[14];
  446.             return out
  447.         };
  448.         vec3.transformMat3 = function(out, a, m) {
  449.             var x = a[0],
  450.                 y = a[1],
  451.                 z = a[2];
  452.             out[0] = x * m[0] + y * m[3] + z * m[6];
  453.             out[1] = x * m[1] + y * m[4] + z * m[7];
  454.             out[2] = x * m[2] + y * m[5] + z * m[8];
  455.             return out
  456.         };
  457.         vec3.transformQuat = function(out, a, q) {
  458.             var x = a[0],
  459.                 y = a[1],
  460.                 z = a[2],
  461.                 qx = q[0],
  462.                 qy = q[1],
  463.                 qz = q[2],
  464.                 qw = q[3],
  465.                 ix = qw * x + qy * z - qz * y,
  466.                 iy = qw * y + qz * x - qx * z,
  467.                 iz = qw * z + qx * y - qy * x,
  468.                 iw = -qx * x - qy * y - qz * z;
  469.             out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;
  470.             out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;
  471.             out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;
  472.             return out
  473.         };
  474.         vec3.rotateX = function(out, a, b, c) {
  475.             var p = [],
  476.                 r = [];
  477.             p[0] = a[0] - b[0];
  478.             p[1] = a[1] - b[1];
  479.             p[2] = a[2] - b[2];
  480.             r[0] = p[0];
  481.             r[1] = p[1] * Math.cos(c) - p[2] * Math.sin(c);
  482.             r[2] = p[1] * Math.sin(c) + p[2] * Math.cos(c);
  483.             out[0] = r[0] + b[0];
  484.             out[1] = r[1] + b[1];
  485.             out[2] = r[2] + b[2];
  486.             return out
  487.         };
  488.         vec3.rotateY = function(out, a, b, c) {
  489.             var p = [],
  490.                 r = [];
  491.             p[0] = a[0] - b[0];
  492.             p[1] = a[1] - b[1];
  493.             p[2] = a[2] - b[2];
  494.             r[0] = p[2] * Math.sin(c) + p[0] * Math.cos(c);
  495.             r[1] = p[1];
  496.             r[2] = p[2] * Math.cos(c) - p[0] * Math.sin(c);
  497.             out[0] = r[0] + b[0];
  498.             out[1] = r[1] + b[1];
  499.             out[2] = r[2] + b[2];
  500.             return out
  501.         };
  502.         vec3.rotateZ = function(out, a, b, c) {
  503.             var p = [],
  504.                 r = [];
  505.             p[0] = a[0] - b[0];
  506.             p[1] = a[1] - b[1];
  507.             p[2] = a[2] - b[2];
  508.             r[0] = p[0] * Math.cos(c) - p[1] * Math.sin(c);
  509.             r[1] = p[0] * Math.sin(c) + p[1] * Math.cos(c);
  510.             r[2] = p[2];
  511.             out[0] = r[0] + b[0];
  512.             out[1] = r[1] + b[1];
  513.             out[2] = r[2] + b[2];
  514.             return out
  515.         };
  516.         vec3.forEach = function() {
  517.             var vec = vec3.create();
  518.             return function(a, stride, offset, count, fn, arg) {
  519.                 var i, l;
  520.                 if (!stride) {
  521.                     stride = 3
  522.                 }
  523.                 if (!offset) {
  524.                     offset = 0
  525.                 }
  526.                 if (count) {
  527.                     l = Math.min(count * stride + offset, a.length)
  528.                 } else {
  529.                     l = a.length
  530.                 }
  531.                 for (i = offset; i < l; i += stride) {
  532.                     vec[0] = a[i];
  533.                     vec[1] = a[i + 1];
  534.                     vec[2] = a[i + 2];
  535.                     fn(vec, vec, arg);
  536.                     a[i] = vec[0];
  537.                     a[i + 1] = vec[1];
  538.                     a[i + 2] = vec[2]
  539.                 }
  540.                 return a
  541.             }
  542.         }();
  543.         vec3.str = function(a) {
  544.             return "vec3(" + a[0] + ", " + a[1] + ", " + a[2] + ")"
  545.         };
  546.         if (typeof exports !== "undefined") {
  547.             exports.vec3 = vec3
  548.         }
  549.         var vec4 = {};
  550.         vec4.create = function() {
  551.             var out = new GLMAT_ARRAY_TYPE(4);
  552.             out[0] = 0;
  553.             out[1] = 0;
  554.             out[2] = 0;
  555.             out[3] = 0;
  556.             return out
  557.         };
  558.         vec4.clone = function(a) {
  559.             var out = new GLMAT_ARRAY_TYPE(4);
  560.             out[0] = a[0];
  561.             out[1] = a[1];
  562.             out[2] = a[2];
  563.             out[3] = a[3];
  564.             return out
  565.         };
  566.         vec4.fromValues = function(x, y, z, w) {
  567.             var out = new GLMAT_ARRAY_TYPE(4);
  568.             out[0] = x;
  569.             out[1] = y;
  570.             out[2] = z;
  571.             out[3] = w;
  572.             return out
  573.         };
  574.         vec4.copy = function(out, a) {
  575.             out[0] = a[0];
  576.             out[1] = a[1];
  577.             out[2] = a[2];
  578.             out[3] = a[3];
  579.             return out
  580.         };
  581.         vec4.set = function(out, x, y, z, w) {
  582.             out[0] = x;
  583.             out[1] = y;
  584.             out[2] = z;
  585.             out[3] = w;
  586.             return out
  587.         };
  588.         vec4.add = function(out, a, b) {
  589.             out[0] = a[0] + b[0];
  590.             out[1] = a[1] + b[1];
  591.             out[2] = a[2] + b[2];
  592.             out[3] = a[3] + b[3];
  593.             return out
  594.         };
  595.         vec4.subtract = function(out, a, b) {
  596.             out[0] = a[0] - b[0];
  597.             out[1] = a[1] - b[1];
  598.             out[2] = a[2] - b[2];
  599.             out[3] = a[3] - b[3];
  600.             return out
  601.         };
  602.         vec4.sub = vec4.subtract;
  603.         vec4.multiply = function(out, a, b) {
  604.             out[0] = a[0] * b[0];
  605.             out[1] = a[1] * b[1];
  606.             out[2] = a[2] * b[2];
  607.             out[3] = a[3] * b[3];
  608.             return out
  609.         };
  610.         vec4.mul = vec4.multiply;
  611.         vec4.divide = function(out, a, b) {
  612.             out[0] = a[0] / b[0];
  613.             out[1] = a[1] / b[1];
  614.             out[2] = a[2] / b[2];
  615.             out[3] = a[3] / b[3];
  616.             return out
  617.         };
  618.         vec4.div = vec4.divide;
  619.         vec4.min = function(out, a, b) {
  620.             out[0] = Math.min(a[0], b[0]);
  621.             out[1] = Math.min(a[1], b[1]);
  622.             out[2] = Math.min(a[2], b[2]);
  623.             out[3] = Math.min(a[3], b[3]);
  624.             return out
  625.         };
  626.         vec4.max = function(out, a, b) {
  627.             out[0] = Math.max(a[0], b[0]);
  628.             out[1] = Math.max(a[1], b[1]);
  629.             out[2] = Math.max(a[2], b[2]);
  630.             out[3] = Math.max(a[3], b[3]);
  631.             return out
  632.         };
  633.         vec4.scale = function(out, a, b) {
  634.             out[0] = a[0] * b;
  635.             out[1] = a[1] * b;
  636.             out[2] = a[2] * b;
  637.             out[3] = a[3] * b;
  638.             return out
  639.         };
  640.         vec4.scaleAndAdd = function(out, a, b, scale) {
  641.             out[0] = a[0] + b[0] * scale;
  642.             out[1] = a[1] + b[1] * scale;
  643.             out[2] = a[2] + b[2] * scale;
  644.             out[3] = a[3] + b[3] * scale;
  645.             return out
  646.         };
  647.         vec4.distance = function(a, b) {
  648.             var x = b[0] - a[0],
  649.                 y = b[1] - a[1],
  650.                 z = b[2] - a[2],
  651.                 w = b[3] - a[3];
  652.             return Math.sqrt(x * x + y * y + z * z + w * w)
  653.         };
  654.         vec4.dist = vec4.distance;
  655.         vec4.squaredDistance = function(a, b) {
  656.             var x = b[0] - a[0],
  657.                 y = b[1] - a[1],
  658.                 z = b[2] - a[2],
  659.                 w = b[3] - a[3];
  660.             return x * x + y * y + z * z + w * w
  661.         };
  662.         vec4.sqrDist = vec4.squaredDistance;
  663.         vec4.length = function(a) {
  664.             var x = a[0],
  665.                 y = a[1],
  666.                 z = a[2],
  667.                 w = a[3];
  668.             return Math.sqrt(x * x + y * y + z * z + w * w)
  669.         };
  670.         vec4.len = vec4.length;
  671.         vec4.squaredLength = function(a) {
  672.             var x = a[0],
  673.                 y = a[1],
  674.                 z = a[2],
  675.                 w = a[3];
  676.             return x * x + y * y + z * z + w * w
  677.         };
  678.         vec4.sqrLen = vec4.squaredLength;
  679.         vec4.negate = function(out, a) {
  680.             out[0] = -a[0];
  681.             out[1] = -a[1];
  682.             out[2] = -a[2];
  683.             out[3] = -a[3];
  684.             return out
  685.         };
  686.         vec4.normalize = function(out, a) {
  687.             var x = a[0],
  688.                 y = a[1],
  689.                 z = a[2],
  690.                 w = a[3];
  691.             var len = x * x + y * y + z * z + w * w;
  692.             if (len > 0) {
  693.                 len = 1 / Math.sqrt(len);
  694.                 out[0] = a[0] * len;
  695.                 out[1] = a[1] * len;
  696.                 out[2] = a[2] * len;
  697.                 out[3] = a[3] * len
  698.             }
  699.             return out
  700.         };
  701.         vec4.dot = function(a, b) {
  702.             return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3]
  703.         };
  704.         vec4.lerp = function(out, a, b, t) {
  705.             var ax = a[0],
  706.                 ay = a[1],
  707.                 az = a[2],
  708.                 aw = a[3];
  709.             out[0] = ax + t * (b[0] - ax);
  710.             out[1] = ay + t * (b[1] - ay);
  711.             out[2] = az + t * (b[2] - az);
  712.             out[3] = aw + t * (b[3] - aw);
  713.             return out
  714.         };
  715.         vec4.random = function(out, scale) {
  716.             scale = scale || 1;
  717.             out[0] = GLMAT_RANDOM();
  718.             out[1] = GLMAT_RANDOM();
  719.             out[2] = GLMAT_RANDOM();
  720.             out[3] = GLMAT_RANDOM();
  721.             vec4.normalize(out, out);
  722.             vec4.scale(out, out, scale);
  723.             return out
  724.         };
  725.         vec4.transformMat4 = function(out, a, m) {
  726.             var x = a[0],
  727.                 y = a[1],
  728.                 z = a[2],
  729.                 w = a[3];
  730.             out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w;
  731.             out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w;
  732.             out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w;
  733.             out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w;
  734.             return out
  735.         };
  736.         vec4.transformQuat = function(out, a, q) {
  737.             var x = a[0],
  738.                 y = a[1],
  739.                 z = a[2],
  740.                 qx = q[0],
  741.                 qy = q[1],
  742.                 qz = q[2],
  743.                 qw = q[3],
  744.                 ix = qw * x + qy * z - qz * y,
  745.                 iy = qw * y + qz * x - qx * z,
  746.                 iz = qw * z + qx * y - qy * x,
  747.                 iw = -qx * x - qy * y - qz * z;
  748.             out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;
  749.             out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;
  750.             out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;
  751.             return out
  752.         };
  753.         vec4.forEach = function() {
  754.             var vec = vec4.create();
  755.             return function(a, stride, offset, count, fn, arg) {
  756.                 var i, l;
  757.                 if (!stride) {
  758.                     stride = 4
  759.                 }
  760.                 if (!offset) {
  761.                     offset = 0
  762.                 }
  763.                 if (count) {
  764.                     l = Math.min(count * stride + offset, a.length)
  765.                 } else {
  766.                     l = a.length
  767.                 }
  768.                 for (i = offset; i < l; i += stride) {
  769.                     vec[0] = a[i];
  770.                     vec[1] = a[i + 1];
  771.                     vec[2] = a[i + 2];
  772.                     vec[3] = a[i + 3];
  773.                     fn(vec, vec, arg);
  774.                     a[i] = vec[0];
  775.                     a[i + 1] = vec[1];
  776.                     a[i + 2] = vec[2];
  777.                     a[i + 3] = vec[3]
  778.                 }
  779.                 return a
  780.             }
  781.         }();
  782.         vec4.str = function(a) {
  783.             return "vec4(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ")"
  784.         };
  785.         if (typeof exports !== "undefined") {
  786.             exports.vec4 = vec4
  787.         }
  788.         var mat2 = {};
  789.         mat2.create = function() {
  790.             var out = new GLMAT_ARRAY_TYPE(4);
  791.             out[0] = 1;
  792.             out[1] = 0;
  793.             out[2] = 0;
  794.             out[3] = 1;
  795.             return out
  796.         };
  797.         mat2.clone = function(a) {
  798.             var out = new GLMAT_ARRAY_TYPE(4);
  799.             out[0] = a[0];
  800.             out[1] = a[1];
  801.             out[2] = a[2];
  802.             out[3] = a[3];
  803.             return out
  804.         };
  805.         mat2.copy = function(out, a) {
  806.             out[0] = a[0];
  807.             out[1] = a[1];
  808.             out[2] = a[2];
  809.             out[3] = a[3];
  810.             return out
  811.         };
  812.         mat2.identity = function(out) {
  813.             out[0] = 1;
  814.             out[1] = 0;
  815.             out[2] = 0;
  816.             out[3] = 1;
  817.             return out
  818.         };
  819.         mat2.transpose = function(out, a) {
  820.             if (out === a) {
  821.                 var a1 = a[1];
  822.                 out[1] = a[2];
  823.                 out[2] = a1
  824.             } else {
  825.                 out[0] = a[0];
  826.                 out[1] = a[2];
  827.                 out[2] = a[1];
  828.                 out[3] = a[3]
  829.             }
  830.             return out
  831.         };
  832.         mat2.invert = function(out, a) {
  833.             var a0 = a[0],
  834.                 a1 = a[1],
  835.                 a2 = a[2],
  836.                 a3 = a[3],
  837.                 det = a0 * a3 - a2 * a1;
  838.             if (!det) {
  839.                 return null
  840.             }
  841.             det = 1 / det;
  842.             out[0] = a3 * det;
  843.             out[1] = -a1 * det;
  844.             out[2] = -a2 * det;
  845.             out[3] = a0 * det;
  846.             return out
  847.         };
  848.         mat2.adjoint = function(out, a) {
  849.             var a0 = a[0];
  850.             out[0] = a[3];
  851.             out[1] = -a[1];
  852.             out[2] = -a[2];
  853.             out[3] = a0;
  854.             return out
  855.         };
  856.         mat2.determinant = function(a) {
  857.             return a[0] * a[3] - a[2] * a[1]
  858.         };
  859.         mat2.multiply = function(out, a, b) {
  860.             var a0 = a[0],
  861.                 a1 = a[1],
  862.                 a2 = a[2],
  863.                 a3 = a[3];
  864.             var b0 = b[0],
  865.                 b1 = b[1],
  866.                 b2 = b[2],
  867.                 b3 = b[3];
  868.             out[0] = a0 * b0 + a2 * b1;
  869.             out[1] = a1 * b0 + a3 * b1;
  870.             out[2] = a0 * b2 + a2 * b3;
  871.             out[3] = a1 * b2 + a3 * b3;
  872.             return out
  873.         };
  874.         mat2.mul = mat2.multiply;
  875.         mat2.rotate = function(out, a, rad) {
  876.             var a0 = a[0],
  877.                 a1 = a[1],
  878.                 a2 = a[2],
  879.                 a3 = a[3],
  880.                 s = Math.sin(rad),
  881.                 c = Math.cos(rad);
  882.             out[0] = a0 * c + a2 * s;
  883.             out[1] = a1 * c + a3 * s;
  884.             out[2] = a0 * -s + a2 * c;
  885.             out[3] = a1 * -s + a3 * c;
  886.             return out
  887.         };
  888.         mat2.scale = function(out, a, v) {
  889.             var a0 = a[0],
  890.                 a1 = a[1],
  891.                 a2 = a[2],
  892.                 a3 = a[3],
  893.                 v0 = v[0],
  894.                 v1 = v[1];
  895.             out[0] = a0 * v0;
  896.             out[1] = a1 * v0;
  897.             out[2] = a2 * v1;
  898.             out[3] = a3 * v1;
  899.             return out
  900.         };
  901.         mat2.str = function(a) {
  902.             return "mat2(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ")"
  903.         };
  904.         mat2.frob = function(a) {
  905.             return Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2))
  906.         };
  907.         mat2.LDU = function(L, D, U, a) {
  908.             L[2] = a[2] / a[0];
  909.             U[0] = a[0];
  910.             U[1] = a[1];
  911.             U[3] = a[3] - L[2] * U[1];
  912.             return [L, D, U]
  913.         };
  914.         if (typeof exports !== "undefined") {
  915.             exports.mat2 = mat2
  916.         }
  917.         var mat2d = {};
  918.         mat2d.create = function() {
  919.             var out = new GLMAT_ARRAY_TYPE(6);
  920.             out[0] = 1;
  921.             out[1] = 0;
  922.             out[2] = 0;
  923.             out[3] = 1;
  924.             out[4] = 0;
  925.             out[5] = 0;
  926.             return out
  927.         };
  928.         mat2d.clone = function(a) {
  929.             var out = new GLMAT_ARRAY_TYPE(6);
  930.             out[0] = a[0];
  931.             out[1] = a[1];
  932.             out[2] = a[2];
  933.             out[3] = a[3];
  934.             out[4] = a[4];
  935.             out[5] = a[5];
  936.             return out
  937.         };
  938.         mat2d.copy = function(out, a) {
  939.             out[0] = a[0];
  940.             out[1] = a[1];
  941.             out[2] = a[2];
  942.             out[3] = a[3];
  943.             out[4] = a[4];
  944.             out[5] = a[5];
  945.             return out
  946.         };
  947.         mat2d.identity = function(out) {
  948.             out[0] = 1;
  949.             out[1] = 0;
  950.             out[2] = 0;
  951.             out[3] = 1;
  952.             out[4] = 0;
  953.             out[5] = 0;
  954.             return out
  955.         };
  956.         mat2d.invert = function(out, a) {
  957.             var aa = a[0],
  958.                 ab = a[1],
  959.                 ac = a[2],
  960.                 ad = a[3],
  961.                 atx = a[4],
  962.                 aty = a[5];
  963.             var det = aa * ad - ab * ac;
  964.             if (!det) {
  965.                 return null
  966.             }
  967.             det = 1 / det;
  968.             out[0] = ad * det;
  969.             out[1] = -ab * det;
  970.             out[2] = -ac * det;
  971.             out[3] = aa * det;
  972.             out[4] = (ac * aty - ad * atx) * det;
  973.             out[5] = (ab * atx - aa * aty) * det;
  974.             return out
  975.         };
  976.         mat2d.determinant = function(a) {
  977.             return a[0] * a[3] - a[1] * a[2]
  978.         };
  979.         mat2d.multiply = function(out, a, b) {
  980.             var a0 = a[0],
  981.                 a1 = a[1],
  982.                 a2 = a[2],
  983.                 a3 = a[3],
  984.                 a4 = a[4],
  985.                 a5 = a[5],
  986.                 b0 = b[0],
  987.                 b1 = b[1],
  988.                 b2 = b[2],
  989.                 b3 = b[3],
  990.                 b4 = b[4],
  991.                 b5 = b[5];
  992.             out[0] = a0 * b0 + a2 * b1;
  993.             out[1] = a1 * b0 + a3 * b1;
  994.             out[2] = a0 * b2 + a2 * b3;
  995.             out[3] = a1 * b2 + a3 * b3;
  996.             out[4] = a0 * b4 + a2 * b5 + a4;
  997.             out[5] = a1 * b4 + a3 * b5 + a5;
  998.             return out
  999.         };
  1000.         mat2d.mul = mat2d.multiply;
  1001.         mat2d.rotate = function(out, a, rad) {
  1002.             var a0 = a[0],
  1003.                 a1 = a[1],
  1004.                 a2 = a[2],
  1005.                 a3 = a[3],
  1006.                 a4 = a[4],
  1007.                 a5 = a[5],
  1008.                 s = Math.sin(rad),
  1009.                 c = Math.cos(rad);
  1010.             out[0] = a0 * c + a2 * s;
  1011.             out[1] = a1 * c + a3 * s;
  1012.             out[2] = a0 * -s + a2 * c;
  1013.             out[3] = a1 * -s + a3 * c;
  1014.             out[4] = a4;
  1015.             out[5] = a5;
  1016.             return out
  1017.         };
  1018.         mat2d.scale = function(out, a, v) {
  1019.             var a0 = a[0],
  1020.                 a1 = a[1],
  1021.                 a2 = a[2],
  1022.                 a3 = a[3],
  1023.                 a4 = a[4],
  1024.                 a5 = a[5],
  1025.                 v0 = v[0],
  1026.                 v1 = v[1];
  1027.             out[0] = a0 * v0;
  1028.             out[1] = a1 * v0;
  1029.             out[2] = a2 * v1;
  1030.             out[3] = a3 * v1;
  1031.             out[4] = a4;
  1032.             out[5] = a5;
  1033.             return out
  1034.         };
  1035.         mat2d.translate = function(out, a, v) {
  1036.             var a0 = a[0],
  1037.                 a1 = a[1],
  1038.                 a2 = a[2],
  1039.                 a3 = a[3],
  1040.                 a4 = a[4],
  1041.                 a5 = a[5],
  1042.                 v0 = v[0],
  1043.                 v1 = v[1];
  1044.             out[0] = a0;
  1045.             out[1] = a1;
  1046.             out[2] = a2;
  1047.             out[3] = a3;
  1048.             out[4] = a0 * v0 + a2 * v1 + a4;
  1049.             out[5] = a1 * v0 + a3 * v1 + a5;
  1050.             return out
  1051.         };
  1052.         mat2d.str = function(a) {
  1053.             return "mat2d(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ", " + a[4] + ", " + a[5] + ")"
  1054.         };
  1055.         mat2d.frob = function(a) {
  1056.             return Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2) + Math.pow(a[4], 2) + Math.pow(a[5], 2) + 1)
  1057.         };
  1058.         if (typeof exports !== "undefined") {
  1059.             exports.mat2d = mat2d
  1060.         }
  1061.         var mat3 = {};
  1062.         mat3.create = function() {
  1063.             var out = new GLMAT_ARRAY_TYPE(9);
  1064.             out[0] = 1;
  1065.             out[1] = 0;
  1066.             out[2] = 0;
  1067.             out[3] = 0;
  1068.             out[4] = 1;
  1069.             out[5] = 0;
  1070.             out[6] = 0;
  1071.             out[7] = 0;
  1072.             out[8] = 1;
  1073.             return out
  1074.         };
  1075.         mat3.fromMat4 = function(out, a) {
  1076.             out[0] = a[0];
  1077.             out[1] = a[1];
  1078.             out[2] = a[2];
  1079.             out[3] = a[4];
  1080.             out[4] = a[5];
  1081.             out[5] = a[6];
  1082.             out[6] = a[8];
  1083.             out[7] = a[9];
  1084.             out[8] = a[10];
  1085.             return out
  1086.         };
  1087.         mat3.clone = function(a) {
  1088.             var out = new GLMAT_ARRAY_TYPE(9);
  1089.             out[0] = a[0];
  1090.             out[1] = a[1];
  1091.             out[2] = a[2];
  1092.             out[3] = a[3];
  1093.             out[4] = a[4];
  1094.             out[5] = a[5];
  1095.             out[6] = a[6];
  1096.             out[7] = a[7];
  1097.             out[8] = a[8];
  1098.             return out
  1099.         };
  1100.         mat3.copy = function(out, a) {
  1101.             out[0] = a[0];
  1102.             out[1] = a[1];
  1103.             out[2] = a[2];
  1104.             out[3] = a[3];
  1105.             out[4] = a[4];
  1106.             out[5] = a[5];
  1107.             out[6] = a[6];
  1108.             out[7] = a[7];
  1109.             out[8] = a[8];
  1110.             return out
  1111.         };
  1112.         mat3.identity = function(out) {
  1113.             out[0] = 1;
  1114.             out[1] = 0;
  1115.             out[2] = 0;
  1116.             out[3] = 0;
  1117.             out[4] = 1;
  1118.             out[5] = 0;
  1119.             out[6] = 0;
  1120.             out[7] = 0;
  1121.             out[8] = 1;
  1122.             return out
  1123.         };
  1124.         mat3.transpose = function(out, a) {
  1125.             if (out === a) {
  1126.                 var a01 = a[1],
  1127.                     a02 = a[2],
  1128.                     a12 = a[5];
  1129.                 out[1] = a[3];
  1130.                 out[2] = a[6];
  1131.                 out[3] = a01;
  1132.                 out[5] = a[7];
  1133.                 out[6] = a02;
  1134.                 out[7] = a12
  1135.             } else {
  1136.                 out[0] = a[0];
  1137.                 out[1] = a[3];
  1138.                 out[2] = a[6];
  1139.                 out[3] = a[1];
  1140.                 out[4] = a[4];
  1141.                 out[5] = a[7];
  1142.                 out[6] = a[2];
  1143.                 out[7] = a[5];
  1144.                 out[8] = a[8]
  1145.             }
  1146.             return out
  1147.         };
  1148.         mat3.invert = function(out, a) {
  1149.             var a00 = a[0],
  1150.                 a01 = a[1],
  1151.                 a02 = a[2],
  1152.                 a10 = a[3],
  1153.                 a11 = a[4],
  1154.                 a12 = a[5],
  1155.                 a20 = a[6],
  1156.                 a21 = a[7],
  1157.                 a22 = a[8],
  1158.                 b01 = a22 * a11 - a12 * a21,
  1159.                 b11 = -a22 * a10 + a12 * a20,
  1160.                 b21 = a21 * a10 - a11 * a20,
  1161.                 det = a00 * b01 + a01 * b11 + a02 * b21;
  1162.             if (!det) {
  1163.                 return null
  1164.             }
  1165.             det = 1 / det;
  1166.             out[0] = b01 * det;
  1167.             out[1] = (-a22 * a01 + a02 * a21) * det;
  1168.             out[2] = (a12 * a01 - a02 * a11) * det;
  1169.             out[3] = b11 * det;
  1170.             out[4] = (a22 * a00 - a02 * a20) * det;
  1171.             out[5] = (-a12 * a00 + a02 * a10) * det;
  1172.             out[6] = b21 * det;
  1173.             out[7] = (-a21 * a00 + a01 * a20) * det;
  1174.             out[8] = (a11 * a00 - a01 * a10) * det;
  1175.             return out
  1176.         };
  1177.         mat3.adjoint = function(out, a) {
  1178.             var a00 = a[0],
  1179.                 a01 = a[1],
  1180.                 a02 = a[2],
  1181.                 a10 = a[3],
  1182.                 a11 = a[4],
  1183.                 a12 = a[5],
  1184.                 a20 = a[6],
  1185.                 a21 = a[7],
  1186.                 a22 = a[8];
  1187.             out[0] = a11 * a22 - a12 * a21;
  1188.             out[1] = a02 * a21 - a01 * a22;
  1189.             out[2] = a01 * a12 - a02 * a11;
  1190.             out[3] = a12 * a20 - a10 * a22;
  1191.             out[4] = a00 * a22 - a02 * a20;
  1192.             out[5] = a02 * a10 - a00 * a12;
  1193.             out[6] = a10 * a21 - a11 * a20;
  1194.             out[7] = a01 * a20 - a00 * a21;
  1195.             out[8] = a00 * a11 - a01 * a10;
  1196.             return out
  1197.         };
  1198.         mat3.determinant = function(a) {
  1199.             var a00 = a[0],
  1200.                 a01 = a[1],
  1201.                 a02 = a[2],
  1202.                 a10 = a[3],
  1203.                 a11 = a[4],
  1204.                 a12 = a[5],
  1205.                 a20 = a[6],
  1206.                 a21 = a[7],
  1207.                 a22 = a[8];
  1208.             return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20)
  1209.         };
  1210.         mat3.multiply = function(out, a, b) {
  1211.             var a00 = a[0],
  1212.                 a01 = a[1],
  1213.                 a02 = a[2],
  1214.                 a10 = a[3],
  1215.                 a11 = a[4],
  1216.                 a12 = a[5],
  1217.                 a20 = a[6],
  1218.                 a21 = a[7],
  1219.                 a22 = a[8],
  1220.                 b00 = b[0],
  1221.                 b01 = b[1],
  1222.                 b02 = b[2],
  1223.                 b10 = b[3],
  1224.                 b11 = b[4],
  1225.                 b12 = b[5],
  1226.                 b20 = b[6],
  1227.                 b21 = b[7],
  1228.                 b22 = b[8];
  1229.             out[0] = b00 * a00 + b01 * a10 + b02 * a20;
  1230.             out[1] = b00 * a01 + b01 * a11 + b02 * a21;
  1231.             out[2] = b00 * a02 + b01 * a12 + b02 * a22;
  1232.             out[3] = b10 * a00 + b11 * a10 + b12 * a20;
  1233.             out[4] = b10 * a01 + b11 * a11 + b12 * a21;
  1234.             out[5] = b10 * a02 + b11 * a12 + b12 * a22;
  1235.             out[6] = b20 * a00 + b21 * a10 + b22 * a20;
  1236.             out[7] = b20 * a01 + b21 * a11 + b22 * a21;
  1237.             out[8] = b20 * a02 + b21 * a12 + b22 * a22;
  1238.             return out
  1239.         };
  1240.         mat3.mul = mat3.multiply;
  1241.         mat3.translate = function(out, a, v) {
  1242.             var a00 = a[0],
  1243.                 a01 = a[1],
  1244.                 a02 = a[2],
  1245.                 a10 = a[3],
  1246.                 a11 = a[4],
  1247.                 a12 = a[5],
  1248.                 a20 = a[6],
  1249.                 a21 = a[7],
  1250.                 a22 = a[8],
  1251.                 x = v[0],
  1252.                 y = v[1];
  1253.             out[0] = a00;
  1254.             out[1] = a01;
  1255.             out[2] = a02;
  1256.             out[3] = a10;
  1257.             out[4] = a11;
  1258.             out[5] = a12;
  1259.             out[6] = x * a00 + y * a10 + a20;
  1260.             out[7] = x * a01 + y * a11 + a21;
  1261.             out[8] = x * a02 + y * a12 + a22;
  1262.             return out
  1263.         };
  1264.         mat3.rotate = function(out, a, rad) {
  1265.             var a00 = a[0],
  1266.                 a01 = a[1],
  1267.                 a02 = a[2],
  1268.                 a10 = a[3],
  1269.                 a11 = a[4],
  1270.                 a12 = a[5],
  1271.                 a20 = a[6],
  1272.                 a21 = a[7],
  1273.                 a22 = a[8],
  1274.                 s = Math.sin(rad),
  1275.                 c = Math.cos(rad);
  1276.             out[0] = c * a00 + s * a10;
  1277.             out[1] = c * a01 + s * a11;
  1278.             out[2] = c * a02 + s * a12;
  1279.             out[3] = c * a10 - s * a00;
  1280.             out[4] = c * a11 - s * a01;
  1281.             out[5] = c * a12 - s * a02;
  1282.             out[6] = a20;
  1283.             out[7] = a21;
  1284.             out[8] = a22;
  1285.             return out
  1286.         };
  1287.         mat3.scale = function(out, a, v) {
  1288.             var x = v[0],
  1289.                 y = v[1];
  1290.             out[0] = x * a[0];
  1291.             out[1] = x * a[1];
  1292.             out[2] = x * a[2];
  1293.             out[3] = y * a[3];
  1294.             out[4] = y * a[4];
  1295.             out[5] = y * a[5];
  1296.             out[6] = a[6];
  1297.             out[7] = a[7];
  1298.             out[8] = a[8];
  1299.             return out
  1300.         };
  1301.         mat3.fromMat2d = function(out, a) {
  1302.             out[0] = a[0];
  1303.             out[1] = a[1];
  1304.             out[2] = 0;
  1305.             out[3] = a[2];
  1306.             out[4] = a[3];
  1307.             out[5] = 0;
  1308.             out[6] = a[4];
  1309.             out[7] = a[5];
  1310.             out[8] = 1;
  1311.             return out
  1312.         };
  1313.         mat3.fromQuat = function(out, q) {
  1314.             var x = q[0],
  1315.                 y = q[1],
  1316.                 z = q[2],
  1317.                 w = q[3],
  1318.                 x2 = x + x,
  1319.                 y2 = y + y,
  1320.                 z2 = z + z,
  1321.                 xx = x * x2,
  1322.                 yx = y * x2,
  1323.                 yy = y * y2,
  1324.                 zx = z * x2,
  1325.                 zy = z * y2,
  1326.                 zz = z * z2,
  1327.                 wx = w * x2,
  1328.                 wy = w * y2,
  1329.                 wz = w * z2;
  1330.             out[0] = 1 - yy - zz;
  1331.             out[3] = yx - wz;
  1332.             out[6] = zx + wy;
  1333.             out[1] = yx + wz;
  1334.             out[4] = 1 - xx - zz;
  1335.             out[7] = zy - wx;
  1336.             out[2] = zx - wy;
  1337.             out[5] = zy + wx;
  1338.             out[8] = 1 - xx - yy;
  1339.             return out
  1340.         };
  1341.         mat3.normalFromMat4 = function(out, a) {
  1342.             var a00 = a[0],
  1343.                 a01 = a[1],
  1344.                 a02 = a[2],
  1345.                 a03 = a[3],
  1346.                 a10 = a[4],
  1347.                 a11 = a[5],
  1348.                 a12 = a[6],
  1349.                 a13 = a[7],
  1350.                 a20 = a[8],
  1351.                 a21 = a[9],
  1352.                 a22 = a[10],
  1353.                 a23 = a[11],
  1354.                 a30 = a[12],
  1355.                 a31 = a[13],
  1356.                 a32 = a[14],
  1357.                 a33 = a[15],
  1358.                 b00 = a00 * a11 - a01 * a10,
  1359.                 b01 = a00 * a12 - a02 * a10,
  1360.                 b02 = a00 * a13 - a03 * a10,
  1361.                 b03 = a01 * a12 - a02 * a11,
  1362.                 b04 = a01 * a13 - a03 * a11,
  1363.                 b05 = a02 * a13 - a03 * a12,
  1364.                 b06 = a20 * a31 - a21 * a30,
  1365.                 b07 = a20 * a32 - a22 * a30,
  1366.                 b08 = a20 * a33 - a23 * a30,
  1367.                 b09 = a21 * a32 - a22 * a31,
  1368.                 b10 = a21 * a33 - a23 * a31,
  1369.                 b11 = a22 * a33 - a23 * a32,
  1370.                 det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
  1371.             if (!det) {
  1372.                 return null
  1373.             }
  1374.             det = 1 / det;
  1375.             out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;
  1376.             out[1] = (a12 * b08 - a10 * b11 - a13 * b07) * det;
  1377.             out[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det;
  1378.             out[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det;
  1379.             out[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det;
  1380.             out[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det;
  1381.             out[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det;
  1382.             out[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det;
  1383.             out[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det;
  1384.             return out
  1385.         };
  1386.         mat3.str = function(a) {
  1387.             return "mat3(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ", " + a[4] + ", " + a[5] + ", " + a[6] + ", " + a[7] + ", " + a[8] + ")"
  1388.         };
  1389.         mat3.frob = function(a) {
  1390.             return Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2) + Math.pow(a[4], 2) + Math.pow(a[5], 2) + Math.pow(a[6], 2) + Math.pow(a[7], 2) + Math.pow(a[8], 2))
  1391.         };
  1392.         if (typeof exports !== "undefined") {
  1393.             exports.mat3 = mat3
  1394.         }
  1395.         var mat4 = {};
  1396.         mat4.create = function() {
  1397.             var out = new GLMAT_ARRAY_TYPE(16);
  1398.             out[0] = 1;
  1399.             out[1] = 0;
  1400.             out[2] = 0;
  1401.             out[3] = 0;
  1402.             out[4] = 0;
  1403.             out[5] = 1;
  1404.             out[6] = 0;
  1405.             out[7] = 0;
  1406.             out[8] = 0;
  1407.             out[9] = 0;
  1408.             out[10] = 1;
  1409.             out[11] = 0;
  1410.             out[12] = 0;
  1411.             out[13] = 0;
  1412.             out[14] = 0;
  1413.             out[15] = 1;
  1414.             return out
  1415.         };
  1416.         mat4.clone = function(a) {
  1417.             var out = new GLMAT_ARRAY_TYPE(16);
  1418.             out[0] = a[0];
  1419.             out[1] = a[1];
  1420.             out[2] = a[2];
  1421.             out[3] = a[3];
  1422.             out[4] = a[4];
  1423.             out[5] = a[5];
  1424.             out[6] = a[6];
  1425.             out[7] = a[7];
  1426.             out[8] = a[8];
  1427.             out[9] = a[9];
  1428.             out[10] = a[10];
  1429.             out[11] = a[11];
  1430.             out[12] = a[12];
  1431.             out[13] = a[13];
  1432.             out[14] = a[14];
  1433.             out[15] = a[15];
  1434.             return out
  1435.         };
  1436.         mat4.copy = function(out, a) {
  1437.             out[0] = a[0];
  1438.             out[1] = a[1];
  1439.             out[2] = a[2];
  1440.             out[3] = a[3];
  1441.             out[4] = a[4];
  1442.             out[5] = a[5];
  1443.             out[6] = a[6];
  1444.             out[7] = a[7];
  1445.             out[8] = a[8];
  1446.             out[9] = a[9];
  1447.             out[10] = a[10];
  1448.             out[11] = a[11];
  1449.             out[12] = a[12];
  1450.             out[13] = a[13];
  1451.             out[14] = a[14];
  1452.             out[15] = a[15];
  1453.             return out
  1454.         };
  1455.         mat4.identity = function(out) {
  1456.             out[0] = 1;
  1457.             out[1] = 0;
  1458.             out[2] = 0;
  1459.             out[3] = 0;
  1460.             out[4] = 0;
  1461.             out[5] = 1;
  1462.             out[6] = 0;
  1463.             out[7] = 0;
  1464.             out[8] = 0;
  1465.             out[9] = 0;
  1466.             out[10] = 1;
  1467.             out[11] = 0;
  1468.             out[12] = 0;
  1469.             out[13] = 0;
  1470.             out[14] = 0;
  1471.             out[15] = 1;
  1472.             return out
  1473.         };
  1474.         mat4.transpose = function(out, a) {
  1475.             if (out === a) {
  1476.                 var a01 = a[1],
  1477.                     a02 = a[2],
  1478.                     a03 = a[3],
  1479.                     a12 = a[6],
  1480.                     a13 = a[7],
  1481.                     a23 = a[11];
  1482.                 out[1] = a[4];
  1483.                 out[2] = a[8];
  1484.                 out[3] = a[12];
  1485.                 out[4] = a01;
  1486.                 out[6] = a[9];
  1487.                 out[7] = a[13];
  1488.                 out[8] = a02;
  1489.                 out[9] = a12;
  1490.                 out[11] = a[14];
  1491.                 out[12] = a03;
  1492.                 out[13] = a13;
  1493.                 out[14] = a23
  1494.             } else {
  1495.                 out[0] = a[0];
  1496.                 out[1] = a[4];
  1497.                 out[2] = a[8];
  1498.                 out[3] = a[12];
  1499.                 out[4] = a[1];
  1500.                 out[5] = a[5];
  1501.                 out[6] = a[9];
  1502.                 out[7] = a[13];
  1503.                 out[8] = a[2];
  1504.                 out[9] = a[6];
  1505.                 out[10] = a[10];
  1506.                 out[11] = a[14];
  1507.                 out[12] = a[3];
  1508.                 out[13] = a[7];
  1509.                 out[14] = a[11];
  1510.                 out[15] = a[15]
  1511.             }
  1512.             return out
  1513.         };
  1514.         mat4.invert = function(out, a) {
  1515.             var a00 = a[0],
  1516.                 a01 = a[1],
  1517.                 a02 = a[2],
  1518.                 a03 = a[3],
  1519.                 a10 = a[4],
  1520.                 a11 = a[5],
  1521.                 a12 = a[6],
  1522.                 a13 = a[7],
  1523.                 a20 = a[8],
  1524.                 a21 = a[9],
  1525.                 a22 = a[10],
  1526.                 a23 = a[11],
  1527.                 a30 = a[12],
  1528.                 a31 = a[13],
  1529.                 a32 = a[14],
  1530.                 a33 = a[15],
  1531.                 b00 = a00 * a11 - a01 * a10,
  1532.                 b01 = a00 * a12 - a02 * a10,
  1533.                 b02 = a00 * a13 - a03 * a10,
  1534.                 b03 = a01 * a12 - a02 * a11,
  1535.                 b04 = a01 * a13 - a03 * a11,
  1536.                 b05 = a02 * a13 - a03 * a12,
  1537.                 b06 = a20 * a31 - a21 * a30,
  1538.                 b07 = a20 * a32 - a22 * a30,
  1539.                 b08 = a20 * a33 - a23 * a30,
  1540.                 b09 = a21 * a32 - a22 * a31,
  1541.                 b10 = a21 * a33 - a23 * a31,
  1542.                 b11 = a22 * a33 - a23 * a32,
  1543.                 det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
  1544.             if (!det) {
  1545.                 return null
  1546.             }
  1547.             det = 1 / det;
  1548.             out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;
  1549.             out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;
  1550.             out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;
  1551.             out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;
  1552.             out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;
  1553.             out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;
  1554.             out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;
  1555.             out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;
  1556.             out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;
  1557.             out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;
  1558.             out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;
  1559.             out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;
  1560.             out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;
  1561.             out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;
  1562.             out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;
  1563.             out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;
  1564.             return out
  1565.         };
  1566.         mat4.adjoint = function(out, a) {
  1567.             var a00 = a[0],
  1568.                 a01 = a[1],
  1569.                 a02 = a[2],
  1570.                 a03 = a[3],
  1571.                 a10 = a[4],
  1572.                 a11 = a[5],
  1573.                 a12 = a[6],
  1574.                 a13 = a[7],
  1575.                 a20 = a[8],
  1576.                 a21 = a[9],
  1577.                 a22 = a[10],
  1578.                 a23 = a[11],
  1579.                 a30 = a[12],
  1580.                 a31 = a[13],
  1581.                 a32 = a[14],
  1582.                 a33 = a[15];
  1583.             out[0] = a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22);
  1584.             out[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22));
  1585.             out[2] = a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12);
  1586.             out[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12));
  1587.             out[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22));
  1588.             out[5] = a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22);
  1589.             out[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12));
  1590.             out[7] = a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12);
  1591.             out[8] = a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21);
  1592.             out[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21));
  1593.             out[10] = a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11);
  1594.             out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11));
  1595.             out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21));
  1596.             out[13] = a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21);
  1597.             out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11));
  1598.             out[15] = a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11);
  1599.             return out
  1600.         };
  1601.         mat4.determinant = function(a) {
  1602.             var a00 = a[0],
  1603.                 a01 = a[1],
  1604.                 a02 = a[2],
  1605.                 a03 = a[3],
  1606.                 a10 = a[4],
  1607.                 a11 = a[5],
  1608.                 a12 = a[6],
  1609.                 a13 = a[7],
  1610.                 a20 = a[8],
  1611.                 a21 = a[9],
  1612.                 a22 = a[10],
  1613.                 a23 = a[11],
  1614.                 a30 = a[12],
  1615.                 a31 = a[13],
  1616.                 a32 = a[14],
  1617.                 a33 = a[15],
  1618.                 b00 = a00 * a11 - a01 * a10,
  1619.                 b01 = a00 * a12 - a02 * a10,
  1620.                 b02 = a00 * a13 - a03 * a10,
  1621.                 b03 = a01 * a12 - a02 * a11,
  1622.                 b04 = a01 * a13 - a03 * a11,
  1623.                 b05 = a02 * a13 - a03 * a12,
  1624.                 b06 = a20 * a31 - a21 * a30,
  1625.                 b07 = a20 * a32 - a22 * a30,
  1626.                 b08 = a20 * a33 - a23 * a30,
  1627.                 b09 = a21 * a32 - a22 * a31,
  1628.                 b10 = a21 * a33 - a23 * a31,
  1629.                 b11 = a22 * a33 - a23 * a32;
  1630.             return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06
  1631.         };
  1632.         mat4.multiply = function(out, a, b) {
  1633.             var a00 = a[0],
  1634.                 a01 = a[1],
  1635.                 a02 = a[2],
  1636.                 a03 = a[3],
  1637.                 a10 = a[4],
  1638.                 a11 = a[5],
  1639.                 a12 = a[6],
  1640.                 a13 = a[7],
  1641.                 a20 = a[8],
  1642.                 a21 = a[9],
  1643.                 a22 = a[10],
  1644.                 a23 = a[11],
  1645.                 a30 = a[12],
  1646.                 a31 = a[13],
  1647.                 a32 = a[14],
  1648.                 a33 = a[15];
  1649.             var b0 = b[0],
  1650.                 b1 = b[1],
  1651.                 b2 = b[2],
  1652.                 b3 = b[3];
  1653.             out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;
  1654.             out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;
  1655.             out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;
  1656.             out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;
  1657.             b0 = b[4];
  1658.             b1 = b[5];
  1659.             b2 = b[6];
  1660.             b3 = b[7];
  1661.             out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;
  1662.             out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;
  1663.             out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;
  1664.             out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;
  1665.             b0 = b[8];
  1666.             b1 = b[9];
  1667.             b2 = b[10];
  1668.             b3 = b[11];
  1669.             out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;
  1670.             out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;
  1671.             out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;
  1672.             out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;
  1673.             b0 = b[12];
  1674.             b1 = b[13];
  1675.             b2 = b[14];
  1676.             b3 = b[15];
  1677.             out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;
  1678.             out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;
  1679.             out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;
  1680.             out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;
  1681.             return out
  1682.         };
  1683.         mat4.mul = mat4.multiply;
  1684.         mat4.translate = function(out, a, v) {
  1685.             var x = v[0],
  1686.                 y = v[1],
  1687.                 z = v[2],
  1688.                 a00, a01, a02, a03, a10, a11, a12, a13, a20, a21, a22, a23;
  1689.             if (a === out) {
  1690.                 out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];
  1691.                 out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];
  1692.                 out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];
  1693.                 out[15] = a[3] * x + a[7] * y + a[11] * z + a[15]
  1694.             } else {
  1695.                 a00 = a[0];
  1696.                 a01 = a[1];
  1697.                 a02 = a[2];
  1698.                 a03 = a[3];
  1699.                 a10 = a[4];
  1700.                 a11 = a[5];
  1701.                 a12 = a[6];
  1702.                 a13 = a[7];
  1703.                 a20 = a[8];
  1704.                 a21 = a[9];
  1705.                 a22 = a[10];
  1706.                 a23 = a[11];
  1707.                 out[0] = a00;
  1708.                 out[1] = a01;
  1709.                 out[2] = a02;
  1710.                 out[3] = a03;
  1711.                 out[4] = a10;
  1712.                 out[5] = a11;
  1713.                 out[6] = a12;
  1714.                 out[7] = a13;
  1715.                 out[8] = a20;
  1716.                 out[9] = a21;
  1717.                 out[10] = a22;
  1718.                 out[11] = a23;
  1719.                 out[12] = a00 * x + a10 * y + a20 * z + a[12];
  1720.                 out[13] = a01 * x + a11 * y + a21 * z + a[13];
  1721.                 out[14] = a02 * x + a12 * y + a22 * z + a[14];
  1722.                 out[15] = a03 * x + a13 * y + a23 * z + a[15]
  1723.             }
  1724.             return out
  1725.         };
  1726.         mat4.scale = function(out, a, v) {
  1727.             var x = v[0],
  1728.                 y = v[1],
  1729.                 z = v[2];
  1730.             out[0] = a[0] * x;
  1731.             out[1] = a[1] * x;
  1732.             out[2] = a[2] * x;
  1733.             out[3] = a[3] * x;
  1734.             out[4] = a[4] * y;
  1735.             out[5] = a[5] * y;
  1736.             out[6] = a[6] * y;
  1737.             out[7] = a[7] * y;
  1738.             out[8] = a[8] * z;
  1739.             out[9] = a[9] * z;
  1740.             out[10] = a[10] * z;
  1741.             out[11] = a[11] * z;
  1742.             out[12] = a[12];
  1743.             out[13] = a[13];
  1744.             out[14] = a[14];
  1745.             out[15] = a[15];
  1746.             return out
  1747.         };
  1748.         mat4.rotate = function(out, a, rad, axis) {
  1749.             var x = axis[0],
  1750.                 y = axis[1],
  1751.                 z = axis[2],
  1752.                 len = Math.sqrt(x * x + y * y + z * z),
  1753.                 s, c, t, a00, a01, a02, a03, a10, a11, a12, a13, a20, a21, a22, a23, b00, b01, b02, b10, b11, b12, b20, b21, b22;
  1754.             if (Math.abs(len) < GLMAT_EPSILON) {
  1755.                 return null
  1756.             }
  1757.             len = 1 / len;
  1758.             x *= len;
  1759.             y *= len;
  1760.             z *= len;
  1761.             s = Math.sin(rad);
  1762.             c = Math.cos(rad);
  1763.             t = 1 - c;
  1764.             a00 = a[0];
  1765.             a01 = a[1];
  1766.             a02 = a[2];
  1767.             a03 = a[3];
  1768.             a10 = a[4];
  1769.             a11 = a[5];
  1770.             a12 = a[6];
  1771.             a13 = a[7];
  1772.             a20 = a[8];
  1773.             a21 = a[9];
  1774.             a22 = a[10];
  1775.             a23 = a[11];
  1776.             b00 = x * x * t + c;
  1777.             b01 = y * x * t + z * s;
  1778.             b02 = z * x * t - y * s;
  1779.             b10 = x * y * t - z * s;
  1780.             b11 = y * y * t + c;
  1781.             b12 = z * y * t + x * s;
  1782.             b20 = x * z * t + y * s;
  1783.             b21 = y * z * t - x * s;
  1784.             b22 = z * z * t + c;
  1785.             out[0] = a00 * b00 + a10 * b01 + a20 * b02;
  1786.             out[1] = a01 * b00 + a11 * b01 + a21 * b02;
  1787.             out[2] = a02 * b00 + a12 * b01 + a22 * b02;
  1788.             out[3] = a03 * b00 + a13 * b01 + a23 * b02;
  1789.             out[4] = a00 * b10 + a10 * b11 + a20 * b12;
  1790.             out[5] = a01 * b10 + a11 * b11 + a21 * b12;
  1791.             out[6] = a02 * b10 + a12 * b11 + a22 * b12;
  1792.             out[7] = a03 * b10 + a13 * b11 + a23 * b12;
  1793.             out[8] = a00 * b20 + a10 * b21 + a20 * b22;
  1794.             out[9] = a01 * b20 + a11 * b21 + a21 * b22;
  1795.             out[10] = a02 * b20 + a12 * b21 + a22 * b22;
  1796.             out[11] = a03 * b20 + a13 * b21 + a23 * b22;
  1797.             if (a !== out) {
  1798.                 out[12] = a[12];
  1799.                 out[13] = a[13];
  1800.                 out[14] = a[14];
  1801.                 out[15] = a[15]
  1802.             }
  1803.             return out
  1804.         };
  1805.         mat4.rotateX = function(out, a, rad) {
  1806.             var s = Math.sin(rad),
  1807.                 c = Math.cos(rad),
  1808.                 a10 = a[4],
  1809.                 a11 = a[5],
  1810.                 a12 = a[6],
  1811.                 a13 = a[7],
  1812.                 a20 = a[8],
  1813.                 a21 = a[9],
  1814.                 a22 = a[10],
  1815.                 a23 = a[11];
  1816.             if (a !== out) {
  1817.                 out[0] = a[0];
  1818.                 out[1] = a[1];
  1819.                 out[2] = a[2];
  1820.                 out[3] = a[3];
  1821.                 out[12] = a[12];
  1822.                 out[13] = a[13];
  1823.                 out[14] = a[14];
  1824.                 out[15] = a[15]
  1825.             }
  1826.             out[4] = a10 * c + a20 * s;
  1827.             out[5] = a11 * c + a21 * s;
  1828.             out[6] = a12 * c + a22 * s;
  1829.             out[7] = a13 * c + a23 * s;
  1830.             out[8] = a20 * c - a10 * s;
  1831.             out[9] = a21 * c - a11 * s;
  1832.             out[10] = a22 * c - a12 * s;
  1833.             out[11] = a23 * c - a13 * s;
  1834.             return out
  1835.         };
  1836.         mat4.rotateY = function(out, a, rad) {
  1837.             var s = Math.sin(rad),
  1838.                 c = Math.cos(rad),
  1839.                 a00 = a[0],
  1840.                 a01 = a[1],
  1841.                 a02 = a[2],
  1842.                 a03 = a[3],
  1843.                 a20 = a[8],
  1844.                 a21 = a[9],
  1845.                 a22 = a[10],
  1846.                 a23 = a[11];
  1847.             if (a !== out) {
  1848.                 out[4] = a[4];
  1849.                 out[5] = a[5];
  1850.                 out[6] = a[6];
  1851.                 out[7] = a[7];
  1852.                 out[12] = a[12];
  1853.                 out[13] = a[13];
  1854.                 out[14] = a[14];
  1855.                 out[15] = a[15]
  1856.             }
  1857.             out[0] = a00 * c - a20 * s;
  1858.             out[1] = a01 * c - a21 * s;
  1859.             out[2] = a02 * c - a22 * s;
  1860.             out[3] = a03 * c - a23 * s;
  1861.             out[8] = a00 * s + a20 * c;
  1862.             out[9] = a01 * s + a21 * c;
  1863.             out[10] = a02 * s + a22 * c;
  1864.             out[11] = a03 * s + a23 * c;
  1865.             return out
  1866.         };
  1867.         mat4.rotateZ = function(out, a, rad) {
  1868.             var s = Math.sin(rad),
  1869.                 c = Math.cos(rad),
  1870.                 a00 = a[0],
  1871.                 a01 = a[1],
  1872.                 a02 = a[2],
  1873.                 a03 = a[3],
  1874.                 a10 = a[4],
  1875.                 a11 = a[5],
  1876.                 a12 = a[6],
  1877.                 a13 = a[7];
  1878.             if (a !== out) {
  1879.                 out[8] = a[8];
  1880.                 out[9] = a[9];
  1881.                 out[10] = a[10];
  1882.                 out[11] = a[11];
  1883.                 out[12] = a[12];
  1884.                 out[13] = a[13];
  1885.                 out[14] = a[14];
  1886.                 out[15] = a[15]
  1887.             }
  1888.             out[0] = a00 * c + a10 * s;
  1889.             out[1] = a01 * c + a11 * s;
  1890.             out[2] = a02 * c + a12 * s;
  1891.             out[3] = a03 * c + a13 * s;
  1892.             out[4] = a10 * c - a00 * s;
  1893.             out[5] = a11 * c - a01 * s;
  1894.             out[6] = a12 * c - a02 * s;
  1895.             out[7] = a13 * c - a03 * s;
  1896.             return out
  1897.         };
  1898.         mat4.fromRotationTranslation = function(out, q, v) {
  1899.             var x = q[0],
  1900.                 y = q[1],
  1901.                 z = q[2],
  1902.                 w = q[3],
  1903.                 x2 = x + x,
  1904.                 y2 = y + y,
  1905.                 z2 = z + z,
  1906.                 xx = x * x2,
  1907.                 xy = x * y2,
  1908.                 xz = x * z2,
  1909.                 yy = y * y2,
  1910.                 yz = y * z2,
  1911.                 zz = z * z2,
  1912.                 wx = w * x2,
  1913.                 wy = w * y2,
  1914.                 wz = w * z2;
  1915.             out[0] = 1 - (yy + zz);
  1916.             out[1] = xy + wz;
  1917.             out[2] = xz - wy;
  1918.             out[3] = 0;
  1919.             out[4] = xy - wz;
  1920.             out[5] = 1 - (xx + zz);
  1921.             out[6] = yz + wx;
  1922.             out[7] = 0;
  1923.             out[8] = xz + wy;
  1924.             out[9] = yz - wx;
  1925.             out[10] = 1 - (xx + yy);
  1926.             out[11] = 0;
  1927.             out[12] = v[0];
  1928.             out[13] = v[1];
  1929.             out[14] = v[2];
  1930.             out[15] = 1;
  1931.             return out
  1932.         };
  1933.         mat4.fromQuat = function(out, q) {
  1934.             var x = q[0],
  1935.                 y = q[1],
  1936.                 z = q[2],
  1937.                 w = q[3],
  1938.                 x2 = x + x,
  1939.                 y2 = y + y,
  1940.                 z2 = z + z,
  1941.                 xx = x * x2,
  1942.                 yx = y * x2,
  1943.                 yy = y * y2,
  1944.                 zx = z * x2,
  1945.                 zy = z * y2,
  1946.                 zz = z * z2,
  1947.                 wx = w * x2,
  1948.                 wy = w * y2,
  1949.                 wz = w * z2;
  1950.             out[0] = 1 - yy - zz;
  1951.             out[1] = yx + wz;
  1952.             out[2] = zx - wy;
  1953.             out[3] = 0;
  1954.             out[4] = yx - wz;
  1955.             out[5] = 1 - xx - zz;
  1956.             out[6] = zy + wx;
  1957.             out[7] = 0;
  1958.             out[8] = zx + wy;
  1959.             out[9] = zy - wx;
  1960.             out[10] = 1 - xx - yy;
  1961.             out[11] = 0;
  1962.             out[12] = 0;
  1963.             out[13] = 0;
  1964.             out[14] = 0;
  1965.             out[15] = 1;
  1966.             return out
  1967.         };
  1968.         mat4.frustum = function(out, left, right, bottom, top, near, far) {
  1969.             var rl = 1 / (right - left),
  1970.                 tb = 1 / (top - bottom),
  1971.                 nf = 1 / (near - far);
  1972.             out[0] = near * 2 * rl;
  1973.             out[1] = 0;
  1974.             out[2] = 0;
  1975.             out[3] = 0;
  1976.             out[4] = 0;
  1977.             out[5] = near * 2 * tb;
  1978.             out[6] = 0;
  1979.             out[7] = 0;
  1980.             out[8] = (right + left) * rl;
  1981.             out[9] = (top + bottom) * tb;
  1982.             out[10] = (far + near) * nf;
  1983.             out[11] = -1;
  1984.             out[12] = 0;
  1985.             out[13] = 0;
  1986.             out[14] = far * near * 2 * nf;
  1987.             out[15] = 0;
  1988.             return out
  1989.         };
  1990.         mat4.perspective = function(out, fovy, aspect, near, far) {
  1991.             var f = 1 / Math.tan(fovy / 2),
  1992.                 nf = 1 / (near - far);
  1993.             out[0] = f / aspect;
  1994.             out[1] = 0;
  1995.             out[2] = 0;
  1996.             out[3] = 0;
  1997.             out[4] = 0;
  1998.             out[5] = f;
  1999.             out[6] = 0;
  2000.             out[7] = 0;
  2001.             out[8] = 0;
  2002.             out[9] = 0;
  2003.             out[10] = (far + near) * nf;
  2004.             out[11] = -1;
  2005.             out[12] = 0;
  2006.             out[13] = 0;
  2007.             out[14] = 2 * far * near * nf;
  2008.             out[15] = 0;
  2009.             return out
  2010.         };
  2011.         mat4.ortho = function(out, left, right, bottom, top, near, far) {
  2012.             var lr = 1 / (left - right),
  2013.                 bt = 1 / (bottom - top),
  2014.                 nf = 1 / (near - far);
  2015.             out[0] = -2 * lr;
  2016.             out[1] = 0;
  2017.             out[2] = 0;
  2018.             out[3] = 0;
  2019.             out[4] = 0;
  2020.             out[5] = -2 * bt;
  2021.             out[6] = 0;
  2022.             out[7] = 0;
  2023.             out[8] = 0;
  2024.             out[9] = 0;
  2025.             out[10] = 2 * nf;
  2026.             out[11] = 0;
  2027.             out[12] = (left + right) * lr;
  2028.             out[13] = (top + bottom) * bt;
  2029.             out[14] = (far + near) * nf;
  2030.             out[15] = 1;
  2031.             return out
  2032.         };
  2033.         mat4.lookAt = function(out, eye, center, up) {
  2034.             var x0, x1, x2, y0, y1, y2, z0, z1, z2, len, eyex = eye[0],
  2035.                 eyey = eye[1],
  2036.                 eyez = eye[2],
  2037.                 upx = up[0],
  2038.                 upy = up[1],
  2039.                 upz = up[2],
  2040.                 centerx = center[0],
  2041.                 centery = center[1],
  2042.                 centerz = center[2];
  2043.             if (Math.abs(eyex - centerx) < GLMAT_EPSILON && Math.abs(eyey - centery) < GLMAT_EPSILON && Math.abs(eyez - centerz) < GLMAT_EPSILON) {
  2044.                 return mat4.identity(out)
  2045.             }
  2046.             z0 = eyex - centerx;
  2047.             z1 = eyey - centery;
  2048.             z2 = eyez - centerz;
  2049.  
  2050.             len = 1 / Math.sqrt(z0 * z0 + z1 * z1 + z2 * z2);
  2051.             z0 *= len;
  2052.             z1 *= len;
  2053.             z2 *= len;
  2054.             x0 = upy * z2 - upz * z1;
  2055.             x1 = upz * z0 - upx * z2;
  2056.             x2 = upx * z1 - upy * z0;
  2057.             len = Math.sqrt(x0 * x0 + x1 * x1 + x2 * x2);
  2058.             if (!len) {
  2059.                 x0 = 0;
  2060.                 x1 = 0;
  2061.                 x2 = 0
  2062.             } else {
  2063.                 len = 1 / len;
  2064.                 x0 *= len;
  2065.                 x1 *= len;
  2066.                 x2 *= len
  2067.             }
  2068.             y0 = z1 * x2 - z2 * x1;
  2069.             y1 = z2 * x0 - z0 * x2;
  2070.             y2 = z0 * x1 - z1 * x0;
  2071.             len = Math.sqrt(y0 * y0 + y1 * y1 + y2 * y2);
  2072.             if (!len) {
  2073.                 y0 = 0;
  2074.                 y1 = 0;
  2075.                 y2 = 0
  2076.             } else {
  2077.                 len = 1 / len;
  2078.                 y0 *= len;
  2079.                 y1 *= len;
  2080.                 y2 *= len
  2081.             }
  2082.             out[0] = x0;
  2083.             out[1] = y0;
  2084.             out[2] = z0;
  2085.             out[3] = 0;
  2086.             out[4] = x1;
  2087.             out[5] = y1;
  2088.             out[6] = z1;
  2089.             out[7] = 0;
  2090.             out[8] = x2;
  2091.             out[9] = y2;
  2092.             out[10] = z2;
  2093.             out[11] = 0;
  2094.             out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);
  2095.             out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);
  2096.             out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);
  2097.             out[15] = 1;
  2098.             return out
  2099.         };
  2100.         mat4.str = function(a) {
  2101.             return "mat4(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ", " + a[4] + ", " + a[5] + ", " + a[6] + ", " + a[7] + ", " + a[8] + ", " + a[9] + ", " + a[10] + ", " + a[11] + ", " + a[12] + ", " + a[13] + ", " + a[14] + ", " + a[15] + ")"
  2102.         };
  2103.         mat4.frob = function(a) {
  2104.             return Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2) + Math.pow(a[4], 2) + Math.pow(a[5], 2) + Math.pow(a[6], 2) + Math.pow(a[6], 2) + Math.pow(a[7], 2) + Math.pow(a[8], 2) + Math.pow(a[9], 2) + Math.pow(a[10], 2) + Math.pow(a[11], 2) + Math.pow(a[12], 2) + Math.pow(a[13], 2) + Math.pow(a[14], 2) + Math.pow(a[15], 2))
  2105.         };
  2106.         if (typeof exports !== "undefined") {
  2107.             exports.mat4 = mat4
  2108.         }
  2109.         var quat = {};
  2110.         quat.create = function() {
  2111.             var out = new GLMAT_ARRAY_TYPE(4);
  2112.             out[0] = 0;
  2113.             out[1] = 0;
  2114.             out[2] = 0;
  2115.             out[3] = 1;
  2116.             return out
  2117.         };
  2118.         quat.rotationTo = function() {
  2119.             var tmpvec3 = vec3.create();
  2120.             var xUnitVec3 = vec3.fromValues(1, 0, 0);
  2121.             var yUnitVec3 = vec3.fromValues(0, 1, 0);
  2122.             return function(out, a, b) {
  2123.                 var dot = vec3.dot(a, b);
  2124.                 if (dot < -.999999) {
  2125.                     vec3.cross(tmpvec3, xUnitVec3, a);
  2126.                     if (vec3.length(tmpvec3) < 1e-6) vec3.cross(tmpvec3, yUnitVec3, a);
  2127.                     vec3.normalize(tmpvec3, tmpvec3);
  2128.                     quat.setAxisAngle(out, tmpvec3, Math.PI);
  2129.                     return out
  2130.                 } else if (dot > .999999) {
  2131.                     out[0] = 0;
  2132.                     out[1] = 0;
  2133.                     out[2] = 0;
  2134.                     out[3] = 1;
  2135.                     return out
  2136.                 } else {
  2137.                     vec3.cross(tmpvec3, a, b);
  2138.                     out[0] = tmpvec3[0];
  2139.                     out[1] = tmpvec3[1];
  2140.                     out[2] = tmpvec3[2];
  2141.                     out[3] = 1 + dot;
  2142.                     return quat.normalize(out, out)
  2143.                 }
  2144.             }
  2145.         }();
  2146.         quat.setAxes = function() {
  2147.             var matr = mat3.create();
  2148.             return function(out, view, right, up) {
  2149.                 matr[0] = right[0];
  2150.                 matr[3] = right[1];
  2151.                 matr[6] = right[2];
  2152.                 matr[1] = up[0];
  2153.                 matr[4] = up[1];
  2154.                 matr[7] = up[2];
  2155.                 matr[2] = -view[0];
  2156.                 matr[5] = -view[1];
  2157.                 matr[8] = -view[2];
  2158.                 return quat.normalize(out, quat.fromMat3(out, matr))
  2159.             }
  2160.         }();
  2161.         quat.clone = vec4.clone;
  2162.         quat.fromValues = vec4.fromValues;
  2163.         quat.copy = vec4.copy;
  2164.         quat.set = vec4.set;
  2165.         quat.identity = function(out) {
  2166.             out[0] = 0;
  2167.             out[1] = 0;
  2168.             out[2] = 0;
  2169.             out[3] = 1;
  2170.             return out
  2171.         };
  2172.         quat.setAxisAngle = function(out, axis, rad) {
  2173.             rad = rad * .5;
  2174.             var s = Math.sin(rad);
  2175.             out[0] = s * axis[0];
  2176.             out[1] = s * axis[1];
  2177.             out[2] = s * axis[2];
  2178.             out[3] = Math.cos(rad);
  2179.             return out
  2180.         };
  2181.         quat.add = vec4.add;
  2182.         quat.multiply = function(out, a, b) {
  2183.             var ax = a[0],
  2184.                 ay = a[1],
  2185.                 az = a[2],
  2186.                 aw = a[3],
  2187.                 bx = b[0],
  2188.                 by = b[1],
  2189.                 bz = b[2],
  2190.                 bw = b[3];
  2191.             out[0] = ax * bw + aw * bx + ay * bz - az * by;
  2192.             out[1] = ay * bw + aw * by + az * bx - ax * bz;
  2193.             out[2] = az * bw + aw * bz + ax * by - ay * bx;
  2194.             out[3] = aw * bw - ax * bx - ay * by - az * bz;
  2195.             return out
  2196.         };
  2197.         quat.mul = quat.multiply;
  2198.         quat.scale = vec4.scale;
  2199.         quat.rotateX = function(out, a, rad) {
  2200.             rad *= .5;
  2201.             var ax = a[0],
  2202.                 ay = a[1],
  2203.                 az = a[2],
  2204.                 aw = a[3],
  2205.                 bx = Math.sin(rad),
  2206.                 bw = Math.cos(rad);
  2207.             out[0] = ax * bw + aw * bx;
  2208.             out[1] = ay * bw + az * bx;
  2209.             out[2] = az * bw - ay * bx;
  2210.             out[3] = aw * bw - ax * bx;
  2211.             return out
  2212.         };
  2213.         quat.rotateY = function(out, a, rad) {
  2214.             rad *= .5;
  2215.             var ax = a[0],
  2216.                 ay = a[1],
  2217.                 az = a[2],
  2218.                 aw = a[3],
  2219.                 by = Math.sin(rad),
  2220.                 bw = Math.cos(rad);
  2221.             out[0] = ax * bw - az * by;
  2222.             out[1] = ay * bw + aw * by;
  2223.             out[2] = az * bw + ax * by;
  2224.             out[3] = aw * bw - ay * by;
  2225.             return out
  2226.         };
  2227.         quat.rotateZ = function(out, a, rad) {
  2228.             rad *= .5;
  2229.             var ax = a[0],
  2230.                 ay = a[1],
  2231.                 az = a[2],
  2232.                 aw = a[3],
  2233.                 bz = Math.sin(rad),
  2234.                 bw = Math.cos(rad);
  2235.             out[0] = ax * bw + ay * bz;
  2236.             out[1] = ay * bw - ax * bz;
  2237.             out[2] = az * bw + aw * bz;
  2238.             out[3] = aw * bw - az * bz;
  2239.             return out
  2240.         };
  2241.         quat.calculateW = function(out, a) {
  2242.             var x = a[0],
  2243.                 y = a[1],
  2244.                 z = a[2];
  2245.             out[0] = x;
  2246.             out[1] = y;
  2247.             out[2] = z;
  2248.             out[3] = -Math.sqrt(Math.abs(1 - x * x - y * y - z * z));
  2249.             return out
  2250.         };
  2251.         quat.dot = vec4.dot;
  2252.         quat.lerp = vec4.lerp;
  2253.         quat.slerp = function(out, a, b, t) {
  2254.             var ax = a[0],
  2255.                 ay = a[1],
  2256.                 az = a[2],
  2257.                 aw = a[3],
  2258.                 bx = b[0],
  2259.                 by = b[1],
  2260.                 bz = b[2],
  2261.                 bw = b[3];
  2262.             var omega, cosom, sinom, scale0, scale1;
  2263.             cosom = ax * bx + ay * by + az * bz + aw * bw;
  2264.             if (cosom < 0) {
  2265.                 cosom = -cosom;
  2266.                 bx = -bx;
  2267.                 by = -by;
  2268.                 bz = -bz;
  2269.                 bw = -bw
  2270.             }
  2271.             if (1 - cosom > 1e-6) {
  2272.                 omega = Math.acos(cosom);
  2273.                 sinom = Math.sin(omega);
  2274.                 scale0 = Math.sin((1 - t) * omega) / sinom;
  2275.                 scale1 = Math.sin(t * omega) / sinom
  2276.             } else {
  2277.                 scale0 = 1 - t;
  2278.                 scale1 = t
  2279.             }
  2280.             out[0] = scale0 * ax + scale1 * bx;
  2281.             out[1] = scale0 * ay + scale1 * by;
  2282.             out[2] = scale0 * az + scale1 * bz;
  2283.             out[3] = scale0 * aw + scale1 * bw;
  2284.             return out
  2285.         };
  2286.         quat.invert = function(out, a) {
  2287.             var a0 = a[0],
  2288.                 a1 = a[1],
  2289.                 a2 = a[2],
  2290.                 a3 = a[3],
  2291.                 dot = a0 * a0 + a1 * a1 + a2 * a2 + a3 * a3,
  2292.                 invDot = dot ? 1 / dot : 0;
  2293.             out[0] = -a0 * invDot;
  2294.             out[1] = -a1 * invDot;
  2295.             out[2] = -a2 * invDot;
  2296.             out[3] = a3 * invDot;
  2297.             return out
  2298.         };
  2299.         quat.conjugate = function(out, a) {
  2300.             out[0] = -a[0];
  2301.             out[1] = -a[1];
  2302.             out[2] = -a[2];
  2303.             out[3] = a[3];
  2304.             return out
  2305.         };
  2306.         quat.length = vec4.length;
  2307.         quat.len = quat.length;
  2308.         quat.squaredLength = vec4.squaredLength;
  2309.         quat.sqrLen = quat.squaredLength;
  2310.         quat.normalize = vec4.normalize;
  2311.         quat.fromMat3 = function(out, m) {
  2312.             var fTrace = m[0] + m[4] + m[8];
  2313.             var fRoot;
  2314.             if (fTrace > 0) {
  2315.                 fRoot = Math.sqrt(fTrace + 1);
  2316.                 out[3] = .5 * fRoot;
  2317.                 fRoot = .5 / fRoot;
  2318.                 out[0] = (m[7] - m[5]) * fRoot;
  2319.                 out[1] = (m[2] - m[6]) * fRoot;
  2320.                 out[2] = (m[3] - m[1]) * fRoot
  2321.             } else {
  2322.                 var i = 0;
  2323.                 if (m[4] > m[0]) i = 1;
  2324.                 if (m[8] > m[i * 3 + i]) i = 2;
  2325.                 var j = (i + 1) % 3;
  2326.                 var k = (i + 2) % 3;
  2327.                 fRoot = Math.sqrt(m[i * 3 + i] - m[j * 3 + j] - m[k * 3 + k] + 1);
  2328.                 out[i] = .5 * fRoot;
  2329.                 fRoot = .5 / fRoot;
  2330.                 out[3] = (m[k * 3 + j] - m[j * 3 + k]) * fRoot;
  2331.                 out[j] = (m[j * 3 + i] + m[i * 3 + j]) * fRoot;
  2332.                 out[k] = (m[k * 3 + i] + m[i * 3 + k]) * fRoot
  2333.             }
  2334.             return out
  2335.         };
  2336.         quat.str = function(a) {
  2337.             return "quat(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ")"
  2338.         };
  2339.         if (typeof exports !== "undefined") {
  2340.             exports.quat = quat
  2341.         }
  2342.     })(shim.exports)
  2343. })(this);
  2344. ! function(e) {
  2345.     if ("object" == typeof exports && "undefined" != typeof module) module.exports = e();
  2346.     else if ("function" == typeof define && define.amd) define([], e);
  2347.     else {
  2348.         var f;
  2349.         "undefined" != typeof window ? f = window : "undefined" != typeof global ? f = global : "undefined" != typeof self && (f = self), f.pako = e()
  2350.     }
  2351. }(function() {
  2352.     var define, module, exports;
  2353.     return function e(t, n, r) {
  2354.         function s(o, u) {
  2355.             if (!n[o]) {
  2356.                 if (!t[o]) {
  2357.                     var a = typeof require == "function" && require;
  2358.                     if (!u && a) return a(o, !0);
  2359.                     if (i) return i(o, !0);
  2360.                     throw new Error("Cannot find module '" + o + "'")
  2361.                 }
  2362.                 var f = n[o] = {
  2363.                     exports: {}
  2364.                 };
  2365.                 t[o][0].call(f.exports, function(e) {
  2366.                     var n = t[o][1][e];
  2367.                     return s(n ? n : e)
  2368.                 }, f, f.exports, e, t, n, r)
  2369.             }
  2370.             return n[o].exports
  2371.         }
  2372.         var i = typeof require == "function" && require;
  2373.         for (var o = 0; o < r.length; o++) s(r[o]);
  2374.         return s
  2375.     }({
  2376.         1: [function(_dereq_, module, exports) {
  2377.             "use strict";
  2378.             var zlib_inflate = _dereq_("./zlib/inflate.js");
  2379.             var utils = _dereq_("./utils/common");
  2380.             var strings = _dereq_("./utils/strings");
  2381.             var c = _dereq_("./zlib/constants");
  2382.             var msg = _dereq_("./zlib/messages");
  2383.             var zstream = _dereq_("./zlib/zstream");
  2384.             var gzheader = _dereq_("./zlib/gzheader");
  2385.             var Inflate = function(options) {
  2386.                 this.options = utils.assign({
  2387.                     chunkSize: 16384,
  2388.                     windowBits: 0,
  2389.                     to: ""
  2390.                 }, options || {});
  2391.                 var opt = this.options;
  2392.                 if (opt.raw && opt.windowBits >= 0 && opt.windowBits < 16) {
  2393.                     opt.windowBits = -opt.windowBits;
  2394.                     if (opt.windowBits === 0) {
  2395.                         opt.windowBits = -15
  2396.                     }
  2397.                 }
  2398.                 if (opt.windowBits >= 0 && opt.windowBits < 16 && !(options && options.windowBits)) {
  2399.                     opt.windowBits += 32
  2400.                 }
  2401.                 if (opt.windowBits > 15 && opt.windowBits < 48) {
  2402.                     if ((opt.windowBits & 15) === 0) {
  2403.                         opt.windowBits |= 15
  2404.                     }
  2405.                 }
  2406.                 this.err = 0;
  2407.                 this.msg = "";
  2408.                 this.ended = false;
  2409.                 this.chunks = [];
  2410.                 this.strm = new zstream;
  2411.                 this.strm.avail_out = 0;
  2412.                 var status = zlib_inflate.inflateInit2(this.strm, opt.windowBits);
  2413.                 if (status !== c.Z_OK) {
  2414.                     throw new Error(msg[status])
  2415.                 }
  2416.                 this.header = new gzheader;
  2417.                 zlib_inflate.inflateGetHeader(this.strm, this.header)
  2418.             };
  2419.             Inflate.prototype.push = function(data, mode) {
  2420.                 var strm = this.strm;
  2421.                 var chunkSize = this.options.chunkSize;
  2422.                 var status, _mode;
  2423.                 var next_out_utf8, tail, utf8str;
  2424.                 if (this.ended) {
  2425.                     return false
  2426.                 }
  2427.                 _mode = mode === ~~mode ? mode : mode === true ? c.Z_FINISH : c.Z_NO_FLUSH;
  2428.                 if (typeof data === "string") {
  2429.                     strm.input = strings.binstring2buf(data)
  2430.                 } else {
  2431.                     strm.input = data
  2432.                 }
  2433.                 strm.next_in = 0;
  2434.                 strm.avail_in = strm.input.length;
  2435.                 do {
  2436.                     if (strm.avail_out === 0) {
  2437.                         strm.output = new utils.Buf8(chunkSize);
  2438.                         strm.next_out = 0;
  2439.                         strm.avail_out = chunkSize
  2440.                     }
  2441.                     status = zlib_inflate.inflate(strm, c.Z_NO_FLUSH);
  2442.                     if (status !== c.Z_STREAM_END && status !== c.Z_OK) {
  2443.                         this.onEnd(status);
  2444.                         this.ended = true;
  2445.                         return false
  2446.                     }
  2447.                     if (strm.next_out) {
  2448.                         if (strm.avail_out === 0 || status === c.Z_STREAM_END || strm.avail_in === 0 && _mode === c.Z_FINISH) {
  2449.                             if (this.options.to === "string") {
  2450.                                 next_out_utf8 = strings.utf8border(strm.output, strm.next_out);
  2451.                                 tail = strm.next_out - next_out_utf8;
  2452.                                 utf8str = strings.buf2string(strm.output, next_out_utf8);
  2453.                                 strm.next_out = tail;
  2454.                                 strm.avail_out = chunkSize - tail;
  2455.                                 if (tail) {
  2456.                                     utils.arraySet(strm.output, strm.output, next_out_utf8, tail, 0)
  2457.                                 }
  2458.                                 this.onData(utf8str)
  2459.                             } else {
  2460.                                 this.onData(utils.shrinkBuf(strm.output, strm.next_out))
  2461.                             }
  2462.                         }
  2463.                     }
  2464.                 } while (strm.avail_in > 0 && status !== c.Z_STREAM_END);
  2465.                 if (status === c.Z_STREAM_END) {
  2466.                     _mode = c.Z_FINISH
  2467.                 }
  2468.                 if (_mode === c.Z_FINISH) {
  2469.                     status = zlib_inflate.inflateEnd(this.strm);
  2470.                     this.onEnd(status);
  2471.                     this.ended = true;
  2472.                     return status === c.Z_OK
  2473.                 }
  2474.                 return true
  2475.             };
  2476.             Inflate.prototype.onData = function(chunk) {
  2477.                 this.chunks.push(chunk)
  2478.             };
  2479.             Inflate.prototype.onEnd = function(status) {
  2480.                 if (status === c.Z_OK) {
  2481.                     if (this.options.to === "string") {
  2482.                         this.result = this.chunks.join("")
  2483.                     } else {
  2484.                         this.result = utils.flattenChunks(this.chunks)
  2485.                     }
  2486.                 }
  2487.                 this.chunks = [];
  2488.                 this.err = status;
  2489.                 this.msg = this.strm.msg
  2490.             };
  2491.  
  2492.             function inflate(input, options) {
  2493.                 var inflator = new Inflate(options);
  2494.                 inflator.push(input, true);
  2495.                 if (inflator.err) {
  2496.                     throw inflator.msg
  2497.                 }
  2498.                 return inflator.result
  2499.             }
  2500.  
  2501.             function inflateRaw(input, options) {
  2502.                 options = options || {};
  2503.                 options.raw = true;
  2504.                 return inflate(input, options)
  2505.             }
  2506.             exports.Inflate = Inflate;
  2507.             exports.inflate = inflate;
  2508.             exports.inflateRaw = inflateRaw;
  2509.             exports.ungzip = inflate
  2510.         }, {
  2511.             "./utils/common": 2,
  2512.             "./utils/strings": 3,
  2513.             "./zlib/constants": 5,
  2514.             "./zlib/gzheader": 7,
  2515.             "./zlib/inflate.js": 9,
  2516.             "./zlib/messages": 11,
  2517.             "./zlib/zstream": 12
  2518.         }],
  2519.         2: [function(_dereq_, module, exports) {
  2520.             "use strict";
  2521.             var TYPED_OK = typeof Uint8Array !== "undefined" && typeof Uint16Array !== "undefined" && typeof Int32Array !== "undefined";
  2522.             exports.assign = function(obj) {
  2523.                 var sources = Array.prototype.slice.call(arguments, 1);
  2524.                 while (sources.length) {
  2525.                     var source = sources.shift();
  2526.                     if (!source) {
  2527.                         continue
  2528.                     }
  2529.                     if (typeof source !== "object") {
  2530.                         throw new TypeError(source + "must be non-object")
  2531.                     }
  2532.                     for (var p in source) {
  2533.                         if (source.hasOwnProperty(p)) {
  2534.                             obj[p] = source[p]
  2535.                         }
  2536.                     }
  2537.                 }
  2538.                 return obj
  2539.             };
  2540.             exports.shrinkBuf = function(buf, size) {
  2541.                 if (buf.length === size) {
  2542.                     return buf
  2543.                 }
  2544.                 if (buf.subarray) {
  2545.                     return buf.subarray(0, size)
  2546.                 }
  2547.                 buf.length = size;
  2548.                 return buf
  2549.             };
  2550.             var fnTyped = {
  2551.                 arraySet: function(dest, src, src_offs, len, dest_offs) {
  2552.                     if (src.subarray && dest.subarray) {
  2553.                         dest.set(src.subarray(src_offs, src_offs + len), dest_offs);
  2554.                         return
  2555.                     }
  2556.                     for (var i = 0; i < len; i++) {
  2557.                         dest[dest_offs + i] = src[src_offs + i]
  2558.                     }
  2559.                 },
  2560.                 flattenChunks: function(chunks) {
  2561.                     var i, l, len, pos, chunk, result;
  2562.                     len = 0;
  2563.                     for (i = 0, l = chunks.length; i < l; i++) {
  2564.                         len += chunks[i].length
  2565.                     }
  2566.                     result = new Uint8Array(len);
  2567.                     pos = 0;
  2568.                     for (i = 0, l = chunks.length; i < l; i++) {
  2569.                         chunk = chunks[i];
  2570.                         result.set(chunk, pos);
  2571.                         pos += chunk.length
  2572.                     }
  2573.                     return result
  2574.                 }
  2575.             };
  2576.             var fnUntyped = {
  2577.                 arraySet: function(dest, src, src_offs, len, dest_offs) {
  2578.                     for (var i = 0; i < len; i++) {
  2579.                         dest[dest_offs + i] = src[src_offs + i]
  2580.                     }
  2581.                 },
  2582.                 flattenChunks: function(chunks) {
  2583.                     return [].concat.apply([], chunks)
  2584.                 }
  2585.             };
  2586.             exports.setTyped = function(on) {
  2587.                 if (on) {
  2588.                     exports.Buf8 = Uint8Array;
  2589.                     exports.Buf16 = Uint16Array;
  2590.                     exports.Buf32 = Int32Array;
  2591.                     exports.assign(exports, fnTyped)
  2592.                 } else {
  2593.                     exports.Buf8 = Array;
  2594.                     exports.Buf16 = Array;
  2595.                     exports.Buf32 = Array;
  2596.                     exports.assign(exports, fnUntyped)
  2597.                 }
  2598.             };
  2599.             exports.setTyped(TYPED_OK)
  2600.         }, {}],
  2601.         3: [function(_dereq_, module, exports) {
  2602.             "use strict";
  2603.             var utils = _dereq_("./common");
  2604.             var STR_APPLY_OK = true;
  2605.             var STR_APPLY_UIA_OK = true;
  2606.             try {
  2607.                 String.fromCharCode.apply(null, [0])
  2608.             } catch (__) {
  2609.                 STR_APPLY_OK = false
  2610.             }
  2611.             try {
  2612.                 String.fromCharCode.apply(null, new Uint8Array(1))
  2613.             } catch (__) {
  2614.                 STR_APPLY_UIA_OK = false
  2615.             }
  2616.             var _utf8len = new utils.Buf8(256);
  2617.             for (var i = 0; i < 256; i++) {
  2618.                 _utf8len[i] = i >= 252 ? 6 : i >= 248 ? 5 : i >= 240 ? 4 : i >= 224 ? 3 : i >= 192 ? 2 : 1
  2619.             }
  2620.             _utf8len[254] = _utf8len[254] = 1;
  2621.             exports.string2buf = function(str) {
  2622.                 var buf, c, c2, m_pos, i, str_len = str.length,
  2623.                     buf_len = 0;
  2624.                 for (m_pos = 0; m_pos < str_len; m_pos++) {
  2625.                     c = str.charCodeAt(m_pos);
  2626.                     if ((c & 64512) === 55296 && m_pos + 1 < str_len) {
  2627.                         c2 = str.charCodeAt(m_pos + 1);
  2628.                         if ((c2 & 64512) === 56320) {
  2629.                             c = 65536 + (c - 55296 << 10) + (c2 - 56320);
  2630.                             m_pos++
  2631.                         }
  2632.                     }
  2633.                     buf_len += c < 128 ? 1 : c < 2048 ? 2 : c < 65536 ? 3 : 4
  2634.                 }
  2635.                 buf = new utils.Buf8(buf_len);
  2636.                 for (i = 0, m_pos = 0; i < buf_len; m_pos++) {
  2637.                     c = str.charCodeAt(m_pos);
  2638.                     if ((c & 64512) === 55296 && m_pos + 1 < str_len) {
  2639.                         c2 = str.charCodeAt(m_pos + 1);
  2640.                         if ((c2 & 64512) === 56320) {
  2641.                             c = 65536 + (c - 55296 << 10) + (c2 - 56320);
  2642.                             m_pos++
  2643.                         }
  2644.                     }
  2645.                     if (c < 128) {
  2646.                         buf[i++] = c
  2647.                     } else if (c < 2048) {
  2648.                         buf[i++] = 192 | c >>> 6;
  2649.                         buf[i++] = 128 | c & 63
  2650.                     } else if (c < 65536) {
  2651.                         buf[i++] = 224 | c >>> 12;
  2652.                         buf[i++] = 128 | c >>> 6 & 63;
  2653.                         buf[i++] = 128 | c & 63
  2654.                     } else {
  2655.                         buf[i++] = 240 | c >>> 18;
  2656.                         buf[i++] = 128 | c >>> 12 & 63;
  2657.                         buf[i++] = 128 | c >>> 6 & 63;
  2658.                         buf[i++] = 128 | c & 63
  2659.                     }
  2660.                 }
  2661.                 return buf
  2662.             };
  2663.  
  2664.             function buf2binstring(buf, len) {
  2665.                 if (len < 65537) {
  2666.                     if (buf.subarray && STR_APPLY_UIA_OK || !buf.subarray && STR_APPLY_OK) {
  2667.                         return String.fromCharCode.apply(null, utils.shrinkBuf(buf, len))
  2668.                     }
  2669.                 }
  2670.                 var result = "";
  2671.                 for (var i = 0; i < len; i++) {
  2672.                     result += String.fromCharCode(buf[i])
  2673.                 }
  2674.                 return result
  2675.             }
  2676.             exports.buf2binstring = function(buf) {
  2677.                 return buf2binstring(buf, buf.length)
  2678.             };
  2679.             exports.binstring2buf = function(str) {
  2680.                 var buf = new utils.Buf8(str.length);
  2681.                 for (var i = 0, len = buf.length; i < len; i++) {
  2682.                     buf[i] = str.charCodeAt(i)
  2683.                 }
  2684.                 return buf
  2685.             };
  2686.             exports.buf2string = function(buf, max) {
  2687.                 var i, out, c, c_len;
  2688.                 var len = max || buf.length;
  2689.                 var utf16buf = new Array(len * 2);
  2690.                 for (out = 0, i = 0; i < len;) {
  2691.                     c = buf[i++];
  2692.                     if (c < 128) {
  2693.                         utf16buf[out++] = c;
  2694.                         continue
  2695.                     }
  2696.                     c_len = _utf8len[c];
  2697.                     if (c_len > 4) {
  2698.                         utf16buf[out++] = 65533;
  2699.                         i += c_len - 1;
  2700.                         continue
  2701.                     }
  2702.                     c &= c_len === 2 ? 31 : c_len === 3 ? 15 : 7;
  2703.                     while (c_len > 1 && i < len) {
  2704.                         c = c << 6 | buf[i++] & 63;
  2705.                         c_len--
  2706.                     }
  2707.                     if (c_len > 1) {
  2708.                         utf16buf[out++] = 65533;
  2709.                         continue
  2710.                     }
  2711.                     if (c < 65536) {
  2712.                         utf16buf[out++] = c
  2713.                     } else {
  2714.                         c -= 65536;
  2715.                         utf16buf[out++] = 55296 | c >> 10 & 1023;
  2716.                         utf16buf[out++] = 56320 | c & 1023
  2717.                     }
  2718.                 }
  2719.                 return buf2binstring(utf16buf, out)
  2720.             };
  2721.             exports.utf8border = function(buf, max) {
  2722.                 var pos;
  2723.                 max = max || buf.length;
  2724.                 if (max > buf.length) {
  2725.                     max = buf.length
  2726.                 }
  2727.                 pos = max - 1;
  2728.                 while (pos >= 0 && (buf[pos] & 192) === 128) {
  2729.                     pos--
  2730.                 }
  2731.                 if (pos < 0) {
  2732.                     return max
  2733.                 }
  2734.                 if (pos === 0) {
  2735.                     return max
  2736.                 }
  2737.                 return pos + _utf8len[buf[pos]] > max ? pos : max
  2738.             }
  2739.         }, {
  2740.             "./common": 2
  2741.         }],
  2742.         4: [function(_dereq_, module, exports) {
  2743.             "use strict";
  2744.  
  2745.             function adler32(adler, buf, len, pos) {
  2746.                 var s1 = adler & 65535 | 0,
  2747.                     s2 = adler >>> 16 & 65535 | 0,
  2748.                     n = 0;
  2749.                 while (len !== 0) {
  2750.                     n = len > 2e3 ? 2e3 : len;
  2751.                     len -= n;
  2752.                     do {
  2753.                         s1 = s1 + buf[pos++] | 0;
  2754.                         s2 = s2 + s1 | 0
  2755.                     } while (--n);
  2756.                     s1 %= 65521;
  2757.                     s2 %= 65521
  2758.                 }
  2759.                 return s1 | s2 << 16 | 0
  2760.             }
  2761.             module.exports = adler32
  2762.         }, {}],
  2763.         5: [function(_dereq_, module, exports) {
  2764.             module.exports = {
  2765.                 Z_NO_FLUSH: 0,
  2766.                 Z_PARTIAL_FLUSH: 1,
  2767.                 Z_SYNC_FLUSH: 2,
  2768.                 Z_FULL_FLUSH: 3,
  2769.                 Z_FINISH: 4,
  2770.                 Z_BLOCK: 5,
  2771.                 Z_TREES: 6,
  2772.                 Z_OK: 0,
  2773.                 Z_STREAM_END: 1,
  2774.                 Z_NEED_DICT: 2,
  2775.                 Z_ERRNO: -1,
  2776.                 Z_STREAM_ERROR: -2,
  2777.                 Z_DATA_ERROR: -3,
  2778.                 Z_BUF_ERROR: -5,
  2779.                 Z_NO_COMPRESSION: 0,
  2780.                 Z_BEST_SPEED: 1,
  2781.                 Z_BEST_COMPRESSION: 9,
  2782.                 Z_DEFAULT_COMPRESSION: -1,
  2783.                 Z_FILTERED: 1,
  2784.                 Z_HUFFMAN_ONLY: 2,
  2785.                 Z_RLE: 3,
  2786.                 Z_FIXED: 4,
  2787.                 Z_DEFAULT_STRATEGY: 0,
  2788.                 Z_BINARY: 0,
  2789.                 Z_TEXT: 1,
  2790.                 Z_UNKNOWN: 2,
  2791.                 Z_DEFLATED: 8
  2792.             }
  2793.         }, {}],
  2794.         6: [function(_dereq_, module, exports) {
  2795.             "use strict";
  2796.  
  2797.             function makeTable() {
  2798.                 var c, table = [];
  2799.                 for (var n = 0; n < 256; n++) {
  2800.                     c = n;
  2801.                     for (var k = 0; k < 8; k++) {
  2802.                         c = c & 1 ? 3988292384 ^ c >>> 1 : c >>> 1
  2803.                     }
  2804.                     table[n] = c
  2805.                 }
  2806.                 return table
  2807.             }
  2808.             var crcTable = makeTable();
  2809.  
  2810.             function crc32(crc, buf, len, pos) {
  2811.                 var t = crcTable,
  2812.                     end = pos + len;
  2813.                 crc = crc ^ -1;
  2814.                 for (var i = pos; i < end; i++) {
  2815.                     crc = crc >>> 8 ^ t[(crc ^ buf[i]) & 255]
  2816.                 }
  2817.                 return crc ^ -1
  2818.             }
  2819.             module.exports = crc32
  2820.         }, {}],
  2821.         7: [function(_dereq_, module, exports) {
  2822.             "use strict";
  2823.  
  2824.             function GZheader() {
  2825.                 this.text = 0;
  2826.                 this.time = 0;
  2827.                 this.xflags = 0;
  2828.                 this.os = 0;
  2829.                 this.extra = null;
  2830.                 this.extra_len = 0;
  2831.                 this.name = "";
  2832.                 this.comment = "";
  2833.                 this.hcrc = 0;
  2834.                 this.done = false
  2835.             }
  2836.             module.exports = GZheader
  2837.         }, {}],
  2838.         8: [function(_dereq_, module, exports) {
  2839.             "use strict";
  2840.             var BAD = 30;
  2841.             var TYPE = 12;
  2842.             module.exports = function inflate_fast(strm, start) {
  2843.                 var state;
  2844.                 var _in;
  2845.                 var last;
  2846.                 var _out;
  2847.                 var beg;
  2848.                 var end;
  2849.                 var dmax;
  2850.                 var wsize;
  2851.                 var whave;
  2852.                 var wnext;
  2853.                 var window;
  2854.                 var hold;
  2855.                 var bits;
  2856.                 var lcode;
  2857.                 var dcode;
  2858.                 var lmask;
  2859.                 var dmask;
  2860.                 var here;
  2861.                 var op;
  2862.                 var len;
  2863.                 var dist;
  2864.                 var from;
  2865.                 var from_source;
  2866.                 var input, output;
  2867.                 state = strm.state;
  2868.                 _in = strm.next_in;
  2869.                 input = strm.input;
  2870.                 last = _in + (strm.avail_in - 5);
  2871.                 _out = strm.next_out;
  2872.                 output = strm.output;
  2873.                 beg = _out - (start - strm.avail_out);
  2874.                 end = _out + (strm.avail_out - 257);
  2875.                 dmax = state.dmax;
  2876.                 wsize = state.wsize;
  2877.                 whave = state.whave;
  2878.                 wnext = state.wnext;
  2879.                 window = state.window;
  2880.                 hold = state.hold;
  2881.                 bits = state.bits;
  2882.                 lcode = state.lencode;
  2883.                 dcode = state.distcode;
  2884.                 lmask = (1 << state.lenbits) - 1;
  2885.                 dmask = (1 << state.distbits) - 1;
  2886.                 top: do {
  2887.                     if (bits < 15) {
  2888.                         hold += input[_in++] << bits;
  2889.                         bits += 8;
  2890.                         hold += input[_in++] << bits;
  2891.                         bits += 8
  2892.                     }
  2893.                     here = lcode[hold & lmask];
  2894.                     dolen: for (;;) {
  2895.                         op = here >>> 24;
  2896.                         hold >>>= op;
  2897.                         bits -= op;
  2898.                         op = here >>> 16 & 255;
  2899.                         if (op === 0) {
  2900.                             output[_out++] = here & 65535
  2901.                         } else if (op & 16) {
  2902.                             len = here & 65535;
  2903.                             op &= 15;
  2904.                             if (op) {
  2905.                                 if (bits < op) {
  2906.                                     hold += input[_in++] << bits;
  2907.                                     bits += 8
  2908.                                 }
  2909.                                 len += hold & (1 << op) - 1;
  2910.                                 hold >>>= op;
  2911.                                 bits -= op
  2912.                             }
  2913.                             if (bits < 15) {
  2914.                                 hold += input[_in++] << bits;
  2915.                                 bits += 8;
  2916.                                 hold += input[_in++] << bits;
  2917.                                 bits += 8
  2918.                             }
  2919.                             here = dcode[hold & dmask];
  2920.                             dodist: for (;;) {
  2921.                                 op = here >>> 24;
  2922.                                 hold >>>= op;
  2923.                                 bits -= op;
  2924.                                 op = here >>> 16 & 255;
  2925.                                 if (op & 16) {
  2926.                                     dist = here & 65535;
  2927.                                     op &= 15;
  2928.                                     if (bits < op) {
  2929.                                         hold += input[_in++] << bits;
  2930.                                         bits += 8;
  2931.                                         if (bits < op) {
  2932.                                             hold += input[_in++] << bits;
  2933.                                             bits += 8
  2934.                                         }
  2935.                                     }
  2936.                                     dist += hold & (1 << op) - 1;
  2937.                                     if (dist > dmax) {
  2938.                                         strm.msg = "invalid distance too far back";
  2939.                                         state.mode = BAD;
  2940.                                         break top
  2941.                                     }
  2942.                                     hold >>>= op;
  2943.                                     bits -= op;
  2944.                                     op = _out - beg;
  2945.                                     if (dist > op) {
  2946.                                         op = dist - op;
  2947.                                         if (op > whave) {
  2948.                                             if (state.sane) {
  2949.                                                 strm.msg = "invalid distance too far back";
  2950.                                                 state.mode = BAD;
  2951.                                                 break top
  2952.                                             }
  2953.                                         }
  2954.                                         from = 0;
  2955.                                         from_source = window;
  2956.                                         if (wnext === 0) {
  2957.                                             from += wsize - op;
  2958.                                             if (op < len) {
  2959.                                                 len -= op;
  2960.                                                 do {
  2961.                                                     output[_out++] = window[from++]
  2962.                                                 } while (--op);
  2963.                                                 from = _out - dist;
  2964.                                                 from_source = output
  2965.                                             }
  2966.                                         } else if (wnext < op) {
  2967.                                             from += wsize + wnext - op;
  2968.                                             op -= wnext;
  2969.                                             if (op < len) {
  2970.                                                 len -= op;
  2971.                                                 do {
  2972.                                                     output[_out++] = window[from++]
  2973.                                                 } while (--op);
  2974.                                                 from = 0;
  2975.                                                 if (wnext < len) {
  2976.                                                     op = wnext;
  2977.                                                     len -= op;
  2978.                                                     do {
  2979.                                                         output[_out++] = window[from++]
  2980.                                                     } while (--op);
  2981.                                                     from = _out - dist;
  2982.                                                     from_source = output
  2983.                                                 }
  2984.                                             }
  2985.                                         } else {
  2986.                                             from += wnext - op;
  2987.                                             if (op < len) {
  2988.                                                 len -= op;
  2989.                                                 do {
  2990.                                                     output[_out++] = window[from++]
  2991.                                                 } while (--op);
  2992.                                                 from = _out - dist;
  2993.                                                 from_source = output
  2994.                                             }
  2995.                                         }
  2996.                                         while (len > 2) {
  2997.                                             output[_out++] = from_source[from++];
  2998.                                             output[_out++] = from_source[from++];
  2999.                                             output[_out++] = from_source[from++];
  3000.                                             len -= 3
  3001.                                         }
  3002.                                         if (len) {
  3003.                                             output[_out++] = from_source[from++];
  3004.                                             if (len > 1) {
  3005.                                                 output[_out++] = from_source[from++]
  3006.                                             }
  3007.                                         }
  3008.                                     } else {
  3009.                                         from = _out - dist;
  3010.                                         do {
  3011.                                             output[_out++] = output[from++];
  3012.                                             output[_out++] = output[from++];
  3013.                                             output[_out++] = output[from++];
  3014.                                             len -= 3
  3015.                                         } while (len > 2);
  3016.                                         if (len) {
  3017.                                             output[_out++] = output[from++];
  3018.                                             if (len > 1) {
  3019.                                                 output[_out++] = output[from++]
  3020.                                             }
  3021.                                         }
  3022.                                     }
  3023.                                 } else if ((op & 64) === 0) {
  3024.                                     here = dcode[(here & 65535) + (hold & (1 << op) - 1)];
  3025.                                     continue dodist
  3026.                                 } else {
  3027.                                     strm.msg = "invalid distance code";
  3028.                                     state.mode = BAD;
  3029.                                     break top
  3030.                                 }
  3031.                                 break
  3032.                             }
  3033.                         } else if ((op & 64) === 0) {
  3034.                             here = lcode[(here & 65535) + (hold & (1 << op) - 1)];
  3035.                             continue dolen
  3036.                         } else if (op & 32) {
  3037.                             state.mode = TYPE;
  3038.                             break top
  3039.                         } else {
  3040.                             strm.msg = "invalid literal/length code";
  3041.                             state.mode = BAD;
  3042.                             break top
  3043.                         }
  3044.                         break
  3045.                     }
  3046.                 } while (_in < last && _out < end);
  3047.                 len = bits >> 3;
  3048.                 _in -= len;
  3049.                 bits -= len << 3;
  3050.                 hold &= (1 << bits) - 1;
  3051.                 strm.next_in = _in;
  3052.                 strm.next_out = _out;
  3053.                 strm.avail_in = _in < last ? 5 + (last - _in) : 5 - (_in - last);
  3054.                 strm.avail_out = _out < end ? 257 + (end - _out) : 257 - (_out - end);
  3055.                 state.hold = hold;
  3056.                 state.bits = bits;
  3057.                 return
  3058.             }
  3059.         }, {}],
  3060.         9: [function(_dereq_, module, exports) {
  3061.             "use strict";
  3062.             var utils = _dereq_("../utils/common");
  3063.             var adler32 = _dereq_("./adler32");
  3064.             var crc32 = _dereq_("./crc32");
  3065.             var inflate_fast = _dereq_("./inffast");
  3066.             var inflate_table = _dereq_("./inftrees");
  3067.             var CODES = 0;
  3068.             var LENS = 1;
  3069.             var DISTS = 2;
  3070.             var Z_FINISH = 4;
  3071.             var Z_BLOCK = 5;
  3072.             var Z_TREES = 6;
  3073.             var Z_OK = 0;
  3074.             var Z_STREAM_END = 1;
  3075.             var Z_NEED_DICT = 2;
  3076.             var Z_STREAM_ERROR = -2;
  3077.             var Z_DATA_ERROR = -3;
  3078.             var Z_MEM_ERROR = -4;
  3079.             var Z_BUF_ERROR = -5;
  3080.             var Z_DEFLATED = 8;
  3081.             var HEAD = 1;
  3082.             var FLAGS = 2;
  3083.             var TIME = 3;
  3084.             var OS = 4;
  3085.             var EXLEN = 5;
  3086.             var EXTRA = 6;
  3087.             var NAME = 7;
  3088.             var COMMENT = 8;
  3089.             var HCRC = 9;
  3090.             var DICTID = 10;
  3091.             var DICT = 11;
  3092.             var TYPE = 12;
  3093.             var TYPEDO = 13;
  3094.             var STORED = 14;
  3095.             var COPY_ = 15;
  3096.             var COPY = 16;
  3097.             var TABLE = 17;
  3098.             var LENLENS = 18;
  3099.             var CODELENS = 19;
  3100.             var LEN_ = 20;
  3101.             var LEN = 21;
  3102.             var LENEXT = 22;
  3103.             var DIST = 23;
  3104.             var DISTEXT = 24;
  3105.             var MATCH = 25;
  3106.             var LIT = 26;
  3107.             var CHECK = 27;
  3108.             var LENGTH = 28;
  3109.             var DONE = 29;
  3110.             var BAD = 30;
  3111.             var MEM = 31;
  3112.             var SYNC = 32;
  3113.             var ENOUGH_LENS = 852;
  3114.             var ENOUGH_DISTS = 592;
  3115.             var MAX_WBITS = 15;
  3116.             var DEF_WBITS = MAX_WBITS;
  3117.  
  3118.             function ZSWAP32(q) {
  3119.                 return (q >>> 24 & 255) + (q >>> 8 & 65280) + ((q & 65280) << 8) + ((q & 255) << 24)
  3120.             }
  3121.  
  3122.             function InflateState() {
  3123.                 this.mode = 0;
  3124.                 this.last = false;
  3125.                 this.wrap = 0;
  3126.                 this.havedict = false;
  3127.                 this.flags = 0;
  3128.                 this.dmax = 0;
  3129.                 this.check = 0;
  3130.                 this.total = 0;
  3131.                 this.head = null;
  3132.                 this.wbits = 0;
  3133.                 this.wsize = 0;
  3134.                 this.whave = 0;
  3135.                 this.wnext = 0;
  3136.                 this.window = null;
  3137.                 this.hold = 0;
  3138.                 this.bits = 0;
  3139.                 this.length = 0;
  3140.                 this.offset = 0;
  3141.                 this.extra = 0;
  3142.                 this.lencode = null;
  3143.                 this.distcode = null;
  3144.                 this.lenbits = 0;
  3145.                 this.distbits = 0;
  3146.                 this.ncode = 0;
  3147.                 this.nlen = 0;
  3148.                 this.ndist = 0;
  3149.                 this.have = 0;
  3150.                 this.next = null;
  3151.                 this.lens = new utils.Buf16(320);
  3152.                 this.work = new utils.Buf16(288);
  3153.                 this.lendyn = null;
  3154.                 this.distdyn = null;
  3155.                 this.sane = 0;
  3156.                 this.back = 0;
  3157.                 this.was = 0
  3158.             }
  3159.  
  3160.             function inflateResetKeep(strm) {
  3161.                 var state;
  3162.                 if (!strm || !strm.state) {
  3163.                     return Z_STREAM_ERROR
  3164.                 }
  3165.                 state = strm.state;
  3166.                 strm.total_in = strm.total_out = state.total = 0;
  3167.                 strm.msg = "";
  3168.                 if (state.wrap) {
  3169.                     strm.adler = state.wrap & 1
  3170.                 }
  3171.                 state.mode = HEAD;
  3172.                 state.last = 0;
  3173.                 state.havedict = 0;
  3174.                 state.dmax = 32768;
  3175.                 state.head = null;
  3176.                 state.hold = 0;
  3177.                 state.bits = 0;
  3178.                 state.lencode = state.lendyn = new utils.Buf32(ENOUGH_LENS);
  3179.                 state.distcode = state.distdyn = new utils.Buf32(ENOUGH_DISTS);
  3180.                 state.sane = 1;
  3181.                 state.back = -1;
  3182.                 return Z_OK
  3183.             }
  3184.  
  3185.             function inflateReset(strm) {
  3186.                 var state;
  3187.                 if (!strm || !strm.state) {
  3188.                     return Z_STREAM_ERROR
  3189.                 }
  3190.                 state = strm.state;
  3191.                 state.wsize = 0;
  3192.                 state.whave = 0;
  3193.                 state.wnext = 0;
  3194.                 return inflateResetKeep(strm)
  3195.             }
  3196.  
  3197.             function inflateReset2(strm, windowBits) {
  3198.                 var wrap;
  3199.                 var state;
  3200.                 if (!strm || !strm.state) {
  3201.                     return Z_STREAM_ERROR
  3202.                 }
  3203.                 state = strm.state;
  3204.                 if (windowBits < 0) {
  3205.                     wrap = 0;
  3206.                     windowBits = -windowBits
  3207.                 } else {
  3208.                     wrap = (windowBits >> 4) + 1;
  3209.                     if (windowBits < 48) {
  3210.                         windowBits &= 15
  3211.                     }
  3212.                 }
  3213.                 if (windowBits && (windowBits < 8 || windowBits > 15)) {
  3214.                     return Z_STREAM_ERROR
  3215.                 }
  3216.                 if (state.window !== null && state.wbits !== windowBits) {
  3217.                     state.window = null
  3218.                 }
  3219.                 state.wrap = wrap;
  3220.                 state.wbits = windowBits;
  3221.                 return inflateReset(strm)
  3222.             }
  3223.  
  3224.             function inflateInit2(strm, windowBits) {
  3225.                 var ret;
  3226.                 var state;
  3227.                 if (!strm) {
  3228.                     return Z_STREAM_ERROR
  3229.                 }
  3230.                 state = new InflateState;
  3231.                 strm.state = state;
  3232.                 state.window = null;
  3233.                 ret = inflateReset2(strm, windowBits);
  3234.                 if (ret !== Z_OK) {
  3235.                     strm.state = null
  3236.                 }
  3237.                 return ret
  3238.             }
  3239.  
  3240.             function inflateInit(strm) {
  3241.                 return inflateInit2(strm, DEF_WBITS)
  3242.             }
  3243.             var virgin = true;
  3244.             var lenfix, distfix;
  3245.  
  3246.             function fixedtables(state) {
  3247.                 if (virgin) {
  3248.                     var sym;
  3249.                     lenfix = new utils.Buf32(512);
  3250.                     distfix = new utils.Buf32(32);
  3251.                     sym = 0;
  3252.                     while (sym < 144) {
  3253.                         state.lens[sym++] = 8
  3254.                     }
  3255.                     while (sym < 256) {
  3256.                         state.lens[sym++] = 9
  3257.                     }
  3258.                     while (sym < 280) {
  3259.                         state.lens[sym++] = 7
  3260.                     }
  3261.                     while (sym < 288) {
  3262.                         state.lens[sym++] = 8
  3263.                     }
  3264.                     inflate_table(LENS, state.lens, 0, 288, lenfix, 0, state.work, {
  3265.                         bits: 9
  3266.                     });
  3267.                     sym = 0;
  3268.                     while (sym < 32) {
  3269.                         state.lens[sym++] = 5
  3270.                     }
  3271.                     inflate_table(DISTS, state.lens, 0, 32, distfix, 0, state.work, {
  3272.                         bits: 5
  3273.                     });
  3274.                     virgin = false
  3275.                 }
  3276.                 state.lencode = lenfix;
  3277.                 state.lenbits = 9;
  3278.                 state.distcode = distfix;
  3279.                 state.distbits = 5
  3280.             }
  3281.  
  3282.             function updatewindow(strm, src, end, copy) {
  3283.                 var dist;
  3284.                 var state = strm.state;
  3285.                 if (state.window === null) {
  3286.                     state.wsize = 1 << state.wbits;
  3287.                     state.wnext = 0;
  3288.                     state.whave = 0;
  3289.                     state.window = new utils.Buf8(state.wsize)
  3290.                 }
  3291.                 if (copy >= state.wsize) {
  3292.                     utils.arraySet(state.window, src, end - state.wsize, state.wsize, 0);
  3293.                     state.wnext = 0;
  3294.                     state.whave = state.wsize
  3295.                 } else {
  3296.                     dist = state.wsize - state.wnext;
  3297.                     if (dist > copy) {
  3298.                         dist = copy
  3299.                     }
  3300.                     utils.arraySet(state.window, src, end - copy, dist, state.wnext);
  3301.                     copy -= dist;
  3302.                     if (copy) {
  3303.                         utils.arraySet(state.window, src, end - copy, copy, 0);
  3304.                         state.wnext = copy;
  3305.                         state.whave = state.wsize
  3306.                     } else {
  3307.                         state.wnext += dist;
  3308.                         if (state.wnext === state.wsize) {
  3309.                             state.wnext = 0
  3310.                         }
  3311.                         if (state.whave < state.wsize) {
  3312.                             state.whave += dist
  3313.                         }
  3314.                     }
  3315.                 }
  3316.                 return 0
  3317.             }
  3318.  
  3319.             function inflate(strm, flush) {
  3320.                 var state;
  3321.                 var input, output;
  3322.                 var next;
  3323.                 var put;
  3324.                 var have, left;
  3325.                 var hold;
  3326.                 var bits;
  3327.                 var _in, _out;
  3328.                 var copy;
  3329.                 var from;
  3330.                 var from_source;
  3331.                 var here = 0;
  3332.                 var here_bits, here_op, here_val;
  3333.                 var last_bits, last_op, last_val;
  3334.                 var len;
  3335.                 var ret;
  3336.                 var hbuf = new utils.Buf8(4);
  3337.                 var opts;
  3338.                 var n;
  3339.                 var order = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15];
  3340.                 if (!strm || !strm.state || !strm.output || !strm.input && strm.avail_in !== 0) {
  3341.                     return Z_STREAM_ERROR
  3342.                 }
  3343.                 state = strm.state;
  3344.                 if (state.mode === TYPE) {
  3345.                     state.mode = TYPEDO
  3346.                 }
  3347.                 put = strm.next_out;
  3348.                 output = strm.output;
  3349.                 left = strm.avail_out;
  3350.                 next = strm.next_in;
  3351.                 input = strm.input;
  3352.                 have = strm.avail_in;
  3353.                 hold = state.hold;
  3354.                 bits = state.bits;
  3355.                 _in = have;
  3356.                 _out = left;
  3357.                 ret = Z_OK;
  3358.                 inf_leave: for (;;) {
  3359.                     switch (state.mode) {
  3360.                         case HEAD:
  3361.                             if (state.wrap === 0) {
  3362.                                 state.mode = TYPEDO;
  3363.                                 break
  3364.                             }
  3365.                             while (bits < 16) {
  3366.                                 if (have === 0) {
  3367.                                     break inf_leave
  3368.                                 }
  3369.                                 have--;
  3370.                                 hold += input[next++] << bits;
  3371.                                 bits += 8
  3372.                             }
  3373.                             if (state.wrap & 2 && hold === 35615) {
  3374.                                 state.check = 0;
  3375.                                 hbuf[0] = hold & 255;
  3376.                                 hbuf[1] = hold >>> 8 & 255;
  3377.                                 state.check = crc32(state.check, hbuf, 2, 0);
  3378.                                 hold = 0;
  3379.                                 bits = 0;
  3380.                                 state.mode = FLAGS;
  3381.                                 break
  3382.                             }
  3383.                             state.flags = 0;
  3384.                             if (state.head) {
  3385.                                 state.head.done = false
  3386.                             }
  3387.                             if (!(state.wrap & 1) || (((hold & 255) << 8) + (hold >> 8)) % 31) {
  3388.                                 strm.msg = "incorrect header check";
  3389.                                 state.mode = BAD;
  3390.                                 break
  3391.                             }
  3392.                             if ((hold & 15) !== Z_DEFLATED) {
  3393.                                 strm.msg = "unknown compression method";
  3394.                                 state.mode = BAD;
  3395.                                 break
  3396.                             }
  3397.                             hold >>>= 4;
  3398.                             bits -= 4;
  3399.                             len = (hold & 15) + 8;
  3400.                             if (state.wbits === 0) {
  3401.                                 state.wbits = len
  3402.                             } else if (len > state.wbits) {
  3403.                                 strm.msg = "invalid window size";
  3404.                                 state.mode = BAD;
  3405.                                 break
  3406.                             }
  3407.                             state.dmax = 1 << len;
  3408.                             strm.adler = state.check = 1;
  3409.                             state.mode = hold & 512 ? DICTID : TYPE;
  3410.                             hold = 0;
  3411.                             bits = 0;
  3412.                             break;
  3413.                         case FLAGS:
  3414.                             while (bits < 16) {
  3415.                                 if (have === 0) {
  3416.                                     break inf_leave
  3417.                                 }
  3418.                                 have--;
  3419.                                 hold += input[next++] << bits;
  3420.                                 bits += 8
  3421.                             }
  3422.                             state.flags = hold;
  3423.                             if ((state.flags & 255) !== Z_DEFLATED) {
  3424.                                 strm.msg = "unknown compression method";
  3425.                                 state.mode = BAD;
  3426.                                 break
  3427.                             }
  3428.                             if (state.flags & 57344) {
  3429.                                 strm.msg = "unknown header flags set";
  3430.                                 state.mode = BAD;
  3431.                                 break
  3432.                             }
  3433.                             if (state.head) {
  3434.                                 state.head.text = hold >> 8 & 1
  3435.                             }
  3436.                             if (state.flags & 512) {
  3437.                                 hbuf[0] = hold & 255;
  3438.                                 hbuf[1] = hold >>> 8 & 255;
  3439.                                 state.check = crc32(state.check, hbuf, 2, 0)
  3440.                             }
  3441.                             hold = 0;
  3442.                             bits = 0;
  3443.                             state.mode = TIME;
  3444.                         case TIME:
  3445.                             while (bits < 32) {
  3446.                                 if (have === 0) {
  3447.                                     break inf_leave
  3448.                                 }
  3449.                                 have--;
  3450.                                 hold += input[next++] << bits;
  3451.                                 bits += 8
  3452.                             }
  3453.                             if (state.head) {
  3454.                                 state.head.time = hold
  3455.                             }
  3456.                             if (state.flags & 512) {
  3457.                                 hbuf[0] = hold & 255;
  3458.                                 hbuf[1] = hold >>> 8 & 255;
  3459.                                 hbuf[2] = hold >>> 16 & 255;
  3460.                                 hbuf[3] = hold >>> 24 & 255;
  3461.                                 state.check = crc32(state.check, hbuf, 4, 0)
  3462.                             }
  3463.                             hold = 0;
  3464.                             bits = 0;
  3465.                             state.mode = OS;
  3466.                         case OS:
  3467.                             while (bits < 16) {
  3468.                                 if (have === 0) {
  3469.                                     break inf_leave
  3470.                                 }
  3471.                                 have--;
  3472.                                 hold += input[next++] << bits;
  3473.                                 bits += 8
  3474.                             }
  3475.                             if (state.head) {
  3476.                                 state.head.xflags = hold & 255;
  3477.                                 state.head.os = hold >> 8
  3478.                             }
  3479.                             if (state.flags & 512) {
  3480.                                 hbuf[0] = hold & 255;
  3481.                                 hbuf[1] = hold >>> 8 & 255;
  3482.                                 state.check = crc32(state.check, hbuf, 2, 0)
  3483.                             }
  3484.                             hold = 0;
  3485.                             bits = 0;
  3486.                             state.mode = EXLEN;
  3487.                         case EXLEN:
  3488.                             if (state.flags & 1024) {
  3489.                                 while (bits < 16) {
  3490.                                     if (have === 0) {
  3491.                                         break inf_leave
  3492.                                     }
  3493.                                     have--;
  3494.                                     hold += input[next++] << bits;
  3495.                                     bits += 8
  3496.                                 }
  3497.                                 state.length = hold;
  3498.                                 if (state.head) {
  3499.                                     state.head.extra_len = hold
  3500.                                 }
  3501.                                 if (state.flags & 512) {
  3502.                                     hbuf[0] = hold & 255;
  3503.                                     hbuf[1] = hold >>> 8 & 255;
  3504.                                     state.check = crc32(state.check, hbuf, 2, 0)
  3505.                                 }
  3506.                                 hold = 0;
  3507.                                 bits = 0
  3508.                             } else if (state.head) {
  3509.                                 state.head.extra = null
  3510.                             }
  3511.                             state.mode = EXTRA;
  3512.                         case EXTRA:
  3513.                             if (state.flags & 1024) {
  3514.                                 copy = state.length;
  3515.                                 if (copy > have) {
  3516.                                     copy = have
  3517.                                 }
  3518.                                 if (copy) {
  3519.                                     if (state.head) {
  3520.                                         len = state.head.extra_len - state.length;
  3521.                                         if (!state.head.extra) {
  3522.                                             state.head.extra = new Array(state.head.extra_len)
  3523.                                         }
  3524.                                         utils.arraySet(state.head.extra, input, next, copy, len)
  3525.                                     }
  3526.                                     if (state.flags & 512) {
  3527.                                         state.check = crc32(state.check, input, copy, next)
  3528.                                     }
  3529.                                     have -= copy;
  3530.                                     next += copy;
  3531.                                     state.length -= copy
  3532.                                 }
  3533.                                 if (state.length) {
  3534.                                     break inf_leave
  3535.                                 }
  3536.                             }
  3537.                             state.length = 0;
  3538.                             state.mode = NAME;
  3539.                         case NAME:
  3540.                             if (state.flags & 2048) {
  3541.                                 if (have === 0) {
  3542.                                     break inf_leave
  3543.                                 }
  3544.                                 copy = 0;
  3545.                                 do {
  3546.                                     len = input[next + copy++];
  3547.                                     if (state.head && len && state.length < 65536) {
  3548.                                         state.head.name += String.fromCharCode(len)
  3549.                                     }
  3550.                                 } while (len && copy < have);
  3551.                                 if (state.flags & 512) {
  3552.                                     state.check = crc32(state.check, input, copy, next)
  3553.                                 }
  3554.                                 have -= copy;
  3555.                                 next += copy;
  3556.                                 if (len) {
  3557.                                     break inf_leave
  3558.                                 }
  3559.                             } else if (state.head) {
  3560.                                 state.head.name = null
  3561.                             }
  3562.                             state.length = 0;
  3563.                             state.mode = COMMENT;
  3564.                         case COMMENT:
  3565.                             if (state.flags & 4096) {
  3566.                                 if (have === 0) {
  3567.                                     break inf_leave
  3568.                                 }
  3569.                                 copy = 0;
  3570.                                 do {
  3571.                                     len = input[next + copy++];
  3572.                                     if (state.head && len && state.length < 65536) {
  3573.                                         state.head.comment += String.fromCharCode(len)
  3574.                                     }
  3575.                                 } while (len && copy < have);
  3576.                                 if (state.flags & 512) {
  3577.                                     state.check = crc32(state.check, input, copy, next)
  3578.                                 }
  3579.                                 have -= copy;
  3580.                                 next += copy;
  3581.                                 if (len) {
  3582.                                     break inf_leave
  3583.                                 }
  3584.                             } else if (state.head) {
  3585.                                 state.head.comment = null
  3586.                             }
  3587.                             state.mode = HCRC;
  3588.                         case HCRC:
  3589.                             if (state.flags & 512) {
  3590.                                 while (bits < 16) {
  3591.                                     if (have === 0) {
  3592.                                         break inf_leave
  3593.                                     }
  3594.                                     have--;
  3595.                                     hold += input[next++] << bits;
  3596.                                     bits += 8
  3597.                                 }
  3598.                                 if (hold !== (state.check & 65535)) {
  3599.                                     strm.msg = "header crc mismatch";
  3600.                                     state.mode = BAD;
  3601.                                     break
  3602.                                 }
  3603.                                 hold = 0;
  3604.                                 bits = 0
  3605.                             }
  3606.                             if (state.head) {
  3607.                                 state.head.hcrc = state.flags >> 9 & 1;
  3608.                                 state.head.done = true
  3609.                             }
  3610.                             strm.adler = state.check = 0;
  3611.                             state.mode = TYPE;
  3612.                             break;
  3613.                         case DICTID:
  3614.                             while (bits < 32) {
  3615.                                 if (have === 0) {
  3616.                                     break inf_leave
  3617.                                 }
  3618.                                 have--;
  3619.                                 hold += input[next++] << bits;
  3620.                                 bits += 8
  3621.                             }
  3622.                             strm.adler = state.check = ZSWAP32(hold);
  3623.                             hold = 0;
  3624.                             bits = 0;
  3625.                             state.mode = DICT;
  3626.                         case DICT:
  3627.                             if (state.havedict === 0) {
  3628.                                 strm.next_out = put;
  3629.                                 strm.avail_out = left;
  3630.                                 strm.next_in = next;
  3631.                                 strm.avail_in = have;
  3632.                                 state.hold = hold;
  3633.                                 state.bits = bits;
  3634.                                 return Z_NEED_DICT
  3635.                             }
  3636.                             strm.adler = state.check = 1;
  3637.                             state.mode = TYPE;
  3638.                         case TYPE:
  3639.                             if (flush === Z_BLOCK || flush === Z_TREES) {
  3640.                                 break inf_leave
  3641.                             }
  3642.                         case TYPEDO:
  3643.                             if (state.last) {
  3644.                                 hold >>>= bits & 7;
  3645.                                 bits -= bits & 7;
  3646.                                 state.mode = CHECK;
  3647.                                 break
  3648.                             }
  3649.                             while (bits < 3) {
  3650.                                 if (have === 0) {
  3651.                                     break inf_leave
  3652.                                 }
  3653.                                 have--;
  3654.                                 hold += input[next++] << bits;
  3655.                                 bits += 8
  3656.                             }
  3657.                             state.last = hold & 1;
  3658.                             hold >>>= 1;
  3659.                             bits -= 1;
  3660.                             switch (hold & 3) {
  3661.                                 case 0:
  3662.                                     state.mode = STORED;
  3663.                                     break;
  3664.                                 case 1:
  3665.                                     fixedtables(state);
  3666.                                     state.mode = LEN_;
  3667.                                     if (flush === Z_TREES) {
  3668.                                         hold >>>= 2;
  3669.                                         bits -= 2;
  3670.                                         break inf_leave
  3671.                                     }
  3672.                                     break;
  3673.                                 case 2:
  3674.                                     state.mode = TABLE;
  3675.                                     break;
  3676.                                 case 3:
  3677.                                     strm.msg = "invalid block type";
  3678.                                     state.mode = BAD
  3679.                             }
  3680.                             hold >>>= 2;
  3681.                             bits -= 2;
  3682.                             break;
  3683.                         case STORED:
  3684.                             hold >>>= bits & 7;
  3685.                             bits -= bits & 7;
  3686.                             while (bits < 32) {
  3687.                                 if (have === 0) {
  3688.                                     break inf_leave
  3689.                                 }
  3690.                                 have--;
  3691.                                 hold += input[next++] << bits;
  3692.                                 bits += 8
  3693.                             }
  3694.                             if ((hold & 65535) !== (hold >>> 16 ^ 65535)) {
  3695.                                 strm.msg = "invalid stored block lengths";
  3696.                                 state.mode = BAD;
  3697.                                 break
  3698.                             }
  3699.                             state.length = hold & 65535;
  3700.                             hold = 0;
  3701.                             bits = 0;
  3702.                             state.mode = COPY_;
  3703.                             if (flush === Z_TREES) {
  3704.                                 break inf_leave
  3705.                             }
  3706.                         case COPY_:
  3707.                             state.mode = COPY;
  3708.                         case COPY:
  3709.                             copy = state.length;
  3710.                             if (copy) {
  3711.                                 if (copy > have) {
  3712.                                     copy = have
  3713.                                 }
  3714.                                 if (copy > left) {
  3715.                                     copy = left
  3716.                                 }
  3717.                                 if (copy === 0) {
  3718.                                     break inf_leave
  3719.                                 }
  3720.                                 utils.arraySet(output, input, next, copy, put);
  3721.                                 have -= copy;
  3722.                                 next += copy;
  3723.                                 left -= copy;
  3724.                                 put += copy;
  3725.                                 state.length -= copy;
  3726.                                 break
  3727.                             }
  3728.                             state.mode = TYPE;
  3729.                             break;
  3730.                         case TABLE:
  3731.                             while (bits < 14) {
  3732.                                 if (have === 0) {
  3733.                                     break inf_leave
  3734.                                 }
  3735.                                 have--;
  3736.                                 hold += input[next++] << bits;
  3737.                                 bits += 8
  3738.                             }
  3739.                             state.nlen = (hold & 31) + 257;
  3740.                             hold >>>= 5;
  3741.                             bits -= 5;
  3742.                             state.ndist = (hold & 31) + 1;
  3743.                             hold >>>= 5;
  3744.                             bits -= 5;
  3745.                             state.ncode = (hold & 15) + 4;
  3746.                             hold >>>= 4;
  3747.                             bits -= 4;
  3748.                             if (state.nlen > 286 || state.ndist > 30) {
  3749.                                 strm.msg = "too many length or distance symbols";
  3750.                                 state.mode = BAD;
  3751.                                 break
  3752.                             }
  3753.                             state.have = 0;
  3754.                             state.mode = LENLENS;
  3755.                         case LENLENS:
  3756.                             while (state.have < state.ncode) {
  3757.                                 while (bits < 3) {
  3758.                                     if (have === 0) {
  3759.                                         break inf_leave
  3760.                                     }
  3761.                                     have--;
  3762.                                     hold += input[next++] << bits;
  3763.                                     bits += 8
  3764.                                 }
  3765.                                 state.lens[order[state.have++]] = hold & 7;
  3766.                                 hold >>>= 3;
  3767.                                 bits -= 3
  3768.                             }
  3769.                             while (state.have < 19) {
  3770.                                 state.lens[order[state.have++]] = 0
  3771.                             }
  3772.                             state.lencode = state.lendyn;
  3773.                             state.lenbits = 7;
  3774.                             opts = {
  3775.                                 bits: state.lenbits
  3776.                             };
  3777.                             ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts);
  3778.                             state.lenbits = opts.bits;
  3779.                             if (ret) {
  3780.                                 strm.msg = "invalid code lengths set";
  3781.                                 state.mode = BAD;
  3782.                                 break
  3783.                             }
  3784.                             state.have = 0;
  3785.                             state.mode = CODELENS;
  3786.                         case CODELENS:
  3787.                             while (state.have < state.nlen + state.ndist) {
  3788.                                 for (;;) {
  3789.                                     here = state.lencode[hold & (1 << state.lenbits) - 1];
  3790.                                     here_bits = here >>> 24;
  3791.                                     here_op = here >>> 16 & 255;
  3792.                                     here_val = here & 65535;
  3793.                                     if (here_bits <= bits) {
  3794.                                         break
  3795.                                     }
  3796.                                     if (have === 0) {
  3797.                                         break inf_leave
  3798.                                     }
  3799.                                     have--;
  3800.                                     hold += input[next++] << bits;
  3801.                                     bits += 8
  3802.                                 }
  3803.                                 if (here_val < 16) {
  3804.                                     hold >>>= here_bits;
  3805.                                     bits -= here_bits;
  3806.                                     state.lens[state.have++] = here_val
  3807.                                 } else {
  3808.                                     if (here_val === 16) {
  3809.                                         n = here_bits + 2;
  3810.                                         while (bits < n) {
  3811.                                             if (have === 0) {
  3812.                                                 break inf_leave
  3813.                                             }
  3814.                                             have--;
  3815.                                             hold += input[next++] << bits;
  3816.                                             bits += 8
  3817.                                         }
  3818.                                         hold >>>= here_bits;
  3819.                                         bits -= here_bits;
  3820.                                         if (state.have === 0) {
  3821.                                             strm.msg = "invalid bit length repeat";
  3822.                                             state.mode = BAD;
  3823.                                             break
  3824.                                         }
  3825.                                         len = state.lens[state.have - 1];
  3826.                                         copy = 3 + (hold & 3);
  3827.                                         hold >>>= 2;
  3828.                                         bits -= 2
  3829.                                     } else if (here_val === 17) {
  3830.                                         n = here_bits + 3;
  3831.                                         while (bits < n) {
  3832.                                             if (have === 0) {
  3833.                                                 break inf_leave
  3834.                                             }
  3835.                                             have--;
  3836.                                             hold += input[next++] << bits;
  3837.                                             bits += 8
  3838.                                         }
  3839.                                         hold >>>= here_bits;
  3840.                                         bits -= here_bits;
  3841.                                         len = 0;
  3842.                                         copy = 3 + (hold & 7);
  3843.                                         hold >>>= 3;
  3844.                                         bits -= 3
  3845.                                     } else {
  3846.                                         n = here_bits + 7;
  3847.                                         while (bits < n) {
  3848.                                             if (have === 0) {
  3849.                                                 break inf_leave
  3850.                                             }
  3851.                                             have--;
  3852.                                             hold += input[next++] << bits;
  3853.                                             bits += 8
  3854.                                         }
  3855.                                         hold >>>= here_bits;
  3856.                                         bits -= here_bits;
  3857.                                         len = 0;
  3858.                                         copy = 11 + (hold & 127);
  3859.                                         hold >>>= 7;
  3860.                                         bits -= 7
  3861.                                     }
  3862.                                     if (state.have + copy > state.nlen + state.ndist) {
  3863.                                         strm.msg = "invalid bit length repeat";
  3864.                                         state.mode = BAD;
  3865.                                         break
  3866.                                     }
  3867.                                     while (copy--) {
  3868.                                         state.lens[state.have++] = len
  3869.                                     }
  3870.                                 }
  3871.                             }
  3872.                             if (state.mode === BAD) {
  3873.                                 break
  3874.                             }
  3875.                             if (state.lens[256] === 0) {
  3876.                                 strm.msg = "invalid code -- missing end-of-block";
  3877.                                 state.mode = BAD;
  3878.                                 break
  3879.                             }
  3880.                             state.lenbits = 9;
  3881.                             opts = {
  3882.                                 bits: state.lenbits
  3883.                             };
  3884.                             ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);
  3885.                             state.lenbits = opts.bits;
  3886.                             if (ret) {
  3887.                                 strm.msg = "invalid literal/lengths set";
  3888.                                 state.mode = BAD;
  3889.                                 break
  3890.                             }
  3891.                             state.distbits = 6;
  3892.                             state.distcode = state.distdyn;
  3893.                             opts = {
  3894.                                 bits: state.distbits
  3895.                             };
  3896.                             ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);
  3897.                             state.distbits = opts.bits;
  3898.                             if (ret) {
  3899.                                 strm.msg = "invalid distances set";
  3900.                                 state.mode = BAD;
  3901.                                 break
  3902.                             }
  3903.                             state.mode = LEN_;
  3904.                             if (flush === Z_TREES) {
  3905.                                 break inf_leave
  3906.                             }
  3907.                         case LEN_:
  3908.                             state.mode = LEN;
  3909.                         case LEN:
  3910.                             if (have >= 6 && left >= 258) {
  3911.                                 strm.next_out = put;
  3912.                                 strm.avail_out = left;
  3913.                                 strm.next_in = next;
  3914.                                 strm.avail_in = have;
  3915.                                 state.hold = hold;
  3916.                                 state.bits = bits;
  3917.                                 inflate_fast(strm, _out);
  3918.                                 put = strm.next_out;
  3919.                                 output = strm.output;
  3920.                                 left = strm.avail_out;
  3921.                                 next = strm.next_in;
  3922.                                 input = strm.input;
  3923.                                 have = strm.avail_in;
  3924.                                 hold = state.hold;
  3925.                                 bits = state.bits;
  3926.                                 if (state.mode === TYPE) {
  3927.                                     state.back = -1
  3928.                                 }
  3929.                                 break
  3930.                             }
  3931.                             state.back = 0;
  3932.                             for (;;) {
  3933.                                 here = state.lencode[hold & (1 << state.lenbits) - 1];
  3934.                                 here_bits = here >>> 24;
  3935.                                 here_op = here >>> 16 & 255;
  3936.                                 here_val = here & 65535;
  3937.                                 if (here_bits <= bits) {
  3938.                                     break
  3939.                                 }
  3940.                                 if (have === 0) {
  3941.                                     break inf_leave
  3942.                                 }
  3943.                                 have--;
  3944.                                 hold += input[next++] << bits;
  3945.                                 bits += 8
  3946.                             }
  3947.                             if (here_op && (here_op & 240) === 0) {
  3948.                                 last_bits = here_bits;
  3949.                                 last_op = here_op;
  3950.                                 last_val = here_val;
  3951.                                 for (;;) {
  3952.                                     here = state.lencode[last_val + ((hold & (1 << last_bits + last_op) - 1) >> last_bits)];
  3953.                                     here_bits = here >>> 24;
  3954.                                     here_op = here >>> 16 & 255;
  3955.                                     here_val = here & 65535;
  3956.                                     if (last_bits + here_bits <= bits) {
  3957.                                         break
  3958.                                     }
  3959.                                     if (have === 0) {
  3960.                                         break inf_leave
  3961.                                     }
  3962.                                     have--;
  3963.                                     hold += input[next++] << bits;
  3964.                                     bits += 8
  3965.                                 }
  3966.                                 hold >>>= last_bits;
  3967.                                 bits -= last_bits;
  3968.                                 state.back += last_bits
  3969.                             }
  3970.                             hold >>>= here_bits;
  3971.                             bits -= here_bits;
  3972.                             state.back += here_bits;
  3973.                             state.length = here_val;
  3974.                             if (here_op === 0) {
  3975.                                 state.mode = LIT;
  3976.                                 break
  3977.                             }
  3978.                             if (here_op & 32) {
  3979.                                 state.back = -1;
  3980.                                 state.mode = TYPE;
  3981.                                 break
  3982.                             }
  3983.                             if (here_op & 64) {
  3984.                                 strm.msg = "invalid literal/length code";
  3985.                                 state.mode = BAD;
  3986.                                 break
  3987.                             }
  3988.                             state.extra = here_op & 15;
  3989.                             state.mode = LENEXT;
  3990.                         case LENEXT:
  3991.                             if (state.extra) {
  3992.                                 n = state.extra;
  3993.                                 while (bits < n) {
  3994.                                     if (have === 0) {
  3995.                                         break inf_leave
  3996.                                     }
  3997.                                     have--;
  3998.                                     hold += input[next++] << bits;
  3999.                                     bits += 8
  4000.                                 }
  4001.                                 state.length += hold & (1 << state.extra) - 1;
  4002.                                 hold >>>= state.extra;
  4003.                                 bits -= state.extra;
  4004.                                 state.back += state.extra
  4005.                             }
  4006.                             state.was = state.length;
  4007.                             state.mode = DIST;
  4008.                         case DIST:
  4009.                             for (;;) {
  4010.                                 here = state.distcode[hold & (1 << state.distbits) - 1];
  4011.                                 here_bits = here >>> 24;
  4012.                                 here_op = here >>> 16 & 255;
  4013.                                 here_val = here & 65535;
  4014.                                 if (here_bits <= bits) {
  4015.                                     break
  4016.                                 }
  4017.                                 if (have === 0) {
  4018.                                     break inf_leave
  4019.                                 }
  4020.                                 have--;
  4021.                                 hold += input[next++] << bits;
  4022.                                 bits += 8
  4023.                             }
  4024.                             if ((here_op & 240) === 0) {
  4025.                                 last_bits = here_bits;
  4026.                                 last_op = here_op;
  4027.                                 last_val = here_val;
  4028.  
  4029.                                 for (;;) {
  4030.                                     here = state.distcode[last_val + ((hold & (1 << last_bits + last_op) - 1) >> last_bits)];
  4031.                                     here_bits = here >>> 24;
  4032.                                     here_op = here >>> 16 & 255;
  4033.                                     here_val = here & 65535;
  4034.                                     if (last_bits + here_bits <= bits) {
  4035.                                         break
  4036.                                     }
  4037.                                     if (have === 0) {
  4038.                                         break inf_leave
  4039.                                     }
  4040.                                     have--;
  4041.                                     hold += input[next++] << bits;
  4042.                                     bits += 8
  4043.                                 }
  4044.                                 hold >>>= last_bits;
  4045.                                 bits -= last_bits;
  4046.                                 state.back += last_bits
  4047.                             }
  4048.                             hold >>>= here_bits;
  4049.                             bits -= here_bits;
  4050.                             state.back += here_bits;
  4051.                             if (here_op & 64) {
  4052.                                 strm.msg = "invalid distance code";
  4053.                                 state.mode = BAD;
  4054.                                 break
  4055.                             }
  4056.                             state.offset = here_val;
  4057.                             state.extra = here_op & 15;
  4058.                             state.mode = DISTEXT;
  4059.                         case DISTEXT:
  4060.                             if (state.extra) {
  4061.                                 n = state.extra;
  4062.                                 while (bits < n) {
  4063.                                     if (have === 0) {
  4064.                                         break inf_leave
  4065.                                     }
  4066.                                     have--;
  4067.                                     hold += input[next++] << bits;
  4068.                                     bits += 8
  4069.                                 }
  4070.                                 state.offset += hold & (1 << state.extra) - 1;
  4071.                                 hold >>>= state.extra;
  4072.                                 bits -= state.extra;
  4073.                                 state.back += state.extra
  4074.                             }
  4075.                             if (state.offset > state.dmax) {
  4076.                                 strm.msg = "invalid distance too far back";
  4077.                                 state.mode = BAD;
  4078.                                 break
  4079.                             }
  4080.                             state.mode = MATCH;
  4081.                         case MATCH:
  4082.                             if (left === 0) {
  4083.                                 break inf_leave
  4084.                             }
  4085.                             copy = _out - left;
  4086.                             if (state.offset > copy) {
  4087.                                 copy = state.offset - copy;
  4088.                                 if (copy > state.whave) {
  4089.                                     if (state.sane) {
  4090.                                         strm.msg = "invalid distance too far back";
  4091.                                         state.mode = BAD;
  4092.                                         break
  4093.                                     }
  4094.                                 }
  4095.                                 if (copy > state.wnext) {
  4096.                                     copy -= state.wnext;
  4097.                                     from = state.wsize - copy
  4098.                                 } else {
  4099.                                     from = state.wnext - copy
  4100.                                 }
  4101.                                 if (copy > state.length) {
  4102.                                     copy = state.length
  4103.                                 }
  4104.                                 from_source = state.window
  4105.                             } else {
  4106.                                 from_source = output;
  4107.                                 from = put - state.offset;
  4108.                                 copy = state.length
  4109.                             }
  4110.                             if (copy > left) {
  4111.                                 copy = left
  4112.                             }
  4113.                             left -= copy;
  4114.                             state.length -= copy;
  4115.                             do {
  4116.                                 output[put++] = from_source[from++]
  4117.                             } while (--copy);
  4118.                             if (state.length === 0) {
  4119.                                 state.mode = LEN
  4120.                             }
  4121.                             break;
  4122.                         case LIT:
  4123.                             if (left === 0) {
  4124.                                 break inf_leave
  4125.                             }
  4126.                             output[put++] = state.length;
  4127.                             left--;
  4128.                             state.mode = LEN;
  4129.                             break;
  4130.                         case CHECK:
  4131.                             if (state.wrap) {
  4132.                                 while (bits < 32) {
  4133.                                     if (have === 0) {
  4134.                                         break inf_leave
  4135.                                     }
  4136.                                     have--;
  4137.                                     hold |= input[next++] << bits;
  4138.                                     bits += 8
  4139.                                 }
  4140.                                 _out -= left;
  4141.                                 strm.total_out += _out;
  4142.                                 state.total += _out;
  4143.                                 if (_out) {
  4144.                                     strm.adler = state.check = state.flags ? crc32(state.check, output, _out, put - _out) : adler32(state.check, output, _out, put - _out)
  4145.                                 }
  4146.                                 _out = left;
  4147.                                 if ((state.flags ? hold : ZSWAP32(hold)) !== state.check) {
  4148.                                     strm.msg = "incorrect data check";
  4149.                                     state.mode = BAD;
  4150.                                     break
  4151.                                 }
  4152.                                 hold = 0;
  4153.                                 bits = 0
  4154.                             }
  4155.                             state.mode = LENGTH;
  4156.                         case LENGTH:
  4157.                             if (state.wrap && state.flags) {
  4158.                                 while (bits < 32) {
  4159.                                     if (have === 0) {
  4160.                                         break inf_leave
  4161.                                     }
  4162.                                     have--;
  4163.                                     hold += input[next++] << bits;
  4164.                                     bits += 8
  4165.                                 }
  4166.                                 if (hold !== (state.total & 4294967295)) {
  4167.                                     strm.msg = "incorrect length check";
  4168.                                     state.mode = BAD;
  4169.                                     break
  4170.                                 }
  4171.                                 hold = 0;
  4172.                                 bits = 0
  4173.                             }
  4174.                             state.mode = DONE;
  4175.                         case DONE:
  4176.                             ret = Z_STREAM_END;
  4177.                             break inf_leave;
  4178.                         case BAD:
  4179.                             ret = Z_DATA_ERROR;
  4180.                             break inf_leave;
  4181.                         case MEM:
  4182.                             return Z_MEM_ERROR;
  4183.                         case SYNC:
  4184.                         default:
  4185.                             return Z_STREAM_ERROR
  4186.                     }
  4187.                 }
  4188.                 strm.next_out = put;
  4189.                 strm.avail_out = left;
  4190.                 strm.next_in = next;
  4191.                 strm.avail_in = have;
  4192.                 state.hold = hold;
  4193.                 state.bits = bits;
  4194.                 if (state.wsize || _out !== strm.avail_out && state.mode < BAD && (state.mode < CHECK || flush !== Z_FINISH)) {
  4195.                     if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) {
  4196.                         state.mode = MEM;
  4197.                         return Z_MEM_ERROR
  4198.                     }
  4199.                 }
  4200.                 _in -= strm.avail_in;
  4201.                 _out -= strm.avail_out;
  4202.                 strm.total_in += _in;
  4203.                 strm.total_out += _out;
  4204.                 state.total += _out;
  4205.                 if (state.wrap && _out) {
  4206.                     strm.adler = state.check = state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out)
  4207.                 }
  4208.                 strm.data_type = state.bits + (state.last ? 64 : 0) + (state.mode === TYPE ? 128 : 0) + (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);
  4209.                 if ((_in === 0 && _out === 0 || flush === Z_FINISH) && ret === Z_OK) {
  4210.                     ret = Z_BUF_ERROR
  4211.                 }
  4212.                 return ret
  4213.             }
  4214.  
  4215.             function inflateEnd(strm) {
  4216.                 if (!strm || !strm.state) {
  4217.                     return Z_STREAM_ERROR
  4218.                 }
  4219.                 var state = strm.state;
  4220.                 if (state.window) {
  4221.                     state.window = null
  4222.                 }
  4223.                 strm.state = null;
  4224.                 return Z_OK
  4225.             }
  4226.  
  4227.             function inflateGetHeader(strm, head) {
  4228.                 var state;
  4229.                 if (!strm || !strm.state) {
  4230.                     return Z_STREAM_ERROR
  4231.                 }
  4232.                 state = strm.state;
  4233.                 if ((state.wrap & 2) === 0) {
  4234.                     return Z_STREAM_ERROR
  4235.                 }
  4236.                 state.head = head;
  4237.                 head.done = false;
  4238.                 return Z_OK
  4239.             }
  4240.             exports.inflateReset = inflateReset;
  4241.             exports.inflateReset2 = inflateReset2;
  4242.             exports.inflateResetKeep = inflateResetKeep;
  4243.             exports.inflateInit = inflateInit;
  4244.             exports.inflateInit2 = inflateInit2;
  4245.             exports.inflate = inflate;
  4246.             exports.inflateEnd = inflateEnd;
  4247.             exports.inflateGetHeader = inflateGetHeader;
  4248.             exports.inflateInfo = "pako inflate (from Nodeca project)"
  4249.         }, {
  4250.             "../utils/common": 2,
  4251.             "./adler32": 4,
  4252.             "./crc32": 6,
  4253.             "./inffast": 8,
  4254.             "./inftrees": 10
  4255.         }],
  4256.         10: [function(_dereq_, module, exports) {
  4257.             "use strict";
  4258.             var utils = _dereq_("../utils/common");
  4259.             var MAXBITS = 15;
  4260.             var ENOUGH_LENS = 852;
  4261.             var ENOUGH_DISTS = 592;
  4262.             var CODES = 0;
  4263.             var LENS = 1;
  4264.             var DISTS = 2;
  4265.             var lbase = [3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0];
  4266.             var lext = [16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78];
  4267.             var dbase = [1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0];
  4268.             var dext = [16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 64, 64];
  4269.             module.exports = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts) {
  4270.                 var bits = opts.bits;
  4271.                 var len = 0;
  4272.                 var sym = 0;
  4273.                 var min = 0,
  4274.                     max = 0;
  4275.                 var root = 0;
  4276.                 var curr = 0;
  4277.                 var drop = 0;
  4278.                 var left = 0;
  4279.                 var used = 0;
  4280.                 var huff = 0;
  4281.                 var incr;
  4282.                 var fill;
  4283.                 var low;
  4284.                 var mask;
  4285.                 var next;
  4286.                 var base = null;
  4287.                 var base_index = 0;
  4288.                 var end;
  4289.                 var count = new utils.Buf16(MAXBITS + 1);
  4290.                 var offs = new utils.Buf16(MAXBITS + 1);
  4291.                 var extra = null;
  4292.                 var extra_index = 0;
  4293.                 var here_bits, here_op, here_val;
  4294.                 for (len = 0; len <= MAXBITS; len++) {
  4295.                     count[len] = 0
  4296.                 }
  4297.                 for (sym = 0; sym < codes; sym++) {
  4298.                     count[lens[lens_index + sym]] ++
  4299.                 }
  4300.                 root = bits;
  4301.                 for (max = MAXBITS; max >= 1; max--) {
  4302.                     if (count[max] !== 0) {
  4303.                         break
  4304.                     }
  4305.                 }
  4306.                 if (root > max) {
  4307.                     root = max
  4308.                 }
  4309.                 if (max === 0) {
  4310.                     table[table_index++] = 1 << 24 | 64 << 16 | 0;
  4311.                     table[table_index++] = 1 << 24 | 64 << 16 | 0;
  4312.                     opts.bits = 1;
  4313.                     return 0
  4314.                 }
  4315.                 for (min = 1; min < max; min++) {
  4316.                     if (count[min] !== 0) {
  4317.                         break
  4318.                     }
  4319.                 }
  4320.                 if (root < min) {
  4321.                     root = min
  4322.                 }
  4323.                 left = 1;
  4324.                 for (len = 1; len <= MAXBITS; len++) {
  4325.                     left <<= 1;
  4326.                     left -= count[len];
  4327.                     if (left < 0) {
  4328.                         return -1
  4329.                     }
  4330.                 }
  4331.                 if (left > 0 && (type === CODES || max !== 1)) {
  4332.                     return -1
  4333.                 }
  4334.                 offs[1] = 0;
  4335.                 for (len = 1; len < MAXBITS; len++) {
  4336.                     offs[len + 1] = offs[len] + count[len]
  4337.                 }
  4338.                 for (sym = 0; sym < codes; sym++) {
  4339.                     if (lens[lens_index + sym] !== 0) {
  4340.                         work[offs[lens[lens_index + sym]] ++] = sym
  4341.                     }
  4342.                 }
  4343.                 if (type === CODES) {
  4344.                     base = extra = work;
  4345.                     end = 19
  4346.                 } else if (type === LENS) {
  4347.                     base = lbase;
  4348.                     base_index -= 257;
  4349.                     extra = lext;
  4350.                     extra_index -= 257;
  4351.                     end = 256
  4352.                 } else {
  4353.                     base = dbase;
  4354.                     extra = dext;
  4355.                     end = -1
  4356.                 }
  4357.                 huff = 0;
  4358.                 sym = 0;
  4359.                 len = min;
  4360.                 next = table_index;
  4361.                 curr = root;
  4362.                 drop = 0;
  4363.                 low = -1;
  4364.                 used = 1 << root;
  4365.                 mask = used - 1;
  4366.                 if (type === LENS && used > ENOUGH_LENS || type === DISTS && used > ENOUGH_DISTS) {
  4367.                     return 1
  4368.                 }
  4369.                 var i = 0;
  4370.                 for (;;) {
  4371.                     i++;
  4372.                     here_bits = len - drop;
  4373.                     if (work[sym] < end) {
  4374.                         here_op = 0;
  4375.                         here_val = work[sym]
  4376.                     } else if (work[sym] > end) {
  4377.                         here_op = extra[extra_index + work[sym]];
  4378.                         here_val = base[base_index + work[sym]]
  4379.                     } else {
  4380.                         here_op = 32 + 64;
  4381.                         here_val = 0
  4382.                     }
  4383.                     incr = 1 << len - drop;
  4384.                     fill = 1 << curr;
  4385.                     min = fill;
  4386.                     do {
  4387.                         fill -= incr;
  4388.                         table[next + (huff >> drop) + fill] = here_bits << 24 | here_op << 16 | here_val | 0
  4389.                     } while (fill !== 0);
  4390.                     incr = 1 << len - 1;
  4391.                     while (huff & incr) {
  4392.                         incr >>= 1
  4393.                     }
  4394.                     if (incr !== 0) {
  4395.                         huff &= incr - 1;
  4396.                         huff += incr
  4397.                     } else {
  4398.                         huff = 0
  4399.                     }
  4400.                     sym++;
  4401.                     if (--count[len] === 0) {
  4402.                         if (len === max) {
  4403.                             break
  4404.                         }
  4405.                         len = lens[lens_index + work[sym]]
  4406.                     }
  4407.                     if (len > root && (huff & mask) !== low) {
  4408.                         if (drop === 0) {
  4409.                             drop = root
  4410.                         }
  4411.                         next += min;
  4412.                         curr = len - drop;
  4413.                         left = 1 << curr;
  4414.                         while (curr + drop < max) {
  4415.                             left -= count[curr + drop];
  4416.                             if (left <= 0) {
  4417.                                 break
  4418.                             }
  4419.                             curr++;
  4420.                             left <<= 1
  4421.                         }
  4422.                         used += 1 << curr;
  4423.                         if (type === LENS && used > ENOUGH_LENS || type === DISTS && used > ENOUGH_DISTS) {
  4424.                             return 1
  4425.                         }
  4426.                         low = huff & mask;
  4427.                         table[low] = root << 24 | curr << 16 | next - table_index | 0
  4428.                     }
  4429.                 }
  4430.                 if (huff !== 0) {
  4431.                     table[next + huff] = len - drop << 24 | 64 << 16 | 0
  4432.                 }
  4433.                 opts.bits = root;
  4434.                 return 0
  4435.             }
  4436.         }, {
  4437.             "../utils/common": 2
  4438.         }],
  4439.         11: [function(_dereq_, module, exports) {
  4440.             "use strict";
  4441.             module.exports = {
  4442.                 2: "need dictionary",
  4443.                 1: "stream end",
  4444.                 0: "",
  4445.                 "-1": "file error",
  4446.                 "-2": "stream error",
  4447.                 "-3": "data error",
  4448.                 "-4": "insufficient memory",
  4449.                 "-5": "buffer error",
  4450.                 "-6": "incompatible version"
  4451.             }
  4452.         }, {}],
  4453.         12: [function(_dereq_, module, exports) {
  4454.             "use strict";
  4455.  
  4456.             function ZStream() {
  4457.                 this.input = null;
  4458.                 this.next_in = 0;
  4459.                 this.avail_in = 0;
  4460.                 this.total_in = 0;
  4461.                 this.output = null;
  4462.                 this.next_out = 0;
  4463.                 this.avail_out = 0;
  4464.                 this.total_out = 0;
  4465.                 this.msg = "";
  4466.                 this.state = null;
  4467.                 this.data_type = 2;
  4468.                 this.adler = 0
  4469.             }
  4470.             module.exports = ZStream
  4471.         }, {}]
  4472.     }, {}, [1])(1)
  4473. });
  4474. var swfobject = function() {
  4475.     var D = "undefined",
  4476.         r = "object",
  4477.         T = "Shockwave Flash",
  4478.         Z = "ShockwaveFlash.ShockwaveFlash",
  4479.         q = "application/x-shockwave-flash",
  4480.         S = "SWFObjectExprInst",
  4481.         x = "onreadystatechange",
  4482.         Q = window,
  4483.         h = document,
  4484.         t = navigator,
  4485.         V = false,
  4486.         X = [],
  4487.         o = [],
  4488.         P = [],
  4489.         K = [],
  4490.         I, p, E, B, L = false,
  4491.         a = false,
  4492.         m, G, j = true,
  4493.         l = false,
  4494.         O = function() {
  4495.             var ad = typeof h.getElementById != D && typeof h.getElementsByTagName != D && typeof h.createElement != D,
  4496.                 ak = t.userAgent.toLowerCase(),
  4497.                 ab = t.platform.toLowerCase(),
  4498.                 ah = ab ? /win/.test(ab) : /win/.test(ak),
  4499.                 af = ab ? /mac/.test(ab) : /mac/.test(ak),
  4500.                 ai = /webkit/.test(ak) ? parseFloat(ak.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : false,
  4501.                 aa = t.appName === "Microsoft Internet Explorer",
  4502.                 aj = [0, 0, 0],
  4503.                 ae = null;
  4504.             if (typeof t.plugins != D && typeof t.plugins[T] == r) {
  4505.                 ae = t.plugins[T].description;
  4506.                 if (ae && (typeof t.mimeTypes != D && t.mimeTypes[q] && t.mimeTypes[q].enabledPlugin)) {
  4507.                     V = true;
  4508.                     aa = false;
  4509.                     ae = ae.replace(/^.*\s+(\S+\s+\S+$)/, "$1");
  4510.                     aj[0] = n(ae.replace(/^(.*)\..*$/, "$1"));
  4511.                     aj[1] = n(ae.replace(/^.*\.(.*)\s.*$/, "$1"));
  4512.                     aj[2] = /[a-zA-Z]/.test(ae) ? n(ae.replace(/^.*[a-zA-Z]+(.*)$/, "$1")) : 0
  4513.                 }
  4514.             } else {
  4515.                 if (typeof Q.ActiveXObject != D) {
  4516.                     try {
  4517.                         var ag = new ActiveXObject(Z);
  4518.                         if (ag) {
  4519.                             ae = ag.GetVariable("$version");
  4520.                             if (ae) {
  4521.                                 aa = true;
  4522.                                 ae = ae.split(" ")[1].split(",");
  4523.                                 aj = [n(ae[0]), n(ae[1]), n(ae[2])]
  4524.                             }
  4525.                         }
  4526.                     } catch (ac) {}
  4527.                 }
  4528.             }
  4529.             return {
  4530.                 w3: ad,
  4531.                 pv: aj,
  4532.                 wk: ai,
  4533.                 ie: aa,
  4534.                 win: ah,
  4535.                 mac: af
  4536.             }
  4537.         }(),
  4538.         i = function() {
  4539.             if (!O.w3) {
  4540.                 return
  4541.             }
  4542.             if (typeof h.readyState != D && (h.readyState === "complete" || h.readyState === "interactive") || typeof h.readyState == D && (h.getElementsByTagName("body")[0] || h.body)) {
  4543.                 f()
  4544.             }
  4545.             if (!L) {
  4546.                 if (typeof h.addEventListener != D) {
  4547.                     h.addEventListener("DOMContentLoaded", f, false)
  4548.                 }
  4549.                 if (O.ie) {
  4550.                     h.attachEvent(x, function aa() {
  4551.                         if (h.readyState == "complete") {
  4552.                             h.detachEvent(x, aa);
  4553.                             f()
  4554.                         }
  4555.                     });
  4556.                     if (Q == top) {
  4557.                         (function ac() {
  4558.                             if (L) {
  4559.                                 return
  4560.                             }
  4561.                             try {
  4562.                                 h.documentElement.doScroll("left")
  4563.                             } catch (ad) {
  4564.                                 setTimeout(ac, 0);
  4565.                                 return
  4566.                             }
  4567.                             f()
  4568.                         })()
  4569.                     }
  4570.                 }
  4571.                 if (O.wk) {
  4572.                     (function ab() {
  4573.                         if (L) {
  4574.                             return
  4575.                         }
  4576.                         if (!/loaded|complete/.test(h.readyState)) {
  4577.                             setTimeout(ab, 0);
  4578.                             return
  4579.                         }
  4580.                         f()
  4581.                     })()
  4582.                 }
  4583.             }
  4584.         }();
  4585.  
  4586.     function f() {
  4587.         if (L || !document.getElementsByTagName("body")[0]) {
  4588.             return
  4589.         }
  4590.         try {
  4591.             var ac, ad = C("span");
  4592.             ad.style.display = "none";
  4593.             ac = h.getElementsByTagName("body")[0].appendChild(ad);
  4594.             ac.parentNode.removeChild(ac);
  4595.             ac = null;
  4596.             ad = null
  4597.         } catch (ae) {
  4598.             return
  4599.         }
  4600.         L = true;
  4601.         var aa = X.length;
  4602.         for (var ab = 0; ab < aa; ab++) {
  4603.             X[ab]()
  4604.         }
  4605.     }
  4606.  
  4607.     function M(aa) {
  4608.         if (L) {
  4609.             aa()
  4610.         } else {
  4611.             X[X.length] = aa
  4612.         }
  4613.     }
  4614.  
  4615.     function s(ab) {
  4616.         if (typeof Q.addEventListener != D) {
  4617.             Q.addEventListener("load", ab, false)
  4618.         } else {
  4619.             if (typeof h.addEventListener != D) {
  4620.                 h.addEventListener("load", ab, false)
  4621.             } else {
  4622.                 if (typeof Q.attachEvent != D) {
  4623.                     g(Q, "onload", ab)
  4624.                 } else {
  4625.                     if (typeof Q.onload == "function") {
  4626.                         var aa = Q.onload;
  4627.                         Q.onload = function() {
  4628.                             aa();
  4629.                             ab()
  4630.                         }
  4631.                     } else {
  4632.                         Q.onload = ab
  4633.                     }
  4634.                 }
  4635.             }
  4636.         }
  4637.     }
  4638.  
  4639.     function Y() {
  4640.         var aa = h.getElementsByTagName("body")[0];
  4641.         var ae = C(r);
  4642.         ae.setAttribute("style", "visibility: hidden;");
  4643.         ae.setAttribute("type", q);
  4644.         var ad = aa.appendChild(ae);
  4645.         if (ad) {
  4646.             var ac = 0;
  4647.             (function ab() {
  4648.                 if (typeof ad.GetVariable != D) {
  4649.                     try {
  4650.                         var ag = ad.GetVariable("$version");
  4651.                         if (ag) {
  4652.                             ag = ag.split(" ")[1].split(",");
  4653.                             O.pv = [n(ag[0]), n(ag[1]), n(ag[2])]
  4654.                         }
  4655.                     } catch (af) {
  4656.                         O.pv = [8, 0, 0]
  4657.                     }
  4658.                 } else {
  4659.                     if (ac < 10) {
  4660.                         ac++;
  4661.                         setTimeout(ab, 10);
  4662.                         return
  4663.                     }
  4664.                 }
  4665.                 aa.removeChild(ae);
  4666.                 ad = null;
  4667.                 H()
  4668.             })()
  4669.         } else {
  4670.             H()
  4671.         }
  4672.     }
  4673.  
  4674.     function H() {
  4675.         var aj = o.length;
  4676.         if (aj > 0) {
  4677.             for (var ai = 0; ai < aj; ai++) {
  4678.                 var ab = o[ai].id;
  4679.                 var ae = o[ai].callbackFn;
  4680.                 var ad = {
  4681.                     success: false,
  4682.                     id: ab
  4683.                 };
  4684.                 if (O.pv[0] > 0) {
  4685.                     var ah = c(ab);
  4686.                     if (ah) {
  4687.                         if (F(o[ai].swfVersion) && !(O.wk && O.wk < 312)) {
  4688.                             w(ab, true);
  4689.                             if (ae) {
  4690.                                 ad.success = true;
  4691.                                 ad.ref = z(ab);
  4692.                                 ad.id = ab;
  4693.                                 ae(ad)
  4694.                             }
  4695.                         } else {
  4696.                             if (o[ai].expressInstall && A()) {
  4697.                                 var al = {};
  4698.                                 al.data = o[ai].expressInstall;
  4699.                                 al.width = ah.getAttribute("width") || "0";
  4700.                                 al.height = ah.getAttribute("height") || "0";
  4701.                                 if (ah.getAttribute("class")) {
  4702.                                     al.styleclass = ah.getAttribute("class")
  4703.                                 }
  4704.                                 if (ah.getAttribute("align")) {
  4705.                                     al.align = ah.getAttribute("align")
  4706.                                 }
  4707.                                 var ak = {};
  4708.                                 var aa = ah.getElementsByTagName("param");
  4709.                                 var af = aa.length;
  4710.                                 for (var ag = 0; ag < af; ag++) {
  4711.                                     if (aa[ag].getAttribute("name").toLowerCase() != "movie") {
  4712.                                         ak[aa[ag].getAttribute("name")] = aa[ag].getAttribute("value")
  4713.                                     }
  4714.                                 }
  4715.                                 R(al, ak, ab, ae)
  4716.                             } else {
  4717.                                 b(ah);
  4718.                                 if (ae) {
  4719.                                     ae(ad)
  4720.                                 }
  4721.                             }
  4722.                         }
  4723.                     }
  4724.                 } else {
  4725.                     w(ab, true);
  4726.                     if (ae) {
  4727.                         var ac = z(ab);
  4728.                         if (ac && typeof ac.SetVariable != D) {
  4729.                             ad.success = true;
  4730.                             ad.ref = ac;
  4731.                             ad.id = ac.id
  4732.                         }
  4733.                         ae(ad)
  4734.                     }
  4735.                 }
  4736.             }
  4737.         }
  4738.     }
  4739.     X[0] = function() {
  4740.         if (V) {
  4741.             Y()
  4742.         } else {
  4743.             H()
  4744.         }
  4745.     };
  4746.  
  4747.     function z(ac) {
  4748.         var aa = null,
  4749.             ab = c(ac);
  4750.         if (ab && ab.nodeName.toUpperCase() === "OBJECT") {
  4751.             if (typeof ab.SetVariable !== D) {
  4752.                 aa = ab
  4753.             } else {
  4754.                 aa = ab.getElementsByTagName(r)[0] || ab
  4755.             }
  4756.         }
  4757.         return aa
  4758.     }
  4759.  
  4760.     function A() {
  4761.         return !a && F("6.0.65") && (O.win || O.mac) && !(O.wk && O.wk < 312)
  4762.     }
  4763.  
  4764.     function R(ad, ae, aa, ac) {
  4765.         var ah = c(aa);
  4766.         aa = W(aa);
  4767.         a = true;
  4768.         E = ac || null;
  4769.         B = {
  4770.             success: false,
  4771.             id: aa
  4772.         };
  4773.         if (ah) {
  4774.             if (ah.nodeName.toUpperCase() == "OBJECT") {
  4775.                 I = J(ah);
  4776.                 p = null
  4777.             } else {
  4778.                 I = ah;
  4779.                 p = aa
  4780.             }
  4781.             ad.id = S;
  4782.             if (typeof ad.width == D || !/%$/.test(ad.width) && n(ad.width) < 310) {
  4783.                 ad.width = "310"
  4784.             }
  4785.             if (typeof ad.height == D || !/%$/.test(ad.height) && n(ad.height) < 137) {
  4786.                 ad.height = "137"
  4787.             }
  4788.             var ag = O.ie ? "ActiveX" : "PlugIn",
  4789.                 af = "MMredirectURL=" + encodeURIComponent(Q.location.toString().replace(/&/g, "%26")) + "&MMplayerType=" + ag + "&MMdoctitle=" + encodeURIComponent(h.title.slice(0, 47) + " - Flash Player Installation");
  4790.             if (typeof ae.flashvars != D) {
  4791.                 ae.flashvars += "&" + af
  4792.             } else {
  4793.                 ae.flashvars = af
  4794.             }
  4795.             if (O.ie && ah.readyState != 4) {
  4796.                 var ab = C("div");
  4797.                 aa += "SWFObjectNew";
  4798.                 ab.setAttribute("id", aa);
  4799.                 ah.parentNode.insertBefore(ab, ah);
  4800.                 ah.style.display = "none";
  4801.                 y(ah)
  4802.             }
  4803.             u(ad, ae, aa)
  4804.         }
  4805.     }
  4806.  
  4807.     function b(ab) {
  4808.         if (O.ie && ab.readyState != 4) {
  4809.             ab.style.display = "none";
  4810.             var aa = C("div");
  4811.             ab.parentNode.insertBefore(aa, ab);
  4812.             aa.parentNode.replaceChild(J(ab), aa);
  4813.             y(ab)
  4814.         } else {
  4815.             ab.parentNode.replaceChild(J(ab), ab)
  4816.         }
  4817.     }
  4818.  
  4819.     function J(af) {
  4820.         var ae = C("div");
  4821.         if (O.win && O.ie) {
  4822.             ae.innerHTML = af.innerHTML
  4823.         } else {
  4824.             var ab = af.getElementsByTagName(r)[0];
  4825.             if (ab) {
  4826.                 var ag = ab.childNodes;
  4827.                 if (ag) {
  4828.                     var aa = ag.length;
  4829.                     for (var ad = 0; ad < aa; ad++) {
  4830.                         if (!(ag[ad].nodeType == 1 && ag[ad].nodeName == "PARAM") && !(ag[ad].nodeType == 8)) {
  4831.                             ae.appendChild(ag[ad].cloneNode(true))
  4832.                         }
  4833.                     }
  4834.                 }
  4835.             }
  4836.         }
  4837.         return ae
  4838.     }
  4839.  
  4840.     function k(aa, ab) {
  4841.         var ac = C("div");
  4842.         ac.innerHTML = "<object classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000'><param name='movie' value='" + aa + "'>" + ab + "</object>";
  4843.         return ac.firstChild
  4844.     }
  4845.  
  4846.     function u(ai, ag, ab) {
  4847.         var aa, ad = c(ab);
  4848.         ab = W(ab);
  4849.         if (O.wk && O.wk < 312) {
  4850.             return aa
  4851.         }
  4852.         if (ad) {
  4853.             var ac = O.ie ? C("div") : C(r),
  4854.                 af, ah, ae;
  4855.             if (typeof ai.id == D) {
  4856.                 ai.id = ab
  4857.             }
  4858.             for (ae in ag) {
  4859.                 if (ag.hasOwnProperty(ae) && ae.toLowerCase() !== "movie") {
  4860.                     e(ac, ae, ag[ae])
  4861.                 }
  4862.             }
  4863.             if (O.ie) {
  4864.                 ac = k(ai.data, ac.innerHTML)
  4865.             }
  4866.             for (af in ai) {
  4867.                 if (ai.hasOwnProperty(af)) {
  4868.                     ah = af.toLowerCase();
  4869.                     if (ah === "styleclass") {
  4870.                         ac.setAttribute("class", ai[af])
  4871.                     } else {
  4872.                         if (ah !== "classid" && ah !== "data") {
  4873.                             ac.setAttribute(af, ai[af])
  4874.                         }
  4875.                     }
  4876.                 }
  4877.             }
  4878.             if (O.ie) {
  4879.                 P[P.length] = ai.id
  4880.             } else {
  4881.                 ac.setAttribute("type", q);
  4882.                 ac.setAttribute("data", ai.data)
  4883.             }
  4884.             ad.parentNode.replaceChild(ac, ad);
  4885.             aa = ac
  4886.         }
  4887.         return aa
  4888.     }
  4889.  
  4890.     function e(ac, aa, ab) {
  4891.         var ad = C("param");
  4892.         ad.setAttribute("name", aa);
  4893.         ad.setAttribute("value", ab);
  4894.         ac.appendChild(ad)
  4895.     }
  4896.  
  4897.     function y(ac) {
  4898.         var ab = c(ac);
  4899.         if (ab && ab.nodeName.toUpperCase() == "OBJECT") {
  4900.             if (O.ie) {
  4901.                 ab.style.display = "none";
  4902.                 (function aa() {
  4903.                     if (ab.readyState == 4) {
  4904.                         for (var ad in ab) {
  4905.                             if (typeof ab[ad] == "function") {
  4906.                                 ab[ad] = null
  4907.                             }
  4908.                         }
  4909.                         ab.parentNode.removeChild(ab)
  4910.                     } else {
  4911.                         setTimeout(aa, 10)
  4912.                     }
  4913.                 })()
  4914.             } else {
  4915.                 ab.parentNode.removeChild(ab)
  4916.             }
  4917.         }
  4918.     }
  4919.  
  4920.     function U(aa) {
  4921.         return aa && aa.nodeType && aa.nodeType === 1
  4922.     }
  4923.  
  4924.     function W(aa) {
  4925.         return U(aa) ? aa.id : aa
  4926.     }
  4927.  
  4928.     function c(ac) {
  4929.         if (U(ac)) {
  4930.             return ac
  4931.         }
  4932.         var aa = null;
  4933.         try {
  4934.             aa = h.getElementById(ac)
  4935.         } catch (ab) {}
  4936.         return aa
  4937.     }
  4938.  
  4939.     function C(aa) {
  4940.         return h.createElement(aa)
  4941.     }
  4942.  
  4943.     function n(aa) {
  4944.         return parseInt(aa, 10)
  4945.     }
  4946.  
  4947.     function g(ac, aa, ab) {
  4948.         ac.attachEvent(aa, ab);
  4949.         K[K.length] = [ac, aa, ab]
  4950.     }
  4951.  
  4952.     function F(ac) {
  4953.         ac += "";
  4954.         var ab = O.pv,
  4955.             aa = ac.split(".");
  4956.         aa[0] = n(aa[0]);
  4957.         aa[1] = n(aa[1]) || 0;
  4958.         aa[2] = n(aa[2]) || 0;
  4959.         return ab[0] > aa[0] || ab[0] == aa[0] && ab[1] > aa[1] || ab[0] == aa[0] && ab[1] == aa[1] && ab[2] >= aa[2] ? true : false
  4960.     }
  4961.  
  4962.     function v(af, ab, ag, ae) {
  4963.         var ad = h.getElementsByTagName("head")[0];
  4964.         if (!ad) {
  4965.             return
  4966.         }
  4967.         var aa = typeof ag == "string" ? ag : "screen";
  4968.         if (ae) {
  4969.             m = null;
  4970.             G = null
  4971.         }
  4972.         if (!m || G != aa) {
  4973.             var ac = C("style");
  4974.             ac.setAttribute("type", "text/css");
  4975.             ac.setAttribute("media", aa);
  4976.             m = ad.appendChild(ac);
  4977.             if (O.ie && typeof h.styleSheets != D && h.styleSheets.length > 0) {
  4978.                 m = h.styleSheets[h.styleSheets.length - 1]
  4979.             }
  4980.             G = aa
  4981.         }
  4982.         if (m) {
  4983.             if (typeof m.addRule != D) {
  4984.                 m.addRule(af, ab)
  4985.             } else {
  4986.                 if (typeof h.createTextNode != D) {
  4987.                     m.appendChild(h.createTextNode(af + " {" + ab + "}"))
  4988.                 }
  4989.             }
  4990.         }
  4991.     }
  4992.  
  4993.     function w(ad, aa) {
  4994.         if (!j) {
  4995.             return
  4996.         }
  4997.         var ab = aa ? "visible" : "hidden",
  4998.             ac = c(ad);
  4999.         if (L && ac) {
  5000.             ac.style.visibility = ab
  5001.         } else {
  5002.             if (typeof ad === "string") {
  5003.                 v("#" + ad, "visibility:" + ab)
  5004.             }
  5005.         }
  5006.     }
  5007.  
  5008.     function N(ab) {
  5009.         var ac = /[\\\"<>\.;]/;
  5010.         var aa = ac.exec(ab) != null;
  5011.         return aa && typeof encodeURIComponent != D ? encodeURIComponent(ab) : ab
  5012.     }
  5013.     var d = function() {
  5014.         if (O.ie) {
  5015.             window.attachEvent("onunload", function() {
  5016.                 var af = K.length;
  5017.                 for (var ae = 0; ae < af; ae++) {
  5018.                     K[ae][0].detachEvent(K[ae][1], K[ae][2])
  5019.                 }
  5020.                 var ac = P.length;
  5021.                 for (var ad = 0; ad < ac; ad++) {
  5022.                     y(P[ad])
  5023.                 }
  5024.                 for (var ab in O) {
  5025.                     O[ab] = null
  5026.                 }
  5027.                 O = null;
  5028.                 for (var aa in swfobject) {
  5029.                     swfobject[aa] = null
  5030.                 }
  5031.                 swfobject = null
  5032.             })
  5033.         }
  5034.     }();
  5035.     return {
  5036.         registerObject: function(ae, aa, ad, ac) {
  5037.             if (O.w3 && ae && aa) {
  5038.                 var ab = {};
  5039.                 ab.id = ae;
  5040.                 ab.swfVersion = aa;
  5041.                 ab.expressInstall = ad;
  5042.                 ab.callbackFn = ac;
  5043.                 o[o.length] = ab;
  5044.                 w(ae, false)
  5045.             } else {
  5046.                 if (ac) {
  5047.                     ac({
  5048.                         success: false,
  5049.                         id: ae
  5050.                     })
  5051.                 }
  5052.             }
  5053.         },
  5054.         getObjectById: function(aa) {
  5055.             if (O.w3) {
  5056.                 return z(aa)
  5057.             }
  5058.         },
  5059.         embedSWF: function(af, al, ai, ak, ab, ae, ad, ah, aj, ag) {
  5060.             var ac = W(al),
  5061.                 aa = {
  5062.                     success: false,
  5063.                     id: ac
  5064.                 };
  5065.             if (O.w3 && !(O.wk && O.wk < 312) && af && al && ai && ak && ab) {
  5066.                 w(ac, false);
  5067.                 M(function() {
  5068.                     ai += "";
  5069.                     ak += "";
  5070.                     var an = {};
  5071.                     if (aj && typeof aj === r) {
  5072.                         for (var aq in aj) {
  5073.                             an[aq] = aj[aq]
  5074.                         }
  5075.                     }
  5076.                     an.data = af;
  5077.                     an.width = ai;
  5078.                     an.height = ak;
  5079.                     var ar = {};
  5080.                     if (ah && typeof ah === r) {
  5081.                         for (var ao in ah) {
  5082.                             ar[ao] = ah[ao]
  5083.                         }
  5084.                     }
  5085.                     if (ad && typeof ad === r) {
  5086.                         for (var am in ad) {
  5087.                             if (ad.hasOwnProperty(am)) {
  5088.                                 var ap = l ? encodeURIComponent(am) : am,
  5089.                                     at = l ? encodeURIComponent(ad[am]) : ad[am];
  5090.                                 if (typeof ar.flashvars != D) {
  5091.                                     ar.flashvars += "&" + ap + "=" + at
  5092.                                 } else {
  5093.                                     ar.flashvars = ap + "=" + at
  5094.                                 }
  5095.                             }
  5096.                         }
  5097.                     }
  5098.                     if (F(ab)) {
  5099.                         var au = u(an, ar, al);
  5100.                         if (an.id == ac) {
  5101.                             w(ac, true)
  5102.                         }
  5103.                         aa.success = true;
  5104.                         aa.ref = au;
  5105.                         aa.id = au.id
  5106.                     } else {
  5107.                         if (ae && A()) {
  5108.                             an.data = ae;
  5109.                             R(an, ar, al, ag);
  5110.                             return
  5111.                         } else {
  5112.                             w(ac, true)
  5113.                         }
  5114.                     }
  5115.                     if (ag) {
  5116.                         ag(aa)
  5117.                     }
  5118.                 })
  5119.             } else {
  5120.                 if (ag) {
  5121.                     ag(aa)
  5122.                 }
  5123.             }
  5124.         },
  5125.         switchOffAutoHideShow: function() {
  5126.             j = false
  5127.         },
  5128.         enableUriEncoding: function(aa) {
  5129.             l = typeof aa === D ? true : aa
  5130.         },
  5131.         ua: O,
  5132.         getFlashPlayerVersion: function() {
  5133.             return {
  5134.                 major: O.pv[0],
  5135.                 minor: O.pv[1],
  5136.                 release: O.pv[2]
  5137.             }
  5138.         },
  5139.         hasFlashPlayerVersion: F,
  5140.         createSWF: function(ac, ab, aa) {
  5141.             if (O.w3) {
  5142.                 return u(ac, ab, aa)
  5143.             } else {
  5144.                 return undefined
  5145.             }
  5146.         },
  5147.         showExpressInstall: function(ac, ad, aa, ab) {
  5148.             if (O.w3 && A()) {
  5149.                 R(ac, ad, aa, ab)
  5150.             }
  5151.         },
  5152.         removeSWF: function(aa) {
  5153.             if (O.w3) {
  5154.                 y(aa)
  5155.             }
  5156.         },
  5157.         createCSS: function(ad, ac, ab, aa) {
  5158.             if (O.w3) {
  5159.                 v(ad, ac, ab, aa)
  5160.             }
  5161.         },
  5162.         addDomLoadEvent: M,
  5163.         addLoadEvent: s,
  5164.         getQueryParamValue: function(ad) {
  5165.             var ac = h.location.search || h.location.hash;
  5166.             if (ac) {
  5167.                 if (/\?/.test(ac)) {
  5168.                     ac = ac.split("?")[1]
  5169.                 }
  5170.                 if (ad == null) {
  5171.                     return N(ac)
  5172.                 }
  5173.                 var ab = ac.split("&");
  5174.                 for (var aa = 0; aa < ab.length; aa++) {
  5175.                     if (ab[aa].substring(0, ab[aa].indexOf("=")) == ad) {
  5176.                         return N(ab[aa].substring(ab[aa].indexOf("=") + 1))
  5177.                     }
  5178.                 }
  5179.             }
  5180.             return ""
  5181.         },
  5182.         expressInstallCallback: function() {
  5183.             if (a) {
  5184.                 var aa = c(S);
  5185.                 if (aa && I) {
  5186.                     aa.parentNode.replaceChild(I, aa);
  5187.                     if (p) {
  5188.                         w(p, true);
  5189.                         if (O.ie) {
  5190.                             I.style.display = "block"
  5191.                         }
  5192.                     }
  5193.                     if (E) {
  5194.                         E(B)
  5195.                     }
  5196.                 }
  5197.                 a = false
  5198.             }
  5199.         },
  5200.         version: "2.3"
  5201.     }
  5202. }();
  5203. mat4.extractEulerAngles = function(out, m) {
  5204.     out[0] = Math.atan2(m[6], m[10]);
  5205.     var c2 = Math.sqrt(m[0] * m[0] + m[1] * m[1]);
  5206.     out[1] = Math.atan2(-m[2], c2);
  5207.     var s1 = Math.sin(out[0]),
  5208.         c1 = Math.cos(out[0]);
  5209.     out[2] = Math.atan2(s1 * m[8] - c1 * m[4], c1 * m[5] - s1 * m[9]);
  5210.     return out
  5211. };
  5212. mat4.invert2 = function(out, m) {
  5213.     var det = m[0] * (m[5] * m[10] - m[6] * m[9]) + m[4] * (m[2] * m[9] - m[1] * m[10]) + m[8] * (m[1] * m[6] - m[2] * m[5]);
  5214.     if (det == 0) return null;
  5215.     var invDet = 1 / det;
  5216.     out[0] = (m[5] * m[10] - m[6] * m[9]) * invDet;
  5217.     out[1] = (m[9] * m[2] - m[10] * m[1]) * invDet;
  5218.     out[2] = (m[1] * m[6] - m[2] * m[5]) * invDet;
  5219.     out[4] = (m[6] * m[8] - m[4] * m[10]) * invDet;
  5220.     out[5] = (m[10] * m[0] - m[8] * m[2]) * invDet;
  5221.     out[6] = (m[2] * m[4] - m[0] * m[6]) * invDet;
  5222.     out[8] = (m[4] * m[9] - m[5] * m[8]) * invDet;
  5223.     out[9] = (m[8] * m[1] - m[9] * m[0]) * invDet;
  5224.     out[10] = (m[0] * m[5] - m[1] * m[4]) * invDet;
  5225.     out[3] = out[0] * -m[3] + out[1] * -m[7] + out[2] * -m[11];
  5226.     out[7] = out[4] * -m[3] + out[5] * -m[7] + out[6] * -m[11];
  5227.     out[11] = out[8] * -m[3] + out[9] * -m[7] + out[10] * -m[11];
  5228.     out[12] = out[13] = out[14] = 0;
  5229.     out[15] = 1;
  5230.     return out
  5231. };
  5232. window.requestAnimFrame = function() {
  5233.     return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function(callback, element) {
  5234.         window.setTimeout(callback, 1e3 / 60)
  5235.     }
  5236. }();
  5237. jQuery.support.cors = true;
  5238. if ($.ajaxTransport) {
  5239.     $.ajaxSetup({
  5240.         flatOptions: {
  5241.             renderer: true
  5242.         }
  5243.     });
  5244.     $.ajaxTransport("+binary", function(options, originalOptions, jqXHR) {
  5245.         if (window.FormData && (options.dataType && options.dataType == "binary" || options.data && (window.ArrayBuffer && options.data instanceof ArrayBuffer || window.Blob && options.data instanceof Blob))) {
  5246.             return {
  5247.                 send: function(_, callback) {
  5248.                     var xhr = new XMLHttpRequest,
  5249.                         url = options.url,
  5250.                         type = options.type,
  5251.                         dataType = options.responseType || "blob",
  5252.                         data = options.data || null;
  5253.                     if (options.renderer) {
  5254.                         xhr.addEventListener("progress", function(event) {
  5255.                             if (event.lengthComputable) {
  5256.                                 if (!options.renderer.downloads[this.responseURL]) {
  5257.                                     options.renderer.downloads[this.responseURL] = {
  5258.                                         loaded: event.loaded,
  5259.                                         total: event.total
  5260.                                     }
  5261.                                 } else {
  5262.                                     options.renderer.downloads[this.responseURL].loaded = event.loaded
  5263.                                 }
  5264.                                 options.renderer.updateProgress()
  5265.                             }
  5266.                         })
  5267.                     }
  5268.                     xhr.addEventListener("load", function() {
  5269.                         if (options.renderer) {
  5270.                             delete options.renderer.downloads[this.responseURL];
  5271.                             options.renderer.updateProgress()
  5272.                         }
  5273.                         var data = {};
  5274.                         data[options.dataType] = xhr.response;
  5275.                         callback(xhr.status, xhr.statusText, data, xhr.getAllResponseHeaders())
  5276.                     });
  5277.                     xhr.open(type, url, true);
  5278.                     xhr.responseType = dataType;
  5279.                     xhr.send(data)
  5280.                 },
  5281.                 abort: function() {
  5282.                     jqXHR.abort()
  5283.                 }
  5284.             }
  5285.         }
  5286.     })
  5287. } else {
  5288.     (function() {
  5289.         var httpData = $.httpData;
  5290.         $.httpData = function(xhr, type, s) {
  5291.             if (type == "binary") {
  5292.                 return xhr.response
  5293.             } else {
  5294.                 return httpData(xhr, type, s)
  5295.             }
  5296.         }
  5297.     })();
  5298.     $.ajaxSetup({
  5299.         beforeSend: function(xhr, options) {
  5300.             if (options.dataType == "binary") {
  5301.                 xhr.responseType = options.responseType || "arraybuffer";
  5302.                 xhr.addEventListener("progress", function(event) {
  5303.                     if (!options.renderer) return;
  5304.                     if (event.lengthComputable) {
  5305.                         if (!options.renderer.downloads[this.responseURL]) {
  5306.                             options.renderer.downloads[this.responseURL] = {
  5307.                                 loaded: event.loaded,
  5308.                                 total: event.total
  5309.                             }
  5310.                         } else {
  5311.                             options.renderer.downloads[this.responseURL].loaded = event.loaded
  5312.                         }
  5313.                         options.renderer.updateProgress()
  5314.                     }
  5315.                 }, false);
  5316.                 xhr.addEventListener("load", function() {
  5317.                     if (!options.renderer) return;
  5318.                     delete options.renderer.downloads[this.responseURL];
  5319.                     options.renderer.updateProgress()
  5320.                 }, false)
  5321.             }
  5322.         }
  5323.     })
  5324. }
  5325. Math.randomInt = function() {
  5326.     return Math.randomInt || function(min, max) {
  5327.         return Math.floor(Math.random() * (max - min)) + min
  5328.     }
  5329. }();
  5330. if (typeof Object.create != "function") {
  5331.     Object.create = function() {
  5332.         var obj = function() {};
  5333.         return function(prototype) {
  5334.             if (arguments.length > 1) {
  5335.                 throw Error("Second argument not supported")
  5336.             }
  5337.             if (typeof prototype != "object") {
  5338.                 throw TypeError("Argument must be an object")
  5339.             }
  5340.             obj.prototype = prototype;
  5341.             var result = new obj;
  5342.             obj.prototype = null;
  5343.             return result
  5344.         }
  5345.     }()
  5346. }
  5347. window.console = window.console || {
  5348.     log: function() {},
  5349.     error: function() {},
  5350.     warn: function() {}
  5351. };
  5352.  
  5353. function ZamModelViewer(opts) {
  5354.     var self = this;
  5355.     if (!opts.type || !self.validTypes[opts.type]) throw "Viewer error: Bad viewer type given";
  5356.     if (!opts.container) throw "Viewer error: Bad container given";
  5357.     if (!opts.aspect) throw "Viewer error: Bad aspect ratio given";
  5358.     if (!opts.contentPath) throw "Viewer error: No content path given";
  5359.     self.type = opts.type;
  5360.     self.container = opts.container;
  5361.     self.aspect = parseFloat(opts.aspect);
  5362.     self.renderer = null;
  5363.     self.options = opts;
  5364.     var width = parseInt(self.container.width());
  5365.     var height = Math.round(width / self.aspect);
  5366.     self.init(width, height)
  5367. }
  5368. ZamModelViewer.WEBGL = 1;
  5369. ZamModelViewer.FLASH = 2;
  5370. ZamModelViewer.TOR = 1;
  5371. ZamModelViewer.WOW = 2;
  5372. ZamModelViewer.LOL = 3;
  5373. ZamModelViewer.GW2 = 4;
  5374. ZamModelViewer.WILDSTAR = 5;
  5375. ZamModelViewer.HEROES = 6;
  5376. ZamModelViewer.DESTINY = 7;
  5377. ZamModelViewer.Models = {};
  5378. ZamModelViewer.prototype = {
  5379.     validTypes: {
  5380.         2: "Wowhead",
  5381.         3: "LolKing",
  5382.         6: "HeroKing",
  5383.         7: "DestinyDB"
  5384.     },
  5385.     destroy: function() {
  5386.         var self = this;
  5387.         if (self.renderer) self.renderer.destroy();
  5388.         self.options = null;
  5389.         self.container = null
  5390.     },
  5391.     init: function(width, height) {
  5392.         var self = this,
  5393.             glSupport = false;
  5394.         if (typeof window["Uint8Array"] !== undefined && typeof window["DataView"] !== undefined) {
  5395.             try {
  5396.                 var canvas = document.createElement("canvas");
  5397.                 var ctx = canvas.getContext("webgl") || canvas.getContext("experimental-webgl");
  5398.                 if (ctx) glSupport = true
  5399.             } catch (e) {}
  5400.         }
  5401.         if (!self.options.flash && glSupport) {
  5402.             self.mode = ZamModelViewer.WEBGL;
  5403.             self.renderer = new ZamModelViewer.WebGL(self)
  5404.         } else {
  5405.             self.mode = ZamModelViewer.FLASH;
  5406.             self.renderer = new ZamModelViewer.Flash(self)
  5407.         }
  5408.         self.renderer.resize(width, height);
  5409.         self.renderer.init()
  5410.     },
  5411.     method: function(name, params) {
  5412.         var self = this;
  5413.         if (params === undefined) params = [];
  5414.         if (self.renderer) return self.renderer.method(name, [].concat(params));
  5415.         return null
  5416.     },
  5417.     option: function(key, val) {
  5418.         var self = this;
  5419.         if (val !== undefined) {
  5420.             self.options[key] = val
  5421.         }
  5422.         return self.options[key]
  5423.     }
  5424. };
  5425. ZamModelViewer.isFullscreen = function() {
  5426.     if (document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement) return true;
  5427.     return false
  5428. };
  5429. ZamModelViewer.requestFullscreen = function(e) {
  5430.     if (document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement) return;
  5431.     if (e.requestFullscreen) {
  5432.         e.requestFullscreen()
  5433.     } else if (e.webkitRequestFullscreen) {
  5434.         e.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT)
  5435.     } else if (e.mozRequestFullScreen) {
  5436.         e.mozRequestFullScreen()
  5437.     } else if (e.msRequestFullscreen) {
  5438.         e.msRequestFullscreen()
  5439.     }
  5440. };
  5441. ZamModelViewer.exitFullscreen = function() {
  5442.     if (document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement) return;
  5443.     if (document.exitFullscreen) {
  5444.         document.exitFullscreen()
  5445.     } else if (document.webkitExitFullscreen) {
  5446.         document.webkitExitFullscreen()
  5447.     } else if (document.mozCancelFullScreen) {
  5448.         document.mozCancelFullScreen()
  5449.     } else if (document.msExitFullscreen) {
  5450.         document.msExitFullscreen()
  5451.     }
  5452. };
  5453. ZamModelViewer.DataView = function(buffer) {
  5454.     this.buffer = new DataView(buffer);
  5455.     this.position = 0
  5456. };
  5457. ZamModelViewer.DataView.prototype = {
  5458.     getBool: function() {
  5459.         var v = this.buffer.getUint8(this.position) != 0;
  5460.         this.position += 1;
  5461.         return v
  5462.     },
  5463.     getUint8: function() {
  5464.         var v = this.buffer.getUint8(this.position);
  5465.         this.position += 1;
  5466.         return v
  5467.     },
  5468.     getInt8: function() {
  5469.         var v = this.buffer.getInt8(this.position);
  5470.         this.position += 1;
  5471.         return v
  5472.     },
  5473.     getUint16: function() {
  5474.         var v = this.buffer.getUint16(this.position, true);
  5475.         this.position += 2;
  5476.         return v
  5477.     },
  5478.     getInt16: function() {
  5479.         var v = this.buffer.getInt16(this.position, true);
  5480.         this.position += 2;
  5481.         return v
  5482.     },
  5483.     getUint32: function() {
  5484.         var v = this.buffer.getUint32(this.position, true);
  5485.         this.position += 4;
  5486.         return v
  5487.     },
  5488.     getInt32: function() {
  5489.         var v = this.buffer.getInt32(this.position, true);
  5490.         this.position += 4;
  5491.         return v
  5492.     },
  5493.     getFloat: function() {
  5494.         var v = this.buffer.getFloat32(this.position, true);
  5495.         this.position += 4;
  5496.         return v
  5497.     },
  5498.     getString: function(len) {
  5499.         if (len === undefined) len = this.getUint16();
  5500.         var str = "";
  5501.         for (var i = 0; i < len; ++i) {
  5502.             str += String.fromCharCode(this.getUint8())
  5503.         }
  5504.         return str
  5505.     },
  5506.     setBool: function(v) {
  5507.         this.buffer.setUint8(this.position, v ? 1 : 0);
  5508.         this.position += 1
  5509.     },
  5510.     setUint8: function(v) {
  5511.         this.buffer.setUint8(this.position, v);
  5512.         this.position += 1
  5513.     },
  5514.     setInt8: function(v) {
  5515.         this.buffer.setInt8(this.position, v);
  5516.         this.position += 1
  5517.     },
  5518.     setUint16: function(v) {
  5519.         this.buffer.setUint16(this.position, v, true);
  5520.         this.position += 2
  5521.     },
  5522.     setInt16: function(v) {
  5523.         this.buffer.setInt16(this.position, v, true);
  5524.         this.position += 2
  5525.     },
  5526.     setUint32: function(v) {
  5527.         this.buffer.setUint32(this.position, v, true);
  5528.         this.position += 4
  5529.     },
  5530.     setInt32: function(v) {
  5531.         this.buffer.setInt32(this.position, v, true);
  5532.         this.position += 4
  5533.     },
  5534.     setFloat: function(v) {
  5535.         this.buffer.setFloat32(this.position, v, true);
  5536.         this.position += 4
  5537.     }
  5538. };
  5539. ZamModelViewer.WebGL = function(viewer) {
  5540.     var self = this;
  5541.     self.viewer = viewer;
  5542.     self.options = viewer.options;
  5543.     self.downloads = {};
  5544.     self.context = null;
  5545.     self.width = 0;
  5546.     self.height = 0;
  5547.     self.time = 0;
  5548.     self.delta = 0;
  5549.     self.models = [];
  5550.     self.azimuth = Math.PI * 1.5;
  5551.     self.zenith = Math.PI / 2;
  5552.     self.distance = 15;
  5553.     self.fov = 30;
  5554.     self.translation = [0, 0, 0];
  5555.     self.target = [0, 0, 0];
  5556.     self.eye = [0, 0, 0];
  5557.     self.up = [0, 0, 1];
  5558.     self.lookDir = vec3.create();
  5559.     self.fullscreen = false;
  5560.     self.projMatrix = mat4.create();
  5561.     self.viewMatrix = mat4.create();
  5562.     self.panningMatrix = mat4.create();
  5563.     self.viewOffset = vec3.create();
  5564.     if (!ZamModelViewer.WebGL.addedCss) {
  5565.         ZamModelViewer.WebGL.addedCss = true;
  5566.         $("head").append('<link rel="stylesheet" href="//cdn.zamimg.com/zmv/viewer.css" type="text/css" />')
  5567.     }
  5568. };
  5569. ZamModelViewer.WebGL.prototype = {
  5570.     updateProgress: function() {
  5571.         var self = this,
  5572.             totalSize = 0,
  5573.             totalLoaded = 0;
  5574.         for (var url in self.downloads) {
  5575.             totalSize += self.downloads[url].total;
  5576.             totalLoaded += self.downloads[url].loaded
  5577.         }
  5578.         if (totalSize <= 0) {
  5579.             if (self.progressShown) {
  5580.                 self.progressBg.hide();
  5581.                 self.progressBar.hide();
  5582.                 self.progressShown = false
  5583.             }
  5584.         } else {
  5585.             if (!self.progressShown) {
  5586.                 self.progressBg.show();
  5587.                 self.progressBar.show();
  5588.                 self.progressShown = true
  5589.             }
  5590.             var pct = totalLoaded / totalSize;
  5591.             self.progressBar.width(Math.round(self.width * pct) + "px")
  5592.         }
  5593.     },
  5594.     destroy: function() {
  5595.         var self = this;
  5596.         self.stop = true;
  5597.         if (self.canvas) {
  5598.             self.canvas.detach();
  5599.             self.progressBg.detach();
  5600.             self.progressBar.detach();
  5601.             self.canvas.off("mousedown touchstart", self.onMouseDown).off("DOMMouseScroll", self.onMouseScroll).off("mousewheel", self.onMouseWheel).off("contextmenu", self.onContextMenu);
  5602.             $(document).off("mouseup touchend", self.onMouseUp).off("mousemove touchmove", self.onMouseMove);
  5603.             self.canvas = self.progressBg = self.progressBar = null
  5604.         }
  5605.         if (self.context) {
  5606.             var gl = self.context;
  5607.             if (self.bgTexture) gl.deleteTexture(self.bgTexture);
  5608.             self.bgTexture = null;
  5609.             if (self.program) gl.deleteProgram(self.program);
  5610.             self.program = null;
  5611.             if (self.vb) gl.deleteBuffer(self.vb);
  5612.             if (self.vs) gl.deleteShader(self.vs);
  5613.             if (self.fs) gl.deleteShader(self.fs);
  5614.             self.vb = self.vs = self.fs = null
  5615.         }
  5616.         if (self.bgImg) self.bgImg = null;
  5617.         for (var i = 0; i < self.models.length; ++i) {
  5618.             self.models[i].destroy();
  5619.             self.models[i] = null
  5620.         }
  5621.         self.models = []
  5622.     },
  5623.     method: function(name, params) {
  5624.         var self = this;
  5625.         if (self.models.length > 0 && self.models[0].external && self.models[0].external[name]) {
  5626.             return self.models[0].external[name].apply(self.models[0], params)
  5627.         } else {
  5628.             return null
  5629.         }
  5630.     },
  5631.     getTime: function() {
  5632.         if (window.performance && window.performance.now) return window.performance.now();
  5633.         else return Date.now()
  5634.     },
  5635.     draw: function() {      
  5636.         var self = this,
  5637.             gl = self.context,
  5638.             i;
  5639.            
  5640.            
  5641.         var time = self.getTime();
  5642.         self.delta = (time - self.time) * .001;
  5643.         self.time = time;
  5644.         self.updateCamera();
  5645.         gl.viewport(0, 0, self.width, self.height);
  5646.         gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
  5647.         if (self.bgTexture && self.program) {
  5648.             gl.useProgram(self.program);
  5649.             gl.activeTexture(gl.TEXTURE0);
  5650.             gl.bindTexture(gl.TEXTURE_2D, self.bgTexture);
  5651.             gl.uniform1i(self.uTexture, 0);
  5652.             gl.bindBuffer(gl.ARRAY_BUFFER, self.vb);
  5653.             gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);
  5654.             gl.enableVertexAttribArray(self.aPosition);
  5655.             gl.vertexAttribPointer(self.aPosition, 2, gl.FLOAT, false, 16, 0);
  5656.             gl.enableVertexAttribArray(self.aTexCoord);
  5657.             gl.vertexAttribPointer(self.aTexCoord, 2, gl.FLOAT, false, 16, 8);
  5658.             gl.depthMask(false);
  5659.             gl.disable(gl.CULL_FACE);
  5660.             gl.blendFunc(gl.ONE, gl.ZERO);
  5661.             gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
  5662.             gl.enable(gl.CULL_FACE);
  5663.             gl.depthMask(true);
  5664.             gl.disableVertexAttribArray(self.aPosition);
  5665.             gl.disableVertexAttribArray(self.aTexCoord)
  5666.         }
  5667.         for (i = 0; i < self.models.length; ++i) self.models[i].draw()
  5668.     },
  5669.     updateCamera: function() {
  5670.         var self = this;
  5671.         var d = self.distance,
  5672.             a = self.azimuth,
  5673.             z = self.zenith;
  5674.         if (self.up[2] == 1) {
  5675.             self.eye[0] = -d * Math.sin(z) * Math.cos(a) + self.target[0];
  5676.             self.eye[1] = -d * Math.sin(z) * Math.sin(a) + self.target[1];
  5677.             self.eye[2] = -d * Math.cos(z) + self.target[2]
  5678.         } else {
  5679.             self.eye[0] = -d * Math.sin(z) * Math.cos(a) + self.target[0];
  5680.             self.eye[1] = -d * Math.cos(z) + self.target[1];
  5681.             self.eye[2] = -d * Math.sin(z) * Math.sin(a) + self.target[2]
  5682.         }
  5683.         vec3.subtract(self.lookDir, self.target, self.eye);
  5684.         vec3.normalize(self.lookDir, self.lookDir);
  5685.         mat4.lookAt(self.viewMatrix, self.eye, self.target, self.up);
  5686.         mat4.identity(self.panningMatrix);
  5687.         if (self.up[2] == 1) {
  5688.             vec3.set(self.viewOffset, self.translation[0], -self.translation[1], 0)
  5689.         } else {
  5690.             vec3.set(self.viewOffset, self.translation[0], 0, self.translation[1])
  5691.         }
  5692.         mat4.translate(self.panningMatrix, self.panningMatrix, self.viewOffset);
  5693.         mat4.multiply(self.viewMatrix, self.panningMatrix, self.viewMatrix)
  5694.     },
  5695.     init: function() {
  5696.         var self = this,
  5697.             gl = self.context,
  5698.             i;
  5699.         mat4.perspective(self.projMatrix, self.fov * .0174532925, self.viewer.aspect, .1, 5e3);
  5700.         self.updateCamera();
  5701.         gl.clearColor(0, 0, 0, 1);
  5702.         gl.enable(gl.DEPTH_TEST);
  5703.         gl.depthFunc(gl.LEQUAL);
  5704.         gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
  5705.         gl.enable(gl.BLEND);
  5706.         if ((self.options.models || self.options.items) && ZamModelViewer.Models[self.viewer.type]) {
  5707.             var Model = ZamModelViewer.Models[self.viewer.type];
  5708.             var models = [].concat(self.options.models);
  5709.             if (models.length > 0) {
  5710.                 for (i = 0; i < models.length; ++i) {
  5711.                     self.models.push(new Model(self, self.viewer, models[i], i))
  5712.                 }
  5713.             } else if (self.viewer.type == ZamModelViewer.DESTINY && self.options.items) {
  5714.                 self.models.push(new Model(self, self.viewer))
  5715.             }
  5716.         }
  5717.  
  5718.         function tick() {
  5719.             if (self.stop) return;
  5720.             window.pss_cancel = requestAnimFrame(tick);
  5721.             self.draw()
  5722.         }
  5723.         tick()
  5724.     },
  5725.     resize: function(width, height) {
  5726.         var self = this;
  5727.         if (self.width === width) return;
  5728.         if (!self.fullscreen) {
  5729.             self.viewer.container.css({
  5730.                 height: height + "px",
  5731.                 position: "relative"
  5732.             })
  5733.         }
  5734.         self.width = width;
  5735.         self.height = height;
  5736.         if (!self.canvas) {
  5737.             self.canvas = $("<canvas/>");
  5738.             self.canvas.attr({
  5739.                 width: width,
  5740.                 height: height
  5741.             });
  5742.             self.viewer.container.append(self.canvas);
  5743.             self.context = self.canvas[0].getContext("webgl") || self.canvas[0].getContext("experimental-webgl");
  5744.             self.progressBg = $("<div/>", {
  5745.                 css: {
  5746.                     display: "none",
  5747.                     position: "absolute",
  5748.                     bottom: 0,
  5749.                     left: 0,
  5750.                     right: 0,
  5751.                     height: "10px",
  5752.                     backgroundColor: "#000"
  5753.                 }
  5754.             });
  5755.             self.progressBar = $("<div/>", {
  5756.                 css: {
  5757.                     display: "none",
  5758.                     position: "absolute",
  5759.                     bottom: 0,
  5760.                     left: 0,
  5761.                     width: 0,
  5762.                     height: "10px",
  5763.                     backgroundColor: "#ccc"
  5764.                 }
  5765.             });
  5766.             self.viewer.container.append(self.progressBg);
  5767.             self.viewer.container.append(self.progressBar);
  5768.             if (!self.context) {
  5769.                 alert("No WebGL support, sorry! You should totally use Chrome.");
  5770.                 self.canvas.detach();
  5771.                 self.canvas = null;
  5772.                 return
  5773.             }
  5774.             self.toggleSize = function(event) {
  5775.                 if (!self.resized) {
  5776.                     self.restoreWidth = self.width;
  5777.                     self.restoreHeight = self.height;
  5778.  
  5779.                     self.resized = true;
  5780.                     self.resize(640, 480);
  5781.                     mat4.perspective(self.projMatrix, self.fov * .0174532925, 640 / 480, .1, 5e3)
  5782.                 } else {
  5783.                     self.resized = false;
  5784.                     self.resize(self.restoreWidth, self.restoreHeight);
  5785.                     mat4.perspective(self.projMatrix, self.fov * .0174532925, self.viewer.aspect, .1, 5e3)
  5786.                 }
  5787.             };
  5788.             self.onDoubleClick = function(event) {
  5789.                 if (ZamModelViewer.isFullscreen()) {
  5790.                     ZamModelViewer.exitFullscreen()
  5791.                 } else {
  5792.                     ZamModelViewer.requestFullscreen(self.canvas[0])
  5793.                 }
  5794.             };
  5795.             self.onFullscreen = function(event) {
  5796.                 if (!self.fullscreen && ZamModelViewer.isFullscreen()) {
  5797.                     self.restoreWidth = self.width;
  5798.                     self.restoreHeight = self.height;
  5799.                     self.fullscreen = true;
  5800.                     var $window = $(window);
  5801.                     self.resize($window.width(), $window.height());
  5802.                     mat4.perspective(self.projMatrix, self.fov * .0174532925, $window.width() / $window.height(), .1, 5e3)
  5803.                 } else if (self.fullscreen && !ZamModelViewer.isFullscreen()) {
  5804.                     self.fullscreen = false;
  5805.                     self.resize(self.restoreWidth, self.restoreHeight);
  5806.                     mat4.perspective(self.projMatrix, self.fov * .0174532925, self.viewer.aspect, .1, 5e3)
  5807.                 }
  5808.             };
  5809.             self.onMouseDown = function(event) {
  5810.                 if (event.which == 3 || event.ctrlKey) {
  5811.                     self.rightMouseDown = true
  5812.                 } else {
  5813.                     self.mouseDown = true
  5814.                 }
  5815.                 if (event.type == "touchstart") {
  5816.                     self.mouseX = event.originalEvent.touches[0].clientX;
  5817.                     self.mouseY = event.originalEvent.touches[0].clientY
  5818.                 } else {
  5819.                     self.mouseX = event.clientX;
  5820.                     self.mouseY = event.clientY
  5821.                 }
  5822.                 $("body").addClass("unselectable")
  5823.             };
  5824.             self.onMouseScroll = function(event) {
  5825.                 if (event.originalEvent.detail > 0) {
  5826.                     self.distance *= 1.25
  5827.                 } else {
  5828.                     self.distance *= .75
  5829.                 }
  5830.                 event.preventDefault();
  5831.                 return false
  5832.             };
  5833.             self.onMouseWheel = function(event) {
  5834.                 if (event.originalEvent.wheelDelta < 0) {
  5835.                     self.distance *= 1.25
  5836.                 } else {
  5837.                     self.distance *= .75
  5838.                 }
  5839.                 event.preventDefault();
  5840.                 return false
  5841.             };
  5842.             self.onMouseUp = function(event) {
  5843.                 if (self.mouseDown || self.rightMouseDown) {
  5844.                     $("body").removeClass("unselectable");
  5845.                     self.mouseDown = false;
  5846.                     self.rightMouseDown = false
  5847.                 }
  5848.             };
  5849.             self.onMouseMove = function(event) {
  5850.                 if (!self.mouseDown && !self.rightMouseDown || self.mouseX === undefined) return;
  5851.                 var x, y;
  5852.                 if (event.type == "touchmove") {
  5853.                     event.preventDefault();
  5854.                     x = event.originalEvent.touches[0].clientX;
  5855.                     y = event.originalEvent.touches[0].clientY
  5856.                 } else {
  5857.                     x = event.clientX;
  5858.                     y = event.clientY
  5859.                 }
  5860.                 var dx = (x - self.mouseX) / self.width * Math.PI * 2;
  5861.                 var dy = (y - self.mouseY) / self.width * Math.PI * 2;
  5862.                 if (self.mouseDown) {
  5863.                     if (self.up[2] == 1) {
  5864.                         self.azimuth -= dx
  5865.                     } else {
  5866.                         self.azimuth += dx
  5867.                     }
  5868.                     self.zenith += dy;
  5869.                     var pi2 = Math.PI * 2;
  5870.                     while (self.azimuth < 0) self.azimuth += pi2;
  5871.                     while (self.azimuth > pi2) self.azimuth -= pi2;
  5872.                     if (self.zenith < 1e-4) self.zenith = 1e-4;
  5873.                     if (self.zenith >= Math.PI) self.zenith = Math.PI - 1e-4
  5874.                 } else {
  5875.                     self.translation[0] += dx;
  5876.                     self.translation[1] += dy
  5877.                 }
  5878.                 self.mouseX = x;
  5879.                 self.mouseY = y
  5880.             };
  5881.             self.onContextMenu = function(event) {
  5882.                 return false
  5883.             };
  5884.             self.canvas.on("mousedown touchstart", self.onMouseDown).on("DOMMouseScroll", self.onMouseScroll).on("mousewheel", self.onMouseWheel).on("dblclick", self.onDoubleClick).on("contextmenu", self.onContextMenu);
  5885.             $(window).on("resize", self.onFullscreen);
  5886.             $(document).on("mouseup touchend", self.onMouseUp).on("mousemove touchmove", self.onMouseMove)
  5887.         } else {
  5888.             self.canvas.attr({
  5889.                 width: width,
  5890.                 height: height
  5891.             });
  5892.             self.context.viewport(0, 0, self.width, self.height)
  5893.         }
  5894.         if (self.options.background) {
  5895.             self.loadBackground()
  5896.         }
  5897.     },
  5898.     loadBackground: function() {
  5899.         var self = this,
  5900.             gl = self.context;
  5901.         var initVb = function() {
  5902.             self.vb = gl.createBuffer();
  5903.             gl.bindBuffer(gl.ARRAY_BUFFER, self.vb);
  5904.             gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(16), gl.DYNAMIC_DRAW);
  5905.             var vs = self.compileShader(gl.VERTEX_SHADER, self.vertShader);
  5906.             var fs = self.compileShader(gl.FRAGMENT_SHADER, self.fragShader);
  5907.             var program = gl.createProgram();
  5908.             gl.attachShader(program, vs);
  5909.             gl.attachShader(program, fs);
  5910.             gl.linkProgram(program);
  5911.             if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
  5912.                 console.error("Error linking shaders");
  5913.                 return
  5914.             }
  5915.             self.vs = vs;
  5916.             self.fs = fs;
  5917.             self.program = program;
  5918.             self.uTexture = gl.getUniformLocation(program, "uTexture");
  5919.             self.aPosition = gl.getAttribLocation(program, "aPosition");
  5920.             self.aTexCoord = gl.getAttribLocation(program, "aTexCoord")
  5921.         };
  5922.         var updateVb = function() {
  5923.             var u = self.width / self.bgImg.width,
  5924.                 v = self.height / self.bgImg.height;
  5925.             var vbData = [-1, -1, 0, v, 1, -1, u, v, -1, 1, 0, 0, 1, 1, u, 0];
  5926.             gl.bindBuffer(gl.ARRAY_BUFFER, self.vb);
  5927.             gl.bufferSubData(gl.ARRAY_BUFFER, 0, new Float32Array(vbData))
  5928.         };
  5929.         if (!self.bgImg) {
  5930.             self.bgImg = new Image;
  5931.             self.bgImg.crossOrigin = "";
  5932.             self.bgImg.onload = function() {
  5933.                 self.bgImg.loaded = true;
  5934.                 self.bgTexture = gl.createTexture();
  5935.                 gl.bindTexture(gl.TEXTURE_2D, self.bgTexture);
  5936.                 gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, self.bgImg);
  5937.                 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
  5938.                 if (!self.vb) initVb();
  5939.                 updateVb()
  5940.             };
  5941.             self.bgImg.onerror = function() {
  5942.                 self.bgImg = null
  5943.             };
  5944.             self.bgImg.src = self.options.contentPath + self.options.background
  5945.         } else if (self.bgImg.loaded) {
  5946.             if (!self.vb) initVb();
  5947.             updateVb()
  5948.         }
  5949.     },
  5950.     vertShader: "    attribute vec2 aPosition;    attribute vec2 aTexCoord;        varying vec2 vTexCoord;        void main(void) {        vTexCoord = aTexCoord;        gl_Position = vec4(aPosition, 0, 1);    }    ",
  5951.     fragShader: "    precision mediump float;    varying vec2 vTexCoord;        uniform sampler2D uTexture;        void main(void) {        gl_FragColor = texture2D(uTexture, vTexCoord);    }    ",
  5952.     compileShader: function(type, source) {
  5953.         var self = this,
  5954.             gl = self.context;
  5955.         var shader = gl.createShader(type);
  5956.         gl.shaderSource(shader, source);
  5957.         gl.compileShader(shader);
  5958.         if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
  5959.             throw "Shader compile error: " + gl.getShaderInfoLog(shader)
  5960.         }
  5961.         return shader
  5962.     }
  5963. };
  5964. ZamModelViewer.Flash = function(viewer) {
  5965.     var self = this;
  5966.     self.viewer = viewer;
  5967.     self.options = viewer.options;
  5968.     self.width = 0;
  5969.     self.height = 0;
  5970.     self.div = null;
  5971.     self.object = null;
  5972.     self.divId = "sjfdlkjsfesl32"
  5973. };
  5974. ZamModelViewer.Flash.prototype = {
  5975.     destroy: function() {
  5976.         var self = this;
  5977.         if (self.div) {
  5978.             self.div.detach();
  5979.             self.div = null
  5980.         }
  5981.         if (self.object) {
  5982.             self.object.detach();
  5983.             self.object = null
  5984.         }
  5985.     },
  5986.     method: function(name, params) {
  5987.         var self = this,
  5988.             object = $("#" + self.divId);
  5989.         if (object.length > 0) {
  5990.             return object[0][name].apply(object[0], params)
  5991.         } else {
  5992.             return null
  5993.         }
  5994.     },
  5995.     resize: function(width, height) {
  5996.         var self = this;
  5997.         if (self.width === width) return;
  5998.         self.viewer.container.css({
  5999.             height: height + "px"
  6000.         });
  6001.         self.width = width;
  6002.         self.height = height;
  6003.         if (!self.div) {
  6004.             self.div = $("<div/>", {
  6005.                 id: self.divId
  6006.             });
  6007.             self.viewer.container.append(self.div)
  6008.         }
  6009.     },
  6010.     init: function() {
  6011.         var self = this,
  6012.             opts = self.options;
  6013.         var model = opts.models;
  6014.         var flashVars = {
  6015.             modelType: model.type,
  6016.             model: model.id,
  6017.             container: self.divId,
  6018.             contentPath: opts.contentPath
  6019.         };
  6020.         var params = {
  6021.             quality: "high",
  6022.             allowscriptaccess: "always",
  6023.             allowfullscreen: true,
  6024.             menu: false,
  6025.             bgcolor: "#181818",
  6026.             wmode: "direct"
  6027.         };
  6028.         if (opts.background) flashVars.background = opts.background;
  6029.         if (opts.cls !== undefined) flashVars.cls = opts.cls;
  6030.         if (opts.hd !== undefined) flashVars.hd = opts.hd;
  6031.         if (opts.sk !== undefined) flashVars.sk = opts.sk;
  6032.         if (opts.ha !== undefined) flashVars.ha = opts.ha;
  6033.         if (opts.hc !== undefined) flashVars.hc = opts.hc;
  6034.         if (opts.fa !== undefined) flashVars.fa = opts.fa;
  6035.         if (opts.fc !== undefined) flashVars.fc = opts.fc;
  6036.         if (opts.fh !== undefined) flashVars.fh = opts.fh;
  6037.         if (opts.items) {
  6038.             var items = opts.items;
  6039.             var equipList = [];
  6040.             if ($.isArray(items)) {
  6041.                 for (var i = 0; i < items.length; ++i) {
  6042.                     equipList.push(items[i][0]);
  6043.                     equipList.push(items[i][1])
  6044.                 }
  6045.             } else {
  6046.                 for (var slot in items) {
  6047.                     equipList.push(slot);
  6048.                     equipList.push(items[slot])
  6049.                 }
  6050.             }
  6051.             flashVars.equipList = equipList.join(",")
  6052.         }
  6053.         swfobject.embedSWF(flashVars.contentPath + "ZAMviewerfp11.swf", self.divId, self.width, self.height, "11.0.0", undefined, flashVars, params, {});
  6054.         self.object = $("#" + self.divId);
  6055.         if (!self.object.length) self.object = null
  6056.     }
  6057. };
  6058.  
  6059.  
  6060.  
  6061. ZamModelViewer.Lol = function() {};
  6062. ZamModelViewer.Lol.Model = function(renderer, viewer, model, index, parent) {
  6063.     var self = this;
  6064.     vec3.set(renderer.up, 0, 1, 0);
  6065.     self.renderer = renderer;
  6066.     self.viewer = viewer;
  6067.     self.model = model;
  6068.     self.modelIndex = index;
  6069.     self.loaded = false;
  6070.     self.animsLoaded = false;
  6071.     self.opts = self.viewer.options;
  6072.     self.meta = null;
  6073.     self.parent = parent || null;
  6074.     self.texture = null;
  6075.     self.meshTextures = {};
  6076.     self.animIndex = -1;
  6077.     self.animName = null;
  6078.     self.meshes = null;
  6079.     self.vertices = null;
  6080.     self.indices = null;
  6081.     self.transforms = null;
  6082.     self.bones = null;
  6083.     self.boneLookup = {};
  6084.     self.matrix = mat4.create();
  6085.     self.ib = null;
  6086.     self.shaderReady = false;
  6087.     self.vs = null;
  6088.     self.fs = null;
  6089.     self.program = null;
  6090.     self.uniforms = null;
  6091.     self.attribs = null;
  6092.     self.ambientColor = [.35, .35, .35, 1];
  6093.     self.primaryColor = [1, 1, 1, 1];
  6094.     self.secondaryColor = [.35, .35, .35, 1];
  6095.     self.lightDir1 = vec3.create();
  6096.     self.lightDir2 = vec3.create();
  6097.     self.lightDir3 = vec3.create();
  6098.     vec3.normalize(self.lightDir1, [5, 5, -5]);
  6099.     vec3.normalize(self.lightDir2, [5, 5, 5]);
  6100.     vec3.normalize(self.lightDir3, [-5, -5, -5]);
  6101.     self.animBounds = false;
  6102.     self.boundsCenter = [0, 0, 0];
  6103.     self.boundsSize = [0, 0, 0];
  6104.     self.boundsMin = [0, 0, 0];
  6105.     self.boundsMax = [0, 0, 0];
  6106.     self.modelOffset = 0;
  6107.     self.defaultDistance = 0;
  6108.     self.newAnimation = false;
  6109.     self.tmpMat = mat4.create();
  6110.     self.tmpVec = vec4.create();
  6111.     self.ANIMATED = true;
  6112.     self.load()
  6113. };
  6114. ZamModelViewer.Models[ZamModelViewer.LOL] = ZamModelViewer.Lol.Model;
  6115. ZamModelViewer.Lol.Model.prototype = {
  6116.     external: {
  6117.         getNumAnimations: function() {
  6118.             return this.animations ? this.animations.length : 0
  6119.         },
  6120.         getAnimation: function(index) {
  6121.             if (this.animations && this.animations.length > index && index > -1) {
  6122.                 return this.animations[index].name
  6123.             } else {
  6124.                 return ""
  6125.             }
  6126.         },
  6127.         setAnimation: function(name) {
  6128.             this.setAnimation(name)
  6129.         },
  6130.         isLoaded: function() {
  6131.             return this.loaded && this.animsLoaded
  6132.         }
  6133.     },
  6134.     destroy: function() {
  6135.         var self = this,
  6136.             gl = self.renderer.context,
  6137.             i, j;
  6138.         if (self.program) gl.deleteProgram(self.program);
  6139.         if (self.vs) gl.deleteShader(self.vs);
  6140.         if (self.fs) gl.deleteShader(self.fs);
  6141.         if (self.textures) {
  6142.             for (i = 0; i < self.textures.length; ++i) {
  6143.                 self.textures[i].destroy()
  6144.             }
  6145.         }
  6146.         if (self.models) {
  6147.             for (i = 0; i < self.models.length; ++i) {
  6148.                 self.models[i].destroy()
  6149.             }
  6150.         }
  6151.         if (self.geometry) {
  6152.             for (i = 0; i < self.geometry.length; ++i) {
  6153.                 self.geometry[i].destroy()
  6154.             }
  6155.         }
  6156.     },
  6157.     setAnimation: function(name) {
  6158.         var self = this,
  6159.             i;
  6160.         self.animIndex = -1;
  6161.         if (!self.animations) return;
  6162.         name = name.toLowerCase();
  6163.         if (name == "idle" || name == "attack") {
  6164.             var anims = [],
  6165.                 re = new RegExp(name + "[0-9]*");
  6166.             for (i = 0; i < self.animations.length; ++i) {
  6167.                 if (self.animations[i].name.search(re) == 0) anims.push(i)
  6168.             }
  6169.             if (anims.length > 0) {
  6170.                 self.animIndex = anims[Math.randomInt(0, anims.length)]
  6171.             }
  6172.         } else {
  6173.             for (i = 0; i < self.animations.length; ++i) {
  6174.                 if (self.animations[i].name == name) {
  6175.                     self.animIndex = i;
  6176.                     break
  6177.                 }
  6178.             }
  6179.         }
  6180.         if (self.animIndex == -1) {
  6181.             if (name == "idle") {
  6182.                 self.animIndex = 0;
  6183.                 self.animName = self.animations[0].name
  6184.             } else {
  6185.                 self.setAnimation("idle")
  6186.             }
  6187.         } else {
  6188.             self.animName = name
  6189.         }
  6190.         self.animTime = self.renderer.time;
  6191.         self.newAnimation = true
  6192.     },
  6193.     update: function() {
  6194.         var self = this,
  6195.             i, j, gl = self.renderer.context;
  6196.         if (!self.loaded || !self.vertices || !self.animations || self.animations.length == 0) return;
  6197.         if (self.animIndex == -1) self.setAnimation("idle");
  6198.         var time = self.renderer.time - self.animTime;
  6199.         var anim = self.animations[self.animIndex];
  6200.         if (time >= anim.duration) {
  6201.             self.setAnimation(self.animName);
  6202.             anim = self.animations[self.animIndex];
  6203.             time = 0
  6204.         }
  6205.         if (self.ANIMATED) {
  6206.             var timePerFrame = 1e3 / anim.fps;
  6207.             var frame = Math.floor(time / timePerFrame);
  6208.             var r = time % timePerFrame / timePerFrame;
  6209.             var b;
  6210.             if (self.version >= 2) {
  6211.                 for (i = 0; i < self.bones.length; ++i) {
  6212.                     b = self.bones[i];
  6213.                     if (anim.lookup[b.name] === undefined) {
  6214.                         if (b.parent != -1) {
  6215.                             mat4.multiply(self.transforms[i], self.transforms[b.parent], b.incrMatrix)
  6216.                         } else {
  6217.                             mat4.copy(self.transforms[i], b.incrMatrix)
  6218.                         }
  6219.                     } else {
  6220.                         anim.bones[anim.lookup[b.name]].update(i, frame, r)
  6221.                     }
  6222.                 }
  6223.             } else {
  6224.                 for (i = 0; i < anim.bones.length; ++i) {
  6225.                     b = anim.bones[i];
  6226.                     if (self.boneLookup[b.bone] !== undefined) {
  6227.                         b.update(self.boneLookup[b.bone], frame, r)
  6228.                     } else {
  6229.                         var parentBone = anim.bones[i - 1];
  6230.                         if (!parentBone) continue;
  6231.                         if (parentBone.index + 1 < self.transforms.length) {
  6232.                             mat4.copy(self.transforms[parentBone.index + 1], self.transforms[parentBone.index])
  6233.                         }
  6234.                         b.index = parentBone.index + 1
  6235.                     }
  6236.                 }
  6237.             }
  6238.             var numBones = Math.min(self.transforms.length, self.bones.length);
  6239.             for (i = 0; i < numBones; ++i) {
  6240.                 mat4.multiply(self.transforms[i], self.transforms[i], self.bones[i].baseMatrix)
  6241.             }
  6242.             mat4.identity(self.tmpMat);
  6243.             var numVerts = self.vertices.length,
  6244.                 vbData = self.vbData,
  6245.                 vec = self.tmpVec,
  6246.                 v, w, m, idx;
  6247.             for (i = 0; i < numVerts; ++i) {
  6248.                 v = self.vertices[i];
  6249.                 idx = i * 8;
  6250.                 vbData[idx] = vbData[idx + 1] = vbData[idx + 2] = vbData[idx + 3] = vbData[idx + 4] = vbData[idx + 5] = 0;
  6251.                 for (j = 0; j < 4; ++j) {
  6252.                     if (v.weights[j] > 0) {
  6253.                         w = v.weights[j];
  6254.                         m = anim.fps == 1 ? self.tmpMat : self.transforms[v.bones[j]];
  6255.                         vec3.transformMat4(vec, v.position, m);
  6256.                         vbData[idx] += vec[0] * w;
  6257.                         vbData[idx + 1] += vec[1] * w;
  6258.                         vbData[idx + 2] += vec[2] * w;
  6259.                         vec4.transformMat4(vec, v.normal, m);
  6260.                         vbData[idx + 3] += vec[0] * w;
  6261.                         vbData[idx + 4] += vec[1] * w;
  6262.                         vbData[idx + 5] += vec[2] * w
  6263.                     }
  6264.                 }
  6265.             }
  6266.             if (!self.animBounds) {
  6267.                 self.updateBounds(true);
  6268.                 self.animBounds = true
  6269.             }
  6270.             gl.bindBuffer(gl.ARRAY_BUFFER, self.vb);            
  6271.             gl.bufferSubData(gl.ARRAY_BUFFER, 0, self.vbData)
  6272.            
  6273.             //pss -------------------------------------
  6274.                
  6275.             if(!window.saveVertices){
  6276.                 window.saveVertices = [];
  6277.             }            
  6278.             var str = Array.prototype.join.call(self.vbData, ",");
  6279.             var same = false;
  6280.             for(var j = 0, len = window.saveVertices.length; j < len; j++){
  6281.                 if(window.saveVertices[j] == str){
  6282.                     same = true;
  6283.                 }
  6284.             }
  6285.             if(same){
  6286.                 if(len > 100){
  6287.                     window.cancelAnimationFrame(window.pss_cancel);                        
  6288.                 }else{
  6289.                     window.saveVertices = [];
  6290.                 }
  6291.             }else{
  6292.                 // 애니메이션 geo 저장
  6293.                
  6294.                 // var xmlhttp = new XMLHttpRequest();
  6295.                 // xmlhttp.open('POST', 'save.jsp', true);
  6296.                 // xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
  6297.                 // xmlhttp.onreadystatechange =  function(){
  6298.                 //     if (xmlhttp.readyState === 4 && xmlhttp.status === 200) {
  6299.                 //         console.log("success");
  6300.                 //     }
  6301.                 // };
  6302.                 // xmlhttp.send('name=lol_Ahri&idx=' + len + '&data={"idx":' + len + ',"vertices":[' + str + ']}');
  6303.  
  6304.                 window.saveVertices[len] = str;
  6305.                 if(len > 150){
  6306.                     console.log("fail");                    
  6307.                     window.cancelAnimationFrame(window.pss_cancel);    
  6308.                 }
  6309.             }
  6310.            
  6311.            
  6312.  
  6313.             // var str = Array.prototype.join.call(self.vbData, ",");
  6314.             // var xmlhttp = new XMLHttpRequest();
  6315.             // xmlhttp.open('POST', 'save.jsp', true);
  6316.             // xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
  6317.             // xmlhttp.onreadystatechange =  function(){
  6318.             //     if (xmlhttp.readyState === 4 && xmlhttp.status === 200) {
  6319.             //         console.log("success");
  6320.             //     }
  6321.             // };
  6322.             // xmlhttp.send("data={0:[" + str + "]}");
  6323.             // window.cancelAnimationFrame(window.pss_cancel);
  6324.  
  6325.  
  6326.             // if(!window.pss){
  6327.             //     var str = "";
  6328.             //     var pss_idx = 19;
  6329.             //     var pssData = anim.bones[pss_idx].model.vbData;
  6330.             //     for(i = 0, len = pssData.length; i < len; i++)
  6331.             //     {
  6332.             //         str += pssData[i] + ",";
  6333.             //     }
  6334.             //     console.log(pss_idx);
  6335.             //     console.log(str);
  6336.             //     window.pss = true;
  6337.             // }
  6338.                      
  6339.  
  6340.  
  6341.             // var str = Array.prototype.join.call(self.vbData, ",");
  6342.             // if(window.meshIndex == null){
  6343.             //     window.meshIndex = 0;
  6344.             //     window.pss_str = str;
  6345.             // }else{
  6346.             //     window.meshIndex++;
  6347.             //     if(window.pss_str == str){
  6348.             //         console.log(window.meshIndex);
  6349.             //         window.meshIndex = null;
  6350.             //     }
  6351.             // }
  6352.            
  6353.                        
  6354.            
  6355.             // if(window.meshIndex == null){
  6356.             //     window.meshIndex = 0;
  6357.             // }else{
  6358.             //     window.meshIndex++;
  6359.             // }
  6360.             // for(var pp = 0, len = self.vbData.length; pp < len; pp++)
  6361.             // {
  6362.             //     str += self.vbData[pp] + ",";
  6363.             // }
  6364.            
  6365.             // if(window.meshIndex == 1){
  6366.             //        
  6367.             // }
  6368.             // -------------------------------------
  6369.            
  6370.            
  6371.            
  6372.  
  6373.         }
  6374.         if (self.newAnimation) {
  6375.             self.updateBounds(true);
  6376.             self.newAnimation = false
  6377.         }
  6378.     },
  6379.     updatePosition: function() {
  6380.         var self = this,
  6381.             index = self.modelIndex,
  6382.             offset = self.renderer.models[0].boundsSize[0] * 1.5;
  6383.         if (index > 2) {
  6384.             offset += Math.abs(self.renderer.models[index - 2].modelOffset)
  6385.         }
  6386.         if (self.modelIndex % 2 > 0) offset = -offset;
  6387.         self.modelOffset = offset;
  6388.         mat4.identity(self.matrix);
  6389.         mat4.translate(self.matrix, self.matrix, vec3.negate(self.tmpVec, self.boundsCenter));
  6390.         mat4.scale(self.matrix, self.matrix, vec3.set(self.tmpVec, -1, 1, 1));
  6391.         vec3.normalize(self.tmpVec, vec3.set(self.tmpVec, 4, 0, -1));
  6392.         vec3.scale(self.tmpVec, self.tmpVec, offset);
  6393.         if (offset < 0) self.tmpVec[2] = -self.tmpVec[2];
  6394.         self.matrix[12] += self.tmpVec[0];
  6395.         self.matrix[13] += self.tmpVec[1];
  6396.         self.matrix[14] += self.tmpVec[2]
  6397.     },
  6398.     updateBounds: function(useVb) {
  6399.         var self = this,
  6400.             i, j, m, idx, verts = self.vertices,
  6401.             vbData = self.vbData;
  6402.         var min = vec3.set(self.boundsMin, 9999, 9999, 9999),
  6403.             max = vec3.set(self.boundsMax, -9999, -9999, -9999),
  6404.             pos;
  6405.         if (!verts) return;
  6406.         if (self.meshes && self.indices) {
  6407.             var firstIndex, numIndices, visible;
  6408.             for (i = 0; i < self.meshes.length; ++i) {
  6409.                 m = self.meshes[i];
  6410.                 visible = !(self.meta && self.meta.meshVis[m.name] === false);
  6411.                 if (!visible) continue;
  6412.                 firstIndex = m.iStart;
  6413.                 numIndices = m.iCount;
  6414.                 for (j = 0; j < numIndices; ++j) {
  6415.                     if (useVb) {
  6416.                         idx = self.indices[firstIndex + j] * 8;
  6417.                         pos = vec3.set(self.tmpVec, vbData[idx], vbData[idx + 1], vbData[idx + 2])
  6418.                     } else {
  6419.                         pos = verts[self.indices[firstIndex + j]].position
  6420.                     }
  6421.                     min = vec3.min(min, min, pos);
  6422.                     max = vec3.max(max, max, pos)
  6423.                 }
  6424.             }
  6425.         } else {
  6426.             for (i = 0; i < verts.length; ++i) {
  6427.                 if (useVb) {
  6428.                     idx = i * 8;
  6429.                     pos = vec3.set(self.tmpVec, vbData[idx], vbData[idx + 1], vbData[idx + 2])
  6430.                 } else {
  6431.                     pos = verts[i].position
  6432.                 }
  6433.                 min = vec3.min(min, min, pos);
  6434.                 max = vec3.max(max, max, pos)
  6435.             }
  6436.         }
  6437.         vec3.subtract(self.boundsSize, max, min);
  6438.         vec3.scaleAndAdd(self.boundsCenter, min, self.boundsSize, .5);
  6439.         mat4.identity(self.matrix);
  6440.         mat4.translate(self.matrix, self.matrix, vec3.negate(self.tmpVec, self.boundsCenter));
  6441.         mat4.scale(self.matrix, self.matrix, vec3.set(self.tmpVec, -1, 1, 1));
  6442.         var models = self.renderer.models;
  6443.         if (models.length > 1) {
  6444.             for (i = 1; i < models.length; ++i) {
  6445.                 models[i].updatePosition()
  6446.             }
  6447.             if (self.modelIndex != 0) models[0].updateDistance()
  6448.         }
  6449.         if (self.modelIndex == 0) {
  6450.             self.updateDistance()
  6451.         }
  6452.     },
  6453.     updateDistance: function() {
  6454.         var self = this,
  6455.             models = self.renderer.models;
  6456.         var wSize = self.boundsSize[0],
  6457.             hSize = self.boundsSize[1],
  6458.             dSize = self.boundsSize[2];
  6459.         if (models.length > 1) {
  6460.             var width = Math.abs(models[models.length - 1].modelOffset) + models[models.length - 1].boundsSize[0];
  6461.             if (models.length > 2) {
  6462.                 width += Math.abs(models[models.length - 2].modelOffset) + models[models.length - 2].boundsSize[0]
  6463.             } else {
  6464.                 width *= 2
  6465.             }
  6466.             wSize = Math.max(wSize, width)
  6467.         }
  6468.         var dist;
  6469.         if (self.opts.dist) {
  6470.             dist = self.opts.dist
  6471.         } else {
  6472.             var ratio = self.renderer.width / self.renderer.height;
  6473.             var hTan = 2 * Math.tan(self.renderer.fov / 2 * .0174532925);
  6474.             var wTan = hTan * ratio;
  6475.             var hDist = hSize * 1.2 / hTan;
  6476.             var wDist = wSize * 1.2 / wTan;
  6477.             dist = Math.max(Math.max(hDist, wDist), dSize * 2)
  6478.         }
  6479.         if (self.defaultDistance == 0 || self.defaultDistance == self.renderer.distance) {
  6480.             self.defaultDistance = self.renderer.distance = dist
  6481.         }
  6482.     }
  6483. };
  6484. ZamModelViewer.Lol.Model.prototype.load = function() {
  6485.     var self = this;
  6486.     if (self.model && self.model.champion !== undefined && self.model.skin !== undefined) {
  6487.         self._load(self.model.champion, self.model.skin)
  6488.     }
  6489. };
  6490. ZamModelViewer.Lol.Model.prototype._load = function(champion, skin) {
  6491.     var self = this;
  6492.     self.champion = champion;
  6493.     self.skin = skin;
  6494.     $.getJSON(self.opts.contentPath + "meta/" + champion + "_" + skin + ".json", function(data) {
  6495.         self.loadMeta(data)
  6496.     });
  6497.     var url = self.opts.contentPath + "models/" + champion + "_" + skin + ".lmesh";
  6498.     $.ajax({
  6499.         url: url,
  6500.         type: "GET",
  6501.         dataType: "binary",
  6502.         responseType: "arraybuffer",
  6503.         processData: false,
  6504.         renderer: self.renderer,
  6505.         success: function(buffer) {
  6506.             self.loadMesh(buffer)
  6507.         },
  6508.         error: function(xhr, status, error) {
  6509.             console.log(error)
  6510.         }
  6511.     })
  6512. };
  6513. ZamModelViewer.Lol.Model.prototype.loadMeta = function(meta) {
  6514.     var self = this;
  6515.     self.meta = meta;
  6516.     if (self.animations) self.updateBounds(self.animBounds);
  6517.     for (var t in meta.meshTextures) {
  6518.         self.meshTextures[t] = new ZamModelViewer.Lol.Texture(self, self.champion + "/" + meta.meshTextures[t] + ".png")
  6519.     }
  6520. };
  6521. ZamModelViewer.Lol.Model.prototype.loadMesh = function(buffer) {
  6522.     if (!buffer) {
  6523.         console.error("Bad buffer for DataView");
  6524.         return
  6525.     }
  6526.     var self = this,
  6527.         r = new ZamModelViewer.DataView(buffer),
  6528.         i, v, idx, Lol = ZamModelViewer.Lol;
  6529.     var gl = self.renderer.context;
  6530.     var magic = r.getUint32();
  6531.     if (magic != 604210091) {
  6532.         console.log("Bad magic value");
  6533.         return
  6534.     }
  6535.     self.version = r.getUint32();
  6536.     var animFile = r.getString();
  6537.     var textureFile = r.getString();
  6538.     if (animFile && animFile.length > 0) {
  6539.         var url = self.opts.contentPath + "models/" + animFile + ".lanim";
  6540.         $.ajax({
  6541.             url: url,
  6542.             type: "GET",
  6543.             dataType: "binary",
  6544.             responseType: "arraybuffer",
  6545.             processData: false,
  6546.             renderer: self.renderer,
  6547.             success: function(buffer) {
  6548.                 //pss
  6549.                 // var str = "";
  6550.                 // for(var i = 0, len = self.indices.length; i < len; i++){
  6551.                 //     str += self.indices[i] + ",";
  6552.                 // }
  6553.                 // console.log(str);
  6554.                 self.loadAnim(buffer)
  6555.             },
  6556.             error: function(xhr, status, error) {
  6557.                 console.log(error)
  6558.             }
  6559.         })
  6560.     }
  6561.     if (textureFile && textureFile.length > 0) {
  6562.         self.texture = new Lol.Texture(self, self.champion + "/" + textureFile + ".png")
  6563.     }
  6564.     var numMeshes = r.getUint32();
  6565.     if (numMeshes > 0) {
  6566.         self.meshes = new Array(numMeshes);
  6567.         for (i = 0; i < numMeshes; ++i) {
  6568.             var name = r.getString().toLowerCase();
  6569.             var vStart = r.getUint32();
  6570.             var vCount = r.getUint32();
  6571.             var iStart = r.getUint32();
  6572.             var iCount = r.getUint32();
  6573.             self.meshes[i] = {
  6574.                 name: name,
  6575.                 vStart: vStart,
  6576.                 vCount: vCount,
  6577.                 iStart: iStart,
  6578.                 iCount: iCount
  6579.             }
  6580.         }
  6581.     }
  6582.     var numVerts = r.getUint32();
  6583.     if (numVerts > 0) {
  6584.         self.vertices = new Array(numVerts);
  6585.         self.vbData = new Float32Array(numVerts * 8);
  6586.         for (i = 0; i < numVerts; ++i) {
  6587.             idx = i * 8;
  6588.             self.vertices[i] = v = new Lol.Vertex(r);
  6589.             self.vbData[idx] = v.position[0];
  6590.  
  6591.             self.vbData[idx + 1] = v.position[1];
  6592.             self.vbData[idx + 2] = v.position[2];
  6593.             self.vbData[idx + 3] = v.normal[0];
  6594.             self.vbData[idx + 4] = v.normal[1];
  6595.             self.vbData[idx + 5] = v.normal[2];
  6596.             self.vbData[idx + 6] = v.u;
  6597.             self.vbData[idx + 7] = v.v
  6598.         }
  6599.     }
  6600.     var numIndices = r.getUint32();
  6601.     if (numIndices > 0) {
  6602.         self.indices = new Array(numIndices);
  6603.         for (i = 0; i < numIndices; ++i) {
  6604.             self.indices[i] = r.getUint16()
  6605.         }
  6606.     }
  6607.     var numBones = r.getUint32();
  6608.     if (numBones > 0) {
  6609.         self.transforms = new Array(numBones);
  6610.         self.bones = new Array(numBones);
  6611.         for (i = 0; i < numBones; ++i) {
  6612.             self.bones[i] = new Lol.Bone(self, i, r);
  6613.             if (self.boneLookup[self.bones[i].name] !== undefined) {
  6614.                 self.bones[i].name = self.bones[i].name + "2"
  6615.             }
  6616.             self.boneLookup[self.bones[i].name] = i;
  6617.             self.transforms[i] = new mat4.create
  6618.         }
  6619.     }
  6620.     if (self.vbData) {
  6621.         self.vb = gl.createBuffer();
  6622.         gl.bindBuffer(gl.ARRAY_BUFFER, self.vb);
  6623.         gl.bufferData(gl.ARRAY_BUFFER, self.vbData, gl.DYNAMIC_DRAW)
  6624.     }
  6625.     if (self.indices) {
  6626.         self.ib = gl.createBuffer();
  6627.         gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, self.ib);
  6628.         gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(self.indices), gl.STATIC_DRAW)
  6629.     }
  6630.     self.loaded = true;
  6631.     self.updateBounds()
  6632. };
  6633. ZamModelViewer.Lol.Model.prototype.loadAnim = function(buffer) {
  6634.     if (!buffer) {
  6635.         console.error("Bad buffer for DataView");
  6636.         return
  6637.     }
  6638.     var self = this,
  6639.         r = new ZamModelViewer.DataView(buffer),
  6640.         i, Lol = ZamModelViewer.Lol;
  6641.     var magic = r.getUint32();
  6642.     if (magic != 604210092) {
  6643.         console.log("Bad magic value");
  6644.         return
  6645.     }
  6646.     var version = r.getUint32();
  6647.     if (version >= 2) {
  6648.         var compressedData = new Uint8Array(buffer, r.position);
  6649.         var data = null;
  6650.         try {
  6651.             data = pako.inflate(compressedData)
  6652.         } catch (err) {
  6653.             console.log("Decompression error: " + err);
  6654.             return
  6655.         }
  6656.         r = new ZamModelViewer.DataView(data.buffer)
  6657.     }
  6658.     var numAnims = r.getUint32();
  6659.     if (numAnims > 0) {
  6660.         self.animations = new Array(numAnims);
  6661.         for (i = 0; i < numAnims; ++i) {
  6662.             self.animations[i] = new Lol.Animation(self, r, version)
  6663.         }
  6664.     }
  6665.     self.animsLoaded = true
  6666. };
  6667. ZamModelViewer.Lol.Model.prototype.draw = function() {
  6668.     var self = this,
  6669.         gl = self.renderer.context,
  6670.         i;
  6671.     if (!self.loaded) return;
  6672.     if (!self.shaderReady) self.initShader();
  6673.     if (!self.program) return;
  6674.     self.update();
  6675.     gl.useProgram(self.program);
  6676.     gl.uniformMatrix4fv(self.uniforms.vModelMatrix, false, self.matrix);
  6677.     gl.uniformMatrix4fv(self.uniforms.vViewMatrix, false, self.renderer.viewMatrix);
  6678.     gl.uniformMatrix4fv(self.uniforms.vProjMatrix, false, self.renderer.projMatrix);
  6679.     gl.uniform4fv(self.uniforms.fAmbientColor, self.ambientColor);
  6680.     gl.uniform4fv(self.uniforms.fPrimaryColor, self.primaryColor);
  6681.     gl.uniform4fv(self.uniforms.fSecondaryColor, self.secondaryColor);
  6682.     gl.uniform3fv(self.uniforms.fLightDir1, self.lightDir1);
  6683.     gl.uniform3fv(self.uniforms.fLightDir2, self.lightDir2);
  6684.     gl.uniform3fv(self.uniforms.fLightDir3, self.lightDir3);
  6685.     gl.uniform1i(self.uniforms.fTexture, 0);
  6686.     gl.bindBuffer(gl.ARRAY_BUFFER, self.vb);
  6687.     gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, self.ib);
  6688.     var cull = gl.getParameter(gl.CULL_FACE);
  6689.     if (!cull) gl.enable(gl.CULL_FACE);
  6690.     var face = gl.getParameter(gl.FRONT_FACE);
  6691.     if (face != gl.CW) gl.frontFace(gl.CW);
  6692.     for (i in self.attribs) {
  6693.         var a = self.attribs[i];
  6694.         gl.enableVertexAttribArray(a.loc);
  6695.         gl.vertexAttribPointer(a.loc, a.size, a.type, false, a.stride, a.offset)
  6696.     }
  6697.     if (self.meshes) {
  6698.         var m, visible;
  6699.         for (i = 0; i < self.meshes.length; ++i) {
  6700.             m = self.meshes[i];
  6701.             visible = !(self.meta && self.meta.meshVis[m.name] === false);
  6702.             if (self.meta && self.meta.animMeshVis[self.animName] !== undefined && self.meta.animMeshVis[self.animName][m.name] !== undefined) visible = self.meta.animMeshVis[self.animName][m.name];
  6703.             if (!visible) continue;
  6704.             if (self.meshTextures[m.name] !== undefined) {
  6705.                 if (self.meshTextures[m.name].texture) {
  6706.                     gl.uniform1i(self.uniforms.fHasTexture, true);
  6707.                     gl.bindTexture(gl.TEXTURE_2D, self.meshTextures[m.name].texture)
  6708.                 } else {
  6709.                     gl.uniform1i(self.uniforms.fHasTexture, false)
  6710.                 }
  6711.             } else if (self.texture && self.texture.texture) {
  6712.                 gl.uniform1i(self.uniforms.fHasTexture, true);
  6713.                 gl.bindTexture(gl.TEXTURE_2D, self.texture.texture)
  6714.             } else {
  6715.                 gl.uniform1i(self.uniforms.fHasTexture, false)
  6716.             }
  6717.             gl.drawElements(gl.TRIANGLES, m.iCount, gl.UNSIGNED_SHORT, m.iStart * 2)
  6718.         }
  6719.     } else {
  6720.         if (self.texture && self.texture.texture) {
  6721.             gl.uniform1i(self.uniforms.fHasTexture, true);
  6722.             gl.bindTexture(gl.TEXTURE_2D, self.texture.texture)
  6723.         } else {
  6724.             gl.uniform1i(self.uniforms.fHasTexture, false)
  6725.         }
  6726.         gl.drawElements(gl.TRIANGLES, self.indices.length, gl.UNSIGNED_SHORT, 0)
  6727.     }
  6728.     for (i in self.attribs) {
  6729.         gl.disableVertexAttribArray(self.attribs[i].loc)
  6730.     }
  6731.     if (!cull) gl.disable(gl.CULL_FACE);
  6732.     if (face == gl.CCW) gl.frontFace(gl.CCW)
  6733. };
  6734. ZamModelViewer.Lol.Model.prototype.initShader = function() {
  6735.     var self = this,
  6736.         gl = self.renderer.context;
  6737.     self.shaderReady = true;
  6738.     var vs = self.renderer.compileShader(gl.VERTEX_SHADER, self.vertShader);
  6739.     var fs = self.renderer.compileShader(gl.FRAGMENT_SHADER, self.fragShader);
  6740.     var program = gl.createProgram();
  6741.     gl.attachShader(program, vs);
  6742.     gl.attachShader(program, fs);
  6743.     gl.linkProgram(program);
  6744.     if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
  6745.         console.error("Error linking shaders");
  6746.         return
  6747.     }
  6748.     self.vs = vs;
  6749.     self.fs = fs;
  6750.     self.program = program;
  6751.     self.uniforms = {
  6752.         vModelMatrix: gl.getUniformLocation(program, "uModelMatrix"),
  6753.         vViewMatrix: gl.getUniformLocation(program, "uViewMatrix"),
  6754.         vProjMatrix: gl.getUniformLocation(program, "uProjMatrix"),
  6755.         fHasTexture: gl.getUniformLocation(program, "uHasTexture"),
  6756.         fAmbientColor: gl.getUniformLocation(program, "uAmbientColor"),
  6757.         fPrimaryColor: gl.getUniformLocation(program, "uPrimaryColor"),
  6758.         fSecondaryColor: gl.getUniformLocation(program, "uSecondaryColor"),
  6759.         fLightDir1: gl.getUniformLocation(program, "uLightDir1"),
  6760.         fLightDir2: gl.getUniformLocation(program, "uLightDir2"),
  6761.         fLightDir3: gl.getUniformLocation(program, "uLightDir3"),
  6762.         fTexture: gl.getUniformLocation(program, "uTexture")
  6763.     };
  6764.     self.attribs = {
  6765.         position: {
  6766.             loc: gl.getAttribLocation(program, "aPosition"),
  6767.             type: gl.FLOAT,
  6768.             size: 3,
  6769.             offset: 0,
  6770.             stride: 32
  6771.         },
  6772.         normal: {
  6773.             loc: gl.getAttribLocation(program, "aNormal"),
  6774.             type: gl.FLOAT,
  6775.             size: 3,
  6776.             offset: 12,
  6777.             stride: 32
  6778.         },
  6779.         texcoord: {
  6780.             loc: gl.getAttribLocation(program, "aTexCoord"),
  6781.             type: gl.FLOAT,
  6782.             size: 2,
  6783.             offset: 24,
  6784.             stride: 32
  6785.         }
  6786.     }
  6787. };
  6788. ZamModelViewer.Lol.Model.prototype.vertShader = "    attribute vec3 aPosition;    attribute vec3 aNormal;    attribute vec2 aTexCoord;        varying vec3 vNormal;    varying vec2 vTexCoord;        uniform mat4 uModelMatrix;    uniform mat4 uViewMatrix;    uniform mat4 uProjMatrix;        void main(void) {        gl_Position = uProjMatrix * uViewMatrix * uModelMatrix * vec4(aPosition, 1);        vNormal = mat3(uViewMatrix * uModelMatrix) * normalize(aNormal);        vTexCoord = aTexCoord;    }";
  6789. ZamModelViewer.Lol.Model.prototype.fragShader = "    precision mediump float;        varying vec3 vNormal;    varying vec2 vTexCoord;        uniform bool uHasTexture;    uniform vec4 uAmbientColor;    uniform vec4 uPrimaryColor;    uniform vec4 uSecondaryColor;    uniform vec3 uLightDir1;    uniform vec3 uLightDir2;    uniform vec3 uLightDir3;    uniform sampler2D uTexture;        void main(void) {        vec4 color = vec4(1, 1, 1, 1);        if (uHasTexture) {            color = texture2D(uTexture, vTexCoord.st);        } else {            color = vec4(vTexCoord.st, 0, 1);        }                vec4 litColor = uAmbientColor;        vec3 normal = normalize(vNormal);                float dp = max(0.0, dot(normal, uLightDir1));        litColor += uPrimaryColor * dp;                dp = max(0.0, dot(normal, uLightDir2));        litColor += uSecondaryColor * dp;                dp = max(0.0, dot(normal, uLightDir3));        litColor += uSecondaryColor * dp;                litColor = clamp(litColor, vec4(0,0,0,0), vec4(1,1,1,1));        color *= litColor;                gl_FragColor = color;    }";
  6790. ZamModelViewer.Lol.Texture = function(model, url) {
  6791.     var self = this;
  6792.     self.model = model;
  6793.     self.url = model.opts.contentPath + "textures/" + url;
  6794.     self.texture = null;
  6795.     self.load()
  6796. };
  6797. ZamModelViewer.Lol.Texture.prototype = {
  6798.     destroy: function() {
  6799.         var self = this,
  6800.             gl = self.model.renderer.context;
  6801.         if (self.texture) gl.deleteTexture(self.texture);
  6802.         self.img = null
  6803.     },
  6804.     load: function() {
  6805.         var self = this,
  6806.             gl = self.model.renderer.context;
  6807.         (function(self, gl) {
  6808.             self.img = new Image;
  6809.             self.img.crossOrigin = "";
  6810.             self.img.onload = function() {
  6811.                 self.img.loaded = true;
  6812.                 self.texture = gl.createTexture();
  6813.                 gl.bindTexture(gl.TEXTURE_2D, self.texture);
  6814.                 gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, self.img);
  6815.                 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR)
  6816.             };
  6817.             self.img.onerror = function() {
  6818.                 self.img = null;
  6819.                 self.error = true
  6820.             };
  6821.             self.img.src = self.url
  6822.         })(self, gl)
  6823.     }
  6824. };
  6825. ZamModelViewer.Lol.Vertex = function(r) {
  6826.     var self = this,
  6827.         i;
  6828.     self.position = [r.getFloat(), r.getFloat(), r.getFloat()];
  6829.     self.normal = [r.getFloat(), r.getFloat(), r.getFloat(), 0];
  6830.     self.u = r.getFloat();
  6831.     self.v = r.getFloat();
  6832.     self.bones = new Array(4);
  6833.     for (i = 0; i < 4; ++i) self.bones[i] = r.getUint8();
  6834.     self.weights = new Array(4);
  6835.     for (i = 0; i < 4; ++i) self.weights[i] = r.getFloat()
  6836. };
  6837. ZamModelViewer.Lol.Bone = function(model, index, r) {
  6838.     var self = this,
  6839.         i;
  6840.     self.model = model;
  6841.     self.index = index;
  6842.     self.name = r.getString().toLowerCase();
  6843.     self.parent = r.getInt32();
  6844.     self.scale = r.getFloat();
  6845.     self.origMatrix = mat4.create();
  6846.     for (i = 0; i < 16; ++i) self.origMatrix[i] = r.getFloat();
  6847.     self.baseMatrix = mat4.clone(self.origMatrix);
  6848.     mat4.transpose(self.baseMatrix, self.baseMatrix);
  6849.     mat4.invert(self.baseMatrix, self.baseMatrix);
  6850.     mat4.transpose(self.origMatrix, self.origMatrix);
  6851.     if (model.version >= 2) {
  6852.         self.incrMatrix = mat4.create();
  6853.         for (i = 0; i < 16; ++i) self.incrMatrix[i] = r.getFloat();
  6854.         mat4.transpose(self.incrMatrix, self.incrMatrix)
  6855.     }
  6856. };
  6857. ZamModelViewer.Lol.Animation = function(model, r, version) {
  6858.     var self = this,
  6859.         i, Lol = ZamModelViewer.Lol;
  6860.     self.model = model;
  6861.     self.meshOverride = {};
  6862.     self.name = r.getString().toLowerCase();
  6863.     self.fps = r.getInt32();
  6864.     var numBones = r.getUint32();
  6865.     self.bones = new Array(numBones);
  6866.     self.lookup = {};
  6867.     for (i = 0; i < numBones; ++i) {
  6868.         self.bones[i] = new Lol.AnimationBone(model, self, r, version);
  6869.         if (self.lookup[self.bones[i].bone] !== undefined) {
  6870.             self.bones[i].bone += "2"
  6871.         }
  6872.         self.lookup[self.bones[i].bone] = i
  6873.     }
  6874.     if (numBones == 0 || self.fps <= 1) {
  6875.         self.duration = 1e3
  6876.     } else {
  6877.         self.duration = Math.floor(1e3 * (self.bones[0].frames.length / self.fps))
  6878.     }
  6879. };
  6880. ZamModelViewer.Lol.AnimationBone = function(model, anim, r, version) {
  6881.     var self = this;
  6882.     self.model = model;
  6883.     self.anim = anim;
  6884.     var numFrames = r.getUint32();
  6885.     self.bone = r.getString().toLowerCase();
  6886.     self.flags = r.getUint32();
  6887.     self.frames = new Array(numFrames);
  6888.     var scale = [1, 1, 1];
  6889.     for (var i = 0; i < numFrames; ++i) {
  6890.         var pos = [r.getFloat(), r.getFloat(), r.getFloat()];
  6891.         var rot = [r.getFloat(), r.getFloat(), r.getFloat(), r.getFloat()];
  6892.         if (version >= 3) scale = [r.getFloat(), r.getFloat(), r.getFloat()];
  6893.         self.frames[i] = {
  6894.             pos: pos,
  6895.             rot: rot,
  6896.             scale: scale
  6897.         }
  6898.     }
  6899.     self.matrix = mat4.create();
  6900.     self.tmpMat = mat4.create();
  6901.     self.tmpPos = vec3.create();
  6902.     self.tmpRot = quat.create();
  6903.     self.tmpScale = vec3.create()
  6904. };
  6905. ZamModelViewer.Lol.AnimationBone.prototype.update = function(boneId, frame, r) {
  6906.     var self = this;
  6907.     self.index = boneId;
  6908.     var parent = self.model.bones[boneId].parent;
  6909.     var f0 = frame % self.frames.length,
  6910.         f1 = (frame + 1) % self.frames.length;
  6911.     vec3.lerp(self.tmpPos, self.frames[f0].pos, self.frames[f1].pos, r);
  6912.     vec3.lerp(self.tmpScale, self.frames[f0].scale, self.frames[f1].scale, r);
  6913.     quat.slerp(self.tmpRot, self.frames[f0].rot, self.frames[f1].rot, r);
  6914.     mat4.identity(self.matrix);
  6915.     mat4.translate(self.matrix, self.matrix, self.tmpPos);
  6916.     mat4.transpose(self.matrix, self.matrix);
  6917.     mat4.fromQuat(self.tmpMat, self.tmpRot);
  6918.     mat4.transpose(self.tmpMat, self.tmpMat);
  6919.     mat4.multiply(self.matrix, self.tmpMat, self.matrix);
  6920.     mat4.transpose(self.matrix, self.matrix);
  6921.     mat4.scale(self.matrix, self.matrix, self.tmpScale);
  6922.     if (parent != -1) {
  6923.         mat4.multiply(self.matrix, self.model.transforms[parent], self.matrix)
  6924.     }
  6925.     mat4.copy(self.model.transforms[boneId], self.matrix)
  6926. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement