1/*!
2
3JSZip - A Javascript class for generating and reading zip files
4<http://stuartk.com/jszip>
5
6(c) 2009-2014 Stuart Knightley <stuart [at] stuartk.com>
7Dual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/master/LICENSE.markdown.
8
9JSZip uses the library pako released under the MIT license :
10https://github.com/nodeca/pako/blob/master/LICENSE
11*/
12!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.JSZip=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
13'use strict';
14// private property
15var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
16
17
18// public method for encoding
19exports.encode = function(input, utf8) {
20    var output = "";
21    var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
22    var i = 0;
23
24    while (i < input.length) {
25
26        chr1 = input.charCodeAt(i++);
27        chr2 = input.charCodeAt(i++);
28        chr3 = input.charCodeAt(i++);
29
30        enc1 = chr1 >> 2;
31        enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
32        enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
33        enc4 = chr3 & 63;
34
35        if (isNaN(chr2)) {
36            enc3 = enc4 = 64;
37        }
38        else if (isNaN(chr3)) {
39            enc4 = 64;
40        }
41
42        output = output + _keyStr.charAt(enc1) + _keyStr.charAt(enc2) + _keyStr.charAt(enc3) + _keyStr.charAt(enc4);
43
44    }
45
46    return output;
47};
48
49// public method for decoding
50exports.decode = function(input, utf8) {
51    var output = "";
52    var chr1, chr2, chr3;
53    var enc1, enc2, enc3, enc4;
54    var i = 0;
55
56    input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
57
58    while (i < input.length) {
59
60        enc1 = _keyStr.indexOf(input.charAt(i++));
61        enc2 = _keyStr.indexOf(input.charAt(i++));
62        enc3 = _keyStr.indexOf(input.charAt(i++));
63        enc4 = _keyStr.indexOf(input.charAt(i++));
64
65        chr1 = (enc1 << 2) | (enc2 >> 4);
66        chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
67        chr3 = ((enc3 & 3) << 6) | enc4;
68
69        output = output + String.fromCharCode(chr1);
70
71        if (enc3 != 64) {
72            output = output + String.fromCharCode(chr2);
73        }
74        if (enc4 != 64) {
75            output = output + String.fromCharCode(chr3);
76        }
77
78    }
79
80    return output;
81
82};
83
84},{}],2:[function(_dereq_,module,exports){
85'use strict';
86function CompressedObject() {
87    this.compressedSize = 0;
88    this.uncompressedSize = 0;
89    this.crc32 = 0;
90    this.compressionMethod = null;
91    this.compressedContent = null;
92}
93
94CompressedObject.prototype = {
95    /**
96     * Return the decompressed content in an unspecified format.
97     * The format will depend on the decompressor.
98     * @return {Object} the decompressed content.
99     */
100    getContent: function() {
101        return null; // see implementation
102    },
103    /**
104     * Return the compressed content in an unspecified format.
105     * The format will depend on the compressed conten source.
106     * @return {Object} the compressed content.
107     */
108    getCompressedContent: function() {
109        return null; // see implementation
110    }
111};
112module.exports = CompressedObject;
113
114},{}],3:[function(_dereq_,module,exports){
115'use strict';
116exports.STORE = {
117    magic: "\x00\x00",
118    compress: function(content, compressionOptions) {
119        return content; // no compression
120    },
121    uncompress: function(content) {
122        return content; // no compression
123    },
124    compressInputType: null,
125    uncompressInputType: null
126};
127exports.DEFLATE = _dereq_('./flate');
128
129},{"./flate":8}],4:[function(_dereq_,module,exports){
130'use strict';
131
132var utils = _dereq_('./utils');
133
134var table = [
135    0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
136    0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
137    0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
138    0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
139    0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,
140    0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
141    0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,
142    0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
143    0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
144    0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
145    0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,
146    0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
147    0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,
148    0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
149    0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
150    0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
151    0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,
152    0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
153    0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,
154    0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
155    0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
156    0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
157    0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,
158    0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
159    0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,
160    0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
161    0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
162    0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
163    0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,
164    0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
165    0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,
166    0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
167    0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
168    0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
169    0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,
170    0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
171    0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,
172    0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
173    0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
174    0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
175    0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,
176    0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
177    0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,
178    0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
179    0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
180    0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
181    0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,
182    0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
183    0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,
184    0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
185    0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
186    0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
187    0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,
188    0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
189    0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,
190    0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
191    0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
192    0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
193    0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,
194    0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
195    0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,
196    0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
197    0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
198    0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
199];
200
201/**
202 *
203 *  Javascript crc32
204 *  http://www.webtoolkit.info/
205 *
206 */
207module.exports = function crc32(input, crc) {
208    if (typeof input === "undefined" || !input.length) {
209        return 0;
210    }
211
212    var isArray = utils.getTypeOf(input) !== "string";
213
214    if (typeof(crc) == "undefined") {
215        crc = 0;
216    }
217    var x = 0;
218    var y = 0;
219    var b = 0;
220
221    crc = crc ^ (-1);
222    for (var i = 0, iTop = input.length; i < iTop; i++) {
223        b = isArray ? input[i] : input.charCodeAt(i);
224        y = (crc ^ b) & 0xFF;
225        x = table[y];
226        crc = (crc >>> 8) ^ x;
227    }
228
229    return crc ^ (-1);
230};
231// vim: set shiftwidth=4 softtabstop=4:
232
233},{"./utils":21}],5:[function(_dereq_,module,exports){
234'use strict';
235var utils = _dereq_('./utils');
236
237function DataReader(data) {
238    this.data = null; // type : see implementation
239    this.length = 0;
240    this.index = 0;
241}
242DataReader.prototype = {
243    /**
244     * Check that the offset will not go too far.
245     * @param {string} offset the additional offset to check.
246     * @throws {Error} an Error if the offset is out of bounds.
247     */
248    checkOffset: function(offset) {
249        this.checkIndex(this.index + offset);
250    },
251    /**
252     * Check that the specifed index will not be too far.
253     * @param {string} newIndex the index to check.
254     * @throws {Error} an Error if the index is out of bounds.
255     */
256    checkIndex: function(newIndex) {
257        if (this.length < newIndex || newIndex < 0) {
258            throw new Error("End of data reached (data length = " + this.length + ", asked index = " + (newIndex) + "). Corrupted zip ?");
259        }
260    },
261    /**
262     * Change the index.
263     * @param {number} newIndex The new index.
264     * @throws {Error} if the new index is out of the data.
265     */
266    setIndex: function(newIndex) {
267        this.checkIndex(newIndex);
268        this.index = newIndex;
269    },
270    /**
271     * Skip the next n bytes.
272     * @param {number} n the number of bytes to skip.
273     * @throws {Error} if the new index is out of the data.
274     */
275    skip: function(n) {
276        this.setIndex(this.index + n);
277    },
278    /**
279     * Get the byte at the specified index.
280     * @param {number} i the index to use.
281     * @return {number} a byte.
282     */
283    byteAt: function(i) {
284        // see implementations
285    },
286    /**
287     * Get the next number with a given byte size.
288     * @param {number} size the number of bytes to read.
289     * @return {number} the corresponding number.
290     */
291    readInt: function(size) {
292        var result = 0,
293            i;
294        this.checkOffset(size);
295        for (i = this.index + size - 1; i >= this.index; i--) {
296            result = (result << 8) + this.byteAt(i);
297        }
298        this.index += size;
299        return result;
300    },
301    /**
302     * Get the next string with a given byte size.
303     * @param {number} size the number of bytes to read.
304     * @return {string} the corresponding string.
305     */
306    readString: function(size) {
307        return utils.transformTo("string", this.readData(size));
308    },
309    /**
310     * Get raw data without conversion, <size> bytes.
311     * @param {number} size the number of bytes to read.
312     * @return {Object} the raw data, implementation specific.
313     */
314    readData: function(size) {
315        // see implementations
316    },
317    /**
318     * Find the last occurence of a zip signature (4 bytes).
319     * @param {string} sig the signature to find.
320     * @return {number} the index of the last occurence, -1 if not found.
321     */
322    lastIndexOfSignature: function(sig) {
323        // see implementations
324    },
325    /**
326     * Get the next date.
327     * @return {Date} the date.
328     */
329    readDate: function() {
330        var dostime = this.readInt(4);
331        return new Date(
332        ((dostime >> 25) & 0x7f) + 1980, // year
333        ((dostime >> 21) & 0x0f) - 1, // month
334        (dostime >> 16) & 0x1f, // day
335        (dostime >> 11) & 0x1f, // hour
336        (dostime >> 5) & 0x3f, // minute
337        (dostime & 0x1f) << 1); // second
338    }
339};
340module.exports = DataReader;
341
342},{"./utils":21}],6:[function(_dereq_,module,exports){
343'use strict';
344exports.base64 = false;
345exports.binary = false;
346exports.dir = false;
347exports.createFolders = false;
348exports.date = null;
349exports.compression = null;
350exports.compressionOptions = null;
351exports.comment = null;
352exports.unixPermissions = null;
353exports.dosPermissions = null;
354
355},{}],7:[function(_dereq_,module,exports){
356'use strict';
357var utils = _dereq_('./utils');
358
359/**
360 * @deprecated
361 * This function will be removed in a future version without replacement.
362 */
363exports.string2binary = function(str) {
364    return utils.string2binary(str);
365};
366
367/**
368 * @deprecated
369 * This function will be removed in a future version without replacement.
370 */
371exports.string2Uint8Array = function(str) {
372    return utils.transformTo("uint8array", str);
373};
374
375/**
376 * @deprecated
377 * This function will be removed in a future version without replacement.
378 */
379exports.uint8Array2String = function(array) {
380    return utils.transformTo("string", array);
381};
382
383/**
384 * @deprecated
385 * This function will be removed in a future version without replacement.
386 */
387exports.string2Blob = function(str) {
388    var buffer = utils.transformTo("arraybuffer", str);
389    return utils.arrayBuffer2Blob(buffer);
390};
391
392/**
393 * @deprecated
394 * This function will be removed in a future version without replacement.
395 */
396exports.arrayBuffer2Blob = function(buffer) {
397    return utils.arrayBuffer2Blob(buffer);
398};
399
400/**
401 * @deprecated
402 * This function will be removed in a future version without replacement.
403 */
404exports.transformTo = function(outputType, input) {
405    return utils.transformTo(outputType, input);
406};
407
408/**
409 * @deprecated
410 * This function will be removed in a future version without replacement.
411 */
412exports.getTypeOf = function(input) {
413    return utils.getTypeOf(input);
414};
415
416/**
417 * @deprecated
418 * This function will be removed in a future version without replacement.
419 */
420exports.checkSupport = function(type) {
421    return utils.checkSupport(type);
422};
423
424/**
425 * @deprecated
426 * This value will be removed in a future version without replacement.
427 */
428exports.MAX_VALUE_16BITS = utils.MAX_VALUE_16BITS;
429
430/**
431 * @deprecated
432 * This value will be removed in a future version without replacement.
433 */
434exports.MAX_VALUE_32BITS = utils.MAX_VALUE_32BITS;
435
436
437/**
438 * @deprecated
439 * This function will be removed in a future version without replacement.
440 */
441exports.pretty = function(str) {
442    return utils.pretty(str);
443};
444
445/**
446 * @deprecated
447 * This function will be removed in a future version without replacement.
448 */
449exports.findCompression = function(compressionMethod) {
450    return utils.findCompression(compressionMethod);
451};
452
453/**
454 * @deprecated
455 * This function will be removed in a future version without replacement.
456 */
457exports.isRegExp = function (object) {
458    return utils.isRegExp(object);
459};
460
461
462},{"./utils":21}],8:[function(_dereq_,module,exports){
463'use strict';
464var USE_TYPEDARRAY = (typeof Uint8Array !== 'undefined') && (typeof Uint16Array !== 'undefined') && (typeof Uint32Array !== 'undefined');
465
466var pako = _dereq_("pako");
467exports.uncompressInputType = USE_TYPEDARRAY ? "uint8array" : "array";
468exports.compressInputType = USE_TYPEDARRAY ? "uint8array" : "array";
469
470exports.magic = "\x08\x00";
471exports.compress = function(input, compressionOptions) {
472    return pako.deflateRaw(input, {
473        level : compressionOptions.level || -1 // default compression
474    });
475};
476exports.uncompress =  function(input) {
477    return pako.inflateRaw(input);
478};
479
480},{"pako":24}],9:[function(_dereq_,module,exports){
481'use strict';
482
483var base64 = _dereq_('./base64');
484
485/**
486Usage:
487   zip = new JSZip();
488   zip.file("hello.txt", "Hello, World!").file("tempfile", "nothing");
489   zip.folder("images").file("smile.gif", base64Data, {base64: true});
490   zip.file("Xmas.txt", "Ho ho ho !", {date : new Date("December 25, 2007 00:00:01")});
491   zip.remove("tempfile");
492
493   base64zip = zip.generate();
494
495**/
496
497/**
498 * Representation a of zip file in js
499 * @constructor
500 * @param {String=|ArrayBuffer=|Uint8Array=} data the data to load, if any (optional).
501 * @param {Object=} options the options for creating this objects (optional).
502 */
503function JSZip(data, options) {
504    // if this constructor is used without `new`, it adds `new` before itself:
505    if(!(this instanceof JSZip)) return new JSZip(data, options);
506
507    // object containing the files :
508    // {
509    //   "folder/" : {...},
510    //   "folder/data.txt" : {...}
511    // }
512    this.files = {};
513
514    this.comment = null;
515
516    // Where we are in the hierarchy
517    this.root = "";
518    if (data) {
519        this.load(data, options);
520    }
521    this.clone = function() {
522        var newObj = new JSZip();
523        for (var i in this) {
524            if (typeof this[i] !== "function") {
525                newObj[i] = this[i];
526            }
527        }
528        return newObj;
529    };
530}
531JSZip.prototype = _dereq_('./object');
532JSZip.prototype.load = _dereq_('./load');
533JSZip.support = _dereq_('./support');
534JSZip.defaults = _dereq_('./defaults');
535
536/**
537 * @deprecated
538 * This namespace will be removed in a future version without replacement.
539 */
540JSZip.utils = _dereq_('./deprecatedPublicUtils');
541
542JSZip.base64 = {
543    /**
544     * @deprecated
545     * This method will be removed in a future version without replacement.
546     */
547    encode : function(input) {
548        return base64.encode(input);
549    },
550    /**
551     * @deprecated
552     * This method will be removed in a future version without replacement.
553     */
554    decode : function(input) {
555        return base64.decode(input);
556    }
557};
558JSZip.compressions = _dereq_('./compressions');
559module.exports = JSZip;
560
561},{"./base64":1,"./compressions":3,"./defaults":6,"./deprecatedPublicUtils":7,"./load":10,"./object":13,"./support":17}],10:[function(_dereq_,module,exports){
562'use strict';
563var base64 = _dereq_('./base64');
564var ZipEntries = _dereq_('./zipEntries');
565module.exports = function(data, options) {
566    var files, zipEntries, i, input;
567    options = options || {};
568    if (options.base64) {
569        data = base64.decode(data);
570    }
571
572    zipEntries = new ZipEntries(data, options);
573    files = zipEntries.files;
574    for (i = 0; i < files.length; i++) {
575        input = files[i];
576        this.file(input.fileName, input.decompressed, {
577            binary: true,
578            optimizedBinaryString: true,
579            date: input.date,
580            dir: input.dir,
581            comment : input.fileComment.length ? input.fileComment : null,
582            unixPermissions : input.unixPermissions,
583            dosPermissions : input.dosPermissions,
584            createFolders: options.createFolders
585        });
586    }
587    if (zipEntries.zipComment.length) {
588        this.comment = zipEntries.zipComment;
589    }
590
591    return this;
592};
593
594},{"./base64":1,"./zipEntries":22}],11:[function(_dereq_,module,exports){
595(function (Buffer){
596'use strict';
597module.exports = function(data, encoding){
598    return new Buffer(data, encoding);
599};
600module.exports.test = function(b){
601    return Buffer.isBuffer(b);
602};
603
604}).call(this,(typeof Buffer !== "undefined" ? Buffer : undefined))
605},{}],12:[function(_dereq_,module,exports){
606'use strict';
607var Uint8ArrayReader = _dereq_('./uint8ArrayReader');
608
609function NodeBufferReader(data) {
610    this.data = data;
611    this.length = this.data.length;
612    this.index = 0;
613}
614NodeBufferReader.prototype = new Uint8ArrayReader();
615
616/**
617 * @see DataReader.readData
618 */
619NodeBufferReader.prototype.readData = function(size) {
620    this.checkOffset(size);
621    var result = this.data.slice(this.index, this.index + size);
622    this.index += size;
623    return result;
624};
625module.exports = NodeBufferReader;
626
627},{"./uint8ArrayReader":18}],13:[function(_dereq_,module,exports){
628'use strict';
629var support = _dereq_('./support');
630var utils = _dereq_('./utils');
631var crc32 = _dereq_('./crc32');
632var signature = _dereq_('./signature');
633var defaults = _dereq_('./defaults');
634var base64 = _dereq_('./base64');
635var compressions = _dereq_('./compressions');
636var CompressedObject = _dereq_('./compressedObject');
637var nodeBuffer = _dereq_('./nodeBuffer');
638var utf8 = _dereq_('./utf8');
639var StringWriter = _dereq_('./stringWriter');
640var Uint8ArrayWriter = _dereq_('./uint8ArrayWriter');
641
642/**
643 * Returns the raw data of a ZipObject, decompress the content if necessary.
644 * @param {ZipObject} file the file to use.
645 * @return {String|ArrayBuffer|Uint8Array|Buffer} the data.
646 */
647var getRawData = function(file) {
648    if (file._data instanceof CompressedObject) {
649        file._data = file._data.getContent();
650        file.options.binary = true;
651        file.options.base64 = false;
652
653        if (utils.getTypeOf(file._data) === "uint8array") {
654            var copy = file._data;
655            // when reading an arraybuffer, the CompressedObject mechanism will keep it and subarray() a Uint8Array.
656            // if we request a file in the same format, we might get the same Uint8Array or its ArrayBuffer (the original zip file).
657            file._data = new Uint8Array(copy.length);
658            // with an empty Uint8Array, Opera fails with a "Offset larger than array size"
659            if (copy.length !== 0) {
660                file._data.set(copy, 0);
661            }
662        }
663    }
664    return file._data;
665};
666
667/**
668 * Returns the data of a ZipObject in a binary form. If the content is an unicode string, encode it.
669 * @param {ZipObject} file the file to use.
670 * @return {String|ArrayBuffer|Uint8Array|Buffer} the data.
671 */
672var getBinaryData = function(file) {
673    var result = getRawData(file),
674        type = utils.getTypeOf(result);
675    if (type === "string") {
676        if (!file.options.binary) {
677            // unicode text !
678            // unicode string => binary string is a painful process, check if we can avoid it.
679            if (support.nodebuffer) {
680                return nodeBuffer(result, "utf-8");
681            }
682        }
683        return file.asBinary();
684    }
685    return result;
686};
687
688/**
689 * Transform this._data into a string.
690 * @param {function} filter a function String -> String, applied if not null on the result.
691 * @return {String} the string representing this._data.
692 */
693var dataToString = function(asUTF8) {
694    var result = getRawData(this);
695    if (result === null || typeof result === "undefined") {
696        return "";
697    }
698    // if the data is a base64 string, we decode it before checking the encoding !
699    if (this.options.base64) {
700        result = base64.decode(result);
701    }
702    if (asUTF8 && this.options.binary) {
703        // JSZip.prototype.utf8decode supports arrays as input
704        // skip to array => string step, utf8decode will do it.
705        result = out.utf8decode(result);
706    }
707    else {
708        // no utf8 transformation, do the array => string step.
709        result = utils.transformTo("string", result);
710    }
711
712    if (!asUTF8 && !this.options.binary) {
713        result = utils.transformTo("string", out.utf8encode(result));
714    }
715    return result;
716};
717/**
718 * A simple object representing a file in the zip file.
719 * @constructor
720 * @param {string} name the name of the file
721 * @param {String|ArrayBuffer|Uint8Array|Buffer} data the data
722 * @param {Object} options the options of the file
723 */
724var ZipObject = function(name, data, options) {
725    this.name = name;
726    this.dir = options.dir;
727    this.date = options.date;
728    this.comment = options.comment;
729    this.unixPermissions = options.unixPermissions;
730    this.dosPermissions = options.dosPermissions;
731
732    this._data = data;
733    this.options = options;
734
735    /*
736     * This object contains initial values for dir and date.
737     * With them, we can check if the user changed the deprecated metadata in
738     * `ZipObject#options` or not.
739     */
740    this._initialMetadata = {
741      dir : options.dir,
742      date : options.date
743    };
744};
745
746ZipObject.prototype = {
747    /**
748     * Return the content as UTF8 string.
749     * @return {string} the UTF8 string.
750     */
751    asText: function() {
752        return dataToString.call(this, true);
753    },
754    /**
755     * Returns the binary content.
756     * @return {string} the content as binary.
757     */
758    asBinary: function() {
759        return dataToString.call(this, false);
760    },
761    /**
762     * Returns the content as a nodejs Buffer.
763     * @return {Buffer} the content as a Buffer.
764     */
765    asNodeBuffer: function() {
766        var result = getBinaryData(this);
767        return utils.transformTo("nodebuffer", result);
768    },
769    /**
770     * Returns the content as an Uint8Array.
771     * @return {Uint8Array} the content as an Uint8Array.
772     */
773    asUint8Array: function() {
774        var result = getBinaryData(this);
775        return utils.transformTo("uint8array", result);
776    },
777    /**
778     * Returns the content as an ArrayBuffer.
779     * @return {ArrayBuffer} the content as an ArrayBufer.
780     */
781    asArrayBuffer: function() {
782        return this.asUint8Array().buffer;
783    }
784};
785
786/**
787 * Transform an integer into a string in hexadecimal.
788 * @private
789 * @param {number} dec the number to convert.
790 * @param {number} bytes the number of bytes to generate.
791 * @returns {string} the result.
792 */
793var decToHex = function(dec, bytes) {
794    var hex = "",
795        i;
796    for (i = 0; i < bytes; i++) {
797        hex += String.fromCharCode(dec & 0xff);
798        dec = dec >>> 8;
799    }
800    return hex;
801};
802
803/**
804 * Merge the objects passed as parameters into a new one.
805 * @private
806 * @param {...Object} var_args All objects to merge.
807 * @return {Object} a new object with the data of the others.
808 */
809var extend = function() {
810    var result = {}, i, attr;
811    for (i = 0; i < arguments.length; i++) { // arguments is not enumerable in some browsers
812        for (attr in arguments[i]) {
813            if (arguments[i].hasOwnProperty(attr) && typeof result[attr] === "undefined") {
814                result[attr] = arguments[i][attr];
815            }
816        }
817    }
818    return result;
819};
820
821/**
822 * Transforms the (incomplete) options from the user into the complete
823 * set of options to create a file.
824 * @private
825 * @param {Object} o the options from the user.
826 * @return {Object} the complete set of options.
827 */
828var prepareFileAttrs = function(o) {
829    o = o || {};
830    if (o.base64 === true && (o.binary === null || o.binary === undefined)) {
831        o.binary = true;
832    }
833    o = extend(o, defaults);
834    o.date = o.date || new Date();
835    if (o.compression !== null) o.compression = o.compression.toUpperCase();
836
837    return o;
838};
839
840/**
841 * Add a file in the current folder.
842 * @private
843 * @param {string} name the name of the file
844 * @param {String|ArrayBuffer|Uint8Array|Buffer} data the data of the file
845 * @param {Object} o the options of the file
846 * @return {Object} the new file.
847 */
848var fileAdd = function(name, data, o) {
849    // be sure sub folders exist
850    var dataType = utils.getTypeOf(data),
851        parent;
852
853    o = prepareFileAttrs(o);
854
855    if (typeof o.unixPermissions === "string") {
856        o.unixPermissions = parseInt(o.unixPermissions, 8);
857    }
858
859    // UNX_IFDIR  0040000 see zipinfo.c
860    if (o.unixPermissions && (o.unixPermissions & 0x4000)) {
861        o.dir = true;
862    }
863    // Bit 4    Directory
864    if (o.dosPermissions && (o.dosPermissions & 0x0010)) {
865        o.dir = true;
866    }
867
868    if (o.dir) {
869        name = forceTrailingSlash(name);
870    }
871
872    if (o.createFolders && (parent = parentFolder(name))) {
873        folderAdd.call(this, parent, true);
874    }
875
876    if (o.dir || data === null || typeof data === "undefined") {
877        o.base64 = false;
878        o.binary = false;
879        data = null;
880        dataType = null;
881    }
882    else if (dataType === "string") {
883        if (o.binary && !o.base64) {
884            // optimizedBinaryString == true means that the file has already been filtered with a 0xFF mask
885            if (o.optimizedBinaryString !== true) {
886                // this is a string, not in a base64 format.
887                // Be sure that this is a correct "binary string"
888                data = utils.string2binary(data);
889            }
890        }
891    }
892    else { // arraybuffer, uint8array, ...
893        o.base64 = false;
894        o.binary = true;
895
896        if (!dataType && !(data instanceof CompressedObject)) {
897            throw new Error("The data of '" + name + "' is in an unsupported format !");
898        }
899
900        // special case : it's way easier to work with Uint8Array than with ArrayBuffer
901        if (dataType === "arraybuffer") {
902            data = utils.transformTo("uint8array", data);
903        }
904    }
905
906    var object = new ZipObject(name, data, o);
907    this.files[name] = object;
908    return object;
909};
910
911/**
912 * Find the parent folder of the path.
913 * @private
914 * @param {string} path the path to use
915 * @return {string} the parent folder, or ""
916 */
917var parentFolder = function (path) {
918    if (path.slice(-1) == '/') {
919        path = path.substring(0, path.length - 1);
920    }
921    var lastSlash = path.lastIndexOf('/');
922    return (lastSlash > 0) ? path.substring(0, lastSlash) : "";
923};
924
925
926/**
927 * Returns the path with a slash at the end.
928 * @private
929 * @param {String} path the path to check.
930 * @return {String} the path with a trailing slash.
931 */
932var forceTrailingSlash = function(path) {
933    // Check the name ends with a /
934    if (path.slice(-1) != "/") {
935        path += "/"; // IE doesn't like substr(-1)
936    }
937    return path;
938};
939/**
940 * Add a (sub) folder in the current folder.
941 * @private
942 * @param {string} name the folder's name
943 * @param {boolean=} [createFolders] If true, automatically create sub
944 *  folders. Defaults to false.
945 * @return {Object} the new folder.
946 */
947var folderAdd = function(name, createFolders) {
948    createFolders = (typeof createFolders !== 'undefined') ? createFolders : false;
949
950    name = forceTrailingSlash(name);
951
952    // Does this folder already exist?
953    if (!this.files[name]) {
954        fileAdd.call(this, name, null, {
955            dir: true,
956            createFolders: createFolders
957        });
958    }
959    return this.files[name];
960};
961
962/**
963 * Generate a JSZip.CompressedObject for a given zipOject.
964 * @param {ZipObject} file the object to read.
965 * @param {JSZip.compression} compression the compression to use.
966 * @param {Object} compressionOptions the options to use when compressing.
967 * @return {JSZip.CompressedObject} the compressed result.
968 */
969var generateCompressedObjectFrom = function(file, compression, compressionOptions) {
970    var result = new CompressedObject(),
971        content;
972
973    // the data has not been decompressed, we might reuse things !
974    if (file._data instanceof CompressedObject) {
975        result.uncompressedSize = file._data.uncompressedSize;
976        result.crc32 = file._data.crc32;
977
978        if (result.uncompressedSize === 0 || file.dir) {
979            compression = compressions['STORE'];
980            result.compressedContent = "";
981            result.crc32 = 0;
982        }
983        else if (file._data.compressionMethod === compression.magic) {
984            result.compressedContent = file._data.getCompressedContent();
985        }
986        else {
987            content = file._data.getContent();
988            // need to decompress / recompress
989            result.compressedContent = compression.compress(utils.transformTo(compression.compressInputType, content), compressionOptions);
990        }
991    }
992    else {
993        // have uncompressed data
994        content = getBinaryData(file);
995        if (!content || content.length === 0 || file.dir) {
996            compression = compressions['STORE'];
997            content = "";
998        }
999        result.uncompressedSize = content.length;
1000        result.crc32 = crc32(content);
1001        result.compressedContent = compression.compress(utils.transformTo(compression.compressInputType, content), compressionOptions);
1002    }
1003
1004    result.compressedSize = result.compressedContent.length;
1005    result.compressionMethod = compression.magic;
1006
1007    return result;
1008};
1009
1010
1011
1012
1013/**
1014 * Generate the UNIX part of the external file attributes.
1015 * @param {Object} unixPermissions the unix permissions or null.
1016 * @param {Boolean} isDir true if the entry is a directory, false otherwise.
1017 * @return {Number} a 32 bit integer.
1018 *
1019 * adapted from http://unix.stackexchange.com/questions/14705/the-zip-formats-external-file-attribute :
1020 *
1021 * TTTTsstrwxrwxrwx0000000000ADVSHR
1022 * ^^^^____________________________ file type, see zipinfo.c (UNX_*)
1023 *     ^^^_________________________ setuid, setgid, sticky
1024 *        ^^^^^^^^^________________ permissions
1025 *                 ^^^^^^^^^^______ not used ?
1026 *                           ^^^^^^ DOS attribute bits : Archive, Directory, Volume label, System file, Hidden, Read only
1027 */
1028var generateUnixExternalFileAttr = function (unixPermissions, isDir) {
1029
1030    var result = unixPermissions;
1031    if (!unixPermissions) {
1032        // I can't use octal values in strict mode, hence the hexa.
1033        //  040775 => 0x41fd
1034        // 0100664 => 0x81b4
1035        result = isDir ? 0x41fd : 0x81b4;
1036    }
1037
1038    return (result & 0xFFFF) << 16;
1039};
1040
1041/**
1042 * Generate the DOS part of the external file attributes.
1043 * @param {Object} dosPermissions the dos permissions or null.
1044 * @param {Boolean} isDir true if the entry is a directory, false otherwise.
1045 * @return {Number} a 32 bit integer.
1046 *
1047 * Bit 0     Read-Only
1048 * Bit 1     Hidden
1049 * Bit 2     System
1050 * Bit 3     Volume Label
1051 * Bit 4     Directory
1052 * Bit 5     Archive
1053 */
1054var generateDosExternalFileAttr = function (dosPermissions, isDir) {
1055
1056    // the dir flag is already set for compatibility
1057
1058    return (dosPermissions || 0)  & 0x3F;
1059};
1060
1061/**
1062 * Generate the various parts used in the construction of the final zip file.
1063 * @param {string} name the file name.
1064 * @param {ZipObject} file the file content.
1065 * @param {JSZip.CompressedObject} compressedObject the compressed object.
1066 * @param {number} offset the current offset from the start of the zip file.
1067 * @param {String} platform let's pretend we are this platform (change platform dependents fields)
1068 * @return {object} the zip parts.
1069 */
1070var generateZipParts = function(name, file, compressedObject, offset, platform) {
1071    var data = compressedObject.compressedContent,
1072        utfEncodedFileName = utils.transformTo("string", utf8.utf8encode(file.name)),
1073        comment = file.comment || "",
1074        utfEncodedComment = utils.transformTo("string", utf8.utf8encode(comment)),
1075        useUTF8ForFileName = utfEncodedFileName.length !== file.name.length,
1076        useUTF8ForComment = utfEncodedComment.length !== comment.length,
1077        o = file.options,
1078        dosTime,
1079        dosDate,
1080        extraFields = "",
1081        unicodePathExtraField = "",
1082        unicodeCommentExtraField = "",
1083        dir, date;
1084
1085
1086    // handle the deprecated options.dir
1087    if (file._initialMetadata.dir !== file.dir) {
1088        dir = file.dir;
1089    } else {
1090        dir = o.dir;
1091    }
1092
1093    // handle the deprecated options.date
1094    if(file._initialMetadata.date !== file.date) {
1095        date = file.date;
1096    } else {
1097        date = o.date;
1098    }
1099
1100    var extFileAttr = 0;
1101    var versionMadeBy = 0;
1102    if (dir) {
1103        // dos or unix, we set the dos dir flag
1104        extFileAttr |= 0x00010;
1105    }
1106    if(platform === "UNIX") {
1107        versionMadeBy = 0x031E; // UNIX, version 3.0
1108        extFileAttr |= generateUnixExternalFileAttr(file.unixPermissions, dir);
1109    } else { // DOS or other, fallback to DOS
1110        versionMadeBy = 0x0014; // DOS, version 2.0
1111        extFileAttr |= generateDosExternalFileAttr(file.dosPermissions, dir);
1112    }
1113
1114    // date
1115    // @see http://www.delorie.com/djgpp/doc/rbinter/it/52/13.html
1116    // @see http://www.delorie.com/djgpp/doc/rbinter/it/65/16.html
1117    // @see http://www.delorie.com/djgpp/doc/rbinter/it/66/16.html
1118
1119    dosTime = date.getHours();
1120    dosTime = dosTime << 6;
1121    dosTime = dosTime | date.getMinutes();
1122    dosTime = dosTime << 5;
1123    dosTime = dosTime | date.getSeconds() / 2;
1124
1125    dosDate = date.getFullYear() - 1980;
1126    dosDate = dosDate << 4;
1127    dosDate = dosDate | (date.getMonth() + 1);
1128    dosDate = dosDate << 5;
1129    dosDate = dosDate | date.getDate();
1130
1131    if (useUTF8ForFileName) {
1132        // set the unicode path extra field. unzip needs at least one extra
1133        // field to correctly handle unicode path, so using the path is as good
1134        // as any other information. This could improve the situation with
1135        // other archive managers too.
1136        // This field is usually used without the utf8 flag, with a non
1137        // unicode path in the header (winrar, winzip). This helps (a bit)
1138        // with the messy Windows' default compressed folders feature but
1139        // breaks on p7zip which doesn't seek the unicode path extra field.
1140        // So for now, UTF-8 everywhere !
1141        unicodePathExtraField =
1142            // Version
1143            decToHex(1, 1) +
1144            // NameCRC32
1145            decToHex(crc32(utfEncodedFileName), 4) +
1146            // UnicodeName
1147            utfEncodedFileName;
1148
1149        extraFields +=
1150            // Info-ZIP Unicode Path Extra Field
1151            "\x75\x70" +
1152            // size
1153            decToHex(unicodePathExtraField.length, 2) +
1154            // content
1155            unicodePathExtraField;
1156    }
1157
1158    if(useUTF8ForComment) {
1159
1160        unicodeCommentExtraField =
1161            // Version
1162            decToHex(1, 1) +
1163            // CommentCRC32
1164            decToHex(this.crc32(utfEncodedComment), 4) +
1165            // UnicodeName
1166            utfEncodedComment;
1167
1168        extraFields +=
1169            // Info-ZIP Unicode Path Extra Field
1170            "\x75\x63" +
1171            // size
1172            decToHex(unicodeCommentExtraField.length, 2) +
1173            // content
1174            unicodeCommentExtraField;
1175    }
1176
1177    var header = "";
1178
1179    // version needed to extract
1180    header += "\x0A\x00";
1181    // general purpose bit flag
1182    // set bit 11 if utf8
1183    header += (useUTF8ForFileName || useUTF8ForComment) ? "\x00\x08" : "\x00\x00";
1184    // compression method
1185    header += compressedObject.compressionMethod;
1186    // last mod file time
1187    header += decToHex(dosTime, 2);
1188    // last mod file date
1189    header += decToHex(dosDate, 2);
1190    // crc-32
1191    header += decToHex(compressedObject.crc32, 4);
1192    // compressed size
1193    header += decToHex(compressedObject.compressedSize, 4);
1194    // uncompressed size
1195    header += decToHex(compressedObject.uncompressedSize, 4);
1196    // file name length
1197    header += decToHex(utfEncodedFileName.length, 2);
1198    // extra field length
1199    header += decToHex(extraFields.length, 2);
1200
1201
1202    var fileRecord = signature.LOCAL_FILE_HEADER + header + utfEncodedFileName + extraFields;
1203
1204    var dirRecord = signature.CENTRAL_FILE_HEADER +
1205    // version made by (00: DOS)
1206    decToHex(versionMadeBy, 2) +
1207    // file header (common to file and central directory)
1208    header +
1209    // file comment length
1210    decToHex(utfEncodedComment.length, 2) +
1211    // disk number start
1212    "\x00\x00" +
1213    // internal file attributes TODO
1214    "\x00\x00" +
1215    // external file attributes
1216    decToHex(extFileAttr, 4) +
1217    // relative offset of local header
1218    decToHex(offset, 4) +
1219    // file name
1220    utfEncodedFileName +
1221    // extra field
1222    extraFields +
1223    // file comment
1224    utfEncodedComment;
1225
1226    return {
1227        fileRecord: fileRecord,
1228        dirRecord: dirRecord,
1229        compressedObject: compressedObject
1230    };
1231};
1232
1233
1234// return the actual prototype of JSZip
1235var out = {
1236    /**
1237     * Read an existing zip and merge the data in the current JSZip object.
1238     * The implementation is in jszip-load.js, don't forget to include it.
1239     * @param {String|ArrayBuffer|Uint8Array|Buffer} stream  The stream to load
1240     * @param {Object} options Options for loading the stream.
1241     *  options.base64 : is the stream in base64 ? default : false
1242     * @return {JSZip} the current JSZip object
1243     */
1244    load: function(stream, options) {
1245        throw new Error("Load method is not defined. Is the file jszip-load.js included ?");
1246    },
1247
1248    /**
1249     * Filter nested files/folders with the specified function.
1250     * @param {Function} search the predicate to use :
1251     * function (relativePath, file) {...}
1252     * It takes 2 arguments : the relative path and the file.
1253     * @return {Array} An array of matching elements.
1254     */
1255    filter: function(search) {
1256        var result = [],
1257            filename, relativePath, file, fileClone;
1258        for (filename in this.files) {
1259            if (!this.files.hasOwnProperty(filename)) {
1260                continue;
1261            }
1262            file = this.files[filename];
1263            // return a new object, don't let the user mess with our internal objects :)
1264            fileClone = new ZipObject(file.name, file._data, extend(file.options));
1265            relativePath = filename.slice(this.root.length, filename.length);
1266            if (filename.slice(0, this.root.length) === this.root && // the file is in the current root
1267            search(relativePath, fileClone)) { // and the file matches the function
1268                result.push(fileClone);
1269            }
1270        }
1271        return result;
1272    },
1273
1274    /**
1275     * Add a file to the zip file, or search a file.
1276     * @param   {string|RegExp} name The name of the file to add (if data is defined),
1277     * the name of the file to find (if no data) or a regex to match files.
1278     * @param   {String|ArrayBuffer|Uint8Array|Buffer} data  The file data, either raw or base64 encoded
1279     * @param   {Object} o     File options
1280     * @return  {JSZip|Object|Array} this JSZip object (when adding a file),
1281     * a file (when searching by string) or an array of files (when searching by regex).
1282     */
1283    file: function(name, data, o) {
1284        if (arguments.length === 1) {
1285            if (utils.isRegExp(name)) {
1286                var regexp = name;
1287                return this.filter(function(relativePath, file) {
1288                    return !file.dir && regexp.test(relativePath);
1289                });
1290            }
1291            else { // text
1292                return this.filter(function(relativePath, file) {
1293                    return !file.dir && relativePath === name;
1294                })[0] || null;
1295            }
1296        }
1297        else { // more than one argument : we have data !
1298            name = this.root + name;
1299            fileAdd.call(this, name, data, o);
1300        }
1301        return this;
1302    },
1303
1304    /**
1305     * Add a directory to the zip file, or search.
1306     * @param   {String|RegExp} arg The name of the directory to add, or a regex to search folders.
1307     * @return  {JSZip} an object with the new directory as the root, or an array containing matching folders.
1308     */
1309    folder: function(arg) {
1310        if (!arg) {
1311            return this;
1312        }
1313
1314        if (utils.isRegExp(arg)) {
1315            return this.filter(function(relativePath, file) {
1316                return file.dir && arg.test(relativePath);
1317            });
1318        }
1319
1320        // else, name is a new folder
1321        var name = this.root + arg;
1322        var newFolder = folderAdd.call(this, name);
1323
1324        // Allow chaining by returning a new object with this folder as the root
1325        var ret = this.clone();
1326        ret.root = newFolder.name;
1327        return ret;
1328    },
1329
1330    /**
1331     * Delete a file, or a directory and all sub-files, from the zip
1332     * @param {string} name the name of the file to delete
1333     * @return {JSZip} this JSZip object
1334     */
1335    remove: function(name) {
1336        name = this.root + name;
1337        var file = this.files[name];
1338        if (!file) {
1339            // Look for any folders
1340            if (name.slice(-1) != "/") {
1341                name += "/";
1342            }
1343            file = this.files[name];
1344        }
1345
1346        if (file && !file.dir) {
1347            // file
1348            delete this.files[name];
1349        } else {
1350            // maybe a folder, delete recursively
1351            var kids = this.filter(function(relativePath, file) {
1352                return file.name.slice(0, name.length) === name;
1353            });
1354            for (var i = 0; i < kids.length; i++) {
1355                delete this.files[kids[i].name];
1356            }
1357        }
1358
1359        return this;
1360    },
1361
1362    /**
1363     * Generate the complete zip file
1364     * @param {Object} options the options to generate the zip file :
1365     * - base64, (deprecated, use type instead) true to generate base64.
1366     * - compression, "STORE" by default.
1367     * - type, "base64" by default. Values are : string, base64, uint8array, arraybuffer, blob.
1368     * @return {String|Uint8Array|ArrayBuffer|Buffer|Blob} the zip file
1369     */
1370    generate: function(options) {
1371        options = extend(options || {}, {
1372            base64: true,
1373            compression: "STORE",
1374            compressionOptions : null,
1375            type: "base64",
1376            platform: "DOS",
1377            comment: null,
1378            mimeType: 'application/zip'
1379        });
1380
1381        utils.checkSupport(options.type);
1382
1383        // accept nodejs `process.platform`
1384        if(
1385          options.platform === 'darwin' ||
1386          options.platform === 'freebsd' ||
1387          options.platform === 'linux' ||
1388          options.platform === 'sunos'
1389        ) {
1390          options.platform = "UNIX";
1391        }
1392        if (options.platform === 'win32') {
1393          options.platform = "DOS";
1394        }
1395
1396        var zipData = [],
1397            localDirLength = 0,
1398            centralDirLength = 0,
1399            writer, i,
1400            utfEncodedComment = utils.transformTo("string", this.utf8encode(options.comment || this.comment || ""));
1401
1402        // first, generate all the zip parts.
1403        for (var name in this.files) {
1404            if (!this.files.hasOwnProperty(name)) {
1405                continue;
1406            }
1407            var file = this.files[name];
1408
1409            var compressionName = file.options.compression || options.compression.toUpperCase();
1410            var compression = compressions[compressionName];
1411            if (!compression) {
1412                throw new Error(compressionName + " is not a valid compression method !");
1413            }
1414            var compressionOptions = file.options.compressionOptions || options.compressionOptions || {};
1415
1416            var compressedObject = generateCompressedObjectFrom.call(this, file, compression, compressionOptions);
1417
1418            var zipPart = generateZipParts.call(this, name, file, compressedObject, localDirLength, options.platform);
1419            localDirLength += zipPart.fileRecord.length + compressedObject.compressedSize;
1420            centralDirLength += zipPart.dirRecord.length;
1421            zipData.push(zipPart);
1422        }
1423
1424        var dirEnd = "";
1425
1426        // end of central dir signature
1427        dirEnd = signature.CENTRAL_DIRECTORY_END +
1428        // number of this disk
1429        "\x00\x00" +
1430        // number of the disk with the start of the central directory
1431        "\x00\x00" +
1432        // total number of entries in the central directory on this disk
1433        decToHex(zipData.length, 2) +
1434        // total number of entries in the central directory
1435        decToHex(zipData.length, 2) +
1436        // size of the central directory   4 bytes
1437        decToHex(centralDirLength, 4) +
1438        // offset of start of central directory with respect to the starting disk number
1439        decToHex(localDirLength, 4) +
1440        // .ZIP file comment length
1441        decToHex(utfEncodedComment.length, 2) +
1442        // .ZIP file comment
1443        utfEncodedComment;
1444
1445
1446        // we have all the parts (and the total length)
1447        // time to create a writer !
1448        var typeName = options.type.toLowerCase();
1449        if(typeName==="uint8array"||typeName==="arraybuffer"||typeName==="blob"||typeName==="nodebuffer") {
1450            writer = new Uint8ArrayWriter(localDirLength + centralDirLength + dirEnd.length);
1451        }else{
1452            writer = new StringWriter(localDirLength + centralDirLength + dirEnd.length);
1453        }
1454
1455        for (i = 0; i < zipData.length; i++) {
1456            writer.append(zipData[i].fileRecord);
1457            writer.append(zipData[i].compressedObject.compressedContent);
1458        }
1459        for (i = 0; i < zipData.length; i++) {
1460            writer.append(zipData[i].dirRecord);
1461        }
1462
1463        writer.append(dirEnd);
1464
1465        var zip = writer.finalize();
1466
1467
1468
1469        switch(options.type.toLowerCase()) {
1470            // case "zip is an Uint8Array"
1471            case "uint8array" :
1472            case "arraybuffer" :
1473            case "nodebuffer" :
1474               return utils.transformTo(options.type.toLowerCase(), zip);
1475            case "blob" :
1476               return utils.arrayBuffer2Blob(utils.transformTo("arraybuffer", zip), options.mimeType);
1477            // case "zip is a string"
1478            case "base64" :
1479               return (options.base64) ? base64.encode(zip) : zip;
1480            default : // case "string" :
1481               return zip;
1482         }
1483
1484    },
1485
1486    /**
1487     * @deprecated
1488     * This method will be removed in a future version without replacement.
1489     */
1490    crc32: function (input, crc) {
1491        return crc32(input, crc);
1492    },
1493
1494    /**
1495     * @deprecated
1496     * This method will be removed in a future version without replacement.
1497     */
1498    utf8encode: function (string) {
1499        return utils.transformTo("string", utf8.utf8encode(string));
1500    },
1501
1502    /**
1503     * @deprecated
1504     * This method will be removed in a future version without replacement.
1505     */
1506    utf8decode: function (input) {
1507        return utf8.utf8decode(input);
1508    }
1509};
1510module.exports = out;
1511
1512},{"./base64":1,"./compressedObject":2,"./compressions":3,"./crc32":4,"./defaults":6,"./nodeBuffer":11,"./signature":14,"./stringWriter":16,"./support":17,"./uint8ArrayWriter":19,"./utf8":20,"./utils":21}],14:[function(_dereq_,module,exports){
1513'use strict';
1514exports.LOCAL_FILE_HEADER = "PK\x03\x04";
1515exports.CENTRAL_FILE_HEADER = "PK\x01\x02";
1516exports.CENTRAL_DIRECTORY_END = "PK\x05\x06";
1517exports.ZIP64_CENTRAL_DIRECTORY_LOCATOR = "PK\x06\x07";
1518exports.ZIP64_CENTRAL_DIRECTORY_END = "PK\x06\x06";
1519exports.DATA_DESCRIPTOR = "PK\x07\x08";
1520
1521},{}],15:[function(_dereq_,module,exports){
1522'use strict';
1523var DataReader = _dereq_('./dataReader');
1524var utils = _dereq_('./utils');
1525
1526function StringReader(data, optimizedBinaryString) {
1527    this.data = data;
1528    if (!optimizedBinaryString) {
1529        this.data = utils.string2binary(this.data);
1530    }
1531    this.length = this.data.length;
1532    this.index = 0;
1533}
1534StringReader.prototype = new DataReader();
1535/**
1536 * @see DataReader.byteAt
1537 */
1538StringReader.prototype.byteAt = function(i) {
1539    return this.data.charCodeAt(i);
1540};
1541/**
1542 * @see DataReader.lastIndexOfSignature
1543 */
1544StringReader.prototype.lastIndexOfSignature = function(sig) {
1545    return this.data.lastIndexOf(sig);
1546};
1547/**
1548 * @see DataReader.readData
1549 */
1550StringReader.prototype.readData = function(size) {
1551    this.checkOffset(size);
1552    // this will work because the constructor applied the "& 0xff" mask.
1553    var result = this.data.slice(this.index, this.index + size);
1554    this.index += size;
1555    return result;
1556};
1557module.exports = StringReader;
1558
1559},{"./dataReader":5,"./utils":21}],16:[function(_dereq_,module,exports){
1560'use strict';
1561
1562var utils = _dereq_('./utils');
1563
1564/**
1565 * An object to write any content to a string.
1566 * @constructor
1567 */
1568var StringWriter = function() {
1569    this.data = [];
1570};
1571StringWriter.prototype = {
1572    /**
1573     * Append any content to the current string.
1574     * @param {Object} input the content to add.
1575     */
1576    append: function(input) {
1577        input = utils.transformTo("string", input);
1578        this.data.push(input);
1579    },
1580    /**
1581     * Finalize the construction an return the result.
1582     * @return {string} the generated string.
1583     */
1584    finalize: function() {
1585        return this.data.join("");
1586    }
1587};
1588
1589module.exports = StringWriter;
1590
1591},{"./utils":21}],17:[function(_dereq_,module,exports){
1592(function (Buffer){
1593'use strict';
1594exports.base64 = true;
1595exports.array = true;
1596exports.string = true;
1597exports.arraybuffer = typeof ArrayBuffer !== "undefined" && typeof Uint8Array !== "undefined";
1598// contains true if JSZip can read/generate nodejs Buffer, false otherwise.
1599// Browserify will provide a Buffer implementation for browsers, which is
1600// an augmented Uint8Array (i.e., can be used as either Buffer or U8).
1601exports.nodebuffer = typeof Buffer !== "undefined";
1602// contains true if JSZip can read/generate Uint8Array, false otherwise.
1603exports.uint8array = typeof Uint8Array !== "undefined";
1604
1605if (typeof ArrayBuffer === "undefined") {
1606    exports.blob = false;
1607}
1608else {
1609    var buffer = new ArrayBuffer(0);
1610    try {
1611        exports.blob = new Blob([buffer], {
1612            type: "application/zip"
1613        }).size === 0;
1614    }
1615    catch (e) {
1616        try {
1617            var Builder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;
1618            var builder = new Builder();
1619            builder.append(buffer);
1620            exports.blob = builder.getBlob('application/zip').size === 0;
1621        }
1622        catch (e) {
1623            exports.blob = false;
1624        }
1625    }
1626}
1627
1628}).call(this,(typeof Buffer !== "undefined" ? Buffer : undefined))
1629},{}],18:[function(_dereq_,module,exports){
1630'use strict';
1631var DataReader = _dereq_('./dataReader');
1632
1633function Uint8ArrayReader(data) {
1634    if (data) {
1635        this.data = data;
1636        this.length = this.data.length;
1637        this.index = 0;
1638    }
1639}
1640Uint8ArrayReader.prototype = new DataReader();
1641/**
1642 * @see DataReader.byteAt
1643 */
1644Uint8ArrayReader.prototype.byteAt = function(i) {
1645    return this.data[i];
1646};
1647/**
1648 * @see DataReader.lastIndexOfSignature
1649 */
1650Uint8ArrayReader.prototype.lastIndexOfSignature = function(sig) {
1651    var sig0 = sig.charCodeAt(0),
1652        sig1 = sig.charCodeAt(1),
1653        sig2 = sig.charCodeAt(2),
1654        sig3 = sig.charCodeAt(3);
1655    for (var i = this.length - 4; i >= 0; --i) {
1656        if (this.data[i] === sig0 && this.data[i + 1] === sig1 && this.data[i + 2] === sig2 && this.data[i + 3] === sig3) {
1657            return i;
1658        }
1659    }
1660
1661    return -1;
1662};
1663/**
1664 * @see DataReader.readData
1665 */
1666Uint8ArrayReader.prototype.readData = function(size) {
1667    this.checkOffset(size);
1668    if(size === 0) {
1669        // in IE10, when using subarray(idx, idx), we get the array [0x00] instead of [].
1670        return new Uint8Array(0);
1671    }
1672    var result = this.data.subarray(this.index, this.index + size);
1673    this.index += size;
1674    return result;
1675};
1676module.exports = Uint8ArrayReader;
1677
1678},{"./dataReader":5}],19:[function(_dereq_,module,exports){
1679'use strict';
1680
1681var utils = _dereq_('./utils');
1682
1683/**
1684 * An object to write any content to an Uint8Array.
1685 * @constructor
1686 * @param {number} length The length of the array.
1687 */
1688var Uint8ArrayWriter = function(length) {
1689    this.data = new Uint8Array(length);
1690    this.index = 0;
1691};
1692Uint8ArrayWriter.prototype = {
1693    /**
1694     * Append any content to the current array.
1695     * @param {Object} input the content to add.
1696     */
1697    append: function(input) {
1698        if (input.length !== 0) {
1699            // with an empty Uint8Array, Opera fails with a "Offset larger than array size"
1700            input = utils.transformTo("uint8array", input);
1701            this.data.set(input, this.index);
1702            this.index += input.length;
1703        }
1704    },
1705    /**
1706     * Finalize the construction an return the result.
1707     * @return {Uint8Array} the generated array.
1708     */
1709    finalize: function() {
1710        return this.data;
1711    }
1712};
1713
1714module.exports = Uint8ArrayWriter;
1715
1716},{"./utils":21}],20:[function(_dereq_,module,exports){
1717'use strict';
1718
1719var utils = _dereq_('./utils');
1720var support = _dereq_('./support');
1721var nodeBuffer = _dereq_('./nodeBuffer');
1722
1723/**
1724 * The following functions come from pako, from pako/lib/utils/strings
1725 * released under the MIT license, see pako https://github.com/nodeca/pako/
1726 */
1727
1728// Table with utf8 lengths (calculated by first byte of sequence)
1729// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,
1730// because max possible codepoint is 0x10ffff
1731var _utf8len = new Array(256);
1732for (var i=0; i<256; i++) {
1733  _utf8len[i] = (i >= 252 ? 6 : i >= 248 ? 5 : i >= 240 ? 4 : i >= 224 ? 3 : i >= 192 ? 2 : 1);
1734}
1735_utf8len[254]=_utf8len[254]=1; // Invalid sequence start
1736
1737// convert string to array (typed, when possible)
1738var string2buf = function (str) {
1739    var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;
1740
1741    // count binary size
1742    for (m_pos = 0; m_pos < str_len; m_pos++) {
1743        c = str.charCodeAt(m_pos);
1744        if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) {
1745            c2 = str.charCodeAt(m_pos+1);
1746            if ((c2 & 0xfc00) === 0xdc00) {
1747                c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);
1748                m_pos++;
1749            }
1750        }
1751        buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;
1752    }
1753
1754    // allocate buffer
1755    if (support.uint8array) {
1756        buf = new Uint8Array(buf_len);
1757    } else {
1758        buf = new Array(buf_len);
1759    }
1760
1761    // convert
1762    for (i=0, m_pos = 0; i < buf_len; m_pos++) {
1763        c = str.charCodeAt(m_pos);
1764        if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) {
1765            c2 = str.charCodeAt(m_pos+1);
1766            if ((c2 & 0xfc00) === 0xdc00) {
1767                c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);
1768                m_pos++;
1769            }
1770        }
1771        if (c < 0x80) {
1772            /* one byte */
1773            buf[i++] = c;
1774        } else if (c < 0x800) {
1775            /* two bytes */
1776            buf[i++] = 0xC0 | (c >>> 6);
1777            buf[i++] = 0x80 | (c & 0x3f);
1778        } else if (c < 0x10000) {
1779            /* three bytes */
1780            buf[i++] = 0xE0 | (c >>> 12);
1781            buf[i++] = 0x80 | (c >>> 6 & 0x3f);
1782            buf[i++] = 0x80 | (c & 0x3f);
1783        } else {
1784            /* four bytes */
1785            buf[i++] = 0xf0 | (c >>> 18);
1786            buf[i++] = 0x80 | (c >>> 12 & 0x3f);
1787            buf[i++] = 0x80 | (c >>> 6 & 0x3f);
1788            buf[i++] = 0x80 | (c & 0x3f);
1789        }
1790    }
1791
1792    return buf;
1793};
1794
1795// Calculate max possible position in utf8 buffer,
1796// that will not break sequence. If that's not possible
1797// - (very small limits) return max size as is.
1798//
1799// buf[] - utf8 bytes array
1800// max   - length limit (mandatory);
1801var utf8border = function(buf, max) {
1802    var pos;
1803
1804    max = max || buf.length;
1805    if (max > buf.length) { max = buf.length; }
1806
1807    // go back from last position, until start of sequence found
1808    pos = max-1;
1809    while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }
1810
1811    // Fuckup - very small and broken sequence,
1812    // return max, because we should return something anyway.
1813    if (pos < 0) { return max; }
1814
1815    // If we came to start of buffer - that means vuffer is too small,
1816    // return max too.
1817    if (pos === 0) { return max; }
1818
1819    return (pos + _utf8len[buf[pos]] > max) ? pos : max;
1820};
1821
1822// convert array to string
1823var buf2string = function (buf) {
1824    var str, i, out, c, c_len;
1825    var len = buf.length;
1826
1827    // Reserve max possible length (2 words per char)
1828    // NB: by unknown reasons, Array is significantly faster for
1829    //     String.fromCharCode.apply than Uint16Array.
1830    var utf16buf = new Array(len*2);
1831
1832    for (out=0, i=0; i<len;) {
1833        c = buf[i++];
1834        // quick process ascii
1835        if (c < 0x80) { utf16buf[out++] = c; continue; }
1836
1837        c_len = _utf8len[c];
1838        // skip 5 & 6 byte codes
1839        if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len-1; continue; }
1840
1841        // apply mask on first byte
1842        c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;
1843        // join the rest
1844        while (c_len > 1 && i < len) {
1845            c = (c << 6) | (buf[i++] & 0x3f);
1846            c_len--;
1847        }
1848
1849        // terminated by end of string?
1850        if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }
1851
1852        if (c < 0x10000) {
1853            utf16buf[out++] = c;
1854        } else {
1855            c -= 0x10000;
1856            utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);
1857            utf16buf[out++] = 0xdc00 | (c & 0x3ff);
1858        }
1859    }
1860
1861    // shrinkBuf(utf16buf, out)
1862    if (utf16buf.length !== out) {
1863        if(utf16buf.subarray) {
1864            utf16buf = utf16buf.subarray(0, out);
1865        } else {
1866            utf16buf.length = out;
1867        }
1868    }
1869
1870    // return String.fromCharCode.apply(null, utf16buf);
1871    return utils.applyFromCharCode(utf16buf);
1872};
1873
1874
1875// That's all for the pako functions.
1876
1877
1878/**
1879 * Transform a javascript string into an array (typed if possible) of bytes,
1880 * UTF-8 encoded.
1881 * @param {String} str the string to encode
1882 * @return {Array|Uint8Array|Buffer} the UTF-8 encoded string.
1883 */
1884exports.utf8encode = function utf8encode(str) {
1885    if (support.nodebuffer) {
1886        return nodeBuffer(str, "utf-8");
1887    }
1888
1889    return string2buf(str);
1890};
1891
1892
1893/**
1894 * Transform a bytes array (or a representation) representing an UTF-8 encoded
1895 * string into a javascript string.
1896 * @param {Array|Uint8Array|Buffer} buf the data de decode
1897 * @return {String} the decoded string.
1898 */
1899exports.utf8decode = function utf8decode(buf) {
1900    if (support.nodebuffer) {
1901        return utils.transformTo("nodebuffer", buf).toString("utf-8");
1902    }
1903
1904    buf = utils.transformTo(support.uint8array ? "uint8array" : "array", buf);
1905
1906    // return buf2string(buf);
1907    // Chrome prefers to work with "small" chunks of data
1908    // for the method buf2string.
1909    // Firefox and Chrome has their own shortcut, IE doesn't seem to really care.
1910    var result = [], k = 0, len = buf.length, chunk = 65536;
1911    while (k < len) {
1912        var nextBoundary = utf8border(buf, Math.min(k + chunk, len));
1913        if (support.uint8array) {
1914            result.push(buf2string(buf.subarray(k, nextBoundary)));
1915        } else {
1916            result.push(buf2string(buf.slice(k, nextBoundary)));
1917        }
1918        k = nextBoundary;
1919    }
1920    return result.join("");
1921
1922};
1923// vim: set shiftwidth=4 softtabstop=4:
1924
1925},{"./nodeBuffer":11,"./support":17,"./utils":21}],21:[function(_dereq_,module,exports){
1926'use strict';
1927var support = _dereq_('./support');
1928var compressions = _dereq_('./compressions');
1929var nodeBuffer = _dereq_('./nodeBuffer');
1930/**
1931 * Convert a string to a "binary string" : a string containing only char codes between 0 and 255.
1932 * @param {string} str the string to transform.
1933 * @return {String} the binary string.
1934 */
1935exports.string2binary = function(str) {
1936    var result = "";
1937    for (var i = 0; i < str.length; i++) {
1938        result += String.fromCharCode(str.charCodeAt(i) & 0xff);
1939    }
1940    return result;
1941};
1942exports.arrayBuffer2Blob = function(buffer, mimeType) {
1943    exports.checkSupport("blob");
1944    mimeType = mimeType || 'application/zip';
1945
1946    try {
1947        // Blob constructor
1948        return new Blob([buffer], {
1949            type: mimeType
1950        });
1951    }
1952    catch (e) {
1953
1954        try {
1955            // deprecated, browser only, old way
1956            var Builder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;
1957            var builder = new Builder();
1958            builder.append(buffer);
1959            return builder.getBlob(mimeType);
1960        }
1961        catch (e) {
1962
1963            // well, fuck ?!
1964            throw new Error("Bug : can't construct the Blob.");
1965        }
1966    }
1967
1968
1969};
1970/**
1971 * The identity function.
1972 * @param {Object} input the input.
1973 * @return {Object} the same input.
1974 */
1975function identity(input) {
1976    return input;
1977}
1978
1979/**
1980 * Fill in an array with a string.
1981 * @param {String} str the string to use.
1982 * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to fill in (will be mutated).
1983 * @return {Array|ArrayBuffer|Uint8Array|Buffer} the updated array.
1984 */
1985function stringToArrayLike(str, array) {
1986    for (var i = 0; i < str.length; ++i) {
1987        array[i] = str.charCodeAt(i) & 0xFF;
1988    }
1989    return array;
1990}
1991
1992/**
1993 * Transform an array-like object to a string.
1994 * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to transform.
1995 * @return {String} the result.
1996 */
1997function arrayLikeToString(array) {
1998    // Performances notes :
1999    // --------------------
2000    // String.fromCharCode.apply(null, array) is the fastest, see
2001    // see http://jsperf.com/converting-a-uint8array-to-a-string/2
2002    // but the stack is limited (and we can get huge arrays !).
2003    //
2004    // result += String.fromCharCode(array[i]); generate too many strings !
2005    //
2006    // This code is inspired by http://jsperf.com/arraybuffer-to-string-apply-performance/2
2007    var chunk = 65536;
2008    var result = [],
2009        len = array.length,
2010        type = exports.getTypeOf(array),
2011        k = 0,
2012        canUseApply = true;
2013      try {
2014         switch(type) {
2015            case "uint8array":
2016               String.fromCharCode.apply(null, new Uint8Array(0));
2017               break;
2018            case "nodebuffer":
2019               String.fromCharCode.apply(null, nodeBuffer(0));
2020               break;
2021         }
2022      } catch(e) {
2023         canUseApply = false;
2024      }
2025
2026      // no apply : slow and painful algorithm
2027      // default browser on android 4.*
2028      if (!canUseApply) {
2029         var resultStr = "";
2030         for(var i = 0; i < array.length;i++) {
2031            resultStr += String.fromCharCode(array[i]);
2032         }
2033    return resultStr;
2034    }
2035    while (k < len && chunk > 1) {
2036        try {
2037            if (type === "array" || type === "nodebuffer") {
2038                result.push(String.fromCharCode.apply(null, array.slice(k, Math.min(k + chunk, len))));
2039            }
2040            else {
2041                result.push(String.fromCharCode.apply(null, array.subarray(k, Math.min(k + chunk, len))));
2042            }
2043            k += chunk;
2044        }
2045        catch (e) {
2046            chunk = Math.floor(chunk / 2);
2047        }
2048    }
2049    return result.join("");
2050}
2051
2052exports.applyFromCharCode = arrayLikeToString;
2053
2054
2055/**
2056 * Copy the data from an array-like to an other array-like.
2057 * @param {Array|ArrayBuffer|Uint8Array|Buffer} arrayFrom the origin array.
2058 * @param {Array|ArrayBuffer|Uint8Array|Buffer} arrayTo the destination array which will be mutated.
2059 * @return {Array|ArrayBuffer|Uint8Array|Buffer} the updated destination array.
2060 */
2061function arrayLikeToArrayLike(arrayFrom, arrayTo) {
2062    for (var i = 0; i < arrayFrom.length; i++) {
2063        arrayTo[i] = arrayFrom[i];
2064    }
2065    return arrayTo;
2066}
2067
2068// a matrix containing functions to transform everything into everything.
2069var transform = {};
2070
2071// string to ?
2072transform["string"] = {
2073    "string": identity,
2074    "array": function(input) {
2075        return stringToArrayLike(input, new Array(input.length));
2076    },
2077    "arraybuffer": function(input) {
2078        return transform["string"]["uint8array"](input).buffer;
2079    },
2080    "uint8array": function(input) {
2081        return stringToArrayLike(input, new Uint8Array(input.length));
2082    },
2083    "nodebuffer": function(input) {
2084        return stringToArrayLike(input, nodeBuffer(input.length));
2085    }
2086};
2087
2088// array to ?
2089transform["array"] = {
2090    "string": arrayLikeToString,
2091    "array": identity,
2092    "arraybuffer": function(input) {
2093        return (new Uint8Array(input)).buffer;
2094    },
2095    "uint8array": function(input) {
2096        return new Uint8Array(input);
2097    },
2098    "nodebuffer": function(input) {
2099        return nodeBuffer(input);
2100    }
2101};
2102
2103// arraybuffer to ?
2104transform["arraybuffer"] = {
2105    "string": function(input) {
2106        return arrayLikeToString(new Uint8Array(input));
2107    },
2108    "array": function(input) {
2109        return arrayLikeToArrayLike(new Uint8Array(input), new Array(input.byteLength));
2110    },
2111    "arraybuffer": identity,
2112    "uint8array": function(input) {
2113        return new Uint8Array(input);
2114    },
2115    "nodebuffer": function(input) {
2116        return nodeBuffer(new Uint8Array(input));
2117    }
2118};
2119
2120// uint8array to ?
2121transform["uint8array"] = {
2122    "string": arrayLikeToString,
2123    "array": function(input) {
2124        return arrayLikeToArrayLike(input, new Array(input.length));
2125    },
2126    "arraybuffer": function(input) {
2127        return input.buffer;
2128    },
2129    "uint8array": identity,
2130    "nodebuffer": function(input) {
2131        return nodeBuffer(input);
2132    }
2133};
2134
2135// nodebuffer to ?
2136transform["nodebuffer"] = {
2137    "string": arrayLikeToString,
2138    "array": function(input) {
2139        return arrayLikeToArrayLike(input, new Array(input.length));
2140    },
2141    "arraybuffer": function(input) {
2142        return transform["nodebuffer"]["uint8array"](input).buffer;
2143    },
2144    "uint8array": function(input) {
2145        return arrayLikeToArrayLike(input, new Uint8Array(input.length));
2146    },
2147    "nodebuffer": identity
2148};
2149
2150/**
2151 * Transform an input into any type.
2152 * The supported output type are : string, array, uint8array, arraybuffer, nodebuffer.
2153 * If no output type is specified, the unmodified input will be returned.
2154 * @param {String} outputType the output type.
2155 * @param {String|Array|ArrayBuffer|Uint8Array|Buffer} input the input to convert.
2156 * @throws {Error} an Error if the browser doesn't support the requested output type.
2157 */
2158exports.transformTo = function(outputType, input) {
2159    if (!input) {
2160        // undefined, null, etc
2161        // an empty string won't harm.
2162        input = "";
2163    }
2164    if (!outputType) {
2165        return input;
2166    }
2167    exports.checkSupport(outputType);
2168    var inputType = exports.getTypeOf(input);
2169    var result = transform[inputType][outputType](input);
2170    return result;
2171};
2172
2173/**
2174 * Return the type of the input.
2175 * The type will be in a format valid for JSZip.utils.transformTo : string, array, uint8array, arraybuffer.
2176 * @param {Object} input the input to identify.
2177 * @return {String} the (lowercase) type of the input.
2178 */
2179exports.getTypeOf = function(input) {
2180    if (typeof input === "string") {
2181        return "string";
2182    }
2183    if (Object.prototype.toString.call(input) === "[object Array]") {
2184        return "array";
2185    }
2186    if (support.nodebuffer && nodeBuffer.test(input)) {
2187        return "nodebuffer";
2188    }
2189    if (support.uint8array && input instanceof Uint8Array) {
2190        return "uint8array";
2191    }
2192    if (support.arraybuffer && input instanceof ArrayBuffer) {
2193        return "arraybuffer";
2194    }
2195};
2196
2197/**
2198 * Throw an exception if the type is not supported.
2199 * @param {String} type the type to check.
2200 * @throws {Error} an Error if the browser doesn't support the requested type.
2201 */
2202exports.checkSupport = function(type) {
2203    var supported = support[type.toLowerCase()];
2204    if (!supported) {
2205        throw new Error(type + " is not supported by this browser");
2206    }
2207};
2208exports.MAX_VALUE_16BITS = 65535;
2209exports.MAX_VALUE_32BITS = -1; // well, "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" is parsed as -1
2210
2211/**
2212 * Prettify a string read as binary.
2213 * @param {string} str the string to prettify.
2214 * @return {string} a pretty string.
2215 */
2216exports.pretty = function(str) {
2217    var res = '',
2218        code, i;
2219    for (i = 0; i < (str || "").length; i++) {
2220        code = str.charCodeAt(i);
2221        res += '\\x' + (code < 16 ? "0" : "") + code.toString(16).toUpperCase();
2222    }
2223    return res;
2224};
2225
2226/**
2227 * Find a compression registered in JSZip.
2228 * @param {string} compressionMethod the method magic to find.
2229 * @return {Object|null} the JSZip compression object, null if none found.
2230 */
2231exports.findCompression = function(compressionMethod) {
2232    for (var method in compressions) {
2233        if (!compressions.hasOwnProperty(method)) {
2234            continue;
2235        }
2236        if (compressions[method].magic === compressionMethod) {
2237            return compressions[method];
2238        }
2239    }
2240    return null;
2241};
2242/**
2243* Cross-window, cross-Node-context regular expression detection
2244* @param  {Object}  object Anything
2245* @return {Boolean}        true if the object is a regular expression,
2246* false otherwise
2247*/
2248exports.isRegExp = function (object) {
2249    return Object.prototype.toString.call(object) === "[object RegExp]";
2250};
2251
2252
2253},{"./compressions":3,"./nodeBuffer":11,"./support":17}],22:[function(_dereq_,module,exports){
2254'use strict';
2255var StringReader = _dereq_('./stringReader');
2256var NodeBufferReader = _dereq_('./nodeBufferReader');
2257var Uint8ArrayReader = _dereq_('./uint8ArrayReader');
2258var utils = _dereq_('./utils');
2259var sig = _dereq_('./signature');
2260var ZipEntry = _dereq_('./zipEntry');
2261var support = _dereq_('./support');
2262var jszipProto = _dereq_('./object');
2263//  class ZipEntries {{{
2264/**
2265 * All the entries in the zip file.
2266 * @constructor
2267 * @param {String|ArrayBuffer|Uint8Array} data the binary stream to load.
2268 * @param {Object} loadOptions Options for loading the stream.
2269 */
2270function ZipEntries(data, loadOptions) {
2271    this.files = [];
2272    this.loadOptions = loadOptions;
2273    if (data) {
2274        this.load(data);
2275    }
2276}
2277ZipEntries.prototype = {
2278    /**
2279     * Check that the reader is on the speficied signature.
2280     * @param {string} expectedSignature the expected signature.
2281     * @throws {Error} if it is an other signature.
2282     */
2283    checkSignature: function(expectedSignature) {
2284        var signature = this.reader.readString(4);
2285        if (signature !== expectedSignature) {
2286            throw new Error("Corrupted zip or bug : unexpected signature " + "(" + utils.pretty(signature) + ", expected " + utils.pretty(expectedSignature) + ")");
2287        }
2288    },
2289    /**
2290     * Read the end of the central directory.
2291     */
2292    readBlockEndOfCentral: function() {
2293        this.diskNumber = this.reader.readInt(2);
2294        this.diskWithCentralDirStart = this.reader.readInt(2);
2295        this.centralDirRecordsOnThisDisk = this.reader.readInt(2);
2296        this.centralDirRecords = this.reader.readInt(2);
2297        this.centralDirSize = this.reader.readInt(4);
2298        this.centralDirOffset = this.reader.readInt(4);
2299
2300        this.zipCommentLength = this.reader.readInt(2);
2301        // warning : the encoding depends of the system locale
2302        // On a linux machine with LANG=en_US.utf8, this field is utf8 encoded.
2303        // On a windows machine, this field is encoded with the localized windows code page.
2304        this.zipComment = this.reader.readString(this.zipCommentLength);
2305        // To get consistent behavior with the generation part, we will assume that
2306        // this is utf8 encoded.
2307        this.zipComment = jszipProto.utf8decode(this.zipComment);
2308    },
2309    /**
2310     * Read the end of the Zip 64 central directory.
2311     * Not merged with the method readEndOfCentral :
2312     * The end of central can coexist with its Zip64 brother,
2313     * I don't want to read the wrong number of bytes !
2314     */
2315    readBlockZip64EndOfCentral: function() {
2316        this.zip64EndOfCentralSize = this.reader.readInt(8);
2317        this.versionMadeBy = this.reader.readString(2);
2318        this.versionNeeded = this.reader.readInt(2);
2319        this.diskNumber = this.reader.readInt(4);
2320        this.diskWithCentralDirStart = this.reader.readInt(4);
2321        this.centralDirRecordsOnThisDisk = this.reader.readInt(8);
2322        this.centralDirRecords = this.reader.readInt(8);
2323        this.centralDirSize = this.reader.readInt(8);
2324        this.centralDirOffset = this.reader.readInt(8);
2325
2326        this.zip64ExtensibleData = {};
2327        var extraDataSize = this.zip64EndOfCentralSize - 44,
2328            index = 0,
2329            extraFieldId,
2330            extraFieldLength,
2331            extraFieldValue;
2332        while (index < extraDataSize) {
2333            extraFieldId = this.reader.readInt(2);
2334            extraFieldLength = this.reader.readInt(4);
2335            extraFieldValue = this.reader.readString(extraFieldLength);
2336            this.zip64ExtensibleData[extraFieldId] = {
2337                id: extraFieldId,
2338                length: extraFieldLength,
2339                value: extraFieldValue
2340            };
2341        }
2342    },
2343    /**
2344     * Read the end of the Zip 64 central directory locator.
2345     */
2346    readBlockZip64EndOfCentralLocator: function() {
2347        this.diskWithZip64CentralDirStart = this.reader.readInt(4);
2348        this.relativeOffsetEndOfZip64CentralDir = this.reader.readInt(8);
2349        this.disksCount = this.reader.readInt(4);
2350        if (this.disksCount > 1) {
2351            throw new Error("Multi-volumes zip are not supported");
2352        }
2353    },
2354    /**
2355     * Read the local files, based on the offset read in the central part.
2356     */
2357    readLocalFiles: function() {
2358        var i, file;
2359        for (i = 0; i < this.files.length; i++) {
2360            file = this.files[i];
2361            this.reader.setIndex(file.localHeaderOffset);
2362            this.checkSignature(sig.LOCAL_FILE_HEADER);
2363            file.readLocalPart(this.reader);
2364            file.handleUTF8();
2365            file.processAttributes();
2366        }
2367    },
2368    /**
2369     * Read the central directory.
2370     */
2371    readCentralDir: function() {
2372        var file;
2373
2374        this.reader.setIndex(this.centralDirOffset);
2375        while (this.reader.readString(4) === sig.CENTRAL_FILE_HEADER) {
2376            file = new ZipEntry({
2377                zip64: this.zip64
2378            }, this.loadOptions);
2379            file.readCentralPart(this.reader);
2380            this.files.push(file);
2381        }
2382    },
2383    /**
2384     * Read the end of central directory.
2385     */
2386    readEndOfCentral: function() {
2387        var offset = this.reader.lastIndexOfSignature(sig.CENTRAL_DIRECTORY_END);
2388        if (offset === -1) {
2389            // Check if the content is a truncated zip or complete garbage.
2390            // A "LOCAL_FILE_HEADER" is not required at the beginning (auto
2391            // extractible zip for example) but it can give a good hint.
2392            // If an ajax request was used without responseType, we will also
2393            // get unreadable data.
2394            var isGarbage = true;
2395            try {
2396                this.reader.setIndex(0);
2397                this.checkSignature(sig.LOCAL_FILE_HEADER);
2398                isGarbage = false;
2399            } catch (e) {}
2400
2401            if (isGarbage) {
2402                throw new Error("Can't find end of central directory : is this a zip file ? " +
2403                                "If it is, see http://stuk.github.io/jszip/documentation/howto/read_zip.html");
2404            } else {
2405                throw new Error("Corrupted zip : can't find end of central directory");
2406            }
2407        }
2408        this.reader.setIndex(offset);
2409        this.checkSignature(sig.CENTRAL_DIRECTORY_END);
2410        this.readBlockEndOfCentral();
2411
2412
2413        /* extract from the zip spec :
2414            4)  If one of the fields in the end of central directory
2415                record is too small to hold required data, the field
2416                should be set to -1 (0xFFFF or 0xFFFFFFFF) and the
2417                ZIP64 format record should be created.
2418            5)  The end of central directory record and the
2419                Zip64 end of central directory locator record must
2420                reside on the same disk when splitting or spanning
2421                an archive.
2422         */
2423        if (this.diskNumber === utils.MAX_VALUE_16BITS || this.diskWithCentralDirStart === utils.MAX_VALUE_16BITS || this.centralDirRecordsOnThisDisk === utils.MAX_VALUE_16BITS || this.centralDirRecords === utils.MAX_VALUE_16BITS || this.centralDirSize === utils.MAX_VALUE_32BITS || this.centralDirOffset === utils.MAX_VALUE_32BITS) {
2424            this.zip64 = true;
2425
2426            /*
2427            Warning : the zip64 extension is supported, but ONLY if the 64bits integer read from
2428            the zip file can fit into a 32bits integer. This cannot be solved : Javascript represents
2429            all numbers as 64-bit double precision IEEE 754 floating point numbers.
2430            So, we have 53bits for integers and bitwise operations treat everything as 32bits.
2431            see https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Bitwise_Operators
2432            and http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf section 8.5
2433            */
2434
2435            // should look for a zip64 EOCD locator
2436            offset = this.reader.lastIndexOfSignature(sig.ZIP64_CENTRAL_DIRECTORY_LOCATOR);
2437            if (offset === -1) {
2438                throw new Error("Corrupted zip : can't find the ZIP64 end of central directory locator");
2439            }
2440            this.reader.setIndex(offset);
2441            this.checkSignature(sig.ZIP64_CENTRAL_DIRECTORY_LOCATOR);
2442            this.readBlockZip64EndOfCentralLocator();
2443
2444            // now the zip64 EOCD record
2445            this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir);
2446            this.checkSignature(sig.ZIP64_CENTRAL_DIRECTORY_END);
2447            this.readBlockZip64EndOfCentral();
2448        }
2449    },
2450    prepareReader: function(data) {
2451        var type = utils.getTypeOf(data);
2452        if (type === "string" && !support.uint8array) {
2453            this.reader = new StringReader(data, this.loadOptions.optimizedBinaryString);
2454        }
2455        else if (type === "nodebuffer") {
2456            this.reader = new NodeBufferReader(data);
2457        }
2458        else {
2459            this.reader = new Uint8ArrayReader(utils.transformTo("uint8array", data));
2460        }
2461    },
2462    /**
2463     * Read a zip file and create ZipEntries.
2464     * @param {String|ArrayBuffer|Uint8Array|Buffer} data the binary string representing a zip file.
2465     */
2466    load: function(data) {
2467        this.prepareReader(data);
2468        this.readEndOfCentral();
2469        this.readCentralDir();
2470        this.readLocalFiles();
2471    }
2472};
2473// }}} end of ZipEntries
2474module.exports = ZipEntries;
2475
2476},{"./nodeBufferReader":12,"./object":13,"./signature":14,"./stringReader":15,"./support":17,"./uint8ArrayReader":18,"./utils":21,"./zipEntry":23}],23:[function(_dereq_,module,exports){
2477'use strict';
2478var StringReader = _dereq_('./stringReader');
2479var utils = _dereq_('./utils');
2480var CompressedObject = _dereq_('./compressedObject');
2481var jszipProto = _dereq_('./object');
2482
2483var MADE_BY_DOS = 0x00;
2484var MADE_BY_UNIX = 0x03;
2485
2486// class ZipEntry {{{
2487/**
2488 * An entry in the zip file.
2489 * @constructor
2490 * @param {Object} options Options of the current file.
2491 * @param {Object} loadOptions Options for loading the stream.
2492 */
2493function ZipEntry(options, loadOptions) {
2494    this.options = options;
2495    this.loadOptions = loadOptions;
2496}
2497ZipEntry.prototype = {
2498    /**
2499     * say if the file is encrypted.
2500     * @return {boolean} true if the file is encrypted, false otherwise.
2501     */
2502    isEncrypted: function() {
2503        // bit 1 is set
2504        return (this.bitFlag & 0x0001) === 0x0001;
2505    },
2506    /**
2507     * say if the file has utf-8 filename/comment.
2508     * @return {boolean} true if the filename/comment is in utf-8, false otherwise.
2509     */
2510    useUTF8: function() {
2511        // bit 11 is set
2512        return (this.bitFlag & 0x0800) === 0x0800;
2513    },
2514    /**
2515     * Prepare the function used to generate the compressed content from this ZipFile.
2516     * @param {DataReader} reader the reader to use.
2517     * @param {number} from the offset from where we should read the data.
2518     * @param {number} length the length of the data to read.
2519     * @return {Function} the callback to get the compressed content (the type depends of the DataReader class).
2520     */
2521    prepareCompressedContent: function(reader, from, length) {
2522        return function() {
2523            var previousIndex = reader.index;
2524            reader.setIndex(from);
2525            var compressedFileData = reader.readData(length);
2526            reader.setIndex(previousIndex);
2527
2528            return compressedFileData;
2529        };
2530    },
2531    /**
2532     * Prepare the function used to generate the uncompressed content from this ZipFile.
2533     * @param {DataReader} reader the reader to use.
2534     * @param {number} from the offset from where we should read the data.
2535     * @param {number} length the length of the data to read.
2536     * @param {JSZip.compression} compression the compression used on this file.
2537     * @param {number} uncompressedSize the uncompressed size to expect.
2538     * @return {Function} the callback to get the uncompressed content (the type depends of the DataReader class).
2539     */
2540    prepareContent: function(reader, from, length, compression, uncompressedSize) {
2541        return function() {
2542
2543            var compressedFileData = utils.transformTo(compression.uncompressInputType, this.getCompressedContent());
2544            var uncompressedFileData = compression.uncompress(compressedFileData);
2545
2546            if (uncompressedFileData.length !== uncompressedSize) {
2547                throw new Error("Bug : uncompressed data size mismatch");
2548            }
2549
2550            return uncompressedFileData;
2551        };
2552    },
2553    /**
2554     * Read the local part of a zip file and add the info in this object.
2555     * @param {DataReader} reader the reader to use.
2556     */
2557    readLocalPart: function(reader) {
2558        var compression, localExtraFieldsLength;
2559
2560        // we already know everything from the central dir !
2561        // If the central dir data are false, we are doomed.
2562        // On the bright side, the local part is scary  : zip64, data descriptors, both, etc.
2563        // The less data we get here, the more reliable this should be.
2564        // Let's skip the whole header and dash to the data !
2565        reader.skip(22);
2566        // in some zip created on windows, the filename stored in the central dir contains \ instead of /.
2567        // Strangely, the filename here is OK.
2568        // I would love to treat these zip files as corrupted (see http://www.info-zip.org/FAQ.html#backslashes
2569        // or APPNOTE#4.4.17.1, "All slashes MUST be forward slashes '/'") but there are a lot of bad zip generators...
2570        // Search "unzip mismatching "local" filename continuing with "central" filename version" on
2571        // the internet.
2572        //
2573        // I think I see the logic here : the central directory is used to display
2574        // content and the local directory is used to extract the files. Mixing / and \
2575        // may be used to display \ to windows users and use / when extracting the files.
2576        // Unfortunately, this lead also to some issues : http://seclists.org/fulldisclosure/2009/Sep/394
2577        this.fileNameLength = reader.readInt(2);
2578        localExtraFieldsLength = reader.readInt(2); // can't be sure this will be the same as the central dir
2579        this.fileName = reader.readString(this.fileNameLength);
2580        reader.skip(localExtraFieldsLength);
2581
2582        if (this.compressedSize == -1 || this.uncompressedSize == -1) {
2583            throw new Error("Bug or corrupted zip : didn't get enough informations from the central directory " + "(compressedSize == -1 || uncompressedSize == -1)");
2584        }
2585
2586        compression = utils.findCompression(this.compressionMethod);
2587        if (compression === null) { // no compression found
2588            throw new Error("Corrupted zip : compression " + utils.pretty(this.compressionMethod) + " unknown (inner file : " + this.fileName + ")");
2589        }
2590        this.decompressed = new CompressedObject();
2591        this.decompressed.compressedSize = this.compressedSize;
2592        this.decompressed.uncompressedSize = this.uncompressedSize;
2593        this.decompressed.crc32 = this.crc32;
2594        this.decompressed.compressionMethod = this.compressionMethod;
2595        this.decompressed.getCompressedContent = this.prepareCompressedContent(reader, reader.index, this.compressedSize, compression);
2596        this.decompressed.getContent = this.prepareContent(reader, reader.index, this.compressedSize, compression, this.uncompressedSize);
2597
2598        // we need to compute the crc32...
2599        if (this.loadOptions.checkCRC32) {
2600            this.decompressed = utils.transformTo("string", this.decompressed.getContent());
2601            if (jszipProto.crc32(this.decompressed) !== this.crc32) {
2602                throw new Error("Corrupted zip : CRC32 mismatch");
2603            }
2604        }
2605    },
2606
2607    /**
2608     * Read the central part of a zip file and add the info in this object.
2609     * @param {DataReader} reader the reader to use.
2610     */
2611    readCentralPart: function(reader) {
2612        this.versionMadeBy = reader.readInt(2);
2613        this.versionNeeded = reader.readInt(2);
2614        this.bitFlag = reader.readInt(2);
2615        this.compressionMethod = reader.readString(2);
2616        this.date = reader.readDate();
2617        this.crc32 = reader.readInt(4);
2618        this.compressedSize = reader.readInt(4);
2619        this.uncompressedSize = reader.readInt(4);
2620        this.fileNameLength = reader.readInt(2);
2621        this.extraFieldsLength = reader.readInt(2);
2622        this.fileCommentLength = reader.readInt(2);
2623        this.diskNumberStart = reader.readInt(2);
2624        this.internalFileAttributes = reader.readInt(2);
2625        this.externalFileAttributes = reader.readInt(4);
2626        this.localHeaderOffset = reader.readInt(4);
2627
2628        if (this.isEncrypted()) {
2629            throw new Error("Encrypted zip are not supported");
2630        }
2631
2632        this.fileName = reader.readString(this.fileNameLength);
2633        this.readExtraFields(reader);
2634        this.parseZIP64ExtraField(reader);
2635        this.fileComment = reader.readString(this.fileCommentLength);
2636    },
2637
2638    /**
2639     * Parse the external file attributes and get the unix/dos permissions.
2640     */
2641    processAttributes: function () {
2642        this.unixPermissions = null;
2643        this.dosPermissions = null;
2644        var madeBy = this.versionMadeBy >> 8;
2645
2646        // Check if we have the DOS directory flag set.
2647        // We look for it in the DOS and UNIX permissions
2648        // but some unknown platform could set it as a compatibility flag.
2649        this.dir = this.externalFileAttributes & 0x0010 ? true : false;
2650
2651        if(madeBy === MADE_BY_DOS) {
2652            // first 6 bits (0 to 5)
2653            this.dosPermissions = this.externalFileAttributes & 0x3F;
2654        }
2655
2656        if(madeBy === MADE_BY_UNIX) {
2657            this.unixPermissions = (this.externalFileAttributes >> 16) & 0xFFFF;
2658            // the octal permissions are in (this.unixPermissions & 0x01FF).toString(8);
2659        }
2660
2661        // fail safe : if the name ends with a / it probably means a folder
2662        if (!this.dir && this.fileName.slice(-1) === '/') {
2663            this.dir = true;
2664        }
2665    },
2666
2667    /**
2668     * Parse the ZIP64 extra field and merge the info in the current ZipEntry.
2669     * @param {DataReader} reader the reader to use.
2670     */
2671    parseZIP64ExtraField: function(reader) {
2672
2673        if (!this.extraFields[0x0001]) {
2674            return;
2675        }
2676
2677        // should be something, preparing the extra reader
2678        var extraReader = new StringReader(this.extraFields[0x0001].value);
2679
2680        // I really hope that these 64bits integer can fit in 32 bits integer, because js
2681        // won't let us have more.
2682        if (this.uncompressedSize === utils.MAX_VALUE_32BITS) {
2683            this.uncompressedSize = extraReader.readInt(8);
2684        }
2685        if (this.compressedSize === utils.MAX_VALUE_32BITS) {
2686            this.compressedSize = extraReader.readInt(8);
2687        }
2688        if (this.localHeaderOffset === utils.MAX_VALUE_32BITS) {
2689            this.localHeaderOffset = extraReader.readInt(8);
2690        }
2691        if (this.diskNumberStart === utils.MAX_VALUE_32BITS) {
2692            this.diskNumberStart = extraReader.readInt(4);
2693        }
2694    },
2695    /**
2696     * Read the central part of a zip file and add the info in this object.
2697     * @param {DataReader} reader the reader to use.
2698     */
2699    readExtraFields: function(reader) {
2700        var start = reader.index,
2701            extraFieldId,
2702            extraFieldLength,
2703            extraFieldValue;
2704
2705        this.extraFields = this.extraFields || {};
2706
2707        while (reader.index < start + this.extraFieldsLength) {
2708            extraFieldId = reader.readInt(2);
2709            extraFieldLength = reader.readInt(2);
2710            extraFieldValue = reader.readString(extraFieldLength);
2711
2712            this.extraFields[extraFieldId] = {
2713                id: extraFieldId,
2714                length: extraFieldLength,
2715                value: extraFieldValue
2716            };
2717        }
2718    },
2719    /**
2720     * Apply an UTF8 transformation if needed.
2721     */
2722    handleUTF8: function() {
2723        if (this.useUTF8()) {
2724            this.fileName = jszipProto.utf8decode(this.fileName);
2725            this.fileComment = jszipProto.utf8decode(this.fileComment);
2726        } else {
2727            var upath = this.findExtraFieldUnicodePath();
2728            if (upath !== null) {
2729                this.fileName = upath;
2730            }
2731            var ucomment = this.findExtraFieldUnicodeComment();
2732            if (ucomment !== null) {
2733                this.fileComment = ucomment;
2734            }
2735        }
2736    },
2737
2738    /**
2739     * Find the unicode path declared in the extra field, if any.
2740     * @return {String} the unicode path, null otherwise.
2741     */
2742    findExtraFieldUnicodePath: function() {
2743        var upathField = this.extraFields[0x7075];
2744        if (upathField) {
2745            var extraReader = new StringReader(upathField.value);
2746
2747            // wrong version
2748            if (extraReader.readInt(1) !== 1) {
2749                return null;
2750            }
2751
2752            // the crc of the filename changed, this field is out of date.
2753            if (jszipProto.crc32(this.fileName) !== extraReader.readInt(4)) {
2754                return null;
2755            }
2756
2757            return jszipProto.utf8decode(extraReader.readString(upathField.length - 5));
2758        }
2759        return null;
2760    },
2761
2762    /**
2763     * Find the unicode comment declared in the extra field, if any.
2764     * @return {String} the unicode comment, null otherwise.
2765     */
2766    findExtraFieldUnicodeComment: function() {
2767        var ucommentField = this.extraFields[0x6375];
2768        if (ucommentField) {
2769            var extraReader = new StringReader(ucommentField.value);
2770
2771            // wrong version
2772            if (extraReader.readInt(1) !== 1) {
2773                return null;
2774            }
2775
2776            // the crc of the comment changed, this field is out of date.
2777            if (jszipProto.crc32(this.fileComment) !== extraReader.readInt(4)) {
2778                return null;
2779            }
2780
2781            return jszipProto.utf8decode(extraReader.readString(ucommentField.length - 5));
2782        }
2783        return null;
2784    }
2785};
2786module.exports = ZipEntry;
2787
2788},{"./compressedObject":2,"./object":13,"./stringReader":15,"./utils":21}],24:[function(_dereq_,module,exports){
2789// Top level file is just a mixin of submodules & constants
2790'use strict';
2791
2792var assign    = _dereq_('./lib/utils/common').assign;
2793
2794var deflate   = _dereq_('./lib/deflate');
2795var inflate   = _dereq_('./lib/inflate');
2796var constants = _dereq_('./lib/zlib/constants');
2797
2798var pako = {};
2799
2800assign(pako, deflate, inflate, constants);
2801
2802module.exports = pako;
2803},{"./lib/deflate":25,"./lib/inflate":26,"./lib/utils/common":27,"./lib/zlib/constants":30}],25:[function(_dereq_,module,exports){
2804'use strict';
2805
2806
2807var zlib_deflate = _dereq_('./zlib/deflate.js');
2808var utils = _dereq_('./utils/common');
2809var strings = _dereq_('./utils/strings');
2810var msg = _dereq_('./zlib/messages');
2811var zstream = _dereq_('./zlib/zstream');
2812
2813
2814/* Public constants ==========================================================*/
2815/* ===========================================================================*/
2816
2817var Z_NO_FLUSH      = 0;
2818var Z_FINISH        = 4;
2819
2820var Z_OK            = 0;
2821var Z_STREAM_END    = 1;
2822
2823var Z_DEFAULT_COMPRESSION = -1;
2824
2825var Z_DEFAULT_STRATEGY    = 0;
2826
2827var Z_DEFLATED  = 8;
2828
2829/* ===========================================================================*/
2830
2831
2832/**
2833 * class Deflate
2834 *
2835 * Generic JS-style wrapper for zlib calls. If you don't need
2836 * streaming behaviour - use more simple functions: [[deflate]],
2837 * [[deflateRaw]] and [[gzip]].
2838 **/
2839
2840/* internal
2841 * Deflate.chunks -> Array
2842 *
2843 * Chunks of output data, if [[Deflate#onData]] not overriden.
2844 **/
2845
2846/**
2847 * Deflate.result -> Uint8Array|Array
2848 *
2849 * Compressed result, generated by default [[Deflate#onData]]
2850 * and [[Deflate#onEnd]] handlers. Filled after you push last chunk
2851 * (call [[Deflate#push]] with `Z_FINISH` / `true` param).
2852 **/
2853
2854/**
2855 * Deflate.err -> Number
2856 *
2857 * Error code after deflate finished. 0 (Z_OK) on success.
2858 * You will not need it in real life, because deflate errors
2859 * are possible only on wrong options or bad `onData` / `onEnd`
2860 * custom handlers.
2861 **/
2862
2863/**
2864 * Deflate.msg -> String
2865 *
2866 * Error message, if [[Deflate.err]] != 0
2867 **/
2868
2869
2870/**
2871 * new Deflate(options)
2872 * - options (Object): zlib deflate options.
2873 *
2874 * Creates new deflator instance with specified params. Throws exception
2875 * on bad params. Supported options:
2876 *
2877 * - `level`
2878 * - `windowBits`
2879 * - `memLevel`
2880 * - `strategy`
2881 *
2882 * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
2883 * for more information on these.
2884 *
2885 * Additional options, for internal needs:
2886 *
2887 * - `chunkSize` - size of generated data chunks (16K by default)
2888 * - `raw` (Boolean) - do raw deflate
2889 * - `gzip` (Boolean) - create gzip wrapper
2890 * - `to` (String) - if equal to 'string', then result will be "binary string"
2891 *    (each char code [0..255])
2892 * - `header` (Object) - custom header for gzip
2893 *   - `text` (Boolean) - true if compressed data believed to be text
2894 *   - `time` (Number) - modification time, unix timestamp
2895 *   - `os` (Number) - operation system code
2896 *   - `extra` (Array) - array of bytes with extra data (max 65536)
2897 *   - `name` (String) - file name (binary string)
2898 *   - `comment` (String) - comment (binary string)
2899 *   - `hcrc` (Boolean) - true if header crc should be added
2900 *
2901 * ##### Example:
2902 *
2903 * ```javascript
2904 * var pako = require('pako')
2905 *   , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])
2906 *   , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);
2907 *
2908 * var deflate = new pako.Deflate({ level: 3});
2909 *
2910 * deflate.push(chunk1, false);
2911 * deflate.push(chunk2, true);  // true -> last chunk
2912 *
2913 * if (deflate.err) { throw new Error(deflate.err); }
2914 *
2915 * console.log(deflate.result);
2916 * ```
2917 **/
2918var Deflate = function(options) {
2919
2920  this.options = utils.assign({
2921    level: Z_DEFAULT_COMPRESSION,
2922    method: Z_DEFLATED,
2923    chunkSize: 16384,
2924    windowBits: 15,
2925    memLevel: 8,
2926    strategy: Z_DEFAULT_STRATEGY,
2927    to: ''
2928  }, options || {});
2929
2930  var opt = this.options;
2931
2932  if (opt.raw && (opt.windowBits > 0)) {
2933    opt.windowBits = -opt.windowBits;
2934  }
2935
2936  else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) {
2937    opt.windowBits += 16;
2938  }
2939
2940  this.err    = 0;      // error code, if happens (0 = Z_OK)
2941  this.msg    = '';     // error message
2942  this.ended  = false;  // used to avoid multiple onEnd() calls
2943  this.chunks = [];     // chunks of compressed data
2944
2945  this.strm = new zstream();
2946  this.strm.avail_out = 0;
2947
2948  var status = zlib_deflate.deflateInit2(
2949    this.strm,
2950    opt.level,
2951    opt.method,
2952    opt.windowBits,
2953    opt.memLevel,
2954    opt.strategy
2955  );
2956
2957  if (status !== Z_OK) {
2958    throw new Error(msg[status]);
2959  }
2960
2961  if (opt.header) {
2962    zlib_deflate.deflateSetHeader(this.strm, opt.header);
2963  }
2964};
2965
2966/**
2967 * Deflate#push(data[, mode]) -> Boolean
2968 * - data (Uint8Array|Array|String): input data. Strings will be converted to
2969 *   utf8 byte sequence.
2970 * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.
2971 *   See constants. Skipped or `false` means Z_NO_FLUSH, `true` meansh Z_FINISH.
2972 *
2973 * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with
2974 * new compressed chunks. Returns `true` on success. The last data block must have
2975 * mode Z_FINISH (or `true`). That flush internal pending buffers and call
2976 * [[Deflate#onEnd]].
2977 *
2978 * On fail call [[Deflate#onEnd]] with error code and return false.
2979 *
2980 * We strongly recommend to use `Uint8Array` on input for best speed (output
2981 * array format is detected automatically). Also, don't skip last param and always
2982 * use the same type in your code (boolean or number). That will improve JS speed.
2983 *
2984 * For regular `Array`-s make sure all elements are [0..255].
2985 *
2986 * ##### Example
2987 *
2988 * ```javascript
2989 * push(chunk, false); // push one of data chunks
2990 * ...
2991 * push(chunk, true);  // push last chunk
2992 * ```
2993 **/
2994Deflate.prototype.push = function(data, mode) {
2995  var strm = this.strm;
2996  var chunkSize = this.options.chunkSize;
2997  var status, _mode;
2998
2999  if (this.ended) { return false; }
3000
3001  _mode = (mode === ~~mode) ? mode : ((mode === true) ? Z_FINISH : Z_NO_FLUSH);
3002
3003  // Convert data if needed
3004  if (typeof data === 'string') {
3005    // If we need to compress text, change encoding to utf8.
3006    strm.input = strings.string2buf(data);
3007  } else {
3008    strm.input = data;
3009  }
3010
3011  strm.next_in = 0;
3012  strm.avail_in = strm.input.length;
3013
3014  do {
3015    if (strm.avail_out === 0) {
3016      strm.output = new utils.Buf8(chunkSize);
3017      strm.next_out = 0;
3018      strm.avail_out = chunkSize;
3019    }
3020    status = zlib_deflate.deflate(strm, _mode);    /* no bad return value */
3021
3022    if (status !== Z_STREAM_END && status !== Z_OK) {
3023      this.onEnd(status);
3024      this.ended = true;
3025      return false;
3026    }
3027    if (strm.avail_out === 0 || (strm.avail_in === 0 && _mode === Z_FINISH)) {
3028      if (this.options.to === 'string') {
3029        this.onData(strings.buf2binstring(utils.shrinkBuf(strm.output, strm.next_out)));
3030      } else {
3031        this.onData(utils.shrinkBuf(strm.output, strm.next_out));
3032      }
3033    }
3034  } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== Z_STREAM_END);
3035
3036  // Finalize on the last chunk.
3037  if (_mode === Z_FINISH) {
3038    status = zlib_deflate.deflateEnd(this.strm);
3039    this.onEnd(status);
3040    this.ended = true;
3041    return status === Z_OK;
3042  }
3043
3044  return true;
3045};
3046
3047
3048/**
3049 * Deflate#onData(chunk) -> Void
3050 * - chunk (Uint8Array|Array|String): ouput data. Type of array depends
3051 *   on js engine support. When string output requested, each chunk
3052 *   will be string.
3053 *
3054 * By default, stores data blocks in `chunks[]` property and glue
3055 * those in `onEnd`. Override this handler, if you need another behaviour.
3056 **/
3057Deflate.prototype.onData = function(chunk) {
3058  this.chunks.push(chunk);
3059};
3060
3061
3062/**
3063 * Deflate#onEnd(status) -> Void
3064 * - status (Number): deflate status. 0 (Z_OK) on success,
3065 *   other if not.
3066 *
3067 * Called once after you tell deflate that input stream complete
3068 * or error happenned. By default - join collected chunks,
3069 * free memory and fill `results` / `err` properties.
3070 **/
3071Deflate.prototype.onEnd = function(status) {
3072  // On success - join
3073  if (status === Z_OK) {
3074    if (this.options.to === 'string') {
3075      this.result = this.chunks.join('');
3076    } else {
3077      this.result = utils.flattenChunks(this.chunks);
3078    }
3079  }
3080  this.chunks = [];
3081  this.err = status;
3082  this.msg = this.strm.msg;
3083};
3084
3085
3086/**
3087 * deflate(data[, options]) -> Uint8Array|Array|String
3088 * - data (Uint8Array|Array|String): input data to compress.
3089 * - options (Object): zlib deflate options.
3090 *
3091 * Compress `data` with deflate alrorythm and `options`.
3092 *
3093 * Supported options are:
3094 *
3095 * - level
3096 * - windowBits
3097 * - memLevel
3098 * - strategy
3099 *
3100 * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
3101 * for more information on these.
3102 *
3103 * Sugar (options):
3104 *
3105 * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify
3106 *   negative windowBits implicitly.
3107 * - `to` (String) - if equal to 'string', then result will be "binary string"
3108 *    (each char code [0..255])
3109 *
3110 * ##### Example:
3111 *
3112 * ```javascript
3113 * var pako = require('pako')
3114 *   , data = Uint8Array([1,2,3,4,5,6,7,8,9]);
3115 *
3116 * console.log(pako.deflate(data));
3117 * ```
3118 **/
3119function deflate(input, options) {
3120  var deflator = new Deflate(options);
3121
3122  deflator.push(input, true);
3123
3124  // That will never happens, if you don't cheat with options :)
3125  if (deflator.err) { throw deflator.msg; }
3126
3127  return deflator.result;
3128}
3129
3130
3131/**
3132 * deflateRaw(data[, options]) -> Uint8Array|Array|String
3133 * - data (Uint8Array|Array|String): input data to compress.
3134 * - options (Object): zlib deflate options.
3135 *
3136 * The same as [[deflate]], but creates raw data, without wrapper
3137 * (header and adler32 crc).
3138 **/
3139function deflateRaw(input, options) {
3140  options = options || {};
3141  options.raw = true;
3142  return deflate(input, options);
3143}
3144
3145
3146/**
3147 * gzip(data[, options]) -> Uint8Array|Array|String
3148 * - data (Uint8Array|Array|String): input data to compress.
3149 * - options (Object): zlib deflate options.
3150 *
3151 * The same as [[deflate]], but create gzip wrapper instead of
3152 * deflate one.
3153 **/
3154function gzip(input, options) {
3155  options = options || {};
3156  options.gzip = true;
3157  return deflate(input, options);
3158}
3159
3160
3161exports.Deflate = Deflate;
3162exports.deflate = deflate;
3163exports.deflateRaw = deflateRaw;
3164exports.gzip = gzip;
3165},{"./utils/common":27,"./utils/strings":28,"./zlib/deflate.js":32,"./zlib/messages":37,"./zlib/zstream":39}],26:[function(_dereq_,module,exports){
3166'use strict';
3167
3168
3169var zlib_inflate = _dereq_('./zlib/inflate.js');
3170var utils = _dereq_('./utils/common');
3171var strings = _dereq_('./utils/strings');
3172var c = _dereq_('./zlib/constants');
3173var msg = _dereq_('./zlib/messages');
3174var zstream = _dereq_('./zlib/zstream');
3175var gzheader = _dereq_('./zlib/gzheader');
3176
3177
3178/**
3179 * class Inflate
3180 *
3181 * Generic JS-style wrapper for zlib calls. If you don't need
3182 * streaming behaviour - use more simple functions: [[inflate]]
3183 * and [[inflateRaw]].
3184 **/
3185
3186/* internal
3187 * inflate.chunks -> Array
3188 *
3189 * Chunks of output data, if [[Inflate#onData]] not overriden.
3190 **/
3191
3192/**
3193 * Inflate.result -> Uint8Array|Array|String
3194 *
3195 * Uncompressed result, generated by default [[Inflate#onData]]
3196 * and [[Inflate#onEnd]] handlers. Filled after you push last chunk
3197 * (call [[Inflate#push]] with `Z_FINISH` / `true` param).
3198 **/
3199
3200/**
3201 * Inflate.err -> Number
3202 *
3203 * Error code after inflate finished. 0 (Z_OK) on success.
3204 * Should be checked if broken data possible.
3205 **/
3206
3207/**
3208 * Inflate.msg -> String
3209 *
3210 * Error message, if [[Inflate.err]] != 0
3211 **/
3212
3213
3214/**
3215 * new Inflate(options)
3216 * - options (Object): zlib inflate options.
3217 *
3218 * Creates new inflator instance with specified params. Throws exception
3219 * on bad params. Supported options:
3220 *
3221 * - `windowBits`
3222 *
3223 * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
3224 * for more information on these.
3225 *
3226 * Additional options, for internal needs:
3227 *
3228 * - `chunkSize` - size of generated data chunks (16K by default)
3229 * - `raw` (Boolean) - do raw inflate
3230 * - `to` (String) - if equal to 'string', then result will be converted
3231 *   from utf8 to utf16 (javascript) string. When string output requested,
3232 *   chunk length can differ from `chunkSize`, depending on content.
3233 *
3234 * By default, when no options set, autodetect deflate/gzip data format via
3235 * wrapper header.
3236 *
3237 * ##### Example:
3238 *
3239 * ```javascript
3240 * var pako = require('pako')
3241 *   , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])
3242 *   , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);
3243 *
3244 * var inflate = new pako.Inflate({ level: 3});
3245 *
3246 * inflate.push(chunk1, false);
3247 * inflate.push(chunk2, true);  // true -> last chunk
3248 *
3249 * if (inflate.err) { throw new Error(inflate.err); }
3250 *
3251 * console.log(inflate.result);
3252 * ```
3253 **/
3254var Inflate = function(options) {
3255
3256  this.options = utils.assign({
3257    chunkSize: 16384,
3258    windowBits: 0,
3259    to: ''
3260  }, options || {});
3261
3262  var opt = this.options;
3263
3264  // Force window size for `raw` data, if not set directly,
3265  // because we have no header for autodetect.
3266  if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) {
3267    opt.windowBits = -opt.windowBits;
3268    if (opt.windowBits === 0) { opt.windowBits = -15; }
3269  }
3270
3271  // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate
3272  if ((opt.windowBits >= 0) && (opt.windowBits < 16) &&
3273      !(options && options.windowBits)) {
3274    opt.windowBits += 32;
3275  }
3276
3277  // Gzip header has no info about windows size, we can do autodetect only
3278  // for deflate. So, if window size not set, force it to max when gzip possible
3279  if ((opt.windowBits > 15) && (opt.windowBits < 48)) {
3280    // bit 3 (16) -> gzipped data
3281    // bit 4 (32) -> autodetect gzip/deflate
3282    if ((opt.windowBits & 15) === 0) {
3283      opt.windowBits |= 15;
3284    }
3285  }
3286
3287  this.err    = 0;      // error code, if happens (0 = Z_OK)
3288  this.msg    = '';     // error message
3289  this.ended  = false;  // used to avoid multiple onEnd() calls
3290  this.chunks = [];     // chunks of compressed data
3291
3292  this.strm   = new zstream();
3293  this.strm.avail_out = 0;
3294
3295  var status  = zlib_inflate.inflateInit2(
3296    this.strm,
3297    opt.windowBits
3298  );
3299
3300  if (status !== c.Z_OK) {
3301    throw new Error(msg[status]);
3302  }
3303
3304  this.header = new gzheader();
3305
3306  zlib_inflate.inflateGetHeader(this.strm, this.header);
3307};
3308
3309/**
3310 * Inflate#push(data[, mode]) -> Boolean
3311 * - data (Uint8Array|Array|String): input data
3312 * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.
3313 *   See constants. Skipped or `false` means Z_NO_FLUSH, `true` meansh Z_FINISH.
3314 *
3315 * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with
3316 * new output chunks. Returns `true` on success. The last data block must have
3317 * mode Z_FINISH (or `true`). That flush internal pending buffers and call
3318 * [[Inflate#onEnd]].
3319 *
3320 * On fail call [[Inflate#onEnd]] with error code and return false.
3321 *
3322 * We strongly recommend to use `Uint8Array` on input for best speed (output
3323 * format is detected automatically). Also, don't skip last param and always
3324 * use the same type in your code (boolean or number). That will improve JS speed.
3325 *
3326 * For regular `Array`-s make sure all elements are [0..255].
3327 *
3328 * ##### Example
3329 *
3330 * ```javascript
3331 * push(chunk, false); // push one of data chunks
3332 * ...
3333 * push(chunk, true);  // push last chunk
3334 * ```
3335 **/
3336Inflate.prototype.push = function(data, mode) {
3337  var strm = this.strm;
3338  var chunkSize = this.options.chunkSize;
3339  var status, _mode;
3340  var next_out_utf8, tail, utf8str;
3341
3342  if (this.ended) { return false; }
3343  _mode = (mode === ~~mode) ? mode : ((mode === true) ? c.Z_FINISH : c.Z_NO_FLUSH);
3344
3345  // Convert data if needed
3346  if (typeof data === 'string') {
3347    // Only binary strings can be decompressed on practice
3348    strm.input = strings.binstring2buf(data);
3349  } else {
3350    strm.input = data;
3351  }
3352
3353  strm.next_in = 0;
3354  strm.avail_in = strm.input.length;
3355
3356  do {
3357    if (strm.avail_out === 0) {
3358      strm.output = new utils.Buf8(chunkSize);
3359      strm.next_out = 0;
3360      strm.avail_out = chunkSize;
3361    }
3362
3363    status = zlib_inflate.inflate(strm, c.Z_NO_FLUSH);    /* no bad return value */
3364
3365    if (status !== c.Z_STREAM_END && status !== c.Z_OK) {
3366      this.onEnd(status);
3367      this.ended = true;
3368      return false;
3369    }
3370
3371    if (strm.next_out) {
3372      if (strm.avail_out === 0 || status === c.Z_STREAM_END || (strm.avail_in === 0 && _mode === c.Z_FINISH)) {
3373
3374        if (this.options.to === 'string') {
3375
3376          next_out_utf8 = strings.utf8border(strm.output, strm.next_out);
3377
3378          tail = strm.next_out - next_out_utf8;
3379          utf8str = strings.buf2string(strm.output, next_out_utf8);
3380
3381          // move tail
3382          strm.next_out = tail;
3383          strm.avail_out = chunkSize - tail;
3384          if (tail) { utils.arraySet(strm.output, strm.output, next_out_utf8, tail, 0); }
3385
3386          this.onData(utf8str);
3387
3388        } else {
3389          this.onData(utils.shrinkBuf(strm.output, strm.next_out));
3390        }
3391      }
3392    }
3393  } while ((strm.avail_in > 0) && status !== c.Z_STREAM_END);
3394
3395  if (status === c.Z_STREAM_END) {
3396    _mode = c.Z_FINISH;
3397  }
3398  // Finalize on the last chunk.
3399  if (_mode === c.Z_FINISH) {
3400    status = zlib_inflate.inflateEnd(this.strm);
3401    this.onEnd(status);
3402    this.ended = true;
3403    return status === c.Z_OK;
3404  }
3405
3406  return true;
3407};
3408
3409
3410/**
3411 * Inflate#onData(chunk) -> Void
3412 * - chunk (Uint8Array|Array|String): ouput data. Type of array depends
3413 *   on js engine support. When string output requested, each chunk
3414 *   will be string.
3415 *
3416 * By default, stores data blocks in `chunks[]` property and glue
3417 * those in `onEnd`. Override this handler, if you need another behaviour.
3418 **/
3419Inflate.prototype.onData = function(chunk) {
3420  this.chunks.push(chunk);
3421};
3422
3423
3424/**
3425 * Inflate#onEnd(status) -> Void
3426 * - status (Number): inflate status. 0 (Z_OK) on success,
3427 *   other if not.
3428 *
3429 * Called once after you tell inflate that input stream complete
3430 * or error happenned. By default - join collected chunks,
3431 * free memory and fill `results` / `err` properties.
3432 **/
3433Inflate.prototype.onEnd = function(status) {
3434  // On success - join
3435  if (status === c.Z_OK) {
3436    if (this.options.to === 'string') {
3437      // Glue & convert here, until we teach pako to send
3438      // utf8 alligned strings to onData
3439      this.result = this.chunks.join('');
3440    } else {
3441      this.result = utils.flattenChunks(this.chunks);
3442    }
3443  }
3444  this.chunks = [];
3445  this.err = status;
3446  this.msg = this.strm.msg;
3447};
3448
3449
3450/**
3451 * inflate(data[, options]) -> Uint8Array|Array|String
3452 * - data (Uint8Array|Array|String): input data to decompress.
3453 * - options (Object): zlib inflate options.
3454 *
3455 * Decompress `data` with inflate/ungzip and `options`. Autodetect
3456 * format via wrapper header by default. That's why we don't provide
3457 * separate `ungzip` method.
3458 *
3459 * Supported options are:
3460 *
3461 * - windowBits
3462 *
3463 * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
3464 * for more information.
3465 *
3466 * Sugar (options):
3467 *
3468 * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify
3469 *   negative windowBits implicitly.
3470 * - `to` (String) - if equal to 'string', then result will be converted
3471 *   from utf8 to utf16 (javascript) string. When string output requested,
3472 *   chunk length can differ from `chunkSize`, depending on content.
3473 *
3474 *
3475 * ##### Example:
3476 *
3477 * ```javascript
3478 * var pako = require('pako')
3479 *   , input = pako.deflate([1,2,3,4,5,6,7,8,9])
3480 *   , output;
3481 *
3482 * try {
3483 *   output = pako.inflate(input);
3484 * } catch (err)
3485 *   console.log(err);
3486 * }
3487 * ```
3488 **/
3489function inflate(input, options) {
3490  var inflator = new Inflate(options);
3491
3492  inflator.push(input, true);
3493
3494  // That will never happens, if you don't cheat with options :)
3495  if (inflator.err) { throw inflator.msg; }
3496
3497  return inflator.result;
3498}
3499
3500
3501/**
3502 * inflateRaw(data[, options]) -> Uint8Array|Array|String
3503 * - data (Uint8Array|Array|String): input data to decompress.
3504 * - options (Object): zlib inflate options.
3505 *
3506 * The same as [[inflate]], but creates raw data, without wrapper
3507 * (header and adler32 crc).
3508 **/
3509function inflateRaw(input, options) {
3510  options = options || {};
3511  options.raw = true;
3512  return inflate(input, options);
3513}
3514
3515
3516/**
3517 * ungzip(data[, options]) -> Uint8Array|Array|String
3518 * - data (Uint8Array|Array|String): input data to decompress.
3519 * - options (Object): zlib inflate options.
3520 *
3521 * Just shortcut to [[inflate]], because it autodetects format
3522 * by header.content. Done for convenience.
3523 **/
3524
3525
3526exports.Inflate = Inflate;
3527exports.inflate = inflate;
3528exports.inflateRaw = inflateRaw;
3529exports.ungzip  = inflate;
3530
3531},{"./utils/common":27,"./utils/strings":28,"./zlib/constants":30,"./zlib/gzheader":33,"./zlib/inflate.js":35,"./zlib/messages":37,"./zlib/zstream":39}],27:[function(_dereq_,module,exports){
3532'use strict';
3533
3534
3535var TYPED_OK =  (typeof Uint8Array !== 'undefined') &&
3536                (typeof Uint16Array !== 'undefined') &&
3537                (typeof Int32Array !== 'undefined');
3538
3539
3540exports.assign = function (obj /*from1, from2, from3, ...*/) {
3541  var sources = Array.prototype.slice.call(arguments, 1);
3542  while (sources.length) {
3543    var source = sources.shift();
3544    if (!source) { continue; }
3545
3546    if (typeof(source) !== 'object') {
3547      throw new TypeError(source + 'must be non-object');
3548    }
3549
3550    for (var p in source) {
3551      if (source.hasOwnProperty(p)) {
3552        obj[p] = source[p];
3553      }
3554    }
3555  }
3556
3557  return obj;
3558};
3559
3560
3561// reduce buffer size, avoiding mem copy
3562exports.shrinkBuf = function (buf, size) {
3563  if (buf.length === size) { return buf; }
3564  if (buf.subarray) { return buf.subarray(0, size); }
3565  buf.length = size;
3566  return buf;
3567};
3568
3569
3570var fnTyped = {
3571  arraySet: function (dest, src, src_offs, len, dest_offs) {
3572    if (src.subarray && dest.subarray) {
3573      dest.set(src.subarray(src_offs, src_offs+len), dest_offs);
3574      return;
3575    }
3576    // Fallback to ordinary array
3577    for(var i=0; i<len; i++) {
3578      dest[dest_offs + i] = src[src_offs + i];
3579    }
3580  },
3581  // Join array of chunks to single array.
3582  flattenChunks: function(chunks) {
3583    var i, l, len, pos, chunk, result;
3584
3585    // calculate data length
3586    len = 0;
3587    for (i=0, l=chunks.length; i<l; i++) {
3588      len += chunks[i].length;
3589    }
3590
3591    // join chunks
3592    result = new Uint8Array(len);
3593    pos = 0;
3594    for (i=0, l=chunks.length; i<l; i++) {
3595      chunk = chunks[i];
3596      result.set(chunk, pos);
3597      pos += chunk.length;
3598    }
3599
3600    return result;
3601  }
3602};
3603
3604var fnUntyped = {
3605  arraySet: function (dest, src, src_offs, len, dest_offs) {
3606    for(var i=0; i<len; i++) {
3607      dest[dest_offs + i] = src[src_offs + i];
3608    }
3609  },
3610  // Join array of chunks to single array.
3611  flattenChunks: function(chunks) {
3612    return [].concat.apply([], chunks);
3613  }
3614};
3615
3616
3617// Enable/Disable typed arrays use, for testing
3618//
3619exports.setTyped = function (on) {
3620  if (on) {
3621    exports.Buf8  = Uint8Array;
3622    exports.Buf16 = Uint16Array;
3623    exports.Buf32 = Int32Array;
3624    exports.assign(exports, fnTyped);
3625  } else {
3626    exports.Buf8  = Array;
3627    exports.Buf16 = Array;
3628    exports.Buf32 = Array;
3629    exports.assign(exports, fnUntyped);
3630  }
3631};
3632
3633exports.setTyped(TYPED_OK);
3634},{}],28:[function(_dereq_,module,exports){
3635// String encode/decode helpers
3636'use strict';
3637
3638
3639var utils = _dereq_('./common');
3640
3641
3642// Quick check if we can use fast array to bin string conversion
3643//
3644// - apply(Array) can fail on Android 2.2
3645// - apply(Uint8Array) can fail on iOS 5.1 Safary
3646//
3647var STR_APPLY_OK = true;
3648var STR_APPLY_UIA_OK = true;
3649
3650try { String.fromCharCode.apply(null, [0]); } catch(__) { STR_APPLY_OK = false; }
3651try { String.fromCharCode.apply(null, new Uint8Array(1)); } catch(__) { STR_APPLY_UIA_OK = false; }
3652
3653
3654// Table with utf8 lengths (calculated by first byte of sequence)
3655// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,
3656// because max possible codepoint is 0x10ffff
3657var _utf8len = new utils.Buf8(256);
3658for (var i=0; i<256; i++) {
3659  _utf8len[i] = (i >= 252 ? 6 : i >= 248 ? 5 : i >= 240 ? 4 : i >= 224 ? 3 : i >= 192 ? 2 : 1);
3660}
3661_utf8len[254]=_utf8len[254]=1; // Invalid sequence start
3662
3663
3664// convert string to array (typed, when possible)
3665exports.string2buf = function (str) {
3666  var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;
3667
3668  // count binary size
3669  for (m_pos = 0; m_pos < str_len; m_pos++) {
3670    c = str.charCodeAt(m_pos);
3671    if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) {
3672      c2 = str.charCodeAt(m_pos+1);
3673      if ((c2 & 0xfc00) === 0xdc00) {
3674        c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);
3675        m_pos++;
3676      }
3677    }
3678    buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;
3679  }
3680
3681  // allocate buffer
3682  buf = new utils.Buf8(buf_len);
3683
3684  // convert
3685  for (i=0, m_pos = 0; i < buf_len; m_pos++) {
3686    c = str.charCodeAt(m_pos);
3687    if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) {
3688      c2 = str.charCodeAt(m_pos+1);
3689      if ((c2 & 0xfc00) === 0xdc00) {
3690        c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);
3691        m_pos++;
3692      }
3693    }
3694    if (c < 0x80) {
3695      /* one byte */
3696      buf[i++] = c;
3697    } else if (c < 0x800) {
3698      /* two bytes */
3699      buf[i++] = 0xC0 | (c >>> 6);
3700      buf[i++] = 0x80 | (c & 0x3f);
3701    } else if (c < 0x10000) {
3702      /* three bytes */
3703      buf[i++] = 0xE0 | (c >>> 12);
3704      buf[i++] = 0x80 | (c >>> 6 & 0x3f);
3705      buf[i++] = 0x80 | (c & 0x3f);
3706    } else {
3707      /* four bytes */
3708      buf[i++] = 0xf0 | (c >>> 18);
3709      buf[i++] = 0x80 | (c >>> 12 & 0x3f);
3710      buf[i++] = 0x80 | (c >>> 6 & 0x3f);
3711      buf[i++] = 0x80 | (c & 0x3f);
3712    }
3713  }
3714
3715  return buf;
3716};
3717
3718// Helper (used in 2 places)
3719function buf2binstring(buf, len) {
3720  // use fallback for big arrays to avoid stack overflow
3721  if (len < 65537) {
3722    if ((buf.subarray && STR_APPLY_UIA_OK) || (!buf.subarray && STR_APPLY_OK)) {
3723      return String.fromCharCode.apply(null, utils.shrinkBuf(buf, len));
3724    }
3725  }
3726
3727  var result = '';
3728  for(var i=0; i < len; i++) {
3729    result += String.fromCharCode(buf[i]);
3730  }
3731  return result;
3732}
3733
3734
3735// Convert byte array to binary string
3736exports.buf2binstring = function(buf) {
3737  return buf2binstring(buf, buf.length);
3738};
3739
3740
3741// Convert binary string (typed, when possible)
3742exports.binstring2buf = function(str) {
3743  var buf = new utils.Buf8(str.length);
3744  for(var i=0, len=buf.length; i < len; i++) {
3745    buf[i] = str.charCodeAt(i);
3746  }
3747  return buf;
3748};
3749
3750
3751// convert array to string
3752exports.buf2string = function (buf, max) {
3753  var i, out, c, c_len;
3754  var len = max || buf.length;
3755
3756  // Reserve max possible length (2 words per char)
3757  // NB: by unknown reasons, Array is significantly faster for
3758  //     String.fromCharCode.apply than Uint16Array.
3759  var utf16buf = new Array(len*2);
3760
3761  for (out=0, i=0; i<len;) {
3762    c = buf[i++];
3763    // quick process ascii
3764    if (c < 0x80) { utf16buf[out++] = c; continue; }
3765
3766    c_len = _utf8len[c];
3767    // skip 5 & 6 byte codes
3768    if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len-1; continue; }
3769
3770    // apply mask on first byte
3771    c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;
3772    // join the rest
3773    while (c_len > 1 && i < len) {
3774      c = (c << 6) | (buf[i++] & 0x3f);
3775      c_len--;
3776    }
3777
3778    // terminated by end of string?
3779    if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }
3780
3781    if (c < 0x10000) {
3782      utf16buf[out++] = c;
3783    } else {
3784      c -= 0x10000;
3785      utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);
3786      utf16buf[out++] = 0xdc00 | (c & 0x3ff);
3787    }
3788  }
3789
3790  return buf2binstring(utf16buf, out);
3791};
3792
3793
3794// Calculate max possible position in utf8 buffer,
3795// that will not break sequence. If that's not possible
3796// - (very small limits) return max size as is.
3797//
3798// buf[] - utf8 bytes array
3799// max   - length limit (mandatory);
3800exports.utf8border = function(buf, max) {
3801  var pos;
3802
3803  max = max || buf.length;
3804  if (max > buf.length) { max = buf.length; }
3805
3806  // go back from last position, until start of sequence found
3807  pos = max-1;
3808  while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }
3809
3810  // Fuckup - very small and broken sequence,
3811  // return max, because we should return something anyway.
3812  if (pos < 0) { return max; }
3813
3814  // If we came to start of buffer - that means vuffer is too small,
3815  // return max too.
3816  if (pos === 0) { return max; }
3817
3818  return (pos + _utf8len[buf[pos]] > max) ? pos : max;
3819};
3820
3821},{"./common":27}],29:[function(_dereq_,module,exports){
3822'use strict';
3823
3824// Note: adler32 takes 12% for level 0 and 2% for level 6.
3825// It doesn't worth to make additional optimizationa as in original.
3826// Small size is preferable.
3827
3828function adler32(adler, buf, len, pos) {
3829  var s1 = (adler & 0xffff) |0
3830    , s2 = ((adler >>> 16) & 0xffff) |0
3831    , n = 0;
3832
3833  while (len !== 0) {
3834    // Set limit ~ twice less than 5552, to keep
3835    // s2 in 31-bits, because we force signed ints.
3836    // in other case %= will fail.
3837    n = len > 2000 ? 2000 : len;
3838    len -= n;
3839
3840    do {
3841      s1 = (s1 + buf[pos++]) |0;
3842      s2 = (s2 + s1) |0;
3843    } while (--n);
3844
3845    s1 %= 65521;
3846    s2 %= 65521;
3847  }
3848
3849  return (s1 | (s2 << 16)) |0;
3850}
3851
3852
3853module.exports = adler32;
3854},{}],30:[function(_dereq_,module,exports){
3855module.exports = {
3856
3857  /* Allowed flush values; see deflate() and inflate() below for details */
3858  Z_NO_FLUSH:         0,
3859  Z_PARTIAL_FLUSH:    1,
3860  Z_SYNC_FLUSH:       2,
3861  Z_FULL_FLUSH:       3,
3862  Z_FINISH:           4,
3863  Z_BLOCK:            5,
3864  Z_TREES:            6,
3865
3866  /* Return codes for the compression/decompression functions. Negative values
3867  * are errors, positive values are used for special but normal events.
3868  */
3869  Z_OK:               0,
3870  Z_STREAM_END:       1,
3871  Z_NEED_DICT:        2,
3872  Z_ERRNO:           -1,
3873  Z_STREAM_ERROR:    -2,
3874  Z_DATA_ERROR:      -3,
3875  //Z_MEM_ERROR:     -4,
3876  Z_BUF_ERROR:       -5,
3877  //Z_VERSION_ERROR: -6,
3878
3879  /* compression levels */
3880  Z_NO_COMPRESSION:         0,
3881  Z_BEST_SPEED:             1,
3882  Z_BEST_COMPRESSION:       9,
3883  Z_DEFAULT_COMPRESSION:   -1,
3884
3885
3886  Z_FILTERED:               1,
3887  Z_HUFFMAN_ONLY:           2,
3888  Z_RLE:                    3,
3889  Z_FIXED:                  4,
3890  Z_DEFAULT_STRATEGY:       0,
3891
3892  /* Possible values of the data_type field (though see inflate()) */
3893  Z_BINARY:                 0,
3894  Z_TEXT:                   1,
3895  //Z_ASCII:                1, // = Z_TEXT (deprecated)
3896  Z_UNKNOWN:                2,
3897
3898  /* The deflate compression method */
3899  Z_DEFLATED:               8
3900  //Z_NULL:                 null // Use -1 or null inline, depending on var type
3901};
3902},{}],31:[function(_dereq_,module,exports){
3903'use strict';
3904
3905// Note: we can't get significant speed boost here.
3906// So write code to minimize size - no pregenerated tables
3907// and array tools dependencies.
3908
3909
3910// Use ordinary array, since untyped makes no boost here
3911function makeTable() {
3912  var c, table = [];
3913
3914  for(var n =0; n < 256; n++){
3915    c = n;
3916    for(var k =0; k < 8; k++){
3917      c = ((c&1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));
3918    }
3919    table[n] = c;
3920  }
3921
3922  return table;
3923}
3924
3925// Create table on load. Just 255 signed longs. Not a problem.
3926var crcTable = makeTable();
3927
3928
3929function crc32(crc, buf, len, pos) {
3930  var t = crcTable
3931    , end = pos + len;
3932
3933  crc = crc ^ (-1);
3934
3935  for (var i = pos; i < end; i++ ) {
3936    crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];
3937  }
3938
3939  return (crc ^ (-1)); // >>> 0;
3940}
3941
3942
3943module.exports = crc32;
3944},{}],32:[function(_dereq_,module,exports){
3945'use strict';
3946
3947var utils   = _dereq_('../utils/common');
3948var trees   = _dereq_('./trees');
3949var adler32 = _dereq_('./adler32');
3950var crc32   = _dereq_('./crc32');
3951var msg   = _dereq_('./messages');
3952
3953/* Public constants ==========================================================*/
3954/* ===========================================================================*/
3955
3956
3957/* Allowed flush values; see deflate() and inflate() below for details */
3958var Z_NO_FLUSH      = 0;
3959var Z_PARTIAL_FLUSH = 1;
3960//var Z_SYNC_FLUSH    = 2;
3961var Z_FULL_FLUSH    = 3;
3962var Z_FINISH        = 4;
3963var Z_BLOCK         = 5;
3964//var Z_TREES         = 6;
3965
3966
3967/* Return codes for the compression/decompression functions. Negative values
3968 * are errors, positive values are used for special but normal events.
3969 */
3970var Z_OK            = 0;
3971var Z_STREAM_END    = 1;
3972//var Z_NEED_DICT     = 2;
3973//var Z_ERRNO         = -1;
3974var Z_STREAM_ERROR  = -2;
3975var Z_DATA_ERROR    = -3;
3976//var Z_MEM_ERROR     = -4;
3977var Z_BUF_ERROR     = -5;
3978//var Z_VERSION_ERROR = -6;
3979
3980
3981/* compression levels */
3982//var Z_NO_COMPRESSION      = 0;
3983//var Z_BEST_SPEED          = 1;
3984//var Z_BEST_COMPRESSION    = 9;
3985var Z_DEFAULT_COMPRESSION = -1;
3986
3987
3988var Z_FILTERED            = 1;
3989var Z_HUFFMAN_ONLY        = 2;
3990var Z_RLE                 = 3;
3991var Z_FIXED               = 4;
3992var Z_DEFAULT_STRATEGY    = 0;
3993
3994/* Possible values of the data_type field (though see inflate()) */
3995//var Z_BINARY              = 0;
3996//var Z_TEXT                = 1;
3997//var Z_ASCII               = 1; // = Z_TEXT
3998var Z_UNKNOWN             = 2;
3999
4000
4001/* The deflate compression method */
4002var Z_DEFLATED  = 8;
4003
4004/*============================================================================*/
4005
4006
4007var MAX_MEM_LEVEL = 9;
4008/* Maximum value for memLevel in deflateInit2 */
4009var MAX_WBITS = 15;
4010/* 32K LZ77 window */
4011var DEF_MEM_LEVEL = 8;
4012
4013
4014var LENGTH_CODES  = 29;
4015/* number of length codes, not counting the special END_BLOCK code */
4016var LITERALS      = 256;
4017/* number of literal bytes 0..255 */
4018var L_CODES       = LITERALS + 1 + LENGTH_CODES;
4019/* number of Literal or Length codes, including the END_BLOCK code */
4020var D_CODES       = 30;
4021/* number of distance codes */
4022var BL_CODES      = 19;
4023/* number of codes used to transfer the bit lengths */
4024var HEAP_SIZE     = 2*L_CODES + 1;
4025/* maximum heap size */
4026var MAX_BITS  = 15;
4027/* All codes must not exceed MAX_BITS bits */
4028
4029var MIN_MATCH = 3;
4030var MAX_MATCH = 258;
4031var MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1);
4032
4033var PRESET_DICT = 0x20;
4034
4035var INIT_STATE = 42;
4036var EXTRA_STATE = 69;
4037var NAME_STATE = 73;
4038var COMMENT_STATE = 91;
4039var HCRC_STATE = 103;
4040var BUSY_STATE = 113;
4041var FINISH_STATE = 666;
4042
4043var BS_NEED_MORE      = 1; /* block not completed, need more input or more output */
4044var BS_BLOCK_DONE     = 2; /* block flush performed */
4045var BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */
4046var BS_FINISH_DONE    = 4; /* finish done, accept no more input or output */
4047
4048var OS_CODE = 0x03; // Unix :) . Don't detect, use this default.
4049
4050function err(strm, errorCode) {
4051  strm.msg = msg[errorCode];
4052  return errorCode;
4053}
4054
4055function rank(f) {
4056  return ((f) << 1) - ((f) > 4 ? 9 : 0);
4057}
4058
4059function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }
4060
4061
4062/* =========================================================================
4063 * Flush as much pending output as possible. All deflate() output goes
4064 * through this function so some applications may wish to modify it
4065 * to avoid allocating a large strm->output buffer and copying into it.
4066 * (See also read_buf()).
4067 */
4068function flush_pending(strm) {
4069  var s = strm.state;
4070
4071  //_tr_flush_bits(s);
4072  var len = s.pending;
4073  if (len > strm.avail_out) {
4074    len = strm.avail_out;
4075  }
4076  if (len === 0) { return; }
4077
4078  utils.arraySet(strm.output, s.pending_buf, s.pending_out, len, strm.next_out);
4079  strm.next_out += len;
4080  s.pending_out += len;
4081  strm.total_out += len;
4082  strm.avail_out -= len;
4083  s.pending -= len;
4084  if (s.pending === 0) {
4085    s.pending_out = 0;
4086  }
4087}
4088
4089
4090function flush_block_only (s, last) {
4091  trees._tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last);
4092  s.block_start = s.strstart;
4093  flush_pending(s.strm);
4094}
4095
4096
4097function put_byte(s, b) {
4098  s.pending_buf[s.pending++] = b;
4099}
4100
4101
4102/* =========================================================================
4103 * Put a short in the pending buffer. The 16-bit value is put in MSB order.
4104 * IN assertion: the stream state is correct and there is enough room in
4105 * pending_buf.
4106 */
4107function putShortMSB(s, b) {
4108//  put_byte(s, (Byte)(b >> 8));
4109//  put_byte(s, (Byte)(b & 0xff));
4110  s.pending_buf[s.pending++] = (b >>> 8) & 0xff;
4111  s.pending_buf[s.pending++] = b & 0xff;
4112}
4113
4114
4115/* ===========================================================================
4116 * Read a new buffer from the current input stream, update the adler32
4117 * and total number of bytes read.  All deflate() input goes through
4118 * this function so some applications may wish to modify it to avoid
4119 * allocating a large strm->input buffer and copying from it.
4120 * (See also flush_pending()).
4121 */
4122function read_buf(strm, buf, start, size) {
4123  var len = strm.avail_in;
4124
4125  if (len > size) { len = size; }
4126  if (len === 0) { return 0; }
4127
4128  strm.avail_in -= len;
4129
4130  utils.arraySet(buf, strm.input, strm.next_in, len, start);
4131  if (strm.state.wrap === 1) {
4132    strm.adler = adler32(strm.adler, buf, len, start);
4133  }
4134
4135  else if (strm.state.wrap === 2) {
4136    strm.adler = crc32(strm.adler, buf, len, start);
4137  }
4138
4139  strm.next_in += len;
4140  strm.total_in += len;
4141
4142  return len;
4143}
4144
4145
4146/* ===========================================================================
4147 * Set match_start to the longest match starting at the given string and
4148 * return its length. Matches shorter or equal to prev_length are discarded,
4149 * in which case the result is equal to prev_length and match_start is
4150 * garbage.
4151 * IN assertions: cur_match is the head of the hash chain for the current
4152 *   string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1
4153 * OUT assertion: the match length is not greater than s->lookahead.
4154 */
4155function longest_match(s, cur_match) {
4156  var chain_length = s.max_chain_length;      /* max hash chain length */
4157  var scan = s.strstart; /* current string */
4158  var match;                       /* matched string */
4159  var len;                           /* length of current match */
4160  var best_len = s.prev_length;              /* best match length so far */
4161  var nice_match = s.nice_match;             /* stop if match long enough */
4162  var limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ?
4163      s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/;
4164
4165  var _win = s.window; // shortcut
4166
4167  var wmask = s.w_mask;
4168  var prev  = s.prev;
4169
4170  /* Stop when cur_match becomes <= limit. To simplify the code,
4171   * we prevent matches with the string of window index 0.
4172   */
4173
4174  var strend = s.strstart + MAX_MATCH;
4175  var scan_end1  = _win[scan + best_len - 1];
4176  var scan_end   = _win[scan + best_len];
4177
4178  /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
4179   * It is easy to get rid of this optimization if necessary.
4180   */
4181  // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
4182
4183  /* Do not waste too much time if we already have a good match: */
4184  if (s.prev_length >= s.good_match) {
4185    chain_length >>= 2;
4186  }
4187  /* Do not look for matches beyond the end of the input. This is necessary
4188   * to make deflate deterministic.
4189   */
4190  if (nice_match > s.lookahead) { nice_match = s.lookahead; }
4191
4192  // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
4193
4194  do {
4195    // Assert(cur_match < s->strstart, "no future");
4196    match = cur_match;
4197
4198    /* Skip to next match if the match length cannot increase
4199     * or if the match length is less than 2.  Note that the checks below
4200     * for insufficient lookahead only occur occasionally for performance
4201     * reasons.  Therefore uninitialized memory will be accessed, and
4202     * conditional jumps will be made that depend on those values.
4203     * However the length of the match is limited to the lookahead, so
4204     * the output of deflate is not affected by the uninitialized values.
4205     */
4206
4207    if (_win[match + best_len]     !== scan_end  ||
4208        _win[match + best_len - 1] !== scan_end1 ||
4209        _win[match]                !== _win[scan] ||
4210        _win[++match]              !== _win[scan + 1]) {
4211      continue;
4212    }
4213
4214    /* The check at best_len-1 can be removed because it will be made
4215     * again later. (This heuristic is not always a win.)
4216     * It is not necessary to compare scan[2] and match[2] since they
4217     * are always equal when the other bytes match, given that
4218     * the hash keys are equal and that HASH_BITS >= 8.
4219     */
4220    scan += 2;
4221    match++;
4222    // Assert(*scan == *match, "match[2]?");
4223
4224    /* We check for insufficient lookahead only every 8th comparison;
4225     * the 256th check will be made at strstart+258.
4226     */
4227    do {
4228      /*jshint noempty:false*/
4229    } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
4230             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
4231             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
4232             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
4233             scan < strend);
4234
4235    // Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
4236
4237    len = MAX_MATCH - (strend - scan);
4238    scan = strend - MAX_MATCH;
4239
4240    if (len > best_len) {
4241      s.match_start = cur_match;
4242      best_len = len;
4243      if (len >= nice_match) {
4244        break;
4245      }
4246      scan_end1  = _win[scan + best_len - 1];
4247      scan_end   = _win[scan + best_len];
4248    }
4249  } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0);
4250
4251  if (best_len <= s.lookahead) {
4252    return best_len;
4253  }
4254  return s.lookahead;
4255}
4256
4257
4258/* ===========================================================================
4259 * Fill the window when the lookahead becomes insufficient.
4260 * Updates strstart and lookahead.
4261 *
4262 * IN assertion: lookahead < MIN_LOOKAHEAD
4263 * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD
4264 *    At least one byte has been read, or avail_in == 0; reads are
4265 *    performed for at least two bytes (required for the zip translate_eol
4266 *    option -- not supported here).
4267 */
4268function fill_window(s) {
4269  var _w_size = s.w_size;
4270  var p, n, m, more, str;
4271
4272  //Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead");
4273
4274  do {
4275    more = s.window_size - s.lookahead - s.strstart;
4276
4277    // JS ints have 32 bit, block below not needed
4278    /* Deal with !@#$% 64K limit: */
4279    //if (sizeof(int) <= 2) {
4280    //    if (more == 0 && s->strstart == 0 && s->lookahead == 0) {
4281    //        more = wsize;
4282    //
4283    //  } else if (more == (unsigned)(-1)) {
4284    //        /* Very unlikely, but possible on 16 bit machine if
4285    //         * strstart == 0 && lookahead == 1 (input done a byte at time)
4286    //         */
4287    //        more--;
4288    //    }
4289    //}
4290
4291
4292    /* If the window is almost full and there is insufficient lookahead,
4293     * move the upper half to the lower one to make room in the upper half.
4294     */
4295    if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) {
4296
4297      utils.arraySet(s.window, s.window, _w_size, _w_size, 0);
4298      s.match_start -= _w_size;
4299      s.strstart -= _w_size;
4300      /* we now have strstart >= MAX_DIST */
4301      s.block_start -= _w_size;
4302
4303      /* Slide the hash table (could be avoided with 32 bit values
4304       at the expense of memory usage). We slide even when level == 0
4305       to keep the hash table consistent if we switch back to level > 0
4306       later. (Using level 0 permanently is not an optimal usage of
4307       zlib, so we don't care about this pathological case.)
4308       */
4309
4310      n = s.hash_size;
4311      p = n;
4312      do {
4313        m = s.head[--p];
4314        s.head[p] = (m >= _w_size ? m - _w_size : 0);
4315      } while (--n);
4316
4317      n = _w_size;
4318      p = n;
4319      do {
4320        m = s.prev[--p];
4321        s.prev[p] = (m >= _w_size ? m - _w_size : 0);
4322        /* If n is not on any hash chain, prev[n] is garbage but
4323         * its value will never be used.
4324         */
4325      } while (--n);
4326
4327      more += _w_size;
4328    }
4329    if (s.strm.avail_in === 0) {
4330      break;
4331    }
4332
4333    /* If there was no sliding:
4334     *    strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&
4335     *    more == window_size - lookahead - strstart
4336     * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)
4337     * => more >= window_size - 2*WSIZE + 2
4338     * In the BIG_MEM or MMAP case (not yet supported),
4339     *   window_size == input_size + MIN_LOOKAHEAD  &&
4340     *   strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.
4341     * Otherwise, window_size == 2*WSIZE so more >= 2.
4342     * If there was sliding, more >= WSIZE. So in all cases, more >= 2.
4343     */
4344    //Assert(more >= 2, "more < 2");
4345    n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more);
4346    s.lookahead += n;
4347
4348    /* Initialize the hash value now that we have some input: */
4349    if (s.lookahead + s.insert >= MIN_MATCH) {
4350      str = s.strstart - s.insert;
4351      s.ins_h = s.window[str];
4352
4353      /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */
4354      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + 1]) & s.hash_mask;
4355//#if MIN_MATCH != 3
4356//        Call update_hash() MIN_MATCH-3 more times
4357//#endif
4358      while (s.insert) {
4359        /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */
4360        s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH-1]) & s.hash_mask;
4361
4362        s.prev[str & s.w_mask] = s.head[s.ins_h];
4363        s.head[s.ins_h] = str;
4364        str++;
4365        s.insert--;
4366        if (s.lookahead + s.insert < MIN_MATCH) {
4367          break;
4368        }
4369      }
4370    }
4371    /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,
4372     * but this is not important since only literal bytes will be emitted.
4373     */
4374
4375  } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0);
4376
4377  /* If the WIN_INIT bytes after the end of the current data have never been
4378   * written, then zero those bytes in order to avoid memory check reports of
4379   * the use of uninitialized (or uninitialised as Julian writes) bytes by
4380   * the longest match routines.  Update the high water mark for the next
4381   * time through here.  WIN_INIT is set to MAX_MATCH since the longest match
4382   * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.
4383   */
4384//  if (s.high_water < s.window_size) {
4385//    var curr = s.strstart + s.lookahead;
4386//    var init = 0;
4387//
4388//    if (s.high_water < curr) {
4389//      /* Previous high water mark below current data -- zero WIN_INIT
4390//       * bytes or up to end of window, whichever is less.
4391//       */
4392//      init = s.window_size - curr;
4393//      if (init > WIN_INIT)
4394//        init = WIN_INIT;
4395//      zmemzero(s->window + curr, (unsigned)init);
4396//      s->high_water = curr + init;
4397//    }
4398//    else if (s->high_water < (ulg)curr + WIN_INIT) {
4399//      /* High water mark at or above current data, but below current data
4400//       * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up
4401//       * to end of window, whichever is less.
4402//       */
4403//      init = (ulg)curr + WIN_INIT - s->high_water;
4404//      if (init > s->window_size - s->high_water)
4405//        init = s->window_size - s->high_water;
4406//      zmemzero(s->window + s->high_water, (unsigned)init);
4407//      s->high_water += init;
4408//    }
4409//  }
4410//
4411//  Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,
4412//    "not enough room for search");
4413}
4414
4415/* ===========================================================================
4416 * Copy without compression as much as possible from the input stream, return
4417 * the current block state.
4418 * This function does not insert new strings in the dictionary since
4419 * uncompressible data is probably not useful. This function is used
4420 * only for the level=0 compression option.
4421 * NOTE: this function should be optimized to avoid extra copying from
4422 * window to pending_buf.
4423 */
4424function deflate_stored(s, flush) {
4425  /* Stored blocks are limited to 0xffff bytes, pending_buf is limited
4426   * to pending_buf_size, and each stored block has a 5 byte header:
4427   */
4428  var max_block_size = 0xffff;
4429
4430  if (max_block_size > s.pending_buf_size - 5) {
4431    max_block_size = s.pending_buf_size - 5;
4432  }
4433
4434  /* Copy as much as possible from input to output: */
4435  for (;;) {
4436    /* Fill the window as much as possible: */
4437    if (s.lookahead <= 1) {
4438
4439      //Assert(s->strstart < s->w_size+MAX_DIST(s) ||
4440      //  s->block_start >= (long)s->w_size, "slide too late");
4441//      if (!(s.strstart < s.w_size + (s.w_size - MIN_LOOKAHEAD) ||
4442//        s.block_start >= s.w_size)) {
4443//        throw  new Error("slide too late");
4444//      }
4445
4446      fill_window(s);
4447      if (s.lookahead === 0 && flush === Z_NO_FLUSH) {
4448        return BS_NEED_MORE;
4449      }
4450
4451      if (s.lookahead === 0) {
4452        break;
4453      }
4454      /* flush the current block */
4455    }
4456    //Assert(s->block_start >= 0L, "block gone");
4457//    if (s.block_start < 0) throw new Error("block gone");
4458
4459    s.strstart += s.lookahead;
4460    s.lookahead = 0;
4461
4462    /* Emit a stored block if pending_buf will be full: */
4463    var max_start = s.block_start + max_block_size;
4464
4465    if (s.strstart === 0 || s.strstart >= max_start) {
4466      /* strstart == 0 is possible when wraparound on 16-bit machine */
4467      s.lookahead = s.strstart - max_start;
4468      s.strstart = max_start;
4469      /*** FLUSH_BLOCK(s, 0); ***/
4470      flush_block_only(s, false);
4471      if (s.strm.avail_out === 0) {
4472        return BS_NEED_MORE;
4473      }
4474      /***/
4475
4476
4477    }
4478    /* Flush if we may have to slide, otherwise block_start may become
4479     * negative and the data will be gone:
4480     */
4481    if (s.strstart - s.block_start >= (s.w_size - MIN_LOOKAHEAD)) {
4482      /*** FLUSH_BLOCK(s, 0); ***/
4483      flush_block_only(s, false);
4484      if (s.strm.avail_out === 0) {
4485        return BS_NEED_MORE;
4486      }
4487      /***/
4488    }
4489  }
4490
4491  s.insert = 0;
4492
4493  if (flush === Z_FINISH) {
4494    /*** FLUSH_BLOCK(s, 1); ***/
4495    flush_block_only(s, true);
4496    if (s.strm.avail_out === 0) {
4497      return BS_FINISH_STARTED;
4498    }
4499    /***/
4500    return BS_FINISH_DONE;
4501  }
4502
4503  if (s.strstart > s.block_start) {
4504    /*** FLUSH_BLOCK(s, 0); ***/
4505    flush_block_only(s, false);
4506    if (s.strm.avail_out === 0) {
4507      return BS_NEED_MORE;
4508    }
4509    /***/
4510  }
4511
4512  return BS_NEED_MORE;
4513}
4514
4515/* ===========================================================================
4516 * Compress as much as possible from the input stream, return the current
4517 * block state.
4518 * This function does not perform lazy evaluation of matches and inserts
4519 * new strings in the dictionary only for unmatched strings or for short
4520 * matches. It is used only for the fast compression options.
4521 */
4522function deflate_fast(s, flush) {
4523  var hash_head;        /* head of the hash chain */
4524  var bflush;           /* set if current block must be flushed */
4525
4526  for (;;) {
4527    /* Make sure that we always have enough lookahead, except
4528     * at the end of the input file. We need MAX_MATCH bytes
4529     * for the next match, plus MIN_MATCH bytes to insert the
4530     * string following the next match.
4531     */
4532    if (s.lookahead < MIN_LOOKAHEAD) {
4533      fill_window(s);
4534      if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {
4535        return BS_NEED_MORE;
4536      }
4537      if (s.lookahead === 0) {
4538        break; /* flush the current block */
4539      }
4540    }
4541
4542    /* Insert the string window[strstart .. strstart+2] in the
4543     * dictionary, and set hash_head to the head of the hash chain:
4544     */
4545    hash_head = 0/*NIL*/;
4546    if (s.lookahead >= MIN_MATCH) {
4547      /*** INSERT_STRING(s, s.strstart, hash_head); ***/
4548      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
4549      hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
4550      s.head[s.ins_h] = s.strstart;
4551      /***/
4552    }
4553
4554    /* Find the longest match, discarding those <= prev_length.
4555     * At this point we have always match_length < MIN_MATCH
4556     */
4557    if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) {
4558      /* To simplify the code, we prevent matches with the string
4559       * of window index 0 (in particular we have to avoid a match
4560       * of the string with itself at the start of the input file).
4561       */
4562      s.match_length = longest_match(s, hash_head);
4563      /* longest_match() sets match_start */
4564    }
4565    if (s.match_length >= MIN_MATCH) {
4566      // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only
4567
4568      /*** _tr_tally_dist(s, s.strstart - s.match_start,
4569                     s.match_length - MIN_MATCH, bflush); ***/
4570      bflush = trees._tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH);
4571
4572      s.lookahead -= s.match_length;
4573
4574      /* Insert new strings in the hash table only if the match length
4575       * is not too large. This saves time but degrades compression.
4576       */
4577      if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) {
4578        s.match_length--; /* string at strstart already in table */
4579        do {
4580          s.strstart++;
4581          /*** INSERT_STRING(s, s.strstart, hash_head); ***/
4582          s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
4583          hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
4584          s.head[s.ins_h] = s.strstart;
4585          /***/
4586          /* strstart never exceeds WSIZE-MAX_MATCH, so there are
4587           * always MIN_MATCH bytes ahead.
4588           */
4589        } while (--s.match_length !== 0);
4590        s.strstart++;
4591      } else
4592      {
4593        s.strstart += s.match_length;
4594        s.match_length = 0;
4595        s.ins_h = s.window[s.strstart];
4596        /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */
4597        s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + 1]) & s.hash_mask;
4598
4599//#if MIN_MATCH != 3
4600//                Call UPDATE_HASH() MIN_MATCH-3 more times
4601//#endif
4602        /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not
4603         * matter since it will be recomputed at next deflate call.
4604         */
4605      }
4606    } else {
4607      /* No match, output a literal byte */
4608      //Tracevv((stderr,"%c", s.window[s.strstart]));
4609      /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
4610      bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
4611
4612      s.lookahead--;
4613      s.strstart++;
4614    }
4615    if (bflush) {
4616      /*** FLUSH_BLOCK(s, 0); ***/
4617      flush_block_only(s, false);
4618      if (s.strm.avail_out === 0) {
4619        return BS_NEED_MORE;
4620      }
4621      /***/
4622    }
4623  }
4624  s.insert = ((s.strstart < (MIN_MATCH-1)) ? s.strstart : MIN_MATCH-1);
4625  if (flush === Z_FINISH) {
4626    /*** FLUSH_BLOCK(s, 1); ***/
4627    flush_block_only(s, true);
4628    if (s.strm.avail_out === 0) {
4629      return BS_FINISH_STARTED;
4630    }
4631    /***/
4632    return BS_FINISH_DONE;
4633  }
4634  if (s.last_lit) {
4635    /*** FLUSH_BLOCK(s, 0); ***/
4636    flush_block_only(s, false);
4637    if (s.strm.avail_out === 0) {
4638      return BS_NEED_MORE;
4639    }
4640    /***/
4641  }
4642  return BS_BLOCK_DONE;
4643}
4644
4645/* ===========================================================================
4646 * Same as above, but achieves better compression. We use a lazy
4647 * evaluation for matches: a match is finally adopted only if there is
4648 * no better match at the next window position.
4649 */
4650function deflate_slow(s, flush) {
4651  var hash_head;          /* head of hash chain */
4652  var bflush;              /* set if current block must be flushed */
4653
4654  var max_insert;
4655
4656  /* Process the input block. */
4657  for (;;) {
4658    /* Make sure that we always have enough lookahead, except
4659     * at the end of the input file. We need MAX_MATCH bytes
4660     * for the next match, plus MIN_MATCH bytes to insert the
4661     * string following the next match.
4662     */
4663    if (s.lookahead < MIN_LOOKAHEAD) {
4664      fill_window(s);
4665      if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {
4666        return BS_NEED_MORE;
4667      }
4668      if (s.lookahead === 0) { break; } /* flush the current block */
4669    }
4670
4671    /* Insert the string window[strstart .. strstart+2] in the
4672     * dictionary, and set hash_head to the head of the hash chain:
4673     */
4674    hash_head = 0/*NIL*/;
4675    if (s.lookahead >= MIN_MATCH) {
4676      /*** INSERT_STRING(s, s.strstart, hash_head); ***/
4677      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
4678      hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
4679      s.head[s.ins_h] = s.strstart;
4680      /***/
4681    }
4682
4683    /* Find the longest match, discarding those <= prev_length.
4684     */
4685    s.prev_length = s.match_length;
4686    s.prev_match = s.match_start;
4687    s.match_length = MIN_MATCH-1;
4688
4689    if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match &&
4690        s.strstart - hash_head <= (s.w_size-MIN_LOOKAHEAD)/*MAX_DIST(s)*/) {
4691      /* To simplify the code, we prevent matches with the string
4692       * of window index 0 (in particular we have to avoid a match
4693       * of the string with itself at the start of the input file).
4694       */
4695      s.match_length = longest_match(s, hash_head);
4696      /* longest_match() sets match_start */
4697
4698      if (s.match_length <= 5 &&
4699         (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) {
4700
4701        /* If prev_match is also MIN_MATCH, match_start is garbage
4702         * but we will ignore the current match anyway.
4703         */
4704        s.match_length = MIN_MATCH-1;
4705      }
4706    }
4707    /* If there was a match at the previous step and the current
4708     * match is not better, output the previous match:
4709     */
4710    if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) {
4711      max_insert = s.strstart + s.lookahead - MIN_MATCH;
4712      /* Do not insert strings in hash table beyond this. */
4713
4714      //check_match(s, s.strstart-1, s.prev_match, s.prev_length);
4715
4716      /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match,
4717                     s.prev_length - MIN_MATCH, bflush);***/
4718      bflush = trees._tr_tally(s, s.strstart - 1- s.prev_match, s.prev_length - MIN_MATCH);
4719      /* Insert in hash table all strings up to the end of the match.
4720       * strstart-1 and strstart are already inserted. If there is not
4721       * enough lookahead, the last two strings are not inserted in
4722       * the hash table.
4723       */
4724      s.lookahead -= s.prev_length-1;
4725      s.prev_length -= 2;
4726      do {
4727        if (++s.strstart <= max_insert) {
4728          /*** INSERT_STRING(s, s.strstart, hash_head); ***/
4729          s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
4730          hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
4731          s.head[s.ins_h] = s.strstart;
4732          /***/
4733        }
4734      } while (--s.prev_length !== 0);
4735      s.match_available = 0;
4736      s.match_length = MIN_MATCH-1;
4737      s.strstart++;
4738
4739      if (bflush) {
4740        /*** FLUSH_BLOCK(s, 0); ***/
4741        flush_block_only(s, false);
4742        if (s.strm.avail_out === 0) {
4743          return BS_NEED_MORE;
4744        }
4745        /***/
4746      }
4747
4748    } else if (s.match_available) {
4749      /* If there was no match at the previous position, output a
4750       * single literal. If there was a match but the current match
4751       * is longer, truncate the previous match to a single literal.
4752       */
4753      //Tracevv((stderr,"%c", s->window[s->strstart-1]));
4754      /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/
4755      bflush = trees._tr_tally(s, 0, s.window[s.strstart-1]);
4756
4757      if (bflush) {
4758        /*** FLUSH_BLOCK_ONLY(s, 0) ***/
4759        flush_block_only(s, false);
4760        /***/
4761      }
4762      s.strstart++;
4763      s.lookahead--;
4764      if (s.strm.avail_out === 0) {
4765        return BS_NEED_MORE;
4766      }
4767    } else {
4768      /* There is no previous match to compare with, wait for
4769       * the next step to decide.
4770       */
4771      s.match_available = 1;
4772      s.strstart++;
4773      s.lookahead--;
4774    }
4775  }
4776  //Assert (flush != Z_NO_FLUSH, "no flush?");
4777  if (s.match_available) {
4778    //Tracevv((stderr,"%c", s->window[s->strstart-1]));
4779    /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/
4780    bflush = trees._tr_tally(s, 0, s.window[s.strstart-1]);
4781
4782    s.match_available = 0;
4783  }
4784  s.insert = s.strstart < MIN_MATCH-1 ? s.strstart : MIN_MATCH-1;
4785  if (flush === Z_FINISH) {
4786    /*** FLUSH_BLOCK(s, 1); ***/
4787    flush_block_only(s, true);
4788    if (s.strm.avail_out === 0) {
4789      return BS_FINISH_STARTED;
4790    }
4791    /***/
4792    return BS_FINISH_DONE;
4793  }
4794  if (s.last_lit) {
4795    /*** FLUSH_BLOCK(s, 0); ***/
4796    flush_block_only(s, false);
4797    if (s.strm.avail_out === 0) {
4798      return BS_NEED_MORE;
4799    }
4800    /***/
4801  }
4802
4803  return BS_BLOCK_DONE;
4804}
4805
4806
4807/* ===========================================================================
4808 * For Z_RLE, simply look for runs of bytes, generate matches only of distance
4809 * one.  Do not maintain a hash table.  (It will be regenerated if this run of
4810 * deflate switches away from Z_RLE.)
4811 */
4812function deflate_rle(s, flush) {
4813  var bflush;            /* set if current block must be flushed */
4814  var prev;              /* byte at distance one to match */
4815  var scan, strend;      /* scan goes up to strend for length of run */
4816
4817  var _win = s.window;
4818
4819  for (;;) {
4820    /* Make sure that we always have enough lookahead, except
4821     * at the end of the input file. We need MAX_MATCH bytes
4822     * for the longest run, plus one for the unrolled loop.
4823     */
4824    if (s.lookahead <= MAX_MATCH) {
4825      fill_window(s);
4826      if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH) {
4827        return BS_NEED_MORE;
4828      }
4829      if (s.lookahead === 0) { break; } /* flush the current block */
4830    }
4831
4832    /* See how many times the previous byte repeats */
4833    s.match_length = 0;
4834    if (s.lookahead >= MIN_MATCH && s.strstart > 0) {
4835      scan = s.strstart - 1;
4836      prev = _win[scan];
4837      if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) {
4838        strend = s.strstart + MAX_MATCH;
4839        do {
4840          /*jshint noempty:false*/
4841        } while (prev === _win[++scan] && prev === _win[++scan] &&
4842                 prev === _win[++scan] && prev === _win[++scan] &&
4843                 prev === _win[++scan] && prev === _win[++scan] &&
4844                 prev === _win[++scan] && prev === _win[++scan] &&
4845                 scan < strend);
4846        s.match_length = MAX_MATCH - (strend - scan);
4847        if (s.match_length > s.lookahead) {
4848          s.match_length = s.lookahead;
4849        }
4850      }
4851      //Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan");
4852    }
4853
4854    /* Emit match if have run of MIN_MATCH or longer, else emit literal */
4855    if (s.match_length >= MIN_MATCH) {
4856      //check_match(s, s.strstart, s.strstart - 1, s.match_length);
4857
4858      /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/
4859      bflush = trees._tr_tally(s, 1, s.match_length - MIN_MATCH);
4860
4861      s.lookahead -= s.match_length;
4862      s.strstart += s.match_length;
4863      s.match_length = 0;
4864    } else {
4865      /* No match, output a literal byte */
4866      //Tracevv((stderr,"%c", s->window[s->strstart]));
4867      /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
4868      bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
4869
4870      s.lookahead--;
4871      s.strstart++;
4872    }
4873    if (bflush) {
4874      /*** FLUSH_BLOCK(s, 0); ***/
4875      flush_block_only(s, false);
4876      if (s.strm.avail_out === 0) {
4877        return BS_NEED_MORE;
4878      }
4879      /***/
4880    }
4881  }
4882  s.insert = 0;
4883  if (flush === Z_FINISH) {
4884    /*** FLUSH_BLOCK(s, 1); ***/
4885    flush_block_only(s, true);
4886    if (s.strm.avail_out === 0) {
4887      return BS_FINISH_STARTED;
4888    }
4889    /***/
4890    return BS_FINISH_DONE;
4891  }
4892  if (s.last_lit) {
4893    /*** FLUSH_BLOCK(s, 0); ***/
4894    flush_block_only(s, false);
4895    if (s.strm.avail_out === 0) {
4896      return BS_NEED_MORE;
4897    }
4898    /***/
4899  }
4900  return BS_BLOCK_DONE;
4901}
4902
4903/* ===========================================================================
4904 * For Z_HUFFMAN_ONLY, do not look for matches.  Do not maintain a hash table.
4905 * (It will be regenerated if this run of deflate switches away from Huffman.)
4906 */
4907function deflate_huff(s, flush) {
4908  var bflush;             /* set if current block must be flushed */
4909
4910  for (;;) {
4911    /* Make sure that we have a literal to write. */
4912    if (s.lookahead === 0) {
4913      fill_window(s);
4914      if (s.lookahead === 0) {
4915        if (flush === Z_NO_FLUSH) {
4916          return BS_NEED_MORE;
4917        }
4918        break;      /* flush the current block */
4919      }
4920    }
4921
4922    /* Output a literal byte */
4923    s.match_length = 0;
4924    //Tracevv((stderr,"%c", s->window[s->strstart]));
4925    /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
4926    bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
4927    s.lookahead--;
4928    s.strstart++;
4929    if (bflush) {
4930      /*** FLUSH_BLOCK(s, 0); ***/
4931      flush_block_only(s, false);
4932      if (s.strm.avail_out === 0) {
4933        return BS_NEED_MORE;
4934      }
4935      /***/
4936    }
4937  }
4938  s.insert = 0;
4939  if (flush === Z_FINISH) {
4940    /*** FLUSH_BLOCK(s, 1); ***/
4941    flush_block_only(s, true);
4942    if (s.strm.avail_out === 0) {
4943      return BS_FINISH_STARTED;
4944    }
4945    /***/
4946    return BS_FINISH_DONE;
4947  }
4948  if (s.last_lit) {
4949    /*** FLUSH_BLOCK(s, 0); ***/
4950    flush_block_only(s, false);
4951    if (s.strm.avail_out === 0) {
4952      return BS_NEED_MORE;
4953    }
4954    /***/
4955  }
4956  return BS_BLOCK_DONE;
4957}
4958
4959/* Values for max_lazy_match, good_match and max_chain_length, depending on
4960 * the desired pack level (0..9). The values given below have been tuned to
4961 * exclude worst case performance for pathological files. Better values may be
4962 * found for specific files.
4963 */
4964var Config = function (good_length, max_lazy, nice_length, max_chain, func) {
4965  this.good_length = good_length;
4966  this.max_lazy = max_lazy;
4967  this.nice_length = nice_length;
4968  this.max_chain = max_chain;
4969  this.func = func;
4970};
4971
4972var configuration_table;
4973
4974configuration_table = [
4975  /*      good lazy nice chain */
4976  new Config(0, 0, 0, 0, deflate_stored),          /* 0 store only */
4977  new Config(4, 4, 8, 4, deflate_fast),            /* 1 max speed, no lazy matches */
4978  new Config(4, 5, 16, 8, deflate_fast),           /* 2 */
4979  new Config(4, 6, 32, 32, deflate_fast),          /* 3 */
4980
4981  new Config(4, 4, 16, 16, deflate_slow),          /* 4 lazy matches */
4982  new Config(8, 16, 32, 32, deflate_slow),         /* 5 */
4983  new Config(8, 16, 128, 128, deflate_slow),       /* 6 */
4984  new Config(8, 32, 128, 256, deflate_slow),       /* 7 */
4985  new Config(32, 128, 258, 1024, deflate_slow),    /* 8 */
4986  new Config(32, 258, 258, 4096, deflate_slow)     /* 9 max compression */
4987];
4988
4989
4990/* ===========================================================================
4991 * Initialize the "longest match" routines for a new zlib stream
4992 */
4993function lm_init(s) {
4994  s.window_size = 2 * s.w_size;
4995
4996  /*** CLEAR_HASH(s); ***/
4997  zero(s.head); // Fill with NIL (= 0);
4998
4999  /* Set the default configuration parameters:
5000   */
5001  s.max_lazy_match = configuration_table[s.level].max_lazy;
5002  s.good_match = configuration_table[s.level].good_length;
5003  s.nice_match = configuration_table[s.level].nice_length;
5004  s.max_chain_length = configuration_table[s.level].max_chain;
5005
5006  s.strstart = 0;
5007  s.block_start = 0;
5008  s.lookahead = 0;
5009  s.insert = 0;
5010  s.match_length = s.prev_length = MIN_MATCH - 1;
5011  s.match_available = 0;
5012  s.ins_h = 0;
5013}
5014
5015
5016function DeflateState() {
5017  this.strm = null;            /* pointer back to this zlib stream */
5018  this.status = 0;            /* as the name implies */
5019  this.pending_buf = null;      /* output still pending */
5020  this.pending_buf_size = 0;  /* size of pending_buf */
5021  this.pending_out = 0;       /* next pending byte to output to the stream */
5022  this.pending = 0;           /* nb of bytes in the pending buffer */
5023  this.wrap = 0;              /* bit 0 true for zlib, bit 1 true for gzip */
5024  this.gzhead = null;         /* gzip header information to write */
5025  this.gzindex = 0;           /* where in extra, name, or comment */
5026  this.method = Z_DEFLATED; /* can only be DEFLATED */
5027  this.last_flush = -1;   /* value of flush param for previous deflate call */
5028
5029  this.w_size = 0;  /* LZ77 window size (32K by default) */
5030  this.w_bits = 0;  /* log2(w_size)  (8..16) */
5031  this.w_mask = 0;  /* w_size - 1 */
5032
5033  this.window = null;
5034  /* Sliding window. Input bytes are read into the second half of the window,
5035   * and move to the first half later to keep a dictionary of at least wSize
5036   * bytes. With this organization, matches are limited to a distance of
5037   * wSize-MAX_MATCH bytes, but this ensures that IO is always
5038   * performed with a length multiple of the block size.
5039   */
5040
5041  this.window_size = 0;
5042  /* Actual size of window: 2*wSize, except when the user input buffer
5043   * is directly used as sliding window.
5044   */
5045
5046  this.prev = null;
5047  /* Link to older string with same hash index. To limit the size of this
5048   * array to 64K, this link is maintained only for the last 32K strings.
5049   * An index in this array is thus a window index modulo 32K.
5050   */
5051
5052  this.head = null;   /* Heads of the hash chains or NIL. */
5053
5054  this.ins_h = 0;       /* hash index of string to be inserted */
5055  this.hash_size = 0;   /* number of elements in hash table */
5056  this.hash_bits = 0;   /* log2(hash_size) */
5057  this.hash_mask = 0;   /* hash_size-1 */
5058
5059  this.hash_shift = 0;
5060  /* Number of bits by which ins_h must be shifted at each input
5061   * step. It must be such that after MIN_MATCH steps, the oldest
5062   * byte no longer takes part in the hash key, that is:
5063   *   hash_shift * MIN_MATCH >= hash_bits
5064   */
5065
5066  this.block_start = 0;
5067  /* Window position at the beginning of the current output block. Gets
5068   * negative when the window is moved backwards.
5069   */
5070
5071  this.match_length = 0;      /* length of best match */
5072  this.prev_match = 0;        /* previous match */
5073  this.match_available = 0;   /* set if previous match exists */
5074  this.strstart = 0;          /* start of string to insert */
5075  this.match_start = 0;       /* start of matching string */
5076  this.lookahead = 0;         /* number of valid bytes ahead in window */
5077
5078  this.prev_length = 0;
5079  /* Length of the best match at previous step. Matches not greater than this
5080   * are discarded. This is used in the lazy match evaluation.
5081   */
5082
5083  this.max_chain_length = 0;
5084  /* To speed up deflation, hash chains are never searched beyond this
5085   * length.  A higher limit improves compression ratio but degrades the
5086   * speed.
5087   */
5088
5089  this.max_lazy_match = 0;
5090  /* Attempt to find a better match only when the current match is strictly
5091   * smaller than this value. This mechanism is used only for compression
5092   * levels >= 4.
5093   */
5094  // That's alias to max_lazy_match, don't use directly
5095  //this.max_insert_length = 0;
5096  /* Insert new strings in the hash table only if the match length is not
5097   * greater than this length. This saves time but degrades compression.
5098   * max_insert_length is used only for compression levels <= 3.
5099   */
5100
5101  this.level = 0;     /* compression level (1..9) */
5102  this.strategy = 0;  /* favor or force Huffman coding*/
5103
5104  this.good_match = 0;
5105  /* Use a faster search when the previous match is longer than this */
5106
5107  this.nice_match = 0; /* Stop searching when current match exceeds this */
5108
5109              /* used by trees.c: */
5110
5111  /* Didn't use ct_data typedef below to suppress compiler warning */
5112
5113  // struct ct_data_s dyn_ltree[HEAP_SIZE];   /* literal and length tree */
5114  // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */
5115  // struct ct_data_s bl_tree[2*BL_CODES+1];  /* Huffman tree for bit lengths */
5116
5117  // Use flat array of DOUBLE size, with interleaved fata,
5118  // because JS does not support effective
5119  this.dyn_ltree  = new utils.Buf16(HEAP_SIZE * 2);
5120  this.dyn_dtree  = new utils.Buf16((2*D_CODES+1) * 2);
5121  this.bl_tree    = new utils.Buf16((2*BL_CODES+1) * 2);
5122  zero(this.dyn_ltree);
5123  zero(this.dyn_dtree);
5124  zero(this.bl_tree);
5125
5126  this.l_desc   = null;         /* desc. for literal tree */
5127  this.d_desc   = null;         /* desc. for distance tree */
5128  this.bl_desc  = null;         /* desc. for bit length tree */
5129
5130  //ush bl_count[MAX_BITS+1];
5131  this.bl_count = new utils.Buf16(MAX_BITS+1);
5132  /* number of codes at each bit length for an optimal tree */
5133
5134  //int heap[2*L_CODES+1];      /* heap used to build the Huffman trees */
5135  this.heap = new utils.Buf16(2*L_CODES+1);  /* heap used to build the Huffman trees */
5136  zero(this.heap);
5137
5138  this.heap_len = 0;               /* number of elements in the heap */
5139  this.heap_max = 0;               /* element of largest frequency */
5140  /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.
5141   * The same heap array is used to build all trees.
5142   */
5143
5144  this.depth = new utils.Buf16(2*L_CODES+1); //uch depth[2*L_CODES+1];
5145  zero(this.depth);
5146  /* Depth of each subtree used as tie breaker for trees of equal frequency
5147   */
5148
5149  this.l_buf = 0;          /* buffer index for literals or lengths */
5150
5151  this.lit_bufsize = 0;
5152  /* Size of match buffer for literals/lengths.  There are 4 reasons for
5153   * limiting lit_bufsize to 64K:
5154   *   - frequencies can be kept in 16 bit counters
5155   *   - if compression is not successful for the first block, all input
5156   *     data is still in the window so we can still emit a stored block even
5157   *     when input comes from standard input.  (This can also be done for
5158   *     all blocks if lit_bufsize is not greater than 32K.)
5159   *   - if compression is not successful for a file smaller than 64K, we can
5160   *     even emit a stored file instead of a stored block (saving 5 bytes).
5161   *     This is applicable only for zip (not gzip or zlib).
5162   *   - creating new Huffman trees less frequently may not provide fast
5163   *     adaptation to changes in the input data statistics. (Take for
5164   *     example a binary file with poorly compressible code followed by
5165   *     a highly compressible string table.) Smaller buffer sizes give
5166   *     fast adaptation but have of course the overhead of transmitting
5167   *     trees more frequently.
5168   *   - I can't count above 4
5169   */
5170
5171  this.last_lit = 0;      /* running index in l_buf */
5172
5173  this.d_buf = 0;
5174  /* Buffer index for distances. To simplify the code, d_buf and l_buf have
5175   * the same number of elements. To use different lengths, an extra flag
5176   * array would be necessary.
5177   */
5178
5179  this.opt_len = 0;       /* bit length of current block with optimal trees */
5180  this.static_len = 0;    /* bit length of current block with static trees */
5181  this.matches = 0;       /* number of string matches in current block */
5182  this.insert = 0;        /* bytes at end of window left to insert */
5183
5184
5185  this.bi_buf = 0;
5186  /* Output buffer. bits are inserted starting at the bottom (least
5187   * significant bits).
5188   */
5189  this.bi_valid = 0;
5190  /* Number of valid bits in bi_buf.  All bits above the last valid bit
5191   * are always zero.
5192   */
5193
5194  // Used for window memory init. We safely ignore it for JS. That makes
5195  // sense only for pointers and memory check tools.
5196  //this.high_water = 0;
5197  /* High water mark offset in window for initialized bytes -- bytes above
5198   * this are set to zero in order to avoid memory check warnings when
5199   * longest match routines access bytes past the input.  This is then
5200   * updated to the new high water mark.
5201   */
5202}
5203
5204
5205function deflateResetKeep(strm) {
5206  var s;
5207
5208  if (!strm || !strm.state) {
5209    return err(strm, Z_STREAM_ERROR);
5210  }
5211
5212  strm.total_in = strm.total_out = 0;
5213  strm.data_type = Z_UNKNOWN;
5214
5215  s = strm.state;
5216  s.pending = 0;
5217  s.pending_out = 0;
5218
5219  if (s.wrap < 0) {
5220    s.wrap = -s.wrap;
5221    /* was made negative by deflate(..., Z_FINISH); */
5222  }
5223  s.status = (s.wrap ? INIT_STATE : BUSY_STATE);
5224  strm.adler = (s.wrap === 2) ?
5225    0  // crc32(0, Z_NULL, 0)
5226  :
5227    1; // adler32(0, Z_NULL, 0)
5228  s.last_flush = Z_NO_FLUSH;
5229  trees._tr_init(s);
5230  return Z_OK;
5231}
5232
5233
5234function deflateReset(strm) {
5235  var ret = deflateResetKeep(strm);
5236  if (ret === Z_OK) {
5237    lm_init(strm.state);
5238  }
5239  return ret;
5240}
5241
5242
5243function deflateSetHeader(strm, head) {
5244  if (!strm || !strm.state) { return Z_STREAM_ERROR; }
5245  if (strm.state.wrap !== 2) { return Z_STREAM_ERROR; }
5246  strm.state.gzhead = head;
5247  return Z_OK;
5248}
5249
5250
5251function deflateInit2(strm, level, method, windowBits, memLevel, strategy) {
5252  if (!strm) { // === Z_NULL
5253    return Z_STREAM_ERROR;
5254  }
5255  var wrap = 1;
5256
5257  if (level === Z_DEFAULT_COMPRESSION) {
5258    level = 6;
5259  }
5260
5261  if (windowBits < 0) { /* suppress zlib wrapper */
5262    wrap = 0;
5263    windowBits = -windowBits;
5264  }
5265
5266  else if (windowBits > 15) {
5267    wrap = 2;           /* write gzip wrapper instead */
5268    windowBits -= 16;
5269  }
5270
5271
5272  if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED ||
5273    windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||
5274    strategy < 0 || strategy > Z_FIXED) {
5275    return err(strm, Z_STREAM_ERROR);
5276  }
5277
5278
5279  if (windowBits === 8) {
5280    windowBits = 9;
5281  }
5282  /* until 256-byte window bug fixed */
5283
5284  var s = new DeflateState();
5285
5286  strm.state = s;
5287  s.strm = strm;
5288
5289  s.wrap = wrap;
5290  s.gzhead = null;
5291  s.w_bits = windowBits;
5292  s.w_size = 1 << s.w_bits;
5293  s.w_mask = s.w_size - 1;
5294
5295  s.hash_bits = memLevel + 7;
5296  s.hash_size = 1 << s.hash_bits;
5297  s.hash_mask = s.hash_size - 1;
5298  s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH);
5299
5300  s.window = new utils.Buf8(s.w_size * 2);
5301  s.head = new utils.Buf16(s.hash_size);
5302  s.prev = new utils.Buf16(s.w_size);
5303
5304  // Don't need mem init magic for JS.
5305  //s.high_water = 0;  /* nothing written to s->window yet */
5306
5307  s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */
5308
5309  s.pending_buf_size = s.lit_bufsize * 4;
5310  s.pending_buf = new utils.Buf8(s.pending_buf_size);
5311
5312  s.d_buf = s.lit_bufsize >> 1;
5313  s.l_buf = (1 + 2) * s.lit_bufsize;
5314
5315  s.level = level;
5316  s.strategy = strategy;
5317  s.method = method;
5318
5319  return deflateReset(strm);
5320}
5321
5322function deflateInit(strm, level) {
5323  return deflateInit2(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY);
5324}
5325
5326
5327function deflate(strm, flush) {
5328  var old_flush, s;
5329  var beg, val; // for gzip header write only
5330
5331  if (!strm || !strm.state ||
5332    flush > Z_BLOCK || flush < 0) {
5333    return strm ? err(strm, Z_STREAM_ERROR) : Z_STREAM_ERROR;
5334  }
5335
5336  s = strm.state;
5337
5338  if (!strm.output ||
5339      (!strm.input && strm.avail_in !== 0) ||
5340      (s.status === FINISH_STATE && flush !== Z_FINISH)) {
5341    return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR : Z_STREAM_ERROR);
5342  }
5343
5344  s.strm = strm; /* just in case */
5345  old_flush = s.last_flush;
5346  s.last_flush = flush;
5347
5348  /* Write the header */
5349  if (s.status === INIT_STATE) {
5350
5351    if (s.wrap === 2) { // GZIP header
5352      strm.adler = 0;  //crc32(0L, Z_NULL, 0);
5353      put_byte(s, 31);
5354      put_byte(s, 139);
5355      put_byte(s, 8);
5356      if (!s.gzhead) { // s->gzhead == Z_NULL
5357        put_byte(s, 0);
5358        put_byte(s, 0);
5359        put_byte(s, 0);
5360        put_byte(s, 0);
5361        put_byte(s, 0);
5362        put_byte(s, s.level === 9 ? 2 :
5363                    (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?
5364                     4 : 0));
5365        put_byte(s, OS_CODE);
5366        s.status = BUSY_STATE;
5367      }
5368      else {
5369        put_byte(s, (s.gzhead.text ? 1 : 0) +
5370                    (s.gzhead.hcrc ? 2 : 0) +
5371                    (!s.gzhead.extra ? 0 : 4) +
5372                    (!s.gzhead.name ? 0 : 8) +
5373                    (!s.gzhead.comment ? 0 : 16)
5374                );
5375        put_byte(s, s.gzhead.time & 0xff);
5376        put_byte(s, (s.gzhead.time >> 8) & 0xff);
5377        put_byte(s, (s.gzhead.time >> 16) & 0xff);
5378        put_byte(s, (s.gzhead.time >> 24) & 0xff);
5379        put_byte(s, s.level === 9 ? 2 :
5380                    (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?
5381                     4 : 0));
5382        put_byte(s, s.gzhead.os & 0xff);
5383        if (s.gzhead.extra && s.gzhead.extra.length) {
5384          put_byte(s, s.gzhead.extra.length & 0xff);
5385          put_byte(s, (s.gzhead.extra.length >> 8) & 0xff);
5386        }
5387        if (s.gzhead.hcrc) {
5388          strm.adler = crc32(strm.adler, s.pending_buf, s.pending, 0);
5389        }
5390        s.gzindex = 0;
5391        s.status = EXTRA_STATE;
5392      }
5393    }
5394    else // DEFLATE header
5395    {
5396      var header = (Z_DEFLATED + ((s.w_bits - 8) << 4)) << 8;
5397      var level_flags = -1;
5398
5399      if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) {
5400        level_flags = 0;
5401      } else if (s.level < 6) {
5402        level_flags = 1;
5403      } else if (s.level === 6) {
5404        level_flags = 2;
5405      } else {
5406        level_flags = 3;
5407      }
5408      header |= (level_flags << 6);
5409      if (s.strstart !== 0) { header |= PRESET_DICT; }
5410      header += 31 - (header % 31);
5411
5412      s.status = BUSY_STATE;
5413      putShortMSB(s, header);
5414
5415      /* Save the adler32 of the preset dictionary: */
5416      if (s.strstart !== 0) {
5417        putShortMSB(s, strm.adler >>> 16);
5418        putShortMSB(s, strm.adler & 0xffff);
5419      }
5420      strm.adler = 1; // adler32(0L, Z_NULL, 0);
5421    }
5422  }
5423
5424//#ifdef GZIP
5425  if (s.status === EXTRA_STATE) {
5426    if (s.gzhead.extra/* != Z_NULL*/) {
5427      beg = s.pending;  /* start of bytes to update crc */
5428
5429      while (s.gzindex < (s.gzhead.extra.length & 0xffff)) {
5430        if (s.pending === s.pending_buf_size) {
5431          if (s.gzhead.hcrc && s.pending > beg) {
5432            strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
5433          }
5434          flush_pending(strm);
5435          beg = s.pending;
5436          if (s.pending === s.pending_buf_size) {
5437            break;
5438          }
5439        }
5440        put_byte(s, s.gzhead.extra[s.gzindex] & 0xff);
5441        s.gzindex++;
5442      }
5443      if (s.gzhead.hcrc && s.pending > beg) {
5444        strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
5445      }
5446      if (s.gzindex === s.gzhead.extra.length) {
5447        s.gzindex = 0;
5448        s.status = NAME_STATE;
5449      }
5450    }
5451    else {
5452      s.status = NAME_STATE;
5453    }
5454  }
5455  if (s.status === NAME_STATE) {
5456    if (s.gzhead.name/* != Z_NULL*/) {
5457      beg = s.pending;  /* start of bytes to update crc */
5458      //int val;
5459
5460      do {
5461        if (s.pending === s.pending_buf_size) {
5462          if (s.gzhead.hcrc && s.pending > beg) {
5463            strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
5464          }
5465          flush_pending(strm);
5466          beg = s.pending;
5467          if (s.pending === s.pending_buf_size) {
5468            val = 1;
5469            break;
5470          }
5471        }
5472        // JS specific: little magic to add zero terminator to end of string
5473        if (s.gzindex < s.gzhead.name.length) {
5474          val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff;
5475        } else {
5476          val = 0;
5477        }
5478        put_byte(s, val);
5479      } while (val !== 0);
5480
5481      if (s.gzhead.hcrc && s.pending > beg){
5482        strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
5483      }
5484      if (val === 0) {
5485        s.gzindex = 0;
5486        s.status = COMMENT_STATE;
5487      }
5488    }
5489    else {
5490      s.status = COMMENT_STATE;
5491    }
5492  }
5493  if (s.status === COMMENT_STATE) {
5494    if (s.gzhead.comment/* != Z_NULL*/) {
5495      beg = s.pending;  /* start of bytes to update crc */
5496      //int val;
5497
5498      do {
5499        if (s.pending === s.pending_buf_size) {
5500          if (s.gzhead.hcrc && s.pending > beg) {
5501            strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
5502          }
5503          flush_pending(strm);
5504          beg = s.pending;
5505          if (s.pending === s.pending_buf_size) {
5506            val = 1;
5507            break;
5508          }
5509        }
5510        // JS specific: little magic to add zero terminator to end of string
5511        if (s.gzindex < s.gzhead.comment.length) {
5512          val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff;
5513        } else {
5514          val = 0;
5515        }
5516        put_byte(s, val);
5517      } while (val !== 0);
5518
5519      if (s.gzhead.hcrc && s.pending > beg) {
5520        strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
5521      }
5522      if (val === 0) {
5523        s.status = HCRC_STATE;
5524      }
5525    }
5526    else {
5527      s.status = HCRC_STATE;
5528    }
5529  }
5530  if (s.status === HCRC_STATE) {
5531    if (s.gzhead.hcrc) {
5532      if (s.pending + 2 > s.pending_buf_size) {
5533        flush_pending(strm);
5534      }
5535      if (s.pending + 2 <= s.pending_buf_size) {
5536        put_byte(s, strm.adler & 0xff);
5537        put_byte(s, (strm.adler >> 8) & 0xff);
5538        strm.adler = 0; //crc32(0L, Z_NULL, 0);
5539        s.status = BUSY_STATE;
5540      }
5541    }
5542    else {
5543      s.status = BUSY_STATE;
5544    }
5545  }
5546//#endif
5547
5548  /* Flush as much pending output as possible */
5549  if (s.pending !== 0) {
5550    flush_pending(strm);
5551    if (strm.avail_out === 0) {
5552      /* Since avail_out is 0, deflate will be called again with
5553       * more output space, but possibly with both pending and
5554       * avail_in equal to zero. There won't be anything to do,
5555       * but this is not an error situation so make sure we
5556       * return OK instead of BUF_ERROR at next call of deflate:
5557       */
5558      s.last_flush = -1;
5559      return Z_OK;
5560    }
5561
5562    /* Make sure there is something to do and avoid duplicate consecutive
5563     * flushes. For repeated and useless calls with Z_FINISH, we keep
5564     * returning Z_STREAM_END instead of Z_BUF_ERROR.
5565     */
5566  } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) &&
5567    flush !== Z_FINISH) {
5568    return err(strm, Z_BUF_ERROR);
5569  }
5570
5571  /* User must not provide more input after the first FINISH: */
5572  if (s.status === FINISH_STATE && strm.avail_in !== 0) {
5573    return err(strm, Z_BUF_ERROR);
5574  }
5575
5576  /* Start a new block or continue the current one.
5577   */
5578  if (strm.avail_in !== 0 || s.lookahead !== 0 ||
5579    (flush !== Z_NO_FLUSH && s.status !== FINISH_STATE)) {
5580    var bstate = (s.strategy === Z_HUFFMAN_ONLY) ? deflate_huff(s, flush) :
5581      (s.strategy === Z_RLE ? deflate_rle(s, flush) :
5582        configuration_table[s.level].func(s, flush));
5583
5584    if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) {
5585      s.status = FINISH_STATE;
5586    }
5587    if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) {
5588      if (strm.avail_out === 0) {
5589        s.last_flush = -1;
5590        /* avoid BUF_ERROR next call, see above */
5591      }
5592      return Z_OK;
5593      /* If flush != Z_NO_FLUSH && avail_out == 0, the next call
5594       * of deflate should use the same flush parameter to make sure
5595       * that the flush is complete. So we don't have to output an
5596       * empty block here, this will be done at next call. This also
5597       * ensures that for a very small output buffer, we emit at most
5598       * one empty block.
5599       */
5600    }
5601    if (bstate === BS_BLOCK_DONE) {
5602      if (flush === Z_PARTIAL_FLUSH) {
5603        trees._tr_align(s);
5604      }
5605      else if (flush !== Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */
5606
5607        trees._tr_stored_block(s, 0, 0, false);
5608        /* For a full flush, this empty block will be recognized
5609         * as a special marker by inflate_sync().
5610         */
5611        if (flush === Z_FULL_FLUSH) {
5612          /*** CLEAR_HASH(s); ***/             /* forget history */
5613          zero(s.head); // Fill with NIL (= 0);
5614
5615          if (s.lookahead === 0) {
5616            s.strstart = 0;
5617            s.block_start = 0;
5618            s.insert = 0;
5619          }
5620        }
5621      }
5622      flush_pending(strm);
5623      if (strm.avail_out === 0) {
5624        s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */
5625        return Z_OK;
5626      }
5627    }
5628  }
5629  //Assert(strm->avail_out > 0, "bug2");
5630  //if (strm.avail_out <= 0) { throw new Error("bug2");}
5631
5632  if (flush !== Z_FINISH) { return Z_OK; }
5633  if (s.wrap <= 0) { return Z_STREAM_END; }
5634
5635  /* Write the trailer */
5636  if (s.wrap === 2) {
5637    put_byte(s, strm.adler & 0xff);
5638    put_byte(s, (strm.adler >> 8) & 0xff);
5639    put_byte(s, (strm.adler >> 16) & 0xff);
5640    put_byte(s, (strm.adler >> 24) & 0xff);
5641    put_byte(s, strm.total_in & 0xff);
5642    put_byte(s, (strm.total_in >> 8) & 0xff);
5643    put_byte(s, (strm.total_in >> 16) & 0xff);
5644    put_byte(s, (strm.total_in >> 24) & 0xff);
5645  }
5646  else
5647  {
5648    putShortMSB(s, strm.adler >>> 16);
5649    putShortMSB(s, strm.adler & 0xffff);
5650  }
5651
5652  flush_pending(strm);
5653  /* If avail_out is zero, the application will call deflate again
5654   * to flush the rest.
5655   */
5656  if (s.wrap > 0) { s.wrap = -s.wrap; }
5657  /* write the trailer only once! */
5658  return s.pending !== 0 ? Z_OK : Z_STREAM_END;
5659}
5660
5661function deflateEnd(strm) {
5662  var status;
5663
5664  if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {
5665    return Z_STREAM_ERROR;
5666  }
5667
5668  status = strm.state.status;
5669  if (status !== INIT_STATE &&
5670    status !== EXTRA_STATE &&
5671    status !== NAME_STATE &&
5672    status !== COMMENT_STATE &&
5673    status !== HCRC_STATE &&
5674    status !== BUSY_STATE &&
5675    status !== FINISH_STATE
5676  ) {
5677    return err(strm, Z_STREAM_ERROR);
5678  }
5679
5680  strm.state = null;
5681
5682  return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK;
5683}
5684
5685/* =========================================================================
5686 * Copy the source state to the destination state
5687 */
5688//function deflateCopy(dest, source) {
5689//
5690//}
5691
5692exports.deflateInit = deflateInit;
5693exports.deflateInit2 = deflateInit2;
5694exports.deflateReset = deflateReset;
5695exports.deflateResetKeep = deflateResetKeep;
5696exports.deflateSetHeader = deflateSetHeader;
5697exports.deflate = deflate;
5698exports.deflateEnd = deflateEnd;
5699exports.deflateInfo = 'pako deflate (from Nodeca project)';
5700
5701/* Not implemented
5702exports.deflateBound = deflateBound;
5703exports.deflateCopy = deflateCopy;
5704exports.deflateSetDictionary = deflateSetDictionary;
5705exports.deflateParams = deflateParams;
5706exports.deflatePending = deflatePending;
5707exports.deflatePrime = deflatePrime;
5708exports.deflateTune = deflateTune;
5709*/
5710},{"../utils/common":27,"./adler32":29,"./crc32":31,"./messages":37,"./trees":38}],33:[function(_dereq_,module,exports){
5711'use strict';
5712
5713
5714function GZheader() {
5715  /* true if compressed data believed to be text */
5716  this.text       = 0;
5717  /* modification time */
5718  this.time       = 0;
5719  /* extra flags (not used when writing a gzip file) */
5720  this.xflags     = 0;
5721  /* operating system */
5722  this.os         = 0;
5723  /* pointer to extra field or Z_NULL if none */
5724  this.extra      = null;
5725  /* extra field length (valid if extra != Z_NULL) */
5726  this.extra_len  = 0; // Actually, we don't need it in JS,
5727                       // but leave for few code modifications
5728
5729  //
5730  // Setup limits is not necessary because in js we should not preallocate memory
5731  // for inflate use constant limit in 65536 bytes
5732  //
5733
5734  /* space at extra (only when reading header) */
5735  // this.extra_max  = 0;
5736  /* pointer to zero-terminated file name or Z_NULL */
5737  this.name       = '';
5738  /* space at name (only when reading header) */
5739  // this.name_max   = 0;
5740  /* pointer to zero-terminated comment or Z_NULL */
5741  this.comment    = '';
5742  /* space at comment (only when reading header) */
5743  // this.comm_max   = 0;
5744  /* true if there was or will be a header crc */
5745  this.hcrc       = 0;
5746  /* true when done reading gzip header (not used when writing a gzip file) */
5747  this.done       = false;
5748}
5749
5750module.exports = GZheader;
5751},{}],34:[function(_dereq_,module,exports){
5752'use strict';
5753
5754// See state defs from inflate.js
5755var BAD = 30;       /* got a data error -- remain here until reset */
5756var TYPE = 12;      /* i: waiting for type bits, including last-flag bit */
5757
5758/*
5759   Decode literal, length, and distance codes and write out the resulting
5760   literal and match bytes until either not enough input or output is
5761   available, an end-of-block is encountered, or a data error is encountered.
5762   When large enough input and output buffers are supplied to inflate(), for
5763   example, a 16K input buffer and a 64K output buffer, more than 95% of the
5764   inflate execution time is spent in this routine.
5765
5766   Entry assumptions:
5767
5768        state.mode === LEN
5769        strm.avail_in >= 6
5770        strm.avail_out >= 258
5771        start >= strm.avail_out
5772        state.bits < 8
5773
5774   On return, state.mode is one of:
5775
5776        LEN -- ran out of enough output space or enough available input
5777        TYPE -- reached end of block code, inflate() to interpret next block
5778        BAD -- error in block data
5779
5780   Notes:
5781
5782    - The maximum input bits used by a length/distance pair is 15 bits for the
5783      length code, 5 bits for the length extra, 15 bits for the distance code,
5784      and 13 bits for the distance extra.  This totals 48 bits, or six bytes.
5785      Therefore if strm.avail_in >= 6, then there is enough input to avoid
5786      checking for available input while decoding.
5787
5788    - The maximum bytes that a single length/distance pair can output is 258
5789      bytes, which is the maximum length that can be coded.  inflate_fast()
5790      requires strm.avail_out >= 258 for each loop to avoid checking for
5791      output space.
5792 */
5793module.exports = function inflate_fast(strm, start) {
5794  var state;
5795  var _in;                    /* local strm.input */
5796  var last;                   /* have enough input while in < last */
5797  var _out;                   /* local strm.output */
5798  var beg;                    /* inflate()'s initial strm.output */
5799  var end;                    /* while out < end, enough space available */
5800//#ifdef INFLATE_STRICT
5801  var dmax;                   /* maximum distance from zlib header */
5802//#endif
5803  var wsize;                  /* window size or zero if not using window */
5804  var whave;                  /* valid bytes in the window */
5805  var wnext;                  /* window write index */
5806  var window;                 /* allocated sliding window, if wsize != 0 */
5807  var hold;                   /* local strm.hold */
5808  var bits;                   /* local strm.bits */
5809  var lcode;                  /* local strm.lencode */
5810  var dcode;                  /* local strm.distcode */
5811  var lmask;                  /* mask for first level of length codes */
5812  var dmask;                  /* mask for first level of distance codes */
5813  var here;                   /* retrieved table entry */
5814  var op;                     /* code bits, operation, extra bits, or */
5815                              /*  window position, window bytes to copy */
5816  var len;                    /* match length, unused bytes */
5817  var dist;                   /* match distance */
5818  var from;                   /* where to copy match from */
5819  var from_source;
5820
5821
5822  var input, output; // JS specific, because we have no pointers
5823
5824  /* copy state to local variables */
5825  state = strm.state;
5826  //here = state.here;
5827  _in = strm.next_in;
5828  input = strm.input;
5829  last = _in + (strm.avail_in - 5);
5830  _out = strm.next_out;
5831  output = strm.output;
5832  beg = _out - (start - strm.avail_out);
5833  end = _out + (strm.avail_out - 257);
5834//#ifdef INFLATE_STRICT
5835  dmax = state.dmax;
5836//#endif
5837  wsize = state.wsize;
5838  whave = state.whave;
5839  wnext = state.wnext;
5840  window = state.window;
5841  hold = state.hold;
5842  bits = state.bits;
5843  lcode = state.lencode;
5844  dcode = state.distcode;
5845  lmask = (1 << state.lenbits) - 1;
5846  dmask = (1 << state.distbits) - 1;
5847
5848
5849  /* decode literals and length/distances until end-of-block or not enough
5850     input data or output space */
5851
5852  top:
5853  do {
5854    if (bits < 15) {
5855      hold += input[_in++] << bits;
5856      bits += 8;
5857      hold += input[_in++] << bits;
5858      bits += 8;
5859    }
5860
5861    here = lcode[hold & lmask];
5862
5863    dolen:
5864    for (;;) { // Goto emulation
5865      op = here >>> 24/*here.bits*/;
5866      hold >>>= op;
5867      bits -= op;
5868      op = (here >>> 16) & 0xff/*here.op*/;
5869      if (op === 0) {                          /* literal */
5870        //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
5871        //        "inflate:         literal '%c'\n" :
5872        //        "inflate:         literal 0x%02x\n", here.val));
5873        output[_out++] = here & 0xffff/*here.val*/;
5874      }
5875      else if (op & 16) {                     /* length base */
5876        len = here & 0xffff/*here.val*/;
5877        op &= 15;                           /* number of extra bits */
5878        if (op) {
5879          if (bits < op) {
5880            hold += input[_in++] << bits;
5881            bits += 8;
5882          }
5883          len += hold & ((1 << op) - 1);
5884          hold >>>= op;
5885          bits -= op;
5886        }
5887        //Tracevv((stderr, "inflate:         length %u\n", len));
5888        if (bits < 15) {
5889          hold += input[_in++] << bits;
5890          bits += 8;
5891          hold += input[_in++] << bits;
5892          bits += 8;
5893        }
5894        here = dcode[hold & dmask];
5895
5896        dodist:
5897        for (;;) { // goto emulation
5898          op = here >>> 24/*here.bits*/;
5899          hold >>>= op;
5900          bits -= op;
5901          op = (here >>> 16) & 0xff/*here.op*/;
5902
5903          if (op & 16) {                      /* distance base */
5904            dist = here & 0xffff/*here.val*/;
5905            op &= 15;                       /* number of extra bits */
5906            if (bits < op) {
5907              hold += input[_in++] << bits;
5908              bits += 8;
5909              if (bits < op) {
5910                hold += input[_in++] << bits;
5911                bits += 8;
5912              }
5913            }
5914            dist += hold & ((1 << op) - 1);
5915//#ifdef INFLATE_STRICT
5916            if (dist > dmax) {
5917              strm.msg = 'invalid distance too far back';
5918              state.mode = BAD;
5919              break top;
5920            }
5921//#endif
5922            hold >>>= op;
5923            bits -= op;
5924            //Tracevv((stderr, "inflate:         distance %u\n", dist));
5925            op = _out - beg;                /* max distance in output */
5926            if (dist > op) {                /* see if copy from window */
5927              op = dist - op;               /* distance back in window */
5928              if (op > whave) {
5929                if (state.sane) {
5930                  strm.msg = 'invalid distance too far back';
5931                  state.mode = BAD;
5932                  break top;
5933                }
5934
5935// (!) This block is disabled in zlib defailts,
5936// don't enable it for binary compatibility
5937//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
5938//                if (len <= op - whave) {
5939//                  do {
5940//                    output[_out++] = 0;
5941//                  } while (--len);
5942//                  continue top;
5943//                }
5944//                len -= op - whave;
5945//                do {
5946//                  output[_out++] = 0;
5947//                } while (--op > whave);
5948//                if (op === 0) {
5949//                  from = _out - dist;
5950//                  do {
5951//                    output[_out++] = output[from++];
5952//                  } while (--len);
5953//                  continue top;
5954//                }
5955//#endif
5956              }
5957              from = 0; // window index
5958              from_source = window;
5959              if (wnext === 0) {           /* very common case */
5960                from += wsize - op;
5961                if (op < len) {         /* some from window */
5962                  len -= op;
5963                  do {
5964                    output[_out++] = window[from++];
5965                  } while (--op);
5966                  from = _out - dist;  /* rest from output */
5967                  from_source = output;
5968                }
5969              }
5970              else if (wnext < op) {      /* wrap around window */
5971                from += wsize + wnext - op;
5972                op -= wnext;
5973                if (op < len) {         /* some from end of window */
5974                  len -= op;
5975                  do {
5976                    output[_out++] = window[from++];
5977                  } while (--op);
5978                  from = 0;
5979                  if (wnext < len) {  /* some from start of window */
5980                    op = wnext;
5981                    len -= op;
5982                    do {
5983                      output[_out++] = window[from++];
5984                    } while (--op);
5985                    from = _out - dist;      /* rest from output */
5986                    from_source = output;
5987                  }
5988                }
5989              }
5990              else {                      /* contiguous in window */
5991                from += wnext - op;
5992                if (op < len) {         /* some from window */
5993                  len -= op;
5994                  do {
5995                    output[_out++] = window[from++];
5996                  } while (--op);
5997                  from = _out - dist;  /* rest from output */
5998                  from_source = output;
5999                }
6000              }
6001              while (len > 2) {
6002                output[_out++] = from_source[from++];
6003                output[_out++] = from_source[from++];
6004                output[_out++] = from_source[from++];
6005                len -= 3;
6006              }
6007              if (len) {
6008                output[_out++] = from_source[from++];
6009                if (len > 1) {
6010                  output[_out++] = from_source[from++];
6011                }
6012              }
6013            }
6014            else {
6015              from = _out - dist;          /* copy direct from output */
6016              do {                        /* minimum length is three */
6017                output[_out++] = output[from++];
6018                output[_out++] = output[from++];
6019                output[_out++] = output[from++];
6020                len -= 3;
6021              } while (len > 2);
6022              if (len) {
6023                output[_out++] = output[from++];
6024                if (len > 1) {
6025                  output[_out++] = output[from++];
6026                }
6027              }
6028            }
6029          }
6030          else if ((op & 64) === 0) {          /* 2nd level distance code */
6031            here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];
6032            continue dodist;
6033          }
6034          else {
6035            strm.msg = 'invalid distance code';
6036            state.mode = BAD;
6037            break top;
6038          }
6039
6040          break; // need to emulate goto via "continue"
6041        }
6042      }
6043      else if ((op & 64) === 0) {              /* 2nd level length code */
6044        here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];
6045        continue dolen;
6046      }
6047      else if (op & 32) {                     /* end-of-block */
6048        //Tracevv((stderr, "inflate:         end of block\n"));
6049        state.mode = TYPE;
6050        break top;
6051      }
6052      else {
6053        strm.msg = 'invalid literal/length code';
6054        state.mode = BAD;
6055        break top;
6056      }
6057
6058      break; // need to emulate goto via "continue"
6059    }
6060  } while (_in < last && _out < end);
6061
6062  /* return unused bytes (on entry, bits < 8, so in won't go too far back) */
6063  len = bits >> 3;
6064  _in -= len;
6065  bits -= len << 3;
6066  hold &= (1 << bits) - 1;
6067
6068  /* update state and return */
6069  strm.next_in = _in;
6070  strm.next_out = _out;
6071  strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));
6072  strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));
6073  state.hold = hold;
6074  state.bits = bits;
6075  return;
6076};
6077
6078},{}],35:[function(_dereq_,module,exports){
6079'use strict';
6080
6081
6082var utils = _dereq_('../utils/common');
6083var adler32 = _dereq_('./adler32');
6084var crc32   = _dereq_('./crc32');
6085var inflate_fast = _dereq_('./inffast');
6086var inflate_table = _dereq_('./inftrees');
6087
6088var CODES = 0;
6089var LENS = 1;
6090var DISTS = 2;
6091
6092/* Public constants ==========================================================*/
6093/* ===========================================================================*/
6094
6095
6096/* Allowed flush values; see deflate() and inflate() below for details */
6097//var Z_NO_FLUSH      = 0;
6098//var Z_PARTIAL_FLUSH = 1;
6099//var Z_SYNC_FLUSH    = 2;
6100//var Z_FULL_FLUSH    = 3;
6101var Z_FINISH        = 4;
6102var Z_BLOCK         = 5;
6103var Z_TREES         = 6;
6104
6105
6106/* Return codes for the compression/decompression functions. Negative values
6107 * are errors, positive values are used for special but normal events.
6108 */
6109var Z_OK            = 0;
6110var Z_STREAM_END    = 1;
6111var Z_NEED_DICT     = 2;
6112//var Z_ERRNO         = -1;
6113var Z_STREAM_ERROR  = -2;
6114var Z_DATA_ERROR    = -3;
6115var Z_MEM_ERROR     = -4;
6116var Z_BUF_ERROR     = -5;
6117//var Z_VERSION_ERROR = -6;
6118
6119/* The deflate compression method */
6120var Z_DEFLATED  = 8;
6121
6122
6123/* STATES ====================================================================*/
6124/* ===========================================================================*/
6125
6126
6127var    HEAD = 1;       /* i: waiting for magic header */
6128var    FLAGS = 2;      /* i: waiting for method and flags (gzip) */
6129var    TIME = 3;       /* i: waiting for modification time (gzip) */
6130var    OS = 4;         /* i: waiting for extra flags and operating system (gzip) */
6131var    EXLEN = 5;      /* i: waiting for extra length (gzip) */
6132var    EXTRA = 6;      /* i: waiting for extra bytes (gzip) */
6133var    NAME = 7;       /* i: waiting for end of file name (gzip) */
6134var    COMMENT = 8;    /* i: waiting for end of comment (gzip) */
6135var    HCRC = 9;       /* i: waiting for header crc (gzip) */
6136var    DICTID = 10;    /* i: waiting for dictionary check value */
6137var    DICT = 11;      /* waiting for inflateSetDictionary() call */
6138var        TYPE = 12;      /* i: waiting for type bits, including last-flag bit */
6139var        TYPEDO = 13;    /* i: same, but skip check to exit inflate on new block */
6140var        STORED = 14;    /* i: waiting for stored size (length and complement) */
6141var        COPY_ = 15;     /* i/o: same as COPY below, but only first time in */
6142var        COPY = 16;      /* i/o: waiting for input or output to copy stored block */
6143var        TABLE = 17;     /* i: waiting for dynamic block table lengths */
6144var        LENLENS = 18;   /* i: waiting for code length code lengths */
6145var        CODELENS = 19;  /* i: waiting for length/lit and distance code lengths */
6146var            LEN_ = 20;      /* i: same as LEN below, but only first time in */
6147var            LEN = 21;       /* i: waiting for length/lit/eob code */
6148var            LENEXT = 22;    /* i: waiting for length extra bits */
6149var            DIST = 23;      /* i: waiting for distance code */
6150var            DISTEXT = 24;   /* i: waiting for distance extra bits */
6151var            MATCH = 25;     /* o: waiting for output space to copy string */
6152var            LIT = 26;       /* o: waiting for output space to write literal */
6153var    CHECK = 27;     /* i: waiting for 32-bit check value */
6154var    LENGTH = 28;    /* i: waiting for 32-bit length (gzip) */
6155var    DONE = 29;      /* finished check, done -- remain here until reset */
6156var    BAD = 30;       /* got a data error -- remain here until reset */
6157var    MEM = 31;       /* got an inflate() memory error -- remain here until reset */
6158var    SYNC = 32;      /* looking for synchronization bytes to restart inflate() */
6159
6160/* ===========================================================================*/
6161
6162
6163
6164var ENOUGH_LENS = 852;
6165var ENOUGH_DISTS = 592;
6166//var ENOUGH =  (ENOUGH_LENS+ENOUGH_DISTS);
6167
6168var MAX_WBITS = 15;
6169/* 32K LZ77 window */
6170var DEF_WBITS = MAX_WBITS;
6171
6172
6173function ZSWAP32(q) {
6174  return  (((q >>> 24) & 0xff) +
6175          ((q >>> 8) & 0xff00) +
6176          ((q & 0xff00) << 8) +
6177          ((q & 0xff) << 24));
6178}
6179
6180
6181function InflateState() {
6182  this.mode = 0;             /* current inflate mode */
6183  this.last = false;          /* true if processing last block */
6184  this.wrap = 0;              /* bit 0 true for zlib, bit 1 true for gzip */
6185  this.havedict = false;      /* true if dictionary provided */
6186  this.flags = 0;             /* gzip header method and flags (0 if zlib) */
6187  this.dmax = 0;              /* zlib header max distance (INFLATE_STRICT) */
6188  this.check = 0;             /* protected copy of check value */
6189  this.total = 0;             /* protected copy of output count */
6190  // TODO: may be {}
6191  this.head = null;           /* where to save gzip header information */
6192
6193  /* sliding window */
6194  this.wbits = 0;             /* log base 2 of requested window size */
6195  this.wsize = 0;             /* window size or zero if not using window */
6196  this.whave = 0;             /* valid bytes in the window */
6197  this.wnext = 0;             /* window write index */
6198  this.window = null;         /* allocated sliding window, if needed */
6199
6200  /* bit accumulator */
6201  this.hold = 0;              /* input bit accumulator */
6202  this.bits = 0;              /* number of bits in "in" */
6203
6204  /* for string and stored block copying */
6205  this.length = 0;            /* literal or length of data to copy */
6206  this.offset = 0;            /* distance back to copy string from */
6207
6208  /* for table and code decoding */
6209  this.extra = 0;             /* extra bits needed */
6210
6211  /* fixed and dynamic code tables */
6212  this.lencode = null;          /* starting table for length/literal codes */
6213  this.distcode = null;         /* starting table for distance codes */
6214  this.lenbits = 0;           /* index bits for lencode */
6215  this.distbits = 0;          /* index bits for distcode */
6216
6217  /* dynamic table building */
6218  this.ncode = 0;             /* number of code length code lengths */
6219  this.nlen = 0;              /* number of length code lengths */
6220  this.ndist = 0;             /* number of distance code lengths */
6221  this.have = 0;              /* number of code lengths in lens[] */
6222  this.next = null;              /* next available space in codes[] */
6223
6224  this.lens = new utils.Buf16(320); /* temporary storage for code lengths */
6225  this.work = new utils.Buf16(288); /* work area for code table building */
6226
6227  /*
6228   because we don't have pointers in js, we use lencode and distcode directly
6229   as buffers so we don't need codes
6230  */
6231  //this.codes = new utils.Buf32(ENOUGH);       /* space for code tables */
6232  this.lendyn = null;              /* dynamic table for length/literal codes (JS specific) */
6233  this.distdyn = null;             /* dynamic table for distance codes (JS specific) */
6234  this.sane = 0;                   /* if false, allow invalid distance too far */
6235  this.back = 0;                   /* bits back of last unprocessed length/lit */
6236  this.was = 0;                    /* initial length of match */
6237}
6238
6239function inflateResetKeep(strm) {
6240  var state;
6241
6242  if (!strm || !strm.state) { return Z_STREAM_ERROR; }
6243  state = strm.state;
6244  strm.total_in = strm.total_out = state.total = 0;
6245  strm.msg = ''; /*Z_NULL*/
6246  if (state.wrap) {       /* to support ill-conceived Java test suite */
6247    strm.adler = state.wrap & 1;
6248  }
6249  state.mode = HEAD;
6250  state.last = 0;
6251  state.havedict = 0;
6252  state.dmax = 32768;
6253  state.head = null/*Z_NULL*/;
6254  state.hold = 0;
6255  state.bits = 0;
6256  //state.lencode = state.distcode = state.next = state.codes;
6257  state.lencode = state.lendyn = new utils.Buf32(ENOUGH_LENS);
6258  state.distcode = state.distdyn = new utils.Buf32(ENOUGH_DISTS);
6259
6260  state.sane = 1;
6261  state.back = -1;
6262  //Tracev((stderr, "inflate: reset\n"));
6263  return Z_OK;
6264}
6265
6266function inflateReset(strm) {
6267  var state;
6268
6269  if (!strm || !strm.state) { return Z_STREAM_ERROR; }
6270  state = strm.state;
6271  state.wsize = 0;
6272  state.whave = 0;
6273  state.wnext = 0;
6274  return inflateResetKeep(strm);
6275
6276}
6277
6278function inflateReset2(strm, windowBits) {
6279  var wrap;
6280  var state;
6281
6282  /* get the state */
6283  if (!strm || !strm.state) { return Z_STREAM_ERROR; }
6284  state = strm.state;
6285
6286  /* extract wrap request from windowBits parameter */
6287  if (windowBits < 0) {
6288    wrap = 0;
6289    windowBits = -windowBits;
6290  }
6291  else {
6292    wrap = (windowBits >> 4) + 1;
6293    if (windowBits < 48) {
6294      windowBits &= 15;
6295    }
6296  }
6297
6298  /* set number of window bits, free window if different */
6299  if (windowBits && (windowBits < 8 || windowBits > 15)) {
6300    return Z_STREAM_ERROR;
6301  }
6302  if (state.window !== null && state.wbits !== windowBits) {
6303    state.window = null;
6304  }
6305
6306  /* update state and reset the rest of it */
6307  state.wrap = wrap;
6308  state.wbits = windowBits;
6309  return inflateReset(strm);
6310}
6311
6312function inflateInit2(strm, windowBits) {
6313  var ret;
6314  var state;
6315
6316  if (!strm) { return Z_STREAM_ERROR; }
6317  //strm.msg = Z_NULL;                 /* in case we return an error */
6318
6319  state = new InflateState();
6320
6321  //if (state === Z_NULL) return Z_MEM_ERROR;
6322  //Tracev((stderr, "inflate: allocated\n"));
6323  strm.state = state;
6324  state.window = null/*Z_NULL*/;
6325  ret = inflateReset2(strm, windowBits);
6326  if (ret !== Z_OK) {
6327    strm.state = null/*Z_NULL*/;
6328  }
6329  return ret;
6330}
6331
6332function inflateInit(strm) {
6333  return inflateInit2(strm, DEF_WBITS);
6334}
6335
6336
6337/*
6338 Return state with length and distance decoding tables and index sizes set to
6339 fixed code decoding.  Normally this returns fixed tables from inffixed.h.
6340 If BUILDFIXED is defined, then instead this routine builds the tables the
6341 first time it's called, and returns those tables the first time and
6342 thereafter.  This reduces the size of the code by about 2K bytes, in
6343 exchange for a little execution time.  However, BUILDFIXED should not be
6344 used for threaded applications, since the rewriting of the tables and virgin
6345 may not be thread-safe.
6346 */
6347var virgin = true;
6348
6349var lenfix, distfix; // We have no pointers in JS, so keep tables separate
6350
6351function fixedtables(state) {
6352  /* build fixed huffman tables if first call (may not be thread safe) */
6353  if (virgin) {
6354    var sym;
6355
6356    lenfix = new utils.Buf32(512);
6357    distfix = new utils.Buf32(32);
6358
6359    /* literal/length table */
6360    sym = 0;
6361    while (sym < 144) { state.lens[sym++] = 8; }
6362    while (sym < 256) { state.lens[sym++] = 9; }
6363    while (sym < 280) { state.lens[sym++] = 7; }
6364    while (sym < 288) { state.lens[sym++] = 8; }
6365
6366    inflate_table(LENS,  state.lens, 0, 288, lenfix,   0, state.work, {bits: 9});
6367
6368    /* distance table */
6369    sym = 0;
6370    while (sym < 32) { state.lens[sym++] = 5; }
6371
6372    inflate_table(DISTS, state.lens, 0, 32,   distfix, 0, state.work, {bits: 5});
6373
6374    /* do this just once */
6375    virgin = false;
6376  }
6377
6378  state.lencode = lenfix;
6379  state.lenbits = 9;
6380  state.distcode = distfix;
6381  state.distbits = 5;
6382}
6383
6384
6385/*
6386 Update the window with the last wsize (normally 32K) bytes written before
6387 returning.  If window does not exist yet, create it.  This is only called
6388 when a window is already in use, or when output has been written during this
6389 inflate call, but the end of the deflate stream has not been reached yet.
6390 It is also called to create a window for dictionary data when a dictionary
6391 is loaded.
6392
6393 Providing output buffers larger than 32K to inflate() should provide a speed
6394 advantage, since only the last 32K of output is copied to the sliding window
6395 upon return from inflate(), and since all distances after the first 32K of
6396 output will fall in the output data, making match copies simpler and faster.
6397 The advantage may be dependent on the size of the processor's data caches.
6398 */
6399function updatewindow(strm, src, end, copy) {
6400  var dist;
6401  var state = strm.state;
6402
6403  /* if it hasn't been done already, allocate space for the window */
6404  if (state.window === null) {
6405    state.wsize = 1 << state.wbits;
6406    state.wnext = 0;
6407    state.whave = 0;
6408
6409    state.window = new utils.Buf8(state.wsize);
6410  }
6411
6412  /* copy state->wsize or less output bytes into the circular window */
6413  if (copy >= state.wsize) {
6414    utils.arraySet(state.window,src, end - state.wsize, state.wsize, 0);
6415    state.wnext = 0;
6416    state.whave = state.wsize;
6417  }
6418  else {
6419    dist = state.wsize - state.wnext;
6420    if (dist > copy) {
6421      dist = copy;
6422    }
6423    //zmemcpy(state->window + state->wnext, end - copy, dist);
6424    utils.arraySet(state.window,src, end - copy, dist, state.wnext);
6425    copy -= dist;
6426    if (copy) {
6427      //zmemcpy(state->window, end - copy, copy);
6428      utils.arraySet(state.window,src, end - copy, copy, 0);
6429      state.wnext = copy;
6430      state.whave = state.wsize;
6431    }
6432    else {
6433      state.wnext += dist;
6434      if (state.wnext === state.wsize) { state.wnext = 0; }
6435      if (state.whave < state.wsize) { state.whave += dist; }
6436    }
6437  }
6438  return 0;
6439}
6440
6441function inflate(strm, flush) {
6442  var state;
6443  var input, output;          // input/output buffers
6444  var next;                   /* next input INDEX */
6445  var put;                    /* next output INDEX */
6446  var have, left;             /* available input and output */
6447  var hold;                   /* bit buffer */
6448  var bits;                   /* bits in bit buffer */
6449  var _in, _out;              /* save starting available input and output */
6450  var copy;                   /* number of stored or match bytes to copy */
6451  var from;                   /* where to copy match bytes from */
6452  var from_source;
6453  var here = 0;               /* current decoding table entry */
6454  var here_bits, here_op, here_val; // paked "here" denormalized (JS specific)
6455  //var last;                   /* parent table entry */
6456  var last_bits, last_op, last_val; // paked "last" denormalized (JS specific)
6457  var len;                    /* length to copy for repeats, bits to drop */
6458  var ret;                    /* return code */
6459  var hbuf = new utils.Buf8(4);    /* buffer for gzip header crc calculation */
6460  var opts;
6461
6462  var n; // temporary var for NEED_BITS
6463
6464  var order = /* permutation of code lengths */
6465    [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15];
6466
6467
6468  if (!strm || !strm.state || !strm.output ||
6469      (!strm.input && strm.avail_in !== 0)) {
6470    return Z_STREAM_ERROR;
6471  }
6472
6473  state = strm.state;
6474  if (state.mode === TYPE) { state.mode = TYPEDO; }    /* skip check */
6475
6476
6477  //--- LOAD() ---
6478  put = strm.next_out;
6479  output = strm.output;
6480  left = strm.avail_out;
6481  next = strm.next_in;
6482  input = strm.input;
6483  have = strm.avail_in;
6484  hold = state.hold;
6485  bits = state.bits;
6486  //---
6487
6488  _in = have;
6489  _out = left;
6490  ret = Z_OK;
6491
6492  inf_leave: // goto emulation
6493  for (;;) {
6494    switch (state.mode) {
6495    case HEAD:
6496      if (state.wrap === 0) {
6497        state.mode = TYPEDO;
6498        break;
6499      }
6500      //=== NEEDBITS(16);
6501      while (bits < 16) {
6502        if (have === 0) { break inf_leave; }
6503        have--;
6504        hold += input[next++] << bits;
6505        bits += 8;
6506      }
6507      //===//
6508      if ((state.wrap & 2) && hold === 0x8b1f) {  /* gzip header */
6509        state.check = 0/*crc32(0L, Z_NULL, 0)*/;
6510        //=== CRC2(state.check, hold);
6511        hbuf[0] = hold & 0xff;
6512        hbuf[1] = (hold >>> 8) & 0xff;
6513        state.check = crc32(state.check, hbuf, 2, 0);
6514        //===//
6515
6516        //=== INITBITS();
6517        hold = 0;
6518        bits = 0;
6519        //===//
6520        state.mode = FLAGS;
6521        break;
6522      }
6523      state.flags = 0;           /* expect zlib header */
6524      if (state.head) {
6525        state.head.done = false;
6526      }
6527      if (!(state.wrap & 1) ||   /* check if zlib header allowed */
6528        (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {
6529        strm.msg = 'incorrect header check';
6530        state.mode = BAD;
6531        break;
6532      }
6533      if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) {
6534        strm.msg = 'unknown compression method';
6535        state.mode = BAD;
6536        break;
6537      }
6538      //--- DROPBITS(4) ---//
6539      hold >>>= 4;
6540      bits -= 4;
6541      //---//
6542      len = (hold & 0x0f)/*BITS(4)*/ + 8;
6543      if (state.wbits === 0) {
6544        state.wbits = len;
6545      }
6546      else if (len > state.wbits) {
6547        strm.msg = 'invalid window size';
6548        state.mode = BAD;
6549        break;
6550      }
6551      state.dmax = 1 << len;
6552      //Tracev((stderr, "inflate:   zlib header ok\n"));
6553      strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;
6554      state.mode = hold & 0x200 ? DICTID : TYPE;
6555      //=== INITBITS();
6556      hold = 0;
6557      bits = 0;
6558      //===//
6559      break;
6560    case FLAGS:
6561      //=== NEEDBITS(16); */
6562      while (bits < 16) {
6563        if (have === 0) { break inf_leave; }
6564        have--;
6565        hold += input[next++] << bits;
6566        bits += 8;
6567      }
6568      //===//
6569      state.flags = hold;
6570      if ((state.flags & 0xff) !== Z_DEFLATED) {
6571        strm.msg = 'unknown compression method';
6572        state.mode = BAD;
6573        break;
6574      }
6575      if (state.flags & 0xe000) {
6576        strm.msg = 'unknown header flags set';
6577        state.mode = BAD;
6578        break;
6579      }
6580      if (state.head) {
6581        state.head.text = ((hold >> 8) & 1);
6582      }
6583      if (state.flags & 0x0200) {
6584        //=== CRC2(state.check, hold);
6585        hbuf[0] = hold & 0xff;
6586        hbuf[1] = (hold >>> 8) & 0xff;
6587        state.check = crc32(state.check, hbuf, 2, 0);
6588        //===//
6589      }
6590      //=== INITBITS();
6591      hold = 0;
6592      bits = 0;
6593      //===//
6594      state.mode = TIME;
6595      /* falls through */
6596    case TIME:
6597      //=== NEEDBITS(32); */
6598      while (bits < 32) {
6599        if (have === 0) { break inf_leave; }
6600        have--;
6601        hold += input[next++] << bits;
6602        bits += 8;
6603      }
6604      //===//
6605      if (state.head) {
6606        state.head.time = hold;
6607      }
6608      if (state.flags & 0x0200) {
6609        //=== CRC4(state.check, hold)
6610        hbuf[0] = hold & 0xff;
6611        hbuf[1] = (hold >>> 8) & 0xff;
6612        hbuf[2] = (hold >>> 16) & 0xff;
6613        hbuf[3] = (hold >>> 24) & 0xff;
6614        state.check = crc32(state.check, hbuf, 4, 0);
6615        //===
6616      }
6617      //=== INITBITS();
6618      hold = 0;
6619      bits = 0;
6620      //===//
6621      state.mode = OS;
6622      /* falls through */
6623    case OS:
6624      //=== NEEDBITS(16); */
6625      while (bits < 16) {
6626        if (have === 0) { break inf_leave; }
6627        have--;
6628        hold += input[next++] << bits;
6629        bits += 8;
6630      }
6631      //===//
6632      if (state.head) {
6633        state.head.xflags = (hold & 0xff);
6634        state.head.os = (hold >> 8);
6635      }
6636      if (state.flags & 0x0200) {
6637        //=== CRC2(state.check, hold);
6638        hbuf[0] = hold & 0xff;
6639        hbuf[1] = (hold >>> 8) & 0xff;
6640        state.check = crc32(state.check, hbuf, 2, 0);
6641        //===//
6642      }
6643      //=== INITBITS();
6644      hold = 0;
6645      bits = 0;
6646      //===//
6647      state.mode = EXLEN;
6648      /* falls through */
6649    case EXLEN:
6650      if (state.flags & 0x0400) {
6651        //=== NEEDBITS(16); */
6652        while (bits < 16) {
6653          if (have === 0) { break inf_leave; }
6654          have--;
6655          hold += input[next++] << bits;
6656          bits += 8;
6657        }
6658        //===//
6659        state.length = hold;
6660        if (state.head) {
6661          state.head.extra_len = hold;
6662        }
6663        if (state.flags & 0x0200) {
6664          //=== CRC2(state.check, hold);
6665          hbuf[0] = hold & 0xff;
6666          hbuf[1] = (hold >>> 8) & 0xff;
6667          state.check = crc32(state.check, hbuf, 2, 0);
6668          //===//
6669        }
6670        //=== INITBITS();
6671        hold = 0;
6672        bits = 0;
6673        //===//
6674      }
6675      else if (state.head) {
6676        state.head.extra = null/*Z_NULL*/;
6677      }
6678      state.mode = EXTRA;
6679      /* falls through */
6680    case EXTRA:
6681      if (state.flags & 0x0400) {
6682        copy = state.length;
6683        if (copy > have) { copy = have; }
6684        if (copy) {
6685          if (state.head) {
6686            len = state.head.extra_len - state.length;
6687            if (!state.head.extra) {
6688              // Use untyped array for more conveniend processing later
6689              state.head.extra = new Array(state.head.extra_len);
6690            }
6691            utils.arraySet(
6692              state.head.extra,
6693              input,
6694              next,
6695              // extra field is limited to 65536 bytes
6696              // - no need for additional size check
6697              copy,
6698              /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/
6699              len
6700            );
6701            //zmemcpy(state.head.extra + len, next,
6702            //        len + copy > state.head.extra_max ?
6703            //        state.head.extra_max - len : copy);
6704          }
6705          if (state.flags & 0x0200) {
6706            state.check = crc32(state.check, input, copy, next);
6707          }
6708          have -= copy;
6709          next += copy;
6710          state.length -= copy;
6711        }
6712        if (state.length) { break inf_leave; }
6713      }
6714      state.length = 0;
6715      state.mode = NAME;
6716      /* falls through */
6717    case NAME:
6718      if (state.flags & 0x0800) {
6719        if (have === 0) { break inf_leave; }
6720        copy = 0;
6721        do {
6722          // TODO: 2 or 1 bytes?
6723          len = input[next + copy++];
6724          /* use constant limit because in js we should not preallocate memory */
6725          if (state.head && len &&
6726              (state.length < 65536 /*state.head.name_max*/)) {
6727            state.head.name += String.fromCharCode(len);
6728          }
6729        } while (len && copy < have);
6730
6731        if (state.flags & 0x0200) {
6732          state.check = crc32(state.check, input, copy, next);
6733        }
6734        have -= copy;
6735        next += copy;
6736        if (len) { break inf_leave; }
6737      }
6738      else if (state.head) {
6739        state.head.name = null;
6740      }
6741      state.length = 0;
6742      state.mode = COMMENT;
6743      /* falls through */
6744    case COMMENT:
6745      if (state.flags & 0x1000) {
6746        if (have === 0) { break inf_leave; }
6747        copy = 0;
6748        do {
6749          len = input[next + copy++];
6750          /* use constant limit because in js we should not preallocate memory */
6751          if (state.head && len &&
6752              (state.length < 65536 /*state.head.comm_max*/)) {
6753            state.head.comment += String.fromCharCode(len);
6754          }
6755        } while (len && copy < have);
6756        if (state.flags & 0x0200) {
6757          state.check = crc32(state.check, input, copy, next);
6758        }
6759        have -= copy;
6760        next += copy;
6761        if (len) { break inf_leave; }
6762      }
6763      else if (state.head) {
6764        state.head.comment = null;
6765      }
6766      state.mode = HCRC;
6767      /* falls through */
6768    case HCRC:
6769      if (state.flags & 0x0200) {
6770        //=== NEEDBITS(16); */
6771        while (bits < 16) {
6772          if (have === 0) { break inf_leave; }
6773          have--;
6774          hold += input[next++] << bits;
6775          bits += 8;
6776        }
6777        //===//
6778        if (hold !== (state.check & 0xffff)) {
6779          strm.msg = 'header crc mismatch';
6780          state.mode = BAD;
6781          break;
6782        }
6783        //=== INITBITS();
6784        hold = 0;
6785        bits = 0;
6786        //===//
6787      }
6788      if (state.head) {
6789        state.head.hcrc = ((state.flags >> 9) & 1);
6790        state.head.done = true;
6791      }
6792      strm.adler = state.check = 0 /*crc32(0L, Z_NULL, 0)*/;
6793      state.mode = TYPE;
6794      break;
6795    case DICTID:
6796      //=== NEEDBITS(32); */
6797      while (bits < 32) {
6798        if (have === 0) { break inf_leave; }
6799        have--;
6800        hold += input[next++] << bits;
6801        bits += 8;
6802      }
6803      //===//
6804      strm.adler = state.check = ZSWAP32(hold);
6805      //=== INITBITS();
6806      hold = 0;
6807      bits = 0;
6808      //===//
6809      state.mode = DICT;
6810      /* falls through */
6811    case DICT:
6812      if (state.havedict === 0) {
6813        //--- RESTORE() ---
6814        strm.next_out = put;
6815        strm.avail_out = left;
6816        strm.next_in = next;
6817        strm.avail_in = have;
6818        state.hold = hold;
6819        state.bits = bits;
6820        //---
6821        return Z_NEED_DICT;
6822      }
6823      strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;
6824      state.mode = TYPE;
6825      /* falls through */
6826    case TYPE:
6827      if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; }
6828      /* falls through */
6829    case TYPEDO:
6830      if (state.last) {
6831        //--- BYTEBITS() ---//
6832        hold >>>= bits & 7;
6833        bits -= bits & 7;
6834        //---//
6835        state.mode = CHECK;
6836        break;
6837      }
6838      //=== NEEDBITS(3); */
6839      while (bits < 3) {
6840        if (have === 0) { break inf_leave; }
6841        have--;
6842        hold += input[next++] << bits;
6843        bits += 8;
6844      }
6845      //===//
6846      state.last = (hold & 0x01)/*BITS(1)*/;
6847      //--- DROPBITS(1) ---//
6848      hold >>>= 1;
6849      bits -= 1;
6850      //---//
6851
6852      switch ((hold & 0x03)/*BITS(2)*/) {
6853      case 0:                             /* stored block */
6854        //Tracev((stderr, "inflate:     stored block%s\n",
6855        //        state.last ? " (last)" : ""));
6856        state.mode = STORED;
6857        break;
6858      case 1:                             /* fixed block */
6859        fixedtables(state);
6860        //Tracev((stderr, "inflate:     fixed codes block%s\n",
6861        //        state.last ? " (last)" : ""));
6862        state.mode = LEN_;             /* decode codes */
6863        if (flush === Z_TREES) {
6864          //--- DROPBITS(2) ---//
6865          hold >>>= 2;
6866          bits -= 2;
6867          //---//
6868          break inf_leave;
6869        }
6870        break;
6871      case 2:                             /* dynamic block */
6872        //Tracev((stderr, "inflate:     dynamic codes block%s\n",
6873        //        state.last ? " (last)" : ""));
6874        state.mode = TABLE;
6875        break;
6876      case 3:
6877        strm.msg = 'invalid block type';
6878        state.mode = BAD;
6879      }
6880      //--- DROPBITS(2) ---//
6881      hold >>>= 2;
6882      bits -= 2;
6883      //---//
6884      break;
6885    case STORED:
6886      //--- BYTEBITS() ---// /* go to byte boundary */
6887      hold >>>= bits & 7;
6888      bits -= bits & 7;
6889      //---//
6890      //=== NEEDBITS(32); */
6891      while (bits < 32) {
6892        if (have === 0) { break inf_leave; }
6893        have--;
6894        hold += input[next++] << bits;
6895        bits += 8;
6896      }
6897      //===//
6898      if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {
6899        strm.msg = 'invalid stored block lengths';
6900        state.mode = BAD;
6901        break;
6902      }
6903      state.length = hold & 0xffff;
6904      //Tracev((stderr, "inflate:       stored length %u\n",
6905      //        state.length));
6906      //=== INITBITS();
6907      hold = 0;
6908      bits = 0;
6909      //===//
6910      state.mode = COPY_;
6911      if (flush === Z_TREES) { break inf_leave; }
6912      /* falls through */
6913    case COPY_:
6914      state.mode = COPY;
6915      /* falls through */
6916    case COPY:
6917      copy = state.length;
6918      if (copy) {
6919        if (copy > have) { copy = have; }
6920        if (copy > left) { copy = left; }
6921        if (copy === 0) { break inf_leave; }
6922        //--- zmemcpy(put, next, copy); ---
6923        utils.arraySet(output, input, next, copy, put);
6924        //---//
6925        have -= copy;
6926        next += copy;
6927        left -= copy;
6928        put += copy;
6929        state.length -= copy;
6930        break;
6931      }
6932      //Tracev((stderr, "inflate:       stored end\n"));
6933      state.mode = TYPE;
6934      break;
6935    case TABLE:
6936      //=== NEEDBITS(14); */
6937      while (bits < 14) {
6938        if (have === 0) { break inf_leave; }
6939        have--;
6940        hold += input[next++] << bits;
6941        bits += 8;
6942      }
6943      //===//
6944      state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;
6945      //--- DROPBITS(5) ---//
6946      hold >>>= 5;
6947      bits -= 5;
6948      //---//
6949      state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;
6950      //--- DROPBITS(5) ---//
6951      hold >>>= 5;
6952      bits -= 5;
6953      //---//
6954      state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;
6955      //--- DROPBITS(4) ---//
6956      hold >>>= 4;
6957      bits -= 4;
6958      //---//
6959//#ifndef PKZIP_BUG_WORKAROUND
6960      if (state.nlen > 286 || state.ndist > 30) {
6961        strm.msg = 'too many length or distance symbols';
6962        state.mode = BAD;
6963        break;
6964      }
6965//#endif
6966      //Tracev((stderr, "inflate:       table sizes ok\n"));
6967      state.have = 0;
6968      state.mode = LENLENS;
6969      /* falls through */
6970    case LENLENS:
6971      while (state.have < state.ncode) {
6972        //=== NEEDBITS(3);
6973        while (bits < 3) {
6974          if (have === 0) { break inf_leave; }
6975          have--;
6976          hold += input[next++] << bits;
6977          bits += 8;
6978        }
6979        //===//
6980        state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);
6981        //--- DROPBITS(3) ---//
6982        hold >>>= 3;
6983        bits -= 3;
6984        //---//
6985      }
6986      while (state.have < 19) {
6987        state.lens[order[state.have++]] = 0;
6988      }
6989      // We have separate tables & no pointers. 2 commented lines below not needed.
6990      //state.next = state.codes;
6991      //state.lencode = state.next;
6992      // Switch to use dynamic table
6993      state.lencode = state.lendyn;
6994      state.lenbits = 7;
6995
6996      opts = {bits: state.lenbits};
6997      ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts);
6998      state.lenbits = opts.bits;
6999
7000      if (ret) {
7001        strm.msg = 'invalid code lengths set';
7002        state.mode = BAD;
7003        break;
7004      }
7005      //Tracev((stderr, "inflate:       code lengths ok\n"));
7006      state.have = 0;
7007      state.mode = CODELENS;
7008      /* falls through */
7009    case CODELENS:
7010      while (state.have < state.nlen + state.ndist) {
7011        for (;;) {
7012          here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/
7013          here_bits = here >>> 24;
7014          here_op = (here >>> 16) & 0xff;
7015          here_val = here & 0xffff;
7016
7017          if ((here_bits) <= bits) { break; }
7018          //--- PULLBYTE() ---//
7019          if (have === 0) { break inf_leave; }
7020          have--;
7021          hold += input[next++] << bits;
7022          bits += 8;
7023          //---//
7024        }
7025        if (here_val < 16) {
7026          //--- DROPBITS(here.bits) ---//
7027          hold >>>= here_bits;
7028          bits -= here_bits;
7029          //---//
7030          state.lens[state.have++] = here_val;
7031        }
7032        else {
7033          if (here_val === 16) {
7034            //=== NEEDBITS(here.bits + 2);
7035            n = here_bits + 2;
7036            while (bits < n) {
7037              if (have === 0) { break inf_leave; }
7038              have--;
7039              hold += input[next++] << bits;
7040              bits += 8;
7041            }
7042            //===//
7043            //--- DROPBITS(here.bits) ---//
7044            hold >>>= here_bits;
7045            bits -= here_bits;
7046            //---//
7047            if (state.have === 0) {
7048              strm.msg = 'invalid bit length repeat';
7049              state.mode = BAD;
7050              break;
7051            }
7052            len = state.lens[state.have - 1];
7053            copy = 3 + (hold & 0x03);//BITS(2);
7054            //--- DROPBITS(2) ---//
7055            hold >>>= 2;
7056            bits -= 2;
7057            //---//
7058          }
7059          else if (here_val === 17) {
7060            //=== NEEDBITS(here.bits + 3);
7061            n = here_bits + 3;
7062            while (bits < n) {
7063              if (have === 0) { break inf_leave; }
7064              have--;
7065              hold += input[next++] << bits;
7066              bits += 8;
7067            }
7068            //===//
7069            //--- DROPBITS(here.bits) ---//
7070            hold >>>= here_bits;
7071            bits -= here_bits;
7072            //---//
7073            len = 0;
7074            copy = 3 + (hold & 0x07);//BITS(3);
7075            //--- DROPBITS(3) ---//
7076            hold >>>= 3;
7077            bits -= 3;
7078            //---//
7079          }
7080          else {
7081            //=== NEEDBITS(here.bits + 7);
7082            n = here_bits + 7;
7083            while (bits < n) {
7084              if (have === 0) { break inf_leave; }
7085              have--;
7086              hold += input[next++] << bits;
7087              bits += 8;
7088            }
7089            //===//
7090            //--- DROPBITS(here.bits) ---//
7091            hold >>>= here_bits;
7092            bits -= here_bits;
7093            //---//
7094            len = 0;
7095            copy = 11 + (hold & 0x7f);//BITS(7);
7096            //--- DROPBITS(7) ---//
7097            hold >>>= 7;
7098            bits -= 7;
7099            //---//
7100          }
7101          if (state.have + copy > state.nlen + state.ndist) {
7102            strm.msg = 'invalid bit length repeat';
7103            state.mode = BAD;
7104            break;
7105          }
7106          while (copy--) {
7107            state.lens[state.have++] = len;
7108          }
7109        }
7110      }
7111
7112      /* handle error breaks in while */
7113      if (state.mode === BAD) { break; }
7114
7115      /* check for end-of-block code (better have one) */
7116      if (state.lens[256] === 0) {
7117        strm.msg = 'invalid code -- missing end-of-block';
7118        state.mode = BAD;
7119        break;
7120      }
7121
7122      /* build code tables -- note: do not change the lenbits or distbits
7123         values here (9 and 6) without reading the comments in inftrees.h
7124         concerning the ENOUGH constants, which depend on those values */
7125      state.lenbits = 9;
7126
7127      opts = {bits: state.lenbits};
7128      ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);
7129      // We have separate tables & no pointers. 2 commented lines below not needed.
7130      // state.next_index = opts.table_index;
7131      state.lenbits = opts.bits;
7132      // state.lencode = state.next;
7133
7134      if (ret) {
7135        strm.msg = 'invalid literal/lengths set';
7136        state.mode = BAD;
7137        break;
7138      }
7139
7140      state.distbits = 6;
7141      //state.distcode.copy(state.codes);
7142      // Switch to use dynamic table
7143      state.distcode = state.distdyn;
7144      opts = {bits: state.distbits};
7145      ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);
7146      // We have separate tables & no pointers. 2 commented lines below not needed.
7147      // state.next_index = opts.table_index;
7148      state.distbits = opts.bits;
7149      // state.distcode = state.next;
7150
7151      if (ret) {
7152        strm.msg = 'invalid distances set';
7153        state.mode = BAD;
7154        break;
7155      }
7156      //Tracev((stderr, 'inflate:       codes ok\n'));
7157      state.mode = LEN_;
7158      if (flush === Z_TREES) { break inf_leave; }
7159      /* falls through */
7160    case LEN_:
7161      state.mode = LEN;
7162      /* falls through */
7163    case LEN:
7164      if (have >= 6 && left >= 258) {
7165        //--- RESTORE() ---
7166        strm.next_out = put;
7167        strm.avail_out = left;
7168        strm.next_in = next;
7169        strm.avail_in = have;
7170        state.hold = hold;
7171        state.bits = bits;
7172        //---
7173        inflate_fast(strm, _out);
7174        //--- LOAD() ---
7175        put = strm.next_out;
7176        output = strm.output;
7177        left = strm.avail_out;
7178        next = strm.next_in;
7179        input = strm.input;
7180        have = strm.avail_in;
7181        hold = state.hold;
7182        bits = state.bits;
7183        //---
7184
7185        if (state.mode === TYPE) {
7186          state.back = -1;
7187        }
7188        break;
7189      }
7190      state.back = 0;
7191      for (;;) {
7192        here = state.lencode[hold & ((1 << state.lenbits) -1)];  /*BITS(state.lenbits)*/
7193        here_bits = here >>> 24;
7194        here_op = (here >>> 16) & 0xff;
7195        here_val = here & 0xffff;
7196
7197        if (here_bits <= bits) { break; }
7198        //--- PULLBYTE() ---//
7199        if (have === 0) { break inf_leave; }
7200        have--;
7201        hold += input[next++] << bits;
7202        bits += 8;
7203        //---//
7204      }
7205      if (here_op && (here_op & 0xf0) === 0) {
7206        last_bits = here_bits;
7207        last_op = here_op;
7208        last_val = here_val;
7209        for (;;) {
7210          here = state.lencode[last_val +
7211                  ((hold & ((1 << (last_bits + last_op)) -1))/*BITS(last.bits + last.op)*/ >> last_bits)];
7212          here_bits = here >>> 24;
7213          here_op = (here >>> 16) & 0xff;
7214          here_val = here & 0xffff;
7215
7216          if ((last_bits + here_bits) <= bits) { break; }
7217          //--- PULLBYTE() ---//
7218          if (have === 0) { break inf_leave; }
7219          have--;
7220          hold += input[next++] << bits;
7221          bits += 8;
7222          //---//
7223        }
7224        //--- DROPBITS(last.bits) ---//
7225        hold >>>= last_bits;
7226        bits -= last_bits;
7227        //---//
7228        state.back += last_bits;
7229      }
7230      //--- DROPBITS(here.bits) ---//
7231      hold >>>= here_bits;
7232      bits -= here_bits;
7233      //---//
7234      state.back += here_bits;
7235      state.length = here_val;
7236      if (here_op === 0) {
7237        //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
7238        //        "inflate:         literal '%c'\n" :
7239        //        "inflate:         literal 0x%02x\n", here.val));
7240        state.mode = LIT;
7241        break;
7242      }
7243      if (here_op & 32) {
7244        //Tracevv((stderr, "inflate:         end of block\n"));
7245        state.back = -1;
7246        state.mode = TYPE;
7247        break;
7248      }
7249      if (here_op & 64) {
7250        strm.msg = 'invalid literal/length code';
7251        state.mode = BAD;
7252        break;
7253      }
7254      state.extra = here_op & 15;
7255      state.mode = LENEXT;
7256      /* falls through */
7257    case LENEXT:
7258      if (state.extra) {
7259        //=== NEEDBITS(state.extra);
7260        n = state.extra;
7261        while (bits < n) {
7262          if (have === 0) { break inf_leave; }
7263          have--;
7264          hold += input[next++] << bits;
7265          bits += 8;
7266        }
7267        //===//
7268        state.length += hold & ((1 << state.extra) -1)/*BITS(state.extra)*/;
7269        //--- DROPBITS(state.extra) ---//
7270        hold >>>= state.extra;
7271        bits -= state.extra;
7272        //---//
7273        state.back += state.extra;
7274      }
7275      //Tracevv((stderr, "inflate:         length %u\n", state.length));
7276      state.was = state.length;
7277      state.mode = DIST;
7278      /* falls through */
7279    case DIST:
7280      for (;;) {
7281        here = state.distcode[hold & ((1 << state.distbits) -1)];/*BITS(state.distbits)*/
7282        here_bits = here >>> 24;
7283        here_op = (here >>> 16) & 0xff;
7284        here_val = here & 0xffff;
7285
7286        if ((here_bits) <= bits) { break; }
7287        //--- PULLBYTE() ---//
7288        if (have === 0) { break inf_leave; }
7289        have--;
7290        hold += input[next++] << bits;
7291        bits += 8;
7292        //---//
7293      }
7294      if ((here_op & 0xf0) === 0) {
7295        last_bits = here_bits;
7296        last_op = here_op;
7297        last_val = here_val;
7298        for (;;) {
7299          here = state.distcode[last_val +
7300                  ((hold & ((1 << (last_bits + last_op)) -1))/*BITS(last.bits + last.op)*/ >> last_bits)];
7301          here_bits = here >>> 24;
7302          here_op = (here >>> 16) & 0xff;
7303          here_val = here & 0xffff;
7304
7305          if ((last_bits + here_bits) <= bits) { break; }
7306          //--- PULLBYTE() ---//
7307          if (have === 0) { break inf_leave; }
7308          have--;
7309          hold += input[next++] << bits;
7310          bits += 8;
7311          //---//
7312        }
7313        //--- DROPBITS(last.bits) ---//
7314        hold >>>= last_bits;
7315        bits -= last_bits;
7316        //---//
7317        state.back += last_bits;
7318      }
7319      //--- DROPBITS(here.bits) ---//
7320      hold >>>= here_bits;
7321      bits -= here_bits;
7322      //---//
7323      state.back += here_bits;
7324      if (here_op & 64) {
7325        strm.msg = 'invalid distance code';
7326        state.mode = BAD;
7327        break;
7328      }
7329      state.offset = here_val;
7330      state.extra = (here_op) & 15;
7331      state.mode = DISTEXT;
7332      /* falls through */
7333    case DISTEXT:
7334      if (state.extra) {
7335        //=== NEEDBITS(state.extra);
7336        n = state.extra;
7337        while (bits < n) {
7338          if (have === 0) { break inf_leave; }
7339          have--;
7340          hold += input[next++] << bits;
7341          bits += 8;
7342        }
7343        //===//
7344        state.offset += hold & ((1 << state.extra) -1)/*BITS(state.extra)*/;
7345        //--- DROPBITS(state.extra) ---//
7346        hold >>>= state.extra;
7347        bits -= state.extra;
7348        //---//
7349        state.back += state.extra;
7350      }
7351//#ifdef INFLATE_STRICT
7352      if (state.offset > state.dmax) {
7353        strm.msg = 'invalid distance too far back';
7354        state.mode = BAD;
7355        break;
7356      }
7357//#endif
7358      //Tracevv((stderr, "inflate:         distance %u\n", state.offset));
7359      state.mode = MATCH;
7360      /* falls through */
7361    case MATCH:
7362      if (left === 0) { break inf_leave; }
7363      copy = _out - left;
7364      if (state.offset > copy) {         /* copy from window */
7365        copy = state.offset - copy;
7366        if (copy > state.whave) {
7367          if (state.sane) {
7368            strm.msg = 'invalid distance too far back';
7369            state.mode = BAD;
7370            break;
7371          }
7372// (!) This block is disabled in zlib defailts,
7373// don't enable it for binary compatibility
7374//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
7375//          Trace((stderr, "inflate.c too far\n"));
7376//          copy -= state.whave;
7377//          if (copy > state.length) { copy = state.length; }
7378//          if (copy > left) { copy = left; }
7379//          left -= copy;
7380//          state.length -= copy;
7381//          do {
7382//            output[put++] = 0;
7383//          } while (--copy);
7384//          if (state.length === 0) { state.mode = LEN; }
7385//          break;
7386//#endif
7387        }
7388        if (copy > state.wnext) {
7389          copy -= state.wnext;
7390          from = state.wsize - copy;
7391        }
7392        else {
7393          from = state.wnext - copy;
7394        }
7395        if (copy > state.length) { copy = state.length; }
7396        from_source = state.window;
7397      }
7398      else {                              /* copy from output */
7399        from_source = output;
7400        from = put - state.offset;
7401        copy = state.length;
7402      }
7403      if (copy > left) { copy = left; }
7404      left -= copy;
7405      state.length -= copy;
7406      do {
7407        output[put++] = from_source[from++];
7408      } while (--copy);
7409      if (state.length === 0) { state.mode = LEN; }
7410      break;
7411    case LIT:
7412      if (left === 0) { break inf_leave; }
7413      output[put++] = state.length;
7414      left--;
7415      state.mode = LEN;
7416      break;
7417    case CHECK:
7418      if (state.wrap) {
7419        //=== NEEDBITS(32);
7420        while (bits < 32) {
7421          if (have === 0) { break inf_leave; }
7422          have--;
7423          // Use '|' insdead of '+' to make sure that result is signed
7424          hold |= input[next++] << bits;
7425          bits += 8;
7426        }
7427        //===//
7428        _out -= left;
7429        strm.total_out += _out;
7430        state.total += _out;
7431        if (_out) {
7432          strm.adler = state.check =
7433              /*UPDATE(state.check, put - _out, _out);*/
7434              (state.flags ? crc32(state.check, output, _out, put - _out) : adler32(state.check, output, _out, put - _out));
7435
7436        }
7437        _out = left;
7438        // NB: crc32 stored as signed 32-bit int, ZSWAP32 returns signed too
7439        if ((state.flags ? hold : ZSWAP32(hold)) !== state.check) {
7440          strm.msg = 'incorrect data check';
7441          state.mode = BAD;
7442          break;
7443        }
7444        //=== INITBITS();
7445        hold = 0;
7446        bits = 0;
7447        //===//
7448        //Tracev((stderr, "inflate:   check matches trailer\n"));
7449      }
7450      state.mode = LENGTH;
7451      /* falls through */
7452    case LENGTH:
7453      if (state.wrap && state.flags) {
7454        //=== NEEDBITS(32);
7455        while (bits < 32) {
7456          if (have === 0) { break inf_leave; }
7457          have--;
7458          hold += input[next++] << bits;
7459          bits += 8;
7460        }
7461        //===//
7462        if (hold !== (state.total & 0xffffffff)) {
7463          strm.msg = 'incorrect length check';
7464          state.mode = BAD;
7465          break;
7466        }
7467        //=== INITBITS();
7468        hold = 0;
7469        bits = 0;
7470        //===//
7471        //Tracev((stderr, "inflate:   length matches trailer\n"));
7472      }
7473      state.mode = DONE;
7474      /* falls through */
7475    case DONE:
7476      ret = Z_STREAM_END;
7477      break inf_leave;
7478    case BAD:
7479      ret = Z_DATA_ERROR;
7480      break inf_leave;
7481    case MEM:
7482      return Z_MEM_ERROR;
7483    case SYNC:
7484      /* falls through */
7485    default:
7486      return Z_STREAM_ERROR;
7487    }
7488  }
7489
7490  // inf_leave <- here is real place for "goto inf_leave", emulated via "break inf_leave"
7491
7492  /*
7493     Return from inflate(), updating the total counts and the check value.
7494     If there was no progress during the inflate() call, return a buffer
7495     error.  Call updatewindow() to create and/or update the window state.
7496     Note: a memory error from inflate() is non-recoverable.
7497   */
7498
7499  //--- RESTORE() ---
7500  strm.next_out = put;
7501  strm.avail_out = left;
7502  strm.next_in = next;
7503  strm.avail_in = have;
7504  state.hold = hold;
7505  state.bits = bits;
7506  //---
7507
7508  if (state.wsize || (_out !== strm.avail_out && state.mode < BAD &&
7509                      (state.mode < CHECK || flush !== Z_FINISH))) {
7510    if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) {
7511      state.mode = MEM;
7512      return Z_MEM_ERROR;
7513    }
7514  }
7515  _in -= strm.avail_in;
7516  _out -= strm.avail_out;
7517  strm.total_in += _in;
7518  strm.total_out += _out;
7519  state.total += _out;
7520  if (state.wrap && _out) {
7521    strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/
7522      (state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out));
7523  }
7524  strm.data_type = state.bits + (state.last ? 64 : 0) +
7525                    (state.mode === TYPE ? 128 : 0) +
7526                    (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);
7527  if (((_in === 0 && _out === 0) || flush === Z_FINISH) && ret === Z_OK) {
7528    ret = Z_BUF_ERROR;
7529  }
7530  return ret;
7531}
7532
7533function inflateEnd(strm) {
7534
7535  if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) {
7536    return Z_STREAM_ERROR;
7537  }
7538
7539  var state = strm.state;
7540  if (state.window) {
7541    state.window = null;
7542  }
7543  strm.state = null;
7544  return Z_OK;
7545}
7546
7547function inflateGetHeader(strm, head) {
7548  var state;
7549
7550  /* check state */
7551  if (!strm || !strm.state) { return Z_STREAM_ERROR; }
7552  state = strm.state;
7553  if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR; }
7554
7555  /* save header structure */
7556  state.head = head;
7557  head.done = false;
7558  return Z_OK;
7559}
7560
7561
7562exports.inflateReset = inflateReset;
7563exports.inflateReset2 = inflateReset2;
7564exports.inflateResetKeep = inflateResetKeep;
7565exports.inflateInit = inflateInit;
7566exports.inflateInit2 = inflateInit2;
7567exports.inflate = inflate;
7568exports.inflateEnd = inflateEnd;
7569exports.inflateGetHeader = inflateGetHeader;
7570exports.inflateInfo = 'pako inflate (from Nodeca project)';
7571
7572/* Not implemented
7573exports.inflateCopy = inflateCopy;
7574exports.inflateGetDictionary = inflateGetDictionary;
7575exports.inflateMark = inflateMark;
7576exports.inflatePrime = inflatePrime;
7577exports.inflateSetDictionary = inflateSetDictionary;
7578exports.inflateSync = inflateSync;
7579exports.inflateSyncPoint = inflateSyncPoint;
7580exports.inflateUndermine = inflateUndermine;
7581*/
7582},{"../utils/common":27,"./adler32":29,"./crc32":31,"./inffast":34,"./inftrees":36}],36:[function(_dereq_,module,exports){
7583'use strict';
7584
7585
7586var utils = _dereq_('../utils/common');
7587
7588var MAXBITS = 15;
7589var ENOUGH_LENS = 852;
7590var ENOUGH_DISTS = 592;
7591//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);
7592
7593var CODES = 0;
7594var LENS = 1;
7595var DISTS = 2;
7596
7597var lbase = [ /* Length codes 257..285 base */
7598  3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
7599  35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0
7600];
7601
7602var lext = [ /* Length codes 257..285 extra */
7603  16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
7604  19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78
7605];
7606
7607var dbase = [ /* Distance codes 0..29 base */
7608  1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
7609  257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
7610  8193, 12289, 16385, 24577, 0, 0
7611];
7612
7613var dext = [ /* Distance codes 0..29 extra */
7614  16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,
7615  23, 23, 24, 24, 25, 25, 26, 26, 27, 27,
7616  28, 28, 29, 29, 64, 64
7617];
7618
7619module.exports = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts)
7620{
7621  var bits = opts.bits;
7622      //here = opts.here; /* table entry for duplication */
7623
7624  var len = 0;               /* a code's length in bits */
7625  var sym = 0;               /* index of code symbols */
7626  var min = 0, max = 0;          /* minimum and maximum code lengths */
7627  var root = 0;              /* number of index bits for root table */
7628  var curr = 0;              /* number of index bits for current table */
7629  var drop = 0;              /* code bits to drop for sub-table */
7630  var left = 0;                   /* number of prefix codes available */
7631  var used = 0;              /* code entries in table used */
7632  var huff = 0;              /* Huffman code */
7633  var incr;              /* for incrementing code, index */
7634  var fill;              /* index for replicating entries */
7635  var low;               /* low bits for current root entry */
7636  var mask;              /* mask for low root bits */
7637  var next;             /* next available space in table */
7638  var base = null;     /* base value table to use */
7639  var base_index = 0;
7640//  var shoextra;    /* extra bits table to use */
7641  var end;                    /* use base and extra for symbol > end */
7642  var count = new utils.Buf16(MAXBITS+1); //[MAXBITS+1];    /* number of codes of each length */
7643  var offs = new utils.Buf16(MAXBITS+1); //[MAXBITS+1];     /* offsets in table for each length */
7644  var extra = null;
7645  var extra_index = 0;
7646
7647  var here_bits, here_op, here_val;
7648
7649  /*
7650   Process a set of code lengths to create a canonical Huffman code.  The
7651   code lengths are lens[0..codes-1].  Each length corresponds to the
7652   symbols 0..codes-1.  The Huffman code is generated by first sorting the
7653   symbols by length from short to long, and retaining the symbol order
7654   for codes with equal lengths.  Then the code starts with all zero bits
7655   for the first code of the shortest length, and the codes are integer
7656   increments for the same length, and zeros are appended as the length
7657   increases.  For the deflate format, these bits are stored backwards
7658   from their more natural integer increment ordering, and so when the
7659   decoding tables are built in the large loop below, the integer codes
7660   are incremented backwards.
7661
7662   This routine assumes, but does not check, that all of the entries in
7663   lens[] are in the range 0..MAXBITS.  The caller must assure this.
7664   1..MAXBITS is interpreted as that code length.  zero means that that
7665   symbol does not occur in this code.
7666
7667   The codes are sorted by computing a count of codes for each length,
7668   creating from that a table of starting indices for each length in the
7669   sorted table, and then entering the symbols in order in the sorted
7670   table.  The sorted table is work[], with that space being provided by
7671   the caller.
7672
7673   The length counts are used for other purposes as well, i.e. finding
7674   the minimum and maximum length codes, determining if there are any
7675   codes at all, checking for a valid set of lengths, and looking ahead
7676   at length counts to determine sub-table sizes when building the
7677   decoding tables.
7678   */
7679
7680  /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */
7681  for (len = 0; len <= MAXBITS; len++) {
7682    count[len] = 0;
7683  }
7684  for (sym = 0; sym < codes; sym++) {
7685    count[lens[lens_index + sym]]++;
7686  }
7687
7688  /* bound code lengths, force root to be within code lengths */
7689  root = bits;
7690  for (max = MAXBITS; max >= 1; max--) {
7691    if (count[max] !== 0) { break; }
7692  }
7693  if (root > max) {
7694    root = max;
7695  }
7696  if (max === 0) {                     /* no symbols to code at all */
7697    //table.op[opts.table_index] = 64;  //here.op = (var char)64;    /* invalid code marker */
7698    //table.bits[opts.table_index] = 1;   //here.bits = (var char)1;
7699    //table.val[opts.table_index++] = 0;   //here.val = (var short)0;
7700    table[table_index++] = (1 << 24) | (64 << 16) | 0;
7701
7702
7703    //table.op[opts.table_index] = 64;
7704    //table.bits[opts.table_index] = 1;
7705    //table.val[opts.table_index++] = 0;
7706    table[table_index++] = (1 << 24) | (64 << 16) | 0;
7707
7708    opts.bits = 1;
7709    return 0;     /* no symbols, but wait for decoding to report error */
7710  }
7711  for (min = 1; min < max; min++) {
7712    if (count[min] !== 0) { break; }
7713  }
7714  if (root < min) {
7715    root = min;
7716  }
7717
7718  /* check for an over-subscribed or incomplete set of lengths */
7719  left = 1;
7720  for (len = 1; len <= MAXBITS; len++) {
7721    left <<= 1;
7722    left -= count[len];
7723    if (left < 0) {
7724      return -1;
7725    }        /* over-subscribed */
7726  }
7727  if (left > 0 && (type === CODES || max !== 1)) {
7728    return -1;                      /* incomplete set */
7729  }
7730
7731  /* generate offsets into symbol table for each length for sorting */
7732  offs[1] = 0;
7733  for (len = 1; len < MAXBITS; len++) {
7734    offs[len + 1] = offs[len] + count[len];
7735  }
7736
7737  /* sort symbols by length, by symbol order within each length */
7738  for (sym = 0; sym < codes; sym++) {
7739    if (lens[lens_index + sym] !== 0) {
7740      work[offs[lens[lens_index + sym]]++] = sym;
7741    }
7742  }
7743
7744  /*
7745   Create and fill in decoding tables.  In this loop, the table being
7746   filled is at next and has curr index bits.  The code being used is huff
7747   with length len.  That code is converted to an index by dropping drop
7748   bits off of the bottom.  For codes where len is less than drop + curr,
7749   those top drop + curr - len bits are incremented through all values to
7750   fill the table with replicated entries.
7751
7752   root is the number of index bits for the root table.  When len exceeds
7753   root, sub-tables are created pointed to by the root entry with an index
7754   of the low root bits of huff.  This is saved in low to check for when a
7755   new sub-table should be started.  drop is zero when the root table is
7756   being filled, and drop is root when sub-tables are being filled.
7757
7758   When a new sub-table is needed, it is necessary to look ahead in the
7759   code lengths to determine what size sub-table is needed.  The length
7760   counts are used for this, and so count[] is decremented as codes are
7761   entered in the tables.
7762
7763   used keeps track of how many table entries have been allocated from the
7764   provided *table space.  It is checked for LENS and DIST tables against
7765   the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in
7766   the initial root table size constants.  See the comments in inftrees.h
7767   for more information.
7768
7769   sym increments through all symbols, and the loop terminates when
7770   all codes of length max, i.e. all codes, have been processed.  This
7771   routine permits incomplete codes, so another loop after this one fills
7772   in the rest of the decoding tables with invalid code markers.
7773   */
7774
7775  /* set up for code type */
7776  // poor man optimization - use if-else instead of switch,
7777  // to avoid deopts in old v8
7778  if (type === CODES) {
7779      base = extra = work;    /* dummy value--not used */
7780      end = 19;
7781  } else if (type === LENS) {
7782      base = lbase;
7783      base_index -= 257;
7784      extra = lext;
7785      extra_index -= 257;
7786      end = 256;
7787  } else {                    /* DISTS */
7788      base = dbase;
7789      extra = dext;
7790      end = -1;
7791  }
7792
7793  /* initialize opts for loop */
7794  huff = 0;                   /* starting code */
7795  sym = 0;                    /* starting code symbol */
7796  len = min;                  /* starting code length */
7797  next = table_index;              /* current table to fill in */
7798  curr = root;                /* current table index bits */
7799  drop = 0;                   /* current bits to drop from code for index */
7800  low = -1;                   /* trigger new sub-table when len > root */
7801  used = 1 << root;          /* use root table entries */
7802  mask = used - 1;            /* mask for comparing low */
7803
7804  /* check available table space */
7805  if ((type === LENS && used > ENOUGH_LENS) ||
7806    (type === DISTS && used > ENOUGH_DISTS)) {
7807    return 1;
7808  }
7809
7810  var i=0;
7811  /* process all codes and make table entries */
7812  for (;;) {
7813    i++;
7814    /* create table entry */
7815    here_bits = len - drop;
7816    if (work[sym] < end) {
7817      here_op = 0;
7818      here_val = work[sym];
7819    }
7820    else if (work[sym] > end) {
7821      here_op = extra[extra_index + work[sym]];
7822      here_val = base[base_index + work[sym]];
7823    }
7824    else {
7825      here_op = 32 + 64;         /* end of block */
7826      here_val = 0;
7827    }
7828
7829    /* replicate for those indices with low len bits equal to huff */
7830    incr = 1 << (len - drop);
7831    fill = 1 << curr;
7832    min = fill;                 /* save offset to next table */
7833    do {
7834      fill -= incr;
7835      table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;
7836    } while (fill !== 0);
7837
7838    /* backwards increment the len-bit code huff */
7839    incr = 1 << (len - 1);
7840    while (huff & incr) {
7841      incr >>= 1;
7842    }
7843    if (incr !== 0) {
7844      huff &= incr - 1;
7845      huff += incr;
7846    } else {
7847      huff = 0;
7848    }
7849
7850    /* go to next symbol, update count, len */
7851    sym++;
7852    if (--count[len] === 0) {
7853      if (len === max) { break; }
7854      len = lens[lens_index + work[sym]];
7855    }
7856
7857    /* create new sub-table if needed */
7858    if (len > root && (huff & mask) !== low) {
7859      /* if first time, transition to sub-tables */
7860      if (drop === 0) {
7861        drop = root;
7862      }
7863
7864      /* increment past last table */
7865      next += min;            /* here min is 1 << curr */
7866
7867      /* determine length of next table */
7868      curr = len - drop;
7869      left = 1 << curr;
7870      while (curr + drop < max) {
7871        left -= count[curr + drop];
7872        if (left <= 0) { break; }
7873        curr++;
7874        left <<= 1;
7875      }
7876
7877      /* check for enough space */
7878      used += 1 << curr;
7879      if ((type === LENS && used > ENOUGH_LENS) ||
7880        (type === DISTS && used > ENOUGH_DISTS)) {
7881        return 1;
7882      }
7883
7884      /* point entry in root table to sub-table */
7885      low = huff & mask;
7886      /*table.op[low] = curr;
7887      table.bits[low] = root;
7888      table.val[low] = next - opts.table_index;*/
7889      table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;
7890    }
7891  }
7892
7893  /* fill in remaining table entry if code is incomplete (guaranteed to have
7894   at most one remaining entry, since if the code is incomplete, the
7895   maximum code length that was allowed to get this far is one bit) */
7896  if (huff !== 0) {
7897    //table.op[next + huff] = 64;            /* invalid code marker */
7898    //table.bits[next + huff] = len - drop;
7899    //table.val[next + huff] = 0;
7900    table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;
7901  }
7902
7903  /* set return parameters */
7904  //opts.table_index += used;
7905  opts.bits = root;
7906  return 0;
7907};
7908
7909},{"../utils/common":27}],37:[function(_dereq_,module,exports){
7910'use strict';
7911
7912module.exports = {
7913  '2':    'need dictionary',     /* Z_NEED_DICT       2  */
7914  '1':    'stream end',          /* Z_STREAM_END      1  */
7915  '0':    '',                    /* Z_OK              0  */
7916  '-1':   'file error',          /* Z_ERRNO         (-1) */
7917  '-2':   'stream error',        /* Z_STREAM_ERROR  (-2) */
7918  '-3':   'data error',          /* Z_DATA_ERROR    (-3) */
7919  '-4':   'insufficient memory', /* Z_MEM_ERROR     (-4) */
7920  '-5':   'buffer error',        /* Z_BUF_ERROR     (-5) */
7921  '-6':   'incompatible version' /* Z_VERSION_ERROR (-6) */
7922};
7923},{}],38:[function(_dereq_,module,exports){
7924'use strict';
7925
7926
7927var utils = _dereq_('../utils/common');
7928
7929/* Public constants ==========================================================*/
7930/* ===========================================================================*/
7931
7932
7933//var Z_FILTERED          = 1;
7934//var Z_HUFFMAN_ONLY      = 2;
7935//var Z_RLE               = 3;
7936var Z_FIXED               = 4;
7937//var Z_DEFAULT_STRATEGY  = 0;
7938
7939/* Possible values of the data_type field (though see inflate()) */
7940var Z_BINARY              = 0;
7941var Z_TEXT                = 1;
7942//var Z_ASCII             = 1; // = Z_TEXT
7943var Z_UNKNOWN             = 2;
7944
7945/*============================================================================*/
7946
7947
7948function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }
7949
7950// From zutil.h
7951
7952var STORED_BLOCK = 0;
7953var STATIC_TREES = 1;
7954var DYN_TREES    = 2;
7955/* The three kinds of block type */
7956
7957var MIN_MATCH    = 3;
7958var MAX_MATCH    = 258;
7959/* The minimum and maximum match lengths */
7960
7961// From deflate.h
7962/* ===========================================================================
7963 * Internal compression state.
7964 */
7965
7966var LENGTH_CODES  = 29;
7967/* number of length codes, not counting the special END_BLOCK code */
7968
7969var LITERALS      = 256;
7970/* number of literal bytes 0..255 */
7971
7972var L_CODES       = LITERALS + 1 + LENGTH_CODES;
7973/* number of Literal or Length codes, including the END_BLOCK code */
7974
7975var D_CODES       = 30;
7976/* number of distance codes */
7977
7978var BL_CODES      = 19;
7979/* number of codes used to transfer the bit lengths */
7980
7981var HEAP_SIZE     = 2*L_CODES + 1;
7982/* maximum heap size */
7983
7984var MAX_BITS      = 15;
7985/* All codes must not exceed MAX_BITS bits */
7986
7987var Buf_size      = 16;
7988/* size of bit buffer in bi_buf */
7989
7990
7991/* ===========================================================================
7992 * Constants
7993 */
7994
7995var MAX_BL_BITS = 7;
7996/* Bit length codes must not exceed MAX_BL_BITS bits */
7997
7998var END_BLOCK   = 256;
7999/* end of block literal code */
8000
8001var REP_3_6     = 16;
8002/* repeat previous bit length 3-6 times (2 bits of repeat count) */
8003
8004var REPZ_3_10   = 17;
8005/* repeat a zero length 3-10 times  (3 bits of repeat count) */
8006
8007var REPZ_11_138 = 18;
8008/* repeat a zero length 11-138 times  (7 bits of repeat count) */
8009
8010var extra_lbits =   /* extra bits for each length code */
8011  [0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0];
8012
8013var extra_dbits =   /* extra bits for each distance code */
8014  [0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13];
8015
8016var extra_blbits =  /* extra bits for each bit length code */
8017  [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7];
8018
8019var bl_order =
8020  [16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];
8021/* The lengths of the bit length codes are sent in order of decreasing
8022 * probability, to avoid transmitting the lengths for unused bit length codes.
8023 */
8024
8025/* ===========================================================================
8026 * Local data. These are initialized only once.
8027 */
8028
8029// We pre-fill arrays with 0 to avoid uninitialized gaps
8030
8031var DIST_CODE_LEN = 512; /* see definition of array dist_code below */
8032
8033// !!!! Use flat array insdead of structure, Freq = i*2, Len = i*2+1
8034var static_ltree  = new Array((L_CODES+2) * 2);
8035zero(static_ltree);
8036/* The static literal tree. Since the bit lengths are imposed, there is no
8037 * need for the L_CODES extra codes used during heap construction. However
8038 * The codes 286 and 287 are needed to build a canonical tree (see _tr_init
8039 * below).
8040 */
8041
8042var static_dtree  = new Array(D_CODES * 2);
8043zero(static_dtree);
8044/* The static distance tree. (Actually a trivial tree since all codes use
8045 * 5 bits.)
8046 */
8047
8048var _dist_code    = new Array(DIST_CODE_LEN);
8049zero(_dist_code);
8050/* Distance codes. The first 256 values correspond to the distances
8051 * 3 .. 258, the last 256 values correspond to the top 8 bits of
8052 * the 15 bit distances.
8053 */
8054
8055var _length_code  = new Array(MAX_MATCH-MIN_MATCH+1);
8056zero(_length_code);
8057/* length code for each normalized match length (0 == MIN_MATCH) */
8058
8059var base_length   = new Array(LENGTH_CODES);
8060zero(base_length);
8061/* First normalized length for each code (0 = MIN_MATCH) */
8062
8063var base_dist     = new Array(D_CODES);
8064zero(base_dist);
8065/* First normalized distance for each code (0 = distance of 1) */
8066
8067
8068var StaticTreeDesc = function (static_tree, extra_bits, extra_base, elems, max_length) {
8069
8070  this.static_tree  = static_tree;  /* static tree or NULL */
8071  this.extra_bits   = extra_bits;   /* extra bits for each code or NULL */
8072  this.extra_base   = extra_base;   /* base index for extra_bits */
8073  this.elems        = elems;        /* max number of elements in the tree */
8074  this.max_length   = max_length;   /* max bit length for the codes */
8075
8076  // show if `static_tree` has data or dummy - needed for monomorphic objects
8077  this.has_stree    = static_tree && static_tree.length;
8078};
8079
8080
8081var static_l_desc;
8082var static_d_desc;
8083var static_bl_desc;
8084
8085
8086var TreeDesc = function(dyn_tree, stat_desc) {
8087  this.dyn_tree = dyn_tree;     /* the dynamic tree */
8088  this.max_code = 0;            /* largest code with non zero frequency */
8089  this.stat_desc = stat_desc;   /* the corresponding static tree */
8090};
8091
8092
8093
8094function d_code(dist) {
8095  return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)];
8096}
8097
8098
8099/* ===========================================================================
8100 * Output a short LSB first on the stream.
8101 * IN assertion: there is enough room in pendingBuf.
8102 */
8103function put_short (s, w) {
8104//    put_byte(s, (uch)((w) & 0xff));
8105//    put_byte(s, (uch)((ush)(w) >> 8));
8106  s.pending_buf[s.pending++] = (w) & 0xff;
8107  s.pending_buf[s.pending++] = (w >>> 8) & 0xff;
8108}
8109
8110
8111/* ===========================================================================
8112 * Send a value on a given number of bits.
8113 * IN assertion: length <= 16 and value fits in length bits.
8114 */
8115function send_bits(s, value, length) {
8116  if (s.bi_valid > (Buf_size - length)) {
8117    s.bi_buf |= (value << s.bi_valid) & 0xffff;
8118    put_short(s, s.bi_buf);
8119    s.bi_buf = value >> (Buf_size - s.bi_valid);
8120    s.bi_valid += length - Buf_size;
8121  } else {
8122    s.bi_buf |= (value << s.bi_valid) & 0xffff;
8123    s.bi_valid += length;
8124  }
8125}
8126
8127
8128function send_code(s, c, tree) {
8129  send_bits(s, tree[c*2]/*.Code*/, tree[c*2 + 1]/*.Len*/);
8130}
8131
8132
8133/* ===========================================================================
8134 * Reverse the first len bits of a code, using straightforward code (a faster
8135 * method would use a table)
8136 * IN assertion: 1 <= len <= 15
8137 */
8138function bi_reverse(code, len) {
8139  var res = 0;
8140  do {
8141    res |= code & 1;
8142    code >>>= 1;
8143    res <<= 1;
8144  } while (--len > 0);
8145  return res >>> 1;
8146}
8147
8148
8149/* ===========================================================================
8150 * Flush the bit buffer, keeping at most 7 bits in it.
8151 */
8152function bi_flush(s) {
8153  if (s.bi_valid === 16) {
8154    put_short(s, s.bi_buf);
8155    s.bi_buf = 0;
8156    s.bi_valid = 0;
8157
8158  } else if (s.bi_valid >= 8) {
8159    s.pending_buf[s.pending++] = s.bi_buf & 0xff;
8160    s.bi_buf >>= 8;
8161    s.bi_valid -= 8;
8162  }
8163}
8164
8165
8166/* ===========================================================================
8167 * Compute the optimal bit lengths for a tree and update the total bit length
8168 * for the current block.
8169 * IN assertion: the fields freq and dad are set, heap[heap_max] and
8170 *    above are the tree nodes sorted by increasing frequency.
8171 * OUT assertions: the field len is set to the optimal bit length, the
8172 *     array bl_count contains the frequencies for each bit length.
8173 *     The length opt_len is updated; static_len is also updated if stree is
8174 *     not null.
8175 */
8176function gen_bitlen(s, desc)
8177//    deflate_state *s;
8178//    tree_desc *desc;    /* the tree descriptor */
8179{
8180  var tree            = desc.dyn_tree;
8181  var max_code        = desc.max_code;
8182  var stree           = desc.stat_desc.static_tree;
8183  var has_stree       = desc.stat_desc.has_stree;
8184  var extra           = desc.stat_desc.extra_bits;
8185  var base            = desc.stat_desc.extra_base;
8186  var max_length      = desc.stat_desc.max_length;
8187  var h;              /* heap index */
8188  var n, m;           /* iterate over the tree elements */
8189  var bits;           /* bit length */
8190  var xbits;          /* extra bits */
8191  var f;              /* frequency */
8192  var overflow = 0;   /* number of elements with bit length too large */
8193
8194  for (bits = 0; bits <= MAX_BITS; bits++) {
8195    s.bl_count[bits] = 0;
8196  }
8197
8198  /* In a first pass, compute the optimal bit lengths (which may
8199   * overflow in the case of the bit length tree).
8200   */
8201  tree[s.heap[s.heap_max]*2 + 1]/*.Len*/ = 0; /* root of the heap */
8202
8203  for (h = s.heap_max+1; h < HEAP_SIZE; h++) {
8204    n = s.heap[h];
8205    bits = tree[tree[n*2 +1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1;
8206    if (bits > max_length) {
8207      bits = max_length;
8208      overflow++;
8209    }
8210    tree[n*2 + 1]/*.Len*/ = bits;
8211    /* We overwrite tree[n].Dad which is no longer needed */
8212
8213    if (n > max_code) { continue; } /* not a leaf node */
8214
8215    s.bl_count[bits]++;
8216    xbits = 0;
8217    if (n >= base) {
8218      xbits = extra[n-base];
8219    }
8220    f = tree[n * 2]/*.Freq*/;
8221    s.opt_len += f * (bits + xbits);
8222    if (has_stree) {
8223      s.static_len += f * (stree[n*2 + 1]/*.Len*/ + xbits);
8224    }
8225  }
8226  if (overflow === 0) { return; }
8227
8228  // Trace((stderr,"\nbit length overflow\n"));
8229  /* This happens for example on obj2 and pic of the Calgary corpus */
8230
8231  /* Find the first bit length which could increase: */
8232  do {
8233    bits = max_length-1;
8234    while (s.bl_count[bits] === 0) { bits--; }
8235    s.bl_count[bits]--;      /* move one leaf down the tree */
8236    s.bl_count[bits+1] += 2; /* move one overflow item as its brother */
8237    s.bl_count[max_length]--;
8238    /* The brother of the overflow item also moves one step up,
8239     * but this does not affect bl_count[max_length]
8240     */
8241    overflow -= 2;
8242  } while (overflow > 0);
8243
8244  /* Now recompute all bit lengths, scanning in increasing frequency.
8245   * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all
8246   * lengths instead of fixing only the wrong ones. This idea is taken
8247   * from 'ar' written by Haruhiko Okumura.)
8248   */
8249  for (bits = max_length; bits !== 0; bits--) {
8250    n = s.bl_count[bits];
8251    while (n !== 0) {
8252      m = s.heap[--h];
8253      if (m > max_code) { continue; }
8254      if (tree[m*2 + 1]/*.Len*/ !== bits) {
8255        // Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits));
8256        s.opt_len += (bits - tree[m*2 + 1]/*.Len*/)*tree[m*2]/*.Freq*/;
8257        tree[m*2 + 1]/*.Len*/ = bits;
8258      }
8259      n--;
8260    }
8261  }
8262}
8263
8264
8265/* ===========================================================================
8266 * Generate the codes for a given tree and bit counts (which need not be
8267 * optimal).
8268 * IN assertion: the array bl_count contains the bit length statistics for
8269 * the given tree and the field len is set for all tree elements.
8270 * OUT assertion: the field code is set for all tree elements of non
8271 *     zero code length.
8272 */
8273function gen_codes(tree, max_code, bl_count)
8274//    ct_data *tree;             /* the tree to decorate */
8275//    int max_code;              /* largest code with non zero frequency */
8276//    ushf *bl_count;            /* number of codes at each bit length */
8277{
8278  var next_code = new Array(MAX_BITS+1); /* next code value for each bit length */
8279  var code = 0;              /* running code value */
8280  var bits;                  /* bit index */
8281  var n;                     /* code index */
8282
8283  /* The distribution counts are first used to generate the code values
8284   * without bit reversal.
8285   */
8286  for (bits = 1; bits <= MAX_BITS; bits++) {
8287    next_code[bits] = code = (code + bl_count[bits-1]) << 1;
8288  }
8289  /* Check that the bit counts in bl_count are consistent. The last code
8290   * must be all ones.
8291   */
8292  //Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,
8293  //        "inconsistent bit counts");
8294  //Tracev((stderr,"\ngen_codes: max_code %d ", max_code));
8295
8296  for (n = 0;  n <= max_code; n++) {
8297    var len = tree[n*2 + 1]/*.Len*/;
8298    if (len === 0) { continue; }
8299    /* Now reverse the bits */
8300    tree[n*2]/*.Code*/ = bi_reverse(next_code[len]++, len);
8301
8302    //Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ",
8303    //     n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));
8304  }
8305}
8306
8307
8308/* ===========================================================================
8309 * Initialize the various 'constant' tables.
8310 */
8311function tr_static_init() {
8312  var n;        /* iterates over tree elements */
8313  var bits;     /* bit counter */
8314  var length;   /* length value */
8315  var code;     /* code value */
8316  var dist;     /* distance index */
8317  var bl_count = new Array(MAX_BITS+1);
8318  /* number of codes at each bit length for an optimal tree */
8319
8320  // do check in _tr_init()
8321  //if (static_init_done) return;
8322
8323  /* For some embedded targets, global variables are not initialized: */
8324/*#ifdef NO_INIT_GLOBAL_POINTERS
8325  static_l_desc.static_tree = static_ltree;
8326  static_l_desc.extra_bits = extra_lbits;
8327  static_d_desc.static_tree = static_dtree;
8328  static_d_desc.extra_bits = extra_dbits;
8329  static_bl_desc.extra_bits = extra_blbits;
8330#endif*/
8331
8332  /* Initialize the mapping length (0..255) -> length code (0..28) */
8333  length = 0;
8334  for (code = 0; code < LENGTH_CODES-1; code++) {
8335    base_length[code] = length;
8336    for (n = 0; n < (1<<extra_lbits[code]); n++) {
8337      _length_code[length++] = code;
8338    }
8339  }
8340  //Assert (length == 256, "tr_static_init: length != 256");
8341  /* Note that the length 255 (match length 258) can be represented
8342   * in two different ways: code 284 + 5 bits or code 285, so we
8343   * overwrite length_code[255] to use the best encoding:
8344   */
8345  _length_code[length-1] = code;
8346
8347  /* Initialize the mapping dist (0..32K) -> dist code (0..29) */
8348  dist = 0;
8349  for (code = 0 ; code < 16; code++) {
8350    base_dist[code] = dist;
8351    for (n = 0; n < (1<<extra_dbits[code]); n++) {
8352      _dist_code[dist++] = code;
8353    }
8354  }
8355  //Assert (dist == 256, "tr_static_init: dist != 256");
8356  dist >>= 7; /* from now on, all distances are divided by 128 */
8357  for ( ; code < D_CODES; code++) {
8358    base_dist[code] = dist << 7;
8359    for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) {
8360      _dist_code[256 + dist++] = code;
8361    }
8362  }
8363  //Assert (dist == 256, "tr_static_init: 256+dist != 512");
8364
8365  /* Construct the codes of the static literal tree */
8366  for (bits = 0; bits <= MAX_BITS; bits++) {
8367    bl_count[bits] = 0;
8368  }
8369
8370  n = 0;
8371  while (n <= 143) {
8372    static_ltree[n*2 + 1]/*.Len*/ = 8;
8373    n++;
8374    bl_count[8]++;
8375  }
8376  while (n <= 255) {
8377    static_ltree[n*2 + 1]/*.Len*/ = 9;
8378    n++;
8379    bl_count[9]++;
8380  }
8381  while (n <= 279) {
8382    static_ltree[n*2 + 1]/*.Len*/ = 7;
8383    n++;
8384    bl_count[7]++;
8385  }
8386  while (n <= 287) {
8387    static_ltree[n*2 + 1]/*.Len*/ = 8;
8388    n++;
8389    bl_count[8]++;
8390  }
8391  /* Codes 286 and 287 do not exist, but we must include them in the
8392   * tree construction to get a canonical Huffman tree (longest code
8393   * all ones)
8394   */
8395  gen_codes(static_ltree, L_CODES+1, bl_count);
8396
8397  /* The static distance tree is trivial: */
8398  for (n = 0; n < D_CODES; n++) {
8399    static_dtree[n*2 + 1]/*.Len*/ = 5;
8400    static_dtree[n*2]/*.Code*/ = bi_reverse(n, 5);
8401  }
8402
8403  // Now data ready and we can init static trees
8404  static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS);
8405  static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0,          D_CODES, MAX_BITS);
8406  static_bl_desc =new StaticTreeDesc(new Array(0), extra_blbits, 0,         BL_CODES, MAX_BL_BITS);
8407
8408  //static_init_done = true;
8409}
8410
8411
8412/* ===========================================================================
8413 * Initialize a new block.
8414 */
8415function init_block(s) {
8416  var n; /* iterates over tree elements */
8417
8418  /* Initialize the trees. */
8419  for (n = 0; n < L_CODES;  n++) { s.dyn_ltree[n*2]/*.Freq*/ = 0; }
8420  for (n = 0; n < D_CODES;  n++) { s.dyn_dtree[n*2]/*.Freq*/ = 0; }
8421  for (n = 0; n < BL_CODES; n++) { s.bl_tree[n*2]/*.Freq*/ = 0; }
8422
8423  s.dyn_ltree[END_BLOCK*2]/*.Freq*/ = 1;
8424  s.opt_len = s.static_len = 0;
8425  s.last_lit = s.matches = 0;
8426}
8427
8428
8429/* ===========================================================================
8430 * Flush the bit buffer and align the output on a byte boundary
8431 */
8432function bi_windup(s)
8433{
8434  if (s.bi_valid > 8) {
8435    put_short(s, s.bi_buf);
8436  } else if (s.bi_valid > 0) {
8437    //put_byte(s, (Byte)s->bi_buf);
8438    s.pending_buf[s.pending++] = s.bi_buf;
8439  }
8440  s.bi_buf = 0;
8441  s.bi_valid = 0;
8442}
8443
8444/* ===========================================================================
8445 * Copy a stored block, storing first the length and its
8446 * one's complement if requested.
8447 */
8448function copy_block(s, buf, len, header)
8449//DeflateState *s;
8450//charf    *buf;    /* the input data */
8451//unsigned len;     /* its length */
8452//int      header;  /* true if block header must be written */
8453{
8454  bi_windup(s);        /* align on byte boundary */
8455
8456  if (header) {
8457    put_short(s, len);
8458    put_short(s, ~len);
8459  }
8460//  while (len--) {
8461//    put_byte(s, *buf++);
8462//  }
8463  utils.arraySet(s.pending_buf, s.window, buf, len, s.pending);
8464  s.pending += len;
8465}
8466
8467/* ===========================================================================
8468 * Compares to subtrees, using the tree depth as tie breaker when
8469 * the subtrees have equal frequency. This minimizes the worst case length.
8470 */
8471function smaller(tree, n, m, depth) {
8472  var _n2 = n*2;
8473  var _m2 = m*2;
8474  return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ ||
8475         (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m]));
8476}
8477
8478/* ===========================================================================
8479 * Restore the heap property by moving down the tree starting at node k,
8480 * exchanging a node with the smallest of its two sons if necessary, stopping
8481 * when the heap property is re-established (each father smaller than its
8482 * two sons).
8483 */
8484function pqdownheap(s, tree, k)
8485//    deflate_state *s;
8486//    ct_data *tree;  /* the tree to restore */
8487//    int k;               /* node to move down */
8488{
8489  var v = s.heap[k];
8490  var j = k << 1;  /* left son of k */
8491  while (j <= s.heap_len) {
8492    /* Set j to the smallest of the two sons: */
8493    if (j < s.heap_len &&
8494      smaller(tree, s.heap[j+1], s.heap[j], s.depth)) {
8495      j++;
8496    }
8497    /* Exit if v is smaller than both sons */
8498    if (smaller(tree, v, s.heap[j], s.depth)) { break; }
8499
8500    /* Exchange v with the smallest son */
8501    s.heap[k] = s.heap[j];
8502    k = j;
8503
8504    /* And continue down the tree, setting j to the left son of k */
8505    j <<= 1;
8506  }
8507  s.heap[k] = v;
8508}
8509
8510
8511// inlined manually
8512// var SMALLEST = 1;
8513
8514/* ===========================================================================
8515 * Send the block data compressed using the given Huffman trees
8516 */
8517function compress_block(s, ltree, dtree)
8518//    deflate_state *s;
8519//    const ct_data *ltree; /* literal tree */
8520//    const ct_data *dtree; /* distance tree */
8521{
8522  var dist;           /* distance of matched string */
8523  var lc;             /* match length or unmatched char (if dist == 0) */
8524  var lx = 0;         /* running index in l_buf */
8525  var code;           /* the code to send */
8526  var extra;          /* number of extra bits to send */
8527
8528  if (s.last_lit !== 0) {
8529    do {
8530      dist = (s.pending_buf[s.d_buf + lx*2] << 8) | (s.pending_buf[s.d_buf + lx*2 + 1]);
8531      lc = s.pending_buf[s.l_buf + lx];
8532      lx++;
8533
8534      if (dist === 0) {
8535        send_code(s, lc, ltree); /* send a literal byte */
8536        //Tracecv(isgraph(lc), (stderr," '%c' ", lc));
8537      } else {
8538        /* Here, lc is the match length - MIN_MATCH */
8539        code = _length_code[lc];
8540        send_code(s, code+LITERALS+1, ltree); /* send the length code */
8541        extra = extra_lbits[code];
8542        if (extra !== 0) {
8543          lc -= base_length[code];
8544          send_bits(s, lc, extra);       /* send the extra length bits */
8545        }
8546        dist--; /* dist is now the match distance - 1 */
8547        code = d_code(dist);
8548        //Assert (code < D_CODES, "bad d_code");
8549
8550        send_code(s, code, dtree);       /* send the distance code */
8551        extra = extra_dbits[code];
8552        if (extra !== 0) {
8553          dist -= base_dist[code];
8554          send_bits(s, dist, extra);   /* send the extra distance bits */
8555        }
8556      } /* literal or match pair ? */
8557
8558      /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */
8559      //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx,
8560      //       "pendingBuf overflow");
8561
8562    } while (lx < s.last_lit);
8563  }
8564
8565  send_code(s, END_BLOCK, ltree);
8566}
8567
8568
8569/* ===========================================================================
8570 * Construct one Huffman tree and assigns the code bit strings and lengths.
8571 * Update the total bit length for the current block.
8572 * IN assertion: the field freq is set for all tree elements.
8573 * OUT assertions: the fields len and code are set to the optimal bit length
8574 *     and corresponding code. The length opt_len is updated; static_len is
8575 *     also updated if stree is not null. The field max_code is set.
8576 */
8577function build_tree(s, desc)
8578//    deflate_state *s;
8579//    tree_desc *desc; /* the tree descriptor */
8580{
8581  var tree     = desc.dyn_tree;
8582  var stree    = desc.stat_desc.static_tree;
8583  var has_stree = desc.stat_desc.has_stree;
8584  var elems    = desc.stat_desc.elems;
8585  var n, m;          /* iterate over heap elements */
8586  var max_code = -1; /* largest code with non zero frequency */
8587  var node;          /* new node being created */
8588
8589  /* Construct the initial heap, with least frequent element in
8590   * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].
8591   * heap[0] is not used.
8592   */
8593  s.heap_len = 0;
8594  s.heap_max = HEAP_SIZE;
8595
8596  for (n = 0; n < elems; n++) {
8597    if (tree[n * 2]/*.Freq*/ !== 0) {
8598      s.heap[++s.heap_len] = max_code = n;
8599      s.depth[n] = 0;
8600
8601    } else {
8602      tree[n*2 + 1]/*.Len*/ = 0;
8603    }
8604  }
8605
8606  /* The pkzip format requires that at least one distance code exists,
8607   * and that at least one bit should be sent even if there is only one
8608   * possible code. So to avoid special checks later on we force at least
8609   * two codes of non zero frequency.
8610   */
8611  while (s.heap_len < 2) {
8612    node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0);
8613    tree[node * 2]/*.Freq*/ = 1;
8614    s.depth[node] = 0;
8615    s.opt_len--;
8616
8617    if (has_stree) {
8618      s.static_len -= stree[node*2 + 1]/*.Len*/;
8619    }
8620    /* node is 0 or 1 so it does not have extra bits */
8621  }
8622  desc.max_code = max_code;
8623
8624  /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,
8625   * establish sub-heaps of increasing lengths:
8626   */
8627  for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); }
8628
8629  /* Construct the Huffman tree by repeatedly combining the least two
8630   * frequent nodes.
8631   */
8632  node = elems;              /* next internal node of the tree */
8633  do {
8634    //pqremove(s, tree, n);  /* n = node of least frequency */
8635    /*** pqremove ***/
8636    n = s.heap[1/*SMALLEST*/];
8637    s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--];
8638    pqdownheap(s, tree, 1/*SMALLEST*/);
8639    /***/
8640
8641    m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */
8642
8643    s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */
8644    s.heap[--s.heap_max] = m;
8645
8646    /* Create a new node father of n and m */
8647    tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/;
8648    s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1;
8649    tree[n*2 + 1]/*.Dad*/ = tree[m*2 + 1]/*.Dad*/ = node;
8650
8651    /* and insert the new node in the heap */
8652    s.heap[1/*SMALLEST*/] = node++;
8653    pqdownheap(s, tree, 1/*SMALLEST*/);
8654
8655  } while (s.heap_len >= 2);
8656
8657  s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/];
8658
8659  /* At this point, the fields freq and dad are set. We can now
8660   * generate the bit lengths.
8661   */
8662  gen_bitlen(s, desc);
8663
8664  /* The field len is now set, we can generate the bit codes */
8665  gen_codes(tree, max_code, s.bl_count);
8666}
8667
8668
8669/* ===========================================================================
8670 * Scan a literal or distance tree to determine the frequencies of the codes
8671 * in the bit length tree.
8672 */
8673function scan_tree(s, tree, max_code)
8674//    deflate_state *s;
8675//    ct_data *tree;   /* the tree to be scanned */
8676//    int max_code;    /* and its largest code of non zero frequency */
8677{
8678  var n;                     /* iterates over all tree elements */
8679  var prevlen = -1;          /* last emitted length */
8680  var curlen;                /* length of current code */
8681
8682  var nextlen = tree[0*2 + 1]/*.Len*/; /* length of next code */
8683
8684  var count = 0;             /* repeat count of the current code */
8685  var max_count = 7;         /* max repeat count */
8686  var min_count = 4;         /* min repeat count */
8687
8688  if (nextlen === 0) {
8689    max_count = 138;
8690    min_count = 3;
8691  }
8692  tree[(max_code+1)*2 + 1]/*.Len*/ = 0xffff; /* guard */
8693
8694  for (n = 0; n <= max_code; n++) {
8695    curlen = nextlen;
8696    nextlen = tree[(n+1)*2 + 1]/*.Len*/;
8697
8698    if (++count < max_count && curlen === nextlen) {
8699      continue;
8700
8701    } else if (count < min_count) {
8702      s.bl_tree[curlen * 2]/*.Freq*/ += count;
8703
8704    } else if (curlen !== 0) {
8705
8706      if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; }
8707      s.bl_tree[REP_3_6*2]/*.Freq*/++;
8708
8709    } else if (count <= 10) {
8710      s.bl_tree[REPZ_3_10*2]/*.Freq*/++;
8711
8712    } else {
8713      s.bl_tree[REPZ_11_138*2]/*.Freq*/++;
8714    }
8715
8716    count = 0;
8717    prevlen = curlen;
8718
8719    if (nextlen === 0) {
8720      max_count = 138;
8721      min_count = 3;
8722
8723    } else if (curlen === nextlen) {
8724      max_count = 6;
8725      min_count = 3;
8726
8727    } else {
8728      max_count = 7;
8729      min_count = 4;
8730    }
8731  }
8732}
8733
8734
8735/* ===========================================================================
8736 * Send a literal or distance tree in compressed form, using the codes in
8737 * bl_tree.
8738 */
8739function send_tree(s, tree, max_code)
8740//    deflate_state *s;
8741//    ct_data *tree; /* the tree to be scanned */
8742//    int max_code;       /* and its largest code of non zero frequency */
8743{
8744  var n;                     /* iterates over all tree elements */
8745  var prevlen = -1;          /* last emitted length */
8746  var curlen;                /* length of current code */
8747
8748  var nextlen = tree[0*2 + 1]/*.Len*/; /* length of next code */
8749
8750  var count = 0;             /* repeat count of the current code */
8751  var max_count = 7;         /* max repeat count */
8752  var min_count = 4;         /* min repeat count */
8753
8754  /* tree[max_code+1].Len = -1; */  /* guard already set */
8755  if (nextlen === 0) {
8756    max_count = 138;
8757    min_count = 3;
8758  }
8759
8760  for (n = 0; n <= max_code; n++) {
8761    curlen = nextlen;
8762    nextlen = tree[(n+1)*2 + 1]/*.Len*/;
8763
8764    if (++count < max_count && curlen === nextlen) {
8765      continue;
8766
8767    } else if (count < min_count) {
8768      do { send_code(s, curlen, s.bl_tree); } while (--count !== 0);
8769
8770    } else if (curlen !== 0) {
8771      if (curlen !== prevlen) {
8772        send_code(s, curlen, s.bl_tree);
8773        count--;
8774      }
8775      //Assert(count >= 3 && count <= 6, " 3_6?");
8776      send_code(s, REP_3_6, s.bl_tree);
8777      send_bits(s, count-3, 2);
8778
8779    } else if (count <= 10) {
8780      send_code(s, REPZ_3_10, s.bl_tree);
8781      send_bits(s, count-3, 3);
8782
8783    } else {
8784      send_code(s, REPZ_11_138, s.bl_tree);
8785      send_bits(s, count-11, 7);
8786    }
8787
8788    count = 0;
8789    prevlen = curlen;
8790    if (nextlen === 0) {
8791      max_count = 138;
8792      min_count = 3;
8793
8794    } else if (curlen === nextlen) {
8795      max_count = 6;
8796      min_count = 3;
8797
8798    } else {
8799      max_count = 7;
8800      min_count = 4;
8801    }
8802  }
8803}
8804
8805
8806/* ===========================================================================
8807 * Construct the Huffman tree for the bit lengths and return the index in
8808 * bl_order of the last bit length code to send.
8809 */
8810function build_bl_tree(s) {
8811  var max_blindex;  /* index of last bit length code of non zero freq */
8812
8813  /* Determine the bit length frequencies for literal and distance trees */
8814  scan_tree(s, s.dyn_ltree, s.l_desc.max_code);
8815  scan_tree(s, s.dyn_dtree, s.d_desc.max_code);
8816
8817  /* Build the bit length tree: */
8818  build_tree(s, s.bl_desc);
8819  /* opt_len now includes the length of the tree representations, except
8820   * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.
8821   */
8822
8823  /* Determine the number of bit length codes to send. The pkzip format
8824   * requires that at least 4 bit length codes be sent. (appnote.txt says
8825   * 3 but the actual value used is 4.)
8826   */
8827  for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) {
8828    if (s.bl_tree[bl_order[max_blindex]*2 + 1]/*.Len*/ !== 0) {
8829      break;
8830    }
8831  }
8832  /* Update opt_len to include the bit length tree and counts */
8833  s.opt_len += 3*(max_blindex+1) + 5+5+4;
8834  //Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld",
8835  //        s->opt_len, s->static_len));
8836
8837  return max_blindex;
8838}
8839
8840
8841/* ===========================================================================
8842 * Send the header for a block using dynamic Huffman trees: the counts, the
8843 * lengths of the bit length codes, the literal tree and the distance tree.
8844 * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.
8845 */
8846function send_all_trees(s, lcodes, dcodes, blcodes)
8847//    deflate_state *s;
8848//    int lcodes, dcodes, blcodes; /* number of codes for each tree */
8849{
8850  var rank;                    /* index in bl_order */
8851
8852  //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes");
8853  //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,
8854  //        "too many codes");
8855  //Tracev((stderr, "\nbl counts: "));
8856  send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */
8857  send_bits(s, dcodes-1,   5);
8858  send_bits(s, blcodes-4,  4); /* not -3 as stated in appnote.txt */
8859  for (rank = 0; rank < blcodes; rank++) {
8860    //Tracev((stderr, "\nbl code %2d ", bl_order[rank]));
8861    send_bits(s, s.bl_tree[bl_order[rank]*2 + 1]/*.Len*/, 3);
8862  }
8863  //Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent));
8864
8865  send_tree(s, s.dyn_ltree, lcodes-1); /* literal tree */
8866  //Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent));
8867
8868  send_tree(s, s.dyn_dtree, dcodes-1); /* distance tree */
8869  //Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent));
8870}
8871
8872
8873/* ===========================================================================
8874 * Check if the data type is TEXT or BINARY, using the following algorithm:
8875 * - TEXT if the two conditions below are satisfied:
8876 *    a) There are no non-portable control characters belonging to the
8877 *       "black list" (0..6, 14..25, 28..31).
8878 *    b) There is at least one printable character belonging to the
8879 *       "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).
8880 * - BINARY otherwise.
8881 * - The following partially-portable control characters form a
8882 *   "gray list" that is ignored in this detection algorithm:
8883 *   (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).
8884 * IN assertion: the fields Freq of dyn_ltree are set.
8885 */
8886function detect_data_type(s) {
8887  /* black_mask is the bit mask of black-listed bytes
8888   * set bits 0..6, 14..25, and 28..31
8889   * 0xf3ffc07f = binary 11110011111111111100000001111111
8890   */
8891  var black_mask = 0xf3ffc07f;
8892  var n;
8893
8894  /* Check for non-textual ("black-listed") bytes. */
8895  for (n = 0; n <= 31; n++, black_mask >>>= 1) {
8896    if ((black_mask & 1) && (s.dyn_ltree[n*2]/*.Freq*/ !== 0)) {
8897      return Z_BINARY;
8898    }
8899  }
8900
8901  /* Check for textual ("white-listed") bytes. */
8902  if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 ||
8903      s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) {
8904    return Z_TEXT;
8905  }
8906  for (n = 32; n < LITERALS; n++) {
8907    if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) {
8908      return Z_TEXT;
8909    }
8910  }
8911
8912  /* There are no "black-listed" or "white-listed" bytes:
8913   * this stream either is empty or has tolerated ("gray-listed") bytes only.
8914   */
8915  return Z_BINARY;
8916}
8917
8918
8919var static_init_done = false;
8920
8921/* ===========================================================================
8922 * Initialize the tree data structures for a new zlib stream.
8923 */
8924function _tr_init(s)
8925{
8926
8927  if (!static_init_done) {
8928    tr_static_init();
8929    static_init_done = true;
8930  }
8931
8932  s.l_desc  = new TreeDesc(s.dyn_ltree, static_l_desc);
8933  s.d_desc  = new TreeDesc(s.dyn_dtree, static_d_desc);
8934  s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc);
8935
8936  s.bi_buf = 0;
8937  s.bi_valid = 0;
8938
8939  /* Initialize the first block of the first file: */
8940  init_block(s);
8941}
8942
8943
8944/* ===========================================================================
8945 * Send a stored block
8946 */
8947function _tr_stored_block(s, buf, stored_len, last)
8948//DeflateState *s;
8949//charf *buf;       /* input block */
8950//ulg stored_len;   /* length of input block */
8951//int last;         /* one if this is the last block for a file */
8952{
8953  send_bits(s, (STORED_BLOCK<<1)+(last ? 1 : 0), 3);    /* send block type */
8954  copy_block(s, buf, stored_len, true); /* with header */
8955}
8956
8957
8958/* ===========================================================================
8959 * Send one empty static block to give enough lookahead for inflate.
8960 * This takes 10 bits, of which 7 may remain in the bit buffer.
8961 */
8962function _tr_align(s) {
8963  send_bits(s, STATIC_TREES<<1, 3);
8964  send_code(s, END_BLOCK, static_ltree);
8965  bi_flush(s);
8966}
8967
8968
8969/* ===========================================================================
8970 * Determine the best encoding for the current block: dynamic trees, static
8971 * trees or store, and output the encoded block to the zip file.
8972 */
8973function _tr_flush_block(s, buf, stored_len, last)
8974//DeflateState *s;
8975//charf *buf;       /* input block, or NULL if too old */
8976//ulg stored_len;   /* length of input block */
8977//int last;         /* one if this is the last block for a file */
8978{
8979  var opt_lenb, static_lenb;  /* opt_len and static_len in bytes */
8980  var max_blindex = 0;        /* index of last bit length code of non zero freq */
8981
8982  /* Build the Huffman trees unless a stored block is forced */
8983  if (s.level > 0) {
8984
8985    /* Check if the file is binary or text */
8986    if (s.strm.data_type === Z_UNKNOWN) {
8987      s.strm.data_type = detect_data_type(s);
8988    }
8989
8990    /* Construct the literal and distance trees */
8991    build_tree(s, s.l_desc);
8992    // Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len,
8993    //        s->static_len));
8994
8995    build_tree(s, s.d_desc);
8996    // Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len,
8997    //        s->static_len));
8998    /* At this point, opt_len and static_len are the total bit lengths of
8999     * the compressed block data, excluding the tree representations.
9000     */
9001
9002    /* Build the bit length tree for the above two trees, and get the index
9003     * in bl_order of the last bit length code to send.
9004     */
9005    max_blindex = build_bl_tree(s);
9006
9007    /* Determine the best encoding. Compute the block lengths in bytes. */
9008    opt_lenb = (s.opt_len+3+7) >>> 3;
9009    static_lenb = (s.static_len+3+7) >>> 3;
9010
9011    // Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ",
9012    //        opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,
9013    //        s->last_lit));
9014
9015    if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; }
9016
9017  } else {
9018    // Assert(buf != (char*)0, "lost buf");
9019    opt_lenb = static_lenb = stored_len + 5; /* force a stored block */
9020  }
9021
9022  if ((stored_len+4 <= opt_lenb) && (buf !== -1)) {
9023    /* 4: two words for the lengths */
9024
9025    /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.
9026     * Otherwise we can't have processed more than WSIZE input bytes since
9027     * the last block flush, because compression would have been
9028     * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to
9029     * transform a block into a stored block.
9030     */
9031    _tr_stored_block(s, buf, stored_len, last);
9032
9033  } else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) {
9034
9035    send_bits(s, (STATIC_TREES<<1) + (last ? 1 : 0), 3);
9036    compress_block(s, static_ltree, static_dtree);
9037
9038  } else {
9039    send_bits(s, (DYN_TREES<<1) + (last ? 1 : 0), 3);
9040    send_all_trees(s, s.l_desc.max_code+1, s.d_desc.max_code+1, max_blindex+1);
9041    compress_block(s, s.dyn_ltree, s.dyn_dtree);
9042  }
9043  // Assert (s->compressed_len == s->bits_sent, "bad compressed size");
9044  /* The above check is made mod 2^32, for files larger than 512 MB
9045   * and uLong implemented on 32 bits.
9046   */
9047  init_block(s);
9048
9049  if (last) {
9050    bi_windup(s);
9051  }
9052  // Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3,
9053  //       s->compressed_len-7*last));
9054}
9055
9056/* ===========================================================================
9057 * Save the match info and tally the frequency counts. Return true if
9058 * the current block must be flushed.
9059 */
9060function _tr_tally(s, dist, lc)
9061//    deflate_state *s;
9062//    unsigned dist;  /* distance of matched string */
9063//    unsigned lc;    /* match length-MIN_MATCH or unmatched char (if dist==0) */
9064{
9065  //var out_length, in_length, dcode;
9066
9067  s.pending_buf[s.d_buf + s.last_lit * 2]     = (dist >>> 8) & 0xff;
9068  s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff;
9069
9070  s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff;
9071  s.last_lit++;
9072
9073  if (dist === 0) {
9074    /* lc is the unmatched char */
9075    s.dyn_ltree[lc*2]/*.Freq*/++;
9076  } else {
9077    s.matches++;
9078    /* Here, lc is the match length - MIN_MATCH */
9079    dist--;             /* dist = match distance - 1 */
9080    //Assert((ush)dist < (ush)MAX_DIST(s) &&
9081    //       (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&
9082    //       (ush)d_code(dist) < (ush)D_CODES,  "_tr_tally: bad match");
9083
9084    s.dyn_ltree[(_length_code[lc]+LITERALS+1) * 2]/*.Freq*/++;
9085    s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++;
9086  }
9087
9088// (!) This block is disabled in zlib defailts,
9089// don't enable it for binary compatibility
9090
9091//#ifdef TRUNCATE_BLOCK
9092//  /* Try to guess if it is profitable to stop the current block here */
9093//  if ((s.last_lit & 0x1fff) === 0 && s.level > 2) {
9094//    /* Compute an upper bound for the compressed length */
9095//    out_length = s.last_lit*8;
9096//    in_length = s.strstart - s.block_start;
9097//
9098//    for (dcode = 0; dcode < D_CODES; dcode++) {
9099//      out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]);
9100//    }
9101//    out_length >>>= 3;
9102//    //Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ",
9103//    //       s->last_lit, in_length, out_length,
9104//    //       100L - out_length*100L/in_length));
9105//    if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) {
9106//      return true;
9107//    }
9108//  }
9109//#endif
9110
9111  return (s.last_lit === s.lit_bufsize-1);
9112  /* We avoid equality with lit_bufsize because of wraparound at 64K
9113   * on 16 bit machines and because stored blocks are restricted to
9114   * 64K-1 bytes.
9115   */
9116}
9117
9118exports._tr_init  = _tr_init;
9119exports._tr_stored_block = _tr_stored_block;
9120exports._tr_flush_block  = _tr_flush_block;
9121exports._tr_tally = _tr_tally;
9122exports._tr_align = _tr_align;
9123},{"../utils/common":27}],39:[function(_dereq_,module,exports){
9124'use strict';
9125
9126
9127function ZStream() {
9128  /* next input byte */
9129  this.input = null; // JS specific, because we have no pointers
9130  this.next_in = 0;
9131  /* number of bytes available at input */
9132  this.avail_in = 0;
9133  /* total number of input bytes read so far */
9134  this.total_in = 0;
9135  /* next output byte should be put there */
9136  this.output = null; // JS specific, because we have no pointers
9137  this.next_out = 0;
9138  /* remaining free space at output */
9139  this.avail_out = 0;
9140  /* total number of bytes output so far */
9141  this.total_out = 0;
9142  /* last error message, NULL if no error */
9143  this.msg = ''/*Z_NULL*/;
9144  /* not visible by applications */
9145  this.state = null;
9146  /* best guess about the data type: binary or text */
9147  this.data_type = 2/*Z_UNKNOWN*/;
9148  /* adler32 value of the uncompressed data */
9149  this.adler = 0;
9150}
9151
9152module.exports = ZStream;
9153},{}]},{},[9])
9154(9)
9155});